<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use App\Service\TSpoonLabClient;
use App\Entity\PickList;
use App\Entity\PickListLine;
use App\Entity\Product;
use App\Entity\ProductType;
use App\Entity\Order;
use App\Entity\OrderLine;
class OrderController extends AbstractController
{
/**
* @Route("/order/browse/{page}", defaults={"page"=0}, name="browse_order")
*/
public function browseOrder(Request $request, $page): Response
{
$session = $request->getSession();
$today = new \DateTime();
if ($page == 0) {
$page = 1;
}
$orepo = $this->getDoctrine()->getRepository(Order::class);
$orders = $orepo->findAllByPage($page);
$count = count($orders);
return $this->render('browse_order.html.twig', [
'orders' => $orders,
'page_title' => 'Órdenes',
'today' => $today,
'pages' => ['page_id' => 'browse_order', 'last' => floor(($count-1)/$orepo->getLinesPerPage())+1, 'current' => $page]
]);
}
/**
* @Route("/order/edit/{date}", name="edit_order")
*/
public function editOrder(Request $request, $date)
{
$date = new \DateTime($date);
$orepo = $this->getDoctrine()->getRepository(Order::class);
$olrepo = $this->getDoctrine()->getRepository(OrderLine::class);
$ptrepo = $this->getDoctrine()->getRepository(ProductType::class);
$pllrepo = $this->getDoctrine()->getRepository(PickListLine::class);
$orders = $orepo->findByDate($date);
if ( ! $orders ) {
$order = new Order();
$today = new \DateTime();
$order->setSupplyDate($today);
$odata = $pllrepo->findRequestedQtysByDate($date);
} else {
$order = $orders[0];
$odata = [];
foreach ( $order->getOrderLines() as $ol ) {
$odata[] = [
'pt_id' => $ol->getProductType()->getId(),
'req_qty' => $ol->getRequestedQty(),
'name' => $ol->getProductType()->getName(),
'production_type' => $ol->getProductType()->getProductionType(),
];
}
}
// Add existing products to pldata array
$defaults = [];
foreach ($odata as $od) {
if ( $od['production_type'] == 'dly' )
$defaults['requested_qty_'.$od['pt_id']] = $od['req_qty'];
}
$builder = $this->createFormBuilder($defaults);
foreach ($defaults as $key => $v) {
$builder->add($key, IntegerType::class, ['required' => false]);
}
$builder->add('save', SubmitType::class);
$form = $builder->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$data = $form->getData();
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($order);
foreach ($data as $key => $value) {
if ($value == 0) {
continue;
}
list($d1, $d2, $pt_id) = explode('_', $key);
$ptype = $ptrepo->find($pt_id);
$ol = $olrepo->findOneBy(['xorder' => $order, 'ProductType' => $ptype ]);
if ( ! $ol ) {
$ol = new OrderLine();
$ol->setXorder($order);
$ol->setProductType($ptype);
}
$ol->setRequestedQty($value);
$entityManager->persist($ol);
}
$entityManager->flush();
return $this->render(
'edit_order.html.twig',
array(
'form' => $form->createView(),
'page_title' => 'Orden',
'order' => $order,
'odata' => $odata,
'order_id' => $order->getId()
)
);
} else {
$products = [];
return $this->render(
'edit_order.html.twig',
array(
'form' => $form->createView(),
'page_title' => 'Orden',
'order' => $order,
'odata' => $odata,
)
);
}
}
/**
* @Route("/order/send/{date}", name="send_order")
*/
public function sendOrder(TSpoonLabClient $tSpoonLabClient, Request $request, $date): Response
{
$orepo = $this->getDoctrine()->getRepository(Order::class);
$order = $orepo->findByDate($date);
$builder = $this->createFormBuilder();
$builder->add('stage', HiddenType::class, array('data' => 'initial'));
$builder->add('submit', SubmitType::class);
$form = $builder->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$fields = $form->getData();
if ($fields['stage'] == 'initial') {
/* Production */
$p_response = $tSpoonLabClient->createProduction($date);
$production = json_decode($p_response);
$errors = [];
foreach ( $order[0]->getOrderLines() as $ol ) {
if ( !empty($ol->getProductType()->getTspoonCode() ) ) {
$response = $tSpoonLabClient->getQuantityUnit($ol->getProductType()->getTspoonCode());
$qu = json_decode($response);
$response = $tSpoonLabClient->createEvents(
$ol->getProductType()->getTspoonCode(),
$ol->getRequestedQty(),
$qu->id,
$production->id
);
} else {
$errors[] = sprintf("Producto %s sin ID en TSpoonLab", $ol->getProductType()->getName());
}
}
return $this->render(
'send_order.html.twig',
['stage' => 'done', 'form' => $form->createView(), 'page_title' => 'Enviar orden', 'date' => $date, 'errors' => $errors]
);
}
} else {
return $this->render(
'send_order.html.twig',
array( 'stage' => 'initial', 'form' => $form->createView(), 'page_title' => 'Enviar orden', 'date' => $date)
);
}
}
}