# RAPPORT v1.8.1 — La saisie des opérations gagne la fluidité du socle, et les dettes de financement ont leur tableau de bord

**892 tests au vert (4 491 assertions).** Trois commits : A (saisie),
B (dettes de financement), clôture.

## A. La saisie des opérations, même ergonomie que le socle

- **Le triplet des montants** : le TTC se saisit (le geste réel), le HT et la
  TVA calculés s'affichent sous les yeux de l'exploitant ; bascule **« Sans
  TVA »** (pas de colonne : elle pose le taux à zéro, et le modèle
  `Transaction::booted()` — source unique, inchangée — dérive HT = TTC). Le
  taux reste modifiable opération par opération, pré-rempli par la catégorie.
  La **ventilation TVA (`reprise:ventiler-tva`) n'est pas touchée** : les
  champs la nourrissent, ils ne la remplacent pas.
- **Champs nouveaux** (migration additive idempotente sur `transactions`) :
  `payment_method`, `payment_reference`, `attachment_path` — mode de
  règlement, référence (n° de chèque / OV), pièce jointe privée (PDF/image,
  10 Mo, disque local privé comme les photos d'utilisateurs). Sens en
  boutons Entrée/Sortie, tiers du répertoire (Select `tier_id`) qui
  pré-remplit le libellé libre — visiblement, jamais en silence. Garde de
  caisse, catégories fréquentes, champ « Échéance réglée » Forsa : inchangés.
- **Parité de la table** : filtre **Tiers** ajouté (période / compte /
  catégorie y étaient déjà), colonnes Règlement (+référence) et badge PJ
  masquables, totaux par sommes de colonnes, exports Excel/CSV existants.
- **Rien ne change aux écritures existantes** : le test de la recette
  recharge et sauvegarde une écriture — pas un centime ne bouge. En édition,
  la bascule « Sans TVA » revient levée quand le taux est nul
  (fill() n'applique pas les défauts — piège déjà payé, fourni explicitement).

## B. Le module « Dettes de financement » et son tableau de bord

- **Le module** (`FinancementResource`, navigation Comptabilité, policy
  `LoanSchedulePolicy` existante) : liste des financements — prêteur
  (`loan_schedules.lender_id`, colonne additive nullable), capital, encours
  restant dû, prochaine échéance, état. **Création d'un financement avec
  génération de son échéancier** : nombre d'échéances, montant, première
  date, **dernière ajustable** (vide = reliquat ; le modèle Forsa : 96 × 938,
  dernière 890 — testé en réduction 12 × 900 sur 10 000, dernière 100).
- **La fiche est un poste de travail** (`FicheFinancement`) : indicateurs
  (dues / réglées / capital restant / prochaine impayée — la plus ancienne,
  le trou d'abord), échéancier avec états, **« Régler cette échéance »** via
  la nouvelle `RemboursementFinancementAction` (généralisation du geste
  Forsa : une écriture au journal + l'échéance CHOISIE — catégorie proposée,
  jamais imposée), **« Détacher » qui rouvre**, versements non affectés
  listés pour arbitrage (Forsa). **Unicité
  `loan_installments.transaction_id` conservée, règle gravée v1.6.2
  inchangée. La page Prêt Forsa historique est intacte** (seul son rang de
  menu passe de 9 à 10) : c'est elle qu'ouvre la ligne Forsa du module.
- **Le tableau de bord des dettes** (`TableauDesDettes`, page dédiée, hors
  menu — on y va par le module et par la carte du tableau de bord
  principal) : encours par financement et global, échéances des 30 prochains
  jours, en retard à J+1, versements en attente d'arbitrage, cumul
  remboursé / coût total. Calculs dans `DettesDeFinancement`, **cache 60 s**
  invalidé à chaque écriture (branché dans AppServiceProvider, comme le
  tableau de bord principal), **requêtes bornées par test** (≤ 15 au second
  affichage).
- **Le tableau de bord principal n'est pas surchargé** : sa carte « Dettes de
  financement » existante gagne seulement l'URL vers la page dédiée.
- L'écran des prêteurs (`LenderResource`) prend le nom de ce qu'il liste —
  **« Prêteurs »** — pour laisser « Dettes de financement » au module ; même
  adresse, mêmes colonnes.

## La recette

- `SaisieOperationsTest` (6) : TTC → HT/TVA, sans TVA, écriture existante
  inchangée au centime, création complète par le formulaire (dérivés posés
  par `booted()`), bascule retrouvée en édition.
- `DettesDeFinancementTest` (7) : génération d'échéancier avec reliquat,
  fiche, chiffres du tableau de bord sur fixture (encours 3 000, 1 retard,
  1 sous 30 jours, cumul 1 000/4 000), retard à J+1 (l'échéance du jour n'y
  est pas), requêtes bornées, **Forsa non régressé — avril 2026 non réglée
  reste non réglée, l'affectation de mai intacte, la page Forsa répond 200**,
  versement non affecté compté en attente d'arbitrage.
- Suite complète verte (892), anti-clés-brutes compris. Une collision de
  rang de menu (Comptabilité) détectée par `MenuParametrageTest` et résolue.

## Contraintes tenues

Aucune dépendance composer. Deux migrations additives idempotentes (aucune
conversion). Policies : `LoanSchedulePolicy` couvre le module ; pages avec
`canAccess('dettes.voir')`. Numérotation, échéancier clients,
`public/.htaccess`, ventilation TVA : intouchés. Pas de widget Livewire
nouveau (pages Filament à vue unique — une seule racine).

## Déploiement

`artisan migrate --force` (colonnes additives à défauts sûrs) + les quatre
caches. `public/build/` recompilé voyage dans le paquet. À vérifier à
l'écran : le formulaire « Nouvelle opération » (TTC → HT/TVA affichés,
bascule Sans TVA), Comptabilité → « Dettes de financement » (Forsa listé,
sa ligne ouvre la page du prêt), le « Tableau de bord des dettes », et la
carte « Dettes de financement » du tableau de bord qui y mène.
