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.
49 lines
1.3 KiB
PHP
49 lines
1.3 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Administration\Application\Service\Import;
|
|
|
|
use App\Shared\Domain\Tenant\TenantId;
|
|
use Doctrine\DBAL\Connection;
|
|
|
|
/**
|
|
* Charge les enseignants existants d'un tenant
|
|
* afin de détecter les doublons à l'import.
|
|
*/
|
|
final readonly class ExistingTeacherFinder
|
|
{
|
|
public function __construct(
|
|
private Connection $connection,
|
|
) {
|
|
}
|
|
|
|
/**
|
|
* @return list<array{firstName: string, lastName: string, email: string}>
|
|
*/
|
|
public function findAllForTenant(TenantId $tenantId): array
|
|
{
|
|
$sql = <<<'SQL'
|
|
SELECT u.first_name, u.last_name, u.email
|
|
FROM users u
|
|
WHERE u.tenant_id = :tenant_id
|
|
AND u.roles::jsonb @> :role
|
|
SQL;
|
|
|
|
/** @var list<array{first_name: string, last_name: string, email: string}> $rows */
|
|
$rows = $this->connection->fetchAllAssociative($sql, [
|
|
'tenant_id' => (string) $tenantId,
|
|
'role' => '"ROLE_PROF"',
|
|
]);
|
|
|
|
return array_map(
|
|
static fn (array $row) => [
|
|
'firstName' => $row['first_name'],
|
|
'lastName' => $row['last_name'],
|
|
'email' => $row['email'],
|
|
],
|
|
$rows,
|
|
);
|
|
}
|
|
}
|