src/Controller/OrderController.php line 306

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Item;
  4. use App\Entity\Order;
  5. use App\Entity\OrderElement;
  6. use App\Entity\Supplier;
  7. use App\Entity\SupplierWarehouseItem;
  8. use App\Repository\ItemRepository;
  9. use App\Repository\OrderElementRepository;
  10. use App\Repository\OrderRepository;
  11. use App\Repository\PaymentOrderElementRepository;
  12. use App\Repository\PaymentOrderRepository;
  13. use App\Repository\ProductRepository;
  14. use App\Repository\SupplierRepository;
  15. use App\Repository\SupplierWarehouseItemRepository;
  16. use App\Repository\UserRepository;
  17. use App\Repository\WarehouseRepository;
  18. use App\Service\CreateOrder;
  19. use App\Service\DTO\OldCRMOrderElementRequest;
  20. use App\Service\DTO\OldCRMOrderRequest;
  21. use App\Service\DTO\OrderDTO;
  22. use App\Service\Helper\RequestHelper;
  23. use App\Service\Order\OrderCollect;
  24. use App\Service\Order\OrderConfirm;
  25. use App\Service\Order\OrderIssue;
  26. use App\Service\Order\Payment;
  27. use App\Service\OrderElement\OrderElementCreator;
  28. use App\Service\OrderElement\OrderProductCreator;
  29. use App\Service\Product\ProductCreator;
  30. use App\Service\Sberbank;
  31. use App\Service\UserFind;
  32. use DateTime;
  33. use Doctrine\ORM\ORMException;
  34. use Exception;
  35. use Symfony\Component\HttpFoundation\JsonResponse;
  36. use Symfony\Component\HttpFoundation\Request;
  37. use Symfony\Component\Routing\Annotation\Route;
  38. use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
  39. /**
  40.  * @Route("/order")
  41.  */
  42. class OrderController extends BaseController
  43. {
  44.     /**
  45.      * @Route("/public_list", methods="GET")
  46.      * @throws ORMException
  47.      */
  48.     public function publicList(Request $requestOrderRepository $orderRepositoryUserFind $userFindOrderDTO $orderDTO): JsonResponse
  49.     {
  50.         $user $userFind->executeFind($request->cookies->get('user'));
  51.         if(!$user) return new JsonResponse([]);
  52.         return new JsonResponse($orderDTO->getPublicList($orderRepository->findBy(['user' => $user])));
  53.     }
  54.     /**
  55.      * @Route("/list", methods="GET")
  56.      * @throws Exception
  57.      */
  58.     public function list(Request $requestOrderRepository $orderRepository): JsonResponse
  59.     {
  60.         $from = new DateTime($request->query->get('from'));
  61.         $to = new DateTime($request->query->get('to'));
  62.         return new JsonResponse(OrderDTO::getOrdersList(...$orderRepository->getList($from$to)));
  63.     }
  64.     /**
  65.      * @Route("/payments", methods="GET")
  66.      * @throws Exception
  67.      */
  68.     public function payments(Request $requestPaymentOrderRepository $paymentOrderRepositoryUserRepository $userRepository): JsonResponse
  69.     {
  70.         $from = new DateTime($request->query->get('from'));
  71.         $to = new DateTime($request->query->get('to'));
  72.         $user $userRepository->find($request->query->getInt('queryUserId'));
  73.         return new JsonResponse(OrderDTO::getOrdersPaymentsList(...$paymentOrderRepository->getList($from$to$user)));
  74.     }
  75.     /**
  76.      * @Route("/payments_elements", methods="GET")
  77.      * @throws Exception
  78.      */
  79.     public function paymentsElements(Request $requestPaymentOrderElementRepository $paymentOrderElementRepositoryUserRepository $userRepository): JsonResponse
  80.     {
  81.         $from = new DateTime($request->query->get('from'));
  82.         $to = new DateTime($request->query->get('to'));
  83.         $user $userRepository->find($request->query->getInt('queryUserId'));
  84.         return new JsonResponse(OrderDTO::getOrdersElementsPaymentsList(...$paymentOrderElementRepository->getList($from$to$user)));
  85.     }
  86.     /**
  87.      * @Route("/{hash}", methods="GET")
  88.      */
  89.     public function order(Request $requeststring $hashOrderRepository $orderRepositoryUserFind $userFindOrderDTO $orderDTO): JsonResponse
  90.     {
  91.         /** @var Order $order */
  92.         $order $orderRepository->findOneBy(['hash' => $hash]);
  93.         if(!$order) return new JsonResponse([]);
  94.         return new JsonResponse($orderDTO->getPublic($order));
  95.     }
  96.     /**
  97.      * @Route("/{order}/sberbank_payed_form", methods="GET")
  98.      * @throws ORMException
  99.      */
  100.     public function sberbankPayedForm(Request $requestOrder $orderSberbank $sberbank): JsonResponse
  101.     {
  102.         return new JsonResponse($sberbank->getPayedForm($order));
  103.     }
  104.     /**
  105.      * @Route("/add", methods="POST")
  106.      * @throws Exception
  107.      */
  108.     public function add(Request $requestOrderRepository $orderRepository): JsonResponse
  109.     {
  110.         $order $orderRepository->addOrder(null$this->findUserByCookie($request->cookies->get('user')));
  111.         return new JsonResponse(['id' => $order->getId(), 'result' => 'success']);
  112.     }
  113.     /**
  114.      * @Route("/{order}/data", methods="GET")
  115.      * @throws Exception
  116.      */
  117.     public function getData(Order $order): JsonResponse
  118.     {
  119.         return new JsonResponse(OrderDTO::getOrderData($order));
  120.     }
  121.     /**
  122.      * @Route("/{order}/products", methods="GET")
  123.      * @throws Exception
  124.      */
  125.     public function products(Order $order): JsonResponse
  126.     {
  127.         return new JsonResponse(OrderDTO::getOrderProducts($order));
  128.     }
  129.     /**
  130.      * @Route("/create_from_crm", methods="POST")
  131.      * @throws Exception
  132.      */
  133.     public function createFromCrm(
  134.         Request $request,
  135.         ItemRepository $itemRepository,
  136.         OrderRepository $orderRepository,
  137.         UserRepository $userRepository,
  138.         WarehouseRepository $warehouseRepository,
  139.         OrderElementCreator $orderElementCreator,
  140.         OrderConfirm $orderConfirmService,
  141.         OrderCollect $orderCollectService,
  142.         OrderIssue $orderIssueService
  143.     ): JsonResponse
  144.     {
  145.         $crmOrderId $request->request->getInt('crmOrderId');
  146.         if($order $orderRepository->findOneBy(['crmOrderId' => $crmOrderId]))
  147.             return new JsonResponse(['id' => $order->getId(), 'result' => 'success']);
  148.         $order $orderRepository->addOrder($crmOrderId$userRepository->findOneBy(['deprecatedUserId' => $request->request->get('userId')]));
  149.         foreach ($request->request->get('products') as $product) {
  150.             $warehouse $warehouseRepository->findOneBy(['alias' => 'sklad']);
  151.             $item $itemRepository->findOneBy(['warehouse' => $warehouse'product' => (int)$product['productId']]);
  152.             if(!$item) continue;
  153.             $orderElementCreator->createOrderElement(
  154.                 $order,
  155.                 $item,
  156.                 null,
  157.                 (int)$product['quantity'],
  158.                 (int)$product['price'] * 100,
  159.             );
  160.         }
  161.         $orderConfirmService->confirmOrder($order);
  162.         $orderCollectService->collectOrder($order);
  163.         $orderIssueService->issueOrder($order);
  164.         return new JsonResponse(['id' => $order->getId(), 'result' => 'success']);
  165.     }
  166.     /**
  167.      * @Route("/payment_from_old_crm", methods="POST")
  168.      * @throws Exception
  169.      * @throws TransportExceptionInterface
  170.      */
  171.     public function paymentFromOldCrm(
  172.         Request $request,
  173.         ItemRepository $itemRepository,
  174.         OrderElementRepository $orderElementRepository,
  175.         PaymentOrderRepository $paymentOrderRepository,
  176.         SupplierRepository $supplierRepository,
  177.         SupplierWarehouseItemRepository $supplierWarehouseItemRepository,
  178.         UserRepository $userRepository,
  179.         WarehouseRepository $warehouseRepository,
  180.         CreateOrder $createOrderService,
  181.         OrderElementCreator $orderElementCreator,
  182.         Payment $paymentService,
  183.         ProductCreator $productCreator
  184.     ): JsonResponse
  185.     {
  186.         $orderElements = [];
  187.         $oldCrmRequest = new OldCRMOrderRequest($request);
  188.         $order $createOrderService->createFromOldCrm($oldCrmRequest);
  189.         $existsElements = [];
  190.         foreach ($order->getElements() as $orderElement) {
  191.             if($orderElement->getCrmSpareId()) $existsElements[$orderElement->getCrmSpareId()] = $orderElement;
  192.         }
  193.         foreach ($oldCrmRequest->getElements() as $element) {
  194.             if(array_key_exists($element->getElementId(), $existsElements)) {
  195.                 $orderElements[] = $existsElements[$element->getElementId()];
  196.                 continue;
  197.             }
  198.             $supplierAlias $element->getSupplierAlias();
  199.             $product $productCreator->createProduct($element->getBrand(), $element->getArticle(), $element->getDescription());
  200.             $item null;
  201.             $supplierWarehouseItem null;
  202.             if($supplierAlias === 'sklad' && $product) {
  203.                 $warehouse $warehouseRepository->findOneBy(['alias' => 'sklad']);
  204.                 $item $itemRepository->findOneBy(['warehouse' => $warehouse'product' => $product]);
  205.                 $item $item ?: $itemRepository->addItem($warehouse$product);
  206.             }
  207.             if(!$item) {
  208.                 /** @var Supplier $supplier */
  209.                 $supplier $supplierRepository->findOneBy(['alias' => $supplierAlias]);
  210.                 $warehouse $supplier->getWarehouses()->first();
  211.                 /** @var SupplierWarehouseItem $supplierWarehouseItem */
  212.                 $supplierWarehouseItem $supplierWarehouseItemRepository->findItemByWarehouseAndProduct($product$warehouse);
  213.                 if (!$supplierWarehouseItem) {
  214.                     $supplierWarehouseItem $supplierWarehouseItemRepository->addSupplierWarehouseItem($warehouse$product);
  215.                 }
  216.             }
  217.             $searcherUser $userRepository->findOneBy(['deprecatedUserId' => $element->getSearcherUserId()]);
  218.             $orderElement $orderElementCreator->createOrderElement(
  219.                 $order,
  220.                 $item,
  221.                 $supplierWarehouseItem,
  222.                 $element->getQuantity(),
  223.                 $element->getPrice() * 100,
  224.             );
  225.             if($orderElement) {
  226.                 $orderElementRepository->update($orderElement->setCrmSpareId($element->getElementId()));
  227.                 if($searcherUser$orderElementRepository->update($orderElement->setSearcherUser($searcherUser));
  228.                 $orderElements[] = $orderElement;
  229.             }
  230.         }
  231.         $amount $request->request->getInt('amount') / 100;
  232.         $remainingAmount abs($amount);
  233.         $paymentOrder $paymentOrderRepository->addOrder($order$amount$request->request->get'paymentType'));
  234.         foreach ($orderElements as $orderElement) {
  235.             if($remainingAmount <= 0) continue;
  236.             $remainingAmount $amount 0
  237.             $paymentService->addOrderElementHistory($paymentOrder$orderElement$remainingAmount)
  238.             : $paymentService->removeOrderElementHistory($paymentOrder$orderElement$remainingAmount);
  239.         }
  240.         return new JsonResponse(['id' => $order->getId(), 'result' => 'success']);
  241.     }
  242.     /**
  243.      * @Route("/{order}/add_item/{item}", methods="POST")
  244.      * @throws Exception
  245.      */
  246.     public function addItem(
  247.         Request $request,
  248.         Order $order,
  249.         Item $item,
  250.         OrderElementCreator $orderElementCreator
  251.     ): JsonResponse
  252.     {
  253.         $orderElementCreator->createOrderElement(
  254.             $order,
  255.             $item,
  256.             null,
  257.             $request->request->getInt('quantity'1),
  258.             $item->getPrice(),
  259.         );
  260.         return new JsonResponse(['result' => 'success']);
  261.     }
  262.     /**
  263.      * @Route("/{order}/confirm", methods="POST")
  264.      * @throws Exception
  265.      */
  266.     public function confirmOrder(Order $orderOrderConfirm $orderConfirm): JsonResponse
  267.     {
  268.         $orderConfirm->confirmOrder($order);
  269.         return new JsonResponse(['result' => 'success']);
  270.     }
  271.     /**
  272.      * @Route("/payments/chart_data", methods="GET")
  273.      * @throws Exception
  274.      */
  275.     public function paymentsChartData(
  276.         Request $request,
  277.         PaymentOrderElementRepository $paymentOrderElementRepository,
  278.         UserRepository $userRepository
  279.     ): JsonResponse
  280.     {
  281.         $queryUser $userRepository->find($request->query->getInt('queryUserId'));
  282.         $out = [];
  283.         $users = [];
  284.         $amounts = [];
  285.         foreach ($userRepository->findManagers() as $user) {
  286.             if(!$user->getManager()) continue;
  287.             $users[] = $user;
  288.             $amounts[$user->getManager()->getFirstName()] = 0;
  289.         }
  290.         foreach ($paymentOrderElementRepository->getList(new DateTime($request->query->get('from')), new DateTime($request->query->get('to')), $queryUser) as $paymentOrderElement) {
  291.             $date $paymentOrderElement->getCreatedAt()->format('d.m.y');
  292.             if(!isset($out[$date])) $out[$date] = ['name' => $date];
  293.             foreach ($users as $user) {
  294.                 if(!isset($out[$date][$user->getManager()->getFirstName()])) $out[$date][$user->getManager()->getFirstName()] = 0;
  295.                 if($paymentOrderElement->getOrderElement()->getSearcherUser() === $user) {
  296.                     $out[$date][$user->getManager()->getFirstName()] += $paymentOrderElement->getPrice() / 100;
  297.                     $amounts[$user->getManager()->getFirstName()] += $paymentOrderElement->getPrice() / 100;
  298.                 }
  299.             }
  300.         }
  301.         return new JsonResponse(['amounts' => $amounts'chart' => array_values($out)]);
  302.     }
  303. }