OnParametersChange.php 6.9 KB

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