init
This commit is contained in:
commit
203233d2ed
71 changed files with 8213 additions and 0 deletions
0
src/Controller/.gitignore
vendored
Normal file
0
src/Controller/.gitignore
vendored
Normal file
167
src/Controller/FoodOrderController.php
Normal file
167
src/Controller/FoodOrderController.php
Normal file
|
@ -0,0 +1,167 @@
|
|||
<?php declare(strict_types=1);
|
||||
|
||||
namespace App\Controller;
|
||||
|
||||
use App\Entity\FoodOrder;
|
||||
use App\Entity\MenuItem;
|
||||
use App\Entity\OrderItem;
|
||||
use App\Form\FoodOrderType;
|
||||
use App\Repository\FoodOrderRepository;
|
||||
use Doctrine\ORM\EntityManagerInterface;
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Symfony\Component\Routing\Annotation\Route;
|
||||
|
||||
#[Route('/order')]
|
||||
class FoodOrderController extends AbstractController
|
||||
{
|
||||
final public const APP_FOOD_ORDER_SHOW = 'app_food_order_show';
|
||||
|
||||
final public const APP_FOODORDER_ADD_ITEM = 'app_foodorder_add_item';
|
||||
|
||||
#[Route('/', name: 'app_food_order_index', methods: ['GET'])]
|
||||
public function index(FoodOrderRepository $foodOrderRepository): Response
|
||||
{
|
||||
return $this->render(
|
||||
'food_order/index.html.twig',
|
||||
[
|
||||
'food_orders' => $foodOrderRepository->findAll(),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
#[Route(
|
||||
'/new',
|
||||
name: 'app_food_order_new',
|
||||
methods: [Request::METHOD_GET, Request::METHOD_POST],
|
||||
)]
|
||||
public function new(
|
||||
Request $request,
|
||||
EntityManagerInterface $entityManager,
|
||||
): Response {
|
||||
$foodOrder = new FoodOrder;
|
||||
$form = $this->createForm(FoodOrderType::class, $foodOrder);
|
||||
$form->handleRequest($request);
|
||||
|
||||
if ($form->isSubmitted() && $form->isValid()) {
|
||||
$entityManager->persist($foodOrder);
|
||||
$entityManager->flush();
|
||||
return $this->redirectToRoute(
|
||||
'app_food_order_index',
|
||||
[],
|
||||
Response::HTTP_SEE_OTHER,
|
||||
);
|
||||
}
|
||||
|
||||
return $this->render(
|
||||
'food_order/new.html.twig',
|
||||
[
|
||||
'food_order' => $foodOrder,
|
||||
'form' => $form,
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
#[Route('/{id}', name: self::APP_FOOD_ORDER_SHOW, methods: ['GET'])]
|
||||
public function show(FoodOrder $foodOrder): Response
|
||||
{
|
||||
$menuItems = $foodOrder->vendor->menuItems;
|
||||
return $this->render(
|
||||
'food_order/show.html.twig',
|
||||
[
|
||||
'food_order' => $foodOrder,
|
||||
'menu_items' => $menuItems,
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
#[Route(
|
||||
'/{foodOrder}/add/{menuItem}',
|
||||
name: self::APP_FOODORDER_ADD_ITEM,
|
||||
methods: [Request::METHOD_GET],
|
||||
)]
|
||||
public function add(
|
||||
FoodOrder $foodOrder,
|
||||
MenuItem $menuItem,
|
||||
EntityManagerInterface $entityManager,
|
||||
): Response {
|
||||
$orderItem = new OrderItem(foodOrder: $foodOrder, menuItem: $menuItem);
|
||||
$entityManager->persist($orderItem);
|
||||
$entityManager->flush();
|
||||
return $this->redirectToRoute(
|
||||
self::APP_FOOD_ORDER_SHOW,
|
||||
[
|
||||
'id' => $foodOrder->id,
|
||||
],
|
||||
Response::HTTP_SEE_OTHER,
|
||||
);
|
||||
}
|
||||
|
||||
#[Route(
|
||||
'/{foodOrder}/remove_item/{orderItem}',
|
||||
name: 'app_foodorder_remove_item',
|
||||
methods: [Request::METHOD_GET],
|
||||
)]
|
||||
public function remove(
|
||||
FoodOrder $foodOrder,
|
||||
OrderItem $orderItem,
|
||||
EntityManagerInterface $entityManager,
|
||||
): Response {
|
||||
$entityManager->remove($orderItem);
|
||||
$entityManager->flush();
|
||||
return $this->redirectToRoute(
|
||||
self::APP_FOOD_ORDER_SHOW,
|
||||
[
|
||||
'id' => $foodOrder->id,
|
||||
],
|
||||
Response::HTTP_SEE_OTHER,
|
||||
);
|
||||
}
|
||||
|
||||
#[Route('/{id}/edit', name: 'app_food_order_edit', methods: ['GET', 'POST'])]
|
||||
public function edit(
|
||||
Request $request,
|
||||
FoodOrder $foodOrder,
|
||||
EntityManagerInterface $entityManager,
|
||||
): Response {
|
||||
$form = $this->createForm(FoodOrderType::class, $foodOrder);
|
||||
$form->handleRequest($request);
|
||||
|
||||
if ($form->isSubmitted() && $form->isValid()) {
|
||||
$entityManager->flush();
|
||||
return $this->redirectToRoute(''[], Response::HTTP_SEE_OTHER);
|
||||
}
|
||||
|
||||
return $this->render(
|
||||
'food_order/edit.html.twig',
|
||||
[
|
||||
'food_order' => $foodOrder,
|
||||
'form' => $form,
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
#[Route('/{id}', name: 'app_food_order_delete', methods: ['POST'])]
|
||||
public function delete(
|
||||
Request $request,
|
||||
FoodOrder $foodOrder,
|
||||
EntityManagerInterface $entityManager,
|
||||
): Response {
|
||||
if (
|
||||
$this->isCsrfTokenValid(
|
||||
'delete' . $foodOrder->id ?? '',
|
||||
$request->request->get('_token'),
|
||||
)
|
||||
) {
|
||||
$entityManager->remove($foodOrder);
|
||||
$entityManager->flush();
|
||||
}
|
||||
|
||||
return $this->redirectToRoute(
|
||||
'app_food_order_index',
|
||||
[],
|
||||
Response::HTTP_SEE_OTHER,
|
||||
);
|
||||
}
|
||||
}
|
45
src/Controller/Start.php
Normal file
45
src/Controller/Start.php
Normal file
|
@ -0,0 +1,45 @@
|
|||
<?php declare(strict_types=1);
|
||||
|
||||
namespace App\Controller;
|
||||
|
||||
use App\Entity\FoodOrder;
|
||||
use App\Form\FoodOrderType;
|
||||
use App\Repository\FoodOrderRepository;
|
||||
use Doctrine\ORM\EntityManagerInterface;
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Symfony\Component\Routing\Attribute\Route;
|
||||
|
||||
final class Start extends AbstractController
|
||||
{
|
||||
#[Route('/')]
|
||||
public function index(
|
||||
FoodOrderRepository $foodOrderRepository,
|
||||
EntityManagerInterface $em,
|
||||
Request $request,
|
||||
): Response {
|
||||
$openOrders = $foodOrderRepository->findOpen();
|
||||
$order = new FoodOrder('');
|
||||
$form = $this->createForm(FoodOrderType::class, $order);
|
||||
$form->handleRequest($request);
|
||||
|
||||
if ($form->isSubmitted() && $form->isValid()) {
|
||||
$em->persist($order);
|
||||
$em->flush();
|
||||
return $this->redirectToRoute(
|
||||
'app_food_order_index',
|
||||
[],
|
||||
Response::HTTP_SEE_OTHER,
|
||||
);
|
||||
}
|
||||
|
||||
return $this->render(
|
||||
'start/index.html.twig',
|
||||
[
|
||||
'orders' => $openOrders,
|
||||
'form' => $form,
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
109
src/Controller/VendorController.php
Normal file
109
src/Controller/VendorController.php
Normal file
|
@ -0,0 +1,109 @@
|
|||
<?php declare(strict_types=1);
|
||||
|
||||
namespace App\Controller;
|
||||
|
||||
use App\Entity\Vendor;
|
||||
use App\Form\VendorType;
|
||||
use App\Repository\VendorRepository;
|
||||
use Doctrine\ORM\EntityManagerInterface;
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Symfony\Component\Routing\Annotation\Route;
|
||||
|
||||
#[Route('/vendor')]
|
||||
class VendorController extends AbstractController
|
||||
{
|
||||
#[Route('/', name: 'app_vendor_index', methods: ['GET'])]
|
||||
public function index(VendorRepository $vendorRepository): Response
|
||||
{
|
||||
return $this->render(
|
||||
'vendor/index.html.twig',
|
||||
[
|
||||
'vendors' => $vendorRepository->findAll(),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
#[Route('/new', name: 'app_vendor_new', methods: ['GET', 'POST'])]
|
||||
public function new(
|
||||
Request $request,
|
||||
EntityManagerInterface $entityManager,
|
||||
): Response {
|
||||
$vendor = new Vendor;
|
||||
$form = $this->createForm(VendorType::class, $vendor);
|
||||
$form->handleRequest($request);
|
||||
|
||||
if ($form->isSubmitted() && $form->isValid()) {
|
||||
$entityManager->persist($vendor);
|
||||
$entityManager->flush();
|
||||
return $this->redirectToRoute(
|
||||
'app_vendor_index',
|
||||
[],
|
||||
Response::HTTP_SEE_OTHER,
|
||||
);
|
||||
}
|
||||
|
||||
return $this->render(
|
||||
'vendor/new.html.twig',
|
||||
[
|
||||
'vendor' => $vendor,
|
||||
'form' => $form,
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
#[Route('/{id}', name: 'app_vendor_show', methods: ['GET'])]
|
||||
public function show(Vendor $vendor): Response
|
||||
{
|
||||
return $this->render('vendor/show.html.twig', [
|
||||
'vendor' => $vendor,
|
||||
]);
|
||||
}
|
||||
|
||||
#[Route('/{id}/edit', name: 'app_vendor_edit', methods: ['GET', 'POST'])]
|
||||
public function edit(
|
||||
Request $request,
|
||||
Vendor $vendor,
|
||||
EntityManagerInterface $entityManager,
|
||||
): Response {
|
||||
$form = $this->createForm(VendorType::class, $vendor);
|
||||
$form->handleRequest($request);
|
||||
|
||||
if ($form->isSubmitted() && $form->isValid()) {
|
||||
$entityManager->flush();
|
||||
return $this->redirectToRoute(
|
||||
'app_vendor_index',
|
||||
[],
|
||||
Response::HTTP_SEE_OTHER,
|
||||
);
|
||||
}
|
||||
|
||||
return $this->render(
|
||||
'vendor/edit.html.twig',
|
||||
[
|
||||
'vendor' => $vendor,
|
||||
'form' => $form,
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
#[Route('/{id}', name: 'app_vendor_delete', methods: ['POST'])]
|
||||
public function delete(
|
||||
Request $request,
|
||||
Vendor $vendor,
|
||||
EntityManagerInterface $entityManager,
|
||||
): Response {
|
||||
if (
|
||||
$this->isCsrfTokenValid(
|
||||
'delete' . $vendor->getId(),
|
||||
$request->request->get('_token'),
|
||||
)
|
||||
) {
|
||||
$entityManager->remove($vendor);
|
||||
$entityManager->flush();
|
||||
}
|
||||
|
||||
return $this->redirectToRoute('app_vendor_index', [], Response::HTTP_SEE_OTHER);
|
||||
}
|
||||
}
|
51
src/DataFixtures/AppFixtures.php
Normal file
51
src/DataFixtures/AppFixtures.php
Normal file
|
@ -0,0 +1,51 @@
|
|||
<?php declare(strict_types=1);
|
||||
|
||||
namespace App\DataFixtures;
|
||||
|
||||
use App\Entity\MenuItem;
|
||||
use App\Entity\MenuItemAlias;
|
||||
use App\Entity\Vendor;
|
||||
use Doctrine\Bundle\FixturesBundle\Fixture;
|
||||
use Doctrine\Persistence\ObjectManager;
|
||||
use Faker\Factory;
|
||||
use Faker\Generator;
|
||||
use Override;
|
||||
|
||||
use function random_int;
|
||||
use function range;
|
||||
|
||||
class AppFixtures extends Fixture
|
||||
{
|
||||
private readonly Generator $faker;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->faker = Factory::create();
|
||||
}
|
||||
|
||||
#[Override]
|
||||
public function load(ObjectManager $manager): void
|
||||
{
|
||||
foreach (range(0, 10) as $counter) {
|
||||
$vendor = new Vendor(name: $this->faker->company());
|
||||
$this->addMenuItemsToVendor($vendor, $manager);
|
||||
$manager->persist($vendor);
|
||||
}
|
||||
|
||||
$manager->flush();
|
||||
}
|
||||
|
||||
private function addMenuItemsToVendor(Vendor $vendor, ObjectManager $manager): void
|
||||
{
|
||||
foreach (range(0, 100) as $counter) {
|
||||
$aliasOne = MenuItemAlias::new($this->faker->lastName());
|
||||
$aliasTwo = MenuItemAlias::new($this->faker->lastName());
|
||||
$manager->persist($aliasOne);
|
||||
$manager->persist($aliasTwo);
|
||||
$item = MenuItem::new([$aliasOne, $aliasTwo]);
|
||||
$item->price = random_int(500, 2000);
|
||||
$manager->persist($item);
|
||||
$vendor->addMenuItem($item);
|
||||
}
|
||||
}
|
||||
}
|
0
src/Entity/.gitignore
vendored
Normal file
0
src/Entity/.gitignore
vendored
Normal file
85
src/Entity/FoodOrder.php
Normal file
85
src/Entity/FoodOrder.php
Normal file
|
@ -0,0 +1,85 @@
|
|||
<?php declare(strict_types=1);
|
||||
|
||||
namespace App\Entity;
|
||||
|
||||
use App\Repository\FoodOrderRepository;
|
||||
use DateTimeImmutable;
|
||||
use Doctrine\Common\Collections\ArrayCollection;
|
||||
use Doctrine\Common\Collections\Collection;
|
||||
use Doctrine\ORM\Mapping as ORM;
|
||||
use Symfony\Bridge\Doctrine\IdGenerator\UlidGenerator;
|
||||
use Symfony\Bridge\Doctrine\Types\UlidType;
|
||||
use Symfony\Component\Uid\Ulid;
|
||||
|
||||
#[ORM\Entity(repositoryClass: FoodOrderRepository::class)]
|
||||
class FoodOrder
|
||||
{
|
||||
public function __construct(
|
||||
#[ORM\Column]
|
||||
public string $startedByName,
|
||||
#[ORM\Id]
|
||||
#[ORM\GeneratedValue(strategy: 'CUSTOM')]
|
||||
#[ORM\Column(type: UlidType::NAME, unique: true)]
|
||||
#[ORM\CustomIdGenerator(class: UlidGenerator::class)]
|
||||
public Ulid $id = new Ulid,
|
||||
#[ORM\Column(nullable: true)]
|
||||
public DateTimeImmutable|null $closedAt = null,
|
||||
|
||||
/** @var Collection<int, OrderItem> $orderItems */
|
||||
#[ORM\OneToMany(
|
||||
mappedBy: 'foodOrder',
|
||||
targetEntity: OrderItem::class,
|
||||
orphanRemoval: true,
|
||||
)]
|
||||
public Collection $orderItems = new ArrayCollection,
|
||||
#[ORM\ManyToOne(inversedBy: 'foodOrders')]
|
||||
#[ORM\JoinColumn(nullable: false)]
|
||||
public Vendor|null $vendor = null,
|
||||
#[ORM\Column]
|
||||
public DateTimeImmutable $startedAt = new DateTimeImmutable,
|
||||
)
|
||||
{
|
||||
}
|
||||
|
||||
public function addOrderItem(OrderItem $orderItem): static
|
||||
{
|
||||
if (!$this->orderItems->contains($orderItem)) {
|
||||
$this->orderItems->add($orderItem);
|
||||
$orderItem->foodOrder = $this;
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function removeOrderItem(OrderItem $orderItem): static
|
||||
{
|
||||
// set the owning side to null (unless already changed)
|
||||
if (
|
||||
$this->orderItems->removeElement($orderItem)
|
||||
&& $orderItem->foodOrder === $this
|
||||
) {
|
||||
$orderItem->foodOrder = null;
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function groupedOrderItems(): array
|
||||
{
|
||||
return $this->orderItems->reduce(
|
||||
function (array $carry, OrderItem $item): array {
|
||||
$menuItemStringId = (string)$item->menuItem->id;
|
||||
if (isset($carry[$menuItemStringId])) {
|
||||
$carry[$menuItemStringId]['amount']++;
|
||||
} else {
|
||||
$carry[$menuItemStringId] = [
|
||||
'item' => $item,
|
||||
'amount' => 1,
|
||||
];
|
||||
}
|
||||
return $carry;
|
||||
},
|
||||
[]
|
||||
);
|
||||
}
|
||||
}
|
67
src/Entity/MenuItem.php
Normal file
67
src/Entity/MenuItem.php
Normal file
|
@ -0,0 +1,67 @@
|
|||
<?php declare(strict_types=1);
|
||||
|
||||
namespace App\Entity;
|
||||
|
||||
use App\Repository\MenuItemRepository;
|
||||
use Doctrine\Common\Collections\ArrayCollection;
|
||||
use Doctrine\Common\Collections\Collection;
|
||||
use Doctrine\ORM\Mapping as ORM;
|
||||
use Symfony\Bridge\Doctrine\IdGenerator\UlidGenerator;
|
||||
use Symfony\Bridge\Doctrine\Types\UlidType;
|
||||
use Symfony\Component\Uid\Ulid;
|
||||
|
||||
#[ORM\Entity(repositoryClass: MenuItemRepository::class)]
|
||||
class MenuItem
|
||||
{
|
||||
public function __construct(
|
||||
#[ORM\Id]
|
||||
#[ORM\GeneratedValue(strategy: 'CUSTOM')]
|
||||
#[ORM\Column(type: UlidType::NAME, unique: true)]
|
||||
#[ORM\CustomIdGenerator(class: UlidGenerator::class)]
|
||||
public Ulid $id = new Ulid,
|
||||
#[ORM\ManyToOne(inversedBy: 'menuItems')]
|
||||
#[ORM\JoinColumn(nullable: false)]
|
||||
public Vendor|null $vendor = null,
|
||||
#[ORM\Column(nullable: true)]
|
||||
public int|null $price = null,
|
||||
|
||||
/** @var Collection<int, MenuItemAlias> $aliases */
|
||||
#[ORM\OneToMany(
|
||||
mappedBy: 'menuItem',
|
||||
targetEntity: MenuItemAlias::class,
|
||||
orphanRemoval: true,
|
||||
)]
|
||||
public Collection $aliases = new ArrayCollection,
|
||||
) {}
|
||||
|
||||
public function addAlias(MenuItemAlias $alias): static
|
||||
{
|
||||
if (! $this->aliases->contains($alias)) {
|
||||
$this->aliases->add($alias);
|
||||
$alias->menuItem = $this;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public function removeAlias(MenuItemAlias $alias): static
|
||||
{
|
||||
// set the owning side to null (unless already changed)
|
||||
if ($this->aliases->removeElement($alias) && $alias->menuItem === $this) {
|
||||
$alias->menuItem = null;
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public static function new(array $aliases): self
|
||||
{
|
||||
$menuItem = new self;
|
||||
|
||||
foreach ($aliases as $alias) {
|
||||
$menuItem->addAlias($alias);
|
||||
}
|
||||
|
||||
return $menuItem;
|
||||
}
|
||||
}
|
33
src/Entity/MenuItemAlias.php
Normal file
33
src/Entity/MenuItemAlias.php
Normal file
|
@ -0,0 +1,33 @@
|
|||
<?php declare(strict_types=1);
|
||||
|
||||
namespace App\Entity;
|
||||
|
||||
use App\Repository\MenuItemAliasRepository;
|
||||
use Doctrine\ORM\Mapping as ORM;
|
||||
use Symfony\Bridge\Doctrine\IdGenerator\UlidGenerator;
|
||||
use Symfony\Bridge\Doctrine\Types\UlidType;
|
||||
use Symfony\Component\Uid\Ulid;
|
||||
|
||||
#[ORM\Entity(repositoryClass: MenuItemAliasRepository::class)]
|
||||
class MenuItemAlias
|
||||
{
|
||||
public function __construct(
|
||||
#[ORM\Id]
|
||||
#[ORM\GeneratedValue(strategy: 'CUSTOM')]
|
||||
#[ORM\Column(type: UlidType::NAME, unique: true)]
|
||||
#[ORM\CustomIdGenerator(class: UlidGenerator::class)]
|
||||
public Ulid $id = new Ulid,
|
||||
#[ORM\ManyToOne(inversedBy: 'aliases')]
|
||||
#[ORM\JoinColumn(nullable: false)]
|
||||
public MenuItem|null $menuItem = null,
|
||||
#[ORM\Column(length: 255)]
|
||||
public string|null $name = null,
|
||||
) {}
|
||||
|
||||
public static function new(string $name): self
|
||||
{
|
||||
$new = new self;
|
||||
$new->name = $name;
|
||||
return $new;
|
||||
}
|
||||
}
|
27
src/Entity/OrderItem.php
Normal file
27
src/Entity/OrderItem.php
Normal file
|
@ -0,0 +1,27 @@
|
|||
<?php declare(strict_types=1);
|
||||
|
||||
namespace App\Entity;
|
||||
|
||||
use App\Repository\OrderItemRepository;
|
||||
use Doctrine\ORM\Mapping as ORM;
|
||||
use Symfony\Bridge\Doctrine\IdGenerator\UlidGenerator;
|
||||
use Symfony\Bridge\Doctrine\Types\UlidType;
|
||||
use Symfony\Component\Uid\Ulid;
|
||||
|
||||
#[ORM\Entity(repositoryClass: OrderItemRepository::class)]
|
||||
class OrderItem
|
||||
{
|
||||
public function __construct(
|
||||
#[ORM\Id]
|
||||
#[ORM\GeneratedValue(strategy: 'CUSTOM')]
|
||||
#[ORM\Column(type: UlidType::NAME, unique: true)]
|
||||
#[ORM\CustomIdGenerator(class: UlidGenerator::class)]
|
||||
public Ulid $id = new Ulid,
|
||||
#[ORM\ManyToOne(inversedBy: 'orderItems')]
|
||||
#[ORM\JoinColumn(nullable: false)]
|
||||
public FoodOrder|null $foodOrder = null,
|
||||
#[ORM\ManyToOne]
|
||||
#[ORM\JoinColumn(nullable: false)]
|
||||
public MenuItem|null $menuItem = null,
|
||||
) {}
|
||||
}
|
78
src/Entity/Vendor.php
Normal file
78
src/Entity/Vendor.php
Normal file
|
@ -0,0 +1,78 @@
|
|||
<?php declare(strict_types=1);
|
||||
|
||||
namespace App\Entity;
|
||||
|
||||
use App\Repository\VendorRepository;
|
||||
use Doctrine\Common\Collections\ArrayCollection;
|
||||
use Doctrine\Common\Collections\Collection;
|
||||
use Doctrine\ORM\Mapping as ORM;
|
||||
use Symfony\Bridge\Doctrine\IdGenerator\UlidGenerator;
|
||||
use Symfony\Bridge\Doctrine\Types\UlidType;
|
||||
use Symfony\Component\Uid\Ulid;
|
||||
|
||||
#[ORM\Entity(repositoryClass: VendorRepository::class)]
|
||||
class Vendor
|
||||
{
|
||||
public function __construct(
|
||||
#[ORM\Column]
|
||||
public string $name,
|
||||
#[ORM\Id]
|
||||
#[ORM\GeneratedValue(strategy: 'CUSTOM')]
|
||||
#[ORM\Column(type: UlidType::NAME, unique: true)]
|
||||
#[ORM\CustomIdGenerator(class: UlidGenerator::class)]
|
||||
public Ulid $id = new Ulid,
|
||||
|
||||
/** @var Collection<int, MenuItem> $menuItems */
|
||||
#[ORM\OneToMany(mappedBy: 'vendor', targetEntity: MenuItem::class)]
|
||||
public Collection $menuItems = new ArrayCollection,
|
||||
|
||||
/** @var Collection<int, FoodOrder> $foodOrders */
|
||||
#[ORM\OneToMany(
|
||||
mappedBy: 'vendor',
|
||||
targetEntity: FoodOrder::class,
|
||||
orphanRemoval: true,
|
||||
)]
|
||||
private Collection $foodOrders = new ArrayCollection,
|
||||
) {}
|
||||
|
||||
public function addMenuItem(MenuItem $menuItem): static
|
||||
{
|
||||
if (! $this->menuItems->contains($menuItem)) {
|
||||
$this->menuItems->add($menuItem);
|
||||
$menuItem->vendor = $this;
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function removeMenuItem(MenuItem $menuItem): static
|
||||
{
|
||||
// set the owning side to null (unless already changed)
|
||||
if ($this->menuItems->removeElement($menuItem) && $menuItem->vendor === $this) {
|
||||
$menuItem->vendor = null;
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function addFoodOrder(FoodOrder $foodOrder): static
|
||||
{
|
||||
if (! $this->foodOrders->contains($foodOrder)) {
|
||||
$this->foodOrders->add($foodOrder);
|
||||
$foodOrder->vendor = $this;
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function removeFoodOrder(FoodOrder $foodOrder): static
|
||||
{
|
||||
if (
|
||||
$this->foodOrders->removeElement($foodOrder) && $foodOrder->vendor === $this
|
||||
) {
|
||||
$foodOrder->vendor = null;
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
39
src/Form/FoodOrderType.php
Normal file
39
src/Form/FoodOrderType.php
Normal file
|
@ -0,0 +1,39 @@
|
|||
<?php declare(strict_types=1);
|
||||
|
||||
namespace App\Form;
|
||||
|
||||
use App\Entity\FoodOrder;
|
||||
use App\Entity\Vendor;
|
||||
use Override;
|
||||
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
|
||||
use Symfony\Component\Form\AbstractType;
|
||||
use Symfony\Component\Form\FormBuilderInterface;
|
||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
class FoodOrderType extends AbstractType
|
||||
{
|
||||
#[Override]
|
||||
public function buildForm(FormBuilderInterface $builder, array $options): void
|
||||
{
|
||||
$builder
|
||||
->add('startedByName')
|
||||
->add(
|
||||
'vendor',
|
||||
EntityType::class,
|
||||
[
|
||||
'class' => Vendor::class,
|
||||
'choice_label' => 'name',
|
||||
'multiple' => false,
|
||||
],
|
||||
)
|
||||
->add('startedAt');
|
||||
}
|
||||
|
||||
#[Override]
|
||||
public function configureOptions(OptionsResolver $resolver): void
|
||||
{
|
||||
$resolver->setDefaults([
|
||||
'data_class' => FoodOrder::class,
|
||||
]);
|
||||
}
|
||||
}
|
26
src/Form/VendorType.php
Normal file
26
src/Form/VendorType.php
Normal file
|
@ -0,0 +1,26 @@
|
|||
<?php declare(strict_types=1);
|
||||
|
||||
namespace App\Form;
|
||||
|
||||
use App\Entity\Vendor;
|
||||
use Override;
|
||||
use Symfony\Component\Form\AbstractType;
|
||||
use Symfony\Component\Form\FormBuilderInterface;
|
||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
class VendorType extends AbstractType
|
||||
{
|
||||
#[Override]
|
||||
public function buildForm(FormBuilderInterface $builder, array $options): void
|
||||
{
|
||||
$builder->add('name');
|
||||
}
|
||||
|
||||
#[Override]
|
||||
public function configureOptions(OptionsResolver $resolver): void
|
||||
{
|
||||
$resolver->setDefaults([
|
||||
'data_class' => Vendor::class,
|
||||
]);
|
||||
}
|
||||
}
|
11
src/Kernel.php
Normal file
11
src/Kernel.php
Normal file
|
@ -0,0 +1,11 @@
|
|||
<?php declare(strict_types=1);
|
||||
|
||||
namespace App;
|
||||
|
||||
use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait;
|
||||
use Symfony\Component\HttpKernel\Kernel as BaseKernel;
|
||||
|
||||
class Kernel extends BaseKernel
|
||||
{
|
||||
use MicroKernelTrait;
|
||||
}
|
0
src/Repository/.gitignore
vendored
Normal file
0
src/Repository/.gitignore
vendored
Normal file
41
src/Repository/FoodOrderRepository.php
Normal file
41
src/Repository/FoodOrderRepository.php
Normal file
|
@ -0,0 +1,41 @@
|
|||
<?php declare(strict_types=1);
|
||||
|
||||
namespace App\Repository;
|
||||
|
||||
use App\Entity\FoodOrder;
|
||||
use DateTime;
|
||||
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
|
||||
use Doctrine\Common\Collections\ArrayCollection;
|
||||
use Doctrine\Common\Collections\Collection;
|
||||
use Doctrine\Persistence\ManagerRegistry;
|
||||
|
||||
/**
|
||||
* @extends ServiceEntityRepository<FoodOrder>
|
||||
*
|
||||
* @method FoodOrder|null find($id, $lockMode = null, $lockVersion = null)
|
||||
* @method FoodOrder|null findOneBy(array $criteria, array $orderBy = null)
|
||||
* @method FoodOrder[] findAll()
|
||||
* @method FoodOrder[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
|
||||
*/
|
||||
class FoodOrderRepository extends ServiceEntityRepository
|
||||
{
|
||||
public function __construct(ManagerRegistry $registry)
|
||||
{
|
||||
parent::__construct($registry, FoodOrder::class);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Collection<int, FoodOrder>
|
||||
*/
|
||||
public function findOpen(int $limit = 10): Collection
|
||||
{
|
||||
$yesterday = new DateTime;
|
||||
$yesterday->modify('-1 day');
|
||||
$queryBuilder = $this->createQueryBuilder('e');
|
||||
$queryBuilder
|
||||
->where('e.closedAt IS NULL')
|
||||
->andWhere($queryBuilder->expr()->gte('e.startedAt', ':yesterday'))
|
||||
->setParameter('yesterday', $yesterday);
|
||||
return new ArrayCollection($queryBuilder->getQuery()->getResult());
|
||||
}
|
||||
}
|
47
src/Repository/MenuItemAliasRepository.php
Normal file
47
src/Repository/MenuItemAliasRepository.php
Normal file
|
@ -0,0 +1,47 @@
|
|||
<?php declare(strict_types=1);
|
||||
|
||||
namespace App\Repository;
|
||||
|
||||
use App\Entity\MenuItemAlias;
|
||||
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
|
||||
use Doctrine\Persistence\ManagerRegistry;
|
||||
|
||||
/**
|
||||
* @extends ServiceEntityRepository<MenuItemAlias>
|
||||
*
|
||||
* @method MenuItemAlias|null find($id, $lockMode = null, $lockVersion = null)
|
||||
* @method MenuItemAlias|null findOneBy(array $criteria, array $orderBy = null)
|
||||
* @method MenuItemAlias[] findAll()
|
||||
* @method MenuItemAlias[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
|
||||
*/
|
||||
class MenuItemAliasRepository extends ServiceEntityRepository
|
||||
{
|
||||
public function __construct(ManagerRegistry $registry)
|
||||
{
|
||||
parent::__construct($registry, MenuItemAlias::class);
|
||||
}
|
||||
|
||||
// /**
|
||||
// * @return MenuItemAlias[] Returns an array of MenuItemAlias objects
|
||||
// */
|
||||
// public function findByExampleField($value): array
|
||||
// {
|
||||
// return $this->createQueryBuilder('m')
|
||||
// ->andWhere('m.exampleField = :val')
|
||||
// ->setParameter('val', $value)
|
||||
// ->orderBy('m.id', 'ASC')
|
||||
// ->setMaxResults(10)
|
||||
// ->getQuery()
|
||||
// ->getResult()
|
||||
// ;
|
||||
// }
|
||||
// public function findOneBySomeField($value): ?MenuItemAlias
|
||||
// {
|
||||
// return $this->createQueryBuilder('m')
|
||||
// ->andWhere('m.exampleField = :val')
|
||||
// ->setParameter('val', $value)
|
||||
// ->getQuery()
|
||||
// ->getOneOrNullResult()
|
||||
// ;
|
||||
// }
|
||||
}
|
47
src/Repository/MenuItemRepository.php
Normal file
47
src/Repository/MenuItemRepository.php
Normal file
|
@ -0,0 +1,47 @@
|
|||
<?php declare(strict_types=1);
|
||||
|
||||
namespace App\Repository;
|
||||
|
||||
use App\Entity\MenuItem;
|
||||
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
|
||||
use Doctrine\Persistence\ManagerRegistry;
|
||||
|
||||
/**
|
||||
* @extends ServiceEntityRepository<MenuItem>
|
||||
*
|
||||
* @method MenuItem|null find($id, $lockMode = null, $lockVersion = null)
|
||||
* @method MenuItem|null findOneBy(array $criteria, array $orderBy = null)
|
||||
* @method MenuItem[] findAll()
|
||||
* @method MenuItem[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
|
||||
*/
|
||||
class MenuItemRepository extends ServiceEntityRepository
|
||||
{
|
||||
public function __construct(ManagerRegistry $registry)
|
||||
{
|
||||
parent::__construct($registry, MenuItem::class);
|
||||
}
|
||||
|
||||
// /**
|
||||
// * @return MenuItem[] Returns an array of MenuItem objects
|
||||
// */
|
||||
// public function findByExampleField($value): array
|
||||
// {
|
||||
// return $this->createQueryBuilder('m')
|
||||
// ->andWhere('m.exampleField = :val')
|
||||
// ->setParameter('val', $value)
|
||||
// ->orderBy('m.id', 'ASC')
|
||||
// ->setMaxResults(10)
|
||||
// ->getQuery()
|
||||
// ->getResult()
|
||||
// ;
|
||||
// }
|
||||
// public function findOneBySomeField($value): ?MenuItem
|
||||
// {
|
||||
// return $this->createQueryBuilder('m')
|
||||
// ->andWhere('m.exampleField = :val')
|
||||
// ->setParameter('val', $value)
|
||||
// ->getQuery()
|
||||
// ->getOneOrNullResult()
|
||||
// ;
|
||||
// }
|
||||
}
|
47
src/Repository/OrderItemRepository.php
Normal file
47
src/Repository/OrderItemRepository.php
Normal file
|
@ -0,0 +1,47 @@
|
|||
<?php declare(strict_types=1);
|
||||
|
||||
namespace App\Repository;
|
||||
|
||||
use App\Entity\OrderItem;
|
||||
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
|
||||
use Doctrine\Persistence\ManagerRegistry;
|
||||
|
||||
/**
|
||||
* @extends ServiceEntityRepository<OrderItem>
|
||||
*
|
||||
* @method OrderItem|null find($id, $lockMode = null, $lockVersion = null)
|
||||
* @method OrderItem|null findOneBy(array $criteria, array $orderBy = null)
|
||||
* @method OrderItem[] findAll()
|
||||
* @method OrderItem[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
|
||||
*/
|
||||
class OrderItemRepository extends ServiceEntityRepository
|
||||
{
|
||||
public function __construct(ManagerRegistry $registry)
|
||||
{
|
||||
parent::__construct($registry, OrderItem::class);
|
||||
}
|
||||
|
||||
// /**
|
||||
// * @return OrderItem[] Returns an array of OrderItem objects
|
||||
// */
|
||||
// public function findByExampleField($value): array
|
||||
// {
|
||||
// return $this->createQueryBuilder('o')
|
||||
// ->andWhere('o.exampleField = :val')
|
||||
// ->setParameter('val', $value)
|
||||
// ->orderBy('o.id', 'ASC')
|
||||
// ->setMaxResults(10)
|
||||
// ->getQuery()
|
||||
// ->getResult()
|
||||
// ;
|
||||
// }
|
||||
// public function findOneBySomeField($value): ?OrderItem
|
||||
// {
|
||||
// return $this->createQueryBuilder('o')
|
||||
// ->andWhere('o.exampleField = :val')
|
||||
// ->setParameter('val', $value)
|
||||
// ->getQuery()
|
||||
// ->getOneOrNullResult()
|
||||
// ;
|
||||
// }
|
||||
}
|
47
src/Repository/VendorRepository.php
Normal file
47
src/Repository/VendorRepository.php
Normal file
|
@ -0,0 +1,47 @@
|
|||
<?php declare(strict_types=1);
|
||||
|
||||
namespace App\Repository;
|
||||
|
||||
use App\Entity\Vendor;
|
||||
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
|
||||
use Doctrine\Persistence\ManagerRegistry;
|
||||
|
||||
/**
|
||||
* @extends ServiceEntityRepository<Vendor>
|
||||
*
|
||||
* @method Vendor|null find($id, $lockMode = null, $lockVersion = null)
|
||||
* @method Vendor|null findOneBy(array $criteria, array $orderBy = null)
|
||||
* @method Vendor[] findAll()
|
||||
* @method Vendor[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
|
||||
*/
|
||||
class VendorRepository extends ServiceEntityRepository
|
||||
{
|
||||
public function __construct(ManagerRegistry $registry)
|
||||
{
|
||||
parent::__construct($registry, Vendor::class);
|
||||
}
|
||||
|
||||
// /**
|
||||
// * @return Vendor[] Returns an array of Vendor objects
|
||||
// */
|
||||
// public function findByExampleField($value): array
|
||||
// {
|
||||
// return $this->createQueryBuilder('v')
|
||||
// ->andWhere('v.exampleField = :val')
|
||||
// ->setParameter('val', $value)
|
||||
// ->orderBy('v.id', 'ASC')
|
||||
// ->setMaxResults(10)
|
||||
// ->getQuery()
|
||||
// ->getResult()
|
||||
// ;
|
||||
// }
|
||||
// public function findOneBySomeField($value): ?Vendor
|
||||
// {
|
||||
// return $this->createQueryBuilder('v')
|
||||
// ->andWhere('v.exampleField = :val')
|
||||
// ->setParameter('val', $value)
|
||||
// ->getQuery()
|
||||
// ->getOneOrNullResult()
|
||||
// ;
|
||||
// }
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue