queue-med/MANUS_HANDOFF.md
Tarzzan 526f68dad1 feat: QueueMed v1.0.0 — Documentation et handoff
- README.md complet avec stack, routes, architecture DB
- MANUS_HANDOFF.md avec état du projet et roadmap
- todo.md avec toutes les fonctionnalités
- Schema Drizzle de référence dans docs/

Fonctionnalités v1.0.0 :
- File d'attente virtuelle temps réel (WebSocket/Socket.io)
- QR code anti-triche rotatif par cabinet
- Interface patient mobile (position live, alertes)
- Écran d'affichage tablette/moniteur
- Tableau de bord médecin complet
- Analytics + export CSV
- Tickets imprimables
- Système d'abonnement (essai 30j, blocage)
- Multi-cabinets

Auteur: William MERI
2026-02-27 10:49:35 -05:00

4.5 KiB

MANUS_HANDOFF — QueueMed v1.0.0

Fichier de passation pour la continuité du développement.
Dernière mise à jour : 2026-02-27 — William MERI


État actuel du projet

Version : 1.0.0
Statut : Production-ready (fonctionnalités core complètes, Stripe à activer)
Tests : 8/8 passent, 0 erreurs TypeScript
Checkpoint Manus : a63c623c


Ce qui est implémenté

Backend (server/)

  • routers.ts — 20+ procédures tRPC : auth, clinics, queue, analytics
  • db.ts — Helpers Drizzle pour toutes les tables
  • _core/index.ts — Serveur Express + Socket.io intégré
  • Middleware subscriptionProcedure — Bloque les procédures si abonnement expiré
  • Rotation automatique du QR code (configurable par cabinet)
  • Procédure analytics.exportCsv — Export CSV des événements

Frontend (client/src/)

  • pages/Home.tsx — Landing page cinématique (hero, features, how-it-works, témoignages, pricing, CTA)
  • pages/Dashboard.tsx — Tableau de bord médecin (KPIs, liste cabinets, actions rapides)
  • pages/DoctorClinics.tsx — Gestion des cabinets (CRUD, QR code, paramètres)
  • pages/QueueManagement.tsx — Gestion file temps réel (appel suivant, absent, retirer, imprimer ticket)
  • pages/Analytics.tsx — Graphiques affluence, export CSV, recommandations IA
  • pages/PatientQueue.tsx — Interface patient (position live, temps estimé, alertes)
  • pages/DisplayScreen.tsx — Écran d'affichage tablette (numéro animé, ticker, connexion status)
  • pages/SubscriptionPage.tsx — Page abonnement (plans, essai gratuit, blocage)
  • pages/SubscriptionBlocked.tsx — Page de blocage après expiration
  • pages/PrintTicket.tsx — Ticket imprimable pour patients sans smartphone

Base de données (drizzle/schema.ts)

users, subscriptions, clinics, queueEntries, analyticsEvents

Ce qui reste à faire

Priorité haute

  • Intégration Stripe — L'utilisateur doit fournir ses clés Stripe (STRIPE_SECRET_KEY, VITE_STRIPE_PUBLISHABLE_KEY, STRIPE_WEBHOOK_SECRET). Utiliser webdev_add_feature stripe une fois les clés configurées dans Settings → Payment.
  • Notifications SMS — Intégrer Twilio pour alerter les patients par SMS quand leur tour approche (alternative aux notifications push navigateur).

Priorité moyenne

  • Page /subscription/plans — Checkout Stripe réel avec redirection vers portail client.
  • Webhook Stripe — Route /api/stripe/webhook pour gérer checkout.session.completed, invoice.paid, customer.subscription.deleted.
  • Tests supplémentaires — Couvrir les procédures queue.callNext, queue.markAbsent, analytics.get.

Priorité basse

  • Mode multi-praticiens — Plusieurs médecins par cabinet (table clinicMembers).
  • Rapports PDF — Export PDF hebdomadaire automatique.
  • Application mobile — React Native avec les mêmes APIs tRPC.

Informations techniques importantes

Socket.io

Le serveur Socket.io est initialisé dans server/_core/index.ts et exposé globalement via (global as any).__socketIo. Les procédures tRPC l'utilisent via getIo() dans routers.ts.

Rooms Socket.io :

  • clinic:{clinicId} — Médecin + écran d'affichage
  • patient:{patientToken} — Patient individuel
  • display:{clinicId} — Écran d'affichage uniquement

QR Code anti-triche

Le token QR est stocké dans clinics.qrToken. La rotation est déclenchée par rotateQrToken() dans db.ts. La fréquence est configurable via clinics.qrRotationMinutes (0 = pas de rotation).

Abonnement

  • Essai gratuit : 30 jours à partir de la première connexion
  • Statuts : trialactiveexpired / canceled
  • Le middleware subscriptionProcedure vérifie isSubscriptionActive() avant chaque opération sensible

Design system

  • Thème : dark, palette teal (#0d9488) + orange (#f97316)
  • Classes utilitaires custom : .gradient-text, .glass-card, .glow-teal, .text-glow-teal, .queue-number, .animate-ticker
  • Police display : Inter (Google Fonts)

Commandes utiles

pnpm dev          # Démarrer le serveur de développement
pnpm test         # Exécuter les tests Vitest
pnpm db:push      # Pousser les migrations Drizzle
pnpm build        # Build de production
npx tsc --noEmit  # Vérifier les types TypeScript

Contacts et ressources