<?php declare(strict_types=1);
namespace Acris\RuleSurchargeDiscount;
use Acris\RuleSurchargeDiscount\Custom\SurchargeDiscountEntity;
use Doctrine\DBAL\Connection;
use Shopware\Core\Defaults;
use Shopware\Core\Framework\Context;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\MultiFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\NotFilter;
use Shopware\Core\Framework\Plugin;
use Shopware\Core\Framework\Plugin\Context\UninstallContext;
use Shopware\Core\Framework\Uuid\Uuid;
class AcrisRuleSurchargeDiscountCS extends Plugin
{
const DEFAULT_VALUE_OFFSET = 0;
const DEFAULT_CRITERIA_LIMIT = 50;
const DEFAULT_MAIL_TEMPLATE_TYPE_SURCHARGE_DISCOUNT = 'acris_surcharge_discount.order_confirmation';
public function update(Plugin\Context\UpdateContext $updateContext): void
{
if (version_compare($updateContext->getCurrentPluginVersion(), '3.2.0', '<') && version_compare($updateContext->getUpdatePluginVersion(), '3.2.0', '>=')) {
$this->insertDefaultMailTemplate($updateContext->getContext());
}
}
public function postUpdate(Plugin\Context\UpdateContext $updateContext): void
{
if (version_compare($updateContext->getCurrentPluginVersion(), '3.7.0', '<') && version_compare($updateContext->getUpdatePluginVersion(), '3.7.0', '>=') && $updateContext->getPlugin()->isActive() === true) {
$this->updateExistingSurchargeDiscounts($updateContext->getContext());
}
}
public function activate(Plugin\Context\ActivateContext $activateContext): void
{
$this->insertDefaultMailTemplate($activateContext->getContext());
$this->updateExistingSurchargeDiscounts($activateContext->getContext());
}
public function uninstall(UninstallContext $uninstallContext): void
{
if ($uninstallContext->keepUserData()) {
return;
}
$this->cleanupDatabase();
$this->removeDefaultMailTemplate($uninstallContext->getContext());
}
private function cleanupDatabase(): void
{
$connection = $this->container->get(Connection::class);
if($this->columnExists($connection, 'media', 'acrisSurchargeDiscounts')) {
$connection->executeStatement('ALTER TABLE media DROP COLUMN acrisSurchargeDiscounts');
}
if($this->columnExists($connection, 'rule', 'discountSurchargeDiscount')) {
$connection->executeStatement('ALTER TABLE rule DROP COLUMN discountSurchargeDiscount');
}
if($this->columnExists($connection, 'rule', 'surchargeDiscount')) {
$connection->executeStatement('ALTER TABLE rule DROP COLUMN surchargeDiscount');
}
if($this->columnExists($connection, 'sales_channel', 'surchargeDiscount')) {
$connection->executeStatement('ALTER TABLE sales_channel DROP COLUMN surchargeDiscount');
}
$connection->executeStatement('DROP TABLE IF EXISTS acris_rule_s_d_discount_rules');
$connection->executeStatement('DROP TABLE IF EXISTS acris_rule_s_d_delivery_rules');
$connection->executeStatement('DROP TABLE IF EXISTS acris_rule_s_d_sales_channel');
$connection->executeStatement('DROP TABLE IF EXISTS acris_rule_s_d_rules');
$connection->executeStatement('DROP TABLE IF EXISTS acris_rule_s_d_translation');
$connection->executeStatement('DROP TABLE IF EXISTS acris_rule_s_d');
}
protected function columnExists(Connection $connection, string $table, string $column): bool
{
$exists = $connection->fetchOne(
'SHOW COLUMNS FROM `' . $table . '` WHERE `Field` LIKE :column',
['column' => $column]
);
return !empty($exists);
}
private function insertDefaultMailTemplate(Context $context): void
{
$mailTemplateTypeRepository = $this->container->get('mail_template_type.repository');
$mailTemplateTypePartialDeliverySearchResult = $mailTemplateTypeRepository->searchIds((new Criteria())->addFilter(new EqualsFilter('technicalName', self::DEFAULT_MAIL_TEMPLATE_TYPE_SURCHARGE_DISCOUNT)), $context);
if(empty($mailTemplateTypePartialDeliverySearchResult->firstId())) {
$mailTemplateTypePartialDeliveryId = Uuid::randomHex();
$mailTemplatePartialDeliveryId = Uuid::randomHex();
$mailTemplateTypePartialDeliveryData = [
'id' => $mailTemplateTypePartialDeliveryId,
'technicalName' => self::DEFAULT_MAIL_TEMPLATE_TYPE_SURCHARGE_DISCOUNT,
'availableEntities' => [ "order" => "order", "salesChannel" =>"sales_channel", "editOrderUrl" =>null ],
'translations' => [
'de-DE' => [
'name' => 'ACRIS Zuschläge und Rabatte'
],
'en-GB' => [
'name' => 'ACRIS Surcharge Discount'
],
[
'name' => 'Surcharge Discount',
'languageId' => Defaults::LANGUAGE_SYSTEM
]
],
'mailTemplates' => [
[
'id' => $mailTemplatePartialDeliveryId,
'systemDefault' => true,
'translations' => [
'de-DE' => [
'senderName' => '{{ salesChannel.name }}',
'subject' => 'Bestellbestätigung - ACRIS Zuschläge und Rabatte',
'description' => 'Standard-E-Mail-Vorlage für ACRIS Zuschläge und Rabatte.',
'contentHtml' => file_get_contents($this->path . '/Resources/mail-template/html/de-DE/order-confirmation.html.twig'),
'contentPlain' => 'Kein Inhalt.'
],
'en-GB' => [
'senderName' => '{{ salesChannel.name }}',
'subject' => 'Order confirmation - ACRIS Surcharge and Discounts',
'description' => 'Default E-mail template for ACRIS surcharge and discounts.',
'contentHtml' => file_get_contents($this->path . '/Resources/mail-template/html/en-GB/order-confirmation.html.twig'),
'contentPlain' => 'No content.'
],
[
'senderName' => '{{ salesChannel.name }}',
'subject' => 'Order confirmation - ACRIS Surcharge and Discounts',
'description' => 'Default E-mail template for ACRIS surcharge and discounts.',
'contentHtml' => file_get_contents($this->path . '/Resources/mail-template/html/en-GB/order-confirmation.html.twig'),
'contentPlain' => 'No content.',
'languageId' => Defaults::LANGUAGE_SYSTEM
]
],
]
]
];
$mailTemplateTypeRepository->upsert([$mailTemplateTypePartialDeliveryData], $context);
}
}
private function removeDefaultMailTemplate(Context $context): void
{
$mailTemplateTypeRepository = $this->container->get('mail_template_type.repository');
$mailTemplateTypePartialDeliverySearchResult = $mailTemplateTypeRepository->searchIds((new Criteria())->addFilter(new EqualsFilter('technicalName', self::DEFAULT_MAIL_TEMPLATE_TYPE_SURCHARGE_DISCOUNT)), $context);
if($mailTemplateTypePartialDeliverySearchResult->firstId()) {
$mailTemplateRepository = $this->container->get('mail_template.repository');
$mailTemplateSearchResult = $mailTemplateRepository->searchIds((new Criteria())->addFilter(new EqualsFilter('mailTemplateTypeId', $mailTemplateTypePartialDeliverySearchResult->firstId())), $context);
$templateAssigned = false;
foreach ($mailTemplateSearchResult->getIds() as $id) {
$eventActionRepository = $this->container->get('event_action.repository');
$eventActionSearchResult = $eventActionRepository->searchIds((new Criteria())->addFilter(new EqualsFilter('config.mail_template_id', $id)), $context);
if($eventActionSearchResult->firstId() && $eventActionSearchResult->getTotal() > 0) $templateAssigned = true;
}
if ($templateAssigned !== true) {
foreach ($mailTemplateSearchResult->getIds() as $id) {
$mailTemplateRepository->delete([['id'=>$id]], $context);
}
$mailTemplateTypeRepository->delete([['id'=>$mailTemplateTypePartialDeliverySearchResult->firstId()]], $context);
}
}
}
private function updateExistingSurchargeDiscounts(Context $context): void
{
/** @var EntityRepositoryInterface $surchargeDiscountRepository */
$surchargeDiscountRepository = $this->container->get('acris_rule_s_d.repository');
$criteria = (new Criteria())->addFilter(new MultiFilter(MultiFilter::CONNECTION_AND, [
new EqualsFilter('price', null),
new NotFilter(NotFilter::CONNECTION_AND, [
new EqualsFilter('value', null)
])
]));
$offset = self::DEFAULT_VALUE_OFFSET;
$load = true;
$updateData = [];
while ($load) {
$criteria->setOffset($offset);
$searchResult = $surchargeDiscountRepository->search($criteria, $context);
if ($searchResult->getTotal() > 0) {
/** @var SurchargeDiscountEntity $surchargeDiscount */
foreach ($searchResult->getEntities()->getElements() as $surchargeDiscount) {
$updateData[] = [
'id' => $surchargeDiscount->getId(),
'price' => [Defaults::CURRENCY => [
'currencyId' => Defaults::CURRENCY,
'net' => $surchargeDiscount->getValue(),
'gross' => $surchargeDiscount->getValue(),
'linked' => true
]]
];
}
}
$offset += self::DEFAULT_CRITERIA_LIMIT;
if ($searchResult->getTotal() < self::DEFAULT_CRITERIA_LIMIT) $load = false;
}
if (!empty($updateData)) {
$surchargeDiscountRepository->update($updateData, $context);
}
}
}