diff --git a/src/Controller/Index.php b/src/Controller/Index.php index 093259d..c0207b4 100644 --- a/src/Controller/Index.php +++ b/src/Controller/Index.php @@ -6,6 +6,7 @@ namespace App\Controller; use App\Repository\DrinkTypeRepository; use App\Service\DrinkType\FilterLowStockDrinks; +use App\Service\OrderService; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; @@ -15,13 +16,16 @@ final class Index extends AbstractController { public function __invoke( DrinkTypeRepository $drinkTypeRepository, - FilterLowStockDrinks $filterLowStockDrinks + FilterLowStockDrinks $filterLowStockDrinks, + OrderService $orderService, ): Response { $wanted = $drinkTypeRepository->findWanted(); $lowStock = $filterLowStockDrinks($wanted); + $orders = $orderService->getActiveOrders(); return $this->render('index.html.twig', [ 'drinkTypes' => $lowStock, 'lowStock' => $lowStock, + 'orders' => $orders, ]); } diff --git a/src/Controller/OrderController.php b/src/Controller/OrderController.php index df2e222..7561e67 100644 --- a/src/Controller/OrderController.php +++ b/src/Controller/OrderController.php @@ -7,6 +7,7 @@ namespace App\Controller; use App\Entity\Order; use App\Form\OrderForm; use App\Repository\OrderRepository; +use App\Service\DrinkType\CreateNewOrderItems; use Doctrine\ORM\EntityManagerInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; @@ -25,9 +26,10 @@ final class OrderController extends AbstractController } #[Route('/new', name: 'app_order_new', methods: ['GET', 'POST'])] - public function new(Request $request, EntityManagerInterface $entityManager): Response + public function new(Request $request, EntityManagerInterface $entityManager, CreateNewOrderItems $createNewOrderItems): Response { $order = new Order(); + $createNewOrderItems($order); $form = $this->createForm(OrderForm::class, $order); $form->handleRequest($request); @@ -35,7 +37,7 @@ final class OrderController extends AbstractController $entityManager->persist($order); $entityManager->flush(); - return $this->redirectToRoute('app_order_index', [], Response::HTTP_SEE_OTHER); + return $this->redirectToRoute('app_index', [], Response::HTTP_SEE_OTHER); } return $this->render('order/new.html.twig', [ diff --git a/src/Entity/Order.php b/src/Entity/Order.php index c0023e4..18e8880 100644 --- a/src/Entity/Order.php +++ b/src/Entity/Order.php @@ -44,6 +44,7 @@ class Order $this->createdAt = new DateTimeImmutable(); $this->updatedAt = new DateTimeImmutable(); $this->orderItems = new ArrayCollection(); + $this->status = OrderStatus::NEW; } public function getId(): null|int diff --git a/src/Form/OrderForm.php b/src/Form/OrderForm.php index aaf1283..8a80286 100644 --- a/src/Form/OrderForm.php +++ b/src/Form/OrderForm.php @@ -5,7 +5,10 @@ declare(strict_types=1); namespace App\Form; use App\Entity\Order; +use App\Enum\OrderStatus; use Symfony\Component\Form\AbstractType; +use Symfony\Component\Form\Extension\Core\Type\CollectionType; +use Symfony\Component\Form\Extension\Core\Type\EnumType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; @@ -14,7 +17,15 @@ class OrderForm extends AbstractType public function buildForm(FormBuilderInterface $builder, array $options): void { $builder - ->add('status') + ->add('status', EnumType::class, ['class' => OrderStatus::class]) + ->add('orderItems', CollectionType::class, [ + 'entry_type' => OrderItemType::class, + 'entry_options' => ['label' => false], + 'allow_add' => true, + 'allow_delete' => true, + 'by_reference' => false, + 'label' => 'Order Items', + ]) ; } diff --git a/src/Form/OrderItemType.php b/src/Form/OrderItemType.php new file mode 100644 index 0000000..ce8aecb --- /dev/null +++ b/src/Form/OrderItemType.php @@ -0,0 +1,46 @@ +add('drinkType', EntityType::class, [ + 'class' => DrinkType::class, + 'choice_label' => 'name', + 'placeholder' => 'Select a drink type', + 'required' => true, + 'constraints' => [ + new NotNull(message: 'Please select a drink type'), + ], + ]) + ->add('quantity', IntegerType::class, [ + 'required' => true, + 'constraints' => [ + new NotNull(message: 'Please enter a quantity'), + new GreaterThan(value: 0, message: 'Quantity must be greater than 0'), + ], + ]); + } + + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults([ + 'data_class' => OrderItem::class, + ]); + } +} diff --git a/templates/index.html.twig b/templates/index.html.twig index f47735b..3f45ee1 100644 --- a/templates/index.html.twig +++ b/templates/index.html.twig @@ -16,6 +16,9 @@
  • {{ drinkType.name }} ({{ drinkType.currentStock }} / {{ drinkType.wantedStock }})
  • {% endfor %} + {% if orders != [] %} + Create New Order + {% endif %} {% endif %} diff --git a/templates/order/_form.html.twig b/templates/order/_form.html.twig index bf20b98..d29165d 100644 --- a/templates/order/_form.html.twig +++ b/templates/order/_form.html.twig @@ -1,4 +1,114 @@ {{ form_start(form) }} - {{ form_widget(form) }} - + {{ form_row(form.status) }} + +

    Order Items

    + + + + + + + + + + {% for orderItemForm in form.orderItems %} + + + + + + {% endfor %} + +
    Drink TypeQuantityActions
    {{ form_widget(orderItemForm.drinkType) }}{{ form_widget(orderItemForm.quantity) }} + +
    + +
    + + {{ form_end(form) }} + + diff --git a/templates/order/index.html.twig b/templates/order/index.html.twig index ac33bfc..820a45c 100644 --- a/templates/order/index.html.twig +++ b/templates/order/index.html.twig @@ -21,7 +21,7 @@ {{ order.id }} {{ order.createdAt ? order.createdAt|date('Y-m-d H:i:s') : '' }} {{ order.updatedAt ? order.updatedAt|date('Y-m-d H:i:s') : '' }} - {{ order.status }} + {{ order.status.value }} show edit diff --git a/templates/order/show.html.twig b/templates/order/show.html.twig index 4926808..3545921 100644 --- a/templates/order/show.html.twig +++ b/templates/order/show.html.twig @@ -21,14 +21,36 @@ Status - {{ order.status }} + {{ order.status.value }} - back to list +

    Order Items

    + {% if order.orderItems|length > 0 %} + + + + + + + + + {% for item in order.orderItems %} + + + + + {% endfor %} + +
    Drink TypeQuantity
    {{ item.drinkType.name }}{{ item.quantity }}
    + {% else %} +

    No items in this order.

    + {% endif %} - edit + Back to list + + Edit {{ include('order/_delete_form.html.twig') }} {% endblock %}