fced2c2cfd
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.
99 lines
4.8 KiB
PHP
99 lines
4.8 KiB
PHP
<?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.$_$');
|
|
}
|
|
}
|