Beauty  Insider .
oussama laatabi

صيصشيشصي

Administrator
March 11, 2026 16 min read 3,153 words
صيصشيشصي
وثيقة تقنية — ERP التجاري المغربي

شرح مفصل لكل صفحة
الدور · الـ Prompt · العلاقات

دليل تقني شامل لكل صفحة في النظام — ما هي، ماذا تفعل، كيف تُبنى، وكيف ترتبط بباقي الصفحات.

 
22 صفحة رئيسية
 
Next.js 14 App Router
 
Supabase PostgreSQL
 
On-Premise Deployment
 
Admin = صاحب الشركة
🔐
صفحة تسجيل الدخول
/login — Page d'authentification
عامة — بدون Login
Supabase Auth
الدور: البوابة الوحيدة للدخول للنظام. كل المستخدمين (Admin، Manager، User) يمرون من هنا. بعد الدخول يُوجَّه كل مستخدم حسب دوره.
الـ 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 يعيد كلمة المرور)

المكونات
1
حقل الإيميل
Input مع validation — يتحقق من صيغة الإيميل قبل الإرسال
2
حقل كلمة المرور
Input password مع زر إظهار/إخفاء — لا minimum length
3
زر الدخول
Loading state أثناء الطلب. يُعطَّل عند الضغط لتجنب double submit
4
رسالة الخطأ
تظهر فقط عند فشل الدخول — رسالة واحدة عامة بدون تفصيل
العلاقات والتدفق
/dashboard
بعد نجاح الدخول
Redirect
middleware.ts
كل الصفحات المحمية تُعيد للـ login
Guard
Supabase Auth
يتحقق من بيانات الدخول ويُعيد session token
API Call
📖
users table
يجلب الدور (role) بعد المصادقة لتحديد الصلاحيات
DB Read
📊
Tableau de Bord — لوحة التحكم
/dashboard — الصفحة الرئيسية بعد الدخول
جميع الأدوار
قراءة فقط
الدور: النظرة الشاملة الفورية على صحة الشركة — CA، بنيفيس، TVA، ديون. يُحدَّث بفلترة زمنية. أول شيء يراه صاحب الشركة كل صباح.
الـ Prompt — وصف الصفحة للمطور

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

حسابات KPI
💰
Chiffre d'Affaires
SUM(ventes.total_ttc)
WHERE type=FACTURE AND statut≠ANNULEE
📈
CA Encaissé
SUM(reglements.montant)
للفترة المحددة
📉
Charges
SUM(achats.total_ttc) + SUM(depenses.montant)
🏆
Bénéfice
CA - Achats - Dépenses → لون أخضر/أحمر حسب الإشارة
🧾
TVA Nette
TVA_vendue - TVA_achetée → المستحق للدولة
العلاقات
📖
ventes
CA، عدد الفواتير، TVA vendue
Read
📖
achats
التكاليف، TVA achetée
Read
📖
reglements
CA encaissé فعلياً
Read
📖
depenses
المصاريف في حساب البنيفيس
Read
/ventes
الضغط على KPI يفتح القائمة
Navigate
Realtime: Dashboard يشترك في Supabase Realtime — يتحدث تلقائياً عند إنشاء فاتورة جديدة بدون Refresh
🛒
Gestion des Ventes — قائمة المبيعات
/ventes — إدارة بونات البيع والفواتير
Admin + Manager
CRUD كامل
الدور: القلب التجاري للنظام — كل ما يبيعه الشركة يمر من هنا. من Devis إلى Bon de vente إلى Facture. كل فاتورة مُؤكدة تُنقص المخزون وتُحدث رصيد العميل تلقائياً.
الـ Prompt — وصف الصفحة للمطور

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=

