Workflows métier principaux
Parcours utilisateur de bout en bout. À mettre à jour quand un parcours change ou qu'un nouveau workflow apparaît.
1. Création d'un voyage catalogue
- Commercial crée un
Travelen statutDraftviaPages/Travels/Create(SPA Vuetravel-design). - Saisie des données : description, journées (
TravelDay), accommodations principales et secondaires, activités, lignes de chargement/dépose, prix indicatifs, pictures, etc. StageProgresspermet de jalonner la création (workflow interne — utilisation à confirmer côté équipe).- Génération des
Occurrence(instances datées) avec leurs prix par tier (SellingPrice/Junior/Child + variantes OneWay), capacités,RoomTypeQuotanégociés avec hôtels. - Travel passe en
Status = Published→ visible côté API web/mobile.
2. Création d'une rotation balnéaire (Seaside)
- Travel de type
Seasidecréé avecAccommodationprincipale etTravelCategory(= la destination, ex: Costa Brava). - Création des
SeasideDatealler (IsReturn = false) et retour (IsReturn = true) dansPages/SeasideDates/. - Plusieurs
Occurrencepartageant la mêmeTravelCategoryId + Datese regroupent automatiquement sur la même rotation (= même car). - Affectation des véhicules par
SeasideDate.
3. Réservation back-office
- Commercial ouvre
/Bookings/CreateUpdate(SPA Vuebooking). - Étape Général : sélection client (ou création), occurrence, nombre de passagers (déclenche discount auto pour 8+ pax sauf OneDay).
- Étape Passagers : nom/prénom/civilité/date-naissance/téléphone par passager. Si client inclus, le 1er passager est pré-rempli (Vue store auto-fill).
- Étape Accommodations & Activities : assignation chambre, options, activités optionnelles.
- Étape Confirmation : prix calculé via
BookingService.GetCostPerPassenger. - Sauvegarde :
BookingController.Create([FromBody] BookingDto)ouPages/Bookings/CreateUpdate.OnPostselon le canal. - Si paiement immédiat (
registerPayment=true) : créationPayment+ factureConfirmation(acompte) → statutConfirmed. Sinon le booking reste enDraft.
4. Réservation web/mobile (API)
- Site web ou app mobile crée un booking via
POST /api/BookingavecpaymentDepositOnly = true|false. - Booking créé en
BookingStatus.PendingWebOrMobileavecTransactionIddu paiement Saferpay/CembraPay initialisé. - Le client paie côté Saferpay/CembraPay (montant = acompte si
paymentDepositOnly=true, sinon total). - Worker (1 minute)
IOnlinePaymentService.CheckPendingPayments:- Interroge Saferpay/CembraPay pour le statut.
- Si succès : capture transaction, crée
Payment, crée Invoice (Confirmationsi deposit only,SimpleouBalancesi total), bascule statut →ConfirmedouBilled, envoie email confirmation. - Si échec/timeout : marque comme tel, le booking peut être supprimé.
- Important : le site web doit lire
Travel.DepositPercentagevia API et NE PAS hardcoder un pourcentage (cf. business-rules).
5. Génération facture & sync NAV
- Booking passe en
Confirmed→BillServicegénère Invoice de typeConfirmation(acompte). - Plus tard, passage en
Billed→ génère InvoiceBalance(solde). - Pour chaque facture émise :
- Génération PDF via
PdfGeneratorService(templates LiquidConfirmation.liquid,Balance.liquid, etc. +QrBillConfirmationBalance.liquid). - Post vers NAV/BC :
NavSalesInvoiceService.CreateAsyncpuisNavPostDocumentpour poster ; leNavNorevient et est stocké sur l'Invoice.
- Génération PDF via
- Encaissement : à chaque
Payment, post vers NAV viaNavPaymentService. - Toutes les factures partent en BC (Confirmation, Balance, Simple, Cancellation, CancellationInsurance, BuchardPart, Compensation).
6. Annulation booking
- Commercial déclenche annulation via
Pages/Bookings/Cancel(SPAcancel-booking). - Choix de la
CancellationAction(frais retenus, remboursement total, transfert à l'assurance…). - Création Invoice
Cancellation(frais Buchard) et/ouCancellationInsurance(transmission à l'assurance). - Si remboursement : création
Paymentnégatif et post NAV. - Booking passe en
Canceled. Si annulation partielle (certains passagers seulement),Booking.Statusreste actif et lesBookingPassengerannulés ontCancelled = true.
7. Constitution dossier chauffeur
- Quelques jours avant le départ, l'exploitation va dans
Pages/LoadingTables. - Sélection des occurrences à grouper, création/édition d'un
LoadingTable(avecReturns = falsepour aller). - Sync VP : les chauffeurs/hôtesses du voyage sont récupérés depuis Visual Planning (lus via
VisualPlanningService.GetTravelDriversAndHostsByOccurrence). - Ajout manuel de
LoadingTableEntry(= petits cars de chargement par région). Les chauffeurs de chargement VP sont remplis automatiquement à partir deeditables[1..](la première ligne reçoit le chauffeur du voyage principal). - Saisie horaires aux
Stop(surcharge desTimetablepar défaut viaLoadingTableTimetableStop). - Export Excel
DriverFolder(Pages/LoadingTables/DriverFolder) → liste passagers + plan véhicule + horaires + tableau de chargement.
8. Sync Visual Planning daily
Worker.DoDailyJob > VisualPlanningService.SyncHostsAndDrivers :
- Interroge l'API VP pour la liste des collaborateurs actifs.
- Pour chacun, met à jour ou crée la
Resourcecorrespondante (mappingVisualPlanningId). CustomerService.CleanGuestCustomerspurge les comptes guest sans booking/gift/membership rattaché.
9. Bon cadeau : émission
Voie back-office Horizon
- Commercial ouvre
Pages/Gifts/Create. - Saisit montant, émetteur, bénéficiaire.
- Sauvegarde → création
Gift+ facture (catégorieGift). - Encaissement (en bureau ou via lien CB).
- Pas d'envoi email auto. L'agent imprime / envoie manuellement.
Voie web/mobile
- Achat sur le site → création
Gift+ paiement Saferpay/CembraPay. - Worker valide le paiement (1 minute).
- Email envoyé automatiquement au bénéficiaire avec le bon (et envoi physique si
IncludeEnvelope).
10. Bon cadeau : utilisation (encaissement)
- Bénéficiaire utilise son bon lors d'une réservation.
- Le bon est appliqué partiellement ou totalement sur l'Invoice.
- Si solde restant :
Gift.RemainingValueest mis à jour, le bon reste utilisable.
11. Adhésion Club Buchard
Émission
- Création de la membership via
Pages/SettingsXxx/...ou via web (souscription en ligne). - Facture
InvoiceCategory.Membership(ouMembershipRenew). Customer.ClubMembershipTypemis à jour (SingleouCouple).Customer.PaymentTypestocke ici le moyen de paiement utilisé pour la souscription (uniquement).
Renouvellement annuel
- Notifications de renouvellement (à confirmer côté équipe).
- Si souscrit en ligne, paiement Saferpay/Cembra → facture
MembershipRenew.
12. Auth client final (site web/mobile)
- Login via
Areas/Api/LoginController(POST email + password). AuthServicevalide le password (BCrypt + fallbackWordPressPasswordHasherpour les anciens comptes migrés).- Génération JWT +
CustomerRefreshTokenpersisté. - Client utilise le JWT pour les requêtes API ultérieures (
[Authorize(Policy = "Api")]). - Refresh token utilisé pour renouveler le JWT.
13. Auth back-office (utilisateur Buchard)
- Login via
Areas/Identity/Account/Login. - Cookie d'authentification ASP.NET Identity.
DefaultPolicyexigée sur tous les Razor Pages,AuthorizeFolder("/", "DefaultPolicy")automatique.
14. Auth back-office avec 2FA (TOTP)
Login avec 2FA déjà activé
- Email + mot de passe sur
/Identity/Account/Login. - Le
SignInManagerretourneRequiresTwoFactor→ redirection vers/Identity/Account/LoginWith2fa. - Saisie du code à 6 chiffres de l'app d'authentification (
TwoFactorAuthenticatorSignInAsync). En secours :LoginWithRecoveryCode(code de récupération à usage unique).
Date butoir et activation
- Date butoir fixe en config :
TwoFactor:SetupDeadline(appsettings,yyyy-MM-dd, UTC), identique pour tous. - Avant la date : accès normal + bannière de rappel (dans
_Layout) invitant à configurer le 2FA. - L'utilisateur active quand il veut via
/Identity/Account/Manage/EnableAuthenticator: scan du QR (clé otpauth rendue client-side), vérification d'un code, génération de 10 codes de récupération (ShowRecoveryCodes) puis retour à/. - À partir de la date sans 2FA :
Enforce2faMiddlewareforce la redirection vers la page d'activation, aucune autre page accessible (mécanique identique àRedirectPendingUserMiddleware).
Exemptions & reset
- Comptes Microsoft SSO (
IsMicrosoftAccount) : jamais soumis au 2FA applicatif (MFA géré par Azure AD). - En cas de perte du téléphone : recovery codes, ou reset par un admin depuis la modale d'édition utilisateur (
/Users/ResetTwoFactor) qui désactive le 2FA et réinitialise la clé (la date butoir fixe s'applique ensuite).
Contributors
No contributors
Changelog
No recent changes

