erp-construccion/docs/02-definicion-modulos/MAI-008-estimaciones-facturacion/requerimientos/RF-EST-001-estimaciones-cliente.md

381 lines
9.1 KiB
Markdown
Raw 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.

# RF-EST-001: Estimaciones hacia Cliente
**ID:** RF-EST-001
**Módulo:** MAI-008
**Prioridad:** Alta
**Story Points:** 13 SP
---
## 📋 Descripción
Sistema para generar estimaciones de obra ejecutada hacia clientes institucionales (INFONAVIT, fideicomisos, Gobierno) basadas en avances físicos verificados, con cálculo automático de amortizaciones de anticipo y retenciones.
---
## 🎯 Objetivos
1. Generar estimaciones desde avances de obra validados
2. Calcular automáticamente anticipos, amortizaciones y retenciones según contrato
3. Mantener trazabilidad completa entre avances físicos y cobros
4. Workflow de autorización multinivel
5. Generación de documentos oficiales para cliente
---
## 📐 Reglas de Negocio
### RN-EST-001: Cálculo de Monto Bruto
```typescript
montoBruto = Σ (conceptos_ejecutados × precio_unitario)
// Ejemplo para viviendas:
montoBruto = viviendas_terminadas × precio_por_vivienda
```
**Validaciones:**
- Solo conceptos con avance >= umbral_estimacion (default 100%)
- Precios del catálogo vigente del contrato
- Validar que no exceda monto contratado
### RN-EST-002: Amortización de Anticipo
```typescript
// Si hay anticipo pendiente:
porcentaje_amortizacion = configurado_en_contrato // Ejemplo: 25%
saldo_anticipo = anticipo_inicial - Σ(amortizaciones_previas)
amortizacion_actual = min(
saldo_anticipo,
(monto_bruto - acumulado_estimaciones_anteriores) × (porcentaje_amortizacion / 100)
)
```
**Ejemplo:**
- Contrato: $50M, Anticipo 20% = $10M
- Amortización: 25% por estimación
- Estimación 1: $12.5M bruto → Amortiza $2.5M (25% × $10M)
- Estimación 2: $10M bruto → Amortiza $2.5M
- Etc hasta agotar $10M
### RN-EST-003: Retenciones
```typescript
base_retenciones = monto_bruto - amortizacion
retenciones = {
fondo_garantia: base_retenciones × 0.05, // 5% típico
isr: base_retenciones × (tasa_isr / 100) || 0,
iva_retenido: base_retenciones × (tasa_iva_ret / 100) || 0,
otras: monto_fijo || 0
}
total_retenciones = Σ(retenciones)
```
**Reglas:**
- Fondo de garantía: Configurable por contrato (típico 5-10%)
- ISR retenido: Solo si aplica según contrato
- IVA retenido: Casos específicos
- Se acumulan hasta finiquito/liberación
### RN-EST-004: Cálculo de Monto Neto
```typescript
monto_neto = monto_bruto - amortizacion_anticipo - total_retenciones
```
**Validaciones:**
- monto_neto >= 0
- Si monto_neto < 0 Alerta, revisar cálculos
### RN-EST-005: Numeración Consecutiva
```
EST-[PROYECTO]-[TIPO]-[AÑO]-[CONSECUTIVO]
Ejemplos:
- EST-PRJ001-CLI-2025-001 (Primera estimación a cliente)
- EST-PRJ001-CLI-2025-002 (Segunda estimación a cliente)
```
**Reglas:**
- Consecutivo reinicia cada año
- No se saltan números
- Único por proyecto
### RN-EST-006: Validaciones de Negocio
1. **No duplicar conceptos:**
- Un concepto/vivienda no puede estimarse 2 veces al mismo cliente
- Validar vs estimaciones anteriores
2. **Límite del contrato:**
```typescript
acumulado_estimaciones + monto_actual <= monto_contrato_total
```
3. **Avances verificados:**
- Solo incluir conceptos con avance validado por residente/supervisor
- Estado del avance: "verificado" o "autorizado"
4. **Periodo de estimación:**
- Típico: Mensual, Quincenal
- No solapar periodos
- No generar 2 estimaciones del mismo periodo
---
## 🏛️ Estructura de Datos
### Estimación hacia Cliente
```typescript
interface EstimacionCliente {
id: string;
numero: string; // EST-PRJ001-CLI-2025-001
// Relaciones
proyectoId: string;
contratoId: string;
clienteId: string;
// Periodo
periodoInicio: Date;
periodoFin: Date;
numeroEstimacion: number; // 1, 2, 3...
// Montos
montoBruto: number;
amortizacionAnticipo: number;
totalRetenciones: number;
montoNeto: number;
// Desglose retenciones
retencionFondoGarantia: number;
retencionISR: number;
retencionIVA: number;
otrasRetenciones: number;
// Estado
status: EstimationStatus; // draft, submitted, authorized, paid
// Fechas
fechaCreacion: Date;
fechaEnvio: Date;
fechaAutorizacion: Date;
fechaCobro: Date;
fechaCobroEstimada: Date;
// Workflow
creadoPor: string;
autorizadoPor: string;
observaciones: string;
// Metadata
documentosPDF: string[]; // URLs
documentosExcel: string[];
}
```
### Detalle de Partidas
```typescript
interface EstimacionItem {
id: string;
estimacionId: string;
// Concepto
conceptoCatalogoId: string;
descripcion: string;
unidad: string;
precioUnitario: number;
// Cantidades
cantidadContratada: number;
cantidadEstimadaAnterior: number;
cantidadEstimadaActual: number;
cantidadAcumulada: number;
porcentajeAvance: number;
// Importes
importeActual: number; // cantidad_actual × precio
importeAcumulado: number;
// Trazabilidad
avanceObraId: string; // Link a MAI-005
verificadoPor: string;
fechaVerificacion: Date;
}
```
---
## 🔄 Estados del Workflow
```mermaid
stateDiagram-v2
[*] --> Borrador
Borrador --> Enviada: Ingeniero envía
Enviada --> Revisada: Finanzas revisa
Revisada --> Autorizada: Director autoriza
Autorizada --> Cobrada: Se registra pago
Enviada --> Borrador: Rechazada (volver a editar)
Revisada --> Enviada: Correcciones requeridas
Cobrada --> [*]
```
**Transiciones:**
- `draft → submitted`: Ingeniero valida y envía
- `submitted → reviewed`: Finanzas valida cálculos
- `reviewed → authorized`: Director autoriza (si >$100K)
- `authorized → paid`: Se registra cobro de cliente
---
## 📊 Casos de Uso
### CU-001: Generar Estimación Mensual de Viviendas
**Actor:** Ingeniero de Proyecto
**Precondiciones:**
- Existe proyecto con contrato vigente
- Hay avances de obra verificados del periodo
- No existe estimación para el mismo periodo
**Flujo:**
1. Ingeniero selecciona proyecto y periodo
2. Sistema carga avances verificados del periodo
3. Sistema identifica viviendas 100% terminadas en el periodo
4. Sistema calcula monto bruto (viviendas × precio)
5. Sistema calcula amortización de anticipo
6. Sistema calcula retenciones
7. Sistema muestra resumen y desglose
8. Ingeniero revisa y confirma
9. Sistema genera estimación en estado "Borrador"
**Postcondiciones:**
- Estimación creada vinculada a avances
- Disponible para revisión
### CU-002: Estimar por Avance de Partidas
**Actor:** Ingeniero
**Precondiciones:**
- Proyecto con catálogo de conceptos
- Avances parciales registrados por partida
**Flujo:**
1. Ingeniero selecciona partidas con avance >= 100%
2. Sistema valida que no estén estimadas previamente
3. Sistema multiplica cantidad × precio unitario
4. Sistema aplica factor de amortización y retenciones
5. Sistema genera detalle item por item
6. Ingeniero ajusta si necesario
7. Sistema guarda borrador
---
## 🧮 Ejemplo Completo
### Contexto
- **Proyecto:** Desarrollo 100 viviendas
- **Contrato:** $50,000,000 MXN
- **Precio unitario:** $500,000/vivienda
- **Anticipo:** 20% = $10,000,000
- **Amortización:** 25% por estimación
- **Retención:** 5% fondo garantía
### Estimación 1
**Avance:** 25 viviendas terminadas (25%)
```
Monto bruto:
25 viviendas × $500,000 = $12,500,000
Amortización anticipo:
25% × $10,000,000 = $2,500,000
Saldo anticipo: $10,000,000 - $2,500,000 = $7,500,000
Base para retenciones:
$12,500,000 - $2,500,000 = $10,000,000
Retención 5%:
$10,000,000 × 5% = $500,000
Acumulado retenciones: $500,000
Monto neto a cobrar:
$12,500,000 - $2,500,000 - $500,000 = $9,500,000
```
### Estimación 2
**Avance:** 20 viviendas adicionales (20% adicional, 45% acumulado)
```
Monto bruto:
20 viviendas × $500,000 = $10,000,000
Amortización anticipo:
Saldo pendiente: $7,500,000
25% × $7,500,000 = $1,875,000
Pero: min($1,875,000, $7,500,000) = $1,875,000
Nuevo saldo: $7,500,000 - $1,875,000 = $5,625,000
Base retenciones:
$10,000,000 - $1,875,000 = $8,125,000
Retención 5%:
$8,125,000 × 5% = $406,250
Acumulado retenciones: $500,000 + $406,250 = $906,250
Monto neto:
$10,000,000 - $1,875,000 - $406,250 = $7,718,750
```
---
## ✅ Criterios de Aceptación
1. **Cálculos precisos:**
- Monto bruto = Σ(cantidad × precio)
- Amortización respeta % configurado
- Retenciones calculadas sobre base correcta
- Monto neto = bruto - amortización - retenciones
2. **No duplicidad:**
- Sistema previene estimar 2 veces el mismo concepto
- Alerta si vivienda/concepto ya estimado
3. **Trazabilidad:**
- Cada item vinculado a avance de obra verificado
- Auditoría completa de quién/cuándo creó/autorizó
4. **Validaciones:**
- No exceder monto contrato
- No crear sin avances verificados
- Numeración consecutiva sin saltos
5. **Performance:**
- Cálculo de estimación <3 segundos
- Listar estimaciones con filtros <1 segundo
---
## 🔗 Referencias
- [ET-EST-001: Modelo de datos](../especificaciones/ET-EST-001-modelo-datos.md)
- [ET-EST-002: Cálculo de montos](../especificaciones/ET-EST-002-calculo-montos.md)
- [US-EST-001: Crear estimación a cliente](../historias-usuario/US-EST-001-crear-estimacion-cliente.md)
---
**Generado:** 2025-11-20
**Estado:** Completo