# Fonctionnalités POS - Spécifications Détaillées

## 1. Interface Caissier

### 1.1 Ouverture de Caisse
- Sélection de la caisse (si plusieurs)
- Saisie du fond de caisse initial
- Vérification PIN employé (si activé dans PosSettings)
- Affichage du récapitulatif de la dernière session

### 1.2 Écran de Vente Principal

```
┌─────────────────────────────────────────────────────────────────┐
│  🔍 Recherche produit (nom, SKU, code-barres)     [F1] Aide    │
├──────────────────────────────┬──────────────────────────────────┤
│                              │  PANIER                          │
│  PRODUITS                    │                                  │
│                              │  Produit A      x2    10 000 F  │
│  ┌────┐ ┌────┐ ┌────┐      │  Produit B      x1     5 000 F  │
│  │Prod│ │Prod│ │Prod│      │  Produit C      x3    15 000 F  │
│  │ A  │ │ B  │ │ C  │      │                                  │
│  │10k │ │5k  │ │5k  │      │───────────────────────────────── │
│  └────┘ └────┘ └────┘      │  Sous-total:         30 000 F    │
│  ┌────┐ ┌────┐ ┌────┐      │  TVA (18%):           5 400 F    │
│  │Prod│ │Prod│ │Prod│      │  Remise:                  0 F    │
│  │ D  │ │ E  │ │ F  │      │  ─────────────────────────────   │
│  │8k  │ │12k │ │3k  │      │  TOTAL:              35 400 F    │
│  └────┘ └────┘ └────┘      │                                  │
│                              │  👤 Client: (aucun)  [F5]       │
│  [Catégories] [Favoris]     │                                  │
│                              │  [F8 Remise] [F10 Payer]        │
├──────────────────────────────┴──────────────────────────────────┤
│  [F2 Scan] [F3 Client] [F4 Pause] [F9 Annuler] [F12 Fermer]  │
└─────────────────────────────────────────────────────────────────┘
```

### 1.3 Raccourcis Clavier Caisse

| Touche | Action |
|--------|--------|
| F1 | Aide / Guide rapide |
| F2 | Activer scanner code-barres |
| F3 | Rechercher/sélectionner client |
| F4 | Mettre vente en pause |
| F5 | Rappeler vente en pause |
| F6 | Appliquer remise ligne |
| F7 | Modifier quantité |
| F8 | Remise globale |
| F9 | Annuler la vente en cours |
| F10 | Procéder au paiement |
| F11 | Imprimer dernier ticket |
| F12 | Fermer la caisse |
| Suppr | Retirer ligne sélectionnée |
| +/- | Augmenter/diminuer quantité |
| Entrée | Valider recherche/action |
| Echap | Annuler action en cours |

### 1.4 Processus de Paiement

```
┌─────────────────────────────────────┐
│          PAIEMENT                    │
│                                      │
│  Total à payer:     35 400 FCFA     │
│  Reste à payer:     35 400 FCFA     │
│                                      │
│  ┌─────────┐  ┌─────────────┐       │
│  │  CASH   │  │ Mobile Money │       │
│  │ 💵      │  │ 📱          │       │
│  └─────────┘  └─────────────┘       │
│  ┌─────────┐  ┌─────────────┐       │
│  │  CARTE  │  │  VIREMENT   │       │
│  │ 💳      │  │ 🏦          │       │
│  └─────────┘  └─────────────┘       │
│  ┌─────────┐  ┌─────────────┐       │
│  │ CREDIT  │  │  FIDELITE   │       │
│  │ 📋      │  │ ⭐          │       │
│  └─────────┘  └─────────────┘       │
│                                      │
│  Montant: [___________] FCFA        │
│                                      │
│  [Valider le paiement]              │
└─────────────────────────────────────┘
```

**Multi-paiement** : possibilité de combiner plusieurs méthodes (ex: 20 000 cash + 15 400 mobile money).

**Mobile Money** : sélection du fournisseur (Orange Money, Wave, Free Money) + saisie référence transaction.

### 1.5 Ticket de Caisse

