Lorsqu'un super-admin crée un établissement via l'interface, le système doit automatiquement créer la base tenant, exécuter les migrations, créer le premier utilisateur admin et envoyer l'invitation — le tout de manière asynchrone pour ne pas bloquer la réponse HTTP. Ce mécanisme rend chaque établissement opérationnel dès sa création sans intervention manuelle sur l'infrastructure.
65 lines
2.0 KiB
PHP
65 lines
2.0 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Scolarite\Application\Service;
|
|
|
|
use App\Scolarite\Application\Query\GetClassStatisticsDetail\ClassStatisticsDetailDto;
|
|
|
|
use function fclose;
|
|
use function fopen;
|
|
use function fputcsv;
|
|
use function fwrite;
|
|
use function rewind;
|
|
use function stream_get_contents;
|
|
|
|
final class StatisticsExporter
|
|
{
|
|
/**
|
|
* Exporte les statistiques d'une classe au format CSV.
|
|
*
|
|
* Structure : Nom, Moyenne, En difficulté, Tendance
|
|
* En-tête avec résumé : Moyenne de classe, Taux de réussite
|
|
*/
|
|
public function exportClassToCsv(
|
|
ClassStatisticsDetailDto $stats,
|
|
string $className,
|
|
string $subjectName,
|
|
): string {
|
|
$handle = fopen('php://temp', 'r+');
|
|
|
|
if ($handle === false) {
|
|
return '';
|
|
}
|
|
|
|
// BOM UTF-8 pour compatibilité Excel sur Windows
|
|
fwrite($handle, "\xEF\xBB\xBF");
|
|
|
|
fputcsv($handle, ['Statistiques - ' . $className . ' - ' . $subjectName], separator: ';');
|
|
fputcsv($handle, [], separator: ';');
|
|
fputcsv($handle, ['Moyenne de classe', $stats->average !== null ? (string) $stats->average : 'N/A'], separator: ';');
|
|
fputcsv($handle, ['Taux de réussite', $stats->successRate . '%'], separator: ';');
|
|
fputcsv($handle, [], separator: ';');
|
|
fputcsv($handle, ['Élève', 'Moyenne', 'En difficulté', 'Tendance'], separator: ';');
|
|
|
|
foreach ($stats->students as $student) {
|
|
fputcsv($handle, [
|
|
$student->studentName,
|
|
$student->average !== null ? (string) $student->average : 'N/A',
|
|
$student->inDifficulty ? 'Oui' : 'Non',
|
|
match ($student->trend) {
|
|
'improving' => 'Progression',
|
|
'declining' => 'Régression',
|
|
default => 'Stable',
|
|
},
|
|
], separator: ';');
|
|
}
|
|
|
|
rewind($handle);
|
|
$csv = stream_get_contents($handle);
|
|
fclose($handle);
|
|
|
|
return $csv !== false ? $csv : '';
|
|
}
|
|
}
|