# Correctifs & Manquants POS - Plan d'Implementation

**Date d'audit :** 2026-04-01
**Derniere mise a jour :** 2026-04-01
**Branche :** socle
**Etat actuel :** 99 routes, ~26 entites, 19 controllers (15 Manager + 3 Employer + 1 Admin), 2 CLI commands

### Progression implementation

| Element | Statut |
|---------|--------|
| Hotfix 1 : Image URL cassee | TERMINE |
| Hotfix 2 : ReceiptService enrichi | TERMINE |
| Phase 11 : Vue Employer POS | TERMINE (3 controllers, 8 templates, 13 routes, 1 Stimulus, menu employer) |
| Phase 12 : Vue Admin POS | TERMINE (1 controller, 5 templates, 5 routes, menu admin) |
| Phase 13 : Medias Produits | TERMINE (ProductMediaService, 3 routes upload/delete/reorder, galerie, types Media POS) |
| Phase 14 : Import/Export Avance | TERMINE (importProducts dans ProductService, 2 routes import + template CSV, template import) |
| Phase 15 : Variantes Produits UI | TERMINE (2 routes add/delete variant, formulaire ajout dans show, suppression CSRF) |
| Phase 16 : Stimulus Controllers | TERMINE (14/14 POS + 1 purchase-order-lines = 15/15) |
| Phase 17 : Commandes CLI | TERMINE (2 commandes : pos:stock-alert, pos:daily-report) |

---

## Resume Executif

| Severite | Categorie | Nombre | Impact |
|----------|-----------|--------|--------|
| CRITIQUE | Bug bloquant (image URL cassee) | 1 | Images produits jamais affichees |
| CRITIQUE | Vue Employer POS (zero UI) | 1 | Aucun employe ne peut vendre |
| HAUTE | Vue Admin POS (zero UI) | 1 | Admin ne peut pas superviser le POS |
| HAUTE | Upload media produits | 1 | Pas d'images produits possibles |
| HAUTE | Import CSV produits | 1 | Pas de chargement catalogue en masse |
| MOYENNE | Variantes produits UI | 1 | Entity existe, pas de CRUD UI |
| MOYENNE | Stimulus controllers | 13 manquants/15 | UX degradee (pas de JS interactif) |
| MOYENNE | Commandes CLI | 2 manquantes | Pas d'alertes stock ni rapports auto |
| BASSE | API Mobile, Mobile Money, etc. | 6 items | Fonctionnalites futures |

**Total prevu :** ~55 fichiers a creer, ~20 fichiers a modifier, ~45 nouvelles routes
**Resultat :** TOUT IMPLEMENTE — 106 routes POS, 15/15 Stimulus, 2 CLI commands

---

## Correctifs Critiques (Hotfix)

### Bug 1 : URL image produit cassee

**Fichier :** `templates/manager/pos/products/_product_card.html.twig` ligne 9

**Probleme :**
```twig
{# ACTUEL - CASSE : asset('') genere "/" - image ne charge jamais #}
<img src="{{ asset('') }}" alt="{{ product.name }}" class="h-full w-full object-cover">
```

**Correctif :**
```twig
{# CORRIGE : toujours afficher le placeholder tant que le systeme media n'est pas implemente #}
{# Quand Phase 13 sera implementee, utiliser : #}
{# <img src="{{ asset(product.primaryImage.media.filePath) }}" ...> #}
<i class="fas {{ product.isService ? 'fa-concierge-bell' : 'fa-box' }} text-4xl text-gray-300 dark:text-gray-600"></i>
```

**Complexite :** Trivial (5 min)
**Dependances :** Aucune

---

### Bug 2 : ReceiptService minimal

**Fichier :** `src/Service/Pos/ReceiptService.php` (26 lignes, 2 methodes seulement)

**Methodes manquantes :**
- `generateReceiptText(Sale): string` — format texte brut pour imprimantes thermiques
- `getReceiptData(Sale): array` — donnees structurees pour rendu Stimulus
- `formatForPrinting(Sale): string` — HTML optimise CSS impression

**Complexite :** Faible (2-3h)
**Dependances :** Aucune

---

## Phase 11 : Vue Employer POS (Interface Caissier)

**Objectif :** Interface SPA-like plein ecran pour que les employes (ROLE_EMPLOYER) puissent traiter les ventes en temps reel.

