<?php
namespace App\Controller\Manager;
use App\Entity\PaperStock;
use App\Entity\ProviderOrder;
use App\Services\StockManager;
use App\Services\ArchiveManager;
use App\Entity\ProviderOrderItem;
use App\Form\Manager\ProviderOrderType;
use Doctrine\ORM\EntityManagerInterface;
use App\Repository\ProviderOrderRepository;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use App\Form\Manager\ProviderOrderDeliveryType;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
#[Route('/manager/provider-order', name: 'provider_order_')]
class ProviderOrderController extends AbstractController
{
#[Route('/', name: 'index', methods: ['GET'])]
public function index(ProviderOrderRepository $providerOrderRepository): Response
{
$pagination = $providerOrderRepository->findPaginated();
return $this->render('manager/provider_order/index.html.twig', [
'pagination' => $pagination,
'provider_orders' => $pagination->getItems(),
]);
}
#[Route('/new', name: 'new', methods: ['GET', 'POST'])]
public function new(Request $request, EntityManagerInterface $em): Response
{
$providerOrder = new ProviderOrder();
$form = $this->createForm(ProviderOrderType::class, $providerOrder);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em->persist($providerOrder);
$em->flush();
return $this->redirectToRoute('provider_order_edit', [
'id' => $providerOrder->getId(),
], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('manager/provider_order/new.html.twig', [
'provider_order' => $providerOrder,
'form' => $form,
]);
}
#[Route('/{id}', name: 'show', methods: ['GET', 'POST'])]
public function show(Request $request, ProviderOrder $providerOrder, StockManager $stockManager, EntityManagerInterface $em): Response
{
$form = $this->createForm(ProviderOrderDeliveryType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$space = $form->get('space')->getData();
foreach ($providerOrder->getProviderOrderItems() as $providerOrderItem) {
foreach($providerOrderItem->getPaperProducts() as $paperProduct) {
if($paperProduct->getDelivered() || $paperProduct->getDismissed()) continue;
$paperProduct->setSpace($space);
$paperProduct->deliver();
$stockManager->addStock($paperProduct, PaperStock::TYPE_PROVIDER);
}
}
$providerOrder->updateProviderOrderDelivery();
$providerOrder->updateProviderOrderDifference();
$em->flush();
return $this->redirectToRoute('provider_order_show', [
'id' => $providerOrder->getId(),
], Response::HTTP_SEE_OTHER);
}
$hasProducts = false;
foreach ($providerOrder->getProviderOrderItems() as $providerOrderItem) {
foreach ($providerOrderItem->getPaperProducts() as $paperProduct) {
$hasProducts = true;
break;
}
if ($hasProducts) break;
}
return $this->render('manager/provider_order/show.html.twig', [
'provider_order' => $providerOrder,
'form' => $form->createView(),
'has_products' => $hasProducts
]);
}
#[Route('/{id}/edit', name: 'edit', methods: ['GET', 'POST'])]
public function edit(Request $request, ProviderOrder $providerOrder, EntityManagerInterface $em): Response
{
$isAjax = $request->isXmlHttpRequest();
// Make sure there is at least one item line for the edition
if (!$providerOrder->getProviderOrderItems()->count()) {
$providerOrderItem = new ProviderOrderItem();
$providerOrder->addProviderOrderItem($providerOrderItem);
}
$form = $this->createForm(ProviderOrderType::class, $providerOrder, [
'is_ajax' => $isAjax
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$providerOrder->updatePapersPriceUnity();
$providerOrder->updateProviderOrderDelivery();
$providerOrder->updateProviderOrderDifference();
$em->flush();
return $this->redirectToRoute('provider_order_show', [
'id' => $providerOrder->getId()
], Response::HTTP_SEE_OTHER);
}
$template = $isAjax ? '_form' : 'edit';
return $this->renderForm('manager/provider_order/' . $template . '.html.twig', [
'provider_order' => $providerOrder,
'price_unities' => \json_encode($providerOrder->getPriceUnities()),
'form' => $form
]);
}
#[Route('/archive/{id}', name: 'archive', methods: ['POST'])]
public function archive(ProviderOrder $providerOrder, ArchiveManager $archiveManager): Response
{
$message = $archiveManager->archive($providerOrder);
$this->addFlash('success', $message);
return $this->redirectToRoute('provider_order_show', [
'id' => $providerOrder->getId(),
], Response::HTTP_SEE_OTHER);
}
}