OnParametersChange.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  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\Typo3Undelete;
  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 automatiquent 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. && $this->networkUtils->isCMFAndActiveNow($parameters->getOrganization())
  36. ) {
  37. throw new \RuntimeException('This structure is currently active in the CMF network, the website can not be disabled.');
  38. }
  39. }
  40. /**
  41. * @param Parameters $parameters
  42. *
  43. * @throws \Exception
  44. *
  45. * @noinspection PhpParameterNameChangedDuringInheritanceInspection
  46. */
  47. public function beforeChange($parameters, OnChangeContext $context): void
  48. {
  49. // Le type de notation a changé
  50. if (
  51. $context->previousData()
  52. && $context->previousData()->getAdvancedEducationNotationType() !== $parameters->getAdvancedEducationNotationType()
  53. ) {
  54. $this->onAdvancedEducationNotationTypeChange($parameters);
  55. }
  56. // La date de début d'activité change
  57. if (
  58. $context->previousData()
  59. && $context->previousData()->getMusicalDate() !== $parameters->getMusicalDate()
  60. ) {
  61. $this->onMusicalDateChange(
  62. $parameters,
  63. $context->previousData()->getMusicalDate()
  64. );
  65. }
  66. }
  67. /**
  68. * @param Parameters $parameters
  69. *
  70. * @noinspection PhpParameterNameChangedDuringInheritanceInspection
  71. */
  72. public function onChange($parameters, OnChangeContext $context): void
  73. {
  74. // Le customDomain a été modifié, on met à jour le site typo3 (s'il est actif)
  75. if (
  76. $context->previousData()
  77. && !$parameters->getDesactivateOpentalentSiteWeb()
  78. && $context->previousData()->getCustomDomain() !== $parameters->getCustomDomain()
  79. ) {
  80. $this->messageBus->dispatch(
  81. new Typo3Update($parameters->getOrganization()->getId())
  82. );
  83. }
  84. // Le site web opentalent a été désactivé / réactivé
  85. if (
  86. $context->previousData()
  87. && $context->previousData()->getDesactivateOpentalentSiteWeb() !== $parameters->getDesactivateOpentalentSiteWeb()
  88. ) {
  89. if ($parameters->getDesactivateOpentalentSiteWeb()) {
  90. $this->messageBus->dispatch(
  91. new Typo3Delete($parameters->getOrganization()->getId())
  92. );
  93. } else {
  94. $this->messageBus->dispatch(
  95. new Typo3Undelete($parameters->getOrganization()->getId())
  96. );
  97. $this->messageBus->dispatch(
  98. new Typo3Update($parameters->getOrganization()->getId())
  99. );
  100. }
  101. }
  102. }
  103. /**
  104. * Si le type de grilles d'évaluation évolue, il faut "nettoyer" les curriculums/teachers associés au type précédent.
  105. *
  106. * @see OnParametersChangeTest::testOnAdvancedEducationNotationTypeByTeachersChange()
  107. * @see OnParametersChangeTest::testOnAdvancedEducationNotationTypeByEducationChange()
  108. */
  109. public function onAdvancedEducationNotationTypeChange(Parameters $parameters): void
  110. {
  111. foreach ($parameters->getOrganization()->getEducationNotationConfigs() as $educationNotationConfig) {
  112. /* @var EducationNotationConfig $educationNotationConfig */
  113. if ($parameters->getAdvancedEducationNotationType() === AdvancedEducationNotationTypeEnum::BY_TEACHER) {
  114. foreach ($educationNotationConfig->getEducationCurriculums() as $educationCurriculum) {
  115. $educationCurriculum->setEducationNotationConfig(null);
  116. }
  117. } else {
  118. foreach ($educationNotationConfig->getTeachers() as $teacher) {
  119. $teacher->setEducationNotationConfig(null);
  120. }
  121. }
  122. }
  123. }
  124. /**
  125. * Permet de mettre à jour l'année de début des cours concernés suivant la date
  126. * de l'activité musicale qui vient d'être changée.
  127. *
  128. * @throws \Exception
  129. *
  130. * @see OnParametersChangeTest::testOnMusicalDateChange()
  131. */
  132. public function onMusicalDateChange(Parameters $parameters, \DateTimeInterface $previousMusicalDate): void
  133. {
  134. $currentMusicalDate = $parameters->getMusicalDate();
  135. if ($previousMusicalDate > $currentMusicalDate) {
  136. $lowerDate = $currentMusicalDate;
  137. $higherDate = $previousMusicalDate;
  138. } else {
  139. $lowerDate = $previousMusicalDate;
  140. $higherDate = $currentMusicalDate;
  141. }
  142. $startDate = new \DateTime(date('Y').'-'.$lowerDate->format('m-d'));
  143. $endDate = new \DateTime(date('Y').'-'.$higherDate->format('m-d'));
  144. $coursesToUpdate = $this->courseRepository->getCoursesToFrom($parameters->getOrganization(), $startDate, $endDate);
  145. /** @var Course $course */
  146. foreach ($coursesToUpdate as $course) {
  147. $year = $this->organizationUtils->getActivityYearSwitchDate($parameters->getOrganization(), $course->getDatetimeStart());
  148. $course->setStartYear($year);
  149. $course->setEndYear($year + 1);
  150. }
  151. }
  152. }