# Guide de déploiement & de recette — SaaS de gestion immobilière

Ce guide accompagne le paquet `gestion-immobiliere-deploiement.zip`. Il couvre le déploiement sur hébergement mutualisé cPanel (sans SSH) puis la **recette fonctionnelle** : un scénario de bout en bout à dérouler, case après case, pour vérifier que tout fonctionne avant la mise en service réelle.

---

## 1. Pré-requis

- Hébergement cPanel avec **PHP 8.1+** et **MySQL / MariaDB**.
- Accès **phpMyAdmin** (import de la base) et **Gestionnaire de fichiers** (dépôt des fichiers).
- Un sous-domaine ou domaine pointé vers le dossier public (ex. `agence.mondomaine.bj`).

---

## 2. Base de données

1. Dans cPanel → **Bases de données MySQL** : créer une base et un utilisateur, puis rattacher l'utilisateur à la base avec **tous les privilèges**.
2. Dans **phpMyAdmin**, sélectionner la base, onglet **Importer**, et importer les fichiers **dans cet ordre strict** :
   1. `base-de-donnees/1-schema-mvp.sql`
   2. `base-de-donnees/2-schema-phase2.sql`
   3. `base-de-donnees/3-schema-phase3.sql`
   4. `base-de-donnees/4-data-demo.sql` *(données de démonstration — à ne pas importer si l'on part d'une base vierge en production)*

> L'ordre compte : les phases 2 et 3 ajoutent des tables qui référencent celles du MVP.

---

## 3. Dépôt des fichiers

Deux dispositions possibles.

**Disposition idéale (recommandée)** — le code applicatif hors du dossier public :

```
/home/<compte>/
├── app/            ← déposer le dossier app/
├── storage/        ← déposer le dossier storage/
└── public_html/    ← déposer le CONTENU de public_html/ (index.php, .htaccess, assets/)
```

