# v1.4.8 — Ce qui se signe, ce qui se compte, ce qui s'écrit, ce qui prend rang

## 1. La facture ne se signe plus

La case « Réception du client — Date, cachet et signature » a quitté le gabarit
de la facture, et donc aussi celui de l'avoir, qui la corrige et ne se négocie
pas. Reste la case de l'émetteur, avec le cachet. Le devis conserve les deux :
c'est là que l'accord se donne.

## 2. Les commissions se comptent enfin — et disent pourquoi elles ne comptaient pas

Le diagnostic était juste : la table des paiements est vide, le statut « payée »
a été posé par la reprise, et la génération ne se déclenchait qu'à la création
d'un paiement.

* **Le fait générateur est désormais l'encaissement de l'échéance**, quel qu'en
  soit le chemin — un règlement enregistré aujourd'hui, ou un statut posé à la
  reprise. Les deux mènent à la même méthode.
* **Rejouable sans doublon** : l'unicité porte sur le couple échéance +
  commercial. `php artisan mobdie:generer-commissions`, avec `--simulation`.
* **Aucune opération de trésorerie.** Une commission acquise n'est pas une
  commission versée ; le versement se saisit au journal.
* **Un barème absent ne se tait plus.** L'écran des barèmes nomme, pour chaque
  commercial, les événements qu'aucun barème ne couvre. C'est ce silence qui
  avait fait croire que le calcul ne marchait pas.
* **L'écran des commissions** montre par commercial l'acquis, le versé, le solde
  dû, et en regard les deux versements du journal rangés en « Commissions
  commerciales », rapprochés par le nom cité. L'écart n'est pas arbitré : il est
  montré, avec les lignes en face.
* **Les vingt-neuf échéances sans commercial** ont leur encart, avec le suiveur
  du dossier à titre d'information seulement.

**Un point où je ne vous ai pas suivi.** Le commercial de l'échéance ne retombe
plus sur celui du dossier. Le repli existait, et il aurait « réparé » les
vingt-neuf en silence — en créant vingt-neuf dettes envers Salima sur des
signatures dont rien ne dit qu'elle les a faites. Vous demandiez de ne pas
deviner ; le repli était une devinette. Elles sont donc signalées et non
attribuées, et l'application n'en génère aucune tant que vous n'avez pas
tranché.

## 3. Une zone d'envoi, et des modèles

Écran **Domiciliation → Envoyer un message** : un destinataire (domicilié,
apporteur, ou adresse libre), un modèle, un texte, des pièces jointes — celles du
dossier ou des fichiers déposés pour l'occasion — et un aperçu à droite qui
montre le message tel qu'il partira. **L'aperçu n'envoie rien** ; c'est le bouton
d'envoi, avec confirmation, qui envoie.

Cinq modèles livrés — relance d'impayé, envoi de facture, envoi de contrat,
demande de pièce manquante, réponse à une demande — gérables depuis les Réglages.
Aucune accolade ne sort : ce qui n'a pas de valeur devient un tiret.

Le gabarit visuel porte le logo, la couleur de la marque, et un pied de page avec
ICE, RC, IF, TP, adresse et téléphone. Écrit en tables et styles alignés, borné à
600 pixels : lisible sur téléphone et dans Outlook.

Chaque envoi est consigné au registre du courrier — destinataires, copies,
modèle, pièces jointes — et l'onglet Courrier de la fiche client, qui ne montrait
que le courrier reçu, montre désormais les deux sens.

## 4. Une assistance sur vos données

Écran **Administration → Assistance**. Huit fonctions nommées, écrites une à une,
en lecture seule : clients et complétude, échéancier, un client donné, factures,
journal mensuel, comptes courants, prêt, commissions. Pas de requête libre — le
chemin n'existe pas.

Les trois règles sont tenues par le code, pas par la consigne :

* **Aucun chiffre sans sa source.** Chaque fonction rend l'écran d'où viennent
  ses chiffres, la période et le nombre de lignes agrégées ; l'écran les affiche
  sous la réponse, que le modèle les ait citées ou non.
* **Aucune écriture.** Pendant l'échange, un garde-fou écoute les requêtes
  envoyées à la base et lève à la première qui n'est pas une lecture.
* **L'aveu d'ignorance.** Une fonction inconnue rend un résultat « hors
  périmètre » explicite, repris tel quel.

Les appels sont comptés dans le suivi d'usage, et l'onglet IA des Réglages
affiche la dépense du mois en dirhams — avec un champ pour le cours du dollar,
parce qu'il bouge.

## 5. Le numéro de facture se modifie

Le champ apparaît à l'édition. Réservé au super-administrateur (permission
`factures.numeroter`), refusé si le numéro est déjà pris dans la même série,
inscrit au journal d'audit avec la valeur avant et après, et accompagné de la
phrase qui rappelle pourquoi on ne réutilise pas un rang sorti de la maison.

## 6. Le compteur n'a plus à reculer

Votre objection était la bonne, et je l'ai suivie.

* **Un brouillon n'occupe aucun rang.** Il se désigne « brouillon du 30/07 » et
  se supprime sans conséquence. Le numéro s'attribue à l'émission, par un bouton
  « Émettre la facture » désormais explicite.
* **Une facture qui a pris rang ne se supprime pas** — ni en corbeille, ni
  définitivement. Le refus dit quoi faire à la place : annuler si elle n'est pas
  réglée, établir un avoir si elle l'est. L'annulation est mise en avant à côté.
* **Un contrôle de série** en tête de la liste des factures signale un trou ou un
  doublon, avec le rappel de l'article 145. Il ne compte pas les brouillons,
  compte les pièces annulées, et ne crie pas au trou devant une série reprise en
  cours d'exercice — vos trente-quatre premiers numéros ne sont pas des trous.

## Recette

`538 tests, 2 711 assertions, tous au vert.` `./vendor/bin/pint` : rien à
reprendre. `npm run build` : 56 modules.

Nouveaux fichiers d'épreuve : `SerieDesFacturesTest` (16 cas), `CommissionsTest`
(11), `ZoneEnvoiTest` (9), `AssistanceTest` (12), plus deux cas sur les cases de
signature dans `RenduPdfTest`.

**Un correctif d'à-côté.** L'onglet Courrier de la fiche client appelait une
méthode d'infolist qui n'existe pas ; elle ne s'était jamais vue parce que la
colonne n'était pas affichée. Corrigée en passant.