حالات الوثيقة والتحولات
DEVISعرض سعر
BON_VENTEطلب مؤكد
FACTUREفاتورة رسمية
كل تحوّل يُنشئ وثيقة جديدة — الوثيقة الأصلية تبقى كسجل تاريخي
Facture مؤكدة → تنقص stock_qty
Facture مؤكدة → تزيد solde العميل
Facture مؤكدة → تحدث CA في Dashboard
العلاقات
/ventes/nouveau
إنشاء بون/devis جديد
Navigate
/ventes/[id]
تفاصيل أي بون بالضغط عليه
Navigate
📖
clients
اسم العميل في كل سطر
JOIN
products.stock_qty
تنقص عند تأكيد الفاتورة
Trigger
clients.solde
يزيد عند إصدار الفاتورة
Trigger
📝
Form إنشاء / تعديل بون البيع
/ventes/nouveau — /ventes/[id]/edit
Admin + Manager
أهم صفحة في النظام
الدور: الصفحة الأكثر تعقيداً — هنا يُنشأ كل بيع. اختيار عميل، إضافة منتجات بكمياتها وأسعارها وخصوماتها، والحسابات تجري تلقائياً في real-time.
الـ Prompt — وصف الصفحة للمطور

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 لا يُعدَّل
العلاقات
📖
clients
Dropdown البحث عن العميل
Read
📖
products
Dropdown اختيار المنتج + سعره + TVA%
Read
✍️
ventes + ventes_lignes
يكتب رأس الفاتورة + أسطرها
Write
products.stock_qty
يُنقص عند حفظ FACTURE فقط
Trigger
/ventes/[id]
redirect بعد الحفظ
Navigate
🧾
تفاصيل بون البيع / الفاتورة
/ventes/[id] — عرض وثيقة واحدة كاملة
جميع الأدوار
PDF + Actions
الدور: عرض الوثيقة كاملة — رأسها، أسطرها، مجاميعها — مع أزرار الإجراءات: تحويل، طباعة، تعديل، إلغاء. هذه الصفحة تشبه الفاتورة المطبوعة.
الـ Prompt — وصف الصفحة للمطور

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é

الإجراءات المتاحة حسب الحالة
📄
DEVIS → BON_VENTE
ينسخ البيانات ويُنشئ وثيقة BON_VENTE جديدة — الـ DEVIS يبقى
🧾
BON_VENTE → FACTURE
يُنشئ FACTURE رسمية ويُنقص المخزون ويُحدث رصيد العميل
💳
FACTURE → Règlement
يفتح modal لإضافة دفعة — يُحدث montant_encaissé
↩️
FACTURE → Avoir
إذا رُجعت بضاعة — يُنشئ avoir ويُرجع المخزون
العلاقات
📖
ventes + lignes
البيانات الرئيسية للصفحة
Read
📖
reglements
قائمة الدفعات المستلمة لهذه الفاتورة
Read
/ventes/[id]/edit
زر تعديل
Navigate
/reglements/nouveau
زر إضافة تسوية
Navigate
/avoirs/nouveau
زر إنشاء avoir
Navigate
🛍️
Gestion des Achats — المشتريات
/achats — بونات الشراء والاستلام والفواتير
Admin + Manager
الدور: تتبع كل ما تشتريه الشركة من الموردين. نفس منطق الـ Ventes لكن في الاتجاه العكسي — يزيد المخزون بدل ما ينقصه، ويزيد دين المورد بدل العميل.
الـ Prompt — وصف الصفحة للمطور

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

دورة الشراء الكاملة
BON_COMMANDEطلب للمورد
BON_RECEPTIONاستلام البضاعة
FACTURE_FRSفاتورة رسمية
Réception → stock_qty يزيد
Facture → solde fournisseur يزيد
Paiement frs → solde fournisseur ينقص
العلاقات
📖
fournisseurs
اختيار المورد في الـ form
Read
📖
products
اختيار المنتج في أسطر الشراء
Read
products.stock_qty
يزيد عند Réception
Trigger
fournisseurs.solde
يزيد عند تأكيد الفاتورة
Trigger
/paiements-frs
تسوية دين المورد
Link
📦
Gestion des Produits — كتالوج المنتجات
/produits — إدارة المنتجات والفئات
Admin فقط
الدور: مستودع بيانات المنتجات — كل منتج يُباع أو يُشترى في النظام يجب أن يكون موجوداً هنا أولاً مع كوده وسعره وTVA%. يُستعمل من الـ Ventes والـ Achats والـ Stock.
الـ Prompt — وصف الصفحة للمطور

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