**Pre-requis existants :**
- CompanyVoter : POS_ACCESS, POS_SELL, POS_STOCK, POS_REPORTS deja definis pour ROLE_EMPLOYER
- PosEmployeeRole : entite avec roles (cashier/seller/supervisor) et permissions granulaires
- SaleService.createSale() : methode complete pour creer une vente (multi-lignes + multi-paiements + stock atomique)
- RegisterService : ouverture/fermeture sessions caisse

### Fichiers a creer

| Fichier | Description |
|---------|-------------|
| `src/Controller/Employer/Pos/CashierController.php` | Interface caissier SPA (~8 routes) |
| `src/Controller/Employer/Pos/EmployerStockController.php` | Consultation/reception stock (~4 routes) |
| `src/Controller/Employer/Pos/EmployerReportController.php` | Rapports lecture seule (~3 routes) |
| `templates/employer/pos/cashier/index.html.twig` | Ecran caisse plein ecran : grille produits + panier + paiement |
| `templates/employer/pos/cashier/open_session.html.twig` | Formulaire ouverture session caisse |
| `templates/employer/pos/cashier/close_session.html.twig` | Formulaire fermeture session + comptage especes |
| `templates/employer/pos/cashier/_product_grid.html.twig` | Grille produits pour selection rapide |
| `templates/employer/pos/cashier/_cart.html.twig` | Panier sidebar |
| `templates/employer/pos/cashier/_payment_modal.html.twig` | Modal paiement multi-methode |
| `templates/employer/pos/cashier/_receipt.html.twig` | Ticket imprimable |
| `templates/employer/pos/stock/index.html.twig` | Vue stock employer |
| `templates/employer/pos/stock/receive.html.twig` | Reception stock |
| `templates/employer/pos/reports/dashboard.html.twig` | Dashboard employer |

### Fichiers a modifier

| Fichier | Modification |
|---------|--------------|
| `templates/components/menus/_menu_employer.html.twig` | Ajouter section POS (Caisse, Stock, Rapports) conditionnelle sur existence PosEmployeeRole |
| `src/Service/Pos/ReceiptService.php` | Enrichir avec methodes manquantes (voir Bug 2) |

### Routes (~15 nouvelles)

| Route | Methode | Path | Voter |
|-------|---------|------|-------|
| `employer_pos_cashier_index` | GET | `/employer/pos/cashier` | POS_SELL |
| `employer_pos_cashier_open` | GET/POST | `/employer/pos/cashier/open` | POS_SELL |
| `employer_pos_cashier_close` | GET/POST | `/employer/pos/cashier/close` | POS_SELL |
| `employer_pos_cashier_sell` | POST | `/employer/pos/cashier/sell` | POS_SELL |
| `employer_pos_cashier_search` | GET | `/employer/pos/cashier/search` | POS_SELL |
| `employer_pos_cashier_customer_search` | GET | `/employer/pos/cashier/customers` | POS_SELL |
| `employer_pos_cashier_receipt` | GET | `/employer/pos/cashier/{id}/receipt` | POS_SELL |
| `employer_pos_cashier_void` | POST | `/employer/pos/cashier/{id}/void` | POS_SELL |
| `employer_pos_stock_index` | GET | `/employer/pos/stock` | POS_STOCK |
| `employer_pos_stock_receive` | GET/POST | `/employer/pos/stock/receive` | POS_STOCK |
| `employer_pos_stock_movements` | GET | `/employer/pos/stock/movements` | POS_STOCK |
| `employer_pos_stock_alerts` | GET | `/employer/pos/stock/alerts` | POS_STOCK |
| `employer_pos_reports_dashboard` | GET | `/employer/pos/reports` | POS_REPORTS |
| `employer_pos_reports_my_sales` | GET | `/employer/pos/reports/my-sales` | POS_ACCESS |
| `employer_pos_reports_daily` | GET | `/employer/pos/reports/daily` | POS_REPORTS |

### Architecture caissier

**Pattern controller :**
```php
#[Route('/employer/pos/cashier', name: 'employer_pos_cashier_')]
#[IsGranted('ROLE_EMPLOYER')]
class CashierController extends AbstractController
{
    // Chaque methode :
    // $company = $user->getPrimaryCompany();
    // $this->denyAccessUnlessGranted('POS_SELL', $company);
    // Reutilise SaleService::createSale() pour la vente
}
```

