100% encontró este documento útil (1 voto)
87 vistas51 páginas

Informe BDII GRUPO 7 Sistema de Ventas de Comida Rapida

El documento presenta el desarrollo de un sistema de ventas de comida rápida para la empresa 'CRUNCH & GO', diseñado para optimizar la gestión de usuarios, productos, pedidos y entregas mediante una base de datos relacional en PostgreSQL. Se identifican problemas operativos actuales y se establecen objetivos claros para mejorar la eficiencia y la experiencia del cliente. Además, se detallan requerimientos funcionales y no funcionales, así como un análisis y diseño del sistema propuesto.

Cargado por

cilaluquehuanca
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
100% encontró este documento útil (1 voto)
87 vistas51 páginas

Informe BDII GRUPO 7 Sistema de Ventas de Comida Rapida

El documento presenta el desarrollo de un sistema de ventas de comida rápida para la empresa 'CRUNCH & GO', diseñado para optimizar la gestión de usuarios, productos, pedidos y entregas mediante una base de datos relacional en PostgreSQL. Se identifican problemas operativos actuales y se establecen objetivos claros para mejorar la eficiencia y la experiencia del cliente. Además, se detallan requerimientos funcionales y no funcionales, así como un análisis y diseño del sistema propuesto.

Cargado por

cilaluquehuanca
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 51

UNIVERSIDAD MAYOR DE SAN ANDRÉS

FACULTAD DE CIENCIAS PURAS Y NATURALES


CARRERA DE INFORMÁTICA

“SISTEMA DE VENTAS DE COMIDA RAPIDA”


Asignatura:
Base de Datos II
Estudiantes:
1.- Kevin Edson Zapana Cabrera
2.- Carlos Alexander Ilaluque Huanca
3.- Rebeca Alicia Quispe Orellana
4.- Franklin Cayllagua Mamani

Docente:
Ph.D. Rogelio Mamani Ramos

La Paz – Bolivia
2025
ÍNDICE
ÍNDICE................................................................................................................................... 2

I. INTRODUCCIÓN .......................................................................................................... 4

1.1. BREVE DESCRIPCIÓN DEL PROYECTO .............................................................. 4

1.2. PROBLEMAS ............................................................................................................. 4

1.2.1. PROBLEMAS SECUNDARIOS ............................................................................ 4

1.2.2. PROBLEMA PRINCIPAL ...................................................................................... 5

1.3. OBJETIVOS ................................................................................................................ 5

1.3.1. OBJETIVO GENERAL ........................................................................................... 5

1.3.2. OBJETIVOS ESPECÍFICOS .................................................................................. 5

1.4. JUSTIFICACIÓN ........................................................................................................ 5

II. REQUERIMIENTOS .................................................................................................. 7

2.1. DIAGNÓSTICO .......................................................................................................... 7

2.2. REQUERIMIENTOS FUNCIONALES ..................................................................... 7

2.3. REQUERIMIENTOS NO FUNCIONALES .............................................................. 8

III. ANÁLISIS ................................................................................................................... 9

3.1. HERRAMIENTAS DE ANÁLISIS ............................................................................ 9

3.2. COMPRENSIÓN DE LOS REQUERIMIENTOS ................................................... 11

3.3. IDENTIFICACIÓN DE SUBSISTEMAS ................................................................ 12

IV. DISEÑO .................................................................................................................... 15

4.1. HERRAMIENTAS DE DISEÑO .............................................................................. 15

4.2. MODELO ENTIDAD RELACIÓN .......................................................................... 15

4.3. DICCIONARIO DE DATOS .................................................................................... 18

4.4. MODELO RELACIONAL ....................................................................................... 24

V. APLICACIÓN ........................................................................................................... 25
5.1. CREACIÓN DE LA BASE DE DATOS .................................................................. 25

5.2. PRESENTACIÓN DEL DIAGRAMA ..................................................................... 37

5.2. APLICACIÓN DE FUNCION .................................................................................. 37

5.3. APLICACIÓN DE PROCEDIMIENTOS ................................................................ 38

5.4. APLICACIÓN DE TRIGGERS ................................................................................ 39

5.5. APLICACIÓN DE LAS CONSULTAS DESDE EL LENGUAJE DE


PROGRAMACIÓN .............................................................................................................. 41

VI. RESULTADOS ......................................................................................................... 47

6.1. SELECCIÓN DE DATOS ........................................................................................ 47

6.2. RESULTADOS OBTENIDOS ................................................................................. 48

VII. CONCLUSIONES ..................................................................................................... 50

BIBLIOGRAFÍA .................................................................................................................. 50

SITIOS ACADEMICOS ...................................................................................................... 51


1. INTRODUCCIÓN
1.1. BREVE DESCRIPCIÓN DEL PROYECTO

El presente proyecto consiste en el desarrollo de un sistema de ventas de comida rápida de la


empresa "CRUNCH & GO". Este sistema está diseñado para manejar de manera eficiente
todos los aspectos operativos del negocio, desde la gestión de usuarios y productos hasta el
procesamiento de pedidos, pagos y entregas.

El sistema implementa una arquitectura relacional que permite la administración completa


de clientes, empleados, inventario, promociones, cupones, pedidos y sus respectivos detalles,
así como un sistema de chat en tiempo real y notificaciones. La base de datos está
desarrollada en PostgreSQL, aprovechando sus capacidades avanzadas para garantizar
integridad, consistencia y rendimiento óptimo.

1.2. PROBLEMAS

1.2.1. PROBLEMAS SECUNDARIOS

- Gestión manual de inventarios: La falta de un sistema automatizado genera inconsistencias


en el control de stock y puede resultar en productos agotados o sobrestock.

- Ausencia de sistema de fidelización: No existe un mecanismo estructurado para gestionar


promociones, cupones y campañas de marketing dirigidas a clientes frecuentes.

- Comunicación deficiente: La carencia de un sistema de chat integrado dificulta la


comunicación entre clientes y personal de atención.

- Seguimiento de entregas ineficiente: No hay un sistema que permita rastrear en tiempo real
el estado de los pedidos y las asignaciones de repartidores.

- Análisis de datos limitado: La ausencia de reportes estructurados impide la toma de


decisiones basada en datos históricos de ventas y preferencias de clientes.
1.2.2. PROBLEMA PRINCIPAL

La empresa CRUNCH & GO carece de un sistema de base de datos que permita la gestión
eficiente y automatizada de todos los procesos relacionados con la venta de comida rápida,
desde la administración de productos y clientes hasta el procesamiento completo de pedidos
y entregas, lo que genera ineficiencias operativas, pérdida de oportunidades de negocio y una
experiencia de usuario subóptima.

1.3. OBJETIVOS

1.3.1. OBJETIVO GENERAL

Desarrollar e implementar un sistema de base de datos relacional completo para la gestión


integral de ventas de comida rápida de la empresa CRUNCH & GO, que optimice los
procesos operativos, mejore la experiencia del cliente y proporcione herramientas efectivas
para la toma de decisiones estratégicas.

1.3.2. OBJETIVOS ESPECÍFICOS

- Diseñar una estructura de base de datos que garantice la integridad referencial y minimice
la redundancia de datos.

- Implementar un sistema de gestión de usuarios con roles diferenciados para clientes,


empleados y administradores.

- Establecer un flujo completo de procesamiento de pedidos desde la creación hasta la


entrega.

- Implementar funciones, procedimientos almacenados y triggers para automatizar procesos


del negocio.

- Desarrollar interfaces de programación que permitan la integración con aplicaciones


frontend.

1.4. JUSTIFICACIÓN
La implementación de este sistema de base de datos se justifica por múltiples factores
estratégicos y operativos. En primer lugar, la industria de comida rápida requiere procesos
ágiles y eficientes para mantener la competitividad en un mercado cada vez más exigente.
Un sistema automatizado reduce significativamente los errores humanos y los tiempos de
procesamiento.

La capacidad de generar reportes detallados proporciona información valiosa para la toma de


decisiones estratégicas, permitiendo identificar productos más rentables, horarios de mayor
demanda.

Finalmente, la escalabilidad del sistema garantiza que pueda adaptarse al crecimiento futuro
de la empresa, soportando mayores volúmenes de transacciones y funcionalidades
adicionales sin comprometer el rendimiento.
2. REQUERIMIENTOS
2.1. DIAGNÓSTICO

El levantamiento de requerimientos se realizó mediante la entrevista de 2 gerentes de la


empresa CRUNCH & GO que se combinó técnicas cualitativas y cuantitativas para obtener
una comprensión integral de las necesidades del negocio.

Métodos Utilizados:

1. Se realizaron entrevistas con 2 gerentes, para los requerimientos.

