diff --git a/src/Controller/DrinkTypeController.php b/src/Controller/DrinkTypeController.php index 5089800..5f8d8b3 100644 --- a/src/Controller/DrinkTypeController.php +++ b/src/Controller/DrinkTypeController.php @@ -28,7 +28,7 @@ final class DrinkTypeController extends AbstractController #[Route(path: '/new', name: 'app_drink_type_new', methods: ['GET', 'POST'])] public function new(Request $request, EntityManagerInterface $entityManager): Response { - $drinkType = new DrinkType('', ''); + $drinkType = new DrinkType(); $form = $this->createForm(DrinkTypeForm::class, $drinkType); $form->handleRequest($request); diff --git a/src/Controller/InventoryRecordController.php b/src/Controller/InventoryRecordController.php new file mode 100644 index 0000000..98ace52 --- /dev/null +++ b/src/Controller/InventoryRecordController.php @@ -0,0 +1,81 @@ +render('inventory_record/index.html.twig', [ + 'inventory_records' => $inventoryRecordRepository->findAll(), + ]); + } + + #[Route('/new', name: 'app_inventory_record_new', methods: ['GET', 'POST'])] + public function new(Request $request, EntityManagerInterface $entityManager): Response + { + $inventoryRecord = new InventoryRecord(); + $form = $this->createForm(InventoryRecordForm::class, $inventoryRecord); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $entityManager->persist($inventoryRecord); + $entityManager->flush(); + + return $this->redirectToRoute('app_inventory_record_index', [], Response::HTTP_SEE_OTHER); + } + + return $this->render('inventory_record/new.html.twig', [ + 'inventory_record' => $inventoryRecord, + 'form' => $form, + ]); + } + + #[Route('/{id}', name: 'app_inventory_record_show', methods: ['GET'])] + public function show(InventoryRecord $inventoryRecord): Response + { + return $this->render('inventory_record/show.html.twig', [ + 'inventory_record' => $inventoryRecord, + ]); + } + + #[Route('/{id}/edit', name: 'app_inventory_record_edit', methods: ['GET', 'POST'])] + public function edit(Request $request, InventoryRecord $inventoryRecord, EntityManagerInterface $entityManager): Response + { + $form = $this->createForm(InventoryRecordForm::class, $inventoryRecord); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $entityManager->flush(); + + return $this->redirectToRoute('app_inventory_record_index', [], Response::HTTP_SEE_OTHER); + } + + return $this->render('inventory_record/edit.html.twig', [ + 'inventory_record' => $inventoryRecord, + 'form' => $form, + ]); + } + + #[Route('/{id}', name: 'app_inventory_record_delete', methods: ['POST'])] + public function delete(Request $request, InventoryRecord $inventoryRecord, EntityManagerInterface $entityManager): Response + { + if ($this->isCsrfTokenValid('delete'.$inventoryRecord->getId(), $request->getPayload()->getString('_token'))) { + $entityManager->remove($inventoryRecord); + $entityManager->flush(); + } + + return $this->redirectToRoute('app_inventory_record_index', [], Response::HTTP_SEE_OTHER); + } +} diff --git a/src/Entity/DrinkType.php b/src/Entity/DrinkType.php index 194a768..640e448 100644 --- a/src/Entity/DrinkType.php +++ b/src/Entity/DrinkType.php @@ -31,18 +31,17 @@ class DrinkType #[ORM\OneToMany(mappedBy: 'drinkType', targetEntity: OrderItem::class)] private Collection $orderItems; + #[ORM\Column(type: 'string', length: 255, unique: true)] + private string $name; + #[ORM\Column(type: 'text', nullable: true)] + private null|string $description = null; + #[ORM\Column(type: 'integer')] + private int $desiredStock = 10; + public function __construct( - #[ORM\Column(type: 'string', length: 255, unique: true)] - private string $name, - #[ORM\Column(type: 'text', nullable: true)] - private null|string $description = null, - #[ORM\Column(type: 'integer')] - private int $desiredStock = 10, - null|DateTimeImmutable $createdAt = null, - null|DateTimeImmutable $updatedAt = null, ) { - $this->createdAt = $createdAt ?? new DateTimeImmutable(); - $this->updatedAt = $updatedAt ?? new DateTimeImmutable(); + $this->createdAt = new DateTimeImmutable(); + $this->updatedAt = new DateTimeImmutable(); $this->inventoryRecords = new ArrayCollection(); $this->orderItems = new ArrayCollection(); } diff --git a/src/Entity/InventoryRecord.php b/src/Entity/InventoryRecord.php index 46d355e..2ffe0f6 100644 --- a/src/Entity/InventoryRecord.php +++ b/src/Entity/InventoryRecord.php @@ -17,19 +17,28 @@ class InventoryRecord #[ORM\Column(type: 'integer')] private null|int $id = null; + #[ORM\ManyToOne(targetEntity: DrinkType::class, inversedBy: 'inventoryRecords')] + #[ORM\JoinColumn(name: 'drink_type_id', referencedColumnName: 'id', nullable: false)] + private DrinkType $drinkType; + + #[ORM\Column(type: 'integer')] + private int $quantity; + + #[ORM\Column(type: 'datetime_immutable')] + private DateTimeImmutable $timestamp; + + #[ORM\Column(type: 'datetime_immutable')] + private DateTimeImmutable $createdAt; + + #[ORM\Column(type: 'datetime_immutable')] + private DateTimeImmutable $updatedAt; + public function __construct( - #[ORM\ManyToOne(targetEntity: DrinkType::class, inversedBy: 'inventoryRecords')] - #[ORM\JoinColumn(name: 'drink_type_id', referencedColumnName: 'id', nullable: false)] - private DrinkType $drinkType, - #[ORM\Column(type: 'integer')] - private int $quantity, - #[ORM\Column(type: 'datetime_immutable')] - private DateTimeImmutable $timestamp = new DateTimeImmutable(), - #[ORM\Column(type: 'datetime_immutable')] - private DateTimeImmutable $createdAt = new DateTimeImmutable(), - #[ORM\Column(type: 'datetime_immutable')] - private DateTimeImmutable $updatedAt = new DateTimeImmutable(), - ) {} + ) { + $this->createdAt = new DateTimeImmutable(); + $this->updatedAt = new DateTimeImmutable(); + $this->timestamp = new DateTimeImmutable(); + } public function getId(): null|int { diff --git a/src/Entity/Order.php b/src/Entity/Order.php index 42459cc..f8682be 100644 --- a/src/Entity/Order.php +++ b/src/Entity/Order.php @@ -29,16 +29,15 @@ class Order #[ORM\OneToMany(mappedBy: 'order', targetEntity: OrderItem::class, cascade: ['persist', 'remove'])] private Collection $orderItems; + #[ORM\Column(nullable: false, enumType: OrderStatus::class, options: [ + 'default' => OrderStatus::NEW, + ])] + private OrderStatus $status = OrderStatus::NEW; + public function __construct( - #[ORM\Column(nullable: false, enumType: OrderStatus::class, options: [ - 'default' => OrderStatus::NEW, - ])] - private OrderStatus $status = OrderStatus::NEW, - null|DateTimeImmutable $createdAt = null, - null|DateTimeImmutable $updatedAt = null, ) { - $this->createdAt = $createdAt ?? new DateTimeImmutable(); - $this->updatedAt = $updatedAt ?? new DateTimeImmutable(); + $this->createdAt = new DateTimeImmutable(); + $this->updatedAt = new DateTimeImmutable(); $this->orderItems = new ArrayCollection(); } diff --git a/src/Entity/OrderItem.php b/src/Entity/OrderItem.php index 66a22c5..a8e735c 100644 --- a/src/Entity/OrderItem.php +++ b/src/Entity/OrderItem.php @@ -23,25 +23,21 @@ class OrderItem #[ORM\Column(type: 'datetime_immutable')] private DateTimeImmutable $updatedAt; - public function __construct( - #[ORM\ManyToOne(targetEntity: DrinkType::class, inversedBy: 'orderItems')] - #[ORM\JoinColumn(name: 'drink_type_id', referencedColumnName: 'id', nullable: false)] - private DrinkType $drinkType, - #[ORM\Column(type: 'integer')] - private int $quantity, - #[ORM\ManyToOne(targetEntity: Order::class, inversedBy: 'orderItems')] - #[ORM\JoinColumn(name: 'order_id', referencedColumnName: 'id', nullable: false)] - private null|Order $order = null, - null|DateTimeImmutable $createdAt = null, - null|DateTimeImmutable $updatedAt = null, - ) { - $this->createdAt = $createdAt ?? new DateTimeImmutable(); - $this->updatedAt = $updatedAt ?? new DateTimeImmutable(); + #[ORM\ManyToOne(targetEntity: DrinkType::class, inversedBy: 'orderItems')] + #[ORM\JoinColumn(name: 'drink_type_id', referencedColumnName: 'id', nullable: false)] + private DrinkType $drinkType; - // Establish bidirectional relationship - if ($this->order instanceof Order) { - $this->order->addOrderItem($this); - } + #[ORM\Column(type: 'integer')] + private int $quantity; + + #[ORM\ManyToOne(targetEntity: Order::class, inversedBy: 'orderItems')] + #[ORM\JoinColumn(name: 'order_id', referencedColumnName: 'id', nullable: false)] + private Order $order; + + public function __construct( + ) { + $this->createdAt = new DateTimeImmutable(); + $this->updatedAt = new DateTimeImmutable(); } public function getId(): null|int diff --git a/src/Entity/SystemConfig.php b/src/Entity/SystemConfig.php index 4013c56..78ed4a7 100644 --- a/src/Entity/SystemConfig.php +++ b/src/Entity/SystemConfig.php @@ -31,16 +31,16 @@ class SystemConfig #[ORM\Column(type: 'datetime_immutable')] private DateTimeImmutable $updatedAt; + #[ORM\Column(unique: true, enumType: SystemSettingKey::class)] + private SystemSettingKey $key; + + #[ORM\Column(type: 'text')] + private string $value; + public function __construct( - #[ORM\Column(unique: true, enumType: SystemSettingKey::class)] - private SystemSettingKey $key, - #[ORM\Column(type: 'text')] - private string $value, - null|DateTimeImmutable $createdAt = null, - null|DateTimeImmutable $updatedAt = null, ) { - $this->createdAt = $createdAt ?? new DateTimeImmutable(); - $this->updatedAt = $updatedAt ?? new DateTimeImmutable(); + $this->createdAt = new DateTimeImmutable(); + $this->updatedAt = new DateTimeImmutable(); } public function getId(): null|int diff --git a/src/Form/InventoryRecordForm.php b/src/Form/InventoryRecordForm.php new file mode 100644 index 0000000..e29e17b --- /dev/null +++ b/src/Form/InventoryRecordForm.php @@ -0,0 +1,40 @@ +add('quantity') + ->add('timestamp', null, [ + 'widget' => 'single_text', + ]) + ->add('createdAt', null, [ + 'widget' => 'single_text', + ]) + ->add('updatedAt', null, [ + 'widget' => 'single_text', + ]) + ->add('drinkType', EntityType::class, [ + 'class' => DrinkType::class, + 'choice_label' => 'id', + ]) + ; + } + + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults([ + 'data_class' => InventoryRecord::class, + ]); + } +} diff --git a/templates/inventory_record/_delete_form.html.twig b/templates/inventory_record/_delete_form.html.twig new file mode 100644 index 0000000..6c5c5fd --- /dev/null +++ b/templates/inventory_record/_delete_form.html.twig @@ -0,0 +1,4 @@ +
+ + +
diff --git a/templates/inventory_record/_form.html.twig b/templates/inventory_record/_form.html.twig new file mode 100644 index 0000000..bf20b98 --- /dev/null +++ b/templates/inventory_record/_form.html.twig @@ -0,0 +1,4 @@ +{{ form_start(form) }} + {{ form_widget(form) }} + +{{ form_end(form) }} diff --git a/templates/inventory_record/edit.html.twig b/templates/inventory_record/edit.html.twig new file mode 100644 index 0000000..f41339b --- /dev/null +++ b/templates/inventory_record/edit.html.twig @@ -0,0 +1,13 @@ +{% extends 'base.html.twig' %} + +{% block title %}Edit InventoryRecord{% endblock %} + +{% block body %} +

