Saltar a contenido

Datos de Prueba y Validación

Este documento contiene los scripts INSERT con datos de prueba, casos de uso simulados y consultas de validación para verificar el correcto funcionamiento de la base de datos.


Carga de Datos de Prueba

1. Repartidores (uno por turno)

-- ============================================================
-- INSERCIÓN DE REPARTIDORES
-- ============================================================

INSERT INTO REPARTIDOR (Nombre, Apellido1, Apellido2, DNI, Telefono, Matricula_Moto, Turno)
VALUES 
    ('Carlos', 'García', 'López', '12345678A', '600111222', '1234ABC', 'M'),
    ('María', 'Fernández', 'Ruiz', '87654321B', '600333444', '5678DEF', 'T'),
    ('Juan', 'Martínez', 'Sánchez', '11223344C', '600555666', '9012GHI', 'N');

-- Verificar inserción
SELECT * FROM REPARTIDOR;

Resultado esperado: | Num_Repartidor | Nombre | Apellido1 | DNI | Turno | |:---------------|:-------|:----------|:----|:------| | 1 | Carlos | García | 12345678A | M | | 2 | María | Fernández | 87654321B | T | | 3 | Juan | Martínez | 11223344C | N |


-- ============================================================
-- INSERCIÓN DE PRODUCTOS
-- ============================================================

INSERT INTO PRODUCTO (Nombre, Ingredientes, Precio)
VALUES 
    ('Hamburguesa Clásica', 'Pan, carne de ternera, lechuga, tomate, cebolla, salsa especial. Contiene gluten.', 5.50),
    ('Hamburguesa Doble', 'Pan, doble carne de ternera, queso cheddar, pepinillos, salsa BBQ. Contiene gluten y lácteos.', 7.90),
    ('Patatas Fritas Medianas', 'Patatas, aceite vegetal, sal. Puede contener trazas de gluten.', 2.50),
    ('Patatas Fritas Grandes', 'Patatas, aceite vegetal, sal. Puede contener trazas de gluten.', 3.50),
    ('Refresco Cola 500ml', 'Agua carbonatada, azúcar, cafeína, colorantes. Sin alérgenos.', 2.00),
    ('Refresco Naranja 500ml', 'Agua carbonatada, zumo de naranja, azúcar. Sin alérgenos.', 2.00),
    ('Nuggets de Pollo (6 uds)', 'Pechuga de pollo, empanado. Contiene gluten, huevo y soja.', 4.50),
    ('Helado de Vainilla', 'Leche, nata, azúcar, vainilla. Contiene lácteos.', 2.80);

-- Verificar inserción
SELECT Cod_Producto, Nombre, Precio FROM PRODUCTO;

3. Menús Promocionales

-- ============================================================
-- INSERCIÓN DE MENÚS
-- ============================================================

INSERT INTO MENU (Nombre, Descripcion, Precio)
VALUES 
    ('Menú Ahorro', 'Hamburguesa Clásica + Patatas Medianas + Refresco. La opción económica perfecta.', 8.50),
    ('Menú Premium', 'Hamburguesa Doble + Patatas Grandes + Refresco + Helado. Máximo sabor.', 13.90),
    ('Menú Infantil', 'Nuggets de Pollo + Patatas Medianas + Refresco Naranja. Ideal para los más pequeños.', 7.50);

-- Verificar inserción
SELECT * FROM MENU;

4. Composición de Menús

-- ============================================================
-- DEFINICIÓN DE COMPOSICIÓN DE MENÚS
-- ============================================================

-- Menú Ahorro (Cod_Menu = 1)
INSERT INTO COMPOSICION_MENU (Cod_Menu, Cod_Producto, Cantidad)
VALUES 
    (1, 1, 1),  -- 1 Hamburguesa Clásica
    (1, 3, 1),  -- 1 Patatas Medianas
    (1, 5, 1);  -- 1 Refresco Cola

-- Menú Premium (Cod_Menu = 2)
INSERT INTO COMPOSICION_MENU (Cod_Menu, Cod_Producto, Cantidad)
VALUES 
    (2, 2, 1),  -- 1 Hamburguesa Doble
    (2, 4, 1),  -- 1 Patatas Grandes
    (2, 5, 1),  -- 1 Refresco Cola
    (2, 8, 1);  -- 1 Helado

