custom/static-plugins/CioFormBuilder/src/CioFormBuilder.php line 26

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace CioFormBuilder;
  4. use CioFormBuilder\Event\EventAwaitReleaseInformCustomerEvent;
  5. use CioFormBuilder\Event\EventAwaitReleaseInformReleaserEvent;
  6. use CioFormBuilder\Event\EventCancelledEvent;
  7. use CioFormBuilder\Event\EventReleasedEvent;
  8. use CioFormBuilder\PaymentHandler\EventCostcenterPaymentHandler;
  9. use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
  10. use Shopware\Core\Content\MailTemplate\Aggregate\MailTemplateType\MailTemplateTypeEntity;
  11. use Shopware\Core\Content\MailTemplate\MailTemplateActions;
  12. use Shopware\Core\Framework\Context;
  13. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  14. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  15. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  16. use Shopware\Core\Framework\Event\EventAction\EventActionEntity;
  17. use Shopware\Core\Framework\Plugin;
  18. use Shopware\Core\Framework\Plugin\Context\InstallContext;
  19. use Shopware\Core\Framework\Plugin\Context\UninstallContext;
  20. use Shopware\Core\Framework\Plugin\Util\PluginIdProvider;
  21. use Shopware\Core\Framework\Uuid\Uuid;
  22. class CioFormBuilder extends Plugin
  23. {
  24.     const EVENT_ORDER_AWAIT_RELEASE_MAIL_TO_CUSTOMER_TECHNICAL_NAME 'event_await_release_mail_to_customer' ;
  25.     const EVENT_ORDER_RELEASED_MAIL_TO_CUSTOMER_TECHNICAL_NAME 'event_released_mail_to_customer';
  26.     const EVENT_ORDER_AWAIT_RELEASE_MAIL_TO_RELEASER_TECHNICAL_NAME 'event_await_release_mail_to_releaser';
  27.     const EVENT_ORDER_CANCEL_MAIL_TO_CUSTOMER_TECHNICAL_NAME 'event_cancel_mail_to_customer';
  28.     public function install(InstallContext $installContext): void
  29.     {
  30.         parent::install($installContext);
  31. //        $this->createCustomFields();
  32. //        $this->createOrderState($installContext);
  33.         $this->addEmailTemplates($installContext);
  34. //        $this->addBusinessEvents($installContext);
  35.         $this->addPaymentMethod($installContext->getContext());
  36.     }
  37.     public function uninstall(UninstallContext $uninstallContext): void
  38.     {
  39.         parent::uninstall($uninstallContext);
  40.         //Keep UserData? Then do nothing here
  41.         if ($uninstallContext->keepUserData()) {
  42.             return;
  43.         }
  44.         $this->removeEmailTypeWithTemplates(self::EVENT_ORDER_AWAIT_RELEASE_MAIL_TO_CUSTOMER_TECHNICAL_NAME$uninstallContext->getContext());
  45.         $this->removeEmailTypeWithTemplates(self::EVENT_ORDER_AWAIT_RELEASE_MAIL_TO_RELEASER_TECHNICAL_NAME$uninstallContext->getContext());
  46.         $this->removeEmailTypeWithTemplates(self::EVENT_ORDER_RELEASED_MAIL_TO_CUSTOMER_TECHNICAL_NAME$uninstallContext->getContext());
  47.         $this->removeEmailTypeWithTemplates(self::EVENT_ORDER_CANCEL_MAIL_TO_CUSTOMER_TECHNICAL_NAME$uninstallContext->getContext());
  48.     }
  49.     private function addPaymentMethod(Context $context): void
  50.     {
  51.         $paymentMethodExists $this->getPaymentMethodId();
  52.         // Payment method exists already, no need to continue here
  53.         if ($paymentMethodExists) {
  54.             return;
  55.         }
  56.         /** @var PluginIdProvider $pluginIdProvider */
  57.         $pluginIdProvider $this->container->get(PluginIdProvider::class);
  58.         $pluginId $pluginIdProvider->getPluginIdByBaseClass(get_class($this), $context);
  59.         $examplePaymentData = [
  60.             // payment handler will be selected by the identifier
  61.             'handlerIdentifier' => EventCostcenterPaymentHandler::class,
  62.             'name' => 'Kostenstelle Event',
  63.             'description' => '',
  64.             'pluginId' => $pluginId,
  65.         ];
  66.         /** @var EntityRepositoryInterface $paymentRepository */
  67.         $paymentRepository $this->container->get('payment_method.repository');
  68.         $paymentRepository->create([$examplePaymentData], $context);
  69.     }
  70.     private function getPaymentMethodId(): ?string
  71.     {
  72.         /** @var EntityRepositoryInterface $paymentRepository */
  73.         $paymentRepository $this->container->get('payment_method.repository');
  74.         // Fetch ID for update
  75.         $paymentCriteria = (new Criteria())->addFilter(new EqualsFilter('handlerIdentifier'EventCostcenterPaymentHandler::class));
  76.         return $paymentRepository->searchIds($paymentCriteriaContext::createDefaultContext())->firstId();
  77.     }
  78.     protected function addEmailTemplates(InstallContext $context)
  79.     {
  80.         $mailTemplateTypeId Uuid::randomHex();
  81.         $this->createEmailTypeWithTemplates([
  82.             'id' => $mailTemplateTypeId,
  83.             'name' => '"Freigabe erforderlich"-Email für Event-Bestellungen an den Freigeber',
  84.             'technicalName' => self::EVENT_ORDER_AWAIT_RELEASE_MAIL_TO_RELEASER_TECHNICAL_NAME,
  85.             'availableEntities' => [
  86.                 'order' => 'order',
  87.                 'customer' => 'customer'
  88.             ]
  89.         ],
  90.             [
  91.                 [
  92.                     'id' => Uuid::randomHex(),
  93.                     'mailTemplateTypeId' => $mailTemplateTypeId,
  94.                     'senderName' => '{{ salesChannel.name }}',
  95.                     'subject' => [
  96.                         'de-DE' => 'Die Bestellung {{ order.orderNumber }} befindet sich jetzt im Zustand "Freigabe erforderlich"',
  97.                         'en-GB' => 'The order {{ order.orderNumber }} is now in the "Release required" state'
  98.                     ],
  99.                     'contentPlain' => [
  100.                         'de-DE' => "Es wurde eine neue Bestellung {{ order.orderNumber }} aufgegeben, welche ihre Freigabe erfordert.\n\n{{ releaseUrl }}",
  101.                         'en-GB' => "A new order {{ order.orderNumber }} has been placed, awaiting its release.\n\n{{ releaseUrl }}"
  102.                     ],
  103.                     'contentHtml' => [
  104.                         'de-DE' => '<p>Es wurde eine neue Bestellung {{ order.orderNumber }} aufgegeben, welche ihre Freigabe erwartet.</p><p><a href="{{ releaseUrl }}">{{ releaseUrl }}</a></p>',
  105.                         'en-GB' => '<p>A new order {{ order.orderNumber }} has been placed, awaiting its release.</p><p><a href="{{ releaseUrl }}">{{ releaseUrl }}</a></p>'
  106.                     ],
  107.                 ]
  108.             ], $context->getContext());
  109.         $mailTemplateTypeId Uuid::randomHex();
  110.         $this->createEmailTypeWithTemplates([
  111.             'id' => $mailTemplateTypeId,
  112.             'name' => '"Freigabe erforderlich"-Email für Event-Bestellungen an den Besteller',
  113.             'technicalName' => self::EVENT_ORDER_AWAIT_RELEASE_MAIL_TO_CUSTOMER_TECHNICAL_NAME,
  114.             'availableEntities' => [
  115.                 'order' => 'order',
  116.                 'customer' => 'customer'
  117.             ]
  118.         ],
  119.             [
  120.                 [
  121.                     'id' => Uuid::randomHex(),
  122.                     'mailTemplateTypeId' => $mailTemplateTypeId,
  123.                     'senderName' => '{{ salesChannel.name }}',
  124.                     'subject' => [
  125.                         'de-DE' => 'Ihre Bestellung {{ order.orderNumber }} wartet auf die Freigabe',
  126.                         'en-GB' => 'Your order with number {{ order.orderNumber }} is waiting for release'
  127.                     ],
  128.                     'contentPlain' => [
  129.                         'de-DE' => "Ihrer Bestellung {{ order.orderNumber }} muss erst noch die Freigabe erteilt werden.\n\nBei Rückfragen zur Freigabe erreichen Sie Ihren Ansprechpartner unter der Email {{ releaserEmail }}.",
  130.                         'en-GB' => "Your order {{ order.orderNumber }} has yet to be released.\n\nIf you have any questions about the release, you can reach your contact person at email {{ releaserEmail }}."
  131.                     ],
  132.                     'contentHtml' => [
  133.                         'de-DE' => '<p>Ihrer Bestellung {{ order.orderNumber }} muss erst noch die Freigabe erteilt werden.</p><p>Bei Rückfragen zur Freigabe erreichen Sie Ihren Ansprechpartner unter der Email <a href="mailto:{{ releaserEmail }}">{{ releaserEmail }}</a>.</p>',
  134.                         'en-GB' => '<p>Your order {{ order.orderNumber }} has yet to be released.</p><p>If you have any questions about the release, you can reach your contact person at email <a href="mailto:{{ releaserEmail }}">{ releaserEmail }}</a>.</p>'
  135.                     ],
  136.                 ]
  137.             ], $context->getContext());
  138.         $mailTemplateTypeId Uuid::randomHex();
  139.         $this->createEmailTypeWithTemplates([
  140.             'id' => $mailTemplateTypeId,
  141.             'name' => '"Freigabe erteilt"-Email für Event-Bestellungen an den Besteller',
  142.             'technicalName' => self::EVENT_ORDER_RELEASED_MAIL_TO_CUSTOMER_TECHNICAL_NAME,
  143.             'availableEntities' => [
  144.                 'order' => 'order',
  145.                 'customer' => 'customer'
  146.             ]
  147.         ],
  148.             [
  149.                 [
  150.                     'id' => Uuid::randomHex(),
  151.                     'mailTemplateTypeId' => $mailTemplateTypeId,
  152.                     'senderName' => '{{ salesChannel.name }}',
  153.                     'subject' => [
  154.                         'de-DE' => 'Ihre Bestellung {{ order.orderNumber }} wurde freigegeben',
  155.                         'en-GB' => 'Your order {{ order.orderNumber }} has been released'
  156.                     ],
  157.                     'contentPlain' => [
  158.                         'de-DE' => "Ihrer Bestellung {{ order.orderNumber }} wurde freigegeben.\n\nBei Rückfragen zur Freigabe erreichen Sie Ihren Ansprechpartner unter der Email {{ releaserEmail }}.",
  159.                         'en-GB' => "Your order {{ order.orderNumber }} has been released.\n\nIf you have any questions about the release, you can reach your contact person at the email {{ releaserEmail }}."
  160.                     ],
  161.                     'contentHtml' => [
  162.                         'de-DE' => '<p>Ihrer Bestellung {{ order.orderNumber }} wurde freigegeben.</p><p>Bei Rückfragen zur Freigabe erreichen Sie Ihren Ansprechpartner unter der Email <a href="mailto:{{ releaserEmail }}">{{ releaserEmail }}</a>.</p>',
  163.                         'en-GB' => '<p>Your order number {{ order.orderNumber }} has been released.</p><p>If you have any questions about the release, you can reach your contact person at email <a href="mailto:{{ releaserEmail }}">{ releaserEmail }}</a>.</p>'
  164.                     ],
  165.                 ]
  166.             ], $context->getContext());
  167.         $mailTemplateTypeId Uuid::randomHex();
  168.         $this->createEmailTypeWithTemplates([
  169.             'id' => $mailTemplateTypeId,
  170.             'name' => '"Freigabe abgelehnt"-Email für Event-Bestellungen an den Besteller',
  171.             'technicalName' => self::EVENT_ORDER_CANCEL_MAIL_TO_CUSTOMER_TECHNICAL_NAME,
  172.             'availableEntities' => [
  173.                 'order' => 'order',
  174.                 'customer' => 'customer'
  175.             ]
  176.         ],
  177.             [
  178.                 [
  179.                     'id' => Uuid::randomHex(),
  180.                     'mailTemplateTypeId' => $mailTemplateTypeId,
  181.                     'senderName' => '{{ salesChannel.name }}',
  182.                     'subject' => [
  183.                         'de-DE' => 'Ihre Bestellung {{ order.orderNumber }} wurde abgelehnt',
  184.                         'en-GB' => 'Your order {{ order.orderNumber }} has been rejected'
  185.                     ],
  186.                     'contentPlain' => [
  187.                         'de-DE' => "Ihrer Bestellung {{ order.orderNumber }} wurde abgelehnt.\n\nBei Rückfragen zur Freigabe erreichen Sie Ihren Ansprechpartner unter der Email {{ releaserEmail }}.",
  188.                         'en-GB' => "Your order {{ order.orderNumber }} has been rejected.\n\nIf you have any questions about the release, you can reach your contact person at the email {{ releaserEmail }}."
  189.                     ],
  190.                     'contentHtml' => [
  191.                         'de-DE' => '<p>Ihrer Bestellung {{ order.orderNumber }} wurde abgelehnt.</p><p>Bei Rückfragen zur Freigabe erreichen Sie Ihren Ansprechpartner unter der Email <a href="mailto:{{ releaserEmail }}">{{ releaserEmail }}</a>.</p>',
  192.                         'en-GB' => '<p>Your order number {{ order.orderNumber }} has been rejected.</p><p>If you have any questions about the release, you can reach your contact person at email <a href="mailto:{{ releaserEmail }}">{ releaserEmail }}</a>.</p>'
  193.                     ],
  194.                 ]
  195.             ], $context->getContext());
  196.     }
  197.     protected function addBusinessEvents(InstallContext $context)
  198.     {
  199.         $mailType $this->getEmailType(self::EVENT_ORDER_AWAIT_RELEASE_MAIL_TO_RELEASER_TECHNICAL_NAME$context->getContext());
  200.         $this->createBusinessEvent(
  201.             [
  202.                 'id' => Uuid::randomHex(),
  203.                 'eventName' => EventAwaitReleaseInformReleaserEvent::EVENT_NAME,
  204.                 'actionName' => MailTemplateActions::MAIL_TEMPLATE_MAIL_SEND_ACTION,
  205.                 'config' => [
  206.                     'mail_template_type_id' => $mailType->getId(),
  207.                     'mail_template_id' => $mailType->getMailTemplates()->first()->getId(),
  208.                 ],
  209.                 'title' => $mailType->getName()
  210.             ], $context->getContext());
  211.         $mailType $this->getEmailType(self::EVENT_ORDER_AWAIT_RELEASE_MAIL_TO_CUSTOMER_TECHNICAL_NAME$context->getContext());
  212.         $this->createBusinessEvent(
  213.             [
  214.                 'id' => Uuid::randomHex(),
  215.                 'eventName' => EventAwaitReleaseInformCustomerEvent::EVENT_NAME,
  216.                 'actionName' => MailTemplateActions::MAIL_TEMPLATE_MAIL_SEND_ACTION,
  217.                 'config' => [
  218.                     'mail_template_type_id' => $mailType->getId(),
  219.                     'mail_template_id' => $mailType->getMailTemplates()->first()->getId(),
  220.                 ],
  221.                 'title' => $mailType->getName()
  222.             ], $context->getContext());
  223.         $mailType $this->getEmailType(self::EVENT_ORDER_RELEASED_MAIL_TO_CUSTOMER_TECHNICAL_NAME$context->getContext());
  224.         $this->createBusinessEvent(
  225.             [
  226.                 'id' => Uuid::randomHex(),
  227.                 'eventName' => EventReleasedEvent::EVENT_NAME,
  228.                 'actionName' => MailTemplateActions::MAIL_TEMPLATE_MAIL_SEND_ACTION,
  229.                 'config' => [
  230.                     'mail_template_type_id' => $mailType->getId(),
  231.                     'mail_template_id' => $mailType->getMailTemplates()->first()->getId(),
  232.                 ],
  233.                 'title' => $mailType->getName()
  234.             ], $context->getContext());
  235.         $mailType $this->getEmailType(self::EVENT_ORDER_CANCEL_MAIL_TO_CUSTOMER_TECHNICAL_NAME$context->getContext());
  236.         $this->createBusinessEvent(
  237.             [
  238.                 'id' => Uuid::randomHex(),
  239.                 'eventName' => EventCancelledEvent::EVENT_NAME,
  240.                 'actionName' => MailTemplateActions::MAIL_TEMPLATE_MAIL_SEND_ACTION,
  241.                 'config' => [
  242.                     'mail_template_type_id' => $mailType->getId(),
  243.                     'mail_template_id' => $mailType->getMailTemplates()->first()->getId(),
  244.                 ],
  245.                 'title' => $mailType->getName()
  246.             ], $context->getContext());
  247.     }
  248.     protected function createEmailTypeWithTemplates(array $type, array $templatesContext $context)
  249.     {
  250.         /** @var EntityRepositoryInterface $mailTemplateTypeRepository */
  251.         $mailTemplateTypeRepository $this->container->get('mail_template_type.repository');
  252.         /** @var EntityRepositoryInterface $mailTemplateRepository */
  253.         $mailTemplateRepository $this->container->get('mail_template.repository');
  254.         try {
  255.             $mailTemplateTypeRepository->create([$type], $context);
  256.             $mailTemplateRepository->create($templates$context);
  257.         } catch (UniqueConstraintViolationException $exception) {
  258.             // No, we've already installed the mails, it's fine.
  259.         }
  260.     }
  261.     protected function removeEmailTypeWithTemplates(string $typeNameContext $context)
  262.     {
  263.         /** @var EntityRepositoryInterface $mailTemplateTypeRepository */
  264.         $mailTemplateTypeRepository $this->container->get('mail_template_type.repository');
  265.         /** @var EntityRepositoryInterface $mailTemplateRepository */
  266.         $mailTemplateRepository $this->container->get('mail_template.repository');
  267.         /** @var MailTemplateTypeEntity $myCustomMailTemplateType */
  268.         $myCustomMailTemplateType $mailTemplateTypeRepository->search(
  269.             (new Criteria())->addFilter(new EqualsFilter('technicalName'$typeName)), $context
  270.         )->first();
  271.         $ids = [];
  272.         if ($myCustomMailTemplateType instanceof MailTemplateTypeEntity) {
  273.             $mailTemplateIds $mailTemplateRepository->searchIds(
  274.                 (new Criteria())->addFilter(new EqualsFilter('mailTemplateTypeId'$myCustomMailTemplateType->getId())), $context
  275.             )->getIds();
  276.             //Get the Ids from the fetched Entities
  277.             $ids array_map(static function ($id) {
  278.                 return ['id' => $id];
  279.             }, $mailTemplateIds);
  280.         }
  281.         $mailTemplateTypeRepository->delete([
  282.             ['id' => $myCustomMailTemplateType->getId()]
  283.         ], $context);
  284.         $mailTemplateRepository->delete($ids$context);
  285.     }
  286.     protected function getEmailType(string $emailTypeTechnicalNameContext $context): MailTemplateTypeEntity
  287.     {
  288.         /** @var EntityRepositoryInterface $mailTemplateTypeRepository */
  289.         $mailTemplateTypeRepository $this->container->get('mail_template_type.repository');
  290.         return $mailTemplateTypeRepository->search((new Criteria())->addAssociation('mailTemplates')->addFilter(new EqualsFilter('technicalName'$emailTypeTechnicalName)), $context)->first();
  291.     }
  292.     protected function createBusinessEvent(array $eventContext $context)
  293.     {
  294.         /** @var EntityRepositoryInterface $eventActionRepository */
  295.         $eventActionRepository $this->container->get('event_action.repository');
  296.         if ($this->hasBusinessEvent($event['eventName'], $event['config'], $context)) {
  297.             $event['id'] = $this->getBusinessEvent($event['eventName'], $event['config'], $context)->getId();
  298.             $eventActionRepository->update([$event], $context);
  299.         } else {
  300.             $eventActionRepository->create([$event], $context);
  301.         }
  302.     }
  303.     protected function getBusinessEvent(string $eventName, array $configContext $context): EventActionEntity
  304.     {
  305.         /** @var EntityRepositoryInterface $eventActionRepository */
  306.         $eventActionRepository $this->container->get('event_action.repository');
  307.         return $eventActionRepository->search((new Criteria())
  308.             ->addFilter(new EqualsFilter('eventName'$eventName))
  309.             ->addFilter(new EqualsFilter('config.mail_template_type_id'$config['mail_template_type_id']))
  310.             ->addFilter(new EqualsFilter('config.mail_template_id'$config['mail_template_id'])), $context)->first();
  311.     }
  312.     protected function hasBusinessEvent(string $eventName, array $configContext $context): bool
  313.     {
  314.         /** @var EntityRepositoryInterface $eventActionRepository */
  315.         $eventActionRepository $this->container->get('event_action.repository');
  316.         return ($eventActionRepository->search((new Criteria())
  317.                 ->addFilter(new EqualsFilter('eventName'$eventName))
  318.                 ->addFilter(new EqualsFilter('config.mail_template_type_id'$config['mail_template_type_id']))
  319.                 ->addFilter(new EqualsFilter('config.mail_template_id'$config['mail_template_id'])), $context)->count() > 0);
  320.     }
  321. }