<?php
namespace WebserviceBundle\Controller\Wms\Production;
use FOS\RestBundle\Controller\Annotations as FOS;
use FOS\RestBundle\Controller\Annotations\QueryParam;
use FOS\RestBundle\Request\ParamFetcher;
use FOS\RestBundle\Routing\ClassResourceInterface;
use FOS\RestBundle\Util\Codes;
use FOS\RestBundle\View\View;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\StreamedResponse;
use WebserviceBundle\Controller\WmsController;
use WebserviceBundle\Forms\ExportableType;
use WebserviceBundle\Forms\ExportLocationsType;
use WebserviceBundle\Forms\Production\ProductionOrderType;
use WebserviceBundle\Response\SingleProductionOrderResponse;
use WebserviceBundle\Security\WmsVoter;
use WebserviceBundle\Forms\Production\UpdateProductionOrderType;
use WmsBundle\Doctrine\Interfaces\ExportableInterface;
use WmsBundle\Doctrine\Interfaces\Production\ProductionOrderInterface;
use WmsBundle\Entity\Production\ProductionOrder;
use WmsBundle\Services\Entity\PrinterService;
use WmsBundle\Services\Entity\Production\ProductionOrderService;
use WmsBundle\Services\FileService;
use WmsBundle\Services\ImageService;
use WmsBundle\States\ProductionOrder\CompletedState;
use WmsBundle\States\ProductionOrder\ProductionOrderStateInterface;
/**
* Class ProductionOrderController
* @FOS\View(serializerEnableMaxDepthChecks=true)
*
* @package WmsBundle\Controller
*/
class ProductionorderController extends WmsController implements ClassResourceInterface
{
/**
* Get all orders
* @QueryParam(name="search", description="Search term to look for")
* @QueryParam(name="sort", description="Sort production orders")
* @QueryParam(name="customer", description="Customer to look for")
* @QueryParam(name="customer_code", description="Customer to look for")
* @QueryParam(name="reference", description="internal reference to look for")
* @QueryParam(name="relation", description="Relation to look for")
* @QueryParam(name="show_active", description="Show completed/cancelled production orders")
* @QueryParam(name="external_reference", description="external reference to look for")
* @QueryParam(name="status", description="Order status")
*
* @param ParamFetcher $params
*
* @return View
*/
public function cgetAction(ParamFetcher $params): View
{
$service = $this->get(ProductionOrderService::class);
/** @var ProductionOrderInterface[] $productionOrders */
$productionOrders = $service->getByProperties($params->all());
return $this->groupedView($productionOrders, ['production_orders', 'production_issues', 'production_order_state_logs']);
}
/**
* @param ProductionOrder $productionOrder
* @return View
*/
public function getAction(ProductionOrder $productionOrder): View
{
/** @var ProductionOrderService $service */
$service = $this->get(ProductionOrderService::class);
$productionOrderResponse = new SingleProductionOrderResponse($productionOrder, $service);
return $this->groupedView($productionOrderResponse, ['production_orders', 'production_order_lines', 'location']);
}
/**
* @param Request $request
* @return View
*/
public function postAction(Request $request): View
{
/** @var ProductionOrderService $service */
$service = $this->get(ProductionOrderService::class);
/** @var ProductionOrderInterface $productionOrder */
$productionOrder = $service->new();
$form = $this->createForm(
ProductionOrderType::class,
$productionOrder,
['method' => 'POST']
);
$form->handleRequest($request);
if (!$form->isValid()) {
return $this->view($form->getErrors(), Codes::HTTP_BAD_REQUEST);
}
$productionOrder = $service->create($productionOrder);
if (!$productionOrder) {
return $this->view(null, Codes::HTTP_BAD_REQUEST);
}
return $this->groupedView($productionOrder, ['production_order', 'production_order_lines'], Codes::HTTP_CREATED);
}
/**
* @param Request $request
* @param ProductionOrder $productionOrder
* @return View
* @throws \Exception
*/
public function patchAction(Request $request, ProductionOrder $productionOrder): View
{
/** @var ProductionOrderService $service */
$service = $this->get(ProductionOrderService::class);
$form = $this->createForm(
UpdateProductionOrderType::class,
$productionOrder,
['method' => 'PATCH']
);
$form->handleRequest($request);
if (!$form->isValid()) {
return $this->view($form->getErrors(), Response::HTTP_BAD_REQUEST);
}
$service->update($productionOrder->getId(), $productionOrder);
return $this->groupedView($productionOrder);
}
/**
* @param ProductionOrder $productionOrder
* @return View
*/
public function putTransferAction(ProductionOrder $productionOrder): View
{
/** @var ProductionOrderService $service */
$service = $this->get(ProductionOrderService::class);
$service->transfer($productionOrder);
return $this->groupedView($productionOrder, ['production_order']);
}
/**
* @param ProductionOrder $productionOrder
* @return View
*/
public function completeAction(ProductionOrder $productionOrder): View
{
$service = $this->get(ProductionOrderService::class);
$service->complete($productionOrder);
return $this->groupedView($productionOrder, ['production_orders', 'production_order_lines']);
}
public function postPrintAction(Request $request, ProductionOrder $productionOrder)
{
if ($productionOrder->getStatus()->getName() !== CompletedState::NAME) {
return $this->view(null, Codes::HTTP_BAD_REQUEST);
}
$form = $this->createForm(ExportableType::class, null, ['method' => 'POST',]);
$form->handleRequest($request);
/** @var PrinterService $printerService */
$printerService = $this->get('wms.services.printer');
/** @var $productionOrderService $productionOrderService */
$productionOrderService = $this->get(ProductionOrderService::class);
$locations = $productionOrderService->getLocationsAtProductionLocation($productionOrder);
$printer = $form->getData()['printer'];
try {
$files = [];
foreach ($locations as $location) {
$files[] = $printerService->download($printer, $location, 'label', 1);
}
/** @var string $file contains PDF */
$file = $this->get(FileService::class)->mergePdfFiles($files);
$pdf = $printerService->download($printer, $file);
} catch (PrintException $e) {
return $this->view(['error' => $e->getMessage(),], Codes::HTTP_INTERNAL_SERVER_ERROR);
}
return $this->streamedFileView($pdf);
}
public function getLocationsAction(Request $request, ProductionOrder $productionOrder)
{
if ($productionOrder->getStatus()->getName() !== CompletedState::NAME) {
return $this->view(null, Codes::HTTP_BAD_REQUEST);
}
/** @var $productionOrderService $productionOrderService */
$productionOrderService = $this->get(ProductionOrderService::class);
$locations = $productionOrderService->getLocationsAtProductionLocation($productionOrder);
return $this->groupedView($locations, ['location']);
}
/**
* @param Request $request
* @param ProductionOrder $productionOrder
* @return View
*/
public function putCancelAction(Request $request, ProductionOrder $productionOrder): View
{
$service = $this->get(ProductionOrderService::class);
$note = $request->request->get('note');
$productionOrder = $service->cancel($productionOrder, $note);
if (!$productionOrder) {
return $this->view(null, Codes::HTTP_CONFLICT);
}
return $this->groupedView($productionOrder, ['production_order']);
}
/**
* @param ProductionOrder $productionOrder
* @return StreamedResponse
*/
public function getBarcodeAction(ProductionOrder $productionOrder): StreamedResponse
{
/** @var ImageService $service */
$service = $this->get('wms.common.image');
return $this->streamedFileView(
$service->getBarcodeForExportable($productionOrder),
$productionOrder->getFullReference(),
ExportableInterface::RESPONSE_IMAGE
);
}
/**
* @FOS\Put("/productionOrders/{id}/start")
* @param $id
* @return View
*/
public function putStartAction(ProductionOrder $productionOrder)
{
$this->denyAccessUnlessGranted(WmsVoter::BOTH);
$service = $this->get(ProductionOrderService::class);
$result = $service->startProgress($productionOrder);
return $this->view(null, 204);
}
}