# Plan d'Implémentation POS - Phases Détaillées

## Vue d'ensemble des Phases

| Phase | Nom | Entités | Description | Pré-requis |
|-------|-----|---------|-------------|------------|
| 0 | Socle & Infrastructure | PosSettings, PosEmployeeRole, PosAuditLog | Base technique, config, rôles, audit | - |
| 1 | Catalogue Produits | ProductCategory, Product, ProductVariant, ProductMedia, Barcode | Gestion complète du catalogue | Phase 0 |
| 2 | Gestion des Stocks | StockMovement, Supplier, SupplierProduct | Stock, mouvements, fournisseurs | Phase 1 |
| 3 | Ventes & Caisse | Sale, SaleLine, Payment, Register, RegisterSession, CashMovement | Interface de vente et caisse | Phase 1, 2 |
| 4 | Clients & Crédit | Customer, CustomerCredit | Gestion clients et crédit | Phase 3 |
| 5 | Commandes & Approvisionnement | PurchaseOrder, PurchaseOrderLine | Bons de commande fournisseur | Phase 2 |
| 6 | Inventaire | Inventory, InventoryLine | Inventaires physiques | Phase 2 |
| 7 | Rapports & Statistiques | - (vues) | Tableaux de bord et rapports | Phase 3, 4 |
| 8 | Remboursements & Annulations | Refund | Gestion retours | Phase 3 |
| 9 | Isolation Média & Documents | - (refactoring) | Isolation complète des médias | Phase 1 |
| 10 | API Mobile POS | - (API) | Endpoints API pour app mobile | Phase 3 |

---

## Phase 0 : Socle & Infrastructure

### Objectif
Mettre en place la base technique du module POS : configuration par company, rôles employés POS, système d'audit, et extension du voter.

### Entités à Créer
1. **PosSettings** - Configuration boutique par company
2. **PosEmployeeRole** - Rôles et permissions POS par employé
3. **PosAuditLog** - Journal d'audit POS

### Travail Technique

#### 0.1 Entités & Repositories
- [ ] Créer `src/Entity/Pos/PosSettings.php`
- [ ] Créer `src/Entity/Pos/PosEmployeeRole.php`
- [ ] Créer `src/Entity/Pos/PosAuditLog.php`
- [ ] Créer les 3 repositories dans `src/Repository/Pos/`
- [ ] Exécuter `doctrine:schema:update --force`

#### 0.2 Services
- [ ] Créer `src/Service/Pos/PosSettingsService.php`
  - `getOrCreateSettings(Company): PosSettings`
  - `updateSettings(Company, array): PosSettings`
  - `isPosEnabled(Company): bool`
  - `getSettingValue(Company, string): mixed`
- [ ] Créer `src/Service/Pos/PosAuditService.php`
  - `log(Company, User, string action, string entityType, int entityId, string description, ?array old, ?array new): void`
  - `getLogsForCompany(Company, array filters): Query`
- [ ] Créer `src/Service/Pos/PosEmployeeService.php`
  - `assignRole(User, Company, string role, array permissions): PosEmployeeRole`
  - `updatePermissions(PosEmployeeRole, array): PosEmployeeRole`
  - `verifyPin(User, Company, string pin): bool`
  - `hasPermission(User, Company, string permission): bool`
  - `getEmployeesForCompany(Company): array`

#### 0.3 Extension du CompanyVoter
- [ ] Ajouter les attributs POS au `CompanyVoter` :
  ```php
  POS_ACCESS, POS_MANAGE, POS_SELL, POS_STOCK, POS_REPORTS, POS_SETTINGS
  ```
- [ ] Logique : ADMIN = lecture globale, MANAGER = full sur sa company, EMPLOYER = selon PosEmployeeRole

#### 0.4 Contrôleurs
- [ ] Créer `src/Controller/Manager/Pos/PosSettingsController.php`
  - `index()` : formulaire de configuration
  - `update()` : sauvegarde config
