# Mapeo Odoo - ERP Construccion

**Version:** 1.0.0
**Fecha:** 2025-12-05
**Responsable:** Requirements-Analyst

---

## Resumen

Este documento detalla el mapeo entre los modulos de Odoo Community y los modulos del ERP Construccion, incluyendo que funcionalidades se adoptan, adaptan o crean desde cero.

---

## Matriz de Mapeo por Modulo

### MAI-001: Autenticacion y Multi-tenancy

| Funcionalidad | Modulo Odoo | Estrategia | Notas |
|---------------|-------------|------------|-------|
| Login/Logout | `auth_signup`, `base` | Adaptar | JWT en lugar de sesiones |
| Multi-company | `base.res_company` | Adaptar | Schema-level RLS vs company_id |
| Roles y permisos | `base.res_groups` | Crear nuevo | RBAC con claims personalizados |
| 2FA | `auth_totp` | Adoptar patron | Implementar TOTP compatible |
| SSO | No nativo | Crear nuevo | SAML/OIDC para enterprise |

**Patrones Adoptados:**
- Concepto de `company_id` como filtro global
- Grupos de permisos jerarquicos
- Modelo de usuario con partner asociado

---

### MAI-002: Gestion de Proyectos

| Funcionalidad | Modulo Odoo | Estrategia | Notas |
|---------------|-------------|------------|-------|
| Proyectos | `project.project` | Adoptar | Extender con campos construccion |
| Tareas | `project.task` | Adaptar | Convertir en actividades de obra |
| Stages | `project.task.type` | Adoptar | Personalizar para construccion |
| Milestones | `project.milestone` | Adoptar | Hitos de obra |
| Team | `project.tags` | Crear nuevo | Equipo de proyecto dedicado |

**Mapeo de Estados:**
```
Odoo: draft -> open -> pending -> done -> cancel
Ours: PLANNING -> IN_PROGRESS -> PAUSED -> COMPLETED -> CANCELLED
```

**Campos Adicionales (no en Odoo):**
- `progress_percentage` - Avance calculado
- `development_id` - Vinculo con desarrollo inmobiliario
- `infonavit_registration` - Registro INFONAVIT
- `contractor_id` - Contratista principal

---

### MAI-003: Presupuestos y APU

| Funcionalidad | Modulo Odoo | Estrategia | Notas |
|---------------|-------------|------------|-------|
| Catalogo conceptos | No existe | Crear nuevo | Catalogo CMIC base |
| APU (Analisis Precios) | No existe | Crear nuevo | Formato mexicano |
| Presupuesto base | `account.budget` | Referencia | Concepto similar, diferente impl |
| Partidas | No existe | Crear nuevo | Jerarquia de costos |
| Versiones | No existe | Crear nuevo | Control de versiones |

**Estructura APU (Creacion propia):**
```
BudgetItem (Partida)
├── concept_code
├── description
├── unit
├── quantity
├── unit_price (compuesto de):
│   ├── materials[]
│   ├── labor[]
│   ├── equipment[]
│   └── indirect_costs
└── total_amount
```

---

### MAI-004: Compras e Inventario

| Funcionalidad | Modulo Odoo | Estrategia | Notas |
|---------------|-------------|------------|-------|
| Ordenes de compra | `purchase.order` | Adoptar | Estados identicos |
| Lineas de compra | `purchase.order.line` | Adoptar | Con proyecto vinculado |
| Proveedores | `res.partner` (supplier) | Adoptar | Con campos adicionales |
| Almacenes | `stock.warehouse` | Adoptar | Multi-almacen por proyecto |
| Movimientos | `stock.move` | Adoptar | Trazabilidad completa |
| Inventario | `stock.quant` | Adoptar | Stock actual calculado |
| Requisiciones | `purchase.requisition` | Adoptar | Flujo de requisicion |

**Estados de Orden de Compra:**
```
Odoo:  draft -> sent -> to_approve -> purchase -> done -> cancel
Ours:  DRAFT -> SENT -> TO_APPROVE -> APPROVED -> RECEIVED -> CANCELLED
```

**Campos Adicionales:**
- `project_id` - Vinculo con proyecto
- `budget_item_id` - Partida de presupuesto
- `cost_center` - Centro de costos

---

