📅 Lógica de Edición de Fechas en Hackathons
🎯 Objetivo
Permitir que ORGANIZER/ADMIN puedan extender (alargar) las fechas de un hackathon que ya está en curso, pero con restricciones estrictas para evitar cambios que afecten fases ya iniciadas.
🔒 Reglas Fundamentales
1. No se puede modificar fechas pasadas o en curso
Una vez que una fase ha comenzado, NO se puede modificar:
- ❌ No puedes cambiar
registrationOpensAtsi el hackathon ya está en REGISTRATION - ❌ No puedes cambiar
registrationClosesAtsi el hackathon ya está en RUNNING - ❌ No puedes cambiar
startsAtsi el hackathon ya está en RUNNING - ❌ No puedes cambiar
endsAtsi el hackathon ya está en JUDGING - ❌ No puedes cambiar
submissionDeadlinesi el hackathon ya está en JUDGING
2. Solo se puede ALARGAR (extender), nunca acortar
- ✅ Puedes extender
startsAtsi el hackathon está en REGISTRATION - ✅ Puedes extender
submissionDeadlinesi el hackathon está en RUNNING - ✅ Puedes extender
judgingEndsAtsi el hackathon está en JUDGING - ❌ NUNCA puedes acortar ninguna fecha
3. Límite de extensión: máximo +7 días
Para evitar extensiones excesivas, solo se permite alargar hasta 7 días más de la fecha original.
📊 Matriz de Permisos por Estado
| Estado Actual | Fechas que se pueden modificar | Ejemplo |
|---|---|---|
| DRAFT | Todas las fechas (validación completa) | Puedes cambiar cualquier fecha antes de publicar |
| REGISTRATION | startsAt, endsAt, submissionDeadline, judgingStartsAt, judgingEndsAt | Puedes alargar el inicio del hackathon |
| RUNNING | submissionDeadline, judgingStartsAt, judgingEndsAt | Puedes alargar el deadline de submissions |
| JUDGING | Solo judgingEndsAt | Puedes alargar el fin de la evaluación |
| FINISHED | Ninguna | No se puede modificar nada |
🔍 Ejemplos Prácticos
Ejemplo 1: Hackathon en REGISTRATION
Estado actual: REGISTRATION
Fecha actual: 1 de enero, 10:00 AM
Fechas del hackathon:
registrationOpensAt: 1 de enero, 9:00 AM ✅ (ya pasó)registrationClosesAt: 5 de enero, 6:00 PM (aún no llega)startsAt: 10 de enero, 9:00 AMendsAt: 12 de enero, 6:00 PMsubmissionDeadline: 12 de enero, 4:00 PMjudgingStartsAt: 13 de enero, 9:00 AMjudgingEndsAt: 15 de enero, 6:00 PM
¿Qué puedes hacer?
- ✅ Alargar
startsAthasta el 17 de enero (máximo +7 días) - ✅ Alargar
endsAthasta el 19 de enero - ✅ Alargar
submissionDeadlinehasta el 19 de enero - ✅ Alargar
judgingStartsAthasta el 20 de enero - ✅ Alargar
judgingEndsAthasta el 22 de enero - ❌ NO puedes modificar
registrationOpensAtoregistrationClosesAt(ya están en curso o pasaron)
Ejemplo 2: Hackathon en RUNNING
Estado actual: RUNNING
Fecha actual: 10 de enero, 2:00 PM
Fechas del hackathon:
startsAt: 10 de enero, 9:00 AM ✅ (ya comenzó)endsAt: 12 de enero, 6:00 PM (aún no llega)submissionDeadline: 12 de enero, 4:00 PMjudgingStartsAt: 13 de enero, 9:00 AMjudgingEndsAt: 15 de enero, 6:00 PM
¿Qué puedes hacer?
- ✅ Alargar
submissionDeadlinehasta el 19 de enero (máximo +7 días) - ✅ Alargar
judgingStartsAthasta el 20 de enero - ✅ Alargar
judgingEndsAthasta el 22 de enero - ❌ NO puedes modificar
startsAtoendsAt(ya están en curso)
Ejemplo 3: Hackathon en JUDGING
Estado actual: JUDGING
Fecha actual: 13 de enero, 10:00 AM
Fechas del hackathon:
judgingStartsAt: 13 de enero, 9:00 AM ✅ (ya comenzó)judgingEndsAt: 15 de enero, 6:00 PM
¿Qué puedes hacer?
- ✅ Alargar
judgingEndsAthasta el 22 de enero (máximo +7 días) - ❌ NO puedes modificar ninguna otra fecha
🛡️ Validaciones Implementadas
1. Validación de Orden de Fechas
Siempre se valida que las fechas mantengan el orden correcto:
registrationOpensAt < registrationClosesAt < startsAt < endsAt <
submissionDeadline < judgingStartsAt < judgingEndsAt
2. Validación de Extensión
// Solo permitir alargar (no acortar)
if (diff < 0) {
throw new Error(`No se puede acortar ${field}`);
}
// Verificar límite de extensión (+7 días máximo)
if (diff > MAX_EXTENSION_MS) {
throw new Error(
`La extensión de ${field} no puede exceder 7 días`
);
}
3. Validación de Campos Permitidos
// Determinar qué fechas se pueden modificar según el estado
if (currentStatus === 'REGISTRATION') {
allowedFields.push('startsAt', 'endsAt', 'submissionDeadline', 'judgingStartsAt', 'judgingEndsAt');
} else if (currentStatus === 'RUNNING') {
allowedFields.push('submissionDeadline', 'judgingStartsAt', 'judgingEndsAt');
} else if (currentStatus === 'JUDGING') {
allowedFields.push('judgingEndsAt');
}
🔄 Flujo de Cambios Automáticos (Cron Job)
El cron job se ejecuta cada minuto y cambia automáticamente los estados:
-
DRAFT → REGISTRATION
- Cuando
now >= registrationOpensAt - Y el hackathon tiene al menos 1 criterio
- Cuando
-
REGISTRATION → RUNNING
- Cuando
now >= registrationClosesAt
- Cuando
-
RUNNING → JUDGING
- Cuando
now >= judgingStartsAt
- Cuando
-
JUDGING → FINISHED
- Cuando
now >= judgingEndsAt
- Cuando
💡 Casos de Uso Reales
Caso 1: Necesitas más tiempo para el hackathon
Situación: El hackathon está en RUNNING y necesitas 3 días más.
Solución:
- Extiendes
endsAten +3 días - Extiendes
submissionDeadlineen +3 días - Extiendes
judgingStartsAten +3 días - El sistema valida que el orden se mantiene
Caso 2: Necesitas más tiempo para la evaluación
Situación: El hackathon está en JUDGING y necesitas 2 días más.
Solución:
- Extiendes
judgingEndsAten +2 días - El sistema valida que no excede +7 días
Caso 3: Error en las fechas iniciales (antes de publicar)
Situación: Creaste un hackathon en DRAFT con fechas incorrectas.
Solución:
- Como está en DRAFT, puedes modificar todas las fechas
- El sistema valida el orden completo
- Publicas cuando esté correcto
⚠️ Limitaciones Actuales
- No se puede acortar fechas: Solo extensiones están permitidas
- Límite de +7 días: Extensiones mayores requieren modificación manual en la DB
- No hay validación de ownership: Cualquier ORGANIZER/ADMIN puede modificar cualquier hackathon (se implementará en el futuro con
organizerId)
🔮 Mejoras Futuras
- Validación de ownership: Solo el ORGANIZER que creó el hackathon puede modificarlo
- Historial de cambios: Registrar quién y cuándo modificó las fechas
- Notificaciones: Avisar a participantes cuando se extienden fechas
- Extensiones ilimitadas con justificación: Permitir extensiones mayores con aprobación de ADMIN
Última actualización: 31 de diciembre, 2025