feat: Permettre l'import d'enseignants via fichier CSV ou XLSX
L'établissement a besoin d'importer en masse ses enseignants depuis les exports des logiciels de vie scolaire (Pronote, EDT, etc.), comme c'est déjà possible pour les élèves. Le wizard en 4 étapes (upload → mapping → aperçu → import) réutilise l'architecture de l'import élèves tout en ajoutant la gestion des matières et des classes enseignées. Corrections de la review #2 intégrées : - La commande ImportTeachersCommand est routée en async via Messenger pour ne pas bloquer la requête HTTP sur les gros fichiers. - Le handler est protégé par un try/catch Throwable pour marquer le batch en échec si une erreur inattendue survient, évitant qu'il reste bloqué en statut "processing". - Les domain events (UtilisateurInvite) sont dispatchés sur l'event bus après chaque création d'utilisateur, déclenchant l'envoi des emails d'invitation. - L'option "mettre à jour les enseignants existants" (AC5) permet de choisir entre ignorer ou mettre à jour nom/prénom et ajouter les affectations manquantes pour les doublons détectés par email.
This commit is contained in:
@@ -17,6 +17,7 @@ use App\Administration\Domain\Model\Import\ImportRowError;
|
||||
use App\Administration\Domain\Model\Import\KnownImportFormat;
|
||||
use App\Administration\Domain\Model\Import\StudentImportBatch;
|
||||
use App\Administration\Domain\Model\Import\StudentImportField;
|
||||
use App\Administration\Domain\Model\SchoolClass\AcademicYearId;
|
||||
use App\Administration\Domain\Repository\ImportBatchRepository;
|
||||
use App\Administration\Infrastructure\Security\SecurityUser;
|
||||
use App\Administration\Infrastructure\Service\CurrentAcademicYearResolver;
|
||||
@@ -175,7 +176,10 @@ final readonly class StudentImportController
|
||||
$tenantId = TenantId::fromString($user->tenantId());
|
||||
$batch = $this->getBatch($id, $tenantId);
|
||||
|
||||
$result = $this->orchestrator->generatePreview($batch, $tenantId);
|
||||
$academicYearIdRaw = $this->academicYearResolver->resolve('current');
|
||||
$academicYearId = $academicYearIdRaw !== null ? AcademicYearId::fromString($academicYearIdRaw) : null;
|
||||
|
||||
$result = $this->orchestrator->generatePreview($batch, $tenantId, $academicYearId);
|
||||
|
||||
return new JsonResponse([
|
||||
'id' => (string) $batch->id,
|
||||
@@ -194,7 +198,8 @@ final readonly class StudentImportController
|
||||
public function confirm(string $id, Request $request): JsonResponse
|
||||
{
|
||||
$user = $this->getSecurityUser();
|
||||
$batch = $this->getBatch($id, TenantId::fromString($user->tenantId()));
|
||||
$tenantId = TenantId::fromString($user->tenantId());
|
||||
$batch = $this->getBatch($id, $tenantId);
|
||||
|
||||
$data = $request->toArray();
|
||||
|
||||
@@ -208,7 +213,13 @@ final readonly class StudentImportController
|
||||
?? throw new BadRequestHttpException('Impossible de résoudre l\'année scolaire courante.');
|
||||
$schoolName = $this->tenantContext->getCurrentTenantConfig()->subdomain;
|
||||
|
||||
$this->orchestrator->prepareForConfirmation($batch, $createMissingClasses, $importValidOnly);
|
||||
$this->orchestrator->prepareForConfirmation(
|
||||
$batch,
|
||||
$createMissingClasses,
|
||||
$importValidOnly,
|
||||
$tenantId,
|
||||
AcademicYearId::fromString($academicYearId),
|
||||
);
|
||||
|
||||
$this->commandBus->dispatch(new ImportStudentsCommand(
|
||||
batchId: (string) $batch->id,
|
||||
|
||||
Reference in New Issue
Block a user