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