**Interface caissier (index.html.twig) :**
- Layout plein ecran (pas de sidebar) ou `authenticated.html.twig` avec class fullscreen
- Zone gauche : grille produits avec categories en onglets + barre recherche
- Zone droite : panier avec lignes, quantites, remises, total
- Footer : boutons F1=Recherche, F2=Payer, F4=Annuler, F10=Cash rapide
- Recherche produit via endpoint AJAX (Turbo Frame ou fetch)
- Panier gere cote client par `pos-cashier_controller.js`
- Soumission vente = POST unique avec JSON body (lignes + paiements)

**Flux de vente :**
1. Employe ouvre session caisse (selectionne Register, saisit fond de caisse)
2. Recherche/scan produit → ajoute au panier
3. Optionnel : selectionne client (recherche AJAX)
4. Click "Payer" → modal multi-paiement (cash + mobile_money + card + credit)
5. Validation → SaleService.createSale() → ticket imprime
6. Fin de journee : fermeture session avec comptage especes

### Dependances
- Phase 16 : 4 Stimulus controllers necessaires (pos-cashier, pos-payment, pos-receipt, pos-product-search)

### Complexite : HAUTE (3-5 jours)

---

## Phase 12 : Vue Admin POS

**Objectif :** Dashboard POS consolide pour ROLE_ADMIN, vue sur TOUTES les companies.

### Fichiers a creer

| Fichier | Description |
|---------|-------------|
| `src/Controller/Admin/Pos/AdminPosController.php` | Dashboard POS cross-company (~5 routes) |
| `templates/admin/pos/dashboard.html.twig` | Stats globales POS toutes companies |
| `templates/admin/pos/companies.html.twig` | Liste companies avec POS active + metriques |
| `templates/admin/pos/company_detail.html.twig` | Detail POS d'une company specifique |
| `templates/admin/pos/sales.html.twig` | Toutes les ventes cross-company |
| `templates/admin/pos/audit.html.twig` | Journal d'audit cross-company |

### Fichiers a modifier

| Fichier | Modification |
|---------|--------------|
| `templates/components/menus/_menu_admin.html.twig` | Ajouter section "Point de Vente" avec sous-items (Dashboard, Companies, Ventes, Audit) |
| `src/Service/Pos/PosReportService.php` | Ajouter `getGlobalStats()`, `getCompaniesWithPos()` |
| `src/Repository/Pos/SaleRepository.php` | Ajouter `findAllSalesQuery()` sans filtre company |
| `src/Repository/Pos/PosAuditLogRepository.php` | Ajouter `findAllLogsQuery()` sans filtre company |

### Routes (~5 nouvelles)

| Route | Methode | Path |
|-------|---------|------|
| `admin_pos_dashboard` | GET | `/admin/pos` |
| `admin_pos_companies` | GET | `/admin/pos/companies` |
| `admin_pos_company_detail` | GET | `/admin/pos/companies/{id}` |
| `admin_pos_sales` | GET | `/admin/pos/sales` |
| `admin_pos_audit` | GET | `/admin/pos/audit` |

### Autorisation
`#[IsGranted('ROLE_ADMIN')]` sur le controller. CompanyVoter accorde deja ADMIN tous les attributs POS sauf POS_SETTINGS.

### Dependances : Aucune
### Complexite : MOYENNE (2-3 jours)

---

## Phase 13 : Medias Produits

**Objectif :** Upload images produits avec stockage isole par company, gallery management.

**Pre-requis existants :**
- `src/Entity/Pos/ProductMedia.php` — entite mappee (product FK, media FK, position, isPrimary)
- `src/Entity/Pos/Product.php` — collection productMedia, methode `getPrimaryImage()`
- `src/Service/Media/MediaService.php` — service upload media existant
- `docs/pos/06_MEDIA_ISOLATION.md` — architecture documentee

### Fichiers a creer

