<?php declare(strict_types=1);
namespace payplace\Payment;
use Shopware\Core\Framework\Plugin;
use Shopware\Core\Framework\Context;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Framework\Plugin\Context\ActivateContext;
use Shopware\Core\Framework\Plugin\Context\DeactivateContext;
use Shopware\Core\Framework\Plugin\Context\InstallContext;
use Shopware\Core\Framework\Plugin\Context\UninstallContext;
use Shopware\Core\Framework\Plugin\Util\PluginIdProvider;
use payplace\Payment\Service\payplacePaymentHandlerCC;
use payplace\Payment\Service\payplacePaymentHandlerDD;
use payplace\Payment\Service\payplacePaymentHandlerGP;
use payplace\Payment\Service\payplacePaymentHandlerP2;
use payplace\Payment\Service\payplacePaymentHandlerPD;
use payplace\Payment\Service\payplacePaymentHandlerPP;
use payplace\Payment\Service\payplacePaymentHandlerSU;
class payplacePaymentPlugin extends Plugin
{
public function install(InstallContext $context): void
{
$this->addPaymentMethod($context->getContext(), payplacePaymentHandlerCC::class, -106);
$this->addPaymentMethod($context->getContext(), payplacePaymentHandlerDD::class, -105);
$this->addPaymentMethod($context->getContext(), payplacePaymentHandlerGP::class, -104);
$this->addPaymentMethod($context->getContext(), payplacePaymentHandlerP2::class, -103);
$this->addPaymentMethod($context->getContext(), payplacePaymentHandlerPD::class, -102);
$this->addPaymentMethod($context->getContext(), payplacePaymentHandlerPP::class, -101);
$this->addPaymentMethod($context->getContext(), payplacePaymentHandlerSU::class, -100);
}
public function uninstall(UninstallContext $context): void
{
// Only set the payment method to inactive when uninstalling. Removing the payment method would
// cause data consistency issues, since the payment method might have been used in several orders
$this->setPaymentActive(false, $context->getContext(), payplacePaymentHandlerCC::class);
$this->setPaymentActive(false, $context->getContext(), payplacePaymentHandlerDD::class);
$this->setPaymentActive(false, $context->getContext(), payplacePaymentHandlerGP::class);
$this->setPaymentActive(false, $context->getContext(), payplacePaymentHandlerP2::class);
$this->setPaymentActive(false, $context->getContext(), payplacePaymentHandlerPD::class);
$this->setPaymentActive(false, $context->getContext(), payplacePaymentHandlerPP::class);
$this->setPaymentActive(false, $context->getContext(), payplacePaymentHandlerSU::class);
}
public function activate(ActivateContext $context): void
{
$this->setPaymentActive(true, $context->getContext(), payplacePaymentHandlerCC::class);
$this->setPaymentActive(true, $context->getContext(), payplacePaymentHandlerDD::class);
$this->setPaymentActive(true, $context->getContext(), payplacePaymentHandlerGP::class);
$this->setPaymentActive(true, $context->getContext(), payplacePaymentHandlerP2::class);
$this->setPaymentActive(true, $context->getContext(), payplacePaymentHandlerPD::class);
$this->setPaymentActive(true, $context->getContext(), payplacePaymentHandlerPP::class);
$this->setPaymentActive(true, $context->getContext(), payplacePaymentHandlerSU::class);
parent::activate($context);
}
public function deactivate(DeactivateContext $context): void
{
$this->setPaymentActive(false, $context->getContext(), payplacePaymentHandlerCC::class);
$this->setPaymentActive(false, $context->getContext(), payplacePaymentHandlerDD::class);
$this->setPaymentActive(false, $context->getContext(), payplacePaymentHandlerGP::class);
$this->setPaymentActive(false, $context->getContext(), payplacePaymentHandlerP2::class);
$this->setPaymentActive(false, $context->getContext(), payplacePaymentHandlerPD::class);
$this->setPaymentActive(false, $context->getContext(), payplacePaymentHandlerPP::class);
$this->setPaymentActive(false, $context->getContext(), payplacePaymentHandlerSU::class);
parent::deactivate($context);
}
private function addPaymentMethod(Context $context, string $paymentHandlerClass, int $position): void
{
if ($this->getPaymentMethodId($context, $paymentHandlerClass) ) {
return;
}
$pluginId = $this->container->get(PluginIdProvider::class)->getPluginIdByBaseClass(get_class($this), $context);
$paymentData = [
'handlerIdentifier' => $paymentHandlerClass,
'position' => $position,
'translations' => $paymentHandlerClass::getPaymentTitle(),
'pluginId' => $pluginId,
'afterOrderEnabled' => TRUE,
];
$this->container->get('payment_method.repository')->create([$paymentData], $context);
}
private function setPaymentActive(bool $active, Context $context, string $paymentHandlerClass): void
{
$paymentMethodId = $this->getPaymentMethodId($context, $paymentHandlerClass);
if (!$paymentMethodId) {
return;
}
$paymentMethod = [
'id' => $paymentMethodId,
'active' => $active,
];
$this->container->get('payment_method.repository')->update([$paymentMethod], $context);
}
private function getPaymentMethodId(Context $context, string $paymentHandlerClass): ?string
{
$paymentCriteria = (new Criteria())->addFilter(new EqualsFilter('handlerIdentifier', $paymentHandlerClass));
return $this->container->get('payment_method.repository')->searchIds($paymentCriteria, $context)->firstId();
}
}
?>