<?php declare(strict_types=1);
namespace DigaMinimumOrderValue\Subscriber;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Shopware\Core\System\SystemConfig\SystemConfigService;
use Shopware\Storefront\Event\StorefrontRenderEvent;
use Psr\Log\LoggerInterface;
use Shopware\Core\Framework\Struct\ArrayEntity;
use Shopware\Storefront\Page\Checkout\Cart\CheckoutCartPage;
use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPage;
use Shopware\Storefront\Page\Checkout\Register\CheckoutRegisterPage;
use Shopware\Storefront\Page\Checkout\Offcanvas\OffcanvasCartPage;
use Shopware\Storefront\Page\Page;
class CheckoutPageSubscriber implements EventSubscriberInterface {
/**
* @var SystemConfigService
*/
private $configService;
/**
* @var LoggerInterface
*/
private $logger;
public function __construct(SystemConfigService $systemConfigService, LoggerInterface $logger) {
$this->configService = $systemConfigService;
$this->logger = $logger;
}
public static function getSubscribedEvents(): array {
return [
StorefrontRenderEvent::class => 'onStorfrontRender'
];
}
/**
*
* @param StorefrontRenderEvent $event
* @return void
*/
public function onStorfrontRender(StorefrontRenderEvent $event): void {
try {
if(!isset($event->getParameters()['page'])) {
return;
}
/** @var Page $currentPage */
$currentPage = $event->getParameters()['page'];
if (($currentPage instanceof CheckoutCartPage) or
($currentPage instanceof OffcanvasCartPage) or
($currentPage instanceof CheckoutConfirmPage) or
($currentPage instanceof CheckoutRegisterPage)){
$this->onCheckoutPageLoaded($event);
}
}catch (\Exception $e) {
$this->logger->log('error',"DigaCheckoutPageSubscriber: error : ".$e);
}
}
/**
*
* @param StorefrontRenderEvent $event
* @return void
*/
public function onCheckoutPageLoaded(StorefrontRenderEvent $event): void {
try {
//$this->logger->debug("DigaCheckoutPageSubscriber startet");
// first check if plugin active and has config on saleschannel
$salesChannelId= $event->getSalesChannelContext()->getSalesChannelId();
$pluginActive = $this->configService->get('DigaMinimumOrderValue.config.pluginactive', $salesChannelId);
if($pluginActive){
$excluded = false;
$disableButton = false;
$priceSource = $this->configService->get('DigaMinimumOrderValue.config.digaminordertotal', $salesChannelId);
$minOrderValPrice = $event->getParameters()['page']->getCart()->getPrice()->getPositionPrice();
if ($priceSource == "netPrice" ){
$minOrderValPrice = $event->getParameters()['page']->getCart()->getPrice()->getNetPrice();
}elseif($priceSource == "totalPrice"){
$minOrderValPrice = $event->getParameters()['page']->getCart()->getPrice()->getTotalPrice();
}
if ( ($this->configService->get('DigaMinimumOrderValue.config.digaminorderval', $salesChannelId)) && ($minOrderValPrice !== null) ){
//exclude by group
$currentCustomerGroupId = $event->getSalesChannelContext()->getCurrentCustomerGroup()->getId();
/** @var mixed $groupsFromConfig */
$groupsFromConfig = $this->configService->get('DigaMinimumOrderValue.config.excludegroupfromminorderval', $salesChannelId);
if ($groupsFromConfig != null && is_array($groupsFromConfig)){
if (in_array($currentCustomerGroupId, $groupsFromConfig)) {
$excluded = true;
}
}
//exclude by rule
$ruleIds = $event->getSalesChannelContext()->getRuleIds();
$ruleIdFromConfig = $this->configService->get('DigaMinimumOrderValue.config.excludebyrulefromminorderval', $salesChannelId);
if (in_array($ruleIdFromConfig, $ruleIds)) {
$excluded = true;
}
//show info: ?add cart error
if( !$excluded){
$minValueFromConfig=$this->configService->get('DigaMinimumOrderValue.config.digaminorderval', $salesChannelId);
if( ($minValueFromConfig > $minOrderValPrice) && ($minOrderValPrice !== null) ){
$disableButton= true;
}
}
}
$digaMinValueData=["disableButton"=>$disableButton];
//add the array to the context as an extension
$event->getContext()->addExtension('digaMinValueData', new ArrayEntity($digaMinValueData));
}
}catch (\Exception $e) {
$this->logger->log('error',"DigaCheckoutPageSubscriber: error : ".$e);
}
}
}