workspace-v1/projects/erp-construccion/docs/02-definicion-modulos/MAI-003-presupuestos-costos/RESUMEN-EPICA-MAI-003.md
rckrdmrd 66161b1566 feat: Workspace-v1 complete migration with NEXUS v3.4
Sistema NEXUS v3.4 migrado con:

Estructura principal:
- core/orchestration: Sistema SIMCO + CAPVED (27 directivas, 28 perfiles)
- core/catalog: Catalogo de funcionalidades reutilizables
- shared/knowledge-base: Base de conocimiento compartida
- devtools/scripts: Herramientas de desarrollo
- control-plane/registries: Control de servicios y CI/CD
- orchestration/: Configuracion de orquestacion de agentes

Proyectos incluidos (11):
- gamilit (submodule -> GitHub)
- trading-platform (OrbiquanTIA)
- erp-suite con 5 verticales:
  - erp-core, construccion, vidrio-templado
  - mecanicas-diesel, retail, clinicas
- betting-analytics
- inmobiliaria-analytics
- platform_marketing_content
- pos-micro, erp-basico

Configuracion:
- .gitignore completo para Node.js/Python/Docker
- gamilit como submodule (git@github.com:rckrdmrd/gamilit-workspace.git)
- Sistema de puertos estandarizado (3005-3199)

Generated with NEXUS v3.4 Migration System
EPIC-010: Configuracion Git y Repositorios
2026-01-04 03:37:42 -06:00

