0% encontró este documento útil (0 votos)
1 vistas19 páginas

Ecommerce

Ecommerce 2

Cargado por

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

Ecommerce

Ecommerce 2

Cargado por

luis gonzalez
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

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."

También podría gustarte