// Creación de reservaciones en el backend Lumen (ruta protegida con middleware de socio). import { apiFetch } from "./api-client"; import { extrasSeleccionados, HORA_CITA, type ReservaEstado } from "./reserva-flujo"; export type ReservacionPayload = { vuelo_codigo: string; globo_id: string; fecha_vuelo: string | null; fecha_por_confirmar: boolean; hora_cita: string; lugar_cita: string; idioma: string; adultos: number; ninos: number; pasajeros: { nombre: string; apellidos: string; telefono: string; peso: string }[]; extras: { id: string; nombre: string; cantidad: number; precio: number; importe: number }[]; certificados: { nombre: string; frase: string }[]; cupon: string | null; metodo_pago: string; subtotal_vuelos: number; subtotal_extras: number; descuento: number; impuestos: number; total: number; comision: number; comision_porcentaje: number; terminos_aceptados: boolean; fecha_aceptacion: string; version_terminos: string; }; export type ReservacionRespuesta = { folio?: string; codigo?: string; id?: number | string; message?: string; data?: { folio?: string; codigo?: string; id?: number | string }; }; export function construirPayloadReservacion( estado: ReservaEstado, desglose: { subtotalVuelos: number; subtotalExtras: number; descuento: number; impuestos: number; total: number; }, extra: { comision: number; porcentaje: number; versionTerminos: string }, ): ReservacionPayload { return { vuelo_codigo: estado.vueloId, globo_id: estado.globoId, fecha_vuelo: estado.fechaPorConfirmar ? null : estado.fecha || null, fecha_por_confirmar: estado.fechaPorConfirmar, hora_cita: HORA_CITA, lugar_cita: estado.lugarCita, idioma: estado.idioma, adultos: estado.adultos, ninos: estado.ninos, pasajeros: estado.pasajeros.map((p) => ({ nombre: p.nombre, apellidos: p.apellidos, telefono: p.telefono, peso: p.peso, })), extras: extrasSeleccionados(estado.extras).map((e) => ({ id: e.id, nombre: e.nombre, cantidad: e.cantidad, precio: e.precio, importe: e.importe, })), certificados: estado.certificados.map((c) => ({ nombre: c.nombre, frase: c.frase })), cupon: estado.cuponCodigo || null, metodo_pago: estado.metodoPago, subtotal_vuelos: Math.round(desglose.subtotalVuelos * 100) / 100, subtotal_extras: Math.round(desglose.subtotalExtras * 100) / 100, descuento: Math.round(desglose.descuento * 100) / 100, impuestos: Math.round(desglose.impuestos * 100) / 100, total: Math.round(desglose.total * 100) / 100, comision: Math.round(extra.comision * 100) / 100, comision_porcentaje: extra.porcentaje, terminos_aceptados: estado.terminosAceptados, fecha_aceptacion: estado.fechaAceptacion || new Date().toISOString(), version_terminos: extra.versionTerminos, }; } /** POST /reservaciones — devuelve el folio asignado por el backend si existe. */ export async function crearReservacion(payload: ReservacionPayload): Promise { const res = await apiFetch("/reservaciones", { method: "POST", auth: true, body: payload, mensajeError: "No pudimos registrar la reservación en el sistema.", }); const folio = res.folio ?? res.codigo ?? res.data?.folio ?? res.data?.codigo ?? res.id ?? res.data?.id; return folio ? String(folio) : null; }