OnParametersChange.php 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Service\OnChange\Organization;
  4. use App\Entity\Booking\Course;
  5. use App\Entity\Education\EducationNotationConfig;
  6. use App\Entity\Organization\Parameters;
  7. use App\Enum\Education\AdvancedEducationNotationTypeEnum;
  8. use App\Message\Message\Typo3\Typo3Delete;
  9. use App\Message\Message\Typo3\Typo3JustMakeItWork;
  10. use App\Message\Message\Typo3\Typo3Update;
  11. use App\Repository\Booking\CourseRepository;
  12. use App\Service\Network\Utils as NetworkUtils;
  13. use App\Service\OnChange\OnChangeContext;
  14. use App\Service\OnChange\OnChangeDefault;
  15. use App\Service\Organization\Utils as OrganizationUtils;
  16. use Symfony\Component\Messenger\MessageBusInterface;
  17. /**
  18. * Classe OnParametersChange qui comporte toutes les opérations automatiques se produisant lors de l'évolution des paramètres.
  19. */
  20. class OnParametersChange extends OnChangeDefault
  21. {
  22. public function __construct(
  23. private CourseRepository $courseRepository,
  24. private NetworkUtils $networkUtils,
  25. private OrganizationUtils $organizationUtils,
  26. private MessageBusInterface $messageBus,
  27. ) {
  28. }
  29. /** @noinspection PhpParameterNameChangedDuringInheritanceInspection */
  30. public function validate(mixed $parameters, OnChangeContext $context): void
  31. {
  32. // Une structure CMF n'a pas le droit de désactiver son site typo3
  33. if (
  34. $parameters->getDesactivateOpentalentSiteWeb() === true
  35. && (!$context->previousData() || $context->previousData()->getDesactivateOpentalentSiteWeb() !== true)
  36. && $this->networkUtils->isCMFAndActiveNow($parameters->getOrganization())
  37. ) {
  38. throw new \RuntimeException('This structure is currently active in the CMF network, the website can not be disabled.');
  39. }
  40. }
  41. /**
  42. * @param Parameters $parameters
  43. *
  44. * @throws \Exception
  45. *
  46. * @noinspection PhpParameterNameChangedDuringInheritanceInspection
  47. */
  48. public function beforeChange($parameters, OnChangeContext $context): void
  49. {
  50. // Le type de notation a changé
  51. if (
  52. $context->previousData()
  53. && $context->previousData()->getAdvancedEducationNotationType() !== $parameters->getAdvancedEducationNotationType()
  54. ) {
  55. $this->onAdvancedEducationNotationTypeChange($parameters);
  56. }
  57. // La date de début d'activité change
  58. if (
  59. $context->previousData()
  60. && $context->previousData()->getMusicalDate()?->getTimestamp() !== $parameters->getMusicalDate()?->getTimestamp()
  61. ) {
  62. $this->onMusicalDateChange(
  63. $parameters,
  64. $context->previousData()->getMusicalDate()
  65. );
  66. }
  67. }
  68. /**
  69. * @param Parameters $parameters
  70. *
  71. * @noinspection PhpParameterNameChangedDuringInheritanceInspection
  72. */
  73. public function onChange($parameters, OnChangeContext $context): void
  74. {
  75. // Le customDomain a été modifié, on met à jour le site typo3 (s'il est actif)
  76. if (
  77. $context->previousData()
  78. && !$parameters->getDesactivateOpentalentSiteWeb()
  79. && $context->previousData()->getCustomDomain() !== $parameters->getCustomDomain()
  80. ) {
  81. $this->messageBus->dispatch(
  82. new Typo3Update($parameters->getOrganization()->getId())
  83. );
  84. }
  85. // Le site web opentalent a été désactivé / réactivé
  86. if (
  87. $context->previousData()
  88. && $context->previousData()->getDesactivateOpentalentSiteWeb() !== $parameters->getDesactivateOpentalentSiteWeb()
  89. ) {
  90. if ($parameters->getDesactivateOpentalentSiteWeb()) {
  91. $this->messageBus->dispatch(
  92. new Typo3Delete($parameters->getOrganization()->getId())
  93. );
  94. } else {
  95. $this->messageBus->dispatch(
  96. new Typo3JustMakeItWork($parameters->getOrganization()->getId())
  97. );
  98. }
  99. }
  100. }
  101. /**
  102. * Si le type de grilles d'évaluation évolue, il faut "nettoyer" les curriculums/teachers associés au type précédent.
  103. *
  104. * @see OnParametersChangeTest::testOnAdvancedEducationNotationTypeByTeachersChange()
  105. * @see OnParametersChangeTest::testOnAdvancedEducationNotationTypeByEducationChange()
  106. */
  107. public function onAdvancedEducationNotationTypeChange(Parameters $parameters): void
  108. {
  109. foreach ($parameters->getOrganization()->getEducationNotationConfigs() as $educationNotationConfig) {
  110. /* @var EducationNotationConfig $educationNotationConfig */
  111. if ($parameters->getAdvancedEducationNotationType() === AdvancedEducationNotationTypeEnum::BY_TEACHER) {
  112. foreach ($educationNotationConfig->getEducationCurriculums() as $educationCurriculum) {
  113. $educationCurriculum->setEducationNotationConfig(null);
  114. }
  115. } else {
  116. foreach ($educationNotationConfig->getTeachers() as $teacher) {
  117. $teacher->setEducationNotationConfig(null);
  118. }
  119. }
  120. }
  121. }
  122. /**
  123. * Permet de mettre à jour l'année de début des cours concernés suivant la date
  124. * de l'activité musicale qui vient d'être changée.
  125. *
  126. * @throws \Exception
  127. *
  128. * @see OnParametersChangeTest::testOnMusicalDateChange()
  129. */
  130. public function onMusicalDateChange(Parameters $parameters, \DateTimeInterface $previousMusicalDate): void
  131. {
  132. $currentMusicalDate = $parameters->getMusicalDate();
  133. if ($previousMusicalDate->getTimestamp() > $currentMusicalDate->getTimestamp()) {
  134. $lowerDate = $currentMusicalDate;
  135. $higherDate = $previousMusicalDate;
  136. } else {
  137. $lowerDate = $previousMusicalDate;
  138. $higherDate = $currentMusicalDate;
  139. }
  140. $startDate = new \DateTime(date('Y').'-'.$lowerDate->format('m-d'));
  141. $endDate = new \DateTime(date('Y').'-'.$higherDate->format('m-d'));
  142. $coursesToUpdate = $this->courseRepository->getCoursesToFrom($parameters->getOrganization(), $startDate, $endDate);
  143. /** @var Course $course */
  144. foreach ($coursesToUpdate as $course) {
  145. $year = $this->organizationUtils->getActivityYearSwitchDate(
  146. $parameters->getOrganization(),
  147. $course->getDatetimeStart()
  148. );
  149. $course->setStartYear($year);
  150. $course->setEndYear($year + 1);
  151. }
  152. }
  153. }