# Cahier des Charges — Module Comptabilité Générale

**Projet** : Hôpital CHR Bertoua  
**Rôle cible** : Comptable (idNiveau = 12)  
**Date** : 2026-05-13  
**Statut** : À valider avant développement

---

## 1. Contexte et Objectif

Le rôle **Comptable** (idNiveau = 12) existe déjà dans l'application mais n'a pas d'interface dédiée à la comptabilité générale. L'objectif est de lui offrir un module complet de saisie, consultation et édition des écritures comptables, connecté aux flux existants (recettes, dépenses, budgets, caisses, fournisseurs).

---

## 2. Architecture des données (nouvelles tables)

### 2.1 `planComptable`
Plan comptable simplifié adapté à un hôpital public.

| Champ | Type | Description |
|-------|------|-------------|
| `id` | INT PK | Identifiant |
| `numero` | VARCHAR(10) | Numéro de compte (ex: 601, 512, 706) |
| `libelle` | VARCHAR(255) | Libellé du compte |
| `classe` | TINYINT | Classe (1-8) |
| `type` | ENUM | `actif`, `passif`, `charge`, `produit` |
| `compteTiers` | TINYINT(1) | 1 si compte de tiers (fournisseur/client) |
| `idParent` | INT | Compte parent (NULL si racine) |
| `flag` | TINYINT | 0=actif, 1=supprimé |

**Comptes de base à créer :**
```
Classe 1 — Comptes de trésorerie
  512 — Banques
  531 — Caisse régie
  532 — Caisse pharmacie

Classe 2 — Comptes d'actif immobilisé
  211 — Terrains
  213 — Bâtiments
  215 — Installations techniques
  218 — Autres immobilisations corporelles

Classe 4 — Comptes de tiers
  401 — Fournisseurs
  411 — Patients / Clients
  421 — Personnel — Avances et acomptes
  431 — Organismes sociaux
  442 — État — Impôts et taxes

Classe 5 — Comptes financiers
  512 (déjà en classe 1, doublon à normaliser)

Classe 6 — Comptes de charges
  601 — Achats de médicaments
  602 — Achats de fournitures médicales
  606 — Achats non stockés (matériel, petit matériel)
  611 — Sous-traitance générale
  621 — Sous-traitance de maintenance
  622 — Rémunérations d'intermédiaires
  623 — Publicité, publications
  624 — Transports de biens
  625 — Déplacements, missions, réceptions
  626 — Frais postaux et télécommunications
  627 — Services bancaires et assimilés
  631 — Charges de personnel — Salaires bruts
  633 — Charges de personnel — Indemnités
  641 — Charges sociales — Cotisations patronales
  661 — Charges d'intérêts

Classe 7 — Comptes de produits
  701 — Ventes de médicaments
  706 — Prestations de services (consultations, soins)
  708 — Produits des activités annexes (cantine, parking)
  741 — Transferts de charges
  771 — Profits sur cessions d'immobilisations

Classe 8 — Comptes de résultat (bilan synthétique)
  802 — Résultat d'exploitation
  803 — Résultat financier
  805 — Résultat net
```

### 2.2 `ecrituresComptables`
Journal général — cœur du module.

| Champ | Type | Description |
|-------|------|-------------|
| `id` | INT PK | Identifiant |
| `numeroPiece` | VARCHAR(20) | Numéro de pièce justificative |
| `dateOperation` | DATE | Date de l'opération |
| `dateSaisie` | DATETIME | Date de saisie système |
| `libelle` | TEXT | Libellé de l'écriture |
| `idCompteDebit` | INT FK | Compte débité (planComptable) |
| `idCompteCredit` | INT FK | Compte crédité (planComptable) |
| `montant` | DECIMAL(15,2) | Montant HT |
| `montantTVA` | DECIMAL(15,2) | Montant TVA (si applicable) |
| `idTiers` | INT | ID du tiers (fournisseur/patient) si compteTiers |
| `typeTiers` | ENUM | `fournisseur`, `patient`, `personnel`, `autre` |
| `idOrigine` | INT | ID de l'origine (ex: idFacture, idCommande, idBudget) |
| `tableOrigine` | VARCHAR(50) | Table d'origine (ex: `factures`, `commandesFournisseurs`) |
| `idExercice` | INT FK | Exercice budgétaire concerné |
| `statut` | TINYINT | 0=brouillon, 1=validée, 2=lettrée, 3=rapprochée |
| `idUser` | INT FK | Utilisateur qui a saisi |
| `flag` | TINYINT | 0=actif, 1=supprimé |

