---
suivi: 1334
date: 2026-08-13
sujet: reprise_siwi_suggestion_tva
chantier: marches_reprise
type: feature
statut: poussé
hash: 0f2f8d2b
fichiers:
  - app/Support/Siwi/SiwiTauxTva.php
  - app/Services/SiwiImportService.php
  - app/Services/SiwiRepriseActionService.php
  - app/Services/SiwiImportPageService.php
  - app/Http/Controllers/SiwiImportController.php
  - app/Models/SiwiMarche.php
  - database/migrations/2026_08_13_190000_add_suggestion_travail_to_siwi_marches_table.php
  - routes/web.php
  - resources/js/Pages/SiwiImport/Index.vue
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
  - docs/suivi/SUIVI_1334_reprise_siwi_suggestion_tva.md
---

## PROMPT ENVOYÉ

SUIVI #1334 — TVA ratio→%, Suggestion ERP éditable (TRAVAIL), bouton
« Tous les programmes », aperçu SIWI grisé, flèche décorative.

## SYNTHÈSE

### Fiches lues
- `#1325` : dépliage / filtres — conservés ; bouton retour liste.
- `#1326` : création marchés — `tauxTvaPourMarche` utilisait le ratio brut
  (défaut ACTIF si staging = 0.2).
- `#1328` : blocages RG — non défait.
- `#1332` : commune — non touché (`CommuneSearchService` interdit).
- HEAD réel au départ : `22868fb1` (#1333), pas `19b34937`.

### DÉFAUT 1 — TVA
**Lieu UNIQUE** : `App\Support\Siwi\SiwiTauxTva::versPourcentage` appelé à
l’**import** (`SiwiImportService::qualifyMarche`) pour stocker le % en staging.
Même helper (idempotent) à la création (`tauxTvaPourMarche`) et à l’affichage
page — pas de formule ×100 ailleurs. Preuve : `0.2→20→20`, `0.0200→2`,
`0.1068→10.68`, `0→0`, `20→20`.
Marchés ERP déjà créés avec `reference_siwi` et `taux_tva < 1` : **0 en local**
(à revérifier en prod). Pas de correction de masse.
TTC à la création : `Marche::montantTotalTtcCalcule()` (plus de ×1.2 en dur).

### OBJET 2 — Suggestion ERP
Colonnes TRAVAIL ajoutées : `intitule_retenu`, `montant_ht_retenu`,
`facture_ht_retenu`, `pct_rg_retenu`, `rg_retenue_ht_retenu` (+ existants
`poste_retenu_*`, `note_arbitrage`). Hors `MARCHES_SOURCE_COLUMNS` → import
n’écrase pas. Route `PATCH …/suggestion`. États idle/loading/ok/error.

### OBJET 3–5 — UI
Bouton sticky + filtres « Tous les programmes » ; compteur `reste_a_traiter` ;
aperçu SIWI fond `#F3F4F6` + mention ; flèche → / ↓ `aria-hidden`.

### Test 12 — « entre vignes »
`normalize('entre vignes')='entre vignes'` ≠ `normalize('Entre-Vignes')='entre-vignes'`.
**SIGNAL** : si le référentiel prod a un tiret dans `nom_ascii`, la recherche
sans tiret échoue. `CommuneSearchService` non modifié (garde-fou). Local seed
sans tiret : trouvé.

### Vérification écran
**NON faite** (pas de session M365 / prod). Lot **non validé écran**.

## DÉPLOIEMENT-TEST

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

Puis rejouer `siwi:import --apply` pour normaliser les `taux_tva` staging en %.

## LEÇON

Un ratio CSV (0.2) stocké tel quel dans un champ ERP « pourcentage » crée des
marchés à 0,2 % — convertir **une fois** à l’entrée staging, helper idempotent
partout ailleurs.
