feat: Avertir l'enseignant quand un devoir ne respecte pas les règles (mode soft)
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.
This commit is contained in:
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Scolarite\Domain\Exception;
|
||||
|
||||
use DomainException;
|
||||
|
||||
/**
|
||||
* Levée quand un devoir enfreint les règles configurées
|
||||
* et que l'enseignant n'a pas encore confirmé.
|
||||
*/
|
||||
final class ReglesDevoirsNonRespecteesException extends DomainException
|
||||
{
|
||||
/**
|
||||
* @param array<array{ruleType: string, message: string, params: array<string, mixed>}> $warnings
|
||||
*/
|
||||
public function __construct(
|
||||
public readonly array $warnings,
|
||||
) {
|
||||
parent::__construct('Le devoir ne respecte pas les règles configurées.');
|
||||
}
|
||||
}
|
||||
@@ -19,6 +19,9 @@ final class Homework extends AggregateRoot
|
||||
{
|
||||
public private(set) DateTimeImmutable $updatedAt;
|
||||
|
||||
/** @var array{warnings: string[], acknowledgedAt: string}|null */
|
||||
public private(set) ?array $ruleOverride = null;
|
||||
|
||||
private function __construct(
|
||||
public private(set) HomeworkId $id,
|
||||
public private(set) TenantId $tenantId,
|
||||
@@ -34,6 +37,17 @@ final class Homework extends AggregateRoot
|
||||
$this->updatedAt = $createdAt;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string[] $ruleTypes Types de règles contournées (ex: ['minimum_delay'])
|
||||
*/
|
||||
public function acknowledgeRuleWarning(array $ruleTypes, DateTimeImmutable $now): void
|
||||
{
|
||||
$this->ruleOverride = [
|
||||
'warnings' => $ruleTypes,
|
||||
'acknowledgedAt' => $now->format(DateTimeImmutable::ATOM),
|
||||
];
|
||||
}
|
||||
|
||||
public static function creer(
|
||||
TenantId $tenantId,
|
||||
ClassId $classId,
|
||||
@@ -110,6 +124,8 @@ final class Homework extends AggregateRoot
|
||||
|
||||
/**
|
||||
* @internal Pour usage Infrastructure uniquement
|
||||
*
|
||||
* @param array{warnings: string[], acknowledgedAt: string}|null $ruleOverride
|
||||
*/
|
||||
public static function reconstitute(
|
||||
HomeworkId $id,
|
||||
@@ -123,6 +139,7 @@ final class Homework extends AggregateRoot
|
||||
HomeworkStatus $status,
|
||||
DateTimeImmutable $createdAt,
|
||||
DateTimeImmutable $updatedAt,
|
||||
?array $ruleOverride = null,
|
||||
): self {
|
||||
$homework = new self(
|
||||
id: $id,
|
||||
@@ -138,6 +155,7 @@ final class Homework extends AggregateRoot
|
||||
);
|
||||
|
||||
$homework->updatedAt = $updatedAt;
|
||||
$homework->ruleOverride = $ruleOverride;
|
||||
|
||||
return $homework;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user