Reglas de Negocio - Base de Datos Tienda
Online
1. CUSTOMERS (Clientes)
Validaciones de Datos
· CustomerID: Autoincremental, único, requerido
· Name: Requerido, longitud mínima 2 caracteres, máxima 255
· Email: Requerido, formato válido de email, único en el sistema
· Phone: Opcional, formato válido (10-20 dígitos), puede contener '+' y espacios
· ShippingAddress: Requerido, longitud mínima 10 caracteres, máxima 255
· Status: Valores permitidos: 'active', 'inactive', 'suspended'. Por defecto: 'active'
Reglas de Negocio
· Un cliente debe tener email único
· No se pueden eliminar clientes con órdenes activas
· Al suspender un cliente, se debe vaciar su carrito de compras
· Un cliente inactivo no puede realizar compras
2. CUSTOMER PROFILES (Perfiles de Cliente)
Validaciones de Datos
· ProfileID: Autoincremental, único, requerido
· CustomerID: Requerido, único (relación 1:1), debe existir en Customers
· DateOfBirth: Opcional, formato fecha válido, no puede ser futura, edad mínima 18 años
· Gender: Valores permitidos: 'M', 'F', 'Other'. Opcional
· ProfilePicture: Opcional, URL válida, longitud máxima 255
· Preferences: Opcional, formato JSON válido o texto
Reglas de Negocio
· Un cliente solo puede tener un perfil
· El perfil se crea automáticamente al registrar un cliente
· La edad mínima para registrarse es 18 años
· Las preferencias pueden incluir: categorías favoritas, método de pago preferido, etc.
3. CATEGORIES (Categorías)
Validaciones de Datos
· CategoryID: Autoincremental, único, requerido
· Name: Requerido, único, longitud mínima 2 caracteres, máxima 100
· Description: Opcional, longitud máxima 500 caracteres
· Status: Valores permitidos: 'active', 'inactive'. Por defecto: 'active'
Reglas de Negocio
· No se pueden eliminar categorías con productos asociados
· Al desactivar una categoría, los productos asociados también se desactivan
· El nombre de la categoría debe ser único
4. PRODUCTS (Productos)
Validaciones de Datos
· ProductID: Autoincremental, único, requerido
· CategoryID: Requerido, debe existir en Categories
· Name: Requerido, longitud mínima 3 caracteres, máxima 255
· Brand: Requerido, longitud mínima 2 caracteres, máxima 100
· Price: Requerido, decimal(10,2), valor mínimo 0.01, máximo 9999999.99
· Quantity: Requerido, entero >= 0
· Status: Valores permitidos: 'available', 'out_of_stock', 'discontinued'. Por defecto:
'available'
Reglas de Negocio
· Si Quantity = 0, Status debe cambiar automáticamente a 'out_of_stock'
· Si Quantity > 0 y Status = 'out_of_stock', debe cambiar a 'available'
· No se pueden crear órdenes de productos con Status 'discontinued'
· El precio no puede ser negativo ni cero
· Al actualizar stock, se debe verificar si hay órdenes pendientes
· Un producto debe tener al menos una imagen
5. PRODUCT IMAGES (Imágenes de Productos)
Validaciones de Datos
· ImageID: Autoincremental, único, requerido
· ProductID: Requerido, debe existir en Products
· URL: Requerido, URL válida, longitud máxima 255
· Description: Opcional, longitud máxima 255
· IsPrimary: Booleano, por defecto False
Reglas de Negocio
· Un producto debe tener al menos una imagen con IsPrimary = True
· Solo puede haber una imagen principal por producto
· Al establecer una imagen como principal, las demás deben cambiar a False
· No se puede eliminar la última imagen de un producto
· Formatos permitidos: jpg, jpeg, png, webp
6. PROMOTIONS (Promociones)
Validaciones de Datos
· PromotionID: Autoincremental, único, requerido
· Code: Requerido, único, alfanumérico, longitud 5-20 caracteres, mayúsculas
· Description: Requerido, longitud mínima 10 caracteres, máxima 255
· Discount: Requerido, decimal(5,2), rango: 0.01 - 99.99 (porcentaje)
· StartDate: Requerido, formato fecha válido
· EndDate: Requerido, formato fecha válido, debe ser mayor a StartDate
· Status: Valores permitidos: 'active', 'expired', 'scheduled'. Por defecto: 'scheduled'
Reglas de Negocio
· El código de promoción debe ser único
· StartDate no puede ser anterior a la fecha actual (al crear)
· EndDate debe ser mayor que StartDate
· Si la fecha actual está entre StartDate y EndDate, Status = 'active'
· Si la fecha actual es mayor a EndDate, Status = 'expired'
· Si la fecha actual es menor a StartDate, Status = 'scheduled'
· El descuento no puede ser mayor al 99%
· No se pueden aplicar múltiples promociones al mismo producto simultáneamente
7. PRODUCT PROMOTIONS (Productos en Promoción)
Validaciones de Datos
· ProductPromotionID: Autoincremental, único, requerido
· ProductID: Requerido, debe existir en Products
· PromotionID: Requerido, debe existir en Promotions
· AppliedDate: Timestamp, automático al crear
Reglas de Negocio
· Un producto no puede tener dos promociones activas simultáneamente
· Solo se pueden aplicar promociones a productos con Status 'available'
· La combinación ProductID + PromotionID debe ser única
· Al aplicar una promoción, verificar que esté en Status 'active'
· Al expirar una promoción, se debe eliminar de ProductPromotions
8. REVIEWS (Reseñas)
Validaciones de Datos
· ReviewID: Autoincremental, único, requerido
· ProductID: Requerido, debe existir en Products
· CustomerID: Requerido, debe existir en Customers
· Rating: Requerido, entero entre 1 y 5
· Comment: Opcional, longitud mínima 10 caracteres, máxima 500
· ReviewDate: Timestamp, automático al crear
· Status: Valores permitidos: 'approved', 'pending', 'rejected'. Por defecto: 'pending'
Reglas de Negocio
· Un cliente solo puede dejar una reseña por producto comprado
· Solo se pueden reseñar productos que el cliente haya comprado
· Las reseñas requieren aprobación antes de mostrarse públicamente
· El rating debe ser entre 1 (peor) y 5 (mejor)
· No se pueden editar reseñas después de 48 horas de creadas
· Las reseñas rechazadas no se muestran al público
9. ORDERS (Órdenes)
Validaciones de Datos
· OrderID: Autoincremental, único, requerido
· CustomerID: Requerido, debe existir en Customers con Status 'active'
· OrderDate: Fecha, automática al crear
· TotalAmount: Decimal(10,2), calculado automáticamente, no editable
· Status: Valores permitidos: 'pending', 'processing', 'shipped', 'delivered', 'cancelled'. Por
defecto: 'pending'
· ShippingMethodID: Requerido, debe existir en ShippingMethods con Status 'active'
Reglas de Negocio
· TotalAmount se calcula sumando OrderDetails + costo de envío
· Una orden debe tener al menos un OrderDetail
· No se pueden modificar órdenes con Status 'shipped' o 'delivered'
· Solo se pueden cancelar órdenes con Status 'pending' o 'processing'
· Al cancelar una orden, se debe restaurar el stock de productos
· Al crear una orden, se debe vaciar el carrito del cliente
· Flujo de estados: pending → processing → shipped → delivered
· Una orden cancelada no puede cambiar de estado
10. ORDER DETAILS (Detalles de Orden)
Validaciones de Datos
· OrderDetailID: Autoincremental, único, requerido
· OrderID: Requerido, debe existir en Orders
· ProductID: Requerido, debe existir en Products
· Quantity: Requerido, entero >= 1
· Price: Requerido, decimal(10,2), debe ser el precio vigente del producto
Reglas de Negocio
· La cantidad solicitada debe estar disponible en stock
· El precio se fija al momento de crear la orden (no cambia si el producto cambia de
precio)
· No se pueden agregar productos discontinuados
· Al crear un detalle, se debe reducir el stock del producto
· Al cancelar una orden, se debe restaurar el stock
· Si se aplica una promoción, el precio debe incluir el descuento
11. PAYMENTS (Pagos)
Validaciones de Datos
· PaymentID: Autoincremental, único, requerido
· OrderID: Requerido, debe existir en Orders
· PaymentMethod: ENUM requerido: 'credit_card', 'debit_card', 'paypal', 'bank_transfer',
'cash'
· Amount: Requerido, decimal(10,2), debe ser > 0
· PaymentDate: Timestamp, automático al crear
· Status: Valores permitidos: 'pending', 'completed', 'failed', 'refunded'. Por defecto:
'pending'
Reglas de Negocio
· Una orden puede tener múltiples pagos (pagos parciales)
· La suma de pagos completados no puede exceder el TotalAmount de la orden
· Solo se permite pago en efectivo para órdenes con entrega en persona
· Al completar el pago total, el Status de la orden debe cambiar a 'processing'
· Los reembolsos deben crear un nuevo registro de pago con Status 'refunded'
· No se pueden procesar pagos para órdenes canceladas
· Un pago fallido no afecta el Status de la orden
12. SHIPPING METHODS (Métodos de Envío)
Validaciones de Datos
· ShippingMethodID: Autoincremental, único, requerido
· Name: Requerido, único, longitud mínima 3 caracteres, máxima 100
· DeliveryEstimate: Requerido, formato texto (ej: "2-3 días", "24 horas")
· Cost: Requerido, decimal(10,2), >= 0
· Status: Valores permitidos: 'active', 'inactive'. Por defecto: 'active'
Reglas de Negocio
· Solo se pueden seleccionar métodos con Status 'active'
· El costo se suma al TotalAmount de la orden
· No se pueden eliminar métodos de envío con órdenes asociadas
· Debe existir al menos un método de envío activo en el sistema
13. SHOPPING CART (Carrito de Compras)
Validaciones de Datos
· CartItemID: Autoincremental, único, requerido
· CustomerID: Requerido, debe existir en Customers con Status 'active'
· ProductID: Requerido, debe existir en Products con Status 'available'
· Quantity: Requerido, entero >= 1
· Price: Requerido, decimal(10,2), precio actual del producto
· AddedDate: Timestamp, automático al crear
Reglas de Negocio
· La combinación CustomerID + ProductID debe ser única (no duplicar productos en
carrito)
· La cantidad solicitada debe estar disponible en stock
· Si la cantidad excede el stock, ajustar automáticamente al stock disponible
· Al agregar al carrito, verificar que el producto esté disponible
· Los items del carrito se eliminan después de 30 días sin actividad
· Al completar una orden, se debe vaciar el carrito del cliente
· Si un producto cambia de precio, actualizar el precio en el carrito
· No se pueden agregar productos discontinuados al carrito
· Si un producto queda sin stock, notificar al cliente y marcarlo como no disponible
REGLAS GENERALES DEL SISTEMA
Integridad Referencial
· Todas las Foreign Keys deben existir en sus tablas referenciadas
· No se pueden eliminar registros con dependencias activas
· Usar eliminación en cascada solo cuando sea apropiado
Transacciones
· Crear orden, reducir stock y vaciar carrito deben ser una transacción atómica
· Cancelar orden y restaurar stock deben ser una transacción atómica
· Aplicar promoción y actualizar precio deben ser una transacción atómica
Seguridad
· Los emails deben estar en minúsculas
· Los códigos de promoción deben estar en mayúsculas
· Las contraseñas deben estar hasheadas (no se almacenan en texto plano)
· Validar entrada de usuarios para prevenir SQL injection
Performance
· Indexar campos de búsqueda frecuente: Email, ProductID, CustomerID, OrderID
· Implementar paginación para listados largos
· Cachear productos frecuentemente consultados
Auditoría
· Registrar fecha de creación en todas las tablas
· Registrar fecha de modificación donde sea relevante
· Mantener log de cambios de estado en Orders y Payments
Consultas SQL Interesantes para la Base de
Datos de Tienda Online
📊 ANÁLISIS DE VENTAS
1. Top 10 productos más vendidos
Mostrar los productos con mayor cantidad de unidades vendidas, incluyendo ingresos totales
generados
2. Ventas totales por categoría
Análisis de rendimiento de cada categoría: número de órdenes, unidades vendidas e ingresos
3. Ventas mensuales del último año
Tendencia de ventas mes a mes con comparación año anterior
4. Productos con mejor margen de ganancia
Comparar precio de venta vs costo promedio (si tuviéramos tabla de proveedores)
5. Ticket promedio por cliente
Valor promedio de compra por cliente, identificando clientes de alto valor
6. Tasa de conversión de carrito a orden
Porcentaje de carritos que se convierten en órdenes completadas
10 Consultas Esenciales para Endpoints de
Reportes en FastAPI
1. Dashboard Principal (KPIs del día/mes)
· Total de ventas del período
· Número de órdenes completadas
· Ticket promedio
· Número de clientes nuevos
· Productos más vendidos hoy
· Órdenes pendientes de procesar
Endpoint: GET /api/reports/dashboard?period=today|week|month
2. Top Productos Más Vendidos
· Lista de productos ordenados por cantidad vendida
· Incluir: nombre, categoría, unidades vendidas, ingresos generados
· Filtros: por categoría, rango de fechas, límite de resultados
Endpoint: GET /api/reports/top-products?
limit=10&category_id=1&start_date=2024-01-01&end_date=2024-12-31
3. Ventas por Categoría
· Ingresos totales por cada categoría
· Porcentaje de contribución al total
· Número de productos vendidos por categoría
· Comparativa con período anterior
Endpoint: GET /api/reports/sales-by-category?period=month
4. Inventario Crítico (Stock Bajo)
· Productos con cantidad menor a un umbral (ej: < 10 unidades)
· Productos agotados
· Productos sin movimiento en X días
· Valor total en riesgo
Endpoint: GET /api/reports/low-stock?threshold=10
5. Análisis de Clientes VIP
· Top 20 clientes por monto gastado
· Frecuencia de compra
· Última fecha de compra
· Valor promedio de orden
· Total gastado acumulado
Endpoint: GET /api/reports/top-customers?limit=20&order_by=total_spent
6. Carritos Abandonados
· Lista de clientes con items en carrito sin completar orden
· Valor total de carritos abandonados
· Tiempo promedio de abandono
· Productos más abandonados
· Tasa de abandono por categoría
Endpoint: GET /api/reports/abandoned-carts?days=7
7. Rendimiento de Promociones
· Códigos de promoción activos
· Número de usos por código
· Ingresos generados con promoción
· Descuento total otorgado
· ROI de cada promoción
Endpoint: GET /api/reports/promotions-performance?status=active
8. Estado de Órdenes (Fulfillment)
· Cantidad de órdenes por estado (pending, processing, shipped, delivered, cancelled)
· Tiempo promedio por estado
· Órdenes retrasadas
· Tasa de cumplimiento
Endpoint: GET /api/reports/orders-status?period=today
9. Análisis de Reseñas y Satisfacción
· Rating promedio general
· Productos mejor y peor calificados
· Distribución de ratings (1-5 estrellas)
· Reseñas pendientes de aprobación
· Tendencia de satisfacción en el tiempo
Endpoint: GET /api/reports/reviews-summary?period=month
10. Ventas y Tendencias (Gráfica Temporal)
· Ventas diarias/semanales/mensuales
· Comparativa con período anterior
· Tendencia de crecimiento
· Predicción básica
· Datos para graficar en frontend
Endpoint: GET /api/reports/sales-trend?period=30days&group_by=day
-- =====================================================
-- SEED DATA PARA BASE DE DATOS DE TIENDA ONLINE
-- =====================================================
-- Limpiar tablas en orden inverso (respetando FK)
SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE TABLE productpromotions;
TRUNCATE TABLE reviews;
TRUNCATE TABLE shoppingcart;
TRUNCATE TABLE payments;
TRUNCATE TABLE orderdetails;
TRUNCATE TABLE orders;
TRUNCATE TABLE productimages;
TRUNCATE TABLE products;
TRUNCATE TABLE promotions;
TRUNCATE TABLE categories;
TRUNCATE TABLE customerprofiles;
TRUNCATE TABLE customers;
TRUNCATE TABLE shippingmethods;
SET FOREIGN_KEY_CHECKS = 1;
-- =====================================================
-- 1. CUSTOMERS (6 clientes)
-- =====================================================
INSERT INTO customers (Name, Email, Phone, ShippingAddress, Status) VALUES
('Juan Pérez', '[Link]@[Link]', '+57 300 123 4567', 'Calle 45 #12-34, Bogotá', 'active'),
('María González', '[Link]@[Link]', '+57 301 234 5678', 'Carrera 7 #23-45,
Medellín', 'active'),
('Carlos Rodríguez', '[Link]@[Link]', '+57 302 345 6789', 'Avenida 68 #34-56,
Cali', 'active'),
('Ana Martínez', '[Link]@[Link]', '+57 303 456 7890', 'Calle 100 #15-20,
Barranquilla', 'active'),
('Luis Hernández', '[Link]@[Link]', '+57 304 567 8901', 'Carrera 15 #45-67,
Cartagena', 'suspended'),
('Laura López', '[Link]@[Link]', '+57 305 678 9012', 'Calle 80 #10-30, Bucaramanga',
'active');
-- =====================================================
-- 2. CUSTOMER PROFILES (6 perfiles - relación 1:1)
-- =====================================================
INSERT INTO customerprofiles (CustomerID, DateOfBirth, Gender, ProfilePicture, Preferences)
VALUES
(1, '1990-05-15', 'M', '[Link] 'Tecnología, Deportes'),
(2, '1985-08-22', 'F', '[Link] 'Moda, Belleza'),
(3, '1992-03-10', 'M', '[Link] 'Electrónica, Hogar'),
(4, '1988-11-30', 'F', '[Link] 'Libros, Música'),
(5, '1995-07-18', 'M', '[Link] 'Gaming, Tecnología'),
(6, '1991-01-25', 'F', '[Link] 'Cocina, Hogar');
-- =====================================================
-- 3. CATEGORIES (6 categorías)
-- =====================================================
INSERT INTO categories (Name, Description, Status) VALUES
('Electrónica', 'Dispositivos electrónicos y accesorios tecnológicos', 'active'),
('Ropa y Moda', 'Prendas de vestir para hombre y mujer', 'active'),
('Hogar y Cocina', 'Artículos para el hogar y utensilios de cocina', 'active'),
('Deportes', 'Equipamiento y ropa deportiva', 'active'),
('Libros', 'Libros físicos y digitales', 'active'),
('Juguetes', 'Juguetes y juegos para todas las edades', 'inactive');
-- =====================================================
-- 4. PRODUCTS (6 productos)
-- =====================================================
INSERT INTO products (CategoryID, Name, Brand, Price, Quantity, Status) VALUES
(1, 'Smartphone Galaxy S23', 'Samsung', 2499000.00, 15, 'available'),
(1, 'Laptop Dell Inspiron 15', 'Dell', 3200000.00, 8, 'available'),
(2, 'Chaqueta de Cuero', 'Zara', 280000.00, 25, 'available'),
(3, 'Licuadora Premium', 'Oster', 350000.00, 0, 'out_of_stock'),
(4, 'Balón de Fútbol', 'Adidas', 120000.00, 50, 'available'),
(5, 'Cien Años de Soledad', 'Editorial Sudamericana', 45000.00, 100, 'available');
-- =====================================================
-- 5. PRODUCT IMAGES (6 imágenes - al menos 1 por producto)
-- =====================================================
INSERT INTO productimages (ProductID, URL, Description, IsPrimary) VALUES
(1, '[Link] 'Samsung Galaxy S23 - Vista frontal', TRUE),
(2, '[Link] 'Dell Inspiron 15 - Vista superior', TRUE),
(3, '[Link] 'Chaqueta de cuero negra', TRUE),
(4, '[Link] 'Licuadora Oster roja', TRUE),
(5, '[Link] 'Balón Adidas oficial', TRUE),
(6, '[Link] 'Portada del libro', TRUE);
-- =====================================================
-- 6. PROMOTIONS (6 promociones)
-- =====================================================
INSERT INTO promotions (Code, Description, Discount, StartDate, EndDate, Status) VALUES
('VERANO2024', 'Descuento de verano en electrónica', 15.00, '2024-06-01', '2024-08-31',
'expired'),
('BLACKFRIDAY', 'Black Friday - Todo el sitio', 25.00, '2024-11-25', '2024-11-30', 'expired'),
('NAVIDAD2024', 'Especial navideño', 20.00, '2024-12-01', '2024-12-31', 'expired'),
('ENERO2025', 'Año nuevo, descuentos nuevos', 10.00, '2025-01-01', '2025-01-31', 'expired'),
('FEBRERO2025', 'San Valentín especial', 12.00, '2025-02-01', '2025-02-14', 'expired'),
('ACTUAL2025', 'Promoción vigente enero', 18.00, '2025-01-15', '2025-01-31', 'active');
-- =====================================================
-- 7. PRODUCT PROMOTIONS (6 relaciones N:N)
-- =====================================================
INSERT INTO productpromotions (ProductID, PromotionID, AppliedDate) VALUES
(1, 6, '2025-01-15 10:00:00'),
(2, 6, '2025-01-15 10:00:00'),
(3, 6, '2025-01-15 10:00:00'),
(1, 1, '2024-06-01 00:00:00'),
(2, 2, '2024-11-25 00:00:00'),
(5, 4, '2025-01-01 00:00:00');
-- =====================================================
-- 8. SHIPPING METHODS (6 métodos de envío)
-- =====================================================
INSERT INTO shippingmethods (Name, DeliveryEstimate, Cost, Status) VALUES
('Envío Estándar', '5-7 días hábiles', 15000.00, 'active'),
('Envío Express', '2-3 días hábiles', 35000.00, 'active'),
('Envío Same Day', '24 horas', 50000.00, 'active'),
('Recogida en Tienda', '1-2 días hábiles', 0.00, 'active'),
('Envío Internacional', '15-20 días hábiles', 120000.00, 'active'),
('Envío Premium', '1 día hábil', 80000.00, 'inactive');
-- =====================================================
-- 9. ORDERS (6 órdenes)
-- =====================================================
INSERT INTO orders (CustomerID, OrderDate, TotalAmount, Status, ShippingMethodID)
VALUES
(1, '2025-01-10', 2514000.00, 'delivered', 1),
(2, '2025-01-15', 3235000.00, 'shipped', 2),
(3, '2025-01-18', 280000.00, 'processing', 1),
(4, '2025-01-20', 365000.00, 'pending', 3),
(1, '2025-01-22', 165000.00, 'pending', 1),
(6, '2025-01-05', 95000.00, 'cancelled', 1);
-- =====================================================
-- 10. ORDER DETAILS (6 detalles de orden)
-- =====================================================
INSERT INTO orderdetails (OrderID, ProductID, Quantity, Price) VALUES
(1, 1, 1, 2499000.00),
(2, 2, 1, 3200000.00),
(3, 3, 1, 280000.00),
(4, 4, 1, 350000.00),
(5, 5, 1, 120000.00),
(6, 6, 2, 45000.00);
-- =====================================================
-- 11. PAYMENTS (6 pagos)
-- =====================================================
INSERT INTO payments (OrderID, PaymentMethod, Amount, PaymentDate, Status) VALUES
(1, 'credit_card', 2514000.00, '2025-01-10 14:30:00', 'completed'),
(2, 'debit_card', 3235000.00, '2025-01-15 16:45:00', 'completed'),
(3, 'paypal', 280000.00, '2025-01-18 10:20:00', 'completed'),
(4, 'bank_transfer', 365000.00, '2025-01-20 09:15:00', 'pending'),
(5, 'credit_card', 165000.00, '2025-01-22 11:00:00', 'pending'),
(6, 'cash', 95000.00, '2025-01-05 15:30:00', 'refunded');
-- =====================================================
-- 12. REVIEWS (6 reseñas)
-- =====================================================
INSERT INTO reviews (ProductID, CustomerID, Rating, Comment, ReviewDate, Status)
VALUES
(1, 1, 5, 'Excelente teléfono, superó mis expectativas', '2025-01-12 18:00:00', 'approved'),
(2, 2, 4, 'Buena laptop pero un poco pesada', '2025-01-17 20:30:00', 'approved'),
(3, 3, 5, 'Hermosa chaqueta, calidad premium', '2025-01-19 14:15:00', 'approved'),
(5, 1, 4, 'Buen balón para jugar con amigos', '2025-01-23 16:45:00', 'pending'),
(6, 6, 5, 'Libro clásico imprescindible', '2025-01-07 10:00:00', 'approved'),
(1, 4, 3, 'Batería dura menos de lo esperado', '2025-01-21 12:30:00', 'rejected');
-- =====================================================
-- 13. SHOPPING CART (6 items en carrito)
-- =====================================================
INSERT INTO shoppingcart (CustomerID, ProductID, Quantity, Price, AddedDate) VALUES
(3, 1, 1, 2499000.00, '2025-01-22 09:00:00'),
(4, 2, 1, 3200000.00, '2025-01-21 15:30:00'),
(6, 3, 2, 280000.00, '2025-01-23 10:45:00'),
(2, 5, 3, 120000.00, '2025-01-20 14:20:00'),
(1, 6, 1, 45000.00, '2025-01-23 11:00:00'),
(4, 1, 1, 2499000.00, '2025-01-15 16:00:00');
-- =====================================================
-- VERIFICACIÓN DE DATOS INSERTADOS
-- =====================================================
SELECT 'Customers' AS tabla, COUNT(*) AS registros FROM customers
UNION ALL
SELECT 'CustomerProfiles', COUNT(*) FROM customerprofiles
UNION ALL
SELECT 'Categories', COUNT(*) FROM categories
UNION ALL
SELECT 'Products', COUNT(*) FROM products
UNION ALL
SELECT 'ProductImages', COUNT(*) FROM productimages
UNION ALL
SELECT 'Promotions', COUNT(*) FROM promotions
UNION ALL
SELECT 'ProductPromotions', COUNT(*) FROM productpromotions
UNION ALL
SELECT 'ShippingMethods', COUNT(*) FROM shippingmethods
UNION ALL
SELECT 'Orders', COUNT(*) FROM orders
UNION ALL
SELECT 'OrderDetails', COUNT(*) FROM orderdetails
UNION ALL
SELECT 'Payments', COUNT(*) FROM payments
UNION ALL
SELECT 'Reviews', COUNT(*) FROM reviews
UNION ALL
SELECT 'ShoppingCart', COUNT(*) FROM shoppingcart;
Explicación de las relaciones:
1. Orders 1:0..1 ShipmentTracking
o Una orden puede tener máximo un seguimiento
o No todas las órdenes tienen tracking (ej: recogida en tienda)
1. ShipmentTracking 1:N TrackingEvents
o Un tracking tiene múltiples eventos (historial del envío)
o Mínimo debe tener 1 evento
Reglas de Negocio:
· TrackingNumber es único y lo proporciona la transportadora
· CurrentStatus se actualiza automáticamente con el último evento
· Carrier: "Servientrega", "Coordinadora", "Interrapidísimo", "DHL", etc.
· Solo órdenes con Status='shipped' o 'delivered' tienen tracking
· Los eventos se ordenan por EventDate para mostrar el recorrido
✅ Pagos: Mercado Pago (fácil en Latam)
✅ Emails: SendGrid o Resend
✅ SMS: Twilio
✅ Imágenes: Cloudinary (tier gratuito generoso)
✅ Errores: Sentry
✅ Auth: JWT propio o Auth0
✅ Base de datos: MySQL en Railway/PlanetScale
✅ Deploy: Railway, Render o [Link]
✅ Tracking: Shippo o API directa de transportadora
Recomendaciones personalziadas IA
CHATBOX
4. GENERACIÓN AUTOMÁTICA DE DESCRIPCIONES
DE PRODUCTOS
¿Qué hace?
· Subes producto con especificaciones básicas
· IA genera descripción atractiva y optimizada para SEO
· Traduce a múltiples idiomas
Tecnología
· GPT-4 o Claude
· Prompt: "Genera descripción de producto para e-commerce..."
Ejemplo
Input: "Samsung Galaxy S23, 8GB RAM, 256GB, cámara 50MP"
Output IA:
"Descubre el poder del Samsung Galaxy S23, el smartphone
que redefine la fotografía móvil. Con 8GB de RAM para
multitarea sin límites, 256GB de almacenamiento y una
impresionante cámara de 50MP que captura cada momento
con claridad profesional. Perfecto para creadores de
contenido y entusiastas de la tecnología."