- [ ] Créer `src/Controller/Manager/Pos/PosEmployeeController.php`
  - `index()` : liste employés POS
  - `assign()` : assigner rôle POS
  - `edit()` : modifier permissions
  - `remove()` : retirer rôle POS

#### 0.5 Formulaires
- [ ] Créer `src/Form/Pos/PosSettingsFormType.php` (formulaire par onglets)
- [ ] Créer `src/Form/Pos/PosEmployeeRoleFormType.php`

#### 0.6 Templates
- [ ] Créer `templates/manager/pos/settings/index.html.twig`
- [ ] Créer `templates/manager/pos/employees/index.html.twig`
- [ ] Créer `templates/manager/pos/employees/assign.html.twig`
- [ ] Créer `templates/manager/pos/employees/edit.html.twig`

#### 0.7 Navigation
- [ ] Ajouter section "POS" dans le sidebar manager
- [ ] Ajouter contextes NavigationService pour POS
- [ ] Créer lien conditionnel (visible si `pos_settings.is_pos_enabled`)

#### 0.8 Stimulus Controllers
- [ ] Créer `assets/controllers/pos-settings_controller.js` (onglets dynamiques)

### Critères de Validation Phase 0
- [ ] Un manager peut activer le POS pour sa company
- [ ] Un manager peut configurer les paramètres boutique
- [ ] Un manager peut assigner des rôles POS aux employés
- [ ] Les actions sont tracées dans PosAuditLog
- [ ] Le voter bloque l'accès POS aux non-autorisés

---

## Phase 1 : Catalogue Produits

### Objectif
Permettre au manager de gérer un catalogue complet de produits avec catégories, variantes, images et codes-barres.

### Entités à Créer
1. **ProductCategory** - Catégories hiérarchiques
2. **Product** - Produits
3. **ProductVariant** - Variantes
4. **ProductMedia** - Images produits
5. **Barcode** - Codes-barres

### Travail Technique

#### 1.1 Entités & Repositories
- [ ] Créer les 5 entités dans `src/Entity/Pos/`
- [ ] Créer les 5 repositories dans `src/Repository/Pos/`
- [ ] Repositories avec filtres : search, category, active, stock range, price range
- [ ] Exécuter `doctrine:schema:update --force`

#### 1.2 Services
- [ ] Créer `src/Service/Pos/ProductService.php`
  - `createProduct(Company, array data): Product`
  - `updateProduct(Product, array data): Product`
  - `deleteProduct(Product): void` (soft-delete)
  - `duplicateProduct(Product): Product`
  - `getProductsForCompany(Company, array filters): Query`
  - `searchProducts(Company, string query): array`
  - `generateSku(Company): string`
  - `importProducts(Company, UploadedFile csv): array` (import CSV)
  - `exportProducts(Company, array filters): StreamedResponse`
- [ ] Créer `src/Service/Pos/ProductCategoryService.php`
  - `createCategory(Company, array data): ProductCategory`
  - `updateCategory(ProductCategory, array data): ProductCategory`
  - `reorderCategories(Company, array positions): void`
  - `getCategoryTree(Company): array`
- [ ] Créer `src/Service/Pos/BarcodeService.php`
  - `generateBarcode(Product, string type): Barcode`
  - `lookupBarcode(Company, string code): ?Product`
  - `generateBarcodeImage(Barcode): string` (SVG/PNG)

#### 1.3 Contrôleurs
- [ ] Créer `src/Controller/Manager/Pos/ProductController.php`
  - `index()` : liste produits avec filtres + vue table/grille
  - `create()` : formulaire création
  - `show()` : détail produit (stock, ventes, variantes)
  - `edit()` : modification
  - `delete()` : soft-delete
  - `duplicate()` : dupliquer un produit
  - `import()` : import CSV
  - `export()` : export CSV/Excel
  - `uploadImage()` : upload image produit (AJAX)
  - `removeImage()` : retirer image
  - `reorderImages()` : réordonner images
- [ ] Créer `src/Controller/Manager/Pos/ProductCategoryController.php`
  - `index()` : arbre catégories
  - `create()` : nouvelle catégorie
  - `edit()` : modifier
  - `delete()` : soft-delete
  - `reorder()` : réordonner (drag & drop)

