<?php
namespace WebBundle\Controller;
use Exception;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Serializer\Exception\ExceptionInterface;
use WebBundle\Entity\BuyOrder;
use WebBundle\Enum\BuyOrderStatusEnum;
use WebBundle\Helper\App;
use WebBundle\Helper\ConversionHelper;
use WebBundle\Helper\LocaleHelper;
use WebBundle\Helper\OrderHelper;
use WebBundle\Helper\UserHelper;
use WebBundle\Repository\BuyOrderRepository;
/**
* Class OrdersController
* @package WebBundle\Controller
*/
class OrdersController extends ExtendedController
{
private BuyOrderRepository $orderRepo;
/**
* OrdersController constructor.
* @param BuyOrderRepository $orderRepo
* @throws Exception
*/
public function __construct(BuyOrderRepository $orderRepo)
{
parent::__construct();
$this->orderRepo = $orderRepo;
}
/**
* @param null $token
* @return array
* @throws Exception
*/
private function paths($token = null): array
{
return [
'apiOrders' => App::generateUrl(
'app_api_orders',
[
'_locale' => App::getCurLocale(true),
'token' => $token,
]
),
'buyOrderEdit' => App::generateUrl(
'app_order_edit_name',
[
'_locale' => App::getCurLocale(true),
'hash' => '__hash__',
'name' => '__name__',
]
),
'buyOrderDelete' => App::generateUrl(
'app_buy_order_del',
[
'_locale' => App::getCurLocale(true),
'orderId' => '__hash__',
]
),
'appOrder' => App::generateUrl(
'app_order',
[
'_locale' => App::getCurLocale(true),
'hash' => '__hash__',
]
),
'appBuyOrder' => App::generateUrl(
'app_buy_order',
[
'_locale' => App::getCurLocale(true),
'orderId' => '__hash__',
]
),
'appHome' => App::generateUrl(
'app_home',
[
'_locale' => App::getCurLocale(true),
]
),
'appBuyOrderCreate' => App::generateUrl(
'app_buy_order_create',
[
'_locale' => App::getCurLocale(true),
]
),
];
}
/**
* @return array
* @throws Exception
*/
private function transPage(): array
{
return [
'myOrders' => App::trans('buyOrder.index.header'),
'addOrder' => App::trans('buyOrder.index.addOrder'),
'delete' => App::trans('order.remove'),
'save' => App::trans('save'),
'cancel' => App::trans('cancel'),
'yes' => App::trans('yes'),
'no' => App::trans('no'),
'table' => [
'date' => App::trans('buyOrder.th.date'),
'dateCreated' => App::trans('buyOrder.event.order_created'),
'name' => App::trans('buyOrder.th.name'),
'goods' => App::trans('buyOrder.th.good'),
'weight' => App::trans('buyOrder.th.weight'),
'sum' => App::trans('buyOrder.th.sum'),
'status' => App::trans('buyOrder.th.status'),
],
'day' => [
'today' => App::trans('main_menu_today'),
'yesterday' => App::trans('main_menu_yesterday'),
],
'noObligation' => App::trans('buyOrder.no_obligation'),
'confirmOrderRemove' => App::trans('buyOrder.confirm.message_dellete'),
'afterDeliveryCalculation' => App::trans('order.status.afterDeliveryCalculation'),
'homePage' => App::trans('home_page'),
'draftOrder' => App::trans('order.status.draft'),
'empty' => App::trans('order.status.empty'),
'noOrder' => App::trans('buyOrder.index.noOrder'),
'draftOrderPlaceholder' => App::trans('buyOrder.name3'),
];
}
/**
* Страница заказов
*
* @param string|null $token
* @return Response
* @throws ExceptionInterface
* @throws Exception
*/
public function indexAction(?string $token = null): Response
{
$token = $token ?? UserHelper::getInstance()->getToken();
$buyOrders = $this->orderRepo->getBuyOrders(['token' => $token]);
$serializer = $this->get('serializer');
if ($buyOrders && count($buyOrders) == 1 && empty($_GET['noR'])) {
/** @var BuyOrder $buyOrder */
$buyOrder = $buyOrders[0];
return $this->redirect($this->generateUrl('app_buy_order', [
'orderId' => $buyOrder->getHash(),
'_locale' => App::getCurLocale(),
], 0));
}
$orders = [];
$list = [];
/** @var BuyOrder $order */
foreach ($buyOrders as $order) {
$list[] = [
'hash' => $order->getHash(),
'number' => $order->getNumber(),
];
}
$orders['list'] = $list;
$orders['trans'] = $this->transPage();
// в шапке меняем в зависимости от единицы измерения площади
$measure = LocaleHelper::getUserMeasure();
if ($measure === 'ft') {
$orders['trans']['table']['weight'] = str_ireplace(['кг', 'kg'], ['фунт', 'lb'], $orders['trans']['table']['weight']);
}
$orders['paths'] = $this->paths($token);
$orders['updating'] = true; // TRUE чтоб избежать миганий при отображении спиннера во время стартовой загрузки данных по заказам
$orders['updatingDetails'] = ['initial' => true]; // TRUE чтоб избежать миганий при отображении спиннера во время стартовой загрузки данных по заказам
return $this->renderReact('@Web/Order/index.html.twig', [
'initialState' => $serializer->normalize(
[
'orders' => $orders,
]
),
]);
}
/**
* @param string|null $token
* @return JsonResponse
* @throws Exception
*/
public function apiOrdersAction(string $token = null): JsonResponse
{
$token = $token ?? UserHelper::getInstance()->getToken();
$buyOrders = $this->orderRepo->getBuyOrders(['token' => $token]);
$orders = [];
/** @var BuyOrder $order */
foreach ($buyOrders as $order) {
$items = [];
foreach ($order->getArticles() as $article) {
$items[] = $article->getArticle()->getAlternateName() != null ?
$article->getArticle()->getAlternateName() :
$article->getArticle()->getName();
}
$measure = LocaleHelper::getUserMeasure();
$totalRealWeight = $order->getWeightGross() ?: OrderHelper::totalWeight($order);
if ($order->isWeightInKg()) {
$orderWeightInKg = $totalRealWeight;
$orderWeightInLb = ConversionHelper::convertKgLb((float) $totalRealWeight, ConversionHelper::LB);
// вес заказа в кг, а нужно lb - конвертим
if ($measure === 'ft') {
$totalRealWeight = $orderWeightInLb;
}
} else {
$orderWeightInKg = ConversionHelper::convertKgLb((float) $totalRealWeight, ConversionHelper::KG);
$orderWeightInLb = $totalRealWeight;
// вес заказа в lb, а нужно кг - конвертим
if ($measure === 'm') {
$totalRealWeight = $orderWeightInKg;
}
}
$orders[] = [
'hash' => $order->getHash(),
'number' => $order->getNumber(),
'status' => [
'id' => $order->getStatus(),
'title' => count($items) == 0
? App::trans('order.status.empty')
: ($order->getStatus() < BuyOrderStatusEnum::PARTIALLY_PAID
? App::trans('order.status.draft')
: App::trans('order.status.' . BuyOrderStatusEnum::from($order->getStatus())->getAlias(),
App::getCurLocale(),
[
'%factDate%' => $order->getFactDate()
? $order->getFactDate()->format(
LocaleHelper::dateMask(1, App::getCountryCode())
)
: '',
'%number%' => $order->getRecipientNumber() ?? '-',
]
)
),
],
'date' => $order->getCreateDate()->format('d.m.Y'),
'items' => $items,
'name' => OrderHelper::humanName($order->getName(), $order->getStatus(), $order->getBankTransferRequested()),
'visibleName' => OrderHelper::header($order),
'weightGross' => $totalRealWeight,
'orderWeightInKg' => $orderWeightInKg,
'orderWeightInLb' => $orderWeightInLb,
'fullPrice' => OrderHelper::totalSum($order),
'currency' => LocaleHelper::getCurrency($order->getCurrency()),
];
}
return new JsonResponse($orders);
}
}