Compare commits

...

2 commits

Author SHA1 Message Date
15f8db46a0
lol 2025-06-29 19:47:46 +02:00
2bdd5f9ac2
wip 2025-06-29 19:39:40 +02:00
8 changed files with 198 additions and 15 deletions

View file

@ -13,5 +13,7 @@ return ECSConfig::configure()
__DIR__ . '/tests', __DIR__ . '/tests',
]) ])
->withRootFiles() ->withRootFiles()
->withRules([FinalClassFixer::class]) ->withRules([
FinalClassFixer::class,
])
->withSets([LubiSetList::ECS]); ->withSets([LubiSetList::ECS]);

View file

@ -0,0 +1,56 @@
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20250629160123 extends AbstractMigration
{
public function getDescription(): string
{
return '';
}
public function up(Schema $schema): void
{
// this up() migration is auto-generated, please modify it to your needs
$this->addSql(<<<'SQL'
ALTER TABLE order_item ADD COLUMN is_paid BOOLEAN DEFAULT 0 NOT NULL
SQL);
$this->addSql(<<<'SQL'
ALTER TABLE order_item ADD COLUMN price_cents INTEGER DEFAULT 0 NOT NULL
SQL);
}
public function down(Schema $schema): void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql(<<<'SQL'
CREATE TEMPORARY TABLE __temp__order_item AS SELECT name, extras, created_by, id, food_order_id, menu_item_id FROM order_item
SQL);
$this->addSql(<<<'SQL'
DROP TABLE order_item
SQL);
$this->addSql(<<<'SQL'
CREATE TABLE order_item (name VARCHAR(255) NOT NULL, extras VARCHAR(255) DEFAULT NULL, created_by VARCHAR(255) DEFAULT 'nobody' NOT NULL, id BLOB NOT NULL, food_order_id BLOB DEFAULT NULL, menu_item_id BLOB NOT NULL, PRIMARY KEY(id), CONSTRAINT FK_52EA1F09A5D24A7A FOREIGN KEY (food_order_id) REFERENCES food_order (id) NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_52EA1F099AB44FE0 FOREIGN KEY (menu_item_id) REFERENCES menu_item (id) NOT DEFERRABLE INITIALLY IMMEDIATE)
SQL);
$this->addSql(<<<'SQL'
INSERT INTO order_item (name, extras, created_by, id, food_order_id, menu_item_id) SELECT name, extras, created_by, id, food_order_id, menu_item_id FROM __temp__order_item
SQL);
$this->addSql(<<<'SQL'
DROP TABLE __temp__order_item
SQL);
$this->addSql(<<<'SQL'
CREATE INDEX IDX_52EA1F09A5D24A7A ON order_item (food_order_id)
SQL);
$this->addSql(<<<'SQL'
CREATE INDEX IDX_52EA1F099AB44FE0 ON order_item (menu_item_id)
SQL);
}
}

View file

@ -0,0 +1,53 @@
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20250629160639 extends AbstractMigration
{
public function getDescription(): string
{
return '';
}
public function up(Schema $schema): void
{
// this up() migration is auto-generated, please modify it to your needs
$this->addSql(<<<'SQL'
ALTER TABLE menu_item ADD COLUMN price_cents INTEGER DEFAULT 0 NOT NULL
SQL);
}
public function down(Schema $schema): void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql(<<<'SQL'
CREATE TEMPORARY TABLE __temp__menu_item AS SELECT name, deleted_at, id, food_vendor_id, alias_of_id FROM menu_item
SQL);
$this->addSql(<<<'SQL'
DROP TABLE menu_item
SQL);
$this->addSql(<<<'SQL'
CREATE TABLE menu_item (name VARCHAR(255) NOT NULL, deleted_at DATETIME DEFAULT NULL, id BLOB NOT NULL, food_vendor_id BLOB NOT NULL, alias_of_id BLOB DEFAULT NULL, PRIMARY KEY(id), CONSTRAINT FK_D754D5506EF983E8 FOREIGN KEY (food_vendor_id) REFERENCES food_vendor (id) NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_D754D55061F0AFC5 FOREIGN KEY (alias_of_id) REFERENCES menu_item (id) NOT DEFERRABLE INITIALLY IMMEDIATE)
SQL);
$this->addSql(<<<'SQL'
INSERT INTO menu_item (name, deleted_at, id, food_vendor_id, alias_of_id) SELECT name, deleted_at, id, food_vendor_id, alias_of_id FROM __temp__menu_item
SQL);
$this->addSql(<<<'SQL'
DROP TABLE __temp__menu_item
SQL);
$this->addSql(<<<'SQL'
CREATE INDEX IDX_D754D5506EF983E8 ON menu_item (food_vendor_id)
SQL);
$this->addSql(<<<'SQL'
CREATE INDEX IDX_D754D55061F0AFC5 ON menu_item (alias_of_id)
SQL);
}
}

View file

