futtern/src/EventListener/OrderItemPreFlush.php
lubiana 64f5341371
All checks were successful
/ ls (pull_request) Successful in 1m37s
/ ls (push) Successful in 1m37s
add price feature
2025-06-29 23:18:23 +02:00

52 lines
1.9 KiB
PHP

<?php declare(strict_types=1);
namespace App\EventListener;
use App\Entity\MenuItem;
use App\Entity\OrderItem;
use App\Repository\MenuItemRepository;
use Doctrine\Bundle\DoctrineBundle\Attribute\AsDoctrineListener;
use Doctrine\ORM\Event\PreFlushEventArgs;
use Doctrine\ORM\Events;
use Doctrine\Persistence\ObjectManager;
#[AsDoctrineListener(event: Events::preFlush)]
final readonly class OrderItemPreFlush
{
public function __construct(
private MenuItemRepository $menuItemRepository,
) {}
public function preFlush(PreFlushEventArgs $eventArgs): void
{
foreach (($eventArgs->getObjectManager()->getUnitOfWork()->getIdentityMap()[OrderItem::class] ?? []) as $orderItem) {
$this->checkOrderItem($orderItem, $eventArgs->getObjectManager());
}
}
private function checkOrderItem(OrderItem $orderItem, ObjectManager $objectManager): void
{
$menuItem = $this->menuItemRepository->findOneBy([
'name' => $orderItem->getName(),
'foodVendor' => $orderItem->getFoodOrder()
->getFoodVendor(),
]);
if ($menuItem === null) {
$menuItem = new MenuItem;
$menuItem->setName($orderItem->getName());
$menuItem->setFoodVendor($orderItem->getFoodOrder()->getFoodVendor());
$objectManager->persist($menuItem);
}
if ($menuItem->getAliasOf() !== null) {
$menuItem = $menuItem->getAliasOf();
$orderItem->setName($menuItem->getName());
}
$orderItem->setMenuItem($menuItem);
if ($orderItem->getPriceCents() === 0) {
$orderItem->setPriceCents($menuItem->getPriceCents());
} elseif ($orderItem->getPriceCents() !== $menuItem->getPriceCents()) {
$menuItem->setPriceCents($orderItem->getPriceCents());
$objectManager->persist($menuItem);
}
}
}