queue-med/MANUS_HANDOFF.md

106 lines
4.5 KiB
Markdown

# 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 : `trial``active``expired` / `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
```bash
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
- **Auteur** : William MERI
- **Dépôt GitHub** : https://github.com/Tarzzan/queue-med
- **Documentation Stripe** : https://stripe.com/docs/billing/subscriptions
- **Documentation Socket.io** : https://socket.io/docs/v4/