src/CoreBundle/Controller/Admin/OrderController.php line 162

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\CoreBundle\Controller\Admin;
  4. use App\CoreBundle\Component\Grid\DataSourceInterface;
  5. use App\CoreBundle\Component\Grid\GridFactory;
  6. use App\CoreBundle\Component\Grid\QueryBuilderWithRowManipulatorDataSource;
  7. use App\CoreBundle\Form\Admin\Order\AdvancedSearchOrderFormType;
  8. use App\CoreBundle\Form\Admin\Order\OrderFormType;
  9. use App\CoreBundle\Form\Admin\Order\OrderMassActionFormType;
  10. use App\CoreBundle\Form\Admin\QuickSearch\QuickSearchFormData;
  11. use App\CoreBundle\Form\Admin\QuickSearch\QuickSearchFormType;
  12. use App\CoreBundle\Model\Administrator\AdministratorGridFacade;
  13. use App\CoreBundle\Model\AdminNavigation\BreadcrumbOverrider;
  14. use App\CoreBundle\Model\AdvancedSearchOrder\AdvancedSearchOrderData;
  15. use App\CoreBundle\Model\AdvancedSearchOrder\AdvancedSearchOrderFacade;
  16. use App\CoreBundle\Model\Coupon\CouponFacade;
  17. use App\CoreBundle\Model\Eshop\EshopFacade;
  18. use App\CoreBundle\Model\Order\Item\OrderItemFacade;
  19. use App\CoreBundle\Model\Order\MassAction\OrderMassActionData;
  20. use App\CoreBundle\Model\Order\MassAction\OrderMassActionFacade;
  21. use App\CoreBundle\Model\Order\OrderDataFactoryInterface;
  22. use App\CoreBundle\Model\Order\OrderFacade;
  23. use App\CoreBundle\Model\Localization\Localization;
  24. use App\CoreBundle\Model\PaymentMethod\PaymentMethodTitleProvider;
  25. use App\CoreBundle\Model\Product\ProductFacade;
  26. use App\CoreBundle\Model\ShippingMethod\ShippingMethodTitleProvider;
  27. use Symfony\Component\HttpFoundation\Request;
  28. use Symfony\Component\Routing\Annotation\Route;
  29. use App\CoreBundle\Component\Router\Security\Annotation\CsrfProtection;
  30. class OrderController extends AdminBaseController
  31. {
  32.     /**
  33.      * @var \App\CoreBundle\Model\AdminNavigation\BreadcrumbOverrider
  34.      */
  35.     protected $breadcrumbOverrider;
  36.     /**
  37.      * @var \App\CoreBundle\Component\Grid\GridFactory
  38.      */
  39.     protected $gridFactory;
  40.     /**
  41.      * @var \App\CoreBundle\Model\Order\OrderFacade
  42.      */
  43.     protected $orderFacade;
  44.     /**
  45.      * @var \App\CoreBundle\Model\Eshop\EshopFacade
  46.      */
  47.     protected $eshopFacade;
  48.     /**
  49.      * @var \App\CoreBundle\Model\Coupon\CouponFacade
  50.      */
  51.     protected $couponFacade;
  52.     /**
  53.      * @var \App\CoreBundle\Model\Administrator\AdministratorGridFacade
  54.      */
  55.     protected $administratorGridFacade;
  56.     /**
  57.      * @var \App\CoreBundle\Model\Order\OrderDataFactoryInterface
  58.      */
  59.     protected $orderDataFactory;
  60.     /**
  61.      * @var \App\CoreBundle\Model\Order\Item\OrderItemFacade
  62.      */
  63.     protected $orderItemFacade;
  64.     /**
  65.      * @var \App\CoreBundle\Model\Product\ProductFacade
  66.      */
  67.     protected $productFacade;
  68.     /**
  69.      * @var \App\CoreBundle\Model\AdvancedSearchOrder\AdvancedSearchOrderFacade
  70.      */
  71.     protected $advancedSearchOrderFacade;
  72.     /**
  73.      * @var \App\CoreBundle\Model\Order\MassAction\OrderMassActionFacade
  74.      */
  75.     protected $orderMassActionFacade;
  76.     /**
  77.      * @var ShippingMethodTitleProvider
  78.      */
  79.     protected $shippingMethodTitleProvider;
  80.     /**
  81.      * @var PaymentMethodTitleProvider
  82.      */
  83.     protected $paymentMethodTitleProvider;
  84.     /**
  85.      * @param BreadcrumbOverrider $breadcrumbOverrider
  86.      * @param GridFactory $gridFactory
  87.      * @param OrderFacade $orderFacade
  88.      * @param EshopFacade $eshopFacade
  89.      * @param AdministratorGridFacade $administratorGridFacade
  90.      * @param Localization $localization
  91.      * @param OrderDataFactoryInterface $orderDataFactory
  92.      * @param OrderItemFacade $orderItemFacade
  93.      * @param ProductFacade $productFacade
  94.      * @param CouponFacade $couponFacade
  95.      * @param AdvancedSearchOrderFacade $advancedSearchOrderFacade
  96.      * @param OrderMassActionFacade $orderMassActionFacade
  97.      * @param ShippingMethodTitleProvider $shippingMethodTitleProvider
  98.      * @param PaymentMethodTitleProvider $paymentMethodTitleProvider
  99.      */
  100.     public function __construct(
  101.         BreadcrumbOverrider         $breadcrumbOverrider,
  102.         GridFactory                 $gridFactory,
  103.         OrderFacade                 $orderFacade,
  104.         EshopFacade                 $eshopFacade,
  105.         AdministratorGridFacade     $administratorGridFacade,
  106.         Localization                $localization,
  107.         OrderDataFactoryInterface   $orderDataFactory,
  108.         OrderItemFacade             $orderItemFacade,
  109.         ProductFacade               $productFacade,
  110.         CouponFacade                $couponFacade,
  111.         AdvancedSearchOrderFacade   $advancedSearchOrderFacade,
  112.         OrderMassActionFacade       $orderMassActionFacade,
  113.         ShippingMethodTitleProvider $shippingMethodTitleProvider,
  114.         PaymentMethodTitleProvider $paymentMethodTitleProvider
  115.     ) {
  116.         $this->breadcrumbOverrider $breadcrumbOverrider;
  117.         $this->gridFactory $gridFactory;
  118.         $this->orderFacade $orderFacade;
  119.         $this->eshopFacade $eshopFacade;
  120.         $this->administratorGridFacade $administratorGridFacade;
  121.         $this->localization $localization;
  122.         $this->orderDataFactory $orderDataFactory;
  123.         $this->orderItemFacade $orderItemFacade;
  124.         $this->productFacade $productFacade;
  125.         $this->couponFacade $couponFacade;
  126.         $this->advancedSearchOrderFacade $advancedSearchOrderFacade;
  127.         $this->orderMassActionFacade $orderMassActionFacade;
  128.         $this->shippingMethodTitleProvider $shippingMethodTitleProvider;
  129.         $this->paymentMethodTitleProvider $paymentMethodTitleProvider;
  130.     }
  131.     /**
  132.      * @Route("/order/list", name="admin_order_list")
  133.      * @param \Symfony\Component\HttpFoundation\Request $request
  134.      */
  135.     public function listAction(Request $request)
  136.     {
  137.         $administrator $this->getUser();
  138.         /* @var $administrator \App\CoreBundle\Model\Administrator\Administrator */
  139. //        $advancedSearchForm = $this->advancedSearchOrderFacade->createAdvancedSearchOrderForm($request);
  140. //        $advancedSearchData = $advancedSearchForm->getData();
  141. //        $isAdvancedSearchFormSubmitted = $this->advancedSearchOrderFacade->isAdvancedSearchOrderFormSubmitted($request);
  142.         $advancedSearchForm $this->createForm(AdvancedSearchOrderFormType::class, new AdvancedSearchOrderData());
  143.         $advancedSearchForm->handleRequest($request);
  144.         $advancedSearchOrderFormData $request->get('advanced_search_order_form');
  145.         $isAdvancedSearchFormSubmitted = isset($advancedSearchOrderFormData['isAdvancedSearch']) && $advancedSearchOrderFormData['isAdvancedSearch'] !== null;
  146.         $quickSearchForm $this->createForm(QuickSearchFormType::class, new QuickSearchFormData());
  147.         $quickSearchForm->handleRequest($request);
  148.         if ($isAdvancedSearchFormSubmitted) {
  149.             $queryBuilder $this->advancedSearchOrderFacade->getQueryBuilderByAdvancedSearchOrderData($advancedSearchForm->getData());
  150.         } else {
  151.             $queryBuilder $this->orderFacade->getOrderListQueryBuilderByQuickSearchData($quickSearchForm->getData());
  152.         }
  153.         $dataSource = new QueryBuilderWithRowManipulatorDataSource(
  154.             $queryBuilder,
  155.             'o.id',
  156.             function ($row) {
  157.                 return $this->addOrderEntityToDataSource($row);
  158.             }
  159.         );
  160.         $orderMassActionData = new OrderMassActionData();
  161.         $massActionForm $this->createForm(OrderMassActionFormType::class, $orderMassActionData, [
  162.             'request' => $request->get('order_mass_action_form')
  163.         ]);
  164.         $massActionForm->handleRequest($request);
  165.         $grid $this->gridFactory->create('orderList'$dataSource);
  166.         $grid->enablePaging();
  167.         $grid->enableSelecting();
  168.         $grid->setDefaultOrder('created_at'DataSourceInterface::ORDER_DESC);
  169.         $grid->addColumn('eshop''eshop't('E-shop'), false);
  170.         $grid->addColumn('number''o.number't('Order number'), true);
  171.         $grid->addColumn('created_at''o.createdAt't('Created'), true);
  172.         if ($administrator->isSuperadmin()) {
  173.             $grid->addColumn('updated_at''o.updatedAt't('Updated'), true);
  174.         }
  175.         $grid->addColumn('status''o.status't('Status'), false);
  176.         $grid->addColumn('order_total''orderTotal't('Total'), false);
  177.         $grid->addColumn('paid''o.paid't('Paid'), false);
  178.         $grid->addColumn('customer_name''customerName't('Customer'), false);
  179.         $grid->addColumn('shipping_method''shippingMethod't('Shipping method'), false);
  180.         $grid->addColumn('payment_method''paymentMethod't('Payment method'), false);
  181.         if ($administrator->isSuperadmin()) {
  182.             $grid->addColumn('shipping_country''shippingCountry't('Shipping country'), false);
  183.         }
  184.         $grid->setActionColumnClassAttribute('table-col table-col-10');
  185.         $grid->addShowActionColumn('admin_order_detail', ['id' => 'id'], []);
  186.         $grid->addSetAsPaidActionColumn('admin_order_set_as_paid', ['id' => 'id'], []);
  187.         $grid->addEditActionColumn('admin_order_edit', ['id' => 'id'], []);
  188.         $grid->setTheme('Admin/Content/Order/listGrid.html.twig');
  189.         $this->administratorGridFacade->restoreAndRememberGridLimit($administrator$grid);
  190.         if ($massActionForm->get('submit')->isClicked()) {
  191.             $this->orderMassActionFacade->doMassAction(
  192.                 $massActionForm->getData(),
  193.                 $queryBuilder,
  194.                 array_map('intval'$grid->getSelectedRowIds())
  195.             );
  196.             $this->addSuccessFlash(t('Bulk editing done'));
  197.             return $this->redirect($request->headers->get('referer'$this->generateUrl('admin_product_list')));
  198.         }
  199.         return $this->render('Admin/Content/Order/list.html.twig', [
  200.             'gridView' => $grid->createView(),
  201.             'totalCount' => $grid->getTotalCount(),
  202.             'quickSearchForm' => $quickSearchForm->createView(),
  203.             'advancedSearchForm' => $advancedSearchForm->createView(),
  204.             'isAdvancedSearchFormSubmitted' => $isAdvancedSearchFormSubmitted,
  205.             'massActionForm' => $massActionForm->createView(),
  206.         ]);
  207.     }
  208.     /**
  209.      * @param array $row
  210.      * @return array
  211.      */
  212.     protected function addOrderEntityToDataSource(array $row)
  213.     {
  214.         $order $this->orderFacade->getById($row['id']);
  215.         $row['order'] = $order;
  216.         $row['shippingCountry'] = $order->getShippingAddress() ? $order->getShippingAddress()->getCountry() : null;
  217.         $row['customerName'] = $order->getBillingAddress()->getFirstName() . ' ' $order->getBillingAddress()->getLastName();
  218.         $row['paymentMethod'] = $this->paymentMethodTitleProvider->getUnifiedMethodTitle($order->getPaymentMethodTitle());
  219.         $row['shippingMethod'] = null;
  220.         foreach ($order->getShippingLines() as $shippingLine) {
  221.             $row['shippingMethod'] = $this->shippingMethodTitleProvider->getUnifiedMethodTitle($shippingLine->getMethodTitle());
  222.         }
  223.         $row['eshop'] = $this->eshopFacade->getById($order->getEshopId());
  224.         $row['orderTotal'] = $order;
  225.         return $row;
  226.     }
  227.     /**
  228.      * @Route("/order/detail/{id}", requirements={"id" = "\d+"}, name="admin_order_detail")
  229.      * @param \Symfony\Component\HttpFoundation\Request $request
  230.      * @param mixed $id
  231.      */
  232.     public function detailAction(Request $request$id)
  233.     {
  234.         $order $this->orderFacade->getById($id);
  235.         $productsIndexedByOrderProductId $this->productFacade->getAllProductsByOrderIndexedByOrderProductId($order);
  236.         return $this->render('Admin/Content/Order/detailView.html.twig', [
  237.             'order' => $order,
  238.             'productsIndexedByOrderProductId' => $productsIndexedByOrderProductId,
  239.         ]);
  240.     }
  241.     /**
  242.      * @Route("/order/edit/{id}", requirements={"id" = "\d+"}, name="admin_order_edit")
  243.      * @param \Symfony\Component\HttpFoundation\Request $request
  244.      * @param mixed $id
  245.      */
  246.     public function editAction(Request $request$id)
  247.     {
  248.         $order $this->orderFacade->getById($id);
  249.         $orderData $this->orderDataFactory->createFromOrder($order);
  250.         $form $this->createForm(OrderFormType::class, $orderData, ['order' => $order]);
  251.         $form->handleRequest($request);
  252.         if ($form->isSubmitted() && $form->isValid()) {
  253.             $order $this->orderFacade->edit($id$orderData);
  254.             $this->addSuccessFlashTwig(
  255.                 t('Order Nr. <strong><a href="{{ url }}">{{ number }}</a></strong> modified'),
  256.                 [
  257.                     'number' => $order->getNumber(),
  258.                     'url' => $this->generateUrl('admin_order_edit', ['id' => $order->getId()]),
  259.                 ]
  260.             );
  261.             return $this->redirectToRoute('admin_order_edit', ['id' => $id]);
  262.         }
  263.         if ($form->isSubmitted() && !$form->isValid()) {
  264.             $this->addErrorFlash(t('Please check the correctness of all data filled.'));
  265.         }
  266.         $this->breadcrumbOverrider->overrideLastItem(
  267.             t('Editing order - Nr. %number%', ['%number%' => $order->getNumber()])
  268.         );
  269.         return $this->render('Admin/Content/Order/edit.html.twig', [
  270.             'form' => $form->createView(),
  271.             'order' => $order,
  272.         ]);
  273.     }
  274.     /**
  275.      * @Route("/order/set-as-paid/{id}", requirements={"id" = "\d+"}, name="admin_order_set_as_paid")
  276.      * @param \Symfony\Component\HttpFoundation\Request $request
  277.      * @param mixed $id
  278.      */
  279.     public function setAsPaidAction(Request $request$id)
  280.     {
  281.         $order $this->orderFacade->getById($id);
  282.         $this->orderMassActionFacade->setPaymentStatus([$order]);
  283.         return $this->redirectToRoute('admin_order_list');
  284.     }
  285.     /**
  286.      * @Route("/order/delete/{id}", requirements={"id" = "\d+"}, name="admin_order_delete")
  287.      * @CsrfProtection
  288.      * @param int $id
  289.      */
  290.     public function deleteAction($id)
  291.     {
  292.         $this->orderFacade->deleteById($id);
  293.         return $this->redirectToRoute('admin_order_list');
  294.     }
  295.     /**
  296.      * @Route("/order/add-product/{orderId}", requirements={"orderId" = "\d+"}, condition="request.isXmlHttpRequest()", name="admin_order_add_product")
  297.      * @param \Symfony\Component\HttpFoundation\Request $request
  298.      * @param int $orderId
  299.      */
  300.     public function addProductAction(Request $request$orderId)
  301.     {
  302.         $productId = (int) $request->get('productId');
  303.         $productVariantId = (int) $request->get('productVariantId');
  304.         $orderItem $this->orderItemFacade->addProductToOrder($orderId$productId$productVariantId);
  305.         $product $this->productFacade->getById($productId);
  306.         $order $this->orderFacade->getById($orderId);
  307.         $orderData $this->orderDataFactory->createFromOrder($order);
  308.         $form $this->createForm(OrderFormType::class, $orderData, ['order' => $order]);
  309. //        $orderItemTotalPricesById = $this->orderItemPriceCalculation->calculateTotalPricesIndexedById(
  310. //            $order->getItemLines()
  311. //        );
  312.         return $this->render('Admin/Content/Order/addProduct.html.twig', [
  313.             'form' => $form->createView(),
  314.             'order' => $order,
  315.             'orderItem' => $orderItem,
  316.             'product' => $product,
  317.             'orderItemTotalPricesById' => null,
  318.         ]);
  319.     }
  320.     /**
  321.      * @Route("/order/add-coupon/{orderId}", requirements={"orderId" = "\d+"}, condition="request.isXmlHttpRequest()", name="admin_order_add_coupon")
  322.      * @param \Symfony\Component\HttpFoundation\Request $request
  323.      * @param int $orderId
  324.      */
  325.     public function addCouponAction(Request $request$orderId)
  326.     {
  327.         $couponId = (int) $request->get('couponId');
  328.         $orderCoupon $this->orderItemFacade->addCouponToOrder($orderId$couponId);
  329.         $coupon $this->couponFacade->getById($couponId);
  330.         $order $this->orderFacade->getById($orderId);
  331.         $orderData $this->orderDataFactory->createFromOrder($order);
  332.         $form $this->createForm(OrderFormType::class, $orderData, ['order' => $order]);
  333.         return $this->render('Admin/Content/Order/addCoupon.html.twig', [
  334.             'form' => $form->createView(),
  335.             'order' => $order,
  336.             'orderCoupon' => $orderCoupon,
  337.             'coupon' => $coupon,
  338.             'orderItemTotalPricesById' => null,
  339.         ]);
  340.     }
  341.     /**
  342.      * @Route("/order/get-advanced-search-rule-form/", methods={"post"}, name="admin_order_get_rule_form")
  343.      * @param \Symfony\Component\HttpFoundation\Request $request
  344.      * @return \Symfony\Component\HttpFoundation\Response
  345.      */
  346.     public function getRuleFormAction(Request $request)
  347.     {
  348.         $ruleForm $this->advancedSearchOrderFacade->createRuleForm(
  349.             $request->get('filterName'),
  350.             $request->get('newIndex')
  351.         );
  352.         return $this->render('Admin/Content/Order/ruleForm.html.twig', [
  353.             'rulesForm' => $ruleForm->createView(),
  354.         ]);
  355.     }
  356. }