addSql('DROP TABLE IF EXISTS storage_type_site'); // 2. Seed idempotent (miroir StorageTypeFixtures) : alimente la prod ou les // fixtures ne tournent pas. ON CONFLICT (code) -> rejouable sans doublon // (s'appuie sur l'index unique uq_storage_type_code). $this->addSql(<<<'SQL' INSERT INTO storage_type (code, label) VALUES ('BOISSEAU', 'Boisseau'), ('BOISSEAU_DOSAGE', 'Boisseau dosage'), ('CASE', 'Case'), ('CELLULE', 'Cellule'), ('CONTAINER', 'Container'), ('CUVE_MELASSE', 'Cuve mélasse'), ('STOCKAGE_BIG_BAG', 'Stockage big bag'), ('STOCKAGE_PALETTE', 'Stockage palette'), ('TAS', 'Tas'), ('ZONE', 'Zone') ON CONFLICT (code) DO NOTHING SQL); } public function down(Schema $schema): void { // Retire uniquement les 10 types seedes ET restes orphelins (aucun produit ne // les reference via product_storage_type). Sans le NOT EXISTS, le DELETE casse // sur la FK RESTRICT product_storage_type.storage_type_id. Symetrique du // ON CONFLICT DO NOTHING du up(). $this->addSql(<<<'SQL' DELETE FROM storage_type WHERE code IN ( 'BOISSEAU', 'BOISSEAU_DOSAGE', 'CASE', 'CELLULE', 'CONTAINER', 'CUVE_MELASSE', 'STOCKAGE_BIG_BAG', 'STOCKAGE_PALETTE', 'TAS', 'ZONE' ) AND NOT EXISTS ( SELECT 1 FROM product_storage_type pst WHERE pst.storage_type_id = storage_type.id ) SQL); // Recree la jointure M2M storage_type <-> site (etat anterieur a cette migration). $this->addSql(<<<'SQL' CREATE TABLE storage_type_site ( storage_type_id INT NOT NULL, site_id INT NOT NULL, PRIMARY KEY (storage_type_id, site_id), CONSTRAINT fk_storage_type_site_type FOREIGN KEY (storage_type_id) REFERENCES storage_type (id) ON DELETE CASCADE, CONSTRAINT fk_storage_type_site_site FOREIGN KEY (site_id) REFERENCES site (id) ON DELETE CASCADE ) SQL); $this->addSql('CREATE INDEX idx_storage_type_site_site ON storage_type_site (site_id)'); $this->addSql('COMMENT ON TABLE "storage_type_site" IS $_$Jointure M2M storage_type <-> site (Sites) — sites sur lesquels un type de stockage est disponible (alimente le filtrage du multi-select par site, RG-6.06).$_$'); $this->addSql('COMMENT ON COLUMN "storage_type_site"."storage_type_id" IS $_$FK -> storage_type.id, ON DELETE CASCADE — type de stockage disponible.$_$'); $this->addSql('COMMENT ON COLUMN "storage_type_site"."site_id" IS $_$FK -> site.id, ON DELETE CASCADE — site ou le type de stockage est disponible.$_$'); } }