---
suivi: 1739
date: 2026-09-28
sujet: Test d'envoi d'un relevé bancaire vers Sage
chantier: tresorerie
type: evolution
statut: poussé
hash:
fichiers:
  - app/Services/IntacctService.php
  - app/Services/ReleveBancaireSuiteEntrepriseParser.php
  - app/Services/ReleveBancaireSageEnvoiTestService.php
  - app/Models/ReleveBancaireSageEnvoiTest.php
  - app/Http/Controllers/Admin/ReleveBancaireSageLectureController.php
  - database/migrations/2026_09_28_173900_create_releves_sage_envois_test_table.php
  - routes/web.php
  - resources/js/Pages/Admin/RelevesBancairesSage/Index.vue
  - tests/Unit/ReleveBancaireSageEnvoi1739Test.php
  - public/build/
  - docs/suivi/SUIVI_1739_test_envoi_releve_sage.md
---

# SUIVI #1739 — test d'envoi d'un relevé vers Sage

## PROMPT ENVOYÉ

Première écriture réelle de transactions bancaires dans Sage, un compte (512266), un fichier Suite Entreprise, déclenchée à la main après confirmation. Dépôt et aperçu sans écriture. Anti-doublon. Envoi d'un seul `create BANKACCTTXNFEED` `xml`, réponse brute, relecture. Aucun autre compte, aucun envoi automatique, pas de journal utilisateur.

## SYNTHÈSE

Fiches lues : `SUIVI_1726` (leçon : les imports écran sont des flux `onl`, l'API crée des `xml` ; la session de lecture passe par `lireXmlSeule`, entité du compte ou top-level si `location_id` vide). L'envoi reprend exactement ce choix de session via `envoyerXmlSessionLecture`. Aucune autre fiche de relevé ne changeait l'approche.

Le dépôt reconnaît le profil par ses en-têtes, refuse un format inconnu, n'accepte qu'un IBAN, et n'accepte le fichier que si cet IBAN est celui du compte 512266 dans `intacct_financial_entities.bank_account_no`. Sinon le message montre l'IBAN du fichier et celui de 512266. Une référence en notation scientifique ou vide est reprise après « Reference: ». L'aperçu affiche date, description (libellé + référence), montant, dépôt ou retrait, référence réparée, totaux, compte.

La table `releves_sage_envois_test` retient les lignes envoyées (empreinte unique). Une ligne déjà envoyée est affichée « déjà envoyée » et n'entre pas dans le XML. Rien n'est marqué si Sage échoue ou ne renvoie pas de RECORDNO. Le bouton « Envoyer à Sage (test) » exige la case « Ces transactions ne sont pas déjà dans Sage sur ce compte ».

Closures relues : filtres « déjà envoyée » (aperçu, envoi, compteur) — ils excluent la ligne du XML, ils n'appellent pas Sage ; filtres et maps du parseur (lignes vides, en-têtes, cellules) — lecture seule ; transaction `marquerEnvoyees` — verrou puis création, saut si l'empreinte existe déjà, exception journalisée avec trace et remontée, appelée seulement après un RECORDNO.

Tests PHPUnit : 5 passed (56 assertions). L'envoi réel et le rapprochement dans l'écran Sage sont à faire par Robin et la compta après déploiement. Aucun appel Sage depuis la CLI.

## DÉPLOIEMENT-TEST

git pull origin main
php artisan view:clear
php artisan route:clear
php artisan migrate --force

Pas de journal:sync.

1. Déposer le fichier de test : compte 512266, 5 lignes, référence du 09/07 = 0110270050488, totaux dépôts 3 992,40 €, retraits −4 277,16 €, solde −284,76 €.
2. Un autre IBAN est refusé, avec les deux IBAN affichés.
3. Robin envoie depuis la page. Le RECORDNO du flux s'affiche, puis la relecture.
4. Redépôt : 5 lignes « déjà envoyée », bouton inactif.
5. La compta dit si les 5 lignes apparaissent dans le rapprochement du compte 512266 et si elles se rapprochent à la main. Ce résultat n'est pas connu ici.

## LEÇON

`lireXmlSeule` refuse tout `create`. L'écriture de test passe par une méthode séparée qui choisit la même session (entité du compte, sinon top-level). Un retrait part avec un montant négatif. Ne pas marquer les lignes envoyées tant que Sage n'a pas renvoyé un RECORDNO.
