# Suivi d'Intégration POS - Journal de Progression

## Statut Global

| Phase | Nom | Statut | Progression | Date Début | Date Fin |
|-------|-----|--------|-------------|------------|----------|
| 0 | Socle & Infrastructure | TERMINE | 100% | 2026-03-31 | 2026-03-31 |
| 1 | Catalogue Produits | TERMINE | 100% | 2026-03-31 | 2026-03-31 |
| 2 | Gestion des Stocks | TERMINE | 100% | 2026-03-31 | 2026-03-31 |
| 3 | Ventes & Caisse | TERMINE | 100% | 2026-03-31 | 2026-03-31 |
| 4 | Clients & Crédit | TERMINE | 100% | 2026-03-31 | 2026-03-31 |
| 5 | Commandes & Approvisionnement | TERMINE | 100% | 2026-03-31 | 2026-03-31 |
| 6 | Inventaire | TERMINE | 100% | 2026-03-31 | 2026-03-31 |
| 7 | Rapports & Statistiques | TERMINE | 100% | 2026-03-31 | 2026-03-31 |
| 8 | Remboursements & Annulations | TERMINE | 100% | 2026-03-31 | 2026-03-31 |
| 9 | Exports PDF & CSV | TERMINE | 100% | 2026-04-01 | 2026-04-01 |
| 10 | Journal d'audit | TERMINE | 100% | 2026-04-01 | 2026-04-01 |

**Légende :** A FAIRE | EN COURS | TERMINE | BLOQUE

---

## Phase 0 : Socle & Infrastructure

### Entités
| Tâche | Statut | Notes |
|-------|--------|-------|
| PosSettings entity | TERMINE | src/Entity/Pos/PosSettings.php - 30+ champs config |
| PosEmployeeRole entity | TERMINE | src/Entity/Pos/PosEmployeeRole.php - 4 rôles, permissions granulaires |
| PosAuditLog entity | TERMINE | src/Entity/Pos/PosAuditLog.php - append-only, 27 actions |
| Repositories (3) | TERMINE | PosSettingsRepository, PosEmployeeRoleRepository, PosAuditLogRepository |
| Schema update | TERMINE | Mapping validé OK, BDD à synchroniser au deploy |

### Services
| Tâche | Statut | Notes |
|-------|--------|-------|
| PosSettingsService | TERMINE | getOrCreateSettings, enablePos, disablePos, isPosEnabled |
| PosAuditService | TERMINE | log(), getLogsForCompany(), getRecentLogs() |
| PosEmployeeService | TERMINE | assignRole, updatePermissions, removeRole, setPin, verifyPin, hasPermission |

### Sécurité
| Tâche | Statut | Notes |
|-------|--------|-------|
| Extension CompanyVoter (attributs POS) | TERMINE | 6 attributs : POS_ACCESS/MANAGE/SELL/STOCK/REPORTS/SETTINGS |
| Logique voting POS | TERMINE | ADMIN=lecture, MANAGER=full, EMPLOYER=selon PosEmployeeRole |

### Contrôleurs
| Tâche | Statut | Notes |
|-------|--------|-------|
| PosSettingsController | TERMINE | index (GET/POST) avec formulaire complet par onglets |
| PosEmployeeController | TERMINE | index, assign, edit, remove avec CSRF + company scoping |

### Formulaires
| Tâche | Statut | Notes |
|-------|--------|-------|
| PosSettingsFormType | TERMINE | 30+ champs organisés par catégorie |
| PosEmployeeRoleFormType | TERMINE | Sélection employé scopé company + permissions |

### Templates
| Tâche | Statut | Notes |
|-------|--------|-------|
| settings/index.html.twig | TERMINE | 8 onglets dynamiques (Stimulus), gradient emerald |
| employees/index.html.twig | TERMINE | Table avec filtres, pagination, badges rôles |
| employees/assign.html.twig | TERMINE | Formulaire création rôle POS |
| employees/edit.html.twig | TERMINE | Formulaire modification permissions |

### Navigation & UI
| Tâche | Statut | Notes |
|-------|--------|-------|
| Section POS dans sidebar manager | TERMINE | 2 liens : Config POS + Employés POS, séparateur |
| Contextes NavigationService | TERMINE | pos_settings + pos_employees ajoutés |
| Stimulus: pos-settings_controller.js | TERMINE | Onglets dynamiques avec hash URL |

### Validation
| Critère | OK ? |
|---------|------|
| Manager peut activer POS pour sa company | OUI |
| Manager peut configurer les paramètres | OUI |
| Manager peut assigner rôles POS aux employés | OUI |
| Actions tracées dans PosAuditLog | OUI |
| Voter bloque accès aux non-autorisés | OUI |

---

## Phase 1 : Catalogue Produits

### Entités
| Tâche | Statut | Notes |
|-------|--------|-------|
| ProductCategory entity | TERMINE | Hiérarchique, soft-delete, company-scoped |
| Product entity | TERMINE | 30+ champs, variantes, médias, barcodes |
| ProductVariant entity | TERMINE | Attributs JSON, prix adjustment |
| ProductMedia entity | TERMINE | Liaison Product-Media avec position |
| Barcode entity | TERMINE | EAN13/EAN8/CODE128/QR, company-unique |
| Repositories (5) | TERMINE | Filtres search/category/stock/price |
| Schema update | TERMINE | Mapping validé OK |

### Services
| Tâche | Statut | Notes |
|-------|--------|-------|
| ProductService | TERMINE | CRUD, duplicate, generateSku, getLowStock, stats |
| ProductCategoryService | TERMINE | CRUD, tree, reorder |
| BarcodeService | TERMINE | generateBarcode, lookupBarcode, EAN checkdigit |