711 lines
24 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# RESUMEN EJECUTIVO - MAI-003: Presupuestos y Control de Costos
**Versión:** 1.0
**Fecha:** 2025-11-17
**Estado:** ✅ COMPLETO (100%)
---
## 📊 Estado del Progreso
| Tipo de Documento | Completados | Total | % | Tamaño |
|-------------------|-------------|-------|---|--------|
| Requerimientos Funcionales (RF) | 4 | 4 | 100% ✅ | ~120 KB |
| Especificaciones Técnicas (ET) | 4 | 4 | 100% ✅ | ~95 KB |
| Historias de Usuario (US) | 8 | 8 | 100% ✅ | ~40 KB |
| **Total Documentos** | **16** | **16** | **100%** ✅ | **~255 KB** |
**Story Points Totales:** 46 SP
---
## 🎯 Objetivos de Negocio
### Problema que Resuelve
Las constructoras **pierden entre 5-15% de margen** debido a:
- ❌ Presupuestos desactualizados o imprecisos
- ❌ Falta de control sobre costos reales
- ❌ Desconocimiento de rentabilidad por prototipo
- ❌ Reacción tardía ante desviaciones
### Solución Propuesta
Sistema integral de presupuestos y costos que permite:
-**Catálogo centralizado** de 10,000+ conceptos reutilizables
-**Presupuestos en 3 niveles** (obra, etapa, prototipo) con generadores automáticos
-**Control en tiempo real** de costos con alertas proactivas
-**Análisis de rentabilidad** con simulaciones y proyecciones
### Beneficios Esperados
- **Eficiencia:** -80% tiempo elaboración presupuestos (2h vs 10h)
- **Precisión:** <3% desviación presupuesto vs real
- **Rentabilidad:** +2 puntos de margen por mejor control
- **Visibilidad:** Dashboard actualizado en tiempo real
---
## 📁 Documentos Generados
### Requerimientos Funcionales (4)
#### ✅ RF-COST-001: Catálogo de Conceptos y Precios Unitarios (~35 KB)
**Alcance:**
- 4 tipos de conceptos: material, mano de obra, maquinaria, compuesto
- Catálogo jerárquico por división CMIC (16 capítulos)
- Análisis de precios unitarios (APU) detallado
- Versionado y historial de precios
- Regionalización de precios
- Importación/exportación Excel, OPUS, Neodata
**Componentes Clave:**
```
Concepto Compuesto "Cimentación corrida":
├─ Materiales: $4,548 (concreto, acero, cimbra, alambre)
├─ Mano de Obra: $1,125 (oficial + ayudantes con FSR)
├─ Maquinaria: $226 (vibrador + herramienta menor)
├─ CD: $5,899
├─ Indirectos (12%): $708
├─ Financiamiento (3%): $177
├─ Utilidad (10%): $590
├─ Cargos (2%): $118
└─ PU Final: $7,492/m³ + IVA
```
#### ✅ RF-COST-002: Presupuestos Maestros (Obra, Etapa, Prototipo) (~38 KB)
**Alcance:**
- Presupuesto de obra con desglose CMIC
- Presupuesto de etapa por fase constructiva
- Presupuesto de prototipo con generadores automáticos
- Versionado completo (baseline, ajustes, cambios de alcance)
- Análisis de rentabilidad integrado
- Curva S y distribución temporal
**Ejemplo Generador:**
```javascript
// Excavación para cimentación
formula: "desplantDepth * buildingPerimeter * 0.60 * 0.80"
inputs: {
desplantDepth: 0.80m,
buildingPerimeter: 30m
}
result: 14.40
```
#### ✅ RF-COST-003: Control de Costos Reales y Desviaciones (~32 KB)
**Alcance:**
- Registro automático desde compras, nómina, subcontratos
- Dashboard con curva S
- Cálculo de desviaciones (precio, cantidad, mixta)
- Proyecciones EAC (3 métodos)
- Alertas automáticas configurables
- Plan de acción obligatorio para desviaciones >5%
**Indicadores Clave:**
```
CPI (Cost Performance Index) = Valor Ganado / Costo Real
SPI (Schedule Performance Index) = Valor Ganado / Valor Planificado
EAC (Estimate at Completion) = Presupuesto / CPI
```
#### ✅ RF-COST-004: Análisis de Rentabilidad y Márgenes (~15 KB)
**Alcance:**
- Análisis financiero por proyecto
- Comparación de rentabilidad por prototipo
- Punto de equilibrio y margen de seguridad
- Simulador de escenarios
- Matriz de sensibilidad (precio vs costo)
- ROI y TIR proyectados
**Ejemplo Análisis:**
```
Proyecto: 150 viviendas
Ingresos: $165.75M
Costos: $153.70M
Margen: 7.3%
PE: 110 viviendas (73%)
Margen seguridad: 27% ✓
```
---
### Especificaciones Técnicas (4)
#### ✅ ET-COST-001: Implementación del Catálogo de Conceptos (~28 KB)
**Stack Técnico:**
- **DB:** PostgreSQL con schema `budgets`
- **Backend:** NestJS + TypeORM
- **Frontend:** React + Zustand
**Tablas Principales:**
```sql
budgets.concept_catalog (conceptos base)
budgets.concept_price_history (historial precios)
budgets.regions (regionalización)
```
**Funcionalidades:**
- CRUD completo con validaciones
- Búsqueda full-text (<200ms)
- Actualización masiva de precios
- Cálculo automático PU compuestos
- Triggers para historial automático
#### ✅ ET-COST-002: Implementación de Presupuestos (~25 KB)
**Tablas:**
```sql
budgets.budgets (presupuestos maestros)
budgets.budget_items (partidas jerárquicas)
budgets.budget_versions (versionado)
```
**Funcionalidades:**
- Wizard de creación desde prototipos
- Generadores de volumetrías
- Cálculo automático de totales (trigger)
- Versionado con comparación
- Exportación Excel/PDF
#### ✅ ET-COST-003: Implementación de Control de Costos (~25 KB)
**Tablas:**
```sql
budgets.actual_costs (costos reales)
budgets.cost_variances (desviaciones)
budgets.cost_projections (proyecciones)
```
**Funcionalidades:**
- Integración con compras/nómina/subcontratos
- Recálculo automático de desviaciones
- Proyección EAC con 3 métodos
- Cron job diario (6:00 AM)
- Dashboard con Chart.js
#### ✅ ET-COST-004: Implementación de Análisis de Rentabilidad (~17 KB)
**Tablas:**
```sql
budgets.profitability_analysis
budgets.prototype_profitability
```
**Funcionalidades:**
- Cálculo automático de rentabilidad
- Simulador de escenarios
- Matriz de sensibilidad
- Comparación de prototipos
- Punto de equilibrio visual
---
### Historias de Usuario (8)
#### Sprint 7 (13 SP)
- **US-COST-001:** Catálogo de Conceptos y Búsqueda (5 SP)
- **US-COST-002:** Precios Unitarios Compuestos (5 SP)
- **US-COST-003:** Actualización Masiva de Precios (3 SP)
#### Sprint 8 (13 SP)
- **US-COST-004:** Presupuesto de Obra Completo (8 SP)
- **US-COST-005:** Presupuesto de Prototipo con Generadores (5 SP)
#### Sprint 9 (10 SP)
- **US-COST-006:** Dashboard de Control de Costos Reales (5 SP)
- **US-COST-007:** Análisis de Desviaciones y Plan de Acción (5 SP)
#### Sprint 10 (5 SP)
- **US-COST-008:** Análisis de Rentabilidad y Simulaciones (5 SP)
---
## 🏗️ Arquitectura Técnica
### Base de Datos
**Schema:** `budgets`
**Tablas:** 9 tablas principales
```
concept_catalog (catálogo de conceptos)
├─ concept_price_history
└─ regions
budgets (presupuestos)
├─ budget_items (partidas)
└─ budget_versions
actual_costs (costos reales)
├─ cost_variances
└─ cost_projections
profitability_analysis
└─ prototype_profitability
```
**Funciones SQL:**
- `calculate_composite_price()`: Calcula PU de concepto compuesto
- `calculate_variances()`: Genera análisis de desviaciones
- `calculate_eac()`: Proyección de costo final
- `calculate_profitability()`: Análisis de rentabilidad
**Triggers:**
- Auto-actualización de `updated_at`
- Historial automático de precios
- Recálculo de totales en presupuestos
- Alertas automáticas en desviaciones >5%
### Backend (NestJS)
**Módulos:**
- `BudgetsModule`
- `ConceptCatalogService`
- `BudgetService`
- `CostControlService`
- `ProfitabilityService`
**Controllers:**
- `ConceptCatalogController` (9 endpoints)
- `BudgetController` (12 endpoints)
- `CostControlController` (8 endpoints)
- `ProfitabilityController` (6 endpoints)
**Cron Jobs:**
- `CostAnalysisTask.analyzeDailyCosts()` - Diario 6:00 AM
### Frontend (React + Vite)
**Stores (Zustand):**
- `useConceptCatalogStore`
- `useBudgetStore`
- `useCostControlStore`
- `useProfitabilityStore`
**Páginas Principales:**
- `/concept-catalog` - Catálogo de conceptos
- `/budgets/:id` - Detalle de presupuesto
- `/cost-control/:projectId` - Control de costos
- `/profitability/:projectId` - Análisis de rentabilidad
**Componentes Clave:**
- `ConceptCatalogList` - Lista con búsqueda y filtros
- `CreateConceptModal` - Formulario de concepto compuesto
- `BudgetItemsTree` - Árbol jerárquico de partidas
- `CurveS` - Gráfica de curva S (Chart.js)
- `SensitivityMatrix` - Matriz de sensibilidad
- `ScenarioSimulator` - Simulador interactivo
---
## 📈 Estimación de Sprints
### Distribución Propuesta
**Sprint 7** (2 semanas) - **13 SP**: Catálogo de conceptos base
- US-COST-001: Catálogo de Conceptos (5 SP)
- US-COST-002: Precios Compuestos (5 SP)
- US-COST-003: Actualización Masiva (3 SP)
**Sprint 8** (2 semanas) - **13 SP**: Presupuestos
- US-COST-004: Presupuesto de Obra (8 SP)
- US-COST-005: Presupuesto de Prototipo (5 SP)
**Sprint 9** (2 semanas) - **10 SP**: Control de costos
- US-COST-006: Dashboard Control (5 SP)
- US-COST-007: Análisis Desviaciones (5 SP)
**Sprint 10** (2 semanas) - **5 SP**: Rentabilidad
- US-COST-008: Análisis Rentabilidad (5 SP)
**Total:** 4 sprints × 2 semanas = **8 semanas de desarrollo**
---
## ⚙️ Configuración SaaS Multi-tenant
### Activación del Módulo
MAI-003 es un **módulo core** incluido en los 3 planes de suscripción:
| Plan | Módulo MAI-003 | Funcionalidades | Límites |
|------|----------------|-----------------|---------|
| **Básico** | ✅ Incluido | Catálogo + Presupuestos básicos | 500 conceptos, 10 presupuestos/proyecto |
| **Profesional** | ✅ Incluido | Todo + Control de costos | 2,000 conceptos, 50 presupuestos |
| **Enterprise** | ✅ Incluido | Todo + Rentabilidad avanzada | Ilimitado |
**Activación automática:** Este módulo se activa durante el onboarding junto con MAI-002 (Proyectos).
### Portal de Administración SaaS
#### Para Super Admin (Equipo Interno)
**Panel de gestión del módulo:**
```
┌─────────────────────────────────────────────────────────┐
│ Módulo MAI-003: Presupuestos y Costos │
├─────────────────────────────────────────────────────────┤
│ │
│ 📊 Uso Global (Todos los Tenants) │
│ ──────────────────────────────────────── │
│ Tenants con módulo activo: 234/234 (100%) │
│ Presupuestos totales: 5,678 │
│ Conceptos en catálogos: 1,234,567 │
│ Costos reales registrados: $2.4B MXN acum. │
│ │
│ 🔧 Feature Flags │
│ ──────────────────────────────────────── │
│ ☑️ budgets.composite_concepts (ENABLED) │
│ Conceptos compuestos con APU │
│ │
│ ☑️ budgets.cost_control_dashboard (ENABLED) │
│ Dashboard de control de costos reales │
│ │
│ ☑️ budgets.profitability_analysis (ENABLED) │
│ Análisis de rentabilidad y simulaciones │
│ │
│ ☐ budgets.ai_cost_prediction (BETA) │
│ Predicción de costos con ML (Beta) │
│ │
│ 📈 Métricas de Rendimiento │
│ ──────────────────────────────────────── │
│ Búsqueda conceptos (p95): 178 ms ✅ │
│ Cálculo PU compuesto (p95): 45 ms ✅ │
│ Generación presupuesto (100 partidas): 1.8s ✅ │
│ Actualización masiva (500 conceptos): 4.2s ✅ │
│ │
└─────────────────────────────────────────────────────────┘
```
#### Para Tenant Admin (Cliente/Constructora)
**Panel de configuración del módulo:**
```
┌─────────────────────────────────────────────────────────┐
│ Configuración: Módulo de Presupuestos │
├─────────────────────────────────────────────────────────┤
│ │
│ 📊 Uso Actual (Constructora ABC) │
│ ──────────────────────────────────────── │
│ Plan: Profesional ($799/mes) │
│ Conceptos en catálogo: 842 / 2,000 (42%) │
│ Presupuestos activos: 23 │
│ Proyectos con control de costos: 8 / 12 │
│ │
│ ⚙️ Configuraciones Personalizadas │
│ ──────────────────────────────────────── │
│ Indirectos por defecto: [12%___] │
│ Financiamiento: [3%___] │
│ Utilidad esperada: [10%___] │
│ Cargos adicionales: [2%___] │
│ │
│ ☑️ Alertar cuando desviación > [5%___] │
│ ☑️ Requerir plan de acción para desviaciones >5% │
│ ☐ Enviar reporte semanal de costos │
│ │
│ 📂 Catálogo de Conceptos │
│ ──────────────────────────────────────── │
│ Materiales: 423 conceptos │
│ Mano de Obra: 156 conceptos │
│ Maquinaria: 89 conceptos │
│ Compuestos: 174 conceptos │
│ │
│ [Importar Catálogo OPUS] [Exportar a Excel] │
│ │
│ 🌍 Regionalización de Precios │
│ ──────────────────────────────────────── │
│ Regiones configuradas: 3 │
│ • Región Centro (base) │
│ • Región Norte (+8% en materiales) │
│ • Región Sur (-3% en mano de obra) │
│ │
│ [Gestionar Regiones] │
│ │
│ ⚠️ Límites del Plan │
│ ──────────────────────────────────────── │
│ Estás usando 842 de 2,000 conceptos permitidos. │
│ ¿Necesitas catálogo más grande? │
│ [Actualizar a Plan Enterprise] (ilimitados) │
│ │
└─────────────────────────────────────────────────────────┘
```
### Provisioning Automático
Durante el onboarding, el sistema ejecuta:
```sql
-- 1. Activar módulo MAI-003
INSERT INTO constructoras.constructora_modules (
constructora_id,
module_code,
is_active,
plan_included
) VALUES (
$constructora_id,
'MAI-003',
true,
true
);
-- 2. Crear regiones base
INSERT INTO budgets.regions (
constructora_id,
code,
name,
description
) VALUES
($constructora_id, 'CENTRO', 'Región Centro', 'Región base sin ajustes'),
($constructora_id, 'NORTE', 'Región Norte', 'Ajuste +8% materiales'),
($constructora_id, 'SUR', 'Región Sur', 'Ajuste -3% mano de obra');
-- 3. Importar catálogo seed (100 conceptos básicos)
INSERT INTO budgets.concept_catalog (
constructora_id,
code,
name,
concept_type,
category,
unit,
base_price
) SELECT
$constructora_id,
seed_code,
seed_name,
seed_type,
seed_category,
seed_unit,
seed_price
FROM budgets.seed_concept_catalog;
-- 4. Configurar límites por plan
INSERT INTO constructoras.constructora_limits (
constructora_id,
limit_key,
limit_value
) VALUES
($constructora_id, 'max_concepts', 2000), -- Plan Profesional
($constructora_id, 'max_budgets_per_project', 50),
($constructora_id, 'max_regions', 5);
-- 5. Configurar parámetros por defecto
INSERT INTO budgets.constructora_budget_config (
constructora_id,
indirect_percentage,
financing_percentage,
utility_percentage,
additional_charges_percentage
) VALUES (
$constructora_id,
12.00, -- 12% indirectos
3.00, -- 3% financiamiento
10.00, -- 10% utilidad
2.00 -- 2% cargos
);
```
### Aislamiento de Datos (RLS)
**Garantía de seguridad multi-tenant:**
```sql
-- Configuración de contexto por sesión
SET app.current_constructora_id = 'uuid-de-constructora-abc';
SET app.current_user_role = 'budget_manager';
-- Toda query automáticamente filtra por constructora
SELECT * FROM budgets.concept_catalog;
-- Internamente ejecuta:
-- SELECT * FROM budgets.concept_catalog
-- WHERE constructora_id = current_setting('app.current_constructora_id')::UUID;
-- Imposible ver conceptos de otras constructoras
SELECT * FROM budgets.concept_catalog WHERE constructora_id = 'otra-uuid';
-- Retorna: 0 rows (bloqueado por RLS policy)
```
**Políticas RLS completas:** Ver `implementacion/ET-COST-001-002-rls-policies.sql`
### Migraciones y Actualizaciones
**Actualización de catálogo nacional (semestral):**
```typescript
// Cron job: Actualizar precios según índices INPC/CMIC
@Cron('0 0 1 */6 *') // Cada 6 meses, día 1 a medianoche
async updateNationalCatalogPrices() {
// Solo actualizar conceptos que usen índice nacional
await this.db.query(`
UPDATE budgets.concept_catalog
SET base_price = base_price * (1 + $index_increase / 100),
price_update_source = 'auto_inpc_cmic',
updated_at = NOW()
WHERE constructora_id = ANY($constructora_ids)
AND use_national_index = true
`, {
index_increase: 5.2, // 5.2% incremento semestral
constructora_ids: allConstructoraIds
});
// Crear registro en historial de precios
await this.createPriceHistoryEntries();
}
```
### Monitoreo por Tenant
**Métricas capturadas:**
```javascript
// Evento de auditoría
{
"event": "budget.created",
"timestamp": "2025-11-20T10:30:00Z",
"constructora_id": "uuid-constructora-abc",
"user_id": "uuid-user-123",
"budget_id": "uuid-budget-456",
"metadata": {
"budget_code": "PRES-PROJ-2025-001",
"project_id": "uuid-project",
"scope": "project", // project | stage | prototype
"total_amount": 15750000.00,
"items_count": 247,
"generation_time_ms": 1842
}
}
```
**Dashboard de métricas:**
- Presupuestos generados por mes
- Conceptos más utilizados
- Desviación promedio presupuesto vs real
- Tiempo promedio de generación
- Alertas de costos activadas
### Upgrade de Plan
**Desbloqueo de límites:**
```sql
-- Actualizar de Profesional a Enterprise
UPDATE constructoras.constructora_limits
SET limit_value = -1 -- -1 = ilimitado
WHERE constructora_id = $tenant_id
AND limit_key IN ('max_concepts', 'max_budgets_per_project');
-- Activar feature de análisis avanzado
UPDATE constructoras.constructora_feature_flags
SET is_enabled = true
WHERE constructora_id = $tenant_id
AND flag_key = 'budgets.profitability_analysis';
```
### Soporte y Troubleshooting
**Queries de diagnóstico:**
```sql
-- Ver estado de presupuestos de un tenant
SELECT
c.name AS constructora,
COUNT(DISTINCT b.id) AS total_budgets,
COUNT(DISTINCT cc.id) AS total_concepts,
SUM(CASE WHEN b.status = 'approved' THEN 1 ELSE 0 END) AS approved_budgets,
AVG(b.total_amount) AS avg_budget_amount,
cl.limit_value AS max_concepts_allowed
FROM constructoras.constructoras c
LEFT JOIN budgets.budgets b ON b.constructora_id = c.id
LEFT JOIN budgets.concept_catalog cc ON cc.constructora_id = c.id
LEFT JOIN constructoras.constructora_limits cl ON cl.constructora_id = c.id
AND cl.limit_key = 'max_concepts'
WHERE c.subdomain = 'constructora-abc'
GROUP BY c.id, c.name, cl.limit_value;
-- Análisis de performance de generación de presupuestos
SELECT
constructora_id,
AVG(generation_time_ms) AS avg_generation_time,
MAX(generation_time_ms) AS max_generation_time,
COUNT(*) AS budgets_generated,
AVG(items_count) AS avg_items_per_budget
FROM audit.budget_generation_logs
WHERE created_at > NOW() - INTERVAL '30 days'
AND constructora_id = $tenant_id
GROUP BY constructora_id;
```
---
## 🔗 Integraciones
### Módulos que Consume (Input)
- **MAI-002 (Proyectos):**
- Estructura de proyectos/etapas
- Prototipos de vivienda
- Características para generadores
- **MAI-004 (Compras):**
- Órdenes de compra → Costos reales
- Precios de proveedores
- **MAI-007 (RR.HH.):**
- Nómina → Costos de mano de obra
- **MAI-008 (Configuración):**
- Índices INPC/CMIC
- Regiones/plazas
### Módulos que Alimenta (Output)
- **MAI-002 (Proyectos):**
- Costo unitario por prototipo
- **MAI-004 (Compras):**
- Presupuesto de materiales
- Alertas de precios fuera de presupuesto
- **MAI-006 (Reportes):**
- Datos financieros
- Indicadores de rentabilidad
- Análisis de desviaciones
---
## ✅ Criterios de Éxito
### Métricas de Adopción
- [ ] 100% de proyectos con presupuesto formal
- [ ] 90% de presupuestos usan catálogo estándar
- [ ] <5% de conceptos duplicados en catálogo
### Métricas de Eficiencia
- [ ] Reducción 80% tiempo de elaboración (-8h por presupuesto)
- [ ] Búsqueda de conceptos <200ms
- [ ] Actualización masiva de precios <5 seg para 500 conceptos
### Métricas de Calidad
- [ ] Precisión presupuesto vs real <3% de desviación
- [ ] 100% de alertas críticas con plan de acción en 48h
- [ ] Proyección EAC vs costo final <2% de error
### Métricas de Rentabilidad
- [ ] 80% de proyectos con margen target
- [ ] Incremento de margen promedio +2 puntos anuales
- [ ] ROI portafolio 12% anual
---
## 🚀 Próximos Pasos
### Opción 1: Comenzar Implementación (Recomendado)
El equipo de desarrollo puede iniciar Sprint 7 con la documentación completa. Prioridad alta debido a impacto directo en rentabilidad.
### Opción 2: Continuar Documentación
Generar épica siguiente:
- **MAI-004:** Compras e Inventarios (45 SP estimados)
- **MAI-005:** Control de Obra y Avances (50 SP estimados)
### Opción 3: Enfoque Paralelo
- Equipo A: Implementa MAI-003
- Equipo B: Documenta MAI-004
---
## 📋 Documentos Pendientes
**Ninguno - Épica 100% Completa**
---
**Última Actualización:** 2025-11-17
**Responsable:** Equipo de Producto
**Estado:** LISTO PARA DESARROLLO