# 📖 GUÍA DE USO DE REFERENCIAS DE ODOO **Proyecto:** Sistema de Administración de Obra e INFONAVIT **Versión:** 1.0.0 **Fecha:** 2025-11-23 --- ## 🎯 OBJETIVO Esta guía explica cómo utilizar el código de referencia de Odoo Community Edition clonado en `reference/odoo/` para mejorar el desarrollo del Sistema de Administración de Obra e INFONAVIT. --- ## 📂 UBICACIÓN DE REFERENCIAS ``` workspace-inmobiliaria/ ├── reference/ # Código de referencia (NO versionado en git) │ ├── README.md # Instrucciones generales │ ├── ODOO-MODULES-ANALYSIS.md # 📊 Análisis detallado de módulos │ └── odoo/ # Odoo Community Edition v18.0 │ ├── odoo/ # Core del framework │ │ ├── api.py # Sistema de decoradores │ │ ├── fields.py # Tipos de campos ORM │ │ ├── models.py # Sistema ORM │ │ └── ... │ └── addons/ # 609 módulos │ ├── project/ # ⭐ Gestión de proyectos │ ├── sale/ # ⭐ Ventas │ ├── purchase/ # ⭐ Compras │ ├── stock/ # ⭐ Inventario │ └── ... └── docs/ └── GUIA-USO-REFERENCIAS-ODOO.md # 📖 Este documento ``` --- ## 🚀 INICIO RÁPIDO ### 1. Verificar que Odoo está clonado ```bash cd /home/isem/workspace/projects/erp-suite ls -la reference/odoo/ # Debe mostrar: # - odoo/ (core del framework) # - addons/ (609 módulos) # - doc/ (documentación) ``` ### 2. Consultar análisis de módulos Lee primero el análisis completo: ```bash cat reference/ODOO-MODULES-ANALYSIS.md ``` Este documento contiene: - ✅ Lista de módulos más relevantes para el proyecto - ✅ Estructura de cada módulo - ✅ Patrones arquitectónicos identificados - ✅ Mejores prácticas observadas - ✅ Guía de qué adoptar, adaptar o evitar --- ## 📋 CASOS DE USO COMUNES ### Caso 1: Implementar Gestión de Proyectos de Obra **Pregunta:** ¿Cómo implementar gestión de proyectos de construcción? **Pasos:** 1. **Consultar módulo de referencia:** ```bash cd reference/odoo/addons/project/ ``` 2. **Leer manifest para entender dependencias:** ```bash cat __manifest__.py ``` 3. **Revisar modelos principales:** ```bash cat models/project_project.py # Modelo de proyecto cat models/project_task.py # Modelo de tareas cat models/project_milestone.py # Hitos del proyecto ``` 4. **Identificar patrones arquitectónicos:** - Sistema de estados (draft → in_progress → done) - Integración con contabilidad analítica - Uso de `mail.thread` para tracking - Kanban boards con stages personalizables 5. **Adaptar al proyecto:** - Traducir lógica Python a TypeScript/JavaScript - Adaptar modelos ORM de Odoo a TypeORM/Prisma - Implementar vistas similares en React/Vue - Mantener los mismos estados y flujos --- ### Caso 2: Implementar Sistema de Compras **Pregunta:** ¿Cómo gestionar órdenes de compra de materiales? **Pasos:** 1. **Consultar módulos relacionados:** ```bash cd reference/odoo/addons/ ls -d purchase* # purchase/ # purchase_stock/ # Integración con inventario # purchase_requisition/ # Requisiciones ``` 2. **Revisar modelo principal:** ```bash cat purchase/models/purchase_order.py ``` 3. **Identificar funcionalidades:** - Estados: draft → sent → purchase → done - Líneas de compra con productos y cantidades - Vinculación con proyectos (via `project_purchase`) - Generación de facturas desde órdenes 4. **Ver integración con inventario:** ```bash cat purchase_stock/models/purchase_order.py ``` - Cómo se crean movimientos de inventario - Recepción de materiales - Confirmación de cantidades --- ### Caso 3: Implementar Control de Inventario **Pregunta:** ¿Cómo gestionar inventario de materiales en almacenes? **Pasos:** 1. **Consultar módulo stock:** ```bash cd reference/odoo/addons/stock/ ls models/ ``` 2. **Revisar conceptos clave:** - `stock_warehouse.py` - Almacenes - `stock_location.py` - Ubicaciones jerárquicas - `stock_move.py` - Movimientos de inventario - `stock_quant.py` - Cantidades actuales - `stock_picking.py` - Albaranes/guías 3. **Entender arquitectura:** - Estructura jerárquica de ubicaciones - Cada movimiento crea registro de trazabilidad - Cantidades se calculan de movimientos - Soporte para lotes y números de serie --- ### Caso 4: Implementar Subcontratación **Pregunta:** ¿Cómo gestionar subcontratistas de obra? **Pasos:** 1. **Consultar módulo de subcontratación:** ```bash cd reference/odoo/addons/mrp_subcontracting/ ``` 2. **Revisar funcionalidades:** ```bash cat models/res_partner.py # Marca partners como subcontratistas cat models/stock_picking.py # Envíos a subcontratistas cat views/subcontracting_portal_views.xml # Portal para subcontratistas ``` 3. **Identificar flujo:** - Marcar proveedor como subcontratista - Crear orden de subcontratación - Enviar componentes/materiales - Recibir trabajo terminado - Portal para que subcontratista vea órdenes --- ### Caso 5: Implementar Contabilidad Analítica **Pregunta:** ¿Cómo llevar control de costos por proyecto? **Pasos:** 1. **Consultar módulo analytic:** ```bash cd reference/odoo/addons/analytic/ cat models/account_analytic_account.py ``` 2. **Consultar integración con proyectos:** ```bash cd reference/odoo/addons/project_account/ cat models/project_project.py ``` 3. **Entender patrón:** - Cada proyecto tiene una cuenta analítica - Todas las transacciones (compras, nómina, gastos) se registran - Se pueden generar reportes de costos por proyecto - Balance de presupuesto vs real --- ## 🔍 CÓMO BUSCAR IMPLEMENTACIONES ### Buscar por funcionalidad **Ejemplo:** Quiero ver cómo Odoo implementa aprobaciones de órdenes. ```bash cd reference/odoo/addons/purchase/ grep -r "approve" --include="*.py" | head -20 ``` ### Buscar por campo específico **Ejemplo:** Quiero ver cómo se usan campos `state`. ```bash cd reference/odoo/addons/sale/ grep -r "state = fields.Selection" --include="*.py" ``` ### Buscar validaciones **Ejemplo:** Quiero ver cómo se implementan constraints. ```bash cd reference/odoo/addons/account/ grep -r "@api.constrains" --include="*.py" | head -10 ``` ### Buscar campos computados **Ejemplo:** Quiero ver cómo se calculan totales. ```bash cd reference/odoo/addons/sale/ grep -r "@api.depends.*total" --include="*.py" | head -10 ``` --- ## 🎨 PATRONES A ADOPTAR ### 1. **Sistema de Estados (State Machine)** **Referencia:** `reference/odoo/addons/sale/models/sale_order.py` **Patrón Odoo:** ```python state = fields.Selection([ ('draft', 'Quotation'), ('sent', 'Quotation Sent'), ('sale', 'Sales Order'), ('done', 'Locked'), ('cancel', 'Cancelled'), ], string='Status', readonly=True, default='draft') def action_confirm(self): self.state = 'sale' # ... lógica adicional def action_cancel(self): self.state = 'cancel' ``` **Adaptación a nuestro proyecto (TypeScript/TypeORM):** ```typescript enum OrderState { DRAFT = 'draft', SENT = 'sent', SALE = 'sale', DONE = 'done', CANCEL = 'cancel', } @Entity() class SaleOrder { @Column({ type: 'enum', enum: OrderState, default: OrderState.DRAFT, }) state: OrderState; async confirm() { this.state = OrderState.SALE; await this.save(); // ... lógica adicional } async cancel() { this.state = OrderState.CANCEL; await this.save(); } } ``` --- ### 2. **Campos Computados con Dependencias** **Referencia:** `reference/odoo/addons/sale/models/sale_order.py` **Patrón Odoo:** ```python @api.depends('order_line.price_total') def _compute_amount_total(self): for order in self: order.amount_total = sum(order.order_line.mapped('price_total')) amount_total = fields.Monetary(compute='_compute_amount_total', store=True) ``` **Adaptación a nuestro proyecto:** ```typescript @Entity() class SaleOrder { @OneToMany(() => SaleOrderLine, line => line.order) orderLines: SaleOrderLine[]; // Getter que calcula el total get amountTotal(): number { return this.orderLines.reduce((sum, line) => sum + line.priceTotal, 0); } // O usar un subscriber/hook para calcular y guardar @AfterLoad() @AfterInsert() @AfterUpdate() calculateTotal() { this.amountTotal = this.orderLines.reduce( (sum, line) => sum + line.priceTotal, 0 ); } } ``` --- ### 3. **Tracking de Cambios (Audit Trail)** **Referencia:** Casi todos los módulos usan `mail.thread` **Patrón Odoo:** ```python class SaleOrder(models.Model): _name = 'sale.order' _inherit = ['mail.thread', 'mail.activity.mixin'] name = fields.Char(tracking=True) # Cambios registrados state = fields.Selection(tracking=True) partner_id = fields.Many2one(tracking=True) ``` **Adaptación a nuestro proyecto:** Usar biblioteca de audit trail o implementar: ```typescript @Entity() class SaleOrder { @Column() @ChangeTracking() // Custom decorator name: string; @Column() @ChangeTracking() state: OrderState; @OneToMany(() => AuditLog, log => log.entity) auditLogs: AuditLog[]; } // Subscriber que registra cambios @EventSubscriber() class AuditSubscriber { afterUpdate(event: UpdateEvent) { // Comparar valores anteriores con nuevos // Crear registro en AuditLog } } ``` --- ### 4. **Contabilidad Analítica por Proyecto** **Referencia:** `reference/odoo/addons/analytic/`, `project_account/` **Patrón Odoo:** ```python class Project(models.Model): _name = 'project.project' analytic_account_id = fields.Many2one('account.analytic.account') class PurchaseOrderLine(models.Model): _name = 'purchase.order.line' # Al crear línea de compra vinculada a proyecto: analytic_distribution = fields.Json() # Distribución por proyecto # Al crear movimiento contable: class AccountMoveLine(models.Model): analytic_distribution = fields.Json() # Se copia del PO ``` **Adaptación a nuestro proyecto:** ```typescript @Entity() class Project { @Column() analyticAccountId: string; @OneToMany(() => CostLine, line => line.project) costs: CostLine[]; } @Entity() class PurchaseOrderLine { @ManyToOne(() => Project) project: Project; @Column('decimal') amount: number; @AfterInsert() async createCostLine() { // Crear registro de costo asociado al proyecto await CostLine.create({ project: this.project, amount: this.amount, description: 'Purchase: ' + this.product.name, date: new Date(), }); } } @Entity() class CostLine { @ManyToOne(() => Project) project: Project; @Column('decimal') amount: number; @Column() description: string; @Column() date: Date; } ``` --- ## 📊 TABLA DE MAPEO: ODOO → NUESTRO PROYECTO | **Concepto Odoo** | **Equivalente en Nuestro Proyecto** | |-------------------|-------------------------------------| | `project.project` | `Project` entity | | `project.task` | `Task` entity | | `sale.order` | `SaleOrder` o `Contract` | | `purchase.order` | `PurchaseOrder` | | `stock.warehouse` | `Warehouse` | | `stock.location` | `Location` | | `stock.move` | `InventoryMovement` | | `stock.quant` | `StockQuantity` | | `account.analytic.account` | `ProjectCostAccount` o `AnalyticAccount` | | `res.partner` | `Partner` o `Customer/Supplier` | | `hr.employee` | `Employee` | | `hr.contract` | `EmployeeContract` | --- ## ✅ CHECKLIST AL CONSULTAR REFERENCIAS Cuando implementes una nueva funcionalidad: - [ ] Identificar módulo(s) relevante(s) en Odoo - [ ] Leer `__manifest__.py` para entender dependencias - [ ] Revisar modelos en `models/` para entender lógica de negocio - [ ] Revisar vistas en `views/` para entender UI/UX esperada - [ ] Identificar patrones arquitectónicos (estados, workflows, etc.) - [ ] Identificar mejores prácticas (validaciones, constraints, etc.) - [ ] Documentar hallazgos en ADR si es decisión arquitectónica importante - [ ] Adaptar patrón a nuestro stack tecnológico - [ ] No copiar código directamente - entender y adaptar --- ## 🚫 QUÉ EVITAR ### ❌ No Copiar Código Directamente **MAL:** ```python # Copiar código Python de Odoo sin adaptar def _compute_amount_total(self): for order in self: order.amount_total = sum(order.order_line.mapped('price_total')) ``` **BIEN:** ```typescript // Adaptar concepto a nuestro stack get amountTotal(): number { return this.orderLines.reduce((sum, line) => sum + line.priceTotal, 0); } ``` ### ❌ No Implementar Todo el Módulo Odoo tiene funcionalidades extensas. Implementa solo lo que necesitas. **MAL:** - Copiar todo el módulo `project` con sus 50+ campos **BIEN:** - Implementar solo: nombre, descripción, fecha inicio/fin, estado, presupuesto ### ❌ No Ignorar Diferencias de Stack Odoo usa Python + PostgreSQL + XML views. Nuestro proyecto usa TypeScript + PostgreSQL + React. **MAL:** - Intentar usar XML para vistas **BIEN:** - Entender concepto de vista form/tree/kanban - Implementar equivalente en React components --- ## 📚 RECURSOS ADICIONALES ### Documentación Odoo - [Developer Documentation](https://www.odoo.com/documentation/master/developer.html) - [ORM Guide](https://www.odoo.com/documentation/master/developer/reference/backend/orm.html) - [View Reference](https://www.odoo.com/documentation/master/developer/reference/user_interface/view_records.html) ### Repositorios Útiles - [Odoo GitHub](https://github.com/odoo/odoo) - [OCA GitHub](https://github.com/OCA) - [OCA Server Tools](https://github.com/OCA/server-tools) - [OCA Account Financial Tools](https://github.com/OCA/account-financial-tools) ### Documentos Relacionados - `reference/README.md` - Instrucciones generales de carpeta reference - `reference/ODOO-MODULES-ANALYSIS.md` - Análisis detallado de módulos - `orchestration/prompts/PROMPT-ARCHITECTURE-ANALYST.md` - Prompt del agente Architecture-Analyst --- ## 🔄 ACTUALIZACIÓN DE ODOO Para mantener la referencia actualizada: ```bash cd reference/odoo git pull origin 18.0 ``` **Frecuencia recomendada:** Mensual o cuando se necesite consultar última versión. --- ## 💡 EJEMPLOS PRÁCTICOS ### Ejemplo 1: Implementar Estados de Orden de Compra **Consulta:** ```bash cd reference/odoo/addons/purchase/ cat models/purchase_order.py | grep -A 10 "state = fields.Selection" ``` **Resultado:** ```python state = fields.Selection([ ('draft', 'RFQ'), ('sent', 'RFQ Sent'), ('to approve', 'To Approve'), ('purchase', 'Purchase Order'), ('done', 'Locked'), ('cancel', 'Cancelled') ], string='Status', readonly=True, copy=False, default='draft') ``` **Implementación en nuestro proyecto:** ```typescript enum PurchaseOrderState { DRAFT = 'draft', SENT = 'sent', TO_APPROVE = 'to_approve', PURCHASE = 'purchase', DONE = 'done', CANCEL = 'cancel', } @Entity() class PurchaseOrder { @Column({ type: 'enum', enum: PurchaseOrderState, default: PurchaseOrderState.DRAFT, }) state: PurchaseOrderState; async send() { if (this.state !== PurchaseOrderState.DRAFT) { throw new Error('Only draft orders can be sent'); } this.state = PurchaseOrderState.SENT; await this.save(); // Enviar email a proveedor } async approve() { if (this.state !== PurchaseOrderState.TO_APPROVE) { throw new Error('Order must be in "to approve" state'); } this.state = PurchaseOrderState.PURCHASE; await this.save(); // Crear movimientos de inventario } } ``` --- ### Ejemplo 2: Implementar Portal de Cliente **Consulta:** ```bash cd reference/odoo/addons/project/ cat views/project_portal_project_task_templates.xml | head -50 ``` **Observaciones:** - Portal muestra tareas filtradas por cliente - Permite comentarios - Muestra archivos adjuntos - Tiene permisos limitados (solo lectura de sus datos) **Implementación en nuestro proyecto:** - Crear ruta `/portal/projects` con autenticación - Filtrar proyectos por cliente logueado - Mostrar solo campos permitidos (ocultar costos internos) - Permitir comentarios en tareas - Permitir subir archivos --- ## ⚙️ INTEGRACIÓN CON AGENTES ### Architecture-Analyst El agente Architecture-Analyst usa estas referencias para: - Analizar implementaciones de referencia - Comparar patrones con documentación actual - Proponer mejoras arquitectónicas - Generar ADRs basados en patrones observados **Ver:** `orchestration/prompts/PROMPT-ARCHITECTURE-ANALYST.md` ### Backend-Agent Al implementar funcionalidades, Backend-Agent consulta: - Modelos de Odoo para estructura de datos - Lógica de negocio en métodos de clase - Validaciones y constraints - Integración entre módulos ### Frontend-Agent Consulta: - Vistas XML para entender UI/UX esperada - Flujos de usuario en portal views - Componentes JS en `static/src/` --- ## 📝 CONTRIBUIR MEJORAS Si encuentras patrones útiles en Odoo que no están documentados: 1. Analizar el patrón en profundidad 2. Documentar hallazgo en `reference/ODOO-MODULES-ANALYSIS.md` 3. Si es decisión arquitectónica importante, crear ADR en `docs/adr/` 4. Actualizar esta guía si aplica --- ## ✅ CONCLUSIÓN Las referencias de Odoo son una herramienta valiosa para: - ✅ Evitar errores de novato - ✅ Aprender patrones probados en producción - ✅ Acelerar desarrollo con ejemplos reales - ✅ Mejorar arquitectura del proyecto **Recuerda:** Odoo es una referencia, no un template para copiar. Entiende los conceptos y adapta a nuestro stack tecnológico. --- **Versión:** 1.0.0 **Fecha:** 2025-11-23 **Autor:** Architecture-Analyst **Próxima revisión:** Mensual