<?php
namespace App\EventSubscriber;
use App\Repository\BPCZoneRepository;
use App\Services\BPCScoreCalculationService;
use Exception;
use Pimcore\Event\DataObjectEvents;
use Pimcore\Event\Model\DataObjectEvent;
use Pimcore\Model\DataObject\BPCZone;
use Pimcore\Model\DataObject\Service;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class BPCZoneSubscriber implements EventSubscriberInterface
{
public function __construct(
private BPCZoneRepository $bpcZoneRepository,
private BPCScoreCalculationService $scoreCalculationService,
)
{
}
/**
* @inheritDoc
*/
public static function getSubscribedEvents(): array
{
return [
DataObjectEvents::PRE_ADD => ['onPreAdd', 10],
DataObjectEvents::POST_ADD => ['onPostAdd', 10],
DataObjectEvents::PRE_UPDATE => ['onPreUpdate', 10],
DataObjectEvents::POST_UPDATE => ['onPostUpdate', 10],
DataObjectEvents::POST_DELETE => ['onPostDelete', 10],
];
}
public function onPreAdd(DataObjectEvent $event): void
{
$bpcZone = $event->getObject();
if (!($bpcZone instanceof BPCZone)) {
return;
}
if (empty($bpcZone->getBPCZ_Name())) {
$bpcZone->setBPCZ_Name($bpcZone->getKey());
}
}
/**
* @throws Exception
*/
public function onPostAdd(DataObjectEvent $event): void
{
$bpcZone = $event->getObject();
if (!($bpcZone instanceof BPCZone)) {
return;
}
Service::createFolderByPath($bpcZone . DIRECTORY_SEPARATOR . BPCZoneRepository::DEFAULT_CUSTOMER_JOURNEY_RESPONSES_FOLDER);
Service::createFolderByPath($bpcZone . DIRECTORY_SEPARATOR . BPCZoneRepository::DEFAULT_CUSTOMER_JOURNEY_PROOFS_FOLDER);
}
/**
* @throws Exception
*/
public function onPreUpdate(DataObjectEvent $event): void
{
$bpcZone = $event->getObject();
if (!($bpcZone instanceof BPCZone)) {
return;
}
if (!empty($bpcZone->getBPCZ_Name())) {
$bpczName = trim($bpcZone->getBPCZ_Name());
$bpcZone->setBPCZ_Name($bpczName);
$bpcZone->setKey($bpczName);
}
$this->bpcZoneRepository->moveZoneToCorrectFolder($bpcZone);
$bpcZone->setBPCZ_ScoreZone($this->bpcZoneRepository->getZonePercentage($bpcZone));
$this->bpcZoneRepository->addCategoriesToScorePanelForQuestionnaire($bpcZone);
}
/**
* @throws Exception
*/
public function onPostUpdate(DataObjectEvent $event): void
{
$bpcZone = $event->getObject();
if (!($bpcZone instanceof BPCZone)) {
return;
}
$this->bpcZoneRepository->handlePostUpdateTransitionZone($bpcZone);
}
/**
* Recalculate category scores when a zone is deleted (Customer Journey)
* @throws Exception
*/
public function onPostDelete(DataObjectEvent $event): void
{
$bpcZone = $event->getObject();
if (!($bpcZone instanceof BPCZone)) {
return;
}
$bpcQuestionnaire = $bpcZone->getBPCZ_Questionnaire();
$bpcCategory = $bpcZone->getBPCZ_Category();
if (!$bpcQuestionnaire || !$bpcCategory) {
return;
}
// Clear zone from cache
$this->bpcZoneRepository->clearZoneCache(
$bpcQuestionnaire->getId(),
$bpcCategory->getId(),
$bpcZone->getId()
);
$this->scoreCalculationService->updateCategoryScoresForCustomerJourneyQuestionnaire(
[$bpcCategory],
$bpcQuestionnaire
);
// Update questionnaire-level scores
$this->scoreCalculationService->updateQuestionnaireScores($bpcQuestionnaire);
// Save questionnaire with updated scores
$bpcQuestionnaire->save();
}
}