diff --git a/PROYECTOPANADERIA.sql b/PROYECTOPANADERIA.sql new file mode 100644 index 0000000..1c0efb7 --- /dev/null +++ b/PROYECTOPANADERIA.sql @@ -0,0 +1,456 @@ +-- ================================================================== +-- DDL (DATA DEFINITION LANGUAGE) - DEFINICIÓN DE ESTRUCTURA +-- ================================================================== + +DROP DATABASE IF EXISTS ProyectoPanaderia; +SET SQL_SAFE_UPDATES = 0; +CREATE DATABASE ProyectoPanaderia; +USE ProyectoPanaderia; +CREATE TABLE Clientes ( + ID_CLIENTE INT PRIMARY KEY AUTO_INCREMENT, + NOMBRE_CLI VARCHAR(100) NOT NULL, + TELEFONO_CLI VARCHAR(20), + ACTIVO_CLI BOOLEAN DEFAULT TRUE, + EMAIL_CLI VARCHAR(100), + CONTRASEÑA_CLI VARCHAR(255), + FECHA_ULTIMA_MODIFICACION TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP +); + +-- Tabla: Empleados +CREATE TABLE Empleados ( + ID_EMPLEADO INT PRIMARY KEY AUTO_INCREMENT, + NOMBRE_EMPLEADO VARCHAR(100) NOT NULL, + EMAIL_EMPLEADO VARCHAR(100), + ACTIVO_EMPLEADO BOOLEAN DEFAULT TRUE, + CONTRASEÑA_EMPLEADO VARCHAR(255), + FECHA_REGISTRO TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FECHA_ULTIMA_MODIFICACION TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP +); + +-- Tabla: Administradores +CREATE TABLE Administradores ( + ID_ADMIN INT PRIMARY KEY AUTO_INCREMENT, + NOMBRE_ADMIN VARCHAR(100) NOT NULL, + TELEFONO_ADMIN VARCHAR(20), + EMAIL_ADMIN VARCHAR(100), + CONTRASEÑA_ADMIN VARCHAR(255) +); + +-- Tabla: Proveedores +CREATE TABLE Proveedores ( + ID_PROVEEDOR INT PRIMARY KEY AUTO_INCREMENT, + NOMBRE_PROV VARCHAR(100) NOT NULL, + TELEFONO_PROV VARCHAR(20), + ACTIVO_PROV BOOLEAN DEFAULT TRUE, + EMAIL_PROV VARCHAR(100), + DIRECCION_PROV VARCHAR(200) +); + +-- Tabla: Pedidos_Proveedores - Almacena pedidos realizados a proveedores +CREATE TABLE Pedidos_Proveedores ( + ID_PEDIDO_PROV INT PRIMARY KEY AUTO_INCREMENT, + ID_PROVEEDOR INT NOT NULL, + NUMERO_PEDIDO INT NOT NULL, + FECHA_PEDIDO DATE NOT NULL, + ESTADO_PEDIDO VARCHAR(50) DEFAULT 'Pendiente', + CONSTRAINT FK_PEDIDO_PROVEEDOR + FOREIGN KEY (ID_PROVEEDOR) REFERENCES Proveedores(ID_PROVEEDOR) ON UPDATE CASCADE ON DELETE RESTRICT +); + +-- Tabla: Categoria_Productos - Almacena categorías de productos +CREATE TABLE Categoria_Productos ( + ID_CATEGORIA_PRODUCTO INT PRIMARY KEY AUTO_INCREMENT, + NOMBRE_CATEGORIAPRODUCTO VARCHAR(100) NOT NULL +); + +-- Tabla: Estado_Pedidos - Almacena estados de pedidos +CREATE TABLE Estado_Pedidos ( + ID_ESTADO_PEDIDO INT PRIMARY KEY AUTO_INCREMENT, + NOMBRE_ESTADO VARCHAR(50) +); + +-- Tabla: Categoria_Ingredientes +CREATE TABLE Categoria_Ingredientes ( + ID_CATEGORIA INT PRIMARY KEY AUTO_INCREMENT, + NOMBRE_CATEGORIA_INGREDIENTE VARCHAR(100) NOT NULL +); + +-- Tabla: Ingredientes +CREATE TABLE Ingredientes ( + ID_INGREDIENTE INT PRIMARY KEY AUTO_INCREMENT, + ID_PROVEEDOR INT, + ID_CATEGORIA INT, + NOMBRE_INGREDIENTE VARCHAR(100) NOT NULL, + CANTIDAD_INGREDIENTE INT, + FECHA_VENCIMIENTO DATE, + REFERENCIA_INGREDIENTE VARCHAR(100), + FECHA_ENTREGA_INGREDIENTE DATE, + CONSTRAINT FK_PROVEEDOR_INGREDIENTE + FOREIGN KEY (ID_PROVEEDOR) REFERENCES Proveedores(ID_PROVEEDOR) ON UPDATE CASCADE ON DELETE RESTRICT, + CONSTRAINT FK_CATEGORIA_INGREDIENTE + FOREIGN KEY (ID_CATEGORIA) REFERENCES Categoria_Ingredientes(ID_CATEGORIA) ON UPDATE CASCADE ON DELETE RESTRICT +); + +-- Tabla: Productos +CREATE TABLE Productos ( + ID_PRODUCTO INT PRIMARY KEY AUTO_INCREMENT, + ID_ADMIN INT, + ID_CATEGORIA_PRODUCTO INT, + NOMBRE_PRODUCTO VARCHAR(100) NOT NULL, + DESCRIPCION_PRODUCTO TEXT, + PRODUCTO_STOCK_MIN INT, + PRECIO_PRODUCTO DECIMAL(10,2) NOT NULL, + FECHA_VENCIMIENTO_PRODUCTO DATE, + FECHA_INGRESO_PRODUCTO DATE, + TIPO_PRODUCTO_MARCA VARCHAR(100), + ACTIVO BOOLEAN DEFAULT TRUE, + FECHA_ULTIMA_MODIFICACION TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + CONSTRAINT FK_CATEGORIA_PRODUCTO + FOREIGN KEY (ID_CATEGORIA_PRODUCTO) REFERENCES Categoria_Productos(ID_CATEGORIA_PRODUCTO) ON UPDATE CASCADE ON DELETE RESTRICT, + CONSTRAINT FK_ADMIN_PRODUCTO + FOREIGN KEY (ID_ADMIN) REFERENCES Administradores(ID_ADMIN) ON UPDATE CASCADE ON DELETE RESTRICT +); + +-- Tabla: Pedidos +CREATE TABLE Pedidos ( + ID_PEDIDO INT PRIMARY KEY AUTO_INCREMENT, + ID_CLIENTE INT, + ID_EMPLEADO INT, + ID_ESTADO_PEDIDO INT, + FECHA_INGRESO DATETIME, + FECHA_ENTREGA DATETIME, + TOTAL_PRODUCTO DECIMAL(10,2), + CONSTRAINT FK_CLIENTE_PEDIDO + FOREIGN KEY (ID_CLIENTE) REFERENCES Clientes(ID_CLIENTE) ON UPDATE CASCADE ON DELETE CASCADE, + CONSTRAINT FK_EMPLEADO_PEDIDO + FOREIGN KEY (ID_EMPLEADO) REFERENCES Empleados(ID_EMPLEADO) ON UPDATE CASCADE ON DELETE RESTRICT, + CONSTRAINT FK_ESTADO_PEDIDO_PEDIDO + FOREIGN KEY (ID_ESTADO_PEDIDO) REFERENCES Estado_Pedidos(ID_ESTADO_PEDIDO) ON UPDATE CASCADE ON DELETE RESTRICT +); + +-- Tabla: Detalle_Pedidos +CREATE TABLE Detalle_Pedidos ( + ID_DETALLE INT PRIMARY KEY AUTO_INCREMENT, + ID_PEDIDO INT NOT NULL, + ID_PRODUCTO INT NOT NULL, + CANTIDAD_PRODUCTO INT, + PRECIO_UNITARIO DECIMAL(10,2), + SUBTOTAL DECIMAL(10,2), + CONSTRAINT FK_DETALLE_PEDIDO + FOREIGN KEY (ID_PEDIDO) REFERENCES Pedidos(ID_PEDIDO) ON UPDATE CASCADE ON DELETE CASCADE, + CONSTRAINT FK_DETALLE_PRODUCTO + FOREIGN KEY (ID_PRODUCTO) REFERENCES Productos(ID_PRODUCTO) ON UPDATE CASCADE ON DELETE RESTRICT +); + +-- Tabla: Ordenes_Salida +CREATE TABLE Ordenes_Salida ( + ID_FACTURA INT PRIMARY KEY AUTO_INCREMENT, + ID_CLIENTE INT, + ID_PEDIDO INT, + FECHA_FACTURACION DATETIME, + TOTAL_FACTURA DECIMAL(10,2), + CONSTRAINT FK_ORDENSALIDA_CLIENTE + FOREIGN KEY (ID_CLIENTE) REFERENCES Clientes(ID_CLIENTE) ON UPDATE CASCADE ON DELETE CASCADE, + CONSTRAINT FK_ORDENSALIDA_PEDIDO + FOREIGN KEY (ID_PEDIDO) REFERENCES Pedidos(ID_PEDIDO) ON UPDATE CASCADE ON DELETE CASCADE +); + +-- Función: HashPassword (simplificada sin salt) +DELIMITER // +CREATE FUNCTION HashPassword(password VARCHAR(255)) +RETURNS VARCHAR(255) +READS SQL DATA +DETERMINISTIC +BEGIN + RETURN SHA2(password, 256); +END// +DELIMITER ; + +-- Trigger: Actualizar fecha de modificación de productos +DELIMITER // +CREATE TRIGGER tr_actualizar_fecha_producto + BEFORE UPDATE ON Productos + FOR EACH ROW +BEGIN + SET NEW.FECHA_ULTIMA_MODIFICACION = CURRENT_TIMESTAMP; +END// +DELIMITER ; + +-- Trigger: Actualizar total del pedido cuando se inserta detalle +DELIMITER // +CREATE TRIGGER tr_actualizar_total_pedido +AFTER INSERT ON Detalle_Pedidos +FOR EACH ROW +BEGIN + UPDATE Pedidos + SET TOTAL_PRODUCTO = ( + SELECT SUM(SUBTOTAL) + FROM Detalle_Pedidos + WHERE ID_PEDIDO = NEW.ID_PEDIDO + ) + WHERE ID_PEDIDO = NEW.ID_PEDIDO; +END// +DELIMITER ; + +-- Trigger: Actualizar total del pedido cuando se modifica detalle +DELIMITER // +CREATE TRIGGER tr_actualizar_total_pedido_update +AFTER UPDATE ON Detalle_Pedidos +FOR EACH ROW +BEGIN + UPDATE Pedidos + SET TOTAL_PRODUCTO = ( + SELECT SUM(SUBTOTAL) + FROM Detalle_Pedidos + WHERE ID_PEDIDO = NEW.ID_PEDIDO + ) + WHERE ID_PEDIDO = NEW.ID_PEDIDO; +END// +DELIMITER ; + +-- Trigger: Auditoría - Actualizar fecha de modificación de clientes +DELIMITER // +CREATE TRIGGER tr_clientes_fecha_modificacion + BEFORE UPDATE ON Clientes + FOR EACH ROW +BEGIN + SET NEW.FECHA_ULTIMA_MODIFICACION = CURRENT_TIMESTAMP; +END// +DELIMITER ; + +-- Trigger: Auditoría - Actualizar fecha de modificación de empleados +DELIMITER // +CREATE TRIGGER tr_empleados_fecha_modificacion + BEFORE UPDATE ON Empleados + FOR EACH ROW +BEGIN + SET NEW.FECHA_ULTIMA_MODIFICACION = CURRENT_TIMESTAMP; +END// +DELIMITER ; + +-- Trigger: Validación de email para clientes +DELIMITER // +CREATE TRIGGER tr_clientes_validar_email + BEFORE INSERT ON Clientes + FOR EACH ROW +BEGIN + IF NEW.EMAIL_CLI IS NOT NULL AND NEW.EMAIL_CLI NOT REGEXP '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$' THEN + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Email inválido para cliente'; + END IF; +END// +DELIMITER ; + +-- Trigger: Validación de email para empleados +DELIMITER // +CREATE TRIGGER tr_empleados_validar_email + BEFORE INSERT ON Empleados + FOR EACH ROW +BEGIN + IF NEW.EMAIL_EMPLEADO IS NOT NULL AND NEW.EMAIL_EMPLEADO NOT REGEXP '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$' THEN + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Email inválido para empleado'; + END IF; +END// +DELIMITER ; + +-- ================================================================== +-- DML (DATA MANIPULATION LANGUAGE) - INSERCIÓN DE DATOS +-- ================================================================== + +-- ================================================================== +-- INSERCIÓN DE DATOS BASE +-- ================================================================== + +-- Inserción en tabla: Clientes +INSERT INTO Clientes (NOMBRE_CLI, TELEFONO_CLI, EMAIL_CLI) VALUES +('Ana Pérez', '3101234567', 'ana.p@mail.com'), +('Luis Gómez', '3209876543', 'luis.g@mail.com'), +('Maria Rodriguez', '3001122334', 'maria.r@mail.com'); + +-- Inserción en tabla: Empleados +INSERT INTO Empleados (NOMBRE_EMPLEADO) VALUES +('Andres Alkaeda'), +('Damian Avila'), +('Brayan Jimenez'), +('Ana Goyeneche'), +('Sharyt Zamora'), +('Carlos Mendoza'), +('Sofia Rodriguez'), +('Miguel Torres'), +('Valentina Castro'), +('Diego Herrera'), +('Camila Vargas'), +('Alejandro Morales'), +('Isabella Gutierrez'), +('Sebastian Ramirez'), +('Natalia Delgado'); + +-- Inserción en tabla: Administradores +INSERT INTO Administradores (NOMBRE_ADMIN, TELEFONO_ADMIN, EMAIL_ADMIN) VALUES +('Admin Uno', '3005550101', 'admin1@store.com'); + +-- Inserción en tabla: Proveedores +INSERT INTO Proveedores (ID_PROVEEDOR, NOMBRE_PROV, TELEFONO_PROV, EMAIL_PROV) VALUES +(1, 'Harina Dorada', '3001234567', 'ventas@harinadorada.com'), +(2, 'Dulce Granero', '3007654321', 'pedidos@dulcegranero.com'), +(3, 'El Horno Mágico S.A.S.', '3009876543', 'contacto@hornoimagico.com'), +(4, 'Masa Maestra Distribuciones', '3005555555', 'info@masamaestra.com'), +(5, 'Insumos Panaderos del Sol', '3002222222', 'ventas@insumossol.com'), +(6, 'La Esencia del Pan', '3003333333', 'pedidos@esenciapan.com'), +(7, 'Proveedora Integral del Panadero', '3004444444', 'contacto@provintegral.com'), +(8, 'Alimentos para Hornear Cía. Ltda.', '3006666666', 'ventas@alimentoshornear.com'); + +-- Inserción en tabla: Pedidos_Proveedores +INSERT INTO Pedidos_Proveedores (ID_PROVEEDOR, NUMERO_PEDIDO, FECHA_PEDIDO, ESTADO_PEDIDO) VALUES +(1, 1001, '2024-01-15', 'Entregado'), +(2, 1002, '2024-02-10', 'Entregado'), +(3, 1003, '2024-03-05', 'Entregado'); + +-- Inserción en tabla: Categoria_Productos +INSERT INTO Categoria_Productos (NOMBRE_CATEGORIAPRODUCTO) VALUES +('Tortas Tres Leches'), +('Tortas Milyway'), +('Tortas por Encargo'), +('Pan Grande'), +('Pan Pequeño'), +('Postres'), +('Galletas'), +('Tamales'), +('Yogures'), +('Pasteles Pollo'); + +-- Inserción en tabla: Estado_Pedidos +INSERT INTO Estado_Pedidos (NOMBRE_ESTADO) VALUES +('Pendiente'), +('En Preparación'), +('Listo para Entrega'), +('Entregado'), +('Cancelado'); + +-- Inserción en tabla: Categoria_Ingredientes +INSERT INTO `categoria_ingredientes` (`ID_CATEGORIA`, `NOMBRE_CATEGORIA_INGREDIENTE`) VALUES +('1', 'Harinas'), +('2', 'Lácteos y Derivados'), +('3', 'Azúcares y Endulzantes'), +('4', 'Grasas'), +('5', 'Esencias'), +('6', 'Fruta'), +('7', 'Frutos Secos'), +('8', 'Levaduras'), +('9', 'Huevos'), +('10', 'Chocolate y Cacao'), +('11', 'Espesantes y Gelificantes'), +('12', 'Colorantes Alimentarios'), +('13', 'Sal'), +('14', 'Aditivos y Mejoradores'), +('15', 'Semillas'), +('16', 'Coberturas y Rellenos'); + +-- Inserción en tabla: Ingredientes +INSERT INTO Ingredientes (ID_INGREDIENTE, ID_PROVEEDOR, ID_CATEGORIA, NOMBRE_INGREDIENTE, CANTIDAD_INGREDIENTE, FECHA_VENCIMIENTO, REFERENCIA_INGREDIENTE, FECHA_ENTREGA_INGREDIENTE) VALUES +(1, 2, 1, 'Harina de Trigo', 100, '2025-12-20', 'HAR-TRG-05', '2025-07-01'), +(2, 1, 2, 'Leche Entera UHT', 30, '2025-08-01', 'LECH-ENT-1L', '2025-07-01'), +(3, 3, 3, 'Azúcar Blanca', 70, '2026-01-30', 'AZUC-BLN-KG', '2025-07-01'), +(4, 4, 4, 'Mantequilla sin Sal', 25, '2025-09-15', 'MANT-SS-KG', '2025-07-01'), +(5, 5, 9, 'Huevos Grandes', 120, '2025-07-25', 'HUEV-GR-DZ', '2025-07-01'), +(6, 6, 10, 'Chocolate Semi-Amargo (Gotas)', 15, '2026-03-10', 'CHOC-SM-KG', '2025-07-01'), +(7, 7, 8, 'Levadura Fresca', 5, '2025-07-10', 'LEV-FRES-GR', '2025-07-01'), +(8, 1, 3, 'Azúcar Moreno', 10, '2026-02-20', 'AZUC-MRN-KG', '2025-07-01'), +(9, 2, 1, 'Harina Integral', 50, '2025-11-01', 'HAR-INT-02', '2025-07-01'), +(10, 3, 4, 'Aceite Vegetal', 20, '2026-05-01', 'ACET-VEG-LT', '2025-07-01'), +(11, 4, 10, 'Cacao en Polvo', 8, '2026-04-15', 'CACAO-POL-KG', '2025-07-01'), +(12, 5, 6, 'Manzanas Verdes (Kg)', 10, '2025-07-12', 'MANZ-VRD-KG', '2025-07-01'), +(13, 6, 7, 'Nueces Picadas', 5, '2025-10-01', 'NUEZ-PIC-KG', '2025-07-01'), +(14, 7, 5, 'Esencia de Vainilla', 2, '2027-01-01', 'ESEN-VN-LT', '2025-07-01'), +(15, 8, 13, 'Sal Fina', 2, '2028-01-01', 'SAL-FIN-KG', '2025-07-01'), +(16, 1, 2, 'Crema de Leche', 5, '2025-08-05', 'CREM-LECH-LT', '2025-07-01'), +(17, 2, 11, 'Gelatina sin Sabor', 1, '2026-09-01', 'GEL-SS-KG', '2025-07-01'), +(18, 3, 12, 'Colorante Alimentario Rojo', 0.5, '2027-03-01', 'COLR-ROJ-ML', '2025-07-01'), +(19, 4, 15, 'Semillas de Sésamo', 3, '2026-06-01', 'SEM-SES-KG', '2025-07-01'), +(20, 5, 16, 'Dulce de Leche', 10, '2025-11-15', 'DDL-KG', '2025-07-01'); + +-- Inserción en tabla: Productos +INSERT INTO Productos (ID_PRODUCTO, ID_ADMIN, ID_CATEGORIA_PRODUCTO, NOMBRE_PRODUCTO, DESCRIPCION_PRODUCTO, PRODUCTO_STOCK_MIN, PRECIO_PRODUCTO, FECHA_VENCIMIENTO_PRODUCTO, FECHA_INGRESO_PRODUCTO, TIPO_PRODUCTO_MARCA) VALUES +(1, 1, 8, 'Tamales Tolimenses', 'Tradicionales tamales envueltos en hoja de plátano, con masa de maíz y relleno de carne de cerdo y pollo', 10, 3800.00, '2025-09-15', '2025-07-01', 'Propio'), +(2, 1, 4, 'Pan Tajado Integral', 'Pan de molde integral, ideal para desayunos saludables, rico en fibra', 15, 4200.00, '2025-07-02', '2025-07-01', 'Propio'), +(3, 1, 7, 'Yogurt Fresa Litro', 'Yogurt cremoso con trozos de fresa natural, sin conservantes artificiales', 12, 6000.00, '2025-07-30', '2025-07-03', 'Alpina'), +(4, 1, 5, 'Galleta de Tres Ojos', 'Galleta tradicional colombiana con tres círculos de dulce, crujiente y deliciosa', 20, 2500.00, '2025-11-01', '2025-07-01', 'Propio'), +(5, 1, 1, 'Pan Campesino Grande', 'Pan artesanal de corteza dorada y miga suave, ideal para acompañar comidas', 8, 5500.00, '2025-07-08', '2025-07-04', 'Propio'), +(6, 1, 3, 'Torta de Chocolate Pequeña', 'Deliciosa torta de chocolate húmeda con cobertura de chocolate, perfecta para ocasiones especiales', 5, 18000.00, '2025-07-07', '2025-07-04', 'Propio'), +(7, 1, 2, 'Croissant de Almendras', NULL, 18, 3500.00, '2025-07-06', '2025-07-05', 'Propio'), +(8, 1, 1, 'Baguette Clásica', 'Pan francés tradicional con corteza crujiente y miga aireada', 25, 2800.00, '2025-07-06', '2025-07-05', 'Propio'), +(9, 1, 5, 'Bizcochos de Achira', NULL, 15, 4000.00, '2025-12-01', '2025-07-01', 'Propio'), +(10, 1, 6, 'Jugo de Naranja Natural (500ml)', 'Jugo 100% natural exprimido de naranjas frescas, sin azúcar añadido', 10, 4500.00, '2025-07-05', '2025-07-04', 'Postobón'), +(11, 1, 7, 'Postre de Tres Leches', 'Clásico postre colombiano empapado en tres tipos de leche, suave y cremoso', 7, 7500.00, '2025-07-08', '2025-07-04', 'Propio'), +(12, 1, 4, 'Pan Blanco de Molde', NULL, 20, 3900.00, '2025-07-02', '2025-07-01', 'Propio'), +(13, 1, 3, 'Muffin de Arándanos', 'Muffin esponjoso con arándanos frescos, perfecto para el desayuno o merienda', 15, 3000.00, '2025-07-07', '2025-07-04', 'Propio'), +(14, 1, 2, 'Pan de Bono Pequeño', NULL, 30, 1500.00, '2025-07-06', '2025-07-05', 'Propio'), +(15, 1, 8, 'Empanadas de Carne (unidad)', 'Empanada frita rellena de carne molida sazonada con especias tradicionales', 20, 2000.00, '2025-07-06', '2025-07-05', 'Propio'), +(16, 1, 3, 'Brazo de Reina', 'Bizcocho enrollado relleno de dulce de leche y cubierto con coco rallado', 10, 9500.00, '2025-07-09', '2025-07-04', 'Propio'), +(17, 1, 1, 'Pan Trenza Integral', NULL, 12, 4800.00, '2025-07-07', '2025-07-03', 'Propio'), +(18, 1, 5, 'Galletas Surtidas de Mantequilla', 'Variedad de galletas caseras de mantequilla con diferentes formas y sabores', 25, 3200.00, '2025-12-30', '2025-07-01', 'Propio'), +(19, 1, 7, 'Avena La Lechera (500ml)', NULL, 18, 5800.00, '2025-08-20', '2025-07-03', 'Nestlé'), +(20, 1, 9, 'Ponqué de Naranja (Porción)', 'Porción individual de ponqué de naranja con glaseado cítrico', 15, 3000.00, '2025-07-08', '2025-07-04', 'Propio'), +(21, 1, 10, 'Pan Artesanal de Masa Madre', 'Pan elaborado con masa madre natural, fermentación larga para mejor digestibilidad', 7, 8000.00, '2025-07-07', '2025-07-05', 'Propio'), +(22, 1, 3, 'Cheesecake de Frutos Rojos', 'Cheesecake cremoso con base de galleta y cobertura de frutos rojos frescos', 6, 25000.00, '2025-07-09', '2025-07-04', 'Propio'), +(23, 1, 4, 'Pan de Hamburguesa', NULL, 30, 4500.00, '2025-07-10', '2025-07-02', 'Propio'), +(24, 1, 5, 'Galletas de Avena y Pasas', 'Galletas nutritivas con avena integral y pasas, sin azúcar refinado', 22, 2700.00, '2026-01-01', '2025-07-01', 'Propio'), +(25, 1, 7, 'Kumiss Natural', NULL, 10, 4900.00, '2025-07-25', '2025-07-03', 'Alquería'), +(26, 1, 9, 'Brownie con Nuez', 'Brownie de chocolate intenso con trozos de nuez, húmedo y delicioso', 40, 1800.00, '2025-07-08', '2025-07-05', 'Propio'), +(27, 1, 1, 'Pan Blandito', NULL, 28, 2500.00, '2025-07-07', '2025-07-05', 'Propio'), +(28, 1, 3, 'Milhoja de Arequipe', 'Delicada milhoja rellena de arequipe casero y cubierta con azúcar glass', 12, 6000.00, '2025-07-08', '2025-07-04', 'Propio'), +(29, 1, 2, 'Mogolla Chicharrona', NULL, 15, 3500.00, '2025-07-06', '2025-07-05', 'Propio'), +(30, 1, 8, 'Arequipe (Tarro 500g)', 'Arequipe casero cremoso y dulce, perfecto para postres y acompañamientos', 8, 9000.00, '2026-04-10', '2025-07-01', 'Propio'); + +-- Inserción en tabla: Pedidos +INSERT INTO Pedidos (ID_CLIENTE, ID_EMPLEADO, ID_ESTADO_PEDIDO, FECHA_INGRESO, FECHA_ENTREGA, TOTAL_PRODUCTO) VALUES +(1, 1, 2, '2025-06-20 09:00:00', '2025-06-20 15:00:00', 10000.00), +(2, 2, 4, '2025-06-19 10:30:00', '2025-06-19 16:30:00', 7500.00), +(3, 1, 1, '2025-06-21 08:00:00', '2025-06-21 14:00:00', 12500.00); + +-- Inserción en tabla: Detalle_Pedidos +INSERT INTO Detalle_Pedidos (ID_PEDIDO, ID_PRODUCTO, CANTIDAD_PRODUCTO, PRECIO_UNITARIO, SUBTOTAL) VALUES +(1, 1, 2, 3500.00, 7000.00), +(1, 3, 1, 6000.00, 6000.00), +(2, 2, 1, 4200.00, 4200.00), +(2, 4, 3, 2500.00, 7500.00), +(3, 1, 3, 3500.00, 10500.00), +(3, 4, 2, 2500.00, 5000.00); + +-- Inserción en tabla: Ordenes_Salida +INSERT INTO Ordenes_Salida (ID_CLIENTE, ID_PEDIDO, FECHA_FACTURACION, TOTAL_FACTURA) VALUES +(1, 1, '2025-06-20 15:30:00', 13000.00), +(2, 2, '2025-06-19 17:00:00', 11700.00), +(3, 3, '2025-06-21 14:30:00', 15500.00); + +-- ================================================================== +-- DCL (DATA CONTROL LANGUAGE) - SEGURIDAD Y ENCRIPTACIÓN +-- ================================================================== + +-- Actualizar contraseñas de administradores con encriptación (sin salt) +UPDATE Administradores +SET CONTRASEÑA_ADMIN = HashPassword('admin123') +WHERE ID_ADMIN = 1; + +-- Actualizar contraseñas de clientes con encriptación (sin salt) +UPDATE Clientes +SET CONTRASEÑA_CLI = HashPassword('cliente123') +WHERE ID_CLIENTE = 1; + +UPDATE Clientes +SET CONTRASEÑA_CLI = HashPassword('cliente456') +WHERE ID_CLIENTE = 2; + +UPDATE Clientes +SET CONTRASEÑA_CLI = HashPassword('cliente789') +WHERE ID_CLIENTE = 3; + +-- Actualizar contraseñas de empleados con encriptación (sin salt) +UPDATE Empleados +SET CONTRASEÑA_EMPLEADO = HashPassword('empleado123') +WHERE ID_EMPLEADO = 1; + +UPDATE Empleados +SET CONTRASEÑA_EMPLEADO = HashPassword('empleado456') +WHERE ID_EMPLEADO = 2; + +COMMIT; \ No newline at end of file diff --git a/Pan&Code/database/PROYECTOPANADERIA.sql b/Pan&Code/database/PROYECTOPANADERIA.sql deleted file mode 100644 index 48462ea..0000000 --- a/Pan&Code/database/PROYECTOPANADERIA.sql +++ /dev/null @@ -1,1034 +0,0 @@ --- ================================================================== --- PROYECTO PANADERÍA - BASE DE DATOS --- ================================================================== --- Autor: Sistema de Gestión de Panadería --- Fecha: 2025 --- Descripción: Base de datos completa para gestión de panadería --- Versión: 2.1 - Incluye sistema de logs y actualización de estructura --- ================================================================== - --- CARACTERÍSTICAS PRINCIPALES: --- - Gestión completa de productos con descripción opcional --- - Sistema de pedidos con detalles de productos --- - Control de inventario y stock mínimo --- - Gestión de empleados, clientes y administradores --- - Sistema de logs para auditoría de cambios en productos --- - Triggers automáticos para actualización de totales --- - Funciones de utilidad para encriptación y generación de códigos --- - Estructura optimizada para dashboard de empleados y administradores - --- ESTRUCTURA DE TABLAS PRINCIPALES: --- - Productos: Incluye DESCRIPCION_PRODUCTO opcional --- - Detalle_Pedidos: Sin columnas de imagen, solo datos esenciales --- - Empleados: Con control de estado activo/inactivo --- - Pedidos: Con estados y totales automáticos --- - Sistema de logs: Para auditoría de cambios - --- INSTRUCCIONES DE INSTALACIÓN: --- --- OPCIÓN 1: INSTALACIÓN NUEVA (Base de datos desde cero) --- 1. Ejecutar todo el script completo --- 2. La base de datos se creará con todas las tablas y datos --- --- OPCIÓN 2: ACTUALIZACIÓN DE BASE EXISTENTE --- 1. Ejecutar solo las secciones de "MIGRACIONES Y ACTUALIZACIONES" --- 2. Verificar que los cambios se aplicaron correctamente --- 3. Los datos existentes se mantendrán intactos --- --- ================================================================== - --- Configuración inicial -DROP DATABASE IF EXISTS ProyectoPanaderia; -SET SQL_SAFE_UPDATES = 0; -CREATE DATABASE ProyectoPanaderia; -USE ProyectoPanaderia; - --- ================================================================== --- DDL (DATA DEFINITION LANGUAGE) - DEFINICIÓN DE ESTRUCTURA --- ================================================================== - --- ================================================================== --- CREACIÓN DE TABLAS PRINCIPALES --- ================================================================== - --- Tabla: Clientes - Almacena información de los clientes -CREATE TABLE Clientes ( - ID_CLIENTE INT PRIMARY KEY AUTO_INCREMENT, - NOMBRE_CLI VARCHAR(100) NOT NULL, - TELEFONO_CLI VARCHAR(20), - ACTIVO_CLI BOOLEAN DEFAULT TRUE, - EMAIL_CLI VARCHAR(100), - CONTRASEÑA_CLI VARCHAR(255), - SALT_CLI VARCHAR(32) -); - --- Tabla: Empleados - Almacena información de los empleados -CREATE TABLE Empleados ( - ID_EMPLEADO INT PRIMARY KEY AUTO_INCREMENT, - NOMBRE_EMPLEADO VARCHAR(100) NOT NULL, - EMAIL_EMPLEADO VARCHAR(100) NOT NULL, - ACTIVO_EMPLEADO BOOLEAN DEFAULT TRUE, - CONTRASEÑA_EMPLEADO VARCHAR(255), - SALT_EMPLEADO VARCHAR(32), - FECHA_REGISTRO TIMESTAMP DEFAULT CURRENT_TIMESTAMP -); - --- Tabla: Administradores - Almacena información de los administradores -CREATE TABLE Administradores ( - ID_ADMIN INT PRIMARY KEY AUTO_INCREMENT, - NOMBRE_ADMIN VARCHAR(100) NOT NULL, - TELEFONO_ADMIN VARCHAR(20), - EMAIL_ADMIN VARCHAR(100), - CONTRASEÑA_ADMIN VARCHAR(255), - SALT_ADMIN VARCHAR(32) -); - --- Tabla: Proveedores - Almacena información de los proveedores -CREATE TABLE Proveedores ( - ID_PROVEEDOR INT PRIMARY KEY AUTO_INCREMENT, - NOMBRE_PROV VARCHAR(100) NOT NULL, - TELEFONO_PROV VARCHAR(20) NOT NULL, - ACTIVO_PROV BOOLEAN DEFAULT TRUE, - EMAIL_PROV VARCHAR(100) NOT NULL, - DIRECCION_PROV VARCHAR(200) -); - --- Tabla: Pedidos_Proveedores - Almacena pedidos realizados a proveedores -CREATE TABLE Pedidos_Proveedores ( - ID_PEDIDO_PROV INT PRIMARY KEY AUTO_INCREMENT, - ID_PROVEEDOR INT NOT NULL, - NUMERO_PEDIDO INT NOT NULL, - FECHA_PEDIDO DATE NOT NULL, - ESTADO_PEDIDO VARCHAR(50) DEFAULT 'Pendiente', - CONSTRAINT FK_PEDIDO_PROVEEDOR - FOREIGN KEY (ID_PROVEEDOR) REFERENCES Proveedores(ID_PROVEEDOR) ON UPDATE CASCADE ON DELETE RESTRICT -); - --- Tabla: Categoria_Productos - Almacena categorías de productos -CREATE TABLE Categoria_Productos ( - ID_CATEGORIA_PRODUCTO INT PRIMARY KEY AUTO_INCREMENT, - NOMBRE_CATEGORIAPRODUCTO VARCHAR(100) NOT NULL -); - --- Tabla: Estado_Pedidos - Almacena estados de pedidos -CREATE TABLE Estado_Pedidos ( - ID_ESTADO_PEDIDO INT PRIMARY KEY AUTO_INCREMENT, - NOMBRE_ESTADO VARCHAR(50) -); - --- Tabla: Categoria_Ingredientes - Almacena categorías de ingredientes -CREATE TABLE Categoria_Ingredientes ( - ID_CATEGORIA INT PRIMARY KEY AUTO_INCREMENT, - NOMBRE_CATEGORIA_INGREDIENTE VARCHAR(100) NOT NULL -); - --- Tabla: Ingredientes - Almacena ingredientes utilizados en productos -CREATE TABLE Ingredientes ( - ID_INGREDIENTE INT PRIMARY KEY AUTO_INCREMENT, - ID_PROVEEDOR INT, - ID_CATEGORIA INT, - NOMBRE_INGREDIENTE VARCHAR(100) NOT NULL, - CANTIDAD_INGREDIENTE INT NOT NULL, - FECHA_VENCIMIENTO DATE NOT NULL, - REFERENCIA_INGREDIENTE VARCHAR(100) NOT NULL, - FECHA_ENTREGA_INGREDIENTE DATE NOT NULL, - CONSTRAINT FK_PROVEEDOR_INGREDIENTE - FOREIGN KEY (ID_PROVEEDOR) REFERENCES Proveedores(ID_PROVEEDOR) ON UPDATE CASCADE ON DELETE RESTRICT, - CONSTRAINT FK_CATEGORIA_INGREDIENTE - FOREIGN KEY (ID_CATEGORIA) REFERENCES Categoria_Ingredientes(ID_CATEGORIA) ON UPDATE CASCADE ON DELETE RESTRICT -); - --- Tabla: Productos - Almacena productos de la panadería -CREATE TABLE Productos ( - ID_PRODUCTO INT PRIMARY KEY AUTO_INCREMENT, - ID_ADMIN INT, - ID_CATEGORIA_PRODUCTO INT, - NOMBRE_PRODUCTO VARCHAR(100) NOT NULL, - DESCRIPCION_PRODUCTO TEXT, - PRODUCTO_STOCK_MIN INT NOT NULL, - PRECIO_PRODUCTO DECIMAL(10,2) NOT NULL, - FECHA_VENCIMIENTO_PRODUCTO DATE NOT NULL, - FECHA_INGRESO_PRODUCTO DATE NOT NULL, - TIPO_PRODUCTO_MARCA VARCHAR(100) NOT NULL, - ACTIVO BOOLEAN DEFAULT TRUE, - FECHA_ULTIMA_MODIFICACION TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - CONSTRAINT FK_CATEGORIA_PRODUCTO - FOREIGN KEY (ID_CATEGORIA_PRODUCTO) REFERENCES Categoria_Productos(ID_CATEGORIA_PRODUCTO) ON UPDATE CASCADE ON DELETE RESTRICT, - CONSTRAINT FK_ADMIN_PRODUCTO - FOREIGN KEY (ID_ADMIN) REFERENCES Administradores(ID_ADMIN) ON UPDATE CASCADE ON DELETE RESTRICT -); - --- Tabla: Pedidos - Almacena pedidos realizados por clientes -CREATE TABLE Pedidos ( - ID_PEDIDO INT PRIMARY KEY AUTO_INCREMENT, - ID_CLIENTE INT, - ID_EMPLEADO INT, - ID_ESTADO_PEDIDO INT, - FECHA_INGRESO DATETIME NOT NULL, - FECHA_ENTREGA DATETIME NOT NULL, - TOTAL_PRODUCTO DECIMAL(10,2) NOT NULL, - CONSTRAINT FK_CLIENTE_PEDIDO - FOREIGN KEY (ID_CLIENTE) REFERENCES Clientes(ID_CLIENTE) ON UPDATE CASCADE ON DELETE RESTRICT, - CONSTRAINT FK_EMPLEADO_PEDIDO - FOREIGN KEY (ID_EMPLEADO) REFERENCES Empleados(ID_EMPLEADO) ON UPDATE CASCADE ON DELETE RESTRICT, - CONSTRAINT FK_ESTADO_PEDIDO_PEDIDO - FOREIGN KEY (ID_ESTADO_PEDIDO) REFERENCES Estado_Pedidos(ID_ESTADO_PEDIDO) ON UPDATE CASCADE ON DELETE RESTRICT -); - --- Tabla: Detalle_Pedidos - Almacena detalles de productos por pedido -CREATE TABLE Detalle_Pedidos ( - ID_DETALLE INT PRIMARY KEY AUTO_INCREMENT, - ID_PEDIDO INT NOT NULL, - ID_PRODUCTO INT NOT NULL, - CANTIDAD_PRODUCTO INT NOT NULL, - PRECIO_UNITARIO DECIMAL(10,2) NOT NULL, - SUBTOTAL DECIMAL(10,2) NOT NULL, - CONSTRAINT FK_DETALLE_PEDIDO - FOREIGN KEY (ID_PEDIDO) REFERENCES Pedidos(ID_PEDIDO) ON UPDATE CASCADE ON DELETE CASCADE, - CONSTRAINT FK_DETALLE_PRODUCTO - FOREIGN KEY (ID_PRODUCTO) REFERENCES Productos(ID_PRODUCTO) ON UPDATE CASCADE ON DELETE RESTRICT -); - --- Tabla: Ordenes_Salida - Almacena facturas de pedidos -CREATE TABLE Ordenes_Salida ( - ID_FACTURA INT PRIMARY KEY AUTO_INCREMENT, - ID_CLIENTE INT, - ID_PEDIDO INT, - FECHA_FACTURACION DATETIME NOT NULL, - TOTAL_FACTURA DECIMAL(10,2) NOT NULL, - CONSTRAINT FK_ORDENSALIDA_CLIENTE - FOREIGN KEY (ID_CLIENTE) REFERENCES Clientes(ID_CLIENTE) ON UPDATE CASCADE ON DELETE RESTRICT, - CONSTRAINT FK_ORDENSALIDA_PEDIDO - FOREIGN KEY (ID_PEDIDO) REFERENCES Pedidos(ID_PEDIDO) ON UPDATE CASCADE ON DELETE RESTRICT -); - --- ================================================================== --- TABLA DE LOGS PARA CAMBIOS EN PRODUCTOS --- ================================================================== - --- Tabla para registrar cambios en productos (logs de auditoría) -CREATE TABLE productos_logs ( - id INT PRIMARY KEY AUTO_INCREMENT, - producto_id INT NOT NULL, - tipo_cambio ENUM('precio', 'stock', 'activacion', 'desactivacion') NOT NULL, - valor_anterior VARCHAR(50), - valor_nuevo VARCHAR(50), - usuario_id INT, - usuario_tipo ENUM('admin', 'empleado') DEFAULT 'admin', - fecha_cambio TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - ip_usuario VARCHAR(45), - INDEX idx_producto_logs_fecha (fecha_cambio), - INDEX idx_producto_logs_producto (producto_id), - INDEX idx_producto_logs_tipo (tipo_cambio), - CONSTRAINT FK_PRODUCTO_LOG - FOREIGN KEY (producto_id) REFERENCES Productos(ID_PRODUCTO) ON DELETE CASCADE -); - --- Trigger para actualizar FECHA_ULTIMA_MODIFICACION automáticamente -DELIMITER // -CREATE TRIGGER tr_actualizar_fecha_producto - BEFORE UPDATE ON Productos - FOR EACH ROW -BEGIN - SET NEW.FECHA_ULTIMA_MODIFICACION = CURRENT_TIMESTAMP; -END// -DELIMITER ; - --- ================================================================== --- FUNCIONES DE UTILIDAD --- ================================================================== - --- Función: GenerateSalt - Genera salt aleatorio para encriptación -DELIMITER // - -CREATE FUNCTION GenerateSalt() -RETURNS VARCHAR(32) -READS SQL DATA -DETERMINISTIC -BEGIN - RETURN SUBSTRING(MD5(CONCAT(RAND(), NOW(), CONNECTION_ID())), 1, 32); -END// - -DELIMITER ; - --- Función: HashPassword - Hashea contraseñas con salt -DELIMITER // - -CREATE FUNCTION HashPassword(password VARCHAR(255), salt VARCHAR(32)) -RETURNS VARCHAR(255) -READS SQL DATA -DETERMINISTIC -BEGIN - RETURN SHA2(CONCAT(password, salt), 256); -END// - -DELIMITER ; - --- Función: GenerarCodigoProducto - Genera códigos de producto por categoría -DELIMITER // -CREATE FUNCTION GenerarCodigoProducto(categoria_id INT, producto_id INT) -RETURNS VARCHAR(50) -READS SQL DATA -DETERMINISTIC -BEGIN - DECLARE prefijo VARCHAR(10); - - -- Obtener prefijo según categoría - SELECT CASE - WHEN categoria_id = 1 THEN 'TL' -- Tortas Tres Leches - WHEN categoria_id = 2 THEN 'TM' -- Tortas Milkyway - WHEN categoria_id = 3 THEN 'TE' -- Tortas Encargo - WHEN categoria_id = 4 THEN 'PG' -- Pan Grande - WHEN categoria_id = 5 THEN 'PP' -- Pan Pequeño - WHEN categoria_id = 6 THEN 'PS' -- Postres - WHEN categoria_id = 7 THEN 'GA' -- Galletas - WHEN categoria_id = 8 THEN 'TA' -- Tamales - WHEN categoria_id = 9 THEN 'YO' -- Yogures - WHEN categoria_id = 10 THEN 'PC' -- Pasteles Pollo - WHEN categoria_id = 11 THEN 'BE' -- Bebidas - WHEN categoria_id = 12 THEN 'PI' -- Panadería Integral - ELSE 'PR' - END INTO prefijo; - - RETURN CONCAT(prefijo, '-', LPAD(producto_id, 4, '0')); -END// -DELIMITER ; - --- Función: GenerarNumeroPedido - Genera números de pedido automáticos -DELIMITER // -CREATE FUNCTION GenerarNumeroPedido(pedido_id INT) -RETURNS VARCHAR(50) -READS SQL DATA -DETERMINISTIC -BEGIN - RETURN CONCAT('PED-', YEAR(NOW()), '-', LPAD(pedido_id, 6, '0')); -END// -DELIMITER ; - --- ================================================================== --- TRIGGERS --- ================================================================== - --- Trigger: Actualizar total del pedido cuando se inserta detalle -DELIMITER // - -CREATE TRIGGER tr_actualizar_total_pedido -AFTER INSERT ON Detalle_Pedidos -FOR EACH ROW -BEGIN - UPDATE Pedidos - SET TOTAL_PRODUCTO = ( - SELECT SUM(SUBTOTAL) - FROM Detalle_Pedidos - WHERE ID_PEDIDO = NEW.ID_PEDIDO - ) - WHERE ID_PEDIDO = NEW.ID_PEDIDO; -END// - -DELIMITER ; - --- Trigger: Actualizar total del pedido cuando se modifica detalle -DELIMITER // - -CREATE TRIGGER tr_actualizar_total_pedido_update -AFTER UPDATE ON Detalle_Pedidos -FOR EACH ROW -BEGIN - UPDATE Pedidos - SET TOTAL_PRODUCTO = ( - SELECT SUM(SUBTOTAL) - FROM Detalle_Pedidos - WHERE ID_PEDIDO = NEW.ID_PEDIDO - ) - WHERE ID_PEDIDO = NEW.ID_PEDIDO; -END// - -DELIMITER ; - --- ================================================================== --- PROCEDIMIENTOS ALMACENADOS --- ================================================================== - --- Procedimiento: sp_productos_por_categoria - Busca productos por categoría -DELIMITER // - -CREATE PROCEDURE sp_productos_por_categoria( - IN nombre_categoria VARCHAR(100) -) -BEGIN - -- Buscar productos por nombre de categoría - SELECT - p.ID_PRODUCTO, - p.NOMBRE_PRODUCTO, - p.PRECIO_PRODUCTO, - p.PRODUCTO_STOCK_MIN, - p.TIPO_PRODUCTO_MARCA, - cp.NOMBRE_CATEGORIAPRODUCTO as CATEGORIA - FROM Productos p - INNER JOIN Categoria_Productos cp ON p.ID_CATEGORIA_PRODUCTO = cp.ID_CATEGORIA_PRODUCTO - WHERE cp.NOMBRE_CATEGORIAPRODUCTO LIKE CONCAT('%', nombre_categoria, '%') - ORDER BY p.NOMBRE_PRODUCTO; - - -- Mostrar el total de productos encontrados - SELECT COUNT(*) as TOTAL_PRODUCTOS_ENCONTRADOS - FROM Productos p - INNER JOIN Categoria_Productos cp ON p.ID_CATEGORIA_PRODUCTO = cp.ID_CATEGORIA_PRODUCTO - WHERE cp.NOMBRE_CATEGORIAPRODUCTO LIKE CONCAT('%', nombre_categoria, '%'); -END// - -DELIMITER ; - --- Procedimiento: sp_crear_pedido - Crear un nuevo pedido -DELIMITER // - -CREATE PROCEDURE sp_crear_pedido( - IN p_id_cliente INT, - IN p_id_empleado INT, - IN p_fecha_entrega DATETIME -) -BEGIN - DECLARE nuevo_id_pedido INT; - - -- Insertar el pedido - INSERT INTO Pedidos (ID_CLIENTE, ID_EMPLEADO, ID_ESTADO_PEDIDO, FECHA_INGRESO, FECHA_ENTREGA, TOTAL_PRODUCTO) - VALUES (p_id_cliente, p_id_empleado, 1, NOW(), p_fecha_entrega, 0.00); - - -- Obtener el ID del pedido recién creado - SET nuevo_id_pedido = LAST_INSERT_ID(); - - -- Devolver el ID del nuevo pedido - SELECT nuevo_id_pedido as NUEVO_ID_PEDIDO; -END// - -DELIMITER ; - --- ================================================================== --- DML (DATA MANIPULATION LANGUAGE) - INSERCIÓN DE DATOS --- ================================================================== - --- ================================================================== --- INSERCIÓN DE DATOS BASE --- ================================================================== - --- Inserción en tabla: Clientes -INSERT INTO Clientes (NOMBRE_CLI, TELEFONO_CLI, EMAIL_CLI) VALUES -('Ana Pérez', '3101234567', 'ana.p@mail.com'), -('Luis Gómez', '3209876543', 'luis.g@mail.com'), -('Maria Rodriguez', '3001122334', 'maria.r@mail.com'); - --- Inserción en tabla: Empleados -INSERT INTO Empleados (NOMBRE_EMPLEADO) VALUES -('Andres Alkaeda'), -('Damian Avila'), -('Brayan Jimenez'), -('Ana Goyeneche'), -('Sharyt Zamora'); - --- Inserción en tabla: Administradores -INSERT INTO Administradores (NOMBRE_ADMIN, TELEFONO_ADMIN, EMAIL_ADMIN) VALUES -('Admin Uno', '3005550101', 'admin1@store.com'); - --- Inserción en tabla: Proveedores -INSERT INTO `proveedores` (`ID_PROVEEDOR`, `NOMBRE_PROV`) VALUES -('1', 'Harina Dorada'), -('2', 'Dulce Granero'), -('3', 'El Horno Mágico S.A.S.'), -('4', 'Masa Maestra Distribuciones'), -('5', 'Insumos Panaderos del Sol'), -('6', 'La Esencia del Pan'), -('7', 'Proveedora Integral del Panadero'), -('8', 'Alimentos para Hornear Cía. Ltda.'); - --- Inserción en tabla: Pedidos_Proveedores -INSERT INTO Pedidos_Proveedores (ID_PROVEEDOR, NUMERO_PEDIDO, FECHA_PEDIDO, ESTADO_PEDIDO) VALUES -(1, 1001, '2024-01-15', 'Entregado'), -(2, 1002, '2024-02-10', 'Entregado'), -(3, 1003, '2024-03-05', 'Entregado'); - --- Inserción en tabla: Categoria_Productos -INSERT INTO Categoria_Productos (NOMBRE_CATEGORIAPRODUCTO) VALUES -('Tortas Tres Leches'), -('Tortas Milyway'), -('Tortas por Encargo'), -('Pan Grande'), -('Pan Pequeño'), -('Postres'), -('Galletas'), -('Tamales'), -('Yogures'), -('Pasteles Pollo'); - --- Inserción en tabla: Estado_Pedidos -INSERT INTO Estado_Pedidos (NOMBRE_ESTADO) VALUES -('Pendiente'), -('En Preparación'), -('Listo para Entrega'), -('Entregado'), -('Cancelado'); - --- Inserción en tabla: Categoria_Ingredientes -INSERT INTO `categoria_ingredientes` (`ID_CATEGORIA`, `NOMBRE_CATEGORIA_INGREDIENTE`) VALUES -('1', 'Harinas'), -('2', 'Lácteos y Derivados'), -('3', 'Azúcares y Endulzantes'), -('4', 'Grasas'), -('5', 'Esencias'), -('6', 'Fruta'), -('7', 'Frutos Secos'), -('8', 'Levaduras'), -('9', 'Huevos'), -('10', 'Chocolate y Cacao'), -('11', 'Espesantes y Gelificantes'), -('12', 'Colorantes Alimentarios'), -('13', 'Sal'), -('14', 'Aditivos y Mejoradores'), -('15', 'Semillas'), -('16', 'Coberturas y Rellenos'); - --- Inserción en tabla: Ingredientes -INSERT INTO `ingredientes` (`ID_INGREDIENTE`, `ID_PROVEEDOR`, `ID_CATEGORIA`, `NOMBRE_INGREDIENTE`, `CANTIDAD_INGREDIENTE`, `FECHA_VENCIMIENTO`, `REFERENCIA_INGREDIENTE`) VALUES -('1', '2', '1', 'Harina de Trigo', '100', '2025-12-20', 'HAR-TRG-05'), -('2', '1', '2', 'Leche Entera UHT', '30', '2025-08-01', 'LECH-ENT-1L'), -('3', '3', '3', 'Azúcar Blanca', '70', '2026-01-30', 'AZUC-BLN-KG'), -('4', '4', '4', 'Mantequilla sin Sal', '25', '2025-09-15', 'MANT-SS-KG'), -('5', '5', '9', 'Huevos Grandes', '120', '2025-07-25', 'HUEV-GR-DZ'), -('6', '6', '10', 'Chocolate Semi-Amargo (Gotas)', '15', '2026-03-10', 'CHOC-SM-KG'), -('7', '7', '8', 'Levadura Fresca', '5', '2025-07-10', 'LEV-FRES-GR'), -('8', '1', '3', 'Azúcar Moreno', '10', '2026-02-20', 'AZUC-MRN-KG'), -('9', '2', '1', 'Harina Integral', '50', '2025-11-01', 'HAR-INT-02'), -('10', '3', '4', 'Aceite Vegetal', '20', '2026-05-01', 'ACET-VEG-LT'), -('11', '4', '10', 'Cacao en Polvo', '8', '2026-04-15', 'CACAO-POL-KG'), -('12', '5', '6', 'Manzanas Verdes (Kg)', '10', '2025-07-12', 'MANZ-VRD-KG'), -('13', '6', '7', 'Nueces Picadas', '5', '2025-10-01', 'NUEZ-PIC-KG'), -('14', '7', '5', 'Esencia de Vainilla', '2', '2027-01-01', 'ESEN-VN-LT'), -('15', '8', '13', 'Sal Fina', '2', '2028-01-01', 'SAL-FIN-KG'), -('16', '1', '2', 'Crema de Leche', '5', '2025-08-05', 'CREM-LECH-LT'), -('17', '2', '11', 'Gelatina sin Sabor', '1', '2026-09-01', 'GEL-SS-KG'), -('18', '3', '12', 'Colorante Alimentario Rojo', '0.5', '2027-03-01', 'COLR-ROJ-ML'), -('19', '4', '15', 'Semillas de Sésamo', '3', '2026-06-01', 'SEM-SES-KG'), -('20', '5', '16', 'Dulce de Leche', '10', '2025-11-15', 'DDL-KG'); - --- Inserción en tabla: Productos -INSERT INTO `productos` (`ID_PRODUCTO`, `ID_ADMIN`, `ID_CATEGORIA_PRODUCTO`, `NOMBRE_PRODUCTO`, `DESCRIPCION_PRODUCTO`, `PRODUCTO_STOCK_MIN`, `PRECIO_PRODUCTO`, `FECHA_VENCIMIENTO_PRODUCTO`, `FECHA_INGRESO_PRODUCTO`, `TIPO_PRODUCTO_MARCA`) VALUES -('1', '1', '8', 'Tamales Tolimenses', 'Tradicionales tamales envueltos en hoja de plátano, con masa de maíz y relleno de carne de cerdo y pollo', '10', '3800.00', '2025-09-15', '2025-07-01', 'Propio'), -('2', '1', '4', 'Pan Tajado Integral', 'Pan de molde integral, ideal para desayunos saludables, rico en fibra', '15', '4200.00', '2025-07-02', '2025-07-01', 'Propio'), -('3', '1', '7', 'Yogurt Fresa Litro', 'Yogurt cremoso con trozos de fresa natural, sin conservantes artificiales', '12', '6000.00', '2025-07-30', '2025-07-03', 'Alpina'), -('4', '1', '5', 'Galleta de Tres Ojos', 'Galleta tradicional colombiana con tres círculos de dulce, crujiente y deliciosa', '20', '2500.00', '2025-11-01', '2025-07-01', 'Propio'), -('5', '1', '1', 'Pan Campesino Grande', 'Pan artesanal de corteza dorada y miga suave, ideal para acompañar comidas', '8', '5500.00', '2025-07-08', '2025-07-04', 'Propio'), -('6', '1', '3', 'Torta de Chocolate Pequeña', 'Deliciosa torta de chocolate húmeda con cobertura de chocolate, perfecta para ocasiones especiales', '5', '18000.00', '2025-07-07', '2025-07-04', 'Propio'), -('7', '1', '2', 'Croissant de Almendras', NULL, '18', '3500.00', '2025-07-06', '2025-07-05', 'Propio'), -('8', '1', '1', 'Baguette Clásica', 'Pan francés tradicional con corteza crujiente y miga aireada', '25', '2800.00', '2025-07-06', '2025-07-05', 'Propio'), -('9', '1', '5', 'Bizcochos de Achira', NULL, '15', '4000.00', '2025-12-01', '2025-07-01', 'Propio'), -('10', '1', '6', 'Jugo de Naranja Natural (500ml)', 'Jugo 100% natural exprimido de naranjas frescas, sin azúcar añadido', '10', '4500.00', '2025-07-05', '2025-07-04', 'Postobón'), -('11', '1', '7', 'Postre de Tres Leches', 'Clásico postre colombiano empapado en tres tipos de leche, suave y cremoso', '7', '7500.00', '2025-07-08', '2025-07-04', 'Propio'), -('12', '1', '4', 'Pan Blanco de Molde', NULL, '20', '3900.00', '2025-07-02', '2025-07-01', 'Propio'), -('13', '1', '3', 'Muffin de Arándanos', 'Muffin esponjoso con arándanos frescos, perfecto para el desayuno o merienda', '15', '3000.00', '2025-07-07', '2025-07-04', 'Propio'), -('14', '1', '2', 'Pan de Bono Pequeño', NULL, '30', '1500.00', '2025-07-06', '2025-07-05', 'Propio'), -('15', '1', '8', 'Empanadas de Carne (unidad)', 'Empanada frita rellena de carne molida sazonada con especias tradicionales', '20', '2000.00', '2025-07-06', '2025-07-05', 'Propio'), -('16', '1', '3', 'Brazo de Reina', 'Bizcocho enrollado relleno de dulce de leche y cubierto con coco rallado', '10', '9500.00', '2025-07-09', '2025-07-04', 'Propio'), -('17', '1', '1', 'Pan Trenza Integral', NULL, '12', '4800.00', '2025-07-07', '2025-07-03', 'Propio'), -('18', '1', '5', 'Galletas Surtidas de Mantequilla', 'Variedad de galletas caseras de mantequilla con diferentes formas y sabores', '25', '3200.00', '2025-12-30', '2025-07-01', 'Propio'), -('19', '1', '7', 'Avena La Lechera (500ml)', NULL, '18', '5800.00', '2025-08-20', '2025-07-03', 'Nestlé'), -('20', '1', '9', 'Ponqué de Naranja (Porción)', 'Porción individual de ponqué de naranja con glaseado cítrico', '15', '3000.00', '2025-07-08', '2025-07-04', 'Propio'), -('21', '1', '10', 'Pan Artesanal de Masa Madre', 'Pan elaborado con masa madre natural, fermentación larga para mejor digestibilidad', '7', '8000.00', '2025-07-07', '2025-07-05', 'Propio'), -('22', '1', '3', 'Cheesecake de Frutos Rojos', 'Cheesecake cremoso con base de galleta y cobertura de frutos rojos frescos', '6', '25000.00', '2025-07-09', '2025-07-04', 'Propio'), -('23', '1', '4', 'Pan de Hamburguesa', NULL, '30', '4500.00', '2025-07-10', '2025-07-02', 'Propio'), -('24', '1', '5', 'Galletas de Avena y Pasas', 'Galletas nutritivas con avena integral y pasas, sin azúcar refinado', '22', '2700.00', '2026-01-01', '2025-07-01', 'Propio'), -('25', '1', '7', 'Kumiss Natural', NULL, '10', '4900.00', '2025-07-25', '2025-07-03', 'Alquería'), -('26', '1', '9', 'Brownie con Nuez', 'Brownie de chocolate intenso con trozos de nuez, húmedo y delicioso', '40', '1800.00', '2025-07-08', '2025-07-05', 'Propio'), -('27', '1', '1', 'Pan Blandito', NULL, '28', '2500.00', '2025-07-07', '2025-07-05', 'Propio'), -('28', '1', '3', 'Milhoja de Arequipe', 'Delicada milhoja rellena de arequipe casero y cubierta con azúcar glass', '12', '6000.00', '2025-07-08', '2025-07-04', 'Propio'), -('29', '1', '2', 'Mogolla Chicharrona', NULL, '15', '3500.00', '2025-07-06', '2025-07-05', 'Propio'), -('30', '1', '8', 'Arequipe (Tarro 500g)', 'Arequipe casero cremoso y dulce, perfecto para postres y acompañamientos', '8', '9000.00', '2026-04-10', '2025-07-01', 'Propio'); - --- Inserción en tabla: Pedidos -INSERT INTO Pedidos (ID_CLIENTE, ID_EMPLEADO, ID_ESTADO_PEDIDO, FECHA_INGRESO, FECHA_ENTREGA, TOTAL_PRODUCTO) VALUES -(1, 1, 2, '2025-06-20 09:00:00', '2025-06-20 15:00:00', 10000.00), -(2, 2, 4, '2025-06-19 10:30:00', '2025-06-19 16:30:00', 7500.00), -(3, 1, 1, '2025-06-21 08:00:00', '2025-06-21 14:00:00', 12500.00); - --- Inserción en tabla: Detalle_Pedidos -INSERT INTO Detalle_Pedidos (ID_PEDIDO, ID_PRODUCTO, CANTIDAD_PRODUCTO, PRECIO_UNITARIO, SUBTOTAL) VALUES -(1, 1, 2, 3500.00, 7000.00), -(1, 3, 1, 6000.00, 6000.00), -(2, 2, 1, 4200.00, 4200.00), -(2, 4, 3, 2500.00, 7500.00), -(3, 1, 3, 3500.00, 10500.00), -(3, 4, 2, 2500.00, 5000.00); - --- Inserción en tabla: Ordenes_Salida -INSERT INTO Ordenes_Salida (ID_CLIENTE, ID_PEDIDO, FECHA_FACTURACION, TOTAL_FACTURA) VALUES -(1, 1, '2025-06-20 15:30:00', 13000.00), -(2, 2, '2025-06-19 17:00:00', 11700.00), -(3, 3, '2025-06-21 14:30:00', 15500.00); - --- ================================================================== --- DSL (DATA SECURITY LANGUAGE) - SEGURIDAD Y ENCRIPTACIÓN --- ================================================================== - --- ================================================================== --- CONFIGURACIÓN DE SEGURIDAD - CONTRASEÑAS --- ================================================================== - --- Actualizar contraseñas de administradores con encriptación -UPDATE Administradores -SET SALT_ADMIN = GenerateSalt() -WHERE ID_ADMIN = 1; - -UPDATE Administradores -SET CONTRASEÑA_ADMIN = HashPassword('admin123', SALT_ADMIN) -WHERE ID_ADMIN = 1; - --- Actualizar contraseñas de clientes con encriptación -UPDATE Clientes -SET SALT_CLI = GenerateSalt() -WHERE ID_CLIENTE IN (1, 2, 3); - -UPDATE Clientes -SET CONTRASEÑA_CLI = HashPassword('cliente123', SALT_CLI) -WHERE ID_CLIENTE = 1; - -UPDATE Clientes -SET CONTRASEÑA_CLI = HashPassword('cliente456', SALT_CLI) -WHERE ID_CLIENTE = 2; - -UPDATE Clientes -SET CONTRASEÑA_CLI = HashPassword('cliente789', SALT_CLI) -WHERE ID_CLIENTE = 3; - --- Actualizar contraseñas de empleados con encriptación -UPDATE Empleados -SET SALT_EMPLEADO = GenerateSalt() -WHERE ID_EMPLEADO IN (1, 2, 3, 4, 5); - -UPDATE Empleados -SET CONTRASEÑA_EMPLEADO = HashPassword('empleado123', SALT_EMPLEADO) -WHERE ID_EMPLEADO = 1; - -UPDATE Empleados -SET CONTRASEÑA_EMPLEADO = HashPassword('empleado456', SALT_EMPLEADO) -WHERE ID_EMPLEADO = 2; - --- ================================================================== --- DQL (DATA QUERY LANGUAGE) - CONSULTAS Y VERIFICACIONES --- ================================================================== - --- ================================================================== --- CONSULTAS DE VERIFICACIÓN --- ================================================================== - --- Verificación de registros en todas las tablas -SELECT 'CLIENTES' as Tabla, COUNT(*) as Total_Registros FROM Clientes -UNION ALL -SELECT 'EMPLEADOS', COUNT(*) FROM Empleados -UNION ALL -SELECT 'ADMINISTRADORES', COUNT(*) FROM Administradores -UNION ALL -SELECT 'PROVEEDORES', COUNT(*) FROM Proveedores -UNION ALL -SELECT 'PEDIDOS_PROVEEDORES', COUNT(*) FROM Pedidos_Proveedores -UNION ALL -SELECT 'CATEGORIA_PRODUCTOS', COUNT(*) FROM Categoria_Productos -UNION ALL -SELECT 'ESTADO_PEDIDOS', COUNT(*) FROM Estado_Pedidos -UNION ALL -SELECT 'CATEGORIA_INGREDIENTES', COUNT(*) FROM Categoria_Ingredientes -UNION ALL -SELECT 'INGREDIENTES', COUNT(*) FROM Ingredientes -UNION ALL -SELECT 'PRODUCTOS', COUNT(*) FROM Productos -UNION ALL -SELECT 'PEDIDOS', COUNT(*) FROM Pedidos -UNION ALL -SELECT 'DETALLE_PEDIDOS', COUNT(*) FROM Detalle_Pedidos -UNION ALL -SELECT 'ORDENES_SALIDA', COUNT(*) FROM Ordenes_Salida; - --- Consulta detallada de productos con información completa -SELECT - p.ID_PRODUCTO, - p.NOMBRE_PRODUCTO, - cp.NOMBRE_CATEGORIAPRODUCTO as CATEGORIA, - p.PRECIO_PRODUCTO, - p.PRODUCTO_STOCK_MIN, - p.TIPO_PRODUCTO_MARCA, - a.NOMBRE_ADMIN as ADMINISTRADOR, - p.FECHA_ULTIMA_MODIFICACION -FROM Productos p -INNER JOIN Categoria_Productos cp ON p.ID_CATEGORIA_PRODUCTO = cp.ID_CATEGORIA_PRODUCTO -INNER JOIN Administradores a ON p.ID_ADMIN = a.ID_ADMIN -ORDER BY p.NOMBRE_PRODUCTO; - --- Consulta detallada de pedidos con información completa -SELECT - ped.ID_PEDIDO, - c.NOMBRE_CLI as CLIENTE, - e.NOMBRE_EMPLEADO as EMPLEADO, - ep.NOMBRE_ESTADO as ESTADO, - ped.FECHA_INGRESO, - ped.FECHA_ENTREGA, - p.NOMBRE_PRODUCTO, - dp.CANTIDAD_PRODUCTO, - dp.PRECIO_UNITARIO, - dp.SUBTOTAL -FROM Pedidos ped -INNER JOIN Clientes c ON ped.ID_CLIENTE = c.ID_CLIENTE -INNER JOIN Empleados e ON ped.ID_EMPLEADO = e.ID_EMPLEADO -INNER JOIN Estado_Pedidos ep ON ped.ID_ESTADO_PEDIDO = ep.ID_ESTADO_PEDIDO -INNER JOIN Detalle_Pedidos dp ON ped.ID_PEDIDO = dp.ID_PEDIDO -INNER JOIN Productos p ON dp.ID_PRODUCTO = p.ID_PRODUCTO -ORDER BY ped.ID_PEDIDO, dp.ID_DETALLE; - --- ================================================================== --- CONSULTAS DE VERIFICACIÓN DE SEGURIDAD --- ================================================================== - --- Verificación del hasheo de contraseñas de administradores -SELECT - ID_ADMIN, - NOMBRE_ADMIN, - SALT_ADMIN, - CONTRASEÑA_ADMIN, - LENGTH(CONTRASEÑA_ADMIN) as LONGITUD_HASH -FROM Administradores; - --- Verificación del hasheo de contraseñas de clientes - -SELECT - ID_CLIENTE, - NOMBRE_CLI, - SALT_CLI, - CONTRASEÑA_CLI, - LENGTH(CONTRASEÑA_CLI) as LONGITUD_HASH -FROM Clientes; - --- Verificación del hasheo de contraseñas de empleados - -SELECT - ID_EMPLEADO, - NOMBRE_EMPLEADO, - SALT_EMPLEADO, - CONTRASEÑA_EMPLEADO, - LENGTH(CONTRASEÑA_EMPLEADO) as LONGITUD_HASH -FROM Empleados; - --- Consulta consolidada de todas las contraseñas hasheadas - -SELECT 'ADMIN' as TIPO, NOMBRE_ADMIN as NOMBRE, SALT_ADMIN as SALT, CONTRASEÑA_ADMIN as HASH -FROM Administradores -WHERE CONTRASEÑA_ADMIN IS NOT NULL - -UNION ALL - -SELECT 'CLIENTE' as TIPO, NOMBRE_CLI as NOMBRE, SALT_CLI as SALT, CONTRASEÑA_CLI as HASH -FROM Clientes -WHERE CONTRASEÑA_CLI IS NOT NULL - -UNION ALL - -SELECT 'EMPLEADO' as TIPO, NOMBRE_EMPLEADO as NOMBRE, SALT_EMPLEADO as SALT, CONTRASEÑA_EMPLEADO as HASH -FROM Empleados -WHERE CONTRASEÑA_EMPLEADO IS NOT NULL; - - --- ================================================================== --- PRUEBAS Y VALIDACIONES --- ================================================================== - --- Prueba de trigger de actualización de fecha de modificación -UPDATE Productos -SET PRECIO_PRODUCTO = 3800.00 -WHERE NOMBRE_PRODUCTO = 'Tamales Tolimenses'; - --- Verificación de la actualización de fecha de modificación -SELECT - NOMBRE_PRODUCTO, - PRECIO_PRODUCTO, - FECHA_ULTIMA_MODIFICACION -FROM Productos -WHERE NOMBRE_PRODUCTO = 'Tamales Tolimenses'; - --- Pruebas de procedimientos almacenados -CALL sp_productos_por_categoria('Pan'); -CALL sp_productos_por_categoria('Torta'); -CALL sp_productos_por_categoria('Yogur'); - --- Prueba de creación de nuevo pedido -CALL sp_crear_pedido(1, 2, '2025-06-25 16:00:00'); - --- ================================================================== --- VERIFICACIONES FINALES DEL SISTEMA --- ================================================================== - --- Verificar triggers creados -SHOW TRIGGERS WHERE `Table` IN ('Productos', 'Detalle_Pedidos'); - --- Verificar procedimientos almacenados creados -SHOW PROCEDURE STATUS WHERE Name LIKE 'sp_%'; - --- Verificar funciones creadas -SHOW FUNCTION STATUS WHERE Name LIKE '%Password%' OR Name LIKE '%Salt%'; - --- Verificar estructura de las tablas principales -DESCRIBE Productos; -DESCRIBE Pedidos; -DESCRIBE Detalle_Pedidos; - --- Script para actualizar estados de pedidos --- Ejecutar solo si es necesario ajustar los estados - --- Verificar estados existentes -SELECT * FROM Estado_Pedidos; - --- Si necesitas ajustar los estados, puedes usar estas consultas: --- UPDATE Estado_Pedidos SET NOMBRE_ESTADO = 'Pendiente' WHERE ID_ESTADO_PEDIDO = 1; --- UPDATE Estado_Pedidos SET NOMBRE_ESTADO = 'En Preparación' WHERE ID_ESTADO_PEDIDO = 2; --- UPDATE Estado_Pedidos SET NOMBRE_ESTADO = 'Listo' WHERE ID_ESTADO_PEDIDO = 3; --- UPDATE Estado_Pedidos SET NOMBRE_ESTADO = 'Entregado' WHERE ID_ESTADO_PEDIDO = 4; --- UPDATE Estado_Pedidos SET NOMBRE_ESTADO = 'Cancelado' WHERE ID_ESTADO_PEDIDO = 5; - --- O insertar si no existen: --- INSERT INTO Estado_Pedidos (NOMBRE_ESTADO) VALUES --- ('Pendiente'), --- ('En Preparación'), --- ('Listo'), --- ('Entregado'), --- ('Cancelado'); - --- ================================================================== --- MIGRACIONES Y ACTUALIZACIONES DEL SISTEMA --- ================================================================== - --- ================================================================== --- MIGRACIÓN: ACTUALIZAR TIPO DE DATO PRECIO_PRODUCTO --- ================================================================== --- NOTA: Solo ejecutar si la base de datos ya existe y necesita actualización --- Descomentar las siguientes líneas para migrar una base de datos existente: - -<> --- Actualizar tipo de dato de PRECIO_PRODUCTO de INT a DECIMAL -ALTER TABLE Productos MODIFY COLUMN PRECIO_PRODUCTO DECIMAL(10,2) NOT NULL; - --- Verificar la estructura actualizada -DESCRIBE Productos; -<> - --- ================================================================== --- VERIFICACIÓN Y CREACIÓN DE TABLA DE LOGS --- ================================================================== --- Script para verificar y crear tabla productos_logs si no existe - --- Verificar si la tabla productos_logs existe -SET @table_exists = ( - SELECT COUNT(*) - FROM information_schema.tables - WHERE table_schema = DATABASE() - AND table_name = 'productos_logs' -); - --- Crear tabla productos_logs si no existe (para bases de datos existentes) -SET @sql = IF(@table_exists = 0, - 'CREATE TABLE productos_logs ( - id INT PRIMARY KEY AUTO_INCREMENT, - producto_id INT NOT NULL, - tipo_cambio ENUM(''precio'', ''stock'', ''activacion'', ''desactivacion'') NOT NULL, - valor_anterior VARCHAR(50), - valor_nuevo VARCHAR(50), - usuario_id INT, - usuario_tipo ENUM(''admin'', ''empleado'') DEFAULT ''admin'', - fecha_cambio TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - ip_usuario VARCHAR(45), - INDEX idx_producto_logs_fecha (fecha_cambio), - INDEX idx_producto_logs_producto (producto_id), - INDEX idx_producto_logs_tipo (tipo_cambio), - CONSTRAINT FK_PRODUCTO_LOG - FOREIGN KEY (producto_id) REFERENCES Productos(ID_PRODUCTO) ON DELETE CASCADE - )', - 'SELECT ''Tabla productos_logs ya existe'' as mensaje' -); - -PREPARE stmt FROM @sql; -EXECUTE stmt; -DEALLOCATE PREPARE stmt; - --- ================================================================== --- VERIFICACIÓN Y CREACIÓN DE TRIGGER --- ================================================================== --- Script para verificar y crear trigger si no existe - --- Verificar si el trigger existe -SET @trigger_exists = ( - SELECT COUNT(*) - FROM information_schema.triggers - WHERE trigger_schema = DATABASE() - AND trigger_name = 'tr_actualizar_fecha_producto' -); - --- Crear trigger si no existe -SET @sql_trigger = IF(@trigger_exists = 0, - 'CREATE TRIGGER tr_actualizar_fecha_producto - BEFORE UPDATE ON Productos - FOR EACH ROW - BEGIN - SET NEW.FECHA_ULTIMA_MODIFICACION = CURRENT_TIMESTAMP; - END', - 'SELECT ''Trigger tr_actualizar_fecha_producto ya existe'' as mensaje' -); - -PREPARE stmt_trigger FROM @sql_trigger; -EXECUTE stmt_trigger; -DEALLOCATE PREPARE stmt_trigger; - --- ================================================================== --- CONSULTAS DE MANTENIMIENTO Y VERIFICACIÓN --- ================================================================== - --- Verificar estructura de tabla Productos -SELECT - COLUMN_NAME as 'Campo', - COLUMN_TYPE as 'Tipo', - IS_NULLABLE as 'Nulo', - COLUMN_DEFAULT as 'Por_Defecto', - EXTRA as 'Extra' -FROM information_schema.COLUMNS -WHERE TABLE_SCHEMA = DATABASE() -AND TABLE_NAME = 'Productos' -ORDER BY ORDINAL_POSITION; - --- Verificar existencia de tabla productos_logs -SELECT - TABLE_NAME as 'Tabla', - TABLE_ROWS as 'Filas', - CREATE_TIME as 'Fecha_Creacion' -FROM information_schema.TABLES -WHERE TABLE_SCHEMA = DATABASE() -AND TABLE_NAME IN ('Productos', 'productos_logs'); - --- Verificar triggers relacionados con Productos -SELECT - TRIGGER_NAME as 'Trigger', - EVENT_MANIPULATION as 'Evento', - EVENT_OBJECT_TABLE as 'Tabla', - TRIGGER_BODY as 'Accion' -FROM information_schema.TRIGGERS -WHERE TRIGGER_SCHEMA = DATABASE() -AND EVENT_OBJECT_TABLE = 'Productos'; - --- Verificar índices de la tabla productos_logs -SELECT - INDEX_NAME as 'Indice', - COLUMN_NAME as 'Columna', - NON_UNIQUE as 'No_Unico' -FROM information_schema.STATISTICS -WHERE TABLE_SCHEMA = DATABASE() -AND TABLE_NAME = 'productos_logs' -ORDER BY INDEX_NAME, SEQ_IN_INDEX; - --- ================================================================== --- CONSULTAS DE PRUEBA PARA LOGS --- ================================================================== - --- Consulta para ver logs recientes (ejecutar después de hacer cambios) --- SELECT * FROM productos_logs ORDER BY fecha_cambio DESC LIMIT 10; - --- Consulta para ver cambios de un producto específico --- SELECT --- pl.*, --- p.NOMBRE_PRODUCTO --- FROM productos_logs pl --- JOIN Productos p ON pl.producto_id = p.ID_PRODUCTO --- WHERE pl.producto_id = 1 --- ORDER BY pl.fecha_cambio DESC; - --- Consulta para ver estadísticas de cambios --- SELECT --- tipo_cambio, --- COUNT(*) as total_cambios, --- DATE(fecha_cambio) as fecha --- FROM productos_logs --- GROUP BY tipo_cambio, DATE(fecha_cambio) --- ORDER BY fecha DESC, tipo_cambio; - --- ================================================================== --- SCRIPT DE LIMPIEZA (OPCIONAL) --- ================================================================== - --- Limpiar logs antiguos (ejecutar solo si es necesario) --- DELETE FROM productos_logs WHERE fecha_cambio < DATE_SUB(NOW(), INTERVAL 90 DAY); - --- Resetear AUTO_INCREMENT de la tabla logs --- ALTER TABLE productos_logs AUTO_INCREMENT = 1; - --- ============================================================ --- MIGRACIÓN: Agregar columna FECHA_REGISTRO a tabla Empleados --- ============================================================ - --- Verificar y agregar columna FECHA_REGISTRO a la tabla Empleados si no existe -SET @sql = (SELECT IF( - (SELECT COUNT(*) FROM information_schema.COLUMNS - WHERE TABLE_SCHEMA = DATABASE() - AND TABLE_NAME = 'Empleados' - AND COLUMN_NAME = 'FECHA_REGISTRO') = 0, - 'ALTER TABLE Empleados ADD COLUMN FECHA_REGISTRO TIMESTAMP DEFAULT CURRENT_TIMESTAMP', - 'SELECT "La columna FECHA_REGISTRO ya existe en la tabla Empleados" as mensaje' -)); - -PREPARE stmt FROM @sql; -EXECUTE stmt; -DEALLOCATE PREPARE stmt; - --- ============================================================ --- MIGRACIÓN: Agregar columna DESCRIPCION_PRODUCTO a tabla Productos --- ============================================================ - --- Verificar y agregar columna DESCRIPCION_PRODUCTO a la tabla Productos si no existe -SET @sql = (SELECT IF( - (SELECT COUNT(*) FROM information_schema.COLUMNS - WHERE TABLE_SCHEMA = DATABASE() - AND TABLE_NAME = 'Productos' - AND COLUMN_NAME = 'DESCRIPCION_PRODUCTO') = 0, - 'ALTER TABLE Productos ADD COLUMN DESCRIPCION_PRODUCTO TEXT AFTER NOMBRE_PRODUCTO', - 'SELECT "La columna DESCRIPCION_PRODUCTO ya existe en la tabla Productos" as mensaje' -)); - -PREPARE stmt FROM @sql; -EXECUTE stmt; -DEALLOCATE PREPARE stmt; - --- ================================================================== --- VERIFICACIÓN DE ESTRUCTURA FINAL --- ================================================================== - --- Verificar que todas las tablas principales existen -SELECT - TABLE_NAME as 'Tabla_Existente' -FROM information_schema.TABLES -WHERE TABLE_SCHEMA = DATABASE() -AND TABLE_NAME IN ('Productos', 'Detalle_Pedidos', 'Pedidos', 'Empleados', 'Clientes', 'Administradores') -ORDER BY TABLE_NAME; - --- Verificar estructura de tabla Productos (debe incluir DESCRIPCION_PRODUCTO) -SELECT - COLUMN_NAME as 'Columna', - DATA_TYPE as 'Tipo', - IS_NULLABLE as 'Permite_NULL' -FROM information_schema.COLUMNS -WHERE TABLE_SCHEMA = DATABASE() -AND TABLE_NAME = 'Productos' -ORDER BY ORDINAL_POSITION; - --- Verificar estructura de tabla Detalle_Pedidos (debe tener solo columnas esenciales) -SELECT - COLUMN_NAME as 'Columna', - DATA_TYPE as 'Tipo', - IS_NULLABLE as 'Permite_NULL' -FROM information_schema.COLUMNS -WHERE TABLE_SCHEMA = DATABASE() -AND TABLE_NAME = 'Detalle_Pedidos' -ORDER BY ORDINAL_POSITION; - --- ================================================================== --- FIN DE ACTUALIZACIONES DEL SISTEMA --- ================================================================== - -COMMIT; diff --git a/Pan&Code/frontend/public/images/992710.png b/Pan&Code/frontend/public/images/992710.png deleted file mode 100644 index 1dade7e..0000000 Binary files a/Pan&Code/frontend/public/images/992710.png and /dev/null differ diff --git a/Pan&Code/frontend/public/images/PAN-INTEGRAL.jpg b/Pan&Code/frontend/public/images/PAN-INTEGRAL.jpg deleted file mode 100644 index 879660a..0000000 Binary files a/Pan&Code/frontend/public/images/PAN-INTEGRAL.jpg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/Pan1.jpg b/Pan&Code/frontend/public/images/Pan1.jpg deleted file mode 100644 index dd4bfca..0000000 Binary files a/Pan&Code/frontend/public/images/Pan1.jpg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/arequipe-alpina.png b/Pan&Code/frontend/public/images/arequipe-alpina.png deleted file mode 100644 index 508908f..0000000 Binary files a/Pan&Code/frontend/public/images/arequipe-alpina.png and /dev/null differ diff --git a/Pan&Code/frontend/public/images/baguette.jpg b/Pan&Code/frontend/public/images/baguette.jpg deleted file mode 100644 index 5121398..0000000 Binary files a/Pan&Code/frontend/public/images/baguette.jpg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/brazoreina1.jpg b/Pan&Code/frontend/public/images/brazoreina1.jpg deleted file mode 100644 index 5183e0a..0000000 Binary files a/Pan&Code/frontend/public/images/brazoreina1.jpg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/browni-con-nueces.jpg b/Pan&Code/frontend/public/images/browni-con-nueces.jpg deleted file mode 100644 index 2d6b6f2..0000000 Binary files a/Pan&Code/frontend/public/images/browni-con-nueces.jpg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/brownie1.jpg b/Pan&Code/frontend/public/images/brownie1.jpg deleted file mode 100644 index 0ecee86..0000000 Binary files a/Pan&Code/frontend/public/images/brownie1.jpg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/cheesecake-frutos-rojos.jpg b/Pan&Code/frontend/public/images/cheesecake-frutos-rojos.jpg deleted file mode 100644 index 36ebc57..0000000 Binary files a/Pan&Code/frontend/public/images/cheesecake-frutos-rojos.jpg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/chicharrona.png b/Pan&Code/frontend/public/images/chicharrona.png deleted file mode 100644 index 23b7561..0000000 Binary files a/Pan&Code/frontend/public/images/chicharrona.png and /dev/null differ diff --git a/Pan&Code/frontend/public/images/croissant1.jpg b/Pan&Code/frontend/public/images/croissant1.jpg deleted file mode 100644 index 0f3c958..0000000 Binary files a/Pan&Code/frontend/public/images/croissant1.jpg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/croissants.jpg b/Pan&Code/frontend/public/images/croissants.jpg deleted file mode 100644 index 2ffc6b8..0000000 Binary files a/Pan&Code/frontend/public/images/croissants.jpg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/empanadas.png b/Pan&Code/frontend/public/images/empanadas.png deleted file mode 100644 index 268d546..0000000 Binary files a/Pan&Code/frontend/public/images/empanadas.png and /dev/null differ diff --git a/Pan&Code/frontend/public/images/flan de caramelo.jpeg b/Pan&Code/frontend/public/images/flan de caramelo.jpeg deleted file mode 100644 index 39d4910..0000000 Binary files a/Pan&Code/frontend/public/images/flan de caramelo.jpeg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/galleta avena.jpeg b/Pan&Code/frontend/public/images/galleta avena.jpeg deleted file mode 100644 index b5d648b..0000000 Binary files a/Pan&Code/frontend/public/images/galleta avena.jpeg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/galleta chocolate.jpeg b/Pan&Code/frontend/public/images/galleta chocolate.jpeg deleted file mode 100644 index 05fce90..0000000 Binary files a/Pan&Code/frontend/public/images/galleta chocolate.jpeg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/galleta integral.jpeg b/Pan&Code/frontend/public/images/galleta integral.jpeg deleted file mode 100644 index 2f71315..0000000 Binary files a/Pan&Code/frontend/public/images/galleta integral.jpeg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/galleta mantequilla.jpeg b/Pan&Code/frontend/public/images/galleta mantequilla.jpeg deleted file mode 100644 index 8d1d193..0000000 Binary files a/Pan&Code/frontend/public/images/galleta mantequilla.jpeg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/galleta vainilla.jpeg b/Pan&Code/frontend/public/images/galleta vainilla.jpeg deleted file mode 100644 index f2d6d98..0000000 Binary files a/Pan&Code/frontend/public/images/galleta vainilla.jpeg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/galleta1.jpg b/Pan&Code/frontend/public/images/galleta1.jpg deleted file mode 100644 index dba5b74..0000000 Binary files a/Pan&Code/frontend/public/images/galleta1.jpg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/galletas-de-avena-con-pasas-y-nuez.jpg b/Pan&Code/frontend/public/images/galletas-de-avena-con-pasas-y-nuez.jpg deleted file mode 100644 index 89cb9c3..0000000 Binary files a/Pan&Code/frontend/public/images/galletas-de-avena-con-pasas-y-nuez.jpg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/galletasmantequilla.jpg b/Pan&Code/frontend/public/images/galletasmantequilla.jpg deleted file mode 100644 index 338de8e..0000000 Binary files a/Pan&Code/frontend/public/images/galletasmantequilla.jpg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/galletatresojos.png b/Pan&Code/frontend/public/images/galletatresojos.png deleted file mode 100644 index d616ab7..0000000 Binary files a/Pan&Code/frontend/public/images/galletatresojos.png and /dev/null differ diff --git a/Pan&Code/frontend/public/images/hojaldre bocadillo.jpeg b/Pan&Code/frontend/public/images/hojaldre bocadillo.jpeg deleted file mode 100644 index c9db65d..0000000 Binary files a/Pan&Code/frontend/public/images/hojaldre bocadillo.jpeg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/hojaldre pollo.jpeg b/Pan&Code/frontend/public/images/hojaldre pollo.jpeg deleted file mode 100644 index 3182845..0000000 Binary files a/Pan&Code/frontend/public/images/hojaldre pollo.jpeg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/hojaldre queso.jpeg b/Pan&Code/frontend/public/images/hojaldre queso.jpeg deleted file mode 100644 index 7b42ddc..0000000 Binary files a/Pan&Code/frontend/public/images/hojaldre queso.jpeg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/hojaldre1.jpg b/Pan&Code/frontend/public/images/hojaldre1.jpg deleted file mode 100644 index 288ac40..0000000 Binary files a/Pan&Code/frontend/public/images/hojaldre1.jpg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/iconoboton1.jpg b/Pan&Code/frontend/public/images/iconoboton1.jpg deleted file mode 100644 index a04dc73..0000000 Binary files a/Pan&Code/frontend/public/images/iconoboton1.jpg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/jugo.jpg b/Pan&Code/frontend/public/images/jugo.jpg deleted file mode 100644 index 4b790b2..0000000 Binary files a/Pan&Code/frontend/public/images/jugo.jpg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/kumiss.1.png b/Pan&Code/frontend/public/images/kumiss.1.png deleted file mode 100644 index 64c516b..0000000 Binary files a/Pan&Code/frontend/public/images/kumiss.1.png and /dev/null differ diff --git a/Pan&Code/frontend/public/images/logo proyecto.jpeg b/Pan&Code/frontend/public/images/logo proyecto.jpeg deleted file mode 100644 index 0026376..0000000 Binary files a/Pan&Code/frontend/public/images/logo proyecto.jpeg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/logoprincipal.jpg b/Pan&Code/frontend/public/images/logoprincipal.jpg deleted file mode 100644 index 0026376..0000000 Binary files a/Pan&Code/frontend/public/images/logoprincipal.jpg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/merengon.jpeg b/Pan&Code/frontend/public/images/merengon.jpeg deleted file mode 100644 index 59b10b6..0000000 Binary files a/Pan&Code/frontend/public/images/merengon.jpeg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/milhoja.jpeg b/Pan&Code/frontend/public/images/milhoja.jpeg deleted file mode 100644 index 34ff6ef..0000000 Binary files a/Pan&Code/frontend/public/images/milhoja.jpeg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/miloha_de_arequipe.jpg b/Pan&Code/frontend/public/images/miloha_de_arequipe.jpg deleted file mode 100644 index 2b5bb4e..0000000 Binary files a/Pan&Code/frontend/public/images/miloha_de_arequipe.jpg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/muffins1.jpg b/Pan&Code/frontend/public/images/muffins1.jpg deleted file mode 100644 index 8b5766b..0000000 Binary files a/Pan&Code/frontend/public/images/muffins1.jpg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/napoleon.jpeg b/Pan&Code/frontend/public/images/napoleon.jpeg deleted file mode 100644 index af1f734..0000000 Binary files a/Pan&Code/frontend/public/images/napoleon.jpeg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/naranja.jpg b/Pan&Code/frontend/public/images/naranja.jpg deleted file mode 100644 index 49e6a48..0000000 Binary files a/Pan&Code/frontend/public/images/naranja.jpg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/naranjaponque.jpg b/Pan&Code/frontend/public/images/naranjaponque.jpg deleted file mode 100644 index f4ed502..0000000 Binary files a/Pan&Code/frontend/public/images/naranjaponque.jpg and /dev/null differ diff --git "a/Pan&Code/frontend/public/images/pan alin\314\203ado.jpeg" "b/Pan&Code/frontend/public/images/pan alin\314\203ado.jpeg" deleted file mode 100644 index c997f05..0000000 Binary files "a/Pan&Code/frontend/public/images/pan alin\314\203ado.jpeg" and /dev/null differ diff --git a/Pan&Code/frontend/public/images/pan blandito .jpeg b/Pan&Code/frontend/public/images/pan blandito .jpeg deleted file mode 100644 index f00869c..0000000 Binary files a/Pan&Code/frontend/public/images/pan blandito .jpeg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/pan campesino.jpeg b/Pan&Code/frontend/public/images/pan campesino.jpeg deleted file mode 100644 index fb1454c..0000000 Binary files a/Pan&Code/frontend/public/images/pan campesino.jpeg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/pan coco.jpeg b/Pan&Code/frontend/public/images/pan coco.jpeg deleted file mode 100644 index 941fa72..0000000 Binary files a/Pan&Code/frontend/public/images/pan coco.jpeg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/pan frances.jpeg b/Pan&Code/frontend/public/images/pan frances.jpeg deleted file mode 100644 index 3c7ec0f..0000000 Binary files a/Pan&Code/frontend/public/images/pan frances.jpeg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/pan maiz.jpeg b/Pan&Code/frontend/public/images/pan maiz.jpeg deleted file mode 100644 index 2c63dae..0000000 Binary files a/Pan&Code/frontend/public/images/pan maiz.jpeg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/pan queso.jpeg b/Pan&Code/frontend/public/images/pan queso.jpeg deleted file mode 100644 index 7f04f23..0000000 Binary files a/Pan&Code/frontend/public/images/pan queso.jpeg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/pan rollo.jpeg b/Pan&Code/frontend/public/images/pan rollo.jpeg deleted file mode 100644 index 4bb0829..0000000 Binary files a/Pan&Code/frontend/public/images/pan rollo.jpeg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/pan-con-masa-madre-.jpg b/Pan&Code/frontend/public/images/pan-con-masa-madre-.jpg deleted file mode 100644 index c5ddfe0..0000000 Binary files a/Pan&Code/frontend/public/images/pan-con-masa-madre-.jpg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/pan-de-molde.jpg b/Pan&Code/frontend/public/images/pan-de-molde.jpg deleted file mode 100644 index c934fc2..0000000 Binary files a/Pan&Code/frontend/public/images/pan-de-molde.jpg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/pan-rtzqhi1ok4k1bxlo.jpg b/Pan&Code/frontend/public/images/pan-rtzqhi1ok4k1bxlo.jpg deleted file mode 100644 index 5e48815..0000000 Binary files a/Pan&Code/frontend/public/images/pan-rtzqhi1ok4k1bxlo.jpg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/panabuela1.jpg b/Pan&Code/frontend/public/images/panabuela1.jpg deleted file mode 100644 index 87ef700..0000000 Binary files a/Pan&Code/frontend/public/images/panabuela1.jpg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/panbaguette1.jpg b/Pan&Code/frontend/public/images/panbaguette1.jpg deleted file mode 100644 index 5ff2ab2..0000000 Binary files a/Pan&Code/frontend/public/images/panbaguette1.jpg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/panblando.jpeg b/Pan&Code/frontend/public/images/panblando.jpeg deleted file mode 100644 index 29e595a..0000000 Binary files a/Pan&Code/frontend/public/images/panblando.jpeg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/pancampesino.png b/Pan&Code/frontend/public/images/pancampesino.png deleted file mode 100644 index a3b9481..0000000 Binary files a/Pan&Code/frontend/public/images/pancampesino.png and /dev/null differ diff --git a/Pan&Code/frontend/public/images/pandebono.jpeg b/Pan&Code/frontend/public/images/pandebono.jpeg deleted file mode 100644 index 49e7df1..0000000 Binary files a/Pan&Code/frontend/public/images/pandebono.jpeg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/pandebono.png b/Pan&Code/frontend/public/images/pandebono.png deleted file mode 100644 index 4cc61dd..0000000 Binary files a/Pan&Code/frontend/public/images/pandebono.png and /dev/null differ diff --git a/Pan&Code/frontend/public/images/pangrande1.jpg b/Pan&Code/frontend/public/images/pangrande1.jpg deleted file mode 100644 index cd2c2ab..0000000 Binary files a/Pan&Code/frontend/public/images/pangrande1.jpg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/panhamburguesa.jpg b/Pan&Code/frontend/public/images/panhamburguesa.jpg deleted file mode 100644 index 9cd6656..0000000 Binary files a/Pan&Code/frontend/public/images/panhamburguesa.jpg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/pantrenza.jpg b/Pan&Code/frontend/public/images/pantrenza.jpg deleted file mode 100644 index b18b142..0000000 Binary files a/Pan&Code/frontend/public/images/pantrenza.jpg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/panunidad1.jpg b/Pan&Code/frontend/public/images/panunidad1.jpg deleted file mode 100644 index e7e4f31..0000000 Binary files a/Pan&Code/frontend/public/images/panunidad1.jpg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/panunidad2.jpg b/Pan&Code/frontend/public/images/panunidad2.jpg deleted file mode 100644 index 051ad0d..0000000 Binary files a/Pan&Code/frontend/public/images/panunidad2.jpg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/pastel carne.jpeg b/Pan&Code/frontend/public/images/pastel carne.jpeg deleted file mode 100644 index 8f14805..0000000 Binary files a/Pan&Code/frontend/public/images/pastel carne.jpeg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/ponquenaranja.png b/Pan&Code/frontend/public/images/ponquenaranja.png deleted file mode 100644 index b2f3ba2..0000000 Binary files a/Pan&Code/frontend/public/images/ponquenaranja.png and /dev/null differ diff --git a/Pan&Code/frontend/public/images/postreleche.jpg b/Pan&Code/frontend/public/images/postreleche.jpg deleted file mode 100644 index e6ce8bc..0000000 Binary files a/Pan&Code/frontend/public/images/postreleche.jpg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/tamal de pollo .jpeg b/Pan&Code/frontend/public/images/tamal de pollo .jpeg deleted file mode 100644 index 5cf6a5b..0000000 Binary files a/Pan&Code/frontend/public/images/tamal de pollo .jpeg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/tamal santandereano .jpeg b/Pan&Code/frontend/public/images/tamal santandereano .jpeg deleted file mode 100644 index de8911d..0000000 Binary files a/Pan&Code/frontend/public/images/tamal santandereano .jpeg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/tamal tolimense.jpeg b/Pan&Code/frontend/public/images/tamal tolimense.jpeg deleted file mode 100644 index 112b376..0000000 Binary files a/Pan&Code/frontend/public/images/tamal tolimense.jpeg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/tamal1.jpg b/Pan&Code/frontend/public/images/tamal1.jpg deleted file mode 100644 index b9aa2fa..0000000 Binary files a/Pan&Code/frontend/public/images/tamal1.jpg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/tamales.jpg b/Pan&Code/frontend/public/images/tamales.jpg deleted file mode 100644 index b8b8d92..0000000 Binary files a/Pan&Code/frontend/public/images/tamales.jpg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/torta chocolate.jpeg b/Pan&Code/frontend/public/images/torta chocolate.jpeg deleted file mode 100644 index 01800c2..0000000 Binary files a/Pan&Code/frontend/public/images/torta chocolate.jpeg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/torta tres leches.jpeg b/Pan&Code/frontend/public/images/torta tres leches.jpeg deleted file mode 100644 index 6406f12..0000000 Binary files a/Pan&Code/frontend/public/images/torta tres leches.jpeg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/torta zanahoria.jpeg b/Pan&Code/frontend/public/images/torta zanahoria.jpeg deleted file mode 100644 index 0e71597..0000000 Binary files a/Pan&Code/frontend/public/images/torta zanahoria.jpeg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/torta1.jpg b/Pan&Code/frontend/public/images/torta1.jpg deleted file mode 100644 index d457539..0000000 Binary files a/Pan&Code/frontend/public/images/torta1.jpg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/torta2.jpg b/Pan&Code/frontend/public/images/torta2.jpg deleted file mode 100644 index b04e62f..0000000 Binary files a/Pan&Code/frontend/public/images/torta2.jpg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/tortachocolate.jpg b/Pan&Code/frontend/public/images/tortachocolate.jpg deleted file mode 100644 index 18ca9b6..0000000 Binary files a/Pan&Code/frontend/public/images/tortachocolate.jpg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/tortatresleches.png b/Pan&Code/frontend/public/images/tortatresleches.png deleted file mode 100644 index 72fa823..0000000 Binary files a/Pan&Code/frontend/public/images/tortatresleches.png and /dev/null differ diff --git a/Pan&Code/frontend/public/images/tres leches vaso .jpeg b/Pan&Code/frontend/public/images/tres leches vaso .jpeg deleted file mode 100644 index ff39005..0000000 Binary files a/Pan&Code/frontend/public/images/tres leches vaso .jpeg and /dev/null differ diff --git a/Pan&Code/frontend/public/images/yogurt1.jpg b/Pan&Code/frontend/public/images/yogurt1.jpg deleted file mode 100644 index 3d4c174..0000000 Binary files a/Pan&Code/frontend/public/images/yogurt1.jpg and /dev/null differ diff --git a/api-reportes/reportes_clientes.php b/api-reportes/reportes_clientes.php deleted file mode 100644 index 1f54916..0000000 --- a/api-reportes/reportes_clientes.php +++ /dev/null @@ -1,17 +0,0 @@ - diff --git a/api-reportes/reportes_usuarios.php b/api-reportes/reportes_usuarios.php deleted file mode 100644 index eb523cf..0000000 --- a/api-reportes/reportes_usuarios.php +++ /dev/null @@ -1,34 +0,0 @@ -nombre . " | " . - $usuario->email . " | " . - $usuario->telefono . " | " . - $usuario->rol . "\n"; -} - -$nombreBuscar = readline("Ingrese el nombre del usuario para ver detalles: "); - -echo "\n RESULTADO DE LA BÚSQUEDA \n"; -$encontrado = false; - -foreach ($usuarios as $usuario) { - if ($usuario->nombre == $nombreBuscar) { - echo "nombre: " . $usuario->nombre . "\n"; - echo "email: " . $usuario->email . "\n"; - echo "telefono: " . $usuario->telefono . "\n"; - echo "rol: " . $usuario->rol . "\n"; - $encontrado = true; - } -} -?> diff --git a/api-reportes/reportes_ventas.php b/api-reportes/reportes_ventas.php deleted file mode 100644 index 7dab141..0000000 --- a/api-reportes/reportes_ventas.php +++ /dev/null @@ -1,37 +0,0 @@ -idFactura . " | " . - $venta->idCliente . " | " . - $venta->idPedido . " | " . - $venta->fechaFacturacion . " | " . - $venta->totalFactura . "\n"; -} - -$idBuscar = readline("Ingrese el ID de la factura que desea ver en detalle: "); - -echo "\n RESULTADO DE LA BÚSQUEDA \n"; -$encontrado = false; - -foreach ($ventas as $venta) { - if ($venta->idFactura == $idBuscar) { - echo "ID Factura: " . $venta->idFactura . "\n"; - echo "ID Cliente: " . $venta->idCliente . "\n"; - echo "ID Pedido: " . $venta->idPedido . "\n"; - echo "Fecha Facturación: " . $venta->fechaFacturacion . "\n"; - echo "Total Factura: " . $venta->totalFactura . "\n"; - $encontrado = true; - } -} -?> diff --git a/api_/Proyecto/.idea/.gitignore b/api_/Proyecto/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/api_/Proyecto/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/api_/Proyecto/.idea/compiler.xml b/api_/Proyecto/.idea/compiler.xml new file mode 100644 index 0000000..2a36d5a --- /dev/null +++ b/api_/Proyecto/.idea/compiler.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/api_/Proyecto/.idea/encodings.xml b/api_/Proyecto/.idea/encodings.xml new file mode 100644 index 0000000..63e9001 --- /dev/null +++ b/api_/Proyecto/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/api_/Proyecto/.idea/jarRepositories.xml b/api_/Proyecto/.idea/jarRepositories.xml new file mode 100644 index 0000000..712ab9d --- /dev/null +++ b/api_/Proyecto/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/api_/Proyecto/.idea/misc.xml b/api_/Proyecto/.idea/misc.xml new file mode 100644 index 0000000..81caee1 --- /dev/null +++ b/api_/Proyecto/.idea/misc.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/api_/Proyecto/.idea/vcs.xml b/api_/Proyecto/.idea/vcs.xml new file mode 100644 index 0000000..6c0b863 --- /dev/null +++ b/api_/Proyecto/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/api_/Proyecto/.vscode/settings.json b/api_/Proyecto/.vscode/settings.json new file mode 100644 index 0000000..b84f89c --- /dev/null +++ b/api_/Proyecto/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "java.configuration.updateBuildConfiguration": "interactive", + "java.compile.nullAnalysis.mode": "automatic" +} \ No newline at end of file diff --git a/api_/Proyecto/HELP.md b/api_/Proyecto/HELP.md new file mode 100644 index 0000000..ad507ad --- /dev/null +++ b/api_/Proyecto/HELP.md @@ -0,0 +1,25 @@ +# Getting Started + +### Reference Documentation +For further reference, please consider the following sections: + +* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html) +* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/3.5.4/maven-plugin) +* [Create an OCI image](https://docs.spring.io/spring-boot/3.5.4/maven-plugin/build-image.html) +* [Spring Web](https://docs.spring.io/spring-boot/3.5.4/reference/web/servlet.html) + +### Guides +The following guides illustrate how to use some features concretely: + +* [Accessing data with MySQL](https://spring.io/guides/gs/accessing-data-mysql/) +* [Building a RESTful Web Service](https://spring.io/guides/gs/rest-service/) +* [Serving Web Content with Spring MVC](https://spring.io/guides/gs/serving-web-content/) +* [Building REST services with Spring](https://spring.io/guides/tutorials/rest/) + +### Maven Parent overrides + +Due to Maven's design, elements are inherited from the parent POM to the project POM. +While most of the inheritance is fine, it also inherits unwanted elements like `` and `` from the parent. +To prevent this, the project POM contains empty overrides for these elements. +If you manually switch to a different parent and actually want the inheritance, you need to remove those overrides. + diff --git a/api_/Proyecto/PROYECTOPANADERIA.sql b/api_/Proyecto/PROYECTOPANADERIA.sql new file mode 100644 index 0000000..7d8f2c5 --- /dev/null +++ b/api_/Proyecto/PROYECTOPANADERIA.sql @@ -0,0 +1,456 @@ +-- ================================================================== +-- DDL (DATA DEFINITION LANGUAGE) - DEFINICIÓN DE ESTRUCTURA +-- ================================================================== + +DROP DATABASE IF EXISTS ProyectoPanaderia; +SET SQL_SAFE_UPDATES = 0; +CREATE DATABASE ProyectoPanaderia; +USE ProyectoPanaderia; +CREATE TABLE Clientes ( + ID_CLIENTE INT PRIMARY KEY AUTO_INCREMENT, + NOMBRE_CLI VARCHAR(100) NOT NULL, + TELEFONO_CLI VARCHAR(20), + ACTIVO_CLI BOOLEAN DEFAULT TRUE, + EMAIL_CLI VARCHAR(100), + CONTRASEÑA_CLI VARCHAR(255), + FECHA_ULTIMA_MODIFICACION TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP +); + +-- Tabla: Empleados +CREATE TABLE Empleados ( + ID_EMPLEADO INT PRIMARY KEY AUTO_INCREMENT, + NOMBRE_EMPLEADO VARCHAR(100) NOT NULL, + EMAIL_EMPLEADO VARCHAR(100), + ACTIVO_EMPLEADO BOOLEAN DEFAULT TRUE, + CONTRASEÑA_EMPLEADO VARCHAR(255), + FECHA_REGISTRO TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FECHA_ULTIMA_MODIFICACION TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP +); + +-- Tabla: Administradores +CREATE TABLE Administradores ( + ID_ADMIN INT PRIMARY KEY AUTO_INCREMENT, + NOMBRE_ADMIN VARCHAR(100) NOT NULL, + TELEFONO_ADMIN VARCHAR(20), + EMAIL_ADMIN VARCHAR(100), + CONTRASEÑA_ADMIN VARCHAR(255) +); + +-- Tabla: Proveedores +CREATE TABLE Proveedores ( + ID_PROVEEDOR INT PRIMARY KEY AUTO_INCREMENT, + NOMBRE_PROV VARCHAR(100) NOT NULL, + TELEFONO_PROV VARCHAR(20), + ACTIVO_PROV BOOLEAN DEFAULT TRUE, + EMAIL_PROV VARCHAR(100), + DIRECCION_PROV VARCHAR(200) +); + +-- Tabla: Pedidos_Proveedores - Almacena pedidos realizados a proveedores +CREATE TABLE Pedidos_Proveedores ( + ID_PEDIDO_PROV INT PRIMARY KEY AUTO_INCREMENT, + ID_PROVEEDOR INT NOT NULL, + NUMERO_PEDIDO INT NOT NULL, + FECHA_PEDIDO DATE NOT NULL, + ESTADO_PEDIDO VARCHAR(50) DEFAULT 'Pendiente', + CONSTRAINT FK_PEDIDO_PROVEEDOR + FOREIGN KEY (ID_PROVEEDOR) REFERENCES Proveedores(ID_PROVEEDOR) ON UPDATE CASCADE ON DELETE RESTRICT +); + +-- Tabla: Categoria_Productos - Almacena categorías de productos +CREATE TABLE Categoria_Productos ( + ID_CATEGORIA_PRODUCTO INT PRIMARY KEY AUTO_INCREMENT, + NOMBRE_CATEGORIAPRODUCTO VARCHAR(100) NOT NULL +); + +-- Tabla: Estado_Pedidos - Almacena estados de pedidos +CREATE TABLE Estado_Pedidos ( + ID_ESTADO_PEDIDO INT PRIMARY KEY AUTO_INCREMENT, + NOMBRE_ESTADO VARCHAR(50) +); + +-- Tabla: Categoria_Ingredientes +CREATE TABLE Categoria_Ingredientes ( + ID_CATEGORIA INT PRIMARY KEY AUTO_INCREMENT, + NOMBRE_CATEGORIA_INGREDIENTE VARCHAR(100) NOT NULL +); + +-- Tabla: Ingredientes +CREATE TABLE Ingredientes ( + ID_INGREDIENTE INT PRIMARY KEY AUTO_INCREMENT, + ID_PROVEEDOR INT, + ID_CATEGORIA INT, + NOMBRE_INGREDIENTE VARCHAR(100) NOT NULL, + CANTIDAD_INGREDIENTE INT, + FECHA_VENCIMIENTO DATE, + REFERENCIA_INGREDIENTE VARCHAR(100), + FECHA_ENTREGA_INGREDIENTE DATE, + CONSTRAINT FK_PROVEEDOR_INGREDIENTE + FOREIGN KEY (ID_PROVEEDOR) REFERENCES Proveedores(ID_PROVEEDOR) ON UPDATE CASCADE ON DELETE RESTRICT, + CONSTRAINT FK_CATEGORIA_INGREDIENTE + FOREIGN KEY (ID_CATEGORIA) REFERENCES Categoria_Ingredientes(ID_CATEGORIA) ON UPDATE CASCADE ON DELETE RESTRICT +); + +-- Tabla: Productos +CREATE TABLE Productos ( + ID_PRODUCTO INT PRIMARY KEY AUTO_INCREMENT, + ID_ADMIN INT, + ID_CATEGORIA_PRODUCTO INT, + NOMBRE_PRODUCTO VARCHAR(100) NOT NULL, + DESCRIPCION_PRODUCTO TEXT, + PRODUCTO_STOCK_MIN INT, + PRECIO_PRODUCTO DECIMAL(10,2) NOT NULL, + FECHA_VENCIMIENTO_PRODUCTO DATE, + FECHA_INGRESO_PRODUCTO DATE, + TIPO_PRODUCTO_MARCA VARCHAR(100), + ACTIVO BOOLEAN DEFAULT TRUE, + FECHA_ULTIMA_MODIFICACION TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + CONSTRAINT FK_CATEGORIA_PRODUCTO + FOREIGN KEY (ID_CATEGORIA_PRODUCTO) REFERENCES Categoria_Productos(ID_CATEGORIA_PRODUCTO) ON UPDATE CASCADE ON DELETE RESTRICT, + CONSTRAINT FK_ADMIN_PRODUCTO + FOREIGN KEY (ID_ADMIN) REFERENCES Administradores(ID_ADMIN) ON UPDATE CASCADE ON DELETE RESTRICT +); + +-- Tabla: Pedidos +CREATE TABLE Pedidos ( + ID_PEDIDO INT PRIMARY KEY AUTO_INCREMENT, + ID_CLIENTE INT, + ID_EMPLEADO INT, + ID_ESTADO_PEDIDO INT, + FECHA_INGRESO DATETIME, + FECHA_ENTREGA DATETIME, + TOTAL_PRODUCTO DECIMAL(10,2), + CONSTRAINT FK_CLIENTE_PEDIDO + FOREIGN KEY (ID_CLIENTE) REFERENCES Clientes(ID_CLIENTE) ON UPDATE CASCADE ON DELETE CASCADE, + CONSTRAINT FK_EMPLEADO_PEDIDO + FOREIGN KEY (ID_EMPLEADO) REFERENCES Empleados(ID_EMPLEADO) ON UPDATE CASCADE ON DELETE RESTRICT, + CONSTRAINT FK_ESTADO_PEDIDO_PEDIDO + FOREIGN KEY (ID_ESTADO_PEDIDO) REFERENCES Estado_Pedidos(ID_ESTADO_PEDIDO) ON UPDATE CASCADE ON DELETE RESTRICT +); + +-- Tabla: Detalle_Pedidos +CREATE TABLE Detalle_Pedidos ( + ID_DETALLE INT PRIMARY KEY AUTO_INCREMENT, + ID_PEDIDO INT NOT NULL, + ID_PRODUCTO INT NOT NULL, + CANTIDAD_PRODUCTO INT, + PRECIO_UNITARIO DECIMAL(10,2), + SUBTOTAL DECIMAL(10,2), + CONSTRAINT FK_DETALLE_PEDIDO + FOREIGN KEY (ID_PEDIDO) REFERENCES Pedidos(ID_PEDIDO) ON UPDATE CASCADE ON DELETE CASCADE, + CONSTRAINT FK_DETALLE_PRODUCTO + FOREIGN KEY (ID_PRODUCTO) REFERENCES Productos(ID_PRODUCTO) ON UPDATE CASCADE ON DELETE RESTRICT +); + +-- Tabla: Ordenes_Salida +CREATE TABLE Ordenes_Salida ( + ID_FACTURA INT PRIMARY KEY AUTO_INCREMENT, + ID_CLIENTE INT, + ID_PEDIDO INT, + FECHA_FACTURACION DATETIME, + TOTAL_FACTURA DECIMAL(10,2), + CONSTRAINT FK_ORDENSALIDA_CLIENTE + FOREIGN KEY (ID_CLIENTE) REFERENCES Clientes(ID_CLIENTE) ON UPDATE CASCADE ON DELETE CASCADE, + CONSTRAINT FK_ORDENSALIDA_PEDIDO + FOREIGN KEY (ID_PEDIDO) REFERENCES Pedidos(ID_PEDIDO) ON UPDATE CASCADE ON DELETE CASCADE +); + +-- Función: HashPassword (simplificada sin salt) +DELIMITER // +CREATE FUNCTION HashPassword(password VARCHAR(255)) +RETURNS VARCHAR(255) +READS SQL DATA +DETERMINISTIC +BEGIN + RETURN SHA2(password, 256); +END// +DELIMITER ; + +-- Trigger: Actualizar fecha de modificación de productos +DELIMITER // +CREATE TRIGGER tr_actualizar_fecha_producto + BEFORE UPDATE ON Productos + FOR EACH ROW +BEGIN + SET NEW.FECHA_ULTIMA_MODIFICACION = CURRENT_TIMESTAMP; +END// +DELIMITER ; + +-- Trigger: Actualizar total del pedido cuando se inserta detalle +DELIMITER // +CREATE TRIGGER tr_actualizar_total_pedido +AFTER INSERT ON Detalle_Pedidos +FOR EACH ROW +BEGIN + UPDATE Pedidos + SET TOTAL_PRODUCTO = ( + SELECT SUM(SUBTOTAL) + FROM Detalle_Pedidos + WHERE ID_PEDIDO = NEW.ID_PEDIDO + ) + WHERE ID_PEDIDO = NEW.ID_PEDIDO; +END// +DELIMITER ; + +-- Trigger: Actualizar total del pedido cuando se modifica detalle +DELIMITER // +CREATE TRIGGER tr_actualizar_total_pedido_update +AFTER UPDATE ON Detalle_Pedidos +FOR EACH ROW +BEGIN + UPDATE Pedidos + SET TOTAL_PRODUCTO = ( + SELECT SUM(SUBTOTAL) + FROM Detalle_Pedidos + WHERE ID_PEDIDO = NEW.ID_PEDIDO + ) + WHERE ID_PEDIDO = NEW.ID_PEDIDO; +END// +DELIMITER ; + +-- Trigger: Auditoría - Actualizar fecha de modificación de clientes +DELIMITER // +CREATE TRIGGER tr_clientes_fecha_modificacion + BEFORE UPDATE ON Clientes + FOR EACH ROW +BEGIN + SET NEW.FECHA_ULTIMA_MODIFICACION = CURRENT_TIMESTAMP; +END// +DELIMITER ; + +-- Trigger: Auditoría - Actualizar fecha de modificación de empleados +DELIMITER // +CREATE TRIGGER tr_empleados_fecha_modificacion + BEFORE UPDATE ON Empleados + FOR EACH ROW +BEGIN + SET NEW.FECHA_ULTIMA_MODIFICACION = CURRENT_TIMESTAMP; +END// +DELIMITER ; + +-- Trigger: Validación de email para clientes +DELIMITER // +CREATE TRIGGER tr_clientes_validar_email + BEFORE INSERT ON Clientes + FOR EACH ROW +BEGIN + IF NEW.EMAIL_CLI IS NOT NULL AND NEW.EMAIL_CLI NOT REGEXP '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$' THEN + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Email inválido para cliente'; + END IF; +END// +DELIMITER ; + +-- Trigger: Validación de email para empleados +DELIMITER // +CREATE TRIGGER tr_empleados_validar_email + BEFORE INSERT ON Empleados + FOR EACH ROW +BEGIN + IF NEW.EMAIL_EMPLEADO IS NOT NULL AND NEW.EMAIL_EMPLEADO NOT REGEXP '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$' THEN + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Email inválido para empleado'; + END IF; +END// +DELIMITER ; + +-- ================================================================== +-- DML (DATA MANIPULATION LANGUAGE) - INSERCIÓN DE DATOS +-- ================================================================== + +-- ================================================================== +-- INSERCIÓN DE DATOS BASE +-- ================================================================== + +-- Inserción en tabla: Clientes +INSERT INTO Clientes (NOMBRE_CLI, TELEFONO_CLI, EMAIL_CLI) VALUES +('Ana Pérez', '3101234567', 'ana.p@mail.com'), +('Luis Gómez', '3209876543', 'luis.g@mail.com'), +('Maria Rodriguez', '3001122334', 'maria.r@mail.com'); + +-- Inserción en tabla: Empleados +INSERT INTO Empleados (NOMBRE_EMPLEADO) VALUES +('Andres Alkaeda'), +('Damian Avila'), +('Brayan Jimenez'), +('Ana Goyeneche'), +('Sharyt Zamora'), +('Carlos Mendoza'), +('Sofia Rodriguez'), +('Miguel Torres'), +('Valentina Castro'), +('Diego Herrera'), +('Camila Vargas'), +('Alejandro Morales'), +('Isabella Gutierrez'), +('Sebastian Ramirez'), +('Natalia Delgado'); + +-- Inserción en tabla: Administradores +INSERT INTO Administradores (NOMBRE_ADMIN, TELEFONO_ADMIN, EMAIL_ADMIN) VALUES +('Admin Uno', '3005550101', 'admin1@store.com'); + +-- Inserción en tabla: Proveedores +INSERT INTO Proveedores (ID_PROVEEDOR, NOMBRE_PROV, TELEFONO_PROV, EMAIL_PROV) VALUES +(1, 'Harina Dorada', '3001234567', 'ventas@harinadorada.com'), +(2, 'Dulce Granero', '3007654321', 'pedidos@dulcegranero.com'), +(3, 'El Horno Mágico S.A.S.', '3009876543', 'contacto@hornoimagico.com'), +(4, 'Masa Maestra Distribuciones', '3005555555', 'info@masamaestra.com'), +(5, 'Insumos Panaderos del Sol', '3002222222', 'ventas@insumossol.com'), +(6, 'La Esencia del Pan', '3003333333', 'pedidos@esenciapan.com'), +(7, 'Proveedora Integral del Panadero', '3004444444', 'contacto@provintegral.com'), +(8, 'Alimentos para Hornear Cía. Ltda.', '3006666666', 'ventas@alimentoshornear.com'); + +-- Inserción en tabla: Pedidos_Proveedores +INSERT INTO Pedidos_Proveedores (ID_PROVEEDOR, NUMERO_PEDIDO, FECHA_PEDIDO, ESTADO_PEDIDO) VALUES +(1, 1001, '2024-01-15', 'Entregado'), +(2, 1002, '2024-02-10', 'Entregado'), +(3, 1003, '2024-03-05', 'Entregado'); + +-- Inserción en tabla: Categoria_Productos +INSERT INTO Categoria_Productos (NOMBRE_CATEGORIAPRODUCTO) VALUES +('Tortas Tres Leches'), +('Tortas Milyway'), +('Tortas por Encargo'), +('Pan Grande'), +('Pan Pequeño'), +('Postres'), +('Galletas'), +('Tamales'), +('Yogures'), +('Pasteles Pollo'); + +-- Inserción en tabla: Estado_Pedidos +INSERT INTO Estado_Pedidos (NOMBRE_ESTADO) VALUES +('Pendiente'), +('En Preparación'), +('Listo para Entrega'), +('Entregado'), +('Cancelado'); + +-- Inserción en tabla: Categoria_Ingredientes +INSERT INTO `categoria_ingredientes` (`ID_CATEGORIA`, `NOMBRE_CATEGORIA_INGREDIENTE`) VALUES +('1', 'Harinas'), +('2', 'Lácteos y Derivados'), +('3', 'Azúcares y Endulzantes'), +('4', 'Grasas'), +('5', 'Esencias'), +('6', 'Fruta'), +('7', 'Frutos Secos'), +('8', 'Levaduras'), +('9', 'Huevos'), +('10', 'Chocolate y Cacao'), +('11', 'Espesantes y Gelificantes'), +('12', 'Colorantes Alimentarios'), +('13', 'Sal'), +('14', 'Aditivos y Mejoradores'), +('15', 'Semillas'), +('16', 'Coberturas y Rellenos'); + +-- Inserción en tabla: Ingredientes +INSERT INTO Ingredientes (ID_INGREDIENTE, ID_PROVEEDOR, ID_CATEGORIA, NOMBRE_INGREDIENTE, CANTIDAD_INGREDIENTE, FECHA_VENCIMIENTO, REFERENCIA_INGREDIENTE, FECHA_ENTREGA_INGREDIENTE) VALUES +(1, 2, 1, 'Harina de Trigo', 100, '2025-12-20', 'HAR-TRG-05', '2025-07-01'), +(2, 1, 2, 'Leche Entera UHT', 30, '2025-08-01', 'LECH-ENT-1L', '2025-07-01'), +(3, 3, 3, 'Azúcar Blanca', 70, '2026-01-30', 'AZUC-BLN-KG', '2025-07-01'), +(4, 4, 4, 'Mantequilla sin Sal', 25, '2025-09-15', 'MANT-SS-KG', '2025-07-01'), +(5, 5, 9, 'Huevos Grandes', 120, '2025-07-25', 'HUEV-GR-DZ', '2025-07-01'), +(6, 6, 10, 'Chocolate Semi-Amargo (Gotas)', 15, '2026-03-10', 'CHOC-SM-KG', '2025-07-01'), +(7, 7, 8, 'Levadura Fresca', 5, '2025-07-10', 'LEV-FRES-GR', '2025-07-01'), +(8, 1, 3, 'Azúcar Moreno', 10, '2026-02-20', 'AZUC-MRN-KG', '2025-07-01'), +(9, 2, 1, 'Harina Integral', 50, '2025-11-01', 'HAR-INT-02', '2025-07-01'), +(10, 3, 4, 'Aceite Vegetal', 20, '2026-05-01', 'ACET-VEG-LT', '2025-07-01'), +(11, 4, 10, 'Cacao en Polvo', 8, '2026-04-15', 'CACAO-POL-KG', '2025-07-01'), +(12, 5, 6, 'Manzanas Verdes (Kg)', 10, '2025-07-12', 'MANZ-VRD-KG', '2025-07-01'), +(13, 6, 7, 'Nueces Picadas', 5, '2025-10-01', 'NUEZ-PIC-KG', '2025-07-01'), +(14, 7, 5, 'Esencia de Vainilla', 2, '2027-01-01', 'ESEN-VN-LT', '2025-07-01'), +(15, 8, 13, 'Sal Fina', 2, '2028-01-01', 'SAL-FIN-KG', '2025-07-01'), +(16, 1, 2, 'Crema de Leche', 5, '2025-08-05', 'CREM-LECH-LT', '2025-07-01'), +(17, 2, 11, 'Gelatina sin Sabor', 1, '2026-09-01', 'GEL-SS-KG', '2025-07-01'), +(18, 3, 12, 'Colorante Alimentario Rojo', 0.5, '2027-03-01', 'COLR-ROJ-ML', '2025-07-01'), +(19, 4, 15, 'Semillas de Sésamo', 3, '2026-06-01', 'SEM-SES-KG', '2025-07-01'), +(20, 5, 16, 'Dulce de Leche', 10, '2025-11-15', 'DDL-KG', '2025-07-01'); + +-- Inserción en tabla: Productos +INSERT INTO Productos (ID_PRODUCTO, ID_ADMIN, ID_CATEGORIA_PRODUCTO, NOMBRE_PRODUCTO, DESCRIPCION_PRODUCTO, PRODUCTO_STOCK_MIN, PRECIO_PRODUCTO, FECHA_VENCIMIENTO_PRODUCTO, FECHA_INGRESO_PRODUCTO, TIPO_PRODUCTO_MARCA) VALUES +(1, 1, 8, 'Tamales Tolimenses', 'Tradicionales tamales envueltos en hoja de plátano, con masa de maíz y relleno de carne de cerdo y pollo', 10, 3800.00, '2025-09-15', '2025-07-01', 'Propio'), +(2, 1, 4, 'Pan Tajado Integral', 'Pan de molde integral, ideal para desayunos saludables, rico en fibra', 15, 4200.00, '2025-07-02', '2025-07-01', 'Propio'), +(3, 1, 7, 'Yogurt Fresa Litro', 'Yogurt cremoso con trozos de fresa natural, sin conservantes artificiales', 12, 6000.00, '2025-07-30', '2025-07-03', 'Alpina'), +(4, 1, 5, 'Galleta de Tres Ojos', 'Galleta tradicional colombiana con tres círculos de dulce, crujiente y deliciosa', 20, 2500.00, '2025-11-01', '2025-07-01', 'Propio'), +(5, 1, 1, 'Pan Campesino Grande', 'Pan artesanal de corteza dorada y miga suave, ideal para acompañar comidas', 8, 5500.00, '2025-07-08', '2025-07-04', 'Propio'), +(6, 1, 3, 'Torta de Chocolate Pequeña', 'Deliciosa torta de chocolate húmeda con cobertura de chocolate, perfecta para ocasiones especiales', 5, 18000.00, '2025-07-07', '2025-07-04', 'Propio'), +(7, 1, 2, 'Croissant de Almendras', NULL, 18, 3500.00, '2025-07-06', '2025-07-05', 'Propio'), +(8, 1, 1, 'Baguette Clásica', 'Pan francés tradicional con corteza crujiente y miga aireada', 25, 2800.00, '2025-07-06', '2025-07-05', 'Propio'), +(9, 1, 5, 'Bizcochos de Achira', NULL, 15, 4000.00, '2025-12-01', '2025-07-01', 'Propio'), +(10, 1, 6, 'Jugo de Naranja Natural (500ml)', 'Jugo 100% natural exprimido de naranjas frescas, sin azúcar añadido', 10, 4500.00, '2025-07-05', '2025-07-04', 'Postobón'), +(11, 1, 7, 'Postre de Tres Leches', 'Clásico postre colombiano empapado en tres tipos de leche, suave y cremoso', 7, 7500.00, '2025-07-08', '2025-07-04', 'Propio'), +(12, 1, 4, 'Pan Blanco de Molde', NULL, 20, 3900.00, '2025-07-02', '2025-07-01', 'Propio'), +(13, 1, 3, 'Muffin de Arándanos', 'Muffin esponjoso con arándanos frescos, perfecto para el desayuno o merienda', 15, 3000.00, '2025-07-07', '2025-07-04', 'Propio'), +(14, 1, 2, 'Pan de Bono Pequeño', NULL, 30, 1500.00, '2025-07-06', '2025-07-05', 'Propio'), +(15, 1, 8, 'Empanadas de Carne (unidad)', 'Empanada frita rellena de carne molida sazonada con especias tradicionales', 20, 2000.00, '2025-07-06', '2025-07-05', 'Propio'), +(16, 1, 3, 'Brazo de Reina', 'Bizcocho enrollado relleno de dulce de leche y cubierto con coco rallado', 10, 9500.00, '2025-07-09', '2025-07-04', 'Propio'), +(17, 1, 1, 'Pan Trenza Integral', NULL, 12, 4800.00, '2025-07-07', '2025-07-03', 'Propio'), +(18, 1, 5, 'Galletas Surtidas de Mantequilla', 'Variedad de galletas caseras de mantequilla con diferentes formas y sabores', 25, 3200.00, '2025-12-30', '2025-07-01', 'Propio'), +(19, 1, 7, 'Avena La Lechera (500ml)', NULL, 18, 5800.00, '2025-08-20', '2025-07-03', 'Nestlé'), +(20, 1, 9, 'Ponqué de Naranja (Porción)', 'Porción individual de ponqué de naranja con glaseado cítrico', 15, 3000.00, '2025-07-08', '2025-07-04', 'Propio'), +(21, 1, 10, 'Pan Artesanal de Masa Madre', 'Pan elaborado con masa madre natural, fermentación larga para mejor digestibilidad', 7, 8000.00, '2025-07-07', '2025-07-05', 'Propio'), +(22, 1, 3, 'Cheesecake de Frutos Rojos', 'Cheesecake cremoso con base de galleta y cobertura de frutos rojos frescos', 6, 25000.00, '2025-07-09', '2025-07-04', 'Propio'), +(23, 1, 4, 'Pan de Hamburguesa', NULL, 30, 4500.00, '2025-07-10', '2025-07-02', 'Propio'), +(24, 1, 5, 'Galletas de Avena y Pasas', 'Galletas nutritivas con avena integral y pasas, sin azúcar refinado', 22, 2700.00, '2026-01-01', '2025-07-01', 'Propio'), +(25, 1, 7, 'Kumiss Natural', NULL, 10, 4900.00, '2025-07-25', '2025-07-03', 'Alquería'), +(26, 1, 9, 'Brownie con Nuez', 'Brownie de chocolate intenso con trozos de nuez, húmedo y delicioso', 40, 1800.00, '2025-07-08', '2025-07-05', 'Propio'), +(27, 1, 1, 'Pan Blandito', NULL, 28, 2500.00, '2025-07-07', '2025-07-05', 'Propio'), +(28, 1, 3, 'Milhoja de Arequipe', 'Delicada milhoja rellena de arequipe casero y cubierta con azúcar glass', 12, 6000.00, '2025-07-08', '2025-07-04', 'Propio'), +(29, 1, 2, 'Mogolla Chicharrona', NULL, 15, 3500.00, '2025-07-06', '2025-07-05', 'Propio'), +(30, 1, 8, 'Arequipe (Tarro 500g)', 'Arequipe casero cremoso y dulce, perfecto para postres y acompañamientos', 8, 9000.00, '2026-04-10', '2025-07-01', 'Propio'); + +-- Inserción en tabla: Pedidos +INSERT INTO Pedidos (ID_CLIENTE, ID_EMPLEADO, ID_ESTADO_PEDIDO, FECHA_INGRESO, FECHA_ENTREGA, TOTAL_PRODUCTO) VALUES +(1, 1, 2, '2025-06-20 09:00:00', '2025-06-20 15:00:00', 10000.00), +(2, 2, 4, '2025-06-19 10:30:00', '2025-06-19 16:30:00', 7500.00), +(3, 1, 1, '2025-06-21 08:00:00', '2025-06-21 14:00:00', 12500.00); + +-- Inserción en tabla: Detalle_Pedidos +INSERT INTO Detalle_Pedidos (ID_PEDIDO, ID_PRODUCTO, CANTIDAD_PRODUCTO, PRECIO_UNITARIO, SUBTOTAL) VALUES +(1, 1, 2, 3500.00, 7000.00), +(1, 3, 1, 6000.00, 6000.00), +(2, 2, 1, 4200.00, 4200.00), +(2, 4, 3, 2500.00, 7500.00), +(3, 1, 3, 3500.00, 10500.00), +(3, 4, 2, 2500.00, 5000.00); + +-- Inserción en tabla: Ordenes_Salida +INSERT INTO Ordenes_Salida (ID_CLIENTE, ID_PEDIDO, FECHA_FACTURACION, TOTAL_FACTURA) VALUES +(1, 1, '2025-06-20 15:30:00', 13000.00), +(2, 2, '2025-06-19 17:00:00', 11700.00), +(3, 3, '2025-06-21 14:30:00', 15500.00); + +-- ================================================================== +-- DCL (DATA CONTROL LANGUAGE) - SEGURIDAD Y ENCRIPTACIÓN +-- ================================================================== + +-- Actualizar contraseñas de administradores con encriptación (sin salt) +UPDATE Administradores +SET CONTRASEÑA_ADMIN = HashPassword('admin123') +WHERE ID_ADMIN = 1; + +-- Actualizar contraseñas de clientes con encriptación (sin salt) +UPDATE Clientes +SET CONTRASEÑA_CLI = HashPassword('cliente123') +WHERE ID_CLIENTE = 1; + +UPDATE Clientes +SET CONTRASEÑA_CLI = HashPassword('cliente456') +WHERE ID_CLIENTE = 2; + +UPDATE Clientes +SET CONTRASEÑA_CLI = HashPassword('cliente789') +WHERE ID_CLIENTE = 3; + +-- Actualizar contraseñas de empleados con encriptación (sin salt) +UPDATE Empleados +SET CONTRASEÑA_EMPLEADO = HashPassword('empleado123') +WHERE ID_EMPLEADO = 1; + +UPDATE Empleados +SET CONTRASEÑA_EMPLEADO = HashPassword('empleado456') +WHERE ID_EMPLEADO = 2; + +COMMIT; \ No newline at end of file diff --git a/api_/Proyecto/mvnw b/api_/Proyecto/mvnw new file mode 100644 index 0000000..19529dd --- /dev/null +++ b/api_/Proyecto/mvnw @@ -0,0 +1,259 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.3.2 +# +# Optional ENV vars +# ----------------- +# JAVA_HOME - location of a JDK home dir, required when download maven via java source +# MVNW_REPOURL - repo url base for downloading maven distribution +# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output +# ---------------------------------------------------------------------------- + +set -euf +[ "${MVNW_VERBOSE-}" != debug ] || set -x + +# OS specific support. +native_path() { printf %s\\n "$1"; } +case "$(uname)" in +CYGWIN* | MINGW*) + [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")" + native_path() { cygpath --path --windows "$1"; } + ;; +esac + +# set JAVACMD and JAVACCMD +set_java_home() { + # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched + if [ -n "${JAVA_HOME-}" ]; then + if [ -x "$JAVA_HOME/jre/sh/java" ]; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACCMD="$JAVA_HOME/jre/sh/javac" + else + JAVACMD="$JAVA_HOME/bin/java" + JAVACCMD="$JAVA_HOME/bin/javac" + + if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then + echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2 + echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 + return 1 + fi + fi + else + JAVACMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v java + )" || : + JAVACCMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v javac + )" || : + + if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then + echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 + return 1 + fi + fi +} + +# hash string like Java String::hashCode +hash_string() { + str="${1:-}" h=0 + while [ -n "$str" ]; do + char="${str%"${str#?}"}" + h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296)) + str="${str#?}" + done + printf %x\\n $h +} + +verbose() { :; } +[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; } + +die() { + printf %s\\n "$1" >&2 + exit 1 +} + +trim() { + # MWRAPPER-139: + # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. + # Needed for removing poorly interpreted newline sequences when running in more + # exotic environments such as mingw bash on Windows. + printf "%s" "${1}" | tr -d '[:space:]' +} + +# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties +while IFS="=" read -r key value; do + case "${key-}" in + distributionUrl) distributionUrl=$(trim "${value-}") ;; + distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;; + esac +done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties" +[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties" + +case "${distributionUrl##*/}" in +maven-mvnd-*bin.*) + MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ + case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in + *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;; + :Darwin*x86_64) distributionPlatform=darwin-amd64 ;; + :Darwin*arm64) distributionPlatform=darwin-aarch64 ;; + :Linux*x86_64*) distributionPlatform=linux-amd64 ;; + *) + echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 + distributionPlatform=linux-amd64 + ;; + esac + distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" + ;; +maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; +*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; +esac + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" +distributionUrlName="${distributionUrl##*/}" +distributionUrlNameMain="${distributionUrlName%.*}" +distributionUrlNameMain="${distributionUrlNameMain%-bin}" +MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}" +MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" + +exec_maven() { + unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : + exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD" +} + +if [ -d "$MAVEN_HOME" ]; then + verbose "found existing MAVEN_HOME at $MAVEN_HOME" + exec_maven "$@" +fi + +case "${distributionUrl-}" in +*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;; +*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; +esac + +# prepare tmp dir +if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then + clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; } + trap clean HUP INT TERM EXIT +else + die "cannot create temp dir" +fi + +mkdir -p -- "${MAVEN_HOME%/*}" + +# Download and Install Apache Maven +verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +verbose "Downloading from: $distributionUrl" +verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +# select .zip or .tar.gz +if ! command -v unzip >/dev/null; then + distributionUrl="${distributionUrl%.zip}.tar.gz" + distributionUrlName="${distributionUrl##*/}" +fi + +# verbose opt +__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' +[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v + +# normalize http auth +case "${MVNW_PASSWORD:+has-password}" in +'') MVNW_USERNAME='' MVNW_PASSWORD='' ;; +has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; +esac + +if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then + verbose "Found wget ... using wget" + wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl" +elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then + verbose "Found curl ... using curl" + curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl" +elif set_java_home; then + verbose "Falling back to use Java to download" + javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" + targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" + cat >"$javaSource" <<-END + public class Downloader extends java.net.Authenticator + { + protected java.net.PasswordAuthentication getPasswordAuthentication() + { + return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() ); + } + public static void main( String[] args ) throws Exception + { + setDefault( new Downloader() ); + java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); + } + } + END + # For Cygwin/MinGW, switch paths to Windows format before running javac and java + verbose " - Compiling Downloader.java ..." + "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java" + verbose " - Running Downloader.java ..." + "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" +fi + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +if [ -n "${distributionSha256Sum-}" ]; then + distributionSha256Result=false + if [ "$MVN_CMD" = mvnd.sh ]; then + echo "Checksum validation is not supported for maven-mvnd." >&2 + echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + elif command -v sha256sum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + elif command -v shasum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 + echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + fi + if [ $distributionSha256Result = false ]; then + echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2 + echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2 + exit 1 + fi +fi + +# unzip and move +if command -v unzip >/dev/null; then + unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip" +else + tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar" +fi +printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url" +mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" + +clean || : +exec_maven "$@" diff --git a/api_/Proyecto/mvnw.cmd b/api_/Proyecto/mvnw.cmd new file mode 100644 index 0000000..249bdf3 --- /dev/null +++ b/api_/Proyecto/mvnw.cmd @@ -0,0 +1,149 @@ +<# : batch portion +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.3.2 +@REM +@REM Optional ENV vars +@REM MVNW_REPOURL - repo url base for downloading maven distribution +@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output +@REM ---------------------------------------------------------------------------- + +@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) +@SET __MVNW_CMD__= +@SET __MVNW_ERROR__= +@SET __MVNW_PSMODULEP_SAVE=%PSModulePath% +@SET PSModulePath= +@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( + IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) +) +@SET PSModulePath=%__MVNW_PSMODULEP_SAVE% +@SET __MVNW_PSMODULEP_SAVE= +@SET __MVNW_ARG0_NAME__= +@SET MVNW_USERNAME= +@SET MVNW_PASSWORD= +@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*) +@echo Cannot start maven from wrapper >&2 && exit /b 1 +@GOTO :EOF +: end batch / begin powershell #> + +$ErrorActionPreference = "Stop" +if ($env:MVNW_VERBOSE -eq "true") { + $VerbosePreference = "Continue" +} + +# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties +$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl +if (!$distributionUrl) { + Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" +} + +switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { + "maven-mvnd-*" { + $USE_MVND = $true + $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" + $MVN_CMD = "mvnd.cmd" + break + } + default { + $USE_MVND = $false + $MVN_CMD = $script -replace '^mvnw','mvn' + break + } +} + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +if ($env:MVNW_REPOURL) { + $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" } + $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')" +} +$distributionUrlName = $distributionUrl -replace '^.*/','' +$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' +$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain" +if ($env:MAVEN_USER_HOME) { + $MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain" +} +$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' +$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" + +if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { + Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" + Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" + exit $? +} + +if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { + Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" +} + +# prepare tmp dir +$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile +$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" +$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null +trap { + if ($TMP_DOWNLOAD_DIR.Exists) { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } + } +} + +New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null + +# Download and Install Apache Maven +Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +Write-Verbose "Downloading from: $distributionUrl" +Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +$webclient = New-Object System.Net.WebClient +if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { + $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) +} +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum +if ($distributionSha256Sum) { + if ($USE_MVND) { + Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." + } + Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash + if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { + Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." + } +} + +# unzip and move +Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null +Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null +try { + Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null +} catch { + if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { + Write-Error "fail to move MAVEN_HOME" + } +} finally { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } +} + +Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" diff --git a/api_/Proyecto/pom.xml b/api_/Proyecto/pom.xml new file mode 100644 index 0000000..a24ceb4 --- /dev/null +++ b/api_/Proyecto/pom.xml @@ -0,0 +1,90 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.5.4 + + + com.example + Proyecto + 0.0.1-SNAPSHOT + Proyecto + Demo project for Spring Boot + + + + + + + + + + + + + + + 21 + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.security + spring-security-crypto + + + org.springframework.boot + spring-boot-starter-jdbc + + + com.mysql + mysql-connector-j + runtime + + + com.h2database + h2 + runtime + + + org.springframework.boot + spring-boot-starter-test + test + + + org.mockito + mockito-core + 5.14.2 + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-compiler-plugin + + 21 + 21 + + + + + \ No newline at end of file diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/ProyectoApplication.java b/api_/Proyecto/src/main/java/com/example/Proyecto/ProyectoApplication.java new file mode 100644 index 0000000..b35d937 --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/ProyectoApplication.java @@ -0,0 +1,13 @@ +package com.example.Proyecto; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ProyectoApplication { + + public static void main(String[] args) { + SpringApplication.run(ProyectoApplication.class, args); + } + +} diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/config/SecurityConfig.java b/api_/Proyecto/src/main/java/com/example/Proyecto/config/SecurityConfig.java new file mode 100644 index 0000000..689872a --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/config/SecurityConfig.java @@ -0,0 +1,31 @@ +package com.example.Proyecto.config; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.SecurityFilterChain; + + @Configuration + @EnableWebSecurity + public class SecurityConfig { + + @Bean + public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + http + .authorizeHttpRequests(authorize -> authorize + .anyRequest().permitAll() + ) + .csrf(csrf -> csrf.disable()) + .formLogin(form -> form.disable()) + .httpBasic(basic -> basic.disable()) + .logout(logout -> logout.disable()); + return http.build(); + } + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + } diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/controller/CategoriaIngredientesController.java b/api_/Proyecto/src/main/java/com/example/Proyecto/controller/CategoriaIngredientesController.java new file mode 100644 index 0000000..b12bb02 --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/controller/CategoriaIngredientesController.java @@ -0,0 +1,53 @@ +package com.example.Proyecto.controller; +import com.example.Proyecto.controller.CategoriaIngredientesController; +import com.example.Proyecto.service.CategoriaIngredientesService.CategoriaIngredientes; +import com.example.Proyecto.controller.CategoriaIngredientesController; +import com.example.Proyecto.service.CategoriaIngredientesService.CategoriaIngredientesService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import java.util.List; + +@RestController +@RequestMapping +public class CategoriaIngredientesController { + + @Autowired + private CategoriaIngredientesService categoriaIngredientesService; + + // GET - Obtener todas las categorías de ingredientes + @GetMapping("/categorias/ingredientes") + public List obtenerTodasLasCategoriasIngredientes() { + return categoriaIngredientesService.obtenerTodasLasCategoriasIngredientes(); + } + + // POST - Crear una nueva categoría de ingrediente + @PostMapping("/nuevacategoriaingrediente") + public ResponseEntity crearCategoriaIngrediente(@RequestBody CategoriaIngredientes categoria) { + categoriaIngredientesService.crearCategoriaIngrediente(categoria); + return ResponseEntity.ok("Categoría " + categoria.getNombreCategoria() + " creada con éxito."); + } + + // PUT - Actualizar una categoría existente + @PutMapping("categoriaingrediente/{id}") + public ResponseEntity editarCategoriaIngrediente(@PathVariable int id, @RequestBody CategoriaIngredientes categoria) { + categoria.setIdCategoriaIngrediente(id); + int filas = categoriaIngredientesService.editarCategoriaIngrediente(categoria); + if (filas > 0) { + return ResponseEntity.ok("Categoría de ingrediente con ID " + id + " actualizada correctamente."); + } else { + return ResponseEntity.notFound().build(); + } + } + + // DELETE - Eliminar una categoría por ID + @DeleteMapping("eliminarcategoria/{id}") + public ResponseEntity eliminarCategoriaIngrediente(@PathVariable int id) { + int filas = categoriaIngredientesService.eliminarCategoriaIngrediente(id); + if (filas > 0) { + return ResponseEntity.ok("Categoría de ingrediente con ID " + id + " eliminada correctamente."); + } else { + return ResponseEntity.notFound().build(); + } + } +} diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/controller/ConexionController.java b/api_/Proyecto/src/main/java/com/example/Proyecto/controller/ConexionController.java new file mode 100644 index 0000000..defe4e1 --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/controller/ConexionController.java @@ -0,0 +1,38 @@ +package com.example.Proyecto.controller; + +import com.example.Proyecto.model.PojoCliente; +import com.example.Proyecto.service.Clientes.ConexionClienteService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +@RestController +public class ConexionController { + + @Autowired + private ConexionClienteService conexionClienteService; + + @GetMapping("/Clientes") + public List> obtenerUsuarios() { + return conexionClienteService.obtenerDetallesCliente(); + } + + @PostMapping("/Clientes") + public String crearUsuario(@RequestBody PojoCliente cliente) { + boolean creado = conexionClienteService.crearCliente(cliente); + System.out.println("Cliente recibido: " + cliente.getNombre()); + return creado ? "Cliente " + cliente.getNombre() + " creado con éxito." : "Error al crear cliente"; + } + @PutMapping("/Clientes/{ID_CLIENTE}") + public void actualizarUsuario(@PathVariable int ID_CLIENTE, @RequestBody PojoCliente cliente) { + cliente.setId(ID_CLIENTE); + conexionClienteService.actualizarCliente(cliente); + } + @DeleteMapping("Clientes/{ID_CLIENTE}") + public ResponseEntity eliminarUsuario(@PathVariable("ID_CLIENTE") int id) { + return ResponseEntity.status(501).build(); + } +} diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/controller/ConexionControllerUsers.java b/api_/Proyecto/src/main/java/com/example/Proyecto/controller/ConexionControllerUsers.java new file mode 100644 index 0000000..bf0b028 --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/controller/ConexionControllerUsers.java @@ -0,0 +1,127 @@ +package com.example.Proyecto.controller; +import com.example.Proyecto.service.Clientes.ConexionClienteService; +import com.example.Proyecto.service.Administrador.ConexionAdminService; +import com.example.Proyecto.model.PojoAdmin; +import com.example.Proyecto.model.PojoCliente; +import com.example.Proyecto.service.Empleados.ConexionEmpleadoService; +import com.example.Proyecto.model.PojoDeleteEmpleado; +import com.example.Proyecto.model.PojoEmpleado; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import java.util.List; +import java.util.Map; + + +@RequestMapping("/") +@RestController +public class ConexionControllerUsers { + @Autowired + private ConexionAdminService conexionAdminService; + @Autowired + private ConexionEmpleadoService conexionEmpleadoService; + @Autowired + private ConexionClienteService conexionClienteService; + + + // ----> Administradores GET + @GetMapping("/detalle/administrador") + public List> obtenerDetallesAdministrador() { + return conexionAdminService.obtenerDetallesAdministrador(); + } + // ----> Administradores POST + @PostMapping("/crear/administrador") + public String crearAdmin(@RequestBody PojoAdmin pojoAdmin) { + boolean creado = conexionAdminService.crearAdmin(pojoAdmin); + if (creado) { + return "Nuevo Administrador creado exitosamente"; + } else { + return "Error al crear un nuevo Administrador"; + } + } + + // ----> Administradores PATCH + @PatchMapping("/actualizar/administrador") + public ResponseEntity actualizarAdministrador(@RequestBody PojoAdmin pojoAdmin){ + boolean actualizado = conexionAdminService.actualizarAdministrador(pojoAdmin); + if(actualizado) { + return ResponseEntity.ok("El Administrador ha sido actualizado correctamente"); + } else { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body("Error al actualizar el Administrador"); + } + } + + // ----> Clientes GET + @GetMapping("/detalle/cliente") + public List> obtenerDetallesCliente() { + return conexionClienteService.obtenerDetallesCliente(); + } + + // ----> Clientes POST + @PostMapping("/crear/cliente") + public String crearCliente(@RequestBody PojoCliente pojoCliente) { + boolean creado = conexionClienteService.crearCliente(pojoCliente); + if (creado) { + return "Nuevo Cliente creado exitosamente"; + } else { + return "Error al crear un nuevo Cliente"; + } + } + + // ----> Clientes PATCH + @PatchMapping("/actualizar/cliente/{id}") + public ResponseEntity actualizarCliente(@PathVariable int id, @RequestBody PojoCliente pojoCliente) { + pojoCliente.setId(id); + boolean actualizado = conexionClienteService.actualizarCliente(pojoCliente); + + if (actualizado) { + return ResponseEntity.ok("El Usuario ha sido actualizado correctamente"); + } else { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body("No se encontró un usuario con el ID especificado"); + } + } + + // ----> Empleados GET + @GetMapping("/detalle/empleado") + public List> obtenerDetallesEmpleado(){ + return conexionEmpleadoService.obtenerDetallesEmpleado(); + } + + // ----> Empleados POST + @PostMapping("/crear/empleado") + public String crearEmpleado(@RequestBody PojoEmpleado pojoEmpleado) { + boolean creado = conexionEmpleadoService.crearEmpleado(pojoEmpleado); + if (creado) { + return "Nuevo Empleado creado exitosamente"; + } else { + return "Error al crear un nuevo Empleado"; + } + } + + // ----> Empleados UPDATE + @PatchMapping("/actualizar/empleado/{id}") + public ResponseEntity actualizarEmpleado(@PathVariable int id, @RequestBody PojoEmpleado pojoEmpleado){ + pojoEmpleado.setId(id); + boolean actualizado = conexionEmpleadoService.actualizarEmpleado(pojoEmpleado); + if(actualizado) { + return ResponseEntity.ok("El Empleado ha sido actualizado correctamente"); + } else { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body("Error al actualizar el Empleado"); + } + } + + // ----> Empleados DELETE + @DeleteMapping("/eliminar/empleado") + public String eliminarEmpleado(@RequestBody PojoDeleteEmpleado pojoDeleteEmpleado) { + boolean eliminado = conexionEmpleadoService.eliminarEmpleado(pojoDeleteEmpleado.getId()); + if (eliminado) { + return "Empleado eliminado exitosamente"; + } else { + return "Error al eliminar el Empleado"; + } + } +} diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/controller/DetallePedidosController.java b/api_/Proyecto/src/main/java/com/example/Proyecto/controller/DetallePedidosController.java new file mode 100644 index 0000000..5d7261c --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/controller/DetallePedidosController.java @@ -0,0 +1,52 @@ +package com.example.Proyecto.controller; + +import com.example.Proyecto.service.DetallePedidos.DetallePedidos; +import com.example.Proyecto.service.DetallePedidos.DetallePedidosService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import java.util.List; + +@RestController +@RequestMapping("/detalles-pedidos") +public class DetallePedidosController { + + @Autowired + private DetallePedidosService detallePedidosService; + + // GET - Obtener todos los detalles de pedidos + @GetMapping + public List obtenerTodosLosDetallesPedidos() { + return detallePedidosService.obtenerTodosLosDetallesPedidos(); + } + + // POST - Crear un nuevo detalle de pedido + @PostMapping + public ResponseEntity crearDetallePedido(@RequestBody DetallePedidos detalle) { + detallePedidosService.crearDetallePedido(detalle); + return ResponseEntity.ok("Detalle de pedido " + detalle.getIdDetalle() + " creado con éxito."); + } + + // PUT - Actualizar un detalle de pedido existente + @PutMapping("/{id}") + public ResponseEntity editarDetallePedido(@PathVariable int id, @RequestBody DetallePedidos detalle) { + detalle.setIdDetalle(id); + int filas = detallePedidosService.editarDetallePedido(detalle); + if (filas > 0) { + return ResponseEntity.ok("Detalle de pedido con ID " + id + " actualizado correctamente."); + } else { + return ResponseEntity.notFound().build(); + } + } + + // DELETE - Eliminar un detalle de pedido por ID + @DeleteMapping("/{id}") + public ResponseEntity eliminarDetallePedido(@PathVariable int id) { + int filas = detallePedidosService.eliminarDetallePedido(id); + if (filas > 0) { + return ResponseEntity.ok("Detalle de pedido con ID " + id + " eliminado correctamente."); + } else { + return ResponseEntity.notFound().build(); + } + } +} \ No newline at end of file diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/controller/Estados_PedidosController.java b/api_/Proyecto/src/main/java/com/example/Proyecto/controller/Estados_PedidosController.java new file mode 100644 index 0000000..8f01328 --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/controller/Estados_PedidosController.java @@ -0,0 +1,41 @@ +package com.example.Proyecto.controller; +import com.example.Proyecto.model.Estado_Pedidos; +import com.example.Proyecto.service.Pedidos.Estados_PedidosService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping +public class Estados_PedidosController { + + @Autowired + private Estados_PedidosService estados_PedidosService; + + @GetMapping("/estadosPedidos") + public ResponseEntity> obtenerTodosLosEstados_Pedidos() { + List estadoPedidos = estados_PedidosService.obtenerEstado_Pedidos(); + return new ResponseEntity<>(estadoPedidos, HttpStatus.OK); + } + + @PostMapping("/estadosPedidos") + public ResponseEntity crearEstadoPedido(@RequestBody Estado_Pedidos estado) { + Long estadoId = estados_PedidosService.crearEstadoPedido(estado); + return new ResponseEntity<>("Estado de pedido " + estadoId + " creado con éxito.", HttpStatus.CREATED); + } + + @PutMapping("/{id}") + public ResponseEntity actualizarEstado(@PathVariable("id") Long id, @RequestBody Estado_Pedidos estadoPedidos) { + estados_PedidosService.actualizarEstado(id, estadoPedidos); + return new ResponseEntity<>("Estado de pedido con ID " + id + " actualizado con éxito.", HttpStatus.OK); + } + + @DeleteMapping("/{id}") + public ResponseEntity eliminarestadoPedidos(@PathVariable("id") Long id) { + estados_PedidosService.eliminarestadoPedido(id); + return new ResponseEntity<>("Estado de pedido con ID " + id + " eliminado con éxito.", HttpStatus.OK); + } +} \ No newline at end of file diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/controller/Ingredientescontroller.java b/api_/Proyecto/src/main/java/com/example/Proyecto/controller/Ingredientescontroller.java new file mode 100644 index 0000000..7e4fcc7 --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/controller/Ingredientescontroller.java @@ -0,0 +1,77 @@ +package com.example.Proyecto.controller; + +import com.example.Proyecto.model.Ingredientes; +import com.example.Proyecto.service.Ingredientes.IngredientesService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import java.util.List; +import java.util.Map; + +@RestController +public class Ingredientescontroller { + + @Autowired + private IngredientesService ingredientesService; + + // GET → obtener todos los ingredientes + @GetMapping("/ingredientes") + public List obtenerIngredientes() { + return ingredientesService.obtenerIngredientes(); + } + + @GetMapping("ingredientes/lista") + public List obtenerIngredientesListas() { + return ingredientesService.obtenerTodosLosIngredientes(); + } + + // Metodo post crear un nuevo ingrediente + @PostMapping("/crearingrediente") + public String crearIngrediente(@RequestBody Ingredientes ingrediente) { + ingredientesService.crearIngrediente(ingrediente); + System.out.println("Ingrediente recibido: " + ingrediente.getNombreIngrediente()); + return "Ingrediente " + ingrediente.getNombreIngrediente() + " creado con éxito."; + } + + // PUT → editar un ingrediente existente + @PutMapping("ingrediente/{id}") + public String editarIngrediente(@PathVariable int id, @RequestBody Ingredientes ingrediente) { + ingrediente.setIdIngrediente(id); // asigna el ID de la URL al objeto + + int filas = ingredientesService.editarIngrediente(ingrediente); + + if (filas > 0) { + return "Ingrediente con ID " + id + " actualizado correctamente."; + } else { + return "No se encontró el ingrediente con ID " + id; + } + } + + // Metodo PATCH + @PatchMapping("/{id}/cantidad") + public String patchCantidad(@PathVariable int id, @RequestBody Map updates) { + if (updates.containsKey("cantidadIngrediente")) { + int cantidad = (int) updates.get("cantidadIngrediente"); + int filas = ingredientesService.actualizarCantidad(id, cantidad); + return filas > 0 ? "Cantidad actualizada" : "Ingrediente no encontrado"; + } + return "No se envió la cantidad"; + } + + + // DELETE → eliminar un ingrediente por ID + @DeleteMapping("ingrediente/{id}") + public String eliminarIngrediente(@PathVariable int id) { + int filas = ingredientesService.eliminarIngrediente(id); + if (filas > 0) { + return "Ingrediente con ID " + id + " eliminado correctamente."; + } else { + return "No se encontró el ingrediente con ID " + id; + } + } + + + + + + +} diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/controller/Ordenes_salidaController.java b/api_/Proyecto/src/main/java/com/example/Proyecto/controller/Ordenes_salidaController.java new file mode 100644 index 0000000..5ea11f2 --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/controller/Ordenes_salidaController.java @@ -0,0 +1,21 @@ +package com.example.Proyecto.controller; +import com.example.Proyecto.model.Ordenes_salida; +import com.example.Proyecto.service.Ordenes_salida.Ordenes_salidaService; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +public class Ordenes_salidaController { + private final Ordenes_salidaService ordenes_salidaService; + + public Ordenes_salidaController(Ordenes_salidaService ordenes_salidaService) { + this.ordenes_salidaService = ordenes_salidaService; + } + + @GetMapping("/ventas") + public ListobtenerOrdenesSalida() { + return ordenes_salidaService.obtenerOrdenesSalida(); + } +} diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/controller/PedidosController.java b/api_/Proyecto/src/main/java/com/example/Proyecto/controller/PedidosController.java new file mode 100644 index 0000000..1d541a6 --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/controller/PedidosController.java @@ -0,0 +1,38 @@ +package com.example.Proyecto.controller; +import com.example.Proyecto.model.Pedidos; +import com.example.Proyecto.service.Pedidos.pedidosService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; +import java.util.List; + +@Transactional +@RestController +@RequestMapping("/pedidos") +public class PedidosController { + @Autowired + private pedidosService pedidosService; + @GetMapping + public ResponseEntity> obtenerTodosLosPedidos() { + List pedidos = pedidosService.obtenerPedidos(); + return new ResponseEntity<>(pedidos, HttpStatus.OK); + } + @PostMapping + public String crearPedidos(@RequestBody Pedidos pedidos) { + int pedidoId = pedidosService.crearPedido(pedidos); + System.out.println("Pedido recibido con ID: " + pedidoId); + return "Pedido " + pedidoId + " creado con éxito."; + } + @PutMapping("/{id}") + public String actualizarPedidos(@PathVariable("id") Long id, @RequestBody Pedidos pedidos) { + pedidosService.actualizarPedido(id, pedidos); + return "Pedido con ID " + id + " actualizado con éxito."; + } + @DeleteMapping("/{id}") + public String eliminarPedido(@PathVariable("id") Long id) { + pedidosService.eliminarPedido(id); + return "Pedido con ID " + id + " eliminado con éxito."; + } +} \ No newline at end of file diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/controller/PedidosProveedoresController.java b/api_/Proyecto/src/main/java/com/example/Proyecto/controller/PedidosProveedoresController.java new file mode 100644 index 0000000..97bbe3f --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/controller/PedidosProveedoresController.java @@ -0,0 +1,52 @@ +package com.example.Proyecto.controller; + +import com.example.Proyecto.service.PedidosProveedores.PedidosProveedores; +import com.example.Proyecto.service.PedidosProveedores.PedidosProveedoresService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import java.util.List; + +@RestController +@RequestMapping +public class PedidosProveedoresController { + + @Autowired + private PedidosProveedoresService pedidosProveedoresService; + + // GET - Obtener todos los pedidos de proveedores + @GetMapping("/pedido/proveedores") + public List obtenerTodosLosPedidosProveedores() { + return pedidosProveedoresService.obtenerTodosLosPedidosProveedores(); + } + + // POST - Crear un nuevo pedido de proveedor + @PostMapping("/pedido/proveedores") + public ResponseEntity crearPedidoProveedor(@RequestBody PedidosProveedores pedido) { + pedidosProveedoresService.crearPedidoProveedor(pedido); + return ResponseEntity.ok("Pedido " + pedido.getNumeroPedido() + " creado con éxito."); + } + + // PUT - Actualizar un pedido de proveedor existente + @PutMapping("/pedido/proveedores/{id}") + public ResponseEntity editarPedidoProveedor(@PathVariable int id, @RequestBody PedidosProveedores pedido) { + pedido.setIdPedidoProv(id); + int filas = pedidosProveedoresService.editarPedidoProveedor(pedido); + if (filas > 0) { + return ResponseEntity.ok("Pedido de proveedor con ID " + id + " actualizado correctamente."); + } else { + return ResponseEntity.notFound().build(); + } + } + + // DELETE - Eliminar un pedido de proveedor por ID + @DeleteMapping("/pedido/proveedores/{id}") + public ResponseEntity eliminarPedidoProveedor(@PathVariable int id) { + int filas = pedidosProveedoresService.eliminarPedidoProveedor(id); + if (filas > 0) { + return ResponseEntity.ok("Pedido de proveedor con ID " + id + " eliminado correctamente."); + } else { + return ResponseEntity.notFound().build(); + } + } +} \ No newline at end of file diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/controller/ProductosController.java b/api_/Proyecto/src/main/java/com/example/Proyecto/controller/ProductosController.java new file mode 100644 index 0000000..46e735d --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/controller/ProductosController.java @@ -0,0 +1,51 @@ +package com.example.Proyecto.controller; + +import com.example.Proyecto.model.PojoProductos; +import com.example.Proyecto.service.Productos.ProductosService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +@RequestMapping("/") +@RestController +public class ProductosController { + @Autowired + private ProductosService productosService; + + // ----> Productos GET + @GetMapping("/detalle/producto") + public List> obtenerDetallesProductos() { + return productosService.obtenerDetallesProducto(); + } + // ----> Productos POST + @PostMapping("/crear/producto") + public String crearProducto(@RequestBody PojoProductos pojoProductos) { + boolean creado = productosService.crearProducto(pojoProductos); + if (creado) { + return "Nuevo Producto creado e ingresado exitosamente"; + } else { + return "Error al crear un nuevo Producto"; + } + } + @PatchMapping("/actualizar/producto/{id}") + public ResponseEntity actualizarProducto(@PathVariable("id") Long id, @RequestBody PojoProductos pojoProductos) { + try { + pojoProductos.setId(id.intValue()); + boolean actualizado = productosService.actualizarProducto(pojoProductos); + if (actualizado) { + return ResponseEntity.ok("El producto " + pojoProductos.getNombreProducto() + " ha sido actualizado correctamente"); + } else { + return ResponseEntity.status(HttpStatus.BAD_REQUEST) + .body("Error al actualizar el producto"); + } + } catch (Exception e) { + e.printStackTrace(); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body("Excepción: " + e.getMessage()); + } + } +} diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/controller/ProveedoresController.java b/api_/Proyecto/src/main/java/com/example/Proyecto/controller/ProveedoresController.java new file mode 100644 index 0000000..474f05a --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/controller/ProveedoresController.java @@ -0,0 +1,51 @@ +package com.example.Proyecto.controller; +import com.example.Proyecto.service.Proveedores.Proveedores; +import com.example.Proyecto.service.Proveedores.ProveedoresService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import java.util.List; + +@RestController +@RequestMapping("/proveedores") +public class ProveedoresController { + + @Autowired + private ProveedoresService proveedoresService; + + // GET - Obtener todos los proveedores + @GetMapping + public List obtenerTodosLosProveedores() { + return proveedoresService.obtenerTodosLosProveedores(); + } + + // POST - Crear un nuevo proveedor + @PostMapping + public ResponseEntity crearProveedor(@RequestBody Proveedores proveedor) { + proveedoresService.crearProveedor(proveedor); + return ResponseEntity.ok("Proveedor " + proveedor.getNombreProv() + " creado con éxito."); + } + + // PUT - Actualizar un proveedor existente + @PutMapping("/{id}") + public ResponseEntity editarProveedor(@PathVariable int id, @RequestBody Proveedores proveedor) { + proveedor.setIdProveedor(id); + int filas = proveedoresService.editarProveedor(proveedor); + if (filas > 0) { + return ResponseEntity.ok("Proveedor con ID " + id + " actualizado correctamente."); + } else { + return ResponseEntity.notFound().build(); + } + } + + // DELETE - Eliminar un proveedor por ID + @DeleteMapping("/{id}") + public ResponseEntity eliminarProveedor(@PathVariable int id) { + int filas = proveedoresService.eliminarProveedor(id); + if (filas > 0) { + return ResponseEntity.ok("Proveedor con ID " + id + " eliminado correctamente."); + } else { + return ResponseEntity.notFound().build(); + } + } +} \ No newline at end of file diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/controller/UsuariosRegistradosController.java b/api_/Proyecto/src/main/java/com/example/Proyecto/controller/UsuariosRegistradosController.java new file mode 100644 index 0000000..99b67a8 --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/controller/UsuariosRegistradosController.java @@ -0,0 +1,21 @@ +package com.example.Proyecto.controller; + +import com.example.Proyecto.dto.UsuariosRegistradosDTO; +import com.example.Proyecto.service.UsuariosRegistradosService.UsuariosRegistradosService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +public class UsuariosRegistradosController { + + @Autowired + private UsuariosRegistradosService usuariosRegistradosService; + + @GetMapping("/reporte/usuarios") + public List obtenerReporteUsuarios() { + return usuariosRegistradosService.obtenerUsuariosRegistrados(); + } +} diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/dto/UsuariosRegistradosDTO.java b/api_/Proyecto/src/main/java/com/example/Proyecto/dto/UsuariosRegistradosDTO.java new file mode 100644 index 0000000..bc27fd0 --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/dto/UsuariosRegistradosDTO.java @@ -0,0 +1,27 @@ +package com.example.Proyecto.dto; + +public class UsuariosRegistradosDTO { + private String nombre; + private String email; + private String telefono; + private String rol; + + public UsuariosRegistradosDTO(String nombre, String email, String telefono, String rol) { + this.nombre = nombre; + this.email = email; + this.telefono = telefono; + this.rol = rol; + } + // Getters y Setters + public String getNombre() { return nombre; } + public void setNombre(String nombre) { this.nombre = nombre; } + + public String getEmail() { return email; } + public void setEmail(String email) { this.email = email; } + public String getTelefono() { return telefono; } + public void setTelefono(String telefono) { this.telefono = telefono; } + public String getRol() { return rol; } + public void setRol(String rol) { this.rol = rol; } + + } + diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/model/Estado_Pedidos.java b/api_/Proyecto/src/main/java/com/example/Proyecto/model/Estado_Pedidos.java new file mode 100644 index 0000000..6b5e85d --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/model/Estado_Pedidos.java @@ -0,0 +1,28 @@ +package com.example.Proyecto.model; + +public class Estado_Pedidos { + + private Long ID_ESTADO_PEDIDO; + private String NOMBRE_ESTADO; + + public Estado_Pedidos() { + this.ID_ESTADO_PEDIDO = ID_ESTADO_PEDIDO; + this.NOMBRE_ESTADO = NOMBRE_ESTADO; + } + + public Long getID_ESTADO_PEDIDO() { + return ID_ESTADO_PEDIDO; + } + + public void setID_ESTADO_PEDIDO(Long ID_ESTADO_PEDIDO) { + this.ID_ESTADO_PEDIDO = ID_ESTADO_PEDIDO; + } + + public String getNOMBRE_ESTADO() { + return NOMBRE_ESTADO; + } + + public void setNOMBRE_ESTADO(String NOMBRE_ESTADO) { + this.NOMBRE_ESTADO = NOMBRE_ESTADO; + } +} \ No newline at end of file diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/model/Ingredientes.java b/api_/Proyecto/src/main/java/com/example/Proyecto/model/Ingredientes.java new file mode 100644 index 0000000..fdc4fc1 --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/model/Ingredientes.java @@ -0,0 +1,61 @@ +package com.example.Proyecto.model; + +import java.util.Date; + +public class Ingredientes { + private int idIngrediente; + private int idProveedor; + private int idCategoria; + private String nombreIngrediente; + private int cantidadIngrediente; + private Date fechaVencimiento; + private String referenciaIngrediente; + private Date fechaEntregaIngrediente; + + // Constructor vacío + public Ingredientes() {} + + // Constructor con parámetros + public Ingredientes(int idIngrediente, + int idProveedor, + int idCategoria, + String nombreIngrediente, + int cantidadIngrediente, + Date fechaVencimiento, + String referenciaIngrediente, + Date fechaEntregaIngrediente) { + this.idIngrediente = idIngrediente; + this.idProveedor = idProveedor; + this.idCategoria = idCategoria; + this.nombreIngrediente = nombreIngrediente; + this.cantidadIngrediente = cantidadIngrediente; + this.fechaVencimiento = fechaVencimiento; + this.referenciaIngrediente = referenciaIngrediente; + this.fechaEntregaIngrediente = fechaEntregaIngrediente; + } + + // Getters y Setters + public int getIdIngrediente() { return idIngrediente; } + public void setIdIngrediente(int idIngrediente) { this.idIngrediente = idIngrediente; } + + public int getIdProveedor() { return idProveedor; } + public void setIdProveedor(int idProveedor) { this.idProveedor = idProveedor; } + + public int getIdCategoria() { return idCategoria; } + public void setIdCategoria(int idCategoria) { this.idCategoria = idCategoria; } + + public String getNombreIngrediente() { return nombreIngrediente; } + public void setNombreIngrediente(String nombreIngrediente) { this.nombreIngrediente = nombreIngrediente; } + + public int getCantidadIngrediente() { return cantidadIngrediente; } + public void setCantidadIngrediente(int cantidadIngrediente) { this.cantidadIngrediente = cantidadIngrediente; } + + public Date getFechaVencimiento() { return fechaVencimiento; } + public void setFechaVencimiento(Date fechaVencimiento) { this.fechaVencimiento = fechaVencimiento; } + + public String getReferenciaIngrediente() { return referenciaIngrediente; } + public void setReferenciaIngrediente(String referenciaIngrediente) { this.referenciaIngrediente = referenciaIngrediente; } + + public Date getFechaEntregaIngrediente() { return fechaEntregaIngrediente; } + public void setFechaEntregaIngrediente(Date fechaEntregaIngrediente) { this.fechaEntregaIngrediente = fechaEntregaIngrediente; } +} diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/model/Ordenes_salida.java b/api_/Proyecto/src/main/java/com/example/Proyecto/model/Ordenes_salida.java new file mode 100644 index 0000000..9d805d8 --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/model/Ordenes_salida.java @@ -0,0 +1,80 @@ +package com.example.Proyecto.model; + +import jakarta.persistence.*; + +import java.time.LocalDate; + +@Entity +@Table(name = "ordenes_salida") +public class Ordenes_salida { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "ID_FACTURA") + private int idFactura; // ID_FACTURA + + @Column(name = "ID_CLIENTE") + private Long idCliente; // ID_CLIENTE + + @Column(name = "ID_PEDIDO") + private Long idPedido; // ID_PEDIDO + + @Column(name = "FECHA_FACTURACION") + private LocalDate fechaFacturacion; // FECHA_FACTURACION + + @Column(name = "TOTAL_FACTURA") + private double totalFactura; // TOTAL_FACTURA + + // Constructor vacío requerido por JPA + public Ordenes_salida() {} + + // Constructor + public Ordenes_salida(int idFactura, Long idCliente, Long idPedido, LocalDate fechaFacturacion, double totalFactura) { + this.idFactura = idFactura; + this.idCliente = idCliente; + this.idPedido = idPedido; + this.fechaFacturacion = fechaFacturacion; + this.totalFactura = totalFactura; + } + + // METODOS + public int getIdFactura() { + return idFactura; + } + + public void setIdFactura(int idFactura) { + this.idFactura = idFactura; + } + + public Long getIdCliente() { + return idCliente; + } + + public void setIdCliente(Long idCliente) { + this.idCliente = idCliente; + } + + public Long getIdPedido() { + return idPedido; + } + + public void setIdPedido(Long idPedido) { + this.idPedido = idPedido; + } + + public LocalDate getFechaFacturacion() { + return fechaFacturacion; + } + + public void setFechaFacturacion(LocalDate fechaFacturacion) { + this.fechaFacturacion = fechaFacturacion; + } + + public double getTotalFactura() { + return totalFactura; + } + + public void setTotalFactura(double totalFactura) { + this.totalFactura = totalFactura; + } +} diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/model/Pedidos.java b/api_/Proyecto/src/main/java/com/example/Proyecto/model/Pedidos.java new file mode 100644 index 0000000..4c67b60 --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/model/Pedidos.java @@ -0,0 +1,73 @@ +package com.example.Proyecto.model; + +import java.math.BigDecimal; +import java.util.Date; + +public class Pedidos { + + private long ID_CLIENTE; + private long ID_EMPLEADO; + private long ID_ESTADO_PEDIDO; + private Date FECHA_INGRESO; + private Date FECHA_ENTREGA; + private BigDecimal TOTAL_PRODUCTO; + + public Pedidos() { + this.ID_CLIENTE = ID_CLIENTE; + this.ID_EMPLEADO = ID_EMPLEADO; + this.ID_ESTADO_PEDIDO = ID_ESTADO_PEDIDO; + this.FECHA_INGRESO = FECHA_INGRESO; + this.FECHA_ENTREGA = FECHA_ENTREGA; + this.TOTAL_PRODUCTO = TOTAL_PRODUCTO; + } + + public int getID_CLIENTE() { + return (int) ID_CLIENTE; + } + + public void setID_CLIENTE(long ID_CLIENTE) { + this.ID_CLIENTE = ID_CLIENTE; + } + + public int getID_EMPLEADO() { + return (int) ID_EMPLEADO; + } + + public void setID_EMPLEADO(long ID_EMPLEADO) { + this.ID_EMPLEADO = ID_EMPLEADO; + } + + public int getID_ESTADO_PEDIDO() { + return (int) ID_ESTADO_PEDIDO; + } + + public void setID_ESTADO_PEDIDO(long ID_ESTADO_PEDIDO) { + this.ID_ESTADO_PEDIDO = ID_ESTADO_PEDIDO; + } + + public Date getFECHA_INGRESO() { + return FECHA_INGRESO; + } + + public void setFECHA_INGRESO(Date FECHA_INGRESO) { + this.FECHA_INGRESO = FECHA_INGRESO; + } + + public Date getFECHA_ENTREGA() { + return FECHA_ENTREGA; + } + + public void setFECHA_ENTREGA(Date FECHA_ENTREGA) { + this.FECHA_ENTREGA = FECHA_ENTREGA; + } + + public BigDecimal getTOTAL_PRODUCTO() { + return TOTAL_PRODUCTO; + } + + public void setTOTAL_PRODUCTO(BigDecimal TOTAL_PRODUCTO) { + this.TOTAL_PRODUCTO = TOTAL_PRODUCTO; + } +} + + diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/model/Pedidos_Proveedores.java b/api_/Proyecto/src/main/java/com/example/Proyecto/model/Pedidos_Proveedores.java new file mode 100644 index 0000000..43cfef7 --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/model/Pedidos_Proveedores.java @@ -0,0 +1,50 @@ +package com.example.Proyecto.model; + +import java.sql.Date; + +public class Pedidos_Proveedores { + + private Long ID_PROVEEDOR; + private long NUMERO_PEDIDO; + private long FECHA_PEDIDO; + private Date ESTADO_PEDIDO; + + public Pedidos_Proveedores() { + this.ID_PROVEEDOR = ID_PROVEEDOR; + this.NUMERO_PEDIDO = NUMERO_PEDIDO; + this.FECHA_PEDIDO = FECHA_PEDIDO; + this.ESTADO_PEDIDO = ESTADO_PEDIDO; + } + + public Long getID_PROVEEDOR() { + return ID_PROVEEDOR; + } + + public void setID_PROVEEDOR(Long ID_PROVEEDOR) { + this.ID_PROVEEDOR = ID_PROVEEDOR; + } + + public long getNUMERO_PEDIDO() { + return NUMERO_PEDIDO; + } + + public void setNUMERO_PEDIDO(long NUMERO_PEDIDO) { + this.NUMERO_PEDIDO = NUMERO_PEDIDO; + } + + public long getFECHA_PEDIDO() { + return FECHA_PEDIDO; + } + + public void setFECHA_PEDIDO(long FECHA_PEDIDO) { + this.FECHA_PEDIDO = FECHA_PEDIDO; + } + + public Date getESTADO_PEDIDO() { + return ESTADO_PEDIDO; + } + + public void setESTADO_PEDIDO(java.sql.Date ESTADO_PEDIDO) { + this.ESTADO_PEDIDO = ESTADO_PEDIDO; + } +} diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/model/PojoAdmin.java b/api_/Proyecto/src/main/java/com/example/Proyecto/model/PojoAdmin.java new file mode 100644 index 0000000..697f491 --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/model/PojoAdmin.java @@ -0,0 +1,51 @@ +package com.example.Proyecto.model; +public class PojoAdmin { + private int id; + private String nombre; + private String email; + private String telefono; + private String contrasena; + + public PojoAdmin() { + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getNombre() { + return nombre; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getTelefono() { + return telefono; + } + + public void setTelefono(String telefono) { + this.telefono = telefono; + } + + public String getContrasena() { + return contrasena; + } + + public void setContrasena(String contrasena) { + this.contrasena = contrasena; + } +} \ No newline at end of file diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/model/PojoCliente.java b/api_/Proyecto/src/main/java/com/example/Proyecto/model/PojoCliente.java new file mode 100644 index 0000000..a24d3fa --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/model/PojoCliente.java @@ -0,0 +1,43 @@ +package com.example.Proyecto.model; + +public class PojoCliente { + private int id; + private String nombre; + private String email; + private String telefono; + private String contrasena; + + public PojoCliente() {} + + public int getId() {return id;} + + public void setId(int id) {this.id = id;} + + public String getNombre() { + return nombre; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getTelefono() { + return telefono; + } + + public void setTelefono(String telefono) { this.telefono = telefono; } + + public String getContrasena() { return contrasena; } + + public void setContrasena(String contrasena) {this.contrasena = contrasena;} +} + + diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/model/PojoDeleteEmpleado.java b/api_/Proyecto/src/main/java/com/example/Proyecto/model/PojoDeleteEmpleado.java new file mode 100644 index 0000000..a7c9365 --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/model/PojoDeleteEmpleado.java @@ -0,0 +1,19 @@ +package com.example.Proyecto.model; + +public class PojoDeleteEmpleado { + + private Long id; + + public PojoDeleteEmpleado() {} + + public PojoDeleteEmpleado(Long id) { + this.id = id; + } + + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + } diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/model/PojoEmpleado.java b/api_/Proyecto/src/main/java/com/example/Proyecto/model/PojoEmpleado.java new file mode 100644 index 0000000..1b94b08 --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/model/PojoEmpleado.java @@ -0,0 +1,44 @@ +package com.example.Proyecto.model; + +public class PojoEmpleado { + private int id; + private String nombre; + private String email; + private String contrasena; + + public PojoEmpleado() { + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getNombre() { + return nombre; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + + public String getContrasena(){ + return contrasena; + } + + public void setContrasena(String contrasena){ + this.contrasena = contrasena; + } +} diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/model/PojoProductos.java b/api_/Proyecto/src/main/java/com/example/Proyecto/model/PojoProductos.java new file mode 100644 index 0000000..473bb68 --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/model/PojoProductos.java @@ -0,0 +1,62 @@ +package com.example.Proyecto.model; +import java.time.LocalDate; + + +public class PojoProductos { + private int id; + private String nombreProducto; + private int stockMinimo; + private int precio; + private LocalDate fechaVencimiento; + private String marcaProducto; + + public PojoProductos() {} + + // Getters y Setters + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getNombreProducto() { + return nombreProducto; + } + + public void setNombreProducto(String nombreProducto) { + this.nombreProducto = nombreProducto; + } + + public int getStockMinimo() { + return stockMinimo; + } + + public void setStockMinimo(int stockMinimo) { + this.stockMinimo = stockMinimo; + } + + public int getPrecio() { + return precio; + } + + public void setPrecio(int precio) { + this.precio = precio; + } + + public LocalDate getFechaVencimiento() { + return fechaVencimiento; + } + + public void setFechaVencimiento(LocalDate fechaVencimiento) { + this.fechaVencimiento = fechaVencimiento; + } + public String getMarcaProducto(){ + return marcaProducto; + } + + public void setMarcaProducto(String marcaProducto) { + this.marcaProducto = marcaProducto; + } +} diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/service/Administrador/ConexionAdminService.java b/api_/Proyecto/src/main/java/com/example/Proyecto/service/Administrador/ConexionAdminService.java new file mode 100644 index 0000000..529a4cf --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/service/Administrador/ConexionAdminService.java @@ -0,0 +1,66 @@ +package com.example.Proyecto.service.Administrador; +import com.example.Proyecto.model.PojoAdmin; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.lang.NonNull; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class ConexionAdminService { + @Autowired + private JdbcTemplate jdbcTemplate; + @Autowired + private PasswordEncoder passwordEncoder; + + public List> obtenerDetallesAdministrador() { + String sql = "SELECT ID_ADMIN, NOMBRE_ADMIN, TELEFONO_ADMIN, EMAIL_ADMIN FROM Administradores"; + return jdbcTemplate.query(sql, new RowMapper>() { + @Override + public Map mapRow(@NonNull ResultSet rs, int rowNum) throws SQLException { + Map administrador = new HashMap<>(); + administrador.put("Id:", rs.getInt("ID_ADMIN")); + administrador.put("Nombre:", rs.getString("NOMBRE_ADMIN")); + administrador.put("Correo Electronico:", rs.getString("EMAIL_ADMIN")); + administrador.put("Telefono:", rs.getString("TELEFONO_ADMIN")); + return administrador; + } + }); + } + + public boolean crearAdmin(PojoAdmin pojoAdmin) { + String sql = "INSERT INTO Administradores (NOMBRE_ADMIN, EMAIL_ADMIN, TELEFONO_ADMIN, CONTRASEÑA_ADMIN) VALUES (?, ?, ?, ?)"; + try { + if (pojoAdmin.getContrasena() == null || pojoAdmin.getContrasena().trim().isEmpty()) { + System.out.println("Error: La contraseña no puede ser nula o vacía"); + return false; + } + + String contrasenaHasheada = passwordEncoder.encode(pojoAdmin.getContrasena()); + int result = jdbcTemplate.update(sql, pojoAdmin.getNombre(), pojoAdmin.getEmail(), pojoAdmin.getTelefono(), contrasenaHasheada); + return result > 0; + } catch (DataAccessException e) { + return false; + } + } + + public boolean actualizarAdministrador(PojoAdmin pojoAdmin) { + String sql = "UPDATE Administradores SET NOMBRE_ADMIN = ?, EMAIL_ADMIN = ?, TELEFONO_ADMIN=?, CONTRASENA_ADMIN = ? WHERE ID_ADMIN = ?"; + try { + String contrasenaHasheada = passwordEncoder.encode(pojoAdmin.getContrasena()); + int value = jdbcTemplate.update( + sql, pojoAdmin.getNombre(), pojoAdmin.getEmail(), pojoAdmin.getTelefono(), contrasenaHasheada, pojoAdmin.getId()); + return value > 0; + } catch (DataAccessException e) { + e.printStackTrace(); + return false; + } + } +} diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/service/CategoriaIngredientesService/CategoriaIngredientes.java b/api_/Proyecto/src/main/java/com/example/Proyecto/service/CategoriaIngredientesService/CategoriaIngredientes.java new file mode 100644 index 0000000..6c0033d --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/service/CategoriaIngredientesService/CategoriaIngredientes.java @@ -0,0 +1,25 @@ +// Archivo: CategoriaIngredientes.java +package com.example.Proyecto.service.CategoriaIngredientesService; + +public class CategoriaIngredientes { + private int idCategoriaIngrediente; + private String nombreCategoria; + + public CategoriaIngredientes() {} + + public int getIdCategoriaIngrediente() { + return idCategoriaIngrediente; + } + + public void setIdCategoriaIngrediente(int idCategoriaIngrediente) { + this.idCategoriaIngrediente = idCategoriaIngrediente; + } + + public String getNombreCategoria() { + return nombreCategoria; + } + + public void setNombreCategoria(String nombreCategoria) { + this.nombreCategoria = nombreCategoria; + } +} \ No newline at end of file diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/service/CategoriaIngredientesService/CategoriaIngredientesService.java b/api_/Proyecto/src/main/java/com/example/Proyecto/service/CategoriaIngredientesService/CategoriaIngredientesService.java new file mode 100644 index 0000000..44c73df --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/service/CategoriaIngredientesService/CategoriaIngredientesService.java @@ -0,0 +1,50 @@ +package com.example.Proyecto.service.CategoriaIngredientesService; + +import com.example.Proyecto.service.CategoriaIngredientesService.CategoriaIngredientes; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.lang.NonNull; +import org.springframework.stereotype.Service; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +@Service +public class CategoriaIngredientesService { + + @Autowired + private JdbcTemplate jdbcTemplate; + + // Obtener todas las categorías de ingredientes + public List obtenerTodasLasCategoriasIngredientes() { + String sql = "SELECT * FROM Categoria_Ingredientes"; + return jdbcTemplate.query(sql, new RowMapper() { + @Override + public CategoriaIngredientes mapRow(@NonNull ResultSet rs, int rowNum) throws SQLException { + CategoriaIngredientes categoria = new CategoriaIngredientes(); + categoria.setIdCategoriaIngrediente(rs.getInt("ID_CATEGORIA")); + categoria.setNombreCategoria(rs.getString("NOMBRE_CATEGORIA_INGREDIENTE")); + return categoria; + } + }); + } + + // Crear una nueva categoría (POST) + public void crearCategoriaIngrediente(CategoriaIngredientes categoria) { + String sql = "INSERT INTO Categoria_Ingredientes (NOMBRE_CATEGORIA_INGREDIENTE) VALUES (?)"; + jdbcTemplate.update(sql, categoria.getNombreCategoria()); + } + + // Actualizar una categoría existente (PUT) + public int editarCategoriaIngrediente(CategoriaIngredientes categoria) { + String sql = "UPDATE Categoria_Ingredientes SET NOMBRE_CATEGORIA_INGREDIENTE=? WHERE ID_CATEGORIA=?"; + return jdbcTemplate.update(sql, categoria.getNombreCategoria(), categoria.getIdCategoriaIngrediente()); + } + + // Eliminar una categoría por ID (DELETE) + public int eliminarCategoriaIngrediente(int idCategoria) { + String sql = "DELETE FROM Categoria_Ingredientes WHERE ID_CATEGORIA = ?"; + return jdbcTemplate.update(sql, idCategoria); + } +} \ No newline at end of file diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/service/Clientes/ConexionClienteService.java b/api_/Proyecto/src/main/java/com/example/Proyecto/service/Clientes/ConexionClienteService.java new file mode 100644 index 0000000..0b53f8a --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/service/Clientes/ConexionClienteService.java @@ -0,0 +1,63 @@ +package com.example.Proyecto.service.Clientes; +import com.example.Proyecto.model.PojoCliente; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.dao.DataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.lang.NonNull; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class ConexionClienteService { + @Autowired + private JdbcTemplate jdbcTemplate; + @Autowired + private PasswordEncoder passwordEncoder; + + public List> obtenerDetallesCliente() { + String sql = "SELECT TELEFONO_CLI, EMAIL_CLI, NOMBRE_CLI FROM Clientes"; + return jdbcTemplate.query(sql, new RowMapper>() { + @Override + public Map mapRow(@NonNull ResultSet rs, int rowNum) throws SQLException { + Map cliente = new HashMap<>(); + cliente.put("Nombre:", rs.getString("NOMBRE_CLI")); + cliente.put("Correo Electronico:", rs.getString("EMAIL_CLI")); + cliente.put("Telefono:", rs.getString("TELEFONO_CLI")); + return cliente; + } + }); + } + + public boolean crearCliente(PojoCliente pojoCliente) { + String sql = "INSERT INTO Clientes (NOMBRE_CLI, EMAIL_CLI, TELEFONO_CLI, CONTRASENA_CLI) VALUES (?, ?, ?, ?)"; + try { + if (pojoCliente.getContrasena() == null || pojoCliente.getContrasena().trim().isEmpty()) { + System.out.println("Error: La contraseña no puede ser nula o vacía"); + return false; + } + String contrasenaHasheada = passwordEncoder.encode(pojoCliente.getContrasena()); + int result = jdbcTemplate.update(sql, pojoCliente.getNombre(), pojoCliente.getEmail(), pojoCliente.getTelefono(), contrasenaHasheada); + return result > 0; + } catch (DataAccessException e) { + return false; + } + } + public boolean actualizarCliente(PojoCliente pojoCliente) { + String sql = "UPDATE Clientes SET NOMBRE_CLI = ?, EMAIL_CLI = ?, TELEFONO_CLI = ?, CONTRASENA_CLI = ? WHERE ID_CLIENTE = ?"; + try { + String contrasenaHasheada = passwordEncoder.encode(pojoCliente.getContrasena()); + int value = jdbcTemplate.update(sql, pojoCliente.getNombre(), pojoCliente.getEmail(), pojoCliente.getTelefono(), contrasenaHasheada, pojoCliente.getId()); + return value > 0; + } catch (DataAccessException e) { + e.printStackTrace(); + return false; + } + } +} + diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/service/DetallePedidos/DetallePedidos.java b/api_/Proyecto/src/main/java/com/example/Proyecto/service/DetallePedidos/DetallePedidos.java new file mode 100644 index 0000000..04a913f --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/service/DetallePedidos/DetallePedidos.java @@ -0,0 +1,33 @@ +// Archivo: DetallePedidos.java +package com.example.Proyecto.service.DetallePedidos; + +import java.math.BigDecimal; + +public class DetallePedidos { + private int idDetalle; + private int idPedido; + private int idProducto; + private int cantidadProducto; + private BigDecimal precioUnitario; + private BigDecimal subtotal; + + public DetallePedidos() {} + + public int getIdDetalle() { return idDetalle; } + public void setIdDetalle(int idDetalle) { this.idDetalle = idDetalle; } + + public int getIdPedido() { return idPedido; } + public void setIdPedido(int idPedido) { this.idPedido = idPedido; } + + public int getIdProducto() { return idProducto; } + public void setIdProducto(int idProducto) { this.idProducto = idProducto; } + + public int getCantidadProducto() { return cantidadProducto; } + public void setCantidadProducto(int cantidadProducto) { this.cantidadProducto = cantidadProducto; } + + public BigDecimal getPrecioUnitario() { return precioUnitario; } + public void setPrecioUnitario(BigDecimal precioUnitario) { this.precioUnitario = precioUnitario; } + + public BigDecimal getSubtotal() { return subtotal; } + public void setSubtotal(BigDecimal subtotal) { this.subtotal = subtotal; } +} \ No newline at end of file diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/service/DetallePedidos/DetallePedidosService.java b/api_/Proyecto/src/main/java/com/example/Proyecto/service/DetallePedidos/DetallePedidosService.java new file mode 100644 index 0000000..8a72c1e --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/service/DetallePedidos/DetallePedidosService.java @@ -0,0 +1,67 @@ +package com.example.Proyecto.service.DetallePedidos; + +import com.example.Proyecto.service.DetallePedidos.DetallePedidos; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.lang.NonNull; +import org.springframework.stereotype.Service; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +@Service +public class DetallePedidosService { + + @Autowired + private JdbcTemplate jdbcTemplate; + + // Obtener todos los detalles de pedidos + public List obtenerTodosLosDetallesPedidos() { + String sql = "SELECT * FROM Detalle_Pedidos"; + return jdbcTemplate.query(sql, new RowMapper() { + @Override + public DetallePedidos mapRow(@NonNull ResultSet rs, int rowNum) throws SQLException { + DetallePedidos detalle = new DetallePedidos(); + detalle.setIdDetalle(rs.getInt("ID_DETALLE")); + detalle.setIdPedido(rs.getInt("ID_PEDIDO")); + detalle.setIdProducto(rs.getInt("ID_PRODUCTO")); + detalle.setCantidadProducto(rs.getInt("CANTIDAD_PRODUCTO")); + detalle.setPrecioUnitario(rs.getBigDecimal("PRECIO_UNITARIO")); + detalle.setSubtotal(rs.getBigDecimal("SUBTOTAL")); + return detalle; + } + }); + } + + // Crear un nuevo detalle de pedido (POST) + public void crearDetallePedido(DetallePedidos detalle) { + String sql = "INSERT INTO Detalle_Pedidos (ID_PEDIDO, ID_PRODUCTO, CANTIDAD_PRODUCTO, PRECIO_UNITARIO, SUBTOTAL) VALUES (?, ?, ?, ?, ?)"; + jdbcTemplate.update(sql, + detalle.getIdPedido(), + detalle.getIdProducto(), + detalle.getCantidadProducto(), + detalle.getPrecioUnitario(), + detalle.getSubtotal() + ); + } + + // Actualizar un detalle de pedido (PUT) + public int editarDetallePedido(DetallePedidos detalle) { + String sql = "UPDATE Detalle_Pedidos SET ID_PEDIDO=?, ID_PRODUCTO=?, CANTIDAD_PRODUCTO=?, PRECIO_UNITARIO=?, SUBTOTAL=? WHERE ID_DETALLE=?"; + return jdbcTemplate.update(sql, + detalle.getIdPedido(), + detalle.getIdProducto(), + detalle.getCantidadProducto(), + detalle.getPrecioUnitario(), + detalle.getSubtotal(), + detalle.getIdDetalle() + ); + } + + // Eliminar un detalle de pedido (DELETE) + public int eliminarDetallePedido(int idDetalle) { + String sql = "DELETE FROM Detalle_Pedidos WHERE ID_DETALLE = ?"; + return jdbcTemplate.update(sql, idDetalle); + } +} \ No newline at end of file diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/service/Empleados/ConexionEmpleadoService.java b/api_/Proyecto/src/main/java/com/example/Proyecto/service/Empleados/ConexionEmpleadoService.java new file mode 100644 index 0000000..640c173 --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/service/Empleados/ConexionEmpleadoService.java @@ -0,0 +1,78 @@ +package com.example.Proyecto.service.Empleados; +import com.example.Proyecto.model.PojoEmpleado; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.lang.NonNull; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service + +public class ConexionEmpleadoService { + @Autowired + private JdbcTemplate jdbcTemplate; + @Autowired + private PasswordEncoder passwordEncoder; + + public List> obtenerDetallesEmpleado() { + String sql = "SELECT ID_EMPLEADO, NOMBRE_EMPLEADO, EMAIL_EMPLEADO, ACTIVO_EMPLEADO FROM Empleados"; + return jdbcTemplate.query(sql, new RowMapper>() { + @Override + public Map mapRow(@NonNull ResultSet rs, int rowNum) throws SQLException { + Map empleado = new HashMap<>(); + empleado.put("Id:", rs.getInt("ID_EMPLEADO")); + empleado.put("Nombre:", rs.getString("NOMBRE_EMPLEADO")); + empleado.put("Correo Electronico:", rs.getString("EMAIL_EMPLEADO")); + + int estado = rs.getInt("ACTIVO_EMPLEADO"); + String estadoTexto = (estado == 1) ? "ACTIVO" : "INACTIVO"; + empleado.put("Estado del Empleado", estadoTexto); + return empleado; + } + }); + } + + public boolean crearEmpleado(PojoEmpleado pojoEmpleado) { + String sql = "INSERT INTO Empleados (ID_EMPLEADO, NOMBRE_EMPLEADO, EMAIL_EMPLEADO, CONTRASENA_EMPLEADO) VALUES (?, ?, ?, ?)"; + try { + if (pojoEmpleado.getContrasena() == null || pojoEmpleado.getContrasena().trim().isEmpty()) { + System.out.println("Error: La contraseña no puede ser nula o vacía"); + return false; + } + String contrasenaHasheada = passwordEncoder.encode(pojoEmpleado.getContrasena()); + int result = jdbcTemplate.update(sql, pojoEmpleado.getId(), pojoEmpleado.getNombre(), pojoEmpleado.getEmail(), contrasenaHasheada); + return result > 0; + } finally { + } + } + + public boolean eliminarEmpleado(Long id) { + String sql = "DELETE FROM Empleados WHERE ID_EMPLEADO = ?"; + try { + int value = jdbcTemplate.update(sql, id); + return value > 0; + } catch (DataAccessException e) { + return false; + } + } + + public boolean actualizarEmpleado(PojoEmpleado pojoEmpleado) { + String sql = "UPDATE Empleados SET NOMBRE_EMPLEADO = ?, EMAIL_EMPLEADO = ?, CONTRASENA_EMPLEADO = ? WHERE ID_EMPLEADO = ?"; + try { + String contrasenaHasheada = passwordEncoder.encode(pojoEmpleado.getContrasena()); + int value = jdbcTemplate.update( + sql, pojoEmpleado.getNombre(), pojoEmpleado.getEmail(), contrasenaHasheada, pojoEmpleado.getId()); + return value > 0; + } catch (DataAccessException e) { + e.printStackTrace(); + return false; + } + } +} diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/service/Ingredientes/IngredientesService.java b/api_/Proyecto/src/main/java/com/example/Proyecto/service/Ingredientes/IngredientesService.java new file mode 100644 index 0000000..09fceeb --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/service/Ingredientes/IngredientesService.java @@ -0,0 +1,106 @@ +package com.example.Proyecto.service.Ingredientes; + +import com.example.Proyecto.controller.CategoriaIngredientesController; +import com.example.Proyecto.model.Ingredientes; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; +import org.springframework.jdbc.core.RowMapper; + +@Service +public class IngredientesService { + + @Autowired + private JdbcTemplate jdbcTemplate; + + // Metodo para obtener lista de nombres de ingredientes + public List obtenerIngredientes() { + String sql = "SELECT NOMBRE_INGREDIENTE FROM Ingredientes"; + return jdbcTemplate.query(sql, new RowMapper() { + @Override + public String mapRow(ResultSet rs, int rowNum) throws SQLException { + return rs.getString("NOMBRE_INGREDIENTE"); + } + }); + } + + // Metodo para obtener todos los ingredientes + public List obtenerTodosLosIngredientes() { + String sql = "SELECT * FROM Ingredientes"; + return jdbcTemplate.query(sql, new RowMapper() { + @Override + public Ingredientes mapRow(ResultSet rs, int rowNum) throws SQLException { + Ingredientes ingrediente = new Ingredientes(); + ingrediente.setIdIngrediente(rs.getInt("ID_INGREDIENTE")); + ingrediente.setIdProveedor(rs.getInt("ID_PROVEEDOR")); + ingrediente.setIdCategoria(rs.getInt("ID_CATEGORIA")); + ingrediente.setNombreIngrediente(rs.getString("NOMBRE_INGREDIENTE")); + ingrediente.setCantidadIngrediente(rs.getInt("CANTIDAD_INGREDIENTE")); + ingrediente.setFechaVencimiento(rs.getDate("FECHA_VENCIMIENTO")); + ingrediente.setReferenciaIngrediente(rs.getString("REFERENCIA_INGREDIENTE")); + return ingrediente; + } + }); + } + + + // Metodo para crear un nuevo ingrediente (POST) + public void crearIngrediente(Ingredientes ingrediente) { + String sql = "INSERT INTO Ingredientes (ID_PROVEEDOR, ID_CATEGORIA, NOMBRE_INGREDIENTE, CANTIDAD_INGREDIENTE, FECHA_VENCIMIENTO, REFERENCIA_INGREDIENTE, FECHA_ENTREGA_INGREDIENTE) " + + "VALUES (?, ?, ?, ?, ?, ?, ?)"; + jdbcTemplate.update(sql, + ingrediente.getIdProveedor(), // ID_PROVEEDOR + ingrediente.getIdCategoria(), // ID_CATEGORIA + ingrediente.getNombreIngrediente(), // NOMBRE_INGREDIENTE + ingrediente.getCantidadIngrediente(), // CANTIDAD_INGREDIENTE + ingrediente.getFechaVencimiento(), // FECHA_VENCIMIENTO + ingrediente.getReferenciaIngrediente(), // REFERENCIA_INGREDIENTE + ingrediente.getFechaEntregaIngrediente()// FECHA_ENTREGA_INGREDIENTE + ); + } + //Intento metodo + // Metodo para actualizar un ingrediente (PUT) + public int editarIngrediente(Ingredientes ingrediente) { + String sql = "UPDATE Ingredientes SET " + + "ID_PROVEEDOR = ?, " + + "ID_CATEGORIA = ?, " + + "NOMBRE_INGREDIENTE = ?, " + + "CANTIDAD_INGREDIENTE = ?, " + + "FECHA_VENCIMIENTO = ?, " + + "REFERENCIA_INGREDIENTE = ?, " + + "FECHA_ENTREGA_INGREDIENTE = ? " + + "WHERE ID_INGREDIENTE = ?"; + // + return jdbcTemplate.update(sql, + ingrediente.getIdProveedor(), + ingrediente.getIdCategoria(), + ingrediente.getNombreIngrediente(), + ingrediente.getCantidadIngrediente(), + ingrediente.getFechaVencimiento(), + ingrediente.getReferenciaIngrediente(), + ingrediente.getFechaEntregaIngrediente(), + ingrediente.getIdIngrediente() // se actualiza el que tiene este ID + ); + } + + + // Metodo para eliminar un ingrediente (DELETE) + public int eliminarIngrediente(int idIngrediente) { + String sql = "DELETE FROM Ingredientes WHERE ID_INGREDIENTE = ?"; + return jdbcTemplate.update(sql, idIngrediente); + } + + //Métodod para actualizar cantidad de ingrediente + public int actualizarCantidad(int id, int cantidad) { + return jdbcTemplate.update( + "UPDATE Ingredientes SET CANTIDAD_INGREDIENTE=? WHERE ID_INGREDIENTE=?", + cantidad, id + ); + } + + + +} diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/service/Ordenes_salida/Ordenes_salidaService.java b/api_/Proyecto/src/main/java/com/example/Proyecto/service/Ordenes_salida/Ordenes_salidaService.java new file mode 100644 index 0000000..8f8c901 --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/service/Ordenes_salida/Ordenes_salidaService.java @@ -0,0 +1,30 @@ +package com.example.Proyecto.service.Ordenes_salida; + +import com.example.Proyecto.model.Ordenes_salida; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; +import java.util.List; + +@Service +public class Ordenes_salidaService { + + private final JdbcTemplate jdbcTemplate; + + public Ordenes_salidaService(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + public List obtenerOrdenesSalida() { + String sql = "SELECT ID_FACTURA, ID_CLIENTE, ID_PEDIDO, FECHA_FACTURACION, TOTAL_FACTURA FROM ordenes_salida"; + + return jdbcTemplate.query(sql, (rs, rowNum) -> + new Ordenes_salida( + rs.getInt("ID_FACTURA"), + rs.getLong("ID_CLIENTE"), + rs.getLong("ID_PEDIDO"), + rs.getDate("FECHA_FACTURACION").toLocalDate(), + rs.getDouble("TOTAL_FACTURA") + ) + ); + } +} diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/service/Pedidos/Estados_PedidosService.java b/api_/Proyecto/src/main/java/com/example/Proyecto/service/Pedidos/Estados_PedidosService.java new file mode 100644 index 0000000..9caa8be --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/service/Pedidos/Estados_PedidosService.java @@ -0,0 +1,69 @@ +package com.example.Proyecto.service.Pedidos; + +import com.example.Proyecto.model.Estado_Pedidos; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; +import org.springframework.lang.NonNull; +import org.springframework.stereotype.Service; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.List; + +@Service +public class Estados_PedidosService { + + @Autowired + private JdbcTemplate jdbcTemplate; + + // Método para obtener todos los Estados (GET) + public List obtenerEstado_Pedidos() { + String sql = "SELECT * FROM Estado_Pedidos"; + + return jdbcTemplate.query(sql, new RowMapper() { + @Override + public Estado_Pedidos mapRow(@NonNull ResultSet rs, int rowNum) throws SQLException { + Estado_Pedidos estadoPedidos = new Estado_Pedidos(); + // Se agrega el mapeo para el ID + estadoPedidos.setID_ESTADO_PEDIDO(rs.getLong("ID_ESTADO_PEDIDO")); + estadoPedidos.setNOMBRE_ESTADO(rs.getString("NOMBRE_ESTADO")); + return estadoPedidos; + } + }); + } + + // Metodo para crear Estados Pedido (POST) + public Long crearEstadoPedido(Estado_Pedidos estado) { + String sql = "INSERT INTO Estado_Pedidos (NOMBRE_ESTADO) VALUES (?)"; + KeyHolder keyHolder = new GeneratedKeyHolder(); + + jdbcTemplate.update(connection -> { + PreparedStatement ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); + ps.setString(1, estado.getNOMBRE_ESTADO()); + return ps; + }, keyHolder); + + // Se devuelve un Long para evitar posibles desbordamientos + Number key = keyHolder.getKey(); + return key != null ? key.longValue() : -1L; + } + + // Metodo para Actualizar Estados Pedido (PUT) + public void actualizarEstado(Long id, Estado_Pedidos estado) { + String sql = "UPDATE Estado_Pedidos SET NOMBRE_ESTADO = ? WHERE ID_ESTADO_PEDIDO = ?"; + jdbcTemplate.update(sql, estado.getNOMBRE_ESTADO(), id); + } + + // Metodo para Eliminar Estados Pedido (DELETE) + public void eliminarestadoPedido(Long id) { + // Se corrige el nombre de la columna para que coincida con la tabla + String sql = "DELETE FROM Estado_Pedidos WHERE ID_ESTADO_PEDIDO = ?"; + jdbcTemplate.update(sql, id); + } +} + diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/service/Pedidos/pedidosService.java b/api_/Proyecto/src/main/java/com/example/Proyecto/service/Pedidos/pedidosService.java new file mode 100644 index 0000000..fe838a0 --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/service/Pedidos/pedidosService.java @@ -0,0 +1,79 @@ +package com.example.Proyecto.service.Pedidos; + +import com.example.Proyecto.model.Pedidos; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; +import org.springframework.lang.NonNull; +import org.springframework.stereotype.Service; + +import java.sql.*; +import java.util.List; + +@Service +public class pedidosService { + + @Autowired + private JdbcTemplate jdbcTemplate; + + // Método para obtener todos los pedidos (GET) + public List obtenerPedidos() { + String sql = "SELECT * FROM Pedidos"; + return jdbcTemplate.query(sql, new RowMapper() { + @Override + public Pedidos mapRow(@NonNull ResultSet rs, int rowNum) throws SQLException { + Pedidos pedido = new Pedidos(); + // Utiliza los métodos get correspondientes + pedido.setID_CLIENTE(rs.getLong("ID_CLIENTE")); + pedido.setID_EMPLEADO(rs.getLong("ID_EMPLEADO")); + pedido.setID_ESTADO_PEDIDO(rs.getLong("ID_ESTADO_PEDIDO")); + pedido.setFECHA_INGRESO(rs.getDate("FECHA_INGRESO")); + pedido.setFECHA_ENTREGA(rs.getDate("FECHA_ENTREGA")); + pedido.setTOTAL_PRODUCTO(rs.getBigDecimal("TOTAL_PRODUCTO")); + return pedido; + } + }); + } + + // Método para crear un nuevo pedido (POST) + public int crearPedido(Pedidos pedido) { + String sql = "INSERT INTO Pedidos (ID_CLIENTE, ID_EMPLEADO, ID_ESTADO_PEDIDO, FECHA_INGRESO, FECHA_ENTREGA, TOTAL_PRODUCTO) VALUES (?, ?, ?, ?, ?, ?)"; + + KeyHolder keyHolder = new GeneratedKeyHolder(); + + jdbcTemplate.update(connection -> { + PreparedStatement ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); + ps.setLong(1, pedido.getID_CLIENTE()); + ps.setLong(2, pedido.getID_EMPLEADO()); + ps.setLong(3, pedido.getID_ESTADO_PEDIDO()); + ps.setDate(4, new java.sql.Date(pedido.getFECHA_INGRESO().getTime())); + ps.setDate(5, new java.sql.Date(pedido.getFECHA_ENTREGA().getTime())); + ps.setBigDecimal(6, pedido.getTOTAL_PRODUCTO()); + return ps; + }, keyHolder); + + Number key = keyHolder.getKey(); + return key != null ? key.intValue() : -1; + } + // Método para actualizar un pedido (PUT) + public void actualizarPedido(Long id, Pedidos pedido) { + String sql = "UPDATE Pedidos SET ID_CLIENTE = ?, ID_EMPLEADO = ?, ID_ESTADO_PEDIDO = ?, FECHA_INGRESO = ?, FECHA_ENTREGA = ?, TOTAL_PRODUCTO = ? WHERE ID_PEDIDO = ?"; + + jdbcTemplate.update(sql, + pedido.getID_CLIENTE(), + pedido.getID_EMPLEADO(), + pedido.getID_ESTADO_PEDIDO(), + new java.sql.Date(pedido.getFECHA_INGRESO().getTime()), + new java.sql.Date(pedido.getFECHA_ENTREGA().getTime()), + pedido.getTOTAL_PRODUCTO(), + id + ); + } + // Método para eliminar un pedido (DELETE) + public void eliminarPedido(Long id) { + String sql = "DELETE FROM Pedidos WHERE ID_PEDIDO = ?"; + jdbcTemplate.update(sql, id); + } +} diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/service/PedidosProveedores/PedidosProveedores.java b/api_/Proyecto/src/main/java/com/example/Proyecto/service/PedidosProveedores/PedidosProveedores.java new file mode 100644 index 0000000..7a7bf30 --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/service/PedidosProveedores/PedidosProveedores.java @@ -0,0 +1,29 @@ +// Archivo: PedidosProveedores.java +package com.example.Proyecto.service.PedidosProveedores; + +import java.util.Date; + +public class PedidosProveedores { + private int IdPedidoProv; + private int IdProveedor; + private int NumeroPedido; // <-- Cambiado a 'int' + private Date FechaPedido; + private String EstadoPedido; + + public PedidosProveedores() {} + + public int getIdPedidoProv() { return IdPedidoProv; } + public void setIdPedidoProv(int IdPedidoProv) { this.IdPedidoProv = IdPedidoProv; } + + public int getIdProveedor() { return IdProveedor; } + public void setIdProveedor(int IdProveedor) { this.IdProveedor = IdProveedor; } + + public int getNumeroPedido() { return NumeroPedido; } // <-- Retorna 'int' + public void setNumeroPedido(int NumeroPedido) { this.NumeroPedido = NumeroPedido; } // <-- Recibe 'int' + + public Date getFechaPedido() { return FechaPedido; } + public void setFechaPedido(Date FechaPedido) { this.FechaPedido = FechaPedido; } + + public String getEstadoPedido() { return EstadoPedido; } + public void setEstadoPedido(String EstadoPedido) { this.EstadoPedido = EstadoPedido; } +} \ No newline at end of file diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/service/PedidosProveedores/PedidosProveedoresService.java b/api_/Proyecto/src/main/java/com/example/Proyecto/service/PedidosProveedores/PedidosProveedoresService.java new file mode 100644 index 0000000..d065af2 --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/service/PedidosProveedores/PedidosProveedoresService.java @@ -0,0 +1,69 @@ +// Archivo: PedidosProveedoresService.java +package com.example.Proyecto.service.PedidosProveedores; + +import com.example.Proyecto.service.PedidosProveedores.PedidosProveedores; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.lang.NonNull; +import org.springframework.stereotype.Service; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +@Service +public class PedidosProveedoresService { + + @Autowired + private JdbcTemplate jdbcTemplate; + + // Archivo: PedidosProveedoresService.java + +// ... + + // Obtener todos los pedidos de proveedores + public List obtenerTodosLosPedidosProveedores() { + String sql = "SELECT * FROM Pedidos_Proveedores"; + return jdbcTemplate.query(sql, new RowMapper() { + @Override + public PedidosProveedores mapRow(@NonNull ResultSet rs, int rowNum) throws SQLException { + PedidosProveedores pedido = new PedidosProveedores(); + pedido.setIdPedidoProv(rs.getInt("ID_PEDIDO_PROV")); + pedido.setIdProveedor(rs.getInt("ID_PROVEEDOR")); + pedido.setNumeroPedido(rs.getInt("NUMERO_PEDIDO")); // <-- CORRECCIÓN: Usar getInt + pedido.setFechaPedido(rs.getDate("FECHA_PEDIDO")); + pedido.setEstadoPedido(rs.getString("ESTADO_PEDIDO")); + return pedido; + } + }); + } + + // Crear un nuevo pedido de proveedor (POST) + public void crearPedidoProveedor(PedidosProveedores pedido) { + String sql = "INSERT INTO Pedidos_Proveedores (ID_PROVEEDOR, NUMERO_PEDIDO, FECHA_PEDIDO, ESTADO_PEDIDO) VALUES (?, ?, ?, ?)"; + jdbcTemplate.update(sql, + pedido.getIdProveedor(), + pedido.getNumeroPedido(), + pedido.getFechaPedido(), + pedido.getEstadoPedido() + ); + } + + // Actualizar un pedido de proveedor (PUT) + public int editarPedidoProveedor(PedidosProveedores pedido) { + String sql = "UPDATE Pedidos_Proveedores SET ID_PROVEEDOR=?, NUMERO_PEDIDO=?, FECHA_PEDIDO=?, ESTADO_PEDIDO=? WHERE ID_PEDIDO_PROV=?"; + return jdbcTemplate.update(sql, + pedido.getIdProveedor(), + pedido.getNumeroPedido(), + pedido.getFechaPedido(), + pedido.getEstadoPedido(), + pedido.getIdPedidoProv() + ); + } + + // Eliminar un pedido de proveedor (DELETE) + public int eliminarPedidoProveedor(int idPedidoProv) { + String sql = "DELETE FROM Pedidos_Proveedores WHERE ID_PEDIDO_PROV = ?"; + return jdbcTemplate.update(sql, idPedidoProv); + } +} \ No newline at end of file diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/service/Productos/ProductosService.java b/api_/Proyecto/src/main/java/com/example/Proyecto/service/Productos/ProductosService.java new file mode 100644 index 0000000..3a18bc8 --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/service/Productos/ProductosService.java @@ -0,0 +1,57 @@ +package com.example.Proyecto.service.Productos; + +import com.example.Proyecto.model.PojoProductos; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.lang.NonNull; +import org.springframework.stereotype.Service; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class ProductosService { + + @Autowired + private JdbcTemplate jdbcTemplate; + + public List> obtenerDetallesProducto() { + String sql = "SELECT ID_PRODUCTO, NOMBRE_PRODUCTO, PRECIO_PRODUCTO FROM Productos"; + return jdbcTemplate.query(sql, new RowMapper>() { + @Override + public Map mapRow(@NonNull ResultSet rs, int rowNum) throws SQLException { + Map producto = new HashMap<>(); + producto.put("Id:", rs.getInt("ID_PRODUCTO")); + producto.put("Nombre:", rs.getString("NOMBRE_PRODUCTO")); + producto.put("Precio:", rs.getDouble("PRECIO_PRODUCTO")); + return producto; + } + }); + } + + public boolean crearProducto(PojoProductos pojoProductos) { + String sql = "INSERT INTO Productos (NOMBRE_PRODUCTO, PRECIO_PRODUCTO) VALUES (?, ?)"; + try { + int result = jdbcTemplate.update(sql, pojoProductos.getNombreProducto(), pojoProductos.getPrecio()); + return result > 0; + } catch (DataAccessException e) { + return false; + } + } + + public boolean actualizarProducto(PojoProductos pojoProductos) { + String sql = "UPDATE Productos SET NOMBRE_PRODUCTO = ?, PRECIO_PRODUCTO = ? WHERE ID_PRODUCTO = ?"; + try { + int value = jdbcTemplate.update(sql, pojoProductos.getNombreProducto(), pojoProductos.getPrecio(), pojoProductos.getId()); + return value > 0; + } catch (DataAccessException e) { + e.printStackTrace(); + return false; + } + } +} diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/service/Proveedores/Proveedores.java b/api_/Proyecto/src/main/java/com/example/Proyecto/service/Proveedores/Proveedores.java new file mode 100644 index 0000000..cb57456 --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/service/Proveedores/Proveedores.java @@ -0,0 +1,31 @@ +// Archivo: Proveedores.java +package com.example.Proyecto.service.Proveedores; + +public class Proveedores { + private int idProveedor; + private String nombreProv; + private String telefonoProv; + private Boolean activoProv; + private String emailProv; + private String direccionProv; + + public Proveedores() {} + + public int getIdProveedor() { return idProveedor; } + public void setIdProveedor(int idProveedor) { this.idProveedor = idProveedor; } + + public String getNombreProv() { return nombreProv; } + public void setNombreProv(String nombreProv) { this.nombreProv = nombreProv; } + + public String getTelefonoProv() { return telefonoProv; } + public void setTelefonoProv(String telefonoProv) { this.telefonoProv = telefonoProv; } + + public Boolean getActivoProv() { return activoProv; } + public void setActivoProv(Boolean activoProv) { this.activoProv = activoProv; } + + public String getEmailProv() { return emailProv; } + public void setEmailProv(String emailProv) { this.emailProv = emailProv; } + + public String getDireccionProv() { return direccionProv; } + public void setDireccionProv(String direccionProv) { this.direccionProv = direccionProv; } +} \ No newline at end of file diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/service/Proveedores/ProveedoresService.java b/api_/Proyecto/src/main/java/com/example/Proyecto/service/Proveedores/ProveedoresService.java new file mode 100644 index 0000000..95931b9 --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/service/Proveedores/ProveedoresService.java @@ -0,0 +1,69 @@ +// Archivo: ProveedoresService.java +package com.example.Proyecto.service.Proveedores; + +import com.example.Proyecto.service.Proveedores.Proveedores; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.lang.NonNull; +import org.springframework.stereotype.Service; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +@Service +public class ProveedoresService { + + @Autowired + private JdbcTemplate jdbcTemplate; + + // Obtener todos los proveedores + public List obtenerTodosLosProveedores() { + String sql = "SELECT * FROM Proveedores"; + return jdbcTemplate.query(sql, new RowMapper() { + @Override + public Proveedores mapRow(@NonNull ResultSet rs, int rowNum) throws SQLException { + Proveedores proveedor = new Proveedores(); + proveedor.setIdProveedor(rs.getInt("ID_PROVEEDOR")); + proveedor.setNombreProv(rs.getString("NOMBRE_PROV")); + proveedor.setTelefonoProv(rs.getString("TELEFONO_PROV")); + proveedor.setActivoProv(rs.getBoolean("ACTIVO_PROV")); + proveedor.setEmailProv(rs.getString("EMAIL_PROV")); + proveedor.setDireccionProv(rs.getString("DIRECCION_PROV")); + return proveedor; + } + }); + } + + // Crear un nuevo proveedor (POST) + public void crearProveedor(Proveedores proveedor) { + String sql = "INSERT INTO Proveedores (NOMBRE_PROV, TELEFONO_PROV, ACTIVO_PROV, EMAIL_PROV, DIRECCION_PROV) " + + "VALUES (?, ?, ?, ?, ?)"; + jdbcTemplate.update(sql, + proveedor.getNombreProv(), + proveedor.getTelefonoProv(), + proveedor.getActivoProv(), + proveedor.getEmailProv(), + proveedor.getDireccionProv() + ); + } + + // Actualizar un proveedor (PUT) + public int editarProveedor(Proveedores proveedor) { + String sql = "UPDATE Proveedores SET NOMBRE_PROV=?, TELEFONO_PROV=?, ACTIVO_PROV=?, EMAIL_PROV=?, DIRECCION_PROV=? WHERE ID_PROVEEDOR=?"; + return jdbcTemplate.update(sql, + proveedor.getNombreProv(), + proveedor.getTelefonoProv(), + proveedor.getActivoProv(), + proveedor.getEmailProv(), + proveedor.getDireccionProv(), + proveedor.getIdProveedor() + ); + } + + // Eliminar un proveedor (DELETE) + public int eliminarProveedor(int idProveedor) { + String sql = "DELETE FROM Proveedores WHERE ID_PROVEEDOR = ?"; + return jdbcTemplate.update(sql, idProveedor); + } +} \ No newline at end of file diff --git a/api_/Proyecto/src/main/java/com/example/Proyecto/service/UsuariosRegistradosService/UsuariosRegistradosService.java b/api_/Proyecto/src/main/java/com/example/Proyecto/service/UsuariosRegistradosService/UsuariosRegistradosService.java new file mode 100644 index 0000000..037e313 --- /dev/null +++ b/api_/Proyecto/src/main/java/com/example/Proyecto/service/UsuariosRegistradosService/UsuariosRegistradosService.java @@ -0,0 +1,56 @@ +package com.example.Proyecto.service.UsuariosRegistradosService; + +import com.example.Proyecto.dto.UsuariosRegistradosDTO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class UsuariosRegistradosService { + + @Autowired + private JdbcTemplate jdbcTemplate; + + public List obtenerUsuariosRegistrados() { + List usuariosRegistrados = new ArrayList<>(); + + // Clientes + String sqlClientes = "SELECT NOMBRE_CLI, EMAIL_CLI, TELEFONO_CLI FROM clientes"; + usuariosRegistrados.addAll(jdbcTemplate.query(sqlClientes, (rs, rowNum) -> + new UsuariosRegistradosDTO( + rs.getString("NOMBRE_CLI"), + rs.getString("EMAIL_CLI"), + rs.getString("TELEFONO_CLI"), + "Cliente" + ) + )); + + // Empleados + String sqlEmpleados = "SELECT NOMBRE_EMPLEADO, EMAIL_EMPLEADO FROM empleados"; + usuariosRegistrados.addAll(jdbcTemplate.query(sqlEmpleados, (rs, rowNum) -> + new UsuariosRegistradosDTO( + rs.getString("NOMBRE_EMPLEADO"), + rs.getString("EMAIL_EMPLEADO"), + null, + "Empleado" + ) + )); + + // Administradores + String sqlAdmins = "SELECT NOMBRE_ADMIN, EMAIL_ADMIN FROM administradores"; + usuariosRegistrados.addAll(jdbcTemplate.query(sqlAdmins, (rs, rowNum) -> + new UsuariosRegistradosDTO( + rs.getString("NOMBRE_ADMIN"), + rs.getString("EMAIL_ADMIN"), + null, + "Administrador" + ) + )); + + return usuariosRegistrados; + } +} + diff --git a/api_/Proyecto/src/main/resources/application.properties b/api_/Proyecto/src/main/resources/application.properties new file mode 100644 index 0000000..3507b3a --- /dev/null +++ b/api_/Proyecto/src/main/resources/application.properties @@ -0,0 +1,13 @@ +spring.application.name=Proyecto +# MySQL DataSource Configuration +spring.datasource.url=jdbc:mysql://localhost:3306/proyectopanaderia +spring.datasource.username=root +spring.datasource.password= +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +# Hibernate/JPA Configuration +spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect +spring.jpa.hibernate.ddl-auto=none +spring.jpa.show-sql=true +spring.datasource.initialization-mode=never +spring.sql.init.mode=never +logging.level.org.springframework.web.servlet=DEBUG \ No newline at end of file diff --git a/api_/Proyecto/src/test/java/com/example/Proyecto/ProyectoApplicationTests.java b/api_/Proyecto/src/test/java/com/example/Proyecto/ProyectoApplicationTests.java new file mode 100644 index 0000000..d9e432d --- /dev/null +++ b/api_/Proyecto/src/test/java/com/example/Proyecto/ProyectoApplicationTests.java @@ -0,0 +1,13 @@ +package com.example.Proyecto; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class ProyectoApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/api_/Proyecto/target/classes/application.properties b/api_/Proyecto/target/classes/application.properties new file mode 100644 index 0000000..15912fe --- /dev/null +++ b/api_/Proyecto/target/classes/application.properties @@ -0,0 +1,13 @@ +spring.application.name=Proyecto +# MySQL DataSource Configuration +spring.datasource.url=jdbc:mysql://localhost:3306/proyectopanaderia +spring.datasource.username=root +spring.datasource.password= +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +# Hibernate/JPA Configuration +spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect +spring.jpa.hibernate.ddl-auto=none +spring.jpa.show-sql=true +spring.datasource.initialization-mode=never +spring.sql.init.mode=never +logging.level.org.springframework.web.servlet=DEBUG \ No newline at end of file diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/ProyectoApplication.class b/api_/Proyecto/target/classes/com/example/Proyecto/ProyectoApplication.class new file mode 100644 index 0000000..7f67e98 Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/ProyectoApplication.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/config/SecurityConfig.class b/api_/Proyecto/target/classes/com/example/Proyecto/config/SecurityConfig.class new file mode 100644 index 0000000..a6bffa8 Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/config/SecurityConfig.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/controller/CategoriaIngredientesController.class b/api_/Proyecto/target/classes/com/example/Proyecto/controller/CategoriaIngredientesController.class new file mode 100644 index 0000000..20e3b09 Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/controller/CategoriaIngredientesController.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/controller/ConexionController.class b/api_/Proyecto/target/classes/com/example/Proyecto/controller/ConexionController.class new file mode 100644 index 0000000..673c940 Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/controller/ConexionController.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/controller/ConexionControllerUsers.class b/api_/Proyecto/target/classes/com/example/Proyecto/controller/ConexionControllerUsers.class new file mode 100644 index 0000000..43cd268 Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/controller/ConexionControllerUsers.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/controller/DetallePedidosController.class b/api_/Proyecto/target/classes/com/example/Proyecto/controller/DetallePedidosController.class new file mode 100644 index 0000000..e02c8d0 Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/controller/DetallePedidosController.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/controller/Estados_PedidosController.class b/api_/Proyecto/target/classes/com/example/Proyecto/controller/Estados_PedidosController.class new file mode 100644 index 0000000..cb577ed Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/controller/Estados_PedidosController.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/controller/Ingredientescontroller.class b/api_/Proyecto/target/classes/com/example/Proyecto/controller/Ingredientescontroller.class new file mode 100644 index 0000000..887179d Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/controller/Ingredientescontroller.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/controller/Ordenes_salidaController.class b/api_/Proyecto/target/classes/com/example/Proyecto/controller/Ordenes_salidaController.class new file mode 100644 index 0000000..bbda56b Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/controller/Ordenes_salidaController.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/controller/PedidosController.class b/api_/Proyecto/target/classes/com/example/Proyecto/controller/PedidosController.class new file mode 100644 index 0000000..68c80e7 Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/controller/PedidosController.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/controller/PedidosProveedoresController.class b/api_/Proyecto/target/classes/com/example/Proyecto/controller/PedidosProveedoresController.class new file mode 100644 index 0000000..06b83d8 Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/controller/PedidosProveedoresController.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/controller/ProductosController.class b/api_/Proyecto/target/classes/com/example/Proyecto/controller/ProductosController.class new file mode 100644 index 0000000..de85db6 Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/controller/ProductosController.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/controller/ProveedoresController.class b/api_/Proyecto/target/classes/com/example/Proyecto/controller/ProveedoresController.class new file mode 100644 index 0000000..fa59a83 Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/controller/ProveedoresController.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/controller/UsuariosRegistradosController.class b/api_/Proyecto/target/classes/com/example/Proyecto/controller/UsuariosRegistradosController.class new file mode 100644 index 0000000..07b5aa0 Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/controller/UsuariosRegistradosController.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/dto/UsuariosRegistradosDTO.class b/api_/Proyecto/target/classes/com/example/Proyecto/dto/UsuariosRegistradosDTO.class new file mode 100644 index 0000000..4ccfb6a Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/dto/UsuariosRegistradosDTO.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/model/Estado_Pedidos.class b/api_/Proyecto/target/classes/com/example/Proyecto/model/Estado_Pedidos.class new file mode 100644 index 0000000..2084f3d Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/model/Estado_Pedidos.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/model/Ingredientes.class b/api_/Proyecto/target/classes/com/example/Proyecto/model/Ingredientes.class new file mode 100644 index 0000000..9d7bea7 Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/model/Ingredientes.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/model/Ordenes_salida.class b/api_/Proyecto/target/classes/com/example/Proyecto/model/Ordenes_salida.class new file mode 100644 index 0000000..b45cd0a Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/model/Ordenes_salida.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/model/Pedidos.class b/api_/Proyecto/target/classes/com/example/Proyecto/model/Pedidos.class new file mode 100644 index 0000000..de41b1c Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/model/Pedidos.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/model/Pedidos_Proveedores.class b/api_/Proyecto/target/classes/com/example/Proyecto/model/Pedidos_Proveedores.class new file mode 100644 index 0000000..0d3a4f0 Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/model/Pedidos_Proveedores.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/model/PojoAdmin.class b/api_/Proyecto/target/classes/com/example/Proyecto/model/PojoAdmin.class new file mode 100644 index 0000000..99c6649 Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/model/PojoAdmin.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/model/PojoCliente.class b/api_/Proyecto/target/classes/com/example/Proyecto/model/PojoCliente.class new file mode 100644 index 0000000..9997dff Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/model/PojoCliente.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/model/PojoDeleteEmpleado.class b/api_/Proyecto/target/classes/com/example/Proyecto/model/PojoDeleteEmpleado.class new file mode 100644 index 0000000..c461503 Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/model/PojoDeleteEmpleado.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/model/PojoEmpleado.class b/api_/Proyecto/target/classes/com/example/Proyecto/model/PojoEmpleado.class new file mode 100644 index 0000000..7e603ac Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/model/PojoEmpleado.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/model/PojoProductos.class b/api_/Proyecto/target/classes/com/example/Proyecto/model/PojoProductos.class new file mode 100644 index 0000000..9c2f47e Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/model/PojoProductos.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/service/Administrador/ConexionAdminService$1.class b/api_/Proyecto/target/classes/com/example/Proyecto/service/Administrador/ConexionAdminService$1.class new file mode 100644 index 0000000..b8d1494 Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/service/Administrador/ConexionAdminService$1.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/service/Administrador/ConexionAdminService.class b/api_/Proyecto/target/classes/com/example/Proyecto/service/Administrador/ConexionAdminService.class new file mode 100644 index 0000000..3027b6c Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/service/Administrador/ConexionAdminService.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/service/CategoriaIngredientesService/CategoriaIngredientes.class b/api_/Proyecto/target/classes/com/example/Proyecto/service/CategoriaIngredientesService/CategoriaIngredientes.class new file mode 100644 index 0000000..fe1139d Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/service/CategoriaIngredientesService/CategoriaIngredientes.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/service/CategoriaIngredientesService/CategoriaIngredientesService$1.class b/api_/Proyecto/target/classes/com/example/Proyecto/service/CategoriaIngredientesService/CategoriaIngredientesService$1.class new file mode 100644 index 0000000..a9ad3ab Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/service/CategoriaIngredientesService/CategoriaIngredientesService$1.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/service/CategoriaIngredientesService/CategoriaIngredientesService.class b/api_/Proyecto/target/classes/com/example/Proyecto/service/CategoriaIngredientesService/CategoriaIngredientesService.class new file mode 100644 index 0000000..e841da4 Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/service/CategoriaIngredientesService/CategoriaIngredientesService.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/service/Clientes/ConexionClienteService$1.class b/api_/Proyecto/target/classes/com/example/Proyecto/service/Clientes/ConexionClienteService$1.class new file mode 100644 index 0000000..f7883ba Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/service/Clientes/ConexionClienteService$1.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/service/Clientes/ConexionClienteService.class b/api_/Proyecto/target/classes/com/example/Proyecto/service/Clientes/ConexionClienteService.class new file mode 100644 index 0000000..0eb110a Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/service/Clientes/ConexionClienteService.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/service/DetallePedidos/DetallePedidos.class b/api_/Proyecto/target/classes/com/example/Proyecto/service/DetallePedidos/DetallePedidos.class new file mode 100644 index 0000000..33256cd Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/service/DetallePedidos/DetallePedidos.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/service/DetallePedidos/DetallePedidosService$1.class b/api_/Proyecto/target/classes/com/example/Proyecto/service/DetallePedidos/DetallePedidosService$1.class new file mode 100644 index 0000000..7093024 Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/service/DetallePedidos/DetallePedidosService$1.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/service/DetallePedidos/DetallePedidosService.class b/api_/Proyecto/target/classes/com/example/Proyecto/service/DetallePedidos/DetallePedidosService.class new file mode 100644 index 0000000..8f672dc Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/service/DetallePedidos/DetallePedidosService.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/service/Empleados/ConexionEmpleadoService$1.class b/api_/Proyecto/target/classes/com/example/Proyecto/service/Empleados/ConexionEmpleadoService$1.class new file mode 100644 index 0000000..11c5250 Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/service/Empleados/ConexionEmpleadoService$1.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/service/Empleados/ConexionEmpleadoService.class b/api_/Proyecto/target/classes/com/example/Proyecto/service/Empleados/ConexionEmpleadoService.class new file mode 100644 index 0000000..3f45308 Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/service/Empleados/ConexionEmpleadoService.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/service/Ingredientes/IngredientesService$1.class b/api_/Proyecto/target/classes/com/example/Proyecto/service/Ingredientes/IngredientesService$1.class new file mode 100644 index 0000000..85ba1e3 Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/service/Ingredientes/IngredientesService$1.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/service/Ingredientes/IngredientesService$2.class b/api_/Proyecto/target/classes/com/example/Proyecto/service/Ingredientes/IngredientesService$2.class new file mode 100644 index 0000000..ba02aee Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/service/Ingredientes/IngredientesService$2.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/service/Ingredientes/IngredientesService.class b/api_/Proyecto/target/classes/com/example/Proyecto/service/Ingredientes/IngredientesService.class new file mode 100644 index 0000000..71b5425 Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/service/Ingredientes/IngredientesService.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/service/Ordenes_salida/Ordenes_salidaService.class b/api_/Proyecto/target/classes/com/example/Proyecto/service/Ordenes_salida/Ordenes_salidaService.class new file mode 100644 index 0000000..037b511 Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/service/Ordenes_salida/Ordenes_salidaService.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/service/Pedidos/Estados_PedidosService$1.class b/api_/Proyecto/target/classes/com/example/Proyecto/service/Pedidos/Estados_PedidosService$1.class new file mode 100644 index 0000000..5706d62 Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/service/Pedidos/Estados_PedidosService$1.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/service/Pedidos/Estados_PedidosService.class b/api_/Proyecto/target/classes/com/example/Proyecto/service/Pedidos/Estados_PedidosService.class new file mode 100644 index 0000000..5ce58c5 Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/service/Pedidos/Estados_PedidosService.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/service/Pedidos/pedidosService$1.class b/api_/Proyecto/target/classes/com/example/Proyecto/service/Pedidos/pedidosService$1.class new file mode 100644 index 0000000..10e55b5 Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/service/Pedidos/pedidosService$1.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/service/Pedidos/pedidosService.class b/api_/Proyecto/target/classes/com/example/Proyecto/service/Pedidos/pedidosService.class new file mode 100644 index 0000000..c18ef26 Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/service/Pedidos/pedidosService.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/service/PedidosProveedores/PedidosProveedores.class b/api_/Proyecto/target/classes/com/example/Proyecto/service/PedidosProveedores/PedidosProveedores.class new file mode 100644 index 0000000..524bc68 Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/service/PedidosProveedores/PedidosProveedores.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/service/PedidosProveedores/PedidosProveedoresService$1.class b/api_/Proyecto/target/classes/com/example/Proyecto/service/PedidosProveedores/PedidosProveedoresService$1.class new file mode 100644 index 0000000..db5a506 Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/service/PedidosProveedores/PedidosProveedoresService$1.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/service/PedidosProveedores/PedidosProveedoresService.class b/api_/Proyecto/target/classes/com/example/Proyecto/service/PedidosProveedores/PedidosProveedoresService.class new file mode 100644 index 0000000..4b6356b Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/service/PedidosProveedores/PedidosProveedoresService.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/service/Productos/ProductosService$1.class b/api_/Proyecto/target/classes/com/example/Proyecto/service/Productos/ProductosService$1.class new file mode 100644 index 0000000..df7ec21 Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/service/Productos/ProductosService$1.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/service/Productos/ProductosService.class b/api_/Proyecto/target/classes/com/example/Proyecto/service/Productos/ProductosService.class new file mode 100644 index 0000000..7438c36 Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/service/Productos/ProductosService.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/service/Proveedores/Proveedores.class b/api_/Proyecto/target/classes/com/example/Proyecto/service/Proveedores/Proveedores.class new file mode 100644 index 0000000..15d8ded Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/service/Proveedores/Proveedores.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/service/Proveedores/ProveedoresService$1.class b/api_/Proyecto/target/classes/com/example/Proyecto/service/Proveedores/ProveedoresService$1.class new file mode 100644 index 0000000..7920f96 Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/service/Proveedores/ProveedoresService$1.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/service/Proveedores/ProveedoresService.class b/api_/Proyecto/target/classes/com/example/Proyecto/service/Proveedores/ProveedoresService.class new file mode 100644 index 0000000..ef3fc68 Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/service/Proveedores/ProveedoresService.class differ diff --git a/api_/Proyecto/target/classes/com/example/Proyecto/service/UsuariosRegistradosService/UsuariosRegistradosService.class b/api_/Proyecto/target/classes/com/example/Proyecto/service/UsuariosRegistradosService/UsuariosRegistradosService.class new file mode 100644 index 0000000..02fa9c2 Binary files /dev/null and b/api_/Proyecto/target/classes/com/example/Proyecto/service/UsuariosRegistradosService/UsuariosRegistradosService.class differ diff --git a/api_/Proyecto/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/api_/Proyecto/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..e69de29 diff --git a/api_/Proyecto/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/api_/Proyecto/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..38c56c1 --- /dev/null +++ b/api_/Proyecto/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,27 @@ +C:\Users\User\Desktop\Proyecto-req_brayan\Proyecto\src\main\java\com\example\Proyecto\config\SecurityConfig.java +C:\Users\User\Desktop\Proyecto-req_brayan\Proyecto\src\main\java\com\example\Proyecto\controller\ConexionController.java +C:\Users\User\Desktop\Proyecto-req_brayan\Proyecto\src\main\java\com\example\Proyecto\controller\ConexionControllerUsers.java +C:\Users\User\Desktop\Proyecto-req_brayan\Proyecto\src\main\java\com\example\Proyecto\controller\Estados_PedidosController.java +C:\Users\User\Desktop\Proyecto-req_brayan\Proyecto\src\main\java\com\example\Proyecto\controller\Ordenes_salidaController.java +C:\Users\User\Desktop\Proyecto-req_brayan\Proyecto\src\main\java\com\example\Proyecto\controller\PedidosController.java +C:\Users\User\Desktop\Proyecto-req_brayan\Proyecto\src\main\java\com\example\Proyecto\controller\ProductosController.java +C:\Users\User\Desktop\Proyecto-req_brayan\Proyecto\src\main\java\com\example\Proyecto\controller\UsuariosRegistradosController.java +C:\Users\User\Desktop\Proyecto-req_brayan\Proyecto\src\main\java\com\example\Proyecto\dto\UsuariosRegistradosDTO.java +C:\Users\User\Desktop\Proyecto-req_brayan\Proyecto\src\main\java\com\example\Proyecto\model\Estado_Pedidos.java +C:\Users\User\Desktop\Proyecto-req_brayan\Proyecto\src\main\java\com\example\Proyecto\model\Ordenes_salida.java +C:\Users\User\Desktop\Proyecto-req_brayan\Proyecto\src\main\java\com\example\Proyecto\model\Pedidos.java +C:\Users\User\Desktop\Proyecto-req_brayan\Proyecto\src\main\java\com\example\Proyecto\model\Pedidos_Proveedores.java +C:\Users\User\Desktop\Proyecto-req_brayan\Proyecto\src\main\java\com\example\Proyecto\model\PojoAdmin.java +C:\Users\User\Desktop\Proyecto-req_brayan\Proyecto\src\main\java\com\example\Proyecto\model\PojoCliente.java +C:\Users\User\Desktop\Proyecto-req_brayan\Proyecto\src\main\java\com\example\Proyecto\model\PojoDeleteEmpleado.java +C:\Users\User\Desktop\Proyecto-req_brayan\Proyecto\src\main\java\com\example\Proyecto\model\PojoEmpleado.java +C:\Users\User\Desktop\Proyecto-req_brayan\Proyecto\src\main\java\com\example\Proyecto\model\PojoProductos.java +C:\Users\User\Desktop\Proyecto-req_brayan\Proyecto\src\main\java\com\example\Proyecto\ProyectoApplication.java +C:\Users\User\Desktop\Proyecto-req_brayan\Proyecto\src\main\java\com\example\Proyecto\service\Administrador\ConexionAdminService.java +C:\Users\User\Desktop\Proyecto-req_brayan\Proyecto\src\main\java\com\example\Proyecto\service\Clientes\ConexionClienteService.java +C:\Users\User\Desktop\Proyecto-req_brayan\Proyecto\src\main\java\com\example\Proyecto\service\Empleados\ConexionEmpleadoService.java +C:\Users\User\Desktop\Proyecto-req_brayan\Proyecto\src\main\java\com\example\Proyecto\service\Ordenes_salida\Ordenes_salidaService.java +C:\Users\User\Desktop\Proyecto-req_brayan\Proyecto\src\main\java\com\example\Proyecto\service\Pedidos\Estados_PedidosService.java +C:\Users\User\Desktop\Proyecto-req_brayan\Proyecto\src\main\java\com\example\Proyecto\service\Pedidos\pedidosService.java +C:\Users\User\Desktop\Proyecto-req_brayan\Proyecto\src\main\java\com\example\Proyecto\service\Productos\ProductosService.java +C:\Users\User\Desktop\Proyecto-req_brayan\Proyecto\src\main\java\com\example\Proyecto\service\UsuariosRegistradosService\UsuariosRegistradosService.java diff --git a/api_/Proyecto/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/api_/Proyecto/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst new file mode 100644 index 0000000..e69de29 diff --git a/api_/Proyecto/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/api_/Proyecto/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst new file mode 100644 index 0000000..c86f38b --- /dev/null +++ b/api_/Proyecto/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst @@ -0,0 +1 @@ +C:\Users\User\Desktop\Proyecto-req_brayan\Proyecto\src\test\java\com\example\Proyecto\ProyectoApplicationTests.java diff --git a/api_/Proyecto/target/test-classes/com/example/Proyecto/ProyectoApplicationTests.class b/api_/Proyecto/target/test-classes/com/example/Proyecto/ProyectoApplicationTests.class new file mode 100644 index 0000000..d8ef1bb Binary files /dev/null and b/api_/Proyecto/target/test-classes/com/example/Proyecto/ProyectoApplicationTests.class differ diff --git a/config.php b/config.php new file mode 100644 index 0000000..f2547eb --- /dev/null +++ b/config.php @@ -0,0 +1,88 @@ + $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_TIMEOUT => 30, + CURLOPT_HTTPHEADER => [ + 'Content-Type: application/json', + 'Accept: application/json' + ] + ]); + + $response = curl_exec($curl); + $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); + + if (curl_errno($curl)) { + echo "Error cURL: " . curl_error($curl) . "\n"; + curl_close($curl); + return []; + } + + curl_close($curl); + + if ($httpCode !== 200) { + echo "Error HTTP: $httpCode\n"; + return []; + } + + return json_decode($response); +} + +// Función para consumir endpoints con cURL (POST, PATCH, DELETE) +function consumirCURL($endpoint, $method, $data = []) { + $url = API_BASE_URL . $endpoint; + + $curl = curl_init(); + + curl_setopt_array($curl, [ + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_TIMEOUT => 30, + CURLOPT_HTTPHEADER => [ + 'Content-Type: application/json', + 'Accept: application/json' + ] + ]); + + if ($method === 'POST') { + curl_setopt($curl, CURLOPT_POST, true); + curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data)); + } elseif ($method === 'PATCH') { + curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PATCH'); + curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data)); + } elseif ($method === 'DELETE') { + curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'DELETE'); + if (!empty($data)) { + curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data)); + } + } + + $response = curl_exec($curl); + $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); + + if (curl_errno($curl)) { + echo "Error cURL: " . curl_error($curl) . "\n"; + curl_close($curl); + return [ + 'codigo' => 0, + 'respuesta' => 'Error de conexión' + ]; + } + + curl_close($curl); + + return [ + 'codigo' => $httpCode, + 'respuesta' => $response + ]; +} +?> \ No newline at end of file diff --git a/files/PROYECTOPANADERIA.sql b/files/PROYECTOPANADERIA.sql deleted file mode 100644 index 48462ea..0000000 --- a/files/PROYECTOPANADERIA.sql +++ /dev/null @@ -1,1034 +0,0 @@ --- ================================================================== --- PROYECTO PANADERÍA - BASE DE DATOS --- ================================================================== --- Autor: Sistema de Gestión de Panadería --- Fecha: 2025 --- Descripción: Base de datos completa para gestión de panadería --- Versión: 2.1 - Incluye sistema de logs y actualización de estructura --- ================================================================== - --- CARACTERÍSTICAS PRINCIPALES: --- - Gestión completa de productos con descripción opcional --- - Sistema de pedidos con detalles de productos --- - Control de inventario y stock mínimo --- - Gestión de empleados, clientes y administradores --- - Sistema de logs para auditoría de cambios en productos --- - Triggers automáticos para actualización de totales --- - Funciones de utilidad para encriptación y generación de códigos --- - Estructura optimizada para dashboard de empleados y administradores - --- ESTRUCTURA DE TABLAS PRINCIPALES: --- - Productos: Incluye DESCRIPCION_PRODUCTO opcional --- - Detalle_Pedidos: Sin columnas de imagen, solo datos esenciales --- - Empleados: Con control de estado activo/inactivo --- - Pedidos: Con estados y totales automáticos --- - Sistema de logs: Para auditoría de cambios - --- INSTRUCCIONES DE INSTALACIÓN: --- --- OPCIÓN 1: INSTALACIÓN NUEVA (Base de datos desde cero) --- 1. Ejecutar todo el script completo --- 2. La base de datos se creará con todas las tablas y datos --- --- OPCIÓN 2: ACTUALIZACIÓN DE BASE EXISTENTE --- 1. Ejecutar solo las secciones de "MIGRACIONES Y ACTUALIZACIONES" --- 2. Verificar que los cambios se aplicaron correctamente --- 3. Los datos existentes se mantendrán intactos --- --- ================================================================== - --- Configuración inicial -DROP DATABASE IF EXISTS ProyectoPanaderia; -SET SQL_SAFE_UPDATES = 0; -CREATE DATABASE ProyectoPanaderia; -USE ProyectoPanaderia; - --- ================================================================== --- DDL (DATA DEFINITION LANGUAGE) - DEFINICIÓN DE ESTRUCTURA --- ================================================================== - --- ================================================================== --- CREACIÓN DE TABLAS PRINCIPALES --- ================================================================== - --- Tabla: Clientes - Almacena información de los clientes -CREATE TABLE Clientes ( - ID_CLIENTE INT PRIMARY KEY AUTO_INCREMENT, - NOMBRE_CLI VARCHAR(100) NOT NULL, - TELEFONO_CLI VARCHAR(20), - ACTIVO_CLI BOOLEAN DEFAULT TRUE, - EMAIL_CLI VARCHAR(100), - CONTRASEÑA_CLI VARCHAR(255), - SALT_CLI VARCHAR(32) -); - --- Tabla: Empleados - Almacena información de los empleados -CREATE TABLE Empleados ( - ID_EMPLEADO INT PRIMARY KEY AUTO_INCREMENT, - NOMBRE_EMPLEADO VARCHAR(100) NOT NULL, - EMAIL_EMPLEADO VARCHAR(100) NOT NULL, - ACTIVO_EMPLEADO BOOLEAN DEFAULT TRUE, - CONTRASEÑA_EMPLEADO VARCHAR(255), - SALT_EMPLEADO VARCHAR(32), - FECHA_REGISTRO TIMESTAMP DEFAULT CURRENT_TIMESTAMP -); - --- Tabla: Administradores - Almacena información de los administradores -CREATE TABLE Administradores ( - ID_ADMIN INT PRIMARY KEY AUTO_INCREMENT, - NOMBRE_ADMIN VARCHAR(100) NOT NULL, - TELEFONO_ADMIN VARCHAR(20), - EMAIL_ADMIN VARCHAR(100), - CONTRASEÑA_ADMIN VARCHAR(255), - SALT_ADMIN VARCHAR(32) -); - --- Tabla: Proveedores - Almacena información de los proveedores -CREATE TABLE Proveedores ( - ID_PROVEEDOR INT PRIMARY KEY AUTO_INCREMENT, - NOMBRE_PROV VARCHAR(100) NOT NULL, - TELEFONO_PROV VARCHAR(20) NOT NULL, - ACTIVO_PROV BOOLEAN DEFAULT TRUE, - EMAIL_PROV VARCHAR(100) NOT NULL, - DIRECCION_PROV VARCHAR(200) -); - --- Tabla: Pedidos_Proveedores - Almacena pedidos realizados a proveedores -CREATE TABLE Pedidos_Proveedores ( - ID_PEDIDO_PROV INT PRIMARY KEY AUTO_INCREMENT, - ID_PROVEEDOR INT NOT NULL, - NUMERO_PEDIDO INT NOT NULL, - FECHA_PEDIDO DATE NOT NULL, - ESTADO_PEDIDO VARCHAR(50) DEFAULT 'Pendiente', - CONSTRAINT FK_PEDIDO_PROVEEDOR - FOREIGN KEY (ID_PROVEEDOR) REFERENCES Proveedores(ID_PROVEEDOR) ON UPDATE CASCADE ON DELETE RESTRICT -); - --- Tabla: Categoria_Productos - Almacena categorías de productos -CREATE TABLE Categoria_Productos ( - ID_CATEGORIA_PRODUCTO INT PRIMARY KEY AUTO_INCREMENT, - NOMBRE_CATEGORIAPRODUCTO VARCHAR(100) NOT NULL -); - --- Tabla: Estado_Pedidos - Almacena estados de pedidos -CREATE TABLE Estado_Pedidos ( - ID_ESTADO_PEDIDO INT PRIMARY KEY AUTO_INCREMENT, - NOMBRE_ESTADO VARCHAR(50) -); - --- Tabla: Categoria_Ingredientes - Almacena categorías de ingredientes -CREATE TABLE Categoria_Ingredientes ( - ID_CATEGORIA INT PRIMARY KEY AUTO_INCREMENT, - NOMBRE_CATEGORIA_INGREDIENTE VARCHAR(100) NOT NULL -); - --- Tabla: Ingredientes - Almacena ingredientes utilizados en productos -CREATE TABLE Ingredientes ( - ID_INGREDIENTE INT PRIMARY KEY AUTO_INCREMENT, - ID_PROVEEDOR INT, - ID_CATEGORIA INT, - NOMBRE_INGREDIENTE VARCHAR(100) NOT NULL, - CANTIDAD_INGREDIENTE INT NOT NULL, - FECHA_VENCIMIENTO DATE NOT NULL, - REFERENCIA_INGREDIENTE VARCHAR(100) NOT NULL, - FECHA_ENTREGA_INGREDIENTE DATE NOT NULL, - CONSTRAINT FK_PROVEEDOR_INGREDIENTE - FOREIGN KEY (ID_PROVEEDOR) REFERENCES Proveedores(ID_PROVEEDOR) ON UPDATE CASCADE ON DELETE RESTRICT, - CONSTRAINT FK_CATEGORIA_INGREDIENTE - FOREIGN KEY (ID_CATEGORIA) REFERENCES Categoria_Ingredientes(ID_CATEGORIA) ON UPDATE CASCADE ON DELETE RESTRICT -); - --- Tabla: Productos - Almacena productos de la panadería -CREATE TABLE Productos ( - ID_PRODUCTO INT PRIMARY KEY AUTO_INCREMENT, - ID_ADMIN INT, - ID_CATEGORIA_PRODUCTO INT, - NOMBRE_PRODUCTO VARCHAR(100) NOT NULL, - DESCRIPCION_PRODUCTO TEXT, - PRODUCTO_STOCK_MIN INT NOT NULL, - PRECIO_PRODUCTO DECIMAL(10,2) NOT NULL, - FECHA_VENCIMIENTO_PRODUCTO DATE NOT NULL, - FECHA_INGRESO_PRODUCTO DATE NOT NULL, - TIPO_PRODUCTO_MARCA VARCHAR(100) NOT NULL, - ACTIVO BOOLEAN DEFAULT TRUE, - FECHA_ULTIMA_MODIFICACION TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - CONSTRAINT FK_CATEGORIA_PRODUCTO - FOREIGN KEY (ID_CATEGORIA_PRODUCTO) REFERENCES Categoria_Productos(ID_CATEGORIA_PRODUCTO) ON UPDATE CASCADE ON DELETE RESTRICT, - CONSTRAINT FK_ADMIN_PRODUCTO - FOREIGN KEY (ID_ADMIN) REFERENCES Administradores(ID_ADMIN) ON UPDATE CASCADE ON DELETE RESTRICT -); - --- Tabla: Pedidos - Almacena pedidos realizados por clientes -CREATE TABLE Pedidos ( - ID_PEDIDO INT PRIMARY KEY AUTO_INCREMENT, - ID_CLIENTE INT, - ID_EMPLEADO INT, - ID_ESTADO_PEDIDO INT, - FECHA_INGRESO DATETIME NOT NULL, - FECHA_ENTREGA DATETIME NOT NULL, - TOTAL_PRODUCTO DECIMAL(10,2) NOT NULL, - CONSTRAINT FK_CLIENTE_PEDIDO - FOREIGN KEY (ID_CLIENTE) REFERENCES Clientes(ID_CLIENTE) ON UPDATE CASCADE ON DELETE RESTRICT, - CONSTRAINT FK_EMPLEADO_PEDIDO - FOREIGN KEY (ID_EMPLEADO) REFERENCES Empleados(ID_EMPLEADO) ON UPDATE CASCADE ON DELETE RESTRICT, - CONSTRAINT FK_ESTADO_PEDIDO_PEDIDO - FOREIGN KEY (ID_ESTADO_PEDIDO) REFERENCES Estado_Pedidos(ID_ESTADO_PEDIDO) ON UPDATE CASCADE ON DELETE RESTRICT -); - --- Tabla: Detalle_Pedidos - Almacena detalles de productos por pedido -CREATE TABLE Detalle_Pedidos ( - ID_DETALLE INT PRIMARY KEY AUTO_INCREMENT, - ID_PEDIDO INT NOT NULL, - ID_PRODUCTO INT NOT NULL, - CANTIDAD_PRODUCTO INT NOT NULL, - PRECIO_UNITARIO DECIMAL(10,2) NOT NULL, - SUBTOTAL DECIMAL(10,2) NOT NULL, - CONSTRAINT FK_DETALLE_PEDIDO - FOREIGN KEY (ID_PEDIDO) REFERENCES Pedidos(ID_PEDIDO) ON UPDATE CASCADE ON DELETE CASCADE, - CONSTRAINT FK_DETALLE_PRODUCTO - FOREIGN KEY (ID_PRODUCTO) REFERENCES Productos(ID_PRODUCTO) ON UPDATE CASCADE ON DELETE RESTRICT -); - --- Tabla: Ordenes_Salida - Almacena facturas de pedidos -CREATE TABLE Ordenes_Salida ( - ID_FACTURA INT PRIMARY KEY AUTO_INCREMENT, - ID_CLIENTE INT, - ID_PEDIDO INT, - FECHA_FACTURACION DATETIME NOT NULL, - TOTAL_FACTURA DECIMAL(10,2) NOT NULL, - CONSTRAINT FK_ORDENSALIDA_CLIENTE - FOREIGN KEY (ID_CLIENTE) REFERENCES Clientes(ID_CLIENTE) ON UPDATE CASCADE ON DELETE RESTRICT, - CONSTRAINT FK_ORDENSALIDA_PEDIDO - FOREIGN KEY (ID_PEDIDO) REFERENCES Pedidos(ID_PEDIDO) ON UPDATE CASCADE ON DELETE RESTRICT -); - --- ================================================================== --- TABLA DE LOGS PARA CAMBIOS EN PRODUCTOS --- ================================================================== - --- Tabla para registrar cambios en productos (logs de auditoría) -CREATE TABLE productos_logs ( - id INT PRIMARY KEY AUTO_INCREMENT, - producto_id INT NOT NULL, - tipo_cambio ENUM('precio', 'stock', 'activacion', 'desactivacion') NOT NULL, - valor_anterior VARCHAR(50), - valor_nuevo VARCHAR(50), - usuario_id INT, - usuario_tipo ENUM('admin', 'empleado') DEFAULT 'admin', - fecha_cambio TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - ip_usuario VARCHAR(45), - INDEX idx_producto_logs_fecha (fecha_cambio), - INDEX idx_producto_logs_producto (producto_id), - INDEX idx_producto_logs_tipo (tipo_cambio), - CONSTRAINT FK_PRODUCTO_LOG - FOREIGN KEY (producto_id) REFERENCES Productos(ID_PRODUCTO) ON DELETE CASCADE -); - --- Trigger para actualizar FECHA_ULTIMA_MODIFICACION automáticamente -DELIMITER // -CREATE TRIGGER tr_actualizar_fecha_producto - BEFORE UPDATE ON Productos - FOR EACH ROW -BEGIN - SET NEW.FECHA_ULTIMA_MODIFICACION = CURRENT_TIMESTAMP; -END// -DELIMITER ; - --- ================================================================== --- FUNCIONES DE UTILIDAD --- ================================================================== - --- Función: GenerateSalt - Genera salt aleatorio para encriptación -DELIMITER // - -CREATE FUNCTION GenerateSalt() -RETURNS VARCHAR(32) -READS SQL DATA -DETERMINISTIC -BEGIN - RETURN SUBSTRING(MD5(CONCAT(RAND(), NOW(), CONNECTION_ID())), 1, 32); -END// - -DELIMITER ; - --- Función: HashPassword - Hashea contraseñas con salt -DELIMITER // - -CREATE FUNCTION HashPassword(password VARCHAR(255), salt VARCHAR(32)) -RETURNS VARCHAR(255) -READS SQL DATA -DETERMINISTIC -BEGIN - RETURN SHA2(CONCAT(password, salt), 256); -END// - -DELIMITER ; - --- Función: GenerarCodigoProducto - Genera códigos de producto por categoría -DELIMITER // -CREATE FUNCTION GenerarCodigoProducto(categoria_id INT, producto_id INT) -RETURNS VARCHAR(50) -READS SQL DATA -DETERMINISTIC -BEGIN - DECLARE prefijo VARCHAR(10); - - -- Obtener prefijo según categoría - SELECT CASE - WHEN categoria_id = 1 THEN 'TL' -- Tortas Tres Leches - WHEN categoria_id = 2 THEN 'TM' -- Tortas Milkyway - WHEN categoria_id = 3 THEN 'TE' -- Tortas Encargo - WHEN categoria_id = 4 THEN 'PG' -- Pan Grande - WHEN categoria_id = 5 THEN 'PP' -- Pan Pequeño - WHEN categoria_id = 6 THEN 'PS' -- Postres - WHEN categoria_id = 7 THEN 'GA' -- Galletas - WHEN categoria_id = 8 THEN 'TA' -- Tamales - WHEN categoria_id = 9 THEN 'YO' -- Yogures - WHEN categoria_id = 10 THEN 'PC' -- Pasteles Pollo - WHEN categoria_id = 11 THEN 'BE' -- Bebidas - WHEN categoria_id = 12 THEN 'PI' -- Panadería Integral - ELSE 'PR' - END INTO prefijo; - - RETURN CONCAT(prefijo, '-', LPAD(producto_id, 4, '0')); -END// -DELIMITER ; - --- Función: GenerarNumeroPedido - Genera números de pedido automáticos -DELIMITER // -CREATE FUNCTION GenerarNumeroPedido(pedido_id INT) -RETURNS VARCHAR(50) -READS SQL DATA -DETERMINISTIC -BEGIN - RETURN CONCAT('PED-', YEAR(NOW()), '-', LPAD(pedido_id, 6, '0')); -END// -DELIMITER ; - --- ================================================================== --- TRIGGERS --- ================================================================== - --- Trigger: Actualizar total del pedido cuando se inserta detalle -DELIMITER // - -CREATE TRIGGER tr_actualizar_total_pedido -AFTER INSERT ON Detalle_Pedidos -FOR EACH ROW -BEGIN - UPDATE Pedidos - SET TOTAL_PRODUCTO = ( - SELECT SUM(SUBTOTAL) - FROM Detalle_Pedidos - WHERE ID_PEDIDO = NEW.ID_PEDIDO - ) - WHERE ID_PEDIDO = NEW.ID_PEDIDO; -END// - -DELIMITER ; - --- Trigger: Actualizar total del pedido cuando se modifica detalle -DELIMITER // - -CREATE TRIGGER tr_actualizar_total_pedido_update -AFTER UPDATE ON Detalle_Pedidos -FOR EACH ROW -BEGIN - UPDATE Pedidos - SET TOTAL_PRODUCTO = ( - SELECT SUM(SUBTOTAL) - FROM Detalle_Pedidos - WHERE ID_PEDIDO = NEW.ID_PEDIDO - ) - WHERE ID_PEDIDO = NEW.ID_PEDIDO; -END// - -DELIMITER ; - --- ================================================================== --- PROCEDIMIENTOS ALMACENADOS --- ================================================================== - --- Procedimiento: sp_productos_por_categoria - Busca productos por categoría -DELIMITER // - -CREATE PROCEDURE sp_productos_por_categoria( - IN nombre_categoria VARCHAR(100) -) -BEGIN - -- Buscar productos por nombre de categoría - SELECT - p.ID_PRODUCTO, - p.NOMBRE_PRODUCTO, - p.PRECIO_PRODUCTO, - p.PRODUCTO_STOCK_MIN, - p.TIPO_PRODUCTO_MARCA, - cp.NOMBRE_CATEGORIAPRODUCTO as CATEGORIA - FROM Productos p - INNER JOIN Categoria_Productos cp ON p.ID_CATEGORIA_PRODUCTO = cp.ID_CATEGORIA_PRODUCTO - WHERE cp.NOMBRE_CATEGORIAPRODUCTO LIKE CONCAT('%', nombre_categoria, '%') - ORDER BY p.NOMBRE_PRODUCTO; - - -- Mostrar el total de productos encontrados - SELECT COUNT(*) as TOTAL_PRODUCTOS_ENCONTRADOS - FROM Productos p - INNER JOIN Categoria_Productos cp ON p.ID_CATEGORIA_PRODUCTO = cp.ID_CATEGORIA_PRODUCTO - WHERE cp.NOMBRE_CATEGORIAPRODUCTO LIKE CONCAT('%', nombre_categoria, '%'); -END// - -DELIMITER ; - --- Procedimiento: sp_crear_pedido - Crear un nuevo pedido -DELIMITER // - -CREATE PROCEDURE sp_crear_pedido( - IN p_id_cliente INT, - IN p_id_empleado INT, - IN p_fecha_entrega DATETIME -) -BEGIN - DECLARE nuevo_id_pedido INT; - - -- Insertar el pedido - INSERT INTO Pedidos (ID_CLIENTE, ID_EMPLEADO, ID_ESTADO_PEDIDO, FECHA_INGRESO, FECHA_ENTREGA, TOTAL_PRODUCTO) - VALUES (p_id_cliente, p_id_empleado, 1, NOW(), p_fecha_entrega, 0.00); - - -- Obtener el ID del pedido recién creado - SET nuevo_id_pedido = LAST_INSERT_ID(); - - -- Devolver el ID del nuevo pedido - SELECT nuevo_id_pedido as NUEVO_ID_PEDIDO; -END// - -DELIMITER ; - --- ================================================================== --- DML (DATA MANIPULATION LANGUAGE) - INSERCIÓN DE DATOS --- ================================================================== - --- ================================================================== --- INSERCIÓN DE DATOS BASE --- ================================================================== - --- Inserción en tabla: Clientes -INSERT INTO Clientes (NOMBRE_CLI, TELEFONO_CLI, EMAIL_CLI) VALUES -('Ana Pérez', '3101234567', 'ana.p@mail.com'), -('Luis Gómez', '3209876543', 'luis.g@mail.com'), -('Maria Rodriguez', '3001122334', 'maria.r@mail.com'); - --- Inserción en tabla: Empleados -INSERT INTO Empleados (NOMBRE_EMPLEADO) VALUES -('Andres Alkaeda'), -('Damian Avila'), -('Brayan Jimenez'), -('Ana Goyeneche'), -('Sharyt Zamora'); - --- Inserción en tabla: Administradores -INSERT INTO Administradores (NOMBRE_ADMIN, TELEFONO_ADMIN, EMAIL_ADMIN) VALUES -('Admin Uno', '3005550101', 'admin1@store.com'); - --- Inserción en tabla: Proveedores -INSERT INTO `proveedores` (`ID_PROVEEDOR`, `NOMBRE_PROV`) VALUES -('1', 'Harina Dorada'), -('2', 'Dulce Granero'), -('3', 'El Horno Mágico S.A.S.'), -('4', 'Masa Maestra Distribuciones'), -('5', 'Insumos Panaderos del Sol'), -('6', 'La Esencia del Pan'), -('7', 'Proveedora Integral del Panadero'), -('8', 'Alimentos para Hornear Cía. Ltda.'); - --- Inserción en tabla: Pedidos_Proveedores -INSERT INTO Pedidos_Proveedores (ID_PROVEEDOR, NUMERO_PEDIDO, FECHA_PEDIDO, ESTADO_PEDIDO) VALUES -(1, 1001, '2024-01-15', 'Entregado'), -(2, 1002, '2024-02-10', 'Entregado'), -(3, 1003, '2024-03-05', 'Entregado'); - --- Inserción en tabla: Categoria_Productos -INSERT INTO Categoria_Productos (NOMBRE_CATEGORIAPRODUCTO) VALUES -('Tortas Tres Leches'), -('Tortas Milyway'), -('Tortas por Encargo'), -('Pan Grande'), -('Pan Pequeño'), -('Postres'), -('Galletas'), -('Tamales'), -('Yogures'), -('Pasteles Pollo'); - --- Inserción en tabla: Estado_Pedidos -INSERT INTO Estado_Pedidos (NOMBRE_ESTADO) VALUES -('Pendiente'), -('En Preparación'), -('Listo para Entrega'), -('Entregado'), -('Cancelado'); - --- Inserción en tabla: Categoria_Ingredientes -INSERT INTO `categoria_ingredientes` (`ID_CATEGORIA`, `NOMBRE_CATEGORIA_INGREDIENTE`) VALUES -('1', 'Harinas'), -('2', 'Lácteos y Derivados'), -('3', 'Azúcares y Endulzantes'), -('4', 'Grasas'), -('5', 'Esencias'), -('6', 'Fruta'), -('7', 'Frutos Secos'), -('8', 'Levaduras'), -('9', 'Huevos'), -('10', 'Chocolate y Cacao'), -('11', 'Espesantes y Gelificantes'), -('12', 'Colorantes Alimentarios'), -('13', 'Sal'), -('14', 'Aditivos y Mejoradores'), -('15', 'Semillas'), -('16', 'Coberturas y Rellenos'); - --- Inserción en tabla: Ingredientes -INSERT INTO `ingredientes` (`ID_INGREDIENTE`, `ID_PROVEEDOR`, `ID_CATEGORIA`, `NOMBRE_INGREDIENTE`, `CANTIDAD_INGREDIENTE`, `FECHA_VENCIMIENTO`, `REFERENCIA_INGREDIENTE`) VALUES -('1', '2', '1', 'Harina de Trigo', '100', '2025-12-20', 'HAR-TRG-05'), -('2', '1', '2', 'Leche Entera UHT', '30', '2025-08-01', 'LECH-ENT-1L'), -('3', '3', '3', 'Azúcar Blanca', '70', '2026-01-30', 'AZUC-BLN-KG'), -('4', '4', '4', 'Mantequilla sin Sal', '25', '2025-09-15', 'MANT-SS-KG'), -('5', '5', '9', 'Huevos Grandes', '120', '2025-07-25', 'HUEV-GR-DZ'), -('6', '6', '10', 'Chocolate Semi-Amargo (Gotas)', '15', '2026-03-10', 'CHOC-SM-KG'), -('7', '7', '8', 'Levadura Fresca', '5', '2025-07-10', 'LEV-FRES-GR'), -('8', '1', '3', 'Azúcar Moreno', '10', '2026-02-20', 'AZUC-MRN-KG'), -('9', '2', '1', 'Harina Integral', '50', '2025-11-01', 'HAR-INT-02'), -('10', '3', '4', 'Aceite Vegetal', '20', '2026-05-01', 'ACET-VEG-LT'), -('11', '4', '10', 'Cacao en Polvo', '8', '2026-04-15', 'CACAO-POL-KG'), -('12', '5', '6', 'Manzanas Verdes (Kg)', '10', '2025-07-12', 'MANZ-VRD-KG'), -('13', '6', '7', 'Nueces Picadas', '5', '2025-10-01', 'NUEZ-PIC-KG'), -('14', '7', '5', 'Esencia de Vainilla', '2', '2027-01-01', 'ESEN-VN-LT'), -('15', '8', '13', 'Sal Fina', '2', '2028-01-01', 'SAL-FIN-KG'), -('16', '1', '2', 'Crema de Leche', '5', '2025-08-05', 'CREM-LECH-LT'), -('17', '2', '11', 'Gelatina sin Sabor', '1', '2026-09-01', 'GEL-SS-KG'), -('18', '3', '12', 'Colorante Alimentario Rojo', '0.5', '2027-03-01', 'COLR-ROJ-ML'), -('19', '4', '15', 'Semillas de Sésamo', '3', '2026-06-01', 'SEM-SES-KG'), -('20', '5', '16', 'Dulce de Leche', '10', '2025-11-15', 'DDL-KG'); - --- Inserción en tabla: Productos -INSERT INTO `productos` (`ID_PRODUCTO`, `ID_ADMIN`, `ID_CATEGORIA_PRODUCTO`, `NOMBRE_PRODUCTO`, `DESCRIPCION_PRODUCTO`, `PRODUCTO_STOCK_MIN`, `PRECIO_PRODUCTO`, `FECHA_VENCIMIENTO_PRODUCTO`, `FECHA_INGRESO_PRODUCTO`, `TIPO_PRODUCTO_MARCA`) VALUES -('1', '1', '8', 'Tamales Tolimenses', 'Tradicionales tamales envueltos en hoja de plátano, con masa de maíz y relleno de carne de cerdo y pollo', '10', '3800.00', '2025-09-15', '2025-07-01', 'Propio'), -('2', '1', '4', 'Pan Tajado Integral', 'Pan de molde integral, ideal para desayunos saludables, rico en fibra', '15', '4200.00', '2025-07-02', '2025-07-01', 'Propio'), -('3', '1', '7', 'Yogurt Fresa Litro', 'Yogurt cremoso con trozos de fresa natural, sin conservantes artificiales', '12', '6000.00', '2025-07-30', '2025-07-03', 'Alpina'), -('4', '1', '5', 'Galleta de Tres Ojos', 'Galleta tradicional colombiana con tres círculos de dulce, crujiente y deliciosa', '20', '2500.00', '2025-11-01', '2025-07-01', 'Propio'), -('5', '1', '1', 'Pan Campesino Grande', 'Pan artesanal de corteza dorada y miga suave, ideal para acompañar comidas', '8', '5500.00', '2025-07-08', '2025-07-04', 'Propio'), -('6', '1', '3', 'Torta de Chocolate Pequeña', 'Deliciosa torta de chocolate húmeda con cobertura de chocolate, perfecta para ocasiones especiales', '5', '18000.00', '2025-07-07', '2025-07-04', 'Propio'), -('7', '1', '2', 'Croissant de Almendras', NULL, '18', '3500.00', '2025-07-06', '2025-07-05', 'Propio'), -('8', '1', '1', 'Baguette Clásica', 'Pan francés tradicional con corteza crujiente y miga aireada', '25', '2800.00', '2025-07-06', '2025-07-05', 'Propio'), -('9', '1', '5', 'Bizcochos de Achira', NULL, '15', '4000.00', '2025-12-01', '2025-07-01', 'Propio'), -('10', '1', '6', 'Jugo de Naranja Natural (500ml)', 'Jugo 100% natural exprimido de naranjas frescas, sin azúcar añadido', '10', '4500.00', '2025-07-05', '2025-07-04', 'Postobón'), -('11', '1', '7', 'Postre de Tres Leches', 'Clásico postre colombiano empapado en tres tipos de leche, suave y cremoso', '7', '7500.00', '2025-07-08', '2025-07-04', 'Propio'), -('12', '1', '4', 'Pan Blanco de Molde', NULL, '20', '3900.00', '2025-07-02', '2025-07-01', 'Propio'), -('13', '1', '3', 'Muffin de Arándanos', 'Muffin esponjoso con arándanos frescos, perfecto para el desayuno o merienda', '15', '3000.00', '2025-07-07', '2025-07-04', 'Propio'), -('14', '1', '2', 'Pan de Bono Pequeño', NULL, '30', '1500.00', '2025-07-06', '2025-07-05', 'Propio'), -('15', '1', '8', 'Empanadas de Carne (unidad)', 'Empanada frita rellena de carne molida sazonada con especias tradicionales', '20', '2000.00', '2025-07-06', '2025-07-05', 'Propio'), -('16', '1', '3', 'Brazo de Reina', 'Bizcocho enrollado relleno de dulce de leche y cubierto con coco rallado', '10', '9500.00', '2025-07-09', '2025-07-04', 'Propio'), -('17', '1', '1', 'Pan Trenza Integral', NULL, '12', '4800.00', '2025-07-07', '2025-07-03', 'Propio'), -('18', '1', '5', 'Galletas Surtidas de Mantequilla', 'Variedad de galletas caseras de mantequilla con diferentes formas y sabores', '25', '3200.00', '2025-12-30', '2025-07-01', 'Propio'), -('19', '1', '7', 'Avena La Lechera (500ml)', NULL, '18', '5800.00', '2025-08-20', '2025-07-03', 'Nestlé'), -('20', '1', '9', 'Ponqué de Naranja (Porción)', 'Porción individual de ponqué de naranja con glaseado cítrico', '15', '3000.00', '2025-07-08', '2025-07-04', 'Propio'), -('21', '1', '10', 'Pan Artesanal de Masa Madre', 'Pan elaborado con masa madre natural, fermentación larga para mejor digestibilidad', '7', '8000.00', '2025-07-07', '2025-07-05', 'Propio'), -('22', '1', '3', 'Cheesecake de Frutos Rojos', 'Cheesecake cremoso con base de galleta y cobertura de frutos rojos frescos', '6', '25000.00', '2025-07-09', '2025-07-04', 'Propio'), -('23', '1', '4', 'Pan de Hamburguesa', NULL, '30', '4500.00', '2025-07-10', '2025-07-02', 'Propio'), -('24', '1', '5', 'Galletas de Avena y Pasas', 'Galletas nutritivas con avena integral y pasas, sin azúcar refinado', '22', '2700.00', '2026-01-01', '2025-07-01', 'Propio'), -('25', '1', '7', 'Kumiss Natural', NULL, '10', '4900.00', '2025-07-25', '2025-07-03', 'Alquería'), -('26', '1', '9', 'Brownie con Nuez', 'Brownie de chocolate intenso con trozos de nuez, húmedo y delicioso', '40', '1800.00', '2025-07-08', '2025-07-05', 'Propio'), -('27', '1', '1', 'Pan Blandito', NULL, '28', '2500.00', '2025-07-07', '2025-07-05', 'Propio'), -('28', '1', '3', 'Milhoja de Arequipe', 'Delicada milhoja rellena de arequipe casero y cubierta con azúcar glass', '12', '6000.00', '2025-07-08', '2025-07-04', 'Propio'), -('29', '1', '2', 'Mogolla Chicharrona', NULL, '15', '3500.00', '2025-07-06', '2025-07-05', 'Propio'), -('30', '1', '8', 'Arequipe (Tarro 500g)', 'Arequipe casero cremoso y dulce, perfecto para postres y acompañamientos', '8', '9000.00', '2026-04-10', '2025-07-01', 'Propio'); - --- Inserción en tabla: Pedidos -INSERT INTO Pedidos (ID_CLIENTE, ID_EMPLEADO, ID_ESTADO_PEDIDO, FECHA_INGRESO, FECHA_ENTREGA, TOTAL_PRODUCTO) VALUES -(1, 1, 2, '2025-06-20 09:00:00', '2025-06-20 15:00:00', 10000.00), -(2, 2, 4, '2025-06-19 10:30:00', '2025-06-19 16:30:00', 7500.00), -(3, 1, 1, '2025-06-21 08:00:00', '2025-06-21 14:00:00', 12500.00); - --- Inserción en tabla: Detalle_Pedidos -INSERT INTO Detalle_Pedidos (ID_PEDIDO, ID_PRODUCTO, CANTIDAD_PRODUCTO, PRECIO_UNITARIO, SUBTOTAL) VALUES -(1, 1, 2, 3500.00, 7000.00), -(1, 3, 1, 6000.00, 6000.00), -(2, 2, 1, 4200.00, 4200.00), -(2, 4, 3, 2500.00, 7500.00), -(3, 1, 3, 3500.00, 10500.00), -(3, 4, 2, 2500.00, 5000.00); - --- Inserción en tabla: Ordenes_Salida -INSERT INTO Ordenes_Salida (ID_CLIENTE, ID_PEDIDO, FECHA_FACTURACION, TOTAL_FACTURA) VALUES -(1, 1, '2025-06-20 15:30:00', 13000.00), -(2, 2, '2025-06-19 17:00:00', 11700.00), -(3, 3, '2025-06-21 14:30:00', 15500.00); - --- ================================================================== --- DSL (DATA SECURITY LANGUAGE) - SEGURIDAD Y ENCRIPTACIÓN --- ================================================================== - --- ================================================================== --- CONFIGURACIÓN DE SEGURIDAD - CONTRASEÑAS --- ================================================================== - --- Actualizar contraseñas de administradores con encriptación -UPDATE Administradores -SET SALT_ADMIN = GenerateSalt() -WHERE ID_ADMIN = 1; - -UPDATE Administradores -SET CONTRASEÑA_ADMIN = HashPassword('admin123', SALT_ADMIN) -WHERE ID_ADMIN = 1; - --- Actualizar contraseñas de clientes con encriptación -UPDATE Clientes -SET SALT_CLI = GenerateSalt() -WHERE ID_CLIENTE IN (1, 2, 3); - -UPDATE Clientes -SET CONTRASEÑA_CLI = HashPassword('cliente123', SALT_CLI) -WHERE ID_CLIENTE = 1; - -UPDATE Clientes -SET CONTRASEÑA_CLI = HashPassword('cliente456', SALT_CLI) -WHERE ID_CLIENTE = 2; - -UPDATE Clientes -SET CONTRASEÑA_CLI = HashPassword('cliente789', SALT_CLI) -WHERE ID_CLIENTE = 3; - --- Actualizar contraseñas de empleados con encriptación -UPDATE Empleados -SET SALT_EMPLEADO = GenerateSalt() -WHERE ID_EMPLEADO IN (1, 2, 3, 4, 5); - -UPDATE Empleados -SET CONTRASEÑA_EMPLEADO = HashPassword('empleado123', SALT_EMPLEADO) -WHERE ID_EMPLEADO = 1; - -UPDATE Empleados -SET CONTRASEÑA_EMPLEADO = HashPassword('empleado456', SALT_EMPLEADO) -WHERE ID_EMPLEADO = 2; - --- ================================================================== --- DQL (DATA QUERY LANGUAGE) - CONSULTAS Y VERIFICACIONES --- ================================================================== - --- ================================================================== --- CONSULTAS DE VERIFICACIÓN --- ================================================================== - --- Verificación de registros en todas las tablas -SELECT 'CLIENTES' as Tabla, COUNT(*) as Total_Registros FROM Clientes -UNION ALL -SELECT 'EMPLEADOS', COUNT(*) FROM Empleados -UNION ALL -SELECT 'ADMINISTRADORES', COUNT(*) FROM Administradores -UNION ALL -SELECT 'PROVEEDORES', COUNT(*) FROM Proveedores -UNION ALL -SELECT 'PEDIDOS_PROVEEDORES', COUNT(*) FROM Pedidos_Proveedores -UNION ALL -SELECT 'CATEGORIA_PRODUCTOS', COUNT(*) FROM Categoria_Productos -UNION ALL -SELECT 'ESTADO_PEDIDOS', COUNT(*) FROM Estado_Pedidos -UNION ALL -SELECT 'CATEGORIA_INGREDIENTES', COUNT(*) FROM Categoria_Ingredientes -UNION ALL -SELECT 'INGREDIENTES', COUNT(*) FROM Ingredientes -UNION ALL -SELECT 'PRODUCTOS', COUNT(*) FROM Productos -UNION ALL -SELECT 'PEDIDOS', COUNT(*) FROM Pedidos -UNION ALL -SELECT 'DETALLE_PEDIDOS', COUNT(*) FROM Detalle_Pedidos -UNION ALL -SELECT 'ORDENES_SALIDA', COUNT(*) FROM Ordenes_Salida; - --- Consulta detallada de productos con información completa -SELECT - p.ID_PRODUCTO, - p.NOMBRE_PRODUCTO, - cp.NOMBRE_CATEGORIAPRODUCTO as CATEGORIA, - p.PRECIO_PRODUCTO, - p.PRODUCTO_STOCK_MIN, - p.TIPO_PRODUCTO_MARCA, - a.NOMBRE_ADMIN as ADMINISTRADOR, - p.FECHA_ULTIMA_MODIFICACION -FROM Productos p -INNER JOIN Categoria_Productos cp ON p.ID_CATEGORIA_PRODUCTO = cp.ID_CATEGORIA_PRODUCTO -INNER JOIN Administradores a ON p.ID_ADMIN = a.ID_ADMIN -ORDER BY p.NOMBRE_PRODUCTO; - --- Consulta detallada de pedidos con información completa -SELECT - ped.ID_PEDIDO, - c.NOMBRE_CLI as CLIENTE, - e.NOMBRE_EMPLEADO as EMPLEADO, - ep.NOMBRE_ESTADO as ESTADO, - ped.FECHA_INGRESO, - ped.FECHA_ENTREGA, - p.NOMBRE_PRODUCTO, - dp.CANTIDAD_PRODUCTO, - dp.PRECIO_UNITARIO, - dp.SUBTOTAL -FROM Pedidos ped -INNER JOIN Clientes c ON ped.ID_CLIENTE = c.ID_CLIENTE -INNER JOIN Empleados e ON ped.ID_EMPLEADO = e.ID_EMPLEADO -INNER JOIN Estado_Pedidos ep ON ped.ID_ESTADO_PEDIDO = ep.ID_ESTADO_PEDIDO -INNER JOIN Detalle_Pedidos dp ON ped.ID_PEDIDO = dp.ID_PEDIDO -INNER JOIN Productos p ON dp.ID_PRODUCTO = p.ID_PRODUCTO -ORDER BY ped.ID_PEDIDO, dp.ID_DETALLE; - --- ================================================================== --- CONSULTAS DE VERIFICACIÓN DE SEGURIDAD --- ================================================================== - --- Verificación del hasheo de contraseñas de administradores -SELECT - ID_ADMIN, - NOMBRE_ADMIN, - SALT_ADMIN, - CONTRASEÑA_ADMIN, - LENGTH(CONTRASEÑA_ADMIN) as LONGITUD_HASH -FROM Administradores; - --- Verificación del hasheo de contraseñas de clientes - -SELECT - ID_CLIENTE, - NOMBRE_CLI, - SALT_CLI, - CONTRASEÑA_CLI, - LENGTH(CONTRASEÑA_CLI) as LONGITUD_HASH -FROM Clientes; - --- Verificación del hasheo de contraseñas de empleados - -SELECT - ID_EMPLEADO, - NOMBRE_EMPLEADO, - SALT_EMPLEADO, - CONTRASEÑA_EMPLEADO, - LENGTH(CONTRASEÑA_EMPLEADO) as LONGITUD_HASH -FROM Empleados; - --- Consulta consolidada de todas las contraseñas hasheadas - -SELECT 'ADMIN' as TIPO, NOMBRE_ADMIN as NOMBRE, SALT_ADMIN as SALT, CONTRASEÑA_ADMIN as HASH -FROM Administradores -WHERE CONTRASEÑA_ADMIN IS NOT NULL - -UNION ALL - -SELECT 'CLIENTE' as TIPO, NOMBRE_CLI as NOMBRE, SALT_CLI as SALT, CONTRASEÑA_CLI as HASH -FROM Clientes -WHERE CONTRASEÑA_CLI IS NOT NULL - -UNION ALL - -SELECT 'EMPLEADO' as TIPO, NOMBRE_EMPLEADO as NOMBRE, SALT_EMPLEADO as SALT, CONTRASEÑA_EMPLEADO as HASH -FROM Empleados -WHERE CONTRASEÑA_EMPLEADO IS NOT NULL; - - --- ================================================================== --- PRUEBAS Y VALIDACIONES --- ================================================================== - --- Prueba de trigger de actualización de fecha de modificación -UPDATE Productos -SET PRECIO_PRODUCTO = 3800.00 -WHERE NOMBRE_PRODUCTO = 'Tamales Tolimenses'; - --- Verificación de la actualización de fecha de modificación -SELECT - NOMBRE_PRODUCTO, - PRECIO_PRODUCTO, - FECHA_ULTIMA_MODIFICACION -FROM Productos -WHERE NOMBRE_PRODUCTO = 'Tamales Tolimenses'; - --- Pruebas de procedimientos almacenados -CALL sp_productos_por_categoria('Pan'); -CALL sp_productos_por_categoria('Torta'); -CALL sp_productos_por_categoria('Yogur'); - --- Prueba de creación de nuevo pedido -CALL sp_crear_pedido(1, 2, '2025-06-25 16:00:00'); - --- ================================================================== --- VERIFICACIONES FINALES DEL SISTEMA --- ================================================================== - --- Verificar triggers creados -SHOW TRIGGERS WHERE `Table` IN ('Productos', 'Detalle_Pedidos'); - --- Verificar procedimientos almacenados creados -SHOW PROCEDURE STATUS WHERE Name LIKE 'sp_%'; - --- Verificar funciones creadas -SHOW FUNCTION STATUS WHERE Name LIKE '%Password%' OR Name LIKE '%Salt%'; - --- Verificar estructura de las tablas principales -DESCRIBE Productos; -DESCRIBE Pedidos; -DESCRIBE Detalle_Pedidos; - --- Script para actualizar estados de pedidos --- Ejecutar solo si es necesario ajustar los estados - --- Verificar estados existentes -SELECT * FROM Estado_Pedidos; - --- Si necesitas ajustar los estados, puedes usar estas consultas: --- UPDATE Estado_Pedidos SET NOMBRE_ESTADO = 'Pendiente' WHERE ID_ESTADO_PEDIDO = 1; --- UPDATE Estado_Pedidos SET NOMBRE_ESTADO = 'En Preparación' WHERE ID_ESTADO_PEDIDO = 2; --- UPDATE Estado_Pedidos SET NOMBRE_ESTADO = 'Listo' WHERE ID_ESTADO_PEDIDO = 3; --- UPDATE Estado_Pedidos SET NOMBRE_ESTADO = 'Entregado' WHERE ID_ESTADO_PEDIDO = 4; --- UPDATE Estado_Pedidos SET NOMBRE_ESTADO = 'Cancelado' WHERE ID_ESTADO_PEDIDO = 5; - --- O insertar si no existen: --- INSERT INTO Estado_Pedidos (NOMBRE_ESTADO) VALUES --- ('Pendiente'), --- ('En Preparación'), --- ('Listo'), --- ('Entregado'), --- ('Cancelado'); - --- ================================================================== --- MIGRACIONES Y ACTUALIZACIONES DEL SISTEMA --- ================================================================== - --- ================================================================== --- MIGRACIÓN: ACTUALIZAR TIPO DE DATO PRECIO_PRODUCTO --- ================================================================== --- NOTA: Solo ejecutar si la base de datos ya existe y necesita actualización --- Descomentar las siguientes líneas para migrar una base de datos existente: - -<> --- Actualizar tipo de dato de PRECIO_PRODUCTO de INT a DECIMAL -ALTER TABLE Productos MODIFY COLUMN PRECIO_PRODUCTO DECIMAL(10,2) NOT NULL; - --- Verificar la estructura actualizada -DESCRIBE Productos; -<> - --- ================================================================== --- VERIFICACIÓN Y CREACIÓN DE TABLA DE LOGS --- ================================================================== --- Script para verificar y crear tabla productos_logs si no existe - --- Verificar si la tabla productos_logs existe -SET @table_exists = ( - SELECT COUNT(*) - FROM information_schema.tables - WHERE table_schema = DATABASE() - AND table_name = 'productos_logs' -); - --- Crear tabla productos_logs si no existe (para bases de datos existentes) -SET @sql = IF(@table_exists = 0, - 'CREATE TABLE productos_logs ( - id INT PRIMARY KEY AUTO_INCREMENT, - producto_id INT NOT NULL, - tipo_cambio ENUM(''precio'', ''stock'', ''activacion'', ''desactivacion'') NOT NULL, - valor_anterior VARCHAR(50), - valor_nuevo VARCHAR(50), - usuario_id INT, - usuario_tipo ENUM(''admin'', ''empleado'') DEFAULT ''admin'', - fecha_cambio TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - ip_usuario VARCHAR(45), - INDEX idx_producto_logs_fecha (fecha_cambio), - INDEX idx_producto_logs_producto (producto_id), - INDEX idx_producto_logs_tipo (tipo_cambio), - CONSTRAINT FK_PRODUCTO_LOG - FOREIGN KEY (producto_id) REFERENCES Productos(ID_PRODUCTO) ON DELETE CASCADE - )', - 'SELECT ''Tabla productos_logs ya existe'' as mensaje' -); - -PREPARE stmt FROM @sql; -EXECUTE stmt; -DEALLOCATE PREPARE stmt; - --- ================================================================== --- VERIFICACIÓN Y CREACIÓN DE TRIGGER --- ================================================================== --- Script para verificar y crear trigger si no existe - --- Verificar si el trigger existe -SET @trigger_exists = ( - SELECT COUNT(*) - FROM information_schema.triggers - WHERE trigger_schema = DATABASE() - AND trigger_name = 'tr_actualizar_fecha_producto' -); - --- Crear trigger si no existe -SET @sql_trigger = IF(@trigger_exists = 0, - 'CREATE TRIGGER tr_actualizar_fecha_producto - BEFORE UPDATE ON Productos - FOR EACH ROW - BEGIN - SET NEW.FECHA_ULTIMA_MODIFICACION = CURRENT_TIMESTAMP; - END', - 'SELECT ''Trigger tr_actualizar_fecha_producto ya existe'' as mensaje' -); - -PREPARE stmt_trigger FROM @sql_trigger; -EXECUTE stmt_trigger; -DEALLOCATE PREPARE stmt_trigger; - --- ================================================================== --- CONSULTAS DE MANTENIMIENTO Y VERIFICACIÓN --- ================================================================== - --- Verificar estructura de tabla Productos -SELECT - COLUMN_NAME as 'Campo', - COLUMN_TYPE as 'Tipo', - IS_NULLABLE as 'Nulo', - COLUMN_DEFAULT as 'Por_Defecto', - EXTRA as 'Extra' -FROM information_schema.COLUMNS -WHERE TABLE_SCHEMA = DATABASE() -AND TABLE_NAME = 'Productos' -ORDER BY ORDINAL_POSITION; - --- Verificar existencia de tabla productos_logs -SELECT - TABLE_NAME as 'Tabla', - TABLE_ROWS as 'Filas', - CREATE_TIME as 'Fecha_Creacion' -FROM information_schema.TABLES -WHERE TABLE_SCHEMA = DATABASE() -AND TABLE_NAME IN ('Productos', 'productos_logs'); - --- Verificar triggers relacionados con Productos -SELECT - TRIGGER_NAME as 'Trigger', - EVENT_MANIPULATION as 'Evento', - EVENT_OBJECT_TABLE as 'Tabla', - TRIGGER_BODY as 'Accion' -FROM information_schema.TRIGGERS -WHERE TRIGGER_SCHEMA = DATABASE() -AND EVENT_OBJECT_TABLE = 'Productos'; - --- Verificar índices de la tabla productos_logs -SELECT - INDEX_NAME as 'Indice', - COLUMN_NAME as 'Columna', - NON_UNIQUE as 'No_Unico' -FROM information_schema.STATISTICS -WHERE TABLE_SCHEMA = DATABASE() -AND TABLE_NAME = 'productos_logs' -ORDER BY INDEX_NAME, SEQ_IN_INDEX; - --- ================================================================== --- CONSULTAS DE PRUEBA PARA LOGS --- ================================================================== - --- Consulta para ver logs recientes (ejecutar después de hacer cambios) --- SELECT * FROM productos_logs ORDER BY fecha_cambio DESC LIMIT 10; - --- Consulta para ver cambios de un producto específico --- SELECT --- pl.*, --- p.NOMBRE_PRODUCTO --- FROM productos_logs pl --- JOIN Productos p ON pl.producto_id = p.ID_PRODUCTO --- WHERE pl.producto_id = 1 --- ORDER BY pl.fecha_cambio DESC; - --- Consulta para ver estadísticas de cambios --- SELECT --- tipo_cambio, --- COUNT(*) as total_cambios, --- DATE(fecha_cambio) as fecha --- FROM productos_logs --- GROUP BY tipo_cambio, DATE(fecha_cambio) --- ORDER BY fecha DESC, tipo_cambio; - --- ================================================================== --- SCRIPT DE LIMPIEZA (OPCIONAL) --- ================================================================== - --- Limpiar logs antiguos (ejecutar solo si es necesario) --- DELETE FROM productos_logs WHERE fecha_cambio < DATE_SUB(NOW(), INTERVAL 90 DAY); - --- Resetear AUTO_INCREMENT de la tabla logs --- ALTER TABLE productos_logs AUTO_INCREMENT = 1; - --- ============================================================ --- MIGRACIÓN: Agregar columna FECHA_REGISTRO a tabla Empleados --- ============================================================ - --- Verificar y agregar columna FECHA_REGISTRO a la tabla Empleados si no existe -SET @sql = (SELECT IF( - (SELECT COUNT(*) FROM information_schema.COLUMNS - WHERE TABLE_SCHEMA = DATABASE() - AND TABLE_NAME = 'Empleados' - AND COLUMN_NAME = 'FECHA_REGISTRO') = 0, - 'ALTER TABLE Empleados ADD COLUMN FECHA_REGISTRO TIMESTAMP DEFAULT CURRENT_TIMESTAMP', - 'SELECT "La columna FECHA_REGISTRO ya existe en la tabla Empleados" as mensaje' -)); - -PREPARE stmt FROM @sql; -EXECUTE stmt; -DEALLOCATE PREPARE stmt; - --- ============================================================ --- MIGRACIÓN: Agregar columna DESCRIPCION_PRODUCTO a tabla Productos --- ============================================================ - --- Verificar y agregar columna DESCRIPCION_PRODUCTO a la tabla Productos si no existe -SET @sql = (SELECT IF( - (SELECT COUNT(*) FROM information_schema.COLUMNS - WHERE TABLE_SCHEMA = DATABASE() - AND TABLE_NAME = 'Productos' - AND COLUMN_NAME = 'DESCRIPCION_PRODUCTO') = 0, - 'ALTER TABLE Productos ADD COLUMN DESCRIPCION_PRODUCTO TEXT AFTER NOMBRE_PRODUCTO', - 'SELECT "La columna DESCRIPCION_PRODUCTO ya existe en la tabla Productos" as mensaje' -)); - -PREPARE stmt FROM @sql; -EXECUTE stmt; -DEALLOCATE PREPARE stmt; - --- ================================================================== --- VERIFICACIÓN DE ESTRUCTURA FINAL --- ================================================================== - --- Verificar que todas las tablas principales existen -SELECT - TABLE_NAME as 'Tabla_Existente' -FROM information_schema.TABLES -WHERE TABLE_SCHEMA = DATABASE() -AND TABLE_NAME IN ('Productos', 'Detalle_Pedidos', 'Pedidos', 'Empleados', 'Clientes', 'Administradores') -ORDER BY TABLE_NAME; - --- Verificar estructura de tabla Productos (debe incluir DESCRIPCION_PRODUCTO) -SELECT - COLUMN_NAME as 'Columna', - DATA_TYPE as 'Tipo', - IS_NULLABLE as 'Permite_NULL' -FROM information_schema.COLUMNS -WHERE TABLE_SCHEMA = DATABASE() -AND TABLE_NAME = 'Productos' -ORDER BY ORDINAL_POSITION; - --- Verificar estructura de tabla Detalle_Pedidos (debe tener solo columnas esenciales) -SELECT - COLUMN_NAME as 'Columna', - DATA_TYPE as 'Tipo', - IS_NULLABLE as 'Permite_NULL' -FROM information_schema.COLUMNS -WHERE TABLE_SCHEMA = DATABASE() -AND TABLE_NAME = 'Detalle_Pedidos' -ORDER BY ORDINAL_POSITION; - --- ================================================================== --- FIN DE ACTUALIZACIONES DEL SISTEMA --- ================================================================== - -COMMIT; diff --git a/files/crear_tabla_logs.sql b/files/crear_tabla_logs.sql deleted file mode 100644 index d2a7957..0000000 --- a/files/crear_tabla_logs.sql +++ /dev/null @@ -1,63 +0,0 @@ --- ================================================================== --- TABLA DE LOGS PARA CAMBIOS EN PRODUCTOS --- ================================================================== --- Ejecutar esta consulta para crear la tabla de logs - -USE ProyectoPanaderia; - --- Primero verificar y mostrar la estructura de la tabla Productos -DESCRIBE Productos; - --- Crear tabla de logs SIN la restricción de clave foránea primero -DROP TABLE IF EXISTS productos_logs; - -CREATE TABLE productos_logs ( - id INT PRIMARY KEY AUTO_INCREMENT, - producto_id INT NOT NULL, - tipo_cambio ENUM('precio', 'stock', 'activacion', 'desactivacion') NOT NULL, - valor_anterior VARCHAR(50), - valor_nuevo VARCHAR(50), - usuario_id INT, - usuario_tipo ENUM('admin', 'empleado') DEFAULT 'admin', - fecha_cambio TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - ip_usuario VARCHAR(45) -); - --- Crear índices para mejor rendimiento -CREATE INDEX idx_producto_logs_fecha ON productos_logs(fecha_cambio); -CREATE INDEX idx_producto_logs_producto ON productos_logs(producto_id); -CREATE INDEX idx_producto_logs_tipo ON productos_logs(tipo_cambio); - --- Ahora intentar agregar la clave foránea (opcional, puede fallar si hay problemas de integridad) --- Si falla, la tabla funcionará igual pero sin restricción de integridad referencial -SET FOREIGN_KEY_CHECKS = 0; -ALTER TABLE productos_logs -ADD CONSTRAINT fk_productos_logs_producto -FOREIGN KEY (producto_id) REFERENCES Productos(ID_PRODUCTO) ON DELETE CASCADE; -SET FOREIGN_KEY_CHECKS = 1; - --- Verificar que la tabla se creó correctamente -DESCRIBE productos_logs; - --- Trigger para actualizar FECHA_ULTIMA_MODIFICACION en Productos automáticamente --- Primero eliminar el trigger si existe -DROP TRIGGER IF EXISTS actualizar_fecha_producto; - -DELIMITER // -CREATE TRIGGER actualizar_fecha_producto - BEFORE UPDATE ON Productos - FOR EACH ROW -BEGIN - SET NEW.FECHA_ULTIMA_MODIFICACION = CURRENT_TIMESTAMP; -END// -DELIMITER ; - --- Verificar que el trigger se creó -SHOW TRIGGERS LIKE 'actualizar_fecha_producto'; - --- Insertar un registro de prueba para verificar funcionamiento -INSERT INTO productos_logs (producto_id, tipo_cambio, valor_anterior, valor_nuevo, usuario_id, usuario_tipo, ip_usuario) -VALUES (1, 'precio', '1000', '1200', 1, 'admin', '127.0.0.1'); - --- Mostrar el registro insertado -SELECT * FROM productos_logs ORDER BY id DESC LIMIT 1; diff --git a/reportes_clientes.php b/reportes_clientes.php new file mode 100644 index 0000000..32193f7 --- /dev/null +++ b/reportes_clientes.php @@ -0,0 +1,84 @@ + $nombre]; + $resultado = consumirCURL("/agregar/cliente", "POST", $data); + + if ($resultado["codigo"] === 200) { + echo "Cliente guardado correctamente (200)\n"; + echo "Respuesta del servidor: {$resultado['respuesta']}\n"; + } else { + echo "Error en el servidor, respuesta: {$resultado['codigo']}\n"; + echo "Detalle: {$resultado['respuesta']}\n"; + } + } +} + +// --------- MÉTODO PATCH ---------- +$respuesta_patch = readline("¿Desea actualizar un cliente? (s/n): "); + +if (strtolower($respuesta_patch) === "s") { + $id = readline("Ingrese el ID del cliente a actualizar: "); + $nombre = readline("Ingrese nuevo nombre: "); + + if (empty($id) || empty($nombre)) { + echo "Error: El ID y el nombre son obligatorios.\n"; + } else { + $data = ["nombre" => $nombre]; + $resultado = consumirCURL("/actualizar/cliente/$id", "PATCH", $data); + + if ($resultado["codigo"] === 200) { + echo "Cliente actualizado correctamente (200)\n"; + echo "Respuesta del servidor: {$resultado['respuesta']}\n"; + } else { + echo "Error en el servidor. Código de respuesta: {$resultado['codigo']}\n"; + echo "Detalle: {$resultado['respuesta']}\n"; + } + } +} + +// --------- MÉTODO DELETE ---------- +$respuesta_delete = readline("¿Desea eliminar un cliente? (s/n): "); + +if (strtolower($respuesta_delete) === "s") { + $id = readline("Ingrese el ID del cliente a eliminar: "); + + if (empty($id)) { + echo "Error: El ID es obligatorio.\n"; + } else { + $resultado = consumirCURL("/eliminar/cliente/$id", "DELETE"); + + if ($resultado["codigo"] === 200) { + echo "Cliente eliminado correctamente (200)\n"; + echo "Respuesta del servidor: {$resultado['respuesta']}\n"; + } else { + echo "Error en el servidor. Código de respuesta: {$resultado['codigo']}\n"; + echo "Detalle: {$resultado['respuesta']}\n"; + } + } +} +?> \ No newline at end of file diff --git a/reportes_usuarios.php b/reportes_usuarios.php new file mode 100644 index 0000000..36144c1 --- /dev/null +++ b/reportes_usuarios.php @@ -0,0 +1,39 @@ +nombre} | {$usuario->email} | {$usuario->telefono} | {$usuario->rol}\n"; +} + +// --------- BÚSQUEDA DE USUARIO ---------- +$nombreBuscar = readline("Ingrese el nombre del usuario para ver detalles: "); + +echo "\n RESULTADO DE LA BÚSQUEDA \n"; + +$encontrado = false; +foreach ($usuarios as $usuario) { + if (strcasecmp($usuario->nombre, $nombreBuscar) === 0) { + echo "Nombre: {$usuario->nombre}\n"; + echo "Email: {$usuario->email}\n"; + echo "Teléfono: {$usuario->telefono}\n"; + echo "Rol: {$usuario->rol}\n"; + $encontrado = true; + break; + } +} + +if (!$encontrado) { + echo "No se encontró ningún usuario con el nombre ingresado.\n"; +} +?> \ No newline at end of file diff --git a/reportes_ventas.php b/reportes_ventas.php new file mode 100644 index 0000000..11811c6 --- /dev/null +++ b/reportes_ventas.php @@ -0,0 +1,122 @@ +idFactura | $venta->idCliente | $venta->idPedido | $venta->fechaFacturacion | $venta->totalFactura\n"; +} + +// --------- BÚSQUEDA DE FACTURA ---------- +$idBuscar = readline("Ingrese el ID de la factura que desea ver en detalle: "); + +echo "\n RESULTADO DE LA BÚSQUEDA \n"; + +$encontrado = false; +foreach ($ventas as $venta) { + if ($venta->idFactura == $idBuscar) { + echo "ID Factura: $venta->idFactura\n"; + echo "ID Cliente: $venta->idCliente\n"; + echo "ID Pedido: $venta->idPedido\n"; + echo "Fecha Facturación: $venta->fechaFacturacion\n"; + echo "Total Factura: $venta->totalFactura\n"; + $encontrado = true; + break; + } +} + +if (!$encontrado) { + echo "No se encontró ninguna factura con el ID ingresado.\n"; +} + +// --------- MÉTODO POST ---------- +$respuesta = readline("¿Desea agregar una nueva venta? (s/n): "); + +if (strtolower($respuesta) === "s") { + $idCliente = readline("Ingrese el ID del cliente: "); + $idPedido = readline("Ingrese el ID del pedido: "); + $fecha = readline("Ingrese la fecha de facturación (YYYY-MM-DD): "); + $hora = readline("Ingrese la hora de facturación (HH:MM:SS): "); + $totalFactura = readline("Ingrese el total de la factura: "); + + $fechaFacturacion = $fecha . "T" . $hora; + + $data = [ + "idCliente" => (int)$idCliente, + "idPedido" => (int)$idPedido, + "fechaFacturacion" => $fechaFacturacion, + "totalFactura" => (float)$totalFactura + ]; + + $resultado = consumirCURL("/agregar/venta", "POST", $data); + + if ($resultado["codigo"] === 200) { + echo "Venta guardada correctamente (200)\n"; + echo "Respuesta del servidor: {$resultado['respuesta']}\n"; + } else { + echo "Error en el servidor, respuesta: {$resultado['codigo']}\n"; + echo "Detalle: {$resultado['respuesta']}\n"; + } + } + +// --------- MÉTODO PATCH ---------- +$respuesta_patch = readline("¿Desea actualizar una venta? (s/n): "); + +if (strtolower($respuesta_patch) === "s") { + $id = readline("Ingrese el ID de la factura a actualizar: "); + $idCliente = readline("Ingrese nuevo ID del cliente: "); + $idPedido = readline("Ingrese nuevo ID del pedido: "); + $fecha = readline("Ingrese nueva fecha de facturación (YYYY-MM-DD): "); + $hora = readline("Ingrese la hora de facturación (HH:MM:SS): "); + $totalFactura = readline("Ingrese nuevo total de la factura: "); + + $fechaFacturacion = $fecha . "T" . $hora; + + $data = [ + "idCliente" => (int)$idCliente, + "idPedido" => (int)$idPedido, + "fechaFacturacion" => $fechaFacturacion, + "totalFactura" => (float)$totalFactura + ]; + + $resultado = consumirCURL("/actualizar/venta/$id", "PATCH", $data); + + if ($resultado["codigo"] === 200) { + echo "Venta actualizada correctamente (200)\n"; + echo "Respuesta del servidor: {$resultado['respuesta']}\n"; + } else { + echo "Error en el servidor. Código de respuesta: {$resultado['codigo']}\n"; + echo "Detalle: {$resultado['respuesta']}\n"; + } + } + +// --------- MÉTODO DELETE ---------- +$respuesta_delete = readline("¿Desea eliminar una venta? (s/n): "); + +if (strtolower($respuesta_delete) === "s") { + $id = readline("Ingrese el ID de la factura a eliminar: "); + + if (empty($id)) { + echo "Error: El ID es obligatorio.\n"; + } else { + $resultado = consumirCURL("/eliminar/venta/$id", "DELETE"); + + if ($resultado["codigo"] === 200) { + echo "Venta eliminada correctamente (200)\n"; + echo "Respuesta del servidor: {$resultado['respuesta']}\n"; + } else { + echo "Error en el servidor. Código de respuesta: {$resultado['codigo']}\n"; + echo "Detalle: {$resultado['respuesta']}\n"; + } + } +} +?> diff --git a/src/main/java/com/example/demoJava1/Clientes/Controller/ConexionController.java b/src/main/java/com/example/demoJava1/Clientes/Controller/ConexionController.java deleted file mode 100644 index 2a1b702..0000000 --- a/src/main/java/com/example/demoJava1/Clientes/Controller/ConexionController.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.example.demoJava1.Clientes.Controller; - -import com.example.demoJava1.Clientes.clientes; -import com.example.demoJava1.Clientes.Service.ConexionService; -import com.example.demoJava1.Productos.Services.Controllers.PojoProductos; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -@RestController -public class ConexionController { - @Autowired - private ConexionService conexionService; - - @GetMapping("/{id}") - public List obtenerClientes() { - return conexionService.obtenerClientes(); - } - - @GetMapping("/detalles") - public List obtenerDetalles() { - return conexionService.obtenerDetalles(); - } - - @PatchMapping("/actualizar/cliente/{id}") - public String actualizarCliente(@PathVariable int id, @RequestBody clientes clientes) { - clientes.setId(id); - int result = conexionService.actualizarCliente(clientes); - return result > 0 ? "Cliente actualizado." : "Error al actualizar."; - } - @DeleteMapping("/{id}") - public String eliminarCliente(@PathVariable int id) { - int result = conexionService.eliminarCliente(id); - return result > 0 ? "Cliente eliminado." : "Error al eliminar al cliente."; - } -} diff --git a/src/main/java/com/example/demoJava1/Clientes/Service/ConexionService.java b/src/main/java/com/example/demoJava1/Clientes/Service/ConexionService.java deleted file mode 100644 index d148726..0000000 --- a/src/main/java/com/example/demoJava1/Clientes/Service/ConexionService.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.example.demoJava1.Clientes.Service; - -import com.example.demoJava1.Clientes.clientes; -import com.example.demoJava1.Productos.Services.Controllers.PojoProductos; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.dao.DataAccessException; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.stereotype.Service; - -import java.util.List; - -@Service -public class ConexionService { - - @Autowired - private JdbcTemplate jdbcTemplate; - - // Devuelve solo nombres - public List obtenerClientes() { - String sql = "SELECT NOMBRE_CLI FROM clientes"; - return jdbcTemplate.query(sql, (rs, rowNum) -> - rs.getString("NOMBRE_CLI") - ); - } - - // Devuelve ID, Nombre, Telefono, Email - public List obtenerDetalles() { - String sql = "SELECT ID_CLIENTE, NOMBRE_CLI, TELEFONO_CLI, EMAIL_CLI FROM clientes"; - return jdbcTemplate.query(sql, (rs, rowNum) -> - new clientes( - rs.getInt("ID_CLIENTE"), - rs.getString("NOMBRE_CLI"), - rs.getString("TELEFONO_CLI"), - rs.getString("EMAIL_CLI") - ) - ); - } - - public int actualizarCliente(clientes clientes) { - String sql = "UPDATE clientes SET NOMBRE_CLI = ?, TELEFONO_CLI = ?, EMAIL_CLI = ? WHERE ID_CLIENTE = ?"; - - try { - int result = jdbcTemplate.update(sql, - clientes.getNombre(), - clientes.getTelefono(), - clientes.getEmail(), - clientes.getId()); - - return result > 0 ? 1 : 0; - } catch (DataAccessException e) { - e.printStackTrace(); - return 0; - } - } - - public int eliminarCliente(int id) { - String sql = "DELETE FROM clientes WHERE ID_CLIENTE = ?"; - return jdbcTemplate.update(sql, id); - } -} diff --git a/src/main/java/com/example/demoJava1/Clientes/clientes.java b/src/main/java/com/example/demoJava1/Clientes/clientes.java deleted file mode 100644 index 3f6a8e0..0000000 --- a/src/main/java/com/example/demoJava1/Clientes/clientes.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.example.demoJava1.Clientes; - -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; - -@Entity - public class clientes { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private int id; - private String nombre; - private String telefono; - private String email; - - public clientes(int id, String nombre, String telefono, String email) { - this.id = id; - this.nombre = nombre; - this.telefono = telefono; - this.email = email; - }; - - public int getId() { return id; } - public void setId(int id) { - this.id = id; - } - public String getNombre() { return nombre; } - public String getTelefono() { return telefono; } - public String getEmail() { return email; } - } diff --git a/src/main/java/com/example/demoJava1/Productos/PojoProductos.java b/src/main/java/com/example/demoJava1/Productos/PojoProductos.java new file mode 100644 index 0000000..49ed782 --- /dev/null +++ b/src/main/java/com/example/demoJava1/Productos/PojoProductos.java @@ -0,0 +1,2 @@ +package com.example.demoJava1.Productos;public class PojoProductos { +} diff --git a/src/main/java/com/example/demoJava1/Productos/ProductosController.java b/src/main/java/com/example/demoJava1/Productos/ProductosController.java new file mode 100644 index 0000000..429f3e8 --- /dev/null +++ b/src/main/java/com/example/demoJava1/Productos/ProductosController.java @@ -0,0 +1,2 @@ +package com.example.demoJava1.Productos;public class ProductosController { +} diff --git a/src/main/java/com/example/demoJava1/Productos/ProductosService.java b/src/main/java/com/example/demoJava1/Productos/ProductosService.java new file mode 100644 index 0000000..cecdc42 --- /dev/null +++ b/src/main/java/com/example/demoJava1/Productos/ProductosService.java @@ -0,0 +1,2 @@ +package com.example.demoJava1.Productos;public class ProductosService { +} diff --git a/src/main/java/com/example/demoJava1/ProductosMasVendidos/ProductosMasVendidos.java b/src/main/java/com/example/demoJava1/ProductosMasVendidos/ProductosMasVendidos.java new file mode 100644 index 0000000..464536b --- /dev/null +++ b/src/main/java/com/example/demoJava1/ProductosMasVendidos/ProductosMasVendidos.java @@ -0,0 +1,2 @@ +package com.example.demoJava1.ProductosMasVendidos;public class ProductosMasVendidos { +} diff --git a/src/main/java/com/example/demoJava1/ProductosMasVendidos/ProductosMasVendidosController.java b/src/main/java/com/example/demoJava1/ProductosMasVendidos/ProductosMasVendidosController.java new file mode 100644 index 0000000..a5c4cb1 --- /dev/null +++ b/src/main/java/com/example/demoJava1/ProductosMasVendidos/ProductosMasVendidosController.java @@ -0,0 +1,2 @@ +package com.example.demoJava1.ProductosMasVendidos;public class ProductosMasVendidosController { +} diff --git a/src/main/java/com/example/demoJava1/ProductosMasVendidos/ProductosMasVendidosService.java b/src/main/java/com/example/demoJava1/ProductosMasVendidos/ProductosMasVendidosService.java new file mode 100644 index 0000000..52fe5d6 --- /dev/null +++ b/src/main/java/com/example/demoJava1/ProductosMasVendidos/ProductosMasVendidosService.java @@ -0,0 +1,2 @@ +package com.example.demoJava1.ProductosMasVendidos;public class ProductosMasVendidosService { +}