---
suivi: 1953
date: 2026-10-16
sujet: Correctif FE — balises Sage vides et historique d’envoi
chantier: factures-electroniques / comptabilisation
type: fix
statut: poussé
hash: 2eaed5212
fichiers:
  - app/Intacct/SageScalaire.php
  - app/Intacct/Functions/AccountsPayable/ExtBillUpdate.php
  - app/Services/FactureElectronique/FactureElectroniqueComptabilisation.php
  - app/Http/Controllers/ComptabilisationController.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - tests/Unit/FactureElectroniqueArrayToString1953Test.php
  - docs/suivi/SUIVI_1953_correctif_fe_array_to_string_brouillon.md
---

## PROMPT ENVOYÉ

PHASE 2 du diagnostic #1951. Helper scalaire pour tous les champs lus depuis la réponse Sage (balise vide = tableau vide). Journal avec pile, message utilisateur sans pile. L’entrée intacct_envoyee seulement après un envoi réussi ; en échec, tentative d’envoi échouée. LINE_NO = remplacement. Pas de second bill, pas d’APPYMT, create classique inchangé, doublons #1952 intacts.

## Fiches lues

- #1951 LEÇON : json_encode(SimpleXML) transforme une balise vide en []. Le (string) de alignerLignesAvecBrouillon plante avant l’envoi. Les tests #1948 passaient des chaînes, jamais [].
- #1948 LEÇON : sans LINE_NO, Sage ajoute une ligne. Lire APBILLITEM avant Submit. VENDORID par ligne.
- #1853 LEÇON : le brouillon électronique se met à jour, il ne se recrée pas. Pas de paiement sur ce chemin.
- #1952 LEÇON : le contrôle de doublon probable n’est pas modifié ici.

## SYNTHÈSE

`SageScalaire` lit un champ Sage : tableau vide ou null devient une chaîne vide ; sinon le premier scalaire non vide. `alignerLignesAvecBrouillon` et `ExtBillUpdate` passent par ce helper pour LINE_NO, PARENTENTRY, VENDORID, LOCATIONID, CLASSID, PROJECTID, DEPARTMENTID, ACCOUNTNO, TRX_AMOUNT et les autres champs de ligne. Une ligne exonérée dont Sage renvoie des balises vides s’aligne et produit un ExtBillUpdate avec LINE_NO, sans ajout de ligne.

L’historique « Envoyée à Sage » n’est écrit qu’après le retour de l’envoi. Un échec écrit « Tentative d’envoi échouée » et le motif court. Le journal d’erreur contient l’exception (fichier, ligne, pile), le dépôt et le numéro Sage. La réponse à l’écran reste le message court.

## DÉPLOIEMENT-TEST

```bash
git pull origin main
php artisan optimize:clear
php artisan view:clear
php artisan journal:sync
```

Tinker lecture seule, dépôt 2541, aucun envoi :

```bash
php artisan tinker --execute='$d=App\Models\DepotFacture::query()->findOrFail(2541); $s=new App\Services\FactureElectronique\FactureElectroniqueSage(app(App\Services\IntacctService::class)); $c=new App\Services\FactureElectronique\FactureElectroniqueComptabilisation; $e=trim((string)$d->intacct_brouillon_entite); $r=trim((string)$d->intacct_brouillon_recordno); $b=$s->brouillon($e,$r); $l=$s->lignesBrouillon($e,$r); echo "STATE=".$c->champ(is_array($b)?$b:[],"STATE")." nb=".count($l)."\n"; $a=$c->alignerLignesAvecBrouillon([["accountno"=>"627800","trx_amount"=>"58.26","location_id"=>"E-04"]],$l,"DUMMY-VENDOR"); echo "align OK n=".count($a)."\n"; echo App\Intacct\Functions\AccountsPayable\ExtBillUpdate::fonction(["control_id"=>"diag1953","recordno"=>$r,"vendor_id"=>"DUMMY-VENDOR","when_due"=>"10/31/2026","lines"=>$a]); echo "\nNON ENVOYE\n";'
```

Attendu : `align OK`, XML `<update>` avec `<LINE_NO>`, pas d’exception, aucune écriture Sage.

## LEÇON

Toute lecture d’un champ APBILLITEM issu de xmlToArray passe par SageScalaire. Un (string) direct sur une balise vide redevient « Array to string conversion » avant l’envoi, et l’historique « envoyée » écrit avant le try ment sur un échec.