```
╔══════════════════════════════════╗
║        MA BOUTIQUE               ║
║    123 Rue du Commerce           ║
║    Dakar, Sénégal                ║
║    Tel: +221 77 123 45 67        ║
║    NINEA: 123456789              ║
╠══════════════════════════════════╣
║  Date: 31/03/2026  14:35        ║
║  Ticket: VTE-2026-0001542       ║
║  Caisse: Caisse 1               ║
║  Vendeur: Amadou D.             ║
╠══════════════════════════════════╣
║  Produit A           x2         ║
║    10 000 x 2 =       20 000 F ║
║  Produit B           x1         ║
║    5 000 x 1 =         5 000 F ║
║  Produit C           x3         ║
║    5 000 x 3 =        15 000 F ║
╠══════════════════════════════════╣
║  Sous-total:          30 000 F  ║
║  TVA (18%):            5 400 F  ║
║  TOTAL:               35 400 F  ║
╠══════════════════════════════════╣
║  Espèces:             40 000 F  ║
║  Monnaie:              4 600 F  ║
╠══════════════════════════════════╣
║  Client: Moussa Diallo          ║
║  Points fidélité: +35           ║
╠══════════════════════════════════╣
║     Merci de votre visite !     ║
║    [QR Code ou Code-barres]     ║
╚══════════════════════════════════╝
```

### 1.6 Fermeture de Caisse

- Comptage du fond de caisse
- Calcul automatique du montant attendu
- Saisie du montant réel
- Affichage de l'écart (+ ou -)
- Résumé de la session : nb ventes, total, par moyen de paiement
- Notes de clôture optionnelles
- Impression du rapport de fermeture

---

## 2. Gestion des Produits (Manager)

### 2.1 Liste des Produits

**Filtres disponibles :**
- Recherche texte (nom, SKU, code-barres)
- Catégorie (sélecteur hiérarchique)
- Statut : actif / inactif / tous
- Stock : en stock / stock bas / critique / rupture
- Fourchette de prix
- Avec/sans variantes
- Produit / Service
- Tri : nom, prix, stock, date création, dernière vente, CA

**Vues :**
- **Table** : colonnes configurables (image mini, nom, SKU, catégorie, prix, stock, statut)
- **Grille** : cartes produits avec image, nom, prix, stock, indicateur stock

**Actions groupées :**
- Activer / Désactiver
- Changer de catégorie
- Ajuster prix (% ou montant fixe)
- Exporter sélection

### 2.2 Fiche Produit

**Onglets :**
1. **Informations** : nom, description, catégorie, SKU, code-barres, tags
2. **Prix & Taxes** : prix vente, prix achat, TVA, remise autorisée
3. **Stock** : stock actuel, min/max, historique mouvements
4. **Variantes** : ajout/suppression variantes avec attributs
5. **Images** : upload multi-images, drag & drop réordonnement, image principale
6. **Fournisseurs** : fournisseurs liés avec prix d'achat
7. **Statistiques** : total vendu, CA, dernière vente, graphique

### 2.3 Import/Export CSV

**Import :**
```csv
nom,sku,categorie,prix_vente,prix_achat,stock_initial,unite,description
"Riz Brisé 25kg",RIZ-25KG,"Alimentation",12500,10000,50,piece,"Sac de riz 25kg"
"Huile Palme 1L",HUI-1L,"Alimentation",1500,1200,100,piece,"Bouteille 1 litre"
```

**Export** : même format + colonnes supplémentaires (id, code-barres, stock actuel, CA, date création)

---

## 3. Gestion des Stocks (Manager)

### 3.1 Vue Stock Globale
- Tableau de tous les produits avec niveaux de stock
- Code couleur : vert (OK), orange (bas), rouge (critique), noir (rupture)
- Valeur totale du stock (quantité x prix achat)
- Filtres rapides par état de stock

### 3.2 Types de Mouvements

| Type | Direction | Déclencheur | Description |
|------|-----------|-------------|-------------|
| `in` | + | Manuel / Réception | Entrée de stock |
| `out` | - | Vente | Sortie de stock (auto) |
| `adjustment` | +/- | Inventaire | Ajustement après comptage |
| `return` | + | Remboursement | Retour client |
| `loss` | - | Manuel | Perte, casse, vol |
| `initial` | + | Création produit | Stock initial |
| `transfer` | +/- | Manuel | Transfert entre dépôts (futur) |

