شرح مفصل لكل صفحة
الدور · الـ Prompt · العلاقات
دليل تقني شامل لكل صفحة في النظام — ما هي، ماذا تفعل، كيف تُبنى، وكيف ترتبط بباقي الصفحات.
PAGE LoginPage — /login
LAYOUT: صفحة كاملة مركزية (fullscreen centered), بدون Sidebar وبدون TopBar.
COMPONENTS:
- Logo + اسم الشركة (محمّلان من إعدادات الشركة في DB)
- Input: Email (type=email, required, validation)
- Input: Mot de passe (type=password, toggle visibility)
- Bouton: "Se connecter" → supabase.auth.signInWithPassword()
- Message erreur: "Email ou mot de passe incorrect"
ON_SUCCESS: redirect vers /dashboard
ON_ROLE: Admin→/dashboard, Manager→/dashboard, User→/dashboard
PROTECT: si déjà connecté → redirect /dashboard automatiquement
NO: Register public, Forgot password public (Admin يعيد كلمة المرور)
PAGE DashboardPage — /dashboard
LAYOUT: MainLayout (Sidebar + TopBar + Content)
FILTER: RadioGroup: ["Jour", "Mois", "Année"] → onChange refetch toutes les données
KPI_CARDS (row 1):
- Nombre de ventes: COUNT(ventes WHERE type='FACTURE')
- Chiffre d'affaires: SUM(ventes.total_ttc) + CA encaissé en dessous
- Charges Achats + Dépenses: SUM(achats.total_ttc) + SUM(depenses.montant)
- Bénéfice: CA - Achats - Dépenses (vert si positif, rouge si négatif)
CHART: Recharts BarChart double → Ventes(orange) vs Achats(teal) par mois 1→12
SUMMARY_PANEL (droite):
- Total des achats, Total encaissé, TVA vendue, TVA achetée, TVA nette
API: GET /api/dashboard?period=[day|month|year]
REALTIME: Supabase subscription → auto-refresh si nouvelle facture créée
SUM(ventes.total_ttc)WHERE type=FACTURE AND statut≠ANNULEE
SUM(reglements.montant)للفترة المحددة
SUM(achats.total_ttc) + SUM(depenses.montant)TVA_vendue - TVA_achetée → المستحق للدولةPAGE VentesListPage — /ventes
SUB_ACTIONS (boutons en haut):
→ "+ Ajouter bon de vente" (vert) → navigate /ventes/nouveau?type=BON_VENTE
→ "Consulter bons de vente" (rouge) → filter table type=BON_VENTE
→ "+ Ajouter un devis" (vert) → navigate /ventes/nouveau?type=DEVIS
→ "Facturer le client" (teal) → ouvre modal sélection BV → navigate /ventes/[id]/facturer
FILTER: "Les ventes de [Mois Année]" — DatePicker mois/année, défaut = mois actuel
TABLE (TanStack Table):
Colonnes: [actions] | Numéro | Client | Date | Total HT | Total TTC | Statut | [PDF]
Tri: par date DESC par défaut — pagination 25/page
Statuts: DEVIS(bleu) | BON_VENTE(orange) | FACTURE(vert) | ANNULEE(gris)
CHART: BarChart Recharts — Ventes par mois (sidebar droite ou dessous)
API: GET /api/ventes?month=&year=&type=
PAGE VenteFormPage — /ventes/nouveau?type=[DEVIS|BON_VENTE]
HEADER_FIELDS:
- Numéro: auto-généré (BV-2026-0001, DV-2026-0001)
- Client: *requis → Searchable Select → /api/clients
- Date: *requis → DatePicker, défaut=aujourd'hui
- Notes: optionnel → Textarea
LINES_TABLE (cœur du form):
Pour chaque ligne: Produit(search) | Qté | Prix_unit | Remise% | TVA% | Total_TTC
→ onChange: recalcul immédiat de total_ligne = qté × prix × (1-remise%) × (1+TVA%)
→ Bouton "+ Ajouter ligne" — Bouton "🗑" supprimer ligne
TOTALS_FOOTER:
Total HT | Total TVA | Total TTC (grand, coloré)
ACTIONS:
- "Enregistrer" → POST /api/ventes → redirect /ventes/[id]
- "Enregistrer et imprimer" → save + open PDF
- "Annuler" → navigate back
VALIDATION: client requis, min 1 ligne, quantité > 0, prix > 0
| الحقل | النوع | ملاحظة |
|---|---|---|
| Produit | SearchSelect | * يجلب السعر تلقائياً |
| Quantité | Number | * > 0 |
| Prix unitaire | Decimal | * مُعبأ من المنتج |
| Remise % | Decimal | opt 0-100 |
| TVA % | Select | * من TVA rates |
| Total TTC | Computed | auto لا يُعدَّل |
PAGE VenteDetailPage — /ventes/[id]
HEADER: Numéro | Type badge | Statut badge | Date | Client (lien)
ACTIONS_BAR (selon statut):
Si DEVIS → "Convertir en Bon de vente" | "Modifier" | "Annuler"
Si BON_VENTE → "Facturer le client" | "Modifier" | "Annuler"
Si FACTURE → "Ajouter règlement" | "Avoir" | "Annuler"
Toujours: "🖨 Imprimer PDF"
LINES_TABLE: Produit | Qté | Prix unit | Remise% | TVA% | Total TTC
TOTALS: Total HT | TVA | Total TTC | Montant encaissé | Reste à payer
RÈGLEMENTS_SECTION: liste des paiements reçus pour cette facture
PDF: génère via react-pdf — template avec logo, ICE, RC, adresse de la société
PAGE AchatsPage — /achats
SUB_ACTIONS:
→ "+ Ajouter bon de commande" → /achats/nouveau?type=BON_COMMANDE
→ "Consulter bons de réception" → filter type=BON_RECEPTION
→ "Facturer le fournisseur" → modal sélection BC → /achats/[id]/facturer
→ "Détail achats par articles" → /achats/detail-articles
→ "Factures fournisseurs" → filter type=FACTURE
TABLE: [actions] | Numéro | Fournisseur | Date | Total HT | Total TTC | Statut
CYCLE: BC → Réception → Facture (même logique que ventes)
TRIGGER réception: ventes_lignes INSERT → products.stock_qty += quantite
TRIGGER facture: fournisseurs.solde += total_ttc
PAGE ProduitsPage — /produits
SUB_ACTIONS: Ajouter produit | Achat de produit | Consulter catégories | Consulter produits
TABLE: [icon] | Code (PRD0001) | Description | Catégorie | Unité | Qt en Stock | Prix vente
SEARCH_BAR: filter en temps réel par Code ou Description
STOCK_ALERT: Qt en stock: vert si > stock_min, orange si = stock_min, rouge si négatif
FORM_NOUVEAU (/produits/nouveau):
- Code: auto PRD0001++ (modifiable)
- Description: * texte
- Catégorie: * Select → /api/categories
- Unité: * Select: [U, PAIRE, LITRE, KG, P100, M, M2]
- Prix vente HT: * Decimal
- Prix achat HT: opt Decimal (pour calcul marge)
- TVA %: * Select depuis tva_rates table
- Stock initial: opt Integer (0 par défaut)
- Stock minimum (alerte): opt Integer
- Actif: true par défaut
PAGE StockPage — /stock
SUB_ACTIONS: Gérer entrepôts | Etat de stock | Entrées | Sorties | Stock Initial | Transactions
TABLE (vue calculée):
Produit | Unité | Catégorie | QT en stock | QT Acheté | QT Vendues
QT en stock = stock_initial + QT_acheté - QT_vendues + retours_avoir
Couleur: vert > stock_min | orange = stock_min | rouge si négatif
PAGE /stock/entrees:
Log de toutes les entrées: Date | Produit | Qté | Source (Bon Réception N°...)
PAGE /stock/sorties:
Log de toutes les sorties: Date | Produit | Qté | Source (Facture N°...)
PAGE /stock/initial:
Saisie du stock de départ lors de la création de l'entreprise (une seule fois)
TRANSACTION_MANUELLE: Admin peut corriger manuellement avec motif (perte, vol, casse)
PAGE ClientsPage — /clients
SUB_ACTIONS: Consulter | Ajouter client | Liste Banques | Ajouter Banque | Créances
TABLE: [icon] | Société | Solde (calculé) | Ville | [actions]
Solde rouge si > 0 (doit de l'argent), vert si = 0, bleu si négatif (crédit)
FORM_NOUVEAU (/clients/nouveau):
- Société: * — ICE: opt 15 chiffres — RC: opt
- Ville: * Select villes Maroc — Adresse: opt
- Téléphone: opt — Email: opt
- Banque: opt FK → banks — Limite crédit: opt
PAGE /clients/[id] (PROFIL COMPLET):
- Infos + Solde actuel en grand
- Liste de toutes ses factures avec statut
- Liste de tous ses règlements
- Liste de ses avoirs
- Graphique évolution du solde
PAGE /clients/creances: clients avec solde > 0 triés par montant DESC
Solde = SUM(factures.total_ttc) - SUM(reglements.montant) - SUM(avoirs.montant)PAGE FournisseursPage — /fournisseurs
SUB_ACTIONS: Consulter | Ajouter fournisseur | Liste TVA | Ajouter TVA | Créances
TABLE: [icon] | NOM FOURNISSEUR | Solde (calculé) | Adresse | [actions]
DIFFÉRENCES vs Clients:
- Champ ICE/RC → remplacé par gestion TVA rates
- Solde = SUM(achats.total_ttc) - SUM(paiements_frs.montant)
- Mode paiement: ajoute CHÈQUE (inexistant chez les clients)
- Créances = ce que la société doit aux fournisseurs
PAGE /fournisseurs/tva: CRUD des taux TVA: 20%, 14%, 10%, 7%, 0%
→ Ces taux sont utilisés dans tous les achats et produits
PAGE /fournisseurs/[id]: profil complet + historique achats + paiements
| الميزة | Clients | Fournisseurs |
|---|---|---|
| الـ Solde يعني | ما يدين لك | ما تدين له |
| يزيد عند | إصدار فاتورة | استلام فاتورة |
| ينقص عند | Règlement | Paiement frs |
| وضع خاص | EFFET | CHÈQUE |
| بيانات إضافية | ICE، RC | TVA rates |
PAGE ReglementsPage — /reglements
SUB_ACTIONS:
→ Versements espèce | Consulter règlements | Rapport/mois | État facturation | Ajouter règlement | Ajouter versement
TABLE: Date | Client | Banque | Mode paiement | Montant TTC | [actions]
FORM_NOUVEAU (/reglements/nouveau):
- Client: * SearchSelect → affiche solde actuel
- Facture liée: opt → liste factures impayées du client
- Date: * DatePicker
- Mode: * [ESPECE | VIREMENT | EFFET]
- Si VIREMENT/EFFET → Banque: * FK → banks
- Si EFFET → Échéance: * date d'échéance de la traite
- Montant: * Decimal > 0
- Référence: opt N° chèque, virement...
ON_SAVE: clients.solde -= montant (trigger automatique)
PAGE /reglements/rapport: graphique versements par mois
PAGE PaiementsFrsPage — /paiements-frs
SUB_ACTIONS: Consulter les paiements | Ajouter un paiement
TABLE: Date | Fournisseur | Banque | Mode paiement | Montant TTC
FORM_NOUVEAU: identique à Règlements SAUF:
- Fournisseur: à la place de Client
- Mode: * [ESPECE | VIREMENT | CHÈQUE] (CHÈQUE remplace EFFET)
- Si CHÈQUE → N° chèque: * + Banque: *
ON_SAVE: fournisseurs.solde -= montant (trigger)
| Règlements | Paiements Frs | |
|---|---|---|
| الطرف | Client → نحن | نحن → Fournisseur |
| ESPÈCE | ✓ | ✓ |
| VIREMENT | ✓ | ✓ |
| EFFET | ✓ | ✗ |
| CHÈQUE | ✗ | ✓ |
| يُحدث | clients.solde ↓ | fournisseurs.solde ↓ |
PAGE DepensesPage — /depenses
SUB_ACTIONS: Ajouter une dépense | Consulter les dépenses
TABLE: Numéro (D002886..) | Type | Mode paiement | Date | Montant
FORM_NOUVEAU:
- Numéro: auto D000001++
- Type dépense: * Select (géré par Admin):
[Loyer, Eau/Élec, Téléphone, Frais bancaires, Transport,
Papeterie, Entretien, Salaires, Impôts, Autres]
- Mode paiement: * [ESPECE | VIREMENT | CHÈQUE]
- Date: * DatePicker
- Montant: * Decimal > 0
- Description: opt Textarea
ON_SAVE: montant s'ajoute aux Charges dans /dashboard
PAGE AvoirsPage — /avoirs
FILTER: "Les AVOIRS de [Mois Année]" — mois actuel par défaut
TABLE: Numéro | Date | Client | Montant | [actions]
FORM_NOUVEAU (/avoirs/nouveau):
- Numéro: auto AV-2026-001
- Client: * SearchSelect
- Facture liée: * liste des factures du client
- Date: * DatePicker
- Motif: * [RETOUR_MARCHANDISE | ERREUR_PRIX | REMISE | AUTRE]
- Lignes: mêmes produits que la facture (pré-remplies) → Qté à retourner
- Montant total: calculé auto
ON_SAVE:
→ clients.solde -= montant (avoir réduit ce qu'il doit)
→ products.stock_qty += qté retournée
→ PDF avoir généré
PAGE ProjetsPage — /projets
SUB_ACTIONS: Ajouter projet | Suivi des projets | Suivi RG et CD | Les projets
TABLE: [icon] | N° (PR0000022/COU..) | Code (PRJ001) | N° Marché | Affectation | Objet | Montant | Statut
STATUTS (avec couleurs):
- En cours (bleu) — Négociation (orange)
- Adjugé Lot (violet) — Réceptionné (vert) — Cloturé (gris)
FORM_NOUVEAU:
- Numéro: auto — Code projet: * PRJ001++
- Numéro marché: opt (N° officiel du marché public)
- Affectation: * responsable du projet
- Objet: * Textarea (description longue)
- Montant marché: * Decimal
- Statut: * Select 5 états
- RG (Retenue de Garantie): opt % ou montant
- CD (Caution Définitive): opt montant
PAGE /projets/suivi-rg-cd: tableau des garanties en cours à récupérer
PAGE RapportsPage — /rapports
RAPPORT_1 /rapports/ca: CA par mois/trimestre/année
BarChart + tableau: Mois | CA | Encaissé | Écart | [Export]
RAPPORT_2 /rapports/tva: TVA à déclarer
TVA vendue | TVA achetée | TVA nette par période
→ Format prêt pour déclaration fiscale Maroc
RAPPORT_3 /rapports/creances: balance âgée clients
Client | Total facturé | Total payé | Solde | 0-30j | 31-60j | +90j
RAPPORT_4 /rapports/stock: état du stock valorisé
Produit | QT | Prix achat | Valeur stock | Alerte(oui/non)
RAPPORT_5 /rapports/achats: achats par article/fournisseur
RAPPORT_6 /rapports/versements: versements par mois
EXPORT: chaque rapport → bouton PDF (react-pdf) + bouton Excel (sheetjs)
PAGE SettingsPage — /settings (tabs ou sections)
TAB_1 /settings/company: هوية الشركة
Nom société, Logo (upload), Adresse, Ville, Téléphone, Email, Site web
→ Logo s'affiche dans toutes les factures PDF
TAB_2 /settings/fiscal: بيانات جبائية
ICE (15 chiffres), RC, IF, Patente, CNSS, Capital, Forme juridique
→ s'affichent en bas de chaque facture officielle
TAB_3 /settings/users: إدارة المستخدمين
Table: Nom | Email | Rôle | Statut | Dernière connexion | [actions]
Form ajout: Nom, Email, Mot de passe temporaire, Rôle (Manager|User)
Actions: Modifier rôle | Activer/Désactiver | Réinitialiser MDP
TAB_4 /settings/tva: أنواع TVA
CRUD simple: Libellé + Taux% — ex: "TVA 20%" → 20.00
TAB_5 /settings/banks: حسابات البنكية
CRUD: Nom banque + Numéro compte + RIB + SWIFT
TAB_6 /settings/numbering: ترقيم الوثائق
Préfixe facture: BV-2026- | Début: 0001
Préfixe devis: DV-2026- | Préfixe dépense: D00000