#### 1.4 Formulaires
- [ ] `ProductFormType` (multi-étapes : infos, prix, stock, variantes, images)
- [ ] `ProductCategoryFormType`
- [ ] `ProductVariantFormType`
- [ ] `ProductImportFormType` (upload CSV)
- [ ] `ProductFilterFormType`

#### 1.5 Templates
- [ ] `templates/manager/pos/products/index.html.twig` (table + grille)
- [ ] `templates/manager/pos/products/create.html.twig`
- [ ] `templates/manager/pos/products/show.html.twig` (tabs : infos, stock, ventes, variantes)
- [ ] `templates/manager/pos/products/edit.html.twig`
- [ ] `templates/manager/pos/products/_product_card.html.twig`
- [ ] `templates/manager/pos/products/_product_row.html.twig`
- [ ] `templates/manager/pos/products/import.html.twig`
- [ ] `templates/manager/pos/categories/index.html.twig` (arbre)
- [ ] `templates/manager/pos/categories/create.html.twig`
- [ ] `templates/manager/pos/categories/edit.html.twig`

#### 1.6 Stimulus Controllers
- [ ] `pos-product-form_controller.js` (form multi-étapes)
- [ ] `pos-product-image_controller.js` (upload + reorder images)
- [ ] `pos-category-tree_controller.js` (arbre drag & drop)
- [ ] `pos-product-variant_controller.js` (ajout dynamique variantes)
- [ ] `pos-barcode_controller.js` (scan + affichage)

### Critères de Validation Phase 1
- [ ] CRUD complet catégories avec hiérarchie (3 niveaux)
- [ ] CRUD complet produits avec filtres, recherche, pagination
- [ ] Gestion des variantes (taille, couleur, etc.)
- [ ] Upload multi-images par produit via le système Media existant
- [ ] Génération et scan de codes-barres
- [ ] Import/Export CSV
- [ ] Vue table et vue grille
- [ ] Données isolées par company (un manager ne voit que ses produits)

---

## Phase 2 : Gestion des Stocks

### Objectif
Traçabilité complète des mouvements de stock, gestion des fournisseurs, alertes automatiques.

### Entités à Créer
1. **StockMovement** - Mouvements de stock
2. **Supplier** - Fournisseurs
3. **SupplierProduct** - Produits fournisseurs

### Travail Technique

#### 2.1 Entités & Repositories
- [ ] Créer les 3 entités
- [ ] Repository StockMovement : filtres par produit, type, date, utilisateur
- [ ] Repository Supplier : filtres search, active, dernière commande

#### 2.2 Services
- [ ] Créer `src/Service/Pos/StockService.php`
  - `addStock(Product, int qty, string reason, ?Supplier, User): StockMovement`
  - `removeStock(Product, int qty, string reason, User): StockMovement`
  - `adjustStock(Product, int newQty, string reason, User): StockMovement`
  - `transferStock(Product, int qty, Company from, Company to): void` (futur)
  - `getStockMovements(Company, array filters): Query`
  - `getLowStockProducts(Company): array`
  - `getCriticalStockProducts(Company): array`
  - `getStockValuation(Company): array`
  - `checkAndSendAlerts(Company): void`

#### 2.3 Contrôleurs
- [ ] Créer `src/Controller/Manager/Pos/StockController.php`
  - `index()` : vue stock globale (tous produits)
  - `movements()` : historique mouvements
  - `addStock()` : formulaire entrée stock
  - `adjustStock()` : ajustement
  - `alerts()` : produits en alerte
  - `valuation()` : valorisation stock
- [ ] Créer `src/Controller/Manager/Pos/SupplierController.php`
  - CRUD complet fournisseurs
  - `products()` : produits du fournisseur
  - `linkProduct()` : associer produit
- [ ] Créer `src/Controller/Employer/Pos/StockReceptionController.php`
  - `index()` : réceptions en attente
  - `receive()` : formulaire réception stock

