<?php
declare(strict_types=1);
namespace App\CoreBundle\Controller\Admin;
use App\CoreBundle\Component\Grid\DataSourceInterface;
use App\CoreBundle\Component\Grid\GridFactory;
use App\CoreBundle\Component\Grid\QueryBuilderWithRowManipulatorDataSource;
use App\CoreBundle\Form\Admin\Order\AdvancedSearchOrderFormType;
use App\CoreBundle\Form\Admin\Order\OrderFormType;
use App\CoreBundle\Form\Admin\Order\OrderMassActionFormType;
use App\CoreBundle\Form\Admin\QuickSearch\QuickSearchFormData;
use App\CoreBundle\Form\Admin\QuickSearch\QuickSearchFormType;
use App\CoreBundle\Model\Administrator\AdministratorGridFacade;
use App\CoreBundle\Model\AdminNavigation\BreadcrumbOverrider;
use App\CoreBundle\Model\AdvancedSearchOrder\AdvancedSearchOrderData;
use App\CoreBundle\Model\AdvancedSearchOrder\AdvancedSearchOrderFacade;
use App\CoreBundle\Model\Coupon\CouponFacade;
use App\CoreBundle\Model\Eshop\EshopFacade;
use App\CoreBundle\Model\Order\Item\OrderItemFacade;
use App\CoreBundle\Model\Order\MassAction\OrderMassActionData;
use App\CoreBundle\Model\Order\MassAction\OrderMassActionFacade;
use App\CoreBundle\Model\Order\OrderDataFactoryInterface;
use App\CoreBundle\Model\Order\OrderFacade;
use App\CoreBundle\Model\Localization\Localization;
use App\CoreBundle\Model\PaymentMethod\PaymentMethodTitleProvider;
use App\CoreBundle\Model\Product\ProductFacade;
use App\CoreBundle\Model\ShippingMethod\ShippingMethodTitleProvider;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use App\CoreBundle\Component\Router\Security\Annotation\CsrfProtection;
class OrderController extends AdminBaseController
{
/**
* @var \App\CoreBundle\Model\AdminNavigation\BreadcrumbOverrider
*/
protected $breadcrumbOverrider;
/**
* @var \App\CoreBundle\Component\Grid\GridFactory
*/
protected $gridFactory;
/**
* @var \App\CoreBundle\Model\Order\OrderFacade
*/
protected $orderFacade;
/**
* @var \App\CoreBundle\Model\Eshop\EshopFacade
*/
protected $eshopFacade;
/**
* @var \App\CoreBundle\Model\Coupon\CouponFacade
*/
protected $couponFacade;
/**
* @var \App\CoreBundle\Model\Administrator\AdministratorGridFacade
*/
protected $administratorGridFacade;
/**
* @var \App\CoreBundle\Model\Order\OrderDataFactoryInterface
*/
protected $orderDataFactory;
/**
* @var \App\CoreBundle\Model\Order\Item\OrderItemFacade
*/
protected $orderItemFacade;
/**
* @var \App\CoreBundle\Model\Product\ProductFacade
*/
protected $productFacade;
/**
* @var \App\CoreBundle\Model\AdvancedSearchOrder\AdvancedSearchOrderFacade
*/
protected $advancedSearchOrderFacade;
/**
* @var \App\CoreBundle\Model\Order\MassAction\OrderMassActionFacade
*/
protected $orderMassActionFacade;
/**
* @var ShippingMethodTitleProvider
*/
protected $shippingMethodTitleProvider;
/**
* @var PaymentMethodTitleProvider
*/
protected $paymentMethodTitleProvider;
/**
* @param BreadcrumbOverrider $breadcrumbOverrider
* @param GridFactory $gridFactory
* @param OrderFacade $orderFacade
* @param EshopFacade $eshopFacade
* @param AdministratorGridFacade $administratorGridFacade
* @param Localization $localization
* @param OrderDataFactoryInterface $orderDataFactory
* @param OrderItemFacade $orderItemFacade
* @param ProductFacade $productFacade
* @param CouponFacade $couponFacade
* @param AdvancedSearchOrderFacade $advancedSearchOrderFacade
* @param OrderMassActionFacade $orderMassActionFacade
* @param ShippingMethodTitleProvider $shippingMethodTitleProvider
* @param PaymentMethodTitleProvider $paymentMethodTitleProvider
*/
public function __construct(
BreadcrumbOverrider $breadcrumbOverrider,
GridFactory $gridFactory,
OrderFacade $orderFacade,
EshopFacade $eshopFacade,
AdministratorGridFacade $administratorGridFacade,
Localization $localization,
OrderDataFactoryInterface $orderDataFactory,
OrderItemFacade $orderItemFacade,
ProductFacade $productFacade,
CouponFacade $couponFacade,
AdvancedSearchOrderFacade $advancedSearchOrderFacade,
OrderMassActionFacade $orderMassActionFacade,
ShippingMethodTitleProvider $shippingMethodTitleProvider,
PaymentMethodTitleProvider $paymentMethodTitleProvider
) {
$this->breadcrumbOverrider = $breadcrumbOverrider;
$this->gridFactory = $gridFactory;
$this->orderFacade = $orderFacade;
$this->eshopFacade = $eshopFacade;
$this->administratorGridFacade = $administratorGridFacade;
$this->localization = $localization;
$this->orderDataFactory = $orderDataFactory;
$this->orderItemFacade = $orderItemFacade;
$this->productFacade = $productFacade;
$this->couponFacade = $couponFacade;
$this->advancedSearchOrderFacade = $advancedSearchOrderFacade;
$this->orderMassActionFacade = $orderMassActionFacade;
$this->shippingMethodTitleProvider = $shippingMethodTitleProvider;
$this->paymentMethodTitleProvider = $paymentMethodTitleProvider;
}
/**
* @Route("/order/list", name="admin_order_list")
* @param \Symfony\Component\HttpFoundation\Request $request
*/
public function listAction(Request $request)
{
$administrator = $this->getUser();
/* @var $administrator \App\CoreBundle\Model\Administrator\Administrator */
// $advancedSearchForm = $this->advancedSearchOrderFacade->createAdvancedSearchOrderForm($request);
// $advancedSearchData = $advancedSearchForm->getData();
// $isAdvancedSearchFormSubmitted = $this->advancedSearchOrderFacade->isAdvancedSearchOrderFormSubmitted($request);
$advancedSearchForm = $this->createForm(AdvancedSearchOrderFormType::class, new AdvancedSearchOrderData());
$advancedSearchForm->handleRequest($request);
$advancedSearchOrderFormData = $request->get('advanced_search_order_form');
$isAdvancedSearchFormSubmitted = isset($advancedSearchOrderFormData['isAdvancedSearch']) && $advancedSearchOrderFormData['isAdvancedSearch'] !== null;
$quickSearchForm = $this->createForm(QuickSearchFormType::class, new QuickSearchFormData());
$quickSearchForm->handleRequest($request);
if ($isAdvancedSearchFormSubmitted) {
$queryBuilder = $this->advancedSearchOrderFacade->getQueryBuilderByAdvancedSearchOrderData($advancedSearchForm->getData());
} else {
$queryBuilder = $this->orderFacade->getOrderListQueryBuilderByQuickSearchData($quickSearchForm->getData());
}
$dataSource = new QueryBuilderWithRowManipulatorDataSource(
$queryBuilder,
'o.id',
function ($row) {
return $this->addOrderEntityToDataSource($row);
}
);
$orderMassActionData = new OrderMassActionData();
$massActionForm = $this->createForm(OrderMassActionFormType::class, $orderMassActionData, [
'request' => $request->get('order_mass_action_form')
]);
$massActionForm->handleRequest($request);
$grid = $this->gridFactory->create('orderList', $dataSource);
$grid->enablePaging();
$grid->enableSelecting();
$grid->setDefaultOrder('created_at', DataSourceInterface::ORDER_DESC);
$grid->addColumn('eshop', 'eshop', t('E-shop'), false);
$grid->addColumn('number', 'o.number', t('Order number'), true);
$grid->addColumn('created_at', 'o.createdAt', t('Created'), true);
if ($administrator->isSuperadmin()) {
$grid->addColumn('updated_at', 'o.updatedAt', t('Updated'), true);
}
$grid->addColumn('status', 'o.status', t('Status'), false);
$grid->addColumn('order_total', 'orderTotal', t('Total'), false);
$grid->addColumn('paid', 'o.paid', t('Paid'), false);
$grid->addColumn('customer_name', 'customerName', t('Customer'), false);
$grid->addColumn('shipping_method', 'shippingMethod', t('Shipping method'), false);
$grid->addColumn('payment_method', 'paymentMethod', t('Payment method'), false);
if ($administrator->isSuperadmin()) {
$grid->addColumn('shipping_country', 'shippingCountry', t('Shipping country'), false);
}
$grid->setActionColumnClassAttribute('table-col table-col-10');
$grid->addShowActionColumn('admin_order_detail', ['id' => 'id'], []);
$grid->addSetAsPaidActionColumn('admin_order_set_as_paid', ['id' => 'id'], []);
$grid->addEditActionColumn('admin_order_edit', ['id' => 'id'], []);
$grid->setTheme('Admin/Content/Order/listGrid.html.twig');
$this->administratorGridFacade->restoreAndRememberGridLimit($administrator, $grid);
if ($massActionForm->get('submit')->isClicked()) {
$this->orderMassActionFacade->doMassAction(
$massActionForm->getData(),
$queryBuilder,
array_map('intval', $grid->getSelectedRowIds())
);
$this->addSuccessFlash(t('Bulk editing done'));
return $this->redirect($request->headers->get('referer', $this->generateUrl('admin_product_list')));
}
return $this->render('Admin/Content/Order/list.html.twig', [
'gridView' => $grid->createView(),
'totalCount' => $grid->getTotalCount(),
'quickSearchForm' => $quickSearchForm->createView(),
'advancedSearchForm' => $advancedSearchForm->createView(),
'isAdvancedSearchFormSubmitted' => $isAdvancedSearchFormSubmitted,
'massActionForm' => $massActionForm->createView(),
]);
}
/**
* @param array $row
* @return array
*/
protected function addOrderEntityToDataSource(array $row)
{
$order = $this->orderFacade->getById($row['id']);
$row['order'] = $order;
$row['shippingCountry'] = $order->getShippingAddress() ? $order->getShippingAddress()->getCountry() : null;
$row['customerName'] = $order->getBillingAddress()->getFirstName() . ' ' . $order->getBillingAddress()->getLastName();
$row['paymentMethod'] = $this->paymentMethodTitleProvider->getUnifiedMethodTitle($order->getPaymentMethodTitle());
$row['shippingMethod'] = null;
foreach ($order->getShippingLines() as $shippingLine) {
$row['shippingMethod'] = $this->shippingMethodTitleProvider->getUnifiedMethodTitle($shippingLine->getMethodTitle());
}
$row['eshop'] = $this->eshopFacade->getById($order->getEshopId());
$row['orderTotal'] = $order;
return $row;
}
/**
* @Route("/order/detail/{id}", requirements={"id" = "\d+"}, name="admin_order_detail")
* @param \Symfony\Component\HttpFoundation\Request $request
* @param mixed $id
*/
public function detailAction(Request $request, $id)
{
$order = $this->orderFacade->getById($id);
$productsIndexedByOrderProductId = $this->productFacade->getAllProductsByOrderIndexedByOrderProductId($order);
return $this->render('Admin/Content/Order/detailView.html.twig', [
'order' => $order,
'productsIndexedByOrderProductId' => $productsIndexedByOrderProductId,
]);
}
/**
* @Route("/order/edit/{id}", requirements={"id" = "\d+"}, name="admin_order_edit")
* @param \Symfony\Component\HttpFoundation\Request $request
* @param mixed $id
*/
public function editAction(Request $request, $id)
{
$order = $this->orderFacade->getById($id);
$orderData = $this->orderDataFactory->createFromOrder($order);
$form = $this->createForm(OrderFormType::class, $orderData, ['order' => $order]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$order = $this->orderFacade->edit($id, $orderData);
$this->addSuccessFlashTwig(
t('Order Nr. <strong><a href="{{ url }}">{{ number }}</a></strong> modified'),
[
'number' => $order->getNumber(),
'url' => $this->generateUrl('admin_order_edit', ['id' => $order->getId()]),
]
);
return $this->redirectToRoute('admin_order_edit', ['id' => $id]);
}
if ($form->isSubmitted() && !$form->isValid()) {
$this->addErrorFlash(t('Please check the correctness of all data filled.'));
}
$this->breadcrumbOverrider->overrideLastItem(
t('Editing order - Nr. %number%', ['%number%' => $order->getNumber()])
);
return $this->render('Admin/Content/Order/edit.html.twig', [
'form' => $form->createView(),
'order' => $order,
]);
}
/**
* @Route("/order/set-as-paid/{id}", requirements={"id" = "\d+"}, name="admin_order_set_as_paid")
* @param \Symfony\Component\HttpFoundation\Request $request
* @param mixed $id
*/
public function setAsPaidAction(Request $request, $id)
{
$order = $this->orderFacade->getById($id);
$this->orderMassActionFacade->setPaymentStatus([$order]);
return $this->redirectToRoute('admin_order_list');
}
/**
* @Route("/order/delete/{id}", requirements={"id" = "\d+"}, name="admin_order_delete")
* @CsrfProtection
* @param int $id
*/
public function deleteAction($id)
{
$this->orderFacade->deleteById($id);
return $this->redirectToRoute('admin_order_list');
}
/**
* @Route("/order/add-product/{orderId}", requirements={"orderId" = "\d+"}, condition="request.isXmlHttpRequest()", name="admin_order_add_product")
* @param \Symfony\Component\HttpFoundation\Request $request
* @param int $orderId
*/
public function addProductAction(Request $request, $orderId)
{
$productId = (int) $request->get('productId');
$productVariantId = (int) $request->get('productVariantId');
$orderItem = $this->orderItemFacade->addProductToOrder($orderId, $productId, $productVariantId);
$product = $this->productFacade->getById($productId);
$order = $this->orderFacade->getById($orderId);
$orderData = $this->orderDataFactory->createFromOrder($order);
$form = $this->createForm(OrderFormType::class, $orderData, ['order' => $order]);
// $orderItemTotalPricesById = $this->orderItemPriceCalculation->calculateTotalPricesIndexedById(
// $order->getItemLines()
// );
return $this->render('Admin/Content/Order/addProduct.html.twig', [
'form' => $form->createView(),
'order' => $order,
'orderItem' => $orderItem,
'product' => $product,
'orderItemTotalPricesById' => null,
]);
}
/**
* @Route("/order/add-coupon/{orderId}", requirements={"orderId" = "\d+"}, condition="request.isXmlHttpRequest()", name="admin_order_add_coupon")
* @param \Symfony\Component\HttpFoundation\Request $request
* @param int $orderId
*/
public function addCouponAction(Request $request, $orderId)
{
$couponId = (int) $request->get('couponId');
$orderCoupon = $this->orderItemFacade->addCouponToOrder($orderId, $couponId);
$coupon = $this->couponFacade->getById($couponId);
$order = $this->orderFacade->getById($orderId);
$orderData = $this->orderDataFactory->createFromOrder($order);
$form = $this->createForm(OrderFormType::class, $orderData, ['order' => $order]);
return $this->render('Admin/Content/Order/addCoupon.html.twig', [
'form' => $form->createView(),
'order' => $order,
'orderCoupon' => $orderCoupon,
'coupon' => $coupon,
'orderItemTotalPricesById' => null,
]);
}
/**
* @Route("/order/get-advanced-search-rule-form/", methods={"post"}, name="admin_order_get_rule_form")
* @param \Symfony\Component\HttpFoundation\Request $request
* @return \Symfony\Component\HttpFoundation\Response
*/
public function getRuleFormAction(Request $request)
{
$ruleForm = $this->advancedSearchOrderFacade->createRuleForm(
$request->get('filterName'),
$request->get('newIndex')
);
return $this->render('Admin/Content/Order/ruleForm.html.twig', [
'rulesForm' => $ruleForm->createView(),
]);
}
}