erp-construccion/orchestration/propagacion-fase8/FASE-5-ANALISIS-DEPENDENCIAS.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

18 KiB

FASE 5: Análisis de Dependencias - ERP Construcción

Proyecto: erp-construccion Fecha: 2026-01-04 Estado: Completado Base: FASE-4-VALIDACION-PLAN.md


1. Inventario de Schemas Existentes

1.1 Estructura Actual

# Archivo DDL Schema Tablas Líneas
1 01-construction-schema-ddl.sql construction 24 903
2 02-hr-schema-ddl.sql hr 3 156
3 03-hse-schema-ddl.sql hse 58 1,268
4 04-estimates-schema-ddl.sql estimates 8 415
5 05-infonavit-schema-ddl.sql infonavit 8 413
6 06-inventory-ext-schema-ddl.sql inventory 4 213
7 07-purchase-ext-schema-ddl.sql purchase 5 227
Total 7 schemas 110 3,595

1.2 Orden de Ejecución Actual

1. auth (ERP-Core)
2. core (ERP-Core)
3. construction (01-construction-schema-ddl.sql)
4. hr (02-hr-schema-ddl.sql)
5. hse (03-hse-schema-ddl.sql)
6. estimates (04-estimates-schema-ddl.sql)
7. infonavit (05-infonavit-schema-ddl.sql)
8. inventory (06-inventory-ext-schema-ddl.sql)
9. purchase (07-purchase-ext-schema-ddl.sql)

2. Dependencias con ERP-Core

2.1 Tablas Core Requeridas

Tabla Core Usado Por Estado
auth.tenants Todas las tablas Requerido
auth.users created_by, approved_by, etc. Requerido
core.partners Proveedores, contratistas ⚠️ Verificar
core.companies company_id opcional ⚠️ Verificar
core.currencies currency_id ⚠️ Verificar
core.countries origin_country_id ⚠️ Verificar
core.addresses address_id ⚠️ Verificar
financial.payment_terms payment_term_id ⚠️ Verificar
financial.accounts account_id ⚠️ Verificar
inventory.products product_id ⚠️ Verificar
inventory.categories category_id ⚠️ Verificar
inventory.locations location_id ⚠️ Verificar
inventory.warehouses warehouse_id ⚠️ Verificar
inventory.stock_pickings picking_id ⚠️ Verificar
inventory.stock_moves stock_move_id ⚠️ Verificar
hr.contracts contract_id ⚠️ Verificar
projects.projects project_id ⚠️ Verificar

2.2 Verificación de Existencia

Acción: Las FKs a tablas ERP-Core deben usar referencias opcionales (sin ON DELETE CASCADE) para permitir instalación sin ERP-Core completo.

Patrón Recomendado:

-- En lugar de:
partner_id UUID NOT NULL REFERENCES core.partners(id)

-- Usar:
partner_id UUID -- FK a core.partners (ERP-Core) - opcional

3. Dependencias Internas del Proyecto

3.1 Mapa de Dependencias

construction.fraccionamientos
  ├── construction.etapas
  │   ├── construction.manzanas
  │   │   └── construction.lotes
  │   └── construction.torres
  │       └── construction.niveles
  │           └── construction.departamentos
  ├── construction.presupuestos
  │   └── construction.presupuesto_partidas
  ├── construction.programa_obra
  │   └── construction.programa_actividades
  ├── construction.bitacora_obra
  ├── inventory.almacenes_proyecto
  └── hr.employee_fraccionamientos

3.2 HALLAZGO CRÍTICO

No existe tabla construction.proyectos

El proyecto usa construction.fraccionamientos como entidad principal de proyecto.

Impacto:

  • El plan FASE-3 referencia construction.proyectos
  • Debe cambiarse a construction.fraccionamientos
  • La tabla avance_programado debe referenciar fraccionamiento_id

Resolución:

-- Cambiar de:
proyecto_id UUID REFERENCES construction.proyectos(id)

-- A:
fraccionamiento_id UUID REFERENCES construction.fraccionamientos(id)

3.3 Tabla de Partidas

Hallazgo: No existe tabla construction.partidas individual.

Tablas relacionadas existentes:

  • construction.presupuesto_partidas - Líneas de presupuesto
  • construction.contrato_partidas - Líneas de contrato