**Disposition de repli** — si l'hébergeur impose tout dans `public_html/` : déposer `app/`, `storage/` et le contenu de `public_html/` ensemble, puis ajuster les deux chemins d'inclusion en tête de `public_html/index.php` (les commentaires du fichier l'expliquent).

Vérifier que `app/` et `storage/` contiennent bien leur fichier `.htaccess` (`Require all denied`) : ces dossiers ne doivent jamais être accessibles depuis le web.

---

## 4. Configuration

Éditer `app/Config/config.php` :

- `DB_HOST`, `DB_NAME`, `DB_USER`, `DB_PASS` : les identifiants créés à l'étape 2.
- Vérifier le fuseau **Africa/Porto-Novo** et la devise **FCFA**.

Droits d'écriture : donner au dossier `storage/` (et ses sous-dossiers) les droits permettant à PHP d'y écrire (généralement 755, ou 775 selon l'hébergeur).

---

## 5. Tâche planifiée (cron)

Dans cPanel → **Cron Jobs**, planifier la tâche quotidienne (par ex. tous les jours à 6h) :

```
0 6 * * *  php /home/<compte>/app/cli/cron.php quotidien
```

Elle génère les échéances manquantes des baux actifs et les alertes d'impayés.

---

## 6. Comptes de démonstration

Fournis par `4-data-demo.sql` (mot de passe commun : **Demo@2026**) :

| Rôle        | Identifiant           | Usage                                  |
|-------------|-----------------------|----------------------------------------|
| Super admin | `admin@demo.bj`       | Administration éditeur (toi)           |
| Gérant      | `gerant@demo.bj`      | Patron opérationnel de l'agence        |
| Agent       | `agent@demo.bj`       | Saisie quotidienne                     |
| Locataire   | `locataire@demo.bj`   | Espace locataire (lié à Jean Houngbé)  |

> En production réelle : supprimer ces comptes de démo et créer les vrais comptes.

---

## 7. Recette fonctionnelle (scénario de bout en bout)

Dérouler dans l'ordre. Chaque case cochée = un pan du système validé en conditions réelles.

### 7.1 Accès & sécurité
- [ ] La page de connexion s'affiche sur le domaine public.
- [ ] Connexion **agent** → arrivée sur le tableau de bord `/admin`.
- [ ] Les dossiers `app/` et `storage/` renvoient une erreur d'accès si on tente d'y accéder par URL.
- [ ] Déconnexion puis reconnexion avec le **numéro de téléphone** (au lieu de l'e-mail) : fonctionne aussi.

### 7.2 Vitrine publique & pige
- [ ] La vitrine publique liste les biens publiés (sans adresse exacte ni GPS ni nom du propriétaire).
- [ ] Une fiche publique affiche « Prix sur demande » et le quartier, pas l'adresse précise.
- [ ] Envoyer une **demande de contact** depuis la vitrine.
- [ ] Côté agent : la demande apparaît dans **Demandes**, et une **notification** (badge rouge) est créée.

### 7.3 Bien & cartographie & compteurs
- [ ] Créer un **bien** (référence auto `BIEN-AAAA-NNNNN`).
- [ ] Positionner le pin sur la **carte** (Leaflet) et vérifier qu'il se recharge à l'ouverture de la fiche.
- [ ] Ajouter un **décompteur** avec tarif kWh, puis saisir un **relevé** : la consommation et le montant se calculent (index actuel − précédent × tarif).
- [ ] Vérifier qu'un **compteur individuel officiel** n'exige pas de tarif et n'est pas refacturé.

### 7.4 Locataire, bail & garantie (deux poches)
- [ ] Créer un **locataire** et un **propriétaire**.
- [ ] Créer un **bail** : l'échéancier se génère, la **garantie initiale** est enregistrée, le bien passe en « loué ».
- [ ] Vérifier l'état des **deux poches** : avance de garantie + loyers prépayés.

### 7.5 Encaissement, documents & trésorerie
- [ ] **Encaisser** un loyer courant (mode MoMo → **référence obligatoire**).
- [ ] Paiement partiel → **reçu** ; paiement soldant le mois → **quittance**.
- [ ] Le document généré est **imprimable** et porte un **QR de vérification**.
- [ ] Ouvrir `/verifier/{token}` : le document est reconnu **authentique**.
- [ ] La **trésorerie** s'est alimentée automatiquement (recette « Loyers »).
- [ ] Tester un **prépaiement** puis un **renflouement de garantie** : les poches évoluent correctement.

### 7.6 Cautions & états des lieux
- [ ] Ajouter une **caution** (électricité) sur le bail → reçu + recette trésorerie.
- [ ] Réaliser un **état des lieux d'entrée** (plusieurs pièces).
- [ ] Simuler un départ : **restituer** une caution en partie avec motif de retenue → sortie de trésorerie pour la part rendue.

### 7.7 Portail locataire (circuit déclaration → validation)
- [ ] Se connecter en **locataire** (`locataire@demo.bj`) → l'espace affiche le logement, les poches, l'échéancier.
- [ ] **Déclarer un paiement** (MoMo + référence) : il apparaît « en attente de validation ».
- [ ] Côté agent : une **notification** signale la déclaration ; la file `/admin/déclarations` la liste.
- [ ] **Valider** la déclaration → effets appliqués (échéancier/poches), justificatif généré, caisse alimentée.
- [ ] Tester aussi un **rejet** de déclaration.

### 7.8 Mandats & reversements
- [ ] Créer un **mandat** (propriétaire ↔ bien) avec une commission (pourcentage ou fixe).
- [ ] Générer le **reversement** d'une période : commission calculée, net ≥ 0, sortie de trésorerie « Reversements propriétaires ».

### 7.9 Maintenance
- [ ] Créer un **ticket** (priorité urgente), le passer **en cours**, puis **résoudre** avec un coût et **payeur = agence** → dépense de trésorerie « Maintenance ».
- [ ] Vérifier qu'un ticket avec **payeur = propriétaire** ne crée **pas** de dépense de caisse.
- [ ] La **timeline de suivi** retrace chaque transition.

### 7.10 Personnel & paie
- [ ] Ajouter un **employé** avec salaire de base.
- [ ] Générer un **bulletin** (primes + commissions − retenues) : le net se calcule ; option décaissement → dépense « Salaires ».
- [ ] Régénérer le même mois : le bulletin est **mis à jour** (pas de doublon).

### 7.11 Rapports & exports
- [ ] Page **Rapports** : synthèse recettes/dépenses par catégorie sur une période, état des loyers du mois.
- [ ] **Exporter** le journal de trésorerie (CSV) et l'état des loyers (CSV), et les ouvrir dans un tableur : accents corrects, colonnes bien séparées.

### 7.12 Notifications & cron
- [ ] Le **badge** de notifications reflète les non-lues ; « tout marquer comme lu » fonctionne.
- [ ] Lancer manuellement `php app/cli/cron.php quotidien` (ou attendre l'exécution planifiée) : échéances générées + alertes d'impayés créées.

### 7.13 Relance WhatsApp (semi-auto)
- [ ] Sur une fiche bail avec loyer dû, le bouton **« Relancer via WhatsApp »** ouvre WhatsApp avec un message pré-rempli (bien, période, montant).

### 7.14 Consultation des encaissements
- [ ] Menu **Encaissements** : la liste s'affiche, paginée (20 par page).
- [ ] Filtrer par **statut**, **nature**, **mode**, et par **plage de dates** ; rechercher par référence MoMo.
- [ ] Le **total encaissé** affiché ne compte que les paiements **validés** (les déclarations en attente sont exclues).

### 7.15 Clôture de bail (décompte de sortie)
- [ ] Réaliser un **état des lieux de sortie** sur un bail actif.
- [ ] Cliquer **« Clôturer le bail »** : le décompte s'affiche (garantie + cautions − retenues − sommes dues) et se recalcule en direct quand on saisit les retenues.
- [ ] Valider : le bail passe en **résilié**, le **bien est libéré** (repasse en « disponible » et redevient visible en vitrine), et la **restitution** est enregistrée en trésorerie.
- [ ] Vérifier le **décompte imprimable** ; tester un cas où le net est négatif (**à réclamer** au locataire).

### 7.16 Photos des biens
- [ ] Sur une fiche bien, **ajouter une photo** (JPG/PNG/WEBP, 5 Mo max) → elle devient automatiquement la couverture.
- [ ] Ajouter une 2ᵉ photo, **définir la couverture**, puis **supprimer** une photo.
- [ ] Vérifier que la **vitrine** affiche la couverture sur la carte du bien et la galerie sur la fiche publique.
- [ ] Tenter d'envoyer un fichier non-image (ex. un `.php` renommé `.jpg`) → **refusé**.

### 7.17 Sauvegarde de la base (super admin)
- [ ] Menu **Sauvegardes** : cliquer **« Créer une sauvegarde »**, puis **télécharger** le fichier `.sql`.
- [ ] (Recommandé) Vérifier la restauration en important le fichier dans une base de test via phpMyAdmin.
- [ ] Conserver la sauvegarde **hors du serveur**.

### 7.18 Équipe (comptes internes)
- [ ] Menu **Équipe** : créer un compte (rôle, e-mail/téléphone, mot de passe ≥ 8 caractères) et se connecter avec.
- [ ] **Modifier** un compte, **réinitialiser** son mot de passe, le **désactiver** puis le **réactiver**.
- [ ] Vérifier les garde-fous : impossible de **désactiver son propre compte** ou de **changer son propre rôle** ; un gérant ne voit que les comptes de **son agence** et ne peut pas créer de super admin.

---

## 8. Bascule en production

- [ ] Supprimer les **comptes de démo** et les **données de démo**.
- [ ] Créer l'agence réelle, ses **couleurs de marque** (jamais le navy/turquoise Incorporex, réservé à ta marque) et ses comptes.
- [ ] Configurer le **SMTP** dans les paramètres super admin (si envoi d'e-mails souhaité).
- [ ] Vérifier une dernière fois les droits d'écriture de `storage/` et l'exécution du **cron**.

---

## 9. Récapitulatif technique

- **133 fichiers PHP**, **93 routes**, **0 lien mort** dans la navigation.
- **10 suites de tests unitaires** (deux poches, échéancier, documents, reversements, compteurs, rapports, paie, WhatsApp, photos, pagination).
- Modules critiques **validés en recette d'intégration contre une vraie base MySQL** : cycle de paiement complet, clôture de bail, upload de photos, sauvegarde/restauration, sécurité des comptes (hachage bcrypt), pagination.
- Stack : PHP 8, MySQL/MariaDB, JavaScript vanilla, Leaflet embarqué.
- **100 % autonome** par défaut : les dépendances externes (SMTP, API WhatsApp) sont optionnelles et désactivées tant qu'elles ne sont pas configurées.
- **Fonctions de sûreté** : sauvegarde téléchargeable en un clic (sans SSH), restauration vérifiée ; comptes internes avec rôles, mots de passe hachés et anti-verrouillage ; fichiers téléversés stockés hors racine web (non exécutables).
