Skip to content

feat: rappels auto, paiement en ligne et formulaire pré-consultation - #4

Merged
Zoubeir23 merged 4 commits into
mainfrom
Feature/rappels-paiement-formulaire
May 25, 2026
Merged

Zoubeir23 merged 4 commits into
mainfrom
Feature/rappels-paiement-formulaire

Conversation

@Zoubeir23

@Zoubeir23 Zoubeir23 commented May 25, 2026

Copy link
Copy Markdown
Owner

Résumé

  • Rappels automatiques — cron Vercel toutes les heures, fenêtre J-1 (23h–25h), envoi email + SMS via sendNotification, marquage reminder_sent_at pour éviter les doublons
  • Paiement en ligne patient — Stripe Checkout depuis le portail patient, webhook mis à jour, migration payment_status + stripe_checkout_session_id sur appointments, banner de retour succès/annulation
  • Formulaire pré-consultation — patient remplit depuis le portail (raison, symptômes, médicaments, allergies, douleur), données stockées en JSONB, médecin les voit dans la fiche patient avec allergies mise en évidence

Corrections suite à la code review

  • Cron : createClient()createAdminClient() (RLS bloquait les requêtes sans session)
  • Checkout Stripe : guard idempotency sur pending, update atomique .eq("payment_status", "not_required") via adminClient
  • Formulaire : validation Zod avec limites de taille, guard .is("preconsultation_submitted_at", null) contre les re-soumissions
  • RLS migration 020 : restriction status IN ('booked', 'confirmed') dans USING et WITH CHECK
  • Index ajouté sur stripe_checkout_session_id
  • Validation explicite de NEXT_PUBLIC_APP_URL avec 500 si absent
  • Allowlist ["success", "cancelled"] sur le query param ?payment=

Plan de test

  • Vérifier que le cron /api/cron/appointment-reminders répond 200 avec Bearer CRON_SECRET
  • Créer un RDV avec un service tarifé → bouton "Payer X€" visible dans le portail patient
  • Compléter le paiement Stripe test → vérifier payment_status = paid en base
  • Remplir le formulaire pré-consultation → vérifier qu'il apparaît dans la fiche patient côté médecin
  • Vérifier qu'une seconde soumission du formulaire est bloquée
  • Tester le retour ?payment=success et ?payment=cancelled
  • Vérifier les variables d'env : CRON_SECRET, RESEND_FROM_ADDRESS

Summary by CodeRabbit

Notes de version

  • Nouvelles fonctionnalités
    • Les patients peuvent désormais remplir et soumettre des formulaires de pré-consultation avec leur historique médical, symptômes, médicaments, allergies et niveau de douleur avant leurs rendez-vous
    • Le traitement sécurisé des paiements pour les rendez-vous est maintenant disponible via paiement en ligne
    • Le statut de paiement des rendez-vous est désormais suivi et affiché dans le portail patient avec boutons de paiement pour les rendez-vous impayés
    • Les notifications de rappel de rendez-vous ont été améliorées

Review Change Stack

Copilot AI review requested due to automatic review settings May 25, 2026 03:49
@coderabbitai

coderabbitai Bot commented May 25, 2026

Copy link
Copy Markdown
ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Free

Run ID: c0c0e718-99ec-4166-bfd2-d013d3ea3ee3

📥 Commits

Reviewing files that changed from the base of the PR and between f3d8507 and ae5bbc6.

📒 Files selected for processing (14)
  • .env.example
  • actions/patient-portal.ts
  • actions/preconsultation.ts
  • app/(app)/app/patients/[id]/page.tsx
  • app/api/cron/appointment-reminders/route.ts
  • app/api/payments/appointment-checkout/route.ts
  • app/api/webhooks/stripe/route.ts
  • app/portail/dashboard/page.tsx
  • components/appointments/preconsultation-card.tsx
  • components/portail/pay-appointment-button.tsx
  • components/portail/payment-status-banner.tsx
  • components/portail/preconsultation-form.tsx
  • supabase/migrations/019_appointment_payment.sql
  • supabase/migrations/020_appointment_preconsultation_form.sql

