custom/static-plugins/CioApprovalThreshold/src/CioApprovalThreshold.php line 22

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace CioApprovalThreshold;
  4. use CioApprovalThreshold\States\ApprovalStates;
  5. use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
  6. use Shopware\Core\Checkout\Order\OrderStates;
  7. use Shopware\Core\Framework\Context;
  8. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
  9. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  12. use Shopware\Core\Framework\Plugin;
  13. use Shopware\Core\Framework\Plugin\Context\InstallContext;
  14. use Shopware\Core\Framework\Uuid\Uuid;
  15. use Shopware\Core\System\StateMachine\Aggregation\StateMachineState\StateMachineStateEntity;
  16. use Shopware\Core\System\StateMachine\Aggregation\StateMachineTransition\StateMachineTransitionEntity;
  17. use Shopware\Core\System\StateMachine\StateMachineEntity;
  18. class CioApprovalThreshold extends Plugin
  19. {
  20.     protected ?EntityRepository $stateMachineRepository;
  21.     protected ?EntityRepository $stateMachineStateRepository;
  22.     protected ?EntityRepository $stateMachineTransitionRepository;
  23.     public function install(InstallContext $installContext): void
  24.     {
  25.         parent::install($installContext);
  26.         $this->initDependencies();
  27.         $stateMachine $this->getStateMachine($installContext->getContext());
  28.         $this->createStateMachineState(ApprovalStates::STATE_OPEN_APPROVAL_REQUEST'Wartet auf Freigabe''Waiting for approval'$stateMachine$installContext->getContext());
  29.         $this->createStateMachineState(ApprovalStates::STATE_SUCCESSFULLY_APPROVED'Freigabe ist erfolgt''Approval has been given'$stateMachine$installContext->getContext());
  30.         $this->createStateMachineState(ApprovalStates::STATE_APPROVAL_DENIED'Freigabe verweigert''Approval canceled'$stateMachine$installContext->getContext());
  31.         $this->createStateMachineState(ApprovalStates::STATE_APPROVAL_DENIED_AND_REVISION_REQUESTED'Revision angefordert''Requested revision'$stateMachine$installContext->getContext());
  32.         $newStateMachineTransitions = [
  33.             [
  34.                 'actionName' => ApprovalStates::NEEDS_APPROVAL_TRANSITION_NAME,
  35.                 'stateMachineId' => $stateMachine->getId(),
  36.                 'fromStateId' => $this->getStateMachineState(OrderStates::STATE_OPEN$stateMachine$installContext->getContext())->getId(),
  37.                 'toStateId' => $this->getStateMachineState(ApprovalStates::STATE_OPEN_APPROVAL_REQUEST$stateMachine$installContext->getContext())->getId(),
  38.             ],
  39.             [
  40.                 'actionName' => ApprovalStates::APPROVED_TRANSITION_NAME,
  41.                 'stateMachineId' => $stateMachine->getId(),
  42.                 'fromStateId' => $this->getStateMachineState(ApprovalStates::STATE_OPEN_APPROVAL_REQUEST$stateMachine$installContext->getContext())->getId(),
  43.                 'toStateId' => $this->getStateMachineState(ApprovalStates::STATE_SUCCESSFULLY_APPROVED$stateMachine$installContext->getContext())->getId(),
  44.             ],
  45.             [
  46.                 'actionName' => ApprovalStates::CANCEL_TRANSITION_NAME,
  47.                 'stateMachineId' => $stateMachine->getId(),
  48.                 'fromStateId' => $this->getStateMachineState(ApprovalStates::STATE_OPEN_APPROVAL_REQUEST$stateMachine$installContext->getContext())->getId(),
  49.                 'toStateId' => $this->getStateMachineState(ApprovalStates::STATE_APPROVAL_DENIED$stateMachine$installContext->getContext())->getId(),
  50.             ],
  51.             [
  52.                 'actionName' => ApprovalStates::CANCEL_AND_REVISION_TRANSITION_NAME,
  53.                 'stateMachineId' => $stateMachine->getId(),
  54.                 'fromStateId' => $this->getStateMachineState(ApprovalStates::STATE_OPEN_APPROVAL_REQUEST$stateMachine$installContext->getContext())->getId(),
  55.                 'toStateId' => $this->getStateMachineState(ApprovalStates::STATE_APPROVAL_DENIED_AND_REVISION_REQUESTED$stateMachine$installContext->getContext())->getId(),
  56.             ],
  57.             [
  58.                 'actionName' => ApprovalStates::CANCEL_REQUEST_AND_STORNO_ORDER_TRANSITION_NAME,
  59.                 'stateMachineId' => $stateMachine->getId(),
  60.                 'fromStateId' => $this->getStateMachineState(ApprovalStates::STATE_OPEN_APPROVAL_REQUEST$stateMachine$installContext->getContext())->getId(),
  61.                 'toStateId' => $this->getStateMachineState(OrderStates::STATE_CANCELLED$stateMachine$installContext->getContext())->getId(),
  62.             ],
  63.             [
  64.                 'actionName' => ApprovalStates::APPROVED_ORDER_COMPLETED_TRANSITION_NAME,
  65.                 'stateMachineId' => $stateMachine->getId(),
  66.                 'fromStateId' => $this->getStateMachineState(ApprovalStates::STATE_SUCCESSFULLY_APPROVED$stateMachine$installContext->getContext())->getId(),
  67.                 'toStateId' => $this->getStateMachineState(OrderStates::STATE_COMPLETED$stateMachine$installContext->getContext())->getId(),
  68.             ]
  69.         ];
  70.         foreach ($newStateMachineTransitions as $newStateMachineTransition) {
  71.             $stateMachineTransition $this->getStateMachineTransition($newStateMachineTransition['actionName'], $newStateMachineTransition['stateMachineId'], $newStateMachineTransition['fromStateId'], $newStateMachineTransition['toStateId'], $installContext->getContext());
  72.             if (!$stateMachineTransition instanceof StateMachineTransitionEntity) {
  73.                 $this->stateMachineTransitionRepository->create([$newStateMachineTransition], $installContext->getContext());
  74.             }
  75.         }
  76.         $mailTemplateTypeId Uuid::randomHex();
  77.         $this->createEmailTypeWithTemplates(
  78.             [
  79.             'id' => $mailTemplateTypeId,
  80.             'name' => 'Freigabe notwendig Email für den berechtigten Freigeber',
  81.             'technicalName' => 'checkout_order_releaser_has_to_verify_type',
  82.             'availableEntities' => [
  83.                 'order' => 'order'
  84.             ]
  85.         ],
  86.             [
  87.                 [
  88.                     'id' => Uuid::randomHex(),
  89.                     'mailTemplateTypeId' => $mailTemplateTypeId,
  90.                     'senderName' => '{{ salesChannel.name }}',
  91.                     'subject' => [
  92.                         'en-GB' => 'Prüfen sie die Bestellung mit der Nummer {{ order.orderNumber }}',
  93.                         'de-DE' => 'Prüfen sie die Bestellung mit der Nummer {{ order.orderNumber }}'
  94.                     ],
  95.                     'contentPlain' => "Sie wurden als Beauftragter für die Prüfung einer neuen Bestellung mit der Nummer {{ order.orderNumber }} ausgewählt. Sie können diese unter folgendem Link prüfen: {{ confirmUrl }}.",
  96.                     'contentHtml' => '<p>Sie wurden als Beauftragter für die Prüfung einer neuen Bestellung mit der Nummer {{ order.orderNumber }} ausgewählt.</p><p>Sie können diese unter folgendem Link prüfen: <a href="{{ confirmUrl }}">{{ confirmUrl }}</a>.</p>',
  97.                 ]
  98.             ],
  99.             $installContext->getContext()
  100.         );
  101.         $mailTemplateTypeId Uuid::randomHex();
  102.         $this->createEmailTypeWithTemplates(
  103.             [
  104.             'id' => $mailTemplateTypeId,
  105.             'name' => 'Kunden über die erfolgte Freigabe informieren',
  106.             'technicalName' => 'checkout_order_customer_successfully_release_info',
  107.             'availableEntities' => [
  108.                 'order' => 'order'
  109.             ]
  110.         ],
  111.             [
  112.                 [
  113.                     'id' => Uuid::randomHex(),
  114.                     'mailTemplateTypeId' => $mailTemplateTypeId,
  115.                     'senderName' => '{{ salesChannel.name }}',
  116.                     'subject' => [
  117.                         'en-GB' => 'Ihre Bestellung mit der Nummer {{ order.orderNumber }} wurde freigegeben',
  118.                         'de-DE' => 'Ihre Bestellung mit der Nummer {{ order.orderNumber }} wurde freigegeben'
  119.                     ],
  120.                     'contentPlain' => "Ihre Bestellung mit der Nummer {{ order.orderNumber }} wurde freigegeben. Wir werden ihre Bestellung jetzt zeitnah bearbeiten und an sie versenden.",
  121.                     'contentHtml' => '<p>Ihre Bestellung mit der Nummer {{ order.orderNumber }} wurde freigegeben. Wir werden ihre Bestellung jetzt zeitnah bearbeiten und an sie versenden.</p>',
  122.                 ]
  123.             ],
  124.             $installContext->getContext()
  125.         );
  126.         $mailTemplateTypeId Uuid::randomHex();
  127.         $this->createEmailTypeWithTemplates(
  128.             [
  129.             'id' => $mailTemplateTypeId,
  130.             'name' => 'Kunden über die Verweigerung der Freigabe informieren',
  131.             'technicalName' => 'checkout_order_customer_not_released_info',
  132.             'availableEntities' => [
  133.                 'order' => 'order'
  134.             ]
  135.         ],
  136.             [
  137.                 [
  138.                     'id' => Uuid::randomHex(),
  139.                     'mailTemplateTypeId' => $mailTemplateTypeId,
  140.                     'senderName' => '{{ salesChannel.name }}',
  141.                     'subject' => [
  142.                         'en-GB' => 'Ihre Bestellung mit der Nummer {{ order.orderNumber }} wurde storniert',
  143.                         'de-DE' => 'Ihre Bestellung mit der Nummer {{ order.orderNumber }} wurde storniert'
  144.                     ],
  145.                     'contentPlain' => "Es tut uns leid, ihnen mitteilen zu müssen, dass ihre Bestellung mit der Nummer {{ order.orderNumber }} nicht freigegeben wurde. Der Kommentar des Freigebers: {{ comment }} Sie befindet sich jetzt in dem Status storniert.",
  146.                     'contentHtml' => '<p>Es tut uns leid, ihnen mitteilen zu müssen, dass ihre Bestellung mit der Nummer {{ order.orderNumber }} nicht freigegeben wurde. Der Kommentar des Freigebers: </p><p>{{ comment }}</p><p> Sie befindet sich jetzt in dem Status storniert.</p>',
  147.                 ]
  148.             ],
  149.             $installContext->getContext()
  150.         );
  151.         $mailTemplateTypeId Uuid::randomHex();
  152.         $this->createEmailTypeWithTemplates(
  153.             [
  154.                 'id' => $mailTemplateTypeId,
  155.                 'name' => 'Kunden über die Anforderung einer Revision informieren',
  156.                 'technicalName' => 'checkout_order_customer_requested_revision_info',
  157.                 'availableEntities' => [
  158.                     'order' => 'order'
  159.                 ]
  160.             ],
  161.             [
  162.                 [
  163.                     'id' => Uuid::randomHex(),
  164.                     'mailTemplateTypeId' => $mailTemplateTypeId,
  165.                     'senderName' => '{{ salesChannel.name }}',
  166.                     'subject' => [
  167.                         'en-GB' => 'Für ihre Bestellung mit der Nummer {{ order.orderNumber }} wurde eine Revision angefordert',
  168.                         'de-DE' => 'Für ihre Bestellung mit der Nummer {{ order.orderNumber }} wurde eine Revision angefordert'
  169.                     ],
  170.                     'contentPlain' => "Ihre Bestellung mit der Nummer {{ order.orderNumber }} wurde vom Freigeber nicht freigegeben und eine Revision angefordert. Der Kommentar des Freigebers: {{ comment }} Sie können den Warenkorb erneut laden und anpassen unter dem Link {{ confirmUrl }}.",
  171.                     'contentHtml' => '<p>Ihre Bestellung mit der Nummer {{ order.orderNumber }} wurde vom Freigeber nicht freigegeben und eine Revision angefordert. Der Kommentar des Freigebers: </p><p>{{ comment }}</p><p>Sie können den Warenkorb erneut laden und anpassen unter dem Link <a href="{{ confirmUrl }}">{{ confirmUrl }}</a>.</p>',
  172.                 ]
  173.             ],
  174.             $installContext->getContext()
  175.         );
  176.     }
  177.     protected function initDependencies()
  178.     {
  179.         $this->stateMachineRepository $this->container->get('state_machine.repository');
  180.         $this->stateMachineStateRepository $this->container->get('state_machine_state.repository');
  181.         $this->stateMachineTransitionRepository $this->container->get('state_machine_transition.repository');
  182.     }
  183.     protected function getStateMachine(Context $context): ?StateMachineEntity
  184.     {
  185.         $stateMachineCriteria = new Criteria();
  186.         $stateMachineCriteria->addFilter(new EqualsFilter('technicalName'ApprovalStates::STATE_MACHINE));
  187.         return $this->stateMachineRepository->search($stateMachineCriteria$context)->first();
  188.     }
  189.     protected function getStateMachineState(string $technicalNameStateMachineEntity $stateMachineContext $context): ?StateMachineStateEntity
  190.     {
  191.         $stateMachineStateCriteria = new Criteria();
  192.         $stateMachineStateCriteria->addFilter(new EqualsFilter('stateMachineId'$stateMachine->getId()));
  193.         $stateMachineStateCriteria->addFilter(new EqualsFilter('technicalName'$technicalName));
  194.         return $this->stateMachineStateRepository->search($stateMachineStateCriteria$context)->first();
  195.     }
  196.     protected function getStateMachineTransition(string $actionNamestring $stateMachineIdstring $fromStateIdstring $toStateIdContext $context): ?StateMachineTransitionEntity
  197.     {
  198.         $stateMachineTransitionCriteria = new Criteria();
  199.         $stateMachineTransitionCriteria->addFilter(new EqualsFilter('actionName'$actionName));
  200.         $stateMachineTransitionCriteria->addFilter(new EqualsFilter('stateMachineId'$stateMachineId));
  201.         $stateMachineTransitionCriteria->addFilter(new EqualsFilter('fromStateId'$fromStateId));
  202.         $stateMachineTransitionCriteria->addFilter(new EqualsFilter('toStateId'$toStateId));
  203.         return $this->stateMachineTransitionRepository->search($stateMachineTransitionCriteria$context)->first();
  204.     }
  205.     protected function createEmailTypeWithTemplates(array $type, array $templatesContext $context)
  206.     {
  207.         /** @var EntityRepositoryInterface $mailTemplateTypeRepository */
  208.         $mailTemplateTypeRepository $this->container->get('mail_template_type.repository');
  209.         /** @var EntityRepositoryInterface $mailTemplateRepository */
  210.         $mailTemplateRepository $this->container->get('mail_template.repository');
  211.         try {
  212.             $mailTemplateTypeRepository->create([$type], $context);
  213.             $mailTemplateRepository->create($templates$context);
  214.         } catch (UniqueConstraintViolationException $exception) {
  215.             // No, we've already installed the fields, it's fine.
  216.         }
  217.     }
  218.     protected function createStateMachineState(string $technicalNamestring $gerNamestring $engNameStateMachineEntity $stateMachineContext $context)
  219.     {
  220.         $stateMachineSuccessfullyApprovedState $this->getStateMachineState($technicalName$stateMachine$context);
  221.         if (!$stateMachineSuccessfullyApprovedState instanceof StateMachineStateEntity) {
  222.             $newState = [
  223.                 'technicalName' => $technicalName,
  224.                 'stateMachineId' => $stateMachine->getId(),
  225.                 'translations' => [
  226.                     'de-DE' => [
  227.                         'name' => $gerName
  228.                     ],
  229.                     'en-GB' => [
  230.                         'name' => $engName
  231.                     ]
  232.                 ]
  233.             ];
  234.             $this->stateMachineStateRepository->create([$newState], $context);
  235.         }
  236.     }
  237. }