2. Se revisaron registros existentes, formularios manuales y procesos documentados para


comprender el flujo actual de información.

3. Se analizaron sistemas similares en el mercado para identificar mejores prácticas y


funcionalidades.

Técnicas e Instrumentos:

- Para definir interacciones específicas entre actores y sistema, también se realizó casos de
uso.

- Se realizo un análisis minucioso para asegurar que todos los requerimientos estén cubiertos
en el diseño.

2.2. REQUERIMIENTOS FUNCIONALES

ID Requerimiento Descripción del Requerimiento Prioridad


Registro de Permitir la creación y gestión de cuentas para Alta
RF001
usuarios clientes, empleados/cajeros.
Registro de Permitir registrar productos como Alta
RF002
productos hamburguesas, pizzas, bebidas, Salchipapa, etc.
Gestion de pedidos Permitir a los usuarios puedan crear, modificar Alta
RF003
y cancelar pedidos.
Control de Actualizar automáticamente el inventario según Media
RF004
inventario los productos vendidos
Integracion con Alta
RF005 Aceptar pagos en efectivo, tarjeta y código QR
métodos de pago
Visualizacion del Mostrar el menú disponible al cliente con Alta
RF006 menú precios y descripciones.
Confirmacion de Notificar al cliente cuando el pedido este listo o Media
RF007
pedido en proceso
Seguimiento del Permitir al cliente y al cajero visualizar el Media
RF008
estado del pedido estado del pedido en tiempo real.
Asignacion de Alta
Permitir agregar pedidos a repartidores
RF009 pedidos a
disponibles y registrar el estado de entrega.
repartidores
Aplicar Media
Permitir agregar cupones, combos y descuentos
RF010 promociones y
a productos seleccionados
descuentos

2.3. REQUERIMIENTOS NO FUNCIONALES

ID Requerimiento Descripción del Requerimiento Prioridad


Disponibilidad El sistema debe estar disponible al menos 99% Alta
RNF001
del tiempo
Tiempo de Las acciones deben ejecutarse en menos de 2 Alta
RNF002
respuesta segundos.
Escalabilidad Debe poder soportar un aumento de pedidos en Media
RNF003
horas pico.
Seguridad de datos Proteger la información de usuarios y Alta
RNF004
transacciones con cifrado.
Interfaz amigable La interfaz debe ser intuitiva y fácil de usar para Media
RNF005
clientes y empleados
Compatibilidad Funcionar correctamente en navegadores Alta
RNF006
modernos y dispositivos móviles.
3. ANÁLISIS
3.1. HERRAMIENTAS DE ANÁLISIS

Para el análisis del sistema se utilizaron las siguientes herramientas metodológicas:

Análisis Entidad-Relación (E-R):

Se empleó el modelo E-R para identificar entidades principales, sus atributos y las relaciones
entre ellas. Esta técnica permitió establecer la estructura conceptual base del sistema.

Análisis de Flujo de Datos:

Se desarrollaron diagramas de flujo de datos (DFD) para comprender cómo la información


se mueve a través del sistema, identificando procesos, almacenes de datos y flujos de
información.

Casos de uso:

Se desarrollaron casos de uso con el objetivo de optimizar el análisis del comportamiento de


los usuarios al interactuar con el sistema, permitiendo anticipar sus acciones, necesidades y
flujos más frecuentes dentro de la plataforma.

CASOS DE USOS POR USUARIO


Objetivo: Gestionar toda la plataforma y operaciones del sistema.

Caso de Uso Descripción

Registrar/editar datos de la empresa Cambiar nombre, dirección, NIT, contacto.

Gestionar horarios de atención Asignar horarios por sucursal.

Crear/modificar/eliminar usuarios Gestión de cuentas de empleados.

Administrar roles Crear o editar roles y permisos.

Gestionar productos Agregar, modificar o eliminar productos del menú.

Administrar categorías Organizar productos por tipo.

Gestionar promociones Crear y editar ofertas con descuento.


Supervisar pedidos Ver todos los pedidos y su estado actual.

Control de inventario Registrar cantidades de productos e ingredientes.

Generar reportes de ventas Visualizar ingresos por período.

Gestionar cupones de descuento Crear, editar o eliminar códigos de promoción.

Configurar campañas publicitarias Activar promociones específicas.

Ver historial del sistema Registro de eventos y cambios en el sistema.

CLIENTE
Objetivo: Realizar pedidos y gestionar su experiencia.

Caso de Uso Descripción

Registrarse/Iniciar sesión Crear cuenta y acceder con credenciales.

Ver menú y productos Visualizar productos con descripción e imagen.

Filtrar por categoría Buscar por tipo (hamburguesas, bebidas, etc.).

Agregar productos al carrito Elegir productos y cantidades.

Personalizar productos Modificar ingredientes.

Aplicar cupones de descuento Ingresar códigos promocionales.

Realizar pedido Confirmar pedido con dirección y pago.

Elegir tipo de entrega Escoger entre retiro o envío a domicilio.

Ver estado del pedido Ver seguimiento en tiempo real.

Guardar direcciones Registrar lugares frecuentes.

Calificar y comentar Evaluar su experiencia.

Usar el chat de atención Enviar preguntas o reclamos.

Ver historial de pedidos Revisar pedidos anteriores.

Recibir notificaciones Confirmación, estado del pedido por app/correo.

CAJERO
Caso de Uso Descripción

Iniciar sesión Acceder con credenciales de cajero.

Registrar pedidos presenciales Ingresar pedidos hechos en persona o vía telefónica.

Aplicar descuentos o cupones Ingresar promociones al sistema.

Confirmar método de pago Registrar efectivo, tarjeta u otro.

Ver historial de ventas Revisar transacciones realizadas.

Generar ticket o comprobante Imprimir o enviar comprobante al cliente.

Ver disponibilidad de productos Consultar stock actualizado.

REPARTIDOR

Caso de Uso Descripción

Iniciar sesión Acceder con cuenta de repartidor.

Ver pedidos asignados Consultar pedidos por entregar.

Ver detalles de entrega Dirección, teléfono del cliente, indicaciones.

Cambiar estado del pedido Actualizar estado a “En camino” o “Entregado”.

Confirmar entrega Marcar como completada una vez finalizada.

Recibir notificaciones Aviso de nuevos pedidos o cambios.

3.2. COMPRENSIÓN DE LOS REQUERIMIENTOS

El análisis detallado de requerimientos reveló la necesidad de un sistema complejo que


gestiona múltiples aspectos del negocio de comida rápida:

Gestión de Usuarios:

El sistema debe manejar diferentes tipos de usuarios (clientes, empleados y rol de empleados)
con permisos y funcionalidades específicas. Esto requiere un diseño que permita
escalabilidad en roles futuros.
Flujo Completo de Pedidos:

Desde la selección de productos hasta la entrega final, incluyendo aplicación de promociones,


procesamiento de pagos y seguimiento de entregas. Este flujo es crítico para la experiencia
del usuario.

Sistema de Inventario Dinámico:

Control en tiempo real de stock con alertas automáticas, fundamental para evitar ventas de
productos no disponibles.

Marketing y Fidelización:

Capacidad de crear campañas promocionales complejas con cupones, descuentos y


seguimiento de efectividad.

Comunicación Integrada:

Sistema de chat y notificaciones que mantenga a los clientes informados sobre el estado de
sus pedidos.

3.3. IDENTIFICACIÓN DE SUBSISTEMAS

Basándose en el análisis funcional, se identificaron los siguientes subsistemas principales:

Subsistema de Gestión de Usuarios:

- Manejo de autenticación y autorización

- Gestión de perfiles de clientes y empleados

- Control de roles y permisos

- Tablas involucradas: usuario, cliente, empleado, rol

Subsistema de Gestión de Productos:

- Administración de catálogo de productos


- Control de categorías y clasificaciones

- Gestión de precios e imágenes

- Tablas involucradas: producto, categoria, inventario

Subsistema de Marketing:

- Creación y gestión de campañas promocionales

- Administración de cupones de descuento

- Seguimiento de efectividad de promociones

- Tablas involucradas: promocion, cupon, campania, promocion_producto

Subsistema de Procesamiento de Órdenes:

- Creación y gestión de pedidos

- Cálculo de precios y aplicación de descuentos

- Control de estados de pedido

- Tablas involucradas: pedido, detalle_pedido, pago

Subsistema de Entregas:

- Asignación de repartidores

- Gestión de direcciones de entrega

- Seguimiento de entregas

- Tablas involucradas: asignacion_repartidor, direccion_cliente

Subsistema de Comunicación:

- Chat en tiempo real


- Sistema de notificaciones

- Gestión de comentarios y calificaciones