### 3.3 Historique Mouvements
- Filtres : produit, type, date, utilisateur
- Export CSV/PDF
- Traçabilité complète (qui, quand, combien, pourquoi)

### 3.4 Alertes Stock
- **Email automatique** : liste des produits sous le seuil (commande CLI quotidienne)
- **Badge visuel** : compteur dans le sidebar POS
- **Page dédiée** : liste des produits en alerte avec actions rapides (commander, ajuster)

---

## 4. Fournisseurs (Manager)

### 4.1 Fiche Fournisseur
- Informations contact : nom, email, téléphone, adresse
- Produits fournis avec prix d'achat et référence fournisseur
- Historique des commandes
- Statistiques : montant total, nombre commandes, délai moyen

### 4.2 Bons de Commande

**Workflow :**
```
Brouillon → Envoyé → Confirmé → Réception partielle → Reçu
                                      ↓
                                  Annulé
```

**Réception :**
- Formulaire de réception par ligne (quantité reçue)
- Réception partielle possible (plusieurs réceptions pour 1 commande)
- Stock mis à jour automatiquement à la validation de la réception
- Écarts signalés (reçu vs commandé)

---

## 5. Clients (Manager + Caissier)

### 5.1 Fiche Client
- Nom, prénom, téléphone, email, adresse
- Historique des achats complet
- Solde de crédit (dette)
- Points de fidélité
- Statistiques : total dépensé, panier moyen, fréquence

### 5.2 Crédit Client

**Flux :**
1. Vente à crédit : montant non payé → crédit sur le compte client
2. Paiement de crédit : le client rembourse une partie ou totalité
3. Suivi : historique de tous les mouvements crédit/débit
4. Plafond : configurable par company dans PosSettings

**Vue débiteurs :**
- Liste de tous les clients avec solde crédit > 0
- Tri par montant, ancienneté
- Relance (futur : SMS automatique)

### 5.3 Programme Fidélité (optionnel)
- Points accumulés par montant dépensé (configurable)
- Paliers de récompense
- Utilisation des points comme moyen de paiement
- Historique points par client

---

## 6. Inventaire (Manager + Employés)

### 6.1 Types d'Inventaire
- **Complet** : tous les produits
- **Partiel** : une catégorie seulement
- **Tournant** : sélection aléatoire de produits (futur)

### 6.2 Processus

```
1. Création inventaire (manager)
     ↓
2. Génération des lignes (pré-remplissage stock théorique)
     ↓
3. Comptage physique (employés - interface mobile-friendly)
     ↓ scan code-barres + saisie quantité
4. Revue des écarts (manager)
     ↓ analyse des différences
5. Validation (manager)
     ↓ création automatique des StockMovement d'ajustement
6. Rapport final
```

### 6.3 Interface de Comptage (Optimisée Mobile)
- Grand bouton scan code-barres
- Saisie quantité avec pavé numérique large
- Liste des produits restants à compter
- Indicateur de progression
- Fonctionne sur tablette/smartphone

---

## 7. Rapports & Dashboard (Manager)

### 7.1 Dashboard POS

**Cartes résumé :**
- CA du jour / semaine / mois
- Nombre de ventes aujourd'hui
- Panier moyen
- Marge brute du jour

**Graphiques :**
- Évolution du CA (7 derniers jours)
- Répartition par moyen de paiement (camembert)
- Top 5 produits vendus (barres)
- Évolution du stock (tendance)

**Widgets :**
- Dernières 5 ventes
- Alertes stock actives
- Sessions de caisse en cours
- Top vendeur du jour

### 7.2 Rapports Disponibles

| Rapport | Filtres | Format |
|---------|---------|--------|
| Ventes par période | Date début/fin, vendeur, méthode paiement | PDF, Excel |
| Top produits | Période, catégorie, tri (quantité/CA) | PDF, Excel |
| Performance vendeurs | Période, vendeur | PDF, Excel |
| Marges | Période, catégorie, produit | PDF, Excel |
| Mouvements de stock | Période, produit, type | PDF, Excel |
| Valorisation stock | Date, catégorie | PDF, Excel |
| Clients | Période, top/débiteurs | PDF, Excel |
| Sessions de caisse | Période, caissier | PDF, Excel |
| Inventaire | Session d'inventaire | PDF |
| Bons de commande | Période, fournisseur, statut | PDF, Excel |

