# FASE 2: Análisis Detallado - ERP Construcción

**Proyecto:** erp-construccion
**Fecha:** 2026-01-04
**Estado:** Completado
**Base:** FASE-1-ANALISIS-INICIAL.md

---

## 1. Análisis por Corrección Aplicable

### 1.1 FINANCIAL (COR-035 a COR-039)

#### COR-035: Payment Term Lines

**Tabla Core:**
```sql
financial.payment_term_lines (
  id, payment_term_id, sequence, value, value_amount,
  days, day_of_month, end_month, created_at
)
```

**Adaptación Construcción:**
- Aplicable para términos de pago de estimaciones
- Ejemplo: 30% anticipo, 70% contra estimación
- Campos adicionales sugeridos:
  - `applies_to` VARCHAR(50) - 'anticipo', 'estimacion', 'retencion'

**Dependencias:**
- `financial.payment_terms` (debe existir en core)

---

#### COR-036: Incoterms

**Tabla Core:**
```sql
financial.incoterms (
  id, code, name, is_active, created_at
)
```

**Adaptación Construcción:**
- Aplicable para importación de maquinaria/materiales especiales
- Usar tabla del core directamente (no extender)

**Datos Seed:** Usar seed del core (11 incoterms estándar)

---

#### COR-037: Payment Methods

**Tabla Core:**
```sql
financial.payment_methods (
  id, name, code, payment_type, is_active, created_at
)
```

**Adaptación Construcción:**
- Métodos de pago específicos de construcción:
  - Transferencia bancaria (anticipo)
  - Cheque (estimaciones)
  - Factoring (financiamiento)

**Seed Data Construcción:**
```sql
('Anticipo de Obra', 'anticipo_obra', 'outbound')
('Pago Estimación', 'pago_estimacion', 'outbound')
('Pago Destajo', 'pago_destajo', 'outbound')
```

---

#### COR-038: Reconcile Models

**Tabla Core:**
```sql
financial.reconcile_models (...)
financial.reconcile_model_lines (...)
```

**Adaptación Construcción:**
- Parcialmente aplicable
- Útil para conciliación de estimaciones vs facturas
- Crear reglas específicas:
  - Conciliación anticipo-amortización
  - Conciliación estimación-factura

---

#### COR-039: Campos Adicionales

**Campos en journal_entries:**
- `payment_state` ✅ Aplicable
- `amount_residual` ✅ Para saldo estimaciones
- `invoice_date_due` ✅ Vencimiento estimaciones
- `incoterm_id` ⚠️ Solo importaciones

**Campos en payments:**
- `is_matched` ✅ Conciliación
- `partner_bank_id` ✅ Cuenta contratista

---

### 1.2 INVENTORY (COR-040 a COR-044)

#### COR-040: Packages

**Tablas Core:**
```sql
inventory.package_types (
  id, tenant_id, name, sequence, height, width, length,
  base_weight, max_weight, barcode, created_at
)

inventory.packages (
  id, tenant_id, name, package_type_id, shipping_weight,
  location_id, created_at
)
```

**Adaptación Construcción:**
- Muy útil para materiales empacados:
  - Tarimas de block
  - Paquetes de varilla
  - Rollos de cable

**Seed Data Construcción:**
```sql
-- Tipos de paquete
('Tarima Block', 150.0, 100.0, 100.0, 5.0, 500.0)
('Paquete Varilla', 600.0, 30.0, 30.0, 2.0, 1000.0)
('Rollo Cable', 50.0, 50.0, 20.0, 0.5, 50.0)
```

---

#### COR-041: Putaway Rules

**Tabla Core:**
```sql
inventory.putaway_rules (
  id, tenant_id, product_id, category_id,
  location_in_id, location_out_id, sequence,
  storage_category_id, company_id, is_active
)
```

**Adaptación Construcción:**
- Aplicable para almacenes de obra
- Reglas por tipo de material:
  - Cemento → Área techada
  - Varilla → Área descubierta
  - Acabados → Bodega cerrada

---

#### COR-042: Storage Categories

**Tabla Core:**
```sql
inventory.storage_categories (
  id, tenant_id, name, max_weight, allow_new_product
)
```

**Adaptación Construcción:**
```sql
('Área Techada', 10000.0, 'mixed')  -- Cemento, yeso
('Área Descubierta', 50000.0, 'mixed')  -- Varilla, block
('Bodega Cerrada', 5000.0, 'mixed')  -- Acabados, herrajes
('Caseta Herramienta', 500.0, 'same')  -- Herramienta menor
```

---

#### COR-043: Campos Adicionales en Products

**Campos Aplicables:**
```yaml
tracking: "lot"  # Para lotes de concreto, acero
sale_ok: false  # Materiales no se venden
purchase_ok: true
volume: "Para transporte"
weight: "Para carga"
hs_code: "Para importación"
origin_country_id: "Procedencia material"
```

---

#### COR-044: Removal Strategies

