custom/plugins/CioOrderConfirmation/src/CioOrderConfirmation.php line 22

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace CioOrderConfirmation;
  4. use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
  5. use Shopware\Core\Checkout\Order\OrderStates;
  6. use Shopware\Core\Content\MailTemplate\Aggregate\MailTemplateType\MailTemplateTypeEntity;
  7. use Shopware\Core\Framework\Context;
  8. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  9. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  11. use Shopware\Core\Framework\Plugin;
  12. use Shopware\Core\Framework\Plugin\Context\InstallContext;
  13. use Shopware\Core\Framework\Plugin\Context\UninstallContext;
  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 CioOrderConfirmation extends Plugin
  19. {
  20.     public const WAITING_FOR_RELEASE_STATE_TECHNICAL_NAME 'waiting_for_release';
  21.     public const WAITING_FOR_RELEASE_STATE_TRANSITION_NAME 'wait_for_release';
  22.     public function install(InstallContext $installContext): void
  23.     {
  24.         parent::install($installContext);
  25.         $context $installContext;
  26.         /** @var EntityRepositoryInterface $stateMachineRepository */
  27.         $stateMachineRepository $this->container->get('state_machine.repository');
  28.         /** @var EntityRepositoryInterface $stateMachineStateRepository */
  29.         $stateMachineStateRepository $this->container->get('state_machine_state.repository');
  30.         /** @var EntityRepositoryInterface $stateMachineTransitionRepository */
  31.         $stateMachineTransitionRepository $this->container->get('state_machine_transition.repository');
  32.         $stateMachine $this->getStateMachine($stateMachineRepository$context->getContext());
  33.         $stateMachineState $this->getStateMachineState(self::WAITING_FOR_RELEASE_STATE_TECHNICAL_NAME$stateMachine->getId(), $stateMachineStateRepository$context->getContext());
  34.         if (!$stateMachineState instanceof StateMachineStateEntity) {
  35.             $newState = [
  36.                 'technicalName' => self::WAITING_FOR_RELEASE_STATE_TECHNICAL_NAME,
  37.                 'stateMachineId' => $stateMachine->getId(),
  38.                 'translations' => [
  39.                     'de-DE' => [
  40.                         'name' => 'Warten auf Freigabe'
  41.                     ],
  42.                     'en-GB' => [
  43.                         'name' => 'Waiting for release'
  44.                     ]
  45.                 ]
  46.             ];
  47.             $stateMachineStateRepository->create([$newState], $context->getContext());
  48.         }
  49.         $newStateMachineTransitions = [
  50.             [
  51.                 'actionName' => 'reopen',
  52.                 'stateMachineId' => $stateMachine->getId(),
  53.                 'fromStateId' => $this->getStateMachineState(self::WAITING_FOR_RELEASE_STATE_TECHNICAL_NAME$stateMachine->getId(), $stateMachineStateRepository$context->getContext())->getId(),
  54.                 'toStateId' => $this->getStateMachineState(OrderStates::STATE_OPEN$stateMachine->getId(), $stateMachineStateRepository$context->getContext())->getId(),
  55.             ],
  56.             [
  57.                 'actionName' => self::WAITING_FOR_RELEASE_STATE_TRANSITION_NAME,
  58.                 'stateMachineId' => $stateMachine->getId(),
  59.                 'fromStateId' => $this->getStateMachineState(OrderStates::STATE_OPEN$stateMachine->getId(), $stateMachineStateRepository$context->getContext())->getId(),
  60.                 'toStateId' => $this->getStateMachineState(self::WAITING_FOR_RELEASE_STATE_TECHNICAL_NAME$stateMachine->getId(), $stateMachineStateRepository$context->getContext())->getId(),
  61.             ]
  62.         ];
  63.         foreach ($newStateMachineTransitions as $newStateMachineTransition) {
  64.             $stateMachineTransition $this->getStateMachineTransition($newStateMachineTransition$stateMachineTransitionRepository$context->getContext());
  65.             if (!$stateMachineTransition instanceof StateMachineTransitionEntity) {
  66.                 $stateMachineTransitionRepository->create([$newStateMachineTransition], $context->getContext());
  67.             }
  68.         }
  69.         // add mail templates
  70.         $mailTemplateTypeId Uuid::randomHex();
  71.         $this->createEmailTypeWithTemplates(
  72.             [
  73.             'id' => $mailTemplateTypeId,
  74.             'name' => 'Freigabe erforderlich Email für den Käufer',
  75.             'technicalName' => 'checkout_order_release_process_order_customer_type',
  76.             'availableEntities' => [
  77.                 'order' => 'order',
  78.                 'customer' => 'customer'
  79.             ]
  80.         ],
  81.             [
  82.                 [
  83.                     'id' => Uuid::randomHex(),
  84.                     'mailTemplateTypeId' => $mailTemplateTypeId,
  85.                     'subject' => [
  86.                         'en-GB' => 'Ihre Bestellung mit der Nummer {{ order.orderNumber }} wartet auf die Freigabe',
  87.                         'de-DE' => 'Ihre Bestellung mit der Nummer {{ order.orderNumber }} wartet auf die Freigabe'
  88.                     ],
  89.                     'contentPlain' => "Ihrer Bestellung mit der Nummer {{ order.orderNumber }} muss erst noch die Freigabe erteilt werden.\n\nBei Rückfragen zu der Freigabe erreichen sie ihren Ansprechpartner unter der Email {{ releaserEmail }}.",
  90.                     'contentHtml' => "<p>Ihrer Bestellung mit der Nummer {{ order.orderNumber }} muss erst noch die Freigabe erteilt werden.</p><p>Bei Fragen zum Status der Freigabe erreichen sie ihren Ansprechpartner unter der Email {{ releaserEmail }}.</p>",
  91.                 ]
  92.             ],
  93.             $installContext->getContext()
  94.         );
  95.         $mailTemplateTypeId Uuid::randomHex();
  96.         $this->createEmailTypeWithTemplates(
  97.             [
  98.             'id' => $mailTemplateTypeId,
  99.             'name' => 'Freigabe Email für den Vertriebsbeauftragten',
  100.             'technicalName' => 'checkout_order_release_process_type',
  101.             'availableEntities' => [
  102.                 'order' => 'order',
  103.                 'customer' => 'customer'
  104.             ]
  105.         ],
  106.             [
  107.                 [
  108.                     'id' => Uuid::randomHex(),
  109.                     'mailTemplateTypeId' => $mailTemplateTypeId,
  110.                     'subject' => [
  111.                         'en-GB' => 'Bestellung befindet sich jetzt im Zustand "Freigabe erforderlich"',
  112.                         'de-DE' => 'Bestellung befindet sich jetzt im Zustand "Freigabe erforderlich"'
  113.                     ],
  114.                     'contentPlain' => "Es wurde eine neue Bestellung mit der Nummer {{ order.orderNumber }} aufgegeben die ihre Freigabe erwartet.\n\n{{ releaseUrl }}",
  115.                     'contentHtml' => "<p>Es wurde eine neue Bestellung mit der Nummer {{ order.orderNumber }} aufgegeben die ihre Freigabe erwartet.</p><p><a href=\"{{ releaseUrl }}\">{{ releaseUrl }}</a></p>",
  116.                 ]
  117.             ],
  118.             $installContext->getContext()
  119.         );
  120.     }
  121.     public function uninstall(UninstallContext $uninstallContext): void
  122.     {
  123.         parent::uninstall($uninstallContext);
  124.         //Keep UserData? Then do nothing here
  125.         if ($uninstallContext->keepUserData()) {
  126.             return;
  127.         }
  128.         $this->removeEmailTypeWithTemplates('checkout_order_release_process_type'$uninstallContext->getContext());
  129.         $this->removeEmailTypeWithTemplates('checkout_order_release_process_order_customer_type'$uninstallContext->getContext());
  130.     }
  131.     protected function getStateMachine(EntityRepositoryInterface $stateMachineRepositoryContext $context): ?StateMachineEntity
  132.     {
  133.         $stateMachineCriteria = new Criteria();
  134.         $stateMachineCriteria->addFilter(new EqualsFilter('technicalName''order.state'));
  135.         return $stateMachineRepository->search($stateMachineCriteria$context)->first();
  136.     }
  137.     protected function getStateMachineState($technicalName$stateMachineIdEntityRepositoryInterface $stateMachineStateRepositoryContext $context): ?StateMachineStateEntity
  138.     {
  139.         $stateMachineStateCriteria = new Criteria();
  140.         $stateMachineStateCriteria->addFilter(new EqualsFilter('stateMachineId'$stateMachineId));
  141.         $stateMachineStateCriteria->addFilter(new EqualsFilter('technicalName'$technicalName));
  142.         return $stateMachineStateRepository->search($stateMachineStateCriteria$context)->first();
  143.     }
  144.     protected function getStateMachineTransition(array $newStateMachineTransitionEntityRepositoryInterface $stateMachineTransitionRepositoryContext $context): ?StateMachineTransitionEntity
  145.     {
  146.         $stateMachineTransitionCriteria = new Criteria();
  147.         $stateMachineTransitionCriteria->addFilter(new EqualsFilter('actionName'$newStateMachineTransition['actionName']));
  148.         $stateMachineTransitionCriteria->addFilter(new EqualsFilter('stateMachineId'$newStateMachineTransition['stateMachineId']));
  149.         $stateMachineTransitionCriteria->addFilter(new EqualsFilter('fromStateId'$newStateMachineTransition['fromStateId']));
  150.         $stateMachineTransitionCriteria->addFilter(new EqualsFilter('toStateId'$newStateMachineTransition['toStateId']));
  151.         return $stateMachineTransitionRepository->search($stateMachineTransitionCriteria$context)->first();
  152.     }
  153.     protected function createEmailTypeWithTemplates(array $type, array $templatesContext $context)
  154.     {
  155.         /** @var EntityRepositoryInterface $mailTemplateTypeRepository */
  156.         $mailTemplateTypeRepository $this->container->get('mail_template_type.repository');
  157.         /** @var EntityRepositoryInterface $mailTemplateRepository */
  158.         $mailTemplateRepository $this->container->get('mail_template.repository');
  159.         try {
  160.             $mailTemplateTypeRepository->create([$type], $context);
  161.             $mailTemplateRepository->create($templates$context);
  162.         } catch (UniqueConstraintViolationException $exception) {
  163.             // No, we've already installed the fields, it's fine.
  164.         }
  165.     }
  166.     protected function removeEmailTypeWithTemplates(string $typeNameContext $context)
  167.     {
  168.         /** @var EntityRepositoryInterface $mailTemplateTypeRepository */
  169.         $mailTemplateTypeRepository $this->container->get('mail_template_type.repository');
  170.         /** @var EntityRepositoryInterface $mailTemplateRepository */
  171.         $mailTemplateRepository $this->container->get('mail_template.repository');
  172.         /** @var MailTemplateTypeEntity $myCustomMailTemplateType */
  173.         $myCustomMailTemplateType $mailTemplateTypeRepository->search(
  174.             (new Criteria())->addFilter(new EqualsFilter('technicalName'$typeName)),
  175.             $context
  176.         )->first();
  177.         $ids = [];
  178.         if ($myCustomMailTemplateType instanceof MailTemplateTypeEntity) {
  179.             $mailTemplateIds $mailTemplateRepository->searchIds(
  180.                 (new Criteria())->addFilter(new EqualsFilter('mailTemplateTypeId'$myCustomMailTemplateType->getId())),
  181.                 $context
  182.             )->getIds();
  183.             //Get the Ids from the fetched Entities
  184.             $ids array_map(static function ($id) {
  185.                 return ['id' => $id];
  186.             }, $mailTemplateIds);
  187.         }
  188.         $mailTemplateTypeRepository->delete([
  189.             ['id' => $myCustomMailTemplateType->getId()]
  190.         ], $context);
  191.         $mailTemplateRepository->delete($ids$context);
  192.     }
  193. }