ソースを参照

datapersister parametre

Vincent GUFFON 3 年 前
コミット
9c2979a573

+ 7 - 0
src/DataPersister/Organization/ParametersDataPersister.php

@@ -6,6 +6,7 @@ namespace App\DataPersister\Organization;
 use ApiPlatform\Core\DataPersister\ContextAwareDataPersisterInterface;
 use App\Entity\Organization\Parameters;
 use App\Message\Command\Parameters\AverageChange;
+use App\Message\Command\Parameters\MusicalDateChange;
 use App\Service\Organization\OnParametersChange;
 use Exception;
 use Symfony\Component\Messenger\MessageBusInterface;
@@ -52,9 +53,15 @@ class ParametersDataPersister implements ContextAwareDataPersisterInterface
         if($previousParameters->getAdvancedEducationNotationType() != $parameters->getAdvancedEducationNotationType()){
             $this->onParametersChange->onAdvancedEducationNotationType($parameters);
         }
+
+        //La date de début d'activité change
+        if($previousParameters->getMusicalDate() != $parameters->getMusicalDate()){
+            $this->onParametersChange->onMusicalDate($parameters->getOrganization(), $previousParameters->getMusicalDate());
+        }
     }
 
     public function postPersist(Parameters $previousParameters, Parameters $parameters): void{
+        //La note maximale du suivi pédagogique change
         if($previousParameters->getAverage() != $parameters->getAverage()){
             $this->messageBus->dispatch(
                 new AverageChange($parameters->getId())

+ 39 - 2
src/Service/Organization/OnParametersChange.php

@@ -4,18 +4,23 @@ declare(strict_types=1);
 
 namespace App\Service\Organization;
 
+use App\Entity\Booking\Course;
 use App\Entity\Education\EducationNotationConfig;
+use App\Entity\Organization\Organization;
 use App\Entity\Organization\Parameters;
 use App\Enum\Education\AdvancedEducationNotationTypeEnum;
-use App\Repository\Education\EducationNotationConfigRepository;
+use App\Repository\Booking\CourseRepository;
 use App\Test\Service\Organization\OnParametersChangeTest;
+use App\Service\Organization\Utils as organizationUtils;
 
 /**
  * Classe OnParametersChange qui comporte toutes les opérations automatiquent se produisant lors de l'évolution des paramètres
  */
 class OnParametersChange
 {
-    public function __construct(){ }
+    public function __construct(
+        private CourseRepository $courseRepository
+    ){ }
 
     /**
      * Si le le type de grilles d'évaluation évolue, il faut "nettoyer" les curriculums/teachers associés au type précédent
@@ -37,4 +42,36 @@ class OnParametersChange
             }
         }
     }
+
+    /**
+     * Permet de mettre à jour l'année de début des cours concernés suivant la date de l'activité musicale qui vient d'être changés
+     * @param Organization $organization
+     * @param \DateTimeInterface $previousMusicalDate
+     * @param \DateTimeInterface $newMusicalDate
+     * @throws \Exception
+     * @see OnParametersChangeTest::testOnMusicalDate()
+     */
+    public function onMusicalDate(Organization $organization, \DateTimeInterface $previousMusicalDate): void{
+        $currentMusicalDate = $organization->getParameters()->getMusicalDate();
+
+        if($previousMusicalDate > $currentMusicalDate){
+            $lowerDate = $currentMusicalDate;
+            $higherDate = $previousMusicalDate;
+        }else{
+            $lowerDate = $previousMusicalDate;
+            $higherDate = $currentMusicalDate;
+        }
+
+        $startDate = new \DateTime(date('Y') . '-' . $lowerDate->format('m-d'));
+        $endDate = new \DateTime(date('Y') . '-' . $higherDate->format('m-d'));
+
+        $coursesToUpdate = $this->courseRepository->getCoursesToFrom($organization, $startDate, $endDate);
+
+        /** @var Course $course */
+        foreach ($coursesToUpdate as $course){
+            $year = organizationUtils::getActivityYearSwitchDate($organization, $course->getDatetimeStart());
+            $course->setStartYear($year);
+            $course->setEndYear($year + 1);
+        }
+    }
 }

+ 27 - 0
src/Service/Organization/Utils.php

@@ -97,6 +97,7 @@ class Utils
      * @param int $year
      * @return \DateTime[]
      * @throws \Exception
+     * @see UtilsTest::testGetActivityPeriodsSwitchYear()
      */
     public static function getActivityPeriodsSwitchYear(Organization $organization, int $year): array
     {
@@ -116,4 +117,30 @@ class Utils
             self::END_DATE_KEY => $dateEnd->format('Y-m-d')
         ];
     }
+
+    /**
+     * Permet de retrouver quelle sera la date d'activité correspondant à une date précise de l'année
+     * @param Organization $organization
+     * @param \DateTimeInterface $date
+     * @return int
+     * @throws \Exception
+     * @see UtilsTest::testgetActivityYearSwitchDate()
+     */
+    public static function getActivityYearSwitchDate(Organization $organization, \DateTimeInterface $date): int
+    {
+        $year = $date->format('Y');
+        $musicalDate = $organization->getParameters()->getMusicalDate();
+
+        if (empty($musicalDate)) {
+            $startDate = new \DateTime($year.'-08-31');
+        }else{
+            $startDate = new \DateTime($musicalDate->format($year.'-m-d'));
+        }
+
+        $pivotDate = new \DateTime($year . '-01-01');
+
+        if($date >= $pivotDate && $date < $startDate)
+            return  (int) ($year - 1);
+        else return (int) $year;
+    }
 }