<?php
namespace wosoBulkOrder\Controller;
use Shopware\Core\Framework\Routing\Annotation\RouteScope;
use Shopware\Core\System\SalesChannel\SalesChannelContext;
use Shopware\Storefront\Controller\StorefrontController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Shopware\Storefront\Page\GenericPageLoader;
use Shopware\Storefront\Page\Product\ProductPage;
use wosoBulkOrder\Entity\bulkorderEntity;
use wosoBulkOrder\Service\bulkorderDataService;
use Symfony\Component\HttpFoundation\JsonResponse;
use Shopware\Core\Framework\Routing\Exception\MissingRequestParameterException;
use wosoBulkorder\Exception\BulkorderNotFoundException;
use Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException;
/**
* @RouteScope(scopes={"storefront"})
*/
class bulkOrderStorefrontController extends \Shopware\Storefront\Controller\StorefrontController
{
const extAccessToken = '068707119324472397519469e8b4b643';
const extAccessIPs = [];
protected $genericPageLoader;
protected $bulkorderDataService;
public function __construct(
GenericPageLoader $genericPageLoader,
bulkorderDataService $bulkorderDataService
) {
$this->genericPageLoader = $genericPageLoader;
$this->bulkorderDataService = $bulkorderDataService;
}
/**
* generates List of bulk orders for current logged-in customer.
* standard-endpoint for bulk-order-account-module
* @Route("/getBulkOrders", name="frontend.wosoBulkOrder.getBulkOrderList", methods={"GET"})
*/
public function getBulkOrders(Request $request, SalesChannelContext $context): Response
{
$customer = $context->getCustomer();
if ($customer === null || $customer->getGuest() === true) {
$parameters=['redirectTo'=>'frontend.wosoBulkOrder.getBulkOrderList'];
return $this->redirectToRoute('frontend.account.login.page', $parameters);
}
$page = $this->genericPageLoader->load($request, $context);
$itemList = $this->bulkorderDataService->getBulkOrderByCustomerID($customer->getId(), $context, ($this->bulkorderDataService::C_BO_ENRICH_GROUPS | $this->bulkorderDataService::C_BO_ENRICH_PRODUCTS) );
return $this->renderStorefront('@wosoBulkOrder/storefront/page/account/bulk-order-main.html.twig', [
'page' => $page,
'wosoBulkOrderData' => [
'orderList' => $itemList,
'orderListCount' => $itemList->getTotal()
]
]);
}
/**
* generates List of bulk orders for current logged-in customer.
* standard-endpoint for bulk-order-account-module
* @Route("/getBulkorderDetail/{id}", name="frontend.wosoBulkOrder.getDetailData", methods={"GET"}, options={"seo"="false"}, defaults={"XmlHttpRequest"=true})
*/
public function getBulkorderDetail(Request $request, SalesChannelContext $context) {
$bulkorderId = (string) $request->get('id');
if ($bulkorderId === '') {
throw new MissingRequestParameterException('id');
}
$bulkorder = $this->bulkorderDataService->getBulkOrderByID($bulkorderId, $context );
if (!$bulkorder) {
throw new BulkorderNotFoundException("Bulkorder $bulkorderId not found");
}
$customerIsOwner = $this->bulkorderDataService->hasAccessToBulkorder($bulkorder, $context);
if (! ($customerIsOwner)) {
throw new AccessDeniedException($bulkorderId);
}
var_dump($bulkorder);
}
/**
* sets up the array of formfields for bulkorder-input
* returns an array of fields->parameters/values
* @param array|null $values - predefined values
* @return array|array[]
*/
private function getBulkorderFormFields(?array $values) : array {
$result = [
'id' => ['type' => 'string', 'value'=>'', 'mandatory'=>1, 'errorMsg' => '', 'isError'=>0],
'title' => ['type' => 'string', 'value'=>'', 'mandatory'=>1, 'errorMsg' => '', 'isError'=>0],
'descr' => ['type' => 'text', 'value'=>'', 'mandatory'=>0, 'errorMsg' => '', 'isError'=>0],
'shippingTogether' => ['type' => 'intbool', 'value'=>0, 'mandatory'=>0, 'errorMsg' => '', 'isError'=>0],
'packagePerMember' => ['type' => 'intbool', 'value'=>0, 'mandatory'=>0, 'errorMsg' => '', 'isError'=>0],
'members' => ['type' => 'int', 'value'=>0, 'mandatory'=>0, 'errorMsg' => '', 'isError'=>0],
'paymentDate1' => ['type' => 'date', 'value'=>0, 'mandatory'=>0, 'errorMsg' => '', 'isError'=>0],
'paymentDate2' => ['type' => 'date', 'value'=>0, 'mandatory'=>0, 'errorMsg' => '', 'isError'=>0],
'fulfillmentDate' => ['type' => 'date', 'value'=>0, 'mandatory'=>0, 'errorMsg' => '', 'isError'=>0],
'parentId' => ['type' => 'string', 'value'=>null, 'mandatory'=>0, 'errorMsg' => '', 'isError'=>0],
'parentCode' => ['type' => 'string', 'value'=>'', 'mandatory'=>0, 'errorMsg' => '', 'isError'=>0]
];
if (!is_null($values)) {
if (isset($values['id'])) { $result['id']['value'] = $values['id']; }
if (!empty($values['title'])) { $result['title']['value'] = $values['title']; }
if (!empty($values['descr'])) { $result['descr']['value'] = $values['descr']; }
if (isset($values['shippingTogether'])) { $result['shippingTogether']['value'] = intval($values['shippingTogether']); }
if (isset($values['packagePerMember'])) { $result['packagePerMember']['value'] = intval($values['packagePerMember']); }
if (isset($values['paymentDate1'])) { $result['paymentDate1']['value'] = $values['paymentDate1']; }
if (isset($values['paymentDate2'])) { $result['paymentDate2']['value'] = $values['paymentDate2']; }
if (isset($values['fulfillmentDate'])) { $result['fulfillmentDate']['value'] = $values['fulfillmentDate']; }
if (isset($values['members'])) { $result['members']['value'] = $values['members']; }
if (isset($values['parentId'])) { $result['parentId']['value'] = $values['parentId']; }
if (isset($values['parentCode'])) { $result['parentCode']['value'] = $values['parentCode']; }
}
return $result;
}
private function checkBulkorderUpdateInputValues(array &$inputs, int $chkType=1) : int {
$result = 1;
if (trim($inputs['title']['value'])=='') {
$result=-1;
$inputs['title']['isError'] = 1;
$inputs['title']['errorMsg'] = 'Title is mandatory';
}
if ($chkType==2) {
if (!empty($inputs['members']['value'])) { $inputs['members']['value'] = (int) $inputs['members']['value']; }
if ((int) ($inputs['members']['value']) < 0) {
$result=-1;
$inputs['members']['isError'] = 1;
$inputs['members']['errorMsg'] = 'members is mandatory and should be > 0';
}
}
return $result;
}
private function getFormFieldsFromBulkorderEditRequest(Request $request, $chkType=1, string $parentId='', string $parentCode='') : array {
$v=[
'id' => $request->get('id', ''),
'title' => $request->get('title', ''),
'descr' => $request->get('descr', ''),
'paymentDate1' => $request->get('paymentDate1', 0),
'paymentDate2' => $request->get('paymentDate2', 0),
'fulfillmentDate' => $request->get('fulfillmentDate', 0),
'shippingTogether' => $request->get('shippingTogether', 0),
'packagePerMember' => $request->get('packagePerMember', 0),
];
if ($chkType==2) {
$v['members'] = $request->get('members', 0);
$v['parentId'] = $parentId;
$v['parentCode'] = $parentCode;
}
return $this->getBulkorderFormFields($v);
}
/**
* Update a bulkorder
*
* @Route(
* "/bulkorder/updateBulkorder",
* name="frontend.wosoBulkOrder.updateBulkorder",
* options={"seo"="false"}, methods={"POST"}
* )
*
* @param Request $request
* @param SalesChannelContext $context
*
* @return Response
*
* @throws InconsistentCriteriaIdsException
*/
public function updateBulkorder(Request $request, SalesChannelContext $context): Response
{
$customer = $context->getCustomer();
if ($customer === null || $customer->getGuest() === true) {
$parameters=['redirectTo'=>'frontend.wosoBulkOrder.getBulkOrderList'];
return $this->redirectToRoute('frontend.account.login.page', $parameters);
}
$bulkorderId = (string) $request->get('id');
if ($bulkorderId === '') {
$doCreate = (int) $request->get('doCreate');
$ajax = (int) $request->get('ajax');
if ($doCreate == 1) {
$formfields = $this->getFormFieldsFromBulkorderEditRequest($request);
$error = $this->checkBulkorderUpdateInputValues($formfields);
if ($error > 0) {
$this->bulkorderDataService->createBulkOrderFromFormFields($context, $formfields, $context->getSalesChannelId());
$this->addFlash('success', $this->trans('wosoBulkOrder.account.forms.bulkorderMainForm.msg.update.success'));
} else {
$this->addFlash('danger', $this->trans('wosoBulkOrder.account.forms.bulkorderMainForm.msg.update.error'));
}
return $this->redirectToRoute('frontend.wosoBulkOrder.getBulkOrderList');
} else {
throw new MissingRequestParameterException('id');
}
}
$bulkorder = $this->bulkorderDataService->getBulkOrderByID($bulkorderId, $context);
if (!$bulkorder) {
throw new BulkorderNotFoundException("Bulkorder $bulkorderId not found");
}
$formfields = $this->getFormFieldsFromBulkorderEditRequest($request);
$error = $this->checkBulkorderUpdateInputValues($formfields);
if ($error > 0) {
$this->bulkorderDataService->updateBulkOrderFromFormFields($context, $formfields, $context->getSalesChannelId());
$this->addFlash('success', $this->trans('wosoBulkOrder.account.forms.bulkorderMainForm.msg.update.success'));
} else {
$this->addFlash('danger', $this->trans('wosoBulkOrder.account.forms.bulkorderMainForm.msg.update.error'));
}
return $this->redirectToRoute('frontend.wosoBulkOrder.getBulkOrderList');
}
/**
* request to remove a bulkorder
*
* @Route("/bulkorder/requestRemoveBulkorder/{bulkorderId}", name="frontend.wosoBulkOrder.requestRemoveBulkorder", methods={"GET"})
*
* @param string $bulkorderId
* @param Request $request
* @param SalesChannelContext $context
* @return Response
* @throws InconsistentCriteriaIdsException
* @throws BulkorderNotFoundException
*/
public function requestRemoveBulkorder(string $bulkorderId, Request $request, SalesChannelContext $context): Response
{
$bulkorder = $this->bulkorderDataService->getBulkorderById($bulkorderId, $context);
if (!$bulkorder) {
throw new BulkorderNotFoundException($bulkorderId);
}
if ($this->bulkorderDataService->hasAccessToBulkorder($bulkorder, $context, true)) {
return $this->renderStorefront('@wosoBulkOrder/storefront/page/account/component/bulk-order-requestdelete.html.twig', [
'bulkorder' => $bulkorder
]);
} else {
$this->addFlash('danger', $this->trans('wosoBulkOrder.account.forms.bulkorderMainForm.msg.userNotallowed'));
}
return $this->redirectToRoute('frontend.wosoBulkOrder.getBulkOrderList');
}
/**
* Removes a bulkorder
*
* @Route("/bulkorder/removeBulkorder/{bulkorderId}", name="frontend.wosoBulkOrder.removeBulkorder", methods={"GET"})
*
* @param string $bulkorderId
* @param Request $request
* @param SalesChannelContext $context
* @return Response
* @throws InconsistentCriteriaIdsException
* @throws BulkorderNotFoundException
*/
public function removeBulkorder(string $bulkorderId, Request $request, SalesChannelContext $context): Response
{
$bulkorder = $this->bulkorderDataService->getBulkorderById($bulkorderId, $context);
if (!$bulkorder) {
throw new BulkorderNotFoundException($bulkorderId);
}
if ($this->bulkorderDataService->hasAccessToBulkorder($bulkorder, $context, true)) {
$this->bulkorderDataService->removeBulkOrder($bulkorder, $context);
$this->addFlash('success', $this->trans('wosoBulkOrder.account.forms.bulkorderMainForm.msg.remove.success'));
} else {
$this->addFlash('danger', $this->trans('wosoBulkOrder.account.forms.bulkorderMainForm.msg.userNotallowed'));
}
return $this->redirectToRoute('frontend.wosoBulkOrder.getBulkOrderList');
}
/**
* generates Edit-Output to change bulkorder-maininfo
* @Route("/bulkorder/editBulkorderModal/{bulkorderId}", name="frontend.wosoBulkOrder.editBulkOrderModal", methods={"GET"})
* @param string $bulkorderId
* @param Request $request
* @param SalesChannelContext $context
*
*/
public function editBulkOrderModal(string $bulkorderId, Request $request, SalesChannelContext $context): Response
{
$bulkorder = $this->bulkorderDataService->getBulkorderById($bulkorderId, $context);
if (!$bulkorder) {
throw new BulkorderNotFoundException($bulkorderId);
}
if ($this->bulkorderDataService->hasAccessToBulkorder($bulkorder, $context, true)) {
return $this->renderStorefront('@wosoBulkOrder/storefront/page/account/component/bulk-order-mainform.html.twig', [
'bulkorder' => $bulkorder,
'doCreate' => 0
]);
} else {
throw new AccessDeniedException($bulkorderId);
}
}
/**
* generates List of Products of bulkorder for editing in account
* @Route("/bulkorder/editBulkorderProductsModal/{bulkorderId}", name="frontend.wosoBulkOrder.editBulkOrderProductsModal", methods={"GET"})
* @param string $bulkorderId
* @param Request $request
* @param SalesChannelContext $context
*
*/
public function editBulkOrderProductsModal(string $bulkorderId, Request $request, SalesChannelContext $context): Response
{
$bulkorder = $this->bulkorderDataService->getBulkorderById($bulkorderId, $context, $this->bulkorderDataService::C_BO_ENRICH_PRODUCTS);
if (!$bulkorder) {
throw new BulkorderNotFoundException($bulkorderId);
}
if (!$this->bulkorderDataService->hasAccessToBulkorder($bulkorder, $context, true)) {
throw new AccessDeniedException($bulkorderId);
}
$wosoBulkorderData = ['productListCount'=>0, 'productList'=>[]];
$prodIdList = $this->bulkorderDataService->getProductIDsFromBulkorder($bulkorder);
if (!empty($prodIdList)) {
$prodList = $this->bulkorderDataService->getBOProductListByIds($prodIdList, $context);
$wosoBulkorderData['productList'] = $prodList;
$wosoBulkorderData['productListCount'] = count($prodList);
}
/*product-add-to-cart-test
foreach ($bulkorder->getProducts() as $boProduct) {
$this->bulkorderDataService->addProductToCart($bulkorder->getCode(), $boProduct, $context, 1);
}
*/
return $this->renderStorefront('@wosoBulkOrder/storefront/page/account/component/product-editform.html.twig', [
'bulkorder' => $bulkorder,
'wosoBulkOrderData' => $wosoBulkorderData
]);
}
/**
* shows data to finish bulkorder-process
* @Route("/bulkorder/finishBulkorderModal/{bulkorderId}", name="frontend.wosoBulkOrder.finishBulkOrderModal", methods={"GET"})
* @param string $bulkorderId
* @param Request $request
* @param SalesChannelContext $context
*
*/
public function finishBulkOrderModal(string $bulkorderId, Request $request, SalesChannelContext $context): Response
{
$bulkorder = $this->bulkorderDataService->getBulkorderById($bulkorderId, $context, $this->bulkorderDataService::C_BO_ENRICH_PRODUCTS | $this->bulkorderDataService::C_BO_ENRICH_GROUPS);
if (!$bulkorder) {
throw new BulkorderNotFoundException($bulkorderId);
}
if (!$this->bulkorderDataService->hasAccessToBulkorder($bulkorder, $context, true)) {
throw new AccessDeniedException($bulkorderId);
}
$wosoBulkorderData = ['productListCount'=>0, 'productList'=>[]];
$prodIdList = $this->bulkorderDataService->getProductIDsFromBulkorder($bulkorder);
if (!empty($prodIdList)) {
$prodList = $this->bulkorderDataService->getBOProductListByIds($prodIdList, $context);
$pl = [];
foreach ($prodList as $prod) {
$pl[$prod->getId()] = $prod;
}
$this->bulkorderDataService->setPricesToBulkorderProducts($bulkorder, $pl, $context);
$wosoBulkorderData['productList'] = $pl;
$wosoBulkorderData['productListCount'] = count($pl);
}
return $this->renderStorefront('@wosoBulkOrder/storefront/page/account/component/finish-form.html.twig', [
'bulkorder' => $bulkorder,
'wosoBulkOrderData' => $wosoBulkorderData
]);
}
/**
* executes the finish bulkorder-process data
* @Route("/bulkorder/finishBulkorderExecute", name="frontend.wosoBulkOrder.finishBulkOrderExecute", methods={"POST"})
* @param Request $request
* @param SalesChannelContext $context
*
*/
public function finishBulkOrderExecute(Request $request, SalesChannelContext $context): Response
{
$bulkorderId = (string) $request->get('id');
$bulkorder = $this->bulkorderDataService->getBulkorderById($bulkorderId, $context, $this->bulkorderDataService::C_BO_ENRICH_PRODUCTS | $this->bulkorderDataService::C_BO_ENRICH_GROUPS);
if (!$bulkorder) {
throw new BulkorderNotFoundException($bulkorderId);
}
if (!$this->bulkorderDataService->hasAccessToBulkorder($bulkorder, $context, true)) {
throw new AccessDeniedException($bulkorderId);
}
if ($bulkorder->isReadyToFinish() <= 0) {
$this->addFlash('danger', $this->trans('wosoBulkOrder.account.forms.finishForm.msg.update.errorNotReady'));
return $this->redirectToRoute('frontend.wosoBulkOrder.getBulkOrderList');
}
$wosoBulkorderData = ['productListCount'=>0, 'productList'=>[]];
$prodIdList = $this->bulkorderDataService->getProductIDsFromBulkorder($bulkorder);
if (empty($prodIdList)) {
$this->addFlash('danger', $this->trans('wosoBulkOrder.account.forms.finishForm.msg.update.errorNotReady'));
return $this->redirectToRoute('frontend.wosoBulkOrder.getBulkOrderList');
}
if ($this->bulkorderDataService->hasAccessToBulkorder($bulkorder, $context, true)) {
$setState = $this->bulkorderDataService::C_BO_STATUS_ACTIVATED;
$flashInfo = $this->trans('wosoBulkOrder.account.forms.finishForm.msg.activate.success');
if ($bulkorder->getStatus() >= $this->bulkorderDataService::C_BO_STATUS_ACTIVATED) {
$setState = $this->bulkorderDataService::C_BO_STATUS_DEACTIVATED;
$flashInfo = $this->trans('wosoBulkOrder.account.forms.finishForm.msg.deactivate.success');
}
$this->bulkorderDataService->updateBulkorderStatus($bulkorder, $setState, $context);
$this->addFlash('success', $flashInfo);
} else {
$this->addFlash('danger', $this->trans('wosoBulkOrder.account.forms.finishForm.msg.userNotallowed'));
}
return $this->redirectToRoute('frontend.wosoBulkOrder.getBulkOrderList');
}
/**
* removes product-item from bulkorder-list in account-mode
* @Route("/bulkorder/product/removeProductFromBulkorderAccount/{bulkorderId}/{productId}", name="frontend.wosoBulkOrder.product.accountRemoveItem", methods={"GET"})
* @param string $bulkorderId
* @param string $productId
* @param Request $request
* @param SalesChannelContext $context
*
*/
public function productRemoveProductFromBulkorderAccount(string $bulkorderId, string $productId, Request $request, SalesChannelContext $context): Response
{
$customer = $context->getCustomer();
if ($customer === null || $customer->getGuest() === true) {
$parameters=['redirectTo'=>'frontend.wosoBulkOrder.editBulkOrderProductsModal'];
return $this->redirectToRoute('frontend.account.login.page', $parameters);
}
$bulkorder = $this->bulkorderDataService->getBulkorderById($bulkorderId, $context, $this->bulkorderDataService::C_BO_ENRICH_PRODUCTS);
if (!$bulkorder) {
throw new BulkorderNotFoundException($bulkorderId);
}
if (!$this->bulkorderDataService->hasAccessToBulkorder($bulkorder, $context, true)) {
throw new AccessDeniedException($bulkorderId);
}
$succ = $this->bulkorderDataService->removeProductFromBulkorder($bulkorder, $productId, $context);
if ($succ) {
$this->addFlash('success', $this->trans('wosoBulkOrder.account.forms.groupEditForm.msg.update.success'));
} else {
$this->addFlash('danger', $this->trans('wosoBulkOrder.account.forms.groupEditForm.msg.update.error'));
}
$parameters=['bulkorderId'=>$bulkorderId];
return $this->redirectToRoute('frontend.wosoBulkOrder.editBulkOrderProductsModal', $parameters);
}
/**
* removes product-item from bulkorder-list in account-mode
* @Route("/bulkorder/product/productAccountTogglePrio/{bulkorderId}/{productId}/{toggleTo}", name="frontend.wosoBulkOrder.product.accountToggleItemPrio", methods={"GET"})
* @param string $bulkorderId
* @param string $productId
* @param string $toggleTo
* @param Request $request
* @param SalesChannelContext $context
*
*/
public function productAccountTogglePrio(string $bulkorderId, string $productId, string $toggleTo, Request $request, SalesChannelContext $context): Response
{
$customer = $context->getCustomer();
if ($customer === null || $customer->getGuest() === true) {
$parameters=['redirectTo'=>'frontend.wosoBulkOrder.editBulkOrderProductsModal'];
return $this->redirectToRoute('frontend.account.login.page', $parameters);
}
$bulkorder = $this->bulkorderDataService->getBulkorderById($bulkorderId, $context, $this->bulkorderDataService::C_BO_ENRICH_PRODUCTS);
if (!$bulkorder) {
throw new BulkorderNotFoundException($bulkorderId);
}
if (!$this->bulkorderDataService->hasAccessToBulkorder($bulkorder, $context, true)) {
throw new AccessDeniedException($bulkorderId);
}
$mandatory = intval($toggleTo);
$succ = $this->bulkorderDataService->toggleProductMandatory($bulkorder, $productId, $mandatory, $context);
if ($succ) {
$this->addFlash('success', $this->trans('wosoBulkOrder.account.forms.groupEditForm.msg.update.success'));
} else {
$this->addFlash('danger', $this->trans('wosoBulkOrder.account.forms.groupEditForm.msg.update.error'));
}
$parameters=['bulkorderId'=>$bulkorderId];
return $this->redirectToRoute('frontend.wosoBulkOrder.editBulkOrderProductsModal', $parameters);
}
/**
* generates create-Output to create bulkorder-maininfo
* @Route("/bulkorder/createBulkorderModal", name="frontend.wosoBulkOrder.createBulkOrderModal", methods={"GET"})
* @param Request $request
* @param SalesChannelContext $context
*
*/
public function createBulkOrderModal(Request $request, SalesChannelContext $context): Response
{
$bulkorder = $this->bulkorderDataService->getNewBulkorderEntity();
return $this->renderStorefront('@wosoBulkOrder/storefront/page/account/component/bulk-order-mainform.html.twig', [
'bulkorder' => $bulkorder,
'doCreate' => 1
]);
}
/**
* generates Data of bulk order with a special guid or empty data for showing blank page to add new bulk order.
* @Route("/getOrderData", name="frontend.wosoBulkOrder.getOrderData", methods={"GET"})
*/
public function getOrderData(): Response
{
return $this->renderStorefront('@SwagBasicExample/storefront/page/example.html.twig', [
'wosoBulkOrderData' => [
'id' => 1,
'guid' => '1234',
'bulkOrderCode' => 'Abd87dSx'
]
]);
}
private function returnErrorResponse($msg) : JsonResponse
{
$response = new JsonResponse($msg);
return $response;
}
/**
* returns true, if authentication is valid, otherwise false
* @param string $ip
* @param string $authCode
* @return bool
*/
public function getExtCheckAccess(string $ip, string $authCode) : bool {
$ret = false;
if ($authCode == self::extAccessToken) { $ret = true; }
return $ret;
}
/**
* creates a bulkorder-entry for external use (i.e. navision)
* checks authToken and maybe ip-address if valid
* param string|null title
* param int|null $status
* param string|null $parentBulkorderCode
* param string extAuthToken
* return json with bulkorderCode
*
* @Route("/getExtBulkOrderCode", name="frontend.wosoBulkOrder.getExtBulkOrderCode", methods={"GET"})
*/
public function getExtBulkOrderCode(Request $request, SalesChannelContext $context): JsonResponse
{
$extIp = $request->getClientIp();
$extAuthToken = $request->get('extAuthToken');
$extTitle = $request->get('title');
if (trim($extTitle)=='') { $extTitle = 'external request'; }
$extStatus = $request->get('status');
if (is_null($extStatus)) { $extStatus = $this->bulkorderDataService::C_BO_STATUS_EXTERNAL; }
$parentBulkorderCode = $request->get('parentBulkOrderCode');
if (!$parentBulkorderCode) {
$parentBulkorderCode = '';
} else {
$checkOK = $this->bulkorderDataService->checkBulkorderCodeString($parentBulkorderCode);
if ($checkOK == 0) {
return $this->returnErrorResponse(['yourIP' => $extIp, 'yourStatus' => -1000, 'parent bulkorder-code:' => $parentBulkorderCode, 'errorMsg' => 'The parent-bulkorder-code you transmitted, is not correct: '.$parentBulkorderCode]);
}
$parentBulkorder = $this->bulkorderDataService->getBulkOrderByCode($parentBulkorderCode, $context);
if (is_null($parentBulkorder)) {
return $this->returnErrorResponse(['yourIP' => $extIp, 'yourStatus' => -1001, 'parent bulkorder-code:' => $parentBulkorderCode, 'errorMsg' => 'The parent-bulkorder-code you transmitted, can not be found. Please create parent bulkorder first! ']);
}
if (!is_null($parentBulkorder->getUserId())) {
return $this->returnErrorResponse(['yourIP' => $extIp, 'yourStatus' => -1002, 'parent bulkorder-code:' => $parentBulkorderCode, 'errorMsg' => 'The parent-bulkorder-code you transmitted, can not be used for external requests! ']);
}
}
$bulkorderCode = '';
$valid = $this->getExtCheckAccess($extIp, $extAuthToken);
if ($valid) {
$bulkorder = $this->bulkorderDataService->createBulkorder($context, $extTitle, $extStatus, null, $parentBulkorderCode);
if ($bulkorder) {
$bulkorderCode = $bulkorder->getCode();
}
}
$response = new JsonResponse([
'yourIP' => $extIp,
'yourStatus' => $extStatus,
'yourTitle' => $extTitle,
'authValid' => $valid,
'bulkorderCode' => $bulkorderCode
]);
return $response;
}
/**
* return list of bulkorders created after a dedicated date with status > 1000
* checks authToken and maybe ip-address if valid
* param string|null date
* param string extAuthToken
* return json resultcode > 0 count of new
*
* @Route("/getExtBulkOrderListFromDate", name="frontend.wosoBulkOrder.getExtBulkOrderListFromDate", methods={"GET"})
*/
public function getExtBulkOrderListFromDate(Request $request, SalesChannelContext $context): JsonResponse
{
$extIp = $request->getClientIp();
$extAuthToken = $request->get('extAuthToken');
$extDate = $request->get('date');
if (empty($extDate)) { $extDate = '2022-02-05 01:01:01'; }
$extState = $request->get('state');
if (is_null($extState)) { $extState = $this->bulkorderDataService::C_BO_STATUS_MINACTIVE; } else { $extState = intval($extState); }
$valid = $this->getExtCheckAccess($extIp, $extAuthToken);
$resultCode = -100;
$result = [];
if ($valid) {
$resultCode = 0;
$r = $this->bulkorderDataService->getBulkOrderByDateAndState($extDate, $extState, $context, ($this->bulkorderDataService::C_BO_ENRICH_GROUPS | $this->bulkorderDataService::C_BO_ENRICH_PRODUCTS | $this->bulkorderDataService::C_BO_ENRICH_USERDATA) );
if (!is_null($r)) {
foreach ($r as $k => $res) {
$result[$k] = $res;
$resultCode++;
}
}
}
$response = new JsonResponse([
'yourIP' => $extIp,
'resultCode' => $resultCode,
'requestDate' => $extDate,
'requestState' => $extState,
'result' => $result
]);
return $response;
}
/**
* request to remove a bulkorder
*
* @Route("/bulkorder/requestRemoveGroup/{bulkorderGroupId}", name="frontend.wosoBulkOrder.requestRemoveGroup", methods={"GET"})
*
* @param string $bulkorderGroupId
* @param Request $request
* @param SalesChannelContext $context
* @return Response
* @throws InconsistentCriteriaIdsException
* @throws BulkorderNotFoundException
*/
public function requestRemoveGroup(string $bulkorderGroupId, Request $request, SalesChannelContext $context): Response
{
$bulkorderGroup = $this->bulkorderDataService->getBulkorderById($bulkorderGroupId, $context);
if (!$bulkorderGroup) {
throw new BulkorderNotFoundException($bulkorderGroupId);
}
$bulkorder = $this->bulkorderDataService->getBulkorderById($bulkorderGroup->getParentId(), $context);
if (!$bulkorder) {
throw new BulkorderNotFoundException($bulkorderGroup->getParentId());
}
if ( ($this->bulkorderDataService->hasAccessToBulkorder($bulkorderGroup, $context, true)) &&
($this->bulkorderDataService->hasAccessToBulkorder($bulkorder, $context, true)) ){
return $this->renderStorefront('@wosoBulkOrder/storefront/page/account/component/group-requestdelete.html.twig', [
'bulkorderGroup' => $bulkorderGroup
]);
} else {
$this->addFlash('danger', $this->trans('wosoBulkOrder.account.forms.bulkorderMainForm.msg.userNotallowed'));
}
return $this->redirectToRoute('frontend.wosoBulkOrder.getBulkOrderList');
}
/**
* Removes a bulkorder
*
* @Route("/bulkorder/removeGroup/{bulkorderGroupId}", name="frontend.wosoBulkOrder.removeGroup", methods={"GET"})
*
* @param string $bulkorderGroupId
* @param Request $request
* @param SalesChannelContext $context
* @return Response
* @throws InconsistentCriteriaIdsException
* @throws BulkorderNotFoundException
*/
public function removeGroup(string $bulkorderGroupId, Request $request, SalesChannelContext $context): Response
{
$bulkorderGroup = $this->bulkorderDataService->getBulkorderById($bulkorderGroupId, $context);
if (!$bulkorderGroup) {
throw new BulkorderNotFoundException($bulkorderGroupId);
}
$bulkorder = $this->bulkorderDataService->getBulkorderById($bulkorderGroup->getParentId(), $context);
if (!$bulkorder) {
throw new BulkorderNotFoundException($bulkorderGroup->getParentId());
}
if ( ($this->bulkorderDataService->hasAccessToBulkorder($bulkorderGroup, $context, true)) &&
($this->bulkorderDataService->hasAccessToBulkorder($bulkorder, $context, true)) ){
$this->bulkorderDataService->removeBulkOrder($bulkorderGroup, $context);
$this->addFlash('success', $this->trans('wosoBulkOrder.account.forms.groupEditForm.msg.remove.success'));
} else {
throw new AccessDeniedException($bulkorderGroupId);
}
return $this->redirectToRoute('frontend.wosoBulkOrder.getBulkOrderList');
}
/**
* generates Edit-Output to change bulkorder-group-data
* @Route("/bulkorder/editGroupModal/{bulkorderGroupId}", name="frontend.wosoBulkOrder.editGroupModal", methods={"GET"})
* @param string $bulkorderGroupId
* @param Request $request
* @param SalesChannelContext $context
*
*/
public function editGroupModal(string $bulkorderGroupId, Request $request, SalesChannelContext $context): Response
{
$bulkorderGroup = $this->bulkorderDataService->getBulkorderById($bulkorderGroupId, $context);
if (!$bulkorderGroup) {
throw new BulkorderNotFoundException($bulkorderGroupId);
}
$bulkorder = $this->bulkorderDataService->getBulkorderById($bulkorderGroup->getParentId(), $context);
if (!$bulkorder) {
throw new BulkorderNotFoundException($bulkorderGroup->getParentId());
}
if ( ($this->bulkorderDataService->hasAccessToBulkorder($bulkorderGroup, $context, true)) &&
($this->bulkorderDataService->hasAccessToBulkorder($bulkorder, $context, true)) ){
return $this->renderStorefront('@wosoBulkOrder/storefront/page/account/component/group-editform.html.twig', [
'bulkorder' => $bulkorder,
'bulkorderGroup' => $bulkorderGroup,
'doCreate' => 0
]);
} else {
throw new AccessDeniedException($bulkorderGroupId);
}
}
/**
* generates create-Output to create bulkorder-groupdata
* @Route("/bulkorder/createGroupModal/{bulkorderId}", name="frontend.wosoBulkOrder.createGroupModal", methods={"GET"})
* @param Request $request
* @param SalesChannelContext $context
*
*/
public function createGroupModal(string $bulkorderId, Request $request, SalesChannelContext $context): Response
{
$bulkorder = $this->bulkorderDataService->getBulkorderById($bulkorderId, $context);
if (!$bulkorder) {
throw new BulkorderNotFoundException($bulkorderId);
}
if ($this->bulkorderDataService->hasAccessToBulkorder($bulkorder, $context, true)) {
$bulkorderGroup = $this->bulkorderDataService->getNewBulkorderEntity();
$bulkorderGroup->setMembers(1);
return $this->renderStorefront('@wosoBulkOrder/storefront/page/account/component/group-editform.html.twig', [
'bulkorder' => $bulkorder,
'bulkorderGroup' => $bulkorderGroup,
'doCreate' => 1
]);
} else {
throw new AccessDeniedException($bulkorderId);
}
}
/**
* Update a bulkorderGroup
*
* @Route(
* "/bulkorder/updateBulkorderGroup",
* name="frontend.wosoBulkOrder.updateBulkorderGroup",
* options={"seo"="false"}, methods={"POST"}
* )
*
* @param Request $request
* @param SalesChannelContext $context
*
* @return Response
*
* @throws InconsistentCriteriaIdsException
*/
public function updateBulkorderGroup(Request $request, SalesChannelContext $context): Response
{
$customer = $context->getCustomer();
if ($customer === null || $customer->getGuest() === true) {
$parameters=['redirectTo'=>'frontend.wosoBulkOrder.getBulkOrderList'];
return $this->redirectToRoute('frontend.account.login.page', $parameters);
}
$bulkorderId = (string) $request->get('bulkorderId');
$bulkorder = $this->bulkorderDataService->getBulkorderById($bulkorderId, $context);
if (!$bulkorder) {
throw new BulkorderNotFoundException($bulkorderId);
}
if (!$this->bulkorderDataService->hasAccessToBulkorder($bulkorder, $context, true)) {
throw new AccessDeniedException($bulkorderId);
}
$bulkorderGroupId = (string) $request->get('id');
if ($bulkorderGroupId === '') {
$doCreate = (int) $request->get('doCreate');
$ajax = (int) $request->get('ajax');
if ($doCreate == 1) {
$formfields = $this->getFormFieldsFromBulkorderEditRequest($request, 2, $bulkorderId, $bulkorder->getCode());
$error = $this->checkBulkorderUpdateInputValues($formfields,2);
if ($error > 0) {
$this->bulkorderDataService->createBulkOrderGroupFromFormFields($context, $formfields, $context->getSalesChannelId());
$this->addFlash('success', $this->trans('wosoBulkOrder.account.forms.groupEditForm.msg.update.success'));
} else {
$this->addFlash('danger', $this->trans('wosoBulkOrder.account.forms.groupEditForm.msg.update.error'));
}
return $this->redirectToRoute('frontend.wosoBulkOrder.getBulkOrderList');
} else {
throw new MissingRequestParameterException('id');
}
}
$bulkorder = $this->bulkorderDataService->getBulkOrderByID($bulkorderGroupId, $context);
if (!$bulkorder) {
throw new BulkorderNotFoundException("Bulkordergroup $bulkorderGroupId not found");
}
$formfields = $this->getFormFieldsFromBulkorderEditRequest($request, 2, $bulkorderId, $bulkorder->getCode());
$error = $this->checkBulkorderUpdateInputValues($formfields,2);
if ($error > 0) {
$this->bulkorderDataService->updateBulkOrderGroupFromFormFields($context, $formfields, $context->getSalesChannelId());
$this->addFlash('success', $this->trans('wosoBulkOrder.account.forms.groupEditForm.msg.update.success'));
} else {
$this->addFlash('danger', $this->trans('wosoBulkOrder.account.forms.groupEditForm.msg.update.error'));
}
return $this->redirectToRoute('frontend.wosoBulkOrder.getBulkOrderList');
}
/**
* generates List of Bulkorders by Customer to add products on product-page
* @Route("/bulkorder/product/getBulkorderlist/{productId}", name="frontend.wosoBulkOrder.product.getBulkorderlist", methods={"GET"})
* @param string $productId
* @param Request $request
* @param SalesChannelContext $context
*
*/
public function productGetBulkorderList(string $productId, Request $request, SalesChannelContext $context): Response
{
$customer = $context->getCustomer();
if ($customer === null || $customer->getGuest() === true) {
return $this->renderStorefront('@wosoBulkOrder/storefront/page/product-detail/bulk-order-container.html.twig', [
'bulkorderList' => [],
'productId' => $productId,
'noCustomer' => 1
]);
}
$list = $this->bulkorderDataService->getBulkOrderByCustomerID($customer->getId(), $context, $this->bulkorderDataService::C_BO_ENRICH_PRODUCTS);
return $this->renderStorefront('@wosoBulkOrder/storefront/page/product-detail/bulk-order-container.html.twig', [
'bulkorderList' => $list,
'productId' => $productId,
'noCustomer' => 0,
'didEdit' => 0
]);
}
/**
* removes product-item from bulkorder-list
* @Route("/bulkorder/product/removeProductFromBulkorder/{bulkorderId}/{productId}", name="frontend.wosoBulkOrder.product.removeItem", methods={"GET"})
* @param string $bulkorderId
* @param string $productId
* @param Request $request
* @param SalesChannelContext $context
*
*/
public function productRemoveProductFromBulkorder(string $bulkorderId, string $productId, Request $request, SalesChannelContext $context): Response
{
$customer = $context->getCustomer();
if ($customer === null || $customer->getGuest() === true) {
return $this->renderStorefront('@wosoBulkOrder/storefront/page/product-detail/bulk-order-container.html.twig', [
'bulkorderList' => [],
'noCustomer' => 1,
'didEdit' => 0
]);
}
$bulkorder = $this->bulkorderDataService->getBulkorderById($bulkorderId, $context, $this->bulkorderDataService::C_BO_ENRICH_PRODUCTS);
if (!$bulkorder) {
throw new BulkorderNotFoundException($bulkorderId);
}
if (!$this->bulkorderDataService->hasAccessToBulkorder($bulkorder, $context, true)) {
throw new AccessDeniedException($bulkorderId);
}
$succ = $this->bulkorderDataService->removeProductFromBulkorder($bulkorder, $productId, $context);
$list = $this->bulkorderDataService->getBulkOrderByCustomerID($customer->getId(), $context, $this->bulkorderDataService::C_BO_ENRICH_PRODUCTS);
if ($succ) {
$this->addFlash('success', $this->trans('wosoBulkOrder.account.forms.groupEditForm.msg.update.success'));
} else {
$this->addFlash('danger', $this->trans('wosoBulkOrder.account.forms.groupEditForm.msg.update.error'));
}
return $this->renderStorefront('@wosoBulkOrder/storefront/page/product-detail/bulk-order-container.html.twig', [
'bulkorderList' => $list,
'productId' => $productId,
'noCustomer' => 0,
'didEdit' => 1
]);
}
/**
* add product-item to bulkorder-list
* @Route("/bulkorder/product/addProductToBulkorder/{bulkorderId}/{productId}", name="frontend.wosoBulkOrder.product.addItem", methods={"GET"})
* @param string $bulkorderId
* @param string $productId
* @param Request $request
* @param SalesChannelContext $context
*
*/
public function productAddProductToBulkorder(string $bulkorderId, string $productId, Request $request, SalesChannelContext $context): Response
{
$customer = $context->getCustomer();
if ($customer === null || $customer->getGuest() === true) {
return $this->renderStorefront('@wosoBulkOrder/storefront/page/product-detail/bulk-order-container.html.twig', [
'bulkorderList' => [],
'noCustomer' => 1,
'didEdit' => 0
]);
}
$bulkorder = $this->bulkorderDataService->getBulkorderById($bulkorderId, $context, $this->bulkorderDataService::C_BO_ENRICH_PRODUCTS);
if (!$bulkorder) {
throw new BulkorderNotFoundException($bulkorderId);
}
if (!$this->bulkorderDataService->hasAccessToBulkorder($bulkorder, $context, true)) {
throw new AccessDeniedException($bulkorderId);
}
$this->bulkorderDataService->addProductToBulkorder($bulkorder, $productId, $context);
$list = $this->bulkorderDataService->getBulkOrderByCustomerID($customer->getId(), $context, $this->bulkorderDataService::C_BO_ENRICH_PRODUCTS);
$this->addFlash('success', $this->trans('wosoBulkOrder.account.forms.groupEditForm.msg.update.success'));
return $this->renderStorefront('@wosoBulkOrder/storefront/page/product-detail/bulk-order-container.html.twig', [
'bulkorderList' => $list,
'productId' => $productId,
'noCustomer' => 0,
'didEdit' => 1
]);
}
/**
* show storefront of bulkorder to customer for ordering
* @Route("/bulkorder/order/{bulkorderCode}", name="frontend.wosoBulkOrder.order", methods={"GET"})
* @param string $bulkorderCode
* @param Request $request
* @param SalesChannelContext $context
*
*/
public function showBulkorder(string $bulkorderCode, Request $request, SalesChannelContext $context): Response
{
$customer = $context->getCustomer();
$bulkorder = $this->bulkorderDataService->getBulkOrderByCode($bulkorderCode, $context, $this->bulkorderDataService::C_BO_ENRICH_PRODUCTS);
if (!$bulkorder) {
throw new BulkorderNotFoundException($bulkorderCode);
}
$prodIdList = $this->bulkorderDataService->getProductIDsFromBulkorder($bulkorder);
if (empty($prodIdList)) {
throw new BulkorderNotFoundException($bulkorderCode);
}
$prodList = $this->bulkorderDataService->getBOProductListByIds($prodIdList, $context);
$page = $this->genericPageLoader->load($request, $context);
$page = ProductPage::createFrom($page);
$page->setProduct($prodList->first());
return $this->renderStorefront('@wosoBulkOrder/storefront/page/order/order-main.html.twig', [
'bulkorder' => $bulkorder,
'productList' => $prodList,
'page' => $page,
'noCustomer' => 0
]);
}
}