# 🚀 GUIDE DE DÉPLOIEMENT — CGA_MaFiscalite Plateforme v2.0
## Sous-domaine : mafiscalite.cgwgroups.com (hébergé sur cgwgroups.com)

> **Architecture cible :** Laravel 11 déployé en sous-domaine d'un hébergement cPanel existant (cgwgroups.com).  
> Le code Laravel est placé **hors du dossier public** pour la sécurité.

---

## PRÉ-REQUIS LOCAUX (votre machine de développement)

```
PHP 8.2+
Composer 2.x
Node.js 20+ & npm
Client FTP/SFTP : FileZilla (https://filezilla-project.org)
Accès SSH (optionnel mais fortement recommandé)
```

---

## ÉTAPE 1 — Préparation du projet en local

```bash
# 1.1 — Installer les dépendances PHP (mode production, sans devDependencies)
cd cga_mafiscalite
composer install --no-dev --optimize-autoloader

# 1.2 — Installer et compiler les assets JS/CSS
npm install
npm run build   # génère /public/build/ avec les assets Vite

# 1.3 — Créer le fichier .env de production
cp .env.example .env
php artisan key:generate
```

**Éditer `.env` avec vos vraies valeurs :**

```env
APP_NAME="CGA_MaFiscalite Plateforme"
APP_ENV=production
APP_DEBUG=false
APP_URL=https://mafiscalite.cgwgroups.com

DB_DATABASE=cga_mafiscalite_db
DB_USERNAME=cga_mafiscalite_user
DB_PASSWORD=VOTRE_MOT_DE_PASSE_FORT

MAIL_FROM_ADDRESS=noreply@mafiscalite.cgwgroups.com
MAIL_FROM_NAME="CGA MaFiscalite"

VAS2NETS_SENDER_ID=CGAFISCAL
```

---

## ÉTAPE 2 — Créer le sous-domaine dans cPanel (cgwgroups.com)

> Connectez-vous au cPanel de cgwgroups.com avec vos identifiants d'hébergement.

### 2.1 Créer le sous-domaine

Dans **cPanel > Domaines > Sous-domaines** :

| Champ | Valeur |
|-------|--------|
| Sous-domaine | `mafiscalite` |
| Domaine | `cgwgroups.com` |
| Racine du document (Document Root) | `public_html/mafiscalite` *(proposé automatiquement)* |

→ Cliquer **Créer**.

Cela crée automatiquement :
- Le dossier `/home/VOTRE_USER_CPANEL/public_html/mafiscalite/`
- L'entrée DNS `mafiscalite.cgwgroups.com` pointant vers le même serveur

> ⚠️ **Note DNS :** Si cgwgroups.com utilise des nameservers externes (ex. Cloudflare), vérifiez que l'enregistrement A `mafiscalite` est bien créé et pointe vers l'IP du serveur.

### 2.2 Vérifier la propagation DNS (attendre 5–30 minutes)

```bash
# Depuis votre machine locale
nslookup mafiscalite.cgwgroups.com
# → doit retourner l'IP de votre hébergement
```

---

## ÉTAPE 3 — Configurer la base de données MySQL dans cPanel

Dans **cPanel > Bases de données > Bases de données MySQL** :

### 3.1 Créer la base de données
```
Nom : cga_mafiscalite_db
```
→ Après création, le nom complet sera : `CPANEL_PREFIX_cga_mafiscalite_db`  
*(noter le préfixe exact affiché — à utiliser dans .env)*

### 3.2 Créer un utilisateur MySQL
```
Utilisateur : cga_mafiscalite_user
Mot de passe : [minimum 16 caractères, mélange lettres/chiffres/symboles]
```
→ Nom complet : `CPANEL_PREFIX_cga_mafiscalite_user`

### 3.3 Associer l'utilisateur à la base
→ Section **Ajouter un utilisateur à la base** → sélectionner les deux → **Tous les privilèges (ALL PRIVILEGES)**

### 3.4 Mettre à jour `.env`
```env
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=CPANEL_PREFIX_cga_mafiscalite_db
DB_USERNAME=CPANEL_PREFIX_cga_mafiscalite_user
DB_PASSWORD=votre_mot_de_passe_fort
```
> ⚠️ Remplacez `CPANEL_PREFIX_` par le vrai préfixe affiché dans cPanel (ex. `cgwgroup_`)

---

## ÉTAPE 4 — Structure des dossiers sur le serveur

L'application Laravel doit être **séparée** du dossier public pour la sécurité :

