src/Controller/OrderController.php line 62

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\HttpFoundation\Response;
  5. use Symfony\Component\HttpFoundation\JsonResponse;
  6. use Symfony\Component\Routing\Annotation\Route;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Component\Form\Extension\Core\Type\TextType;
  9. use Symfony\Component\Form\Extension\Core\Type\HiddenType;
  10. use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  11. use Symfony\Component\Form\Extension\Core\Type\NumberType;
  12. use Symfony\Component\Form\Extension\Core\Type\IntegerType;
  13. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  14. use App\Service\TSpoonLabClient;
  15. use App\Entity\PickList;
  16. use App\Entity\PickListLine;
  17. use App\Entity\Product;
  18. use App\Entity\ProductType;
  19. use App\Entity\Order;
  20. use App\Entity\OrderLine;
  21. class OrderController extends AbstractController
  22. {
  23. /**
  24. * @Route("/order/browse/{page}", defaults={"page"=0}, name="browse_order")
  25. */
  26. public function browseOrder(Request $request, $page): Response
  27. {
  28. $session = $request->getSession();
  29. $today = new \DateTime();
  30. if ($page == 0) {
  31. $page = 1;
  32. }
  33. $orepo = $this->getDoctrine()->getRepository(Order::class);
  34. $orders = $orepo->findAllByPage($page);
  35. $count = count($orders);
  36. return $this->render('browse_order.html.twig', [
  37. 'orders' => $orders,
  38. 'page_title' => 'Órdenes',
  39. 'today' => $today,
  40. 'pages' => ['page_id' => 'browse_order', 'last' => floor(($count-1)/$orepo->getLinesPerPage())+1, 'current' => $page]
  41. ]);
  42. }
  43. /**
  44. * @Route("/order/edit/{date}", name="edit_order")
  45. */
  46. public function editOrder(Request $request, $date)
  47. {
  48. $date = new \DateTime($date);
  49. $orepo = $this->getDoctrine()->getRepository(Order::class);
  50. $olrepo = $this->getDoctrine()->getRepository(OrderLine::class);
  51. $ptrepo = $this->getDoctrine()->getRepository(ProductType::class);
  52. $pllrepo = $this->getDoctrine()->getRepository(PickListLine::class);
  53. $orders = $orepo->findByDate($date);
  54. if ( ! $orders ) {
  55. $order = new Order();
  56. $today = new \DateTime();
  57. $order->setSupplyDate($today);
  58. $odata = $pllrepo->findRequestedQtysByDate($date);
  59. } else {
  60. $order = $orders[0];
  61. $odata = [];
  62. foreach ( $order->getOrderLines() as $ol ) {
  63. $odata[] = [
  64. 'pt_id' => $ol->getProductType()->getId(),
  65. 'req_qty' => $ol->getRequestedQty(),
  66. 'name' => $ol->getProductType()->getName(),
  67. 'production_type' => $ol->getProductType()->getProductionType(),
  68. ];
  69. }
  70. }
  71. // Add existing products to pldata array
  72. $defaults = [];
  73. foreach ($odata as $od) {
  74. if ( $od['production_type'] == 'dly' )
  75. $defaults['requested_qty_'.$od['pt_id']] = $od['req_qty'];
  76. }
  77. $builder = $this->createFormBuilder($defaults);
  78. foreach ($defaults as $key => $v) {
  79. $builder->add($key, IntegerType::class, ['required' => false]);
  80. }
  81. $builder->add('save', SubmitType::class);
  82. $form = $builder->getForm();
  83. $form->handleRequest($request);
  84. if ($form->isSubmitted() && $form->isValid()) {
  85. $data = $form->getData();
  86. $entityManager = $this->getDoctrine()->getManager();
  87. $entityManager->persist($order);
  88. foreach ($data as $key => $value) {
  89. if ($value == 0) {
  90. continue;
  91. }
  92. list($d1, $d2, $pt_id) = explode('_', $key);
  93. $ptype = $ptrepo->find($pt_id);
  94. $ol = $olrepo->findOneBy(['xorder' => $order, 'ProductType' => $ptype ]);
  95. if ( ! $ol ) {
  96. $ol = new OrderLine();
  97. $ol->setXorder($order);
  98. $ol->setProductType($ptype);
  99. }
  100. $ol->setRequestedQty($value);
  101. $entityManager->persist($ol);
  102. }
  103. $entityManager->flush();
  104. return $this->render(
  105. 'edit_order.html.twig',
  106. array(
  107. 'form' => $form->createView(),
  108. 'page_title' => 'Orden',
  109. 'order' => $order,
  110. 'odata' => $odata,
  111. 'order_id' => $order->getId()
  112. )
  113. );
  114. } else {
  115. $products = [];
  116. return $this->render(
  117. 'edit_order.html.twig',
  118. array(
  119. 'form' => $form->createView(),
  120. 'page_title' => 'Orden',
  121. 'order' => $order,
  122. 'odata' => $odata,
  123. )
  124. );
  125. }
  126. }
  127. /**
  128. * @Route("/order/send/{date}", name="send_order")
  129. */
  130. public function sendOrder(TSpoonLabClient $tSpoonLabClient, Request $request, $date): Response
  131. {
  132. $orepo = $this->getDoctrine()->getRepository(Order::class);
  133. $order = $orepo->findByDate($date);
  134. $builder = $this->createFormBuilder();
  135. $builder->add('stage', HiddenType::class, array('data' => 'initial'));
  136. $builder->add('submit', SubmitType::class);
  137. $form = $builder->getForm();
  138. $form->handleRequest($request);
  139. if ($form->isSubmitted() && $form->isValid()) {
  140. $fields = $form->getData();
  141. if ($fields['stage'] == 'initial') {
  142. /* Production */
  143. $p_response = $tSpoonLabClient->createProduction($date);
  144. $production = json_decode($p_response);
  145. $errors = [];
  146. foreach ( $order[0]->getOrderLines() as $ol ) {
  147. if ( !empty($ol->getProductType()->getTspoonCode() ) ) {
  148. $response = $tSpoonLabClient->getQuantityUnit($ol->getProductType()->getTspoonCode());
  149. $qu = json_decode($response);
  150. $response = $tSpoonLabClient->createEvents(
  151. $ol->getProductType()->getTspoonCode(),
  152. $ol->getRequestedQty(),
  153. $qu->id,
  154. $production->id
  155. );
  156. } else {
  157. $errors[] = sprintf("Producto %s sin ID en TSpoonLab", $ol->getProductType()->getName());
  158. }
  159. }
  160. return $this->render(
  161. 'send_order.html.twig',
  162. ['stage' => 'done', 'form' => $form->createView(), 'page_title' => 'Enviar orden', 'date' => $date, 'errors' => $errors]
  163. );
  164. }
  165. } else {
  166. return $this->render(
  167. 'send_order.html.twig',
  168. array( 'stage' => 'initial', 'form' => $form->createView(), 'page_title' => 'Enviar orden', 'date' => $date)
  169. );
  170. }
  171. }
  172. }