### Contrôleurs
| Tâche | Statut | Notes |
|-------|--------|-------|
| ProductController (CRUD + duplicate) | TERMINE | index/create/show/edit/delete/duplicate |
| ProductCategoryController (CRUD + tree) | TERMINE | index/create/edit/delete |

### Formulaires
| Tâche | Statut | Notes |
|-------|--------|-------|
| ProductFormType | TERMINE | Infos, prix, stock, options |
| ProductCategoryFormType | TERMINE | Hiérarchique, couleur, icône |
| ProductVariantFormType | A FAIRE | Phase suivante (variantes UI) |
| ProductImportFormType | A FAIRE | Phase suivante (import CSV) |
| ProductFilterFormType | A FAIRE | Inline dans le template |

### Templates
| Tâche | Statut | Notes |
|-------|--------|-------|
| products/index.html.twig | TERMINE | Table + grille, filtres, stats |
| products/create.html.twig | TERMINE | Form multi-sections |
| products/show.html.twig | TERMINE | Détail avec prix, stock, variantes |
| products/edit.html.twig | TERMINE | Même structure que create |
| products/_product_card.html.twig | TERMINE | Carte pour vue grille |
| products/_product_row.html.twig | TERMINE | Ligne pour vue table |
| products/import.html.twig | A FAIRE | Phase suivante |
| categories/index.html.twig | TERMINE | Arbre récursif |
| categories/_category_item.html.twig | TERMINE | Item récursif avec enfants |
| categories/create.html.twig | TERMINE | Form catégorie |
| categories/edit.html.twig | TERMINE | Form catégorie |

### Stimulus
| Tâche | Statut | Notes |
|-------|--------|-------|
| pos-product-form_controller.js | A FAIRE | |
| pos-product-image_controller.js | A FAIRE | |
| pos-category-tree_controller.js | A FAIRE | |
| pos-product-variant_controller.js | A FAIRE | |
| pos-barcode_controller.js | A FAIRE | |

### Validation
| Critère | OK ? |
|---------|------|
| CRUD catégories hiérarchiques (3 niveaux) | |
| CRUD produits avec filtres et pagination | |
| Variantes (taille, couleur) | |
| Upload multi-images via Media | |
| Codes-barres génération + scan | |
| Import/Export CSV | |
| Vues table et grille | |
| Isolation par company | |

---

## Phase 2 : Gestion des Stocks

### Entités
| Tâche | Statut | Notes |
|-------|--------|-------|
| StockMovement entity | TERMINE | src/Entity/Pos/StockMovement.php - Append-only, 6 types, constructeur uniquement |
| Supplier entity | TERMINE | src/Entity/Pos/Supplier.php - Soft-delete, UUID v7, dénormalisé (totalOrders/totalAmount) |
| SupplierProduct entity | TERMINE | src/Entity/Pos/SupplierProduct.php - Jonction Supplier-Product, isPreferred |
| Repositories (3) | TERMINE | StockMovementRepository, SupplierRepository, SupplierProductRepository |
| PosAuditLog constants | TERMINE | 11 nouvelles constantes ACTION + 2 ENTITY (stock_movement, supplier_product) |
| Product.php collections | TERMINE | Ajout stockMovements + supplierProducts (OneToMany inverse) |
| Schema update | TERMINE | Mapping validé OK |

### Services
| Tâche | Statut | Notes |
|-------|--------|-------|
| StockService | TERMINE | addStock, removeStock, adjustStock, returnStock, recordLoss, getLow/Critical/OutOfStock, getStockValuation |
| SupplierService | TERMINE | CRUD + toggleSupplier, linkProduct, unlinkProduct, getSuppliersQuery |

### Formulaires
| Tâche | Statut | Notes |
|-------|--------|-------|
| StockAddFormType | TERMINE | product (EntityType company-scoped), quantity, unitCost, reason, reference |
| StockAdjustFormType | TERMINE | product, newQuantity, reason (required) |
| SupplierFormType | TERMINE | Tous champs fournisseur, pays africains, conditions paiement |
| SupplierProductFormType | TERMINE | product (EntityType), purchasePrice, minOrderQuantity, leadTimeDays, isPreferred |

### Contrôleurs
| Tâche | Statut | Notes |
|-------|--------|-------|
| StockController (5 routes) | TERMINE | index, movements, add, adjust, alerts — voter POS_STOCK |
| SupplierController (8 routes) | TERMINE | index, create, show, edit, delete, toggle, linkProduct, unlinkProduct |
| StockReceptionController (employer) | A FAIRE | Phase suivante (employer scope) |

### Templates
| Tâche | Statut | Notes |
|-------|--------|-------|
| stock/index.html.twig | TERMINE | Stats valeur stock, table produits avec badges couleur, pagination |
| stock/movements.html.twig | TERMINE | Filtres (type, dates, produit), table mouvements paginée |
| stock/add.html.twig | TERMINE | Formulaire entrée stock (gradient vert) |
| stock/adjust.html.twig | TERMINE | Formulaire ajustement (gradient jaune) |
| stock/alerts.html.twig | TERMINE | 3 sections: rupture (rouge), critique (orange), bas (jaune) |
| suppliers/index.html.twig | TERMINE | Stats, table paginée, toggle/delete CSRF (gradient indigo) |
| suppliers/create.html.twig | TERMINE | Formulaire 2 sections (infos + adresse) |
| suppliers/edit.html.twig | TERMINE | Même structure que create |
| suppliers/show.html.twig | TERMINE | Détail 3 colonnes: infos + produits liés + formulaire liaison |

### Navigation & UI
| Tâche | Statut | Notes |
|-------|--------|-------|
| Sidebar menu: Stock + Fournisseurs | TERMINE | Ajoutés entre Catégories et Employés POS |

