RegistrationStatusService.php 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. <?php
  2. namespace App\Service\OnlineRegistration;
  3. use App\Entity\Access\Access;
  4. use App\Entity\AccessWish\AccessWish;
  5. use App\Enum\OnlineRegistration\RegistrationStatusEnum;
  6. use App\Enum\OnlineRegistration\WishRegistrationEnum;
  7. use App\Service\Utils\DatesUtils;
  8. /**
  9. * --- SERVICE INUTILISE POUR LE MOMENT ---
  10. * Fournit le statut de l'enregistrement en ligne d'un Access.
  11. */
  12. class RegistrationStatusService
  13. {
  14. /**
  15. * Temps de validité du statut (en jours)
  16. * (correspond au temps d'affichage de l'avertissement dans l'application).
  17. */
  18. public const DISPLAYING_TIME = 30;
  19. public function __construct(
  20. private OnlineRegistrationService $onlineRegistrationService,
  21. ) {
  22. }
  23. /**
  24. * Détermine er retourne le statut de l'enregistrement en ligne d'un Access.
  25. */
  26. public function getStatus(Access $access): ?RegistrationStatusEnum
  27. {
  28. $currentAccessWish = $this->onlineRegistrationService->getCurrentAccessWish($access);
  29. if ($currentAccessWish === null) {
  30. // TODO: est-ce qu'il ne faudrait pas plutôt lever une erreur ici plutôt que de retourner null?
  31. return null;
  32. }
  33. if (!$currentAccessWish->getAccessFamilyWish()->isRegistrationCompleted()) {
  34. // TODO: est-ce qu'on ne retournerait pas un statut incomplet plutôt que null?
  35. return null;
  36. }
  37. $wishesCountByStatus = $this->countEducationsByRegistrationStatus($currentAccessWish);
  38. if ($wishesCountByStatus === null) {
  39. // TODO: est-ce qu'il ne faudrait pas plutôt lever une erreur ici plutôt que de retourner null?
  40. return null;
  41. }
  42. $hasNegotiable = $wishesCountByStatus[RegistrationStatusEnum::NEGOTIABLE->value] > 0;
  43. $hasAccepted = $wishesCountByStatus[RegistrationStatusEnum::ACCEPTED->value] > 0;
  44. $hasPending = $wishesCountByStatus[RegistrationStatusEnum::PENDING->value] > 0;
  45. $hasDenied = $wishesCountByStatus[RegistrationStatusEnum::DENIED->value] > 0;
  46. // Après acceptation ou refus, le bandeau est affiché pour une durée de 30 jours.
  47. if (
  48. !$hasNegotiable && ($hasAccepted || $hasDenied)
  49. && $this->getDaysSinceLastUpdate($currentAccessWish) > self::DISPLAYING_TIME
  50. ) {
  51. // TODO: est-ce qu'on ne retournerait pas ici un statut EXPIRED par ex?
  52. return null;
  53. }
  54. if (!$hasAccepted && !$hasPending && $hasNegotiable) {
  55. // La demande est dans la liste des inscriptions en ligne et n'a pas été traitée par l'administration
  56. return RegistrationStatusEnum::NEGOTIABLE;
  57. } elseif ($hasPending && !$hasAccepted) {
  58. // La demande est dans la liste des inscriptions en ligne car l'administration a mis "En attente" à au moins l'un des enseignements.
  59. return RegistrationStatusEnum::PENDING;
  60. } elseif ($hasAccepted) {
  61. // La demande a été traitée par l'administration. L'élève a été accepté pour au moins l'une de ses activités.
  62. // Et il a été placé dans la liste des "Inscriptions rentrée prochaine".
  63. return RegistrationStatusEnum::ACCEPTED;
  64. } elseif ($hasDenied && !$hasNegotiable) {
  65. // La demande a été traitée par l'administration. L'élève n'a pas été accepté dans l'établissement.
  66. // Il est dans la liste des "Inscriptions en ligne" avec le statut "Refusé" sur tous ses enseignements.
  67. return RegistrationStatusEnum::DENIED;
  68. }
  69. // TODO: est-ce qu'il ne faudrait pas plutôt lever une erreur ici plutôt que de retourner null?
  70. return null;
  71. }
  72. public function getDaysSinceLastUpdate(AccessWish $accessWish): int
  73. {
  74. $lastUpdate = $accessWish->getAccessFamilyWish()->getUpdateDate();
  75. return DatesUtils::daysSince($lastUpdate);
  76. }
  77. /**
  78. * Retourne le décompte des souhaits de l'utilisateur par RegistrationStatus, ou null si aucun souhaits.
  79. *
  80. * @return array<string, int>|null
  81. */
  82. protected function countEducationsByRegistrationStatus(AccessWish $currentAccessWish): ?array
  83. {
  84. $wishes = $currentAccessWish->getEducationStudentWishes();
  85. $reregistrationWishes = $currentAccessWish->getEducationStudentReregistrationsWishes();
  86. if ($reregistrationWishes->isEmpty() && $wishes->isEmpty()) {
  87. // TODO: est-ce qu'il ne faudrait pas plutôt lever une erreur ici plutôt que de retourner null?
  88. return null;
  89. }
  90. $registrationStatuses = [
  91. RegistrationStatusEnum::NEGOTIABLE->value => 0,
  92. RegistrationStatusEnum::ACCEPTED->value => 0,
  93. RegistrationStatusEnum::PENDING->value => 0,
  94. RegistrationStatusEnum::DENIED->value => 0,
  95. ];
  96. foreach ($reregistrationWishes as $reregistrationWish) {
  97. if ($reregistrationWish->getWishRegistration() !== WishRegistrationEnum::REREGISTER) {
  98. continue;
  99. }
  100. ++$registrationStatuses[$reregistrationWish->getRegistrationStatus()];
  101. }
  102. foreach ($wishes as $educationStudentWish) {
  103. ++$registrationStatuses[$educationStudentWish->getRegistrationStatus()];
  104. }
  105. return $registrationStatuses;
  106. }
  107. }