| Fichier | Description |
|---------|-------------|
| `src/Service/Media/CompanyMediaPathService.php` | Chemins stockage isoles : `companies/{uuid}/pos/products/{filename}` |
| `src/Service/Media/ProductMediaService.php` | Upload, reorder, delete images produits |
| `src/Form/Pos/ProductMediaFormType.php` | Formulaire upload (file + altText + isPrimary) |
| `assets/controllers/pos-product-image_controller.js` | Stimulus : drag-drop upload, reorder, delete |
| `templates/manager/pos/products/_media_gallery.html.twig` | Galerie images pour product show |
| `templates/manager/pos/products/_media_upload.html.twig` | Formulaire upload pour product edit |
| `src/Command/Pos/MigrateMediaToCompanyStructureCommand.php` | CLI migration fichiers existants |

### Fichiers a modifier

| Fichier | Modification |
|---------|--------------|
| `src/Entity/Media.php` | Ajouter constantes : `TYPE_POS_PRODUCT`, `TYPE_POS_CATEGORY`, `TYPE_POS_RECEIPT`, `TYPE_POS_REPORT` |
| `src/Controller/Manager/Pos/ProductController.php` | Ajouter 3 routes : uploadImage, deleteImage, reorderImages |
| `templates/manager/pos/products/_product_card.html.twig` | Fix ligne 9 : utiliser `asset(product.primaryImage.media.filePath)` avec guard |
| `templates/manager/pos/products/show.html.twig` | Inclure `_media_gallery.html.twig` |
| `templates/manager/pos/products/edit.html.twig` | Inclure `_media_upload.html.twig` |
| `src/Service/Media/MediaService.php` | Ajouter `uploadProductImage()` utilisant CompanyMediaPathService |
| `src/Entity/Pos/PosSettings.php` | Ajouter champs : `maxProductImages`, `maxImageSizeMb`, `storageQuotaMb` |

### Routes (~3 nouvelles sur ProductController)

| Route | Methode | Path |
|-------|---------|------|
| `manager_pos_products_upload_image` | POST | `/manager/pos/products/{id}/images` |
| `manager_pos_products_delete_image` | DELETE | `/manager/pos/products/{id}/images/{mediaId}` |
| `manager_pos_products_reorder_images` | POST | `/manager/pos/products/{id}/images/reorder` |

### Structure stockage
```
var/media/companies/{company_uuid}/pos/products/{filename}
```

### Securite
- `isPathOwnedByCompany()` : verifie que le chemin appartient bien a la company de l'utilisateur (anti path traversal)
- Quotas stockage : `PosSettings.storageQuotaMb` par company

### Dependances
- Phase 16 : `pos-product-image_controller.js`

### Complexite : HAUTE (3-4 jours)

---

## Phase 14 : Import/Export Avance

**Objectif :** Import CSV produits en masse avec mapping colonnes et validation.

### Fichiers a creer

| Fichier | Description |
|---------|-------------|
| `src/Form/Pos/ProductImportFormType.php` | Upload CSV + options (delimiteur, encodage, maj existants) |
| `templates/manager/pos/products/import.html.twig` | Page import : upload, preview, mapping colonnes |
| `templates/manager/pos/products/_import_results.html.twig` | Tableau resultats (crees/maj/erreurs) |

### Fichiers a modifier

| Fichier | Modification |
|---------|--------------|
| `src/Service/Pos/ProductService.php` | Ajouter `importProducts(string $csv, Company $company, User $user, array $mapping): array` |
| `src/Controller/Manager/Pos/ProductController.php` | Ajouter 2 routes : import (GET form + POST process), importTemplate (GET download template CSV) |

### Routes (~2 nouvelles)

| Route | Methode | Path |
|-------|---------|------|
| `manager_pos_products_import` | GET/POST | `/manager/pos/products/import` |
| `manager_pos_products_import_template` | GET | `/manager/pos/products/import/template` |

### Mapping colonnes CSV
```
name, sku, barcode, price, costPrice, taxRate, currentStock, minStock,
category (par nom), unit, description, isService, isActive
```

### Logique import
1. Parse CSV avec delimiteur configurable (`;` ou `,`) et encodage (UTF-8 ou ISO-8859-1)
2. Valide chaque ligne (champs requis, types, SKU unique par company)
3. Option mise a jour existants par correspondance SKU
4. Retourne resultats structures : `['created' => int, 'updated' => int, 'errors' => [...]]`
5. Transaction atomique

### Dependances : Aucune
### Complexite : MOYENNE (2 jours)

---

## Phase 15 : Variantes Produits UI