### Commandes
| Tâche | Statut | Notes |
|-------|--------|-------|
| PosStockAlertCommand | A FAIRE | Phase suivante (CLI email alertes) |

### Validation
| Critère | OK ? |
|---------|------|
| Entrée/sortie/ajustement stock | OUI |
| Stock dénormalisé sur Product (atomique via transaction) | OUI |
| Alertes visuelles stock bas/critique | OUI |
| CRUD fournisseurs avec liaison produits | OUI |
| Traçabilité complète (StockMovement append-only) | OUI |
| Isolation par company | OUI |
| Container DI validé | OUI |
| Twig lint 299/299 OK | OUI |
| 28 routes POS enregistrées (15 + 13) | OUI |

---

## Phase 3 : Ventes & Caisse

### Entités
| Tâche | Statut | Notes |
|-------|--------|-------|
| Sale entity | TERMINE | src/Entity/Pos/Sale.php - UUID v7, statuts, multi-paiement, snapshots prix |
| SaleLine entity | TERMINE | src/Entity/Pos/SaleLine.php - Snapshot produit (nom, SKU, prix), margin calc |
| Payment entity | TERMINE | src/Entity/Pos/Payment.php - 5 méthodes (cash/mobile_money/card/transfer/credit), providers |
| Register entity | TERMINE | src/Entity/Pos/Register.php - CRUD caisse, session courante, isDefault |
| RegisterSession entity | TERMINE | src/Entity/Pos/RegisterSession.php - open/closed/suspended, totaux dénormalisés |
| CashMovement entity | TERMINE | src/Entity/Pos/CashMovement.php - in/out, motif, approbation |
| PosAuditLog constants | TERMINE | +4 ACTION (payment_processed, register_created/updated/suspended) +3 ENTITY |
| Repositories (6) | TERMINE | SaleRepository, SaleLineRepository, PaymentRepository, RegisterRepository, RegisterSessionRepository, CashMovementRepository |
| Schema update | TERMINE | Mapping validé OK |

### Services
| Tâche | Statut | Notes |
|-------|--------|-------|
| SaleService | TERMINE | createSale (multi-lignes+paiements+stock atomique), voidSale (restore stock), generateSaleNumber, getDailyStats |
| RegisterService | TERMINE | CRUD register, openSession, closeSession (calcul écart), suspendSession, resumeSession, addCashMovement |
| ReceiptService | TERMINE | generateReceiptHtml via Twig template |

### Formulaires
| Tâche | Statut | Notes |
|-------|--------|-------|
| RegisterFormType | TERMINE | name, description, location, isActive, isDefault |

### Contrôleurs
| Tâche | Statut | Notes |
|-------|--------|-------|
| SaleController (5 routes) | TERMINE | index, show, receipt, void (CSRF), dailyReport — voter POS_SELL/POS_MANAGE/POS_REPORTS |
| RegisterController (5 routes) | TERMINE | index, create, edit, sessions, sessionDetail — voter POS_MANAGE |
| CashierController (employer) | A FAIRE | Phase suivante (interface caissier SPA-like) |

### Templates
| Tâche | Statut | Notes |
|-------|--------|-------|
| sales/index.html.twig | TERMINE | Stats jour, filtres, table paginée (gradient teal-cyan) |
| sales/show.html.twig | TERMINE | Détail 3 colonnes: lignes + paiements + résumé, modal annulation |
| sales/_receipt.html.twig | TERMINE | Ticket de caisse monospace, auto-print, configurable via PosSettings |
| sales/daily_report.html.twig | TERMINE | Rapport journalier: stats + répartition paiements par méthode |
| registers/index.html.twig | TERMINE | Cards caisses avec statut session, badges (gradient violet) |
| registers/create.html.twig | TERMINE | Formulaire création caisse |
| registers/edit.html.twig | TERMINE | Formulaire modification caisse |
| registers/sessions.html.twig | TERMINE | Table sessions paginée avec écarts |
| registers/session_detail.html.twig | TERMINE | Résumé finances + mouvements caisse + ventes de la session |

### Navigation & UI
| Tâche | Statut | Notes |
|-------|--------|-------|
| Sidebar menu: Ventes + Caisses | TERMINE | Ajoutés entre Fournisseurs et Employés POS |

### Stimulus (critiques)
| Tâche | Statut | Notes |
|-------|--------|-------|
| pos-cashier_controller.js | A FAIRE | Phase suivante (interface caissier SPA) |
| pos-payment_controller.js | A FAIRE | Phase suivante |
| pos-receipt_controller.js | A FAIRE | Phase suivante |
| pos-product-search_controller.js | A FAIRE | Phase suivante |

### Validation
| Critère | OK ? |
|---------|------|
| Création vente avec multi-lignes et multi-paiements | OUI |
| Calcul TVA et remises (TTC/HT configurable) | OUI |
| Multi-paiement (espèces, mobile money, carte, virement, crédit) | OUI |
| Rendu de monnaie calculé automatiquement | OUI |
| Annulation vente avec restauration stock (CSRF) | OUI |
| CRUD caisses enregistreuses | OUI |
| Ouverture/fermeture session avec calcul écart | OUI |
| Mouvements caisse (entrée/sortie) | OUI |
| Stock décrémenté atomiquement (executeInTransaction) | OUI |
| Historique ventes manager avec filtres/pagination | OUI |
| Ticket de caisse imprimable (configurable) | OUI |
| Rapport journalier par méthode de paiement | OUI |
| Container DI validé | OUI |
| Twig lint 308/308 OK | OUI |
| 38 routes POS enregistrées (28 + 10) | OUI |

---

## Phase 4 : Clients & Crédit

