Aller au contenu

Du clic au paiement

flowchart TD
  subgraph client["Client ou prospect"]
    e1["Parcours public, étape 5<br/>Accepter et payer"]:::action
    e2["Page de l'offre<br/>lien signé reçu par email"]:::action
    e4["Portail client<br/>payer une facture"]:::action
    c["Page de choix<br/>carte ou SEPA"]:::action
    ret["Page de retour<br/>succès, en cours ou annulé"]:::action
  end
  subgraph equipe["Courtier ou équipe Inqase"]
    e3["Envoie le lien de paiement"]:::action
    m1["EMAIL : Lien de paiement<br/>À : adresses choisies, par défaut le contact de l'offre<br/>Type : transactionnel"]:::email
  end
  subgraph systeme["Système et Stripe"]
    x0["Offre expirée<br/>retour à l'étape 4 pour recalculer"]:::problem
    b["Paiement ouvert, en attente<br/>offre : paiement en attente<br/>paiements des autres offres annulés"]:::status
    d["Page de paiement Stripe<br/>abonnement"]:::external
    s1["Stripe confirme la saisie<br/>paiement en cours"]:::external
    s2["Stripe crée l'abonnement<br/>accès au portail client"]:::external
    s3["Stripe confirme la facture payée"]:::external
    ok["Paiement payé<br/>offre : paiement confirmé<br/>offre acceptée, autres offres rejetées"]:::done
    x1["Aucun email de confirmation de paiement<br/>au premier paiement"]:::problem
  end
  e1 -->|offre expirée| x0
  e1 -->|clique| b
  e2 -->|clique| b
  e3 -->|ouvre le paiement| b
  e3 -->|choisit d'envoyer| m1
  m1 -->|lien valable 30 jours| c
  e4 -->|lien valable 30 minutes| c
  b --> d
  c --> d
  d -->|le client paie| ret
  d -->|Stripe notifie| s1
  s1 --> s2
  s2 -->|carte : tout de suite, SEPA : plus tard| s3
  s3 --> ok
  ok -.-> x1
  classDef action fill:#ffe86d,stroke:#a28e26,color:#574900
  classDef status fill:#9ce6ff,stroke:#2c97bb,color:#1c4657
  classDef done fill:#b3e65f,stroke:#6f9a24,color:#2c4300
  classDef problem fill:#ffb575,stroke:#b8742f,color:#5a2d00
  classDef email fill:#b8acfb,stroke:#8a7be0,color:#231266
  classDef external fill:#e5e7eb,stroke:#9ca3af,color:#374151

Le clic ouvre un paiement en attente, mais seule la notification de Stripe sur la facture payée fait passer l’offre à acceptée.

  1. Le client clique sur « Accepter et payer » (parcours public ou page de l’offre), ou ouvre le lien reçu du courtier ou de l’équipe, ou paie une facture depuis son portail.
  2. Il choisit carte ou SEPA et le rythme de paiement. Une offre expirée est refusée : le parcours public renvoie à l’étape 4 pour recalculer.
  3. Inqase ouvre un paiement en attente, met l’offre en attente de paiement et annule les paiements en attente des autres offres du même dossier.
  4. Le client paie sur la page Stripe. Stripe confirme la saisie (paiement en cours), puis crée l’abonnement, ce qui ouvre l’accès au portail.
  5. Stripe confirme la facture payée : le paiement passe à payé, l’offre à paiement confirmé et acceptée, les autres offres sont rejetées.
  6. La création de la police démarre aussitôt.
  • Aucun email de paiement n’est envoyé au premier paiement : le seul email d’achat est celui de l’émission. Si l’émission échoue, le client ne reçoit rien. Est-ce acceptable ?
  • En SEPA, la police n’est émise qu’à l’encaissement, pas à la saisie. Le délai réel n’est pas dans le code (l’ancien schéma disait 1 à 3 jours). Que voit et que reçoit le client pendant l’attente ?
  • Le lien de paiement du portail client vaut 30 minutes, celui envoyé par le courtier 30 jours. Cet écart est-il voulu ?
  • Sur la page de l’offre, un client avec une offre expirée voit un message d’erreur sans chemin de relance. Que doit-il faire ?
  • Deux offres payées sur le même dossier : la seconde ne crée aucune police, seule une alerte dans les journaux demande un remboursement à la main. Faut-il alerter l’équipe ?

Les règles de l’acceptation au paiement, de l’ordre des notifications Stripe et du paiement unique par offre sont dans Paiements. Le cycle de vie de l’offre est dans Cycle de vie de l’offre.

  • app/Services/PaymentService.php
  • app/Http/Controllers/StripeWebhookController.php
  • app/Http/Controllers/PaymentLinkController.php, QuoteViewController.php
  • app/Http/Controllers/Quote/QuoteFlowController.php
  • app/Observers/QuoteRequestOfferAcceptanceObserver.php