**Objectif :** Interface CRUD pour gerer les variantes (taille, couleur, etc.) dans le formulaire produit.

**Pre-requis existants :**
- `src/Entity/Pos/ProductVariant.php` — entite avec attributes JSON, priceAdjustment, costPrice, currentStock
- `src/Entity/Pos/Product.php` — collection `$variants` avec cascade persist/remove
- `templates/manager/pos/products/show.html.twig` — affiche variantes en lecture seule (lignes 98-115)

### Fichiers a creer

| Fichier | Description |
|---------|-------------|
| `src/Form/Pos/ProductVariantFormType.php` | Formulaire : name, sku, barcode, priceAdjustment, costPrice, attributes, isActive |
| `assets/controllers/pos-product-variant_controller.js` | Stimulus : ajout/suppression dynamique variantes |
| `templates/manager/pos/products/_variants_tab.html.twig` | Onglet gestion variantes |
| `templates/manager/pos/products/_variant_form_row.html.twig` | Ligne formulaire variante (template JS) |

### Fichiers a modifier

| Fichier | Modification |
|---------|--------------|
| `src/Controller/Manager/Pos/ProductController.php` | Ajouter 3 routes : addVariant, editVariant, deleteVariant |
| `src/Service/Pos/ProductService.php` | Ajouter `addVariant()`, `updateVariant()`, `deleteVariant()` |
| `templates/manager/pos/products/show.html.twig` | Enrichir section variantes avec boutons edit/delete |
| `templates/manager/pos/products/edit.html.twig` | Ajouter onglet variantes avec formulaire inline |

### Routes (~3 nouvelles)

| Route | Methode | Path |
|-------|---------|------|
| `manager_pos_products_add_variant` | POST | `/manager/pos/products/{id}/variants` |
| `manager_pos_products_edit_variant` | POST | `/manager/pos/products/{id}/variants/{variantId}` |
| `manager_pos_products_delete_variant` | DELETE | `/manager/pos/products/{id}/variants/{variantId}` |

### Dependances
- Phase 16 : `pos-product-variant_controller.js`

### Complexite : MOYENNE (1.5-2 jours)

---

## Phase 16 : Stimulus Controllers

**Objectif :** Implementer les 13 Stimulus controllers manquants.

**Etat actuel :** 2/15 existent (`pos-settings_controller.js`, `purchase-order-lines_controller.js`)

### Controllers a creer

| Controller | Lignes est. | Phase liee | Priorite |
|-----------|-------------|------------|----------|
| `pos-cashier_controller.js` | ~400 | Phase 11 | HAUTE |
| `pos-payment_controller.js` | ~200 | Phase 11 | HAUTE |
| `pos-receipt_controller.js` | ~100 | Phase 11 | HAUTE |
| `pos-product-search_controller.js` | ~150 | Phase 11 | HAUTE |
| `pos-product-image_controller.js` | ~200 | Phase 13 | HAUTE |
| `pos-product-variant_controller.js` | ~150 | Phase 15 | MOYENNE |
| `pos-dashboard_controller.js` | ~200 | Rapports existants | MOYENNE |
| `pos-product-form_controller.js` | ~150 | Formulaires existants | MOYENNE |
| `pos-barcode_controller.js` | ~120 | Barcode existant | MOYENNE |
| `pos-stock-alert_controller.js` | ~80 | Stock existant | BASSE |
| `pos-stock-movement_controller.js` | ~120 | Stock existant | BASSE |
| `pos-category-tree_controller.js` | ~200 | Categories existantes | BASSE |
| `pos-inventory_controller.js` | ~150 | Inventaire existant | BASSE |

### Specifications des controllers critiques

#### pos-cashier_controller.js (~400 lignes)
Le controller le plus complexe — gere l'interface caissier complete.

**Stimulus values :**
- `searchUrl` (String) — endpoint recherche produits
- `sellUrl` (String) — endpoint soumission vente
- `customerSearchUrl` (String) — endpoint recherche clients

**Stimulus targets :**
- `productGrid` — zone grille produits
- `cart` — zone panier
- `cartTotal` — affichage total
- `cartCount` — compteur articles
- `paymentModal` — modal paiement
- `customerField` — champ client
- `searchInput` — barre recherche

**Etat interne :**
```javascript
cart = [] // {productId, name, sku, price, quantity, discount, taxRate}
selectedCustomer = null
```

