src/Controller/AccountController.php line 93

Open in your IDE?
  1. <?php
  2. /**
  3.  * Pimcore
  4.  *
  5.  * This source file is available under two different licenses:
  6.  * - GNU General Public License version 3 (GPLv3)
  7.  * - Pimcore Enterprise License (PEL)
  8.  * Full copyright and license information is available in
  9.  * LICENSE.md which is distributed with this source code.
  10.  *
  11.  *  @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  12.  *  @license    http://www.pimcore.org/license     GPLv3 and PEL
  13.  */
  14. namespace App\Controller;
  15. use App\EventListener\AuthenticationLoginListener;
  16. use App\Form\LoginFormType;
  17. use App\Form\RegistrationFormHandler;
  18. use App\Form\RegistrationFormType;
  19. use App\Model\Customer;
  20. use App\Model\PreOrderItem;
  21. use App\Model\PurchaseOrder;
  22. use App\Services\CurlService;
  23. use App\Services\NewsletterDoubleOptInService;
  24. use App\Services\PasswordRecoveryService;
  25. use CustomerManagementFrameworkBundle\CustomerProvider\CustomerProviderInterface;
  26. use CustomerManagementFrameworkBundle\CustomerSaveValidator\Exception\DuplicateCustomerException;
  27. use CustomerManagementFrameworkBundle\Model\CustomerInterface;
  28. use CustomerManagementFrameworkBundle\Security\Authentication\LoginManagerInterface;
  29. use CustomerManagementFrameworkBundle\Security\OAuth\Exception\AccountNotLinkedException;
  30. use CustomerManagementFrameworkBundle\Security\OAuth\OAuthRegistrationHandler;
  31. use CustomerManagementFrameworkBundle\Security\SsoIdentity\SsoIdentityServiceInterface;
  32. use HWI\Bundle\OAuthBundle\OAuth\Response\UserResponseInterface;
  33. use HWI\Bundle\OAuthBundle\Security\Core\Authentication\Token\OAuthToken;
  34. use Pimcore\Bundle\EcommerceFrameworkBundle\Factory;
  35. use Pimcore\Bundle\EcommerceFrameworkBundle\OrderManager\Order\Listing\Filter\CustomerObject;
  36. use Pimcore\DataObject\Consent\Service;
  37. use Pimcore\Translation\Translator;
  38. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  39. use Symfony\Component\HttpFoundation\RedirectResponse;
  40. use Symfony\Component\HttpFoundation\Request;
  41. use Symfony\Component\HttpFoundation\Response;
  42. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  43. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  44. use Symfony\Component\Routing\Annotation\Route;
  45. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  46. use Symfony\Component\Security\Core\User\UserInterface;
  47. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  48. use Symfony\Component\Uid\Uuid;
  49. use App\Model\Order;
  50. use Knp\Component\Pager\Pagination\SlidingPagination;
  51. use Knp\Component\Pager\PaginatorInterface;
  52. use Pimcore\Model\DataObject;
  53. use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
  54. use Box\Spout\Common\Entity\Row;
  55. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  56. use FrontendPermissionToolkitBundle\Service as FrontenKitService;
  57. use Symfony\Component\Security\Core\Security as SymfonySecurity;
  58. use Doctrine\ORM\EntityManagerInterface;
  59. use App\Model\Utility;
  60. /**
  61.  * Class AccountController
  62.  *
  63.  * Controller that handles all account functionality, including register, login and connect to SSO profiles
  64.  */
  65. class AccountController extends BaseController
  66. {
  67.     const LIMIT_PER_PAGE 10;
  68.     protected $service;
  69.     public $security;
  70.     public function __construct(EventDispatcherInterface $eventDispatcher,SymfonySecurity $security)
  71.     {
  72.         $this->service = new FrontenKitService($eventDispatcher);
  73.         if($security->getUser() && $security->getUser()->getUserRoles() == 'customer'){
  74.             return $this->redirectToRoute('b2c-account-index');
  75.         }
  76.     }
  77.     /**
  78.      * @Route("/account/login", name="account-login")
  79.      *
  80.      * @param AuthenticationUtils $authenticationUtils
  81.      * @param OAuthRegistrationHandler $oAuthHandler
  82.      * @param SessionInterface $session
  83.      * @param Request $request
  84.      * @param UserInterface|null $user
  85.      *
  86.      * @return Response|RedirectResponse
  87.      */
  88.     public function loginAction(
  89.         AuthenticationUtils $authenticationUtils,
  90.         OAuthRegistrationHandler $oAuthHandler,
  91.         SessionInterface $session,
  92.         Request $request,
  93.         UserInterface $user null
  94.     ) {
  95.         \Pimcore\Cache::disable();
  96.         //redirect user to index page if logged in
  97.         if ($user && $this->isGranted('ROLE_USER')) {
  98.             return $this->redirectToRoute('account-index');
  99.         }
  100.         // get the login error if there is one
  101.         $error $authenticationUtils->getLastAuthenticationError();
  102.         // OAuth handling - the OAuth authenticator is configured to return to the login page on errors
  103.         // (see failure_path configuration) - therefore we can fetch the last authentication error
  104.         // here. If the error is an AccountNotLinkedException (as thrown by our user provider) save the
  105.         // OAuth token to the session and redirect to registration with a special key which can be used
  106.         // to load the token to prepopulate the registration form with account data.
  107.         if ($error instanceof AccountNotLinkedException) {
  108.             // this can be anything - for simplicity we just use an UUID as it is unique and random
  109.             $registrationKey = (string) Uuid::v4()->toRfc4122();
  110.             $oAuthHandler->saveToken($registrationKey$error->getToken());
  111.             return $this->redirectToRoute('account-register', [
  112.                 'registrationKey' => $registrationKey
  113.             ]);
  114.         }
  115.         // last username entered by the user
  116.         $lastUsername $authenticationUtils->getLastUsername();
  117.         $formData = [
  118.             '_username' => $lastUsername
  119.         ];
  120.         $form $this->createForm(LoginFormType::class, $formData, [
  121.             'action' => $this->generateUrl('account-login'),
  122.         ]);
  123.        // p_r($request->headers->get('referer'));exit;
  124.         //store referer in session to get redirected after login
  125.         if (!$request->get('no-referer-redirect')) {
  126.             $session->set('_security.demo_frontend.target_path'$request->headers->get('referer'));
  127.         }
  128.         if($this->document->getKey() == "b2c" || $this->document->getKey() == "en"){
  129.             return $this->render('account/b2c_login.html.twig', [
  130.                 'form' => $form->createView(),
  131.                 'error' => $error,
  132.                 'hideBreadcrumbs' => true,
  133.                 '_target_path'=>$request->headers->get('referer')
  134.             ]);
  135.         }else{
  136.             return $this->render('account/login.html.twig', [
  137.                 'form' => $form->createView(),
  138.                 'error' => $error,
  139.                 'hideBreadcrumbs' => true,
  140.                 '_target_path'=>$request->headers->get('referer')
  141.             ]);
  142.         }
  143.     }
  144.     /**
  145.      * If registration is called with a registration key, the key will be used to look for an existing OAuth token in
  146.      * the session. This OAuth token will be used to fetch user info which can be used to pre-populate the form and to
  147.      * link a SSO identity to the created customer object.
  148.      *
  149.      * This could be further separated into services, but was kept as single method for demonstration purposes as the
  150.      * registration process is different on every project.
  151.      *
  152.      * @Route("/account/register", name="account-register")
  153.      *
  154.      * @param Request $request
  155.      * @param CustomerProviderInterface $customerProvider
  156.      * @param OAuthRegistrationHandler $oAuthHandler
  157.      * @param LoginManagerInterface $loginManager
  158.      * @param RegistrationFormHandler $registrationFormHandler
  159.      * @param SessionInterface $session
  160.      * @param AuthenticationLoginListener $authenticationLoginListener
  161.      * @param Translator $translator
  162.      * @param Service $consentService
  163.      * @param UrlGeneratorInterface $urlGenerator
  164.      * @param NewsletterDoubleOptInService $newsletterDoubleOptInService
  165.      * @param UserInterface|null $user
  166.      *
  167.      * @return Response|RedirectResponse
  168.      */
  169.     public function registerAction(
  170.         Request $request,
  171.         CustomerProviderInterface $customerProvider,
  172.         OAuthRegistrationHandler $oAuthHandler,
  173.         LoginManagerInterface $loginManager,
  174.         RegistrationFormHandler $registrationFormHandler,
  175.         SessionInterface $session,
  176.         AuthenticationLoginListener $authenticationLoginListener,
  177.         Translator $translator,
  178.         Service $consentService,
  179.         UrlGeneratorInterface $urlGenerator,
  180.         NewsletterDoubleOptInService $newsletterDoubleOptInService,
  181.         UserInterface $user null
  182.     ) {
  183.         //redirect user to index page if logged in
  184.         if ($user && $this->isGranted('ROLE_USER')) {
  185.             return $this->redirectToRoute('account-index');
  186.         }
  187.         $registrationKey $request->get('registrationKey');
  188.         // create a new, empty customer instance
  189.         /** @var CustomerInterface|\Pimcore\Model\DataObject\Customer $customer */
  190.         $customer $customerProvider->create();
  191.         /** @var OAuthToken $oAuthToken */
  192.         $oAuthToken null;
  193.         /** @var UserResponseInterface $oAuthUserInfo */
  194.         $oAuthUserInfo null;
  195.         // load previously stored token from the session and try to load user profile
  196.         // from provider
  197.         if (null !== $registrationKey) {
  198.             $oAuthToken $oAuthHandler->loadToken($registrationKey);
  199.             $oAuthUserInfo $oAuthHandler->loadUserInformation($oAuthToken);
  200.         }
  201.         if (null !== $oAuthUserInfo) {
  202.             // try to load a customer with the given identity from our storage. if this succeeds, we can't register
  203.             // the customer and should either log in the existing identity or show an error. for simplicity, we just
  204.             // throw an exception here.
  205.             // this shouldn't happen as the login would log in the user if found
  206.             if ($oAuthHandler->getCustomerFromUserResponse($oAuthUserInfo)) {
  207.                 throw new \RuntimeException('Customer is already registered');
  208.             }
  209.         }
  210.         // the registration form handler is just a utility class to map pimcore object data to form
  211.         // and vice versa.
  212.         $formData $registrationFormHandler->buildFormData($customer);
  213.         $hidePassword false;
  214.         if (null !== $oAuthToken) {
  215.             $formData $this->mergeOAuthFormData($formData$oAuthUserInfo);
  216.             $hidePassword true;
  217.         }
  218.         // build the registration form and pre-fill it with customer data
  219.         $form $this->createForm(RegistrationFormType::class, $formData, ['hidePassword' => $hidePassword]);
  220.         $form->handleRequest($request);
  221.         $errors = [];
  222.         if ($form->isSubmitted() && $form->isValid()) {
  223.             $registrationFormHandler->updateCustomerFromForm($customer$form);
  224.             $customer->setCustomerLanguage($request->getLocale());
  225.             $customer->setActive(true);
  226.             try {
  227.                 $customer->save();
  228.                 if ($form->getData()['newsletter']) {
  229.                     $consentService->giveConsent($customer'newsletter'$translator->trans('general.newsletter'));
  230.                     $newsletterDoubleOptInService->sendDoubleOptInMail($customer$this->document->getProperty('newsletter_confirm_mail'));
  231.                 }
  232.                 if ($form->getData()['profiling']) {
  233.                     $consentService->giveConsent($customer'profiling'$translator->trans('general.profiling'));
  234.                 }
  235.                 // add SSO identity from OAuth data
  236.                 if (null !== $oAuthUserInfo) {
  237.                     $oAuthHandler->connectSsoIdentity($customer$oAuthUserInfo);
  238.                 }
  239.                 //check if special redirect is necessary
  240.                 if ($session->get('referrer')) {
  241.                     $response $this->redirect($session->get('referrer'));
  242.                     $session->remove('referrer');
  243.                 } else {
  244.                     $response $this->redirectToRoute('account-index');
  245.                 }
  246.                 // log user in manually
  247.                 // pass response to login manager as it adds potential remember me cookies
  248.                 $loginManager->login($customer$request$response);
  249.                 //do ecommerce framework login
  250.                 $authenticationLoginListener->doEcommerceFrameworkLogin($customer);
  251.                 return $response;
  252.             } catch (DuplicateCustomerException $e) {
  253.                 $errors[] = $translator->trans(
  254.                     'account.customer-already-exists',
  255.                     [
  256.                         $customer->getEmail(),
  257.                         $urlGenerator->generate('account-password-send-recovery', ['email' => $customer->getEmail()])
  258.                     ]
  259.                 );
  260.             } catch (\Exception $e) {
  261.                 $errors[] = $e->getMessage();
  262.             }
  263.         }
  264.         if ($form->isSubmitted() && !$form->isValid()) {
  265.             foreach ($form->getErrors() as $error) {
  266.                 $errors[] = $error->getMessage();
  267.             }
  268.         }
  269.         // re-save user info to session as we need it in subsequent requests (e.g. after form errors) or
  270.         // when form is rendered for the first time
  271.         if (null !== $registrationKey && null !== $oAuthToken) {
  272.             $oAuthHandler->saveToken($registrationKey$oAuthToken);
  273.         }
  274.         return $this->render('account/register.html.twig', [
  275.             'customer' => $customer,
  276.             'form' => $form->createView(),
  277.             'errors' => $errors,
  278.             'hideBreadcrumbs' => true,
  279.             'hidePassword' => $hidePassword
  280.         ]);
  281.     }
  282.     /**
  283.      * Special route for connecting to social profiles that saves referrer in session for later
  284.      * redirect to that referrer
  285.      *
  286.      * @param Request $request
  287.      * @param SessionInterface $session
  288.      * @param $service
  289.      *
  290.      * @return Response
  291.      * @Route("/auth/oauth/referrerLogin/{service}", name="app_auth_oauth_login_referrer")
  292.      */
  293.     public function connectAction(Request $requestSessionInterface $session$service)
  294.     {
  295.         // we overwrite this route to store user's referrer in the session
  296.         $session->set('referrer'$request->headers->get('referer'));
  297.         return $this->forward('HWIOAuthBundle:Connect:redirectToService', ['service' => $service]);
  298.     }
  299.     /**
  300.      * Connects an already logged in user to an auth provider
  301.      *
  302.      * @Route("/oauth/connect/{service}", name="app_auth_oauth_connect")
  303.      * @Security("is_granted('ROLE_USER')")
  304.      *
  305.      * @param Request $request
  306.      * @param OAuthRegistrationHandler $oAuthHandler
  307.      * @param UserInterface $user
  308.      * @param string $service
  309.      *
  310.      * @return RedirectResponse
  311.      */
  312.     public function oAuthConnectAction(
  313.         Request $request,
  314.         OAuthRegistrationHandler $oAuthHandler,
  315.         UserInterface $user,
  316.         string $service
  317.     ) {
  318.         $resourceOwner $oAuthHandler->getResourceOwner($service);
  319.         $redirectUrl $this->generateUrl('app_auth_oauth_connect', [
  320.             'service' => $service
  321.         ], UrlGeneratorInterface::ABSOLUTE_URL);
  322.         // redirect to authorization
  323.         if (!$resourceOwner->handles($request)) {
  324.             $authorizationUrl $oAuthHandler->getAuthorizationUrl($request$service$redirectUrl);
  325.             return $this->redirect($authorizationUrl);
  326.         }
  327.         // get access token from URL
  328.         $accessToken $resourceOwner->getAccessToken($request$redirectUrl);
  329.         // e.g. user cancelled auth on provider side
  330.         if (null === $accessToken) {
  331.             return $this->redirectToRoute('account-index');
  332.         }
  333.         $oAuthUserInfo $resourceOwner->getUserInformation($accessToken);
  334.         // we don't want to allow linking an OAuth account to multiple customers
  335.         if ($oAuthHandler->getCustomerFromUserResponse($oAuthUserInfo)) {
  336.             throw new \RuntimeException('There\'s already a customer registered with this provider identity');
  337.         }
  338.         // create a SSO identity object and save it to the user
  339.         $oAuthHandler->connectSsoIdentity($user$oAuthUserInfo);
  340.         // redirect to secure page which should now list the newly linked profile
  341.         return $this->redirectToRoute('account-index');
  342.     }
  343.     /**
  344.      *
  345.      * @param array $formData
  346.      * @param UserResponseInterface $userInformation
  347.      *
  348.      * @return array
  349.      */
  350.     private function mergeOAuthFormData(
  351.         array $formData,
  352.         UserResponseInterface $userInformation
  353.     ): array {
  354.         return array_replace([
  355.             'firstname' => $userInformation->getFirstName(),
  356.             'lastname' => $userInformation->getLastName(),
  357.             'email' => $userInformation->getEmail()
  358.         ], $formData);
  359.     }
  360.     /**
  361.      * Index page for account - it is restricted to ROLE_USER via security annotation
  362.      *
  363.      * @Route("/account/index", name="account-index")
  364.      * @Security("is_granted('ROLE_USER')")
  365.      *
  366.      * @param SsoIdentityServiceInterface $identityService
  367.      * @param UserInterface|null $user
  368.      *
  369.      * @return Response
  370.      */
  371.     public function indexAction(SsoIdentityServiceInterface $identityServiceUserInterface $user null,PaginatorInterface $paginatorSessionInterface $session)
  372.     {
  373.         if($this->checkPermission() != true)
  374.         {
  375.             throw new \Exception("Permission denied");
  376.         }
  377.         if($user->getPartner()->getIsMecstoreHQ()){
  378.             return $this->redirectToRoute("account-order-list",["type"=>"ordini"]);
  379.         }
  380.         $blacklist = [];
  381.         foreach ($identityService->getSsoIdentities($user) as $identity) {
  382.             $blacklist[] = $identity->getProvider();
  383.         }
  384.         $branches $this->getBranches($session,$user);
  385.         if(empty($branches))
  386.         {
  387.             throw new \Exception("Permission denied");
  388.         }
  389.         $order = new Order();
  390.         $draftOrder $order->getOrderByStatus('Draft',$branches,$paginator);
  391.         $bookedOrder $order->getOrderByStatus('Booked',$branches,$paginator);
  392.         $sentOrder $order->getOrderByStatus('Sent',$branches,$paginator);
  393.         $orderManager Factory::getInstance()->getOrderManager();
  394.         $orderList $orderManager->createOrderList();
  395.         $orderList->addFilter(new CustomerObject($user));
  396.         $orderList->setOrder('orderDate DESC');
  397.         return $this->render('account/index.html.twig', [
  398.             'blacklist' => $blacklist,
  399.             'orderList' => $orderList,
  400.             'hideBreadcrumbs' => true,
  401.             'draftOrder'=> $draftOrder,
  402.             'bookedOrder'=> $bookedOrder,
  403.             'sentOrder'=> $sentOrder
  404.         ]);
  405.     }
  406.     /**
  407.      * @Route("/account/update-marketing", name="account-update-marketing-permission")
  408.      * @Security("is_granted('ROLE_USER')")
  409.      *
  410.      * @param Request $request
  411.      * @param Service $consentService
  412.      * @param Translator $translator
  413.      * @param NewsletterDoubleOptInService $newsletterDoubleOptInService
  414.      * @param UserInterface|null $user
  415.      *
  416.      * @return RedirectResponse
  417.      *
  418.      * @throws \Exception
  419.      */
  420.     public function updateMarketingPermissionAction(Request $requestService $consentServiceTranslator $translatorNewsletterDoubleOptInService $newsletterDoubleOptInServiceUserInterface $user null)
  421.     {
  422.         if ($user instanceof Customer) {
  423.             $currentNewsletterPermission $user->getNewsletter()->getConsent();
  424.             if (!$currentNewsletterPermission && $request->get('newsletter')) {
  425.                 $consentService->giveConsent($user'newsletter'$translator->trans('general.newsletter'));
  426.                 $newsletterDoubleOptInService->sendDoubleOptInMail($user$this->document->getProperty('newsletter_confirm_mail'));
  427.             } elseif ($currentNewsletterPermission && !$request->get('newsletter')) {
  428.                 $user->setNewsletterConfirmed(false);
  429.                 $consentService->revokeConsent($user'newsletter');
  430.             }
  431.             $currentProfilingPermission $user->getProfiling()->getConsent();
  432.             if (!$currentProfilingPermission && $request->get('profiling')) {
  433.                 $consentService->giveConsent($user'profiling'$translator->trans('general.profiling'));
  434.             } elseif ($currentProfilingPermission && !$request->get('profiling')) {
  435.                 $consentService->revokeConsent($user'profiling');
  436.             }
  437.             $user->save();
  438.             $this->addFlash('success'$translator->trans('account.marketing-permissions-updated'));
  439.         }
  440.         return $this->redirectToRoute('account-index');
  441.     }
  442.     /**
  443.      * @Route("/account/confirm-newsletter", name="account-confirm-newsletter")
  444.      *
  445.      * @param Request $request
  446.      * @param NewsletterDoubleOptInService $newsletterDoubleOptInService
  447.      * @param Translator $translator
  448.      *
  449.      * @return RedirectResponse
  450.      */
  451.     public function confirmNewsletterAction(Request $requestNewsletterDoubleOptInService $newsletterDoubleOptInServiceTranslator $translator)
  452.     {
  453.         $token $request->get('token');
  454.         $customer $newsletterDoubleOptInService->handleDoubleOptInConfirmation($token);
  455.         if ($customer) {
  456.             $this->addFlash('success'$translator->trans('account.marketing-permissions-confirmed-newsletter'));
  457.             return $this->redirectToRoute('account-index');
  458.         } else {
  459.             throw new NotFoundHttpException('Invalid token');
  460.         }
  461.     }
  462.     /**
  463.      * @Route("/account/send-password-recovery", name="account-password-send-recovery")
  464.      *
  465.      * @param Request $request
  466.      * @param PasswordRecoveryService $service
  467.      * @param Translator $translator
  468.      *
  469.      * @return Response
  470.      *
  471.      * @throws \Exception
  472.      */
  473.     public function sendPasswordRecoveryMailAction(Request $requestPasswordRecoveryService $serviceTranslator $translator)
  474.     {
  475.         if ($request->isMethod(Request::METHOD_POST)) {
  476.             try {
  477.                 $emailDocument \Pimcore\Model\Document::getByPath('/b2c/email/password-recovery');
  478.                 $customer $service->sendRecoveryMail($request->get('email'''), $emailDocument);
  479.                 if (!$customer instanceof CustomerInterface) {
  480.                     throw new \Exception('Cliente non valido');
  481.                 }
  482.                 $this->addFlash('success'"Il link per la reimpostazione della password viene inviato all'indirizzo e-mail registrato");
  483.             } catch (\Exception $e) {
  484.                 $this->addFlash('danger'$e->getMessage());
  485.             }
  486.             return $this->redirectToRoute('account-password-send-recovery', ['no-referer-redirect' => true]);
  487.         }
  488.         return $this->render('account/send_password_recovery_mail.html.twig', [
  489.             'hideBreadcrumbs' => true,
  490.             'emailPrefill' => $request->get('email')
  491.         ]);
  492.     }
  493.     /**
  494.      * @Route("/account/reset-password", name="account-reset-password")
  495.      *
  496.      * @param Request $request
  497.      * @param PasswordRecoveryService $service
  498.      * @param Translator $translator
  499.      *
  500.      * @return Response|RedirectResponse
  501.      */
  502.     public function resetPasswordAction(Request $requestPasswordRecoveryService $serviceTranslator $translator)
  503.     {
  504.         $token $request->get('token');
  505.         $customer $service->getCustomerByToken($token);
  506.         if (!$customer) {
  507.             //TODO render error page
  508.             throw new NotFoundHttpException('Token non valido');
  509.         }
  510.         if ($request->isMethod(Request::METHOD_POST)) {
  511.             $newPassword $request->get('password');
  512.             $service->setPassword($token$newPassword);
  513.             $this->addFlash('success',"La password Ã¨ stata aggiornata con successo ");
  514.             return $this->redirectToRoute('account-password-send-recovery', ['no-referer-redirect' => true]);
  515.         }
  516.         return $this->render('account/reset_password.html.twig', [
  517.             'hideBreadcrumbs' => true,
  518.             'token' => $token,
  519.             'email' => $customer->getEmail()
  520.         ]);
  521.     }
  522.     /**
  523.      * Index page for account - it is restricted to ROLE_USER via security annotation
  524.      *
  525.      * @Route("/account/order/list/{type}", name="account-order-list")
  526.      * @Security("is_granted('ROLE_USER')")
  527.      *
  528.      * @param SsoIdentityServiceInterface $identityService
  529.      * @param UserInterface|null $user
  530.      *
  531.      * @return Response
  532.      */
  533.     public function orderListAction(Request $requestSsoIdentityServiceInterface $identityServiceSessionInterface $session null ,UserInterface $user null,PaginatorInterface $paginatorFactory $ecommerceFactory)
  534.     {
  535.         if ($this->checkPermission() != true) {
  536.             return $this->redirectToRoute('account-index');
  537.         }
  538.         $type strtolower($request->get('type''all'));
  539.         $page $request->get('page'1);
  540.         $limit = ($request->get('limit'12)) ? $request->get('limit'12) : 12;
  541.         $type $request->get('type''confirm');
  542.         $startDate $request->get('startDate'null);
  543.         $endDate $request->get('endDate'null);
  544.         $orderType $request->get('order_type'null);
  545.         $term $request->get('term'null);
  546.         $blacklist = [];
  547.         foreach ($identityService->getSsoIdentities($user) as $identity) {
  548.             $blacklist[] = $identity->getProvider();
  549.         }
  550.         $branches $this->getBranches($session$user);
  551.         if (empty($branches)) {
  552.             throw new \Exception("Permission denied");
  553.         }
  554.         $order = new Order();
  555.         if($type == 'draft')
  556.         {
  557.             $params['heading'] = "BOZZE";
  558.             $result $order->getOrderByStatus('Draft',$branches,$paginator,$page,$limit,$orderType,$startDate,$endDate,$term);
  559.         }else if($type == 'booked'){
  560.             $params['heading'] = "PRENOTAZIONI";
  561.             $result $order->getOrderByStatus('Booked',$branches,$paginator,$page,$limit,$orderType,$startDate,$endDate,$term);
  562.         }
  563.         else if($type == 'impegnati'){
  564.             $params['heading'] = "IMPEGNATI";
  565.             $searchBy $request->get('filter_by',null);
  566.             $result $order->getImpegnati($paginator,$page,$limit,$searchBy,$term);
  567.             $params['result'] = $result;
  568.             $params['type'] = $type;
  569.             $params['paginationVariables'] = $result->getPaginationData();
  570.             $params['totalCount'] = $result->getTotalItemCount();
  571.             $params['offset'] = $result->getCurrentPageNumber();
  572.             $params['limit'] = $result->getItemNumberPerPage();
  573.             $params['order_type'] = $orderType;
  574.             $params['start_date'] = $startDate;
  575.             $params['end_date'] = $endDate;
  576.             $params['term'] = $term;
  577.             $params['filterBy'] = $searchBy;
  578.             $this->deleteOrdersDeleted($result);
  579.             return $this->render('account/mecstore/order_engaged_list.html.twig'$params);
  580.         }
  581.         else if($type == 'riepilogo'){
  582.             $params['heading'] = "RIEPILOGO";
  583.             $result $order->getRiepligo($paginator,$page,$limit,$term);
  584.             $params['result'] = $result;
  585.             $params['type'] = $type;
  586.             $params['paginationVariables'] = $result->getPaginationData();
  587.             $params['totalCount'] = $result->getTotalItemCount();
  588.             $params['offset'] = $result->getCurrentPageNumber();
  589.             $params['limit'] = $result->getItemNumberPerPage();
  590.             $params['order_type'] = $orderType;
  591.             $params['start_date'] = $startDate;
  592.             $params['end_date'] = $endDate;
  593.             $params['term'] = $term;
  594.             $this->deleteOrdersDeleted($result);
  595.             return $this->render('account/mecstore/order_summary_list_HQ.html.twig'$params);
  596.         }
  597.         else if($type == 'ordini'){
  598.             $params['heading'] = "ORDINI";
  599.             $result $order->getOrderByStatus('confirm',$branches,$paginator,$page,$limit,$orderType,$startDate,$endDate,$term,'o_id','desc',true);
  600.             $params['result'] = $result;
  601.             $params['type'] = $type;
  602.             $params['paginationVariables'] = $result->getPaginationData();
  603.             $params['totalCount'] = $result->getTotalItemCount();
  604.             $params['offset'] = $result->getCurrentPageNumber();
  605.             $params['limit'] = $result->getItemNumberPerPage();
  606.             $params['order_type'] = $orderType;
  607.             $params['start_date'] = $startDate;
  608.             $params['end_date'] = $endDate;
  609.             $params['term'] = $term;
  610.             $this->deleteOrdersDeleted($result);
  611.             return $this->render('account/mecstore/ordini_list.html.twig'$params);
  612.         }
  613.         else if($type == 'bozze-ordini'){
  614.             $params['heading'] = "BOZZE ORDINI";
  615.             $result $order->getOrderByStatus('Draft',$branches,$paginator,$page,$limit,$orderType,$startDate,$endDate,$term,'o_id','desc',true);
  616.             $params['result'] = $result;
  617.             $params['type'] = $type;
  618.             $params['paginationVariables'] = $result->getPaginationData();
  619.             $params['totalCount'] = $result->getTotalItemCount();
  620.             $params['offset'] = $result->getCurrentPageNumber();
  621.             $params['limit'] = $result->getItemNumberPerPage();
  622.             $params['order_type'] = $orderType;
  623.             $params['start_date'] = $startDate;
  624.             $params['end_date'] = $endDate;
  625.             $params['term'] = $term;
  626.             $this->deleteOrdersDeleted($result);
  627.             return $this->render('account/mecstore/bozze_list.html.twig'$params);
  628.         }
  629.         else if($type == 'pre-ordini'){
  630.             $availableStock = [];
  631.             $preOrderStock = [];
  632.             $itemsForRecalculation = [];
  633.             $partner $user->getPartner();
  634.             $params['heading'] = "PREORDINE";
  635.             $preOrderItem = new DataObject\PreOrderItem\Listing();
  636.             //$preOrderItem->filterByProduct($product);
  637.             $preOrderItem->filterByPartner($partner);
  638.             $preOrderItems $preOrderItem->load();
  639.             // Recalculating available qty
  640.             if($preOrderItems){
  641.                 foreach($preOrderItems as $item){
  642.                     $itemsForRecalculation[] = $item->getProduct()->getItem();
  643.                 }
  644.                 //$recalculatedCart = Utility::getOrders($itemsForRecalculation,$user->getPartner()->getCustSupp());
  645.             }
  646.             $cartManager $ecommerceFactory->getCartManager();
  647.             $preOrderCart $cartManager->getOrCreateCartByName('cart_pre_order_available');
  648.             $preOrderCart->clear();
  649.             if($preOrderItems){
  650.                 foreach($preOrderItems as $item){
  651.                     $availInStock $item->getAvailableInStock(true);
  652.                     if(is_array($availInStock) && !empty($availInStock)){
  653.                         $product $item->getProduct();
  654.                         if($availInStock['adjusted_qty']>0){
  655.                             // p_r($item->getProduct()->getItem());
  656.                             // p_r($availInStock);
  657.                             // exit;
  658.                             $preOrderCart->addItem($product,$availInStock['adjusted_qty']);
  659.                             $preOrderCart->save();
  660.                         }
  661.                         if($availInStock['carry_forwared'] > 0){
  662.                             $preOrderStock[] = ['product'=>$item->getProduct(),'totalPrice'=>($availInStock['carry_forwared']*$product->getCONSORZ()),'qty'=>$availInStock['carry_forwared'],'notes'=>'','modified_date'=>$item->getModificationDate()];
  663.                         }
  664.                     }
  665.                 }
  666.             }
  667.             $hqBranch \Pimcore\Model\DataObject\Partners::getByIsMecstoreHQ(1,true);
  668.             // Branches
  669.             // Branches
  670.             $availableBranches $this->getBranches($session,$user);
  671.             if(empty($availableBranches))
  672.             {
  673.                 throw new \Exception("Permission denied");
  674.             }
  675.             $branches = new DataObject\Partners\Listing();
  676.             $branches->setCondition('oo_id IN ('.implode(",",$availableBranches).')');
  677.             $branches $branches->load();
  678.             $customerAddresses = new DataObject\CustomerAddress\Listing();
  679.             $customerAddresses->setCondition('user__id = ?',[$user->getId()]);
  680.             $customerAddresses $customerAddresses->load();
  681.             $params['products'] = $preOrderItems;
  682.             $params['order_type'] = $orderType;
  683.             $params['term'] = $term;
  684.             $params['type'] = $type;
  685.             $params['cart'] = $preOrderCart;
  686.             $params['pre_order_stock'] = $preOrderStock;
  687.             $params['branches'] = $branches;
  688.             $params['addresses'] = $customerAddresses;
  689.             $params['hqBranch'] = $hqBranch;
  690.             $params['orderType'] = $orderType;
  691.             $params['start_date'] = $startDate;
  692.             $params['end_date'] = $endDate;
  693.             return $this->render('account/pre-order-list.html.twig'$params);
  694.         }
  695.         else
  696.         {
  697.             $params['heading'] = "ORDINI";
  698.             $result $order->getOrderByStatus('confirm',$branches,$paginator,$page,$limit,$orderType,$startDate,$endDate,$term);
  699.         }
  700.         //p_r($result);exit;
  701.         //p_r(get_class_methods($result[0]));exit;
  702.         //p_r($result[count($result)-1]);
  703.         $params['result'] = $result;
  704.         $params['type'] = $type;
  705.         $params['paginationVariables'] = $result->getPaginationData();
  706.         $params['totalCount'] = $result->getTotalItemCount();
  707.         $params['offset'] = $result->getCurrentPageNumber();
  708.         $params['limit'] = $result->getItemNumberPerPage();
  709.         $params['order_type'] = $orderType;
  710.         $params['term'] = $term;
  711.         $params['start_date'] = $startDate;
  712.         $params['end_date'] = $endDate;
  713.         if($type != 'booked' && $type != 'draft'){
  714.             $this->deleteOrdersDeleted($result);
  715.         }
  716.         return $this->render('account/order_list.html.twig'$params);
  717.     }
  718.     public function deleteOrdersDeleted($listaOrdini){
  719.         $salesOrdersIds = [];
  720.         foreach($listaOrdini as $ordine){
  721.             if(!is_array($ordine)) {
  722.                 $salesOrdersIds[] = $ordine->getSalesOrderId();
  723.             }
  724.         }
  725.         $salesOrdersIds implode(","$salesOrdersIds);
  726.         //echo $salesOrdersIds;
  727.         $responseArr = [];
  728.         $curl = new CurlService();
  729.         try {
  730.             $request '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
  731.             <soapenv:Header/>
  732.             <soapenv:Body>
  733.                 <tem:getNumOrdNoMatch>
  734.                     <tem:Token_Client>' SOAP_TOKEN '</tem:Token_Client>
  735.                     <tem:ListSaleOrdId>' $salesOrdersIds '</tem:ListSaleOrdId>
  736.                 </tem:getNumOrdNoMatch>
  737.             </soapenv:Body>
  738.             </soapenv:Envelope>';
  739.             \Pimcore\Log\Simple::log('erp_order_request'$request);
  740.             $xml sprintf($requestSOAP_TOKEN);
  741.             $response $curl->getCurlResponseNew($request$xml);
  742.             $ordersToDelete $response->xpath('//ListaOrdiniRichiesti/SaleOrdId');
  743.         } catch (Exception $e) {
  744.             //\Pimcore\Log\Simple::log('soap', $e->getMessage());
  745.             echo "ERRORE";
  746.         }
  747.         //echo $xml; //die();
  748.         //print_r($response);
  749.         //print_r($ordersToDelete);
  750.         foreach($ordersToDelete as $orderToDelete){
  751.             $otd \Pimcore\Model\DataObject\OnlineShopOrder::getBySalesOrderId($orderToDeletetrue);
  752.             if($otd){
  753.                 //echo $otd->getOrdernumber();
  754.                 $otd->delete();
  755.             }
  756.         }
  757.     }
  758.     public function deleteOrdersNoMatch($branches,$paginator,$page,$limit,$orderType,$startDate,$endDate,$term){
  759.         $order = new Order();
  760.         $result $order->getOrderByStatus('confirm',$branches,$paginator,$page,$limit,$orderType,$startDate,$endDate,$term,'o_id','desc',true);
  761.     }
  762.     /**
  763.      * Index page for account - it is restricted to ROLE_USER via security annotation
  764.      *
  765.      * @Route("/account/order/detail/impegnati/{id}", name="account-impagniti-detail")
  766.      * @Security("is_granted('ROLE_USER')")
  767.      *
  768.      * @param SsoIdentityServiceInterface $identityService
  769.      * @param UserInterface|null $user
  770.      *
  771.      * @return Response
  772.      */
  773.     public function orderImpagnitiRieplogoAction(Request $requestSsoIdentityServiceInterface $identityServiceUserInterface $user nullSessionInterface $session=null)
  774.     {
  775.         $userObject \Pimcore::getContainer()->get('security.token_storage')->getToken()->getUser();
  776.         if(!$this->service->isAllowed($userObject"order_create")) {
  777.             throw new \Exception("Permission denied");
  778.         }
  779.         $blacklist = [];
  780.         foreach ($identityService->getSsoIdentities($user) as $identity) {
  781.             $blacklist[] = $identity->getProvider();
  782.         }
  783.         $productId $request->get('id',null);
  784.         if(!$productId){
  785.             throw new \Exception("Product not found");
  786.         }
  787.         $product \Pimcore\Model\DataObject::getById($productId);
  788.         $order = new Order();
  789.         // Booking statistics
  790.         $db \Pimcore\Db::get();
  791.         $response['booking'] = $order->getBookingStatistics($db,$productId);
  792.         // Pre Order statistics
  793.         $response['pre_order'] = $order->getPreOrderStatistics($db,$productId);
  794.         return $this->render('account/mecstore/order_engaged_detail.html.twig', [
  795.             'response' => $response,
  796.             'product'=>$product,
  797.             'hideBreadcrumbs' => true
  798.         ]);
  799.     }
  800.     /**
  801.      * Index page for account - it is restricted to ROLE_USER via security annotation
  802.      *
  803.      * @Route("/account/order/detail/{type}/{id}", name="account-order-detail")
  804.      * @Security("is_granted('ROLE_USER')")
  805.      *
  806.      * @param SsoIdentityServiceInterface $identityService
  807.      * @param UserInterface|null $user
  808.      *
  809.      * @return Response
  810.      */
  811.     public function orderDetailAction(Request $requestSsoIdentityServiceInterface $identityServiceUserInterface $user nullSessionInterface $session=null)
  812.     {
  813.         $userObject \Pimcore::getContainer()->get('security.token_storage')->getToken()->getUser();
  814.         if(!$this->service->isAllowed($userObject"order_create")) {
  815.             throw new \Exception("Permission denied");
  816.         }
  817.         $blacklist = [];
  818.         foreach ($identityService->getSsoIdentities($user) as $identity) {
  819.             $blacklist[] = $identity->getProvider();
  820.         }
  821.         $branches = [];
  822.         if(!$userObject->getPartner()->getIsMecstoreHQ() && !$userObject->getUserRoles() != "Customer"){
  823.             $branches $this->getBranches($session,$user);
  824.             if(empty($branches))
  825.             {
  826.                 throw new \Exception("Permission denied");
  827.             }
  828.         }
  829.         $orderId $request->get('id');
  830.         $type strtolower($request->get('type','all'));
  831.         $order = new Order();
  832.         $order $order->getOrderById($orderId,$branches);
  833.         if(empty($order)){
  834.             throw new \Exception("Permission denied");
  835.         }
  836.         $deliveredQty $this->getProductsDeliveredQty($order[0]->getSalesOrderId());
  837.         //print_r($deliveredQty);
  838.        // p_r(get_class_methods($order[0]));exit;
  839.         $order is_array($order)?$order[0]:[];
  840.         if($order)
  841.         {
  842.             $orderDetail $order->getOrderDetail();
  843.             if($orderDetail)
  844.             {
  845.                 $orderDetail $orderDetail->getItems();
  846.                 $orderDetail = isset($orderDetail)?$orderDetail[0]:[];
  847.             }
  848.         }
  849.         // Get DDT
  850.         if($type == "ordini"){
  851.             return $this->render('account/mecstore/ordini_detail.html.twig', [
  852.                 'blacklist' => $blacklist,
  853.                 'hideBreadcrumbs' => true,
  854.                 'order'=> $order,
  855.                 'type'=>$type,
  856.                 'orderBrick'=>$orderDetail,
  857.                 'deliveredQty'=>$deliveredQty,
  858.             ]);
  859.         }
  860.         else if($type == "invoice"){
  861.             return $this->render('account/order_invoice.html.twig', [
  862.                 'blacklist' => $blacklist,
  863.                 'hideBreadcrumbs' => true,
  864.                 'order'=> $order,
  865.                 'type'=>$type,
  866.                 'orderBrick'=>$orderDetail
  867.             ]);
  868.         }
  869.         else if($type == "future_invoice"){
  870.             return $this->render('account/order_future_invoice.html.twig', [
  871.                 'blacklist' => $blacklist,
  872.                 'hideBreadcrumbs' => true,
  873.                 'order'=> $order,
  874.                 'type'=>$type,
  875.                 'orderBrick'=>$orderDetail
  876.             ]);
  877.         }
  878.         else{
  879.             return $this->render('account/order_detail.html.twig', [
  880.                 'blacklist' => $blacklist,
  881.                 'hideBreadcrumbs' => true,
  882.                 'order'=> $order,
  883.                 'type'=>$type,
  884.                 'orderBrick'=>$orderDetail,
  885.                 'deliveredQty'=>$deliveredQty,
  886.             ]);
  887.         }
  888.     }
  889.     private function getProductsDeliveredQty($salesOrderId){
  890.         $return = [];
  891.         if($salesOrderId) {
  892.                 $curl = new CurlService();
  893.                 $request '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
  894.                 <soapenv:Header/>
  895.                 <soapenv:Body>
  896.                     <tem:getMembersSaleOrdersDetails_Parameters>
  897.                         <!--Optional:-->
  898.                         <tem:Token_Client>%s</tem:Token_Client>
  899.                         <!--Optional:-->
  900.                         <tem:ToDate></tem:ToDate>
  901.                         <!--Optional:-->
  902.                         <tem:Customer/>
  903.                         <tem:FromSaleOrdId>%s</tem:FromSaleOrdId>
  904.                         <!--Optional:-->
  905.                         <tem:LimitRecords>1</tem:LimitRecords>
  906.                         <!--Optional:-->
  907.                         <tem:FromDate></tem:FromDate>
  908.                     </tem:getMembersSaleOrdersDetails_Parameters>
  909.                 </soapenv:Body>
  910.                 </soapenv:Envelope>';
  911.                 $xml sprintf($requestSOAP_TOKEN$salesOrderId);
  912.                 $response $curl->getCurlResponseNew($request$xml);
  913.                 //print_r($response);
  914.                 $membersOrdersDetails $response->xpath('//MembersOrdersDetailsParameters');
  915.                 if (count($membersOrdersDetails)) {
  916.                     foreach ($membersOrdersDetails as $membersOrderDetails) {
  917.                         if($membersOrderDetails->Item != '') {
  918.                             $return[(string)$membersOrderDetails->Item] = (float)$membersOrderDetails->DeliveredQty;
  919.                         }
  920.                     }
  921.                 }
  922.         }
  923.         return $return;
  924.     }
  925.     /**
  926.      * Index page for account - it is restricted to ROLE_USER via security annotation
  927.      *
  928.      * @Route("/account/order-booked/{id}", name="account-order-detail-booking")
  929.      * @Security("is_granted('ROLE_USER')")
  930.      *
  931.      * @param SsoIdentityServiceInterface $identityService
  932.      * @param UserInterface|null $user
  933.      *
  934.      * @return Response
  935.      */
  936.     public function orderBookingAction(Request $requestSsoIdentityServiceInterface $identityServiceUserInterface $user nullSessionInterface $session=null)
  937.     {
  938.         $userObject \Pimcore::getContainer()->get('security.token_storage')->getToken()->getUser();
  939.         if(!$this->service->isAllowed($userObject"booking_create")) {
  940.             throw new \Exception("Permission denied");
  941.         }
  942.         $blacklist = [];
  943.         foreach ($identityService->getSsoIdentities($user) as $identity) {
  944.             $blacklist[] = $identity->getProvider();
  945.         }
  946.         $availbaleBranches $this->getBranches($session,$user);
  947.         if(empty($availbaleBranches))
  948.         {
  949.             throw new \Exception("Permission denied");
  950.         }
  951.         $orderType=$request->get('order_type',null);
  952.         $term=$request->get('term',null);
  953.         $customerAddresses = new DataObject\CustomerAddress\Listing();
  954.         $customerAddresses->setCondition('user__id = ?',[$userObject->getId()]);
  955.         $customerAddresses $customerAddresses->load();
  956.         $orderId $request->get('id');
  957.         $order = new Order();
  958.         $order \Pimcore\Model\DataObject::getById($orderId);
  959.         if(!$order instanceof \Pimcore\Model\DataObject\PurchaseOrder)
  960.         {
  961.             $this->addFlash('error'"Order does not exists");
  962.             return $this->redirectToRoute('account-index');
  963.         }
  964.         $orderBranch $order->getBranch();
  965.         if($orderBranch){
  966.             $branchID $orderBranch->getID();
  967.             if(!in_array($branchID,$availbaleBranches))
  968.             {
  969.                 throw new \Exception("Permission denied");
  970.             }
  971.         }
  972.         // Branches
  973.         $branches = new DataObject\Partners\Listing();
  974.         $branches->setCondition('oo_id IN ('.implode(",",$availbaleBranches).')');
  975.         $branches $branches->load();
  976.         $hqBranch \Pimcore\Model\DataObject\Partners::getByIsMecstoreHQ(1,true);
  977.         if($order)
  978.         {
  979.             $orderDetail $order->getOrderDetail();
  980.             $items $order->getChildren();
  981.         }
  982.         return $this->render('account/order_booking.html.twig', [
  983.             'blacklist' => $blacklist,
  984.             'hideBreadcrumbs' => true,
  985.             'order'=> $order,
  986.             'items'=> $items,
  987.             'type'=>'booked',
  988.             'orderBrick'=>$orderDetail,
  989.             'branches'=>$branches,
  990.             'hqBranch'=>$hqBranch,
  991.             'addresses'=>$customerAddresses,
  992.             'order_type'=>$orderType,
  993.             'term'=>$term
  994.         ]);
  995.     }
  996.     /**
  997.      * Index page for account - it is restricted to ROLE_USER via security annotation
  998.      *
  999.      * @Route("/account/order-draft/{id}", name="account-order-detail-draft")
  1000.      * @Security("is_granted('ROLE_USER')")
  1001.      *
  1002.      * @param SsoIdentityServiceInterface $identityService
  1003.      * @param UserInterface|null $user
  1004.      *
  1005.      * @return Response
  1006.      */
  1007.     public function orderDraftAction(Request $requestSsoIdentityServiceInterface $identityServiceUserInterface $user nullSessionInterface $session=null)
  1008.     {
  1009.         $userObject \Pimcore::getContainer()->get('security.token_storage')->getToken()->getUser();
  1010.         if(!$this->service->isAllowed($userObject"draft_create")) {
  1011.             throw new \Exception("Permission denied");
  1012.         }
  1013.         $blacklist = [];
  1014.         foreach ($identityService->getSsoIdentities($user) as $identity) {
  1015.             $blacklist[] = $identity->getProvider();
  1016.         }
  1017.         $orderId $request->get('id');
  1018.         $term=$request->get('term',null);
  1019.         $order = new Order();
  1020.         $order \Pimcore\Model\DataObject::getById($orderId);
  1021.         if(!$order instanceof \Pimcore\Model\DataObject\PurchaseOrder)
  1022.         {
  1023.             $this->addFlash('error'"Order does not exists");
  1024.             return $this->redirectToRoute('account-index');
  1025.         }
  1026.         $availableBranches $this->getBranches($session,$user);
  1027.         if(empty($availableBranches))
  1028.         {
  1029.             throw new \Exception("Permission denied");
  1030.         }
  1031.         $orderBranch $order->getBranch();
  1032.         if($orderBranch){
  1033.             $branchID $orderBranch->getID();
  1034.             if(!in_array($branchID,$availableBranches))
  1035.             {
  1036.                 throw new \Exception("Permission denied");
  1037.             }
  1038.         }
  1039.         // Branches
  1040.         $branches = new DataObject\Partners\Listing();
  1041.         $branches->setCondition('oo_id IN ('.implode(",",$availableBranches).')');
  1042.         $branches $branches->load();
  1043.         // Customer Addresses
  1044.         $customerAddresses = new DataObject\CustomerAddress\Listing();
  1045.         $customerAddresses->setCondition('user__id = ?',[$userObject->getId()]);
  1046.         $customerAddresses $customerAddresses->load();
  1047.         $hqBranch \Pimcore\Model\DataObject\Partners::getByIsMecstoreHQ(1,true);
  1048.         if($order)
  1049.         {
  1050.             $orderDetail $order->getOrderDetail();
  1051.             $items $order->getChildren();
  1052.         }
  1053.         if($userObject->getPartner()->getIsMecstoreHQ() && $userObject->getUserRoles() != "Customer"){
  1054.             return $this->render('account/mecstore/order_draft.html.twig', [
  1055.                 'blacklist' => $blacklist,
  1056.                 'hideBreadcrumbs' => true,
  1057.                 'order'=> $order,
  1058.                 'items'=> $items,
  1059.                 'type'=>'booking',
  1060.                 'orderBrick'=>$orderDetail,
  1061.                 'branches'=>$branches,
  1062.                 'hqBranch'=>$hqBranch,
  1063.                 'addresses'=>$customerAddresses,
  1064.                 'term'=>$term
  1065.             ]);
  1066.         }else{
  1067.             return $this->render('account/order_draft.html.twig', [
  1068.                 'blacklist' => $blacklist,
  1069.                 'hideBreadcrumbs' => true,
  1070.                 'order'=> $order,
  1071.                 'items'=> $items,
  1072.                 'type'=>'booking',
  1073.                 'orderBrick'=>$orderDetail,
  1074.                 'branches'=>$branches,
  1075.                 'hqBranch'=>$hqBranch,
  1076.                 'addresses'=>$customerAddresses,
  1077.                 'term'=>$term
  1078.             ]);
  1079.         }
  1080.     }
  1081.     /**
  1082.      * Index page for account - it is restricted to ROLE_USER via security annotation
  1083.      *
  1084.      * @Route("/account/pre-order-checkout", name="shop-checkout-confirm-order-pre-order")
  1085.      * @Security("is_granted('ROLE_USER')")
  1086.      *
  1087.      * @param Factory $ecommerceFactory
  1088.      * @param UserInterface|null $user
  1089.      *
  1090.      * @return Response
  1091.      */
  1092.     public function preOrderCheckoutAction(Request $requestFactory $ecommerceFactoryUserInterface $user nullSessionInterface $session=null)
  1093.     {
  1094.         $userObject \Pimcore::getContainer()->get('security.token_storage')->getToken()->getUser();
  1095.         $deliveryBranch $userObject->getPartner();
  1096.         //$formData = $request->query->all();
  1097.         $note $request->get('order_reference_pre_order');
  1098.         $additionalNote $request->get('additional_note_pre_order');
  1099.         $params $request->get('accordion-notes');//('accordion-notes');
  1100.         if($params){
  1101.             $session->set('accordion-notes',$request->get('accordion-notes'));
  1102.             $session->set('order_reference_pre_order',$request->get('order_reference_pre_order'));
  1103.             $session->set('additional_note_pre_order',$request->get('additional_note_pre_order'));
  1104.         }else{
  1105.             $params $session->get('accordion-notes');
  1106.             $note $session->get('order_reference_pre_order');
  1107.             $additionalNote $session->get('additional_note_pre_order');
  1108.         }
  1109.         $cartManager $ecommerceFactory->getCartManager();
  1110.         $cart $cartManager->getOrCreateCartByName('cart_pre_order_available');
  1111.         $preOrderCart $cartManager->getOrCreateCartByName('cart_pre_order');
  1112.         $reviewCart $cartManager->getOrCreateCartByName('cart_review');
  1113.         $preOrderCart->clear();
  1114.         $reviewCart->clear();
  1115.         if($params){
  1116.             foreach($params as $key=>$value){
  1117.                 $additionalNotes[$key] = $value[0];
  1118.             }
  1119.         }
  1120.         $items $cart->getItems();
  1121.         if(!$items){
  1122.             throw new \Exception("Prodotti non disponibili nel carrello");
  1123.         }
  1124.         //p_r($params);exit;
  1125.         foreach($items as $item){
  1126.             $prod $item->getProduct();
  1127.             $itemsForRecalculation[] = $prod->getItem();
  1128.         }
  1129.        // p_r($cart);exit;
  1130.         $partner $user->getPartner();
  1131.         if(!empty($itemsForRecalculation) && $partner){
  1132.             $recalculatedCart Utility::getOrders($itemsForRecalculation,$partner->getCustSupp());
  1133.         }
  1134.       // p_r($recalculatedCart);exit;
  1135.         if(!$recalculatedCart){
  1136.             throw new \Exception("Impossibile ricalcolare il carrello");
  1137.         }
  1138.         $oldMetadata = [];
  1139.         $preOrder = [];
  1140.         foreach($items as $item){
  1141.             $prod $item->getProduct();
  1142.             $preorderitems = new DataObject\PreOrderItem\Listing();
  1143.             $preorderitems->filterByUser($user);
  1144.             $preorderitems->filterByProduct($prod);
  1145.             $preorderitems->filterByIsAvailable(true);
  1146.             $preorderitems->setLimit(1);
  1147.             $updatedPrice 0;
  1148.             $updateStock 0;
  1149.             // Price fetched from old product
  1150.            // p_r($item);
  1151.             $requiredQty $item->getCount();
  1152.             $currentPrice $prod->getCONSORZ();
  1153.             $recalculatedItem $recalculatedCart[$prod->getItem()];
  1154.             if(!empty($recalculatedItem) && $preorderitems->getCount()>0){
  1155.                 $updatedPrice $recalculatedItem['Price'];
  1156.                 $updateStock $recalculatedItem['Disponibilita'] + $preorderitems->load()[0]->getQty() ;
  1157.                 // Checking if required qty in cart is more than recent qty fetched by API
  1158.                 //p_r($requiredQty.'----'.$updateStock);     exit;
  1159.                 if($requiredQty >= $updateStock){
  1160.                     $reviewCart->addItem($prod,$requiredQty);
  1161.                     // Update cart
  1162.                     /*$preOrderStock = $requiredQty-$updateStock;
  1163.                     $prod->setDisponibilita($updateStock);
  1164.                     $prod->setCONSORZ($updatedPrice);
  1165.                     $prod->save();
  1166.                     if($preOrderStock > 0){
  1167.                         $preOrderCart->addItem($prod,$preOrderStock);
  1168.                         $preOrder[$prod->getId()]['new_price'] = (float) $updatedPrice;
  1169.                         $preOrder[$prod->getId()]['old_price'] = (float) $currentPrice;
  1170.                         $preOrder[$prod->getId()]['new_stock'] = (float) $preOrderStock;
  1171.                         $preOrder[$prod->getId()]['old_stock'] = (float) $requiredQty;
  1172.                         $preOrder[$prod->getId()]['inStock'] = false;
  1173.                     }
  1174.                     $calReqQty = $requiredQty-$preOrderStock;
  1175.                     $prod->setDisponibilita($updateStock);
  1176.                     $prod->setCONSORZ($updatedPrice);
  1177.                     $prod->save();
  1178.                     if($calReqQty > 0){
  1179.                         $reviewCart->addItem($prod,$calReqQty);
  1180.                         $oldMetadata[$prod->getId()]['new_price'] = (float) $updatedPrice;
  1181.                         $oldMetadata[$prod->getId()]['old_price'] = (float) $currentPrice;
  1182.                         $oldMetadata[$prod->getId()]['new_stock'] = (float) $calReqQty;
  1183.                         $oldMetadata[$prod->getId()]['old_stock'] = (float) $calReqQty;
  1184.                         $oldMetadata[$prod->getId()]['inStock'] = ($updateStock)?true:false;
  1185.                     }else{
  1186.                         $preOrderCart->addItem($prod,$requiredQty);
  1187.                     }*/
  1188.                 }else{
  1189.                     $preOrderCart->addItem($prod,$requiredQty);
  1190.                     /*$prod->setDisponibilita($updateStock);
  1191.                     $prod->setCONSORZ($updatedPrice);
  1192.                     $prod->save();
  1193.                     if($requiredQty>0){
  1194.                         $reviewCart->addItem($prod,$requiredQty);
  1195.                     }else{
  1196.                         $preOrderCart->addItem($prod,$requiredQty);
  1197.                     }
  1198.                     $oldMetadata[$prod->getId()]['new_price'] = (float) $updatedPrice;
  1199.                     $oldMetadata[$prod->getId()]['old_price'] = (float) $currentPrice;
  1200.                     $oldMetadata[$prod->getId()]['new_stock'] = (float) $requiredQty;
  1201.                     $oldMetadata[$prod->getId()]['old_stock'] = (float) $requiredQty;
  1202.                     $oldMetadata[$prod->getId()]['inStock'] = ($updateStock)?true:false;*/
  1203.                 }
  1204.             }else{
  1205.                 $preOrder[$prod->getId()]['new_price'] = 0;
  1206.                 $preOrder[$prod->getId()]['old_price'] = 0;
  1207.                 $preOrder[$prod->getId()]['new_stock'] = 0;
  1208.                 $preOrder[$prod->getId()]['old_stock'] = 0;
  1209.                 $preOrder[$prod->getId()]['inStock'] = false;
  1210.                 $preOrder[$prod->getId()]['message'] = "Esaurito";
  1211.                 // Updating available qty of product to 0 if product is not present in API
  1212.                 $prod->setDisponibilita(0);
  1213.                 $prod->save();
  1214.                 $preOrderCart->addItem($prod,$requiredQty);
  1215.             }
  1216.             $reviewCart->save();
  1217.             $preOrderCart->save();
  1218.         }
  1219.         $reviewCart->setCheckoutData('oldMetadata',$oldMetadata);
  1220.         $reviewCart->save();
  1221.         $preOrderCart->setCheckoutData('oldMetadata',$preOrder);
  1222.         $preOrderCart->save();
  1223.         $availableBranches $this->getBranches($session,$user);
  1224.         if(empty($availableBranches))
  1225.         {
  1226.             throw new \Exception("Permission denied");
  1227.         }
  1228.         $hqBranch \Pimcore\Model\DataObject\Partners::getByIsMecstoreHQ(1,true);
  1229.         $branches = new DataObject\Partners\Listing();
  1230.         $branches->setCondition('oo_id IN ('.implode(",",$availableBranches).')');
  1231.         $branches $branches->load();
  1232.         $customerAddresses = new DataObject\CustomerAddress\Listing();
  1233.         $customerAddresses->setCondition('user__id = ?',[$user->getId()]);
  1234.         $customerAddresses $customerAddresses->load();
  1235.        //p_r($branches);exit;
  1236.         return $this->render('account/order_summary.html.twig', [
  1237.             'cart' => $reviewCart,
  1238.             'pre_order_cart' => $preOrderCart,
  1239.             'hideBreadcrumbs' => true,
  1240.             'deliveryBranch'=>$deliveryBranch,
  1241.             'params'=>$params,
  1242.             'additionalNotes'=>$additionalNotes,
  1243.             'checkoutData'=>$oldMetadata,
  1244.             'checkoutDataPreOrder'=>$preOrder,
  1245.             'additionalNote' => $additionalNote,
  1246.             'note' => $note,
  1247.             'branches'=>$branches,
  1248.             'hqBranch'=>$hqBranch,
  1249.             'addresses'=>$customerAddresses
  1250.         ]);
  1251.     }
  1252.     /**
  1253.      * Index page for account - it is restricted to ROLE_USER via security annotation
  1254.      *
  1255.      * @Route("/account/download-order/{id}", name="account-order-download-order")
  1256.      * @Security("is_granted('ROLE_USER')")
  1257.      *
  1258.      * @param SsoIdentityServiceInterface $identityService
  1259.      * @param UserInterface|null $user
  1260.      *
  1261.      * @return Response
  1262.      */
  1263.     public function downloadOrder(Request $requestSsoIdentityServiceInterface $identityServiceUserInterface $user null)
  1264.     {
  1265.         $writer WriterEntityFactory::createXLSXWriter();
  1266.         $writer->openToFile($filePath); // write data to a file or to a PHP stream
  1267.         //$writer->openToBrowser($fileName); // stream data directly to the browser
  1268.         $cells = [
  1269.             WriterEntityFactory::createCell('Carl'),
  1270.             WriterEntityFactory::createCell('is'),
  1271.             WriterEntityFactory::createCell('great!'),
  1272.         ];
  1273.         /** add a row at a time */
  1274.         $singleRow WriterEntityFactory::createRow($cells);
  1275.         $writer->addRow($singleRow);
  1276.         /** add multiple rows at a time */
  1277.         $multipleRows = [
  1278.             WriterEntityFactory::createRow($cells),
  1279.             WriterEntityFactory::createRow($cells),
  1280.         ];
  1281.         $writer->addRows($multipleRows);
  1282.         /** Shortcut: add a row from an array of values */
  1283.         $values = ['Carl''is''great!'];
  1284.         $rowFromValues WriterEntityFactory::createRowFromArray($values);
  1285.         $writer->addRow($rowFromValues);
  1286.         $writer->close();
  1287.     }
  1288.     private function checkPermission(){
  1289.         $allow false;
  1290.         $userObject \Pimcore::getContainer()->get('security.token_storage')->getToken()->getUser();
  1291.         if($this->service->isAllowed($userObject"draft_create") || $this->service->isAllowed($userObject"booking_create") || $this->service->isAllowed($userObject"order_create") || $this->service->isAllowed($userObject"order_view")) {
  1292.             $allow true;
  1293.         }
  1294.         //Whitelist admin route for mecstore
  1295.         if(in_array($_SERVER['REQUEST_URI'],MECSTORE_WHITELIST_URLS)){
  1296.             if($userObject->getPartner()->getIsMecstoreHQ() && $userObject->getUserRoles() != "Customer"){
  1297.                 $allow true;
  1298.             }else{
  1299.                 $allow false;
  1300.             }
  1301.         }
  1302.         return $allow;
  1303.     }
  1304. }