- Tablas involucradas: chat, notificacion, comentario


4. DISEÑO
4.1. HERRAMIENTAS DE DISEÑO

Para el diseño de la base de datos se utilizaron las siguientes herramientas:

PostgreSQL:

Motor de base de datos relacional elegido por su robustez, capacidades avanzadas y soporte
para características empresariales como triggers, funciones y procedimientos almacenados.

Metodología de Diseño E-R:

Aplicación sistemática del modelo Entidad-Relación para establecer la estructura conceptual,


seguida de la transformación al modelo lógico y físico.

Draw.io:

Aplicación que utilizamos para la creación de diagramas de entidad relación,

Estándares de Nomenclatura:

Implementación de convenciones consistentes para nombres de tablas, campos, índices y


restricciones.

4.2. MODELO ENTIDAD RELACIÓN

El modelo E-R del sistema presenta las siguientes entidades principales y sus relaciones:

Entidades Principales:

USUARIO: Entidad base para todos los usuarios del sistema

- Atributos: id_usuario, nombre, correo, password, tipo_usuario, fecha_creacion

CLIENTE: Especialización de usuario para clientes

- Atributos: id_cliente, cedula_identidad, telefono


- Relación: Cliente ISA Usuario (1:1)

EMPLEADO: Especialización de usuario para empleados

- Atributos: id_empleado, telefono, fecha_ingreso

- Relación: Empleado ISA Usuario (1:1)

ROL: Define roles y permisos de empleados

- Atributos: id_rol, nombre_rol, descripcion, permisos

PRODUCTO: Productos disponibles para venta

- Atributos: id_producto, nombre_producto, descripcion, precio, imagen, disponible

CATEGORIA: Clasificación de productos

- Atributos: id_categoria, nombre_categoria, descripcion

PEDIDO: Órdenes realizadas por clientes

- Atributos: id_pedido, fecha_pedido, estado, metodo_entrega, direccion_entrega, total

PROMOCION: Ofertas y promociones

- Atributos: id_promocion, titulo, descripcion, activa, monto, fecha_inicio, fecha_fin

Relaciones Principales:

- CLIENTE realiza PEDIDO (1:N)

- PEDIDO contiene PRODUCTO (N:M) a través de DETALLE_PEDIDO

- PRODUCTO pertenece a CATEGORIA (N:1)

- EMPLEADO tiene ROL (N:1)

- PROMOCION aplica a PRODUCTO (N:M)


- CLIENTE tiene DIRECCION_CLIENTE (1:N)

- EMPLEADO asignado a PEDIDO (1:N) para entregas


4.3. DICCIONARIO DE DATOS
4.4. MODELO RELACIONAL
5. APLICACIÓN
5.1. CREACIÓN DE LA BASE DE DATOS
/*
╔════════════════════════════════════════════════════╗
║ creación de tablas en postgreSql ║
╚════════════════════════════════════════════════════╝
*/

