custom/plugins/AcrisRuleSurchargeDiscountCS/src/AcrisRuleSurchargeDiscountCS.php line 18

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Acris\RuleSurchargeDiscount;
  3. use Acris\RuleSurchargeDiscount\Custom\SurchargeDiscountEntity;
  4. use Doctrine\DBAL\Connection;
  5. use Shopware\Core\Defaults;
  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\DataAbstractionLayer\Search\Filter\MultiFilter;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\NotFilter;
  12. use Shopware\Core\Framework\Plugin;
  13. use Shopware\Core\Framework\Plugin\Context\UninstallContext;
  14. use Shopware\Core\Framework\Uuid\Uuid;
  15. class AcrisRuleSurchargeDiscountCS extends Plugin
  16. {
  17.     const DEFAULT_VALUE_OFFSET 0;
  18.     const DEFAULT_CRITERIA_LIMIT 50;
  19.     const DEFAULT_MAIL_TEMPLATE_TYPE_SURCHARGE_DISCOUNT 'acris_surcharge_discount.order_confirmation';
  20.     public function update(Plugin\Context\UpdateContext $updateContext): void
  21.     {
  22.         if (version_compare($updateContext->getCurrentPluginVersion(), '3.2.0''<') && version_compare($updateContext->getUpdatePluginVersion(), '3.2.0''>=')) {
  23.             $this->insertDefaultMailTemplate($updateContext->getContext());
  24.         }
  25.     }
  26.     public function postUpdate(Plugin\Context\UpdateContext $updateContext): void
  27.     {
  28.         if (version_compare($updateContext->getCurrentPluginVersion(), '3.7.0''<') && version_compare($updateContext->getUpdatePluginVersion(), '3.7.0''>=') && $updateContext->getPlugin()->isActive() === true) {
  29.             $this->updateExistingSurchargeDiscounts($updateContext->getContext());
  30.         }
  31.     }
  32.     public function activate(Plugin\Context\ActivateContext $activateContext): void
  33.     {
  34.         $this->insertDefaultMailTemplate($activateContext->getContext());
  35.         $this->updateExistingSurchargeDiscounts($activateContext->getContext());
  36.     }
  37.     public function uninstall(UninstallContext $uninstallContext): void
  38.     {
  39.         if ($uninstallContext->keepUserData()) {
  40.             return;
  41.         }
  42.         $this->cleanupDatabase();
  43.         $this->removeDefaultMailTemplate($uninstallContext->getContext());
  44.     }
  45.     private function cleanupDatabase(): void
  46.     {
  47.         $connection $this->container->get(Connection::class);
  48.         $connection->executeStatement('ALTER TABLE rule DROP COLUMN discountSurchargeDiscount');
  49.         $connection->executeStatement('ALTER TABLE rule DROP COLUMN surchargeDiscount');
  50.         $connection->executeStatement('ALTER TABLE sales_channel DROP COLUMN surchargeDiscount');
  51.         $connection->executeStatement('DROP TABLE IF EXISTS acris_rule_s_d_discount_rules');
  52.         $connection->executeStatement('DROP TABLE IF EXISTS acris_rule_s_d_sales_channel');
  53.         $connection->executeStatement('DROP TABLE IF EXISTS acris_rule_s_d_rules');
  54.         $connection->executeStatement('DROP TABLE IF EXISTS acris_rule_s_d_translation');
  55.         $connection->executeStatement('DROP TABLE IF EXISTS acris_rule_s_d');
  56.     }
  57.     private function insertDefaultMailTemplate(Context $context): void
  58.     {
  59.         $mailTemplateTypeRepository $this->container->get('mail_template_type.repository');
  60.         $mailTemplateTypePartialDeliverySearchResult $mailTemplateTypeRepository->searchIds((new Criteria())->addFilter(new EqualsFilter('technicalName'self::DEFAULT_MAIL_TEMPLATE_TYPE_SURCHARGE_DISCOUNT)), $context);
  61.         if(empty($mailTemplateTypePartialDeliverySearchResult->firstId())) {
  62.             $mailTemplateTypePartialDeliveryId Uuid::randomHex();
  63.             $mailTemplatePartialDeliveryId Uuid::randomHex();
  64.             $mailTemplateTypePartialDeliveryData = [
  65.                 'id' => $mailTemplateTypePartialDeliveryId,
  66.                 'technicalName' => self::DEFAULT_MAIL_TEMPLATE_TYPE_SURCHARGE_DISCOUNT,
  67.                 'availableEntities' => [ "order" => "order""salesChannel" =>"sales_channel""editOrderUrl" =>null ],
  68.                 'translations' => [
  69.                     'de-DE' => [
  70.                         'name' => 'ACRIS Zuschläge und Rabatte'
  71.                     ],
  72.                     'en-GB' => [
  73.                         'name' => 'ACRIS Surcharge Discount'
  74.                     ],
  75.                     [
  76.                         'name' => 'Surcharge Discount',
  77.                         'languageId' => Defaults::LANGUAGE_SYSTEM
  78.                     ]
  79.                 ],
  80.                 'mailTemplates' => [
  81.                     [
  82.                         'id' => $mailTemplatePartialDeliveryId,
  83.                         'systemDefault' => true,
  84.                         'translations' => [
  85.                             'de-DE' => [
  86.                                 'senderName' => '{{ salesChannel.name }}',
  87.                                 'subject' => 'Bestellbestätigung - ACRIS Zuschläge und Rabatte',
  88.                                 'description' => 'Standard-E-Mail-Vorlage für ACRIS Zuschläge und Rabatte.',
  89.                                 'contentHtml' => file_get_contents($this->path '/Resources/mail-template/html/de-DE/order-confirmation.html.twig'),
  90.                                 'contentPlain' => 'Kein Inhalt.'
  91.                             ],
  92.                             'en-GB' => [
  93.                                 'senderName' => '{{ salesChannel.name }}',
  94.                                 'subject' => 'Order confirmation - ACRIS Surcharge and Discounts',
  95.                                 'description' => 'Default E-mail template for ACRIS surcharge and discounts.',
  96.                                 'contentHtml' => file_get_contents($this->path '/Resources/mail-template/html/en-GB/order-confirmation.html.twig'),
  97.                                 'contentPlain' => 'No content.'
  98.                             ],
  99.                             [
  100.                                 'senderName' => '{{ salesChannel.name }}',
  101.                                 'subject' => 'Order confirmation - ACRIS Surcharge and Discounts',
  102.                                 'description' => 'Default E-mail template for ACRIS surcharge and discounts.',
  103.                                 'contentHtml' => file_get_contents($this->path '/Resources/mail-template/html/en-GB/order-confirmation.html.twig'),
  104.                                 'contentPlain' => 'No content.',
  105.                                 'languageId' => Defaults::LANGUAGE_SYSTEM
  106.                             ]
  107.                         ],
  108.                     ]
  109.                 ]
  110.             ];
  111.             $mailTemplateTypeRepository->upsert([$mailTemplateTypePartialDeliveryData], $context);
  112.         }
  113.     }
  114.     private function removeDefaultMailTemplate(Context $context): void
  115.     {
  116.         $mailTemplateTypeRepository $this->container->get('mail_template_type.repository');
  117.         $mailTemplateTypePartialDeliverySearchResult $mailTemplateTypeRepository->searchIds((new Criteria())->addFilter(new EqualsFilter('technicalName'self::DEFAULT_MAIL_TEMPLATE_TYPE_SURCHARGE_DISCOUNT)), $context);
  118.         if($mailTemplateTypePartialDeliverySearchResult->firstId()) {
  119.             $mailTemplateRepository $this->container->get('mail_template.repository');
  120.             $mailTemplateSearchResult $mailTemplateRepository->searchIds((new Criteria())->addFilter(new EqualsFilter('mailTemplateTypeId'$mailTemplateTypePartialDeliverySearchResult->firstId())), $context);
  121.             $templateAssigned false;
  122.             foreach ($mailTemplateSearchResult->getIds() as $id) {
  123.                 $eventActionRepository $this->container->get('event_action.repository');
  124.                 $eventActionSearchResult $eventActionRepository->searchIds((new Criteria())->addFilter(new EqualsFilter('config.mail_template_id'$id)), $context);
  125.                 if($eventActionSearchResult->firstId() && $eventActionSearchResult->getTotal() > 0$templateAssigned true;
  126.             }
  127.             if ($templateAssigned !== true) {
  128.                 foreach ($mailTemplateSearchResult->getIds() as $id) {
  129.                     $mailTemplateRepository->delete([['id'=>$id]], $context);
  130.                 }
  131.                 $mailTemplateTypeRepository->delete([['id'=>$mailTemplateTypePartialDeliverySearchResult->firstId()]], $context);
  132.             }
  133.         }
  134.     }
  135.     private function updateExistingSurchargeDiscounts(Context $context): void
  136.     {
  137.         /** @var EntityRepositoryInterface $surchargeDiscountRepository */
  138.         $surchargeDiscountRepository $this->container->get('acris_rule_s_d.repository');
  139.         $criteria = (new Criteria())->addFilter(new MultiFilter(MultiFilter::CONNECTION_AND, [
  140.             new EqualsFilter('price'null),
  141.             new NotFilter(NotFilter::CONNECTION_AND, [
  142.                 new EqualsFilter('value'null)
  143.             ])
  144.         ]));
  145.         $offset self::DEFAULT_VALUE_OFFSET;
  146.         $load true;
  147.         $updateData = [];
  148.         while ($load) {
  149.             $criteria->setOffset($offset);
  150.             $searchResult $surchargeDiscountRepository->search($criteria$context);
  151.             if ($searchResult->getTotal() > 0) {
  152.                 /** @var SurchargeDiscountEntity $surchargeDiscount */
  153.                 foreach ($searchResult->getEntities()->getElements() as $surchargeDiscount) {
  154.                     $updateData[] = [
  155.                         'id' => $surchargeDiscount->getId(),
  156.                         'price' => [Defaults::CURRENCY => [
  157.                             'currencyId' => Defaults::CURRENCY,
  158.                             'net' => $surchargeDiscount->getValue(),
  159.                             'gross' => $surchargeDiscount->getValue(),
  160.                             'linked' => true
  161.                         ]]
  162.                     ];
  163.                 }
  164.             }
  165.             $offset += self::DEFAULT_CRITERIA_LIMIT;
  166.             if ($searchResult->getTotal() < self::DEFAULT_CRITERIA_LIMIT$load false;
  167.         }
  168.         if (!empty($updateData)) {
  169.             $surchargeDiscountRepository->update($updateData$context);
  170.         }
  171.     }
  172. }