Files
kupshop/bundles/KupShop/WarehouseBundle/Controller/StoreAppController.php
2025-08-02 16:30:27 +02:00

467 lines
14 KiB
PHP

<?php
namespace KupShop\WarehouseBundle\Controller;
use KupShop\AdminBundle\Util\LegacyAdminCredentials;
use KupShop\WarehouseBundle\Util\InventoryWorker;
use KupShop\WarehouseBundle\Util\StoreItemWorker;
use KupShop\WarehouseBundle\Util\StoreTransferWorker;
use Query\Operator;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\Routing\Annotation\Route;
use Violet\StreamingJsonEncoder\StreamJsonEncoder;
class StoreAppController extends AbstractController
{
/**
* @var StoreItemWorker
*/
private $storeItemWorker;
/**
* @var StoreTransferWorker
*/
private $storeTransferWorker;
/**
* @var InventoryWorker
*/
private $inventoryWorker;
/**
* @var LegacyAdminCredentials
*/
private $legacyAdminCredentials;
public function __construct(StoreItemWorker $storeItemWorker, StoreTransferWorker $storeTransferWorker, InventoryWorker $inventoryWorker, LegacyAdminCredentials $legacyAdminCredentials)
{
$this->storeItemWorker = $storeItemWorker;
$this->storeTransferWorker = $storeTransferWorker;
$this->inventoryWorker = $inventoryWorker;
$this->legacyAdminCredentials = $legacyAdminCredentials;
}
/**
* @return \Symfony\Component\HttpFoundation\Response
*
* @Route("/_warehouse/store-app/login")
*
* @throws \Exception
*/
public function loginAction(Request $request)
{
$jsonResponse = json_decode($request->getContent());
$user = $this->legacyAdminCredentials->loginByHash($jsonResponse->hash ?? '');
if (empty($user)) {
return new JsonResponse($this->storeItemWorker->returnError('Nepodařilo se přihlásit!'));
}
// Remember login
$request->getSession()->set('warehouse_store_logged', $user['id']);
return new JsonResponse([
'result' => true,
'user' => $user,
]);
}
/**
* @return \Symfony\Component\HttpFoundation\Response
*
* @Route("/_warehouse/store-app/loadItem")
*/
public function loadItemAction(Request $request)
{
$jsonResponse = json_decode($request->getContent());
$batchId = ($jsonResponse->productBatch ?? false) ? $jsonResponse->productBatch->id ?? null : false;
$product = $this->storeItemWorker->checkProductByEanAndLocation($jsonResponse->ean, $jsonResponse->location ?? null, $jsonResponse->position ?? null, $batchId);
if (!$product) {
$responseData = $this->storeItemWorker->returnError('Produkt nenalezen!');
} else {
$where = Operator::equalsNullable(['p.id' => $product['id_product'], 'pv.id' => $product['id_variation']]);
if (!($jsonResponse->showBox ?? false)) {
$where = Operator::andX(
$where,
Operator::not(Operator::inIntArray([StoreItemWorker::LOCATION_BOX], 'wpos.id_location'))
);
}
$responseData = [
'ean' => $jsonResponse->ean,
'product' => $product,
'positions' => $this->storeItemWorker->getProductPositions($where),
'result' => !empty($product),
];
}
return new JsonResponse($responseData);
}
/**
* @return \Symfony\Component\HttpFoundation\Response
*
* @Route("/_warehouse/store-app/loadItemWithVariations")
*/
public function loadItemWithVariationsAction(Request $request)
{
$json = $this->loadItemAction($request)->getContent();
$data = json_decode($json, true);
$pvEANs = sqlQueryBuilder()
->select('pv.ean')
->from('products_variations', 'pv')
->where(Operator::equals(['pv.id_product' => $data['product']['id_product']]))
->execute();
$variations = [];
foreach ($pvEANs as $ean) {
$variation = $this->storeItemWorker->checkProductByEanAndLocation($ean['ean']);
if ($variation) {
$variations[] = $variation;
}
}
$data['variations'] = $variations;
return new JsonResponse($data);
}
/**
* @return \Symfony\Component\HttpFoundation\Response
*
* @throws \Throwable
*
* @Route("/_warehouse/store-app/storeInItem")
*/
public function storeInItemAction(Request $request)
{
$jsonResponse = json_decode($request->getContent());
$batchId = ($jsonResponse->productBatch ?? false) ? $jsonResponse->productBatch->id ?? null : false;
$result = $this->storeItemWorker->storeItemFromTable($jsonResponse->ean, $jsonResponse->quantity, $jsonResponse->positionFrom, $jsonResponse->positionTo, $jsonResponse->overSupply, $batchId);
$responseData = [
'message' => $result,
'result' => $result === true,
];
return new JsonResponse($responseData);
}
/**
* @return \Symfony\Component\HttpFoundation\Response
*
* @Route("/_warehouse/store-app/getItemsOnTable")
*
* @throws \Exception
*/
public function getItemsOnTableAction(Request $request)
{
$jsonResponse = json_decode($request->getContent());
if (!empty($jsonResponse->table)) {
$positions = [$this->storeItemWorker->getPositionIdByCode($jsonResponse->table)];
} else {
$positions = $this->storeItemWorker->findTablePositions();
}
$result = $this->storeItemWorker->getProductsOnPositions($positions);
$responseData = [
'products' => $result,
'result' => true,
];
return new JsonResponse($responseData);
}
/**
* @return \Symfony\Component\HttpFoundation\Response
*
* @Route("/_warehouse/store-app/getItemsOnPosition")
*
* @throws \Exception
*/
public function getItemsOnPositionAction(Request $request)
{
$jsonResponse = json_decode($request->getContent());
$result = $this->storeItemWorker->getProductsOnPositions([$this->storeItemWorker->getPositionIdByCode($jsonResponse->position_code)]);
$responseData = [
'position' => $jsonResponse->position_code,
'products' => $result,
'result' => true,
];
return new JsonResponse($responseData);
}
/**
* @Route("/_warehouse/store-app/getAllTables")
*
* @return JsonResponse
*/
public function getAllTablesAction(Request $request)
{
$result = $this->storeItemWorker->getAllTables();
$responseData = [
'tables' => $result,
'result' => true,
];
return new JsonResponse($responseData);
}
/**
* @Route("/_warehouse/store-app/startOrderCheckout")
*
* @return JsonResponse
*
* @throws \Exception
*/
public function startOrderCheckoutAction(Request $request)
{
$parameters = json_decode($request->getContent());
$responseData = $this->getWorker($parameters->order_no)->startCheckout($parameters->order_no, $parameters->box);
return new JsonResponse($responseData);
}
/**
* @Route("/_warehouse/store-app/startOrderMassCheckout")
*
* @return JsonResponse
*
* @throws \Exception
*/
public function startOrderMassCheckoutAction(Request $request)
{
$parameters = json_decode($request->getContent());
$responseData = $this->storeItemWorker->startMassCheckout($parameters);
return new JsonResponse($responseData);
}
/**
* @return JsonResponse
*
* @throws \Exception
* @throws \Throwable
*
* @Route("/_warehouse/store-app/saveOrderCheckout")
*/
public function saveOrderCheckoutAction(Request $request)
{
$parameters = json_decode($request->getContent());
$responseData = $this->getWorker($parameters->id_warehouse)->commit($parameters->id_warehouse, $parameters->state);
return new JsonResponse($responseData);
}
/**
* @return JsonResponse
*
* @throws \Exception
* @throws \Throwable
*
* @Route("/_warehouse/store-app/saveOrderMassCheckout")
*/
public function saveOrderMassCheckoutAction(Request $request)
{
$parameters = json_decode($request->getContent());
$responseData = $this->storeItemWorker->commitMass($parameters->state);
$this->storeItemWorker->finishCompletedOrders($parameters->orders);
return new JsonResponse($responseData);
}
/**
* @return JsonResponse
*
* @throws \Exception
* @throws \Throwable
*
* @Route("/_warehouse/store-app/asyncSaveOrderCheckoutAction")
*/
public function asyncSaveOrderCheckoutAction(Request $request)
{
$parameters = json_decode($request->getContent());
$responseData = $this->getWorker($parameters->id_warehouse)->commit($parameters->id_warehouse, $parameters->state);
list($responseData['store']['checkouts'], $responseData['store']['items']) = $this->getWorker($parameters->id_warehouse)->loadOrderStoreItems($parameters->id_warehouse);
return new JsonResponse($responseData);
}
/**
* @return JsonResponse
*
* @throws \Exception
* @throws \Throwable
*
* @Route("/_warehouse/store-app/asyncSaveOrderMassCheckoutAction")
*/
public function asyncSaveOrderMassCheckoutAction(Request $request)
{
$parameters = json_decode($request->getContent());
$responseData = $this->storeItemWorker->commitMass($parameters->state);
list($responseData['store']['checkouts'], $responseData['store']['items']) = $this->storeItemWorker->loadOrderStoreMassItems($parameters->orders);
return new JsonResponse($responseData);
}
/**
* @Route("/_warehouse/store-app/submitOrderCheckout")
*
* @return JsonResponse
*
* @throws \Exception
* @throws \Throwable
*/
public function submitOrderCheckoutAction(Request $request)
{
$parameters = json_decode($request->getContent());
$responseData = $this->getWorker($parameters->id_warehouse)->finish($parameters->id_warehouse, $parameters->state);
return new JsonResponse($responseData);
}
/**
* @Route("/_warehouse/store-app/submitOrderMassCheckout")
*
* @return JsonResponse
*
* @throws \Exception
* @throws \Throwable
*/
public function submitOrderMassCheckoutAction(Request $request)
{
$parameters = json_decode($request->getContent());
$responseData = $this->storeItemWorker->finishMass($parameters->orders, $parameters->state);
return new JsonResponse($responseData);
}
/**
* @Route("/_warehouse/store-app/moveProduct")
*
* @return JsonResponse
*
* @throws \Exception
* @throws \Throwable
*/
public function moveProductAction(Request $request)
{
$parameters = json_decode($request->getContent());
$batchId = ($parameters->productBatch ?? false) ? $parameters->productBatch->id ?? null : false;
$responseData = $this->storeItemWorker->moveProduct($parameters->ean, $parameters->pieces, $parameters->positionFrom, $parameters->positionTo, $parameters->overSupply ?? false, $batchId);
return new JsonResponse($responseData);
}
/**
* @Route("/_warehouse/store-app/stats/")
*
* @return JsonResponse
*/
public function getUserScore(Request $request)
{
$parameters = json_decode($request->getContent());
if (empty($parameters->user->id)) {
$responseData = [
'result' => false,
'message' => 'Nepřihlášený uživatel.',
];
} else {
$responseData = $this->storeItemWorker->getStats($parameters->user);
}
return new JsonResponse($responseData);
}
/**
* @return StoreItemWorker|StoreTransferWorker
*/
private function getWorker($order_no)
{
return strpos($order_no, 'TR') === false ? $this->storeItemWorker : $this->storeTransferWorker;
}
/**
* @return JsonResponse
*
* @throws \Exception
* @throws \Throwable
*
* @Route("/_warehouse/store-app/submitInventory")
*/
public function submitInventoryAction(Request $request)
{
$parameters = json_decode($request->getContent());
$positionId = $this->storeItemWorker->getPositionIdByCode($parameters->position_code);
$result = $this->inventoryWorker->submitInventory($positionId, $parameters->products, $parameters->position_code);
return new JsonResponse($result);
}
/**
* @return StreamedResponse
*
* @throws \Exception
* @throws \Throwable
*
* @Route("/_warehouse/store-app/loadAllProducts")
*/
public function loadInventoryProducts(Request $request)
{
$result = [
'products' => $this->inventoryWorker->loadProductsCache(),
'productsEANs' => $this->inventoryWorker->loadProductsEans(),
'productsSuppliersEANs' => $this->inventoryWorker->loadProductsSuppliersEans(),
'result' => true,
];
return new StreamedResponse(function () use ($result) {
$encoder = new StreamJsonEncoder($result);
$encoder->encode();
}, 200, ['Content-Type' => 'application/json']);
}
/**
* @Route("/_warehouse/store-app/getProductBatches")
*/
public function getProductBatches(Request $request)
{
$parameters = json_decode($request->getContent());
if ($parameters->ean ?? false) {
$result = [
'batches' => $this->inventoryWorker->productBatches($parameters->ean),
'result' => true,
];
return new JsonResponse($result);
}
return new JsonResponse(['result' => false]);
}
}