✈ full vuelos Vuela bien, vuela barato

Cancelación y check-in

Cancelación

POST /practica-vuelos/reservas/{codigo}/cancelar.

Reglas:

  • Solo el dueño de la reserva puede cancelarla (un código ajeno responde 404, no 403 — no se revela la existencia).
  • Solo reservas confirmadas; cancelar dos veces responde La reserva ya está cancelada.
  • Solo si faltan más de 24 horas para el primer vuelo: Solo puedes cancelar hasta 24 horas antes del primer vuelo.

Efectos de una cancelación exitosa:

  • Estado → cancelled (definitivo; no hay reactivación).
  • Los asientos de todos los tramos vuelven al inventario (sumando los pasajeros con silla, con tope en seats_total), en la misma transacción con bloqueo de filas.

Selección de asiento

GET|POST /practica-vuelos/reservas/{codigo}/asientos.

  • Derecho a elegir (can_select_seats): reserva confirmada, sin check-in, primer vuelo en el futuro y (tarifa Full en algún tramo o extra seat_selection comprado o ventana de check-in abierta — entonces es gratis).
  • Se elige un asiento por pasajero con silla (en orden de pasajeros) sobre el vuelo de ida (mapa 30 filas × letras A–F, estilo A320). Los bebés nunca reciben asiento.
  • Validaciones: asiento existente (El asiento X no existe.), no repetido dentro de la misma selección (El asiento X está repetido.), no ocupado por otra reserva del mismo vuelo (El asiento X ya está ocupado.).
  • Re-elegir está permitido hasta el check-in: los asientos actuales de la propia reserva no cuentan como ocupados.
  • Sin derecho, el GET responde 400 con el detalle de la reserva y el mensaje: La selección de asiento está incluida en la tarifa Full, se puede comprar como extra, o es gratis durante el check-in (24 horas antes del vuelo).

Check-in

POST /practica-vuelos/reservas/{codigo}/checkin (también listado en /checkin con las reservas elegibles).

Reglas:

  • Misma regla de propiedad (404 para códigos ajenos).
  • Ventana: [salida del primer vuelo − 24 h, salida). Antes: El check-in abre 24 horas antes del primer vuelo y cierra a la hora de salida.
  • Una sola vez por reserva: Esta reserva ya hizo el check-in.
  • Una reserva cancelada nunca es elegible.

Efectos del check-in:

  • checked_in_at queda marcado.
  • Los asientos ya elegidos se conservan. Cada pasajero con silla sin asiento recibe uno asignado automáticamente en orden de filas (1A, 1B, …, letras A–F), saltando los asientos ya ocupados por otros pasajeros del mismo vuelo. La asignación es determinística y nunca repite asientos. Los bebés quedan sin asiento (En regazo).

Matriz de estados visible en la UI

Estado Etiqueta Acciones
Confirmada, > 24 h, con derecho a asientos Confirmada Elegir asientos, Cancelar
Confirmada, > 24 h, sin derecho a asientos Confirmada Cancelar
Confirmada, dentro de 24 h Confirmada Elegir asientos (gratis), Hacer check-in
Check-in hecho Check-in hecho + fecha Ninguna
Cancelada Cancelada Ninguna