📝 Walkthrough

Walkthrough

Cette PR introduit un flux de paiement complet pour les rendez-vous via Stripe, combiné avec la collecte de formulaires de pré-consultation. Elle ajoute un schéma de base de données, des actions serveur, des routes API, des composants UI et intègre ces fonctionnalités dans les tableaux de bord patient et administrateur.

Changes

Appointment Payment and Preconsultation Feature

Layer / File(s) Summary
Database schema and data model
supabase/migrations/019_appointment_payment.sql, supabase/migrations/020_appointment_preconsultation_form.sql, actions/patient-portal.ts
Les migrations ajoutent payment_status, stripe_checkout_session_id, preconsultation_form, et preconsultation_submitted_at à la table appointments, avec une policy RLS pour les soumissions patient. Le type PortalAppointment et la requête de données sont étendus pour exposer ces champs.
Preconsultation form server action
actions/preconsultation.ts
Une action serveur submitPreconsultationForm valide les données avec Zod, authentifie l'utilisateur, localise le patient associé, et effectue une mise à jour atomique et idempotente du rendez-vous avec le formulaire et l'horodatage de soumission.
Stripe appointment checkout and webhook
app/api/payments/appointment-checkout/route.ts, app/api/webhooks/stripe/route.ts
Une route POST lance une session Stripe Checkout après vérification de la propriété du rendez-vous, puis stocke atomiquement l'identifiant de session. Le webhook checkout.session.completed est acheminé vers un gestionnaire spécifique aux rendez-vous qui met à jour le statut de paiement à « payé ».
Cron job notification update
app/api/cron/appointment-reminders/route.ts
Le gestionnaire de rappels utilise désormais un client admin Supabase et appelle sendNotification au lieu de sendConfirmationEmail. Le statut et la gestion des erreurs de la réponse sont affinés.
Payment and preconsultation UI components
components/appointments/preconsultation-card.tsx, components/portail/preconsultation-form.tsx, components/portail/payment-status-banner.tsx, components/portail/pay-appointment-button.tsx
Quatre nouveaux composants client : PreconsultationCard affiche les données de formulaire soumises ; PreconsultationForm collecte et valide les champs ; PayAppointmentButton lance le paiement Stripe ; PaymentStatusBanner confirme le succès ou l'annulation.
Patient dashboard payment and preconsultation integration
app/portail/dashboard/page.tsx
Le tableau de bord accepte le paramètre de requête payment, affiche un bandeau de statut, calcule canPay, et rend PayAppointmentButton et PreconsultationForm pour chaque rendez-vous à venir.
Admin appointment details preconsultation display
app/(app)/app/patients/[id]/page.tsx
La page détail du rendez-vous admin importe et rend PreconsultationCard lorsque les données de pré-consultation sont présentes, permettant au personnel d'examiner les formulaires soumis.
Environment configuration
.env.example
Ajout de la variable d'environnement CRON_SECRET pour sécuriser les routes cron.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Poem

🐰 Un formulaire de soin, un paiement en ligne,
Les rendez-vous se structurent, tout s'aligne,
Stripe et Supabase dansent ensemble,
Pendant que les patients remplissent leur ensemble,
De données précises pour soins plus juste!


Note

🎁 Summarized by CodeRabbit Free

Your organization is on the Free plan. CodeRabbit will generate a high-level summary and a walkthrough for each pull request. For a comprehensive line-by-line review, please upgrade your subscription to CodeRabbit Pro by visiting https://app.coderabbit.ai/login.

Comment @coderabbitai help to get the list of available commands and usage tips.

@Zoubeir23
Zoubeir23 merged commit f96b3b4 into main May 25, 2026
2 of 3 checks passed
@Zoubeir23
Zoubeir23 removed the request for review from Copilot May 25, 2026 04:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant