src/Controller/CartController.php line 693

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Bundle;
  4. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  5. use Symfony\Component\HttpFoundation\Response;
  6. use Symfony\Component\Routing\Annotation\Route;
  7. use App\Service\TrafficTracker;
  8. use Symfony\Contracts\Translation\TranslatorInterface;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use App\Entity\Partner;
  11. use App\Entity\Productbywholesaler;
  12. use App\Entity\Vendors;
  13. use App\Entity\Customer;
  14. use App\Entity\Product;
  15. use App\Entity\Usercart;
  16. use App\Entity\User;
  17. use App\Entity\Vendorpartnerlevel;
  18. use App\Entity\Businessoportinities;
  19. use App\Entity\DiscountsByChannel;
  20. use App\Service\HeaderData;
  21. use App\Service\Translation;
  22. use App\Service\ServiceNotification;
  23. use App\Entity\Productsbusinessoportinities;
  24. use App\Entity\Licenseresources;
  25. use App\Repository\TaxesRepository;
  26. use App\Service\ServiceDiscounts;
  27. use App\Service\JsonSearchService;
  28. use App\Entity\Taxes;
  29. use App\Service\StockService;
  30. use App\Service\PickupWarehouseService;
  31. use App\Service\GenerateLinesFromSalesService;
  32. use App\Service\PriceCalculatorService;
  33. use App\Entity\Sales;
  34. use App\Entity\License;
  35. use App\Entity\File;
  36. use App\Entity\MarkupsByChannel;
  37. use App\Service\FinancialRiskService;
  38. use DateTime;
  39. use App\Service\ConnectifService;
  40. use App\Service\Currency\OperationalCurrencyProvider;
  41. use App\Entity\Warehouse;
  42. use App\Entity\WarehousePolicies;
  43. use App\Entity\CompanyAddress;
  44. use App\Service\LicenseGeneratorService;
  45. use App\Service\SaleGeneratorService;
  46. use App\Service\ExtraFieldsService;
  47. class CartController extends AbstractController
  48. {
  49.     private $financialRiskService;
  50.     private $buildHeaderData;
  51.     private $connectifService;
  52.     private $operationalCurrencyProvider;
  53.     public function __construct(FinancialRiskService $financialRiskServiceHeaderData $buildHeaderDataConnectifService $connectifServiceOperationalCurrencyProvider $operationalCurrencyProvider)
  54.     {
  55.         $this->financialRiskService $financialRiskService;
  56.         $this->buildHeaderData $buildHeaderData;
  57.         $this->connectifService $connectifService;
  58.         $this->operationalCurrencyProvider $operationalCurrencyProvider;
  59.     }
  60.     /**
  61.      * /**
  62.      * @Route("/catalog/cart/customercarts/{userId}", name="cart_customer_carts", requirements={"userId"="\d+"})
  63.      */
  64.     public function customerCarts(Request $requestTrafficTracker $trafficTrackerHeaderData $buildHeaderDataTranslation $translationServiceDiscounts $serviceDiscounts$userId)
  65.     {
  66.         $trafficTracker->registerTraffic();
  67.         $vendorRepository $this->getDoctrine()->getRepository(Vendors::class);
  68.         $userCartRepository $this->getDoctrine()->getRepository(Usercart::class);
  69.         $entityManager $this->getDoctrine()->getManager();
  70.         $user $this->getUser();
  71.         //$cart = $userCartRepository->MyUserCartQuery($user)->getQuery()->getResult();
  72.         if($user->getCustomer()){
  73.             return $this->redirectToRoute('cart_index', ['userId' => $userId'customerId' => $user->getCustomer()->getId()]);
  74.         }
  75.         $cart $entityManager->createQuery("SELECT uc FROM \App\Entity\Usercart uc "
  76.             "JOIN App\Entity\Customer c "
  77.             "JOIN App\Entity\Partner p "
  78.             'where uc.customer = c.id and c.partner = :partner and uc.unregistrationdate is null and uc.sale is null')
  79.             ->setParameter('partner'$user->getPartner())
  80.             ->getResult();
  81.         if (sizeof($cart) == 0) {
  82.             return $this->redirectToRoute('catalog_goto');
  83.         }
  84.         $customerCarts = array();
  85.         foreach ($cart as $cartItem) {
  86.             if (!array_key_exists($cartItem->getCustomer()->getId(), $customerCarts)) {
  87.                 $customerCarts[$cartItem->getCustomer()->getId()] = array($cartItem);
  88.             } else {
  89.                 array_push($customerCarts[$cartItem->getCustomer()->getId()], $cartItem);
  90.             }
  91.         }
  92.         foreach ($customerCarts as $cart) {
  93.             $serviceDiscounts->checkPromosAvailableInCart($cart);
  94.             $serviceDiscounts->checkBOsAvailableInCart($cart);
  95.         }
  96.         return $this->render('/catalog/cart/customercarts.html.twig', array(
  97.             'headerData' => $buildHeaderData->buildHeaderData($user),
  98.             'customerCarts' => $customerCarts,
  99.             'vendorsRepository' => $vendorRepository
  100.         ));
  101.     }
  102.     /**
  103.      * Remove one item from customer carts
  104.      * 
  105.      * @Route("/catalog/cart/removecustomercarts/{userId}/{itemId}", name="cart_remove_customercarts", requirements={"userId"="\d+", "itemId"="\d+"})
  106.      */
  107.     public function removeCustomerCarts(TrafficTracker $trafficTrackerStockService $stockService$userId$itemId)
  108.     {
  109.         $trafficTracker->registerTraffic();
  110.         $entityManager $this->getDoctrine()->getManager();
  111.         $user $this->getUser();
  112.         $userCartRepository $this->getDoctrine()->getRepository(Usercart::class);
  113.         $cartItem $userCartRepository->MyCustomersCartQuery()
  114.             ->andwhere('uc.id = :cartId')
  115.             ->setparameter('cartId'$itemId)
  116.             ->getQuery()
  117.             ->getOneOrNullResult();
  118.         if (!is_null($cartItem)) {
  119.             $stockService->removeProvisioningRelatedItems($user$cartItem);
  120.             $this->removeItem($cartItem);
  121.         }
  122.         // Redirect to cart index
  123.         return $this->redirectToRoute('cart_customer_carts', ['userId' => $userId]);
  124.     }
  125.     public function removeItem($cartItem)
  126.     {
  127.         $entityManager $this->getDoctrine()->getManager();
  128.         $user $this->getUser();
  129.         $userCartRepository $this->getDoctrine()->getRepository(Usercart::class);
  130.         if (!is_null($cartItem->getRelatedCartId())) {
  131.             foreach ($cartItem->getRelatedCartId() as $relatedCartId) {
  132.                 /*$relatedItem = $userCartRepository->MyUserCartQuery($user)
  133.                     ->andwhere('uc.id = :relatedItem')
  134.                     ->setparameter('relatedItem', $relatedCartId)
  135.                     ->getQuery()
  136.                     ->getOneOrNullResult();*/
  137.                 $relatedItem $entityManager->createQuery("SELECT uc FROM \App\Entity\Usercart uc "
  138.                     "JOIN App\Entity\Customer c "
  139.                     "JOIN App\Entity\Partner p "
  140.                     'where uc.customer = c.id and c.partner = :partner and uc.unregistrationdate is null and uc.sale is null and uc.id = :relatedItem')
  141.                     ->setParameter('partner'$user->getPartner())
  142.                     ->setparameter('relatedItem'$relatedCartId)
  143.                     ->getOneOrNullResult();
  144.                 $relatedItem->setUnregistrationdate(new \DateTime());
  145.                 $entityManager->persist($relatedItem);
  146.                 $entityManager->flush();
  147.             }
  148.         }
  149.         $cartItem->setUnregistrationdate(new \DateTime());
  150.         $entityManager->persist($cartItem);
  151.         $entityManager->flush();
  152.     }
  153.     /**
  154.      * /**
  155.      * @Route("/catalog/cart/index/{userId}/{customerId}", name="cart_index", requirements={"userId"="\d+"})
  156.      */
  157.     public function index(Request $requestTrafficTracker $trafficTrackerTranslatorInterface $translatorHeaderData $buildHeaderDataTranslation $translationServiceDiscounts $serviceDiscountsPriceCalculatorService $priceCalculatorServicePickupWarehouseService $pickupWarehouseService$userId$customerId null)
  158.     {
  159.         $trafficTracker->registerTraffic();
  160.         $entityManager $this->getDoctrine()->getManager();
  161.         $partnerRepository $this->getDoctrine()->getRepository(Partner::class);
  162.         $vendorRepository $this->getDoctrine()->getRepository(Vendors::class);
  163.         $userCartRepository $this->getDoctrine()->getRepository(Usercart::class);
  164.         $bundleRepository $this->getDoctrine()->getRepository(Bundle::class);
  165.         $pbwRepository $this->getDoctrine()->getRepository(Productbywholesaler::class);
  166.         $productRepository $this->getDoctrine()->getRepository(Product::class);
  167.         $productPromotionRepository $this->getDoctrine()->getRepository(\App\Entity\Productpromotion::class);
  168.         /** @var TaxesRepository */
  169.         $taxesRepository $this->getDoctrine()->getRepository(Taxes::class);
  170.         /** @var Warehouse */
  171.         $warehouseRepository $entityManager->getRepository(Warehouse::class);
  172.         /** @var Customer */
  173.         $customerRepository $entityManager->getRepository(Customer::class);
  174.         
  175.         $session $this->get('session');
  176.         $locale $request->getLocale();
  177.         $user $this->getUser();
  178.         
  179.         $taxes 0;
  180.         $data = array();
  181.         $customer=null;
  182.         if (!$customerId) {
  183.             return $this->redirectToRoute('catalog_goto');
  184.         }
  185.         else
  186.         {
  187.             $customer $customerRepository->MyCustomerQuery($user)
  188.             ->andWhere('c.id = :id')
  189.             ->setParameter('id'$customerId)
  190.             ->getQuery()
  191.             ->setMaxResults(1)
  192.             ->getOneOrNullResult();
  193.         }
  194.         
  195.         $isPartner $user->getPartner() ? true false;
  196.         $partner=null;
  197.         if($user->getPartner()){
  198.             $partner=$user->getPartner();$target=$user->getPartner();
  199.         }
  200.         elseif($user->getCustomer()){
  201.             $partner=$user->getCustomer()->getPartner();$target=$user->getCustomer();
  202.         }
  203.         else{
  204.             $session->getFlashBag()->add('danger'$translator->trans('app.General.SystemMessages.PartnerNotFound'));
  205.             return $this->redirectToRoute('catalog_goto');
  206.         }
  207.         $cart $userCartRepository->MyCustomerCartQuery($user)
  208.             ->andWhere('uc.customer = :customer')
  209.             ->setParameter('customer'$customerId)
  210.             ->getQuery()->getResult();
  211.             
  212.         if (sizeof($cart) == 0) {
  213.             return $this->redirectToRoute('catalog_goto');
  214.         }
  215.         $serviceDiscounts->checkPromosAvailableInCart($cart);
  216.         $serviceDiscounts->checkBOsAvailableInCart($cart);
  217.         $cartIncludesHardware=false;
  218.         $cartIncludesStockMerge=null;
  219.         $cartIncludesStockMergeText null;
  220.         $total 0;
  221.         foreach ($cart as $item) {
  222.             if (!$userCartRepository->checkRelatedId($item)) {
  223.                 continue;
  224.             }
  225.             $pbw $pbwRepository->MyProductbywholesalerQuery($user)
  226.                 ->andWhere('pbw.id = :pbwId')
  227.                 ->setParameter('pbwId'$item->getPbw()->getId())
  228.                 ->getQuery()
  229.                 ->getOneOrNullResult();
  230.             $tax $taxesRepository->getTaxForPbw($pbw);
  231.             $partnerlevel $partnerRepository->getPartnerLevel($partner$pbw->getProduct()->getProductLine()->getVendor()->getId());
  232.             $promo null;
  233.             $discountType null;
  234.             $promoCode null;
  235.             if ($item->getProductPromotion() && $user->getPartner()) {
  236.                 $discountType $translation->getTranslationBy($item->getProductPromotion()->getDiscountType(), $locale'name');
  237.                 $promoCode $item->getProductPromotion()->getPromotion()->getCode();
  238.                 $promo=$item->getProductPromotion();
  239.             }
  240.             $bo null;
  241.             $discountTypeBo null;
  242.             $boCode null;
  243.             if ($item->getProductbusinessoportunities() != null && $user->getPartner()) {
  244.                 $bo $item->getProductbusinessoportunities();
  245.                 $discountTypeBo $item->getProductbusinessoportunities()->getDiscountType()->getName();
  246.                 $boCode $item->getProductbusinessoportunities()->getBusinessOportunity()->getCode();
  247.             }
  248.             elseif($item->getProductBusinessOpportunityCustomer() != null && $user->getCustomer()) {
  249.                 $bo $item->getProductBusinessOpportunityCustomer();
  250.                 $discountTypeBo $item->getProductBusinessOpportunityCustomer()->getDiscountType()->getName();
  251.                 $boCode $item->getProductBusinessOpportunityCustomer()->getBusinessOportunity()->getCode();
  252.             }
  253.             if (isset($pbw)) {
  254.                 //overrider partnerLevel if not follows katy system
  255.                 if (!$pbw->getProduct()->getProductline()->getVendor()->getFollowsKatyPartnerLevel()) {
  256.                     $vendorLvlName $entityManager->createQuery('SELECT vplvl FROM App\Entity\Vendorpartnerlevel vplvl '
  257.                         'where vplvl.vendor = :vendorId and vplvl.level = :level')
  258.                         ->setParameters(array('vendorId' => $pbw->getProduct()->getProductline()->getVendor()->getId(), 'level' => $partnerlevel))
  259.                         ->setMaxResults(1)
  260.                         ->getOneOrNullResult();
  261.                     $partnerlevel $vendorLvlName $vendorLvlName->getName() : '';
  262.                 }
  263.                 if ($pbw->getProduct()->getVolumeMin() == $pbw->getProduct()->getVolumeMax())
  264.                 {
  265.                     $itemMultiplier 1;
  266.                 } else
  267.                 {
  268.                     $itemMultiplier $item->getVolume();
  269.                 }
  270.                 $unitPrice $priceCalculatorService->calculatePrice($pbw$targetnullnull1$bo$promonulltruefalse);             
  271.                 $priceNoTax $priceCalculatorService->calculatePrice($pbw$targetnullnull$itemMultiplier$bo$promonulltruefalse) * $item->getQuantity();
  272.                 
  273.                 if ($tax) {
  274.                     $taxes += ($priceNoTax $tax->getValue()) / 100;
  275.                 }
  276.                 $totalImport $priceCalculatorService->calculatePrice($pbw$targetnullnull$itemMultiplier$bo$promonulltruetrue) * $item->getQuantity();
  277.                 if ($pbw->getProduct()->getFare() != 1) {
  278.                     $total $total $totalImport;
  279.                 }
  280.                 // TO-DO calculatePrice
  281.                 if ($pbw->getProduct()->getSku() == 'BUNDLE') {
  282.                     $bundle true;
  283.                     $description '';
  284.                     $parameters $item->getParameters();
  285.                     $bundle $bundleRepository->find($parameters['bundleId']);
  286.                     $name $bundle->getName();
  287.                     $productsBundle $bundle->getBundleProduct();
  288.                     $price $bundle->getPrice();
  289.                     foreach ($productsBundle as $pb) {
  290.                         $description .= $pb->getProduct()->getDescriptiveName() . ' - ' $pb->getProduct()->getSku() . '</br>';
  291.                     }
  292.                     $unitPrice $bundle->getPrice();
  293.                     $pvdTotal $price $item->getQuantity();
  294.                     $priceNoTax $price $item->getQuantity();
  295.                     $total += $priceNoTax;
  296.                 } else {
  297.                     $bundle false;
  298.                 }
  299.                 $parameters $item->getParameters();
  300.                 if ($pbw->getProduct()->getIsHardware() == true) {
  301.                     $cartIncludesHardware true;                  
  302.                 }
  303.                 $stockMergeText $parameters['stockMergeText'] ?? null;
  304.                 if (!empty($stockMergeText) && is_null($cartIncludesStockMerge)) {
  305.                     $cartIncludesStockMergeText $stockMergeText;
  306.                 }
  307.                 
  308.                 $data[] = array(                
  309.                   'productByWholesaler' => $pbw,
  310.                   'productName' => $bundle $name $pbw->getProduct()->getDescriptiveName(),
  311.                   'pbwDescription' => $bundle $description $pbw->getDescription(),
  312.                   'period' => $pbw->getProduct()->getPayperiod()->getPeriod(),
  313.                   'image' => $pbwRepository->getCoverImage($pbw),
  314.                   'sku' => $pbw->getProduct()->getSku(),
  315.                   'quantity' => $item->getQuantity(),
  316.                   'volume' => $item->getVolume(),
  317.                   'cartId' => $item->getId(),
  318.                   'unitPrice' => $unitPrice,
  319.                   'priceNoTax' => $priceNoTax,                                
  320.                   'isPartner' => $isPartner,                 
  321.                   'promotion' => $item->getProductPromotion(),
  322.                   'discountType' => $discountType,
  323.                   'promoCode' => $promoCode,
  324.                   'bo' => $bo,
  325.                   'discountTypeBo' => $discountTypeBo,
  326.                   'boCode' => $boCode,             
  327.                   'tax' => $tax $tax null,
  328.                   'overage' => $item->getOverage(),
  329.                   'bundle' => $bundle
  330.                 );
  331.             }
  332.         }
  333.         $delivaryData $this->getDeliveryDataFromCartItems($cart$partner$customer$translator);
  334.         
  335.         return $this->render('/catalog/cart/index.html.twig', array(
  336.             'partnerId' => $partner->getId(),
  337.             'isPartner' => $isPartner,
  338.             'data' => $data,
  339.             'headerData' => $buildHeaderData->buildHeaderData($user),
  340.             'total' => $total,
  341.             'locale' => $locale,
  342.             'customer' => $customerId,
  343.             'taxes' => (float)$taxes,
  344.             'useSymbol' => $partner->getWholesaler()->getUseSymbolCurrency(),
  345.             'cnClientInfo' => ($this->connectifService->cnClientInfo($user)),
  346.             'cnCart' => ($this->connectifService->cnCart($user)),
  347.             'operationalCurrency' => $this->operationalCurrencyProvider->provide($target),
  348.             'cartIncludesHardware' => $cartIncludesHardware,
  349.             'cartIncludesStockMergeText' => $cartIncludesStockMergeText,
  350.             'delivaryData' => $delivaryData,
  351.             'pickupData' => $pickupWarehouseService->getAvailableWarehouses($cart$user)
  352.         ));
  353.     }
  354.     private function getDeliveryDataFromCartItems($cart$partner$customer$translator)
  355.     {
  356.         $entityManager $this->getDoctrine()->getManager();
  357.         /** @var Warehouse */
  358.         $warehouseRepository $entityManager->getRepository(Warehouse::class);
  359.         /** @var CompanyAddress */
  360.         $companyAddressRepository $entityManager->getRepository(CompanyAddress::class);
  361.         /** @var WarehousePolicies */
  362.         $warehousePoliciesRepository $entityManager->getRepository(WarehousePolicies::class);
  363.         $user $this->getUser();
  364.         $data = array('allowPickup' => true'allowCustomerDelivery' => false'allowUnofficialDelivery' => false);
  365.         //DATA FROM POLICIES
  366.         $warehousePolicies $warehousePoliciesRepository->MyWarehousePoliciesQuery($user)
  367.             ->getQuery()
  368.             ->getOneOrNullResult();
  369.         if($warehousePolicies){
  370.             $data['allowCustomerDelivery']=$warehousePolicies->getAllowCustomerDelivery();
  371.             $data['allowUnofficialDelivery']=$warehousePolicies->getAllowNonOfficialAddresses();          
  372.         }
  373.         $addresses = array();
  374.         //GENERAL PARTNER ADDRESSES
  375.         $companyAddresses $companyAddressRepository->MyCompanyAddressQuery($partner)->getQuery()->getResult();
  376.         foreach ($companyAddresses as $companyAddress) {
  377.             $addresses[] = [
  378.                 'id' => $companyAddress->getId(),
  379.                 'address' => $companyAddress->getName()." - ".$companyAddress->getAddress().", ".$companyAddress->getPostcode().", ".$companyAddress->getCity(),
  380.                 'selected' => $companyAddress->getPrimaryAddress(),
  381.             ];
  382.         }
  383.         if (empty($addresses)) {
  384.             $addresses[] = [
  385.                 'id' => $partner->getId(),
  386.                 'address' => $partner->getAddress().", ".$partner->getPostcode().", ".$partner->getCity(),
  387.                 'selected' => true,
  388.             ];
  389.         }
  390.         $data['addresses']=$addresses;
  391.         $customerAddresses = array();
  392.         //CUSTOMER ADDRESSES
  393.         $customerAddressesBD $companyAddressRepository->MyCompanyAddressQuery($customer)->getQuery()->getResult();
  394.         
  395.         foreach ($customerAddressesBD as $companyAddress) {
  396.             $customerAddresses[] = [
  397.                 'id' => $companyAddress->getId(),
  398.                 'address' => $companyAddress->getName()." - ".$companyAddress->getAddress().", ".$companyAddress->getPostcode().", ".$companyAddress->getCity(),
  399.                 'selected' => $companyAddress->getPrimaryAddress(),
  400.             ];
  401.         }
  402.         if (empty($customerAddresses)) {
  403.             $customerAddresses[] = [
  404.                 'id' => $customer->getId(),
  405.                 'address' => $customer->getAddress().", ".$customer->getPostcode().", ".$customer->getCity(),
  406.                 'selected' => true,
  407.             ];
  408.         }
  409.         $data['customerAddresses']=$customerAddresses;
  410.         
  411.         return $data;
  412.     }
  413.     /**
  414.      * /**
  415.      * @Route("/catalog/cart/add/{userId}", name="cart_add", requirements={"userId"="\d+"})
  416.      */
  417.     public function add(Request $requestTrafficTracker $trafficTracker$userIdExtraFieldsService $extraFieldsService)
  418.     {
  419.         $trafficTracker->registerTraffic();
  420.         $userCart = new Usercart();
  421.         $typeOfProduct $request->get('typeofproduct');
  422.         $domain = empty($request->get('domain')) ? null $request->get('domain');
  423.         $quantity $request->get('quantity');
  424.         $volume $request->get('volume');
  425.         $volume_addon $request->get('volume_addon');
  426.         $customer $request->get('customer');
  427.         $pbwId $request->get('pbwId');
  428.         $preorder $request->get('preorder');
  429.         $divide $request->get('divide');
  430.         $bundleId $request->get('bundle');
  431.         $productbywholesalerRepository $this->getDoctrine()->getRepository(Productbywholesaler::class);
  432.         $productRepository $this->getDoctrine()->getRepository(Product::class);
  433.         $bundleRepository $this->getDoctrine()->getRepository(Bundle::class);
  434.         
  435.         $licenseType $request->get('licenseType');
  436.         $stockMergeText $request->get('stock_merge_text');
  437.         if ((is_null($pbwId) && is_null($bundleId)) || is_null($customer) || is_null($volume) || is_null($quantity)) {
  438.             return $this->redirectToRoute('catalog_goto');
  439.         }
  440.         $serialNumber $request->files->get('serialNumber');
  441.         if (!is_null($serialNumber) && !empty($serialNumber)) {
  442.             // Verificar la extensión del archivo
  443.             $fileExtension $serialNumber->guessExtension();
  444.             if (!in_array($fileExtension, array("xlsx"))) {
  445.                 return $this->redirectToRoute('catalog_view', ['id' => $pbwId]);
  446.             }
  447.         }
  448.         if(is_null($volume_addon)){
  449.             $volume_addon=$volume;          
  450.         }
  451.         
  452.         $entityManager $this->getDoctrine()->getManager();
  453.         $userCartRepository $this->getDoctrine()->getRepository(Usercart::class);
  454.         $user $this->getDoctrine()->getRepository(User::class)->find($userId);
  455.         $customer $this->getDoctrine()->getRepository(Customer::class)->find($customer);
  456.         $productPromotionRepo $this->getDoctrine()->getRepository(\App\Entity\Productpromotion::class);
  457.         $productRepository $this->getDoctrine()->getRepository(Product::class);
  458.         if ($pbwId) {
  459.             $pbw $this->getDoctrine()->getRepository(Productbywholesaler::class)->find($request->get('pbwId'));
  460.         } else { //BUNDLE ONLY
  461.             $bundle $bundleRepository->MyBundleQuery($user)->andWhere('b.id = :bundleId')->setParameter('bundleId'$bundleId)->getQuery()->getOneOrNullResult();
  462.             $parameters $userCart->getParameters();
  463.             $parameters['bundleId'] = $bundleId;
  464.             $parameters['description'] = $bundle->getDescription();
  465.             $parameters['name'] = $bundle->getName();
  466.             $parameters['price'] = $bundle->getPrice();
  467.             $parameters['freeInvoicescustomer'] = 1;
  468.             $parameters['freeInvoicespartner'] = 1;
  469.             $userCart->setParameters($parameters);
  470.             $pbw $productbywholesalerRepository->MyBundleByWholesalerQuery($user);
  471.             $mainProduct $userCartRepository->addItem($userCart$user$pbw$volume$quantity$customer$domainnullnullnullnull00$bundle->getPrice());
  472.             return $this->redirectToRoute('cart_customer_carts', ['userId' => $userId]);
  473.         }
  474.         //New types with volume and quantity
  475.         $newTypesVolumeAndQuantity = array(1/*'simple_type'*/3/*'with_maintenance'*/5/*'flavoured_type'*/4/*'flavoured_list_type'*/6/*'flavoured_duration'*//*'flavoured_volumelist_duration'*//*'flavoured_duration_volumeinput'*//*'flavoured_version'*/10 /*'flavoured_version_volume_input'*/11/*'flavour_list_with_maintenance'*/12/*'flavour_with_maintenance'*/13/*'flavoured_version_maintenance'*/14/*'flavoured_version_with_volume'*/15/*'flavoured_version_volumeinput_range'*/1617212223242526);
  476.         $newTypesVolumeAndQuantityMaint = array(3/*'with_maintenance'*/11/*'flavour_list_with_maintenance'*/12/*'flavour_with_maintenance'*/13/*'flavoured_version_maintenance'*/222326);
  477.         //SOFTWARE
  478.         $stockCart 0;
  479.         $preorderCart 0;
  480.         //HARDWARE - ONLY STOCK
  481.         if ($pbw->getProduct()->getIsHardware()) {
  482.             $stockCart $volume;
  483.         }
  484.         //HARDWARE - ALL PREORDER
  485.         if (empty($divide) && !empty($preorder)) {
  486.             $stockCart $volume $preorder;
  487.             $preorderCart $preorder;
  488.         }
  489.         //HARDWARE - STOCK -> DIVIDED
  490.         if (!empty($divide) && $divide == 1) {
  491.             $volume $volume $preorder;
  492.             $stockCart $volume;
  493.             $volume_addon $volume;
  494.         }
  495.         if ($volume 0) {
  496.             //New types with volume and quantity
  497.             if (in_array($typeOfProduct$newTypesVolumeAndQuantity)) {
  498.                 $promotionsRequest json_decode($request->get('promotions'), true);
  499.                 $idProductPromotion $promotionsRequest == null null $promotionsRequest[$pbw->getId()];
  500.                 $productPromo $idProductPromotion $productPromotionRepo->find($idProductPromotion) : null;
  501.                 $userCart $this->resetUserCartInstance();
  502.                 $mainProduct $userCartRepository->addItem($userCart$user$pbw$volume$quantity$customer$domainnull$productPromonullnull$stockCart$preorderCart);
  503.                 if (in_array($typeOfProduct$newTypesVolumeAndQuantityMaint) && !is_null($request->get('maintenance')) && $request->get('maintenance') != '') {
  504.                     $pbwMaintId $request->get('maintenance');
  505.                     $pbwMain $this->getDoctrine()->getRepository(Productbywholesaler::class)->find($pbwMaintId);
  506.                     $idProductPromoMaint $promotionsRequest == null null $promotionsRequest[$pbwMaintId];
  507.                     $productPromoMaint $idProductPromoMaint $productPromotionRepo->find($idProductPromoMaint) : null;
  508.                     $userCart $this->resetUserCartInstance();
  509.                     $subProduct $userCartRepository->addItem($userCart$user$pbwMain$volume_addon$quantity$customer$domain$mainProduct->getId(), $productPromoMaintnullnull$stockCart$preorderCart);
  510.                     $userCartRepository->addRelatedId($mainProduct$subProduct->getId());
  511.                 }
  512.             }
  513.             /// Bloque Extrafields
  514.             $extraParams $extraFieldsService->processExtraFields(
  515.                 $request,
  516.                 $productRepository->getParentSkuIds($pbw->getProduct())->getParameters() ?? []
  517.             );
  518.             
  519.             if (!empty($extraParams)) {
  520.                 $newParams array_merge($newParams ?? [], $extraParams);
  521.                 $mainProduct->setParameters($newParams);
  522.                 $entityManager->persist($mainProduct);
  523.                 $entityManager->flush();
  524.             }
  525.             ////
  526.             if (!is_null($licenseType) && !empty($licenseType)) {
  527.                 $newParams['licenseType'] = $licenseType;
  528.                 $mainProduct->setParameters(json_decode(json_encode($newParams), true));
  529.                 $entityManager->persist($mainProduct);
  530.                 $entityManager->flush();
  531.             }
  532.             if (!is_null($stockMergeText) && !empty($stockMergeText)) {
  533.                 $newParams['stockMergeText'] = $stockMergeText;
  534.                 $mainProduct->setParameters(json_decode(json_encode($newParams), true));
  535.                 $entityManager->persist($mainProduct);
  536.                 $entityManager->flush();
  537.             }
  538.         }
  539.         //HARDWARE - PREORDER -> DIVIDED
  540.         if (!empty($preorder) && !empty($divide)) {
  541.             $volume $preorder;
  542.             $volume_addon $volume;
  543.             $preorderCart $preorder;
  544.             $stockCart 0;
  545.             if (in_array($typeOfProduct$newTypesVolumeAndQuantity)) {
  546.                 $promotionsRequest json_decode($request->get('promotions'), true);
  547.                 $idProductPromotion $promotionsRequest == null null $promotionsRequest[$pbw->getId()];
  548.                 $productPromo $idProductPromotion $productPromotionRepo->find($idProductPromotion) : null;
  549.                 $userCart $this->resetUserCartInstance();
  550.                 $mainProduct $userCartRepository->addItem($userCart$user$pbw$volume$quantity$customer$domainnull$productPromonullnull$stockCart$preorderCart);
  551.                 if (in_array($typeOfProduct$newTypesVolumeAndQuantityMaint) && !is_null($request->get('maintenance')) && $request->get('maintenance') != '') {
  552.                     $pbwMaintId $request->get('maintenance');
  553.                     $pbwMain $this->getDoctrine()->getRepository(Productbywholesaler::class)->find($pbwMaintId);
  554.                     $idProductPromoMaint $promotionsRequest == null null $promotionsRequest[$pbwMaintId];
  555.                     $productPromoMaint $idProductPromoMaint $productPromotionRepo->find($idProductPromoMaint) : null;
  556.                     $userCart $this->resetUserCartInstance();
  557.                     $subProduct $userCartRepository->addItem($userCart$user$pbwMain$volume_addon$quantity$customer$domain$mainProduct->getId(), $productPromoMaintnullnull$stockCart$preorderCart);
  558.                     $userCartRepository->addRelatedId($mainProduct$subProduct->getId());
  559.                 }
  560.             }
  561.         }
  562.         return $this->redirectToRoute('cart_index', ['userId' => $userId'customerId' => $customer->getId()]);
  563.         //return $this->redirectToRoute('cart_customer_carts', ['userId' => $userId]);
  564.     }
  565.     /**
  566.      * Remove one item from the cart
  567.      * 
  568.      * @Route("/catalog/cart/remove/{userId}/{cartId}", name="cart_remove", requirements={"userId"="\d+", "cartId"="\d+"})
  569.      */
  570.     public function remove(TrafficTracker $trafficTrackerStockService $stockService$userId$cartId)
  571.     {
  572.         $trafficTracker->registerTraffic();
  573.         $entityManager $this->getDoctrine()->getManager();
  574.         $user $this->getUser();
  575.         $userCartRepository $this->getDoctrine()->getRepository(Usercart::class);
  576.         $cartItem $userCartRepository->MyUserCartQuery($user)
  577.             ->andwhere('uc.id = :cartId')
  578.             ->setparameter('cartId'$cartId)
  579.             ->getQuery()
  580.             ->getOneOrNullResult();
  581.         $customerId $cartItem->getCustomer()->getId();
  582.         if (!is_null($cartItem)) {
  583.             $stockService->removeProvisioningRelatedItems($user$cartItem);
  584.             $this->removeItem($cartItem);
  585.         }
  586.         // Redirect to cart index
  587.         return $this->redirectToRoute('cart_index', ['userId' => $userId'customerId' => $customerId]);
  588.     }
  589.     /**
  590.      * Action to sale everything in the cart
  591.      * 
  592.      * @Route("/catalog/cart/checkout/{userId}/{customerId}", name="cart_checkout", requirements={"userId"="\d+"})
  593.      */
  594.     public function checkout(Request $requestTrafficTracker $trafficTrackerTranslation $translationTranslatorInterface $translatorHeaderData $buildHeaderData$userIdServiceNotification $serviceNotificationServiceDiscounts $serviceDiscountsJsonSearchService $jsonSearchServiceGenerateLinesFromSalesService $invoiceServicePriceCalculatorService $priceCalculatorService$customerId nullLicenseGeneratorService $licenseGeneratorSaleGeneratorService $saleGenerator)
  595.     {
  596.         $trafficTracker->registerTraffic();
  597.         $session $this->get('session');
  598.         $entityManager $this->getDoctrine()->getManager();
  599.         $userCartRepository $this->getDoctrine()->getRepository(Usercart::class);
  600.         $userRepository $this->getDoctrine()->getRepository(User::class);
  601.         $partnerRepository $this->getDoctrine()->getRepository(Partner::class);
  602.         $boRepository $this->getDoctrine()->getRepository(Businessoportinities::class);
  603.         $customerRepository $this->getDoctrine()->getRepository(Customer::class);
  604.         $vendorRepository $this->getDoctrine()->getRepository(Vendors::class);
  605.         $productbywholesalerRepository $this->getDoctrine()->getRepository(Productbywholesaler::class);
  606.         $productRepository $this->getDoctrine()->getRepository(Product::class);
  607.         $productPromotionRepository $this->getDoctrine()->getRepository(\App\Entity\Productpromotion::class);
  608.         $session $this->get('session');
  609.         /** @var TaxesRepository */
  610.         $taxRepository $this->getDoctrine()->getRepository(Taxes::class);
  611.         //Check Markup and Discounts
  612.         /** @var MarkupsByChannelRepository */
  613.         $markupsByChannelRepository $this->getDoctrine()->getRepository(MarkupsByChannel::class);
  614.         /** @var DiscountsByChannelRepository */
  615.         $discountsByChannelRepository $this->getDoctrine()->getRepository(DiscountsByChannel::class);
  616.         /** @var FileRepository */
  617.         $fileRepository $this->getDoctrine()->getRepository(File::class);
  618.         $deliveryType     $request->request->get('delivery_type');
  619.         $warehouseId      $request->request->get('pickup_warehouse_id');
  620.         $addressSource   $request->request->get('address_source'); // 'partner' | 'customer' | 'custom'
  621.         $selectedAddress  $request->request->get('selected_address');
  622.         //USER
  623.         $user $userRepository->MyUserQuery($this->getUser())
  624.             ->andWhere('u.id = :userId')
  625.             ->setParameter('userId'$userId)
  626.             ->getQuery()
  627.             ->getSingleResult();
  628.         //CUSTOMER
  629.         if (!$customerId) {
  630.             return $this->redirectToRoute('catalog_goto');
  631.         }else{
  632.             $customer $customerRepository->MyCustomerQuery($user)
  633.             ->andWhere('c.unregistrationdate is NULL ')
  634.             ->andWhere('c.id = :customerId ')
  635.             ->setParameter('customerId'$customerId)
  636.             ->getQuery()
  637.             ->getOneOrNullResult();
  638.             if (!$customer) {
  639.                 return $this->redirectToRoute('catalog_goto');
  640.             }
  641.         }
  642.         //PARTNER
  643.         $partner $partnerRepository->MyPartnerQuery($user)->getQuery()->getSingleResult();
  644.         if (!$partner) {
  645.             $session->getFlashBag()->add('danger'$translator->trans('app.General.SystemMessages.PartnerNotFound'));
  646.             return $this->redirectToRoute('catalog_goto');
  647.         }
  648.         
  649.         //WHOLESALER
  650.         $wholesaler $partner->getWholesaler();
  651.         //TARGET
  652.         if($user->getPartner()){
  653.             $target=$user->getPartner();
  654.         }
  655.         elseif($user->getCustomer()){
  656.             $target=$user->getCustomer();
  657.         }
  658.         //CART
  659.         $cart $userCartRepository->MyUserCartQuery($user)
  660.             ->andWhere('uc.customer = :customer')
  661.             ->setParameter('customer'$customerId)
  662.             ->getQuery()
  663.             ->getResult();
  664.         // If cart is empty  
  665.         if (sizeof($cart) == 0) {
  666.             return $this->redirect($this->generateUrl('cart_index', array('userId' => $userId)));
  667.         }
  668.         $serviceDiscounts->checkPromosAvailableInCart($cart);
  669.         $serviceDiscounts->checkBOsAvailableInCart($cart);
  670.         
  671.         $financialRiskCheckResult=$this->financialRiskService->financialRiskCheck('cartCheckout'$cart$user$customer);
  672.         if($financialRiskCheckResult['result']==false){
  673.             return $this->render('catalog/cart/denied.html.twig', array(
  674.                 'headerData' => $buildHeaderData->buildHeaderData($user),
  675.                 'partnerId' => $partner->getId(),
  676.                 'reference' => 'reference',
  677.                 'data' => $financialRiskCheckResult['data'],
  678.                 'currency' => $partner->getWholesaler()->getCurrency()->getIso(),
  679.                 'comercial' => $userRepository->find($userRepository->getCompany($user)->getIdCommercialAgent()),
  680.                 'title' => 'app.General.SystemMessages.LimitExceeded',
  681.                 'message' => 'app.General.SystemMessages.LimitExceeded',
  682.                 'messageDesc' => 'app.General.SystemMessages.AuthorizationRequired',
  683.                 'vendorsRepository' => $vendorRepository,
  684.                 'useSymbol' => $partner->getWholesaler()->getUseSymbolCurrency()
  685.             ));
  686.         }
  687.         //Mark BO has redeemed
  688.         $idBusinessoportunity $this->findBOActiveInCustomerCart($cart);
  689.         if ($idBusinessoportunity) {
  690.             $bo $boRepository->find($idBusinessoportunity);
  691.             if (!$bo->getUsed()) {
  692.                 $bo->setUsed(true);
  693.                 $entityManager->persist($bo);
  694.                 $entityManager->flush();
  695.             }
  696.         }
  697.         //PO NUMBER
  698.         if (!empty($request->get('po_number'))) {
  699.             $po_number $request->get('po_number');
  700.             if (strlen($po_number) > 50) {
  701.                 $session->getFlashBag()->add('danger'$translator->trans('app.General.Guidelines.TooLong'));
  702.                 return $this->redirectToRoute('cart_index', ['userId' => $userId'customerId' => $customerId]);
  703.             }
  704.         }else {
  705.             $po_number null;
  706.         }
  707.         $poOriginalFileName null;
  708.         $poFileName null;
  709.         $purchaseOrder null;
  710.         $path $this->getParameter('private_folder') . 'po/';
  711.         if (!empty($request->files->get('po'))) {
  712.             $file $request->files->get('po');
  713.             $fileExtension $file->guessExtension();
  714.             if (!in_array($fileExtension, array("pdf"))) {
  715.                 $session->getFlashBag()->add('danger'$translator->trans('app.Development.DataImport.FileCannotLoaded'));
  716.                 return $this->redirectToRoute('cart_index', ['userId' => $userId'customerId' => $customerId]);
  717.             }
  718.             $poOriginalFileName $file->getClientOriginalName();
  719.             $newName uniqid() . '.' $file->guessExtension();
  720.             $poFileName $newName;
  721.             $file->move($path$newName);
  722.             $uploadedPofile = new \App\Entity\File();
  723.             $uploadedPofile->setOriginalName($poOriginalFileName);
  724.             $uploadedPofile->setFileName($poFileName);
  725.             $entityManager->persist($uploadedPofile);
  726.             $purchaseOrder = new \App\Entity\PurchaseOrder();
  727.             $purchaseOrder->setNumber($po_number);
  728.             $purchaseOrder->setDescription("purchase");
  729.             $purchaseOrder->setCreatedBy($user->getId());
  730.             $purchaseOrder->setFile($uploadedPofile);
  731.             $entityManager->persist($purchaseOrder);
  732.             $entityManager->flush();
  733.         }
  734.         $locale $request->getLocale();
  735.         $reference time() . '-' rand(0999999);
  736.         $licensesArray = array();
  737.         $cartReference null;
  738.         //Process each SKU (Create license and Sale)
  739.         foreach ($cart as $cartItem) {
  740.             if ($cartItem->getProductPromotion() && !is_null($cartItem->getProductPromotion()->getStock()) && $cartItem->getProductPromotion()->getStock() > 0) {
  741.                 $cartItem->getProductPromotion()->setStock($cartItem->getProductPromotion()->getStock() - 1);
  742.                 $entityManager->persist($cartItem);
  743.                 $entityManager->flush();
  744.             }
  745.             //Find product
  746.             $pbw $productbywholesalerRepository->MyProductbywholesalerQuery($user)
  747.                 ->andWhere('pbw.id = :pbwId')
  748.                 ->setParameter('pbwId'$cartItem->getPbw()->getId())
  749.                 ->getQuery()
  750.                 ->getOneOrNullResult();
  751.             $parameters $cartItem->getParameters();
  752.             $q $cartItem->getQuantity();
  753.             $v $cartItem->getVolume();
  754.             $n $pbw->getProduct()->getVolumeMin() == $pbw->getProduct()->getVolumeMax() ? $v;
  755.             for ($i 0$i $q$i++) {
  756.                 //Create  License
  757.                 $license $licenseGenerator->createLicense($customer$pbw->getProduct(), $v1nullnullnullnull);
  758.                 if (!is_null($purchaseOrder)) {
  759.                     $license->addPurchaseOrder($purchaseOrder);
  760.                 }
  761.                 if($pbw->getProduct()->getIsHardware()){
  762.                     $parameters['deliveryType'] = $deliveryType;
  763.                     $parameters['warehouseId'] = $warehouseId;
  764.                     $parameters['addressSource'] = $addressSource;
  765.                     $parameters['selectedAddress'] = $selectedAddress;
  766.                     $license->setParameters(json_decode(json_encode($parameters), true));
  767.                 }
  768.                 else
  769.                 {
  770.                     $license->setParameters($cartItem->getParameters());
  771.                 }
  772.                 
  773.                 $license->setStock($cartItem->getStock());
  774.                 $license->setOverage($cartItem->getOverage());
  775.                 $mainProduct=$productRepository->getParentSkuIds($pbw->getProduct());
  776.                 if ($mainProduct->getProductType()->getId()==26 && $pbw->getProduct()->getCanSellAlone()) {
  777.                     $license->setIsMain(0);
  778.                 } elseif($mainProduct->getProductType()->getId()==26) {
  779.                     $license->setIsMain(1);
  780.                 } elseif ($pbw->getProduct()->getCanSellAlone()) {
  781.                     $license->setIsMain(1);
  782.                 } else {
  783.                     $license->setIsMain(0);
  784.                 }                         
  785.                 if ($cartItem->getDomain()) {
  786.                     $license->setLicenseId($cartItem->getDomain());
  787.                 }
  788.                 if ($license->getProduct()->getIsHardware()) {
  789.                     $license->setDeliveryStatus("Processing");
  790.                 }
  791.                 $entityManager->persist($license);
  792.                 $entityManager->flush();
  793.                 $serialNumberFileId $jsonSearchService->searchKeyInArray($cartItem->getParameters(), 'serialNumberFile');
  794.                 if (!empty($serialNumberFileId)) {
  795.                     $serialNumberFile $fileRepository->find($serialNumberFileId[0]);
  796.                     $licenseResource = new Licenseresources();
  797.                     $licenseResource->setResourcetype(8);
  798.                     $licenseResource->setResource($serialNumberFile->getOriginalName());
  799.                     $licenseResource->setResourceDescription($serialNumberFile->getFileName());
  800.                     $licenseResource->setLicense($license);
  801.                     $entityManager->persist($licenseResource);
  802.                     $entityManager->flush();
  803.                 }
  804.                 $licensesArray[] = $license;
  805.                 // Recoger PO
  806.                 $user $this->getUser();
  807.                 $isPartner $user->getPartner() ? true false;
  808.                 $exchangeRate $productbywholesalerRepository->getExchangeRate($pbw);
  809.                 $boCustomer $cartItem->getProductBusinessOpportunityCustomer();
  810.                 $bo $cartItem->getProductBusinessOportunities();
  811.                 if ($cartItem->getProductPromotion() != null) {
  812.                     $productPromotion $cartItem->getProductPromotion();
  813.                     $promotions $productPromotionRepository->find($cartItem->getProductPromotion()->getId());
  814.                     if (!is_null($promotions) && $promotions->getPromotion()->getUsed() == 0) {
  815.                         $promotions->getPromotion()->setUsed(1);
  816.                         $entityManager->persist($promotions);
  817.                         $entityManager->flush();
  818.                     }
  819.                     if ($promotions->getStock() != || $promotions->getStock()) {
  820.                         $promotions->setStock($promotions->getStock() - 1);
  821.                         $entityManager->persist($promotions);
  822.                         $entityManager->flush();
  823.                     }
  824.                 }else{
  825.                     $productPromotion null;
  826.                 }
  827.                 $partnerPO $isPartner $po_number null;
  828.                 $customerPO = !$isPartner $po_numbernull;
  829.                 $sale $saleGenerator->createSale(
  830.                     $reference,
  831.                     $partnerPO,
  832.                     null,
  833.                     $customerPO,
  834.                     $customer,
  835.                     $pbw,
  836.                     $n,
  837.                     null,
  838.                     null,
  839.                     $exchangeRate,
  840.                     $license,
  841.                     null,
  842.                     null,
  843.                     null,
  844.                     1,
  845.                     $bo,
  846.                     $boCustomer,
  847.                     $productPromotion
  848.                 );
  849.                 $cartItem->setSale($sale);
  850.                 $cartItem->setSaleReference($reference);
  851.                 $entityManager->persist($cartItem);
  852.                 $entityManager->flush();
  853.                 
  854.                 //BUNDLE SUBLICENSES ONLY
  855.                 if (!is_null($parameters) && array_key_exists('bundleId'$parameters)) {
  856.                     $bundleRepository $this->getDoctrine()->getRepository(Bundle::class);
  857.                     $bundle $bundleRepository->MyBundleQuery($user)->andWhere('b.id = :bundleId')->setParameter('bundleId'$parameters['bundleId'])->getQuery()->getOneOrNullResult();
  858.                     $bundlePbws $bundle->getBundleProduct();
  859.                     $license->setActivationDate(new DateTime('now'));
  860.                     $license->setActivationRequestDate(new DateTime('now'));
  861.                     $license->setHasSublicenses(1);
  862.                     $entityManager->persist($license);
  863.                     $entityManager->flush();
  864.                     foreach ($bundlePbws as $item) {
  865.                         $z 1;
  866.                         $subLicense $licenseGenerator->createLicense($customer$item->getProduct(), $v0nullnullnullnull);
  867.                         $subLicense->setParameters($parameters);
  868.                         $subLicense->setStock(0);
  869.                         $subLicense->setOverage(0);
  870.                         $subLicense->setMainLicense($license);
  871.                         $entityManager->persist($subLicense);
  872.                         $entityManager->flush();
  873.                         $reference $reference '-' $z++;
  874.                         
  875.                         $subSale $saleGenerator->createSale(
  876.                             $reference,
  877.                             $partnerPO,
  878.                             null,
  879.                             $customerPO,
  880.                             $customer,
  881.                             $pbw,
  882.                             null,
  883.                             null,
  884.                             null,
  885.                             $exchangeRate,
  886.                             $subLicense,
  887.                             null,
  888.                             null,
  889.                             null,
  890.                             1,
  891.                             $bo,
  892.                             $boCustomer,
  893.                             $productPromotion
  894.                         );
  895.                       
  896.                     }
  897.                     $sale->setDatebegining(new DateTime('now'));
  898.                     $sale->setClosed('0');
  899.                     $sale->setPrice($bundle->getPrice());
  900.                     $sale->setPriceConverted($bundle->getPrice());
  901.                     $sale->setExchangeRate(null);
  902.                     $entityManager->persist($sale);
  903.                     $entityManager->flush();
  904.                     $month $sale->getDatebegining()->format('m');
  905.                     $year $sale->getDatebegining()->format('Y');
  906.                     $invoiceService->generateLines('partner'$month$year$wholesaler$sale->getId());
  907.                     $invoiceService->generateLines('customer'$month$year$wholesaler$sale->getId());
  908.                     $financialRisk $partner->getFinancialrisk();
  909.                     if (!is_null($financialRisk)) {
  910.                         $totalSale $sale->getQuantity() * $sale->getPrice();
  911.                         $financialRisk $financialRisk $totalSale;
  912.                         $partner->setFinancialRisk($financialRisk);
  913.                         $entityManager->persist($partner);
  914.                         $entityManager->flush();
  915.                     }
  916.                 }
  917.             }
  918.             $cartReference $cartItem->getCartReference();
  919.         }
  920.         $allLicenseToActivate $licensesArray;
  921.         //Link sublicenses to mainlicense
  922.         foreach ($licensesArray as $key => $license) {
  923.             if ($license->getIsMain()) {
  924.                 foreach ($licensesArray as $l) {
  925.                     if(is_null($l->getMainlicense()) && !is_null($license->getProduct()->getMaintenanceskuids()) && in_array($l->getProduct()->getId(), $license->getProduct()->getMaintenanceskuids())){
  926.                         $l->setMainlicense($license);
  927.                         $license->setHasSublicenses(1);
  928.                         $entityManager->persist($l);
  929.                         $entityManager->persist($license);
  930.                         $entityManager->flush();
  931.                         unset($licensesArray[$key]);
  932.                         break;
  933.                     }
  934.                 }
  935.             }
  936.         }
  937.         foreach ($allLicenseToActivate as $key => $license) {
  938.             $response $this->forward('App\Controller\ProductManagerController::activationlicenseAction', ['id'  => $license->getId()]);
  939.         }
  940.         
  941.         return $this->redirectToRoute('license_index', ['cart_id' => $cartReference]);
  942.     }
  943.     /**
  944.      * Last page of the process shows aquired services / products
  945.      * 
  946.      * 
  947.      * @Route("/catalog/cart/done/{userId}/{reference}", name="cart_done", requirements={"userId"="\d+", "reference"="\S+"})
  948.      */
  949.     public function done(Request $requestTrafficTracker $trafficTrackerTranslatorInterface $translatorHeaderData $buildHeaderDataServiceNotification $serviceNotificationPriceCalculatorService $priceCalculatorService$userId$reference)
  950.     {
  951.         $trafficTracker->registerTraffic();
  952.         $entityManager $this->getDoctrine()->getManager();
  953.         $productRepository $this->getDoctrine()->getRepository(Product::class);
  954.         $userRepository $this->getDoctrine()->getRepository(User::class);
  955.         $partnerRepository $this->getDoctrine()->getRepository(Partner::class);
  956.         $pbwRepository $this->getDoctrine()->getRepository(Productbywholesaler::class);
  957.         $vendorsRepository $this->getDoctrine()->getRepository(Vendors::class);
  958.         $session $this->get('session');
  959.         /** @var TaxesRepository */
  960.         $taxesRepository $this->getDoctrine()->getRepository(Taxes::class);
  961.         
  962.         $data = [];
  963.         $isPartner $this->getUser()->getPartner() ? true false;
  964.         $locale $request->getLocale();
  965.         $taxes 0;
  966.         // Get partner
  967.         $user $userRepository->MyUserQuery($this->getUser())
  968.             ->andWhere('u.id = :userId ')
  969.             ->setParameter('userId'$userId)
  970.             ->setMaxResults(1)
  971.             ->getQuery()
  972.             ->getSingleResult();
  973.         if($user->getPartner()){
  974.             $target=$user->getPartner();
  975.             $partner $user->getPartner();
  976.         }
  977.         elseif($user->getCustomer()){
  978.             $target=$user->getCustomer();
  979.             $partner $user->getCustomer()->getPartner();
  980.         }    
  981.         if (!$partner) {
  982.             $session->getFlashBag()->add('danger'$translator->trans('app.General.SystemMessages.PartnerNotFound'));
  983.             return $this->redirectToRoute('catalog_goto');
  984.         }
  985.         $userCart $entityManager->createQuery('SELECT uc FROM App\Entity\Usercart uc WHERE uc.salereference = :reference')->setParameter('reference'$reference)->getResult();
  986.         $total 0;
  987.         // For each element in the cart
  988.         foreach ($userCart as $cartItem) {
  989.             $promotion null;
  990.             $discountTypePr null;
  991.             $promoCode null;
  992.             $bo null;
  993.             $discountTypeBo null;
  994.             $boCode null;
  995.             //Find product
  996.             $pbw $pbwRepository->MyProductbywholesalerQuery($user)
  997.                 ->andWhere('pbw.wholesaler = :wholesalerId')
  998.                 ->andWhere('p.sku = :sku')
  999.                 ->leftJoin('pbw.product''p')
  1000.                 ->setParameter('wholesalerId'$partner->getWholesaler()->getId())
  1001.                 ->setParameter('sku'$cartItem->getSale()->getSku())
  1002.                 ->getQuery()
  1003.                 ->getOneOrNullResult();
  1004.             
  1005.             $tax $taxesRepository->getTaxForPbw($pbw);
  1006.             if ($cartItem->getSale()->getProductPromotion() != null && $user->getPartner()) {
  1007.                 $promotion $cartItem->getSale()->getProductPromotion();
  1008.                 $discountTypePr $cartItem->getSale()->getProductPromotion()->getDiscountType()->getName();
  1009.                 $promoCode $cartItem->getSale()->getProductPromotion()->getPromotion()->getCode();
  1010.             }
  1011.             if ($cartItem->getSale()->getProductbusinessoportunity() != null && $user->getPartner()) {
  1012.                 $bo $cartItem->getSale()->getProductbusinessoportunity();
  1013.                 $discountTypeBo $cartItem->getSale()->getProductbusinessoportunity()->getDiscountType()->getName();
  1014.                 $boCode $cartItem->getSale()->getProductbusinessoportunity()->getBusinessOportunity()->getCode();
  1015.             }
  1016.             elseif($cartItem->getSale()->getProductBusinessOpportunityCustomer() != null && $user->getCustomer()) {
  1017.                 $bo $cartItem->getSale()->getProductBusinessOpportunityCustomer();
  1018.                 $discountTypeBo $cartItem->getSale()->getProductBusinessOpportunityCustomer()->getDiscountType()->getName();
  1019.                 $boCode $cartItem->getSale()->getProductBusinessOpportunityCustomer()->getBusinessOportunity()->getCode();
  1020.             }
  1021.             $unitPrice $priceCalculatorService->calculatePrice($pbw$targetnullnull1$bo$promotionnulltruefalse);             
  1022.             $priceNoTax $priceCalculatorService->calculatePrice($pbw$targetnullnull$cartItem->getSale()->getQuantity(), $bo$promotionnulltruefalse) * $cartItem->getQuantity();
  1023.             if ($tax) {
  1024.                 $taxes += ($priceNoTax $tax->getValue()) / 100;
  1025.             }
  1026.             $totalImport $priceCalculatorService->calculatePrice($pbw$targetnullnull$cartItem->getSale()->getQuantity(), $bo$promotionnulltruetrue) * $cartItem->getQuantity();   
  1027.             if ($cartItem->getSale()->getProduct()->getFare() != 1) {
  1028.                 $total $total $totalImport;
  1029.             }
  1030.             $exchange_rate $pbwRepository->getExchangeRateToApply($pbw);
  1031.             $parameters $cartItem->getParameters();
  1032.             // TO-DO calculatePrice
  1033.             if (!is_null($parameters) && array_key_exists('bundleId'$parameters)) {
  1034.                 $pvd $parameters['price'];
  1035.                 $pvdTotal $cartItem->getQuantity() * $pvd;
  1036.                 $pvdTotalNoTax $pvdTotal;
  1037.                 $tax null;
  1038.                 $total += $pvdTotal;
  1039.             }
  1040.             // Calculamos los totales          
  1041.             $totalForDiscount $priceNoTax $exchange_rate;
  1042.             // Calculamos el descuento total. Cero si es cliente o si precio es Cero.
  1043.             if ($cartItem->getSale()->getPrice() == 0) {
  1044.                 $totalDiscount 0;
  1045.             } else {
  1046.                 $totalDiscount = (- ($totalForDiscount / ($priceCalculatorService->calculatePrice($pbw$targetnullnull$cartItem->getSale()->getQuantity(), nullnullnullfalsefalse) * $cartItem->getQuantity()))) * 100;
  1047.                 $totalDiscount = ($totalDiscount $totalDiscount);
  1048.             }
  1049.             $dataItems[] = array(
  1050.                 'productName' => $cartItem->getSale()->getSku(),
  1051.                 'fareName' => $cartItem->getSale()->getDescription(),
  1052.                 'unitPrice' => $unitPrice,
  1053.                 'priceNoTax' => $priceNoTax,
  1054.                 'quantity' => $cartItem->getQuantity(),
  1055.                 'volume' => $cartItem->getVolume(),
  1056.                 'period' => $cartItem->getSale()->getPayperiod()->getPeriod(),
  1057.                 'promotion' => $promotion,
  1058.                 'discountTypePr' => $discountTypePr,
  1059.                 'productByWholesaler' => $pbw,
  1060.                 'bo' => $bo,
  1061.                 'discountTypeBo' => $discountTypeBo,
  1062.                 'promoCode' => $promoCode,
  1063.                 'totalDiscount' => $totalDiscount,
  1064.                 'image' => $pbwRepository->getCoverImage($pbw),
  1065.                 'boCode' => $boCode,
  1066.                 'tax' => $tax $tax null,
  1067.                 'overage' => $cartItem->getOverage(),
  1068.             );
  1069.             $dateCreated $cartItem->getSale()->getDateCreated();
  1070.         }
  1071.         return $this->render('/catalog/cart/done.html.twig', array(
  1072.             'data' => $dataItems,
  1073.             'reference' => $reference,
  1074.             'currency' => $partner->getWholesaler()->getCurrency()->getIso(),
  1075.             'headerData' => $buildHeaderData->buildHeaderData($user),
  1076.             'partnerId' => $partner->getId(),
  1077.             'date' => $dateCreated,
  1078.             'isPartner' => $isPartner,
  1079.             'total' => $total,
  1080.             'locale' => $locale,
  1081.             'vendorsRepository' => $vendorsRepository,
  1082.             'taxes' => $taxes,
  1083.             'useSymbol' => $partner->getWholesaler()->getUseSymbolCurrency(),
  1084.         ));
  1085.     }
  1086.     private function resetUserCartInstance()
  1087.     {
  1088.         return new Usercart();
  1089.     }
  1090.     /**
  1091.      * Remove products (set $unregistrationdate) from UserCart
  1092.      * 
  1093.      */
  1094.     private function emptyUserCart($userId)
  1095.     {
  1096.         $userCartRepository $this->getDoctrine()->getRepository(Usercart::class);
  1097.         $cart $userCartRepository->MyUserCartQuery($this->getUser())
  1098.             ->andWhere('uc.id = :userId')
  1099.             ->setParameter('userId'$userId)
  1100.             ->getQuery()
  1101.             ->getResult();
  1102.         foreach ($cart as $cartItem) {
  1103.             $this->remove($userId$cartItem->getId());
  1104.         }
  1105.     }
  1106.     /**
  1107.      * Return BO in a customer cart if exists
  1108.      * 
  1109.      * @return entity BO
  1110.      */
  1111.     private function findBOActiveInCustomerCart($cart)
  1112.     {
  1113.         $bo null;
  1114.         foreach ($cart as $cartItem) {
  1115.             if ($cartItem->getProductBusinessOportunities()) {
  1116.                 $bo $cartItem->getProductBusinessOportunities()->getBusinessOportunity();
  1117.             }
  1118.         }
  1119.         return $bo;
  1120.     }
  1121.     public function getNumberCustomerCarts()
  1122.     {
  1123.         $user $this->getUser();
  1124.         $userCartRepository $this->getDoctrine()->getRepository(Usercart::class);
  1125.         return new Response(
  1126.             $userCartRepository->getNumberCustomerCarts($user)
  1127.         );
  1128.     }
  1129.     /**
  1130.      * @Route("/catalog/cart/showcartsheader", name="showcarts_header")
  1131.      */
  1132.     public function showcartsheader(Request $request): Response {
  1133.         $place $request->query->get('place''backoffice');
  1134.         
  1135.         $userCartRepository $this->getDoctrine()->getRepository(Usercart::class);
  1136.         $customers $userCartRepository->MyCustomersCartsQuery($this->getUser());
  1137.         if($place == 'backoffice'){                                        
  1138.             return $this->render('catalog/cart/showcartsheader.html.twig', [
  1139.                 'customers' => $customers,
  1140.                 'headerData' => $this->buildHeaderData->buildHeaderData($this->getUser()),
  1141.             ]);
  1142.         }
  1143.         else{
  1144.             return $this->render('catalog/cart/showcartscatalog.html.twig', [
  1145.                 'customers' => $customers,
  1146.                 'headerData' => $this->buildHeaderData->buildHeaderData($this->getUser()),
  1147.             ]); 
  1148.         }
  1149.     }
  1150. }