Resolución para trigger de conteo:

  • El trigger update_proyecto_partida_count no aplica directamente
  • Adaptar para contar presupuesto_partidas o avances_obra

4. Análisis de FK por Tabla Nueva

4.1 financial.payment_term_lines

FK Tabla Destino Existe en Proyecto Existe en Core
tenant_id auth.tenants
payment_term_id financial.payment_terms ⚠️ Verificar

Acción: Hacer FK opcional o crear tabla si no existe.

4.2 financial.incoterms

FK Tabla Destino Existe Notas
(ninguna) - - Tabla catálogo standalone

Acción: Sin dependencias.

4.3 financial.payment_methods

FK Tabla Destino Existe en Proyecto Existe en Core
tenant_id auth.tenants

Acción: Sin problemas.

4.4 financial.reconcile_models

FK Tabla Destino Existe en Proyecto Existe en Core
tenant_id auth.tenants
company_id core.companies ⚠️ Verificar

Acción: FK opcional a core.companies.

4.5 financial.reconcile_model_lines

FK Tabla Destino Existe en Proyecto Existe en Core
model_id financial.reconcile_models Crear primero -
account_id financial.accounts ⚠️ Verificar

Acción: Crear reconcile_models antes. FK opcional a accounts.

4.6 projects.collaborators

FK Tabla Destino Existe en Proyecto Existe en Core
tenant_id auth.tenants
project_id projects.projects ⚠️ Verificar
partner_id core.partners ⚠️ Verificar
user_id auth.users

Acción:

  • Adaptar para usar fraccionamiento_id en lugar de project_id
  • FK opcional a core.partners

4.7 projects.ratings

FK Tabla Destino Existe en Proyecto Existe en Core
tenant_id auth.tenants
partner_id core.partners ⚠️ Verificar

Acción: FK opcional.

4.8 construction.avance_programado

FK Tabla Destino Existe Notas
tenant_id auth.tenants
fraccionamiento_id construction.fraccionamientos Adaptado de proyecto_id

Acción: Sin problemas.

4.9 construction.ubicaciones_obra

FK Tabla Destino Existe Notas
tenant_id auth.tenants
work_location_id hr.work_locations Crear primero
fraccionamiento_id construction.fraccionamientos Adaptado

Acción: Crear hr.work_locations antes.

4.10 hr.work_locations

FK Tabla Destino Existe en Proyecto Existe en Core
tenant_id auth.tenants
company_id core.companies ⚠️ Opcional
address_id core.addresses ⚠️ Opcional

Acción: FKs opcionales.

4.11 hr.skill_types, skills, skill_levels

FK Tabla Destino Existe Notas
tenant_id auth.tenants
skill_type_id hr.skill_types Crear primero Orden: types → skills/levels

Acción: Crear skill_types antes que skills y skill_levels.

4.12 hr.employee_skills

FK Tabla Destino Existe Notas
employee_id hr.employees
skill_id hr.skills Crear primero
skill_level_id hr.skill_levels Crear primero

Acción: Crear skills y levels antes.

4.13 hr.expense_sheets

FK Tabla Destino Existe Notas
tenant_id auth.tenants
company_id core.companies ⚠️ Opcional
employee_id hr.employees
currency_id core.currencies ⚠️ Opcional

Acción: FKs opcionales a core.

4.14 hr.expenses

FK Tabla Destino Existe Notas
tenant_id auth.tenants
expense_sheet_id hr.expense_sheets Crear primero
employee_id hr.employees
product_id inventory.products ⚠️ Opcional
currency_id core.currencies ⚠️ Opcional

Acción: Crear expense_sheets antes. FKs opcionales a core/inventory.

4.15 hr.employee_resume_lines

FK Tabla Destino Existe Notas
employee_id hr.employees

Acción: Sin problemas.

4.16 hr.payslip_structures

FK Tabla Destino Existe Notas
tenant_id auth.tenants

Acción: Sin problemas.

4.17 hr.payslips

FK Tabla Destino Existe Notas
tenant_id auth.tenants
company_id core.companies ⚠️ Opcional
employee_id hr.employees
contract_id hr.contracts ⚠️ Verificar
structure_id hr.payslip_structures Crear primero

Acción: Crear structures antes. FK opcional a contracts.

4.18 hr.payslip_lines

FK Tabla Destino Existe Notas
payslip_id hr.payslips Crear primero

Acción: Crear payslips antes.