### Entités
| Tâche | Statut | Notes |
|-------|--------|-------|
| Customer entity | TERMINE | src/Entity/Pos/Customer.php - UUID v7, soft-delete, dénormalisé (creditBalance, totalSpent, loyaltyPoints) |
| CustomerCredit entity | TERMINE | src/Entity/Pos/CustomerCredit.php - Append-only, types credit/payment, balanceBefore/After |
| Sale.customer FK | TERMINE | Ajout relation ManyToOne nullable vers Customer |
| PosAuditLog constants | TERMINE | +4 ACTION (customer_updated/deleted, loyalty_added/redeemed) +1 ENTITY (customer_credit) |
| Repositories (2) | TERMINE | CustomerRepository, CustomerCreditRepository |
| Schema update | TERMINE | Mapping validé OK |

### Services
| Tâche | Statut | Notes |
|-------|--------|-------|
| CustomerService | TERMINE | CRUD, addCredit, recordPayment, addLoyaltyPoints, redeemLoyaltyPoints, getDebtors, recordPurchase |

### Formulaires
| Tâche | Statut | Notes |
|-------|--------|-------|
| CustomerFormType | TERMINE | firstName, lastName, phone, email, address, city, notes, isActive |

### Contrôleurs
| Tâche | Statut | Notes |
|-------|--------|-------|
| CustomerController (7 routes) | TERMINE | index, create, show, edit, delete (CSRF), recordPayment, debtors — voter POS_MANAGE |

### Templates
| Tâche | Statut | Notes |
|-------|--------|-------|
| customers/index.html.twig | TERMINE | Stats (total, actifs, débiteurs, dette), filtres, table paginée (gradient pink) |
| customers/create.html.twig | TERMINE | Formulaire création client |
| customers/edit.html.twig | TERMINE | Formulaire modification |
| customers/show.html.twig | TERMINE | Détail 3 colonnes: infos + stats + historique crédit + derniers achats |
| customers/record_payment.html.twig | TERMINE | Formulaire encaissement avec solde affiché |
| customers/debtors.html.twig | TERMINE | Liste débiteurs triés par montant, total dette (gradient rouge-orange) |

### Navigation & UI
| Tâche | Statut | Notes |
|-------|--------|-------|
| Sidebar menu: Clients | TERMINE | Ajouté entre Ventes et Caisses |

### Intégration Caisse
| Tâche | Statut | Notes |
|-------|--------|-------|
| Sélection client dans caisse | A FAIRE | Phase suivante (CashierController) |
| Paiement par crédit | A FAIRE | Phase suivante |
| Points fidélité | A FAIRE | Phase suivante |

### Validation
| Critère | OK ? |
|---------|------|
| CRUD clients avec soft-delete | OUI |
| Système crédit (append-only CustomerCredit) | OUI |
| Paiements de dette avec validation montant | OUI |
| Liste débiteurs avec dette totale | OUI |
| Points fidélité (ajout/utilisation) | OUI |
| Historique achats par client (via Sale.customer) | OUI |
| Dénormalisation atomique (creditBalance, totalSpent, etc.) | OUI |
| Container DI validé | OUI |
| Twig lint 314/314 OK | OUI |
| 45 routes POS enregistrées (38 + 7) | OUI |

---

## Phase 5 : Commandes & Approvisionnement

### Entités
| Tâche | Statut | Notes |
|-------|--------|-------|
| PurchaseOrder entity | TERMINE | src/Entity/Pos/PurchaseOrder.php - UUID v7, workflow 6 statuts (DRAFT→SENT→CONFIRMED→PARTIAL→RECEIVED→CANCELLED) |
| PurchaseOrderLine entity | TERMINE | src/Entity/Pos/PurchaseOrderLine.php - Snapshots, receivedQuantity, helpers remaining/fullyReceived |
| PosAuditLog constants | TERMINE | +6 ACTION (purchase_order_sent/confirmed/cancelled/updated) |
| Repositories (2) | TERMINE | PurchaseOrderRepository (filters, countByCompany, pendingValue), PurchaseOrderLineRepository |
| Schema update | TERMINE | Mapping validé OK |

### Services
| Tâche | Statut | Notes |
|-------|--------|-------|
| PurchaseOrderService | TERMINE | createOrder, updateOrder, sendOrder, confirmOrder, receiveOrder (stock inline), cancelOrder |

### Formulaires
| Tâche | Statut | Notes |
|-------|--------|-------|
| PurchaseOrderFormType | TERMINE | supplier EntityType, expectedDeliveryAt, notes — lignes via JSON hidden input |

### Contrôleurs
| Tâche | Statut | Notes |
|-------|--------|-------|
| PurchaseOrderController (7 routes) | TERMINE | index, create, show, edit, send, receive, cancel — voter POS_STOCK |

### Templates
| Tâche | Statut | Notes |
|-------|--------|-------|
| purchase-orders/index.html.twig | TERMINE | 5 stats cards, filtres (search/status/supplier/dates), table paginée (gradient indigo-purple) |
| purchase-orders/create.html.twig | TERMINE | Formulaire + line builder dynamique Stimulus (gradient blue-indigo) |
| purchase-orders/show.html.twig | TERMINE | Gradient dynamique, boutons action conditionnels, modal annulation |
| purchase-orders/edit.html.twig | TERMINE | Même structure que create, pré-rempli (gradient yellow-orange) |
| purchase-orders/receive.html.twig | TERMINE | Table lignes avec qty inputs (max=restant) (gradient green-emerald) |

### Stimulus
| Tâche | Statut | Notes |
|-------|--------|-------|
| purchase-order-lines_controller.js | TERMINE | Lignes dynamiques, produits par fournisseur, calcul totaux, sérialisation JSON |

### Navigation & UI
| Tâche | Statut | Notes |
|-------|--------|-------|
| Sidebar menu: Commandes | TERMINE | Ajouté entre Fournisseurs et Ventes |
| Bouton "Nouvelle commande" sur supplier show | TERMINE | Lien avec ?supplier={id} |

