---
suivi: 1614
date: 2026-09-18
sujet: Sonde temporaire APADVANCE (inspect / lookup / readByQuery / create vide opt-in)
chantier: comptabilite / sage / diagnostic
type: diagnostic
statut: poussé
hash: e45e4bdd
fichiers:
  - app/Http/Controllers/Admin/IntacctController.php
  - routes/web.php
  - tests/Unit/IntacctProbeApadvance1614SourceTest.php
  - tests/Feature/IntacctProbeApadvance1614Test.php
  - tests/Feature/ComptabiliteParametrageAccessTest.php
  - docs/suivi/SUIVI_1614_sonde_apadvance.md
---

# SUIVI #1614 — sonde temporaire APADVANCE

## PROMPT ENVOYÉ

Sonde jetable, lecture seule, route web GS_DSI. Trancher : le tenant
Hectare expose-t-il APADVANCE en XML ; noms exacts (ID + LABEL +
VALIDVALUES) ; l’objet est-il créable via `<create>` générique.
Aucune fonctionnalité métier. Pas de CLI. Create vide uniquement si
`confirm_create_probe=1`.

## FICHES LUES

- **#1613 LEÇON** — `sendRequest` public suffit ; `readByQueryPaginated`
  reste privé ; `m365GroupNames()` brut (middleware `m365.groups` et
  `Gate::before` laissent passer GS_ADMIN_ERP). Impact : route dans
  le groupe GS_DSI **et** `in_array('GS_DSI', $user->m365GroupNames())`
  dans le contrôleur. Séquence A.5 reprise, sans `<query>` structuré
  (hors demande #1614).
- **#1610 LEÇON** — objet XML APADVANCE / APADVANCEITEM, zéro usage
  applicatif. Impact : la sonde ne suppose aucun nom de champ.
- **#1612 LEÇON** — workflow ACOMPTE déjà en prod, hors périmètre.
  Impact : aucun fichier #1612 touché.
- **#1570 / #212** — sonde web, jamais `fields=*`. Impact : liste
  explicite dérivée du lookup.

## SYNTHÈSE

Route temporaire `GET /admin/intacct/probe-apadvance` sur
`IntacctController::probeApadvance`. Séquence : inspect APADVANCE →
lookup APADVANCE (livrable central ID/LABEL/VALIDVALUES) → lookup
APADVANCEITEM → readByQuery pagesize 1 champs explicites → si
`reference`, un readByQuery par champ de rapprochement confirmé par
le lookup (DOCNUMBER, RECORDID, REFERENCENUMBER, DESCRIPTION).
Create vide `<APADVANCE></APADVANCE>` seulement si
`confirm_create_probe=1`. IntacctService inchangé. Aucune écriture
ERP, aucun .vue, pas de journal.

## DÉPLOIEMENT-TEST

1. `git pull origin main`
2. `php artisan optimize:clear` + `view:clear` + `route:clear`
3. Compte **GS_DSI** (pas seulement GS_ADMIN_ERP).
4. Appeler les URLs du livrable (lecture, puis create opt-in).
5. Retirer la route après lecture.

## LEÇON

`m365.groups:GS_DSI` ne suffit pas : `EnsureM365GroupMembership`
short-circuite `isAdminERP()`. Le 403 utile est
`in_array('GS_DSI', $user->m365GroupNames(), true)`. `sendRequest`
renvoie le XML **parsé** (comme probeFinancialEntities) : ne pas
ouvrir IntacctService pour le XML brut. Un lookup APADVANCEITEM
en échec ne doit pas bloquer la lecture de l’entête (témoin DACOS).
Le create vide est l’oracle de créabilité : le message Sage brut
tranche, pas la classification PHP.
