diff --git a/ecs.php b/ecs.php index 4815bcb..c26fa01 100644 --- a/ecs.php +++ b/ecs.php @@ -13,5 +13,7 @@ return ECSConfig::configure() __DIR__ . '/tests', ]) ->withRootFiles() - ->withRules([FinalClassFixer::class]) + ->withRules([ + FinalClassFixer::class, + ]) ->withSets([LubiSetList::ECS]); diff --git a/migrations/Version20250629160123.php b/migrations/Version20250629160123.php new file mode 100644 index 0000000..78542b7 --- /dev/null +++ b/migrations/Version20250629160123.php @@ -0,0 +1,56 @@ +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); + } +} diff --git a/migrations/Version20250629160639.php b/migrations/Version20250629160639.php new file mode 100644 index 0000000..b567250 --- /dev/null +++ b/migrations/Version20250629160639.php @@ -0,0 +1,53 @@ +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); + } +} diff --git a/src/Controller/OrderItemController.php b/src/Controller/OrderItemController.php index f52d202..1bbd616 100644 --- a/src/Controller/OrderItemController.php +++ b/src/Controller/OrderItemController.php @@ -75,19 +75,6 @@ final class OrderItemController extends AbstractController $form->handleRequest($request); 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); $entityManager->persist($orderItem); $entityManager->flush(); diff --git a/src/Entity/MenuItem.php b/src/Entity/MenuItem.php index 21beed9..bbea315 100644 --- a/src/Entity/MenuItem.php +++ b/src/Entity/MenuItem.php @@ -35,6 +35,11 @@ class MenuItem #[ORM\Column(length: 255)] private string|null $name = null; + #[ORM\Column(type: 'integer', options: [ + 'default' => 0, + ])] + private int $priceCents = 0; + public function __construct( #[ORM\Column(type: UlidType::NAME, unique: true)] #[ORM\CustomIdGenerator(class: UlidGenerator::class)] @@ -95,6 +100,11 @@ class MenuItem return $this->name; } + public function getPriceCents(): int + { + return $this->priceCents; + } + public function isDeleted(): bool { return $this->getDeletedAt() instanceof DateTimeImmutable; @@ -137,4 +147,10 @@ class MenuItem return $this; } + + public function setPriceCents(int $priceCents): self + { + $this->priceCents = $priceCents; + return $this; + } } diff --git a/src/Entity/OrderItem.php b/src/Entity/OrderItem.php index 5b2c045..b479a10 100644 --- a/src/Entity/OrderItem.php +++ b/src/Entity/OrderItem.php @@ -28,6 +28,12 @@ class OrderItem #[ORM\ManyToOne(inversedBy: 'orderItems')] private FoodOrder|null $foodOrder = null; + #[Groups('food_order:latest')] + #[ORM\Column(type: 'boolean', options: [ + 'default' => false, + ])] + private bool $isPaid = false; + #[Groups(['food_order:latest'])] #[ORM\JoinColumn(nullable: false)] #[ORM\ManyToOne] @@ -37,6 +43,12 @@ class OrderItem #[ORM\Column(length: 255)] private string|null $name = null; + #[Groups('food_order:latest')] + #[ORM\Column(type: 'integer', options: [ + 'default' => 0, + ])] + private int $priceCents = 0; + public function __construct( #[Groups(['food_order:latest'])] #[ORM\Column(type: UlidType::NAME, unique: true)] @@ -78,6 +90,16 @@ class OrderItem return $this->name; } + public function getPriceCents(): int + { + return $this->priceCents; + } + + public function isPaid(): bool + { + return $this->isPaid; + } + public function setCreatedBy(string $createdBy): static { $this->createdBy = $createdBy; @@ -99,6 +121,12 @@ class OrderItem return $this; } + public function setIsPaid(bool $isPaid): self + { + $this->isPaid = $isPaid; + return $this; + } + public function setMenuItem(MenuItem|null $menuItem): static { $this->menuItem = $menuItem; @@ -113,4 +141,10 @@ class OrderItem return $this; } + + public function setPriceCents(int $priceCents): self + { + $this->priceCents = $priceCents; + return $this; + } } diff --git a/src/EventListener/OrderItemPrePersist.php b/src/EventListener/OrderItemPrePersist.php new file mode 100644 index 0000000..26ae9aa --- /dev/null +++ b/src/EventListener/OrderItemPrePersist.php @@ -0,0 +1,35 @@ +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); + } +} diff --git a/tests/Feature/Controller/OrderItemControllerTest.php b/tests/Feature/Controller/OrderItemControllerTest.php index afbed56..d321553 100644 --- a/tests/Feature/Controller/OrderItemControllerTest.php +++ b/tests/Feature/Controller/OrderItemControllerTest.php @@ -182,7 +182,7 @@ describe(OrderItemController::class, function (): void { $this->assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId())); $this->assertSame(1, $this->repository->count([])); - $this->assertSame(3, $this->menuItemRepository->count([])); + $this->assertSame(2, $this->menuItemRepository->count([])); });