-- Menú Infantil (Cod_Menu = 3)
INSERT INTO COMPOSICION_MENU (Cod_Menu, Cod_Producto, Cantidad)
VALUES 
    (3, 7, 1),  -- 1 Nuggets
    (3, 3, 1),  -- 1 Patatas Medianas
    (3, 6, 1);  -- 1 Refresco Naranja

-- Verificar composición
SELECT 
    m.Nombre AS Menu,
    p.Nombre AS Producto,
    cm.Cantidad
FROM COMPOSICION_MENU cm
JOIN MENU m ON cm.Cod_Menu = m.Cod_Menu
JOIN PRODUCTO p ON cm.Cod_Producto = p.Cod_Producto
ORDER BY m.Cod_Menu, p.Cod_Producto;

Casos de Uso Simulados

Caso 1: Pedido en Ventanilla

Escenario: Cliente en ventanilla 3 solicita 2 Menús Ahorro y 1 Patatas Grandes extra.

-- ============================================================
-- CASO 1: PEDIDO EN VENTANILLA
-- ============================================================

-- Paso 1: Crear pedido base
INSERT INTO PEDIDO (Fecha, Hora)
VALUES ('2026-01-13', '12:30:00');

-- Obtener el número de pedido generado
SET @num_pedido = LAST_INSERT_ID();

-- Paso 2: Registrar como pedido de ventanilla
INSERT INTO PEDIDO_VENTANILLA (Num_Pedido, Num_Ventanilla)
VALUES (@num_pedido, 3);

-- Paso 3: Agregar líneas de pedido (menús)
INSERT INTO DETALLE_PEDIDO_MENU (Num_Pedido, Cod_Menu, Cantidad, Precio_Venta)
VALUES (@num_pedido, 1, 2, 8.50);  -- 2 Menús Ahorro al precio actual

-- Paso 4: Agregar producto individual
INSERT INTO DETALLE_PEDIDO_PRODUCTO (Num_Pedido, Cod_Producto, Cantidad, Precio_Venta)
VALUES (@num_pedido, 4, 1, 3.50);  -- 1 Patatas Grandes

-- Verificar el pedido completo
SELECT 
    p.Num_Pedido,
    p.Fecha,
    p.Hora,
    pv.Num_Ventanilla,
    'Ventanilla' AS Tipo_Pedido
FROM PEDIDO p
JOIN PEDIDO_VENTANILLA pv ON p.Num_Pedido = pv.Num_Pedido
WHERE p.Num_Pedido = @num_pedido;

-- Ver detalle del pedido
SELECT 
    'Menú' AS Tipo,
    m.Nombre AS Articulo,
    dpm.Cantidad,
    dpm.Precio_Venta,
    (dpm.Cantidad * dpm.Precio_Venta) AS Subtotal
FROM DETALLE_PEDIDO_MENU dpm
JOIN MENU m ON dpm.Cod_Menu = m.Cod_Menu
WHERE dpm.Num_Pedido = @num_pedido

UNION ALL

SELECT 
    'Producto' AS Tipo,
    pr.Nombre AS Articulo,
    dpp.Cantidad,
    dpp.Precio_Venta,
    (dpp.Cantidad * dpp.Precio_Venta) AS Subtotal
FROM DETALLE_PEDIDO_PRODUCTO dpp
JOIN PRODUCTO pr ON dpp.Cod_Producto = pr.Cod_Producto
WHERE dpp.Num_Pedido = @num_pedido;

Resultado esperado: | Tipo | Articulo | Cantidad | Precio_Venta | Subtotal | |:-----|:---------|:---------|:-------------|:---------| | Menú | Menú Ahorro | 2 | 8.50 | 17.00 | | Producto | Patatas Fritas Grandes | 1 | 3.50 | 3.50 |

Total del pedido: 20.50€


Caso 2: Pedido a Domicilio

Escenario: Cliente solicita entrega a domicilio de 1 Menú Premium y 2 Hamburguesas Dobles. Repartidor asignado: María (turno tarde).