### 2.3 `journauxComptables`
Types de journaux pour l'édition.

| Champ | Type | Description |
|-------|------|-------------|
| `id` | INT PK | |
| `code` | VARCHAR(5) | ACH, VEN, BAN, CAIS, OD, etc. |
| `libelle` | VARCHAR(100) | Achats, Ventes, Banque, Caisse, Opérations diverses |
| `idCompteDefaut` | INT | Compte par défaut associé |

### 2.4 `lettrageComptable`
Pour le rapprochement bancaire et le lettrage des tiers.

| Champ | Type | Description |
|-------|------|-------------|
| `id` | INT PK | |
| `idEcritureDebit` | INT FK | |
| `idEcritureCredit` | INT FK | |
| `dateLettrage` | DATETIME | |
| `idUser` | INT FK | |

---

## 3. Module Contrôleur : `Comptabilite.php`

### 3.1 Dashboard Comptable (`dashboard`)
- **Cartes KPI** :
  - Total recettes du mois (classe 7)
  - Total dépenses du mois (classe 6)
  - Solde trésorerie (classe 5)
  - Écritures en attente de validation
  - Rapprochements bancaires en cours
- **Graphique** : Évolution charges/produits sur les 6 derniers mois
- **Tableau** : Dernières écritures saisies

### 3.2 Plan Comptable (`planComptable`)
- Liste hiérarchique des comptes (arbre classe → compte → sous-compte)
- Ajouter / modifier / désactiver un compte
- Recherche rapide par numéro ou libellé

### 3.3 Saisie des écritures (`saisir`)
- Formulaire de saisie double (débit / crédit)
- Date, libellé, pièce justificative
- Sélection compte via autocomplétion (plan comptable)
- Si compte tiers : sélection du tiers (fournisseur/patient)
- Liaison automatique avec l'origine (facture, commande, budget)
- Montant HT + TVA
- Enregistrement en brouillon ou validation directe

### 3.4 Journal Général (`journal`)
- Affichage chronologique des écritures
- Filtres : date, compte, journal, statut, montant
- Pagination
- Export PDF / Excel

### 3.5 Grand Livre (`grandLivre`)
- Sélection d'un compte
- Affichage de toutes les écritures liées (débits / crédits / solde progressif)
- Filtres par période
- Export PDF

### 3.6 Balance (`balance`)
- Tableau de synthèse de tous les comptes
- Colonnes : Numéro | Libellé | Solde débit N-1 | Solde crédit N-1 | Mouvements débit | Mouvements crédit | Solde débit N | Solde crédit N
- Filtre par classe et par période
- Export PDF / Excel

### 3.7 État Financier (`etatFinancier`)
- **Compte de résultat** (Classe 7 - Classe 6)
- **Bilan simplifié** (Actif / Passif)
- Sélection de l'exercice budgétaire
- Export PDF A4 (style Paper A4 Pro)

### 3.8 Rapprochement Bancaire (`rapprochement`)
- Liste des écritures du compte 512 (Banque)
- Cases à cocher pour marquer les écritures rapprochées
- Saisie du solde bancaire réel
- Calcul de l'écart

### 3.9 Lettrage (`lettrage`)
- Sélection d'un compte tiers (401, 411...)
- Affichage des écritures non lettrées (débits d'un côté, crédits de l'autre)
- Sélection croisée pour lettrer

---

## 4. Intégration avec les modules existants

