Quand un établissement configure des règles de devoirs en mode "soft", l'enseignant est maintenant averti avant la création si la date d'échéance ne respecte pas les contraintes (délai minimum, pas de lundi après un certain créneau). Il peut alors choisir de continuer (avec traçabilité) ou de modifier la date vers une date conforme. Le mode "hard" (blocage) reste protégé : acknowledgeWarning ne permet pas de contourner les règles bloquantes, préparant la story 5.5.
82 lines
3.0 KiB
PHP
82 lines
3.0 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Scolarite\Application\Command\CreateHomework;
|
|
|
|
use App\Administration\Domain\Model\SchoolClass\ClassId;
|
|
use App\Administration\Domain\Model\Subject\SubjectId;
|
|
use App\Administration\Domain\Model\User\UserId;
|
|
use App\Scolarite\Application\Port\CurrentCalendarProvider;
|
|
use App\Scolarite\Application\Port\EnseignantAffectationChecker;
|
|
use App\Scolarite\Application\Port\HomeworkRulesChecker;
|
|
use App\Scolarite\Domain\Exception\EnseignantNonAffecteException;
|
|
use App\Scolarite\Domain\Exception\ReglesDevoirsNonRespecteesException;
|
|
use App\Scolarite\Domain\Model\Homework\Homework;
|
|
use App\Scolarite\Domain\Repository\HomeworkRepository;
|
|
use App\Scolarite\Domain\Service\DueDateValidator;
|
|
use App\Shared\Domain\Clock;
|
|
use App\Shared\Domain\Tenant\TenantId;
|
|
use DateTimeImmutable;
|
|
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
|
|
|
|
#[AsMessageHandler(bus: 'command.bus')]
|
|
final readonly class CreateHomeworkHandler
|
|
{
|
|
public function __construct(
|
|
private HomeworkRepository $homeworkRepository,
|
|
private EnseignantAffectationChecker $affectationChecker,
|
|
private CurrentCalendarProvider $calendarProvider,
|
|
private DueDateValidator $dueDateValidator,
|
|
private HomeworkRulesChecker $rulesChecker,
|
|
private Clock $clock,
|
|
) {
|
|
}
|
|
|
|
public function __invoke(CreateHomeworkCommand $command): Homework
|
|
{
|
|
$tenantId = TenantId::fromString($command->tenantId);
|
|
$classId = ClassId::fromString($command->classId);
|
|
$subjectId = SubjectId::fromString($command->subjectId);
|
|
$teacherId = UserId::fromString($command->teacherId);
|
|
$now = $this->clock->now();
|
|
|
|
if (!$this->affectationChecker->estAffecte($teacherId, $classId, $subjectId, $tenantId)) {
|
|
throw EnseignantNonAffecteException::pourClasseEtMatiere($teacherId, $classId, $subjectId);
|
|
}
|
|
|
|
$calendar = $this->calendarProvider->forCurrentYear($tenantId);
|
|
$dueDate = new DateTimeImmutable($command->dueDate);
|
|
$this->dueDateValidator->valider($dueDate, $now, $calendar);
|
|
|
|
$rulesResult = $this->rulesChecker->verifier($tenantId, $dueDate, $now);
|
|
|
|
if ($rulesResult->estBloquant()) {
|
|
throw new ReglesDevoirsNonRespecteesException($rulesResult->toArray());
|
|
}
|
|
|
|
if ($rulesResult->estAvertissement() && !$command->acknowledgeWarning) {
|
|
throw new ReglesDevoirsNonRespecteesException($rulesResult->toArray());
|
|
}
|
|
|
|
$homework = Homework::creer(
|
|
tenantId: $tenantId,
|
|
classId: $classId,
|
|
subjectId: $subjectId,
|
|
teacherId: $teacherId,
|
|
title: $command->title,
|
|
description: $command->description,
|
|
dueDate: $dueDate,
|
|
now: $now,
|
|
);
|
|
|
|
if ($command->acknowledgeWarning && $rulesResult->estAvertissement()) {
|
|
$homework->acknowledgeRuleWarning($rulesResult->ruleTypes(), $now);
|
|
}
|
|
|
|
$this->homeworkRepository->save($homework);
|
|
|
|
return $homework;
|
|
}
|
|
}
|