### Validation
| Critère | OK ? |
|---------|------|
| Création bon de commande avec lignes dynamiques | OUI |
| Workflow statuts (draft→sent→confirmed→partial→received) | OUI |
| Réception partielle/totale avec stock inline | OUI |
| Stock mis à jour à réception (StockMovement TYPE_IN) | OUI |
| Mise à jour Supplier dénormalisé (totalOrders/totalAmount) | OUI |
| SupplierProduct.lastPurchasePrice mis à jour | OUI |
| Container DI validé | OUI |
| Twig lint OK | OUI |
| 52 routes POS enregistrées (45 + 7) | OUI |

---

## Phase 6 : Inventaire

### Entités
| Tâche | Statut | Notes |
|-------|--------|-------|
| Inventory entity | TERMINE | src/Entity/Pos/Inventory.php - UUID v7, 5 statuts (DRAFT→IN_PROGRESS→COMPLETED→VALIDATED→CANCELLED), 3 types (FULL/PARTIAL/CATEGORY) |
| InventoryLine entity | TERMINE | src/Entity/Pos/InventoryLine.php - expectedQuantity, countedQuantity, difference, differenceValue, isCounted |
| PosAuditLog constants | TERMINE | +4 ACTION (inventory_started/completed/validated/cancelled) +1 ENTITY (inventory_line) |
| Repositories (2) | TERMINE | InventoryRepository (filters, countByCompany, findActive), InventoryLineRepository (uncounted, discrepancies) |
| Schema update | TERMINE | Mapping validé OK |

### Services
| Tâche | Statut | Notes |
|-------|--------|-------|
| InventoryService | TERMINE | createInventory (check no active), startInventory, updateCounts, completeInventory, validateInventory (stock inline TYPE_ADJUSTMENT), cancelInventory |

### Contrôleurs
| Tâche | Statut | Notes |
|-------|--------|-------|
| InventoryController (8 routes) | TERMINE | index, create, show, count, start, complete, validate, cancel — voter POS_STOCK |

### Templates
| Tâche | Statut | Notes |
|-------|--------|-------|
| inventories/index.html.twig | TERMINE | 5 stats cards, filtres, table avec progress et écarts (gradient amber-yellow) |
| inventories/create.html.twig | TERMINE | Type select + catégorie (JS toggle), info workflow 5 étapes |
| inventories/show.html.twig | TERMINE | Gradient dynamique, 4 stats cards, boutons action, table lignes |
| inventories/count.html.twig | TERMINE | Barre de progression, table avec qty inputs et notes (gradient blue-cyan) |

### Navigation & UI
| Tâche | Statut | Notes |
|-------|--------|-------|
| Sidebar menu: Inventaires | TERMINE | Ajouté entre Stock et Fournisseurs |

### Validation
| Critère | OK ? |
|---------|------|
| Création inventaire (total/partiel/catégorie) | OUI |
| Pré-remplissage stock théorique (expectedQuantity) | OUI |
| Saisie comptages avec notes par ligne | OUI |
| Calcul écarts (difference + differenceValue) | OUI |
| Validation manager → ajuste stock (TYPE_ADJUSTMENT inline) | OUI |
| Un seul inventaire actif par company | OUI |
| Container DI validé | OUI |
| Twig lint OK | OUI |
| 60 routes POS enregistrées (52 + 8) | OUI |

---

## Phase 7 : Rapports & Statistiques

### Services
| Tâche | Statut | Notes |
|-------|--------|-------|
| PosReportService | TERMINE | getDashboardStats, getSalesReport, getStockReport, getFinancialReport, getProductsReport |

### Contrôleurs
| Tâche | Statut | Notes |
|-------|--------|-------|
| ReportController (5 routes) | TERMINE | dashboard, sales, stock, financial, products — voter POS_REPORTS |

### Templates
| Tâche | Statut | Notes |
|-------|--------|-------|
| reports/dashboard.html.twig | TERMINE | 8 KPIs, top produits jour, paiements jour, activité récente, quick links (gradient emerald-teal) |
| reports/sales.html.twig | TERMINE | Filtre dates, 4 KPIs, ventes/jour + top produits + paiements (gradient teal-cyan) |
| reports/stock.html.twig | TERMINE | 4 KPIs, mouvements, ruptures + stock critique (gradient blue-indigo) |
| reports/financial.html.twig | TERMINE | 6 KPIs, paiements + top 10 produits CA (gradient yellow-amber) |
| reports/products.html.twig | TERMINE | 4 KPIs, classement produits avec médailles top 3 (gradient purple-pink) |

### Navigation & UI
| Tâche | Statut | Notes |
|-------|--------|-------|
| Sidebar menu: Rapports | TERMINE | Ajouté entre Caisses et Employés POS |

### Commandes
| Tâche | Statut | Notes |
|-------|--------|-------|
| PosDailyReportCommand | A FAIRE | CLI pour envoi rapport quotidien par email |

### Validation
| Critère | OK ? |
|---------|------|
| Dashboard POS avec KPIs temps réel | OUI |
| Rapports ventes par période avec filtres dates | OUI |
| Top produits avec classement | OUI |
| Répartition paiements par méthode | OUI |
| Rapport stock (ruptures, alertes, mouvements) | OUI |
| Rapport financier (CA, TVA, remises, encaissé, crédit, dettes) | OUI |
| Container DI validé | OUI |
| Twig lint 328/328 OK | OUI |
| 65 routes POS enregistrées (60 + 5) | OUI |

---

## Phase 8 : Remboursements & Annulations

