src/EventSubscriber/BPCQuestionnaireSubscriber.php line 143

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Model\SelectOptionsProvider\QuestionnaireType\QuestionnaireTypeSelectOptionsProvider;
  4. use App\Repository\BPCQuestionnaireRepository;
  5. use App\Services\Asset\SharepointAssetsManager;
  6. use App\Services\BPCScoreCalculationService;
  7. use App\Services\Workflow\BPCQuestionnaire\BPCQuestionnaireWorkflow\BPCQuestionnaireWorkflowService;
  8. use App\Services\Workflow\BPCZone\BPCZoneWorkflow\BPCZoneWorkflowService;
  9. use App\Services\Workflow\BPCZone\BPCZoneWorkflow\Transitions\ToValidatedTransition;
  10. use Exception;
  11. use GuzzleHttp\Exception\GuzzleException;
  12. use Pimcore\Event\DataObjectEvents;
  13. use Pimcore\Event\Model\DataObjectEvent;
  14. use Pimcore\Model\DataObject\BPCQuestionnaire;
  15. use Pimcore\Model\DataObject\BPCZone;
  16. use Pimcore\Model\DataObject\Service;
  17. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  18. class BPCQuestionnaireSubscriber implements EventSubscriberInterface
  19. {
  20.     public function __construct(
  21.         protected SharepointAssetsManager    $sharepointAssetsManager,
  22.         protected BPCZoneWorkflowService     $bpcZoneWorkflowService,
  23.         protected BPCScoreCalculationService $scoreCalculationService,
  24.     )
  25.     {
  26.     }
  27.     public static function getSubscribedEvents(): array
  28.     {
  29.         return [
  30.             DataObjectEvents::PRE_ADD => ['onPreAdd'10],
  31.             DataObjectEvents::POST_ADD => ['onPostAdd'10],
  32.             DataObjectEvents::PRE_UPDATE => ['onPreUpdate'10],
  33.             DataObjectEvents::POST_UPDATE => ['onPostUpdate'10],
  34.         ];
  35.     }
  36.     /**
  37.      * @throws Exception
  38.      */
  39.     public function onPreUpdate(DataObjectEvent $event): void
  40.     {
  41.         $bpcQuestionnaire $event->getObject();
  42.         if (!($bpcQuestionnaire instanceof BPCQuestionnaire)) {
  43.             return;
  44.         }
  45.         $bpcCertification $bpcQuestionnaire->getBPCQ_Certification();
  46.         $questionnaireTemplate $bpcQuestionnaire->getBPCQ_QuestionnaireTemplate();
  47.         if (!$bpcCertification || !$questionnaireTemplate) {
  48.             return;
  49.         }
  50.         $questionnaireType $questionnaireTemplate->getBPCQT_QuestionnaireType();
  51.         if (!empty($questionnaireType)) {
  52.             $bpcQuestionnaire->setParent(Service::createFolderByPath($bpcCertification->getRealFullPath() .
  53.                 DIRECTORY_SEPARATOR .
  54.                 BPCQuestionnaireRepository::DEFAULT_FOLDER_ARRAY[$questionnaireType]
  55.             ));
  56.             $this->setQuestionnaireYearNumberCycle($bpcQuestionnaire);
  57.         }
  58.         // Check if center properties changed (affects useCriteria() logic)
  59.         // If they did, recalculate scores as criteria inclusion may have changed
  60.         if ($this->hasPropertyChanges($bpcQuestionnaire)) {
  61.             $this->scoreCalculationService->recalculateAllScores($bpcQuestionnaire);
  62.         }
  63.     }
  64.     /**
  65.      * Check if center properties that affect criteria inclusion have changed
  66.      *
  67.      * @param BPCQuestionnaire $q
  68.      * @return bool
  69.      */
  70.     private function hasPropertyChanges(BPCQuestionnaire $q): bool
  71.     {
  72.         // These properties affect useCriteria() logic in repository
  73.         return $q->isFieldDirty('BPCQ_CenterProperties')
  74.             || $q->isFieldDirty('BPCQ_CenterPropertiesHSE')
  75.             || $q->isFieldDirty('BPCQ_CenterPropertiesQuality')
  76.             || $q->isFieldDirty('BPCQ_CenterPropertiesSecurity');
  77.     }
  78.     /**
  79.      * @throws Exception
  80.      * @throws GuzzleException
  81.      */
  82.     public function onPostUpdate(DataObjectEvent $event): void
  83.     {
  84.         $bpcQuestionnaire $event->getObject();
  85.         if (!($bpcQuestionnaire instanceof BPCQuestionnaire)) {
  86.             return;
  87.         }
  88.         $bpcq_AuditReports $bpcQuestionnaire->getBPCQ_AuditReports();
  89.         foreach ($bpcq_AuditReports as $BPCQ_AuditReport) {
  90.             $report $BPCQ_AuditReport->getElement();
  91.             if ($report) {
  92.                 $this->sharepointAssetsManager->applySharepointInfos($report$bpcQuestionnaire'audit_report'true);
  93.             }
  94.         }
  95.         $questionnaireType $bpcQuestionnaire->getBPCQ_QuestionnaireTemplate()?->getBPCQT_QuestionnaireType();
  96.         if ($questionnaireType === QuestionnaireTypeSelectOptionsProvider::QUESTIONNAIRE_TYPE_CUSTOMER_JOURNEY
  97.             && $bpcQuestionnaire->getBPCQ_WorkflowStatus() === BPCQuestionnaireWorkflowService::BPC_QUESTIONNAIRE_WORKFLOW_STATUS_VALIDATED
  98.         ) {
  99.             $listing = new BPCZone\Listing();
  100.             $listing->setCondition('BPCZ_Questionnaire__id = ?'$bpcQuestionnaire->getId());
  101.             foreach ($listing as $bpcZone) {
  102.                 if ($bpcZone->getBPCZ_WorkflowStatus() !== BPCZoneWorkflowService::BPC_ZONE_WORKFLOW_STATUS_VALIDATED) {
  103.                     $this->bpcZoneWorkflowService->applyTransition(
  104.                         object$bpcZone,
  105.                         transitionClassNameToValidatedTransition::class
  106.                     );
  107.                 }
  108.             }
  109.         }
  110.     }
  111.     /**
  112.      * @throws Exception
  113.      */
  114.     public function onPreAdd(DataObjectEvent $event): void
  115.     {
  116.         $bpcQuestionnaire $event->getObject();
  117.         if ($bpcQuestionnaire instanceof BPCQuestionnaire) {
  118.             $this->setQuestionnaireYearNumberCycle($bpcQuestionnaire);
  119.         }
  120.     }
  121.     /**
  122.      * @throws Exception
  123.      */
  124.     public function onPostAdd(DataObjectEvent $event): void
  125.     {
  126.         $bpcQuestionnaire $event->getObject();
  127.         if ($bpcQuestionnaire instanceof BPCQuestionnaire) {
  128.             Service::createFolderByPath($bpcQuestionnaire DIRECTORY_SEPARATOR 'Report');
  129.         }
  130.     }
  131.     private function setQuestionnaireYearNumberCycle(BPCQuestionnaire $bpcQuestionnaire): void
  132.     {
  133.         $previousQuestionnaire $bpcQuestionnaire->getBPCQ_PreviousQuestionnaire();
  134.         /* If the BPCQ_YearNumberCycle field has already been computed, then skip  */
  135.         if (!empty($previousQuestionnaire) && $bpcQuestionnaire->getBPCQ_YearNumberCycle() > 1) {
  136.             return;
  137.         }
  138.         if (!empty($previousQuestionnaire)) {
  139.             $yearNumberCycle $previousQuestionnaire->getBPCQ_YearNumberCycle() + 1;
  140.             $yearNumberCycle $yearNumberCycle $yearNumberCycle;
  141.             $bpcQuestionnaire->setBPCQ_YearNumberCycle($yearNumberCycle);
  142.         } else {
  143.             $bpcQuestionnaire->setBPCQ_YearNumberCycle(1);
  144.         }
  145.     }
  146. }