tristan
391f383c4b
fix : brouillon à contrepartie incomplète enregistrable sans erreur 500 (ERP-193)
...
Un brouillon dont le type de contrepartie est choisi sans son champ associé
(client/fournisseur null, ou libellé « Autre » vide) violait chk_wt_*_branch
et levait une 500 : le callback de cohérence RG-5.03 ne joue qu'au groupe
finalize, laissant passer l'incohérence à l'enregistrement du brouillon.
- back : WeighingTicketProcessor retire la contrepartie entière quand le champ
de branche est absent (clearCounterparty) au lieu de persister un état
incohérent. N'affecte que le brouillon (à la validation, le callback finalize
lève déjà une 422 avant le processor).
- front : buildDraftPayload n'émet le type que si son champ associé est rempli ;
la validation continue d'envoyer toujours le type pour la 422 métier.
- tests : 2 cas back (CLIENT sans client, AUTRE libellé vide) + 2 cas front.
2026-06-24 16:12:40 +02:00
tristan
9e2206a7d6
fix : DSD saisi conservé en pesée manuelle (ERP-193)
...
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 2m12s
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 3m45s
En pesée manuelle, le serveur incrémentait automatiquement le DSD et ignorait la
saisie de l'opérateur. Désormais l'opérateur saisit le poids ET le DSD (le numéro
du pont réellement utilisé), conservés tels quels — plus d'auto-incrément. Le
champ « Numéro de pesée » séparé (manualNumber) est supprimé : pour le client
c'est la même chose que le DSD. Pas de contrainte d'unicité sur le DSD (doublons
autorisés). Colonnes empty_manual_number/full_manual_number droppées.
2026-06-24 15:33:12 +02:00
tristan
819ac5e608
feat : cycle de vie brouillon/validé du ticket de pesée (ERP-193)
...
Une pesée (bascule ou manuelle) s'enregistre désormais dès la validation de sa
modale, sans exiger la contrepartie ni l'immatriculation : le ticket naît
« brouillon » (status DRAFT, sans numéro). Le bouton « Valider » finalise quand
les 3 champs du haut (contrepartie + champ associé + immatriculation) ET les 2
pesées sont renseignés : attribution du numéro {siteCode}-TP-{NNNN} et passage
en VALIDATED, puis ouverture du bon de pesée PDF.
Back : counterparty_type/immatriculation/number nullables + colonne status
(migration racine), contraintes strictes déplacées en groupe de validation
finalize, opération PATCH /weighing_tickets/{id}/validate, numéro attribué à la
validation. Front : 4 champs en haut hors blocs, persistance immédiate des
pesées, écrans Ajouter/Modifier refondus, colonne Statut dans la liste, form à
plat pleine largeur. Tests back (lifecycle brouillon/validate) + front à jour.
2026-06-24 15:13:12 +02:00
tristan
d5d7d2e2aa
fix(front) : pesée horodatée en date+heure, ré-horodatée à la validation (ERP-189)
...
Le champ Date des blocs de pesée passe de MalioDate (date seule, heure perdue
-> 00:00:00 en base) à MalioDateTime (date + heure). Défaut = instant courant
(nowIsoDateTime) et ré-horodatage à la validation d'une pesée (bascule ou
manuelle) via applyReading : la date du ticket reflète le moment réel de la
pesée. L'hydratation en modification conserve l'heure du back (TIMESTAMP).
2026-06-24 10:15:57 +02:00
tristan
681fca9aeb
style(front) : mise en forme des modales de pesée (ERP-189)
...
- Modale pesée manuelle : titre UPPERCASE, marges 24px haut / 28px latéral /
12px titre-bordure / 36px bordure-formulaire, bordure insérée sous le header,
champs resserrés (gap-2), Annuler retiré, Enregistrer centré.
- Modale pesée bascule : question portée par le titre (corps sans texte),
Annuler retiré, Valider centré.
- Marge bottom de 24px sous le bouton dans les deux modales.
- Nettoyage des clés i18n devenues inutiles (cancel / confirmMessage).
2026-06-23 18:01:17 +02:00
tristan
335d2ed207
fix(front) : poids en champ texte chiffré dans la pesée manuelle + retrait numéro/site sur la modification (ERP-189/190)
...
- Modale « Pesée manuelle » : champ Poids passé en MalioInputText verrouillé sur
les chiffres (NUMERIC_MASK), comme le formulaire.
- Masques de pesée factorisés dans utils/weighingMasks (NUMERIC / PLATE / FREE_PLATE).
- Écran Modification : suppression des champs lecture seule « Numéro » et « Site »
en tête (le numéro reste rappelé dans le titre de l'écran).
2026-06-23 15:58:31 +02:00
tristan
f2c06aed43
fix(front) : masque élargi pour l'immatriculation « Tout format » (ERP-189)
...
« Tout format » n'est plus un champ libre total : masque maska charset
(lettres/chiffres/espace/tiret, MAJ, longueur libre) pour les plaques anciennes
ou étrangères, filtrant accents/ponctuation/symboles. Format autoritaire côté serveur.
2026-06-23 14:09:36 +02:00
tristan
5349c3c4d5
fix(front) : ajustements du formulaire ticket de pesée (ERP-189/190)
...
- Poids/DSD en champs texte verrouillés sur les chiffres et désactivés.
- Boutons de pesée : icône mdi:weight à gauche + gap-8.
- Bloc « Poids à vide » réagencé en 3 lignes (contrepartie / Date-Poids-DSD-Immat / Tout format).
- Omission des clés null dans les payloads (compact) : requis vides → message NotBlank métier au lieu d'une erreur de type.
- Pesée obligatoire (RG-5.07) signalée inline sous Poids/DSD ; toutes les violations affichées d'un seul aller-retour.
- Erreur d'immatriculation affichée uniquement sur le bloc « Poids à vide » (plus de doublon sur le bloc plein).
2026-06-23 14:03:32 +02:00
tristan
4dcc247436
feat(front) : branchement site courant + formats d'affichage des tickets de pesée (ERP-191)
2026-06-22 16:13:30 +02:00
tristan
b438838465
feat(front) : écran modification d'un ticket de pesée + bouton imprimer (ERP-190)
2026-06-22 15:29:15 +02:00
tristan
9f3fe4da4e
feat(front) : écran ajouter un ticket de pesée (blocs vide/plein, pesée, masque immat) (ERP-189)
2026-06-22 15:11:54 +02:00
tristan
117dcdbdcc
feat(front) : page liste des tickets de pesée + export (ERP-188)
2026-06-22 15:03:02 +02:00
tristan
5e15c1f69f
fix : retours métier ERP-193 (4 répertoires) ( #139 )
...
Auto Tag Develop / tag (push) Successful in 11s
Lot de retours métier **ERP-193** (« Fix tous les retours starseed »), transverse aux 4 répertoires (clients, fournisseurs, prestataires, transporteurs).
## Contenu
- **Pagination** : défaut à 25 items/page sur les 4 répertoires.
- **Libellé** : colonne « Dernière activité » → « Dernière modification ».
- **Consultation** : masquage des onglets vides (coquilles « à venir » + onglets de données sans donnée).
- **Chiffre d'affaires** : plafonné à 999 999 999 999,99 (clamp front + `Assert\LessThanOrEqual` back).
- **Date de création** : interdiction des dates futures (`:max` MalioDate + `Assert\LessThanOrEqual('today')` back).
- **Caractères spéciaux** : blocage des caractères parasites (`²³§~#|…`) dans les champs texte via une allow-list par profil (nom de personne / texte libre / adresse / code alphanumérique) — filtrage front à la frappe + `Assert\Regex` back autoritaire. Email/IBAN/BIC/TVA conservent leurs validateurs de format.
- **UI** : champs en consultation et onglets validés grisés (`readonly` → `disabled`).
- **UI** : boutons « Archiver » en rouge (variant `danger`).
## Tests
- Back : nouveaux tests RG (plafond CA, dates futures, caractères spéciaux) + garde-fou contraintes — suite complète verte (813 tests).
- Front : nouveaux tests unitaires (sanitizers, helpers date/montant) — 615 tests verts, eslint clean.
---------
Co-authored-by: THOLOT DECHENE Matthieu <matthieu@yuno.malio.fr >
Reviewed-on: #139
Co-authored-by: tristan <tristan@yuno.malio.fr >
Co-committed-by: tristan <tristan@yuno.malio.fr >
2026-06-22 09:40:40 +00: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
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
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
tristan
c468374b16
style(transport) : tableau prix consultation — « Type de transport » (colonne élargie, en-tête centré) (ERP-172)
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-17 17:57:26 +02:00
tristan
7ddf495d7f
style(transport) : tableau prix consultation — code du site (département) + en-têtes Forfait/Tonne (€) (ERP-172)
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 3m15s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m31s
2026-06-17 17:46:58 +02:00
tristan
9fcf5c24f6
feat(transport) : retour au répertoire après validation du dernier onglet (création) (ERP-172)
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-17 17:44:34 +02:00
tristan
76fb01c063
feat(transport) : modif — onglet Qualimat (actualisation) + certification éditable (déliage Qualimat) (ERP-172)
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 3m14s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Has been cancelled
2026-06-17 17:40:05 +02:00
tristan
e76bd1dd63
feat(transport) : adresse unique par transporteur (OneToOne back + un seul bloc front) (ERP-172)
2026-06-17 17:32:29 +02:00
tristan
7668d77c78
fix(transport) : upload décharge différé à l'enregistrement/validation (évite les orphelins) (ERP-171)
2026-06-17 16:08:08 +02:00
tristan
1d5110d000
feat(transport) : upload décharge (useUpload) + câblage MalioInputUpload + i18n erreur (ERP-171)
2026-06-17 16:08:08 +02:00
tristan
b6b5bb06e8
fix(transport) : affiche le message 409 (homonyme) à la restauration + virgule décimale dans sanitizeDecimal (ERP-170)
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 3m7s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m41s
2026-06-17 16:08:02 +02:00
tristan
c371057c0b
style(transport) : tableau prix — réduit Adresse sites au profit d'Adresse livraisons (ERP-170)
2026-06-17 16:08:02 +02:00
tristan
5125883e21
fix(transport) : tableau prix — corrige l'inversion Adresse sites / Adresse livraisons (ERP-170)
2026-06-17 16:08:02 +02:00
tristan
5bbd4ddb47
style(transport) : tableau prix — libellés colonnes + élargit Transporteurs/Adresse livraisons, réduit Forfait/Tonne/Indexation/État (ERP-170)
2026-06-17 16:08:02 +02:00
tristan
20296ac149
style(transport) : datatable qualimat table-fixed (radio étroit, colonnes égales) + icônes onglets prix/qualimat (ERP-170)
2026-06-17 16:08:02 +02:00
tristan
fe1d012548
style(transport) : tableau prix consultation en table-fixed (colonnes à parts égales, contenant étroit) (ERP-170)
2026-06-17 16:08:02 +02:00
tristan
d86dc69cf2
feat(transport) : consultation — contenant en radios lecture seule (aligné ajout/modif) (ERP-170)
2026-06-17 16:08:02 +02:00
tristan
07ed57f283
feat(transport) : contenant du formulaire principal en radios centrés (Benne par défaut) (ERP-170)
2026-06-17 16:08:02 +02:00
tristan
b5749520bc
fix(transport) : consultation — disposition du bloc principal alignée sur l'ajout (LIOT, décharge col 3, affréter col 4) (ERP-170)
2026-06-17 16:08:02 +02:00
tristan
02d2fde653
fix(transport) : indexation réellement plafonnée à 100 % — re-synchronise le champ amount contrôlé via :key (ERP-170)
2026-06-17 16:08:02 +02:00
tristan
0d284fe488
fix(transport) : volume m³ en champ texte décimal + indexation en montant % plafonné à 100 (ERP-170)
2026-06-17 16:08:02 +02:00
tristan
48ca963a9d
fix(transport) : tableau prix — en-tête « Contenant » sur la colonne de groupe (ERP-170)
2026-06-17 16:08:02 +02:00
tristan
b11968f5e5
fix(transport) : tableau prix — supprime la double bordure du bas + séparateur épais entre groupes Benne/Fond mouvant (ERP-170)
2026-06-17 16:08:02 +02:00
tristan
5109b5f57a
fix(transport) : tableau prix consultation — police/bordures/radius alignés MalioDataTable, colonne groupe en épine (ERP-170)
2026-06-17 16:08:02 +02:00
tristan
d5a01ac85f
fix(transport) : name de radio unique par bloc prix (useId) — plus de groupe partagé entre blocs (ERP-170)
2026-06-17 16:08:02 +02:00
tristan
7adf3a511a
fix(transport) : tableau prix consultation — cellule de groupe fusionnée (Fond Mouvant/Benne) + colonnes maquette (ERP-170)
2026-06-17 16:08:02 +02:00
tristan
e612eae391
feat(transport) : consultation + modification transporteur (ERP-170)
2026-06-17 16:08:02 +02:00
tristan
fb9c15c52a
fix(transport) : pré-validation front du bloc prix — erreurs inline sous tous les champs requis (selects branche) (ERP-169)
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 3m4s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m34s
2026-06-17 16:08:02 +02:00
tristan
e1712465f1
fix(transport) : bloc prix — radios sens/contenant/tarif horizontaux et centrés (h-12) en colonne 1 (ERP-169)
2026-06-17 16:08:02 +02:00
tristan
6ff5b13ce2
fix(transport) : bloc prix par défaut (CLIENT), sens seul en ligne 1, payload omet scalaires vides (422 inline au lieu de 400) (ERP-169)
2026-06-17 16:08:02 +02:00
tristan
a26bb09ee1
fix(transport) : bloc prix — radios sans label de groupe, sens en colonne 1, défaut Benne/Forfait (ERP-169)
2026-06-17 16:08:02 +02:00
tristan
07e0bcbcce
feat(transport) : onglet prix transporteur (ERP-169)
2026-06-17 16:08:02 +02:00
tristan
f27db02cb6
fix(transport) : règle « + Nouveau contact » alignée sur M1/M2/M3 (prénom OU nom) (ERP-168)
2026-06-17 16:07:51 +02:00
tristan
5765ba7178
feat(transport) : onglet contacts transporteur (ERP-168)
2026-06-17 16:07:51 +02:00
tristan
ef996c3672
feat(transport) : onglet adresses transporteur (ERP-167)
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 3m18s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m34s
2026-06-17 16:06:56 +02:00
tristan
c6259a96cd
fix(transport) : intégration QUALIMAT — copie locale seulement après PATCH réussi (évite un état non persisté) (ERP-166)
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 3m4s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m43s
2026-06-17 16:01:45 +02:00