Saltar al contenido principal

📅 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 registrationOpensAt si el hackathon ya está en REGISTRATION
  • ❌ No puedes cambiar registrationClosesAt si el hackathon ya está en RUNNING
  • ❌ No puedes cambiar startsAt si el hackathon ya está en RUNNING
  • ❌ No puedes cambiar endsAt si el hackathon ya está en JUDGING
  • ❌ No puedes cambiar submissionDeadline si el hackathon ya está en JUDGING

2. Solo se puede ALARGAR (extender), nunca acortar

  • ✅ Puedes extender startsAt si el hackathon está en REGISTRATION
  • ✅ Puedes extender submissionDeadline si el hackathon está en RUNNING
  • ✅ Puedes extender judgingEndsAt si 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 ActualFechas que se pueden modificarEjemplo
DRAFTTodas las fechas (validación completa)Puedes cambiar cualquier fecha antes de publicar
REGISTRATIONstartsAt, endsAt, submissionDeadline, judgingStartsAt, judgingEndsAtPuedes alargar el inicio del hackathon
RUNNINGsubmissionDeadline, judgingStartsAt, judgingEndsAtPuedes alargar el deadline de submissions
JUDGINGSolo judgingEndsAtPuedes alargar el fin de la evaluación
FINISHEDNingunaNo 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 AM
  • endsAt: 12 de enero, 6:00 PM
  • submissionDeadline: 12 de enero, 4:00 PM
  • judgingStartsAt: 13 de enero, 9:00 AM
  • judgingEndsAt: 15 de enero, 6:00 PM

¿Qué puedes hacer?

  • ✅ Alargar startsAt hasta el 17 de enero (máximo +7 días)
  • ✅ Alargar endsAt hasta el 19 de enero
  • ✅ Alargar submissionDeadline hasta el 19 de enero
  • ✅ Alargar judgingStartsAt hasta el 20 de enero
  • ✅ Alargar judgingEndsAt hasta el 22 de enero
  • NO puedes modificar registrationOpensAt o registrationClosesAt (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 PM
  • judgingStartsAt: 13 de enero, 9:00 AM
  • judgingEndsAt: 15 de enero, 6:00 PM

¿Qué puedes hacer?

  • ✅ Alargar submissionDeadline hasta el 19 de enero (máximo +7 días)
  • ✅ Alargar judgingStartsAt hasta el 20 de enero
  • ✅ Alargar judgingEndsAt hasta el 22 de enero
  • NO puedes modificar startsAt o endsAt (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 judgingEndsAt hasta 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:

  1. DRAFT → REGISTRATION

    • Cuando now >= registrationOpensAt
    • Y el hackathon tiene al menos 1 criterio
  2. REGISTRATION → RUNNING

    • Cuando now >= registrationClosesAt
  3. RUNNING → JUDGING

    • Cuando now >= judgingStartsAt
  4. JUDGING → FINISHED

    • Cuando now >= judgingEndsAt

💡 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:

  1. Extiendes endsAt en +3 días
  2. Extiendes submissionDeadline en +3 días
  3. Extiendes judgingStartsAt en +3 días
  4. 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:

  1. Extiendes judgingEndsAt en +2 días
  2. 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:

  1. Como está en DRAFT, puedes modificar todas las fechas
  2. El sistema valida el orden completo
  3. Publicas cuando esté correcto

⚠️ Limitaciones Actuales

  1. No se puede acortar fechas: Solo extensiones están permitidas
  2. Límite de +7 días: Extensiones mayores requieren modificación manual en la DB
  3. No hay validación de ownership: Cualquier ORGANIZER/ADMIN puede modificar cualquier hackathon (se implementará en el futuro con organizerId)

🔮 Mejoras Futuras

  1. Validación de ownership: Solo el ORGANIZER que creó el hackathon puede modificarlo
  2. Historial de cambios: Registrar quién y cuándo modificó las fechas
  3. Notificaciones: Avisar a participantes cuando se extienden fechas
  4. Extensiones ilimitadas con justificación: Permitir extensiones mayores con aprobación de ADMIN

Última actualización: 31 de diciembre, 2025