# Architecture — Plateforme de formation

## 1. Vue d'ensemble

Monolithe **Laravel 11** rendu côté serveur (**Blade + Livewire**), base **MySQL 8**,
paiement **Mobile Money** (FedaPay / KkiaPay). Un seul code-base, deux cibles de déploiement :

```
                       ┌──────────────────────────────┐
                       │     Application Laravel        │
   Navigateur ───────► │  Blade + Livewire (server)     │ ──► MySQL 8
                       │  Auth · Catalogue · Panier     │
                       │  E-learning · Sessions · Admin │ ──► Stockage médias
                       └───────────────┬────────────────┘     (Blob/Object Storage)
                                       │
                       ┌───────────────┴────────────────┐
                       │   FedaPay / KkiaPay (webhooks)  │
                       └─────────────────────────────────┘

   Déploiement A : OVH mutualisé  (PHP + MySQL natifs, cron)
   Déploiement B : AKS Azure      (conteneur PHP-FPM+Nginx, Azure DB for MySQL)
```

## 2. Découpage fonctionnel (domaines)

| Domaine | Rôle | Composants Laravel |
|---|---|---|
| **Comptes & rôles** | Inscription, connexion, profils (admin / formateur / apprenant) | Breeze, Policies, Gates |
| **Catalogue** | Formations, catégories, pages de vente, recherche | Models, Livewire components |
| **Contenu e-learning** | Modules, leçons (vidéo/texte/quiz/doc), progression | Models, lecteur Livewire |
| **Sessions blended** | Promos datées, mode (présentiel/visio/blended), capacité, formateur | Models, calendrier |
| **Inscriptions** | Lier apprenant ↔ formation/session, suivi de progression | Models, events |
| **Boutique & paiement** | Panier, commande, paiement Mobile Money, factures | FedaPay/KkiaPay services + webhooks |
| **Attestations** | Génération PDF de certificat en fin de parcours | dompdf/snappy |
| **Back-office** | Administration du catalogue, des ventes, des inscrits | Livewire + Policies |

## 3. Arborescence cible (après amorçage Laravel)

```
plateforme-formation/
├── app/
│   ├── Models/
│   │   ├── User.php
│   │   ├── Category.php
│   │   ├── Formation.php
│   │   ├── FormationModule.php
│   │   ├── Lesson.php
│   │   ├── SessionFormation.php
│   │   ├── Enrollment.php
│   │   ├── LessonCompletion.php
│   │   ├── Order.php
│   │   ├── OrderItem.php
│   │   ├── Payment.php
│   │   └── Certificate.php
│   ├── Livewire/
│   │   ├── Catalog/            (liste, fiche formation, recherche)
│   │   ├── Cart/               (panier, checkout)
│   │   ├── Learning/           (lecteur de leçon, progression)
│   │   ├── Sessions/           (calendrier, inscription session)
│   │   └── Admin/              (CRUD catalogue, ventes, inscrits)
│   ├── Services/
│   │   ├── Payment/
│   │   │   ├── PaymentGateway.php        (interface commune)
│   │   │   ├── FedaPayGateway.php
│   │   │   └── KkiaPayGateway.php
│   │   ├── Enrollment/EnrollmentService.php
│   │   └── Certificate/CertificateService.php
│   ├── Http/Controllers/
│   │   └── Webhooks/PaymentWebhookController.php
│   └── Policies/
├── routes/
│   ├── web.php
│   └── webhooks.php
├── resources/views/
│   ├── layouts/
│   ├── livewire/
│   └── pdf/certificate.blade.php
├── database/
│   ├── migrations/            (générées : alignées sur database/schema.sql)
│   ├── seeders/               (FormationIASeeder : importe le catalogue IA)
│   └── schema.sql             (référence métier — ce dépôt)
├── config/services.php        (clés FedaPay/KkiaPay, stockage)
├── public/                    (document root — point d'entrée sur mutualisé)
└── deploy/                    (Docker, K8s, guides)
```

## 4. Stratégie de déploiement dual

| Aspect | OVH mutualisé | AKS Azure |
|---|---|---|
| Exécution PHP | Apache/PHP intégré | Conteneur PHP-FPM + Nginx |
| Document root | pointer sur `public/` | géré par l'image |
| Base de données | MySQL OVH | Azure Database for MySQL Flexible |
| Migrations | `php artisan migrate` via SSH/cron | Job/init-container au déploiement |
| Files d'attente | driver `database` + tâche cron `queue:work --once` | pod worker dédié |
| Tâches planifiées | cron OVH → `php artisan schedule:run` | CronJob Kubernetes |
| Médias vidéo | **externalisés** (Object Storage / Vimeo) | Azure Blob Storage |
| Secrets | fichier `.env` (hors webroot) | Kubernetes Secrets / Azure Key Vault |
| Montée en charge | verticale (offre) | horizontale (HPA) |

**Règle d'or** : garder le code identique ; seules les **variables d'environnement**
(`.env` / ConfigMap+Secret) changent entre les deux cibles. Voir `deploy/OVH-MUTUALISE.md`
et `deploy/AKS-AZURE.md`.

## 5. Sécurité (rappels)

- `.env` jamais committé, jamais dans le webroot.
- Webhooks paiement : **vérification de signature** FedaPay/KkiaPay obligatoire.
- HTTPS forcé (Let's Encrypt sur OVH, Ingress TLS sur AKS).
- Rôles & Policies pour cloisonner admin / formateur / apprenant.
- Sauvegardes MySQL automatisées (mysqldump cron / backup Azure).