#### 2.4 Templates & Formulaires
- [ ] Templates stock : index, movements, add, adjust, alerts, valuation
- [ ] Templates fournisseurs : index, create, show, edit
- [ ] Templates réception employer
- [ ] Formulaires : StockMovementFormType, SupplierFormType, SupplierProductFormType

#### 2.5 Stimulus Controllers
- [ ] `pos-stock-alert_controller.js` (indicateurs visuels alertes)
- [ ] `pos-stock-movement_controller.js` (formulaire dynamique)

#### 2.6 Commande CLI
- [ ] Créer `src/Command/Pos/PosStockAlertCommand.php`
  - Vérifier les seuils de stock pour toutes les companies
  - Envoyer emails d'alerte aux managers
  - Planifiable en cron quotidien

### Critères de Validation Phase 2
- [ ] Entrée/sortie/ajustement de stock avec traçabilité
- [ ] Stock mis à jour automatiquement (dénormalisé sur Product)
- [ ] Alertes visuelles stock bas/critique
- [ ] CRUD fournisseurs avec liaison produits
- [ ] Commande CLI pour alertes email
- [ ] Employé magasinier peut réceptionner du stock

---

## Phase 3 : Ventes & Caisse

### Objectif
Interface de caisse complète pour la vente, gestion multi-paiement, sessions de caisse.

### Entités à Créer
1. **Sale** - Ventes
2. **SaleLine** - Lignes de vente
3. **Payment** - Paiements
4. **Register** - Caisses
5. **RegisterSession** - Sessions de caisse
6. **CashMovement** - Mouvements de caisse

### Travail Technique

#### 3.1 Entités & Repositories
- [ ] Créer les 6 entités
- [ ] Sale repository : filtres date, status, vendeur, caisse, montant
- [ ] RegisterSession repository : filtres date, status, caissier

#### 3.2 Services
- [ ] Créer `src/Service/Pos/SaleService.php`
  - `createSale(Company, array lines, array payments, ?Customer, User): Sale`
  - `voidSale(Sale, string reason, User): Sale`
  - `getSaleNumber(Company): string` (auto-incrémenté par company)
  - `getSalesForCompany(Company, array filters): Query`
  - `getDailySalesTotal(Company, DateTime): array`
  - `calculateTotals(array lines, PosSettings): array`
- [ ] Créer `src/Service/Pos/PaymentService.php`
  - `processPayment(Sale, string method, decimal amount, ?array metadata): Payment`
  - `processMultiPayment(Sale, array payments): array`
  - `getPaymentsByMethod(Company, DateTime from, DateTime to): array`
- [ ] Créer `src/Service/Pos/RegisterService.php`
  - `openSession(Register, User, decimal openingAmount): RegisterSession`
  - `closeSession(RegisterSession, User, decimal closingAmount, ?string notes): RegisterSession`
  - `suspendSession(RegisterSession): RegisterSession`
  - `addCashMovement(RegisterSession, string type, decimal amount, string reason, User): CashMovement`
  - `getSessionSummary(RegisterSession): array`
- [ ] Créer `src/Service/Pos/ReceiptService.php`
  - `generateReceipt(Sale): string` (HTML pour impression)
  - `generateReceiptPdf(Sale): string` (PDF via DOMPDF)

#### 3.3 Contrôleurs
- [ ] Créer `src/Controller/Manager/Pos/SaleController.php`
  - `index()` : historique ventes
  - `show()` : détail vente avec lignes et paiements
  - `receipt()` : ticket de caisse (impression)
  - `dailyReport()` : résumé du jour
- [ ] Créer `src/Controller/Manager/Pos/RegisterController.php`
  - `index()` : liste des caisses
  - `create()` : créer caisse
  - `sessions()` : historique sessions
  - `sessionDetail()` : détail session
- [ ] Créer `src/Controller/Employer/Pos/CashierController.php`
  - `index()` : interface de caisse (SPA-like avec Stimulus)
  - `openRegister()` : ouvrir caisse
  - `closeRegister()` : fermer caisse
  - `processSale()` : enregistrer vente (AJAX)
  - `searchProduct()` : recherche produit (AJAX)
  - `mySales()` : mes ventes du jour

