feat: Gestion des périodes scolaires
L'administration d'un établissement nécessite de découper l'année scolaire en trimestres ou semestres avant de pouvoir saisir les notes et générer les bulletins. Ce module permet de configurer les périodes par année scolaire (current/previous/next résolus en UUID v5 déterministes), de modifier les dates individuelles avec validation anti-chevauchement, et de consulter la période en cours avec le décompte des jours restants. Les dates par défaut de février s'adaptent aux années bissextiles. Le repository utilise UPSERT transactionnel pour garantir l'intégrité lors du changement de mode (trimestres ↔ semestres). Les domain events de Subject sont étendus pour couvrir toutes les mutations (code, couleur, description) en plus du renommage.
This commit is contained in:
51
backend/migrations/Version20260205100002.php
Normal file
51
backend/migrations/Version20260205100002.php
Normal file
@@ -0,0 +1,51 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace DoctrineMigrations;
|
||||
|
||||
use Doctrine\DBAL\Schema\Schema;
|
||||
use Doctrine\Migrations\AbstractMigration;
|
||||
|
||||
/**
|
||||
* Migration pour créer la table academic_periods (périodes scolaires).
|
||||
*
|
||||
* @see FR75 - Structurer l'année pour bulletins et moyennes
|
||||
*/
|
||||
final class Version20260205100002 extends AbstractMigration
|
||||
{
|
||||
public function getDescription(): string
|
||||
{
|
||||
return 'Create academic_periods table for school period management';
|
||||
}
|
||||
|
||||
public function up(Schema $schema): void
|
||||
{
|
||||
$this->addSql(<<<'SQL'
|
||||
CREATE TABLE academic_periods (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
tenant_id UUID NOT NULL,
|
||||
academic_year_id UUID NOT NULL,
|
||||
period_type VARCHAR(20) NOT NULL,
|
||||
sequence INT NOT NULL,
|
||||
label VARCHAR(20) NOT NULL,
|
||||
start_date DATE NOT NULL,
|
||||
end_date DATE NOT NULL,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
)
|
||||
SQL);
|
||||
|
||||
$this->addSql('CREATE INDEX idx_academic_periods_tenant_id ON academic_periods(tenant_id)');
|
||||
$this->addSql('CREATE INDEX idx_academic_periods_year ON academic_periods(academic_year_id)');
|
||||
$this->addSql(<<<'SQL'
|
||||
CREATE UNIQUE INDEX idx_academic_periods_unique_sequence
|
||||
ON academic_periods (tenant_id, academic_year_id, sequence)
|
||||
SQL);
|
||||
}
|
||||
|
||||
public function down(Schema $schema): void
|
||||
{
|
||||
$this->addSql('DROP TABLE IF EXISTS academic_periods');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user