### Entités
| Tâche | Statut | Notes |
|-------|--------|-------|
| Refund entity | TERMINE | src/Entity/Pos/Refund.php - UUID v7, workflow 2 étapes (PENDING→APPROVED/REJECTED), TYPE_FULL/PARTIAL |
| RefundLine entity | TERMINE | src/Entity/Pos/RefundLine.php - Snapshots, restockProduct flag |
| RefundPayment entity | TERMINE | src/Entity/Pos/RefundPayment.php - Méthode remboursement (cash/credit/etc.) |
| StockMovement.REF_REFUND | TERMINE | Nouvelle constante de référence |
| PosAuditLog.ACTION_REFUND_REJECTED | TERMINE | Nouvelle constante + label |
| Repositories (3) | TERMINE | RefundRepository (filters, countByCompany, findBySale, totalRefunded), RefundLineRepository, RefundPaymentRepository |
| Schema update | TERMINE | 3 nouvelles tables (pos_refund, pos_refund_line, pos_refund_payment) |

### Services
| Tâche | Statut | Notes |
|-------|--------|-------|
| RefundService | TERMINE | createRefund (validation qty, snapshots, payments), approveRefund (stock inline TYPE_RETURN, SaleLine.refundedQuantity, CustomerCredit, Sale status), rejectRefund |

### Contrôleurs
| Tâche | Statut | Notes |
|-------|--------|-------|
| RefundController (5 routes) | TERMINE | index, create (?sale=), show, approve (POS_MANAGE, CSRF), reject (POS_MANAGE, CSRF) |

### Templates
| Tâche | Statut | Notes |
|-------|--------|-------|
| refunds/index.html.twig | TERMINE | 4 stats cards, filtres, table paginée (gradient orange-amber) |
| refunds/create.html.twig | TERMINE | Info vente, lignes remboursables avec qty/restock, paiement, motif, calcul JS (gradient orange-red) |
| refunds/show.html.twig | TERMINE | Gradient dynamique (yellow/green/red), lignes, paiements, modals approve/reject (gradient dynamique) |

### Navigation & UI
| Tâche | Statut | Notes |
|-------|--------|-------|
| Sidebar menu: Remboursements | TERMINE | Ajouté entre Ventes et Clients |
| Bouton "Rembourser" sur sale show | TERMINE | Conditionnel (completed/partial_refund + lignes remboursables) |

### Validation
| Critère | OK ? |
|---------|------|
| Demande remboursement total/partiel | OUI |
| Validation quantité <= refundableQuantity | OUI |
| Workflow approbation manager (PENDING→APPROVED/REJECTED) | OUI |
| Restock automatique à l'approbation (StockMovement TYPE_RETURN inline) | OUI |
| SaleLine.refundedQuantity mis à jour | OUI |
| Sale status → REFUNDED ou PARTIAL_REFUND | OUI |
| Crédit client mis à jour (CustomerCredit append-only) | OUI |
| Traçabilité audit (3 actions) | OUI |
| Container DI validé | OUI |
| Twig lint 331/331 OK | OUI |
| 70 routes POS enregistrées (65 + 5) | OUI |

---

## Phase 9 : Exports PDF & CSV

### Services
| Tâche | Statut | Notes |
|-------|--------|-------|
| PosExportService | TERMINE | dompdf v3.1 pour PDF, fputcsv pour CSV (BOM UTF-8, séparateur ;) |

### Contrôleurs
| Tâche | Statut | Notes |
|-------|--------|-------|
| ExportController (8 routes) | TERMINE | receiptPdf, invoicePdf, refundPdf, salesReportPdf, stockReportPdf, financialReportPdf, salesCsv, productsCsv |

### Templates PDF
| Tâche | Statut | Notes |
|-------|--------|-------|
| exports/_pdf_base.html.twig | TERMINE | Base A4 avec styles professionnels (header, tables, totaux, badges, footer) |
| exports/receipt_pdf.html.twig | TERMINE | Ticket 80mm format thermique |
| exports/invoice_pdf.html.twig | TERMINE | Facture A4 avec infos client, lignes, totaux, paiements |
| exports/refund_pdf.html.twig | TERMINE | Avoir/remboursement A4 avec vente d'origine et motif |
| exports/sales_report_pdf.html.twig | TERMINE | Rapport ventes paysage avec KPIs, ventes/jour, top produits, paiements |
| exports/stock_report_pdf.html.twig | TERMINE | Rapport stocks paysage avec ruptures, alertes, mouvements |
| exports/financial_report_pdf.html.twig | TERMINE | Rapport financier paysage avec 8 KPIs, paiements, top produits |

### Intégration boutons export
| Tâche | Statut | Notes |
|-------|--------|-------|
| sales/show.html.twig | TERMINE | +PDF ticket, +Facture PDF |
| refunds/show.html.twig | TERMINE | +PDF avoir |
| reports/sales.html.twig | TERMINE | +PDF, +CSV |
| reports/stock.html.twig | TERMINE | +PDF, +Produits CSV |
| reports/financial.html.twig | TERMINE | +PDF |
| reports/products.html.twig | TERMINE | +CSV |

### Validation
| Critère | OK ? |
|---------|------|
| Génération PDF ticket de caisse | OUI |
| Génération facture A4 | OUI |
| Génération avoir remboursement | OUI |
| Rapports PDF (ventes, stock, financier) | OUI |
| Export CSV ventes (avec BOM UTF-8) | OUI |
| Export CSV produits | OUI |
| Container DI validé | OUI |
| Twig lint 338/338 OK | OUI |
| 78 routes POS enregistrées (70 + 8) | OUI |

---

## Phase 10 : Journal d'audit

### Contrôleurs
| Tâche | Statut | Notes |
|-------|--------|-------|
| AuditLogController (3 routes) | TERMINE | index (filtres avancés groupés), show (diff oldValues/newValues, métadonnées, sécurité), exportCsv |

