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.9 KiB
2.9 KiB
Prompt d'implémentation — M5 · ERP-182 (1.2) — Migrer le schéma M5
Projet Starseed. Tâche back / migration. Lis CLAUDE.md (règles n°11 et n°12), .claude/rules/backend.md (§ Migrations) et la spec : docs/specs/M5-tickets-pesee/spec-back.md (§ 3.2, § 3.2.bis, § 2.5, § 2.7).
Mission
Écrire une migration Doctrine au namespace racine DoctrineMigrations (migrations/VersionYYYYMMDDHHMMSS.php, postérieure aux existantes) qui crée tout le schéma M5.
Étapes
site.code:ALTER TABLE site ADD COLUMN code VARCHAR(8)NULLABLE → backfillUPDATE site SET code = LEFT(postal_code, 2) WHERE code IS NULL→ index uniqueuq_site_code(tolère les NULL multiples Postgres).- ⚠ NE PAS poser
SET NOT NULLici. Surmake db-reset, les fixturesSitesFixturesinsèrent des sites via l'ORM, qui ne connaîtcodeque si la propriété est mappée sur l'entitéSite.php(fait en ERP-183) → sinonINSERTsanscode→ violationNOT NULL→ db-reset plante. LeNOT NULLest posé en ERP-183 (2ᵉ migration) une foisSite::codemappé + peuplé. Cf. spec § 2.5.
- ⚠ NE PAS poser
- Table
weighing_ticket_counter (site_id PK → site, last_value INT NOT NULL DEFAULT 0)(séquence numéro par site, RG-5.02). - Table
weighbridge_dsd_counter (site_id PK → site, last_value INT NOT NULL DEFAULT 0)(compteur DSD par site, RG-5.04). - Table
weighing_ticket: copier le DDL de la spec § 3.2 (colonnessite_id,number, contrepartiecounterparty_type/client_id/supplier_id/other_label,immatriculation/plate_free_format,empty_*,full_*,net_weight,deleted_at+ 4 colonnes Timestampable/Blamable).- Convention
INT GENERATED BY DEFAULT AS IDENTITY,TIMESTAMP(0) WITHOUT TIME ZONE(§ 2.2). - CHECK :
counterparty_type,empty_mode/full_mode, et les 3 branches contrepartie (RG-5.03). - Index unique
(site_id, number)+ index FK (site,client,supplier,deleted_at,created_by,updated_by).
- Convention
- Règle ABSOLUE n°12 :
COMMENT ON COLUMN(FR, ≤ 200 car., sémantique + RG) sur chaque colonne créée — cf. échantillon § 3.2.bis. Les 4 colonnes Timestampable/Blamable viaaddStandardTimestampableBlamableComments($schema, 'weighing_ticket'). BonusCOMMENT ON TABLE. - Écrire
down()symétrique (drop tables + drop colonnesite.code).
Garde-fous
- Noms de colonnes en minuscules (Postgres).
- FK cross-module (
user,client,supplier,site) → la migration doit vivre au namespace racine (règle n°11), sinonmake db-resetcasse l'ordre. ON DELETE:site= RESTRICT,client/supplier= RESTRICT,created_by/updated_by= SET NULL, compteurs = CASCADE.
Vérification
make db-resetpuismake migration-migrate(BDD fraîche) → OK.make test:ColumnsHaveSqlCommentTestvert (aucune colonnepublicsanscol_description).make php-cs-fixer-allow-risky.