RegistrationStatusService.php 5.4 KB

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