# BusinessOS Africa
Plateforme de gestion tout-en-un (caisse, stock, multi-magasins, CRM, dettes, services) pour
commerçants, grossistes, distributeurs et PME africaines. Multi-tenant, isolation stricte par
entreprise au niveau base de données (Row-Level Security), abonnements avec quotas réellement
appliqués, paiement Mobile Money/carte via PayTech.
## Stack technique
- **Next.js 16** (App Router, React 19, TypeScript, Turbopack) — voir `AGENTS.md` pour les
changements par rapport aux versions précédentes de Next.js (proxy.ts remplace middleware.ts,
params/searchParams asynchrones, etc.)
- **Supabase** : PostgreSQL, Auth (JWT + Custom Access Token Hook), Storage
- **Drizzle ORM** : schéma (`drizzle/schema/`) et migrations SQL versionnées (`drizzle/migrations/`)
— utilisé pour les migrations uniquement ; toutes les requêtes runtime passent par le client
Supabase (PostgREST) pour que la RLS s'applique réellement (voir `src/lib/db.ts`)
- **Tailwind CSS v4 + shadcn/ui** (base-ui) — palette bleu marine / turquoise, police Inter
- **@react-pdf/renderer** pour les factures PDF (3 modèles au choix, aperçu en direct, QR code +
code-barres générés côté serveur via `qrcode`/`bwip-js`) et les rapports (export PDF des dettes)
- **exceljs** pour l'export Excel (`.xlsx`) du module Dettes
- **PayTech** pour le paiement des abonnements (Mobile Money, carte)
## Démarrage
```bash
npm install
cp .env.example .env.local # renseigner les clés Supabase + PayTech
npm run dev
```
### Configuration Supabase requise (une fois, dans le dashboard)
1. Créer un projet sur supabase.com, renseigner `.env.local` (clés API + connexions Postgres).
2. `npm run db:migrate` pour appliquer tout `drizzle/migrations/`.
3. **Authentication → Hooks** : activer le hook "Customize Access Token (JWT) Claims", schéma
`public`, fonction `custom_access_token_hook`. **Sans cette étape, aucune policy RLS ne
fonctionne** — company_id/user_role ne sont pas dans le JWT.
4. **Authentication → Emails → SMTP Sett …