<?php declare(strict_types=1);
namespace CodevisionMiraklConnector;
use CodevisionMiraklConnector\Migration\CustomFields\CustomFieldGenerator;
use CodevisionMiraklConnector\Migration\Lifecycle\PluginInstaller;
use CodevisionMiraklConnector\Migration\Lifecycle\PluginUninstaller;
use CodevisionMiraklConnector\Migration\Payment\MiraklPaymentMethodGenerator;
use CodevisionMiraklConnector\Migration\SalesChannel\SalesChannelGenerator;
use CodevisionMiraklConnector\Migration\Streams\ProductStreamGenerator;
use CodevisionMiraklConnector\Migration\UserConfig\OrderSearchExtension;
use Doctrine\DBAL\Connection;
use JMS\SerializerBundle\JMSSerializerBundle;
use League\Tactician\Bundle\TacticianBundle;
use Shopware\Core\Framework\Parameter\AdditionalBundleParameters;
use Shopware\Core\Framework\Plugin;
use Shopware\Core\Framework\Plugin\Context\ActivateContext;
use Shopware\Core\Framework\Plugin\Context\InstallContext;
use Shopware\Core\Framework\Plugin\Context\UninstallContext;
use Shopware\Core\Framework\Plugin\Context\UpdateContext;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
use Webmozart\Assert\Assert;
if (is_dir(__DIR__.'/../vendor') === true) {
include_once __DIR__.'/../vendor/autoload.php';
}
class CodevisionMiraklConnector extends Plugin
{
private ?PluginInstaller $installer = null;
public const DEBUG_MODE = false;
public const SW_MIN_REQUIRED = '6.4.15';
public const SW_MAX_EXCLUDED = '6.5.*';
public function getAdditionalBundles(AdditionalBundleParameters $parameters): array
{
return [
new TacticianBundle(),
new JMSSerializerBundle(),
];
}
public function build(ContainerBuilder $container): void
{
parent::build($container);
$loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/Resources'));
$loader->load('services.yaml');
}
public function update(UpdateContext $updateContext): void
{
parent::update($updateContext);
/** @var Plugin\Util\PluginIdProvider $pluginIdProvider */
$pluginIdProvider = $this->container->get(Plugin\Util\PluginIdProvider::class);
$pluginId = $pluginIdProvider->getPluginIdByBaseClass(get_class($this), $updateContext->getContext());
(new MiraklPaymentMethodGenerator($this->container->get('payment_method.repository')))->update(
$updateContext,
$pluginId
);
$this->buildInstaller();
$this->installer->upsert($updateContext);
}
private function buildInstaller(): void {
if ($this->installer !== null) {
return;
}
$this->installer = new PluginInstaller(
new CustomFieldGenerator(
$this->container->get('custom_field_set.repository')
),
new SalesChannelGenerator(
$this->container->get('sales_channel_type.repository'),
$this->container->get('sales_channel.repository'),
$this->container->get('product_stream.repository'),
$this->container->get('product_export.repository')
),
new ProductStreamGenerator(
$this->container->get('product_stream.repository'),
$this->container->get('product_stream_filter.repository')
),
new OrderSearchExtension(
$this->container->get('user_config.repository'),
$this->container->get(Connection::class)
)
);
}
public function activate(ActivateContext $activateContext): void
{
parent::activate($activateContext);
$this->buildInstaller();
$this->installer->upsert($activateContext);
/** @var Plugin\Util\PluginIdProvider $pluginIdProvider */
$pluginIdProvider = $this->container->get(Plugin\Util\PluginIdProvider::class);
$pluginId = $pluginIdProvider->getPluginIdByBaseClass(get_class($this), $activateContext->getContext());
(new MiraklPaymentMethodGenerator($this->container->get('payment_method.repository')))->install(
$activateContext,
$pluginId
);
}
public function install(InstallContext $installContext): void
{
$currentShopwareVersion = $this->container->getParameter('kernel.shopware_version');
parent::install($installContext);
Assert::true(
version_compare(
$currentShopwareVersion,
CodevisionMiraklConnector::SW_MIN_REQUIRED,
'>='
)
&&
version_compare(
$currentShopwareVersion,
CodevisionMiraklConnector::SW_MAX_EXCLUDED,
'<'
),
sprintf(
'The Shopware Version you are currently using (%s) is too low or too high. Please upgrade to at least %s and lower than %s',
$currentShopwareVersion,
CodevisionMiraklConnector::SW_MIN_REQUIRED,
CodevisionMiraklConnector::SW_MAX_EXCLUDED,
)
);
$this->buildInstaller();
$this->installer->upsert($installContext);
/** @var Plugin\Util\PluginIdProvider $pluginIdProvider */
$pluginIdProvider = $this->container->get(Plugin\Util\PluginIdProvider::class);
$pluginId = $pluginIdProvider->getPluginIdByBaseClass(get_class($this), $installContext->getContext());
(new MiraklPaymentMethodGenerator($this->container->get('payment_method.repository')))->install(
$installContext,
$pluginId
);
}
public function uninstall(UninstallContext $uninstallContext): void
{
parent::uninstall($uninstallContext);
try {
$uninstaller = new PluginUninstaller(
$this->container->get('dead_message.repository'),
$this->container->get(Connection::class),
);
$uninstaller->uninstall($uninstallContext);
/** @var Plugin\Util\PluginIdProvider $pluginIdProvider */
$pluginIdProvider = $this->container->get(Plugin\Util\PluginIdProvider::class);
$pluginId = $pluginIdProvider->getPluginIdByBaseClass(get_class($this), $uninstallContext->getContext());
(new MiraklPaymentMethodGenerator($this->container->get('payment_method.repository')))->uninstall(
$uninstallContext,
$pluginId
);
} catch (\Exception $exception) {
}
}
}