<?php
declare(strict_types=1);
namespace Rhiem\RhiemRentalProducts\Subscriber;
use League\Period\Exception;
use Rhiem\RhiemRentalProducts\Components\RentalProduct\DAL\RentalCheapestPriceContainer;
use Rhiem\RhiemRentalProducts\Components\RentalProduct\RentalProductModeInterface;
use Rhiem\RhiemRentalProducts\Components\RentalTime\RentalTime;
use Rhiem\RhiemRentalProducts\Entities\RentalProduct\RentalProductEntity;
use Shopware\Core\Checkout\Order\Aggregate\OrderLineItem\OrderLineItemEntity;
use Shopware\Core\Content\Product\DataAbstractionLayer\CheapestPrice\CheapestPriceContainer;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityLoadedEvent;
use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class RentalProduct implements EventSubscriberInterface, RentalProductModeInterface
{
/**
* @var EntityRepositoryInterface
*/
private $rentalProductRepository;
public function __construct(EntityRepositoryInterface $rentalProductRepository)
{
$this->rentalProductRepository = $rentalProductRepository;
}
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
'rental_product.written' => 'onRentalProductWritten',
'order_line_item.loaded' => 'onOrderLineItemLoaded',
'rental_product.loaded' => 'loaded',
];
}
/**
* @throws Exception
*/
public function onRentalProductWritten(EntityWrittenEvent $event): void
{
$writeResults = $event->getWriteResults();
foreach ($writeResults as $writeResult) {
$payload = $writeResult->getPayload();
$rentalTimes = [];
if (!empty($payload['blockedPeriods'])) {
foreach ($payload['blockedPeriods'] as $blockedPeriod) {
$rentalTime = RentalTime::createRentalTime(
$payload['productId'],
$blockedPeriod['blocked_quantity'],
$blockedPeriod['rhiem_rental_products_rent_start'],
$blockedPeriod['rhiem_rental_products_rent_end'],
'blocked',
self::DAYRENT,
'UTC'
);
$rentalTimes[] = serialize($rentalTime);
}
$this->rentalProductRepository->upsert(
[
[
'id' => $payload['id'],
'rentalTimes' => $rentalTimes,
],
],
$event->getContext()
);
}
}
}
public function onOrderLineItemLoaded(EntityLoadedEvent $event): void
{
/** @var OrderLineItemEntity $entity */
foreach ($event->getEntities() as $entity) {
$payload = $entity->getPayload();
if (!empty($payload['rentalProduct']) && !empty($payload['rentalProduct']['rentalTime'])) {
$rentalTime = unserialize($payload['rentalProduct']['rentalTime']);
$payload['rentalProduct']['rentalTime'] = $rentalTime;
$entity->setPayload($payload);
}
}
}
public function loaded(EntityLoadedEvent $event): void
{
/** @var RentalProductEntity $rentalProduct */
foreach ($event->getEntities() as $rentalProduct) {
$price = $rentalProduct->getCheapestPrice();
if ($price instanceof CheapestPriceContainer) {
$rentalPrice = new RentalCheapestPriceContainer($price);
$resolved = $rentalPrice->resolve($event->getContext());
$rentalProduct->setCheapestPriceContainer($price);
$rentalProduct->setCheapestPrice($resolved);
}
}
}
}