الصفحات الفرعية
📁
/produits/categories
CRUD الفئات: MEDICAL، INFORMATIQUE، JARDINAGE... — اسم + كود
🔍
/produits/[id]
تفصيل المنتج: تاريخ حركاته، الفواتير التي ظهر فيها، تعديل السعر
العلاقات
📖
categories
Dropdown الفئة عند إنشاء منتج
FK
📖
tva_rates
Dropdown نسبة TVA
FK
⬅️
ventes_lignes
كل فاتورة بيع تقرأ المنتجات منه
Referenced by
⬅️
achats_lignes
كل فاتورة شراء تقرأ المنتجات منه
Referenced by
⬅️
/stock
يعرض stock_qty لكل منتج
Read
🏪
Gestion de Stock — المخزون
/stock — حالة المخزون الحقيقية في كل لحظة
جميع الأدوار
قراءة + تعديل يدوي
الدور: مرآة المخزون — لا تُدخل أرقاماً يدوياً بشكل عادي، الأرقام تأتي تلقائياً من الـ Achats والـ Ventes. هذه الصفحة للمراقبة وتصحيح الأخطاء والتعديلات الاستثنائية.
الـ Prompt — وصف الصفحة للمطور

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)

منطق الحساب
ما يزيد المخزون
Bon de Réception مؤكد + Stock Initial + Transaction يدوية إيجابية
ما ينقص المخزون
Facture de vente مؤكدة + Transaction يدوية سالبة (خسارة، كسر)
↩️
ما يُرجع المخزون
Avoir client مؤكد — يُرجع الكمية للمخزون
العلاقات
📖
products
stock_qty في كل منتج
Read
⬅️
achats_lignes
مصدر كل Entrée
Source
⬅️
ventes_lignes
مصدر كل Sortie
Source
⬅️
avoirs_lignes
مصدر كل Retour
Source
✍️
stock_transactions
التعديلات اليدوية الاستثنائية
Write
👥
Gestion des Clients — العملاء
/clients — ملفات العملاء والديون
Admin + Manager
الدور: مستودع بيانات العملاء مع تتبع ديونهم في real-time. الـ Solde يُحسب تلقائياً = مجموع الفواتير - مجموع التسويات - مجموع الأووار.
الـ Prompt — وصف الصفحة للمطور

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
📊
الصيغة الكاملة
Solde = SUM(factures.total_ttc) - SUM(reglements.montant) - SUM(avoirs.montant)
🔴
Solde > 0
العميل مدين — له فواتير غير مدفوعة — يظهر في Créances
🟢
Solde = 0
العميل صافي — دفع كل ما عليه
🔵
Solde < 0
رصيد دائن — دفع أكثر مما عليه أو لديه avoir
العلاقات
⬅️
ventes
كل الفواتير الصادرة لهذا العميل
One-to-Many
⬅️
reglements
كل مدفوعاته — تُخفض الـ Solde
One-to-Many
⬅️
avoirs
كل إشعارات الدائن له
One-to-Many
📖
banks
بنك العميل المعتمد
FK
🏭
Gestion des Fournisseurs — الموردون
/fournisseurs — نفس منطق العملاء، اتجاه معكوس
Admin + Manager
الدور: تتبع ديون الشركة للموردين — ما تدين به الشركة. Solde يزيد عند فاتورة شراء وينقص عند دفع. نفس بنية صفحة العملاء لكن عكسياً.
الـ Prompt — وصف الصفحة للمطور

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
الميزة Clients Fournisseurs
الـ Solde يعني ما يدين لك ما تدين له
يزيد عند إصدار فاتورة استلام فاتورة
ينقص عند Règlement Paiement frs
وضع خاص EFFET CHÈQUE
بيانات إضافية ICE، RC TVA rates
العلاقات
⬅️
achats
كل الفواتير الواردة منه
One-to-Many
⬅️
paiements_frs
كل مدفوعاتنا له
One-to-Many
⬅️
tva_rates
أنواع TVA المستعملة في الشراء
One-to-Many
💳
Gestion des Règlements — التسويات
/reglements — مدفوعات العملاء
Admin + Manager
الدور: تسجيل كل دفعة يستلمها الشركة من العملاء. كل تسوية تُنقص رصيد العميل مباشرة. تدعم 3 أوضاع دفع: نقداً، تحويل، كمبيالة.
الـ Prompt — وصف الصفحة للمطور

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

