# 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