# Spec — La caisse spécialisée

> Statut : `done`

## Intention

Jusqu'ici, toutes les caisses étaient identiques : le même catalogue entier, les mêmes deux
moyens de paiement. La première vraie récré, le 2026-09-09, a montré que c'est faux — une caisse
est un **point de vente** avec son assortiment et ses moyens de paiement.

Trois choses, qui viennent du même constat :

1. une caisse peut ne vendre **que certains rayons** ;
2. une caisse accepte **certains moyens de paiement**, et le chèque apparaît ;
3. les statistiques doivent pouvoir se lire **caisse par caisse**, en entier.

## Contraintes

- **Ce qui existe ne change pas de sens.** Une caisse sans rayon déclaré vend tout ; une caisse
  sans moyen de paiement déclaré les accepte tous. Aucune migration de données n'est nécessaire,
  et une association qui ne touche à rien ne voit aucune différence.
- **Le filtre par rayon est une commodité, pas une barrière.** Le serveur ne refuse pas une vente
  d'un produit hors rayon : ce serait contredire l'[ADR-0007](../decisions/0007-vente-jamais-bloquee-par-stock.md),
  qui pose qu'une vente ne se bloque pas. L'écran range, il n'interdit pas.
- Le chèque n'a **pas de dénomination** : il ne se compte pas comme les espèces.

## Comportement attendu

### Rayons rattachés à une caisse

Plusieurs rayons par caisse, pas un seul — une buvette vend des boissons *et* des viennoiseries,
et se limiter à un rayon obligerait à créer un rayon « buvette » qui doublonnerait le classement.

**Vide veut dire tout.** C'est le comportement d'aujourd'hui.

**Le piège des produits sans rayon** : le rayon est optionnel depuis le lot 1, et sur une caisse
restreinte, un produit sans rayon disparaît **sans rien dire**. L'écran de configuration de la
caisse annonce donc combien de produits sont dans ce cas. Prévenir au moment du réglage coûte une
phrase ; le découvrir un mardi à 10 h avec la queue devant soi coûte la récré.

### Moyens de paiement d'une caisse

`Register.paymentMethods` : la liste de ce que la caisse accepte. **Vide veut dire tout**, comme
pour les rayons. L'écran de vente n'offre que ces moyens-là.

**Le chèque** entre dans l'enum, et il traverse toute la chaîne de clôture : un attendu, un
compté, un écart, une colonne dans les statistiques et dans le PDF. Les trois écarts restent
**séparés** — les additionner effacerait ce qui les distingue, exactement comme pour les deux
premiers.

**On ne compte pas un chèque à l'aveugle par dénomination**, puisqu'il n'en a pas : le vendeur
saisit le montant total des chèques du tiroir. La règle de l'[ADR-0008](../decisions/0008-comptage-a-l-aveugle.md)
tient quand même, et c'est elle qui compte : **aucun attendu n'est affiché pendant la saisie.**

Le champ chèque apparaît dans **deux** cas : la caisse accepte les chèques, **ou** il s'en est
encaissé malgré tout. Le second ferme un piège — retirer le chèque d'une caisse en cours de
journée ferait sinon clôturer sans jamais demander de compter ce qui est dans le tiroir, et
l'écart tomberait sans que personne ait pu y faire quoi que ce soit.

### Le filtre caisse dans les statistiques

Il s'applique désormais à **toute la page** : ventes, évolution, meilleures ventes, 20/80,
vendeurs, rayons, écarts — et à l'export PDF, qui reprend les filtres en cours.

Une exception, signalée à l'écran : les **ruptures de stock** restent globales. Un stock
appartient au produit, pas à la caisse ; le filtrer par caisse n'aurait pas de sens.

## Critères de « fait »

- [x] `Register.rayons`, plusieurs-à-plusieurs, vide = tous les rayons.
- [x] L'écran de vente n'affiche que les produits des rayons de la caisse.
- [x] Le back-office annonce le nombre de produits sans rayon.
- [x] `Register.paymentMethods`, vide = tous les moyens.
- [x] L'écran de vente n'offre que les moyens de paiement de la caisse.
- [x] `PaymentMethod::CHEQUE`, avec attendu, compté et écart propres.
- [x] La clôture demande le total des chèques quand la caisse en accepte, sans montrer d'attendu.
- [x] Les statistiques et le PDF portent les trois écarts, séparés.
- [x] Le filtre caisse s'applique à toute la page de statistiques.

## Notes

Ce que cette spec **ne fait pas** : rattacher un produit à une caisse directement. Le rayon est
la maille de rangement du catalogue depuis le lot 1 ; en ajouter une seconde ferait deux endroits
où classer un produit, et deux occasions de se contredire.
