---
suivi: 1764
date: 2026-09-30
sujet: Les chèques suivent l'état Sage
chantier: factures / paiement / sage
type: correctif
statut: poussé
hash:
fichiers:
  - app/Services/PaiementAppymtExecutionService.php
  - app/Services/FactureWorkflowService.php
  - app/Services/IntacctPaiementStatusService.php
  - app/Services/FacturePaiementStatutSyncService.php
  - app/Services/ChequeRealignementSageService.php
  - app/Support/PaiementCheque.php
  - app/Support/EtatPaiementSage.php
  - app/Support/FactureFriseEtapePresenter.php
  - app/Support/FactureStatutListePresenter.php
  - app/Http/Controllers/FactureController.php
  - app/Http/Controllers/Admin/ChequeRealignementController.php
  - app/Http/Controllers/Admin/FactureSuperAdminController.php
  - resources/js/Pages/Factures/Show.vue
  - resources/js/Pages/Admin/FacturesSuperadmin/ChequesRealignement.vue
  - resources/js/Pages/Admin/FacturesSuperadmin/Index.vue
  - resources/js/Components/Workflow/WorkflowAideDialog.vue
  - resources/js/constants/workflowAideEtapes.js
  - database/migrations/2026_09_30_154000_add_cheque_emis_to_factures_etat_paiement_sage.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
  - docs/suivi/SUIVI_1764_cheques_suivre_sage.md
---

# SUIVI #1764 — les chèques suivent Sage

## PROMPT ENVOYÉ

PHASE 2, suite du diagnostic #1758. Un chèque ne doit plus passer payé au create APPYMT. La relecture (remontée et Actualiser) suit Sage : Approved = paiement préparé, Delivered = chèque émis, Complete / STATE C / bill payé = payé, Voided = annulation existante. Frise chèque sans Suite ni virement. Outil admin pour réaligner les chèques déjà marqués payés à tort. ACH inchangé. Aucune écriture Sage.

## FICHES LUES

- **#1758** LEÇON : `Printed Check` est marqué payé au create, état Sage Approved, avant impression. La frise de virement repeint alors Déposé sur Suite et Virement exécuté. Le correctif suit cette leçon : le create laisse « Paiement préparé », le payé vient de la relecture.
- **#1570** : Approved n'est pas un paiement ; un payé confirmé ne recule pas tout seul.
- **#1672** : STATE V / VOIDED est l'annulation APPYMT. Le chèque réutilise ce traitement, y compris DISPLAYSTATE Voided.

## CONSTAT

`paiements_intacct.payment_method_sage` est écrit dans `PaiementAppymtExecutionService::executerLigne`, closure de transaction, clé `payment_method_sage` = `$paymentSpec['payment_method']`. Pour un chèque, `PaiementModeReglementMapper::toIntacctPaymentMethod` vaut `IntacctService::APPYMT_PAYMENT_METHOD_PRINTED_CHECK` (`Printed Check`). `PaiementCheque::estMethode` compare cette colonne, pas le libellé ERP. ACH = `ACH` uniquement (`estDecaissementAch`).

## CORRECTIF

Create chèque : `statut = en_paiement`, `etat_paiement_sage = preparation`, `synchroniserApresAppymtCheque` (paiement_effectif reste ouvert). La branche ACH (`synchroniserApresAppymtAch`) n'est pas modifiée. Les autres modes non ACH restent payés au create.

`mapperDepuisDisplayState` est étendu par un drapeau chèque, pas recopié. Hors chèque, Delivered / Confirmed / Approved / STATE P / STATE C sont les mêmes retours qu'avant.

Réalignement : `/admin/factures-superadmin/cheques-realignement`, `GS_ADMIN_ERP` via `m365GroupNames()` brut. Lister ne écrit rien. Réaligner, après confirmation, par lots de 8. Une lecture en échec est « non lue » et n'est pas modifiée. Historique : « Réaligné sur Sage (chèque) par … le … ». Si la facture n'est plus payée, `rouvrirPaiementEffectifEnAttente`.

Hors cet outil, `appliquerEtat` ne fait pas reculer une facture déjà `payee` vers un état autre que payé.

## CLOSURES RELUES

- `PaiementAppymtExecutionService::executerLigne` transaction : inchangée. Elle insère `paiements_intacct` avec `payment_method_sage`. Aucune mise à jour de statut dedans.
- `FacturePaiementStatutSyncService::appliquerEtat` transaction : payé pose `intacct_when_paid` (date Sage) et clôt `paiement_effectif`. `cheque_emis` pose seulement `en_paiement`, sans tâche de virement. Le garde « facture payée » est avant la transaction.
- `ChequeRealignementSageService::appliquer` transaction : une facture, écritures ERP et historique, pas d'appel Sage dedans. La lecture Sage est avant.

## DÉPLOIEMENT-TEST

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

Bundles : `Show-DcD35IQy.js` (fiche facture), `ChequesRealignement-GSva2VMy.js`, `Index-ClqlQF26.js`, `app-Br6mF11v.js`.

1. Nouveau paiement chèque → Paiement préparé, pas payé. Un virement ACH reste comme avant.
2. Sage Delivered → Chèque émis. Complete, STATE C, ou TOTALPAID = total → Payé, date = WHENPAID.
3. Super-admin, Lister : ELIS 2604901-973983, Sage Approved, proposé Paiement préparé. Réaligner : frise corrigée, historique tracé. Sage n'est pas modifié.
4. Facture non lue : rien modifié.

`ChequeSuivreSage1764Test` 7 passed. `IntacctPaiementStatutMappingTest` 14 passed. Le parcours prod (vrai Sage) n'a pas été rejoué depuis ici : la CLI ne joint pas Sage.

## LEÇON

Le mode qui distingue le chèque de l'ACH est `paiements_intacct.payment_method_sage` (`Printed Check`), posé au create. Le statut payé d'un chèque ne se déduit pas de l'existence de l'APPYMT.
