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
🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
583 lines
12 KiB
Markdown
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
|