# Rapport v1.7.2 — Le même ordre de lecture que les apps sœurs, des PDF qui se referment, une barre en moins

L'exploitant pilote trois applications (MOBDIE, IRADA, RUWAD) et a arrêté une
grille de lecture commune pour leurs tableaux de bord : l'argent compte par
compte, l'argent en vue d'ensemble, ce qui attend une décision, l'activité du
mois, les engagements, les courbes. Ce lot aligne MOBDIE sur cette grille, et
fait trois choses de plus : il **supprime la barre d'accès rapides et les
raccourcis clavier** (demande explicite), il rend **les PDF refermables sur
téléphone**, et il lisse l'interface — couleurs de statuts, états vides,
contrôle à 390 px.

**Recette** : 855 tests, 4 248 assertions, tout au vert (857 avant le lot —
la barre emporte ses tests, les écrans réels reprennent la couverture).
`./vendor/bin/pint` passé, `npm run build` relancé. **Aucune migration**,
aucun changement de cron ni de `.env`, aucune dépendance ajoutée. Le
déploiement est un remplacement de fichiers **plus les suppressions listées en
fin de rapport** (Filament découvre par chemins : un fichier oublié sur le
serveur ressusciterait la classe), suivi des quatre `artisan *:cache`.

---

## 1. Le tableau de bord dans l'ordre commun

Ordre des widgets, du haut vers le bas :

1. **Santé de l'exploitation** (inchangé — il se retire quand tout va bien) ;
2. **« Trésorerie — ce que la société a, et ce qu'elle doit »** (ex-« Ce que
   la société a… ») — compte par compte ;
3. **« Trésorerie — vue d'ensemble »** (ex-« Situation financière ») —
   **remontée** juste après la position du jour, elle était coincée en
   cinquième position ; sa tuile « Trésorerie totale » se décrit désormais
   « Somme des comptes ci-dessus » : on voit d'un coup d'œil que le bandeau 3
   totalise le bandeau 2 ;
4. **« À traiter — relances, résiliations, conformité, dossiers »**
   (ex-« À traiter ») ;
5. **« Activité du mois — recouvrement »** (ex-« Recouvrement ») ;
6. les deux courbes, dans l'ordre existant : évolution mensuelle, puis
   chiffre d'affaires par activité.

**Aucun calcul ne bouge** — seuls les `$sort` et les titres.
`TeteDuTableauDeBordTest` vérifie désormais l'ordre complet des six widgets
(strictement croissant : deux widgets au même rang laisseraient Filament les
ranger à sa guise). Les bornes de requêtes du tableau de bord sont inchangées
(`RequetesDuTableauDeBordTest`, plafonds 60 et 80).

## 2. La barre d'accès rapides et les raccourcis disparaissent

Demande explicite de l'exploitant. Sont partis : le point d'accroche
`panels::topbar.after`, le composant Livewire et ses deux vues, le script des
raccourcis clavier injecté dans l'en-tête (`⌘K`, `⌘S`, `⌘M`), les
`->keyBindings()` (`mod+shift+…`), la fenêtre d'aide des raccourcis, et les
quatre actions qui ne servaient que la barre. **Le mode relevé de la fenêtre
de saisie rapide part avec elles** — la saisie d'opérations se fait au
journal, qui porte déjà la garde de caisse (bloquante, forçable).

Vérifiées une par une, **deux actions restent**, débarrassées de leurs
raccourcis :

- `NouvelleFactureAction` — servie par la liste des factures (bouton
  d'en-tête, et désormais l'état vide) et le formulaire de facture ;
- `ContratClientExistantAction` — servie par la fiche client et son onglet
  des contrats.

En échange du retrait, **les catégories habituelles servent le journal** : le
formulaire « Nouvelle opération » du journal propose en tête les cinq
catégories les plus employées du trimestre (le mécanisme venait de la fenêtre
de saisie rapide ; `SaisieRapide` continue de servir les fenêtres de
règlement).

Les tests métier qui passaient par la barre passent par les écrans réels
(journal, fiche client) ; `ActionsRapidesTest` est remplacé par
`DisparitionDesActionsRapidesTest`, qui prouve l'absence : le HTML du panneau
ne contient plus ni la barre, ni aucun `mod+shift`, ni le script des
raccourcis — sur six écrans, du tableau de bord aux réglages.

## 3. Les PDF se referment — le lecteur de documents

Le fait : l'application est une PWA `display: standalone`, tous les PDF
sortaient en `Content-Disposition: inline` et s'ouvraient dans un onglet
neuf. Sur téléphone, le visionneur natif prenait l'écran entier — sans barre
d'adresse, sans retour, sans téléchargement : l'utilisateur était **enfermé
dans le PDF**.

- **`GET /lecteur`** (route `documents.lecteur`, authentifiée) : une barre
  d'en-tête aux couleurs du panneau — « ← Retour » (`history.back()`, repli
  vers le tableau de bord sans historique), le titre, « Télécharger » — et le
  PDF en iframe pleine hauteur. Sur iPhone, où l'iframe ne rend que la
  première page, une bannière discrète le dit et renvoie au téléchargement
  (détection côté client, sans dépendance).
- **`src` sur liste blanche** : uniquement un chemin relatif interne
  commençant par `/factures/`, `/devis/`, `/pieces/`, `/documents/apercu/`,
  `/exports/`, `/clients/`. URL absolue, hôte externe, `..`, antislash :
  **403**.
