# Rapport v1.7.4 — Les défauts de la redevance, partout pareil

La v1.7.3 a posé **600 DH HT / semestriel / 6 mois** sur *un* des formulaires
de création de contrat : l'onglet « Contrats » de la fiche client. Mais
l'exploitant crée l'essentiel de ses dossiers par **l'assistant « Nouveau
dossier »**, et cet écran-là affichait encore **Annuel / 12 mois / montant
vide**. Un troisième chemin — l'action « Ajouter un contrat » d'un client
existant — portait le même ancien défaut.

**Trois formulaires, trois copies du même défaut**, qui ont divergé sans que
rien ne le signale : c'est exactement ce qui a laissé passer le trou de la
v1.7.3. Ce lot ne change pas les valeurs — il supprime les copies.

**Recette** : **864 tests, 4 334 assertions**, tout au vert (860 avant le
lot). `./vendor/bin/pint` passé, `npm run build` relancé. **Aucune
migration**, aucune dépendance ajoutée, aucun changement de cron ni de
`.env`, **aucun fichier déplacé ni supprimé**. Le déploiement est un simple
remplacement de fichiers suivi des quatre `artisan *:cache`.

---

## 1. Une seule source de vérité

Trois constantes dans `app/Support/Domiciliation.php` — le référentiel qui
porte déjà `periodicites()`, `moisParPeriode()` et les couleurs de statut :

```php
public const REDEVANCE_PERIODICITE_DEFAUT = 'semestriel';
public const REDEVANCE_DUREE_MOIS_DEFAUT = 6;
public const REDEVANCE_MONTANT_HT_DEFAUT = 600;
```

> Le prompt proposait `App\Models\Domiciliation` : cette classe n'existe pas.
> `App\Support\Domiciliation` est son équivalent réel — c'est le référentiel du
> domaine, et **les trois formulaires l'importaient déjà** pour lire
> `periodicites()`. Aucun `use` nouveau n'a été nécessaire.

La clé `'semestriel'` est bien celle que retourne
`Domiciliation::periodicites()` — vérifié par test.

## 2. Les trois formulaires lisent cette source

Champ **et** valeur de repli, pour qu'aucun chemin ne reparte en douce sur
l'ancien défaut.

| Écran | avant | après |
|---|---|---|
| Assistant « Nouveau dossier » | `annuel` / `12` / *(vide)* | **`semestriel` / `6` / `600`** |
| « Ajouter un contrat » (client existant) | `annuel` / `12` / *(vide)* | **`semestriel` / `6` / `600`** |
| Onglet « Contrats » de la fiche | `semestriel` / `6` / `600` *(littéraux)* | **les mêmes constantes** |

### `app/Filament/Pages/NouveauDossierDomiciliation.php`

- Le tableau monté par `mount()` : `periodicite`, `duree_mois`, et **`montant_ht`
  qui n'y figurait pas du tout**. C'est ce qui laissait le champ vide à
  l'écran : `$this->form->fill($data)` hydrate l'état donné et n'applique pas
  les `->default()` des composants pour les clés absentes — d'où le montant à
  saisir à la main sur ce chemin, alors même que le composant portait un
  défaut.
- Le `Select::make('periodicite')->default(…)`, le
  `TextInput::make('montant_ht')` (qui n'avait **aucun** défaut → ajouté) et le
  `TextInput::make('duree_mois')->default(…)` de l'étape 4.
- Les replis de `apercuEcheancier()` : `?? 'annuel'` et `?? 12`. Le repli
  `montant_ht ?? 0` **reste à 0** — c'est le sentinelle « pas encore saisi »
  qui déclenche l'invite « Renseignez le montant », pas un défaut métier.
- `appliquer_tva` reste à `true` — il l'était déjà.

### `app/Filament/Actions/Rapides/ContratClientExistantAction.php`

`periodicite->default(…)`, `montant_ht` (défaut ajouté),
`duree_mois->default(…)`, et les replis de l'aperçu d'échéancier
(`?: 'annuel'`, `?: 12`). Même traitement du repli `montant_ht ?: 0`.

### `app/Filament/Resources/…/ContractsRelationManager.php`

Déjà aux bonnes valeurs depuis la v1.7.3 : ses trois littéraux sont remplacés
par les constantes. Rien ne change à l'écran.

## 3. Ce qui ne change pas

Le calcul TTC, la TVA à 20 %, les libellés, l'échéancier, la génération des
échéances : intacts. Les trois valeurs restent **modifiables** — le logiciel
propose, l'exploitant décide.

> **Signalé, non touché** — `TransformerDevisAction` (transformer un devis
> accepté en contrat) porte aussi `periodicite => 'annuel'`. Ce n'est pas le
> même cas : le montant et la durée y viennent du **devis**, et seule la
> périodicité de facturation est demandée. Le prompt visait les trois
> formulaires de création de contrat ; ce quatrième chemin est laissé tel
> quel, mais il est noté ici pour que l'arbitrage revienne à l'exploitant.

## Recette

`tests/Feature/AssistantNouveauDossierTest.php` — **2 tests nouveaux** :

- « ouvre l'étape du contrat sur 600 DH HT, semestriel, six mois » — l'état
  monté du composant Livewire réel est lu (`data.periodicite`, `data.duree_mois`,
  `data.montant_ht`, `data.appliquer_tva`), les constantes sont confrontées à
  leurs valeurs attendues, la clé `semestriel` est vérifiée dans
  `periodicites()`, et l'aperçu d'échéancier calculé sur ces seuls défauts
  donne **1 échéance à 720 DH TTC** ;
- « crée depuis l'assistant un contrat à 600 / 120 / 720 sans toucher à la
  redevance » — l'assistant est rempli **sans** `periodicite`, `montant_ht` ni
  `duree_mois` ; le contrat créé porte `semestriel / 6 / 600`, une seule
  échéance à 720 TTC, et l'article Redevance du document généré affiche
  600,00 / 120,00 / 720,00 pour « six (06) mois ».

`tests/Feature/ContratClientExistantTest.php` — **2 tests nouveaux** :

- « ouvre la fenêtre sur 600 DH HT, semestriel, six mois » — le schéma de
  l'action est parcouru, ses défauts comparés aux constantes **et** à leurs
  valeurs littérales, `appliquer_tva` vérifié à `true` ;
- « crée un contrat à 720 DH TTC la période quand on laisse les défauts » —
  l'action est appelée depuis la fiche client avec la seule date de début ; le
  contrat sort à `semestriel / 6 / 600` et son unique échéance à 720 TTC.

`tests/Feature/DocumentGenerationTest.php` — **inchangé et toujours vert** :
les deux tests de la v1.7.3 continuent d'affirmer les valeurs en clair
(`'semestriel'`, `6`, `600`). C'est voulu : ils gardent les constantes
elles-mêmes, qu'aucun test ne pourrait sinon contredire.

## À vérifier après déploiement

1. Menu **Nouveau dossier** → étape « Contrat et échéancier » : le formulaire
   s'ouvre sur **Semestriel / 600 / 6 mois**, TVA cochée, et l'aperçu annonce
   **1 échéance de 720,00 DH TTC**.
2. Fiche d'un client → bouton **Ajouter un contrat** : même trio, même aperçu.
3. Onglet **Contrats** d'une fiche → « Saisie détaillée » : toujours
   **semestriel / 6 / 600** (inchangé depuis la v1.7.3).
4. Créer un dossier complet depuis l'assistant sans toucher à la redevance,
   puis ouvrir le contrat généré : l'article Redevance dit **600,00 DH HT,
   120,00 DH de TVA, 720,00 DH TTC**.