```
/home/CPANEL_USER/
├── public_html/
│   └── mafiscalite/             ← Document Root du sous-domaine
│       ├── index.php            ← ⚠️ Fichier modifié (voir §4.2)
│       ├── .htaccess            ← Copié depuis /public/.htaccess
│       └── build/               ← Assets compilés (npm run build)
│           ├── assets/
│           └── manifest.json
│
└── cga_mafiscalite_app/         ← Code Laravel (HORS public_html — sécurisé)
    ├── app/
    ├── bootstrap/
    ├── config/
    ├── database/
    ├── resources/
    ├── routes/
    ├── storage/                 ← CHMOD 755 (écriture Laravel)
    ├── vendor/
    └── .env                     ← JAMAIS dans public_html !
```

### 4.2 Modifier `public/index.php` avant upload

Remplacez le contenu de `public/index.php` par :

```php
<?php
// public/index.php — VERSION SOUS-DOMAINE mafiscalite.cgwgroups.com
// Pointe vers le dossier Laravel hors public_html

define('LARAVEL_START', microtime(true));

// Chemin vers l'autoloader Laravel (hors public_html)
require __DIR__.'/../../cga_mafiscalite_app/vendor/autoload.php';

$app = require_once __DIR__.'/../../cga_mafiscalite_app/bootstrap/app.php';

$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
$response = $kernel->handle(
    $request = Illuminate\Http\Request::capture()
)->send();
$kernel->terminate($request, $response);
```

> **Explication des chemins :**  
> `/home/CPANEL_USER/public_html/mafiscalite/index.php` remonte de 2 niveaux (`../../`) pour atteindre `/home/CPANEL_USER/cga_mafiscalite_app/`

---

## ÉTAPE 5 — Upload des fichiers via FileZilla (FTP/SFTP)

### 5.1 Récupérer les identifiants FTP dans cPanel
**cPanel > FTP > Comptes FTP** (ou utiliser les identifiants cPanel directement)

```
Hôte   : mafiscalite.cgwgroups.com  (ou l'IP du serveur)
Port   : 21 (FTP) ou 22 (SFTP — recommandé)
User   : votre_login_cpanel
Pass   : votre_mot_de_passe_cpanel
```

### 5.2 Upload avec FileZilla

**Connexion :** `sftp://mafiscalite.cgwgroups.com` Port `22`

**Opérations à effectuer :**

| Source locale | Destination serveur |
|---------------|---------------------|
| Tout le projet (sauf `/public`) | `/home/CPANEL_USER/cga_mafiscalite_app/` |
| `public/index.php` *(version modifiée §4.2)* | `/home/CPANEL_USER/public_html/mafiscalite/index.php` |
| `public/.htaccess` | `/home/CPANEL_USER/public_html/mafiscalite/.htaccess` |
| `public/build/` (dossier entier) | `/home/CPANEL_USER/public_html/mafiscalite/build/` |
| `public/favicon.ico`, logos, images | `/home/CPANEL_USER/public_html/mafiscalite/` |

> ⚠️ **Ne pas uploader le dossier `public/` entier dans `public_html/mafiscalite/`** — uploader seulement son contenu.

---

## ÉTAPE 6 — Fichier `.htaccess` du sous-domaine

Créer/remplacer `/home/CPANEL_USER/public_html/mafiscalite/.htaccess` :

```apache
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    # Force HTTPS
    RewriteCond %{HTTPS} off
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

    # Pas de redirection www (sous-domaine)

    # Laravel front controller
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

# PHP 8.2
AddHandler application/x-httpd-php82 .php

# Sécurité headers
<IfModule mod_headers.c>
    Header always set X-Content-Type-Options "nosniff"
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set X-XSS-Protection "1; mode=block"
    Header always set Referrer-Policy "strict-origin-when-cross-origin"
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
</IfModule>

# Protection fichiers sensibles
<Files .env>
    Order allow,deny
    Deny from all
</Files>

# Cache assets statiques
<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresByType text/css "access plus 1 year"
    ExpiresByType application/javascript "access plus 1 year"
    ExpiresByType image/png "access plus 1 month"
    ExpiresByType image/jpeg "access plus 1 month"
    ExpiresByType image/svg+xml "access plus 1 month"
</IfModule>

# Compression Gzip
<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html text/css application/javascript application/json
</IfModule>
```

---

## ÉTAPE 7 — Configuration PHP (`php.ini` / `.user.ini`)

Créer `/home/CPANEL_USER/cga_mafiscalite_app/.user.ini` :

