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.
This commit is contained in:
48
backend/migrations/Version20260205100000.php
Normal file
48
backend/migrations/Version20260205100000.php
Normal file
@@ -0,0 +1,48 @@
|
||||
<?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)');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user