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

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