Edit InventoryRecord

+ + {{ include('inventory_record/_form.html.twig', {'button_label': 'Update'}) }} + + back to list + + {{ include('inventory_record/_delete_form.html.twig') }} +{% endblock %} diff --git a/templates/inventory_record/index.html.twig b/templates/inventory_record/index.html.twig new file mode 100644 index 0000000..7024ab2 --- /dev/null +++ b/templates/inventory_record/index.html.twig @@ -0,0 +1,41 @@ +{% extends 'base.html.twig' %} + +{% block title %}InventoryRecord index{% endblock %} + +{% block body %} +

InventoryRecord index

+ + + + + + + + + + + + + + {% for inventory_record in inventory_records %} + + + + + + + + + {% else %} + + + + {% endfor %} + +
IdQuantityTimestampCreatedAtUpdatedAtactions
{{ inventory_record.id }}{{ inventory_record.quantity }}{{ inventory_record.timestamp ? inventory_record.timestamp|date('Y-m-d H:i:s') : '' }}{{ inventory_record.createdAt ? inventory_record.createdAt|date('Y-m-d H:i:s') : '' }}{{ inventory_record.updatedAt ? inventory_record.updatedAt|date('Y-m-d H:i:s') : '' }} + show + edit +
no records found
+ + Create new +{% endblock %} diff --git a/templates/inventory_record/new.html.twig b/templates/inventory_record/new.html.twig new file mode 100644 index 0000000..3ae76a3 --- /dev/null +++ b/templates/inventory_record/new.html.twig @@ -0,0 +1,11 @@ +{% extends 'base.html.twig' %} + +{% block title %}New InventoryRecord{% endblock %} + +{% block body %} +

Create new InventoryRecord

+ + {{ include('inventory_record/_form.html.twig') }} + + back to list +{% endblock %} diff --git a/templates/inventory_record/show.html.twig b/templates/inventory_record/show.html.twig new file mode 100644 index 0000000..2caf816 --- /dev/null +++ b/templates/inventory_record/show.html.twig @@ -0,0 +1,38 @@ +{% extends 'base.html.twig' %} + +{% block title %}InventoryRecord{% endblock %} + +{% block body %} +

InventoryRecord

+ + + + + + + + + + + + + + + + + + + + + + + + +
Id{{ inventory_record.id }}
Quantity{{ inventory_record.quantity }}
Timestamp{{ inventory_record.timestamp ? inventory_record.timestamp|date('Y-m-d H:i:s') : '' }}
CreatedAt{{ inventory_record.createdAt ? inventory_record.createdAt|date('Y-m-d H:i:s') : '' }}
UpdatedAt{{ inventory_record.updatedAt ? inventory_record.updatedAt|date('Y-m-d H:i:s') : '' }}
+ + back to list + + edit + + {{ include('inventory_record/_delete_form.html.twig') }} +{% endblock %}