<?php declare(strict_types=1);
/**
* valantic CEC Deutschland GmbH
* Copyright (c) 2022.
*
* All rights reserved.
*
* @see https://www.valantic.com/
*
* @author andrei
* Date: 21.11.2022 14:24
*/
namespace Valantic\Bundle\PentagastBundle\Subscriber;
use Shopware\Core\Checkout\Order\Aggregate\OrderLineItem\OrderLineItemEntity;
use Shopware\Core\Checkout\Order\OrderEvents;
use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Valantic\Bundle\PentagastBundle\Struct\PurchasePrice;
class OrderLineSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
OrderEvents::ORDER_LINE_ITEM_LOADED_EVENT => ['onOrderLineItemLoaded', -250],
];
}
public function onOrderLineItemLoaded(EntityLoadedEvent $event): void
{
$eventEntities = $event->getEntities();
/** @var OrderLineItemEntity $orderLineItem */
foreach ($eventEntities as $orderLineItem) {
$purchasePriceValue = 0;
$targetOrderProductLine = $orderLineItem;
if ($orderLineItem->getType() === 'customized-products') {
$filterResult = array_filter($eventEntities, function (OrderLineItemEntity $lineItem) use ($orderLineItem) {
return $lineItem->getType() === 'product' && $lineItem->getParentId() === $orderLineItem->getId();
});
if ($filterResult) {
$targetOrderProductLine = array_values($filterResult)[0];
}
}
if ($targetOrderProductLine) {
$targetPayload = $targetOrderProductLine->getPayload();
$purchasePrices = json_decode($targetPayload['purchasePrices'] ?? '', true);
if ($purchasePrices) {
$purchasePriceValue = $purchasePrices['calculatedPrice'] ?? 0;
}
}
$purchasePrice = new PurchasePrice();
$purchasePrice->setValue($purchasePriceValue);
/** @psalm-suppress DeprecatedMethod */
$orderLineItem->addExtension('purchasePrice', $purchasePrice);
}
}
}