Files
2025-08-02 16:30:27 +02:00

124 lines
3.8 KiB
PHP

<?php
declare(strict_types=1);
namespace External\HannahBundle\SAP\EventSubscriber;
use External\HannahBundle\SAP\Util\PricingUtil;
use External\HannahBundle\SAP\Util\SAPClient;
use KupShop\KupShopBundle\Util\Logging\SentryLogger;
use KupShop\KupShopBundle\Util\System\AsyncQueue;
use KupShop\OrderingBundle\Event\OrderEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class OrderSubscriber implements EventSubscriberInterface
{
public function __construct(
private AsyncQueue $asyncQueue,
private SAPClient $sapClient,
private PricingUtil $pricingUtil,
private SentryLogger $sentryLogger,
) {
}
public static function getSubscribedEvents()
{
return [
OrderEvent::ORDER_FINISHED => [
['sendFinalPricing', 200],
],
OrderEvent::ORDER_COMPLETE => [
['applyPaymentCoupons', 200],
['addInfoAboutDiscountsToOrder', 200],
['clearCaches', 200],
],
];
}
public function sendFinalPricing(OrderEvent $event): void
{
$this->asyncQueue->addHandler(function () use ($event) {
// pokud jsem na locale, tak neprovadim ceneni typy ORDER, protoze se tam provede uplatneni poukazek
// a to na locale uplatnovat nechci
$pricingType = isLocalDevelopment() ? PricingUtil::ORDER_TYPE_PRICING : PricingUtil::ORDER_TYPE_ORDER;
// provedu finalni ceneni typu ORDER, aby se uplatnily poukazy
$data = $this->pricingUtil->getSAPPricedOrder(
$event->getOrder()->getPurchaseState(),
$pricingType,
$event->getOrder()->order_no
);
if (!$data) {
return;
}
// vysledna data si ulozim do custom dat
$event->getOrder()->setData('sapPricingData', $data);
}, 'Finální cenění objednávky');
}
public function applyPaymentCoupons(OrderEvent $event): void
{
if (isLocalDevelopment()) {
return;
}
$data = [];
if ($event->getCart()) {
$data = $event->getCart()->getData('sap');
}
foreach ($data['paymentCoupons'] ?? [] as $coupon) {
try {
$this->sapClient->couponChangeState($coupon);
} catch (\Throwable $e) {
if (isDevelopment()) {
throw $e;
}
$this->sentryLogger->captureException($e);
}
}
}
public function addInfoAboutDiscountsToOrder(OrderEvent $event): void
{
sqlGetConnection()->transactional(function () use ($event) {
$order = $event->getOrder();
$data = [];
if ($event->getCart()) {
$data = $event->getCart()->getData('sap');
}
$usedDiscountItems = [];
foreach ($data['discounts'] ?? [] as $promoId => $discount) {
$order->logHistory(
sprintf('V objednávce byla použita sleva "%s"', $discount['name'])
);
$usedDiscountItems[] = $promoId;
}
if (!empty($usedDiscountItems)) {
try {
sqlQueryBuilder()
->insert('order_discounts_orders')
->directValues(
[
'id_order' => $order->id,
'id_order_discount' => PricingUtil::getDefaultDiscountId(),
]
)->execute();
} catch (\Throwable $e) {
}
}
});
}
public function clearCaches(OrderEvent $event): void
{
$this->pricingUtil->clearSAPPricingResult();
}
}