matthieu
1ef0560604
Merge branch 'develop' into fix/erp-193-retours-metier
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
2026-06-19 13:08:14 +00:00
tristan
833d992ebb
fix(transport) : onglet Contact transporteur non obligatoire + navigation onglets (ERP-193)
...
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 46s
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 3m24s
- retrait de la regle « prenom OU nom » sur le bloc Contact : garde
CarrierContactProcessor::validateName supprimee, CHECK chk_carrier_contact_name
droppe (migration Version20260619120000), commentaires SQL/catalogue alignes
- front : gating « + Nouveau contact » sur bloc non vide (au lieu de « nomme »),
onglet Contact vide finalisable sans creer de contact
- Prix accessible des la validation des Adresses (Contacts optionnel ne bloque plus)
- consultation <-> edition : on retombe sur le meme onglet via ?tab=
2026-06-19 14:53:52 +02:00
tristan
c11d7822ce
refactor(front) : champs anti-parasites via masks maska (filtrage natif, focus/curseur OK) au lieu du sanitizer @update ; email sans masque (ERP-193)
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
2026-06-19 14:25:26 +02:00
tristan
e66615d40b
fix(transport) : immatriculations LIOT filtrées via mask maska (focus/curseur natifs, plus de hack) (ERP-193)
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Failing after 12m13s
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Has been cancelled
2026-06-19 14:10:49 +02:00
tristan
6d3122a0b8
fix(transport) : immatriculations LIOT — re-synchronise le champ après filtrage (:key) pour ne plus afficher les caractères interdits (ERP-193)
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Failing after 15m5s
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Failing after 15m7s
2026-06-19 12:02:56 +02:00
tristan
fa00a2b6e1
fix(transport) : immatriculations LIOT sur 3 colonnes en consultation aussi (ERP-193)
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
2026-06-19 11:52:24 +02:00
tristan
a98f58cb33
feat(transport) : immatriculations LIOT sur 3 colonnes + filtre saisie (lettres/chiffres/tiret/point-virgule) (ERP-193)
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Has been cancelled
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Has been cancelled
2026-06-19 11:50:05 +02:00
tristan
ab33b09bc0
fix(transport) : tableau prix — bord droit Transport noir uniforme (couleur de bordure bas side-specific) (ERP-193)
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
2026-06-19 11:36:45 +02:00
tristan
023f70dd1d
fix(transport) : tableau prix — trait fin entre lignes d'une même adresse, épais entre adresses (ERP-193)
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
2026-06-19 11:34:15 +02:00
tristan
c243232799
fix(transport) : tableau prix — pas de trait entre les lignes d'une même adresse de livraison (ERP-193)
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
2026-06-19 11:29:29 +02:00
tristan
cdd43960cd
fix(transport) : tableau prix — regroupement et tri par adresse de livraison, contenant par ligne (ERP-193)
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
2026-06-19 11:17:47 +02:00
tristan
9a42c432f8
fix(transport) : tableau prix — colonnes séparées, ordre Adresse livraisons puis Adresse sites (ERP-193)
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 2m19s
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 3m36s
2026-06-19 11:10:17 +02:00
tristan
865e580b6e
fix(transport) : tableau prix — colonne Fournisseurs/Clients, fusion adresses sites/livraisons, renomme Transport (ERP-193)
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m55s
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 3m19s
2026-06-19 10:50:25 +02:00
tristan
0ad4a739ca
style : bouton Archiver en rouge (variant danger) sur les 4 consultations (ERP-193)
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 2m16s
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 3m39s
2026-06-19 10:13:52 +02:00
tristan
cdcc7d1e75
feat : grise les champs en consultation et onglets validés (readonly → disabled) (ERP-193)
2026-06-19 09:48:49 +02:00
tristan
07f5a95a6b
feat : bloque les caractères spéciaux dans les champs texte des 4 répertoires (ERP-193)
2026-06-19 09:46:23 +02:00
gitea-actions
6c938756cc
chore: bump version to v0.1.146
Auto Tag Develop / tag (push) Successful in 6s
Build & Push Docker Image / build (push) Successful in 2m8s
v0.1.146
2026-06-19 07:35:42 +00:00
matthieu
ac1a51a7f4
fix(prod) : droits www-data sur le volume de logs ( #138 )
...
Auto Tag Develop / tag (push) Successful in 8s
## Problème
Le volume nommé `starseed_logs` est monté sur `/var/www/html/var/log` (docker-compose.prod.yml), mais ce dossier **n'existe pas dans l'image**. Au premier montage d'un volume vide, Docker crée le point de montage en `root:root`, ce qui empêche `www-data` (le worker php-fpm) d'écrire les logs → crash de l'application.
Même problème que celui rencontré et patché à la main sur Lesstime.
## Correctif
Ajout de `var/log` au `mkdir -p` du Dockerfile, avant le `chown -R www-data:www-data`. Ainsi tout volume de logs neuf hérite automatiquement des droits `www-data` — plus besoin de chown manuel.
## Déploiement
Nécessite un rebuild + push de l'image pour prendre effet en prod.
---------
Co-authored-by: Matthieu <contact@malio.fr >
Reviewed-on: #138
2026-06-19 07:35:34 +00:00
tristan
403dc4a870
feat(commercial) : interdit les dates de création futures sur client/fournisseur (ERP-193)
2026-06-18 16:53:07 +02:00
tristan
745b03083c
feat(commercial) : plafonne le chiffre d'affaires client/fournisseur à 999 999 999 999,99 (ERP-193)
2026-06-18 16:34:12 +02:00
tristan
868141e324
fix(front) : masque les onglets vides en consultation des 4 repertoires (ERP-193)
2026-06-18 16:15:41 +02:00
tristan
86507486a4
fix(front) : renomme la colonne « Dernière activité » en « Dernière modification » (ERP-193)
2026-06-18 15:58:46 +02:00
tristan
29aa9b352d
fix(front) : pagination par defaut a 25 sur les repertoires (ERP-193)
2026-06-18 15:53:25 +02:00
gitea-actions
a9935fbf97
chore: bump version to v0.1.145
Auto Tag Develop / tag (push) Successful in 7s
Build & Push Docker Image / build (push) Successful in 24s
v0.1.145
2026-06-18 13:33:48 +00:00
matthieu
36e947fd8e
test(logistique) : tests PHPUnit RG-5.01→5.10 + capture contrat JSON (ERP-187) ( #137 )
...
Auto Tag Develop / tag (push) Successful in 8s
## ERP-187 (1.7) — Tests PHPUnit RG-5.01→5.10 + capture contrat JSON
Couvre les règles de gestion du M5 (tickets de pesée) par des tests PHPUnit et capture la **réponse JSON réelle** (DoD § 4.0.bis) collée dans `spec-back.md` avant les écrans front.
### Tests unitaires (Processor / Normalizer / Callback — sans BDD ni HTTP)
- **NetWeightTest** (RG-5.05) : net = plein − vide, `null` si une pesée manque, recalcul au PATCH.
- **CounterpartyValidationTest** (RG-5.03) : présence du champ requis par branche (propertyPath `client`/`supplier`/`otherLabel`) + exclusivité (null-ification hors-branche).
- **ImmatriculationNormalizationTest** (RG-5.01/5.10) : masque `XX-000-XX`, « Tout format », mapping 422 sur `immatriculation`.
### Tests fonctionnels (API réelle)
- **WeighingTicketNumberingTest** (RG-5.02/5.09) : format `{siteCode}-TP-{NNNN}`, séquence par site, isolation inter-sites, immuabilité numéro/site au PATCH.
- **WeighingTicketSerializationContractTest** (DoD § 4.0.bis) : 4 pièges verts (client embarqué, `plateFreeFormat` présent, `number` formaté, `netWeight` = full − empty) + dump JSON via `WEIGHING_TICKET_DOD_DUMP`.
- **WeighingTicketRBACMatrixTest** (§ 5.2) : admin/bureau/usine OK, compta/commerciale 403, anonyme 401.
> DSD / stub pont bascule / endpoint pesée déjà couverts (ERP-184/185).
### DoD
- `spec-back.md § 4.0.bis` : **JSON réel** (liste + détail) collé, 4 pièges marqués ✅ — feu vert front.
### Vérifications
- `make test` complet **vert** : 848 tests, 6302 assertions (0 échec ; deprecations/notices PHPUnit seuls).
- `make php-cs-fixer-allow-risky` : 0 correction.
Empilée sur ERP-186 (stack M5).
---------
Co-authored-by: Matthieu <contact@malio.fr >
Reviewed-on: #137
2026-06-18 13:33:39 +00:00
gitea-actions
b4e550b5de
chore: bump version to v0.1.144
Auto Tag Develop / tag (push) Successful in 6s
Build & Push Docker Image / build (push) Successful in 20s
v0.1.144
2026-06-18 12:51:24 +00:00
matthieu
10c113dbad
Merge pull request 'feat(logistique) : export XLSX des tickets de pesée (ERP-186)' ( #136 ) from feat/erp-186-export-xlsx-tickets-pesee into develop
Auto Tag Develop / tag (push) Successful in 8s
2026-06-18 12:47:16 +00:00
matthieu
c0dadd79ff
Merge pull request 'feat(logistique) : WeighingTicketProvider + Processor — numérotation, contrepartie, net, normalisation (ERP-185)' ( #135 ) from feat/erp-185-provider-processor-weighingticket into develop
Auto Tag Develop / tag (push) Successful in 7s
2026-06-18 12:47:11 +00:00
matthieu
1ffa38282a
Merge pull request 'feat(logistique) : pesée pont bascule stub + DSD + endpoint (ERP-184)' ( #134 ) from feat/erp-184-pesee-pont-bascule into develop
Auto Tag Develop / tag (push) Successful in 6s
2026-06-18 12:47:06 +00:00
matthieu
036b075d5e
Merge pull request 'feat(logistique) : entité WeighingTicket + dette site.code (ERP-183)' ( #133 ) from feat/erp-183-entite-weighingticket into develop
Auto Tag Develop / tag (push) Successful in 7s
2026-06-18 12:47:04 +00:00
matthieu
25466b18d8
Merge pull request 'feat(logistique) : migration schéma M5 tickets de pesée (ERP-182)' ( #132 ) from feat/erp-182-migration-m5 into develop
Auto Tag Develop / tag (push) Successful in 8s
2026-06-18 12:47:02 +00:00
matthieu
2fde5844e5
Merge pull request 'feat(logistique) : scaffold module + socle RBAC tickets de pesée (ERP-181)' ( #131 ) from feat/erp-181-logistique-module into develop
Auto Tag Develop / tag (push) Successful in 8s
2026-06-18 12:46:58 +00:00
Matthieu
02a22597b3
feat(logistique) : export XLSX des tickets de pesée (ERP-186)
...
Endpoint GET /api/weighing_tickets/export.xlsx — controller custom (priority: 1)
calque sur les exports M2/M3/M4, delegue la generation au SpreadsheetExporter
partage. Rejoue la selection du WeighingTicketProvider (recherche ?search, tri
?order[displayDate], cloisonnement par site courant) SANS pagination : export
complet de la liste (§ 4.5).
Colonnes : Numero, Type contrepartie, Contrepartie (nom Client/Fournisseur/
Autre), Date, Immatriculation, Poids vide, Poids plein, Poids net, DSD vide,
DSD plein. Securite logistique.weighing_tickets.view.
Tests fonctionnels : 200 + en-tetes/Content-Disposition, mapping des colonnes
avec net = plein - vide (RG-5.05), cloisonnement par site (non-admin), 403, 401.
2026-06-18 14:37:16 +02:00
Matthieu
76e7a59ba7
feat(logistique) : WeighingTicketProvider + Processor — numérotation, contrepartie, net, normalisation (ERP-185)
...
Logique métier d'écriture et de lecture du ticket de pesée (M5).
Processor (POST/PATCH) :
- résolution du site courant (CurrentSiteProvider) + attribution du numéro
{siteCode}-TP-{NNNN} à la création, immuables ensuite (RG-5.02 / RG-5.09) ;
- exclusivité de la contrepartie CLIENT/FOURNISSEUR/AUTRE — null-ification des
champs hors-branche (RG-5.03, garde-fou CHECK Postgres) ;
- normalisation immatriculation trim/UPPER + masque XX-000-XX hors « Tout
format », 422 inline sur le champ si invalide (RG-5.01 / RG-5.10) ;
- DSD autoritaire pour les pesées AUTO via DsdAllocator (verrou), MANUEL conservé
(RG-5.04) ;
- poids net = plein − vide recalculé (RG-5.05).
Provider (GET) : liste paginée (Paginator ORM, règle n°13), recherche ?search=,
tri ?order[displayDate], cloisonnement par site courant appliqué dans le provider
(le SiteScopedQueryExtension ne traverse pas un provider custom), fetch-join
client/supplier/site anti-N+1, 404 hors périmètre / soft-delete.
Ajouts : WeighingTicketNumberAllocator (compteur weighing_ticket_counter,
SELECT FOR UPDATE), WeighingTicketFieldNormalizer, InvalidImmatriculationException
+ alias DI.
make test vert (811), Architecture vert (CollectionsArePaginatedTest).
2026-06-18 14:37:16 +02:00
Matthieu
e88bb059e6
feat(logistique) : pesée pont bascule stub + allocateur DSD + endpoint (ERP-184)
...
- WeighbridgeReaderInterface (contrat) + RandomWeighbridgeReader (stub,
poids aléatoire ∈ [10000,50000] kg, RG-5.06) + WeighbridgeUnavailableException
- DsdAllocator : compteur DSD par site (weighbridge_dsd_counter) incrémenté
sous verrou ligne SELECT ... FOR UPDATE (RG-5.04, § 2.7)
- endpoint POST /api/weighbridge_readings : ressource virtuelle
WeighbridgeReadingResource + WeighbridgeReadingProcessor (pas de controller)
- AUTO -> {weight, dsd, mode} ; MANUAL -> {weight, dsd, manualNumber, mode}
- WeighbridgeUnavailableException -> HTTP 503 explicite (RG-5.06)
- site courant via CurrentSiteProviderInterface (contrat Sites)
- is_granted('logistique.weighing_tickets.manage')
- dsd renvoyé prévisionnel : attribution autoritaire refaite à la création
du ticket (ERP-185)
- tests : WeighbridgeReaderStubTest, DsdAllocatorTest, processor (503/400),
WeighbridgeReadingApiTest (RBAC + AUTO/MANUAL + 422)
2026-06-18 14:37:16 +02:00
Matthieu
312c119c06
feat(logistique) : entité WeighingTicket + dette site.code (ERP-183)
...
Entité WeighingTicket
- Entité métier complète (#[Auditable], TimestampableBlamableTrait, relations
ORM Client/Supplier/Site) + contrat de sérialisation à 3 maillons
(weighing_ticket:read / :item:read + contextes par opération).
- Getters calculés displayDate et plateFreeFormat (#[SerializedName]),
sécurité view/manage, pas de Delete/archive.
- Validation #[Assert\*] messages FR + #[Assert\Callback] RG-5.03 (->atPath()),
libellé i18n audit.entity.logistique_weighingticket.
- Repository : interface Domain + DoctrineWeighingTicketRepository
(recherche + tri number DESC, deletedAt IS NULL).
Dette site.code
- Site.code mappé VARCHAR(8) (groupes read/write), dérivation auto au
PrePersist (2 premiers chiffres du CP), UniqueConstraint uq_site_code.
- Migration Version20260617160000 : ALTER COLUMN code SET NOT NULL + COMMENT.
- Fixtures (codes 86/17/82) et SiteApiTest ajustés.
Câblage
- doctrine.yaml : mapping ORM du module Logistique (absent du scaffold ERP-181).
- ColumnCommentsCatalog : site.code + table weighing_ticket.
Specs M5 versionnées (spec-back / spec-front / prompts).
2026-06-18 14:37:16 +02:00
Matthieu
8491f55072
feat(logistique) : migration schéma M5 tickets de pesée (ERP-182)
...
Crée le schéma BDD du module Logistique (M5) au namespace racine
DoctrineMigrations (FK cross-module user/client/supplier/site, règle n°11) :
- site.code VARCHAR(8) (préfixe de numérotation {siteCode}-TP, RG-5.02) +
backfill depuis le code postal + index unique uq_site_code. Colonne NULLABLE
à ce ticket (l'entité Site ne mappe pas encore code) ; mapping ORM,
peuplement et SET NOT NULL portés par le ticket entité.
- weighing_ticket_counter / weighbridge_dsd_counter : compteurs par site
(numéro RG-5.02 / DSD pont RG-5.04), gérés en DBAL brut FOR UPDATE, hors ORM
→ exclus du schema_filter (sinon schema:update les droppe) + catalogués.
- weighing_ticket : table principale (contrepartie Client/Fournisseur/Autre
avec CHECK 3 branches RG-5.03, immatriculation partagée, pesées vide/plein
en colonnes plates, net_weight dérivé, soft-delete + Timestampable/Blamable).
Index unique (site_id, number) + index FK. ON DELETE site/client/supplier =
RESTRICT, created_by/updated_by = SET NULL.
COMMENT ON COLUMN sur chaque colonne créée (règle n°12). make test +
ColumnsHaveSqlCommentTest verts, db-reset OK.
2026-06-18 14:36:05 +02:00
Matthieu
c63a5f971f
feat(logistique) : scaffold module + socle RBAC tickets de pesée (ERP-181)
...
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 3m12s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m44s
Nouveau module Logistique (M5), sans entité ni migration (ticket 1.2) :
- LogistiqueModule (ID logistique, permissions weighing_tickets.view/manage)
enregistré dans config/modules.php
- layer front frontend/modules/logistique (auto-détecté)
- sidebar : section Logistique + item /weighing-tickets (gate ...view)
+ clés i18n sidebar.logistique.*
- 3 miroirs RBAC alignés : sidebar.php, personas.ts (user-full),
SeedE2ECommand (user-full)
- matrice métier RbacSeeder : Bureau + Usine = view/manage ;
Compta + Commerciale = aucun accès (spec § 5.2)
2026-06-18 14:36:05 +02:00
gitea-actions
5f2aa5334b
chore: bump version to v0.1.138
Auto Tag Develop / tag (push) Successful in 7s
Build & Push Docker Image / build (push) Successful in 50s
v0.1.138
2026-06-18 08:51:36 +00:00
tristan
21b1c64a5f
Merge pull request 'feat(transport) : upload décharge + i18n transporteur (ERP-171)' ( #130 ) from feat/erp-171-carrier-upload-i18n into develop
Auto Tag Develop / tag (push) Successful in 9s
2026-06-18 08:50:13 +00:00
tristan
fd89160c4b
Merge pull request 'feat(transport) : consultation + modification transporteur (ERP-170)' ( #129 ) from feat/erp-170-carrier-view-edit into develop
Auto Tag Develop / tag (push) Successful in 7s
2026-06-18 08:50:07 +00:00
tristan
8daf0ff5d4
Merge pull request 'feat(transport) : onglet prix transporteur (ERP-169)' ( #128 ) from feat/erp-169-carrier-prices into develop
Auto Tag Develop / tag (push) Successful in 9s
2026-06-18 08:49:57 +00:00
tristan
87c53c354b
Merge pull request 'feat(transport) : onglet contacts transporteur (ERP-168)' ( #127 ) from feat/erp-168-carrier-contacts into develop
Auto Tag Develop / tag (push) Successful in 9s
2026-06-18 08:49:50 +00:00
tristan
f8b45cb30b
Merge pull request 'feat(transport) : onglet adresses transporteur (ERP-167)' ( #126 ) from feat/erp-167-carrier-addresses into develop
Auto Tag Develop / tag (push) Successful in 8s
2026-06-18 08:49:37 +00:00
tristan
0c0b57f898
Merge pull request 'feat(transport) : saisie assistée QUALIMAT + champs conditionnels (ERP-166)' ( #123 ) from feat/erp-166-qualimat-search into develop
Auto Tag Develop / tag (push) Successful in 8s
2026-06-18 08:49:25 +00:00
tristan
c18566124a
Merge pull request 'feat(transport) : écran ajout transporteur — layout + formulaire principal (ERP-165)' ( #122 ) from feat/erp-165-carrier-new into develop
Auto Tag Develop / tag (push) Successful in 9s
2026-06-18 08:49:15 +00:00
gitea-actions
f767733b87
chore: bump version to v0.1.131
Auto Tag Develop / tag (push) Successful in 8s
Build & Push Docker Image / build (push) Successful in 1m26s
v0.1.131
2026-06-18 08:48:56 +00:00
tristan
40da5dfb31
Merge pull request 'feat(transport) : page répertoire transporteurs (ERP-164)' ( #121 ) from feat/erp-164-carriers-list into develop
Auto Tag Develop / tag (push) Successful in 10s
2026-06-18 08:48:45 +00:00
tristan
d304b74289
refactor(transport) : supprime les reliquats multi-adresses — colonne position, dead code front, docblocks 1:n (ERP-172)
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 3m20s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m39s
2026-06-18 10:38:25 +02:00
tristan
80b3741f64
style(transport) : tableau prix consultation — colonne « Type de transport » à 170px (ERP-172)
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 3m3s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m32s
2026-06-17 17:58:06 +02:00