src/EventSubscriber/BPCZoneSubscriber.php line 68

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Repository\BPCZoneRepository;
  4. use App\Services\BPCScoreCalculationService;
  5. use Exception;
  6. use Pimcore\Event\DataObjectEvents;
  7. use Pimcore\Event\Model\DataObjectEvent;
  8. use Pimcore\Model\DataObject\BPCZone;
  9. use Pimcore\Model\DataObject\Service;
  10. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  11. class BPCZoneSubscriber implements EventSubscriberInterface
  12. {
  13.     public function __construct(
  14.         private BPCZoneRepository $bpcZoneRepository,
  15.         private BPCScoreCalculationService $scoreCalculationService,
  16.     )
  17.     {
  18.     }
  19.     /**
  20.      * @inheritDoc
  21.      */
  22.     public static function getSubscribedEvents(): array
  23.     {
  24.         return [
  25.             DataObjectEvents::PRE_ADD => ['onPreAdd'10],
  26.             DataObjectEvents::POST_ADD => ['onPostAdd'10],
  27.             DataObjectEvents::PRE_UPDATE => ['onPreUpdate'10],
  28.             DataObjectEvents::POST_UPDATE => ['onPostUpdate'10],
  29.             DataObjectEvents::POST_DELETE => ['onPostDelete'10],
  30.         ];
  31.     }
  32.     public function onPreAdd(DataObjectEvent $event): void
  33.     {
  34.         $bpcZone $event->getObject();
  35.         if (!($bpcZone instanceof BPCZone)) {
  36.             return;
  37.         }
  38.         if (empty($bpcZone->getBPCZ_Name())) {
  39.             $bpcZone->setBPCZ_Name($bpcZone->getKey());
  40.         }
  41.     }
  42.     /**
  43.      * @throws Exception
  44.      */
  45.     public function onPostAdd(DataObjectEvent $event): void
  46.     {
  47.         $bpcZone $event->getObject();
  48.         if (!($bpcZone instanceof BPCZone)) {
  49.             return;
  50.         }
  51.         Service::createFolderByPath($bpcZone DIRECTORY_SEPARATOR BPCZoneRepository::DEFAULT_CUSTOMER_JOURNEY_RESPONSES_FOLDER);
  52.         Service::createFolderByPath($bpcZone DIRECTORY_SEPARATOR BPCZoneRepository::DEFAULT_CUSTOMER_JOURNEY_PROOFS_FOLDER);
  53.     }
  54.     /**
  55.      * @throws Exception
  56.      */
  57.     public function onPreUpdate(DataObjectEvent $event): void
  58.     {
  59.         $bpcZone $event->getObject();
  60.         if (!($bpcZone instanceof BPCZone)) {
  61.             return;
  62.         }
  63.         if (!empty($bpcZone->getBPCZ_Name())) {
  64.             $bpczName trim($bpcZone->getBPCZ_Name());
  65.             $bpcZone->setBPCZ_Name($bpczName);
  66.             $bpcZone->setKey($bpczName);
  67.         }
  68.         $this->bpcZoneRepository->moveZoneToCorrectFolder($bpcZone);
  69.         $bpcZone->setBPCZ_ScoreZone($this->bpcZoneRepository->getZonePercentage($bpcZone));
  70.         $this->bpcZoneRepository->addCategoriesToScorePanelForQuestionnaire($bpcZone);
  71.     }
  72.     /**
  73.      * @throws Exception
  74.      */
  75.     public function onPostUpdate(DataObjectEvent $event): void
  76.     {
  77.         $bpcZone $event->getObject();
  78.         if (!($bpcZone instanceof BPCZone)) {
  79.             return;
  80.         }
  81.         $this->bpcZoneRepository->handlePostUpdateTransitionZone($bpcZone);
  82.     }
  83.     /**
  84.      * Recalculate category scores when a zone is deleted (Customer Journey)
  85.      * @throws Exception
  86.      */
  87.     public function onPostDelete(DataObjectEvent $event): void
  88.     {
  89.         $bpcZone $event->getObject();
  90.         if (!($bpcZone instanceof BPCZone)) {
  91.             return;
  92.         }
  93.         $bpcQuestionnaire $bpcZone->getBPCZ_Questionnaire();
  94.         $bpcCategory $bpcZone->getBPCZ_Category();
  95.         if (!$bpcQuestionnaire || !$bpcCategory) {
  96.             return;
  97.         }
  98.         // Clear zone from cache
  99.         $this->bpcZoneRepository->clearZoneCache(
  100.             $bpcQuestionnaire->getId(),
  101.             $bpcCategory->getId(),
  102.             $bpcZone->getId()
  103.         );
  104.         $this->scoreCalculationService->updateCategoryScoresForCustomerJourneyQuestionnaire(
  105.             [$bpcCategory],
  106.             $bpcQuestionnaire
  107.         );
  108.         // Update questionnaire-level scores
  109.         $this->scoreCalculationService->updateQuestionnaireScores($bpcQuestionnaire);
  110.         // Save questionnaire with updated scores
  111.         $bpcQuestionnaire->save();
  112.     }
  113. }