### MAI-005: Avances de Obra

| Funcionalidad | Modulo Odoo | Estrategia | Notas |
|---------------|-------------|------------|-------|
| Registro avances | No existe | Crear nuevo | % completado por actividad |
| Curva S | No existe | Crear nuevo | Grafico planeado vs real |
| Cronograma | `project.task` (dates) | Adaptar | Extender con Gantt |
| Evidencia fotografica | No existe | Crear nuevo | Fotos con geolocalizacion |

**Modelo de Avance (Creacion propia):**
```
ProgressEntry
├── activity_id
├── report_date
├── planned_percentage
├── actual_percentage
├── quantity_completed
├── photos[] (with GPS)
└── notes
```

---

### MAI-006: Finanzas y Contabilidad

| Funcionalidad | Modulo Odoo | Estrategia | Notas |
|---------------|-------------|------------|-------|
| Plan de cuentas | `account.account` | Adaptar | Cuenta contable mexicana |
| Polizas | `account.move` | Adoptar | Journal entries |
| Lineas contables | `account.move.line` | Adoptar | Con cuenta analitica |
| Cuenta analitica | `account.analytic` | Adoptar | Por proyecto |
| Facturas | `account.move` (invoice) | Adaptar | CFDI requerido |
| Pagos | `account.payment` | Adoptar | Multiples metodos |
| Conciliacion | `account.bank.statement` | Adoptar | Conciliacion bancaria |

**Integracion CFDI (Creacion propia):**
- PAC integration
- Timbrado automatico
- Descarga masiva SAT
- Cancelacion CFDI

---

### MAI-007: Nomina

| Funcionalidad | Modulo Odoo | Estrategia | Notas |
|---------------|-------------|------------|-------|
| Empleados | `hr.employee` | Adoptar | Con CURP, RFC, IMSS |
| Contratos | `hr.contract` | Adoptar | Tipos mexicanos |
| Nomina | `hr.payslip` | Referencia | Muy diferente, crear nuevo |
| Percepciones/Ded | No compatible | Crear nuevo | Ley mexicana |
| IMSS | No existe | Crear nuevo | SUA compatible |
| ISN | No existe | Crear nuevo | Impuesto estatal |

**Nota:** La nomina mexicana difiere significativamente de Odoo. Se toma como referencia la arquitectura pero se implementa logica propia para:
- Tabla ISR
- Calculo IMSS patron/trabajador
- PTU
- Aguinaldo
- Prima vacacional

---

### MAI-008: Estimaciones INFONAVIT

| Funcionalidad | Modulo Odoo | Estrategia | Notas |
|---------------|-------------|------------|-------|
| Todo el modulo | No existe | Crear nuevo | 100% propietario |

**Funcionalidades propias:**
- Generacion de estimaciones por vivienda
- Calculo automatico de avances
- Formato INFONAVIT oficial
- Validacion de requisitos
- Envio electronico

---

### MAI-009: Calidad

| Funcionalidad | Modulo Odoo | Estrategia | Notas |
|---------------|-------------|------------|-------|
| Puntos de control | `quality.point` | Adoptar | Checklist de calidad |
| Inspecciones | `quality.check` | Adoptar | Con evidencia |
| No conformidades | `quality.alert` | Adoptar | Workflow de correccion |
| Acciones correctivas | No nativo completo | Crear nuevo | CAPA process |

---

### MAI-010: Portal Derechohabientes

| Funcionalidad | Modulo Odoo | Estrategia | Notas |
|---------------|-------------|------------|-------|
| Portal base | `portal` | Referencia | UI completamente diferente |
| Autenticacion | `auth_signup` | Referencia | Con CURP validation |
| Documentos | `documents` | Referencia | Firma electronica NOM-151 |

**Funcionalidades propias:**
- Vinculacion por NSS INFONAVIT
- Estado de vivienda
- Documentos de entrega
- Citas de entrega
- Garantias post-venta

---

### MAI-011: Cumplimiento INFONAVIT

| Funcionalidad | Modulo Odoo | Estrategia | Notas |
|---------------|-------------|------------|-------|
| Todo el modulo | No existe | Crear nuevo | 100% propietario |

**Funcionalidades propias:**
- Catalogo de requisitos por programa
- Checklist de cumplimiento
- Evidencia documental
- Auditorias de verificacion
- Alertas de vencimiento

