src/EventSubscriber/BPCResponseSubscriber.php line 38

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Repository\AbstractElementRepository;
  4. use App\Services\BPCScoreCalculationService;
  5. use Exception;
  6. use Pimcore\Event\DataObjectEvents;
  7. use Pimcore\Event\Model\DataObjectEvent;
  8. use Pimcore\Model\DataObject\BPCCriteria;
  9. use Pimcore\Model\DataObject\BPCResponse;
  10. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  11. /**
  12.  * Event subscriber for BPCResponse
  13.  * Triggers score recalculation when responses are created or updated
  14.  */
  15. class BPCResponseSubscriber implements EventSubscriberInterface
  16. {
  17.     public function __construct(
  18.         private BPCScoreCalculationService $scoreCalculationService
  19.     ) {}
  20.     /**
  21.      * @inheritDoc
  22.      */
  23.     public static function getSubscribedEvents(): array
  24.     {
  25.         return [
  26.             DataObjectEvents::PRE_UPDATE => ['onPreUpdate'10],
  27.             DataObjectEvents::POST_UPDATE => ['onPostUpdate'10],
  28.         ];
  29.     }
  30.     /**
  31.      * @throws Exception
  32.      */
  33.     public function onPreUpdate(DataObjectEvent $event): void
  34.     {
  35.         $bpcResponse $event->getObject();
  36.         if (!($bpcResponse instanceof BPCResponse)) {
  37.             return;
  38.         }
  39.         $bpcrCriteria $bpcResponse->getBPCR_Criteria();
  40.         if (($bpcrCriteria instanceof BPCCriteria) && ($bpccritNumber $bpcrCriteria->getBPCCRIT_Number())) {
  41.             AbstractElementRepository::setValidAndUniqueKeyForDataObject($bpcResponse$bpccritNumber);
  42.         }
  43.     }
  44.     /**
  45.      * After a response is updated, recalculate affected scores
  46.      *
  47.      * @param DataObjectEvent $event
  48.      * @return void
  49.      * @throws Exception
  50.      */
  51.     public function onPostUpdate(DataObjectEvent $event): void
  52.     {
  53.         $bpcResponse $event->getObject();
  54.         if (!($bpcResponse instanceof BPCResponse)) {
  55.             return;
  56.         }
  57.         // Trigger cascading score updates: Response → Category → Questionnaire
  58.         $this->scoreCalculationService->updateScoresWhenUpdateResponse($bpcResponse);
  59.     }
  60. }