4.19 inventory.* (nuevas)

FK Tabla Destino Existe Notas
tenant_id auth.tenants
location_id inventory.locations ⚠️ Opcional (Core)
product_id inventory.products ⚠️ Opcional (Core)
category_id inventory.categories ⚠️ Opcional (Core)

Acción: FKs opcionales a tablas inventory de Core.

4.20 purchase.product_supplierinfo

FK Tabla Destino Existe Notas
tenant_id auth.tenants
company_id core.companies ⚠️ Opcional
partner_id core.partners ⚠️ Opcional
product_id inventory.products ⚠️ Opcional
currency_id core.currencies ⚠️ Opcional

Acción: FKs opcionales.


5. Orden de Ejecución de Scripts

5.1 Orden Correcto para Nuevas Tablas

FASE A: ENUMs (sin dependencias)
├── financial.payment_method_type
├── financial.reconcile_model_type
├── hr.expense_status
├── hr.resume_line_type
└── hr.payslip_status

FASE B: Tablas Catálogo (sin dependencias)
├── financial.incoterms
└── inventory.removal_strategies

FASE C: Tablas Financial
├── financial.payment_term_lines
├── financial.payment_methods
├── financial.reconcile_models
└── financial.reconcile_model_lines

FASE D: Tablas Inventory
├── inventory.package_types
├── inventory.packages
├── inventory.storage_categories
└── inventory.putaway_rules

FASE E: Tablas Purchase
└── purchase.product_supplierinfo

FASE F: Tablas HR (orden de dependencia)
├── 1. hr.work_locations
├── 2. hr.skill_types
├── 3. hr.skills
├── 4. hr.skill_levels
├── 5. hr.employee_skills
├── 6. hr.expense_sheets
├── 7. hr.expenses
├── 8. hr.employee_resume_lines
├── 9. hr.payslip_structures
├── 10. hr.payslips
└── 11. hr.payslip_lines

FASE G: Extensión Construcción
├── 1. construction.ubicaciones_obra (requiere hr.work_locations)
└── 2. construction.avance_programado

FASE H: Tablas Projects (adaptadas)
├── projects.collaborators (adaptado a fraccionamientos)
└── projects.ratings

FASE I: Campos adicionales
├── ALTER TABLE financial.journal_entries
├── ALTER TABLE financial.payments
├── ALTER TABLE inventory.products
├── ALTER TABLE purchase.orders
├── ALTER TABLE construction.fraccionamientos
└── ALTER TABLE hr.employees

FASE J: Funciones y Triggers
├── construction.update_fraccionamiento_avance()
├── construction.generate_avance_snapshot()
└── purchase.action_create_stock_moves()

FASE K: Seed Data
├── Incoterms (11 registros)
├── Removal strategies (4 registros)
├── Skill types construcción (9 registros)
├── Skill levels (36 registros)
├── Skills específicos (~25 registros)
├── Storage categories (5 registros)
├── Package types (6 registros)
└── Payment methods (7 registros)

6. Riesgos Identificados

6.1 Riesgos Altos

# Riesgo Impacto Mitigación
R1 FK a tablas Core inexistentes Alto Usar FKs opcionales (sin constraint)
R2 ENUMs duplicados con Core Alto Verificar antes de crear, usar IF NOT EXISTS
R3 Tabla proyectos no existe Alto Adaptar a fraccionamientos

6.2 Riesgos Medios

# Riesgo Impacto Mitigación
R4 Estructura hr.employees diferente Medio Usar ALTER con IF NOT EXISTS
R5 Trigger en tabla inexistente Medio Usar DO con verificación
R6 Conflicto de políticas RLS Medio DROP POLICY IF EXISTS antes de CREATE

6.3 Riesgos Bajos

# Riesgo Impacto Mitigación
R7 Seed data duplicado Bajo ON CONFLICT DO NOTHING
R8 Índices duplicados Bajo CREATE INDEX IF NOT EXISTS

7. Adaptaciones Requeridas al Plan

7.1 Cambios Críticos

# Elemento Original Cambio Requerido
1 proyecto_id FK Cambiar a fraccionamiento_id
2 construction.proyectos Usar construction.fraccionamientos
3 construction.partidas Adaptar para presupuesto_partidas o avances_obra
4 Trigger conteo partidas Adaptar para contar avances_obra por fraccionamiento

