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.         if($this->columnExists($connection'media''acrisSurchargeDiscounts')) {
  49.             $connection->executeStatement('ALTER TABLE media DROP COLUMN acrisSurchargeDiscounts');
  50.         }
  51.         if($this->columnExists($connection'rule''discountSurchargeDiscount')) {
  52.             $connection->executeStatement('ALTER TABLE rule DROP COLUMN discountSurchargeDiscount');
  53.         }
  54.         if($this->columnExists($connection'rule''surchargeDiscount')) {
  55.             $connection->executeStatement('ALTER TABLE rule DROP COLUMN surchargeDiscount');
  56.         }
  57.         if($this->columnExists($connection'sales_channel''surchargeDiscount')) {
  58.             $connection->executeStatement('ALTER TABLE sales_channel DROP COLUMN surchargeDiscount');
  59.         }
  60.         $connection->executeStatement('DROP TABLE IF EXISTS acris_rule_s_d_discount_rules');
  61.         $connection->executeStatement('DROP TABLE IF EXISTS acris_rule_s_d_delivery_rules');
  62.         $connection->executeStatement('DROP TABLE IF EXISTS acris_rule_s_d_sales_channel');
  63.         $connection->executeStatement('DROP TABLE IF EXISTS acris_rule_s_d_rules');
  64.         $connection->executeStatement('DROP TABLE IF EXISTS acris_rule_s_d_translation');
  65.         $connection->executeStatement('DROP TABLE IF EXISTS acris_rule_s_d');
  66.     }
  67.     protected function columnExists(Connection $connectionstring $tablestring $column): bool
  68.     {
  69.         $exists $connection->fetchOne(
  70.             'SHOW COLUMNS FROM `' $table '` WHERE `Field` LIKE :column',
  71.             ['column' => $column]
  72.         );
  73.         return !empty($exists);
  74.     }
  75.     private function insertDefaultMailTemplate(Context $context): void
  76.     {
  77.         $mailTemplateTypeRepository $this->container->get('mail_template_type.repository');
  78.         $mailTemplateTypePartialDeliverySearchResult $mailTemplateTypeRepository->searchIds((new Criteria())->addFilter(new EqualsFilter('technicalName'self::DEFAULT_MAIL_TEMPLATE_TYPE_SURCHARGE_DISCOUNT)), $context);
  79.         if(empty($mailTemplateTypePartialDeliverySearchResult->firstId())) {
  80.             $mailTemplateTypePartialDeliveryId Uuid::randomHex();
  81.             $mailTemplatePartialDeliveryId Uuid::randomHex();
  82.             $mailTemplateTypePartialDeliveryData = [
  83.                 'id' => $mailTemplateTypePartialDeliveryId,
  84.                 'technicalName' => self::DEFAULT_MAIL_TEMPLATE_TYPE_SURCHARGE_DISCOUNT,
  85.                 'availableEntities' => [ "order" => "order""salesChannel" =>"sales_channel""editOrderUrl" =>null ],
  86.                 'translations' => [
  87.                     'de-DE' => [
  88.                         'name' => 'ACRIS Zuschläge und Rabatte'
  89.                     ],
  90.                     'en-GB' => [
  91.                         'name' => 'ACRIS Surcharge Discount'
  92.                     ],
  93.                     [
  94.                         'name' => 'Surcharge Discount',
  95.                         'languageId' => Defaults::LANGUAGE_SYSTEM
  96.                     ]
  97.                 ],
  98.                 'mailTemplates' => [
  99.                     [
  100.                         'id' => $mailTemplatePartialDeliveryId,
  101.                         'systemDefault' => true,
  102.                         'translations' => [
  103.                             'de-DE' => [
  104.                                 'senderName' => '{{ salesChannel.name }}',
  105.                                 'subject' => 'Bestellbestätigung - ACRIS Zuschläge und Rabatte',
  106.                                 'description' => 'Standard-E-Mail-Vorlage für ACRIS Zuschläge und Rabatte.',
  107.                                 'contentHtml' => file_get_contents($this->path '/Resources/mail-template/html/de-DE/order-confirmation.html.twig'),
  108.                                 'contentPlain' => 'Kein Inhalt.'
  109.                             ],
  110.                             'en-GB' => [
  111.                                 'senderName' => '{{ salesChannel.name }}',
  112.                                 'subject' => 'Order confirmation - ACRIS Surcharge and Discounts',
  113.                                 'description' => 'Default E-mail template for ACRIS surcharge and discounts.',
  114.                                 'contentHtml' => file_get_contents($this->path '/Resources/mail-template/html/en-GB/order-confirmation.html.twig'),
  115.                                 'contentPlain' => 'No content.'
  116.                             ],
  117.                             [
  118.                                 'senderName' => '{{ salesChannel.name }}',
  119.                                 'subject' => 'Order confirmation - ACRIS Surcharge and Discounts',
  120.                                 'description' => 'Default E-mail template for ACRIS surcharge and discounts.',
  121.                                 'contentHtml' => file_get_contents($this->path '/Resources/mail-template/html/en-GB/order-confirmation.html.twig'),
  122.                                 'contentPlain' => 'No content.',
  123.                                 'languageId' => Defaults::LANGUAGE_SYSTEM
  124.                             ]
  125.                         ],
  126.                     ]
  127.                 ]
  128.             ];
  129.             $mailTemplateTypeRepository->upsert([$mailTemplateTypePartialDeliveryData], $context);
  130.         }
  131.     }
  132.     private function removeDefaultMailTemplate(Context $context): void
  133.     {
  134.         $mailTemplateTypeRepository $this->container->get('mail_template_type.repository');
  135.         $mailTemplateTypePartialDeliverySearchResult $mailTemplateTypeRepository->searchIds((new Criteria())->addFilter(new EqualsFilter('technicalName'self::DEFAULT_MAIL_TEMPLATE_TYPE_SURCHARGE_DISCOUNT)), $context);
  136.         if($mailTemplateTypePartialDeliverySearchResult->firstId()) {
  137.             $mailTemplateRepository $this->container->get('mail_template.repository');
  138.             $mailTemplateSearchResult $mailTemplateRepository->searchIds((new Criteria())->addFilter(new EqualsFilter('mailTemplateTypeId'$mailTemplateTypePartialDeliverySearchResult->firstId())), $context);
  139.             $templateAssigned false;
  140.             foreach ($mailTemplateSearchResult->getIds() as $id) {
  141.                 $eventActionRepository $this->container->get('event_action.repository');
  142.                 $eventActionSearchResult $eventActionRepository->searchIds((new Criteria())->addFilter(new EqualsFilter('config.mail_template_id'$id)), $context);
  143.                 if($eventActionSearchResult->firstId() && $eventActionSearchResult->getTotal() > 0$templateAssigned true;
  144.             }
  145.             if ($templateAssigned !== true) {
  146.                 foreach ($mailTemplateSearchResult->getIds() as $id) {
  147.                     $mailTemplateRepository->delete([['id'=>$id]], $context);
  148.                 }
  149.                 $mailTemplateTypeRepository->delete([['id'=>$mailTemplateTypePartialDeliverySearchResult->firstId()]], $context);
  150.             }
  151.         }
  152.     }
  153.     private function updateExistingSurchargeDiscounts(Context $context): void
  154.     {
  155.         /** @var EntityRepositoryInterface $surchargeDiscountRepository */
  156.         $surchargeDiscountRepository $this->container->get('acris_rule_s_d.repository');
  157.         $criteria = (new Criteria())->addFilter(new MultiFilter(MultiFilter::CONNECTION_AND, [
  158.             new EqualsFilter('price'null),
  159.             new NotFilter(NotFilter::CONNECTION_AND, [
  160.                 new EqualsFilter('value'null)
  161.             ])
  162.         ]));
  163.         $offset self::DEFAULT_VALUE_OFFSET;
  164.         $load true;
  165.         $updateData = [];
  166.         while ($load) {
  167.             $criteria->setOffset($offset);
  168.             $searchResult $surchargeDiscountRepository->search($criteria$context);
  169.             if ($searchResult->getTotal() > 0) {
  170.                 /** @var SurchargeDiscountEntity $surchargeDiscount */
  171.                 foreach ($searchResult->getEntities()->getElements() as $surchargeDiscount) {
  172.                     $updateData[] = [
  173.                         'id' => $surchargeDiscount->getId(),
  174.                         'price' => [Defaults::CURRENCY => [
  175.                             'currencyId' => Defaults::CURRENCY,
  176.                             'net' => $surchargeDiscount->getValue(),
  177.                             'gross' => $surchargeDiscount->getValue(),
  178.                             'linked' => true
  179.                         ]]
  180.                     ];
  181.                 }
  182.             }
  183.             $offset += self::DEFAULT_CRITERIA_LIMIT;
  184.             if ($searchResult->getTotal() < self::DEFAULT_CRITERIA_LIMIT$load false;
  185.         }
  186.         if (!empty($updateData)) {
  187.             $surchargeDiscountRepository->update($updateData$context);
  188.         }
  189.     }
  190. }