-- Tabla usuario
CREATE TABLE usuario (
id_usuario SERIAL PRIMARY KEY,
nombre VARCHAR(100) NOT NULL,
correo VARCHAR(100) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
tipo_usuario VARCHAR(20) NOT NULL,
fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Tabla rol
CREATE TABLE rol (
id_rol SERIAL PRIMARY KEY,
nombre_rol VARCHAR(50) NOT NULL,
descripcion TEXT,
permisos TEXT
);

-- Tabla empleado
CREATE TABLE empleado (
id_empleado SERIAL PRIMARY KEY,
id_usuario INT NOT NULL UNIQUE REFERENCES usuario(id_usuario),
id_rol INT REFERENCES rol(id_rol),
telefono VARCHAR(20),
fecha_ingreso DATE DEFAULT CURRENT_DATE
);

-- Tabla cliente
CREATE TABLE cliente (
id_cliente SERIAL PRIMARY KEY,
id_usuario INT NOT NULL UNIQUE REFERENCES usuario(id_usuario),
cedula_identidad VARCHAR(20) UNIQUE,
telefono VARCHAR(20)
);

-- Tabla categoria
CREATE TABLE categoria (
id_categoria SERIAL PRIMARY KEY,
nombre_categoria VARCHAR(100) NOT NULL,
descripcion TEXT
);
-- Tabla producto
CREATE TABLE producto (
id_producto SERIAL PRIMARY KEY,
nombre_producto VARCHAR(100) NOT NULL,
descripcion TEXT,
precio DECIMAL(8,2) NOT NULL,
imagen TEXT,
disponible BOOLEAN DEFAULT TRUE,
id_categoria INT REFERENCES categoria(id_categoria)
);

-- Tabla inventario
CREATE TABLE inventario (
id_inventario SERIAL PRIMARY KEY,
id_producto INT UNIQUE REFERENCES producto(id_producto),
cantidad INT NOT NULL,
stock_minimo INT,
fecha_actualizacion DATE DEFAULT CURRENT_DATE
);

-- Tabla promocion
CREATE TABLE promocion (
id_promocion SERIAL PRIMARY KEY,
titulo VARCHAR(100),
descripcion TEXT,
activa BOOLEAN DEFAULT TRUE,
monto INTEGER,
fecha_inicio DATE,
fecha_fin DATE
);

-- Tabla promocion_producto (relación muchos a muchos)


CREATE TABLE promocion_producto (
id_promocion INT REFERENCES promocion(id_promocion),
id_producto INT REFERENCES producto(id_producto),
PRIMARY KEY (id_promocion, id_producto)
);

-- Tabla campania
CREATE TABLE campania (
id_campania SERIAL PRIMARY KEY,
nombre VARCHAR(100),
descripcion TEXT,
activa BOOLEAN DEFAULT TRUE,
fecha_inicio DATE,
fecha_fin DATE
);

-- Tabla cupon
CREATE TABLE cupon (
id_cupon SERIAL PRIMARY KEY,
codigo VARCHAR(50) NOT NULL UNIQUE,
descripcion TEXT,
descuento NUMERIC(5,2),
fecha_inicio DATE,
fecha_fin DATE,
uso_maximo INT,
usado INT DEFAULT 0,
id_campania INT REFERENCES campania(id_campania)
);

-- Tabla pedido
CREATE TABLE pedido (
id_pedido SERIAL PRIMARY KEY,
id_cliente INT REFERENCES cliente(id_cliente),
fecha_pedido TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
estado VARCHAR(30),
metodo_entrega VARCHAR(30),
direccion_entrega TEXT,
total DECIMAL(10,2),
id_cupon INT REFERENCES cupon(id_cupon)
);

-- Tabla detalle_pedido
CREATE TABLE detalle_pedido (
id_detalle SERIAL PRIMARY KEY,
id_pedido INT REFERENCES pedido(id_pedido),
id_producto INT REFERENCES producto(id_producto),
cantidad INT,
precio_unitario DECIMAL(8,2)
);

-- Tabla pago
CREATE TABLE pago (
id_pago SERIAL PRIMARY KEY,
id_pedido INT REFERENCES pedido(id_pedido),
metodo_pago VARCHAR(50),
monto DECIMAL(10,2),
fecha_pago TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
estado_pago VARCHAR(50)
);

-- Tabla comentario
CREATE TABLE comentario (
id_comentario SERIAL PRIMARY KEY,
id_pedido INT REFERENCES pedido(id_pedido),
id_cliente INT REFERENCES cliente(id_cliente),
calificacion INT,
texto TEXT,
fecha TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Tabla chat
CREATE TABLE chat (
id_chat SERIAL PRIMARY KEY,
id_cliente INT REFERENCES cliente(id_cliente),
id_empleado INT REFERENCES empleado(id_empleado),
mensaje TEXT,
fecha_hora TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
tipo VARCHAR(20)
);

-- Tabla notificacion
CREATE TABLE notificacion (
id_notificacion SERIAL PRIMARY KEY,
id_cliente INT REFERENCES cliente(id_cliente),
mensaje TEXT,
leido BOOLEAN DEFAULT FALSE,
fecha TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Tabla direccion_cliente
CREATE TABLE direccion_cliente (
id_direccion SERIAL PRIMARY KEY,
id_cliente INT REFERENCES cliente(id_cliente),
direccion TEXT,
referencia TEXT,
ciudad VARCHAR(100),
latitud NUMERIC(10,6),
longitud NUMERIC(10,6),
activa BOOLEAN DEFAULT TRUE
);

-- Tabla asignacion_repartidor
CREATE TABLE asignacion_repartidor (
id_asignacion SERIAL PRIMARY KEY,
id_pedido INT REFERENCES pedido(id_pedido),
id_empleado INT REFERENCES empleado(id_empleado),
fecha_asignacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
estado_entrega VARCHAR(30)
);

/*
╔════════════════════════════════════════════════════╗
║ inserción de datos a las tablas ║
╚════════════════════════════════════════════════════╝
*/

INSERT INTO usuario (nombre, correo, password, tipo_usuario) VALUES


('Juan Pérez', '[email protected]', 'hashpass1', 'cliente'),
('María Rodríguez', '[email protected]', 'hashpass2',
'cliente'),
('Carlos Gutiérrez', '[email protected]', 'hashpass3',
'cliente'),
('Ana López', '[email protected]', 'hashpass4', 'empleado'),
('Luis Fernández', '[email protected]', 'hashpass5',
'empleado'),
('Laura Vargas', '[email protected]', 'hashpass6', 'admin'),
('Pedro Ramírez', '[email protected]', 'hashpass7', 'cliente'),
('Daniela Castro', '[email protected]', 'hashpass8', 'cliente'),
('Fernando Suárez', '[email protected]', 'hashpass9',
'empleado'),
('Sofía Molina', '[email protected]', 'hashpass10', 'cliente'),
('Jorge Aguilar', '[email protected]', 'hashpass11', 'empleado'),
('Natalia Quispe', '[email protected]', 'hashpass12', 'admin'),
('Esteban Rojas', '[email protected]', 'hashpass13', 'cliente'),
('Gabriela Méndez', '[email protected]', 'hashpass14',
'cliente'),
('Marco Salazar', '[email protected]', 'hashpass15', 'cliente'),
('Verónica Chávez', '[email protected]', 'hashpass16',
'empleado'),
('Ricardo Pinto', '[email protected]', 'hashpass17', 'empleado'),
('Alejandra Flores', '[email protected]', 'hashpass18',
'cliente'),
('Iván Mamani', '[email protected]', 'hashpass19', 'empleado'),
('Ximena Calle', '[email protected]', 'hashpass20', 'admin');

INSERT INTO rol (nombre_rol, descripcion, permisos) VALUES


('Administrador General', 'Acceso total a todas las funcionalidades del
sistema', 'GESTION_USUARIOS,VER_REPORTES,MODIFICAR_DATOS,TODOS'),
('Gestor de Pedidos', 'Supervisa y coordina los pedidos en la app',
'VER_PEDIDOS,ACTUALIZAR_ESTADO_PREPARACION,ASIGNAR_REPARTIDOR'),
('Repartidor', 'Encargado de entregar pedidos a domicilio',
'VER_PEDIDOS,ACTUALIZAR_ESTADO_ENTREGA'),
('Atención al Cliente', 'Resuelve dudas y problemas de los usuarios',
'GESTIONAR_CHAT,REGISTRAR_RECLAMOS'),
('Marketing Digital', 'Gestiona promociones y campañas',
'CREAR_CUPONES,MODIFICAR_PROMOCIONES'),
('Encargado de Inventario', 'Monitorea el stock de productos',
'VER_INVENTARIO,ACTUALIZAR_STOCK'),
('Contador', 'Lleva el control de pagos y finanzas',
'VER_PAGOS,GENERAR_INFORMES');

INSERT INTO empleado (id_usuario, id_rol, telefono) VALUES


(4, 2, '76781234'), -- Ana López como Gestor de Pedidos
(5, 3, '78124567'), -- Luis Fernández como Repartidor
(9, 3, '76439876'), -- Fernando Suárez como Repartidor
(11, 4, '77345621'), -- Jorge Aguilar como Atención al Cliente
(16, 6, '76543210'), -- Verónica Chávez como Inventario
(17, 5, '77881234'), -- Ricardo Pinto como Marketing Digital
(19, 3, '76775555'), -- Iván Mamani como Repartidor
(6, 1, '71234567'), -- Laura Vargas como Admin General
(12, 1, '70987654'), -- Natalia Quispe como Admin General
(20, 7, '70456789'); -- Ximena Calle como Contadora

INSERT INTO cliente (id_usuario, cedula_identidad, telefono) VALUES


(1, '1234567 LP', '72012345'), -- Juan Pérez
(2, '2345678 SC', '72123456'), -- María Rodríguez
(3, '3456789 CB', '72234567'), -- Carlos Gutiérrez
(7, '4567890 LP', '72345678'), -- Pedro Ramírez
(8, '5678901 SC', '72456789'), -- Daniela Castro
(10, '6789012 CB', '72567890'), -- Sofía Molina
(13, '7890123 LP', '72678901'), -- Esteban Rojas
(14, '8901234 SC', '72789012'), -- Gabriela Méndez
(15, '9012345 CB', '72890123'), -- Marco Salazar
(18, '9123456 LP', '72901234'); -- Alejandra Flores

INSERT INTO categoria (nombre_categoria, descripcion) VALUES


('Hamburguesas', 'Variedad de hamburguesas clásicas y especiales'),
('Pizzas', 'Pizzas personales y familiares con ingredientes variados'),
('Pollo', 'Piezas de pollo frito o a la brasa'),
('Bebidas', 'Refrescos, jugos, y bebidas energéticas'),
('Postres', 'Helados, tortas, y otros dulces'),
('Combos', 'Ofertas combinadas de comida y bebida'),
('Snacks', 'Papas fritas, nuggets, y otros bocadillos'),
('Vegetariano', 'Opciones sin carne'),
('Desayunos', 'Sandwiches, jugos y café para comenzar el día'),
('Promociones', 'Productos con descuento o edición limitada');

INSERT INTO producto (nombre_producto, descripcion, precio, imagen,


disponible, id_categoria) VALUES
('Hamburguesa Clásica', 'Pan artesanal, carne de res, lechuga y tomate',
22.00, NULL, TRUE, 1),
('Hamburguesa Doble Queso', 'Doble carne y doble queso cheddar', 28.00,
NULL, TRUE, 1),
('Hamburguesa Vegana', 'Hamburguesa con proteína vegetal, lechuga y
palta', 25.00, NULL, TRUE, 8),
('Pizza Margarita Personal', 'Mozzarella, tomate y albahaca', 30.00,
NULL, TRUE, 2),
('Pizza Hawaiana Familiar', 'Jamón y piña en masa gruesa', 58.00, NULL,
TRUE, 2),
('Pollo Frito 2 Piezas', 'Muslo y pierna con papas pequeñas', 18.00,
NULL, TRUE, 3),
('Pollo Broaster Combo', '3 piezas + papas medianas + refresco', 30.00,
NULL, TRUE, 6),
('Refresco Coca-Cola 500ml', 'Botella de plástico 500ml', 7.00, NULL,
TRUE, 4),
('Refresco Pepsi 2L', 'Botella grande para compartir', 14.00, NULL, TRUE,
4),
('Jugo Natural de Naranja', 'Jugo exprimido sin azúcar añadida', 9.50,
NULL, TRUE, 4),
('Helado de Chocolate', 'Vaso mediano con chispas', 10.00, NULL, TRUE,
5),
('Torta Tres Leches', 'Porción individual con cereza', 12.00, NULL, TRUE,
5),
('Combo Familiar', '4 hamburguesas, papas grandes y refresco de 2L',
85.00, NULL, TRUE, 6),
('Nuggets de Pollo (6)', 'Acompañados con salsa BBQ', 15.00, NULL, TRUE,
7),
('Papas Fritas Medianas', 'Crocantes y saladas', 10.00, NULL, TRUE, 7),
('Wrap Vegetariano', 'Con lechuga, zanahoria, tomate y hummus', 18.00,
NULL, TRUE, 8),
('Sandwich de Huevo y Jamón', 'Desayuno clásico con pan integral', 14.00,
NULL, TRUE, 9),
('Café Americano', 'Taza mediana caliente', 6.00, NULL, TRUE, 9),
('Combo Desayuno', 'Sandwich + jugo + café', 22.00, NULL, TRUE, 6),
('Hamburguesa Promo Lunes', 'Precio especial por tiempo limitado', 19.00,
NULL, TRUE, 10);

INSERT INTO inventario (id_producto, cantidad, stock_minimo) VALUES


(1, 50, 10),
(2, 40, 10),
(3, 20, 5),
(4, 25, 8),
(5, 12, 3),
(6, 60, 15),
(7, 35, 10),
(8, 80, 20),
(9, 40, 10),
(10, 30, 8),
(11, 45, 12),
(12, 20, 5),
(13, 15, 5),
(14, 50, 10),
(15, 70, 20),
(16, 25, 6),
(17, 100, 25),
(18, 90, 20),
(19, 60, 15),
(20, 30, 8);

INSERT INTO promocion (titulo, descripcion, activa, monto, fecha_inicio,


fecha_fin) VALUES
('Lunes de Hamburguesas', '20% de descuento en hamburguesas seleccionadas
los días lunes', TRUE, 20, '2025-06-01', '2025-06-30'),
('Combo Familiar Especial', 'Descuento de Bs. 15 en el combo familiar',
TRUE, 15, '2025-06-10', '2025-07-10'),
('2x1 en Pizzas', 'Compra una pizza personal y llévate otra gratis',
TRUE, 30, '2025-06-15', '2025-06-25'),
('Súper Viernes', 'Bs. 10 de descuento en pedidos mayores a Bs. 70 cada
viernes', TRUE, 10, '2025-06-01', '2025-06-30'),
('Promo de Bienvenida', 'Recibe Bs. 25 de descuento en tu primer pedido',
TRUE, 25, '2025-05-01', '2025-12-31'),
('Descuento Postres', '15% de descuento en postres seleccionados', TRUE,
15, '2025-06-01', '2025-06-20'),
('Día del Delivery Gratis', 'Haz tu pedido y no pagues el envío en esta
fecha especial', FALSE, 10, '2025-05-20', '2025-05-20'),
('Semana del Pollo', 'Descuento de Bs. 12 en combos de pollo frito',
TRUE, 12, '2025-06-17', '2025-06-24'),
('Promo por el Día del Padre', 'Obtén Bs. 20 de descuento en combos
familiares por el Día del Padre', FALSE, 20, '2025-06-15', '2025-06-16'),
('Martes de Refrescos Gratis', 'Llévate un refresco gratis por cada combo
comprado los martes', TRUE, 8, '2025-06-04', '2025-07-04');

INSERT INTO promocion_producto (id_promocion, id_producto) VALUES


(1, 1), -- Lunes de Hamburguesas → Hamburguesa Clásica
(1, 2), -- Lunes de Hamburguesas → Hamburguesa Doble Queso
(2, 13), -- Combo Familiar Especial → Combo Familiar
(3, 4), -- 2x1 en Pizzas → Pizza Margarita
(3, 5), -- 2x1 en Pizzas → Pizza Hawaiana
(4, 20), -- Súper Viernes → Hamburguesa Promo Lunes
(4, 6), -- Súper Viernes → Pollo Frito
(5, 1), -- Bienvenida → Hamburguesa Clásica
(5, 4), -- Bienvenida → Pizza Margarita
(5, 14), -- Bienvenida → Nuggets
(6, 11), -- Descuento Postres → Helado
(6, 12), -- Descuento Postres → Torta Tres Leches
(7, 8), -- Delivery Gratis → Coca-Cola
(8, 6), -- Semana del Pollo → Pollo Frito
(8, 7), -- Semana del Pollo → Pollo Broaster
(9, 13), -- Día del Padre → Combo Familiar
(9, 2), -- Día del Padre → Hamburguesa Doble Queso
(10, 13), -- Refresco Gratis → Combo Familiar
(10, 8), -- Refresco Gratis → Coca-Cola
(10, 9); -- Refresco Gratis → Pepsi 2L

INSERT INTO campania (nombre, descripcion, activa, fecha_inicio,


fecha_fin) VALUES
('Campaña Invierno 2025', 'Promociones especiales por temporada de
invierno', TRUE, '2025-06-01', '2025-08-31'),
('Bienvenida Clientes Nuevos', 'Descuentos exclusivos para nuevos
usuarios', TRUE, '2025-05-01', '2025-12-31'),
('Campaña Día del Padre', 'Promociones especiales por el Día del Padre',
FALSE, '2025-06-10', '2025-06-16'),
('Semana Loca de Combos', 'Descuentos en combos de hamburguesas y
pizzas', TRUE, '2025-06-15', '2025-06-22'),
('Campaña Regreso a Clases', 'Ofertas para estudiantes y familias',
FALSE, '2025-02-01', '2025-03-10'),
('Viernes Felices', 'Todos los viernes descuentos en productos
seleccionados', TRUE, '2025-05-15', '2025-07-15'),
('Campaña Delivery Gratis', 'Entrega gratuita en zonas seleccionadas',
FALSE, '2025-04-01', '2025-04-30'),
('Postres de Temporada', 'Ofertas en postres fríos para combatir el
calor', TRUE, '2025-09-01', '2025-10-31'),
('Campaña Navidad 2024', 'Promociones navideñas y cupones', FALSE, '2024-
12-01', '2024-12-31'),
('Semana del Pollo Frito', 'Precios especiales en productos de pollo',
TRUE, '2025-06-17', '2025-06-24');

INSERT INTO cupon (codigo, descripcion, descuento, fecha_inicio,


fecha_fin, uso_maximo, usado, id_campania) VALUES
('INVIERNO25', 'Descuento de Bs. 25 por la campaña de invierno', 25.00,
'2025-06-01', '2025-08-31', 500, 120, 1),
('BIENVENIDO50', 'Bs. 50 de descuento en tu primer pedido', 50.00, '2025-
05-01', '2025-12-31', 1000, 430, 2),
('PAPA2025', 'Cupón especial por el Día del Padre', 20.00, '2025-06-10',
'2025-06-16', 300, 180, 3),
('COMBOLOCOS', 'Bs. 15 de descuento en combos seleccionados', 15.00,
'2025-06-15', '2025-06-22', 600, 280, 4),
('REGRESO10', 'Bs. 10 de descuento por regreso a clases', 10.00, '2025-
02-01', '2025-03-10', 400, 400, 5),
('VIERNESFELIZ', 'Bs. 12 de descuento válido solo los viernes', 12.00,
'2025-05-15', '2025-07-15', 700, 320, 6),
('DELIVERY0', 'Cupón de delivery gratis', 10.00, '2025-04-01', '2025-04-
30', 500, 500, 7),
('POSTREFRIO', 'Bs. 8 de descuento en postres fríos', 8.00, '2025-09-01',
'2025-10-31', 300, 0, 8),
('NAVIDAD24', 'Bs. 20 de descuento navideño', 20.00, '2024-12-01', '2024-
12-31', 600, 600, 9),
('POLLOCRUNCH', 'Bs. 18 de descuento en productos de pollo', 18.00,
'2025-06-17', '2025-06-24', 350, 90, 10);

INSERT INTO pedido (id_cliente, fecha_pedido, estado, metodo_entrega,


direccion_entrega, total, id_cupon) VALUES
(1, '2025-06-01 12:30:00', 'entregado', 'domicilio', 'Av. Aroma 123,
Cochabamba', 55.00, 1),
(2, '2025-06-01 13:15:00', 'entregado', 'local', NULL, 38.00, NULL),
(3, '2025-06-02 14:45:00', 'cancelado', 'domicilio', 'Calle Sucre 88, La
Paz', 70.00, 2),
(4, '2025-06-03 11:00:00', 'preparando', 'domicilio', 'Av. Banzer 400,
Santa Cruz', 42.00, 4),
(5, '2025-06-03 12:20:00', 'en camino', 'domicilio', 'Av. Cívica 321,
Oruro', 60.00, NULL),
(6, '2025-06-04 18:50:00', 'entregado', 'local', NULL, 28.00, 6),
(7, '2025-06-05 20:00:00', 'entregado', 'domicilio', 'Av. América 456,
Cochabamba', 85.00, 3),
(8, '2025-06-05 19:15:00', 'entregado', 'domicilio', 'Zona Central,
Sucre', 45.00, 1),
(9, '2025-06-06 13:00:00', 'cancelado', 'domicilio', 'Zona Villa Fátima,
La Paz', 38.00, NULL),
(10, '2025-06-06 14:10:00', 'en camino', 'domicilio', 'Calle 9 de Abril,
Tarija', 52.00, 5),
(1, '2025-06-07 17:30:00', 'preparando', 'domicilio', 'Av. Melchor Pérez,
Cochabamba', 48.00, NULL),
(2, '2025-06-07 18:10:00', 'entregado', 'local', NULL, 33.00, NULL),
(3, '2025-06-08 20:00:00', 'entregado', 'domicilio', 'Av. Alemana 500,
Santa Cruz', 76.00, 8),
(4, '2025-06-08 21:00:00', 'entregado', 'domicilio', 'Zona Poconas,
Sucre', 92.00, 9),
(5, '2025-06-09 11:00:00', 'pendiente', 'domicilio', 'Calle Santa Rosa,
Potosí', 36.00, NULL),
(6, '2025-06-09 12:40:00', 'en camino', 'local', NULL, 41.00, NULL),
(7, '2025-06-10 13:10:00', 'entregado', 'domicilio', 'Zona Max Fernández,
El Alto', 49.00, 10),
(8, '2025-06-10 13:50:00', 'cancelado', 'domicilio', 'Calle Comercio,
Trinidad', 57.00, NULL),
(9, '2025-06-11 14:20:00', 'entregado', 'domicilio', 'Zona Cala Cala,
Cochabamba', 68.00, 7),
(10, '2025-06-11 15:00:00', 'preparando', 'domicilio', 'Av. Petrolera,
Cochabamba', 51.00, 2);
INSERT INTO detalle_pedido (id_pedido, id_producto, cantidad,
precio_unitario) VALUES
(1, 1, 2, 22.00), -- 2 Hamburguesas Clásicas
(1, 8, 2, 7.00), -- 2 Coca-Cola 500ml
(2, 4, 1, 30.00), -- Pizza Margarita
(3, 13, 1, 85.00), -- Combo Familiar
(4, 6, 2, 18.00), -- 2 Pollo Frito 2 piezas
(5, 10, 1, 9.50), -- Jugo de Naranja
(6, 2, 1, 28.00), -- Hamburguesa Doble Queso
(7, 5, 1, 58.00), -- Pizza Hawaiana
(8, 14, 2, 15.00), -- 2 Nuggets de Pollo
(9, 7, 1, 30.00), -- Pollo Broaster Combo
(10, 12, 1, 12.00), -- Torta Tres Leches
(11, 16, 1, 18.00), -- Wrap Vegetariano
(12, 17, 1, 14.00), -- Sandwich de Huevo y Jamón
(13, 18, 1, 6.00), -- Café Americano
(14, 3, 1, 25.00), -- Hamburguesa Vegana
(15, 19, 1, 22.00), -- Combo Desayuno
(16, 9, 1, 14.00), -- Pepsi 2L
(17, 11, 1, 10.00), -- Helado de Chocolate
(18, 15, 2, 10.00), -- Papas Fritas x2
(19, 20, 1, 19.00); -- Hamburguesa Promo Lunes

INSERT INTO pago (id_pedido, metodo_pago, monto, estado_pago) VALUES


(1, 'QR', 55.00, 'Pagado'),
(2, 'Transferencia Bancaria', 38.00, 'Pagado'),
(3, 'QR', 70.00, 'Reembolsado'), -- pedido cancelado
(4, 'Tarjeta de Crédito', 42.00, 'Pagado'),
(5, 'QR', 60.00, 'Pagado'),
(6, 'Transferencia Bancaria', 28.00, 'Pagado'),
(7, 'Tarjeta de Débito', 85.00, 'Pagado'),
(8, 'QR', 45.00, 'Pagado'),
(9, 'Transferencia Bancaria', 38.00, 'Reembolsado'), -- cancelado
(10, 'Tarjeta de Crédito', 52.00, 'Pagado'),
(11, 'QR', 48.00, 'Pagado'),
(12, 'Transferencia Bancaria', 33.00, 'Pagado'),
(13, 'QR', 76.00, 'Pagado'),
(14, 'Tarjeta de Débito', 92.00, 'Pagado'),
(15, 'Transferencia Bancaria', 36.00, 'Pendiente'),
(16, 'QR', 41.00, 'Pagado'),
(17, 'Tarjeta de Crédito', 49.00, 'Pagado'),
(18, 'QR', 57.00, 'Reembolsado'), -- cancelado
(19, 'Transferencia Bancaria', 68.00, 'Pagado'),
(20, 'Tarjeta de Débito', 51.00, 'Pagado');

INSERT INTO comentario (id_pedido, id_cliente, calificacion, texto)


VALUES
(1, 1, 5, 'Excelente servicio y la comida llegó caliente.'),
(2, 2, 4, 'Todo bien, aunque tardaron un poco.'),
(6, 6, 5, 'Muy buena atención y sabor.'),
(7, 7, 3, 'Podría mejorar la presentación del pedido.'),
(8, 8, 4, 'Buen sabor pero faltaron salsas.'),
(12, 2, 5, 'Muy rápido y todo delicioso.'),
(13, 3, 4, 'Buena comida, pero el repartidor tardó.'),
(14, 4, 5, 'Excelente todo. Muy recomendado.'),
(17, 7, 5, 'Perfecto, llegó antes de lo estimado.'),
(19, 9, 4, 'Todo bien, aunque el empaque se rompió un poco.');

INSERT INTO chat (id_cliente, id_empleado, mensaje, tipo) VALUES


(1, 2, 'Hola, ¿puedo cambiar la dirección de entrega?', 'cliente'),
(1, 2, 'Claro, ¿cuál sería la nueva dirección?', 'empleado'),
(2, 3, 'Mi pedido aún no llega. ¿Hay algún retraso?', 'cliente'),
(2, 3, 'Revisando... está en camino, llegará en 10 minutos.','empleado'),
(3, 4, 'Quisiera dejar una queja por un pedido anterior.', 'cliente'),
(3, 4, 'Lamentamos lo ocurrido. ¿Podría indicarnos el número de pedido?',
'empleado'),
(7, 7, 'Estoy afuera, ya puede salir con el pedido.', 'empleado'),
(7, 7, 'Perfecto, ahí voy.', 'cliente'),
(8, 1, '¿Puedo pagar con QR cuando llegue el pedido?', 'cliente'),
(8, 1, 'Sí, el repartidor lleva el código QR.', 'empleado'),
(9, 1, 'Se olvidaron mi bebida en el pedido.', 'cliente'),
(9, 1, 'Lo sentimos. Le ofreceremos un cupón para su próxima compra.',
'empleado');

INSERT INTO notificacion (id_cliente, mensaje) VALUES


(1, 'Tu pedido ha sido recibido y está en preparación.'),
(1, '¡Gracias por tu compra! No olvides calificar tu pedido.'),
(2, 'Tu pedido fue entregado exitosamente.'),
(2, 'Cupón del 10% disponible para tu próxima compra.'),
(3, 'Lamentamos informarte que tu pedido fue cancelado.'),
(4, 'Tu pedido está en camino, llegará en breve.'),
(4, 'Nuevo menú disponible esta semana, ¡échale un vistazo!'),
(5, 'Hemos recibido tu solicitud. Atención al cliente se comunicará
contigo.'),
(6, 'Tu pedido está listo para recoger en el punto de entrega.'),
(7, 'Promoción activa: 2x1 en combos hoy hasta las 21:00.'),
(8, '¡Bienvenido/a! Gracias por registrarte en nuestra app.'),
(9, 'Recuerda que puedes ganar cupones invitando amigos.'),
(10, 'Tu pedido fue entregado. ¿Qué te pareció? Déjanos tu comentario.');

INSERT INTO direccion_cliente (id_cliente, direccion, referencia, ciudad,


latitud, longitud) VALUES
(1, 'Av. Aroma 123', 'Frente al mercado Aroma', 'Cochabamba', -17.393526,
-66.157025),
(1, 'Calle Lanza 456', 'Edificio Azul, piso 3', 'Cochabamba', -17.384512,
-66.165430),
(2, 'Zona Norte, Calle 10', 'Cerca al Hospital Japonés', 'Santa Cruz', -
17.752146, -63.185719),
(3, 'Av. Villazón 800', 'Universidad Mayor', 'Cochabamba', -17.379321, -
66.145000),
(4, 'Zona Miraflores', 'A media cuadra del estadio', 'La Paz', -
16.511279, -68.119293),
(5, 'Av. Cívica 321', 'Frente a la plaza principal', 'Oruro', -17.968095,
-67.106407),
(6, 'Av. Blanco Galindo Km 5', 'Altura surtidor El Cristo', 'Cochabamba',
-17.386401, -66.223145),
(7, 'Calle Junín #123', 'Edificio Copacabana', 'Sucre', -19.045228, -
65.259013),
(8, 'Zona El Trompillo', 'Frente a colegio Don Bosco', 'Santa Cruz', -
17.803098, -63.183942),
(9, 'Av. 6 de Agosto y Calle Bolívar', 'A lado del Banco Unión',
'Potosí', -19.583572, -65.753994),
(10, 'Av. Petrolera s/n', 'Cerca a la Universidad', 'Cochabamba', -
17.436001, -66.182119);

INSERT INTO asignacion_repartidor (id_pedido, id_empleado,


fecha_asignacion) VALUES
(1, 2, '2025-06-01 12:00:00'),
(2, 3, '2025-06-01 13:00:00'),
(3, 7, '2025-06-02 14:00:00'),
(4, 2, '2025-06-03 10:30:00'),
(5, 2, '2025-06-03 12:00:00'),
(6, 3, '2025-06-04 18:00:00'),
(7, 3, '2025-06-05 19:00:00'),
(8, 7, '2025-06-05 19:00:00'),
(9, 7, '2025-06-06 12:00:00'),
(10, 3, '2025-06-06 13:00:00'),
(11, 2, '2025-06-07 17:00:00'),
(12, 7, '2025-06-07 18:00:00'),
(13, 2, '2025-06-08 19:00:00'),
(14, 3, '2025-06-08 20:00:00'),
(15, 7, '2025-06-09 10:30:00'),
(16, 2, '2025-06-09 12:00:00'),
(17, 7, '2025-06-10 13:00:00'),
(18, 3, '2025-06-10 14:00:00'),
(19, 2, '2025-06-11 13:00:00'),
(20, 3, '2025-06-11 14:30:00');
5.2. PRESENTACIÓN DEL DIAGRAMA

Extraído de PostgreSQL

5.3. APLICACIÓN DE FUNCION

La función almacenada obtener_promociones_activas no recibe parámetros y tiene como


objetivo retornar todas las promociones que se encuentran activas en el sistema. Para ello,
realiza una consulta sobre la tabla promocion filtrando únicamente aquellas cuyo campo
activa sea verdadero y cuya fecha actual se encuentre dentro del rango entre fecha_inicio y
fecha_fin.

La función retorna una tabla con los siguientes campos: ID de la promoción, título,
descripción, monto de descuento, fecha de inicio y fecha de finalización. Esta función fue
diseñada para facilitar la consulta rápida de promociones vigentes desde el sistema web,
permitiendo su visualización en una tabla accesible desde una interfaz PHP. Gracias a esta
función, se mejora la eficiencia del sistema al centralizar la lógica de filtrado dentro de la
base de datos.

CREATE OR REPLACE FUNCTION obtener_promociones_activas()


RETURNS TABLE (
id_promo INT,
titul VARCHAR,
descrip TEXT,
mont INT,
fechaini DATE,
fechafin DATE
) AS $$
BEGIN
RETURN QUERY
SELECT id_promocion, titulo, descripcion, monto, fecha_inicio, fecha_fin
FROM promocion
WHERE activa = TRUE
AND CURRENT_DATE BETWEEN fecha_inicio AND fecha_fin;
END;
$$ LANGUAGE plpgsql;
5.4. APLICACIÓN DE PROCEDIMIENTO

La procedimiento almacenado registrar_pago recibe como parámetros el ID de un pedido, el


método de pago, el monto pagado y el estado del pago, y realiza primero una verificación
para asegurar que el pedido exista y obtener su total esperado; si el pedido no existe, genera
un error, y si el monto ingresado no coincide con el total del pedido, emite una advertencia.
Luego, inserta un nuevo registro en la tabla pago con los datos del pago recibido y finalmente
notifica que el pago fue registrado correctamente para ese pedido.

CREATE OR REPLACE PROCEDURE registrar_pago(


p_id_pedido INT,
p_metodo VARCHAR,
p_monto DECIMAL,
p_estado_pago VARCHAR
)
LANGUAGE plpgsql
AS $$
DECLARE
total_esperado DECIMAL;
BEGIN
SELECT total INTO total_esperado
FROM pedido
WHERE id_pedido = p_id_pedido;

IF total_esperado IS NULL THEN


RAISE EXCEPTION 'El pedido no existe.';
END IF;

IF p_monto <> total_esperado THEN


RAISE NOTICE 'Atención: el monto no coincide con el total del pedido
(%.2f)', total_esperado;
END IF;

INSERT INTO pago(id_pedido, metodo_pago, monto, estado_pago)


VALUES (p_id_pedido, p_metodo, p_monto, p_estado_pago);

RAISE NOTICE 'Pago registrado para el pedido %', p_id_pedido;


END;
$$;

5.5. APLICACIÓN DE TRIGGERS

Para la modificación y elimininacion en la tabla pedido

La tabla log_pedido almacena un historial de cambios realizados sobre los pedidos,


registrando el ID del pedido, la acción realizada, una descripción detallada, el usuario que
ejecutó la acción y la fecha y hora del evento. La función log_actualizacion_pedido se activa
cada vez que un pedido es actualizado, insertando en el log una entrada que indica el nuevo
estado y total del pedido. La función log_eliminacion_pedido se ejecuta cuando un pedido
es eliminado, registrando en el log detalles del pedido eliminado, como el cliente y el total.
Los triggers asociados a la tabla pedido garantizan que estas funciones se ejecuten
automáticamente después de cada actualización o eliminación, asegurando así un registro
automático y detallado de estos eventos.

CREATE TABLE log_pedido (


id_log SERIAL PRIMARY KEY,
id_pedido INT,
accion TEXT,
descripcion TEXT,
usuario TEXT DEFAULT CURRENT_USER,
fecha TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE OR REPLACE FUNCTION log_actualizacion_pedido()


RETURNS TRIGGER AS $$
BEGIN
INSERT INTO log_pedido(id_pedido, accion, descripcion)
VALUES (
NEW.id_pedido,
'ACTUALIZAR',
'Pedido actualizado. Estado: ' || NEW.estado || ', Total: ' ||
NEW.total
);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION log_eliminacion_pedido()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO log_pedido(id_pedido, accion, descripcion)
VALUES (
OLD.id_pedido,
'ELIMINAR',
'Pedido eliminado. Cliente: ' || OLD.id_cliente || ', Total: ' ||
OLD.total
);
RETURN OLD;
END;
$$ LANGUAGE plpgsql;

-- Trigger para actualización


CREATE TRIGGER trigger_log_actualizacion_pedido
AFTER UPDATE ON pedido
FOR EACH ROW
EXECUTE FUNCTION log_actualizacion_pedido();

-- Trigger para eliminación


CREATE TRIGGER trigger_log_eliminacion_pedido
AFTER DELETE ON pedido
FOR EACH ROW
EXECUTE FUNCTION log_eliminacion_pedido();
APLICACIÓN DE LAS CONSULTAS DESDE EL LENGUAJE DE
PROGRAMACIÓN

Codigo php

<?php
include "layout.php"; // incluye la barra lateral y encabezado
include "database/conf.php"; // conexión a la BD
?>

<div class="container mt-5">


<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$id_pedido = $_POST["id_pedido"];
$metodo = $_POST["metodo"];
$monto = $_POST["monto"];
$estado_pago = $_POST["estado_pago"];

$query = "CALL registrar_pago($1, $2, $3, $4)";


$params = array($id_pedido, $metodo, $monto, $estado_pago);

$result = pg_query_params($conn, $query, $params);

if ($result) {
echo "<div class='alert alert-success text-center w-75 mx-auto'>
<strong>Éxito:</strong> El pago fue registrado
correctamente.
</div>";
} else {
echo "<div class='alert alert-danger text-center w-75 mx-auto'>
<strong>Error:</strong> No se pudo registrar el pago. "
. pg_last_error($conn) . "
</div>";
}
}
?>

<div class="text-center mt-4">


<a href="index.php" class="btn btn-primary">Volver al Inicio</a>
</div>
</div>
<?php include "footer.php"; ?>

Codigo php

<?php
session_start();
require 'database/conf.php';

// ---------------- FUNCIONES ---------------- //


function createPedido($id_cliente, $estado, $metodo_entrega,
$direccion_entrega, $total) {
global $conn;
$query = "INSERT INTO pedido (id_cliente, estado, metodo_entrega,
direccion_entrega, total) VALUES ($1, $2, $3, $4, $5) RETURNING id_pedido";
pg_prepare($conn, "create_pedido", $query);
$result = pg_execute($conn, "create_pedido", array($id_cliente, $estado,
$metodo_entrega, $direccion_entrega, $total));
return pg_fetch_result($result, 0, 'id_pedido');
}

function updatePedido($id_pedido, $id_cliente, $estado, $metodo_entrega,


$direccion_entrega, $total) {
global $conn;
$query = "UPDATE pedido SET id_cliente=$1, estado=$2, metodo_entrega=$3,
direccion_entrega=$4, total=$5 WHERE id_pedido=$6";
pg_prepare($conn, "update_pedido", $query);
return pg_execute($conn, "update_pedido", array($id_cliente, $estado,
$metodo_entrega, $direccion_entrega, $total, $id_pedido));
}

function deletePedido($id_pedido) {
global $conn;

// Eliminar detalles de pedido


pg_prepare($conn, "delete_detalle", "DELETE FROM detalle_pedido WHERE
id_pedido=$1");
pg_execute($conn, "delete_detalle", array($id_pedido));

// Eliminar pagos relacionados


pg_prepare($conn, "delete_pago", "DELETE FROM pago WHERE id_pedido=$1");
pg_execute($conn, "delete_pago", array($id_pedido));

// Eliminar comentarios relacionados


pg_prepare($conn, "delete_comentario", "DELETE FROM comentario WHERE
id_pedido=$1");
pg_execute($conn, "delete_comentario", array($id_pedido));

// Eliminar asignación repartidor relacionada


pg_prepare($conn, "delete_asignacion", "DELETE FROM
asignacion_repartidor WHERE id_pedido=$1");
pg_execute($conn, "delete_asignacion", array($id_pedido));

// Finalmente eliminar el pedido


$query = "DELETE FROM pedido WHERE id_pedido=$1";
pg_prepare($conn, "delete_pedido", $query);
return pg_execute($conn, "delete_pedido", array($id_pedido));
}

// ---------------- CONTROLADOR ---------------- //


if ($_SERVER["REQUEST_METHOD"] == "POST") {
$action = $_POST['action'] ?? '';
switch ($action) {
case 'add_pedido':
createPedido($_POST['id_cliente'], $_POST['estado'],
$_POST['metodo_entrega'], $_POST['direccion_entrega'], $_POST['total']);
break;
case 'update_pedido':
updatePedido($_POST['id_pedido'], $_POST['id_cliente'],
$_POST['estado'], $_POST['metodo_entrega'], $_POST['direccion_entrega'],
$_POST['total']);
break;
case 'delete_pedido':
deletePedido($_POST['id_pedido']);
break;
}
}

$result_pedidos = pg_query($conn, "SELECT * FROM pedido");


?>

<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Gestión de Pedidos</title>
<link rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.cs
s">
</head>
<body class="bg-light">
<?php include "layout.php"; ?>

<div class="container py-5">


<h1 class="mb-4">Gestión de Pedidos</h1>
<form class="row g-3 mb-4" method="POST">
<input type="hidden" name="action" value="add_pedido">
<div class="col-md-2">
<input type="number" class="form-control" name="id_cliente"
placeholder="ID Cliente" required>
</div>
<div class="col-md-2">
<input type="text" class="form-control" name="estado"
placeholder="Estado" required>
</div>
<div class="col-md-2">
<input type="text" class="form-control" name="metodo_entrega"
placeholder="Método Entrega" required>
</div>
<div class="col-md-2">
<input type="text" class="form-control" name="direccion_entrega"
placeholder="Dirección Entrega" required>
</div>
<div class="col-md-2">
<input type="number" step="0.01" class="form-control"
name="total" placeholder="Total" required>
</div>
<div class="col-md-1">
<button type="submit" class="btn btn-primary w-
100">Agregar</button>
</div>
</form>

<div class="table-responsive">
<table class="table table-bordered table-hover align-middle">
<thead class="table-light">
<tr>
<th>ID</th>
<th>ID Cliente</th>
<th>Estado</th>
<th>Método Entrega</th>
<th>Dirección Entrega</th>
<th>Total</th>
<th>Actualizar</th>
<th>Eliminar</th>
</tr>
</thead>
<tbody>
<?php while ($row = pg_fetch_assoc($result_pedidos)): ?>
<tr>
<form method="POST" class="row g-1">
<td>
<input type="hidden" name="id_pedido" value="<?=
htmlspecialchars($row['id_pedido']) ?>">
<?= htmlspecialchars($row['id_pedido']) ?>
</td>
<td><input type="number" class="form-control"
name="id_cliente" value="<?= htmlspecialchars($row['id_cliente']) ?>"
required></td>
<td><input type="text" class="form-control"
name="estado" value="<?= htmlspecialchars($row['estado']) ?>" required></td>
<td><input type="text" class="form-control"
name="metodo_entrega" value="<?= htmlspecialchars($row['metodo_entrega'])
?>" required></td>
<td><input type="text" class="form-control"
name="direccion_entrega" value="<?=
htmlspecialchars($row['direccion_entrega']) ?>" required></td>
<td><input type="number" step="0.01" class="form-
control" name="total" value="<?= htmlspecialchars($row['total']) ?>"
required></td>
<td>
<input type="hidden" name="action"
value="update_pedido">
<button type="submit" class="btn btn-sm btn-
warning">Actualizar</button>
</td>
</form>
<td>
<form method="POST" style="display:inline;">
<input type="hidden" name="action"
value="delete_pedido">
<input type="hidden" name="id_pedido" value="<?=
htmlspecialchars($row['id_pedido']) ?>">
<button type="submit" class="btn btn-sm btn-
danger" onclick="return confirm('¿Eliminar pedido?');">Eliminar</button>
</form>
</td>
</tr>
<?php endwhile; ?>
</tbody>
</table>
</div>
</div>
<script
src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.m
in.js"></script>
</body>
</html>
6. RESULTADOS
6.1. SELECCIÓN DE DATOS

Para la validación del sistema y la ejecución de pruebas funcionales, se insertaron datos de


prueba representativos en cada una de las tablas del modelo relacional. Estos datos abarcan
distintos escenarios del negocio como clientes con múltiples pedidos, productos en diferentes
categorías, promociones activas e inactivas, cupones aplicables, pagos con diversos métodos,
y repartidores con asignaciones reales.

La selección de datos se realizó de forma estratégica para cubrir:

• Diferentes estados del pedido: entregado, en camino, cancelado, preparando,


pendiente.

• Métodos de pago variados: QR, tarjeta de crédito/débito, transferencia bancaria.


6.2. RESULTADOS OBTENIDOS

Los resultados obtenidos a partir de la implementación del sistema validan la correcta


funcionalidad de la base de datos y su integración con el frontend:

• La ejecución de la función obtener_promociones_activas demostró ser efectiva


para recuperar y mostrar de forma clara todas las promociones vigentes del sistema.
Su ejecución no requiere parámetros y devuelve una tabla con las promociones
activas según la fecha actual, permitiendo listar información clave como el título,
descripción, monto de descuento y fechas de validez.

• La ejecución del procedimiento registrar_pago demostró eficacia al validar


montos, insertar pagos y lanzar mensajes informativos en caso de discrepancias.
• Los triggers implementados generaron automáticamente registros en la tabla
log_pedido tras actualizaciones o eliminaciones, permitiendo auditoría y trazabilidad.
7. CONCLUSIONES
El desarrollo del Sistema de Ventas de Comida Rápida para CRUNCH & GO ha
cumplido satisfactoriamente con los objetivos planteados en este proyecto, demostrando la
viabilidad y la importancia de implementar soluciones basadas en bases de datos relacionales
para automatizar y optimizar procesos comerciales.

Entre los logros más relevantes se destacan:

• La creación de una base de datos robusta en PostgreSQL, que garantiza la


integridad, seguridad y eficiencia en el almacenamiento de la información.

• La correcta implementación de procedimientos almacenados, funciones y


triggers, los cuales automatizan tareas críticas como el registro de pagos y el control
de pedidos.

• La integración funcional con el lenguaje de programación PHP, permitiendo una


interacción fluida y amigable para los usuarios finales del sistema.

BIBLIOGRAFÍA
1. Silberschatz, A., Galvin, P. B., & Gagne, G. (2018). Operating System Concepts
(10th ed.). John Wiley & Sons. Capítulos relacionados con sistemas de bases de datos
y gestión de transacciones.
2. Elmasri, R., & Navathe, S. B. (2019). Fundamentals of Database Systems (7th ed.).
Pearson. Texto fundamental para diseño de bases de datos relacionales y
normalización.
3. Ramakrishnan, R., & Gehrke, J. (2017). Database Management Systems (3rd ed.).
McGraw-Hill Education. Enfoque práctico en diseño e implementación de sistemas
de bases de datos.
4. Korth, H. F., & Silberschatz, A. (2019). Database System Concepts (7th ed.).
McGraw-Hill. Conceptos avanzados de diseño y optimización de bases de datos.
5. Hernández, R., Fernández, C., & Baptista, P. (2020). Metodología de la Investigación
(6ta ed.). McGraw-Hill. Metodologías aplicadas en el levantamiento de
requerimientos.
6. Pressman, R. S., & Maxim, B. R. (2019). Software Engineering: A Practitioner's
Approach (9th ed.). McGraw-Hill. Ingeniería de software aplicada a sistemas de
información.

SITIOS ACADÉMICOS

1. SpringerLink: Publicaciones sobre diseño de bases de datos


Fundamentos del diseño de bases de datos | SpringerLink
2. ScienceDirect: Artículos sobre gestión de sistemas de información
Information Systems Management - an overview | ScienceDirect Topics
3. ResearchGate: Investigaciones aplicadas en bases de datos comerciales
(PDF) Los sistemas de marketing de bases de datos
4. Statista - Cadenas de Comida Rápida con Mayores Ventas
Cadenas de comida rápida con mayores ventas totales del mundo | Statista
5. Neon - "Uso de triggers en PostgreSQL"
PostgreSQL Triggers

También podría gustarte