@ -75,19 +75,6 @@ final class OrderItemController extends AbstractController
$form->handleRequest($request); $form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) { if ($form->isSubmitted() && $form->isValid()) {
$menuItem = $menuItemRepository->findOneBy([
'name' => $orderItem->getName(),
'foodVendor' => $foodOrder->getFoodVendor(),
]);
if ($menuItem === null) {
$menuItem = new MenuItem;
$menuItem->setName($orderItem->getName());
$menuItem->setFoodVendor($foodOrder->getFoodVendor());
$entityManager->persist($menuItem);
}
$orderItem->setMenuItem($menuItem);
$orderItem->setFoodOrder($foodOrder); $orderItem->setFoodOrder($foodOrder);
$entityManager->persist($orderItem); $entityManager->persist($orderItem);
$entityManager->flush(); $entityManager->flush();

View file

@ -35,6 +35,11 @@ class MenuItem
#[ORM\Column(length: 255)] #[ORM\Column(length: 255)]
private string|null $name = null; private string|null $name = null;
#[ORM\Column(type: 'integer', options: [
'default' => 0,
])]
private int $priceCents = 0;
public function __construct( public function __construct(
#[ORM\Column(type: UlidType::NAME, unique: true)] #[ORM\Column(type: UlidType::NAME, unique: true)]
#[ORM\CustomIdGenerator(class: UlidGenerator::class)] #[ORM\CustomIdGenerator(class: UlidGenerator::class)]
@ -95,6 +100,11 @@ class MenuItem
return $this->name; return $this->name;
} }
public function getPriceCents(): int
{
return $this->priceCents;
}
public function isDeleted(): bool public function isDeleted(): bool
{ {
return $this->getDeletedAt() instanceof DateTimeImmutable; return $this->getDeletedAt() instanceof DateTimeImmutable;
@ -137,4 +147,10 @@ class MenuItem
return $this; return $this;
} }
public function setPriceCents(int $priceCents): self
{
$this->priceCents = $priceCents;
return $this;
}
} }

View file

@ -28,6 +28,12 @@ class OrderItem
#[ORM\ManyToOne(inversedBy: 'orderItems')] #[ORM\ManyToOne(inversedBy: 'orderItems')]
private FoodOrder|null $foodOrder = null; private FoodOrder|null $foodOrder = null;
#[Groups('food_order:latest')]
#[ORM\Column(type: 'boolean', options: [
'default' => false,
])]
private bool $isPaid = false;
#[Groups(['food_order:latest'])] #[Groups(['food_order:latest'])]
#[ORM\JoinColumn(nullable: false)] #[ORM\JoinColumn(nullable: false)]
#[ORM\ManyToOne] #[ORM\ManyToOne]
@ -37,6 +43,12 @@ class OrderItem
#[ORM\Column(length: 255)] #[ORM\Column(length: 255)]
private string|null $name = null; private string|null $name = null;
#[Groups('food_order:latest')]
#[ORM\Column(type: 'integer', options: [
'default' => 0,
])]
private int $priceCents = 0;
public function __construct( public function __construct(
#[Groups(['food_order:latest'])] #[Groups(['food_order:latest'])]
#[ORM\Column(type: UlidType::NAME, unique: true)] #[ORM\Column(type: UlidType::NAME, unique: true)]
@ -78,6 +90,16 @@ class OrderItem
return $this->name; return $this->name;
} }
public function getPriceCents(): int
{
return $this->priceCents;
}
public function isPaid(): bool
{
return $this->isPaid;
}
public function setCreatedBy(string $createdBy): static public function setCreatedBy(string $createdBy): static
{ {
$this->createdBy = $createdBy; $this->createdBy = $createdBy;
@ -99,6 +121,12 @@ class OrderItem
return $this; return $this;
} }
public function setIsPaid(bool $isPaid): self
{
$this->isPaid = $isPaid;
return $this;
}
public function setMenuItem(MenuItem|null $menuItem): static public function setMenuItem(MenuItem|null $menuItem): static
{ {
$this->menuItem = $menuItem; $this->menuItem = $menuItem;
@ -113,4 +141,10 @@ class OrderItem
return $this; return $this;
} }
public function setPriceCents(int $priceCents): self
{
$this->priceCents = $priceCents;
return $this;
}
} }

View file

@ -0,0 +1,35 @@
<?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\AsEntityListener;
use Doctrine\ORM\Event\PrePersistEventArgs;
use Doctrine\ORM\Events;
#[AsEntityListener(event: Events::prePersist, method: 'prePersist', entity: OrderItem::class)]
final readonly class OrderItemPrePersist
{
public function __construct(
private MenuItemRepository $menuItemRepository,
) {}
public function prePersist(OrderItem $orderItem, PrePersistEventArgs $eventArgs): 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());
$eventArgs->getObjectManager()
->persist($menuItem);
}
$orderItem->setMenuItem($menuItem);
}
}

View file

@ -182,7 +182,7 @@ describe(OrderItemController::class, function (): void {
$this->assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId())); $this->assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId()));
$this->assertSame(1, $this->repository->count([])); $this->assertSame(1, $this->repository->count([]));
$this->assertSame(3, $this->menuItemRepository->count([])); $this->assertSame(2, $this->menuItemRepository->count([]));
}); });