```ini
; PHP 8.2 — CGA_MaFiscalite Platform
memory_limit = 256M
upload_max_filesize = 20M
post_max_size = 25M
max_execution_time = 120
max_input_time = 60
date.timezone = Africa/Douala
display_errors = Off
log_errors = On
error_log = /home/CPANEL_USER/logs/cga_mafiscalite_php_errors.log

; Sessions sécurisées
session.gc_maxlifetime = 7200
session.cookie_secure = 1
session.cookie_httponly = 1
session.cookie_samesite = Strict

; OPcache
opcache.enable = 1
opcache.memory_consumption = 128
opcache.max_accelerated_files = 10000
opcache.revalidate_freq = 60
```

---

## ÉTAPE 8 — Initialisation Laravel via SSH

Dans **cPanel > SSH Access** → Activer SSH, puis :

```bash
# Se connecter
ssh VOTRE_LOGIN@cgwgroups.com

# Aller dans le dossier Laravel
cd ~/cga_mafiscalite_app

# Exécuter les migrations et seeders
php8.2 artisan migrate --force
php8.2 artisan db:seed --force

# Créer le lien symbolique storage → public
php8.2 artisan storage:link
# ⚠️ Sur shared hosting, le lien sera dans cga_mafiscalite_app/public/storage
# Copier manuellement si nécessaire vers public_html/mafiscalite/storage

# Optimiser pour la production
php8.2 artisan config:cache
php8.2 artisan route:cache
php8.2 artisan view:cache
php8.2 artisan event:cache

# Créer l'administrateur FilamentPHP
php8.2 artisan make:filament-user
# → Email : admin@mafiscalite.cgwgroups.com
# → Mot de passe : [fort, minimum 12 caractères]

# Permissions correctes
chmod -R 755 storage bootstrap/cache
chmod 644 .env
```

> **Si SSH non disponible :** utiliser **cPanel > Terminal** (si activé) ou exécuter les commandes via un script PHP temporaire.

---

## ÉTAPE 9 — SSL/HTTPS (Let's Encrypt gratuit)

Dans **cPanel > SSL/TLS > SSL gratuit Let's Encrypt™** :

1. Rechercher `mafiscalite.cgwgroups.com` dans la liste
2. Cliquer **Émettre** (Issue)
3. Attendre 2–5 minutes
4. Vérifier : `https://mafiscalite.cgwgroups.com` → 🔒 cadenas vert

> **Si Let's Encrypt ne liste pas le sous-domaine :** assurez-vous que l'étape 2 (création du sous-domaine) est complète et que le DNS est propagé.

---

## ÉTAPE 10 — Cron Job pour les rappels fiscaux

Dans **cPanel > Cron Jobs** :

| Fréquence | Expression | Commande |
|-----------|-----------|----------|
| Chaque minute | `* * * * *` | `/usr/local/bin/php8.2 /home/CPANEL_USER/cga_mafiscalite_app/artisan schedule:run >> /dev/null 2>&1` |

Ce planificateur déclenche :
- **08h00 chaque jour** — rappels fiscaux IGS par SMS/email
- **Nettoyage des sessions** expirées
- **Rapport hebdomadaire** admin (le lundi)

---

## ÉTAPE 11 — Configuration Email

### Option A : SMTP interne cgwgroups.com (simple, sans inscription)
```env
MAIL_MAILER=smtp
MAIL_HOST=mail.cgwgroups.com
MAIL_PORT=587
MAIL_USERNAME=noreply@mafiscalite.cgwgroups.com
MAIL_PASSWORD=MOT_DE_PASSE_BOITE_EMAIL
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=noreply@mafiscalite.cgwgroups.com
MAIL_FROM_NAME="CGA MaFiscalite"
```
> Créer la boîte email dans **cPanel > Email > Comptes Email**

### Option B : Mailgun (recommandé pour volume élevé)
1. Créer un compte sur https://mailgun.com
2. Ajouter le domaine `mafiscalite.cgwgroups.com` (ou utiliser `cgwgroups.com`)
3. Configurer les enregistrements DNS MX/DKIM/SPF dans cPanel
4. Dans `.env` :
```env
MAIL_MAILER=mailgun
MAILGUN_DOMAIN=mafiscalite.cgwgroups.com
MAILGUN_SECRET=key-XXXXXXXXXXXXXX
MAIL_FROM_ADDRESS=noreply@mafiscalite.cgwgroups.com
```

---

## ÉTAPE 12 — Vérifications post-déploiement

```bash
# Test page d'accueil
curl -I https://mafiscalite.cgwgroups.com
# → HTTP/2 200

# Test redirection HTTP → HTTPS
curl -I http://mafiscalite.cgwgroups.com
# → HTTP/1.1 301 Location: https://mafiscalite.cgwgroups.com/...

# Test simulateur IGS (API)
curl -X POST https://mafiscalite.cgwgroups.com/api/v1/calculer-igs \
  -H "Content-Type: application/json" \
  -d '{"ca_ht": 8000000, "type": "commercial"}'
# → {"eligible_igs":true,"classe":7,...}

# Test admin Filament
curl -I https://mafiscalite.cgwgroups.com/admin
# → HTTP/2 302 (redirection vers /admin/login)
```