أوضاع الدفع المدعومة
💵
ESPÈCE — نقداً
لا يحتاج بنك. مباشر. الأكثر شيوعاً في المغرب
🏦
VIREMENT — تحويل بنكي
يحتاج اختيار بنك. له رقم مرجعي اختياري
📜
EFFET — كمبيالة
يحتاج تاريخ استحقاق. يُسجّل كـ "وعد بالدفع"
العلاقات
📖
clients
من دفع — يظهر رصيده
FK
📖
ventes
الفاتورة المرتبطة (اختياري)
FK optional
📖
banks
البنك (إلزامي لـ VIREMENT وEFFET)
FK conditional
clients.solde
ينقص بقيمة الدفعة تلقائياً
Trigger
💸
Paiements Fournisseurs — مدفوعات الموردين
/paiements-frs — ما تدفعه للمورد
Admin فقط
الدور: تسجيل كل دفعة تخرج من الشركة للموردين. نفس بنية Règlements لكن + CHÈQUE. كل دفعة تُنقص رصيد المورد (ما نديننا له).
الـ Prompt — وصف الصفحة للمطور

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 vs Paiements
  Règlements Paiements Frs
الطرف Client → نحن نحن → Fournisseur
ESPÈCE
VIREMENT
EFFET
CHÈQUE
يُحدث clients.solde ↓ fournisseurs.solde ↓
العلاقات
📖
fournisseurs
من دفعنا له
FK
📖
achats
الفاتورة المرتبطة
FK optional
fournisseurs.solde
ينقص تلقائياً
Trigger
📋
Gestion des Dépenses — المصاريف
/depenses — مصاريف تشغيل الشركة
Admin فقط
الدور: تسجيل المصاريف اليومية التي ليست شراء بضاعة — إيجار، كهرباء، صيانة، مصاريف بنكية، لوازم مكتبية... تُحسب ضمن تكاليف الشركة في الـ Dashboard.
الـ Prompt — وصف الصفحة للمطور

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

أنواع المصاريف الشائعة
🏠
إيجار المحل / المخزن
مصاريف ثابتة شهرية
الماء والكهرباء
فواتير الخدمات
🏦
Frais Bancaires
عمولات وتكاليف بنكية
💼
Salaires / CNSS
رواتب الموظفين
العلاقات
/dashboard
تُحسب في Charges → تؤثر في Bénéfice
Aggregated
/rapports
تظهر في تقارير التكاليف التفصيلية
Reported
🔲
types_depenses
جدول أنواع المصاريف — يديره Admin
FK
↩️
Gestion des Avoirs — إشعارات الدائن
/avoirs — إرجاع بضاعة أو تصحيح فاتورة
Admin + Manager
الدور: عندما يُرجع العميل بضاعة أو فيه خطأ في الفاتورة — بدل إلغاء الفاتورة نُصدر Avoir يُصحح الوضع. الـ Avoir يُنقص رصيد العميل ويُرجع الكمية للمخزون.
الـ Prompt — وصف الصفحة للمطور

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é