| Module existant | Flux vers la comptabilité | Mécanisme |
|-----------------|--------------------------|-----------|
| **Caisse (régie + pharmacie)** | Recettes journalières | Bouton "Générer écritures comptables" dans le contrôleur Caisse |
| **Facturation** | Factures patients et tiers-payants | Écriture automatique 411 → 706 au moment de la facturation |
| **Fournisseurs / Commandes** | Factures fournisseurs | Écriture automatique 601/602 → 401 à la réception de la facture |
| **Budgets** | Réalisations budgétaires | Recalcul des réalisations alimente les soldes prévisionnels |
| **Salaires / Paie** | Charges de personnel | Si module RH existe, génération automatique 631/641 |
| **Banque** | Virements, prélèvements | Saisie manuelle ou import CSV |

### 4.1 Génération automatique (suggestion)
- Bouton dans chaque module : "Passer en comptabilité"
- Crée automatiquement les écritures en statut `brouillon`
- Le comptable valide ensuite

---

## 5. Sécurité et Traçabilité

- **Accès** : réservé à `isComptable($id) || isAnAdmin($id) || isSuperAdmin($id)`
- **Écriture validée** : une fois passée en statut 1 (validée), elle n'est plus modifiable (seul l'admin peut la déverrouiller)
- **Suppression** : impossible de supprimer une écriture validée (annulation par écriture inverse uniquement)
- **Audit trail** : chaque écriture porte `idUser`, `dateSaisie`, `dateValidation`
- **Journal des modifications** : table `ecrituresComptables_log` (optionnel)

---

## 6. Vues (Paper A4 Pro)

Toutes les vues suivent le design system Paper A4 Pro (fond gris, cartes blanches, typographie soignée) :

- `comptabilite/dashboard.php`
- `comptabilite/planComptable.php`
- `comptabilite/saisir.php`
- `comptabilite/journal.php`
- `comptabilite/grandLivre.php`
- `comptabilite/balance.php`
- `comptabilite/etatFinancier.php`
- `comptabilite/rapprochement.php`
- `comptabilite/lettage.php`

---

## 7. Menu Comptable

Ajout dans `templates/menu.php` sous `isComptable()` :

```
📊 Comptabilité ▼
  ├── Dashboard
  ├── Saisir une écriture
  ├── Journal général
  ├── Grand Livre
  ├── Balance
  ├── État financier
  └── Plan comptable
```

---

## 8. Livrables prévus

| # | Livrable | Fichier(s) |
|---|----------|------------|
| 1 | Migration SQL | `migration_comptabilite.sql` |
| 2 | Modèles | `PlanComptable_model.php`, `EcrituresComptables_model.php`, `JournauxComptables_model.php` |
| 3 | Contrôleur | `Comptabilite.php` (~15 méthodes) |
| 4 | Vues | 9 vues dans `views/comptabilite/` |
| 5 | Routes | `routes.php` (9 nouvelles routes) |
| 6 | Menu | `templates/menu.php` (branche isComptable) |
| 7 | Tests | `ComptabiliteModelTest.php`, `ComptabiliteIntegrationTest.php` |

---

## 9. Questions à valider

1. **Monnaie** : FCFA (pas de centimes) ou garder DECIMAL(15,2) pour compatibilité ?
2. **TVA** : L'hôpital est-il assujetti à la TVA ou exonéré ?
3. **Exercice comptable** : Identique à l'exercice budgétaire (1er janvier - 31 décembre) ?
4. **Rapprochement bancaire** : Une seule banque (512) ou plusieurs comptes bancaires ?
5. **Import CSV** : Souhaitez-vous importer des relevés bancaires CSV ?
6. **Écritures automatiques** : Voulez-vous que je connecte dès maintenant les recettes caisse et les factures fournisseurs, ou uniquement la saisie manuelle ?
7. **Niveau de détail** : Comptabilité **générale** (grandes masses) ou comptabilité **analytique** aussi (par service, par patient) ?

---

**En l'état, le développement représente environ 8 à 12 heures de travail.**

**Souhaitez-vous que je procède ?** Répondez-moi sur les 7 questions ci-dessus et je commence immédiatement.