### ✅ Checklist finale

- [ ] Sous-domaine créé dans cPanel : `mafiscalite.cgwgroups.com`
- [ ] DNS propagé (nslookup retourne l'IP correcte)
- [ ] SSL actif : https://mafiscalite.cgwgroups.com — cadenas vert 🔒
- [ ] Redirection HTTP → HTTPS opérationnelle
- [ ] Page d'accueil accessible
- [ ] Simulateur IGS fonctionnel : `/simulateurs/igs`
- [ ] Formulaire d'adhésion : `/adhesion`
- [ ] Espace adhérent : `/espace-adherent`
- [ ] Admin FilamentPHP : `/admin` (connexion avec admin@mafiscalite.cgwgroups.com)
- [ ] Emails de confirmation envoyés (test adhésion)
- [ ] SMS opérationnels (VAS2Nets)
- [ ] Cron job actif (rappels fiscaux)
- [ ] Aucune erreur Laravel : `tail -f ~/cga_mafiscalite_app/storage/logs/laravel.log`
- [ ] Score Lighthouse > 85 (Performance) / > 90 (Accessibilité)

---

## MISES À JOUR (post-lancement)

```bash
ssh VOTRE_LOGIN@cgwgroups.com
cd ~/cga_mafiscalite_app

# Mode maintenance
php8.2 artisan down --render="errors.maintenance"

# Uploader les fichiers modifiés via FileZilla
# (ou git pull si Git est configuré)

# Mettre à jour les dépendances PHP
composer install --no-dev --optimize-autoloader

# Migrations si nouvelles tables
php8.2 artisan migrate --force

# Vider et reconstruire les caches
php8.2 artisan optimize:clear
php8.2 artisan optimize

# Remettre en ligne
php8.2 artisan up
```

### Mise à jour annuelle du barème IGS (chaque janvier, nouvelle LF)

```bash
# Modifier BaremeIgsSeeder.php avec les nouveaux montants LF, puis :
php8.2 artisan db:seed --class=BaremeIgsSeeder --force
php8.2 artisan cache:clear
```

---

## RÉSOLUTION DES PROBLÈMES COURANTS

| Problème | Cause probable | Solution |
|----------|---------------|----------|
| Erreur 500 | `.env` absent ou `APP_KEY` vide | `php8.2 artisan key:generate` |
| Page blanche | `APP_DEBUG=false` masque les erreurs | Consulter `storage/logs/laravel.log` |
| Erreur BDD | Préfixe cPanel manquant dans les noms | Vérifier `DB_DATABASE` et `DB_USERNAME` dans `.env` |
| Assets 404 | `build/` non uploadé dans `public_html/mafiscalite/` | Relancer `npm run build` et uploader `public/build/` |
| SSL absent | DNS pas encore propagé | Attendre 30 min, réessayer Let's Encrypt |
| Cron inactif | Mauvais chemin PHP | Utiliser `which php8.2` en SSH pour trouver le bon chemin |
| Storage link cassé | Lien symbolique invalide sur shared hosting | Créer manuellement le dossier `public_html/mafiscalite/storage` |

---

## COÛTS D'EXPLOITATION ANNUELS

| Service | Coût estimé/an |
|---------|----------------|
| Hébergement cgwgroups.com (sous-domaine inclus) | Inclus dans l'abonnement existant |
| SSL Let's Encrypt | 0 FCFA |
| SMS Cameroun VAS2Nets (500/mois) | ~37 000 FCFA |
| Email transactionnel (SMTP interne ou Mailgun Flex) | 0–21 000 FCFA |
| Maintenance & mise à jour annuelle | ~250 000 FCFA |
| **TOTAL** | **≈ 308 000 FCFA/an** |

---

## SUPPORT & RÉFÉRENCES

- Documentation Laravel 11 : https://laravel.com/docs/11.x
- Documentation FilamentPHP 3 : https://filamentphp.com/docs
- Support cPanel : https://docs.cpanel.net
- **Maître d'œuvre :** Ets DIGITECH SOFT TRADING & PARTNER — Bertoua

---
*© 2026 CGA_MaFiscalite — Ets DIGITECH SOFT | CONFIDENTIEL | v2.0*  
*Déploiement : mafiscalite.cgwgroups.com — Sous-domaine de cgwgroups.com*
