|
|
@@ -0,0 +1,146 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+namespace App\Service\OnlineRegistration;
|
|
|
+
|
|
|
+use App\Entity\AccessWish\AccessWish;
|
|
|
+use App\Entity\Access\Access;
|
|
|
+use App\Service\Utils\DatesUtils;
|
|
|
+use App\Enum\OnlineRegistration\RegistrationStatusEnum;
|
|
|
+use App\Enum\OnlineRegistration\WishRegistrationEnum;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Fournit le statut de l'enregistrement en ligne d'un Access
|
|
|
+ */
|
|
|
+class RegistrationStatusService
|
|
|
+{
|
|
|
+ /**
|
|
|
+ * Temps de validité du statut (en jours)
|
|
|
+ * (correspond au temps d'affichage de l'avertissement dans l'application)
|
|
|
+ */
|
|
|
+ const DISPLAYING_TIME = 30;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Détermine er retourne le statut de l'enregistrement en ligne d'un Access.
|
|
|
+ *
|
|
|
+ * @param Access $access
|
|
|
+ * @return string|null
|
|
|
+ */
|
|
|
+ public function getStatus(Access $access): string | null {
|
|
|
+
|
|
|
+ $currentAccessWish = $this->getCurrentAccessWish($access);
|
|
|
+ if ($currentAccessWish === null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!$currentAccessWish->getAccessFamilyWish()->isRegistrationCompleted()) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ $numberByStatus = $this->getCountEducationsByRegistrationStatus($currentAccessWish);
|
|
|
+ if ($numberByStatus === null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ $hasNegotiable = $numberByStatus[RegistrationStatusEnum::NEGOTIABLE()->getValue()] > 0;
|
|
|
+ $hasAccepted = $numberByStatus[RegistrationStatusEnum::ACCEPTED()->getValue()] > 0;
|
|
|
+ $hasPending = $numberByStatus[RegistrationStatusEnum::PENDING()->getValue()] > 0;
|
|
|
+ $hasDenied = $numberByStatus[RegistrationStatusEnum::DENIED()->getValue()] > 0;
|
|
|
+
|
|
|
+ // Après acceptation ou refus, le bandeau est affiché pour une durée de 30 jours.
|
|
|
+ if(
|
|
|
+ !$hasNegotiable && ($hasAccepted || $hasDenied) &&
|
|
|
+ $this->getDaysSinceLastUpdate($currentAccessWish) > self::DISPLAYING_TIME
|
|
|
+ ) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!$hasAccepted && !$hasPending && $hasNegotiable) {
|
|
|
+ // La demande est dans la liste des inscriptions en ligne et n'a pas été traitée par l'administration
|
|
|
+ return RegistrationStatusEnum::NEGOTIABLE()->getValue();
|
|
|
+ }
|
|
|
+ else if ($hasPending && !$hasAccepted) {
|
|
|
+ // La demande est dans la liste des inscriptions en ligne car l'administration a mis "En attente" à au moins l'un des enseignements.
|
|
|
+ return RegistrationStatusEnum::PENDING()->getValue();
|
|
|
+ }
|
|
|
+ else if ($hasAccepted)
|
|
|
+ {
|
|
|
+ // La demande a été traitée par l'administration. L'élève a été accepté pour au moins l'une de ses activités.
|
|
|
+ // Et il a été placé dans la liste des "Inscriptions rentrée prochaine".
|
|
|
+ return RegistrationStatusEnum::ACCEPTED()->getValue();
|
|
|
+ }
|
|
|
+ else if ($hasDenied && !$hasNegotiable) {
|
|
|
+ // La demande a été traitée par l'administration. L'élève n'a pas été accepté dans l'établissement.
|
|
|
+ // Il est dans la liste des "Inscriptions en ligne" avec le statut "Refusé" sur tous ses enseignements.
|
|
|
+ return RegistrationStatusEnum::DENIED();
|
|
|
+ }
|
|
|
+
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Retourne le premier AccessWish correspondant à l'année en cours, ou null si aucun n'est trouvé
|
|
|
+ *
|
|
|
+ * @param Access $access
|
|
|
+ * @return AccessWish | null
|
|
|
+ */
|
|
|
+ private function getCurrentAccessWish(Access $access): AccessWish | null {
|
|
|
+ $currentYear = DatesUtils::new()->format('Y');
|
|
|
+
|
|
|
+ foreach ($access->getAccessWishes() as $accessWish)
|
|
|
+ {
|
|
|
+ /** @var AccessWish $accessWish */
|
|
|
+ if ($accessWish->getCreateDate()->format('Y') === $currentYear) {
|
|
|
+ return $accessWish;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @param AccessWish $currentAccessWish
|
|
|
+ * @return int
|
|
|
+ * @throws \Exception
|
|
|
+ */
|
|
|
+ private function getDaysSinceLastUpdate(AccessWish $currentAccessWish): int {
|
|
|
+ return (int)DatesUtils::new()
|
|
|
+ ->diff($currentAccessWish->getAccessFamilyWish()->getUpdateDate())
|
|
|
+ ->format("%a");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Retourne le décompte des souhaits de l'utilisateur par RegistrationStatus, ou null si aucun souhaits.
|
|
|
+ *
|
|
|
+ * @param AccessWish $currentAccessWish
|
|
|
+ * @return array<string, int> | null
|
|
|
+ */
|
|
|
+ private function getCountEducationsByRegistrationStatus(AccessWish $currentAccessWish): array | null {
|
|
|
+
|
|
|
+ $wishes = $currentAccessWish->getEducationStudentWishes();
|
|
|
+ $reregistrationWishes = $currentAccessWish->getEducationStudentReregistrationsWishes();
|
|
|
+
|
|
|
+ if ($reregistrationWishes->count() === 0 && $wishes->count() === 0) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ $registrationStatuses = [
|
|
|
+ RegistrationStatusEnum::NEGOTIABLE()->getValue() => 0,
|
|
|
+ RegistrationStatusEnum::ACCEPTED()->getValue() => 0,
|
|
|
+ RegistrationStatusEnum::PENDING()->getValue() => 0,
|
|
|
+ RegistrationStatusEnum::DENIED()->getValue() => 0
|
|
|
+ ];
|
|
|
+
|
|
|
+ foreach ($reregistrationWishes as $reregistrationWish) {
|
|
|
+ if ($reregistrationWish->getWishRegistration() !== WishRegistrationEnum::REREGISTER()->getValue()) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ $registrationStatuses[$reregistrationWish->getRegistrationStatus()]++;
|
|
|
+ }
|
|
|
+
|
|
|
+ foreach ($wishes as $educationStudentWish){
|
|
|
+ $registrationStatuses[$educationStudentWish->getRegistrationStatus()]++;
|
|
|
+ }
|
|
|
+
|
|
|
+ return $registrationStatuses;
|
|
|
+ }
|
|
|
+}
|