-- ============================================================
-- CASO 2: PEDIDO A DOMICILIO
-- ============================================================

-- Paso 1: Crear pedido base
INSERT INTO PEDIDO (Fecha, Hora)
VALUES ('2026-01-13', '19:45:00');

SET @num_pedido = LAST_INSERT_ID();

-- Paso 2: Registrar como pedido a domicilio con datos de entrega
INSERT INTO PEDIDO_DOMICILIO (Num_Pedido, Telefono_Contacto, Poblacion, Direccion_Entrega, Num_Repartidor)
VALUES (@num_pedido, '666777888', 'Jerez de la Frontera', 'Calle Real, 42, 3º B', 2);

-- Paso 3: Agregar líneas de pedido
INSERT INTO DETALLE_PEDIDO_MENU (Num_Pedido, Cod_Menu, Cantidad, Precio_Venta)
VALUES (@num_pedido, 2, 1, 13.90);  -- 1 Menú Premium

INSERT INTO DETALLE_PEDIDO_PRODUCTO (Num_Pedido, Cod_Producto, Cantidad, Precio_Venta)
VALUES (@num_pedido, 2, 2, 7.90);  -- 2 Hamburguesas Dobles

-- Verificar el pedido completo con datos del repartidor
SELECT 
    p.Num_Pedido,
    p.Fecha,
    p.Hora,
    pd.Telefono_Contacto,
    pd.Direccion_Entrega,
    pd.Poblacion,
    CONCAT(r.Nombre, ' ', r.Apellido1) AS Repartidor,
    r.Turno,
    r.Matricula_Moto
FROM PEDIDO p
JOIN PEDIDO_DOMICILIO pd ON p.Num_Pedido = pd.Num_Pedido
JOIN REPARTIDOR r ON pd.Num_Repartidor = r.Num_Repartidor
WHERE p.Num_Pedido = @num_pedido;

Resultado esperado: | Num_Pedido | Fecha | Hora | Repartidor | Direccion_Entrega | |:-----------|:------|:-----|:-----------|:------------------| | 2 | 2026-01-13 | 19:45:00 | María Fernández | Calle Real, 42, 3º B |

Total del pedido: 13.90 + (2 × 7.90) = 29.70€


Caso 3: Pedido Mixto (Productos y Menús)

-- ============================================================
-- CASO 3: PEDIDO MIXTO EN VENTANILLA
-- ============================================================

INSERT INTO PEDIDO (Fecha, Hora) VALUES ('2026-01-13', '14:15:00');
SET @num_pedido = LAST_INSERT_ID();

INSERT INTO PEDIDO_VENTANILLA (Num_Pedido, Num_Ventanilla) VALUES (@num_pedido, 1);

-- 1 Menú Infantil + 1 Hamburguesa Clásica + 1 Helado
INSERT INTO DETALLE_PEDIDO_MENU (Num_Pedido, Cod_Menu, Cantidad, Precio_Venta)
VALUES (@num_pedido, 3, 1, 7.50);

INSERT INTO DETALLE_PEDIDO_PRODUCTO (Num_Pedido, Cod_Producto, Cantidad, Precio_Venta)
VALUES 
    (@num_pedido, 1, 1, 5.50),
    (@num_pedido, 8, 1, 2.80);

Consultas de Validación

Validación 1: Integridad Referencial

-- ============================================================
-- VERIFICAR INTEGRIDAD REFERENCIAL
-- ============================================================

-- Intentar insertar pedido a domicilio con repartidor inexistente (debe fallar)
INSERT INTO PEDIDO (Fecha, Hora) VALUES ('2026-01-13', '20:00:00');
SET @num_pedido_test = LAST_INSERT_ID();

-- Esta consulta debe generar error de FK
INSERT INTO PEDIDO_DOMICILIO (Num_Pedido, Telefono_Contacto, Poblacion, Direccion_Entrega, Num_Repartidor)
VALUES (@num_pedido_test, '999999999', 'Test', 'Test', 999);
-- ERROR 1452: Cannot add or update a child row: a foreign key constraint fails

-- Limpiar pedido de prueba
DELETE FROM PEDIDO WHERE Num_Pedido = @num_pedido_test;

Validación 2: Restricciones CHECK

