erp-construccion/orchestration/propagacion-fase8/FASE-2-ANALISIS-DETALLADO.md
rckrdmrd 7f422e51db
Some checks failed
CI Pipeline / Lint & Type Check (push) Has been cancelled
CI Pipeline / Validate SSOT Constants (push) Has been cancelled
CI Pipeline / Backend Tests (push) Has been cancelled
CI Pipeline / Frontend Tests (push) Has been cancelled
CI Pipeline / Build (push) Has been cancelled
CI Pipeline / Docker Build (push) Has been cancelled
feat: Documentation and orchestration updates
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-07 05:35:28 -06:00

583 lines
12 KiB
Markdown

# 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