# Changelog — @mostajs/school-billing

## 0.3.0 — 2026-09-01

### Ajouté — le sous-chemin `./register` (contrat @mostajs/module-contract)

Le module contribue désormais ses **schémas** et ses **permissions** (`billing:read` et `billing:write`) par le contrat,
et `@mostajs/socle` les agrège.

**Pourquoi.** Sans lui, chaque application devait écrire les schémas dans une liste tenue à la main.
Or une liste tenue à la main **ne sait pas qu'un module a gagné une entité** : la table n'est alors
jamais créée, et rien ne le dit — jusqu'à la première écriture en production. Le défaut ne se voit
pas en essai, parce que les essais tournent en dépôt mémoire, où cette liste n'est pas lue.

Les permissions sont déclarées **par le module**, comme les schémas : c'est lui qui nomme ses propres
actes. Sans cela, deux applications qui le composent n'auraient aucun nom en commun.

Additif : la surface `.` ne change pas, et un consommateur qui n'emploie pas le contrat continue de
fonctionner à l'identique.

## 0.2.0 — 2026-09-01

### Ajouté — le MOYEN de règlement est CONSERVÉ sur la facture

`InvoiceSchema` reçoit deux champs : **`method`** (le moyen, vocabulaire de
`@mostajs/paiement-contrat` — `especes`, `carte`, `cheque`, `virement`…) et **`paymentDetails`**
(ce qui permet de RETROUVER le règlement : numéro de chèque et banque, ticket de terminal).
`invoices.pay(id, { method, details })` les enregistre.

**Pourquoi dans le module et non dans l'application.** Une facture réglée qui ne dit pas par quoi ne
se rapproche d'aucune ligne bancaire, et le manque ne se voit qu'au bilan. Les écrire côté
application les ferait perdre **en silence** dès que le dépôt est une vraie base : l'ORM ne persiste
que ce que le schéma déclare, et une écriture hors schéma ne lève pas — elle disparaît. Le moyen
d'un règlement est une information de facturation, pas une particularité d'un consommateur.

Sans moyen déclaré, `method` et `paymentDetails` valent `null` : on n'invente rien, `null` dit
« on ne sait pas », ce qui est vrai.

### Changé — les essais passent à `@mostajs/mjs-unit` (DEVRULES §11.1.bis)

Le harnais fait main enchaînait des `await test(...)` en tête de fichier : le **premier échec
interrompait le module entier**, et les essais suivants n'étaient pas rouges — ils n'étaient pas
**joués**, sans que rien ne le dise. Aucun nom ne portait sa référence, donc rien ne reliait un
essai à une exigence, et aucun rapport JSON n'était produit pour qatrax.

Ce que chaque essai vérifie est **inchangé** ; ils sont désormais isolés, référencés et rapportés.

### Ajouté — un plan DEVTEST

`docs/DEVTEST-PLAN.school-billing.json` — le module n'en avait aucun. Sept exigences, sept essais,
les trois trous (`unmatched`, `notRun`, `withoutAutoRef`) à zéro.

Demandé par ATC Smart Campus (I4 · Paiements & frais) : carte, chèque et espèces.

## [0.1.0] — 2026-06-18
### Added
- Frais (inscription/mensuel/niveau) + remises/promotions (percent/amount/code) + factures/reçus + paiement (payment) + mensuel (subscriptions-plan) + revenu. 6 tests + exemple §12.