**Methodes :**
- `addToCart(event)` — ajoute produit ou incremente quantite
- `removeFromCart(event)` — supprime ligne panier
- `updateQuantity(event)` — modifie quantite
- `search(event)` — recherche produits (debounce 300ms)
- `openPayment()` — ouvre modal paiement
- `submitSale()` — POST JSON au backend
- `applyDiscount(event)` — applique remise ligne ou globale
- `selectCustomer(event)` — associe client a la vente
- `clearCart()` — vide le panier

**Raccourcis clavier :**
- F1 → focus recherche
- F2 → ouvrir paiement
- F4 → annuler derniere ligne
- F10 → paiement cash rapide (total en especes)

#### pos-payment_controller.js (~200 lignes)
Gere la modal de paiement multi-methode.

**Fonctionnalites :**
- Selection methode : cash, card, mobile_money, transfer, credit
- Split payment : ajouter plusieurs lignes de paiement
- Calcul auto du rendu monnaie (cash)
- Validation : total paye >= total vente
- Providers mobile money : Orange Money, Wave, Free Money
- Champ reference pour mobile money / carte

#### pos-product-search_controller.js (~150 lignes)
Recherche rapide produits + scan code-barres.

**Fonctionnalites :**
- Recherche par nom, SKU, code-barres (debounce 300ms)
- Filtrage par categorie
- Affichage resultats en dropdown autocomplete
- Support scan code-barres (detection rapide de saisie)
- Indicateur stock en temps reel

#### pos-dashboard_controller.js (~200 lignes)
Graphiques et auto-refresh pour le dashboard rapports.

**Fonctionnalites :**
- Chart.js : courbe ventes journalieres, camembert paiements, barres top produits
- Auto-refresh toutes les 60 secondes
- Date range picker pour filtrage
- Animation transitions donnees

### Tous dans `assets/controllers/`
### Dependances : chaque controller lie a sa phase respective
### Complexite : HAUTE aggregate (5-7 jours pour les 13)

---

## Phase 17 : Commandes CLI

**Objectif :** Deux commandes cron pour operations automatisees.

### Fichiers a creer

| Fichier | Description |
|---------|-------------|
| `src/Command/Pos/PosStockAlertCommand.php` | Cron quotidien : verifie seuils stock, envoie email manager |
| `src/Command/Pos/PosDailyReportCommand.php` | Cron quotidien : genere resume journalier, envoie email manager |

### Fichiers a modifier

| Fichier | Modification |
|---------|--------------|
| `src/Service/Pos/StockService.php` | Ajouter `getProductsBelowMinStock(Company): array` |
| `src/Service/Pos/PosReportService.php` | Ajouter `getDailySummary(Company, \DateTime): array` |

### Specifications

#### PosStockAlertCommand
```
php bin/console pos:stock-alert [--company=ID] [--dry-run]
```
- Itere toutes les companies avec POS active
- Trouve produits ou `currentStock <= minStock`
- Envoie email groupe au manager de la company
- Cron recommande : `0 7 * * *` (quotidien 7h)

#### PosDailyReportCommand
```
php bin/console pos:daily-report [--company=ID] [--date=YYYY-MM-DD] [--dry-run]
```
- Itere companies, genere stats jour (ventes, CA, top produits, mouvements stock)
- Envoie email formate au manager
- Cron recommande : `0 6 * * *` (quotidien 6h)

### Dependances : PosReportService, StockService, email service (tous existent)
### Complexite : MOYENNE (1-2 jours)

---

## Ameliorations Futures (Priorite BASSE)

Ces items sont documentes pour reference, pas pour implementation immediate.

| Item | Description | Complexite |
|------|-------------|------------|
| API Mobile POS | 8 endpoints REST pour app mobile (auth JWT, CRUD ventes, stock) | HAUTE |
| Passerelle Mobile Money | Integration APIs Orange Money, Wave, Free Money | HAUTE |
| Multi-depot | Entite Depot, transferts inter-depots, stock par depot | HAUTE |
| Mode hors-ligne | localStorage panier + sync background a la reconnexion | TRES HAUTE |
| Rapports avances | Performance vendeurs, marges, rotation stock (turnover ratio) | MOYENNE |
| PaymentService dedie | Extraire logique paiement de SaleService dans service dedie | FAIBLE |