#### 3.4 Templates
- [ ] `templates/employer/pos/cashier/index.html.twig` (interface caisse plein écran)
- [ ] `templates/employer/pos/cashier/open.html.twig`
- [ ] `templates/employer/pos/cashier/close.html.twig`
- [ ] `templates/manager/pos/sales/index.html.twig`
- [ ] `templates/manager/pos/sales/show.html.twig`
- [ ] `templates/manager/pos/sales/_receipt.html.twig`
- [ ] `templates/manager/pos/registers/index.html.twig`
- [ ] `templates/manager/pos/registers/sessions.html.twig`

#### 3.5 Stimulus Controllers (critiques)
- [ ] `pos-cashier_controller.js` (interface caisse complète)
  - Recherche produits temps réel
  - Panier avec ajout/retrait/quantité
  - Calcul automatique (sous-total, TVA, remises, total)
  - Multi-paiement
  - Raccourcis clavier (F1-F12 pour actions rapides)
  - Mode hors-ligne basique (localStorage)
- [ ] `pos-payment_controller.js` (modal paiement multi-méthode)
- [ ] `pos-receipt_controller.js` (impression ticket)
- [ ] `pos-product-search_controller.js` (recherche rapide + scan)

### Critères de Validation Phase 3
- [ ] Interface caissier fonctionnelle et rapide
- [ ] Recherche produit par nom, SKU, code-barres
- [ ] Ajout produits au panier avec quantités
- [ ] Calcul automatique TVA et remises
- [ ] Multi-paiement (cash + mobile money par exemple)
- [ ] Rendu de monnaie calculé
- [ ] Ouverture/fermeture de caisse avec écarts
- [ ] Impression ticket de caisse
- [ ] Stock décrémenté automatiquement après vente
- [ ] Historique ventes consultable par manager

---

## Phase 4 : Clients & Crédit

### Objectif
Gestion des clients fidèles, système de crédit/dette, programme de fidélité optionnel.

### Entités à Créer
1. **Customer** - Clients
2. **CustomerCredit** - Mouvements de crédit

### Travail Technique

#### 4.1 Services
- [ ] Créer `src/Service/Pos/CustomerService.php`
  - CRUD clients scopé company
  - `getCustomerBalance(Customer): decimal`
  - `addCredit(Customer, Sale, decimal amount): CustomerCredit`
  - `recordPayment(Customer, decimal amount, ?string notes): CustomerCredit`
  - `getCustomerHistory(Customer): array`
  - `getTopCustomers(Company, int limit): array`
  - `getDebtors(Company): array`
  - `addLoyaltyPoints(Customer, int points): void`
  - `redeemLoyaltyPoints(Customer, int points): decimal` (valeur monétaire)

#### 4.2 Contrôleurs
- [ ] `src/Controller/Manager/Pos/CustomerController.php`
  - CRUD complet + historique achats
  - `credits()` : suivi crédits
  - `recordPayment()` : enregistrer paiement
  - `debtors()` : liste débiteurs
  - `loyalty()` : programme fidélité

#### 4.3 Intégration Caisse
- [ ] Modifier `CashierController` et `pos-cashier_controller.js`
  - Sélection client optionnelle/obligatoire (selon config)
  - Affichage solde crédit du client
  - Paiement par crédit (méthode de paiement)
  - Accumulation points fidélité

### Critères de Validation Phase 4
- [ ] CRUD clients avec recherche par nom/téléphone
- [ ] Vente à crédit (si autorisé par PosSettings)
- [ ] Suivi du solde de crédit par client
- [ ] Enregistrement des paiements de dette
- [ ] Liste des débiteurs
- [ ] Points fidélité (si activé)
- [ ] Historique achats par client

---

## Phase 5 : Commandes & Approvisionnement

### Objectif
Bons de commande fournisseur, suivi des livraisons, réapprovisionnement.

### Entités à Créer
1. **PurchaseOrder** - Bons de commande
2. **PurchaseOrderLine** - Lignes

