← Bibliothèque / Commerce
Réservations & calendrier (activités, tours, excursions)
Le module résa le plus abouti : 12 statuts, inventaire multi-dates recalculé, commissions OTA, création comptoir idempotente, manifeste du jour et fermeture de journée.
Construit à partir de :
tourisme-backoffice (Aqua Safari)reva-tourismebookflow
Dans le back office
Section Commercial (liste + fiche + nouvelle réservation) · Section Pilotage (Calendrier + Journée du jour) · Rapports à côté des KPI.
Pages & écrans
| Page / zone | Rôle |
|---|---|
/reservations | Liste : borne serveur 400 lignes + total réel affiché ; recherche réf/nom/email/prestation ; 6 filtres chips (Solde à encaisser, Confirmées, À traiter, Places de marché…) ; pagination incrémentale 40 |
/reservations/[id] | Fiche : référence mono lisible, statut/canal, total/payé/solde (null ≠ 0), fenêtre annulation 24 h std / 72 h privé-groupe, commission OTA + net, participants complets (allergies-poids-certif-vol-waiver) ; actions Confirmer / Annuler météo-client / Reprogrammer / Encaisser |
/reservations/nouvelle | Wizard comptoir : produit → créneau → quantités → options → canal (whatsapp/phone/walk_in/agent/direct) → revendeur → pickup → client (email optionnel .invalid synthétique) → acompte. RPC transactionnelle + idempotence hashée clé+saisie |
/calendrier | 21 jours glissants (−3) : remplissage par jour, ressources affectées, alerte sans guide ; grille ou liste ; clic jour → écran Jour ancré sur le départ |
/jour | Manifeste embarquement : pointage présent/absent/inconnu optimiste avec rollback, allergies/poids/certification/vol/pickup/langue/imprimante ; bouton Fermer la journée = blackout −31 j + liste d'appel triée (tél, email, langue, canal, pax réels) |
/rapports | 5 StatCards (encaissé, commissions, remplissage, passagers du mois, absences), courbe 14 j, tables par prestation/commissions, répartition par canal |
Patterns UI/UX
- StatusBadge + SourceBadge colorés
- FillBar jauge remplissage
- MentionHypothèse bandeau capacité non garantie
- verbes métier partagés écran↔action (ACCEPTABLES/ANNULABLES/LOCKS_INVENTORY)
Composants clés
- BookingsTable
- ManualBooking wizard
- DayManifest
- FermerJournee dialog
- CalendarView
- BookingActions/Encaisser
Automatisations
- Triggers SQL : seats_taken RECALCULÉ jamais incrémenté (sync_departure_seats, verrous ordonnés, CHECK anti-surbooking)
- day_key/slot_local générées Pacific/Tahiti en base
- Resync inventaire à la suppression d'essais + garde refus départ fermé
Intelligence artificielle
- Rôle IA
- L'agent BO peut changer_statut_reservation (liste blanche, statuts figés interdits) et fermer_depart (heure HH:MM stricte) — max 1 mutation/message, annoncée avant écriture.
- Modèles
- modèle centralisé shell
- Garde-fous
- annulation ≠ remboursement automatique ni envoi — assumé et dit à l'écran
Données
- bookings (status×12, source×7, commission_pct, idempotency_key unique partiel, reference counters AS-10234)
- departures (capacity_total, seats_taken recalculé, inventory_group)
- booking_lines/booking_addons snapshots figés
- participants
- booking_occupancy (source de vérité intervalle)
- price_references OTA observés (jamais sommés au CA)
Invariants & pièges
- Les 6 statuts LOCKS_INVENTORY bloquent l'inventaire (règle Checkfront)
- montant null = inconnu, JAMAIS ?? 0 (sumXpf/resteDu centralisés lib/money.ts)
- exclusive_use privatif bloque tout le créneau + annulation 72 h
- Fermer la journée n'est PAS une annulation : RPC close_days atomique