---
suivi: 1768
date: 2026-10-01
sujet: Photos des montants aux jalons de facture
chantier: factures / comptabilisation
type: évolution
statut: poussé
hash:
fichiers:
  - database/migrations/2026_10_01_130000_create_facture_jalons_valeurs_table.php
  - app/Models/FactureJalonValeur.php
  - app/Services/FactureJalonPhotoService.php
  - app/Services/FactureJalonRapportService.php
  - app/Support/FactureJalonEvolutionPresenter.php
  - app/Http/Controllers/FactureEvolutionMontantsController.php
  - app/Services/FactureValidationService.php
  - app/Http/Controllers/DepotFactureController.php
  - app/Http/Controllers/ComptabilisationController.php
  - app/Http/Controllers/FactureController.php
  - app/Services/DepotFactureEngagerWorkflowService.php
  - app/Services/DepotFactureValiderDejaValideService.php
  - app/Services/DepotFactureValiderEtComptabiliserService.php
  - app/Services/FactureDejaRegleeClotureWorkflowService.php
  - app/Services/AcompteIntacctApadvanceService.php
  - app/Services/AvoirIntacctApbillService.php
  - routes/web.php
  - resources/js/Pages/Factures/Show.vue
  - resources/js/Pages/Factures/TableauBord.vue
  - resources/js/Pages/Factures/EvolutionMontants.vue
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - tests/Unit/FactureJalonPhoto1768Test.php
  - public/build/
  - docs/suivi/SUIVI_1768_photos_valeurs_jalons.md
---

# SUIVI #1768 — photos des valeurs financières aux jalons

La photo est un ajout. Une erreur d'écriture est journalisée et ne bloque pas l'action. Pas de rattrapage : les photos commencent au déploiement. L'historique existant reste lisible.

## PROMPT ENVOYÉ

Photographier HT, TVA, TTC, retenues, net à payer et le contexte (facture, fournisseur, marché, poste, ventilations, écritures, analytique, entité, déjà réglée) à l'envoi, à NV1, à NV2, à l'arrivée en comptabilité et à la comptabilisation (valeurs réellement envoyées). Tableau sur la fiche facture. Rapport de période avec export Excel. Signaler toute valeur qui ne se reporte pas telle quelle.

## FICHES LUES

- **Journal, sujet `factures`** — entrée `acomptes-suivi-paiement-2026-09-28` du 30/09, dans les 48 h. Impact : même code, nouvelle ligne en tête, lignes 28-29/09 résumées.
- **#1766 LEÇON** — `Show.vue` est une zone en série. Impact : rebase avant le build, un seul lot front.
- **#1478 / `ComptaTableauBordAcces`** — visibilité compta, direction, admin par `m365GroupNames()`. Impact : la prop est absente pour les autres, pas masquée à l'écran.
- **#1767** — déjà poussé, hors de ce lot.

## CONSTAT

Jalons écrits après le commit de la transaction, jamais dedans.

- Envoi : `DepotFactureController::valider` 2609-2617, après la transaction qui se ferme en 2562. Aussi `DepotFactureEngagerWorkflowService` 205-206 (après la transaction 184) et `DepotFactureValiderDejaValideService` 310-316 (après la transaction 300).
- NV1 / NV2 : `FactureValidationService::syncDepotAfterValidation` 319-324, appelée après la transaction de `validatePendingStep` (fermeture 138). `DepotFactureValiderEtComptabiliserService` 110-117, après la transaction 108. NV1 aussi à l'envoi quand le déposant valide ou que la facture est déjà réglée (`DepotFactureController` 2612-2613, `DepotFactureValiderDejaValideService` 313).
- Arrivée compta : au passage au statut à comptabiliser, dans les mêmes méthodes (après commit). Filet : première ouverture de l'écran (`ComptabilisationController::findDepotComptabilisation` 142-144) et promotion au début de `update` (249-251), avant l'écriture des champs postés. Première photo gagnante.
- Comptabilisation APBILL : payload construit dans `envoyerDepotApbillEtPaiementIntacct` 1642-1792, photo dans `executerComptabilisationApbill` 900-906 seulement si l'envoi est complet, après la mise à jour de statut. Acompte : `AcompteIntacctApadvanceService` 137-143, après `persisterAcompteSageResultat`. Avoir : `AvoirIntacctApbillService` 135-149.

Valeurs qui ne se reportent pas telles quelles jusqu'à Sage :

- Facture simple : si la somme HT des lignes candidates est supérieure à 0,0001, le HT envoyé remplace le HT du dépôt (`ComptabilisationController` 1595-1597). La TVA envoyée est la TVA déductible des lignes (1599), pas `depot.montant_tva`. RG, compte de prorata, finitions, OPC, CIE et pénalités viennent des écritures (`sommesRetenuesApbillDepuisLignesComptables`, 1578-1590), pas des pourcentages de la saisie.
- Acompte : le numéro envoyé est `factures.reference` (206-247), pas le numéro fournisseur du dépôt. Le TTC envoyé est le débit du compte 409100 (`resolveLigneAvanceDepuisEcritures`, 217 et 249). La date envoyée est la date du jour (`advancedate`, 246), pas la date de facture.
- Avoir : le HT photographié est la somme des `trx_amount` des lignes du document négatif (`AvoirIntacctApbillService` 136-145).

Quand la valeur envoyée diffère de la valeur enregistrée, la photo de comptabilisation porte `non_reporte` (champ, motif, valeur enregistrée, valeur envoyée). La fiche l'affiche.

## SYNTHÈSE

Table `facture_jalons_valeurs` (facture, dépôt, jalon, JSON, utilisateur, date). Unique dépôt + jalon. Une mise à jour de ligne est refusée par le modèle. L'écriture est dans le même code que le jalon, hors transaction. Bloc « Évolution des montants » sur la fiche (compta, direction, admin). Rapport `/factures/evolution-montants`, agrégats en PHP, export Excel. Une facture est listée quand un champ diffère entre NV2 (sinon NV1) et la comptabilisation. L'origine « report » = l'écart existe déjà avant la comptabilisation ; « saisie » = il n'apparaît qu'entre le jalon précédent et la comptabilisation.

## DÉPLOIEMENT-TEST

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

1. Une facture envoyée, validée NV1, validée NV2, ouverte en compta, comptabilisée : cinq photos.
2. Modifier le HT en compta avant l'envoi : la cellule HT est surlignée entre l'arrivée et la comptabilisation, avec l'auteur.
3. Le rapport de la période la liste, champ HT.
4. Une photo qui échoue n'empêche pas la validation (`FactureJalonPhoto1768Test`).

## LEÇON

Une erreur SQL attrapée à l'intérieur d'une transaction InnoDB peut quand même l'annuler. La photo se prend après le commit du jalon. Le HT, la TVA et les retenues envoyés à Sage ne sont pas une copie du dépôt : les lire sur le payload, et signaler l'écart.
