🎉 Initial commit - Hazard Odoo 16 project

- 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
This commit is contained in:
2026-06-30 06:12:35 -06:00
commit 28d9e56f47
350 changed files with 99832 additions and 0 deletions
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo noupdate="1">
<!-- Método de envío: Mensajería Local (Taxi/Mensajero de confianza) -->
<record id="delivery_carrier_mensajeria_local" model="delivery.carrier">
<field name="name">Mensajería Local (Taxi/Mensajero)</field>
<field name="delivery_type">fixed</field>
<field name="fixed_price">0.0</field>
<field name="product_id" ref="delivery.product_product_delivery"/>
</record>
</odoo>
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<!-- Sequence for Barcode Generation (EAN-13) -->
<record id="seq_product_barcode_hazard" model="ir.sequence">
<field name="name">Secuencia de Códigos de Barras Hazard (EAN-13)</field>
<field name="code">product.barcode.hazard</field>
<field name="prefix">200001</field> <!-- Standard GS1 + Company format prefix -->
<field name="padding">6</field> <!-- E.g. 200001 000001 (12 digits, then + checksum) -->
<field name="company_id" eval="False"/>
</record>
</data>
</odoo>
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="paperformat_label_thermal2x1" model="report.paperformat">
<field name="name">Etiqueta Termica 2x1 (51x25mm)</field>
<field name="default" eval="False" />
<field name="format">custom</field>
<field name="page_width">51</field>
<field name="page_height">25</field>
<field name="orientation">Portrait</field>
<field name="margin_top">0</field>
<field name="margin_bottom">0</field>
<field name="margin_left">0</field>
<field name="margin_right">0</field>
<field name="disable_shrinking" eval="True"/>
<field name="dpi">96</field>
</record>
</data>
</odoo>
@@ -0,0 +1,96 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<!-- ================================================================
CRON 1: Importación Automática de Pedidos (Shopify → Odoo)
Activo solo cuando 'auto_import_orders' = True en la config.
================================================================ -->
<record id="ir_cron_shopify_import_orders" model="ir.cron">
<field name="name">Shopify: Importar Pedidos Nuevos</field>
<field name="model_id" ref="model_shopify_config"/>
<field name="state">code</field>
<field name="code">model.cron_import_orders()</field>
<field name="interval_number">5</field>
<field name="interval_type">minutes</field>
<field name="numbercall">-1</field>
<field name="active">True</field>
<field name="user_id" ref="base.user_root"/>
<field name="priority">5</field>
</record>
<!-- ================================================================
CRON 2: Sincronización de Inventario (Odoo ➔ Shopify)
Odoo manda. Odoo es la Fuente de Verdad.
Por defecto INACTIVO: se activa cuando estén listos.
================================================================ -->
<record id="ir_cron_shopify_sync_inventory" model="ir.cron">
<field name="name">Shopify: Sincronizar Inventario (Odoo ➔ Shopify)</field>
<field name="model_id" ref="model_shopify_config"/>
<field name="state">code</field>
<field name="code">model.cron_sync_inventory_to_shopify()</field>
<field name="interval_number">12</field>
<field name="interval_type">hours</field>
<field name="numbercall">-1</field>
<field name="active">False</field>
<field name="user_id" ref="base.user_root"/>
<field name="priority">10</field>
</record>
<!-- ================================================================
CRON 3: Renovación Preventiva de Tokens (Shopify OAuth)
Shopify emite tokens con duración de 24h. Este cron los renueva
automáticamente cada 20 horas para evitar interrupciones de servicio
sin intervención manual del cliente.
================================================================ -->
<record id="ir_cron_shopify_refresh_tokens" model="ir.cron">
<field name="name">Shopify: Renovar Tokens de Acceso (Automático)</field>
<field name="model_id" ref="model_shopify_config"/>
<field name="state">code</field>
<field name="code">model.cron_refresh_tokens()</field>
<field name="interval_number">20</field>
<field name="interval_type">hours</field>
<field name="numbercall">-1</field>
<field name="active">True</field>
<field name="user_id" ref="base.user_root"/>
<field name="priority">1</field>
</record>
<!-- ================================================================
CRON 4: Descarga de Imágenes por Lotes (Shopify → Odoo)
Procesa 15 productos sin imagen por ejecución.
Se ACTIVA desde el botón y se auto-DESACTIVA al terminar.
================================================================ -->
<record id="ir_cron_shopify_download_images" model="ir.cron">
<field name="name">Shopify: Descargar Imágenes de Productos</field>
<field name="model_id" ref="model_shopify_config"/>
<field name="state">code</field>
<field name="code">model._cron_download_images_batch()</field>
<field name="interval_number">1</field>
<field name="interval_type">minutes</field>
<field name="numbercall">-1</field>
<field name="active">False</field>
<field name="user_id" ref="base.user_root"/>
<field name="priority">5</field>
</record>
<!-- ================================================================
CRON 5: Sincronización Permanente y Automática de Nuevas Imágenes
Busca productos sin foto en Odoo, descarga la portada y NUNCA se desactiva.
Se ejecuta cada 2 horas de forma 100% transparente para el usuario.
================================================================ -->
<record id="ir_cron_shopify_auto_image_sync" model="ir.cron">
<field name="name">Shopify: Auto-Descargar Imágenes Nuevas (Permanente)</field>
<field name="model_id" ref="model_shopify_config"/>
<field name="state">code</field>
<field name="code">model.cron_auto_download_images()</field>
<field name="interval_number">2</field>
<field name="interval_type">hours</field>
<field name="numbercall">-1</field>
<field name="active">True</field>
<field name="user_id" ref="base.user_root"/>
<field name="priority">8</field>
</record>
</data>
</odoo>