---
suivi: 1841
date: 2026-10-09
sujet: Pièces jointes et brouillons de l'inspection Sage
chantier: factures-electroniques
type: outil
statut: poussé
hash: 05e1e1d9e
fichiers:
  - app/Http/Controllers/Admin/IntacctInspectionBillsController.php
  - app/Services/Intacct/ApbillInspectionService.php
  - app/Services/Intacct/ApbillBrouillonsPage.php
  - app/Services/Intacct/FactureElectroniqueXmlLecteur.php
  - app/Services/Intacct/IntacctDate.php
  - app/Services/Intacct/IntacctLectureSeule.php
  - app/Services/Intacct/SupdocPiecesLecture.php
  - resources/js/Pages/Admin/Intacct/InspectionBills.vue
  - tests/Unit/Intacct/InspectionPieces1841Test.php
  - tests/Unit/Intacct/IntacctLectureSeuleTest.php
  - public/build/manifest.json
  - public/build/assets/InspectionBills-DtBNZklJ.js
  - public/build/assets/app-CzG4VTKX.js
  - docs/suivi/SUIVI_1841_inspection_pieces_brouillons.md
---

# SUIVI #1841 — pièces jointes et pagination des brouillons

Fiche lue avant le code : #1836 (lecture seule, un RECORDNO par `read`, pas d'octets dans le JSON, droit `GS_DSI` via `m365GroupNames()`). #1570 et #1613 décrivent `lireXmlSeule` et n'élargissent pas le périmètre. Pas d'entrée de journal : écran réservé à la DSI.

## PROMPT ENVOYÉ

Les pièces jointes de l'inspection échouent : Sage refuse une clé texte sur `read` pour un objet personnalisé. Le bill expose `SUPDOCID` (texte) et `SUPDOCKEY` (numérique). Lire d'abord par la clé numérique, sinon par `get` historique. Décoder en mémoire. Lire le XML ou le PDF Factur-X (échéance, mode de paiement, SIREN acheteur). Convertir les dates `2026-10-08` et `10/08/2026` (mois/jour/année). Laisser passer ces lectures dans le garde-fou. Paginer les brouillons (50) et donner le total, y compris par statut.

## SYNTHÈSE

La lecture d'une pièce essaie `read` sur `SUPDOC` avec `SUPDOCKEY`, puis `<get><supdoc><supdocid>`. Le résultat indique `pieces_voie` : `supdockey` ou `get_supdoc`. Une tentative locale sur E-04 / 2660507 n'a pas atteint Sage (identifiants refusés depuis ce poste) : la voie réellement acceptée en production se lit sur l'écran, elle n'est pas devinée ici.

Les dates d'en-tête au format exact AAAA-MM-JJ ou MM/JJ/AAAA passent par `IntacctDate::versIso`. `10/08/2026` devient `2026-10-08`. La valeur Sage d'origine reste affichée à côté.

Les brouillons se lisent par pages de 50 (`offset`). Le total vient de `totalcount`, sinon de l'offset, du nombre renvoyé et du reste. Un comptage groupé par `EINVOICESTATUS` alimente la répartition ; s'il échoue, les pages de lecture seule sont additionnées.

### Mapping

| Affiché | Valeur postée | Champ | Effet |
|---|---|---|---|
| Lister les brouillons | brouillons=1 | — | pages de 50, plus le total |
| Page | page (1 à 500) | offset = (page-1)×50 | la page courante seulement est inspectée |
| lue par clé numérique | — | pieces_voie=supdockey | `read` SUPDOC + SUPDOCKEY |
| lue par identifiant | — | pieces_voie=get_supdoc | `get` + SUPDOCID |
| Sage 10/08/2026 | — | valeur ISO + valeur_sage | mois/jour/année |
| Paiement 59 | — | mode_paiement | prélèvement SEPA |
| SIREN acheteur | — | siren_acheteur | schemeID 0002 |

## DÉPLOIEMENT-TEST

```
git pull origin main
php artisan optimize:clear
php artisan view:clear
```

Pas de migration. Pas de `journal:sync`. Pas de build sur le serveur.

## LEÇON

`read` sur SUPDOC n'accepte que la clé numérique. Le texte `SUPDOCID` passe par `get`. `<get>` est une lecture : le garde-fou refuse toujours create, update, delete et reverse avant d'accepter get. Aucun fichier n'est écrit. `10/08/2026` est le 8 octobre, pas le 10 août. Ne pas inspecter tous les brouillons d'un coup : le total et la page sont deux lectures distinctes.