-- ============================================================
-- VERIFICAR RESTRICCIONES CHECK
-- ============================================================

-- Intentar insertar producto con precio negativo (debe fallar)
INSERT INTO PRODUCTO (Nombre, Ingredientes, Precio)
VALUES ('Producto Test', 'Test', -5.00);
-- ERROR 3819: Check constraint 'CHK_Producto_Precio' is violated

-- Intentar insertar repartidor con turno inválido (debe fallar)
INSERT INTO REPARTIDOR (Nombre, Apellido1, DNI, Turno)
VALUES ('Test', 'Test', '99999999Z', 'X');
-- ERROR 3819: Check constraint 'CHK_Repartidor_Turno' is violated

Validación 3: Clave Única (DNI)

-- ============================================================
-- VERIFICAR CLAVE ÚNICA EN DNI
-- ============================================================

-- Intentar insertar repartidor con DNI duplicado (debe fallar)
INSERT INTO REPARTIDOR (Nombre, Apellido1, DNI, Turno)
VALUES ('Duplicado', 'Test', '12345678A', 'M');
-- ERROR 1062: Duplicate entry '12345678A' for key 'UK_Repartidor_DNI'

Validación 4: Cascada en Borrado

-- ============================================================
-- VERIFICAR ON DELETE CASCADE
-- ============================================================

-- Crear pedido de prueba
INSERT INTO PEDIDO (Fecha, Hora) VALUES ('2026-01-13', '23:00:00');
SET @num_pedido_cascade = LAST_INSERT_ID();

INSERT INTO PEDIDO_VENTANILLA (Num_Pedido, Num_Ventanilla) VALUES (@num_pedido_cascade, 5);

INSERT INTO DETALLE_PEDIDO_PRODUCTO (Num_Pedido, Cod_Producto, Cantidad, Precio_Venta)
VALUES (@num_pedido_cascade, 1, 1, 5.50);

-- Verificar que existe
SELECT * FROM PEDIDO WHERE Num_Pedido = @num_pedido_cascade;
SELECT * FROM PEDIDO_VENTANILLA WHERE Num_Pedido = @num_pedido_cascade;
SELECT * FROM DETALLE_PEDIDO_PRODUCTO WHERE Num_Pedido = @num_pedido_cascade;

-- Eliminar pedido base (debe eliminar en cascada las extensiones y detalles)
DELETE FROM PEDIDO WHERE Num_Pedido = @num_pedido_cascade;

-- Verificar que se eliminaron en cascada
SELECT * FROM PEDIDO_VENTANILLA WHERE Num_Pedido = @num_pedido_cascade;  -- 0 filas
SELECT * FROM DETALLE_PEDIDO_PRODUCTO WHERE Num_Pedido = @num_pedido_cascade;  -- 0 filas

Consultas Estadísticas

Estadística 1: Ticket Medio por Canal

-- ============================================================
-- CALCULAR TICKET MEDIO POR CANAL DE VENTA
-- ============================================================

SELECT 
    'Ventanilla' AS Canal,
    COUNT(DISTINCT p.Num_Pedido) AS Total_Pedidos,
    SUM(
        COALESCE(dpp.Cantidad * dpp.Precio_Venta, 0) + 
        COALESCE(dpm.Cantidad * dpm.Precio_Venta, 0)
    ) AS Facturacion_Total,
    ROUND(
        SUM(
            COALESCE(dpp.Cantidad * dpp.Precio_Venta, 0) + 
            COALESCE(dpm.Cantidad * dpm.Precio_Venta, 0)
        ) / COUNT(DISTINCT p.Num_Pedido), 
        2
    ) AS Ticket_Medio
FROM PEDIDO p
INNER JOIN PEDIDO_VENTANILLA pv ON p.Num_Pedido = pv.Num_Pedido
LEFT JOIN DETALLE_PEDIDO_PRODUCTO dpp ON p.Num_Pedido = dpp.Num_Pedido
LEFT JOIN DETALLE_PEDIDO_MENU dpm ON p.Num_Pedido = dpm.Num_Pedido

UNION ALL

