feat(transport) : synchronisation du référentiel codes IDTF (ERP-149) #101

Merged
matthieu merged 16 commits from feat/erp-149-idtf-sync into develop 2026-06-15 15:45:25 +00:00
Owner

ERP-149 — Récupération des codes IDTF (transport routier)

⚠️ MR empilée sur feat/erp-39-qualimat-sync (PR #99), elle-même sur la PR #97. Ordre de merge : #97#99 → celle-ci. Les bases se recibleront automatiquement.

Commande console app:idtf:sync : récupère l'export Excel des codes IDTF (régimes de nettoyage transport) depuis icrt-idtf.com, le parse et synchronise une table référentielle. Scope road ; discriminant schema road/water conservé pour un futur fluvial.

Contenu

  • Migration Version20260612160000 (namespace racine) : idtf_product + idtf_sync_log, COMMENT ON COLUMN sur chaque colonne, unique (schema, idtf_number), cas_numbers JSONB, soft-delete.
  • IdtfSheetParser : parsing pur d'une matrice (sans dépendance PhpSpreadsheet) — détection dynamique de la ligne d'en-tête, mapping par libellé normalisé (résiste au réordonnancement), CAS split sur ;, date dd-mm-yyyy → ISO + checkdate, skip des lignes non numériques.
  • SyncIdtfCommand : options --schema (road|water) / --file / --dry-run. POST avec les 10 fields[] explicites (le piège fields[]=all ne sort que 6 colonnes) → export 11 colonnes ; garde-fou content-type/signature ZIP. Upsert DBAL transactionnel + soft-delete + journal.
  • Cible make idtf-sync.

Tests

  • Unitaires (IdtfSheetParser : en-tête dynamique, mapping, CAS, date, skip, ordre de colonnes).
  • Fonctionnels de la commande via un .xlsx généré par PhpSpreadsheet (parsing → upsert → journal → soft-delete + schéma invalide rejeté).
  • Suite complète 608 verte (hors flaky JWT connu). ColumnsHaveSqlCommentTest .
  • Bout-en-bout réel : sync de 687 codes IDTF (road).

Décisions

  • Migration namespace racine (convention réelle ; pas de FK cross-module).
  • Aucun changement Composer : phpoffice/phpspreadsheet était déjà une dépendance (^5.7) — le bump initial vers ^5.8 a été reverté.
  • Réutilise framework.http_client activé par la PR QUALIMAT (raison de l'empilement sur #99).
## ERP-149 — Récupération des codes IDTF (transport routier) > ⚠️ MR **empilée** sur `feat/erp-39-qualimat-sync` (PR #99), elle-même sur la PR #97. Ordre de merge : **#97 → #99 → celle-ci**. Les bases se recibleront automatiquement. Commande console `app:idtf:sync` : récupère l'export Excel des codes IDTF (régimes de nettoyage transport) depuis icrt-idtf.com, le parse et synchronise une table référentielle. Scope **road** ; discriminant `schema` road/water conservé pour un futur fluvial. ### Contenu - **Migration** `Version20260612160000` (namespace racine) : `idtf_product` + `idtf_sync_log`, `COMMENT ON COLUMN` sur chaque colonne, unique `(schema, idtf_number)`, `cas_numbers` JSONB, soft-delete. - **`IdtfSheetParser`** : parsing **pur** d'une matrice (sans dépendance PhpSpreadsheet) — détection **dynamique** de la ligne d'en-tête, mapping par libellé normalisé (résiste au réordonnancement), CAS split sur `;`, date `dd-mm-yyyy` → ISO + `checkdate`, skip des lignes non numériques. - **`SyncIdtfCommand`** : options `--schema` (road|water) / `--file` / `--dry-run`. POST avec les **10 `fields[]` explicites** (le piège `fields[]=all` ne sort que 6 colonnes) → export 11 colonnes ; garde-fou content-type/signature ZIP. Upsert DBAL transactionnel + soft-delete + journal. - Cible `make idtf-sync`. ### Tests - Unitaires (`IdtfSheetParser` : en-tête dynamique, mapping, CAS, date, skip, ordre de colonnes). - Fonctionnels de la commande via un `.xlsx` **généré** par PhpSpreadsheet (parsing → upsert → journal → soft-delete + schéma invalide rejeté). - Suite complète **608** verte (hors flaky JWT connu). `ColumnsHaveSqlCommentTest` ✅. - Bout-en-bout réel : sync de **687 codes IDTF** (road). ### Décisions - Migration **namespace racine** (convention réelle ; pas de FK cross-module). - **Aucun changement Composer** : `phpoffice/phpspreadsheet` était déjà une dépendance (^5.7) — le bump initial vers ^5.8 a été reverté. - Réutilise `framework.http_client` activé par la PR QUALIMAT (raison de l'empilement sur #99).
tristan added the type/featbackdb labels 2026-06-12 13:49:54 +00:00
tristan marked the pull request as work in progress 2026-06-12 13:53:34 +00:00
matthieu marked the pull request as ready for review 2026-06-15 13:58:41 +00:00
matthieu changed target branch from feat/erp-39-qualimat-sync to develop 2026-06-15 14:40:19 +00:00
matthieu added 9 commits 2026-06-15 14:40:19 +00:00
feat(transport) : créer le module Transport (ERP-150)
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 2m29s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m41s
5f3da7022b
Module Transport (ID transport, non requis) destiné à héberger les référentiels externes synchronisés par commandes console (codes IDTF ERP-149, transporteurs QUALIMAT ERP-39).

- TransportModule.php avec permissions() vide à ce stade
- activation dans config/modules.php
- layer Nuxt front minimal (pas d'écran ni d'item sidebar)
Commande console app:qualimat:sync : récupère les opérateurs de transport agréés depuis l'API publique qualimat.org, normalise et synchronise une table référentielle (upsert sur le SIRET + soft-delete des absents + journal). Prévue pour un cron quotidien.

- migration : tables qualimat_carrier + qualimat_sync_log (COMMENT ON COLUMN sur chaque colonne)
- QualimatRowMapper : normalisation pure (SIRET sans espaces, date dd/mm/yyyy -> ISO, skip sans SIRET) + tests unitaires
- SyncQualimatCommand : options --file / --ppp / --dry-run, upsert DBAL transactionnel
- activation de framework.http_client
- tests fonctionnels de la commande (upsert/normalisation/journal/soft-delete)
Commande console app:idtf:sync : récupère l'export Excel des codes IDTF (régimes de nettoyage transport) depuis icrt-idtf.com, le parse et synchronise une table référentielle (upsert sur (schema, idtf_number) + soft-delete + journal). Scope road ; discriminant schema road/water conservé.

- migration : tables idtf_product + idtf_sync_log (COMMENT ON COLUMN sur chaque colonne, unique (schema, idtf_number), cas_numbers JSONB)
- IdtfSheetParser : parsing pur d'une matrice (détection dynamique de l'en-tête, mapping par libellé, CAS split, date dd-mm-yyyy -> ISO) + tests unitaires
- SyncIdtfCommand : options --schema / --file / --dry-run, POST avec fields[] explicites (export 11 colonnes), upsert DBAL transactionnel
- cible make idtf-sync
- tests fonctionnels via .xlsx généré (parsing/upsert/journal/soft-delete)

Réutilise framework.http_client (activé pour QUALIMAT, ERP-39). phpoffice/phpspreadsheet déjà présent.
Remplace l'UA 'Starseed-ERP' par un UA navigateur neutre : évite les filtres anti-bot des sources (qualimat.org WordPress/WAF, icrt-idtf.com) sans révéler l'application.
- garde-fou anti-desactivation de masse : fetchRemote leve sur un payload
  non-list (2xx inattendu) et la commande abandonne sans ecriture si aucune
  ligne exploitable, au lieu de soft-delete tout le referentiel
- verrou consultatif pg_try_advisory_lock pour serialiser les runs (anti-overlap)
- deduplication par SIRET dans le mapper (rows_upserted = transporteurs distincts)
- upsert par paquets (INSERT groupe) au lieu d'un aller-retour par ligne
- migration des tables qualimat deplacee vers le namespace modulaire Transport
  (+ enregistrement du path dans doctrine_migrations.yaml)
- tests : deduplication + abandon sur source vide
Merge remote-tracking branch 'origin/develop' into feat/erp-150-module-transport
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 2m42s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m28s
5def89c7f3
# Conflicts:
#	config/modules.php
matthieu added 1 commit 2026-06-15 14:45:17 +00:00
Merge remote-tracking branch 'origin/develop' into feat/erp-149-idtf-sync
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Has been cancelled
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Has been cancelled
b1b1da69db
# Conflicts:
#	config/packages/http_client.yaml
#	makefile
matthieu added 1 commit 2026-06-15 14:45:34 +00:00
Merge branch 'develop' into feat/erp-149-idtf-sync
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Failing after 2m38s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m22s
f9042c4768
matthieu added 1 commit 2026-06-15 15:10:34 +00:00
Merge branch 'develop' into feat/erp-149-idtf-sync
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Failing after 2m35s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Has been cancelled
67bf03f844
matthieu added 1 commit 2026-06-15 15:14:44 +00:00
Merge branch 'develop' into feat/erp-149-idtf-sync
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Has been cancelled
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Has been cancelled
28ddfafb71
matthieu added 1 commit 2026-06-15 15:19:15 +00:00
fix(transport) : exclure les tables IDTF du schema_filter Doctrine (ERP-149)
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 2m38s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m25s
b51c3821a8
Les tables idtf_product / idtf_sync_log sont des referentiels DBAL bruts
(sans entite ORM, synchronises par app:idtf:sync). Sans exclusion du
schema_filter, doctrine:schema:update --force les droppe juste apres la
migration dans test-db-setup, cassant SyncIdtfCommandTest (relation
"idtf_product" does not exist). Meme correctif que QUALIMAT (#99).
matthieu added 1 commit 2026-06-15 15:25:50 +00:00
Merge branch 'develop' into feat/erp-149-idtf-sync
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Has been cancelled
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Has been cancelled
521c1dec9f
matthieu added 1 commit 2026-06-15 15:31:12 +00:00
Merge branch 'develop' into feat/erp-149-idtf-sync
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 2m33s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m23s
6f545ea1f4
matthieu merged commit f9fec3e908 into develop 2026-06-15 15:45:25 +00:00
matthieu deleted branch feat/erp-149-idtf-sync 2026-06-15 15:45:26 +00:00
Sign in to join this conversation.