### Travail Technique

#### 5.1 Services
- [ ] Créer `src/Service/Pos/PurchaseOrderService.php`
  - `createOrder(Company, Supplier, array lines): PurchaseOrder`
  - `updateStatus(PurchaseOrder, string status): void`
  - `receiveOrder(PurchaseOrder, array receivedQtys): void` (crée StockMovements)
  - `partialReceive(PurchaseOrder, array lines): void`
  - `cancelOrder(PurchaseOrder): void`
  - `generateOrderNumber(Company): string`
  - `getOrdersForCompany(Company, array filters): Query`
  - `generatePdf(PurchaseOrder): string` (bon de commande PDF)
  - `autoGenerateOrders(Company): array` (basé sur seuils réappro)

#### 5.2 Contrôleurs
- [ ] `src/Controller/Manager/Pos/PurchaseOrderController.php`
  - CRUD + workflow (draft → sent → confirmed → received)
  - `receive()` : formulaire de réception
  - `print()` : impression PDF
  - `autoSuggest()` : suggestions réapprovisionnement

### Critères de Validation Phase 5
- [ ] Création bon de commande avec sélection fournisseur et produits
- [ ] Workflow de statuts (brouillon → envoyé → confirmé → reçu)
- [ ] Réception partielle ou totale
- [ ] Stock mis à jour automatiquement à la réception
- [ ] Génération PDF du bon de commande
- [ ] Suggestions automatiques basées sur le stock minimum

---

## Phase 6 : Inventaire

### Objectif
Sessions d'inventaire physique avec comptage, validation des écarts, ajustement automatique.

### Entités à Créer
1. **Inventory** - Sessions d'inventaire
2. **InventoryLine** - Comptages

### Travail Technique

#### 6.1 Services
- [ ] Créer `src/Service/Pos/InventoryService.php`
  - `createInventory(Company, string name, string type, ?ProductCategory): Inventory`
  - `generateLines(Inventory): void` (pré-remplir avec stock théorique)
  - `recordCount(InventoryLine, int qty, User): void`
  - `calculateDiscrepancies(Inventory): array`
  - `approveInventory(Inventory, User): void` (ajuste le stock)
  - `cancelInventory(Inventory): void`
  - `getInventoryReport(Inventory): array`

#### 6.2 Contrôleurs & Templates
- [ ] `src/Controller/Manager/Pos/InventoryController.php`
  - CRUD + workflow + validation
  - `count()` : interface de comptage (optimisée mobile)
  - `report()` : rapport écarts

#### 6.3 Stimulus
- [ ] `pos-inventory_controller.js` (saisie rapide + scan barcode)

### Critères de Validation Phase 6
- [ ] Créer inventaire (total ou par catégorie)
- [ ] Pré-remplissage des lignes avec stock théorique
- [ ] Saisie des comptages par employé
- [ ] Calcul automatique des écarts
- [ ] Validation par le manager (ajuste le stock réel)
- [ ] Rapport d'inventaire

---

## Phase 7 : Rapports & Statistiques

### Objectif
Tableaux de bord temps réel, rapports de vente, analyse des performances.

### Travail Technique

#### 7.1 Services
- [ ] Créer `src/Service/Pos/PosReportService.php`
  - `getDashboardStats(Company): array`
  - `getSalesReport(Company, DateTime from, DateTime to): array`
  - `getProductPerformance(Company, array filters): array`
  - `getEmployeePerformance(Company, array filters): array`
  - `getCategoryPerformance(Company, array filters): array`
  - `getPaymentMethodBreakdown(Company, DateTime from, DateTime to): array`
  - `getProfitMarginReport(Company, array filters): array`
  - `getStockTurnoverReport(Company): array`
  - `getCustomerReport(Company, array filters): array`
  - `exportReport(string type, Company, array filters): StreamedResponse`

#### 7.2 Contrôleurs
- [ ] Créer `src/Controller/Manager/Pos/PosReportController.php`
  - `dashboard()` : dashboard POS manager
  - `sales()` : rapport ventes (jour/semaine/mois/année)
  - `products()` : top produits, performance
  - `employees()` : performance vendeurs
  - `payments()` : répartition moyens paiement
  - `profit()` : marges et rentabilité
  - `export()` : export PDF/Excel
