src/Controller/Manager/ForecastingController.php line 75

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Manager;
  3. use App\Entity\Paper;
  4. use App\Entity\PaperStock;
  5. use App\Services\ForecastingManager;
  6. use App\Form\Manager\StockCustomerEditType;
  7. use App\Form\Manager\StockEditType;
  8. use App\Form\Manager\StockProviderEditType;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use App\Repository\PaperStockGroupRepository;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\HttpFoundation\Response;
  13. use App\Repository\CustomerOrderItemRepository;
  14. use App\Repository\PaperRepository;
  15. use App\Repository\ProviderOrderItemRepository;
  16. use Symfony\Component\Routing\Annotation\Route;
  17. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  18. #[Route(name'stock_')]
  19. class ForecastingController extends AbstractController
  20. {
  21.     protected $forecastingManager;
  22.     public function __construct(ForecastingManager $forecastingManager)
  23.     {
  24.         $this->forecastingManager $forecastingManager;
  25.     }
  26.     #[Route('/manager/stocks/forecasting/outofstocks')]
  27.     public function outOfStocks(PaperRepository $paperRepositoryRequest $requestEntityManagerInterface $em): Response
  28.     {   
  29.         // Retrieve filters
  30.         $filters $this->getFilters($request);
  31.         $papers $paperRepository->findAll();
  32.         
  33.         foreach ($papers as $paper) {
  34.             $lastQuantity $paper->getQuantity();
  35.             $stockOrders $this->forecastingManager->getStockOrders($paper$lastQuantity$filters);
  36.             $this->forecastingManager->updateOutOfStocks($paper$stockOrders);
  37.         }
  38.         $em->flush();
  39.         return $this->json('ok');
  40.     }
  41.     #[Route('/manager/stocks/{id}/forecasting/forecasting'name'forecasting'methods: ['GET''POST'])]
  42.     public function forecasting(Paper $paperRequest $request): Response
  43.     {   
  44.         // Retrieve filters
  45.         $filters $this->getFilters($request);
  46.         // Retrieve stocks
  47.         $stocks $this->forecastingManager->getStocks($paper$filters);
  48.         
  49.         $lastQuantity count($stocks) ? $stocks[count($stocks) - 1]->getQuantity() : $paper->getQuantity();
  50.         // Retrieve and merge customer and provider orders
  51.         $stockOrders $this->forecastingManager->getStockOrders($paper$lastQuantity$filters);
  52.         return $this->renderForm('manager/stock/forecasting/forecasting.html.twig', [
  53.             'paper' => $paper,
  54.             'stocks' => $stocks,
  55.             'stockOrders' => $stockOrders,
  56.             'hide_today' => $filters['to'] && new \DateTimeImmutable($filters['to']) < (new \DateTimeImmutable())->setTime(000)
  57.         ]);
  58.     }
  59.     #[Route('/manager/stocks/{id}/forecasting-ajax'name'forecasting_ajax')]
  60.     public function forecastingAjax(Paper $paperRequest $request)
  61.     {   
  62.         // Retrieve filters
  63.         $filters $this->getFilters($request);
  64.         // retrieve forecasting
  65.         $response $this->getForecastingAjax($paper$filters);
  66.         return $this->json($response);
  67.     }
  68.     #[Route('/manager/stocks/forecasting-ajax-multiple'name'forecasting_ajax_multiple')]
  69.     public function forecastingAjaxMultiple(PaperRepository $paperRepositoryRequest $request)
  70.     {   
  71.         if (!$request->request->has('ids')) throw $this->createNotFoundException();
  72.         // Retrieve filters
  73.         $filters $this->getFilters($request);
  74.         // Get papers
  75.         $ids $request->request->all()['ids'];
  76.         $papers $paperRepository->findBy(['id' => $ids]);
  77.         // Merge templates
  78.         $response '';
  79.         foreach ($papers as $paper) {
  80.             $template $this->getForecastingAjax($paper$filters);
  81.             $response .= '<table data-forecasting-id="' $paper->getId() . '">' $template '</table>';
  82.         }
  83.         return $this->json($response);
  84.     }
  85.     #[Route('/manager/stocks/{id}/forecasting/edit'name'forecasting_edit'methods: ['POST'])]
  86.     public function forecastingEdit(Paper $paperRequest $requestCustomerOrderItemRepository $customerOrderItemRepositoryProviderOrderItemRepository $providerOrderItemRepositoryPaperStockGroupRepository $paperStockGroupRepositoryEntityManagerInterface $em): Response
  87.     {   
  88.         if (!$request->request->has('stock') || !$request->request->has('type')) throw $this->createNotFoundException();
  89.         // Select repository and form type from stock type 
  90.         switch ($request->request->get('type')) {
  91.             case PaperStock::TYPE_ORDER_CUSTOMER 
  92.                 $repository $customerOrderItemRepository
  93.                 $formType StockCustomerEditType::class;
  94.                 break;
  95.             case PaperStock::TYPE_ORDER_PROVIDER 
  96.                 $repository $providerOrderItemRepository
  97.                 $formType StockProviderEditType::class;
  98.                 break;
  99.             default : 
  100.                 $repository $paperStockGroupRepository;
  101.                 $formType StockEditType::class;
  102.         }
  103.         $stock $repository->find($request->request->get('stock'));
  104.         if(null == $stock) throw $this->createNotFoundException();
  105.         $form $this->createForm($formType$stock);
  106.         $form->handleRequest($request);
  107.         if ($form->isSubmitted()) {
  108.             if ($form->isValid()) {
  109.                 // Set date edited if date is different from order's date
  110.                 switch ($request->request->get('type')) {
  111.                     case PaperStock::TYPE_ORDER_CUSTOMER 
  112.                         $stock->setProductionEdited$stock->getProductionAt() != $stock->getCustomerOrder()->getDeliveredAt() );
  113.                         break;
  114.         
  115.                     case PaperStock::TYPE_ORDER_PROVIDER 
  116.                         $stock->setDeliveryEdited$stock->getDeliveredAt() != $stock->getProviderOrder()->getDeliveredEstimationAt() );
  117.                         break;
  118.         
  119.                 }
  120.                 $em->flush();
  121.                 return $this->json([]);
  122.             }
  123.             $statusCode 422;
  124.         }
  125.         $response $this->renderView('manager/stock/forecasting/_forecasting_edit_form.html.twig', [
  126.             'form' => $form->createView()
  127.         ]);
  128.         return $this->json($response, isset($statusCode) ? $statusCode 200);
  129.     }
  130.     private function getForecastingAjax(Paper $paper, array $filters): string
  131.     {
  132.         $lastQuantity $paper->getQuantity();
  133.         // Retrieve and merge customer and provider orders
  134.         $stockOrders $this->forecastingManager->getStockOrders($paper$lastQuantity$filters);
  135.         $template $this->renderView('manager/stock/forecasting/_forecasting-tbody.html.twig', [
  136.             'paper' => $paper,
  137.             'stockOrders' => $stockOrders,
  138.             'hide_today' => true
  139.         ]);
  140.         return $template;
  141.     }
  142.     private function getFilters(Request $request): array
  143.     {
  144.         $filters = [
  145.             'archived' => false,
  146.             'from' => null,
  147.             'to' => null
  148.         ];
  149.         if ($request->query->has('filter')) {
  150.             foreach ($request->query->all()['filter'] as $field => $filter) {
  151.                 if (!isset($filter['value']) || $filter['value'] == "" || !isset($filter['comparator'])) continue;
  152.                 switch ($field) {
  153.                     case 'from' 
  154.                         $filters['from'] = $filter['value']; 
  155.                         break;
  156.                     case 'to' 
  157.                         $filters['to'] = $filter['value']; 
  158.                         break;
  159.                     case 'archived' 
  160.                         if ($filter['value'] == "1"$filters['archived'] = true
  161.                         break;
  162.                 }
  163.             }
  164.         }
  165.         return $filters;
  166.     }
  167. }