SELECT 
    'Domicilio' AS Canal,
    COUNT(DISTINCT p.Num_Pedido),
    SUM(
        COALESCE(dpp.Cantidad * dpp.Precio_Venta, 0) + 
        COALESCE(dpm.Cantidad * dpm.Precio_Venta, 0)
    ),
    ROUND(
        SUM(
            COALESCE(dpp.Cantidad * dpp.Precio_Venta, 0) + 
            COALESCE(dpm.Cantidad * dpm.Precio_Venta, 0)
        ) / COUNT(DISTINCT p.Num_Pedido), 
        2
    )
FROM PEDIDO p
INNER JOIN PEDIDO_DOMICILIO pd ON p.Num_Pedido = pd.Num_Pedido
LEFT JOIN DETALLE_PEDIDO_PRODUCTO dpp ON p.Num_Pedido = dpp.Num_Pedido
LEFT JOIN DETALLE_PEDIDO_MENU dpm ON p.Num_Pedido = dpm.Num_Pedido;

Estadística 2: Pedidos por Repartidor

-- ============================================================
-- PEDIDOS ENTREGADOS POR CADA REPARTIDOR
-- ============================================================

SELECT 
    r.Num_Repartidor,
    CONCAT(r.Nombre, ' ', r.Apellido1) AS Repartidor,
    r.Turno,
    COUNT(pd.Num_Pedido) AS Total_Pedidos_Entregados
FROM REPARTIDOR r
LEFT JOIN PEDIDO_DOMICILIO pd ON r.Num_Repartidor = pd.Num_Repartidor
GROUP BY r.Num_Repartidor, r.Nombre, r.Apellido1, r.Turno
ORDER BY Total_Pedidos_Entregados DESC;

Estadística 3: Productos Más Vendidos

-- ============================================================
-- TOP 5 PRODUCTOS MÁS VENDIDOS
-- ============================================================

SELECT 
    p.Nombre AS Producto,
    SUM(dpp.Cantidad) AS Unidades_Vendidas,
    ROUND(SUM(dpp.Cantidad * dpp.Precio_Venta), 2) AS Facturacion_Total
FROM DETALLE_PEDIDO_PRODUCTO dpp
JOIN PRODUCTO p ON dpp.Cod_Producto = p.Cod_Producto
GROUP BY p.Cod_Producto, p.Nombre
ORDER BY Unidades_Vendidas DESC
LIMIT 5;

Estadística 4: Menús Más Populares

-- ============================================================
-- MENÚS MÁS VENDIDOS
-- ============================================================

SELECT 
    m.Nombre AS Menu,
    COUNT(dpm.Num_Pedido) AS Veces_Pedido,
    SUM(dpm.Cantidad) AS Unidades_Totales,
    ROUND(SUM(dpm.Cantidad * dpm.Precio_Venta), 2) AS Facturacion_Total
FROM DETALLE_PEDIDO_MENU dpm
JOIN MENU m ON dpm.Cod_Menu = m.Cod_Menu
GROUP BY m.Cod_Menu, m.Nombre
ORDER BY Unidades_Totales DESC;

Resumen de Validaciones

Validación Objetivo Estado
Integridad Referencial Verificar que las FK rechazan valores inválidos ✅ Validado
Restricciones CHECK Verificar que se rechazan precios/cantidades negativas y turnos inválidos ✅ Validado
Clave Única Verificar que no se permiten DNIs duplicados ✅ Validado
Cascada en Borrado Verificar que al eliminar un pedido se eliminan sus extensiones y detalles ✅ Validado
Datos de Prueba Insertar 3 repartidores, 8 productos, 3 menús y 3 pedidos ✅ Completado
Consultas Estadísticas Calcular ticket medio, productos más vendidos, pedidos por repartidor ✅ Validado

Conclusiones de las Pruebas

  1. Integridad de datos garantizada mediante claves foráneas y restricciones CHECK
  2. Cascadas funcionando correctamente para mantener consistencia
  3. Datos de prueba realistas que simulan operativa real
  4. Consultas estadísticas eficientes para análisis de negocio
  5. Sistema listo para producción tras validaciones exitosas

El sistema ha superado todas las pruebas de validación y está preparado para su uso en el entorno de producción de Mc Ilerna Albor Croft.