### 7.3 Dashboard Admin (Vue Globale)

**Cartes :**
- Nombre de boutiques POS actives
- CA global toutes boutiques
- Top 3 boutiques par CA
- Nombre total de produits

**Tableau :**
- Liste des boutiques avec CA jour/mois, nb ventes, nb produits

---

## 8. Paramétrage par Company

### 8.1 Interface de Configuration (Manager)

Organisation en onglets :

**Onglet Général :**
- Nom de la boutique
- Devise et format monétaire
- TVA par défaut
- Prix TTC ou HT par défaut

**Onglet Stock :**
- Seuils d'alerte (bas, critique)
- Autoriser stock négatif
- Réapprovisionnement automatique
- Point de réapprovisionnement

**Onglet Ventes :**
- Autoriser remises
- Remise maximum
- Client obligatoire
- Vente à crédit
- Plafond crédit
- Programme fidélité

**Onglet Paiements :**
- Moyens de paiement acceptés (cases à cocher)
- Fournisseurs mobile money

**Onglet Employés :**
- PIN obligatoire
- Déconnexion automatique
- Annulation par employé
- Remboursement par employé

**Onglet Notifications :**
- Alerte stock bas
- Rapport quotidien
- Alerte grosse vente + seuil

**Onglet Ticket :**
- En-tête personnalisé
- Pied de page personnalisé
- Afficher TVA
- Afficher logo
- Format code-barres

**Onglet Média :**
- Quota stockage
- Max images par produit
- Taille max image
- Compression auto + qualité
- Miniatures auto + dimensions
- Formats autorisés

### 8.2 Valeurs par Défaut

Chaque paramètre a une valeur par défaut sensée pour le contexte sénégalais :
- Devise : XOF (FCFA)
- TVA : 18%
- Prix TTC
- 0 décimales
- Mobile money : Orange Money, Wave, Free Money

---

## 9. Gestion des Employés POS (Manager)

### 9.1 Rôles POS

| Rôle | Description | Permissions par défaut |
|------|-------------|----------------------|
| `cashier` | Caissier | Vendre, consulter produits, ouvrir/fermer caisse |
| `stock_clerk` | Magasinier | Réceptionner stock, inventaire, consulter produits |
| `seller` | Vendeur | Vendre, consulter stock, créer clients |
| `supervisor` | Superviseur | Toutes permissions employé + remises + annulations |

### 9.2 Permissions Granulaires

Chaque permission est un booléen indépendant du rôle :
- Appliquer remise
- Annuler vente
- Traiter remboursement
- Gérer stock
- Voir rapports
- Gérer clients
- Ouvrir caisse
- Remise max autorisée (% plafond)

### 9.3 PIN Caissier
- PIN à 4-6 chiffres, hashé en BDD
- Demandé à l'ouverture de caisse
- Demandé pour actions sensibles (annulation, remise > X%)
- Réinitialisation par le manager

---

## 10. Sécurité POS

### 10.1 Audit Trail
Chaque action POS est enregistrée dans `PosAuditLog` :
- Qui (user_id)
- Quoi (action : sale_created, stock_adjusted, price_changed, etc.)
- Sur quoi (entity_type + entity_id)
- Avant/après (old_values, new_values en JSON)
- Quand (timestamp)
- D'où (IP, user agent)

### 10.2 Actions Sensibles Loguées
- Modification de prix
- Annulation de vente
- Remboursement
- Ajustement de stock
- Modification de configuration
- Attribution de permissions

### 10.3 Isolation
- Chaque requête POS vérifie l'appartenance à la company
- Les repositories filtrent systématiquement par company_id
- Les contrôleurs récupèrent la company via `$user->getPrimaryCompany()`
- Le CompanyVoter est étendu avec les attributs POS
- Aucune donnée croisée entre companies possible
