feat(catalog) : M6 — StorageType référentiel plat + seed migration (drop storage_type_site)
La disponibilité « type de stockage par site » relèvera de la future entité Stockage (site + type), pas du référentiel. On retire donc la jointure M2M storage_type_site et le filtrage du multi-select par site (RG-6.06 revue) : - migration : DROP storage_type_site + seed idempotent des 10 types (prod-safe, ON CONFLICT) ; - StorageType : référentiel plat (plus de relation sites) ; - Product : suppression du Assert\Callback de disponibilité par site ; - provider/repository : /storage_types renvoie tous les types (plus de ?siteId[]) ; - front : useStorageTypeOptions charge tout dans loadReferentials, setSites sans cascade/purge ; - fixture, ColumnCommentsCatalog, tests et spec-back M6 alignés.
This commit is contained in:
@@ -0,0 +1,98 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace DoctrineMigrations;
|
||||
|
||||
use Doctrine\DBAL\Schema\Schema;
|
||||
use Doctrine\Migrations\AbstractMigration;
|
||||
|
||||
/**
|
||||
* M6 Catalog — `storage_type` devient un referentiel PLAT + seed prod-safe.
|
||||
*
|
||||
* Contexte : le rattachement « tel type de stockage dispo sur tel site » ne releve
|
||||
* PAS du referentiel `storage_type`. Il sera porte par la future entite Stockage
|
||||
* (module Stockage : un stockage = 1 site + 1 type) et derive des stockages reels.
|
||||
* On retire donc la jointure M2M `storage_type_site` (creee par Version20260625110000)
|
||||
* et le filtrage `?siteId[]=` du multi-select produit (RG-6.06 revue : le select liste
|
||||
* desormais TOUS les types).
|
||||
*
|
||||
* Seed : `storage_type` n'avait jusqu'ici qu'une fixture (purge Doctrine), donc une
|
||||
* table VIDE en prod (les fixtures n'y tournent pas). On aligne sur les referentiels
|
||||
* comptables (payment_type / bank / country, Version20260601000000 / ...100000) :
|
||||
* un `INSERT ... ON CONFLICT (code) DO NOTHING` idempotent qui seede prod ET survit a
|
||||
* tout. En dev/test, StorageTypeFixtures re-seede apres la purge (source unique : les
|
||||
* 10 memes valeurs Figma, PROVISOIRE — HP-M6-02 / ERP-201).
|
||||
*
|
||||
* Namespace racine `DoctrineMigrations` (regle ABSOLUE n°11) : la table `storage_type`
|
||||
* et la jointure droppee ici ont ete creees au namespace racine (Version20260625110000) ;
|
||||
* un namespace modulaire trierait par FQCN alphabetique AVANT et casserait l'ordre sur
|
||||
* base vide (drop d'une table pas encore creee).
|
||||
*/
|
||||
final class Version20260626100000 extends AbstractMigration
|
||||
{
|
||||
public function getDescription(): string
|
||||
{
|
||||
return 'M6 Catalog : storage_type referentiel plat (drop storage_type_site) + seed idempotent des types de stockage (prod-safe).';
|
||||
}
|
||||
|
||||
public function up(Schema $schema): void
|
||||
{
|
||||
// 1. storage_type devient plat : la dispo par site releve du futur module Stockage.
|
||||
$this->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.$_$');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user