312c119c06
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).
2.4 KiB
2.4 KiB
Prompt d'implémentation — M5 · ERP-184 (1.4) — Pesée pont bascule (stub + DSD + endpoint)
Projet Starseed. Tâche back. Lis CLAUDE.md, .claude/rules/backend.md et la spec : docs/specs/M5-tickets-pesee/spec-back.md (§ 2.6, § 2.7, § 4.2). Prérequis : ERP-182.
Mission
Implémenter la pesée déclenchée par les boutons « Pesée bascule » / « Pesée manuelle » : stub (pas de liaison matérielle au M5) + allocateur DSD + endpoint API.
Étapes
- Contrat
Logistique\Domain\Contract\WeighbridgeReaderInterface:public function read(SiteInterface $site): WeighbridgeReading; // {weight:int kg, dsd:int}WeighbridgeUnavailableException.
- Impl
Logistique\Infrastructure\Weighbridge\RandomWeighbridgeReader:weight = random_int(10000, 50000)(RG-5.06),dsd = DsdAllocator::next($site). DsdAllocator(service) : compteur DSD par site surweighbridge_dsd_counter, incrément avec verrou ligneSELECT ... FOR UPDATEdans une transaction.- AUTO : incrémente et renvoie la nouvelle valeur.
- MANUAL :
dsd = dernier dsd du site + 1(RG-5.04).
- Endpoint
POST /api/weighbridge_readings— ressource virtuelle (DTOWeighbridgeReadingInput/Output) + Processor dédié, pas de controller Symfony :{ "mode": "AUTO" }→{ weight, dsd, mode }(site courant viaCurrentSiteProviderInterface).{ "mode": "MANUAL", "weight": <int>, "manualNumber": "<str>" }→{ weight, dsd, manualNumber, mode }.- Erreur
WeighbridgeUnavailableException→ HTTP 503 explicite « Pont bascule indisponible — passez en pesée manuelle » (RG-5.06). - Sécurité
is_granted('logistique.weighing_tickets.manage').
- Le
dsdrenvoyé est prévisionnel : noter en commentaire que l'attribution autoritaire est refaite à la création du ticket (ERP-185).
Garde-fous
declare(strict_types=1);; commentaires FR.- Consommer
CurrentSiteProviderInterface(contrat Sites) — pas d'import de logique d'un autre module. - Pas de controller sous
/api(API Platform).
Vérification
make test:WeighbridgeReaderStubTest(poids ∈ [10000,50000] + chemin erreur → 503),DsdAllocatorTest(AUTO incrémente / MANUAL = dernier+1 / par site).make php-cs-fixer-allow-risky.- Appel manuel
POST /api/weighbridge_readings {AUTO}(token Usine) → poids + dsd cohérents.