- Custom modules: hazard_shopify, hazard_inventory_report, hazard_website - Third-party modules: bi_sql_editor, query_deluxe, sql_request_abstract, l10n_mx_sat_sync_itadmin_ee - Docker setup: Odoo 16 + PostgreSQL 17 - Utility scripts: backup_hazard.sh, update_module.py - Agent configuration: .agents/AGENTS.md - Security: Enterprise modules, credentials, backups and production data excluded via .gitignore
8.9 KiB
8.9 KiB
Resumen de Proyecto: Integración Odoo-Shopify (Hazard)
Este documento detalla el estado actual del módulo de integración hazard_shopify, resumiendo todas las características robustas, mejoras de seguridad, lógica de sincronización y herramientas avanzadas de exportación implementadas para la gestión eficiente del catálogo, inventario y códigos de barras EAN-13 entre Odoo y Shopify.
📊 Estado General de Funcionalidades
| Funcionalidad / Módulo | Estado | Descripción Técnica |
|---|---|---|
| Autenticación OAuth y Conexión Segura | ✅ Completado | Generación de token temporal de 24h, renovación automática con margen de 5 minutos, encriptación en base de datos. |
| Prevención de Duplicados (Paso 0) | ✅ Completado | Agrupación en memoria de variantes duplicadas en Shopify antes del proceso de importación/sync para prevenir errores de integridad. |
| Generador de Barcodes EAN-13 | ✅ Completado | Generación secuencial automática basada en prefijo GS1 con cálculo de dígito verificador estándar y prevención de colisiones. |
| Sincronizador Background de Barcodes | ✅ Completado | Proceso en segundo plano por lotes (batches de 50) con control de rate limit y commits por registro para evitar pérdida de progreso. |
| Importación de Catálogo (Shopify → Odoo) | ✅ Completado | Creación inteligente de productos en Odoo (nombre, precios, imágenes base64 y mapeo de IDs de variantes e inventario). |
| Control de Inventario Multi-Sucursal | ✅ Completado | Mapeo interactivo de almacenes Odoo ↔ Sucursales Shopify. Actualizaciones individuales y masivas basadas en diferencias (discrepancias). |
| Sincronización de Ventas (Pedidos) | ✅ Completado | Importación automática mediante Odoo Cron cada 30 minutos o manual de pedidos recientes, asignando listas de precios y diarios. |
| Reportes Avanzados y Herramientas | ✅ Completado | Exportación de CSV para impresoras de etiquetas y Excel dinámico multi-hoja con inventario detallado y códigos reservados. |
🛠️ Detalles de Arquitectura y Funcionalidades
1. Autenticación y Conexión Segura
- Mecanismo: Implementa la autenticación mediante OAuth Client Credentials.
- Renovación Inteligente: En lugar de depender de tokens estáticos vulnerables o expiraciones manuales abruptas, el sistema almacena las credenciales del Dev Dashboard y verifica el token antes de cada llamada API (
_ensure_access_token). Si el token está a 5 minutos o menos de expirar, se solicita y actualiza automáticamente. - Acciones Disponibles:
⚡ Generar Token: Genera y almacena el primer token.Probar Conexión: Envía una solicitud de ping rápida a la tienda para validar la integridad del canal.
2. Gestión de Duplicados en Web (Paso 0)
- El Problema: Los SKUs duplicados en Shopify corrompen el inventario y las ventas al intentar mapearse en Odoo.
- La Solución: Una pestaña inteligente dedicada ("Paso 0: Duplicados en Shopify") que agrupa en memoria todos los registros utilizando
NewIdde Odoo de forma optimizada. - Acciones:
- Resalta en rojo los duplicados y advierte al usuario.
- Permite proponer un SKU Sugerido (Corrección) directamente en una grilla editable.
- Exporta un CSV de discrepancias para su revisión por parte del cliente antes de forzar la sincronización.
3. Generador e Inyector de Códigos de Barras EAN-13
- Generación Idempotente: Calcula dinámicamente códigos EAN-13 utilizando el prefijo de la empresa (por defecto
200001para uso interno GS1). - Control de Secuencias: Obtiene el máximo número de secuencia actual de la base de datos para continuar de forma consecutiva sin repetir códigos generados anteriormente.
- Algoritmo EAN-13: Cálculo matemático estricto del dígito verificador estándar GS1:
\text{CheckDigit} = (10 - (\text{Suma de dígitos impares} + 3 \times \text{Suma de dígitos pares}) \pmod{10}) \pmod{10} - Sincronización Background Multihilo:
- Para evitar bloqueos HTTP (Timeouts de Odoo/Nginx), el botón
2. Subir a Shopifyejecuta un hilo background (threading.Thread) que procesa variantes en lotes de 50. - Rate Limit: Implementa una espera controlada de
0.6segundos entre variantes, respetando los límites de la API de Shopify (2 peticiones/segundo). - Resiliencia Extrema: Realiza un
cr.commit()individual por cada variante subida con éxito. Si la red cae o el servidor se detiene, el progreso realizado queda guardado en la base de datos; al reactivar el proceso, simplemente continúa con las líneas en estadopendingyerror. - Manual Overrides: Botón
✓ Marcar como Subidospara corregir estados de forma masiva en Odoo si se sincronizaron por otra vía, y botónReintentar errorespara volver a meter en cola los fallos capturados.
- Para evitar bloqueos HTTP (Timeouts de Odoo/Nginx), el botón
4. Sincronización Multi-Sucursal de Inventario (Shopify → Odoo)
- Mapeo Flexible: Permite asociar N ubicaciones físicas de Shopify con N almacenes o ubicaciones de Odoo mediante la sub-tabla
shopify.location.mapping. - Sincronización Inteligente:
- Consulta en tiempo real (
requests.get) los inventarios en las ubicaciones de Shopify asociadas. - Permite auditar el catálogo detectando diferencias de stock Odoo vs Shopify.
- Ofrece el botón
Actualizar Stock Seleccionado (Shopify → Odoo)para forzar a Odoo a igualar los niveles de stock de Shopify de forma masiva mediante Inventory Adjustments rápidos.
- Consulta en tiempo real (
5. Reportes de Exportación Avanzados
- CSV de Etiquetas: Genera un archivo optimizado para software de impresión de etiquetas (Dymo, Zebra, etc.) con columnas estructuradas de variantes y códigos de barras.
- Excel Multi-Hoja (openpyxl):
- Hoja 1 ("Inventario"): Tabla con diseño estilizado, cabeceras en azul premium, auto-ajuste de columnas y colores dinámicos según el estado de Shopify (verde para subido, amarillo para pendiente, rojo para error).
- Hoja 2 ("Próximos Disponibles"): Pre-calcula los siguientes 500 códigos EAN-13 consecutivos basados en el contador secuencial activo. Tiene diseño en color verde GS1 y tipografía de tipo Courier New para fácil lectura por el personal de almacén, previniendo que asignen códigos manualmente de manera incorrecta.
📂 Archivos del Módulo en el Repositorio
El código fuente principal y las vistas XML están estructurados de la siguiente manera:
- Modelos de Base de Datos:
shopify_config.py: Lógica principal del token, generación secuencial de EAN-13, hilo background resiliente, importación de stock multi-sucursal y formateo de hojas Excel de alta estética.sku_simulation_line.py: Estructura de datos por variante, campos computados para la detección de duplicados en memoria, y lógica de creación de variantes e imágenes base64 en Odoo.
- Interfaz de Usuario (Vistas XML):
shopify_config_views.xml: Vistas de formulario Odoo enriquecidas estéticamente con paneles de estadísticas en vivo (Dashboards con badges CSS para estados), menús personalizados e instrucciones interactivas.
🚀 Plan de Despliegue y Pruebas
Para garantizar una transición segura a producción, se recomienda seguir este flujo de verificación:
Fase 1: Pruebas de Generación Local
- Ingresar a Odoo y abrir el registro de Configuración de Shopify.
- Modificar el campo Prefijo empresa (6 dígitos) si es necesario (ej:
200002). - Presionar el botón
1. Generar EAN-13en la pestaña 🔖 Barcodes EAN-13. - Validar en la tabla que los códigos se asignen secuencialmente de forma correcta y que el último dígito corresponda al algoritmo verificador EAN-13.
- Exportar el Excel (Inventario + Próximos) y verificar que la hoja 2 muestre 500 códigos subsiguientes listos.
Fase 2: Sincronización en Staging (Lote Pequeño)
- Filtrar variantes utilizando el campo de búsqueda o categorías.
- Sincronizar un lote controlado de 5 a 10 productos a Shopify.
- Presionar
2. Subir a Shopifyy monitorear el log en vivo o recargar el formulario para ver cómo el progreso incrementa y el contador de "Pendientes" baja. - Validar directamente en el panel de Shopify que la variante haya recibido su código de barras correspondiente.
Fase 3: Ejecución Masiva
- Una vez validada la Fase 2, ejecutar la sincronización para las más de 1,100 variantes pendientes.
- El hilo background continuará procesando a un ritmo seguro de ~2 variantes por segundo sin congelar la pantalla de Odoo, completando todo el catálogo de forma autónoma.