- [ ] Créer `src/Controller/Manager/Pos/PosDashboardController.php`
  - `index()` : dashboard principal POS

#### 7.3 Dashboard POS Manager
Le dashboard POS affichera :
- Chiffre d'affaires du jour / semaine / mois
- Nombre de ventes aujourd'hui
- Panier moyen
- Top 5 produits vendus
- Alertes stock
- Sessions de caisse en cours
- Graphiques : évolution CA, répartition paiements, top catégories
- Dernières ventes

#### 7.4 Admin Dashboard
- [ ] Ajouter section POS au dashboard admin
  - Vue consolidée toutes entreprises
  - CA global, nombre de boutiques actives
  - Top entreprises par CA

#### 7.5 Stimulus Controllers
- [ ] `pos-dashboard_controller.js` (graphiques Chart.js + refresh auto)
- [ ] `pos-report-filter_controller.js` (filtres dynamiques)

#### 7.6 Commande CLI
- [ ] Créer `src/Command/Pos/PosDailyReportCommand.php`
  - Générer et envoyer rapport quotidien par email
  - Résumé : CA, nb ventes, top produits, alertes stock

### Critères de Validation Phase 7
- [ ] Dashboard POS avec stats temps réel
- [ ] Rapports de vente par période
- [ ] Top produits / catégories / vendeurs
- [ ] Répartition moyens de paiement
- [ ] Rapport de marges
- [ ] Export PDF et Excel
- [ ] Rapport quotidien automatique par email

---

## Phase 8 : Remboursements & Annulations

### Entités à Créer
1. **Refund** - Remboursements

### Travail Technique

#### 8.1 Services
- [ ] Créer dans `SaleService` :
  - `requestRefund(Sale, array items, string reason, User): Refund`
  - `approveRefund(Refund, User): Refund`
  - `processRefund(Refund): void` (restock + paiement)

#### 8.2 Flux
1. Employé demande remboursement → status `pending`
2. Manager approuve → status `approved`
3. Système traite : restock produits + remboursement paiement
4. Si `allow_employee_refund = true` dans PosSettings : employé peut traiter directement

### Critères de Validation Phase 8
- [ ] Demande de remboursement total ou partiel
- [ ] Approbation par le manager (si requis)
- [ ] Restock automatique des produits remboursés
- [ ] Traçabilité complète (audit log)

---

## Phase 9 : Isolation Média & Documents

### Objectif
Garantir l'isolation complète des médias entre companies (images produits, documents, tickets).

### Travail Technique (voir POS_MEDIA_ISOLATION.md pour détails)

- [ ] Refactorer le stockage média pour séparer par company
- [ ] Structure : `var/media/companies/{company_id}/pos/{type}/`
- [ ] Vérifier que `MediaService` scope toujours par company
- [ ] Ajouter `POS_MEDIA` comme type dans Media entity
- [ ] Tests d'isolation : un manager ne peut jamais accéder aux médias d'une autre company

---

## Phase 10 : API Mobile POS

### Objectif
Endpoints API pour une future application mobile de caisse.

### Endpoints
- [ ] `POST /api/pos/sales` - Créer vente
- [ ] `GET /api/pos/products/search` - Recherche produits
- [ ] `GET /api/pos/products/{barcode}` - Lookup code-barres
- [ ] `POST /api/pos/register/open` - Ouvrir caisse
- [ ] `POST /api/pos/register/close` - Fermer caisse
- [ ] `GET /api/pos/dashboard` - Stats dashboard
- [ ] `GET /api/pos/customers/search` - Recherche clients
- [ ] `POST /api/pos/stock/receive` - Réception stock

### Critères de Validation Phase 10
- [ ] Tous les endpoints documentés via OpenAPI/Swagger
- [ ] Auth JWT fonctionnelle
- [ ] Isolation company respectée
- [ ] Tests API automatisés
