diff --git a/migrations/Version20260601000000.php b/migrations/Version20260601000000.php index af26227..75a0934 100644 --- a/migrations/Version20260601000000.php +++ b/migrations/Version20260601000000.php @@ -84,10 +84,18 @@ final class Version20260601000000 extends AbstractMigration $this->addSql('DROP TABLE payment_delay'); $this->addSql('DROP TABLE tva_mode'); - // Retire uniquement les 4 types seedes par cette migration. Les autres - // types eventuels (CRUD futur) sont preserves. + // Retire uniquement les 4 types seedes par cette migration ET restes + // orphelins (aucune `category` ne les reference). Sans la clause + // NOT EXISTS, le DELETE casse sur la FK RESTRICT category.category_type_id + // des qu'une categorie pointe sur l'un d'eux. Symetrique du + // `ON CONFLICT (code) DO NOTHING` du up() : on ne defait que ce qu'on a + // reellement cree et qui n'est pas reutilise. $this->addSql(<<<'SQL' - DELETE FROM category_type WHERE code IN ('DISTRIBUTEUR', 'COURTIER', 'SECTEUR', 'AUTRE') + DELETE FROM category_type + WHERE code IN ('DISTRIBUTEUR', 'COURTIER', 'SECTEUR', 'AUTRE') + AND NOT EXISTS ( + SELECT 1 FROM category c WHERE c.category_type_id = category_type.id + ) SQL); } @@ -220,6 +228,14 @@ final class Version20260601000000 extends AbstractMigration $this->addSql('CREATE INDEX idx_client_created_by ON client (created_by)'); $this->addSql('CREATE INDEX idx_client_updated_by ON client (updated_by)'); + // Index sur les FK des referentiels comptables — coherence avec les autres + // FK deja indexees ci-dessus (Postgres n'indexe pas automatiquement les + // colonnes portant une FOREIGN KEY). + $this->addSql('CREATE INDEX idx_client_tva_mode_id ON client (tva_mode_id)'); + $this->addSql('CREATE INDEX idx_client_payment_delay_id ON client (payment_delay_id)'); + $this->addSql('CREATE INDEX idx_client_payment_type_id ON client (payment_type_id)'); + $this->addSql('CREATE INDEX idx_client_bank_id ON client (bank_id)'); + // Unicite metier partielle (Q4) : nom de societe insensible a la casse, // parmi les non-archives ET non soft-deletes uniquement. Pas d'index // unique sur siren ni email.