src/Controller/OrderController.php line 41

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Order;
  4. use App\Entity\OrderItem;
  5. use App\Enums\ResponseStatusEnum;
  6. use App\Form\OrderSearchType;
  7. use App\Form\OrderType;
  8. use App\Repository\CertificateRepository;
  9. use App\Repository\HistorySendRepository;
  10. use App\Repository\OrderRepository;
  11. use App\Repository\WidgetRepository;
  12. use App\Repository\WidgetUserRepository;
  13. use App\Services\Contracts\OrderServiceInterface;
  14. use App\Services\LogService\CertificateLogService;
  15. use Doctrine\ORM\EntityManagerInterface;
  16. use Error;
  17. use Exception;
  18. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  19. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  20. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  21. use Symfony\Component\HttpFoundation\Request;
  22. use Symfony\Component\HttpFoundation\Response;
  23. use Symfony\Component\Routing\Annotation\Route;
  24. use Symfony\Component\Validator\Constraints\Uuid;
  25. use Symfony\Component\Validator\Validation;
  26. use Throwable;
  27. class OrderController extends AbstractController
  28. {
  29. /**
  30. * @param Request $request
  31. * @param OrderRepository $orderRepository
  32. * @param WidgetUserRepository $userRepository
  33. * @param WidgetRepository $widgetRepository
  34. * @return Response
  35. * @Route("/backend/orders/statistics", name="backend_order_statistics")
  36. * @Security("is_granted('ROLE_CLIENT') or is_granted('ROLE_MERCHANT') or is_granted('ROLE_MANAGER') or is_granted('ROLE_SUPERADMINISTRATOR')")
  37. */
  38. public function statistics(Request $request, OrderRepository $orderRepository, WidgetUserRepository $userRepository, WidgetRepository $widgetRepository): Response
  39. {
  40. $form = $this->createForm('App\Form\StatisticsSearchType');
  41. $form->handleRequest($request);
  42. if (!$this->isGranted('ROLE_SUPERADMINISTRATOR')) {
  43. $user = $userRepository->find($this->getUser()->getId());
  44. $widgets = $user->getAvailableWidgets();
  45. } else {
  46. $widgets = $widgetRepository->findAll();
  47. }
  48. $createView = $form->createView();
  49. if(!empty($createView->children['Widget'])) {
  50. $keys = [];
  51. foreach ($createView->children['Widget']->vars['choices'] as $key => $choice)
  52. foreach ($widgets as $widget)
  53. if ($widget->getId() == $choice->value)
  54. $keys[] = $key;
  55. foreach ($createView->children['Widget']->vars['choices'] as $key => $row)
  56. if (!in_array($key, $keys))
  57. unset($createView->children['Widget']->vars['choices'][$key]);
  58. }
  59. return $this->render('order/statistics.html.twig', [
  60. 'statistics_search' => $createView,
  61. 'orders' => [],
  62. 'orders_count' => 0,
  63. 'amount_orders' => 0,
  64. 'average_check' => '',
  65. 'sales_count' => 0,
  66. 'get_params' => (!empty($_GET['order_search']['columns'])?$_GET['order_search']['columns']:Order::FIELDS),
  67. 'total' => 0,
  68. 'pages' => 0,
  69. 'widgets' => $createView->children['Widget']->vars['choices'],
  70. 'page' => 0,
  71. 'params' => '&'.preg_replace('/(&page|page)=[0-9]/', '', $request->getQueryString())
  72. ]);
  73. }
  74. /**
  75. * @param Request $request
  76. * @param OrderRepository $orderRepository
  77. * @param WidgetUserRepository $userRepository
  78. * @param CertificateRepository $certificateRepository
  79. * @param WidgetRepository $widgetRepository
  80. * @return Response
  81. * @Security("is_granted('ROLE_CLIENT') or is_granted('ROLE_MERCHANT') or is_granted('ROLE_MANAGER') or is_granted('ROLE_SUPERADMINISTRATOR')")
  82. */
  83. #[Route('/backend/orders/statistics_data', name: "backend_order_statistics_data", methods: ['GET'])]
  84. public function statisticsData(Request $request, OrderRepository $orderRepository, WidgetUserRepository $userRepository, CertificateRepository $certificateRepository, WidgetRepository $widgetRepository): Response
  85. {
  86. $form = $this->createForm('App\Form\StatisticsSearchType');
  87. $form->handleRequest($request);
  88. $user = $userRepository->find($this->getUser()->getId());
  89. $getData = $form->getData();
  90. $getData['paymentStatus'] = ['succeeded'];
  91. $getData['statistics'] = 1;
  92. $result = [];
  93. if($form->isSubmitted() && $form->isValid()) {
  94. $result = $orderRepository->getListFilteredOrders(
  95. $user,
  96. $getData,
  97. $request->get('page', 1));
  98. }
  99. $daysOrders = [];
  100. $ordersCount = $certificationsCount = $ordersSum = $smsCount = $emailCount = $otherCount = $meCount = 0;
  101. $orderItemIds = [];
  102. foreach($result['items'] as $row){
  103. $orderItemIds[] = $row['id'];
  104. $dataItem = [
  105. 'amount' => $row['amount'],
  106. 'quantity' => $row['quantity'],
  107. 'sum' => $row['amount']*$row['quantity'],
  108. 'recipient_type' => $row['recipientType'],
  109. 'delivery_type' => $row['deliveryType']
  110. ];
  111. $daysOrders['orders'][$row['createdAt']->format('Y-m-d')][] = $dataItem;
  112. $ordersCount++;
  113. $otherCount += ($dataItem['recipient_type'] == 'other')?1:0;
  114. $meCount += ($dataItem['recipient_type'] == 'me')?1:0;
  115. $certificationsCount += $dataItem['quantity'] ?? 0;
  116. $ordersSum += $dataItem['sum'] ?? 0;
  117. $smsCount += (isset($dataItem['delivery_type'][0]) && $dataItem['delivery_type'][0] == 'sms')?1:0;
  118. $emailCount += (isset($dataItem['delivery_type'][0]) && $dataItem['delivery_type'][0] == 'email')?1:0;
  119. }
  120. $amountsCount = [];
  121. $nominals = $certificateRepository->getCountNominalsByOrderItemIds($orderItemIds);
  122. foreach($nominals as $nominal){
  123. $amountsCount[$nominal['nominal']] = $nominal['count'];
  124. }
  125. $averageAmount = ($ordersSum && $ordersCount)?($ordersSum/$ordersCount):0;
  126. $daysOrders['data']=[
  127. 'orders_count' => $ordersCount,
  128. 'certifications_count' => $certificationsCount,
  129. 'orders_sum' => $ordersSum,
  130. 'average_amount' => $averageAmount,
  131. 'other_count' => $otherCount,
  132. 'me_count' => $meCount,
  133. 'sms_count' => $smsCount,
  134. 'email_count' => $emailCount,
  135. 'nominals' => $amountsCount
  136. ];
  137. return $this->json($daysOrders);
  138. }
  139. /**
  140. * @param Request $request
  141. * @param OrderRepository $orderRepository
  142. * @param WidgetUserRepository $userRepository
  143. * @param WidgetRepository $widgetRepository
  144. * @return Response
  145. * @Route("/backend/orders", name="backend_order_index")
  146. * @Security("is_granted('ROLE_CLIENT') or is_granted('ROLE_MERCHANT') or is_granted('ROLE_MANAGER') or is_granted('ROLE_SUPERADMINISTRATOR')")
  147. */
  148. public function index(Request $request, OrderRepository $orderRepository, WidgetUserRepository $userRepository, WidgetRepository $widgetRepository): Response
  149. {
  150. $form = $this->createForm(OrderSearchType::class);
  151. $form->handleRequest($request);
  152. $user = $userRepository->find($this->getUser()->getId());
  153. $errors = [];
  154. $orderId = $form->get('orderId')->getData();
  155. if (!empty($orderId)) {
  156. $validator = Validation::createValidator();
  157. $uuidConstrain = new Uuid();
  158. $errorUid = $validator->validate($orderId, $uuidConstrain);
  159. if (0 !== count($errorUid)){
  160. $errors['orderId'] = 'Некорректный № заказа Виджета';
  161. $this->addFlash('error', 'Некорректный формат № заказа Виджета');
  162. }
  163. }
  164. if(0 == count($errors) && $form->isSubmitted() && $form->isValid()) {
  165. $result = $orderRepository->getListFilteredOrders(
  166. $user,
  167. $form->getData(),
  168. $request->get('page', 1));
  169. } else {
  170. $result = $orderRepository->getListOrdersByUser(
  171. $user,
  172. $request->get('page', 1)
  173. );
  174. }
  175. if (!$this->isGranted('ROLE_SUPERADMINISTRATOR')) {
  176. $user = $userRepository->find($this->getUser()->getId());
  177. $widgets = $user->getAvailableWidgets();
  178. } else {
  179. $widgets = $widgetRepository->findAll();
  180. }
  181. $createView = $form->createView();
  182. if(!empty($createView->children['Widget'])) {
  183. $keys = [];
  184. foreach ($createView->children['Widget']->vars['choices'] as $key => $choice)
  185. foreach ($widgets as $widget)
  186. if ($widget->getId() == $choice->value)
  187. $keys[] = $key;
  188. foreach ($createView->children['Widget']->vars['choices'] as $key => $row)
  189. if (!in_array($key, $keys))
  190. unset($createView->children['Widget']->vars['choices'][$key]);
  191. }
  192. return $this->render('order/report.html.twig', [
  193. 'order_search' => $createView,
  194. 'orders' => $result['items'],
  195. 'get_params' => (!empty($_GET['order_search']['columns'])?$_GET['order_search']['columns']:Order::FIELDS),
  196. 'total' => $result['total'],
  197. 'pages' => $result['pages'],
  198. 'page' => $request->get('page', 1),
  199. 'params' => '&'.preg_replace('/(&page|page)=[0-9]/', '', $request->getQueryString())
  200. ]);
  201. }
  202. /**
  203. * @param Request $request
  204. * @param OrderRepository $orderRepository
  205. * @param WidgetUserRepository $userRepository
  206. * @param WidgetRepository $widgetRepository
  207. * @return Response
  208. * @Route("/backend/orders/csv", name="backend_order_csv")
  209. * @Security("is_granted('ROLE_CLIENT') or is_granted('ROLE_MERCHANT') or is_granted('ROLE_MANAGER') or is_granted('ROLE_SUPERADMINISTRATOR')")
  210. */
  211. public function exportCSV(Request $request, OrderRepository $orderRepository, WidgetUserRepository $userRepository, WidgetRepository $widgetRepository): Response
  212. {
  213. $form = $this->createForm(OrderSearchType::class);
  214. $form->handleRequest($request);
  215. $user = $userRepository->find($this->getUser()->getId());
  216. $pages = 1;
  217. $items = [];
  218. $fields_GET = (!empty($_GET['order_search']['columns'])?$_GET['order_search']['columns']:Order::FIELDS);
  219. foreach(Order::FIELDS as $key => $row){
  220. if(in_array($row, $fields_GET))
  221. $fields[$key] = $row;
  222. }
  223. $i=0;
  224. for ($page = 1; $page <= $pages; $page++) {
  225. if ($form->isSubmitted() && $form->isValid()) {
  226. $result = $orderRepository->getListFilteredOrders(
  227. $user,
  228. $form->getData(),
  229. $request->get('page', $page));
  230. } else {
  231. $result = $orderRepository->getListOrdersByUser(
  232. $user,
  233. $request->get('page', $page)
  234. );
  235. }
  236. $pages = $result['pages'];
  237. if(empty($result['items'])) continue;
  238. /** @var Order $order */
  239. foreach($result['items'] as $order){
  240. foreach($order->getOrderItems() as $item){
  241. foreach($fields as $field){
  242. switch ($field){
  243. case 'widgetName':
  244. $items[$i][$field] = (string) $order->getWidget()->getName();
  245. break;
  246. case 'createdAt':
  247. $items[$i][$field] = $order->getCreatedAt()->format('Y-m-d H:i:s');
  248. break;
  249. case 'updatedAt':
  250. $items[$i][$field] = $order->getUpdatedAt()->format('Y-m-d H:i:s');
  251. break;
  252. case 'recipientType':
  253. $items[$i][$field] = $item->getRecipientType();
  254. break;
  255. case 'deliveryType':
  256. $items[$i][$field] = implode(',', $item->getDeliveryType());
  257. break;
  258. case 'recipientName':
  259. $items[$i][$field] = $item->getRecipientName();
  260. break;
  261. case 'senderName':
  262. $items[$i][$field] = $item->getSenderName();
  263. break;
  264. case 'tiberiumOrderId':
  265. $items[$i][$field] = $item->getTiberiumOrderId();
  266. break;
  267. case 'widgetOrderId':
  268. $items[$i][$field] = $order->getId();
  269. break;
  270. case 'getStatusText':
  271. $items[$i][$field] = $order->getStatusText();
  272. break;
  273. case 'senderEmail':
  274. $items[$i][$field] = $item->getSenderEmail();
  275. break;
  276. case 'recipientEmail':
  277. $items[$i][$field] = $item->getRecipientEmail();
  278. break;
  279. case 'paymentDataId':
  280. $items[$i][$field] = !empty($order->getPaymentData()['id'])?$order->getPaymentData()['id']:'';
  281. break;
  282. case 'quantity':
  283. $items[$i][$field] = $item->getQuantity();
  284. break;
  285. case 'amount':
  286. $items[$i][$field] = $item->getAmount();
  287. break;
  288. case 'summ':
  289. $items[$i][$field] = $item->getAmount()*$item->getQuantity();
  290. break;
  291. }
  292. }
  293. $i++;
  294. }
  295. }
  296. }
  297. $fields = array_flip($fields);
  298. array_unshift($items , $fields);
  299. $fp = fopen('php://temp', 'w');
  300. foreach ($items as $row) {
  301. fputcsv($fp, $row, ';');
  302. }
  303. rewind($fp);
  304. $response = new Response(chr(0xEF).chr(0xBB).chr(0xBF).stream_get_contents($fp));
  305. fclose($fp);
  306. $response->headers->set('Content-Encoding', 'UTF-8');
  307. $response->headers->set('Content-Type', 'application/csv; charset=UTF-8');
  308. $response->headers->set('Content-Disposition', 'attachment; filename="orders_'.date('Y-m-d').'.csv"');
  309. return $response;
  310. }
  311. /**
  312. * @param Request $request
  313. * @param EntityManagerInterface $entityManager
  314. * @param CertificateLogService $certificateService
  315. * @param Order|null $order
  316. * @return Response
  317. * @Route("/backend/order/{id}/edit", name="backend_order_edit")
  318. * @Security("is_granted('ROLE_MERCHANT') or is_granted('ROLE_MANAGER') or is_granted('ROLE_CLIENT')")
  319. */
  320. public function edit(Request $request, EntityManagerInterface $entityManager, CertificateLogService $certificateService, Order $order = null): Response
  321. {
  322. if(null === $order) {
  323. return $this->redirectToRoute('backend_order_index');
  324. }
  325. $form = $this->createForm(OrderType::class, $order);
  326. $form->handleRequest($request);
  327. if($form->isSubmitted() && $form->isValid()) {
  328. $entityManager->persist($order);
  329. $entityManager->flush();
  330. return $this->redirectToRoute('backend_order_edit', ['id' => $request->get('id')]);
  331. }
  332. $certificateGoals = $certificateService->getCertificateGoals($order);
  333. $publicDir = $this->getParameter('aws.site');
  334. return $this->render('order/edit.html.twig', [
  335. 'certificateGoals' => $certificateGoals,
  336. 'order_form' => $form->createView(),
  337. 'order' => $order,
  338. 'public' => $publicDir,
  339. 'cover_dir' => '/' . $order->getWidget()->getHashedId() . $this->getParameter('app.cover_dir'),
  340. 'user_files_dir' => $this->getParameter('app.user_files_dir')
  341. ]);
  342. }
  343. /**
  344. * Переотправить сертификаты и отбивки по заказу
  345. *
  346. * @param OrderServiceInterface $orderService
  347. * @param Order|null $order
  348. * @return Response
  349. * @Route("/order/{id}/send", name="order_send")
  350. * @Security("is_granted('ROLE_MANAGER') or is_granted('ROLE_SUPERADMINISTRATOR')")
  351. */
  352. public function send(OrderServiceInterface $orderService, Order $order = null): Response
  353. {
  354. if (!$order) {
  355. $response['status'] = ResponseStatusEnum::error;
  356. $response['data'] = 'OrderNotFound';
  357. $response['message'] = 'OrderNotFound';
  358. return $this->json($response, Response::HTTP_NOT_FOUND);
  359. }
  360. try {
  361. $orderService->reSendCertificatesByOrder($order);
  362. } catch (Throwable|Error $e) {
  363. $response['status'] = ResponseStatusEnum::error;
  364. $response['data'] = 'Resend Certificates Error';
  365. $response['message'] = $e->getMessage();
  366. return $this->json($response, Response::HTTP_UNPROCESSABLE_ENTITY);
  367. }
  368. $response['status'] = ResponseStatusEnum::ok;
  369. $response['data'] = null;
  370. $response['message'] = 'Resend Certificates Success';
  371. return $this->json($response);
  372. }
  373. /**
  374. * @param Request $request
  375. * @param HistorySendRepository $historySendRepository
  376. * @return Response
  377. * @Route("/backend/order/{id}/history", name="backend_order_history_send")
  378. * @IsGranted("ROLE_SUPERADMINISTRATOR")
  379. */
  380. public function history(Request $request, HistorySendRepository $historySendRepository): Response
  381. {
  382. $result = $historySendRepository->findBy(['order' => $request->get('id')]);
  383. return $this->render('order/history.html.twig', ['history' => $result]);
  384. }
  385. /**
  386. * @Route("/orderItem/{id}/receipt", name="order_get_receipt")
  387. * @Security("is_granted('ROLE_MANAGER') or is_granted('ROLE_SUPERADMINISTRATOR')")
  388. */
  389. public function getOrderReceipt(OrderItem $orderItem, OrderServiceInterface $orderService): Response
  390. {
  391. try {
  392. $receipt = $orderService->getReceiptLinkByOrderItem($orderItem);
  393. } catch (Exception|Error $e) {
  394. $error = $e->getMessage();
  395. }
  396. return $this->render('order/receipt.html.twig', [
  397. 'orderItem' => $orderItem,
  398. 'error' => $error ?? null,
  399. 'receipt' => $receipt ?? null,
  400. ]);
  401. }
  402. /**
  403. * Пересоздать заказ поставщику (ПЦ)
  404. *
  405. * @Route("/order/{id}/reorder", name="order_reorder")
  406. * @Security("is_granted('ROLE_MANAGER') or is_granted('ROLE_SUPERADMINISTRATOR')")
  407. */
  408. public function reSendOrderToVendor(OrderServiceInterface $orderService, Order $order = null): Response
  409. {
  410. if (!$order) {
  411. $response['status'] = ResponseStatusEnum::error;
  412. $response['data'] = 'OrderNotFound';
  413. $response['message'] = 'OrderNotFound';
  414. return $this->json($response, Response::HTTP_NOT_FOUND);
  415. }
  416. try {
  417. $orderService->reSendOrderToVendor($order);
  418. } catch (Throwable|Error $e) {
  419. $response['status'] = ResponseStatusEnum::error;
  420. $response['data'] = 'Reorder Error';
  421. $response['message'] = $e->getMessage();
  422. return $this->json($response, Response::HTTP_UNPROCESSABLE_ENTITY);
  423. }
  424. $response['status'] = ResponseStatusEnum::ok;
  425. $response['data'] = null;
  426. $response['message'] = 'Reorder Success';
  427. return $this->json($response);
  428. }
  429. }