- **Le téléchargement existe enfin** : `?telecharger=1` sur les routes PDF
  (`FactureController` devis/factures, `ClientDocumentController::inline` /
  `autreVersion` / `apercu`, les trois PDF d'`ExportController`) → même
  binaire, `Content-Disposition: attachment`. C'est la cible du bouton
  « Télécharger ».
- **Tous les liens d'interface passent par le lecteur, même onglet** :
  `ActionsCachet` (« Ouvrir le PDF », « Ouvrir sans/avec cachet », « Ouvrir
  l'autre version »), les tables factures et devis, l'onglet facturation de
  la fiche client, le relevé du domicilié (fiche, échéancier, recouvrement).
  Plus aucun `shouldOpenInNewTab` vers un PDF ; les liens de téléchargement
  pur (attachment) perdent aussi leur onglet neuf, qui restait blanc.
- **Les états PDF du CPC et du journal**, jusqu'ici accessibles seulement par
  URL directe, rejoignent le menu Exports des rapports comptables — par le
  lecteur.
- L'aperçu en modale de `GenererDocumentAction` (iframe interne à l'écran)
  reste tel quel ; **la PWA ne change pas** (`site.webmanifest` intact).

Le lot miroir applique la même solution à IRADA et RUWAD.

## 4. Lissage d'interface

- **Les statuts parlent la même couleur partout** — brouillon gris,
  émise/envoyée bleu, payée/encaissée vert, en retard orange,
  annulée/expirée rouge :
  - factures : « émise » passe d'orange à bleu (elle se confondait avec un
    retard) ; l'onglet facturation de la fiche client lit l'enum au lieu
    d'une copie divergente où « émise » sortait grise, et son filtre offre
    enfin « émise » ;
  - devis : « expiré » passe d'orange à rouge (un devis expiré est mort, pas
    en retard) ; « transformé » garde le violet de la marque ;
  - échéances : une seule source (`Domiciliation::couleurEcheance()`) pour
    l'échéancier global et la fiche client — en retard passe de rouge à
    orange, annulée de gris à rouge, à venir en bleu ;
  - statut du dossier : une seule source (`Domiciliation::couleurStatut()`)
    remplace **six copies divergentes** (liste clients, fiche, échéancier,
    recouvrement, dossiers incomplets, registre légal — les deux derniers
    montraient résilié/annulé en gris) ;
  - contrats : le badge de l'onglet, jusqu'ici gris pour tous, dit actif
    vert, résilié/expiré rouge, brouillon gris — et parle français ;
  - recouvrement : la colonne « Facture » adopte la logique de l'échéancier
    (sans facture = alerte rouge, non plus orange).
- **Les tableaux vides disent quoi faire** : « Aucun devis — Établir un
  devis » (bouton), « Aucune facture — Nouvelle facture » (la même fenêtre
  que l'en-tête), « Aucun client — Nouveau dossier de domiciliation » ;
  l'onglet contrats de la fiche client a enfin sa phrase (il tombait sur le
  libellé générique « Rien à afficher »).
- **Contrôle téléphone** : le thème cadenasse le défilement horizontal à
  l'échelle de la page (`overflow-x: clip` sous 640 px), coupe au mot les
  descriptions longues des cartes de statistiques (soldes par associé,
  échéance Forsa) et borne les graphiques à leur carte. Ce qui déborde —
  les tables — défile dans sa propre boîte, comme Filament le fait déjà.

---

## Fichiers supprimés

⚠️ **À retirer du serveur au déploiement** (Filament découvre par chemins ;
un fichier oublié ressusciterait la classe) :

```bash
cd /home/mobdiema/public_html/app.mobdie.ma
rm app/Livewire/BarreActionsRapides.php
rm app/Filament/Actions/Rapides/NouvelleOperationAction.php
rm app/Filament/Actions/Rapides/EncaisserEcheanceAction.php
rm app/Filament/Actions/Rapides/MouvementCompteCourantAction.php
rm app/Filament/Actions/Rapides/NouveauContratAction.php
rm resources/views/filament/barre-actions-rapides.blade.php
rm resources/views/livewire/barre-actions-rapides.blade.php
rm resources/views/livewire/aide-raccourcis.blade.php
rmdir app/Livewire resources/views/livewire 2>/dev/null || true
```

(`tests/Feature/ActionsRapidesTest.php` est supprimé du dépôt mais ne voyage
jamais dans un paquet.) Les dossiers `app/Livewire/` et
`resources/views/livewire/` sont désormais vides dans le dépôt.

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

1. Le tableau de bord : les deux bandeaux de trésorerie se suivent, la tuile
   « Trésorerie totale » dit « Somme des comptes ci-dessus ».
2. Plus de barre sous l'en-tête, sur aucun écran ; `⌘K`/`⌘S`/`⌘M` ne font
   plus rien.
3. Depuis un téléphone (PWA) : ouvrir une facture PDF — la barre « Retour /
   Télécharger » est là, « Retour » ramène à la liste, « Télécharger »
   dépose le fichier.
4. `https://app.mobdie.ma/lecteur?src=/admin` répond 403.
5. Une facture émise s'affiche en bleu, un devis expiré en rouge.