**Seed Core:** FIFO, LIFO, FEFO, Closest

**Uso en Construcción:**
- FIFO: Cemento, perecederos
- Closest: Herramienta
- FEFO: Materiales con caducidad (selladores)

---

### 1.3 PURCHASE (COR-045 a COR-047)

#### COR-045: Product Supplierinfo

**Tabla Core:**
```sql
purchase.product_supplierinfo (
  id, tenant_id, company_id, partner_id, product_id,
  product_name, product_code, sequence, min_qty,
  price, currency_id, delay, date_start, date_end
)
```

**Adaptación Construcción:**
- Crítico para:
  - Catálogo de proveedores por material
  - Precios pactados por proyecto
  - Lead times de materiales

**Campos Adicionales Sugeridos:**
```sql
proyecto_id UUID  -- Precio por proyecto
aplica_iva BOOLEAN  -- Si el precio incluye IVA
flete_incluido BOOLEAN  -- Si incluye flete
```

---

#### COR-046: PO Additional Fields

**Campos Aplicables:**
```yaml
origin: "Requisición de obra REQ-001"
partner_ref: "Cotización proveedor"
date_approve: "Fecha aprobación"
receipt_status: "pending/partial/received"
incoterm_id: "Para importaciones"
```

---

#### COR-047: action_create_stock_moves

**Función Core:**
```sql
purchase.action_create_stock_moves(p_order_id UUID)
RETURNS UUID  -- picking_id
```

**Uso en Construcción:**
- Crear recepciones desde OC
- Asignar almacén de obra destino
- Generar movimientos por línea

---

### 1.4 PROJECTS (COR-056 a COR-060)

#### COR-056: Project Collaborators

**Tabla Core:**
```sql
projects.collaborators (
  id, project_id, partner_id, user_id,
  can_read, can_write, created_at, invited_by
)
```

**Adaptación Construcción:**
- Colaboradores de obra:
  - Supervisor de INFONAVIT
  - Perito de calidad
  - Representante cliente

**Extensión Sugerida:**
```sql
rol VARCHAR(50)  -- 'supervisor', 'perito', 'representante'
vigencia_desde DATE
vigencia_hasta DATE
```

---

#### COR-057: Project Additional Fields

**Campos Aplicables a construction.proyectos:**
```yaml
sequence: "Orden de visualización"
is_favorite: "Proyectos destacados"
task_count: "Partidas del proyecto"
open_task_count: "Partidas pendientes"
closed_task_count: "Partidas completadas"
last_update_status: "on_track/at_risk/off_track"
```

---

#### COR-058: Task Count Trigger

**Función Core:**
```sql
projects.update_project_task_count()
TRIGGER: AFTER INSERT OR UPDATE OR DELETE ON projects.tasks
```

**Adaptación:**
- Crear trigger similar en construction.partidas
- Actualizar conteos en construction.presupuestos

---

#### COR-059: Project Ratings

**Tabla Core:**
```sql
projects.ratings (
  id, tenant_id, res_model, res_id,
  rating, feedback, partner_id, create_date
)
```

**Uso en Construcción:**
- Calificación de proveedores por obra
- Evaluación de contratistas
- Retroalimentación de cliente

---

#### COR-060: Burndown Chart Data

**Tabla Core:**
```sql
projects.burndown_chart_data (
  id, project_id, date,
  total_tasks, completed_tasks, remaining_tasks,
  total_hours, completed_hours, remaining_hours
)
```

**Adaptación Construcción:**
```sql
CREATE TABLE construction.avance_programado (
  id UUID PRIMARY KEY,
  proyecto_id UUID REFERENCES construction.proyectos(id),
  fecha DATE NOT NULL,

  -- Avance físico
  total_partidas INTEGER,
  partidas_completadas INTEGER,
  partidas_pendientes INTEGER,

  -- Avance financiero
  presupuesto_total DECIMAL(20,2),
  ejercido DECIMAL(20,2),
  por_ejercer DECIMAL(20,2),

  -- Porcentajes
  avance_fisico_pct DECIMAL(5,2),
  avance_financiero_pct DECIMAL(5,2),

  UNIQUE(proyecto_id, fecha)
);
```

---

### 1.5 HR (COR-061 a COR-066)

#### COR-061: Employee Additional Fields

**Campos Aplicables:**
```yaml
# Datos de obra
work_location_id: "Frente de obra asignado"
badge_id: "Gafete de obra"
pin: "PIN para entrada"
barcode: "Código para asistencia"

# Documentación
visa_no: "Para extranjeros"
work_permit_no: "Permiso trabajo"
certificate: "Nivel educativo"

# Adicionales
vehicle: "Vehículo asignado"
vehicle_license_plate: "Placas"
km_home_work: "Distancia a obra"
```

---

#### COR-062: Work Locations

**Tabla Core:**
```sql
hr.work_locations (
  id, tenant_id, company_id, name,
  location_type, address_id, is_active
)
```

