Files
Classeo/backend/migrations/Version20260205100000.php
Mathias STRASSER 8e09e0abf1 feat: Gestion des classes scolaires
Permet aux administrateurs de créer, modifier et supprimer des classes
pour organiser les élèves par niveau. L'archivage soft-delete préserve
l'historique tout en masquant les classes obsolètes.

Inclut la validation des noms (2-50 caractères), les niveaux scolaires
du CP à la Terminale, et les contrôles d'accès par rôle.
2026-02-05 15:24:29 +01:00

49 lines
1.7 KiB
PHP

<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Migration pour corriger la contrainte d'unicité sur school_classes.
*
* La contrainte UNIQUE(tenant_id, academic_year_id, name) incluait les classes
* archivées (soft delete), ce qui empêchait de recréer une classe avec le même
* nom après archivage.
*
* Cette migration remplace la contrainte par un index unique partiel qui exclut
* les lignes archivées (deleted_at IS NOT NULL).
*/
final class Version20260205100000 extends AbstractMigration
{
public function getDescription(): string
{
return 'Replace school_classes unique constraint with partial unique index for soft delete support';
}
public function up(Schema $schema): void
{
// Supprimer la contrainte unique existante
$this->addSql('ALTER TABLE school_classes DROP CONSTRAINT IF EXISTS school_classes_tenant_id_academic_year_id_name_key');
// Créer un index unique partiel qui exclut les classes archivées
$this->addSql(<<<'SQL'
CREATE UNIQUE INDEX idx_school_classes_unique_name_active
ON school_classes (tenant_id, academic_year_id, name)
WHERE deleted_at IS NULL
SQL);
}
public function down(Schema $schema): void
{
// Supprimer l'index partiel
$this->addSql('DROP INDEX IF EXISTS idx_school_classes_unique_name_active');
// Restaurer la contrainte unique originale
$this->addSql('ALTER TABLE school_classes ADD CONSTRAINT school_classes_tenant_id_academic_year_id_name_key UNIQUE (tenant_id, academic_year_id, name)');
}
}