7.2 Cambios en Tablas

avance_programado:

-- Antes:
proyecto_id UUID REFERENCES construction.proyectos(id)

-- Después:
fraccionamiento_id UUID REFERENCES construction.fraccionamientos(id)

collaborators (adaptar):

-- Crear versión específica para construcción
CREATE TABLE IF NOT EXISTS construction.colaboradores_obra (
  id UUID PRIMARY KEY,
  tenant_id UUID NOT NULL REFERENCES auth.tenants(id),
  fraccionamiento_id UUID NOT NULL REFERENCES construction.fraccionamientos(id),
  partner_id UUID,  -- FK opcional a core.partners
  user_id UUID REFERENCES auth.users(id),
  rol VARCHAR(50),
  ...
);

7.3 Cambios en Funciones

Trigger adaptado:

-- En lugar de contar partidas, contar avances_obra
CREATE OR REPLACE FUNCTION construction.update_fraccionamiento_avance()
RETURNS TRIGGER AS $$
BEGIN
  -- Actualizar conteos en fraccionamiento basado en avances_obra
  UPDATE construction.fraccionamientos
  SET avance_count = (
    SELECT COUNT(*) FROM construction.avances_obra
    WHERE fraccionamiento_id = NEW.fraccionamiento_id
  )
  WHERE id = NEW.fraccionamiento_id;
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

8. Matriz de Dependencias Final

8.1 Dependencias Externas (ERP-Core)

Tabla Nueva Requiere de Core Estrategia
payment_term_lines financial.payment_terms FK opcional
reconcile_models core.companies FK opcional
reconcile_model_lines financial.accounts FK opcional
collaborators core.partners FK opcional
expense_sheets core.companies, currencies FK opcional
expenses inventory.products, currencies FK opcional
payslips hr.contracts FK opcional
product_supplierinfo core.partners, inventory.products FK opcional
putaway_rules inventory.locations, products FK opcional
packages inventory.locations FK opcional

8.2 Dependencias Internas (Orden)

1. ENUMs
2. Tablas catálogo (incoterms, removal_strategies)
3. financial.payment_methods, reconcile_models
4. financial.reconcile_model_lines (depende de reconcile_models)
5. financial.payment_term_lines
6. inventory.* (package_types → packages, storage_categories → putaway_rules)
7. hr.work_locations
8. construction.ubicaciones_obra (depende de work_locations)
9. hr.skill_types → hr.skills, hr.skill_levels
10. hr.employee_skills (depende de skills, levels)
11. hr.expense_sheets → hr.expenses
12. hr.employee_resume_lines
13. hr.payslip_structures → hr.payslips → hr.payslip_lines
14. purchase.product_supplierinfo
15. construction.avance_programado
16. construction.colaboradores_obra
17. projects.ratings
18. Campos adicionales (ALTERs)
19. Funciones y triggers
20. Seed data

9. Checklist de Validación Pre-Ejecución

  • Verificar que auth.tenants existe
  • Verificar que auth.users existe
  • Verificar que construction.fraccionamientos existe
  • Verificar que hr.employees existe
  • Verificar estructura actual de hr.employees (campos existentes)
  • Verificar si ENUMs ya existen en ERP-Core
  • Confirmar que no hay conflictos de nombres de tablas
  • Verificar permisos de creación de schemas

10. Resumen Ejecutivo

10.1 Hallazgos Principales

  1. No existe construction.proyectos - Se usa construction.fraccionamientos
  2. No existe construction.partidas como tabla independiente
  3. Múltiples FKs opcionales a tablas de ERP-Core
  4. ENUMs pueden existir en ERP-Core, requiere verificación

10.2 Decisiones de Diseño

  1. Usar FKs sin REFERENCES para tablas opcionales de Core
  2. Adaptar proyecto_idfraccionamiento_id en todo el plan
  3. Crear tabla colaboradores_obra en lugar de usar projects.collaborators
  4. Usar IF NOT EXISTS en todos los CREATE

10.3 Impacto en FASE-3

El plan FASE-3 requiere actualización en:

  • Todas las referencias a proyecto_id
  • Todas las referencias a construction.proyectos
  • Trigger de conteo de partidas
  • Función de snapshot de avance

Estado: FASE 5 COMPLETADA Siguiente: FASE 6 - Refinamiento del Plan Fecha: 2026-01-04