**Adaptación Construcción:**
```sql
-- Extensión para obras
CREATE TABLE construction.ubicaciones_obra (
  id UUID PRIMARY KEY,
  work_location_id UUID REFERENCES hr.work_locations(id),
  proyecto_id UUID REFERENCES construction.proyectos(id),
  tipo VARCHAR(50),  -- 'frente', 'almacen', 'oficina_obra'
  coordenadas POINT,  -- Geocerca
  radio_metros INTEGER DEFAULT 100
);
```

---

#### COR-063: Skills System

**Tablas Core:**
```sql
hr.skill_types (id, tenant_id, name)
hr.skills (id, tenant_id, skill_type_id, name)
hr.skill_levels (id, tenant_id, skill_type_id, name, level)
hr.employee_skills (id, employee_id, skill_id, skill_level_id)
```

**Seed Data Construcción:**
```sql
-- Tipos de habilidad
INSERT INTO hr.skill_types VALUES
  ('Albañilería'),
  ('Plomería'),
  ('Electricidad'),
  ('Herrería'),
  ('Carpintería'),
  ('Acabados'),
  ('Maquinaria Pesada');

-- Niveles
INSERT INTO hr.skill_levels VALUES
  ('Ayudante', 1),
  ('Oficial', 2),
  ('Maestro', 3),
  ('Especialista', 4);

-- Habilidades específicas
INSERT INTO hr.skills VALUES
  -- Albañilería
  ('Cimentación'),
  ('Muros de block'),
  ('Losas'),
  ('Castillos y dalas'),
  -- Plomería
  ('Instalación hidráulica'),
  ('Instalación sanitaria'),
  ('Gas'),
  -- etc.
```

---

#### COR-064: Expense System

**Tablas Core:**
```sql
hr.expense_sheets (...)
hr.expenses (...)
```

**Uso en Construcción:**
- Gastos de residentes de obra
- Viáticos de supervisión
- Compras menores de caja chica

**Campos Adicionales:**
```sql
proyecto_id UUID  -- Asignar a proyecto
centro_costo VARCHAR(50)  -- Por frente/etapa
```

---

#### COR-065: Resume Lines

**Tabla Core:**
```sql
hr.employee_resume_lines (
  id, employee_id, name, date_start, date_end,
  line_type, company_name, job_title, ...
)
```

**Uso en Construcción:**
- Experiencia en obras anteriores
- Certificaciones (STPS, NOM)
- Cursos de seguridad

---

#### COR-066: Payslip Basics

**Tablas Core:**
```sql
hr.payslip_structures
hr.payslips
hr.payslip_lines
```

**Adaptación Construcción:**
- Estructura para pago a destajo
- Cálculo por rendimiento (m², ml, pza)
- Integración con hr.destajo existente

---

## 2. Matriz de Dependencias Detallada

### 2.1 Dependencias por Corrección

| Corrección | Depende de Core | Depende de Construcción |
|------------|-----------------|------------------------|
| COR-035 | payment_terms | - |
| COR-036 | - | - |
| COR-037 | - | - |
| COR-038 | accounts | - |
| COR-040 | locations | almacenes_proyecto |
| COR-041 | products, locations | - |
| COR-045 | partners, products | - |
| COR-056 | - | proyectos |
| COR-060 | - | proyectos, partidas |
| COR-062 | - | proyectos |
| COR-063 | employees | cuadrillas |
| COR-066 | employees, contracts | destajo |

---

## 3. Funciones Nuevas Requeridas

### 3.1 Funciones a Crear

| Función | Propósito | Basada en Core |
|---------|-----------|----------------|
| `construction.update_proyecto_avance()` | Actualizar conteos | COR-058 |
| `construction.generate_avance_snapshot()` | Burndown diario | COR-060 |
| `hr.calculate_destajo_amount()` | Cálculo destajo | Nueva |
| `purchase.create_reception_from_po()` | Recepción OC | COR-047 |

---

## 4. Resumen de Impacto

### 4.1 Por Módulo

| Módulo | Tablas Nuevas | Campos Nuevos | Funciones | Seed Data |
|--------|---------------|---------------|-----------|-----------|
| Financial | 4 | 8 | 0 | 3 |
| Inventory | 5 | 10 | 0 | 4 |
| Purchase | 1 | 6 | 1 | 0 |
| Projects/Construction | 3 | 12 | 2 | 0 |
| HR | 11 | 25 | 1 | 3 |
| **TOTAL** | **24** | **61** | **4** | **10** |

### 4.2 Esfuerzo Estimado

| Fase | Complejidad |
|------|-------------|
| DDL nuevos | Media |
| DDL modificados | Baja |
| Migraciones | Media |
| Seed data | Baja |
| Funciones | Media |
| Documentación | Baja |

---

**Estado:** FASE 2 COMPLETADA
**Siguiente:** FASE 3 - Plan de Implementación
**Fecha:** 2026-01-04
