diff --git a/migrations/Version20260527164000.php b/migrations/Version20260527164000.php new file mode 100644 index 0000000..477588c --- /dev/null +++ b/migrations/Version20260527164000.php @@ -0,0 +1,90 @@ +addSql(<<<'SQL' + CREATE TABLE category_type ( + id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL, + code VARCHAR(40) NOT NULL, + label VARCHAR(120) NOT NULL, + PRIMARY KEY (id) + ) + SQL); + $this->addSql('CREATE UNIQUE INDEX uq_category_type_code ON category_type (code)'); + + $this->addSql(<<<'SQL' + CREATE TABLE category ( + id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL, + name VARCHAR(120) NOT NULL, + category_type_id INT NOT NULL, + deleted_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, + created_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, + updated_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, + created_by INT DEFAULT NULL, + updated_by INT DEFAULT NULL, + PRIMARY KEY (id), + CONSTRAINT fk_category_type + FOREIGN KEY (category_type_id) REFERENCES category_type (id) ON DELETE RESTRICT, + CONSTRAINT fk_category_created_by + FOREIGN KEY (created_by) REFERENCES "user" (id) ON DELETE SET NULL, + CONSTRAINT fk_category_updated_by + FOREIGN KEY (updated_by) REFERENCES "user" (id) ON DELETE SET NULL + ) + SQL); + + // Unicite (name, type) case-insensitive, seulement sur les non-soft-deleted. + $this->addSql(<<<'SQL' + CREATE UNIQUE INDEX uq_category_name_type_active + ON category (LOWER(name), category_type_id) + WHERE deleted_at IS NULL + SQL); + + $this->addSql('CREATE INDEX idx_category_deleted_at ON category (deleted_at)'); + $this->addSql('CREATE INDEX idx_category_type_id ON category (category_type_id)'); + $this->addSql('CREATE INDEX idx_category_created_by ON category (created_by)'); + $this->addSql('CREATE INDEX idx_category_updated_by ON category (updated_by)'); + } + + public function down(Schema $schema): void + { + // Ordre important : `category` porte les FK vers `category_type`. + $this->addSql('DROP TABLE category'); + $this->addSql('DROP TABLE category_type'); + } +}