<?php
declare(strict_types=1);
namespace Rhiem\RhiemRentalProducts\Subscriber;
use Rhiem\RhiemRentalProducts\Components\RentalTime\RentalTime;
use Shopware\Core\Checkout\Cart\Event\CheckoutOrderPlacedEvent;
use Shopware\Core\Checkout\Cart\Order\CartConvertedEvent;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class FrontendCheckout implements EventSubscriberInterface
{
/**
* @var EntityRepositoryInterface
*/
private $orderLineItemRepository;
public function __construct(EntityRepositoryInterface $orderLineItemRepo)
{
$this->orderLineItemRepository = $orderLineItemRepo;
}
/**
* {@inheritDoc}
*/
public static function getSubscribedEvents()
{
return [
CheckoutOrderPlacedEvent::class => 'onOrderPlaced',
CartConvertedEvent::class => 'onConvertToOrder',
];
}
public function onOrderPlaced(CheckoutOrderPlacedEvent $event): void
{
$orderLineItems = $event->getOrder()->getLineItems()->getElements();
foreach ($orderLineItems as $orderLineItem) {
if (isset($orderLineItem->getPayload()['rentalProduct'])) {
$rentalProductPayload = $orderLineItem->getPayload()['rentalProduct'];
/** @var RentalTime $rentalTime */
$rentalTime = $rentalProductPayload['rentalTime'];
$this->orderLineItemRepository->update(
[
[
'id' => $orderLineItem->getId(),
'productId' => $orderLineItem->getReferencedId(),
'customFields' => [
'rhiem_rental_products_rent_start' => $rentalTime->getStartDate(),
'rhiem_rental_products_rent_end' => $rentalTime->getEndDate(),
],
],
],
$event->getContext()
);
}
}
}
public function onConvertToOrder(CartConvertedEvent $event): void
{
$convertedCart = $event->getConvertedCart();
$lineItems = $convertedCart['lineItems'];
$orderHasRentalProduct = false;
foreach ($lineItems as &$lineItem) {
if (!empty($lineItem['payload']['rentalProduct'])) {
$orderHasRentalProduct = true;
$lineItem['payload']['rentalProduct']['rentalTime'] = serialize(
$lineItem['payload']['rentalProduct']['rentalTime']
);
}
}
if ($orderHasRentalProduct) {
$convertedCart['lineItems'] = $lineItems;
$event->setConvertedCart($convertedCart);
}
}
}