221 lines
6.4 KiB
Markdown
221 lines
6.4 KiB
Markdown
# US-PROJ-009: Alertas de Fechas Críticas
|
||
|
||
**Épica:** MAI-002 - Proyectos y Estructura de Obra
|
||
**Sprint:** Sprint 6
|
||
**Story Points:** 3 SP
|
||
**Prioridad:** P1 (Alta)
|
||
**Estimación:** 1-2 días
|
||
|
||
---
|
||
|
||
## Historia de Usuario
|
||
|
||
**Como** Director de Proyectos
|
||
**Quiero** registrar fechas críticas contractuales o regulatorias con alertas automáticas
|
||
**Para** evitar incumplimientos, penalizaciones y asegurar entregas a tiempo
|
||
|
||
---
|
||
|
||
## Criterios de Aceptación
|
||
|
||
### ✅ AC1: Listado de Fechas Críticas
|
||
|
||
**Dado** que accedo a "Fechas Críticas"
|
||
**Entonces** veo tabla:
|
||
|
||
| Fecha | Descripción | Tipo | Entidad | Consecuencias | Días Restantes | Estado |
|
||
|-------|-------------|------|---------|---------------|----------------|--------|
|
||
| 15/12/2025 | Entrega INFONAVIT | Contractual | INFONAVIT | $500,000 + 2% mes | 28 días | ⏱️ Próxima |
|
||
| 01/02/2026 | Renovación seguro | Regulatoria | Aseguradora | Pérdida de cobertura | 75 días | ⏸️ Pendiente |
|
||
| 15/05/2026 | Finiquito gobierno | Contractual | Municipio | Retención de garantía | 178 días | ⏸️ Pendiente |
|
||
|
||
**Estados:**
|
||
- ⏱️ Próxima (<30 días)
|
||
- ⏸️ Pendiente (>30 días)
|
||
- ⚠️ En riesgo (<7 días)
|
||
- ✅ Cumplida
|
||
- ❌ Incumplida
|
||
|
||
**Ordenamiento:** Por fecha (más próxima primero)
|
||
|
||
### ✅ AC2: Registrar Fecha Crítica
|
||
|
||
**Formulario:**
|
||
- Descripción: "Entrega primera etapa a INFONAVIT"
|
||
- Fecha: [15/12/2025]
|
||
- Es fecha límite inamovible: ☑
|
||
- Tipo de compromiso: Contractual / Regulatoria / Financiero / Cliente / Interno
|
||
- Entidad relacionada: "INFONAVIT"
|
||
- Consecuencias si se incumple:
|
||
```
|
||
Penalización de $500,000 MXN
|
||
+ Intereses del 2% mensual
|
||
+ Posible rescisión de contrato
|
||
```
|
||
- Alerta (días antes): [30]
|
||
|
||
**Validaciones:**
|
||
- Fecha debe ser futura
|
||
- Descripción obligatoria
|
||
- Si es inamovible, marcar en rojo
|
||
|
||
### ✅ AC3: Sistema de Alertas Automáticas
|
||
|
||
**Configuración de alertas:**
|
||
- Primera alerta: 30 días antes
|
||
- Segunda alerta: 15 días antes
|
||
- Tercera alerta: 7 días antes
|
||
- Alertas diarias: últimos 3 días
|
||
|
||
**Cuando** llega el momento de alerta
|
||
**Entonces** sistema envía:
|
||
- ✉️ Email al Director del proyecto
|
||
- 📱 Notificación in-app
|
||
- 📊 Actualiza dashboard con badge "⚠️ 2 fechas críticas próximas"
|
||
|
||
**Ejemplo de email:**
|
||
```
|
||
Asunto: ⚠️ Fecha crítica próxima: Entrega INFONAVIT en 30 días
|
||
|
||
Proyecto: Fraccionamiento Los Pinos
|
||
Fecha crítica: 15/12/2025 (en 30 días)
|
||
|
||
Descripción:
|
||
Entrega primera etapa a INFONAVIT
|
||
|
||
Consecuencias si se incumple:
|
||
Penalización de $500,000 MXN + intereses del 2% mensual
|
||
|
||
Entidad: INFONAVIT
|
||
Tipo: Contractual - FECHA LÍMITE INAMOVIBLE
|
||
|
||
Acciones recomendadas:
|
||
- Verificar avance físico actual: 82%
|
||
- Acelerar trabajos de acabados
|
||
- Coordinar inspección pre-entrega
|
||
|
||
[Ver Proyecto] [Marcar como Cumplida]
|
||
```
|
||
|
||
### ✅ AC4: Marcar Fecha como Cumplida/Incumplida
|
||
|
||
**Dado** fecha crítica "Entrega INFONAVIT" el 15/12/2025
|
||
**Cuando** llega el 15/12/2025 y se cumplió
|
||
**Entonces** hago clic "Marcar como Cumplida"
|
||
**Y** sistema pide:
|
||
- Fecha real de cumplimiento: [15/12/2025]
|
||
- Notas: "Entrega realizada sin observaciones"
|
||
|
||
**Si NO se cumplió:**
|
||
- Botón "Reportar Incumplimiento"
|
||
- Fecha de incumplimiento: [15/12/2025]
|
||
- Motivos del incumplimiento: [Textarea]
|
||
- Acciones correctivas: [Textarea]
|
||
- Sistema marca en rojo
|
||
- Notificación automática a Admin y Director
|
||
|
||
### ✅ AC5: Dashboard de Fechas Críticas
|
||
|
||
**Widget en dashboard principal:**
|
||
```
|
||
┌────────────────────────────────────────┐
|
||
│ ⚠️ Fechas Críticas Próximas (2) │
|
||
├────────────────────────────────────────┤
|
||
│ │
|
||
│ 🔴 En 7 días: Entrega INFONAVIT │
|
||
│ 15/12/2025 - Penalización $500K │
|
||
│ │
|
||
│ 🟡 En 28 días: Renovación de seguro │
|
||
│ 01/02/2026 - Pérdida de cobertura │
|
||
│ │
|
||
│ [Ver Todas las Fechas →] │
|
||
└────────────────────────────────────────┘
|
||
```
|
||
|
||
**Colores:**
|
||
- 🔴 Rojo: <7 días
|
||
- 🟡 Amarillo: 7-30 días
|
||
- 🟢 Verde: >30 días
|
||
|
||
---
|
||
|
||
## Escenarios de Prueba
|
||
|
||
**Escenario 1:** Crear fecha crítica con penalización
|
||
**Given** proyecto con contrato INFONAVIT
|
||
**When** registro fecha crítica:
|
||
- Fecha: 15/12/2025
|
||
- Tipo: Contractual
|
||
- Entidad: INFONAVIT
|
||
- Consecuencias: Penalización $500,000
|
||
**Then** fecha se guarda y alertas se configuran
|
||
|
||
**Escenario 2:** Recibir alerta 30 días antes
|
||
**Given** fecha crítica el 15/12/2025
|
||
**And** estamos el 15/11/2025 (30 días antes)
|
||
**When** cron job se ejecuta a las 9:00 AM
|
||
**Then** Director recibe email de alerta
|
||
**And** dashboard muestra badge "⚠️ 1 fecha próxima"
|
||
|
||
**Escenario 3:** Marcar fecha como incumplida
|
||
**Given** fecha crítica el 15/12/2025
|
||
**And** no se cumplió
|
||
**When** marco como incumplida
|
||
**Then** estado cambia a "Incumplida"
|
||
**And** Admin y Director reciben notificación
|
||
**And** registro queda en historial
|
||
|
||
---
|
||
|
||
## Definición de Done
|
||
|
||
- [ ] CRUD de fechas críticas completo
|
||
- [ ] Sistema de alertas automáticas (cron job)
|
||
- [ ] Emails enviados correctamente
|
||
- [ ] Widget de dashboard funcional
|
||
- [ ] Marcar como cumplida/incumplida
|
||
- [ ] Cálculo de días restantes en tiempo real
|
||
- [ ] Notificaciones in-app
|
||
- [ ] Tests de envío de alertas
|
||
- [ ] Configuración de múltiples alertas por fecha
|
||
|
||
---
|
||
|
||
## Notas Técnicas
|
||
|
||
**Endpoints:**
|
||
```
|
||
POST /api/projects/:projectId/critical-dates
|
||
GET /api/projects/:projectId/critical-dates
|
||
PUT /api/critical-dates/:id/mark-met
|
||
PUT /api/critical-dates/:id/mark-missed
|
||
DELETE /api/critical-dates/:id
|
||
```
|
||
|
||
**Cron Job (diario 9:00 AM):**
|
||
```typescript
|
||
@Cron('0 9 * * *')
|
||
async checkCriticalDates() {
|
||
const today = new Date();
|
||
|
||
// Fechas próximas (30, 15, 7, 3, 2, 1 días)
|
||
const upcomingDates = await this.findUpcoming([30, 15, 7, 3, 2, 1]);
|
||
|
||
for (const date of upcomingDates) {
|
||
if (shouldSendAlert(date, today)) {
|
||
await this.sendAlert(date);
|
||
await this.updateLastAlertSent(date.id);
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
**Email Template:**
|
||
- Subject: "⚠️ Fecha crítica próxima: {descripcion} en {dias} días"
|
||
- Body: HTML template con detalles completos
|
||
- Botones de acción: Ver Proyecto, Marcar como Cumplida
|
||
|
||
---
|
||
|
||
**Estado:** ✅ Ready for Development
|