---

## Ordre d'Execution Recommande

```
1. Hotfix _product_card.html.twig          (immediat, 5 min)
2. Phase 13 : Medias Produits              (debloque images partout)
3. Phase 11 : Vue Employer POS             (valeur business critique)
   + Phase 16 : 4 Stimulus (cashier, payment, receipt, product-search)
4. Phase 15 : Variantes Produits UI
   + Phase 16 : 1 Stimulus (product-variant)
5. Phase 14 : Import CSV Produits
6. Phase 12 : Vue Admin POS
7. Phase 17 : Commandes CLI
8. Phase 16 : Stimulus restants (dashboard, barcode, stock-alert, etc.)
```

### Graphe de dependances

```
Phase 11 (Employer) ──necessite──> Phase 16 (4 Stimulus : cashier, payment, receipt, search)
Phase 13 (Media)    ──necessite──> Phase 16 (1 Stimulus : product-image)
Phase 15 (Variants) ──necessite──> Phase 16 (1 Stimulus : product-variant)
Phase 12 (Admin)    ──independant──
Phase 14 (Import)   ──independant──
Phase 17 (CLI)      ──independant──
```

---

## Inventaire des Fichiers Existants (Reference)

### Controllers Manager POS (15)
```
src/Controller/Manager/Pos/
  AuditLogController.php        (3 routes)
  CustomerController.php        (7 routes)
  ExportController.php          (8 routes)
  InventoryController.php       (8 routes)
  PosEmployeeController.php     (4 routes)
  PosSettingsController.php     (1 route)
  ProductCategoryController.php (4 routes)
  ProductController.php         (6 routes)
  PurchaseOrderController.php   (7 routes)
  RefundController.php          (5 routes)
  RegisterController.php        (5 routes)
  ReportController.php          (5 routes)
  SaleController.php            (5 routes)
  StockController.php           (5 routes)
  SupplierController.php        (8 routes)
```

### Entites POS (26)
```
src/Entity/Pos/
  Barcode.php, CashMovement.php, Customer.php, CustomerCredit.php,
  Inventory.php, InventoryLine.php, Payment.php, PosAuditLog.php,
  PosEmployeeRole.php, PosSettings.php, Product.php, ProductCategory.php,
  ProductMedia.php, ProductVariant.php, PurchaseOrder.php,
  PurchaseOrderLine.php, Refund.php, RefundLine.php, RefundPayment.php,
  Register.php, RegisterSession.php, Sale.php, SaleLine.php,
  StockMovement.php, Supplier.php, SupplierProduct.php
```

### Services POS (17)
```
src/Service/Pos/
  BarcodeService.php, CustomerService.php, InventoryService.php,
  PosAuditService.php, PosEmployeeService.php, PosExportService.php,
  PosReportService.php, PosSettingsService.php, ProductCategoryService.php,
  ProductService.php, PurchaseOrderService.php, ReceiptService.php,
  RefundService.php, RegisterService.php, SaleService.php,
  StockService.php, SupplierService.php
```

### Stimulus Controllers (2/15)
```
assets/controllers/
  pos-settings_controller.js         (EXISTE)
  purchase-order-lines_controller.js (EXISTE)
```

### Formulaires POS (11)
```
src/Form/Pos/
  CustomerFormType.php, PosEmployeeRoleFormType.php, PosSettingsFormType.php,
  ProductCategoryFormType.php, ProductFormType.php, PurchaseOrderFormType.php,
  RegisterFormType.php, StockAddFormType.php, StockAdjustFormType.php,
  SupplierFormType.php, SupplierProductFormType.php
```

---

## Metriques Post-Implementation

| Metrique | Actuel | Apres implementation |
|----------|--------|---------------------|
| Routes POS | 81 | ~126 (+45) |
| Controllers | 15 (Manager seul) | ~23 (+3 Employer, +1 Admin, +4 routes sur existants) |
| Stimulus controllers | 2/15 | 15/15 |
| Templates | ~64 | ~85 (+21) |
| CLI commands | 0 | 2 |
| Roles avec UI POS | 1 (Manager) | 3 (Manager + Employer + Admin) |

---

**Version :** 1.0
**Date :** 2026-04-01
**Auteur :** Audit automatise
