src/Controller/OrderController.php line 50

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Certificate;
  4. use App\Entity\HistorySend;
  5. use App\Entity\Order;
  6. use App\Entity\OrderItem;
  7. use App\Entity\LifeCycle;
  8. use App\Enums\ResponseStatusEnum;
  9. use App\Form\OrderSearchType;
  10. use App\Form\OrderType;
  11. use App\Repository\CertificateRepository;
  12. use App\Repository\HistorySendRepository;
  13. use App\Repository\LifeCycleRepository;
  14. use App\Repository\OrderRepository;
  15. use App\Repository\PromoCodesRepository;
  16. use App\Repository\WidgetRepository;
  17. use App\Repository\WidgetUserRepository;
  18. use App\Entity\WidgetUser;
  19. use App\Services\Contracts\OrderServiceInterface;
  20. use App\Services\LogService\CertificateLogService;
  21. use Doctrine\ORM\EntityManagerInterface;
  22. use Error;
  23. use Exception;
  24. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  25. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  26. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  27. use Symfony\Component\HttpFoundation\Request;
  28. use Symfony\Component\HttpFoundation\Response;
  29. use Symfony\Component\Routing\Annotation\Route;
  30. use Symfony\Component\Validator\Constraints\Uuid;
  31. use Symfony\Component\Validator\Validation;
  32. use Symfony\Component\HttpClient\HttpClient;
  33. use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
  34. use Symfony\Component\HttpFoundation\StreamedResponse;
  35. use Throwable;
  36. class OrderController extends AbstractController
  37. {
  38. /**
  39. * @param Request $request
  40. * @param OrderRepository $orderRepository
  41. * @param WidgetUserRepository $userRepository
  42. * @param WidgetRepository $widgetRepository
  43. * @return Response
  44. * @Route("/backend/orders/statistics", name="backend_order_statistics")
  45. * @Security("is_granted('ROLE_CLIENT') or is_granted('ROLE_CALLCENTER') or is_granted('ROLE_MERCHANT') or is_granted('ROLE_MANAGER') or is_granted('ROLE_SUPERADMINISTRATOR')")
  46. */
  47. public function statistics(Request $request, OrderRepository $orderRepository, WidgetUserRepository $userRepository, WidgetRepository $widgetRepository): Response
  48. {
  49. $form = $this->createForm('App\Form\StatisticsSearchType');
  50. $form->handleRequest($request);
  51. if (!$this->isGranted('ROLE_SUPERADMINISTRATOR')) {
  52. $user = $userRepository->find($this->getUser()->getId());
  53. $widgets = $user->getAvailableWidgets();
  54. } else {
  55. $widgets = $widgetRepository->findAll();
  56. }
  57. $createView = $form->createView();
  58. if(!empty($createView->children['Widget'])) {
  59. $keys = [];
  60. foreach ($createView->children['Widget']->vars['choices'] as $key => $choice)
  61. foreach ($widgets as $widget)
  62. if ($widget->getId() == $choice->value)
  63. $keys[] = $key;
  64. foreach ($createView->children['Widget']->vars['choices'] as $key => $row)
  65. if (!in_array($key, $keys))
  66. unset($createView->children['Widget']->vars['choices'][$key]);
  67. }
  68. return $this->render('order/statistics.html.twig', [
  69. 'statistics_search' => $createView,
  70. 'orders' => [],
  71. 'orders_count' => 0,
  72. 'amount_orders' => 0,
  73. 'average_check' => '',
  74. 'sales_count' => 0,
  75. 'get_params' => (!empty($_GET['order_search']['columns'])?$_GET['order_search']['columns']:Order::FIELDS),
  76. 'total' => 0,
  77. 'pages' => 0,
  78. 'widgets' => $createView->children['Widget']->vars['choices'],
  79. 'page' => 0,
  80. 'params' => '&'.preg_replace('/(&page|page)=[0-9]/', '', $request->getQueryString())
  81. ]);
  82. }
  83. /**
  84. * @param Request $request
  85. * @param OrderRepository $orderRepository
  86. * @param WidgetUserRepository $userRepository
  87. * @param CertificateRepository $certificateRepository
  88. * @param WidgetRepository $widgetRepository
  89. * @return Response
  90. * @Security("is_granted('ROLE_CLIENT') or is_granted('ROLE_CALLCENTER') or is_granted('ROLE_MERCHANT') or is_granted('ROLE_MANAGER') or is_granted('ROLE_SUPERADMINISTRATOR')")
  91. */
  92. #[Route('/backend/orders/statistics_data', name: "backend_order_statistics_data", methods: ['GET'])]
  93. public function statisticsData(Request $request, OrderRepository $orderRepository, WidgetUserRepository $userRepository, CertificateRepository $certificateRepository, WidgetRepository $widgetRepository): Response
  94. {
  95. $form = $this->createForm('App\Form\StatisticsSearchType');
  96. $form->handleRequest($request);
  97. $user = $userRepository->find($this->getUser()->getId());
  98. $getData = $form->getData();
  99. $getData['paymentStatus'] = ['succeeded'];
  100. $getData['statistics'] = 1;
  101. $result = [];
  102. if($form->isSubmitted() && $form->isValid()) {
  103. $result = $orderRepository->getListFilteredOrders(
  104. $user,
  105. $getData,
  106. $request->get('page', 1));
  107. }
  108. $daysOrders = [];
  109. $ordersCount = $certificationsCount = $ordersSum = $smsCount = $emailCount = $otherCount = $meCount = 0;
  110. $orderItemIds = [];
  111. foreach($result['items'] as $row){
  112. $orderItemIds[] = $row['id'];
  113. $dataItem = [
  114. 'amount' => $row['amount'],
  115. 'quantity' => $row['quantity'],
  116. 'sum' => $row['amount']*$row['quantity'],
  117. 'recipient_type' => $row['recipientType'],
  118. 'delivery_type' => $row['deliveryType']
  119. ];
  120. $daysOrders['orders'][$row['createdAt']->format('Y-m-d')][] = $dataItem;
  121. $ordersCount++;
  122. $otherCount += ($dataItem['recipient_type'] == 'other')?1:0;
  123. $meCount += ($dataItem['recipient_type'] == 'me')?1:0;
  124. $certificationsCount += $dataItem['quantity'] ?? 0;
  125. $ordersSum += $dataItem['sum'] ?? 0;
  126. $smsCount += (isset($dataItem['delivery_type'][0]) && $dataItem['delivery_type'][0] == 'sms')?1:0;
  127. $emailCount += (isset($dataItem['delivery_type'][0]) && $dataItem['delivery_type'][0] == 'email')?1:0;
  128. }
  129. $amountsCount = [];
  130. $nominals = $certificateRepository->getCountNominalsByOrderItemIds($orderItemIds);
  131. foreach($nominals as $nominal){
  132. $amountsCount[$nominal['nominal']] = $nominal['count'];
  133. }
  134. $averageAmount = ($ordersSum && $ordersCount)?($ordersSum/$ordersCount):0;
  135. $daysOrders['data']=[
  136. 'orders_count' => $ordersCount,
  137. 'certifications_count' => $certificationsCount,
  138. 'orders_sum' => $ordersSum,
  139. 'average_amount' => $averageAmount,
  140. 'other_count' => $otherCount,
  141. 'me_count' => $meCount,
  142. 'sms_count' => $smsCount,
  143. 'email_count' => $emailCount,
  144. 'nominals' => $amountsCount
  145. ];
  146. return $this->json($daysOrders);
  147. }
  148. /**
  149. * @param Request $request
  150. * @param OrderRepository $orderRepository
  151. * @param WidgetUserRepository $userRepository
  152. * @param WidgetRepository $widgetRepository
  153. * @param LifeCycleRepository $lifeCycleRepository
  154. * @param PromoCodesRepository $promoCodesRepository
  155. * @return Response
  156. * @Route("/backend/orders", name="backend_order_index")
  157. * @Security("is_granted('ROLE_CLIENT') or is_granted('ROLE_CALLCENTER') or is_granted('ROLE_MERCHANT') or is_granted('ROLE_MANAGER') or is_granted('ROLE_SUPERADMINISTRATOR')")
  158. */
  159. public function index(Request $request, OrderRepository $orderRepository, WidgetUserRepository $userRepository, WidgetRepository $widgetRepository, LifeCycleRepository $lifeCycleRepository, PromoCodesRepository $promoCodesRepository): Response
  160. {
  161. $user = $userRepository->find($this->getUser()->getId());
  162. if (!$this->isGranted('ROLE_SUPERADMINISTRATOR')) {
  163. $widgets = $user->getAvailableWidgets()->toArray();
  164. } else {
  165. $widgets = $widgetRepository->findAll();
  166. }
  167. $filterWidget = [];
  168. foreach ($widgets as $widget) {
  169. $filterWidget[] = [$widget->getName() => $widget->getId()->toString()];
  170. }
  171. $form = $this->createForm(OrderSearchType::class, null, ['filter_widget' => $filterWidget]);
  172. $form->handleRequest($request);
  173. $user = $userRepository->find($this->getUser()->getId());
  174. $errors = [];
  175. $orderId = $form->get('orderId')->getData();
  176. if (!empty($orderId)) {
  177. $validator = Validation::createValidator();
  178. $uuidConstrain = new Uuid();
  179. $errorUid = $validator->validate($orderId, $uuidConstrain);
  180. if (0 !== count($errorUid)){
  181. $errors['orderId'] = 'Некорректный № заказа Виджета';
  182. $this->addFlash('error', 'Некорректный формат № заказа Виджета');
  183. }
  184. }
  185. if(0 == count($errors) && $form->isSubmitted() && $form->isValid()) {
  186. $data = $form->getData();
  187. if(!empty($data['promoCodeId'])){
  188. $promoCodes = $promoCodesRepository->findBy(['code' => $data['promoCodeId']]);
  189. foreach($promoCodes as $promoCode){
  190. $promoCodeIds[] = $promoCode->getId();
  191. }
  192. $data['promoCodeId'] = $promoCodeIds ?? [0];
  193. } else {
  194. $data['promoCodeId'] = null;
  195. }
  196. $result = $orderRepository->getListFilteredOrders(
  197. $user,
  198. $data,
  199. $request->get('page', 1)
  200. );
  201. } else {
  202. $result = $orderRepository->getListOrdersByUser(
  203. $user,
  204. $request->get('page', 1)
  205. );
  206. }
  207. $createView = $form->createView();
  208. foreach ($result['items'] as &$item) {
  209. $promoCode = $promoCodesRepository->findOneBy(['id' => $item->getPromoCodeId()], ['id' => 'DESC']);
  210. $item->lifeStatusName = $item->getLifeStatus() ? LifeCycle::STATUS_LIFE[$item->getLifeStatus()] : '';
  211. $item->promoCode = !empty($promoCode) ? $promoCode->getCode() : '';
  212. $item->deliveryStatus = isset(
  213. LifeCycle::ORDER_STATUS[$item->getLifeStatus()]
  214. ) ? LifeCycle::ORDER_STATUS[$item->getLifeStatus()] : 'Формируется';
  215. foreach($item->getOrderItems() as $orderItem){
  216. $delayedSending = $orderItem->getTimeToSend()?->format("d.m.Y H:i:s");
  217. $orderItem->delayedSending = $item->getCreatedAt() != $orderItem->getTimeToSend() ? $delayedSending : 'Нет';
  218. }
  219. }
  220. return $this->render('order/report.html.twig', [
  221. 'order_search' => $createView,
  222. 'orders' => $result['items'],
  223. 'get_params' => (!empty($_GET['order_search']['columns'])?$_GET['order_search']['columns']:Order::FIELDS),
  224. 'total' => $result['total'],
  225. 'pages' => $result['pages'],
  226. 'page' => $request->get('page', 1),
  227. 'params' => '&'.preg_replace('/(&page|page)=[0-9]/', '', $request->getQueryString())
  228. ]);
  229. }
  230. /**
  231. * @Route("/backend/orders/csv", name="backend_order_csv")
  232. * @Security("is_granted('ROLE_CLIENT') or is_granted('ROLE_MERCHANT') or is_granted('ROLE_MANAGER') or is_granted('ROLE_SUPERADMINISTRATOR')")
  233. */
  234. public function exportCSV(Request $request, OrderRepository $orderRepository, WidgetUserRepository $userRepository, WidgetRepository $widgetRepository, PromoCodesRepository $promoCodesRepository): Response
  235. {
  236. $user = $userRepository->find($this->getUser()->getId());
  237. if (!$this->isGranted('ROLE_SUPERADMINISTRATOR')) {
  238. $widgets = $user->getAvailableWidgets()->toArray();
  239. } else {
  240. $widgets = $widgetRepository->findAll();
  241. }
  242. $filterWidget = [];
  243. foreach ($widgets as $widget) {
  244. $filterWidget[] = [$widget->getName() => $widget->getId()->toString()];
  245. }
  246. $form = $this->createForm(OrderSearchType::class, null, ['filter_widget' => $filterWidget]);
  247. $form->handleRequest($request);
  248. // Определяем поля для экспорта
  249. $selectedFieldsRaw = $request->query->get('order_search')['columns'] ?? Order::FIELDS;
  250. $fields = array_filter(Order::FIELDS, fn($field) => in_array($field, $selectedFieldsRaw));
  251. // === Собираем ВСЕ заказы без пагинации ===
  252. if ($form->isSubmitted() && $form->isValid()) {
  253. // Обходим пагинацию: используем копию данных, но без page/limit
  254. $fromData = $form->getData();
  255. if($fromData['promoCodeId']){
  256. $promoCodes = $promoCodesRepository->findBy(['code' => $fromData['promoCodeId']]);
  257. $promoCodeIds = [];
  258. foreach($promoCodes as $promoCode){
  259. $promoCodeIds[] = $promoCode->getId();
  260. }
  261. $fromData['promoCodeId'] = $promoCodeIds ?? [0];
  262. }
  263. $allOrders = $this->fetchAllOrders($orderRepository, $user, $fromData);
  264. } else {
  265. $allOrders = $this->fetchAllOrders($orderRepository, $user, null);
  266. }
  267. // Генерация CSV как поток (StreamedResponse) — экономит память
  268. $callback = function () use ($allOrders, $fields) {
  269. $output = fopen('php://output', 'w');
  270. // BOM для Excel
  271. fwrite($output, "\xEF\xBB\xBF");
  272. // === Заголовки ===
  273. $headers = [
  274. 'widgetName' => 'Виджет',
  275. 'createdAt' => 'Дата создания',
  276. 'updatedAt' => 'Дата обновления',
  277. 'recipientType' => 'Кому',
  278. 'deliveryType' => 'Способ Отправки',
  279. 'recipientName' => 'Имя получателя',
  280. 'senderName' => 'Имя отправителя',
  281. 'tiberiumOrderId' => '№ заказа в ПЦ',
  282. 'widgetOrderId' => '№ заказа Виджета',
  283. 'getStatusText' => 'Статус оплаты',
  284. 'delayedSending' => 'Отложенная отправка',
  285. 'senderEmail' => 'Email отправителя',
  286. 'recipientEmail' => 'E-mail/Телефон Получателя',
  287. 'paymentDataId' => 'ID Платежа',
  288. 'quantity' => 'Кол-во',
  289. 'amount' => 'Стоимость руб.',
  290. 'summ' => 'Общая сумма руб.',
  291. 'promoCodeId' => 'Промокод',
  292. 'utmSource' => 'UTM Source',
  293. 'utmContent' => 'UTM Content',
  294. ];
  295. $headerRow = [];
  296. foreach ($fields as $field) {
  297. $headerRow[] = $headers[$field] ?? $field;
  298. }
  299. fprintf($output, chr(0xEF).chr(0xBB).chr(0xBF));
  300. fputcsv($output, $headerRow, ';', '"');
  301. // === Данные ===
  302. foreach ($allOrders as $order) {
  303. foreach ($order->getOrderItems() as $item) {
  304. $row = [];
  305. foreach ($fields as $field) {
  306. $value = $this->getFieldValue($order, $item, $field);
  307. $row[] = $value ?? '';
  308. }
  309. fputcsv($output, $row, ';', '"');
  310. }
  311. }
  312. fclose($output);
  313. };
  314. return new StreamedResponse($callback, 200, [
  315. 'Content-Type' => 'text/csv; charset=UTF-8',
  316. 'Content-Disposition' => 'attachment; filename="orders_' . date('Y-m-d') . '.csv"',
  317. ]);
  318. }
  319. private function fetchAllOrders(OrderRepository $repo, WidgetUser $user, ?array $formData): array
  320. {
  321. if ($formData !== null) {
  322. // Обходим пагинацию: вызываем метод без page
  323. // Но если LIMIT применяется — нужно переделать репо!
  324. // Временное решение: делаем цикл по страницам (не идеально, но работает)
  325. $all = [];
  326. $page = 1;
  327. do {
  328. $result = $repo->getListFilteredOrders($user, $formData, $page);
  329. $all = array_merge($all, $result['items']);
  330. $page++;
  331. } while ($result['items']);
  332. return $all;
  333. } else {
  334. $all = [];
  335. $page = 1;
  336. do {
  337. $result = $repo->getListOrdersByUser($user, $page);
  338. $all = array_merge($all, $result['items']);
  339. $page++;
  340. } while ($result['items']);
  341. return $all;
  342. }
  343. }
  344. private function getFieldValue(Order $order, OrderItem $item, string $field): ?string
  345. {
  346. return match($field) {
  347. 'widgetName' => (string) ($order->getWidget()?->getName() ?? ''),
  348. 'createdAt' => $order->getCreatedAt()->format('Y-m-d H:i:s'),
  349. 'updatedAt' => $order->getUpdatedAt()?->format('Y-m-d H:i:s') ?? '',
  350. 'recipientType' => $item->getRecipientType(),
  351. 'deliveryType' => is_array($item->getDeliveryType())
  352. ? implode(',', $item->getDeliveryType())
  353. : (string) $item->getDeliveryType(),
  354. 'recipientName' => $item->getRecipientName(),
  355. 'senderName' => $item->getSenderName(),
  356. 'tiberiumOrderId' => (string) $item->getTiberiumOrderId() ? "'".$item->getTiberiumOrderId() : '',
  357. 'widgetOrderId' => (string) $order->getId(),
  358. 'getStatusText' => (string) $order->getStatusText(),
  359. 'senderEmail' => $item->getSenderEmail(),
  360. 'recipientEmail' => $item->getRecipientEmail(),
  361. 'paymentDataId' => ($order->getPaymentData()['id'] ?? '') ?: '',
  362. 'quantity' => (string) $item->getQuantity(),
  363. 'amount' => (string) $item->getAmount(),
  364. 'summ' => (string) ($item->getAmount() * $item->getQuantity()),
  365. 'promoCodeId' => $order->getPromoCode()?->getCode() ?? '',
  366. 'utmSource' => $item->getUtmSource(),
  367. 'utmContent' => $item->getUtmContent(),
  368. default => '',
  369. };
  370. }
  371. /**
  372. * @param Request $request
  373. * @param EntityManagerInterface $entityManager
  374. * @param Order|null $order
  375. * @return Response
  376. * @throws TransportExceptionInterface
  377. * @Route("/backend/order/{id}/edit", name="backend_order_edit")
  378. * @Security("is_granted('ROLE_MERCHANT') or is_granted('ROLE_CALLCENTER') or is_granted('ROLE_MANAGER') or is_granted('ROLE_CLIENT')")
  379. */
  380. public function edit(Request $request, EntityManagerInterface $entityManager, Order $order = null): Response
  381. {
  382. if (null === $order) {
  383. return $this->redirectToRoute('backend_order_index');
  384. }
  385. $form = $this->createForm(OrderType::class, $order);
  386. $orderItemsTimeToSend = [];
  387. foreach ($order->getOrderItems() as $orderItem) {
  388. $orderItemsTimeToSend[$orderItem->getTiberiumOrderId()] = $orderItem->getTimeToSend();
  389. }
  390. $form->handleRequest($request);
  391. if ($form->isSubmitted() && $form->isValid()) {
  392. $orderId = $order->getId();
  393. foreach($order->getOrderItems() as $orderItem){
  394. if ($orderItemsTimeToSend[$orderItem->getTiberiumOrderId()] !== $orderItem->getTimeToSend()) {
  395. $orderItemId = $orderItem->getTiberiumOrderId();
  396. $client = HttpClient::create();
  397. $client->request('GET', $_ENV['NOTIFICATION_SERVICE_API_URL'].'/sending/newTime', [
  398. 'query' => [
  399. 'orderId' => $orderId->toString(),
  400. 'orderItemId' => $orderItemId,
  401. ],
  402. 'verify_peer' => false,
  403. 'verify_host' => false,
  404. ]
  405. );
  406. }
  407. }
  408. $entityManager->persist($order);
  409. $entityManager->flush();
  410. return $this->redirectToRoute('backend_order_edit', ['id' => $request->get('id')]);
  411. }
  412. //$certificateGoals = $certificateService->getCertificateGoals($order);
  413. $publicDir = $this->getParameter('aws.site');
  414. return $this->render('order/edit.html.twig', [
  415. 'user' => $this->getUser(),
  416. 'certificateGoals' => [],
  417. 'order_form' => $form->createView(),
  418. 'order' => $order,
  419. 'public' => $publicDir,
  420. 'cover_dir' => '/' . $order->getWidget()->getHashedId() . $this->getParameter('app.cover_dir'),
  421. 'user_files_dir' => $this->getParameter('app.user_files_dir'),
  422. 'notificationService' => $_ENV['NOTIFICATION_SERVICE_API_URL']
  423. ]);
  424. }
  425. /**
  426. * Переотправить сертификаты и отбивки по заказу
  427. *
  428. * @param OrderServiceInterface $orderService
  429. * @param Order|null $order
  430. * @return Response
  431. * @Route("/order/{id}/send", name="order_send")
  432. * @Security("is_granted('ROLE_MANAGER') or is_granted('ROLE_SUPERADMINISTRATOR')")
  433. */
  434. public function send(OrderServiceInterface $orderService, Order $order = null): Response
  435. {
  436. if (!$order) {
  437. $response['status'] = ResponseStatusEnum::error;
  438. $response['data'] = 'OrderNotFound';
  439. $response['message'] = 'OrderNotFound';
  440. return $this->json($response, Response::HTTP_NOT_FOUND);
  441. }
  442. try {
  443. $orderService->reSendCertificatesByOrder($order);
  444. } catch (Throwable|Error $e) {
  445. $response['status'] = ResponseStatusEnum::error;
  446. $response['data'] = 'Resend Certificates Error';
  447. $response['message'] = $e->getMessage();
  448. return $this->json($response, Response::HTTP_UNPROCESSABLE_ENTITY);
  449. }
  450. $response['status'] = ResponseStatusEnum::ok;
  451. $response['data'] = null;
  452. $response['message'] = 'Resend Certificates Success';
  453. return $this->json($response);
  454. }
  455. /**
  456. *
  457. *
  458. * @param Request $request
  459. * @param EntityManagerInterface $entityManager
  460. * @param Order|null $order
  461. * @return Response
  462. * @Route("/order/{id}/remove", name="order_remove")
  463. * @Security("is_granted('ROLE_MANAGER') or is_granted('ROLE_SUPERADMINISTRATOR')")
  464. */
  465. public function remove(OrderServiceInterface $orderService, Request $request, EntityManagerInterface $entityManager, Order $order = null): Response
  466. {
  467. $removeOrderItemId = $request->query->get('order_item_id');
  468. try {
  469. $orderItems = $order->getOrderItems();
  470. $orderService->removeOrderItem($entityManager, $orderItems, $removeOrderItemId);
  471. } catch (Throwable|Error $e) {
  472. $response['status'] = ResponseStatusEnum::error;
  473. $response['data'] = 'Remove orderItem Error';
  474. $response['message'] = $e->getMessage();
  475. return $this->json($response, Response::HTTP_UNPROCESSABLE_ENTITY);
  476. }
  477. $response['status'] = ResponseStatusEnum::ok;
  478. $response['data'] = null;
  479. $response['message'] = 'Remove orderItem Success';
  480. return $this->json($response);
  481. }
  482. /**
  483. * @param Request $request
  484. * @param HistorySendRepository $historySendRepository
  485. * @return Response
  486. * @Route("/backend/order/{id}/history", name="backend_order_history_send")
  487. * @IsGranted("ROLE_SUPERADMINISTRATOR")
  488. */
  489. public function history(Request $request, HistorySendRepository $historySendRepository): Response
  490. {
  491. $result = $historySendRepository->findBy(['order' => $request->get('id')]);
  492. return $this->render('order/history.html.twig', ['history' => $result]);
  493. }
  494. /**
  495. * @Route("/orderItem/{id}/receipt", name="order_get_receipt")
  496. * @Security("is_granted('ROLE_MANAGER') or is_granted('ROLE_SUPERADMINISTRATOR')")
  497. */
  498. public function getOrderReceipt(OrderItem $orderItem, OrderServiceInterface $orderService): Response
  499. {
  500. try {
  501. $receipt = $orderService->getReceiptLinkByOrderItem($orderItem);
  502. } catch (Exception|Error $e) {
  503. $error = $e->getMessage();
  504. }
  505. return $this->render('order/receipt.html.twig', [
  506. 'orderItem' => $orderItem,
  507. 'error' => $error ?? null,
  508. 'receipt' => $receipt ?? null,
  509. ]);
  510. }
  511. /**
  512. * Пересоздать заказ поставщику (ПЦ)
  513. *
  514. * @Route("/order/{id}/reorder", name="order_reorder")
  515. * @Security("is_granted('ROLE_MANAGER') or is_granted('ROLE_SUPERADMINISTRATOR')")
  516. */
  517. public function reSendOrderToVendor(OrderServiceInterface $orderService, Order $order = null): Response
  518. {
  519. if (!$order) {
  520. $response['status'] = ResponseStatusEnum::error;
  521. $response['data'] = 'OrderNotFound';
  522. $response['message'] = 'OrderNotFound';
  523. return $this->json($response, Response::HTTP_NOT_FOUND);
  524. }
  525. try {
  526. $orderService->reSendOrderToVendor($order);
  527. } catch (Throwable|Error $e) {
  528. $response['status'] = ResponseStatusEnum::error;
  529. $response['data'] = 'Reorder Error';
  530. $response['message'] = $e->getMessage();
  531. return $this->json($response, Response::HTTP_UNPROCESSABLE_ENTITY);
  532. }
  533. $response['status'] = ResponseStatusEnum::ok;
  534. $response['data'] = null;
  535. $response['message'] = 'Reorder Success';
  536. return $this->json($response);
  537. }
  538. /**
  539. * Пересоздать заказ поставщику (ПЦ)
  540. *
  541. * @Route("/order/{id}/status", name="order_status")
  542. * @Security("is_granted('ROLE_SUPERADMINISTRATOR')")
  543. */
  544. public function reStatusOrderFromVendor(OrderServiceInterface $orderService, Order $order = null): Response
  545. {
  546. if (!$order) {
  547. $response['status'] = ResponseStatusEnum::error;
  548. $response['data'] = 'OrderNotFound';
  549. $response['message'] = 'OrderNotFound';
  550. return $this->json($response, Response::HTTP_NOT_FOUND);
  551. }
  552. try {
  553. $orderService->reStatusOrderFromVendor($order);
  554. } catch (Throwable|Error $e) {
  555. $response['status'] = ResponseStatusEnum::error;
  556. $response['data'] = 'Reorder Error';
  557. $response['message'] = $e->getMessage();
  558. return $this->json($response, Response::HTTP_UNPROCESSABLE_ENTITY);
  559. }
  560. $response['status'] = ResponseStatusEnum::ok;
  561. $response['data'] = null;
  562. $response['message'] = 'Reorder Success';
  563. return $this->json($response);
  564. }
  565. }