The registro table establishes the relationship between products and their suppliers. It serves as a junction table that records when products are registered in the system and which supplier provides them. This enables supply chain tracking and vendor-product relationship management.Table Name:registro Engine: InnoDB Character Set: utf8mb4 Primary Key:id_registro
Product: Vestido de Gala Rojo (ID: 3) Supplier: La Charrita de Aguascalientes Registered by: Karina Sánchez (Manager) Date: Feb 7, 2026, 8:24 PM Note: Formal dress registered with traditional dress supplier
Product: Conjunto Pijama Negra (ID: 36) Supplier: Fábrica de Tejido de Punto y Confecciones Ofelia S.A. de C.V. Registered by: Miguel Esparza (Staff) Date: Feb 24, 2026, 7:34 AM Note: Recent registration by staff member (not manager)
SELECT r.id_registro, r.fecha_registro, p.nombre as producto, c.nombre as categoria, prov.nombre as proveedor, prov.telefono as telefono_proveedor, e.nombre as registrado_por, e.puesto as cargoFROM registro rINNER JOIN prenda p ON r.id_prenda = p.id_prendaINNER JOIN categoria c ON p.id_categoria = c.id_categoriaINNER JOIN proveedor prov ON r.id_proveedor = prov.id_proveedorINNER JOIN empleado e ON r.id_empleado = e.id_empleadoORDER BY r.fecha_registro DESC;
SELECT prov.nombre as proveedor, COUNT(DISTINCT r.id_prenda) as total_productos, GROUP_CONCAT(p.nombre SEPARATOR ', ') as productos, MIN(r.fecha_registro) as primer_registro, MAX(r.fecha_registro) as ultimo_registroFROM registro rINNER JOIN prenda p ON r.id_prenda = p.id_prendaINNER JOIN proveedor prov ON r.id_proveedor = prov.id_proveedorGROUP BY prov.id_proveedor, prov.nombreORDER BY total_productos DESC;
SELECT prov.nombre as proveedor, p.nombre as producto, p.precio, p.stock_actual, c.nombre as categoria, r.fecha_registroFROM registro rINNER JOIN prenda p ON r.id_prenda = p.id_prendaINNER JOIN categoria c ON p.id_categoria = c.id_categoriaINNER JOIN proveedor prov ON r.id_proveedor = prov.id_proveedorWHERE prov.id_proveedor = 5 -- Fábrica de Tejido de Punto y Confecciones OfeliaORDER BY r.fecha_registro DESC;
SELECT e.nombre as empleado, e.puesto, COUNT(*) as total_registros, MIN(r.fecha_registro) as primer_registro, MAX(r.fecha_registro) as ultimo_registro, COUNT(DISTINCT r.id_proveedor) as proveedores_gestionadosFROM registro rINNER JOIN empleado e ON r.id_empleado = e.id_empleadoGROUP BY e.id_empleado, e.nombre, e.puestoORDER BY total_registros DESC;
SELECT r.fecha_registro, p.nombre as producto, prov.nombre as proveedor, e.nombre as empleadoFROM registro rINNER JOIN prenda p ON r.id_prenda = p.id_prendaINNER JOIN proveedor prov ON r.id_proveedor = prov.id_proveedorINNER JOIN empleado e ON r.id_empleado = e.id_empleadoWHERE r.fecha_registro >= DATE_SUB(NOW(), INTERVAL 30 DAY)ORDER BY r.fecha_registro DESC;
SELECT prov.nombre as proveedor, c.nombre as categoria, COUNT(*) as productos_en_categoriaFROM registro rINNER JOIN prenda p ON r.id_prenda = p.id_prendaINNER JOIN categoria c ON p.id_categoria = c.id_categoriaINNER JOIN proveedor prov ON r.id_proveedor = prov.id_proveedorGROUP BY prov.id_proveedor, prov.nombre, c.id_categoria, c.nombreORDER BY prov.nombre, productos_en_categoria DESC;
SELECT p.id_prenda, p.nombre as producto, p.precio, c.nombre as categoriaFROM prenda pINNER JOIN categoria c ON p.id_categoria = c.id_categoriaLEFT JOIN registro r ON p.id_prenda = r.id_prendaWHERE r.id_registro IS NULLORDER BY p.nombre;
One Registration Per Product: While the schema allows multiple registrations for the same product, business logic should typically enforce one active supplier per product to avoid confusion.
Registration Timing: Products should be registered when they are first added to the catalog or when a new supplier relationship is established.
Manager Approval: Product registrations are typically performed by managers (puesto = 'gerente'), though the system allows staff to perform registrations as well (as seen in registration 7).
Immutable Records: Registration records should not be deleted or modified after creation. If a supplier relationship ends, consider adding status fields rather than deleting historical data.
SELECT prov.nombre as proveedor, COUNT(DISTINCT r.id_prenda) as productos_suministrados, SUM(pr.stock_actual) as unidades_en_stock, SUM(pr.precio * pr.stock_actual) as valor_inventario, AVG(pr.precio) as precio_promedio_producto, DATEDIFF(NOW(), MAX(r.fecha_registro)) as dias_desde_ultimo_registroFROM proveedor provINNER JOIN registro r ON prov.id_proveedor = r.id_proveedorINNER JOIN prenda pr ON r.id_prenda = pr.id_prendaGROUP BY prov.id_proveedor, prov.nombreORDER BY valor_inventario DESC;
SELECT DATE_FORMAT(r.fecha_registro, '%Y-%m') as mes_registro, COUNT(*) as total_registros, COUNT(DISTINCT r.id_proveedor) as proveedores_activos, COUNT(DISTINCT r.id_empleado) as empleados_activosFROM registro rGROUP BY DATE_FORMAT(r.fecha_registro, '%Y-%m')ORDER BY mes_registro DESC;
SELECT prov.nombre as proveedor, c.nombre as especialidad_principal, COUNT(*) as productos_categoria, ROUND((COUNT(*) * 100.0) / SUM(COUNT(*)) OVER (PARTITION BY prov.id_proveedor), 2) as porcentajeFROM registro rINNER JOIN proveedor prov ON r.id_proveedor = prov.id_proveedorINNER JOIN prenda p ON r.id_prenda = p.id_prendaINNER JOIN categoria c ON p.id_categoria = c.id_categoriaGROUP BY prov.id_proveedor, prov.nombre, c.id_categoria, c.nombreORDER BY prov.nombre, productos_categoria DESC;
SELECT prov.nombre as proveedor, COUNT(DISTINCT r.id_prenda) as productos_dependientes, SUM(pr.stock_actual) as unidades_dependientes, ROUND((COUNT(DISTINCT r.id_prenda) * 100.0) / (SELECT COUNT(*) FROM prenda), 2) as porcentaje_catalogoFROM proveedor provINNER JOIN registro r ON prov.id_proveedor = r.id_proveedorINNER JOIN prenda pr ON r.id_prenda = pr.id_prendaGROUP BY prov.id_proveedor, prov.nombreORDER BY productos_dependientes DESC;
SELECT DATE_FORMAT(r.fecha_registro, '%Y-%m-%d') as fecha, COUNT(*) as registros_dia, GROUP_CONCAT(DISTINCT e.nombre SEPARATOR ', ') as empleados, GROUP_CONCAT(DISTINCT prov.nombre SEPARATOR ', ') as proveedoresFROM registro rINNER JOIN empleado e ON r.id_empleado = e.id_empleadoINNER JOIN proveedor prov ON r.id_proveedor = prov.id_proveedorWHERE r.fecha_registro >= DATE_SUB(NOW(), INTERVAL 3 MONTH)GROUP BY DATE_FORMAT(r.fecha_registro, '%Y-%m-%d')ORDER BY fecha DESC;
SELECT p.*, prov.nombre as proveedor, prov.telefono as telefono_proveedor, prov.direccion as direccion_proveedor, r.fecha_registroFROM prenda pLEFT JOIN registro r ON p.id_prenda = r.id_prendaLEFT JOIN proveedor prov ON r.id_proveedor = prov.id_proveedorWHERE p.id_prenda = ?;
SELECT prov.id_proveedor, prov.nombre, COUNT(r.id_registro) as productos_actualesFROM proveedor provLEFT JOIN registro r ON prov.id_proveedor = r.id_proveedorGROUP BY prov.id_proveedor, prov.nombreORDER BY prov.nombre;