### Templates
| Tâche | Statut | Notes |
|-------|--------|-------|
| audit-logs/index.html.twig | TERMINE | Filtres groupés (7 catégories d'actions, 14 types entités), badges couleur, pagination (gradient gray) |
| audit-logs/show.html.twig | TERMINE | Diff avant/après en table, métadonnées, info utilisateur, sécurité (IP, User Agent) |

### Intégrations
| Tâche | Statut | Notes |
|-------|--------|-------|
| Widget "Activité récente" dashboard | TERMINE | 10 derniers logs sur reports/dashboard.html.twig |
| ReportController modifié | TERMINE | Injection PosAuditService, passage recentLogs au dashboard |
| Sidebar menu: Journal d'audit | TERMINE | Ajouté après Employés POS avec icône horloge |

### Validation
| Critère | OK ? |
|---------|------|
| Liste audit logs paginée avec filtres avancés | OUI |
| Filtres par action (7 groupes), type entité (14), dates, recherche | OUI |
| Détail avec diff oldValues/newValues | OUI |
| Info sécurité (IP, User Agent) | OUI |
| Export CSV des logs filtrés | OUI |
| Widget activité récente sur dashboard | OUI |
| Accès restreint POS_MANAGE | OUI |
| Container DI validé | OUI |
| Twig lint 340/340 OK | OUI |
| 81 routes POS enregistrées (78 + 3) | OUI |

---

## Journal des Modifications

| Date | Phase | Description | Auteur |
|------|-------|-------------|--------|
| 2026-03-31 | - | Création de la documentation POS (8 fichiers) | - |
| 2026-03-31 | 0 | Phase 0 complète : 3 entités, 3 repos, 3 services, 2 controllers, 2 forms, 4 templates, voter étendu, sidebar, Stimulus | - |
| 2026-03-31 | 1 | Phase 1 complète : 5 entités, 5 repos, 3 services, 2 controllers, 2 forms, 11 templates, sidebar étendu | - |
| 2026-03-31 | 2 | Phase 2 complète : 3 entités, 3 repos, 2 services, 2 controllers, 4 forms, 9 templates, 13 nouvelles routes, sidebar étendu | - |
| 2026-03-31 | 3 | Phase 3 complète : 6 entités, 6 repos, 3 services, 2 controllers, 1 form, 9 templates, 10 nouvelles routes (38 total), sidebar étendu | - |
| 2026-03-31 | 4 | Phase 4 complète : 2 entités, 2 repos, 1 service, 1 controller, 1 form, 6 templates, 7 nouvelles routes (45 total), Sale.customer FK, sidebar étendu | - |
| 2026-03-31 | 5 | Phase 5 complète : 2 entités, 2 repos, 1 service, 1 controller, 1 form, 5 templates, 1 Stimulus, 7 nouvelles routes (52 total) | - |
| 2026-03-31 | 6 | Phase 6 complète : 2 entités, 2 repos, 1 service, 1 controller, 4 templates, 8 nouvelles routes (60 total) | - |
| 2026-03-31 | 7 | Phase 7 complète : 1 service, 1 controller, 5 templates, 5 nouvelles routes (65 total) | - |
| 2026-03-31 | 8 | Phase 8 complète : 3 entités, 3 repos, 1 service, 1 controller, 3 templates, 5 nouvelles routes (70 total) | - |
| 2026-04-01 | 9 | Phase 9 complète : 1 service (dompdf), 1 controller, 7 templates PDF, 8 nouvelles routes (78 total), boutons export ajoutés sur 6 pages | - |
| 2026-04-01 | 10 | Phase 10 complète : 1 controller, 2 templates, widget dashboard, 3 nouvelles routes (81 total) | - |

---

## Notes & Décisions

### Décisions d'Architecture
1. **Prefix `pos_`** pour toutes les tables BDD → évite les conflits avec les entités existantes
2. **Entités dans `src/Entity/Pos/`** → namespace séparé pour organisation claire
3. **Soft-delete** sur Product, Customer, Supplier, ProductCategory → préserve l'historique
4. **Append-only** sur StockMovement, PosAuditLog, CustomerCredit → intégrité audit
5. **Dénormalisation** : stock sur Product, totaux sur Customer/Supplier → performance
6. **UUID v7** sur Sale, PurchaseOrder, Refund, Inventory, Customer, Supplier → compatibilité API et références externes
7. **Transactions inline** : StockMovement créé directement dans executeInTransaction (SaleService, PurchaseOrderService, InventoryService, RefundService) — PAS via StockService pour éviter nested transactions
8. **bcmath** pour toutes les opérations monétaires → précision décimale
9. **Snapshots** : SaleLine, PurchaseOrderLine, RefundLine, InventoryLine stockent productName/productSku au moment de la création
10. **Stimulus** : data-controller HTML attributes directement (PAS stimulus_controller() Twig function)
11. **dompdf v3.1** pour génération PDF (tickets, factures, avoirs, rapports)

### Contrôleurs POS (16 total)
1. PosSettingsController — Configuration boutique
2. PosEmployeeController — Rôles et permissions employés
3. ProductController — CRUD produits
4. ProductCategoryController — CRUD catégories
5. StockController — Mouvements de stock
6. SupplierController — CRUD fournisseurs
7. PurchaseOrderController — Commandes fournisseurs
8. InventoryController — Inventaires physiques
9. SaleController — Historique ventes
10. RegisterController — Caisses enregistreuses
11. CustomerController — Gestion clients
12. RefundController — Remboursements
13. ReportController — Rapports et dashboard
14. ExportController — PDF et CSV
15. AuditLogController — Journal d'audit
16. (Futur) CashierController — Interface caissier SPA

---

## Audit complet des manquants (mise à jour 2026-04-01)

### Priorité HAUTE — Fonctionnalités critiques

#### A. Interface Caissier (Employer SPA) — NON IMPLEMENTEE
L'interface de vente en temps réel pour les employés n'existe pas encore.
Actuellement les ventes sont créées programmatiquement via SaleService mais il n'y a pas d'UI caissier.

| Tâche | Statut | Impact |
|-------|--------|--------|
| CashierController (Employer) | A FAIRE | Interface plein écran pour traiter les ventes |
| pos-cashier_controller.js | A FAIRE | Stimulus : recherche produit, panier, calculs, multi-paiement, raccourcis clavier |
| pos-payment_controller.js | A FAIRE | Stimulus : modal paiement multi-méthode |
| pos-product-search_controller.js | A FAIRE | Stimulus : recherche rapide + scan code-barres |
| pos-receipt_controller.js | A FAIRE | Stimulus : impression ticket après vente |
| templates/employer/pos/cashier/ | A FAIRE | Interface caisse (index, open, close) |
| Sélection client dans caisse | A FAIRE | Selon PosSettings.requireCustomer |
| Paiement par crédit client | A FAIRE | Vérification solde + CustomerCredit |
| Points fidélité à la vente | A FAIRE | Selon PosSettings.enableLoyalty |

#### B. Isolation Média par Company — NON IMPLEMENTEE
ProductMedia entity existe mais AUCUN formulaire d'upload. Le stockage n'est pas isolé par company.

| Tâche | Statut | Impact |
|-------|--------|--------|
| CompanyMediaPathService | A FAIRE | Service chemin isolé companies/{uuid}/pos/ |
| Types Media POS (Media.php) | A FAIRE | TYPE_POS_PRODUCT, TYPE_POS_CATEGORY, TYPE_POS_RECEIPT |
| Upload images produits (UI) | A FAIRE | Formulaire upload dans ProductController |
| pos-product-image_controller.js | A FAIRE | Stimulus : upload drag & drop, reorder, delete |
| Vérification accès renforcée | A FAIRE | isPathOwnedByCompany() anti path traversal |
| Quotas stockage | A FAIRE | PosSettings.storageQuotaMb |
| MigrateMediaToCompanyStructureCommand | A FAIRE | CLI migration fichiers existants |

#### C. Import CSV Produits — NON IMPLEMENTE
L'import en masse pour le chargement initial du catalogue manque.

| Tâche | Statut | Impact |
|-------|--------|--------|
| ProductService.importProducts() | A FAIRE | Parsing CSV, validation, création en masse |
| templates/products/import.html.twig | A FAIRE | Formulaire upload + mapping colonnes |
| ProductImportFormType | A FAIRE | Upload CSV |

### Priorité MOYENNE — Améliorations

#### D. Commandes CLI — AUCUNE IMPLEMENTEE
Le dossier src/Command/ est vide.

| Tâche | Statut |
|-------|--------|
| PosStockAlertCommand | A FAIRE — Cron quotidien, vérif seuils, email alertes managers |
| PosDailyReportCommand | A FAIRE — Cron quotidien, rapport journalier par email |

#### E. Stimulus Controllers — 13 sur 15 MANQUANTS
Seuls pos-settings_controller.js et purchase-order-lines_controller.js existent.

| Controller manquant | Phase d'origine |
|--------------------|-----------------|
| pos-product-form_controller.js | Phase 1 |
| pos-category-tree_controller.js | Phase 1 |
| pos-product-variant_controller.js | Phase 1 |
| pos-barcode_controller.js | Phase 1 |
| pos-stock-alert_controller.js | Phase 2 |
| pos-stock-movement_controller.js | Phase 2 |
| pos-cashier_controller.js | Phase 3 (Caisse) |
| pos-payment_controller.js | Phase 3 (Caisse) |
| pos-receipt_controller.js | Phase 3 (Caisse) |
| pos-product-search_controller.js | Phase 3 (Caisse) |
| pos-inventory_controller.js | Phase 6 |
| pos-dashboard_controller.js | Phase 7 |
| pos-product-image_controller.js | Média |

#### F. Variantes Produits — UI MANQUANTE
L'entité ProductVariant existe mais pas de formulaire ni d'interface de gestion.

| Tâche | Statut |
|-------|--------|
| ProductVariantFormType | A FAIRE |
| UI variantes dans product show/edit | A FAIRE |
| Stock par variante (UI) | A FAIRE — Entity existe |

#### G. Employer Stock Reception
| Tâche | Statut |
|-------|--------|
| StockReceptionController | A FAIRE — Interface employé pour réceptionner du stock |

### Priorité BASSE — Nice-to-have

#### H. API Mobile POS — NON IMPLEMENTEE
8 endpoints REST prévus pour une future app mobile.

#### I. Autres
- PaymentService dédié (actuellement intégré dans SaleService)
- Intégration passerelle Mobile Money (Orange/Wave/Free API)
- Admin dashboard POS consolidé (vue toutes companies)
- Rapports avancés (performance vendeurs, marges, rotation stock)
- Mode hors-ligne (localStorage + sync)
- Gestion multi-dépôts

---

### Risques Identifiés
1. **Performance caisse** : l'interface caissier doit être ultra-rapide → optimiser les requêtes, envisager cache
2. **Concurrence stock** : deux caissiers peuvent vendre le même produit simultanément → verrouillage optimiste
3. **Volume de données** : PosAuditLog et StockMovement vont croître vite → prévoir archivage
4. **Hors-ligne** : si le réseau tombe, la caisse doit pouvoir fonctionner → localStorage + sync

### Questions Ouvertes
- Gestion multi-dépôts par company ? (Phase future)
- Intégration comptable (export vers logiciel compta) ?
- Codes-barres : lecteur USB ou caméra smartphone ?
- Programme fidélité : simple points ou paliers/récompenses ?
