<?php
namespace App\EventSubscriber;
use App\Repository\AbstractElementRepository;
use App\Services\BPCScoreCalculationService;
use Exception;
use Pimcore\Event\DataObjectEvents;
use Pimcore\Event\Model\DataObjectEvent;
use Pimcore\Model\DataObject\BPCCriteria;
use Pimcore\Model\DataObject\BPCResponse;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
/**
* Event subscriber for BPCResponse
* Triggers score recalculation when responses are created or updated
*/
class BPCResponseSubscriber implements EventSubscriberInterface
{
public function __construct(
private BPCScoreCalculationService $scoreCalculationService
) {}
/**
* @inheritDoc
*/
public static function getSubscribedEvents(): array
{
return [
DataObjectEvents::PRE_UPDATE => ['onPreUpdate', 10],
DataObjectEvents::POST_UPDATE => ['onPostUpdate', 10],
];
}
/**
* @throws Exception
*/
public function onPreUpdate(DataObjectEvent $event): void
{
$bpcResponse = $event->getObject();
if (!($bpcResponse instanceof BPCResponse)) {
return;
}
$bpcrCriteria = $bpcResponse->getBPCR_Criteria();
if (($bpcrCriteria instanceof BPCCriteria) && ($bpccritNumber = $bpcrCriteria->getBPCCRIT_Number())) {
AbstractElementRepository::setValidAndUniqueKeyForDataObject($bpcResponse, $bpccritNumber);
}
}
/**
* After a response is updated, recalculate affected scores
*
* @param DataObjectEvent $event
* @return void
* @throws Exception
*/
public function onPostUpdate(DataObjectEvent $event): void
{
$bpcResponse = $event->getObject();
if (!($bpcResponse instanceof BPCResponse)) {
return;
}
// Trigger cascading score updates: Response → Category → Questionnaire
$this->scoreCalculationService->updateScoresWhenUpdateResponse($bpcResponse);
}
}