# v1.4.7 — Le cachet devient un réglage, la référence redevient « 35/2026 »

## 1. Le cachet est un réglage, et il n'est plus servi en libre accès

L'image du cachet vivait dans `public/images/brand/cachet.png`, avec son chemin
écrit en dur à trois endroits : le PDF des actes, l'export Word, et le PDF des
devis et factures. L'exploitant ne pouvait pas le changer sans déploiement, et
n'importe qui devinant l'adresse pouvait le télécharger.

* Nouveau type de réglage **image**, rendu par un champ de téléversement dans
  l'écran des Réglages, avec l'aperçu de l'image en place à côté du champ. Le
  type est générique : il servira au logo sans rien réécrire.
* Le fichier livré a quitté `public/` pour `resources/images/brand/` : il sert
  de secours, il n'est plus servi. L'image téléversée vit sur le disque privé et
  ne se regarde que par une route authentifiée, sur le modèle de
  `client-document.inline`.
* Un seul accesseur — `App\Services\ImageDeReglage` — remplace les trois chemins
  en dur. Il rend l'image téléversée si elle existe, le fichier livré sinon :
  rien ne change tant que l'exploitant n'a rien téléversé.

Les trois contraintes, parce qu'elles se voient sur le document final :

* **PNG à fond transparent exigé.** Un JPEG est refusé, au formulaire et dans le
  service, avec la raison écrite : sans couche de transparence il poserait un
  rectangle blanc opaque par-dessus le texte et la ligne de signature.
* **1 Mo au plus, 600 pixels de côté.** L'image est intégrée en data-URI dans
  chaque PDF produit ; au-delà de 600 pixels elle est redimensionnée à la volée,
  transparence conservée. Le fichier livré pèse 183 Ko, ce qui est déjà beaucoup.
* **Les documents déjà produits ne sont pas réécrits.** Ce sont des PDF
  enregistrés, ils portent leur propre copie : un contrat signé garde le cachet
  qui était en vigueur ce jour-là. La phrase figure sous le champ.

Un bouton « Revenir au cachet livré » ramène l'application à son état d'origine
sans déploiement.

## 2. Les deux versions, avec et sans cachet, offertes partout

Le mécanisme existait et fonctionnait ; ce qui manquait, c'est qu'il soit visible
au lieu de dépendre d'un paramètre d'adresse.

* Devis, factures et avoirs : le bouton principal suit le réglage par défaut, la
  seconde version est à côté, nommée « Télécharger sans cachet » ou « avec
  cachet » selon le cas — dans la liste des devis, la liste des factures et
  l'onglet Facturation d'un dossier.
* Contrats, avenants, résiliations, attestations : la pièce classée se recompose
  à la volée dans l'autre version, avec sa référence, sans que l'original bouge.
  L'action est offerte dans l'onglet « Pièces du dossier », dans l'archive, et
  dans la fenêtre d'aperçu.
* La colonne **cachet** existait en base sans se voir nulle part. Elle est
  désormais affichée et filtrable dans l'archive comme dans les pièces du
  dossier : c'est l'information qui évite d'envoyer deux fois la mauvaise
  version.
* Le nom du fichier téléchargé dit laquelle des deux versions il porte, faute de
  quoi deux téléchargements se recouvriraient.

Rien à l'écran ne laisse entendre qu'un cachet vaut signature. C'est justement
pourquoi la version sans cachet doit exister : certaines administrations exigent
un cachet humide sur papier.

## 3. Les numéros s'écrivent « 35/2026 »

* `NumberSequence` produit désormais `NN/AAAA` : deux chiffres au moins, une
  barre oblique, l'année sur quatre chiffres. Au centième document le compteur
  déborde de lui-même — `100/2026` suit `99/2026`.
* La remise à zéro annuelle reste activée : la série 2027 recommencera à
  `01/2027`.
* Le préfixe de série (`FAC`, `DEV`, `AV`) reste en base — il distingue les trois
  suites dans les requêtes, le tri et le calcul du prochain numéro — mais ne
  s'écrit plus dans la référence visible. Les libellés des Réglages le disent.
* Les trois séries partageant désormais la même forme, l'unicité passe du numéro
  seul au couple **série + numéro** : sans quoi la douzième facture de l'année
  empêcherait le douzième devis d'exister.

## 4. Les trente-quatre factures antérieures sont en base

`php artisan mobdie:importer-factures-historiques`, avec `--simulation`,
idempotente et enveloppée dans une transaction.

| Contrôle | Attendu | Obtenu |
|---|---|---|
| Factures | 34 | 34 |
| Total HT | 39 083,31 DH | 39 083,31 DH |
| Total TVA | 7 816,69 DH | 7 816,69 DH |
| Total TTC | 46 900,00 DH | 46 900,00 DH |

* **Dates.** Douze factures portaient une date en 2025 alors que leur référence
  dit 2026, et `07/2026` était datée du 27 janvier quand 08 à 12 l'étaient du 26.
  La colonne `date` porte la date retenue, `date_origine` celle imprimée sur le
  document, et `date_corrigee` signale l'écart. Les douze sont signalées à
  l'import et repérables dans la liste des factures, où la date porte un
  avertissement et la date du document en légende.
* **Chronologie.** L'import vérifie que les numéros suivent l'ordre des dates et
  refuse d'écrire quoi que ce soit si la série est rompue.
* **Appariement.** 31 factures sur 34 trouvent leur client (25 par l'ICE, 6 par
  le nom, d'après le relevé livré). Les trois autres — LOVEGROVE,
  UNIVERS STARTUP ET ENTREPRENEUR, EL-ASERY KAMAL — entrent avec un client nul,
  leur nom et leur ICE conservés. Aucun dossier de domiciliation n'est ouvert
  pour elles.
* **Ce que l'import n'a pas fait.** Aucune opération de trésorerie, aucun
  encaissement, aucune commission, aucune modification d'échéance. Seize
  échéances ont reçu le lien vers leur facture, et seulement là où le client, le
  montant et le mois concordaient tous les trois.
* **Pièces.** Les trente-quatre PDF d'origine sont classés, type `facture`
  (nouveau, abréviation `FACTURE` dans les règles de nommage), rattachés à leur
  facture. Les trois sans domicilié sont rangées hors dossier plutôt que nulle
  part — `client_documents.client_id` accepte désormais le vide.
* Après l'import, le plus grand numéro 2026 vaut 34 et la prochaine facture
  s'appelle `35/2026` sans que le report des Réglages ait à intervenir.

## Divers

Un visiteur non authentifié qui ouvrait l'adresse d'une pièce déclenchait une
erreur serveur : l'application n'a pas de route nommée `login`, seulement celle
du panneau Filament. Il est désormais redirigé vers la connexion.

## Recette

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

Les nouveaux fichiers d'épreuve : `tests/Feature/CachetTest.php` (18 cas) et
`tests/Feature/RepriseFacturesHistoriquesTest.php` (12 cas, sur le fichier réel).
`NumerotationTest` et `ReglagesTest` sont complétés.

**Écart relevé sur les données.** Le relevé livré donne 25 appariements par l'ICE
et 6 par le nom, là où la note de lecture annonçait 26 et 5. Le total apparié —
31 sur 34 — est le même, et c'est le fichier livré qui a été importé.