---

### MAE-014: Modulo Financiero Avanzado

| Funcionalidad | Modulo Odoo | Estrategia | Notas |
|---------------|-------------|------------|-------|
| CxP avanzado | `account` | Extender | Flujos de aprobacion |
| CxC avanzado | `account` | Extender | Cobranza automatizada |
| Flujo de caja | No nativo | Crear nuevo | Proyeccion y control |
| Presupuesto financiero | `account.budget` | Adaptar | Por proyecto |
| Reportes SAT | No existe | Crear nuevo | DIOT, Balanza, etc |

---

### MAE-015: Gestion de Activos

| Funcionalidad | Modulo Odoo | Estrategia | Notas |
|---------------|-------------|------------|-------|
| Catalogo activos | `account.asset` | Adoptar | Registro de activos |
| Depreciacion | `account.asset` | Adoptar | Metodos mexicanos |
| Mantenimiento | `maintenance.request` | Adoptar | Preventivo/correctivo |
| Ordenes trabajo | `maintenance.request` | Extender | Workflow completo |
| GPS/Geofence | No existe | Crear nuevo | Tracking en tiempo real |

---

### MAE-016: Gestion Documental

| Funcionalidad | Modulo Odoo | Estrategia | Notas |
|---------------|-------------|------------|-------|
| Carpetas | `documents.folder` | Adoptar | Estructura jerarquica |
| Documentos | `documents.document` | Adoptar | Con versionado |
| Tags | `documents.tag` | Adoptar | Categorizacion |
| Workflow | `documents.workflow` | Referencia | Aprobaciones custom |
| Planos | No existe | Crear nuevo | Gestion de revisiones |

---

## Patrones Arquitectonicos de Odoo Adoptados

### 1. State Machine Pattern

Todos los documentos principales usan estados:
```python
# Odoo pattern
state = fields.Selection([
    ('draft', 'Draft'),
    ('confirm', 'Confirmed'),
    ('done', 'Done'),
    ('cancel', 'Cancelled')
])
```

```typescript
// Our adaptation
enum DocumentStatus {
  DRAFT = 'draft',
  CONFIRMED = 'confirmed',
  DONE = 'done',
  CANCELLED = 'cancelled'
}
```

### 2. Analytic Distribution

Costos distribuidos entre proyectos/centros:
```python
# Odoo
analytic_distribution = fields.Json()
# {"project_1_id": 60, "project_2_id": 40}
```

```typescript
// Our adaptation
@Column('jsonb')
analyticDistribution: Record<string, number>;
```

### 3. Mail Thread (Audit Trail)

Tracking de cambios en entidades:
```python
# Odoo
_inherit = ['mail.thread']
name = fields.Char(tracking=True)
```

```typescript
// Our adaptation
@EventSubscriber()
class AuditTrailSubscriber {
  @AfterUpdate()
  logChanges(event: UpdateEvent) { }
}
```

### 4. Computed Fields with Store

Campos calculados que se almacenan:
```python
# Odoo
@api.depends('line_ids.amount')
def _compute_total(self):
    self.total = sum(self.line_ids.mapped('amount'))

total = fields.Float(compute='_compute_total', store=True)
```

```typescript
// Our adaptation
@BeforeInsert()
@BeforeUpdate()
computeTotal() {
  this.total = this.lines.reduce((sum, l) => sum + l.amount, 0);
}
```

---

## Modulos Odoo No Utilizados

Los siguientes modulos de Odoo no aplican directamente:

| Modulo | Razon |
|--------|-------|
| `website`, `website_sale` | Frontend custom en React |
| `crm` | No requerido para construccion |
| `mrp` | Manufactura no aplica |
| `fleet` | Activos propios implementados |
| `event` | No requerido |
| `pos` | No requerido |
| `lunch` | No requerido |
| `l10n_*` | Localizacion propia para Mexico |

---

## Referencias

- [GUIA-USO-REFERENCIAS-ODOO.md](../../GUIA-USO-REFERENCIAS-ODOO.md)
- [Odoo Developer Documentation](https://www.odoo.com/documentation)
- [Backend Specifications](../../05-backend-specs/)

---

*Ultima actualizacion: 2025-12-05*
