Files
Classeo/backend/src/Scolarite/Infrastructure/Service/DoctrineClassStudentsReader.php
Mathias STRASSER df25a8cbb0
Some checks failed
CI / Backend Tests (push) Has been cancelled
CI / Frontend Tests (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
CI / Naming Conventions (push) Has been cancelled
CI / Build Check (push) Has been cancelled
feat: Permettre à l'élève de rendre un devoir avec réponse texte et pièces jointes
L'élève peut désormais répondre à un devoir via un éditeur WYSIWYG,
joindre des fichiers (PDF, JPEG, PNG, DOCX), sauvegarder un brouillon
et soumettre définitivement son rendu. Le système détecte automatiquement
les soumissions en retard par rapport à la date d'échéance.

Côté enseignant, une page dédiée affiche la liste complète des élèves
avec leur statut (soumis, en retard, brouillon, non rendu), le détail
de chaque rendu avec ses pièces jointes téléchargeables, et les
statistiques de rendus par classe.
2026-03-25 19:38:47 +01:00

48 lines
1.3 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Scolarite\Infrastructure\Service;
use App\Scolarite\Application\Port\ClassStudentsReader;
use App\Shared\Domain\Tenant\TenantId;
use function array_map;
use Doctrine\DBAL\Connection;
use Override;
final readonly class DoctrineClassStudentsReader implements ClassStudentsReader
{
public function __construct(
private Connection $connection,
) {
}
#[Override]
public function studentsInClass(string $classId, TenantId $tenantId): array
{
/** @var array<array{id: string, first_name: string, last_name: string}> $rows */
$rows = $this->connection->fetchAllAssociative(
'SELECT u.id, u.first_name, u.last_name
FROM class_assignments ca
JOIN users u ON u.id = ca.user_id
WHERE ca.school_class_id = :class_id
AND ca.tenant_id = :tenant_id
ORDER BY u.last_name ASC, u.first_name ASC',
[
'class_id' => $classId,
'tenant_id' => (string) $tenantId,
],
);
return array_map(
static fn (array $row): array => [
'id' => $row['id'],
'name' => $row['first_name'] . ' ' . $row['last_name'],
],
$rows,
);
}
}