# Franchise Print Platform

Socle MVP d'une plateforme B2B modulaire multi-boutiques / multi-réseaux pour imprimerie, signalétique et goodies.

## Périmètre couvert

- noyau applicatif sobre en PHP 8.2
- multi-boutiques par host / sous-domaine
- back-office maître
- authentification admin par session
- CRUD boutiques
- CRUD produits maîtres
- caractéristiques multi-attributs par produit
- import de catalogue JSON vers produits maîtres
- gestion du catalogue local par boutique
- activations locales et produits dérivés
- vue boutique enrichie avec aperçu catalogue direct
- catalogue local en cartes avec lecture de l'héritage
- duplication de produit maître avec caractéristiques + tarifs
- duplication de produit boutique vers une autre boutique
- moteur d’héritage explicite parent → enfants sur les produits boutique
- propagation forcée des champs hérités vers les enfants
- diffusion d’un produit maître vers plusieurs boutiques
- tarification orientée prix d'achat HT + coefficient global / réseau / boutique
- import/export CSV simplifié pour Excel (sku + lot_quantity + buy_price_ht)
- upload de PDF source sur produit boutique
- prévisualisation PDF automatique si Imagick est disponible
- pipeline de mock-up IA configurable par API OpenAI
- prompt maître de mock-up avec héritage automatique sur les produits boutique
- override local du prompt mock-up sur produit boutique
- historique des générations mock-up avec prompt résolu et liens vers PDF / rendu
- import CSV utilisateurs back-office
- rattachement réseau / boutique / rôle à l'import
- crédit commercial utilisateur avec historique des mouvements
- back-office crédits consolidé
- back-office commandes avec filtres, détail, PDF source, mock-up et historique de statuts
- connecteurs SSO / OAuth2 génériques configurables en base
- écran d'administration des connecteurs SSO
- ACL métier simple par permissions de rôles
- écran de gestion des politiques tarifaires
- schéma MySQL initial
- tables prêtes pour rétrocessions et connecteurs externes

## Ce que ce socle ne couvre pas encore

- tunnel de commande front complet
- gestion détaillée des adresses utilisateurs
- écran d'édition complet des politiques tarifaires
- import ERP
- moteur transactionnel panier / commande
- newsletter
- personnalisation graphique

Le projet est volontairement posé comme base saine, pas comme application terminée.

## Structure

- `public/` front controller
- `src/Core/` noyau technique
- `src/Modules/` modules métier
- `templates/` vues PHP
- `database/migrations/` SQL initial
- `database/seeds/` données de démo

## Démarrage sous WAMP, sans Composer

1. Copier `.env.example` vers `.env`
2. Adapter les accès MySQL dans `.env`
3. Créer la base MySQL
4. Exécuter les scripts SQL :
   - `database/migrations/001_init.sql`
   - `database/migrations/002_shop_product_inheritance.sql`
   - `database/migrations/003_asset_roles_and_mockup.sql`
   - `database/migrations/004_mockup_prompt_inheritance.sql`
   - puis les migrations métier suivantes jusqu'à `database/migrations/029_shop_path_aliases.sql`
   - `database/seeds/001_demo.sql`
5. Pointer le vhost vers `public/`
6. Pour un jeu de données storefront plus riche, exécuter aussi :
   - `database/seeds/002_backoffice_demo.sql`
   - `database/seeds/003_roles_acl_demo.sql`
   - `database/seeds/004_bat_and_packs_demo.sql`
   - `database/seeds/005_shipping_demo.sql`
   - `database/seeds/006_storefront_test_data.sql`


Le projet contient un autoloader PHP natif dans `autoload.php`.
Si `vendor/autoload.php` existe, il sera utilisé. Sinon, l'application basculera automatiquement sur `autoload.php`.

## Exemple de base locale

- admin : `admin.localhost`
- boutique générique : `generic.localhost`
- boutique réseau : `burgerfactory.localhost`

L'application résout la boutique via la table `shop_domains`. Les alias historiques ou découverte de type `/client` sont déclarés dans `shop_path_aliases` et redirigent vers le domaine canonique de la boutique. Les DNS / hosts et le routage frontal de ces préfixes sont supposés gérés en amont.

## Références multi-domaines

- guide d'architecture : `docs/multi-domain-tenancy.md`
- guide client DNS : `docs/client-dns-custom-domain.md`
- exemple Apache : `examples/server/apache-vhost-multidomain.conf.example`
- exemple Nginx : `examples/server/nginx-multidomain.conf.example`


## Exemple d'import catalogue

Un exemple exploitable par `/admin/catalogue/import-json` est fourni dans :

- `examples/product_catalog.example.json`
## Accès de démonstration

- admin : `/admin/login`
- email : `admin@example.test`
- mot de passe : `admin1234`

### Comptes front de test

- boutique générique : `boutique.demo@example.test` / `admin1234`
- boutique réseau : `agence.demo@example.test` / `admin1234`
- manager agence : `agence.manager.demo@example.test` / `admin1234`

