PROYECTO FINAL

🧾 Nombre del Proyecto:

Gestion Papeleria

📌 Enunciado del Problema:

Una papelería local enfrenta dificultades en la gestión de su inventario, ventas, distribuidores y consumidores frecuentes. Actualmente, el manejo de estos procesos es manual, lo que ocasiona errores en el control del inventario, retrasos en la reposición de productos, falta de información actualizada sobre el inventario disponible y dificultades para ofrecer un buen servicio al cliente. Estos problemas afectan la eficiencia de las operaciones y limitan el crecimiento del negocio.

Las necesidades principales

Detalles de productos en cada pedido: Es necesario registrar cada producto solicitado en un pedido (cantidad solicitada, precio unitario, subtotal) para obtener un desglose completo de los productos adquiridos a cada distribuidor, asegurando una administración detallada del inventario y control de costos.

    • Relación: Cada Detalle_Pedido está asociado a un único Producto y a un único Pedido_Distribuidor, formando una relación muchos a 1 entre Detalles_Pedido y Producto, y muchos a 1 entre Detalles_Pedido y Pedidos_Distribuidores.
  • Detalles de productos en cada venta: Se requiere almacenar los detalles de cada producto vendido en una transacción (cantidad, precio unitario, subtotal) para obtener un desglose detallado de las ventas, lo que facilita la generación de reportes y el análisis de los productos más vendidos.

    • Relación: Cada Detalle_Venta se asocia a un único Producto y a una única Venta, creando una relación muchos a 1 entre Detalles_Venta y Producto, y muchos a 1 entre Detalles_Venta y Ventas.
  • Control de pedidos a distribuidores: La papelería necesita un registro de cada pedido realizado a los distribuidores, incluyendo la fecha, el distribuidor correspondiente y el monto total del pedido, para asegurar el reabastecimiento oportuno de productos.

    • Relación: Un Pedido_Distribuidor puede incluir múltiples Detalles_Pedido con diferentes productos solicitados. La relación entre Pedidos_Distribuidores y Detalles_Pedido es de 1 a muchos.
  • Registro de ventas: Se necesita registrar cada venta efectuada, incluyendo información como fecha de la venta, el consumidor involucrado, el monto total y el método de pago, para obtener un historial completo y preciso de las transacciones realizadas.

    • Relación: Una Venta puede incluir múltiples Detalles_Venta, ya que cada venta puede involucrar diferentes productos. La relación entre Ventas y Detalles_Venta es de 1 a muchos.
  • Seguimiento de consumidores frecuentes: La papelería requiere información de los consumidores frecuentes, como nombre, datos de contacto y preferencias de compra, para mejorar el servicio al cliente y realizar ofertas personalizadas.

    • Relación: Un Consumidor puede realizar múltiples Ventas a lo largo del tiempo, pero cada venta se asocia a un solo consumidor. La relación entre Consumidor y Ventas es de 1 a muchos.
  • Gestión de distribuidores: Es necesario almacenar los datos de contacto y localización de cada distribuidor para facilitar los pedidos y el seguimiento de las entregas, manteniendo siempre una relación clara y actualizada con los proveedores de productos.

    • Relación: Un Distribuidor puede tener múltiples Pedidos_Distribuidores asociados, pero cada pedido solo corresponde a un distribuidor. La relación entre Distribuidores y Pedidos_Distribuidores es de 1 a muchos.
  • Control de inventario: Se necesita un registro detallado de cada producto en el inventario de la papelería, incluyendo información como nombre, precio, stock disponible y el stock mínimo para gestionar reabastecimientos eficientemente.

    • Relación: Un Producto puede estar registrado en múltiples Detalles_Venta y Detalles_Pedido. La relación entre Producto y Detalles_Venta es de 1 a muchos, y también entre Producto y Detalles_Pedido, ya que un producto puede estar en varias ventas o pedidos.

    Vamos a agregar

    1. Categorias (Referencial)

    Descripción

    : Almacena las categorías de productos para organizar el inventario

    Campos:

    id_categoria (PK): Identificador único de la categoría

    nombre: Nombre de la categoría (ej. "Papelería", "Oficina", "Escolar")

    descripcion: Descripción de la categoría

    Relaciones:

    Relación 1 a muchos con Producto (un producto pertenece a una categoría, una categoría puede tener muchos productos)

    2. Metodos_Pago (Referencial)

    • Descripción: Registra los diferentes métodos de pago aceptados

    • Campos:

      • id_metodo_pago (PK): Identificador único del método de pago

      • nombre: Nombre del método (ej. "Efectivo", "Tarjeta", "Transferencia")

      • descripcion: Descripción adicional

    • Relaciones:

      • Relación 1 a muchos con Ventas (una venta usa un método de pago, un método puede estar en muchas ventas)

    3. Promociones (Referencial)

    • Descripción: Almacena información sobre promociones y descuentos

    • Campos:

      • id_promocion (PK): Identificador único

      • nombre: Nombre de la promoción

      • descripcion: Descripción de la promoción

      • descuento: Porcentaje o monto de descuento

      • fecha_inicio: Fecha de inicio de la promoción

      • fecha_fin: Fecha de finalización

    • Relaciones:

      • Relación muchos a muchos con Producto (a través de tabla intermedia Producto_Promocion)

    4. Producto_Promocion (Relacional)

    • Descripción: Tabla intermedia para relación muchos a muchos entre Producto y Promociones

    • Campos:

      • id_producto (FK): Referencia al producto

      • id_promocion (FK): Referencia a la promoción

      • fecha_aplicacion: Fecha cuando se aplicó la promoción al producto

    • Relaciones:

      • Relación muchos a 1 con Producto

      • Relación muchos a 1 con Promociones

    5. Historial_Inventario (Movimiento)

    • Descripción: Registra los cambios en el inventario para auditoría y seguimiento

    • Campos:

      • id_historial (PK): Identificador único

      • id_producto (FK): Producto afectado

      • fecha_cambio: Fecha del cambio

      • cantidad_anterior: Stock antes del cambio

      • cantidad_nueva: Stock después del cambio

      • tipo_movimiento: Entrada/Salida/Ajuste

      • motivo: Razón del cambio (venta, pedido, ajuste, etc.)

    • Relaciones:

      • Relación muchos a 1 con Producto (un producto tiene muchos registros de historial)

    🎯 Objetivos del Sistema:

    • Controlar el inventario en tiempo real.

    • Registrar compras y ventas de productos.

    • Gestionar proveedores y sus productos ofrecidos.

    • Generar reportes de productos más vendidos y niveles de stock.

    • Registrar información de los clientes para fidelización.

    • Permitir trazabilidad completa de las transacciones.

    📊 Propuesta de Tablas (Listado de tablas que llevara la BD. (Cuales son referenciales y cuales son de movimiento)):

    1. Tablas Referenciales:

      1. Producto

      2. Distribuidores

      3. Consumidor

      4. Categorias (nueva)

      5. Metodos_Pago (nueva)

      6. Promociones (nueva)

      Tablas de Movimiento:

      1. Ventas

      2. Pedidos_Distribuidores

      3. Detalles_Venta

      4. Detalles_Pedido

      5. Producto_Promocion (nueva, relacional)

      6. Historial_Inventario (nueva)

    2.3. Diseñar el diccionario de datos de cada tabla (campo, nombre el campo, tipo, tamaño y descripción)

    2.4. Montar o diseñar el modelo entidad relación. Dibujar el Diagrama relacional.

    3. Crear la BD y las tablas respectivas en MySQL (guardar evidencias del código MySQL con el que resuelva dicha actividad) e insertar 10 registros en cada tabla (Entrega 2)

    4. Diseñar ejercicios en los que se apliquen los diferentes comandos que se utilizaron durante el semestre con su respectivo análisis y resultados. (Entrega 3)

    CREAR UNA TABLA A PARTIR DE OTRA 

    1. ¿Qué desea mostrar?

    El número total de ventas realizadas por cada fecha registrada en la tabla ventas, mostrando cuántas transacciones se procesaron cada día.

    2. Tablas involucradas:

    • ventas

    3. Relaciones:

    No hay relaciones necesarias para esta consulta específica, ya que solo utilizamos una tabla.

    4. Funciones a utilizar:

    • COUNT(*): Para contar cuántas ventas se registraron en cada fecha específica.
    • GROUP BY: Para agrupar los resultados por fecha y obtener el conteo por cada día.
    • CREATE TABLE AS SELECT: Para crear una nueva tabla permanente con los resultados de la consulta.

    5. Código:

    CREATE TABLE cantidad_ventas_por_fecha AS SELECT Fecha, COUNT(*) AS total_ventas FROM ventas GROUP BY Fecha;

    CREAR TABLA CON FILTROS DE FECHA Y AGRUPACIÓN - BASE DE DATOS PAPELERÍA

    1. ¿Qué desea mostrar?

    La ciudad de origen de los consumidores y la cantidad de ventas realizadas entre el 5 de enero y el 15 de febrero de 2023.

    2. Tablas involucradas:

    • ventas
    • consumidor

    3. Relaciones:

    • ventas.FK_consumidor = consumidor.ID_consumidor

    4. Funciones a utilizar:

    • COUNT(*): Para contar cuántas ventas se realizaron por cada ciudad.
    • GROUP BY: Para agrupar los resultados por ciudad.
    • WHERE: Para filtrar las ventas en el período específico.
    • INNER JOIN: Para relacionar las ventas con los datos del consumidor.
    • CREATE TABLE AS SELECT: Para crear una nueva tabla con los resultados de la consulta.

    5. Código:

    sqlCREATE TABLE resumen_ventas_enero_febrero AS SELECT c.Ciudad, COUNT(*) AS total_ventas FROM ventas v INNER JOIN consumidor c ON v.FK_consumidor = c.ID_consumidor WHERE v.Fecha BETWEEN '2023-01-05' AND '2023-02-15' GROUP BY c.Ciudad;

    CREAR TRIGGER PARA ACTUALIZACIÓN AUTOMÁTICA - BASE DE DATOS PAPELERÍA

    1. ¿Qué desea hacer?

    Contabiliza cuántas ventas se realizan por fecha y por ciudad, cada vez que se inserta una nueva venta en la tabla ventas. En pocas palabras nos muestra la cantidad de ventas que se generan por día en cada ciudad.

    2. Tablas involucradas:

    • ventas
    • consumidor
    • resumen_ventas_diarias (tabla que se debe crear previamente)

    3. Funciones y estructuras utilizadas:

    • AFTER INSERT: Tipo de trigger que se ejecuta después de cada inserción.
    • NEW: Referencia a los valores de la fila recién insertada.
    • IF...ELSE: Para decidir si actualizar un registro existente o insertar uno nuevo.
    • UPDATE y INSERT: Para modificar o agregar registros en resumen_ventas_diarias.
    • SELECT INTO: Para verificar si ya existe un registro previo.
    • JOIN: Para obtener la ciudad del consumidor.
    • PRIMARY KEY compuesta: (Fecha, Ciudad) para evitar duplicados en la tabla resumen.

    4. Código previo - Crear tabla resumen:

    sqlCREATE TABLE resumen_ventas_diarias ( Fecha VARCHAR(45) NOT NULL, Ciudad VARCHAR(45) NOT NULL, total_ventas INT NOT NULL DEFAULT 1, PRIMARY KEY (Fecha, Ciudad) );

    5. Código del Trigger:

    sqlDELIMITER // CREATE TRIGGER trg_actualizar_resumen_ventas AFTER INSERT ON ventas FOR EACH ROW BEGIN DECLARE existe INT; DECLARE ciudad_consumidor VARCHAR(45); -- Obtener la ciudad del consumidor SELECT Ciudad INTO ciudad_consumidor FROM consumidor WHERE ID_consumidor = NEW.FK_consumidor; -- Verificar si ya existe un registro para esa fecha y ciudad SELECT COUNT(*) INTO existe FROM resumen_ventas_diarias WHERE Fecha = NEW.Fecha AND Ciudad = ciudad_consumidor; IF existe > 0 THEN -- Si existe, incrementar el contador UPDATE resumen_ventas_diarias SET total_ventas = total_ventas + 1 WHERE Fecha = NEW.Fecha AND Ciudad = ciudad_consumidor; ELSE -- Si no existe, insertar nuevo registro INSERT INTO resumen_ventas_diarias (Fecha, Ciudad, total_ventas) VALUES (NEW.Fecha, ciudad_consumidor, 1); END IF; END // DELIMITER ;

    Reporte de Ventas - Papelería

    ¿Qué desea mostrar?

    Un reporte de ventas con el nombre del consumidor, producto y cantidad vendida.

    Tablas involucradas:

    • ventas - Tabla principal de ventas
    • consumidor - Información de los clientes
    • detalles_venta - Detalle de productos por venta
    • producto - Información de los productos

    Relaciones:

    ventas.FK_consumidor = consumidor.ID_consumidor

    Esto significa que cada venta tiene un consumidor asociado.

    detalles_venta.FK_venta = ventas.ID_venta

    Esto indica que cada venta puede tener varios productos vendidos (detalle por producto)

    detalles_venta.FK_producto = producto.ID_producto

    Esto dice qué producto fue vendido en cada línea de la venta.

    Funciones utilizadas:

    • JOIN: para unir tablas relacionadas
    • AS: para crear alias de campos y hacer más legible el resultado
    • ORDER BY: para ordenar los resultados por fecha

    Código SQL:

    sqlSELECT v.ID_venta, v.Fecha, c.Nombre AS Cliente, p.Nombre AS Producto, dv.Cantidad_vendida, p.Precio_venta, (dv.Cantidad_vendida * p.Precio_venta) AS Total_Linea FROM ventas v JOIN consumidor c ON v.FK_consumidor = c.ID_consumidor JOIN detalles_venta dv ON v.ID_venta = dv.FK_venta JOIN producto p ON dv.FK_producto = p.ID_producto ORDER BY v.Fecha;

    Creación de Usuarios y Permisos - Base de Datos Papelería

    ¿Qué desea lograr?

    Crear diferentes tipos de usuarios con niveles de acceso específicos para la base de datos de papelería, implementando un sistema de seguridad por roles.

    Conceptos importantes:

    • Usuario sin permisos: Usuario básico sin acceso a ninguna base de datos
    • Permisos granulares: Control específico sobre qué operaciones puede realizar cada usuario
    • GRANT: Comando para otorgar permisos
    • REVOKE: Comando para quitar permisos
    • SHOW GRANTS: Visualizar los permisos de un usuario

    Tipos de usuarios para la papelería:

    1. Usuario sin permisos (Base)

    sql-- Crear usuario básico sin permisos CREATE USER 'empleado_basico'@'localhost' IDENTIFIED BY 'papeleria123'; -- Visualizar permisos (solo tendrá USAGE) SHOW GRANTS FOR 'empleado_basico'@'localhost';

    Creación de Usuarios y Permisos - Base de Datos Papelería

    ¿Qué desea lograr?

    Crear diferentes tipos de usuarios con niveles de acceso específicos para la base de datos de papelería, implementando un sistema de seguridad por roles.

    Tipos de permisos más comunes:

    • SELECT = Leer/consultar datos
    • INSERT = Insertar nuevos registros
    • UPDATE = Modificar registros existentes
    • DELETE = Eliminar registros
    • CREATE = Crear nuevas tablas
    • DROP = Eliminar tablas
    • ALTER = Modificar estructura de tablas
    • INDEX = Crear/eliminar índices

    Sintaxis básica para permisos limitados:

    sql-- Formato general GRANT [tipo_permiso] ON [base_datos].[tabla] TO 'usuario'@'host'; -- Múltiples permisos GRANT SELECT, INSERT ON papeleria.consumidor TO 'usuario_limitado'@'localhost'; -- Permisos en múltiples tablas GRANT SELECT ON papeleria.producto TO 'usuario'@'localhost'; GRANT SELECT ON papeleria.ventas TO 'usuario'@'localhost';

    Usuario con todos los permisos en una base de datos:

    CREATE USER 'usuario_admin'@'localhost' IDENTIFIED BY '123';

    Permisos:

    PRIVILEGES = este comando da todos los permisos en una base de datos en especifico

    GRANT ALL PRIVILEGES ON mi_basedatos.* TO 'usuario_admin'@'localhost';

    FLUSH PRIVILEGES;

    Para visualizar:

    SHOW GRANTS FOR 'usuario_admin'@'localhost';

    Sebastián Carvajal Ospina - Blog Academico
    2024
    Powered by Webnode Cookies
    Create your website for free! This website was made with Webnode. Create your own for free today! Get started