متى يُستعمل الـ Avoir؟
📦
إرجاع بضاعة
العميل يُرجع منتجاً — الكمية ترجع للمخزون والمبلغ من رصيده
💰
خطأ في السعر
تم الفوترة بسعر أعلى من المتفق — Avoir بالفرق
🎁
خصم استثنائي
منحنا خصم بعد الفوترة — Avoir بقيمة الخصم
العلاقات
📖
clients
العميل المستفيد من الـ Avoir
FK
📖
ventes
الفاتورة الأصلية المرتبطة
FK
clients.solde
ينقص بمقدار الـ Avoir
Trigger
products.stock_qty
يُرجع الكمية للمخزون
Trigger
🗂️
Gestion des Projets — الصفقات
/projets — الصفقات العمومية والمشاريع
Admin + Manager
الدور: تتبع الصفقات والمشاريع الكبرى — خاصة الصفقات العمومية (Marchés Publics). يتضمن متابعة الحالة من التفاوض حتى الاستلام، وإدارة الضمانات (RG/CD).
الـ Prompt — وصف الصفحة للمطور

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

دورة الصفقة
Négociation
Adjugé Lot
En cours
Réceptionné
Cloturé
RG/CD: Retenue de Garantie و Caution Définitive — مبالغ مُحجوزة من الصفقة ترجع بعد انتهاء الضمان
العلاقات
🔲
achats
مشتريات مرتبطة بالمشروع (اختياري)
Optional FK
🔲
ventes
فواتير صادرة للمشروع
Optional FK
⬅️
/rapports
تقرير الصفقات في التقارير
Reported
📈
Rapports — التقارير والإحصائيات
/rapports — تقارير قابلة للتصدير
Admin فقط
PDF + Excel Export
الدور: تقارير تفصيلية للمدير لاتخاذ القرارات — CA سنوي، TVA للتصريح، ديون العملاء، حركة المخزون. كلها قابلة للتصدير PDF أو Excel.
الـ Prompt — وصف الصفحة للمطور

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)

قائمة التقارير الـ 6
💰
CA et Encaissements
رقم الأعمال مقارنة بما تم تحصيله فعلاً
🧾
TVA à déclarer
المستحق للضرائب — TVA نهائية
👥
Balance âgée clients
تتبع الديون حسب تاريخ الفاتورة
📦
Stock valorisé
قيمة المخزون بسعر الشراء
🛍️
Détail achats/article
أكثر منتج تم شراؤه ومن أي مورد
📊
Versements/mois
إيرادات فعلية شهرية
العلاقات (كل التقارير تقرأ فقط)
📖
ventes + lignes
CA، TVA vendue
Read
📖
achats + lignes
التكاليف، TVA achetée
Read
📖
reglements
المبالغ المحصّلة
Read
📖
products + stock
Stock valorisé
Read
🖨️
react-pdf + sheetjs
تصدير PDF وExcel
Export
⚙️
Paramètres — الإعدادات
/settings — إعدادات الشركة الكاملة
👑 Admin فقط
6 صفحات فرعية
الدور: المركز التحكمي الكامل لصاحب الشركة. من هنا يُعدّ كل شيء: هوية الشركة، البيانات الجبائية، موظفيه، البنوك، أنواع TVA، وترقيم الوثائق.
الـ Prompt — وصف الصفحة للمطور

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

الـ 6 أقسام الفرعية
🏢
/settings/company
الاسم، اللوغو، العنوان — تظهر في كل فاتورة
📋
/settings/fiscal
ICE، RC، IF، Patente — للمطابقة القانونية
👥
/settings/users
إضافة وإدارة الموظفين وصلاحياتهم
💰
/settings/tva
أنواع TVA — تُستخدم في كل منتج وفاتورة
🏦
/settings/banks
حسابات الشركة البنكية للتسويات
🔢
/settings/numbering
بداية ترقيم كل نوع وثيقة
العلاقات (هذه الصفحة تُغذّي كل شيء)
كل صفحات الـ forms
tva_rates، banks تُستخدم في كل Form
Global Config
كل الـ PDF
اللوغو والبيانات الجبائية
PDF Template
Supabase Auth
إضافة مستخدمين جدد
Auth Write
middleware
الأدوار تُحدد ما يرى كل مستخدم
Access Control