106 lines
4.5 KiB
Markdown
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/
|