## Pages utiles

- `/admin`
- `/admin/login`
- `/admin/shops`
- `/admin/users`
- `/admin/catalogue`
- `/admin/catalogue/import-json`
- `/admin/shops/show?id=...`
- `/admin/catalogue/products/duplicate?id=...`
- `/admin/catalogue/shop-item/duplicate?id=...`
- `/admin/catalogue/products/distribute?id=...`
- `/admin/catalogue/products/propagate?id=...`
- `/admin/catalogue/shop-item/propagate?id=...`
- `/catalogue`

## Avec Composer plus tard

Si Composer est installé plus tard, tu peux aussi utiliser :

```bash
composer install
```

## Ordre de développement recommandé

1. ACL fine par rôles / permissions
2. enrichir les écrans tarifaires produit par produit
3. panier / commandes
4. crédits
5. rétrocessions
6. import ERP
7. newsletter / personnalisation graphique

## Risques techniques à garder sous contrôle

- dérive de complexité dans le modèle produit
- règles tarifaires qui se dispersent dans le code
- confusion entre prix, remises, crédits, rétrocessions
- duplication excessive des produits dérivés
- couplage trop fort entre back-office et logique métier

## Parties à garder découplées dès le départ

- résolution du tenant
- publication catalogue boutique
- moteur tarifaire
- crédits commerciaux
- rétrocessions
- import ERP / connecteurs
- personnalisation graphique


## Correctif WAMP / Apache

- Ajouter `public/.htaccess`
- Vérifier `AllowOverride All` dans le vhost
- Activer `mod_rewrite`


## Tarification maître + CSV

- Les grilles nominales se pilotent depuis `/admin/pricing`.
- La matrice d’un produit maître est disponible via `/admin/pricing/matrix?product_id=ID`.
- Pour les gros volumes, exporte le template CSV, édite-le dans Excel, puis réimporte-le via `/admin/pricing/import-csv`.
- Les boutiques et produits dérivés héritent de cette base tarifaire. Les ajustements se font ensuite via les politiques de coefficient.


## PDF source et mock-up boutique

Les produits boutique peuvent maintenant stocker :
- un PDF source
- un aperçu PNG du PDF si l'extension `Imagick` est disponible
- un mock-up image généré par IA

Configuration minimale dans `.env` :

```env
OPENAI_MOCKUP_ENABLED=true
OPENAI_API_KEY=...
OPENAI_IMAGE_MODEL=...
```

Le endpoint reste configurable avec `OPENAI_IMAGE_ENDPOINT`.

## Tarification CSV simplifiée

Le format métier recommandé est maintenant :

```csv
sku;lot_quantity;buy_price_ht;format;support_matiere;grammage_epaisseur
PAP-FLYERS;100;14.80;A5;Couché mat;135g
```

Le système convertit ensuite cette ligne en base interne et laisse les politiques tarifaires calculer le prix de vente.


## Migrations complémentaires actuelles

Si tu pars d'une base existante du step précédent, ajoute aussi :
- `database/migrations/005_users_credits_orders_sso.sql`

Si tu veux des données de démo pour tester le BO crédits / commandes / SSO :
- `database/seeds/002_backoffice_demo.sql`

## Fichier d'exemple

- `examples/users_import.example.csv`


## Step 11 — Réseaux / utilisateurs / crédits / commandes / SSO

Après le step 10, jouer aussi :

```sql
source database/migrations/006_network_scoped_backoffice.sql;
```

Ajouts :
- utilisateurs filtrés et édités par réseau
- import CSV supportant `shop_codes`
- crédits filtrables par réseau
- commandes filtrables par réseau
- providers SSO rattachables à un réseau


## Step 12 — rôles plateforme / réseau / agence

Après les migrations précédentes, exécuter aussi :

- `database/migrations/007_roles_acl_and_agent_users.sql`

Seed optionnel de démonstration :

- `database/seeds/003_roles_acl_demo.sql`

Ce step ajoute :
- rôles `super_admin`, `admin`, `network_manager`, `agency_manager`, `agency_agent`, `independent_agent`
- rôles plateforme, réseau et boutique séparés
- création d’un agent d’agence indépendant
- accès back-office limité aux seuls rôles autorisés


## Step 15 — workflow commandes back-office

Migration à jouer :
- `database/migrations/008_orders_workflow_enhancements.sql`

Ajouts :
- références externes et production
- note interne de commande
- transitions de statuts enrichies
- export CSV commandes
- vue détail avec historique, pièces jointes et crédits liés

## Durcissement securite et API reseaux

Apres les migrations metier existantes, appliquer egalement :

```sql
source database/migrations/028_security_network_sync.sql;
```

Consulter `API_NETWORK_SYNC.md`, `SECURITY_AUDIT_REPORT.md` et `SECURITY_TEST_CHECKLIST.md` avant la recette.
