src/Controller/OrderController.php line 34

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Order;
  4. use App\Entity\WidgetUser;
  5. use App\Form\OrderSearchType;
  6. use App\Form\OrderType;
  7. use App\Message\GetCertificatesMessage;
  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\LogService\CertificateLogService;
  14. use Doctrine\ORM\EntityManagerInterface;
  15. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  16. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  17. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  18. use Symfony\Component\HttpFoundation\Request;
  19. use Symfony\Component\HttpFoundation\Response;
  20. use Symfony\Component\Messenger\MessageBusInterface;
  21. use Symfony\Component\Routing\Annotation\Route;
  22. use Symfony\Component\Validator\Validation;
  23. class OrderController extends AbstractController
  24. {
  25.     /**
  26.      * @param Request $request
  27.      * @return Response
  28.      * @Route("/backend/orders/statistics", name="backend_order_statistics")
  29.      * @Security("is_granted('ROLE_CLIENT') or is_granted('ROLE_MERCHANT') or is_granted('ROLE_MANAGER') or is_granted('ROLE_SUPERADMINISTRATOR')")
  30.      */
  31.     public function statistics(Request $requestOrderRepository $orderRepositoryWidgetUserRepository $userRepositoryWidgetRepository $widgetRepository): Response
  32.     {
  33.         $form $this->createForm('App\Form\StatisticsSearchType');
  34.         $form->handleRequest($request);
  35.         if (!$this->isGranted('ROLE_SUPERADMINISTRATOR')) {
  36.             $user $userRepository->find($this->getUser()->getId());
  37.             $widgets $user->getAvailableWidgets();
  38.         } else {
  39.             $widgets $widgetRepository->findAll();
  40.         }
  41.         $createView $form->createView();
  42.         if(!empty($createView->children['Widget'])) {
  43.             $keys = [];
  44.             foreach ($createView->children['Widget']->vars['choices'] as $key => $choice)
  45.                 foreach ($widgets as $widget)
  46.                     if ($widget->getId() == $choice->value)
  47.                         $keys[] = $key;
  48.             foreach ($createView->children['Widget']->vars['choices'] as $key => $row)
  49.                 if (!in_array($key$keys))
  50.                     unset($createView->children['Widget']->vars['choices'][$key]);
  51.         }
  52.         return $this->render('order/statistics.html.twig', [
  53.             'statistics_search' => $createView,
  54.             'orders' => [],
  55.             'orders_count' => 0,
  56.             'amount_orders' => 0,
  57.             'average_check' => '',
  58.             'sales_count' => 0,
  59.             'get_params' => (!empty($_GET['order_search']['columns'])?$_GET['order_search']['columns']:Order::FIELDS),
  60.             'total' => 0,
  61.             'pages' => 0,
  62.             'widgets' => $createView->children['Widget']->vars['choices'],
  63.             'page' => 0,
  64.             'params' => '&'.preg_replace('/(&page|page)=[0-9]/'''$request->getQueryString())
  65.         ]);
  66.     }
  67.     /**
  68.      * @param Request $request
  69.      * @return Response
  70.      * @Security("is_granted('ROLE_CLIENT') or is_granted('ROLE_MERCHANT') or is_granted('ROLE_MANAGER') or is_granted('ROLE_SUPERADMINISTRATOR')")
  71.      */
  72.     #[Route('/backend/orders/statistics_data'name"backend_order_statistics_data"methods: ['GET'])]
  73.     public function statisticsData(Request $requestOrderRepository $orderRepositoryWidgetUserRepository $userRepositoryCertificateRepository $certificateRepositoryWidgetRepository $widgetRepository): Response
  74.     {
  75.         $form $this->createForm('App\Form\StatisticsSearchType');
  76.         $form->handleRequest($request);
  77.         $user $userRepository->find($this->getUser()->getId());
  78.         $getData $form->getData();
  79.         $getData['paymentStatus'] = ['succeeded'];
  80.         $getData['statistics'] = 1;
  81.         $result = [];
  82.         if($form->isSubmitted() && $form->isValid()) {
  83.             $result $orderRepository->getListFilteredOrders(
  84.                 $user,
  85.                 $getData,
  86.                 $request->get('page'1));
  87.         }
  88.         $daysOrders = [];
  89.         $ordersCount $certificationsCount $ordersSum $smsCount $emailCount $otherCount $meCount 0;
  90.         $orderItemIds = [];
  91.         foreach($result['items'] as $row){
  92.             $orderItemIds[] = $row['id'];
  93.             $dataItem = [
  94.                 'amount' => $row['amount'],
  95.                 'quantity' => $row['quantity'],
  96.                 'sum' =>  $row['amount']*$row['quantity'],
  97.                 'recipient_type' => $row['recipientType'],
  98.                 'delivery_type' => $row['deliveryType']
  99.                 ];
  100.             $daysOrders['orders'][$row['createdAt']->format('Y-m-d')][] = $dataItem;
  101.             $ordersCount++;
  102.             $otherCount += ($dataItem['recipient_type'] == 'other')?1:0;
  103.             $meCount += ($dataItem['recipient_type'] == 'me')?1:0;
  104.             $certificationsCount += $dataItem['quantity'] ?? 0;
  105.             $ordersSum += $dataItem['sum'] ?? 0;
  106.             $smsCount += (isset($dataItem['delivery_type'][0]) && $dataItem['delivery_type'][0] == 'sms')?1:0;
  107.             $emailCount += (isset($dataItem['delivery_type'][0]) && $dataItem['delivery_type'][0] == 'email')?1:0;
  108.         }
  109.         $amountsCount = [];
  110.         $nominals $certificateRepository->getCountNominalsByOrderItemIds($orderItemIds);
  111.         foreach($nominals as $nominal){
  112.             $amountsCount[$nominal['nominal']] = $nominal['count'];
  113.         }
  114.         $averageAmount = ($ordersSum && $ordersCount)?($ordersSum/$ordersCount):0;
  115.         $daysOrders['data']=[
  116.             'orders_count' => $ordersCount,
  117.             'certifications_count' => $certificationsCount,
  118.             'orders_sum' => $ordersSum,
  119.             'average_amount' => $averageAmount,
  120.             'other_count' => $otherCount,
  121.             'me_count' => $meCount,
  122.             'sms_count' => $smsCount,
  123.             'email_count' => $emailCount,
  124.             'nominals' => $amountsCount
  125.         ];
  126.         return $this->json($daysOrders);
  127.     }
  128.     /**
  129.      * @param Request $request
  130.      * @return Response
  131.      * @Route("/backend/orders", name="backend_order_index")
  132.      * @Security("is_granted('ROLE_CLIENT') or is_granted('ROLE_MERCHANT') or is_granted('ROLE_MANAGER') or is_granted('ROLE_SUPERADMINISTRATOR')")
  133.      */
  134.     public function index(Request $requestOrderRepository $orderRepositoryWidgetUserRepository $userRepositoryWidgetRepository $widgetRepository): Response
  135.     {
  136.         $form $this->createForm(OrderSearchType::class);
  137.         $form->handleRequest($request);
  138.         $user $userRepository->find($this->getUser()->getId());
  139.         $errors = [];
  140.         $orderId $form->get('orderId')->getData();
  141.         if (!empty($orderId)) {
  142.             $validator Validation::createValidator();
  143.             $uuidConstrain = new \Symfony\Component\Validator\Constraints\Uuid();
  144.             $errorUid $validator->validate($orderId$uuidConstrain);
  145.             if (!== count($errorUid)){
  146.                 $errors['orderId'] = 'Некорректный № заказа Виджета';
  147.                 $this->addFlash('error''Некорректный формат № заказа Виджета');
  148.             }
  149.         }
  150.         if(== count($errors) && $form->isSubmitted() && $form->isValid()) {
  151.             $result $orderRepository->getListFilteredOrders(
  152.                 $user,
  153.                 $form->getData(),
  154.                 $request->get('page'1));
  155.         } else {
  156.             $result $orderRepository->getListOrdersByUser(
  157.                 $user,
  158.                 $request->get('page'1)
  159.             );
  160.         }
  161.         if (!$this->isGranted('ROLE_SUPERADMINISTRATOR')) {
  162.             $user $userRepository->find($this->getUser()->getId());
  163.             $widgets $user->getAvailableWidgets();
  164.         } else {
  165.             $widgets $widgetRepository->findAll();
  166.         }
  167.         $createView $form->createView();
  168.         if(!empty($createView->children['Widget'])) {
  169.             $keys = [];
  170.             foreach ($createView->children['Widget']->vars['choices'] as $key => $choice)
  171.                 foreach ($widgets as $widget)
  172.                     if ($widget->getId() == $choice->value)
  173.                         $keys[] = $key;
  174.             foreach ($createView->children['Widget']->vars['choices'] as $key => $row)
  175.                 if (!in_array($key$keys))
  176.                     unset($createView->children['Widget']->vars['choices'][$key]);
  177.         }
  178.         return $this->render('order/report.html.twig', [
  179.             'order_search' => $createView,
  180.             'orders' => $result['items'],
  181.             'get_params' => (!empty($_GET['order_search']['columns'])?$_GET['order_search']['columns']:Order::FIELDS),
  182.             'total' => $result['total'],
  183.             'pages' => $result['pages'],
  184.             'page' => $request->get('page'1),
  185.             'params' => '&'.preg_replace('/(&page|page)=[0-9]/'''$request->getQueryString())
  186.         ]);
  187.     }
  188.     /**
  189.      * @param Request $request
  190.      * @return Response
  191.      * @Route("/backend/orders/csv", name="backend_order_csv")
  192.      * @Security("is_granted('ROLE_CLIENT') or is_granted('ROLE_MERCHANT') or is_granted('ROLE_MANAGER') or is_granted('ROLE_SUPERADMINISTRATOR')")
  193.      */
  194.     public function exportCSV(Request $requestOrderRepository $orderRepositoryWidgetUserRepository $userRepositoryWidgetRepository $widgetRepository): Response
  195.     {
  196.         $form $this->createForm(OrderSearchType::class);
  197.         $form->handleRequest($request);
  198.         $user $userRepository->find($this->getUser()->getId());
  199.         $pages 1;
  200.         $items = [];
  201.         $fields_GET = (!empty($_GET['order_search']['columns'])?$_GET['order_search']['columns']:Order::FIELDS);
  202.         foreach(Order::FIELDS as $key => $row){
  203.             if(in_array($row$fields_GET))
  204.                 $fields[$key] = $row;
  205.         }
  206.         $i=0;
  207.         for ($page 1$page <= $pages$page++) {
  208.             if ($form->isSubmitted() && $form->isValid()) {
  209.                 $result $orderRepository->getListFilteredOrders(
  210.                     $user,
  211.                     $form->getData(),
  212.                     $request->get('page'$page));
  213.             } else {
  214.                 $result $orderRepository->getListOrdersByUser(
  215.                     $user,
  216.                     $request->get('page'$page)
  217.                 );
  218.             }
  219.             $pages $result['pages'];
  220.             if(empty($result['items'])) continue;
  221.             /** @var Order $order */
  222.             foreach($result['items'] as $order){
  223.                 foreach($order->getOrderItems() as $item){
  224.                     foreach($fields as $field){
  225.                         switch ($field){
  226.                             case 'widgetName':
  227.                                 $items[$i][$field] = (string) $order->getWidget()->getName();
  228.                                 break;
  229.                             case 'createdAt':
  230.                                 $items[$i][$field] = $order->getCreatedAt()->format('Y-m-d H:i:s');
  231.                                 break;
  232.                             case 'updatedAt':
  233.                                 $items[$i][$field] = $order->getUpdatedAt()->format('Y-m-d H:i:s');
  234.                                 break;
  235.                             case 'recipientType':
  236.                                 $items[$i][$field] = $item->getRecipientType();
  237.                                 break;
  238.                             case 'deliveryType':
  239.                                 $items[$i][$field] = implode(','$item->getDeliveryType());
  240.                                 break;
  241.                             case 'recipientName':
  242.                                 $items[$i][$field] = $item->getRecipientName();
  243.                                 break;
  244.                             case 'senderName':
  245.                                 $items[$i][$field] = $item->getSenderName();
  246.                                 break;
  247.                             case 'tiberiumOrderId':
  248.                                 $items[$i][$field] = $item->getTiberiumOrderId();
  249.                                 break;
  250.                             case 'widgetOrderId':
  251.                                 $items[$i][$field] = $order->getId();
  252.                                 break;
  253.                             case 'getStatusText':
  254.                                 $items[$i][$field] = $order->getStatusText();
  255.                                 break;
  256.                             case 'senderEmail':
  257.                                 $items[$i][$field] = $item->getSenderEmail();
  258.                                 break;
  259.                             case 'recipientEmail':
  260.                                 $items[$i][$field] = $item->getRecipientEmail();
  261.                                 break;
  262.                             case 'paymentDataId':
  263.                                 $items[$i][$field] = !empty($order->getPaymentData()['id'])?$order->getPaymentData()['id']:'';
  264.                                 break;
  265.                             case 'quantity':
  266.                                 $items[$i][$field] = $item->getQuantity();
  267.                                 break;
  268.                             case 'amount':
  269.                                 $items[$i][$field] = $item->getAmount();
  270.                                 break;
  271.                             case 'summ':
  272.                                 $items[$i][$field] = $item->getAmount()*$item->getQuantity();
  273.                                 break;
  274.                         }
  275.                     }
  276.                     $i++;
  277.                 }
  278.             }
  279.         }
  280.         $fields array_flip($fields);
  281.         array_unshift($items $fields);
  282.         $fp fopen('php://temp''w');
  283.         foreach ($items as $row) {
  284.             fputcsv($fp$row';');
  285.         }
  286.         rewind($fp);
  287.         $response = new Response(chr(0xEF).chr(0xBB).chr(0xBF).stream_get_contents($fp));
  288.         fclose($fp);
  289.         $response->headers->set('Content-Encoding''UTF-8');
  290.         $response->headers->set('Content-Type''application/csv; charset=UTF-8');
  291.         $response->headers->set('Content-Disposition''attachment; filename="orders_'.date('Y-m-d').'.csv"');
  292.         return $response;
  293.     }
  294.     /**
  295.      * @param Request $request
  296.      * @return Response
  297.      * @Route("/backend/order/{id}/edit", name="backend_order_edit")
  298.      * @Security("is_granted('ROLE_MERCHANT') or is_granted('ROLE_MANAGER') or is_granted('ROLE_CLIENT')")
  299.      */
  300.     public function edit(Request $requestEntityManagerInterface $entityManagerCertificateLogService $certificateServiceOrder $order null): Response
  301.     {
  302.         if(null === $order) {
  303.             return $this->redirectToRoute('backend_order_index');
  304.         }
  305.         $form $this->createForm(OrderType::class, $order);
  306.         $form->handleRequest($request);
  307.         if($form->isSubmitted() && $form->isValid()) {
  308.             $entityManager->persist($order);
  309.             $entityManager->flush();
  310.             return $this->redirectToRoute('backend_order_edit', ['id' => $request->get('id')]);
  311.         }
  312.         $certificateGoals $certificateService->getCertificateGoals($order);
  313.         return $this->render('order/edit.html.twig', [
  314.             'certificateGoals' => $certificateGoals,
  315.             'order_form' => $form->createView(),
  316.             'order' => $order,
  317.             'hash' => hash('sha256',$order->getWidget()->getId()),
  318.             'user_files_dir' => $this->getParameter('app.user_files_dir')
  319.         ]);
  320.     }
  321.     /**
  322.      * @param Request $request
  323.      * @return Response
  324.      * @Route("/backend/order/{id}/send", name="backend_order_send")
  325.      * @Security("is_granted('ROLE_CLIENT') or is_granted('ROLE_MERCHANT') or is_granted('ROLE_MANAGER') or is_granted('ROLE_SUPERADMINISTRATOR')")
  326.      */
  327.     public function send(Request $requestMessageBusInterface $messageBusEntityManagerInterface $entityManagerOrder $order null): Response
  328.     {
  329.         $widgetUser $entityManager->getRepository(WidgetUser::class)->find($this->getUser());
  330.         if(null !== $order) {
  331.             $getCertificatesMessage = new GetCertificatesMessage($order);
  332.             $getCertificatesMessage->setClient($widgetUser);
  333.             $messageBus->dispatch($getCertificatesMessage);
  334.             return new Response('Send');
  335.         }
  336.         return new Response('Error');
  337.     }
  338.     /**
  339.      * @param Request $request
  340.      * @return Response
  341.      * @Route("/backend/order/{id}/history", name="backend_order_history_send")
  342.      * @IsGranted("ROLE_SUPERADMINISTRATOR")
  343.      */
  344.     public function history(Request $requestHistorySendRepository $historySendRepository): Response
  345.     {
  346.         $result $historySendRepository->findBy(['order' => $request->get('id')]);
  347.         return $this->render('order/history.html.twig', ['history' => $result]);
  348.     }
  349. }