src/Controller/CarrelloController.php line 920

  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Anagrafiche;
  4. use App\Entity\AnagraficheIndirizzi;
  5. use App\Entity\Articoli;
  6. use App\Entity\AssociazioneSpedizioniClienti;
  7. use App\Entity\Carrello;
  8. use App\Entity\CouponDettaglio;
  9. use App\Entity\CouponDettaglioUtilizzo;
  10. use App\Entity\Destinazioni;
  11. use App\Entity\FiltroVisualizzazioneArticoliClienti;
  12. use App\Entity\ListaSpezzonatore;
  13. use App\Entity\MailSecondarieUtenti;
  14. use App\Entity\MappaCategorieArticoli;
  15. use App\Entity\ModalitaPagamento;
  16. use App\Entity\ModalitaSpedizione;
  17. use App\Entity\Ordini;
  18. use App\Entity\Pagamenti;
  19. use App\Entity\RigheCarrello;
  20. use App\Entity\SpezzonatoreOpzioni;
  21. use App\Entity\User;
  22. use App\Entity\UserCampiCustomTestata;
  23. use App\Entity\UserCampiCustomValori;
  24. use App\Entity\Varianti;
  25. use App\Model\Carrello\CreaRigaCarrelloValoriOpzionali;
  26. use App\Model\Carrello\FunzioniCarrello;
  27. use App\Model\Carrello\RitornoConversioneCarrelloInOrdine;
  28. use App\Model\Carrello\RitornoGenericoCarrello;
  29. use App\Model\Carrello\Validator;
  30. use App\Model\ContenitoreCategoriePerFiltri;
  31. use App\Model\Costanti;
  32. use App\Model\Entita\AlberoCategorie;
  33. use App\Model\Entita\AltriDatiUtente;
  34. use App\Model\Entita\MappaCategoriaArticolo;
  35. use App\Model\Entita\RigaCarrello;
  36. use App\Model\Entita\Variante;
  37. use App\Model\GestioneUtenti;
  38. use App\Model\Mailer;
  39. use App\Model\RecuperoDati;
  40. use App\Model\Translating\Translating;
  41. use App\Repository\AssociazioneSpedizioniClientiRepository;
  42. use Doctrine\ORM\EntityRepository;
  43. use Doctrine\ORM\Mapping\Entity;
  44. use Psr\Log\LoggerInterface;
  45. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  46. use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  47. use Symfony\Component\Form\Extension\Core\Type\TextareaType;
  48. use Symfony\Component\Form\Extension\Core\Type\TextType;
  49. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  50. use Symfony\Component\Form\FormFactoryInterface;
  51. use Symfony\Component\HttpFoundation\RequestStack;
  52. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  53. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  54. use Symfony\Component\Routing\Annotation\Route;
  55. use Symfony\Component\HttpFoundation\JsonResponse;
  56. use Symfony\Component\HttpFoundation\Request;
  57. use Symfony\Component\HttpFoundation\Response;
  58. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  59. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  60. use Twig\Environment;
  61. /**
  62.  * Class CarrelloController
  63.  * @package App\Controller
  64.  */
  65. class CarrelloController extends AbstractController
  66. {
  67.     /** @var TokenStorageInterface */
  68.     private $token;
  69.     /** @var ServiziController */
  70.     private $servizi;
  71.     /** @var ReturnImpostazioniServiceController */
  72.     private $imp;
  73.     /** @var Translating */
  74.     private $translating;
  75.     /** @var Environment */
  76.     private $twig;
  77.     /** @var Mailer */
  78.     private $mailer;
  79.     /** @var SessionInterface */
  80.     private $session;
  81.     /** @var FormFactoryInterface */
  82.     private $formFactory;
  83.     /** @var LoggerInterface */
  84.     private $logger;
  85.     /** @var GestioneUtenti */
  86.     private $gestioneUtenti;
  87.     /**
  88.      * CarrelloController constructor.
  89.      * @param TokenStorageInterface $token
  90.      * @param ServiziController $servizi
  91.      * @param ReturnImpostazioniServiceController $imp
  92.      * @param Translating $translating
  93.      * @param Environment $twig
  94.      * @param Mailer $mailer
  95.      * @param SessionInterface $session
  96.      * @param LoggerInterface $logger
  97.      * @param GestioneUtenti $gestioneUtenti
  98.      */
  99.     public function __construct(TokenStorageInterface $token, ServiziController $servizi, ReturnImpostazioniServiceController $imp, Translating $translating, Environment $twig, Mailer $mailer, RequestStack $requestStack, FormFactoryInterface $formFactory, LoggerInterface $logger, GestioneUtenti $gestioneUtenti)
  100.     {
  101.         $this->token = $token;
  102.         $this->servizi = $servizi;
  103.         $this->imp = $imp;
  104.         $this->translating = $translating;
  105.         $this->twig = $twig;
  106.         $this->mailer = $mailer;
  107.         $this->session = $requestStack->getSession();
  108.         $this->formFactory = $formFactory;
  109.         $this->logger = $logger;
  110.         $this->gestioneUtenti = $gestioneUtenti;
  111.     }
  112.     /**
  113.      * @Route("/cart/empty", name="carrello_svuota_carrello")
  114.      */
  115.     public function svuotaCarrelloAjaxAction(Request $request)
  116.     {
  117.         $user = $this->servizi->OttieniUtenteCorrente();
  118.         $secret = "";
  119.         if(!$user)
  120.             $secret = $request->cookies->get('secret_user');
  121.         $repo = $this->servizi->doctrine->getRepository(Carrello::class);
  122.         $altriDati = AltriDatiUtente::CreaDaUtente($user);
  123.         if ($user) {
  124.             if ($this->isGranted("ROLE_ADMIN") || $this->isGranted("ROLE_AGENTE") || $this->isGranted("ROLE_COMMERCIALE")) {
  125.                 if ($altriDati && $altriDati->codice != ''){
  126.                     $anagraficaTrovata = $this->servizi->ritornaAnagraficaShopSelezionataDaCookieIdentificativo($altriDati->codice, $this->servizi->OttieniUtenteCorrente());
  127.                     if ($anagraficaTrovata) {
  128.                         $clienteSelezionatoAgente = $anagraficaTrovata;
  129.                     }
  130.                     $carrello = $repo->findOneBy(array('agente' => $this->servizi->OttieniUtenteCorrente(), 'anagrafica' => $anagraficaTrovata, 'tipoOrdine' => $altriDati->tipoOrdine != '' ? $altriDati->tipoOrdine : null));
  131.                 }else{
  132.                     $carrello = $repo->findOneBy(array('cliente' => $user, 'tipoOrdine' => $altriDati->tipoOrdine != '' ? $altriDati->tipoOrdine : null));
  133.                 }
  134.             }else{
  135.                 $carrello = $repo->findOneBy(array('cliente' => $user, 'tipoOrdine' => $altriDati->tipoOrdine != '' ? $altriDati->tipoOrdine : null));
  136.             }
  137.         }
  138.         else
  139.             $carrello = $repo->findOneBy(array('secret' => $secret));
  140.         $em = $this->servizi->doctrine->getManager();
  141.         $em->remove($carrello);
  142.         $em->flush();
  143.         $this->addFlash('notice', 'Carrello svuotato con successo!');
  144.         return $this->redirectToRoute('carrello');
  145.     }
  146.     /**
  147.      * @Route("/cart/addFromExcel", name="carrello_aggiungi_da_excel", options={"expose"=true})
  148.      */
  149.     public function aggiungiCodiciDaExcelAction(Request $request)
  150.     {
  151.         $funzioniCarrello = new FunzioniCarrello($this->servizi->doctrine, $this->imp, $this->servizi);
  152.         $recuperaDati = new RecuperoDati($this->servizi->doctrine, $this->imp, $this->servizi);
  153.         $secret = "";
  154.         /** @var User|null $agente */
  155.         $agente = null;
  156.         /** @var Anagrafiche|null $anagrafica */
  157.         $anagrafica = null;
  158.         $codiceCliente = "";
  159.         /** @var \App\Model\Entita\Carrello $carrello */
  160.         $carrello = null;
  161.         ini_set('max_execution_time', 180);
  162.         $this->servizi->doctrine->getConnection()->getConfiguration()->setSQLLogger(null);
  163.         $em = $this->servizi->doctrine->getManager();
  164.         $user = $this->servizi->OttieniUtenteCorrente();
  165.         $errori = array();
  166.         /** @var RitornoGenericoCarrello[] $ritorniGenericiCarrello */
  167.         $ritorniGenericiCarrello = array();
  168.         $batch_size = 100;
  169.         $count_righe = 1;
  170.         $row = 0;
  171.         $now = new \DateTime();
  172.         $altriDati = AltriDatiUtente::CreaDaUtente($user);
  173.         if (!$user)
  174.             $secret = $request->cookies->get('secret_user');
  175.         else {
  176.             $codiceCliente = $user->getCodiceCliente();
  177.             if ($this->isGranted("ROLE_ADMIN") || $this->isGranted("ROLE_AGENTE") || $this->isGranted("ROLE_COMMERCIALE")) {
  178.                 $agente = $this->servizi->OttieniUtenteCorrente();
  179.                 if ($altriDati && $altriDati->codice != '') {
  180.                     $anagraficaTrovata = $this->servizi->ritornaAnagraficaShopSelezionataDaCookieIdentificativo($altriDati->codice, $this->servizi->OttieniUtenteCorrente());
  181.                     if ($anagraficaTrovata) {
  182.                         $codiceCliente = $anagraficaTrovata->getCodice();
  183.                         $anagrafica = $anagraficaTrovata;
  184.                     }
  185.                 }
  186.             }
  187.         }
  188.         /** @var $carrello \App\Model\Entita\Carrello */
  189.         $carrello = $recuperaDati->recuperaDettagliCarrello($secret, $user, $request->getLocale(), $codiceCliente, $anagrafica, $agente, true, $altriDati->tipoOrdine);
  190.         $split_linee = explode("\n", $request->get('lista_da_importare'));
  191.         foreach ($split_linee as $riga) {
  192.             if ($row == $batch_size) {
  193.                 $row = 0;
  194.                 $em->flush();
  195.                 $em->clear();
  196.             }
  197.             try {
  198.                 //CODICE ARTICOLO - QUANTITA - MARCA
  199.                 $colonne = explode("\t", $riga);
  200.                 if ($colonne[0] != "") {
  201.                     $codiceArticolo = $colonne[0];
  202.                     $quantita = str_replace(",", ".", $colonne[1]);
  203.                     $marca = null;
  204.                     if (count($colonne) >= 3)
  205.                         $marca = $colonne[2];
  206.                     $articolo = $this->servizi->doctrine->getRepository(Articoli::class)->findOneBy(array('codice' => $codiceArticolo));
  207.                     if(!$articolo){
  208.                         array_push($errori, "Errore riga: " . $count_righe . " articolo non trovato! Codice: " . $codiceArticolo . ' - Marca: ' . $marca);
  209.                         continue;
  210.                     }
  211.                     /** @var MappaCategorieArticoli $mappa */
  212.                     $mappa = $this->servizi->ritornaMappaCategoriaArticoliSeInserita($articolo, null, null, null, null, $marca ? $marca : null, null);
  213.                     if (!$mappa) {
  214.                         array_push($errori, "Errore riga: " . $count_righe . " mappa categoria articolo non trovato! Codice: " . $codiceArticolo . ' - Marca: ' . $marca);
  215.                         continue;
  216.                     }
  217.                     if($quantita <= 0){
  218.                         array_push($errori, "Errore riga: " . $count_righe . " La quantità deve essere maggiore di 0! Codice: " . $codiceArticolo . ' - Marca: ' . $marca);
  219.                         continue;
  220.                     }
  221.                     $ritornoGenericoCarrello = $funzioniCarrello->CreaRigaCarrello(
  222.                         $mappa->getId(),
  223.                         '',
  224.                         '',
  225.                         $quantita,
  226.                         $user,
  227.                         $secret,
  228.                         $agente,
  229.                         $anagrafica,
  230.                         new CreaRigaCarrelloValoriOpzionali(),
  231.                         $request->getLocale(),
  232.                         $this->servizi->doctrine->getManager()
  233.                     );
  234.                     if(!$ritornoGenericoCarrello->esito){
  235.                         array_push($errori, "Errore riga: " . $count_righe . " Codice: " . $codiceArticolo . " - Marca: " . $marca . " -- Errore: " . $ritornoGenericoCarrello->RitornaStringaCompostaMessaggiSemplificati());
  236.                     }
  237.                     array_push($ritorniGenericiCarrello, $ritornoGenericoCarrello);
  238.                 }
  239.             }
  240.             catch (\Exception $ex){
  241.                 array_push($errori, "Errore riga: " . $count_righe . " Codice: " . $codiceArticolo . " - Marca: " . $marca . " -- Errore: Generico");
  242.                 $this->servizi->ScriviRegistroAttivita($request->getClientIp(), "", false, $ex->getTraceAsString(), $user);
  243.             }
  244.             $count_righe++;
  245.         }
  246.         $em->flush();
  247.         return new JsonResponse(array(
  248.             'errori' => $errori
  249.         ));
  250.     }
  251.     /**
  252.      * @Route("/agente/spostaCarrello/{idCarrelloOrigine}/{idAnagraficaDestinazione}", name="agente_sposta_carrello", options={"expose"=true})
  253.      */
  254.     public function agenteSpostaCarrello(Request $request, $idCarrelloOrigine, $idAnagraficaDestinazione)
  255.     {
  256.         $ritorno = array(
  257.             'successo' => 'SI',
  258.             'messaggio' => ''
  259.         );
  260.         $carrello = $this->servizi->doctrine->getRepository(Carrello::class)->find($idCarrelloOrigine);
  261.         if($carrello){
  262.             $anagraficaDestinazione = $this->servizi->doctrine->getRepository(Anagrafiche::class)->find($idAnagraficaDestinazione);
  263.             if($anagraficaDestinazione) {
  264.                 if (!$this->isGranted("ROLE_ADMIN") && $this->isGranted("ROLE_AGENTE")) {
  265.                     //Verifico che l'agente sia autorizzato a gestire questo carrello
  266.                     if ($carrello->getAgente() != $this->servizi->OttieniUtenteCorrente() && $carrello->getCliente() != $this->servizi->OttieniUtenteCorrente()) {
  267.                         $ritorno['successo'] = 'NO';
  268.                         $ritorno['messaggio'] = "Autorizzazione negata!";
  269.                         return new JsonResponse($ritorno);
  270.                     }
  271.                     if(!in_array($anagraficaDestinazione->getCodiceAgente(), $this->servizi->ritornaArrayCodiciAssociatiAgenteFornitoreUtente($this->servizi->OttieniUtenteCorrente()))){
  272.                         $ritorno['successo'] = 'NO';
  273.                         $ritorno['messaggio'] = "Autorizzazione negata!";
  274.                         return new JsonResponse($ritorno);
  275.                     }
  276.                 }
  277.                 $funzioniCarrello = new FunzioniCarrello($this->servizi->doctrine, $this->imp, $this->servizi);
  278.                 $spostamentoCarrello = $funzioniCarrello->SpostaERicalcolaCarrello($carrello, $this->servizi->OttieniUtenteCorrente(), $anagraficaDestinazione, $this->servizi->OttieniUtenteCorrente(), $request->getLocale());
  279.                 if($spostamentoCarrello->esito){
  280.                     $ritorno['messaggio'] = 'Carrello spostato correttamente!';
  281.                     return new JsonResponse($ritorno);
  282.                 }else{
  283.                     $ritorno['successo'] = 'NO';
  284.                     $ritorno['messaggio'] = $spostamentoCarrello->RitornaStringaCompostaMessaggiSemplificati();
  285.                     return new JsonResponse($ritorno);
  286.                 }
  287.             }else{
  288.                 $ritorno['successo'] = 'NO';
  289.                 $ritorno['messaggio'] = "Anagrafica con ID: " . $idAnagraficaDestinazione . ' non trovata!';
  290.                 return new JsonResponse($ritorno);
  291.             }
  292.         }else{
  293.             $ritorno['successo'] = 'NO';
  294.             $ritorno['messaggio'] = "Carrello con ID: " . $idCarrelloOrigine . ' non trovato!';
  295.             return new JsonResponse($ritorno);
  296.         }
  297.     }
  298.     /**
  299.      * @Route("/cart/dettagliJson", name="carrello_dettagli_json", options={"expose"=true})
  300.      */
  301.     public function dettagliCarrelloAjaxJson(Request $request)
  302.     {
  303.         $user = $this->servizi->OttieniUtenteCorrente();
  304.         $secret = "";
  305.         /** @var User $agente */
  306.         $agente = null;
  307.         /** @var Anagrafiche $anagrafica */
  308.         $anagrafica = null;
  309.         $altriDati = AltriDatiUtente::CreaDaUtente($user);
  310.         if(!$user)
  311.             $secret = $request->cookies->get('secret_user');
  312.         else {
  313.             if ($this->isGranted("ROLE_ADMIN") || $this->isGranted("ROLE_AGENTE") || $this->isGranted("ROLE_COMMERCIALE")) {
  314.                 $agente = $this->servizi->OttieniUtenteCorrente();
  315.                 if ($altriDati && $altriDati->codice != ''){
  316.                     $anagraficaTrovata = $this->servizi->ritornaAnagraficaShopSelezionataDaCookieIdentificativo($altriDati->codice, $this->servizi->OttieniUtenteCorrente());
  317.                     if ($anagraficaTrovata) {
  318.                         $anagrafica = $anagraficaTrovata;
  319.                     }
  320.                 }
  321.             }
  322.         }
  323.         $repo = $this->servizi->doctrine->getRepository(RigheCarrello::class);
  324.         /** @var Carrello|null $carrello */
  325.         $carrello = $this->servizi->RecuperaCarrello($secret, $agente, $anagrafica, $user);
  326.         $ritorno = array(
  327.             'imponibile' => $carrello ? $carrello->getTotale() : 0,
  328.             'imposta' => $carrello ? $carrello->getTotaleImposta() : 0,
  329.             'totale' => $carrello ? $carrello->getTotale() + $carrello->getTotaleImposta() : 0,
  330.         );
  331.         return new JsonResponse($ritorno);
  332.     }
  333.     /**
  334.      * @Route("/cart/count", name="carrello_conta_articoli", options={"expose"=true})
  335.      */
  336.     public function contaArticoliCarrelloAjaxAction(Request $request)
  337.     {
  338.         $user = $this->servizi->OttieniUtenteCorrente();
  339.         $secret = "";
  340.         /** @var User $agente */
  341.         $agente = null;
  342.         /** @var Anagrafiche $anagrafica */
  343.         $anagrafica = null;
  344.         $altriDati = AltriDatiUtente::CreaDaUtente($user);
  345.         if(!$user)
  346.             $secret = $request->cookies->get('secret_user');
  347.         else {
  348.             if ($this->isGranted("ROLE_ADMIN") || $this->isGranted("ROLE_AGENTE") || $this->isGranted("ROLE_COMMERCIALE")) {
  349.                 $agente = $this->servizi->OttieniUtenteCorrente();
  350.                 if ($altriDati && $altriDati->codice != ''){
  351.                     $anagraficaTrovata = $this->servizi->ritornaAnagraficaShopSelezionataDaCookieIdentificativo($altriDati->codice, $this->servizi->OttieniUtenteCorrente());
  352.                     if ($anagraficaTrovata) {
  353.                         $anagrafica = $anagraficaTrovata;
  354.                     }
  355.                 }
  356.             }
  357.         }
  358.         $repo = $this->servizi->doctrine->getRepository(RigheCarrello::class);
  359.         if ($user) {
  360.             $queryBuilder = $repo->createQueryBuilder('righe_carrello')->leftJoin('righe_carrello.carrello', 'carrello')->select('SUM(righe_carrello.quantita), carrello.id');
  361.             if ($agente && $anagrafica){
  362.                 $queryBuilder = $queryBuilder->where('carrello.agente = :ag')->setParameter('ag', $agente)
  363.                     ->andWhere('carrello.anagrafica = :ana')->setParameter('ana', $anagrafica);
  364.             } else{
  365.                 $queryBuilder = $queryBuilder->where('carrello.cliente = :cliente')->setParameter('cliente', $user)
  366.                     ->andWhere('carrello.anagrafica IS NULL');
  367.             }
  368.             if($altriDati && $altriDati->tipoOrdine != ''){
  369.                 $queryBuilder = $queryBuilder->andWhere('carrello.tipoOrdine = :tipo')->setParameter('tipo', $altriDati->tipoOrdine);
  370.             }
  371.         }
  372.         else{
  373.             $queryBuilder = $repo->createQueryBuilder('righe_carrello')->leftJoin('righe_carrello.carrello', 'carrello')->select('SUM(righe_carrello.quantita), carrello.id')
  374.                 ->where('carrello.secret = :secret')->setParameter('secret', $secret);
  375.         }
  376.         $riga = $queryBuilder->groupBy('carrello.id')->getQuery()->getResult();
  377.         $ritorno = array(
  378.             'count' => 0,
  379.             'idCarrello' => 0
  380.         );
  381.         if(count($riga) > 0) {
  382.             $riga = $riga[0];
  383.             $ritorno = array(
  384.                 'count' => round($riga["1"], 0),
  385.                 'idCarrello' => $riga["id"]
  386.             );
  387.         }
  388.         return new JsonResponse($ritorno);
  389.     }
  390.     /**
  391.      * @Route("/cart/deleteRow/{idRiga}/{ajax}", name="carrello_elimina_riga", defaults={"ajax" = 0}, options={"expose"=true})
  392.      */
  393.     public function eliminaRigaiCarrelloAjaxAction(Request $request, $idRiga, $ajax = 0)
  394.     {
  395.         $user = $this->servizi->OttieniUtenteCorrente();
  396.         $secret = "";
  397.         /** @var User|null $agente */
  398.         $agente = null;
  399.         /** @var Anagrafiche|null $anagrafica */
  400.         $anagrafica = null;
  401.         $altriDati = AltriDatiUtente::CreaDaUtente($user);
  402.         if(!$user)
  403.             $secret = $request->cookies->get('secret_user');
  404.         else {
  405.             if ($this->isGranted("ROLE_ADMIN") || $this->isGranted("ROLE_AGENTE") || $this->isGranted("ROLE_COMMERCIALE")) {
  406.                 $agente = $this->servizi->OttieniUtenteCorrente();
  407.                 if ($altriDati && $altriDati->codice != ''){
  408.                     $anagraficaTrovata = $this->servizi->ritornaAnagraficaShopSelezionataDaCookieIdentificativo($altriDati->codice, $this->servizi->OttieniUtenteCorrente());
  409.                     if ($anagraficaTrovata) {
  410.                         $anagrafica = $anagraficaTrovata;
  411.                     }
  412.                 }
  413.             }
  414.         }
  415.         $repo = $this->servizi->doctrine->getRepository(RigheCarrello::class);
  416.         if ($user) {
  417.             /** @var  $queryBuilder RigheCarrello */
  418.             $queryBuilder = $repo->createQueryBuilder('righe_carrello')->leftJoin('righe_carrello.carrello', 'carrello');
  419.             if ($agente && $anagrafica){
  420.                 $queryBuilder = $queryBuilder->where('carrello.agente = :ag')->setParameter('ag', $agente)
  421.                     ->andWhere('carrello.anagrafica = :ana')->setParameter('ana', $anagrafica)
  422.                     ->andWhere('righe_carrello.id = :idRiga')->setParameter('idRiga', $idRiga);
  423.             } else{
  424.                 $queryBuilder = $queryBuilder->where('carrello.cliente = :cliente')->setParameter('cliente', $user)
  425.                     ->andWhere('righe_carrello.id = :idRiga')->setParameter('idRiga', $idRiga)
  426.                     ->andWhere('carrello.anagrafica IS NULL');
  427.             }
  428.             if($altriDati && $altriDati->tipoOrdine != ''){
  429.                 $queryBuilder = $queryBuilder->andWhere('carrello.tipoOrdine = :tipo')->setParameter('tipo', $altriDati->tipoOrdine);
  430.             }
  431.         }
  432.         else{
  433.             /** @var  $queryBuilder RigheCarrello */
  434.             $queryBuilder = $repo->createQueryBuilder('righe_carrello')->leftJoin('righe_carrello.carrello', 'carrello')
  435.                 ->where('carrello.secret = :secret')->setParameter('secret', $secret)
  436.                 ->andWhere('righe_carrello.id = :idRiga')->setParameter('idRiga', $idRiga);
  437.         }
  438.         $funzioniCarrello = new FunzioniCarrello($this->servizi->doctrine, $this->imp, $this->servizi);
  439.         $ritornoGenericoCarrello = $funzioniCarrello->ModificaOEliminaRiga($queryBuilder->getQuery()->getSingleResult(), true);
  440.         if ($ajax)
  441.         {
  442.             return new Response("");
  443.         }
  444.         if ($ritornoGenericoCarrello->esito){
  445.             $this->addFlash(
  446.                 'notice',
  447.                 'Riga eliminata'
  448.             );
  449.         }else{
  450.             $this->addFlash(
  451.                 'error',
  452.                 $ritornoGenericoCarrello->RitornaStringaCompostaMessaggiSemplificati()
  453.             );
  454.         }
  455.         return $this->redirectToRoute('carrello');
  456.     }
  457.     /**
  458.      * @Route("/admin/carrello/elimina/{id}", name="elimina_carrello")
  459.      */
  460.     public function deleteAction(Request $request, $id)
  461.     {
  462.         $em = $this->servizi->doctrine->getManager();
  463.         $prom = $em->getRepository(Carrello::class)->find($id);
  464.         if ($prom) {
  465.             $sql = "SET FOREIGN_KEY_CHECKS=0;
  466.                     DELETE FROM righe_carrello WHERE carrello_id = ?;
  467.                     DELETE FROM carrello WHERE id = ?;
  468.                     SET FOREIGN_KEY_CHECKS=1";
  469.             $query = explode(';', $sql);
  470.             foreach ($query as $item)
  471.             {
  472.                 $conn = $this->servizi->doctrine->getConnection();
  473.                 $stmt = $conn->prepare($item);
  474.                 if(str_starts_with($item, 'DELETE'))
  475.                     $stmt->bindValue(1, $id);
  476.                 $stmt->execute();
  477.             }
  478.             $em->remove($prom);
  479.             $em->flush();
  480.             $this->addFlash(
  481.                 'notice',
  482.                 'Carrello eliminato'
  483.             );
  484.             return $this->redirectToRoute('lista_carrelli');
  485.         }
  486.         else{
  487.             $this->addFlash(
  488.                 'error',
  489.                 "Carrello con ID: " . $id . " inesistente!"
  490.             );
  491.             return $this->redirect($this->generateUrl('lista_carrelli'));
  492.         }
  493.     }
  494.     /**
  495.      * @Route("/cart/editRowNote/{idRiga}/{aziendale}", name="carrello_modifica_nota_riga", defaults={"aziendale" = "0"}, options={"expose"=true})
  496.      */
  497.     public function modificaNotaRigaCarrelloAjaxAction(Request $request, $idRiga, $aziendale = '0')
  498.     {
  499.         $user = $this->servizi->OttieniUtenteCorrente();
  500.         /** @var User|null $agente */
  501.         $agente = null;
  502.         /** @var Anagrafiche|null $anagrafica */
  503.         $anagrafica = null;
  504.         $altriDati = AltriDatiUtente::CreaDaUtente($user);
  505.         $secret = "";
  506.         if(!$user)
  507.             $secret = $request->cookies->get('secret_user');
  508.         else {
  509.             if ($this->isGranted("ROLE_ADMIN") || $this->isGranted("ROLE_AGENTE") || $this->isGranted("ROLE_COMMERCIALE")) {
  510.                 $agente = $this->servizi->OttieniUtenteCorrente();
  511.                 if ($altriDati && $altriDati->codice != ''){
  512.                     $anagraficaTrovata = $this->servizi->ritornaAnagraficaShopSelezionataDaCookieIdentificativo($altriDati->codice, $this->servizi->OttieniUtenteCorrente());
  513.                     if ($anagraficaTrovata) {
  514.                         $anagrafica = $anagraficaTrovata;
  515.                     }
  516.                 }
  517.             }
  518.         }
  519.         $repo = $this->servizi->doctrine->getRepository(RigheCarrello::class);
  520.         /** @var  $queryBuilder RigheCarrello*/
  521.         if ($user) {
  522.             $queryBuilder = $repo->createQueryBuilder('righe_carrello')->leftJoin('righe_carrello.carrello', 'carrello');
  523.             if ($agente && $anagrafica){
  524.                 $queryBuilder = $queryBuilder->where('carrello.agente = :ag')->setParameter('ag', $agente)
  525.                     ->andWhere('carrello.anagrafica = :ana')->setParameter('ana', $anagrafica)
  526.                     ->andWhere('righe_carrello.id = :idRiga')->setParameter('idRiga', $idRiga);
  527.             } else {
  528.                 $queryBuilder = $queryBuilder->where('carrello.cliente = :cliente')->setParameter('cliente', $user)
  529.                     ->andWhere('righe_carrello.id = :idRiga')->setParameter('idRiga', $idRiga)
  530.                     ->andWhere('carrello.anagrafica IS NULL');
  531.             }
  532.             if($altriDati && $altriDati->tipoOrdine != ''){
  533.                 $queryBuilder = $queryBuilder->andWhere('carrello.tipoOrdine = :tipo')->setParameter('tipo', $altriDati->tipoOrdine);
  534.             }
  535.             $queryBuilder = $queryBuilder->getQuery()->getResult();
  536.         }
  537.         else{
  538.             $queryBuilder = $repo->createQueryBuilder('righe_carrello')->leftJoin('righe_carrello.carrello', 'carrello')
  539.                 ->where('carrello.secret = :secret')->setParameter('secret', $secret)
  540.                 ->andWhere('righe_carrello.id = :idRiga')->setParameter('idRiga', $idRiga)->getQuery()->getResult();
  541.         }
  542.         $data = $request->get('data');
  543.         if (count($queryBuilder) > 0){
  544.             $queryBuilder = $queryBuilder[0];
  545.             $consentiModificaNota = true;
  546.             if ($queryBuilder->getTipologiaPreimpostata())
  547.             {
  548.                 if (!$queryBuilder->getTipologiaPreimpostata()->getConsentiModificaNota())
  549.                     $consentiModificaNota = false;
  550.             }
  551.             if ($consentiModificaNota) {
  552.                 if($aziendale != '1') {
  553.                     $queryBuilder->setNota($data['nota']);
  554.                 } else {
  555.                     $queryBuilder->setNotaAziendale($data['nota']);
  556.                 }
  557.                 $em = $this->servizi->doctrine->getManager();
  558.                 $em->persist($queryBuilder);
  559.                 $em->flush();
  560.             }
  561.         }
  562.         return new Response("");
  563.     }
  564.     /**
  565.      * @Route("/cart/editDataConsegna/{idRiga}", name="carrello_modifica_data_consegna_riga", options={"expose"=true})
  566.      */
  567.     public function modificaDataConsegnaRigaCarrelloAjaxAction(Request $request, $idRiga)
  568.     {
  569.         $user = $this->servizi->OttieniUtenteCorrente();
  570.         /** @var User|null $agente */
  571.         $agente = null;
  572.         /** @var Anagrafiche|null $anagrafica */
  573.         $anagrafica = null;
  574.         $altriDati = AltriDatiUtente::CreaDaUtente($user);
  575.         $secret = "";
  576.         if(!$user)
  577.             $secret = $request->cookies->get('secret_user');
  578.         else {
  579.             if ($this->isGranted("ROLE_ADMIN") || $this->isGranted("ROLE_AGENTE") || $this->isGranted("ROLE_COMMERCIALE")) {
  580.                 $agente = $this->servizi->OttieniUtenteCorrente();
  581.                 if ($altriDati && $altriDati->codice != ''){
  582.                     $anagraficaTrovata = $this->servizi->ritornaAnagraficaShopSelezionataDaCookieIdentificativo($altriDati->codice, $this->servizi->OttieniUtenteCorrente());
  583.                     if ($anagraficaTrovata) {
  584.                         $anagrafica = $anagraficaTrovata;
  585.                     }
  586.                 }
  587.             }
  588.         }
  589.         $repo = $this->servizi->doctrine->getRepository(RigheCarrello::class);
  590.         /** @var  $queryBuilder RigheCarrello*/
  591.         if ($user) {
  592.             $queryBuilder = $repo->createQueryBuilder('righe_carrello')->leftJoin('righe_carrello.carrello', 'carrello');
  593.             if ($agente && $anagrafica){
  594.                 $queryBuilder = $queryBuilder->where('carrello.agente = :ag')->setParameter('ag', $agente)
  595.                     ->andWhere('carrello.anagrafica = :ana')->setParameter('ana', $anagrafica)
  596.                     ->andWhere('righe_carrello.id = :idRiga')->setParameter('idRiga', $idRiga);
  597.             } else{
  598.                 $queryBuilder = $queryBuilder->where('carrello.cliente = :cliente')->setParameter('cliente', $user)
  599.                     ->andWhere('righe_carrello.id = :idRiga')->setParameter('idRiga', $idRiga)
  600.                     ->andWhere('carrello.anagrafica = :ana')->setParameter('ana', null);
  601.             }
  602.             if($altriDati && $altriDati->tipoOrdine != ''){
  603.                 $queryBuilder = $queryBuilder->andWhere('carrello.tipoOrdine = :tipo')->setParameter('tipo', $altriDati->tipoOrdine);
  604.             }
  605.             $queryBuilder = $queryBuilder->getQuery()->getResult();
  606.         }
  607.         else{
  608.             $queryBuilder = $repo->createQueryBuilder('righe_carrello')->leftJoin('righe_carrello.carrello', 'carrello')
  609.                 ->where('carrello.secret = :secret')->setParameter('secret', $secret)
  610.                 ->andWhere('righe_carrello.id = :idRiga')->setParameter('idRiga', $idRiga)->getQuery()->getResult();
  611.         }
  612.         $data = $request->get('data');
  613.         if (count($queryBuilder) > 0) {
  614.             $queryBuilder = $queryBuilder[0];
  615.             $queryBuilder->setDataConsegna($data['data-consegna'] != '' ? \DateTime::createFromFormat("d/m/Y", $data['data-consegna']) : null);
  616.             $em = $this->servizi->doctrine->getManager();
  617.             $em->persist($queryBuilder);
  618.             $em->flush();
  619.         }
  620.         return new Response("");
  621.     }
  622.     /**
  623.      * @Route("/cart/caricaVariantiArticoloCarrello/{idCarrello}", name="carrello_carica_varianti_articolo", options={"expose"=true})
  624.      */
  625.     public function carticaVariantiArticolodaAjax(Request $request, $idCarrello)
  626.     {
  627.         $user = $this->servizi->OttieniUtenteCorrente();
  628.         /** @var User|null $agente */
  629.         $agente = null;
  630.         /** @var Anagrafiche|null $anagrafica */
  631.         $anagrafica = null;
  632.         $codiceCliente = "";
  633.         $altriDati = AltriDatiUtente::CreaDaUtente($user);
  634.         $codiceArticolo = $request->get('codicearticolo');
  635.         $secret = "";
  636.         if(!$user)
  637.             $secret = $request->cookies->get('secret_user');
  638.         else {
  639.             $codiceCliente = $user->getCodiceCliente();
  640.             if ($this->isGranted("ROLE_ADMIN") || $this->isGranted("ROLE_AGENTE") || $this->isGranted("ROLE_COMMERCIALE")) {
  641.                 $agente = $this->servizi->OttieniUtenteCorrente();
  642.                 if ($altriDati && $altriDati->codice != ''){
  643.                     $anagraficaTrovata = $this->servizi->ritornaAnagraficaShopSelezionataDaCookieIdentificativo($altriDati->codice, $this->servizi->OttieniUtenteCorrente());
  644.                     if ($anagraficaTrovata) {
  645.                         $codiceCliente = $anagraficaTrovata->getCodice();
  646.                         $anagrafica = $anagraficaTrovata;
  647.                     }
  648.                 }
  649.             }
  650.         }
  651.         $repo = $this->servizi->doctrine->getRepository(RigheCarrello::class);
  652.         /** @var  $queryBuilder RigheCarrello*/
  653.         if ($user) {
  654.             $queryBuilder = $repo->createQueryBuilder('righe_carrello')
  655.                 ->leftJoin('righe_carrello.carrello', 'carrello')
  656.                 ->leftJoin('righe_carrello.articolo', 'articolo');
  657.             if ($agente && $anagrafica){
  658.                 $queryBuilder = $queryBuilder->where('carrello.agente = :ag')->setParameter('ag', $agente)
  659.                     ->andWhere('carrello.anagrafica = :ana')->setParameter('ana', $anagrafica)
  660.                     ->andWhere('articolo.codice = :codArt')->setParameter('codArt', $codiceArticolo)
  661.                     ->andWhere('carrello.id = :idcar')->setParameter('idcar', $idCarrello);
  662.             } else{
  663.                 $queryBuilder = $queryBuilder->where('carrello.cliente = :cliente')->setParameter('cliente', $user)
  664.                     ->andWhere('articolo.codice = :codArt')->setParameter('codArt', $codiceArticolo)
  665.                     ->andWhere('carrello.anagrafica = :ana')->setParameter('ana', null)
  666.                     ->andWhere('carrello.id = :idcar')->setParameter('idcar', $idCarrello);
  667.             }
  668.             if($altriDati && $altriDati->tipoOrdine != ''){
  669.                 $queryBuilder = $queryBuilder->andWhere('carrello.tipoOrdine = :tipo')->setParameter('tipo', $altriDati->tipoOrdine);
  670.             }
  671.             $queryBuilder = $queryBuilder->getQuery()->getResult();
  672.         }
  673.         else{
  674.             $queryBuilder = $repo->createQueryBuilder('righe_carrello')
  675.                 ->leftJoin('righe_carrello.carrello', 'carrello')
  676.                 ->leftJoin('righe_carrello.articolo', 'articolo')
  677.                 ->where('carrello.secret = :secret')->setParameter('secret', $secret)
  678.                 ->andWhere('carrello.id = :idcar')->setParameter('idcar', $idCarrello)
  679.                 ->andWhere('articolo.codice = :codArt')->setParameter('codArt', $codiceArticolo)->getQuery()->getResult();
  680.         }
  681.         $righeRitorno = array();
  682.         /** @var MappaCategoriaArticolo|null $mappaVariata */
  683.         $mappaVariata = null;
  684.         /** @var RigheCarrello $r */
  685.         foreach ($queryBuilder as $r) {
  686.             $rig = RigaCarrello::ConvertiDaEntitaDoctrine($r, \App\Model\Entita\Carrello::CreaDaEntitaDoctrine($r->getCarrello(), $this->servizi), $this->servizi);
  687.             if($mappaVariata == null){
  688.                 $mappaVariata = $rig->mappaCategoriaArticolo;
  689.                 /** @var Varianti[] $listaVarianti */
  690.                 $listaVarianti = $this->servizi->doctrine->getRepository(Varianti::class)->createQueryBuilder('varianti')
  691.                     ->where('varianti.mappa = :mappa')->setParameter('mappa', $mappaVariata->id)
  692.                     ->orderBy('varianti.codiceDimensione1, varianti.posizioneDimensione1, varianti.codiceDimensione2, varianti.posizioneDimensione2, varianti.codiceDimensione3, varianti.posizioneDimensione3, varianti.codiceDimensione4, varianti.posizioneDimensione4, varianti.codiceDimensione5, varianti.posizioneDimensione5')
  693.                     ->getQuery()->getResult();
  694.                 foreach ($listaVarianti as $va) {
  695.                     $varian = Variante::CreaDaConversioneEntity($va, $mappaVariata, '', $this->servizi->doctrine, $codiceCliente, $request->getLocale(), $user, $altriDati ? $altriDati->tipoOrdine : null);
  696.                     $calcoloPRezzoNetto = $this->servizi->calcolaPrezzoNettoMappaOVariante($mappaVariata, $varian);
  697.                     $varian->prezzoNettoCalcolato = $calcoloPRezzoNetto->prezzoNetto;
  698.                     $varian->stringaSconti = $calcoloPRezzoNetto->stringaSconti;
  699.                     array_push($mappaVariata->varianti, $varian);
  700.                 }
  701.                 $rig->mappaCategoriaArticolo = $mappaVariata;
  702.             }else{
  703.                 $rig->mappaCategoriaArticolo = $mappaVariata;
  704.             }
  705.             array_push($righeRitorno, $rig);
  706.         }
  707.         /** @var RigaCarrello[] $queryBuilder */
  708.         return $this->render('ZZ_front_end/carrello/maschera_stampa_righe_carrello_varianti_raggruppate_ajax_genera_singola_riga.html.twig', array(
  709.             'righe' => $righeRitorno
  710.         ));
  711.     }
  712.     /**
  713.      * @Route("/cart/editRowQuantity/{idRiga}", name="carrello_modifica_qta_riga", options={"expose"=true})
  714.      */
  715.     public function modificaQtaRigaCarrelloAjaxAction(Request $request, $idRiga)
  716.     {
  717.         $user = $this->servizi->OttieniUtenteCorrente();
  718.         $secret = "";
  719.         /** @var User|null $agente */
  720.         $agente = null;
  721.         /** @var Anagrafiche|null $anagrafica */
  722.         $anagrafica = null;
  723.         $altriDati = AltriDatiUtente::CreaDaUtente($user);
  724.         if(!$user)
  725.             $secret = $request->cookies->get('secret_user');
  726.         else {
  727.             if ($this->isGranted("ROLE_ADMIN") || $this->isGranted("ROLE_AGENTE") || $this->isGranted("ROLE_COMMERCIALE")) {
  728.                 $agente = $this->servizi->OttieniUtenteCorrente();
  729.                 if ($altriDati && $altriDati->codice != ''){
  730.                     $anagraficaTrovata = $this->servizi->ritornaAnagraficaShopSelezionataDaCookieIdentificativo($altriDati->codice, $this->servizi->OttieniUtenteCorrente());
  731.                     if ($anagraficaTrovata) {
  732.                         $anagrafica = $anagraficaTrovata;
  733.                     }
  734.                 }
  735.             }
  736.         }
  737.         $repo = $this->servizi->doctrine->getRepository(RigheCarrello::class);
  738.         $funzioniCarrello = new FunzioniCarrello($this->servizi->doctrine, $this->imp, $this->servizi);
  739.         /** @var  $queryBuilder RigheCarrello*/
  740.         if ($user) {
  741.             $queryBuilder = $repo->createQueryBuilder('righe_carrello')->leftJoin('righe_carrello.carrello', 'carrello');
  742.             if ($agente && $anagrafica){
  743.                 $queryBuilder = $queryBuilder->where('carrello.agente = :ag')->setParameter('ag', $agente)
  744.                     ->andWhere('carrello.anagrafica = :ana')->setParameter('ana', $anagrafica)
  745.                     ->andWhere('righe_carrello.id = :idRiga')->setParameter('idRiga', $idRiga);
  746.             }
  747.             else if ($agente){
  748.                 $queryBuilder = $queryBuilder
  749.                     ->where('carrello.agente = :ag')->setParameter('ag', $agente)
  750.                     ->andWhere('carrello.cliente = :cliente')->setParameter('cliente', $user)
  751.                     ->andWhere('carrello.anagrafica IS NULL')
  752.                     ->andWhere('righe_carrello.id = :idRiga')->setParameter('idRiga', $idRiga);
  753.             }
  754.             else{
  755.                 $queryBuilder = $queryBuilder->where('carrello.cliente = :cliente')->setParameter('cliente', $user)
  756.                     ->andWhere('righe_carrello.id = :idRiga')->setParameter('idRiga', $idRiga)
  757.                     ->andWhere('carrello.anagrafica IS NULL');
  758.             }
  759.             if($altriDati && $altriDati->tipoOrdine != ''){
  760.                 $queryBuilder = $queryBuilder->andWhere('carrello.tipoOrdine = :tipo')->setParameter('tipo', $altriDati->tipoOrdine);
  761.             }
  762.             $queryBuilder = $queryBuilder->getQuery()->getSingleResult();
  763.         }
  764.         else{
  765.             $queryBuilder = $repo->createQueryBuilder('righe_carrello')->leftJoin('righe_carrello.carrello', 'carrello')
  766.                 ->where('carrello.secret = :secret')->setParameter('secret', $secret)
  767.                 ->andWhere('righe_carrello.id = :idRiga')->setParameter('idRiga', $idRiga)->getQuery()->getSingleResult();
  768.         }
  769.         $data = $request->get('data');
  770.         $qtaMod = $data['quantita'];
  771.         if ($queryBuilder) {
  772.             $queryBuilder->setQuantita($qtaMod);
  773.             if ($queryBuilder->getTipologiaPreimpostata()) {
  774.                 $qtaMod = $qtaMod * $queryBuilder->getTipologiaPreimpostata()->getFattoreMoltiplicazione();
  775.                 $queryBuilder->setQuantita($qtaMod);
  776.                 if ($queryBuilder->getTipologiaPreimpostata()->getInserisciQtaAutomatica())
  777.                     $queryBuilder->setNota($data['quantita'] . " PZ " . $queryBuilder->getTipologiaPreimpostata()->getNotaEsportazioneRiga());
  778.                 else
  779.                     $queryBuilder->setNota($queryBuilder->getTipologiaPreimpostata()->getNotaEsportazioneRiga());
  780.             }
  781.             $queryBuilder->setTotaleRiga($queryBuilder->getNettoCad() * $queryBuilder->getQuantita());
  782.             $queryBuilder->setTotaleRigaLordo($queryBuilder->getLordoCad() * $queryBuilder->getQuantita());
  783.             $queryBuilder->setTotaleImposta($this->servizi->calcolaImpostaSuImporto($queryBuilder->getTotaleRiga(), $queryBuilder->getAliquotaIva()));
  784.             $ritorno = $funzioniCarrello->ModificaOEliminaRiga($queryBuilder, false, false);
  785.             $errore = "";
  786.             if (!$ritorno->esito){
  787.                 foreach ($ritorno->messaggiSemplificati as $msg){
  788.                     $errore .= ($msg . "\n");
  789.                 }
  790.             }
  791.             $carrAggiornato = $this->servizi->doctrine->getRepository(Carrello::class)->find($queryBuilder->getCarrello()->getId());
  792.             return new JsonResponse(array(
  793.                 'importoCarrello' => round($carrAggiornato->getTotale(), 2),
  794.                 'impostaCarrello' => round($carrAggiornato->getTotaleImposta(), 2),
  795.                 'totaleCarrello' => round($carrAggiornato->getTotale() + $carrAggiornato->getTotaleImposta(), 2),
  796.                 'errore' => $errore
  797.             ));
  798.         }
  799.         else{
  800.             return new JsonResponse(array(
  801.                 'importoCarrello' => '0',
  802.                 'impostaCarrello' => '0',
  803.                 'totaleCarrello' => '0',
  804.                 'errore' => "PERMESSO_NEGATO"
  805.             ));
  806.         }
  807.     }
  808.     /**
  809.      * @Route("/cart", name="carrello")
  810.      */
  811.     public function mostraCarrello(Request $request)
  812.     {
  813.         /** @var User $user */
  814.         $user = $this->servizi->OttieniUtenteCorrente();
  815.         $recuperaDati = new RecuperoDati($this->servizi->doctrine, $this->imp, $this->servizi);
  816.         $secret = "";
  817.         /** @var User|null $agente */
  818.         $agente = null;
  819.         /** @var Anagrafiche|null $anagrafica */
  820.         $anagrafica = null;
  821.         $codiceCliente = "";
  822.         /** @var \App\Model\Entita\Carrello $carrello */
  823.         $carrello = null;
  824.         $traduci = $this->translating;
  825.         $traduci->CaricaTraduzioniDaFamiglie(array("carrello", "mail_nuovo_ordine"), $request->getLocale());
  826.         $filtroComune = $this->imp->ritornaImpostazioneDaNome('FiltroVisualizzazioneArticoloPerShopComune');
  827.         $raggruppaVarianti = $this->imp->ritornaImpostazioneDaNome('RaggruppaVariantiInCarrello');
  828.         $caricaTutteVarianti = false;
  829.         if($raggruppaVarianti == '1')
  830.             $caricaTutteVarianti = true;
  831.         // FILTRO VISUALIZZAZIONE ARTICOLI CLIENTI
  832.         $filtroRiferimento = null;
  833.         if ($user){
  834.             if ($user->getFiltroVisualizzazioneArticoliClienti()) {
  835.                 if ($user->getFiltroVisualizzazioneArticoliClienti()->getElencoCategorie() != '')
  836.                     $filtroRiferimento = $user->getFiltroVisualizzazioneArticoliClienti();
  837.             }
  838.         }else if ($filtroComune != ''){
  839.             $ffl = $this->servizi->doctrine->getRepository(FiltroVisualizzazioneArticoliClienti::class)->find($filtroComune);
  840.             if ($ffl && $ffl->getElencoCategorie() != '')
  841.                 $filtroRiferimento = $ffl;
  842.         }
  843.         $filtro = new ContenitoreCategoriePerFiltri();
  844.         /** @var $categorie AlberoCategorie[] */
  845.         $listaCategorie = $recuperaDati->recuperaAlberoCategorie($filtro, $request->getLocale(), $filtroRiferimento);
  846.         $listaCategorieChiaviParent = array();
  847.         foreach ($listaCategorie as $lc){
  848.             if($lc->parent){
  849.                 $_lc_id = $lc->parent->id;
  850.                 if (key_exists($_lc_id, $listaCategorieChiaviParent)){
  851.                     array_push($listaCategorieChiaviParent[$_lc_id], $lc);
  852.                 }else{
  853.                     $listaCategorieChiaviParent[$_lc_id] = array($lc);
  854.                 }
  855.             }
  856.         }
  857.         $altriDati = AltriDatiUtente::CreaDaUtente($user);
  858.         if(!$user)
  859.             $secret = $request->cookies->get('secret_user');
  860.         else {
  861.             $codiceCliente = $user->getCodiceCliente();
  862.             if ($this->isGranted("ROLE_ADMIN") || $this->isGranted("ROLE_AGENTE") || $this->isGranted("ROLE_COMMERCIALE")) {$agente = $this->servizi->OttieniUtenteCorrente();
  863.                 if ($altriDati && $altriDati->codice != ''){
  864.                     $anagraficaTrovata = $this->servizi->ritornaAnagraficaShopSelezionataDaCookieIdentificativo($altriDati->codice, $this->servizi->OttieniUtenteCorrente());
  865.                     if ($anagraficaTrovata) {
  866.                         $codiceCliente = $anagraficaTrovata->getCodice();
  867.                         $anagrafica = $anagraficaTrovata;
  868.                     }
  869.                 }
  870.             }
  871.         }
  872.         /** @var $carrello \App\Model\Entita\Carrello */
  873.         $carrello = $recuperaDati->recuperaDettagliCarrello($secret, $user, $request->getLocale(), $codiceCliente, $anagrafica, $agente, $caricaTutteVarianti, $altriDati ? $altriDati->tipoOrdine : null);
  874.         /** @var $destinazioni Destinazioni[] */
  875.         $destinazioni = $this->servizi->doctrine->getRepository(Destinazioni::class)->findBy(array('azienda' => $user));
  876.         /** @var $modalitaPagamento ModalitaPagamento[] */
  877.         $modalitaPagamento = $this->servizi->doctrine->getRepository(ModalitaPagamento::class)->findAll();
  878.         /** @var $associazioneSpedizioneConsegna AssociazioneSpedizioniClienti[] */
  879.         $associazioneSpedizioneConsegna = $this->servizi->doctrine->getRepository(AssociazioneSpedizioniClienti::class)->findBy(array('azienda' => $user));
  880.         /** @var $modalitaSpedizione ModalitaSpedizione[] */
  881.         $modalitaSpedizione = $this->servizi->doctrine->getRepository(ModalitaSpedizione::class)->findAll();
  882.         if(!$carrello || $carrello->id == '' || count($carrello->righe) <= 0 ){
  883.             $this->addFlash(
  884.                 'error',
  885.                 $traduci->OttieniElementoDizionario('carrello_errore_vuoto', 'carrello')->valoreUscita
  886.             );
  887.             return $this->redirectToRoute('home_prodotti');
  888.         }
  889.         $abilitaGestioneCoupon = $this->imp->ritornaImpostazioneDaNome("AbilitaUtilizzoCoupon");
  890.         $parametriLayout = array(
  891.             Costanti::T_CARRELLO => $carrello,
  892.             Costanti::T_RIGHE_CARRELLO => $carrello->righe,
  893.             'destinazioni' => $destinazioni,
  894.             'anagrafica' => $anagrafica,
  895.             'modalitaPagamento' => $modalitaPagamento,
  896.             'associazioneSpedizioneConsegna' => $associazioneSpedizioneConsegna,
  897.             'modalitaSpedizione' => $modalitaSpedizione,
  898.             Costanti::T_LISTA_CATEGORIE => $listaCategorie,
  899.             Costanti::T_LISTA_CATEGORIE_CHIAVI_PARENT => $listaCategorieChiaviParent,
  900.             Costanti::ID_MODALITA_PAGAMENTO_SELEZIONATA => ($carrello->modalitaPagamento ? $carrello->modalitaPagamento->id : ''),
  901.             Costanti::ID_MODALITA_SPEDIZIONE_SELEZIONATA => ($carrello->modalitaSpedizione ? $carrello->modalitaSpedizione->id : ''),
  902.             Costanti::MPSC_RADICE_FORM => null
  903.         );
  904.         if (!$user || $user->getUtenteComune() ){
  905.             $formSpedizionePagamento = $this->formFactory->createNamedBuilder(Costanti::MPSC_RADICE_FORM)
  906.                 ->add(Costanti::IO_MODALITA_SPEDIZIONE,  EntityType::class, array('required' => false, 'class' => 'App\Entity\ModalitaSpedizione', 'choice_label' => function ($modalita) {
  907.                     return $modalita->getTestoDescrittivo();
  908.                 }, 'label' => $traduci->OttieniElementoDizionario("carrello_modalita_spedizione", "carrello")->valoreUscita, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')))
  909.                 ->add(Costanti::IO_MODALITA_PAGAMENTO,  EntityType::class, array('required' => false, 'class' => 'App\Entity\ModalitaPagamento', 'choice_label' => function ($modalita) {
  910.                     return $modalita->getTestoDescrittivo();
  911.                 }, 'label' => $traduci->OttieniElementoDizionario("carrello_modalita_pagamento", "carrello")->valoreUscita, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')))
  912.                 ->add(Costanti::MPSC_AGGIORNA_ORDINE, SubmitType::class, array('label' => $traduci->OttieniElementoDizionario("carrello_aggiorna", "carrello")->valoreUscita, 'attr' => array('class' => 'form-inline btn btn-sm btn-success', 'style' => 'margin-top:5px;', 'autocomplete' => 'off')))
  913.                 ->getForm();
  914.             $formSpedizionePagamento->handleRequest($request);
  915.             if($formSpedizionePagamento->isSubmitted() && $formSpedizionePagamento->isValid()) {
  916.                 $crl = $this->servizi->RecuperaCarrello($secret, $agente, $anagrafica, $user);
  917.                 if($formSpedizionePagamento[Costanti::IO_MODALITA_SPEDIZIONE]->getData()){
  918.                     $crl->setModalitaSpedizione($formSpedizionePagamento[Costanti::IO_MODALITA_SPEDIZIONE]->getData());
  919.                 }
  920.                 if($formSpedizionePagamento[Costanti::IO_MODALITA_PAGAMENTO]->getData()){
  921.                     $crl->setModalitaPagamento($formSpedizionePagamento[Costanti::IO_MODALITA_PAGAMENTO]->getData());
  922.                 }
  923.                 $em = $this->servizi->doctrine->getManager();
  924.                 $em->persist($crl);
  925.                 $em->flush();
  926.                 $funzioniCarrello = new FunzioniCarrello($this->servizi->doctrine, $this->imp, $this->servizi);
  927.                 $funzioniCarrello->AggiornaTotaleCarrello($crl->getId());
  928.                 $carrello = $recuperaDati->recuperaDettagliCarrello($secret, $user, $request->getLocale(), $codiceCliente, $anagrafica, $agente);
  929.                 $parametriLayout[Costanti::T_CARRELLO] = $carrello;
  930.                 $parametriLayout[Costanti::ID_MODALITA_PAGAMENTO_SELEZIONATA] = ($carrello->modalitaPagamento ? $carrello->modalitaPagamento->id : '');
  931.                 $parametriLayout[Costanti::ID_MODALITA_SPEDIZIONE_SELEZIONATA] = ($carrello->modalitaSpedizione ? $carrello->modalitaSpedizione->id : '');
  932.             }
  933.             $parametriLayout[Costanti::MPSC_RADICE_FORM] = $formSpedizionePagamento->createView();
  934.         }
  935.         if ($abilitaGestioneCoupon == '1') {
  936.             $couponForm = $this->formFactory->createNamedBuilder(Costanti::CC_RADICE_FORM)
  937.                 ->add(Costanti::CC_CODICE_COUPON, TextType::class, array('required' => true, 'label' => "Codice coupon", 'attr' => array('class' => "form-control input-sm", 'autocomplete' => 'off', 'style' => 'padding-left:5px;padding-right:5px;')))
  938.                 ->add(Costanti::CC_APPLICA, SubmitType::class, array('label' => "Applica", 'attr' => array('class' => 'form-inline btn btn-sm btn-success', 'style' => 'margin-top:5px;')))
  939.                 ->getForm();
  940.             $couponForm->handleRequest($request);
  941.             if($couponForm->isSubmitted() && $couponForm->isValid()){
  942.                 /** @var  $coupon CouponDettaglio */
  943.                 $coupon = $this->servizi->doctrine->getRepository(CouponDettaglio::class)->findOneBy(array('codice' => $couponForm[Costanti::CC_CODICE_COUPON]->getData()));
  944.                 if ($coupon) {
  945.                     $ritornoValiditaCoupon = $this->servizi->verificaValiditaCoupon($coupon, $carrello);
  946.                     if ($ritornoValiditaCoupon->esito) {
  947.                         $em = $this->servizi->doctrine->getManager();
  948.                         $crl = $carrello->RitornaEntitaDoctrine($this->servizi->doctrine);
  949.                         $utilizzoCoupon = new CouponDettaglioUtilizzo();
  950.                         $utilizzoCoupon->setDettaglioCoupon($coupon);
  951.                         $utilizzoCoupon->setDataUtilizzo(new \DateTime());
  952.                         $utilizzoCoupon->setAgentUtilizzatore($request->headers->get('User-Agent'));
  953.                         $utilizzoCoupon->setLocaleUtilizzatore($request->getLocale());
  954.                         $utilizzoCoupon->setIpUtilizzatore($request->getClientIp());
  955.                         $utilizzoCoupon->setOrdine(null);
  956.                         $utilizzoCoupon->setDataModifica(new \DateTime());
  957.                         $utilizzoCoupon->setDataCreazione(new \DateTime());
  958.                         $utilizzoCoupon->setUtenteModifica($this->servizi->OttieniUtenteCorrente());
  959.                         $em->persist($utilizzoCoupon);
  960.                         $crl->setCouponDettaglioUtilizzo($utilizzoCoupon);
  961.                         $em->persist($crl);
  962.                         $em->flush();
  963.                         $fnzCarrello = new FunzioniCarrello($this->servizi->doctrine, $this->imp, $this->servizi);
  964.                         $fnzCarrello->AggiornaTotaleCarrello($crl->getId());
  965.                         $this->addFlash(
  966.                             'notice',
  967.                             'Coupon registrato!'
  968.                         );
  969.                     } else {
  970.                         $this->addFlash(
  971.                             'error',
  972.                             $ritornoValiditaCoupon->messaggio
  973.                         );
  974.                     }
  975.                 } else {
  976.                     $this->addFlash(
  977.                         'error',
  978.                         'Coupon con codice ' . $couponForm[Costanti::CC_CODICE_COUPON]->getData() . " inesistente"
  979.                     );
  980.                 }
  981.             }
  982.             $parametriLayout[Costanti::CC_RADICE_FORM] = $couponForm->createView();
  983.         }
  984.         return $this->render('ZZ_front_end/carrello/carrello.html.twig', $parametriLayout);
  985.     }
  986.     /**
  987.      * @Route("/shopCM/cart/add/{codice}", name="shopcm_carrello_aggiungi", requirements={"codice"=".+"})
  988.      */
  989.     public function aggiungiCarrelloActionShopComune(Request $request, $codice){
  990.         $qta = $request->get('qta');
  991.         $idMappa = $request->get('id-mappa');
  992.         $idVariante = $request->get('id-variante');
  993.         $idListaTipologiaPreimpostata = $request->get('id-lista-tipologia-preimpostata', '');
  994.         $traduci = $this->translating;
  995.         $traduci->CaricaTraduzioniDaFamiglia('carrello', $request->getLocale());
  996.         if ($qta > 0 && ($idMappa != '' || $idVariante != '')){
  997.             if ($idVariante != '' && $idMappa == ''){
  998.                 $variante = $this->servizi->doctrine->getRepository(Varianti::class)->find($idVariante);
  999.                 if ($variante){
  1000.                     $idMappa = $variante->getMappa()->getId();
  1001.                 }
  1002.             }
  1003.             $lista = array(
  1004.                 array(
  1005.                    'idMappaArticoli' => $idMappa,
  1006.                    'idVariante' => $idVariante,
  1007.                     'qta' => $qta,
  1008.                     'idListaTipologiePreimpostate' => $idListaTipologiaPreimpostata
  1009.                 )
  1010.             );
  1011.             $request->attributes->set('lista', $lista);
  1012.             /** @var RitornoGenericoCarrello[] $ritorno */
  1013.             $ritorno = $this->aggiungiCarrelloAction($request, true);
  1014.             if (count($ritorno) > 0){
  1015.                 $primo = $ritorno[0];
  1016.                 if ($primo->esito){
  1017.                     $this->addFlash(
  1018.                         'notice',
  1019.                         $traduci->OttieniElementoDizionario('carrello_articolo_aggiunto', 'carrello')->valoreUscita
  1020.                     );
  1021.                 }else{
  1022.                     $this->addFlash(
  1023.                         'error',
  1024.                         $primo->RitornaStringaCompostaMessaggiSemplificati()
  1025.                     );
  1026.                 }
  1027.             }
  1028.         }else{
  1029.             $this->addFlash(
  1030.                 'error',
  1031.                 "Parametri mancanti!"
  1032.             );
  1033.             $this->logger->error("Parametri mancanti alla chiamata: '" . $request->getBaseUrl() . $request->getQueryString() . "' . Parametri necessari: qta - id-mappa - id-variante");
  1034.         }
  1035.         return $this->redirect($this->servizi->getRefererRoute($request));
  1036.     }
  1037.     /**
  1038.      * @Route("/shopCM/cart/multipleAdd", name="shopcm_carrello_aggiungi_multiplo")
  1039.      */
  1040.     public function aggiungiCarrelloShopCmMultiplo(Request $request){
  1041.         $traduci = $this->translating;
  1042.         $traduci->CaricaTraduzioniDaFamiglia('carrello', $request->getLocale());
  1043.         $field = $request->request->all();
  1044.         foreach (array_keys($field) as $key) {
  1045.             $item = $field[$key];
  1046.             //Ipotesi campo <input name="form-ord_idVar" value="">
  1047.             if (strpos($key, 'form-ord') !== false) { //Verifico se la variabile fa parte di quelle da analizzare
  1048.                 $idVariante = (explode('_', $key))[1];
  1049.                 $qta = $item;
  1050.                 if ($qta > 0 && $idVariante != '') {
  1051.                     $variante = $this->servizi->doctrine->getRepository(Varianti::class)->find($idVariante);
  1052.                     if ($variante) {
  1053.                         $idMappa = $variante->getMappa()->getId();
  1054.                     }
  1055.                     $lista = array(
  1056.                         array(
  1057.                             'idMappaArticoli' => $idMappa,
  1058.                             'idVariante' => $idVariante,
  1059.                             'qta' => $qta,
  1060.                             'idListaTipologiePreimpostate' => ''
  1061.                         )
  1062.                     );
  1063.                     $request->attributes->set('lista', $lista);
  1064.                     /** @var RitornoGenericoCarrello[] $ritorno */
  1065.                     $ritorno = $this->aggiungiCarrelloAction($request, true);
  1066.                     if (count($ritorno) > 0) {
  1067.                         $primo = $ritorno[0];
  1068.                         if ($primo->esito) {
  1069.                             $this->addFlash(
  1070.                                 'notice',
  1071.                                 $traduci->OttieniElementoDizionario('carrello_articolo_aggiunto', 'carrello')->valoreUscita
  1072.                             );
  1073.                         } else {
  1074.                             $this->addFlash(
  1075.                                 'error',
  1076.                                 $primo->RitornaStringaCompostaMessaggiSemplificati()
  1077.                             );
  1078.                         }
  1079.                     }
  1080.                 }
  1081.             }
  1082.         }
  1083.         return $this->redirect($this->servizi->getRefererRoute($request));
  1084.     }
  1085.     /**
  1086.      * @Route("/cart/fast/add/{codice}/{qta}", name="carrello_fast_aggiungi", defaults={"qta"="1"})
  1087.      */
  1088.     public function aggiungiFastCarrelloAction(Request $request, $codice, $qta = 1)
  1089.     {
  1090.         /** @var MappaCategorieArticoli|null $mappa */
  1091.         $mappa = null;
  1092.         $ris = $this->servizi->doctrine->getRepository(MappaCategorieArticoli::class)->createQueryBuilder('mappa')
  1093.             ->leftJoin('mappa.articolo', 'articolo')
  1094.             ->where('articolo.codice = :cod')->setParameter('cod', $codice)
  1095.             ->setMaxResults(1)
  1096.             ->getQuery()->getResult();
  1097.         if(count($ris) > 0)
  1098.         {
  1099.             /** @var MappaCategorieArticoli $mappa */
  1100.             $mappa = $ris[0];
  1101.             $arr = [
  1102.                 [
  1103.                     'idMappaArticoli' => $mappa->getId(),
  1104.                     'idVariante' => '',
  1105.                     'idListaTipologiePreimpostate' => '',
  1106.                     'qta' => $qta
  1107.                 ]
  1108.             ];
  1109.             $request->attributes->set('lista', $arr);
  1110.             /** @var RitornoGenericoCarrello[] $ritorniCarrrello */
  1111.             $ritorniCarrrello = $this->aggiungiCarrelloAction($request, true);
  1112.             $procedi = true;
  1113.             $mess = '';
  1114.             foreach ($ritorniCarrrello as $item){
  1115.                 if($procedi && !$item->esito){
  1116.                     $procedi = false;
  1117.                     $mess = implode(' ', $item->messaggiSemplificati);
  1118.                 }
  1119.             }
  1120.             if($procedi) {
  1121.                 $this->addFlash('info', 'Articolo con codice: ' . $codice . ' aggiunto al carrello!');
  1122.             }else{
  1123.                 $this->addFlash('error', 'Errore aggiunta articolo con codice: ' . $codice . ': ' . $mess);
  1124.             }
  1125.             return $this->redirectToRoute('carrello');
  1126.         }else{
  1127.             $this->addFlash('error', 'Articolo con codice: ' . $codice . ' non trovato!');
  1128.             return $this->redirectToRoute('homepage');
  1129.         }
  1130.     }
  1131.     /**
  1132.      * @Route("/cart/add", name="carrello_aggiungi", options={"expose"=true})
  1133.      */
  1134.     public function aggiungiCarrelloAction(Request $request, $ritornoArray = false)
  1135.     {
  1136.         $lista = $request->get('lista');
  1137.         $user = $this->servizi->OttieniUtenteCorrente();
  1138.         $anagraficaTrovata = null;
  1139.         $agente = null;
  1140.         $secret = "";
  1141.         $altriDati = AltriDatiUtente::CreaDaUtente($user);
  1142.         if(!$user)
  1143.             $secret = $request->cookies->get('secret_user');
  1144.         else{
  1145.             if ($this->isGranted("ROLE_ADMIN") || $this->isGranted("ROLE_AGENTE") || $this->isGranted("ROLE_COMMERCIALE")){
  1146.                 $agente = $this->servizi->OttieniUtenteCorrente();
  1147.                 if ($altriDati && $altriDati->codice != ''){
  1148.                     $anagraficaTrovata = $this->servizi->ritornaAnagraficaShopSelezionataDaCookieIdentificativo($altriDati->codice, $this->servizi->OttieniUtenteCorrente());
  1149.                     if ($anagraficaTrovata){
  1150.                         $clienteSelezionatoAgente = $anagraficaTrovata;
  1151.                     }
  1152.                 }
  1153.             }
  1154.         }
  1155.         /** @var  $ritornoGenericoCarrello RitornoGenericoCarrello[] */
  1156.         $ritorniGenericiCarrello = array();
  1157.         foreach ($lista as $item){
  1158.             $funzioniCarrello = new FunzioniCarrello($this->servizi->doctrine, $this->imp, $this->servizi);
  1159.             $em = $this->servizi->doctrine->getManager();
  1160.             $ritornoGenericoCarrello = $funzioniCarrello->CreaRigaCarrello(
  1161.                 $item["idMappaArticoli"],
  1162.                 $item["idVariante"],
  1163.                 $item["idListaTipologiePreimpostate"],
  1164.                 $item["qta"],
  1165.                 $user,
  1166.                 $secret,
  1167.                 $agente,
  1168.                 $anagraficaTrovata,
  1169.                 new CreaRigaCarrelloValoriOpzionali(),
  1170.                 $request->getLocale(),
  1171.                 $em
  1172.             );
  1173.             $em->clear();
  1174.             array_push($ritorniGenericiCarrello, $ritornoGenericoCarrello);
  1175.         }
  1176.         if ($ritornoArray){
  1177.             return $ritorniGenericiCarrello;
  1178.         }else {
  1179.             return new JsonResponse($ritorniGenericiCarrello);
  1180.         }
  1181.     }
  1182.     /**
  1183.      * @Route("/carrello/aggiungi/spezzonatura/{qta}/{nrPassi}/{giunto}/{falsa}/{terminali}/{idListaSpezzonatore}/{nota}", name="carrello_aggiungi_spezzonaore", options={"expose"=true}, defaults={"idSpezzonatore" = 0, "idListaSpezzonatore" = 0, "nota" = "", "terminali" = ""})
  1184.      */
  1185.     public function aggiungiSpezzonaturaCarrelloAction(Request $request, $qta, $nrPassi, $giunto, $falsa, $terminali, $idListaSpezzonatore, $nota)
  1186.     {
  1187.         $user = $this->servizi->OttieniUtenteCorrente();
  1188.         $clienteSelezionatoAgente = null;
  1189.         $agente = null;
  1190.         $anagraficaTrovata = null;
  1191.         $codiceCliente = "";
  1192.         /** @var  $cliente User */
  1193.         $cliente = $this->servizi->OttieniUtenteCorrente();
  1194.         if($cliente){
  1195.             $codiceCliente = $cliente->getCodiceCliente();
  1196.             if ($this->isGranted("ROLE_ADMIN") || $this->isGranted("ROLE_AGENTE") || $this->isGranted("ROLE_COMMERCIALE")){
  1197.                 $agente = $this->servizi->OttieniUtenteCorrente();
  1198.                 $altriDati = $user->getAltriDati();
  1199.                 if ($altriDati && $altriDati != null){
  1200.                     $json = json_decode($altriDati, true);
  1201.                     $anagraficaTrovata = $this->servizi->ritornaAnagraficaShopSelezionataDaCookieIdentificativo($json['codice'], $this->servizi->OttieniUtenteCorrente());
  1202.                     if ($anagraficaTrovata){
  1203.                         $clienteSelezionatoAgente = $anagraficaTrovata;
  1204.                         $codiceCliente = $clienteSelezionatoAgente->getCodice();
  1205.                         $listinoComune = $clienteSelezionatoAgente->getCodiceListinoVendita();
  1206.                     }
  1207.                 }
  1208.             }else{
  1209.                 $listinoComune = $cliente->getCodiceListinoVendita();
  1210.                 if ($listinoComune == '' or $listinoComune != null){
  1211.                     $listinoComune = $this->imp->ritornaImpostazioneDaNome('CodiceListinoShopComune');
  1212.                 }
  1213.             }
  1214.         }
  1215.         $repoSpezzonatore = $this->servizi->doctrine->getRepository(ListaSpezzonatore::class);
  1216.         /** @var  $listaSpezzonatore ListaSpezzonatore */
  1217.         $listaSpezzonatore = $repoSpezzonatore->findOneBy(array('id' => $idListaSpezzonatore));
  1218.         /** @var  $opzioneSpezzonatura SpezzonatoreOpzioni */
  1219.         $opzioneSpezzonatura = $this->servizi->doctrine->getRepository(SpezzonatoreOpzioni::class)->find($terminali);
  1220.         $nrPassiCalcolo = $nrPassi;
  1221.         if ($falsa == 0) {
  1222.             if (($nrPassi % 2) != 0) {
  1223.                 $nrPassiCalcolo = $nrPassi + 1;
  1224.             }
  1225.         }
  1226.         if ($listaSpezzonatore) {
  1227.             $nettoCadArticolo = 0;
  1228.             $nettoCadGiunto = 0;
  1229.             $nettoCadFalsa = 0;
  1230.             $nettoCadRibadire = 0;
  1231.             $rtMappaArt = $this->servizi->recuperoDati->RecuperaPrezziScontiMappa($listaSpezzonatore->getMappaArticolo(), $user, $codiceCliente, $listinoComune);
  1232.             $rtMappaGiu = $this->servizi->recuperoDati->RecuperaPrezziScontiMappa($listaSpezzonatore->getMappaGiunto(), $user, $codiceCliente, $listinoComune);
  1233.             $rtMappaFal = $this->servizi->recuperoDati->RecuperaPrezziScontiMappa($listaSpezzonatore->getMappaFalsa(), $user, $codiceCliente, $listinoComune);
  1234.             $rtMappaRib = $this->servizi->recuperoDati->RecuperaPrezziScontiMappa($listaSpezzonatore->getMappaRibadire(), $user, $codiceCliente, $listinoComune);
  1235.             $nettoCadArticolo = $rtMappaArt->prezzoNettoCalcolato;
  1236.             $nettoCadGiunto = $rtMappaGiu->prezzoNettoCalcolato;
  1237.             $nettoCadFalsa = $rtMappaFal->prezzoNettoCalcolato;
  1238.             $nettoCadRibadire = $rtMappaRib->prezzoNettoCalcolato;
  1239.             $passoCatena = (float)$listaSpezzonatore->getPassoCatena();
  1240.             $metriSpezzone = ((float)$passoCatena * (float)$nrPassiCalcolo) / (float)1000;
  1241.             $metriSpezzone = round($metriSpezzone, $listaSpezzonatore->getMappaArticolo()->getArticolo()->getUm()->getNumeroDecimali());
  1242.             $totMetri = (float)$metriSpezzone * (float)$qta;
  1243.             $totMetri = round($totMetri, $listaSpezzonatore->getMappaArticolo()->getArticolo()->getUm()->getNumeroDecimali());
  1244.             $compresoGiunto = "";
  1245.             $compresoFalsa = "";
  1246.             $euroCadSpezzone = $metriSpezzone * $nettoCadArticolo;
  1247.             if ($giunto == 1) {
  1248.                 $compresoGiunto = "Compr.Giunto";
  1249.             }
  1250.             $euroCadSpezzone = $euroCadSpezzone + ($nettoCadGiunto * $giunto);
  1251.             if ($falsa == 1) {
  1252.                 $compresoFalsa = "Compr.Falsa";
  1253.             }
  1254.             $euroCadSpezzone = $euroCadSpezzone + ($nettoCadFalsa * $falsa);
  1255.             $ribadire = floor($metriSpezzone / (float)5);
  1256.             $euroCadSpezzone = (float)$euroCadSpezzone + ((float)$nettoCadRibadire * (float)$ribadire );
  1257.             $ribadire = $ribadire * $qta;
  1258.             $falsa = $falsa * $qta;
  1259.             $giunto = $giunto * $qta;
  1260.             $euroCadSpezzone = round((float)$euroCadSpezzone * ((float)1 + ((float)$listaSpezzonatore->getMaggiorazione() / (float)100)), 3);
  1261.             if ($opzioneSpezzonatura->getIncrementoFisso() > 0){
  1262.                 $euroCadSpezzone += (float)$opzioneSpezzonatura->getIncrementoFisso();
  1263.             }
  1264.             if ($opzioneSpezzonatura->getIncrementoPercentuale() > 0){
  1265.                 $euroCadSpezzone =(float)$euroCadSpezzone * ((float)1 + ((float)$opzioneSpezzonatura->getIncrementoPercentuale() / (float)100));
  1266.             }
  1267.             $euroMetro = round(($euroCadSpezzone / $metriSpezzone), 3);
  1268.             $euroSpezzone = ($metriSpezzone * $euroMetro);
  1269.             $qtaMod = $qta;
  1270.             $collegamentoRighe = uniqid();
  1271.             $nota = ("NR. " . $qta . " spezzoni da " . $nrPassi . " passi " . $opzioneSpezzonatura->getTestoVisualizzato() . " " . $compresoGiunto . " " . $compresoFalsa . "<br> Lunghezza singolo spezzone: " . number_format($metriSpezzone, 3, ",", ".") . " Mt - Euro Spezzone: " . number_format($euroSpezzone, 3, ",", "."));
  1272.             $funzioniCarrello = new FunzioniCarrello($this->servizi->doctrine, $this->imp, $this->servizi);
  1273.             $valOpzCarrello = new CreaRigaCarrelloValoriOpzionali();
  1274.             $valOpzCarrello->collegamentoAltreRighe = $collegamentoRighe;
  1275.             $valOpzCarrello->forzaInserimento = true;
  1276.             $valOpzCarrello->nota = $nota;
  1277.             $valOpzCarrello->consentiModificaNota = false;
  1278.             $valOpzCarrello->consentiModifiche = false;
  1279.             $erroreCarrello = "";
  1280.             $ritGenCar = $funzioniCarrello->CreaRigaCarrelloSpezzonatore($rtMappaArt->id, $euroMetro, $totMetri, $user, "", $agente, $anagraficaTrovata, $valOpzCarrello, $request->getLocale());
  1281.             $erroreCarrello .= $ritGenCar->RitornaStringaCompostaMessaggiSemplificati();
  1282.             $ritGenCarGiunti = null;
  1283.             $ritGenCarFalse = null;
  1284.             $ritGenCarRibadire = null;
  1285.             if($giunto > 0) {
  1286.                 $valOpzCarrello->nota = 'x spezzone';
  1287.                 $ritGenCarGiunti = $funzioniCarrello->CreaRigaCarrelloSpezzonatore($rtMappaGiu->id, 0.01, $giunto, $user, "", $agente, $anagraficaTrovata, $valOpzCarrello, $request->getLocale());
  1288.                 $erroreCarrello .= $ritGenCarGiunti->RitornaStringaCompostaMessaggiSemplificati();
  1289.             }
  1290.             if($falsa > 0) {
  1291.                 $valOpzCarrello->nota = 'x spezzone';
  1292.                 $ritGenCarFalse = $funzioniCarrello->CreaRigaCarrelloSpezzonatore($rtMappaFal->id, 0.01, $falsa, $user, "", $agente, $anagraficaTrovata, $valOpzCarrello, $request->getLocale());
  1293.                 $erroreCarrello .= $ritGenCarFalse->RitornaStringaCompostaMessaggiSemplificati();
  1294.             }
  1295.             if($ribadire > 0) {
  1296.                 $valOpzCarrello->nota = 'x spezzone';
  1297.                 $ritGenCarRibadire = $funzioniCarrello->CreaRigaCarrelloSpezzonatore($rtMappaFal->id, 0.01, $ribadire, $user, "", $agente, $anagraficaTrovata, $valOpzCarrello, $request->getLocale());
  1298.                 $erroreCarrello .= $ritGenCarRibadire->RitornaStringaCompostaMessaggiSemplificati();
  1299.             }
  1300.             return new Response($erroreCarrello);
  1301.         } else {
  1302.             $this->addFlash(
  1303.                 'error',
  1304.                 'Mappa Variabili-Articolo non trovata!'
  1305.             );
  1306.             return new Response("Lista spezzonatore non trovata!");
  1307.         }
  1308.     }
  1309.     /**
  1310.      * @Route("/cart/checkout", name="carrello_finalizza")
  1311.      */
  1312.     public function finalizzaCarrello(Request $request){
  1313.         /** @var  $user User */
  1314.         $user = $this->servizi->OttieniUtenteCorrente();
  1315.         $arrayChiaviControllo = array();
  1316.         $recuperaDati = new RecuperoDati($this->servizi->doctrine, $this->imp, $this->servizi);
  1317.         /** @var Anagrafiche|null $anagrafica */
  1318.         $anagrafica = null;
  1319.         /** @var User|null $agente */
  1320.         $agente = null;
  1321.         $codiceCliente = "";
  1322.         /** @var Carrello|null $carrello */
  1323.         $carrello = null;
  1324.         $this->imp->caricaCacheImpostazioniDaNomi(array('PermettiModificaSpedizioneAgenti', 'PermettiModificaPagamentoAgenti'));
  1325.         $consentiAgentiModificaSpedizione = $this->imp->ritornaImpostazioneDaNome('PermettiModificaSpedizioneAgenti');
  1326.         $consentiAgentiModificaPagamento = $this->imp->ritornaImpostazioneDaNome('PermettiModificaPagamentoAgenti');
  1327.         $dataConsegnaObbligatoria = $this->imp->ritornaImpostazioneDaNome('OrdiniWebDataConsegnaObbligatoria');
  1328.         $raggruppaVarianti = $this->imp->ritornaImpostazioneDaNome('RaggruppaVariantiInCarrello');
  1329.         $caricaTutteVarianti = false;
  1330.         if($raggruppaVarianti == '1')
  1331.             $caricaTutteVarianti = true;
  1332.         $filtro = new ContenitoreCategoriePerFiltri();
  1333.         /** @var $categorie AlberoCategorie[] */
  1334.         $listaCategorie = $recuperaDati->recuperaAlberoCategorie($filtro, $request->getLocale());
  1335.         $listaCategorieChiaviParent = array();
  1336.         foreach ($listaCategorie as $lc){
  1337.             if($lc->parent){
  1338.                 $_lc_id = $lc->parent->id;
  1339.                 if (key_exists($_lc_id, $listaCategorieChiaviParent)){
  1340.                     array_push($listaCategorieChiaviParent[$_lc_id], $lc);
  1341.                 }else{
  1342.                     $listaCategorieChiaviParent[$_lc_id] = array($lc);
  1343.                 }
  1344.             }
  1345.         }
  1346.         $traduci = $this->translating;
  1347.         $traduci->CaricaTraduzioniDaFamiglia("carrello", $request->getLocale(), false);
  1348.         $secret = "";
  1349.         $altriDati = AltriDatiUtente::CreaDaUtente($user);
  1350.         if(!$user)
  1351.             $secret = $request->cookies->get('secret_user');
  1352.         else {
  1353.             $codiceCliente = $user->getCodiceCliente();
  1354.             if ($this->isGranted("ROLE_ADMIN") || $this->isGranted("ROLE_AGENTE") || $this->isGranted("ROLE_COMMERCIALE")) {
  1355.                 $agente = $this->servizi->OttieniUtenteCorrente();
  1356.                 if ($altriDati && $altriDati->codice != ''){
  1357.                     $anagraficaTrovata = $this->servizi->ritornaAnagraficaShopSelezionataDaCookieIdentificativo($altriDati->codice, $this->servizi->OttieniUtenteCorrente());
  1358.                     if ($anagraficaTrovata) {
  1359.                         $codiceCliente = $anagraficaTrovata->getCodice();
  1360.                         $anagrafica = $anagraficaTrovata;
  1361.                     }
  1362.                 }
  1363.             }
  1364.         }
  1365.         /** @var $carrello \App\Model\Entita\Carrello */
  1366.         $carrelloEntita = $recuperaDati->recuperaDettagliCarrello($secret, $user, $request->getLocale(), $codiceCliente, $anagrafica, $agente, false, $altriDati ? $altriDati->tipoOrdine : null);
  1367.         $carrello = null;
  1368.         if($carrelloEntita != null && $carrelloEntita->id != '')
  1369.             $carrello = $this->servizi->doctrine->getRepository(Carrello::class)->find($carrelloEntita->id);
  1370.         if(!$carrello || count($carrello->getRighe()) <= 0 ){
  1371.             $this->addFlash(
  1372.                 'error',
  1373.                 $traduci->OttieniElementoDizionario('carrello_errore_vuoto', 'carrello')->valoreUscita
  1374.             );
  1375.             return $this->redirectToRoute('home_prodotti');
  1376.         }
  1377.         $validazioneCarrello = Validator::ValidaCarrello($carrello, $this->servizi->doctrine, $this->imp, $this->servizi, $this->servizi->OttieniUtenteCorrente());
  1378.         if($validazioneCarrello->bloccante){
  1379.             $this->addFlash(
  1380.                 'error',
  1381.                 join('<br>', $validazioneCarrello->messaggiSemplificatiPerUtente)
  1382.             );
  1383.             return $this->redirectToRoute('carrello');
  1384.         }
  1385.         /** @var UserCampiCustomTestata[] $campiCustomUser */
  1386.         $campiCustomUser = $this->servizi->doctrine->getRepository(UserCampiCustomTestata::class)->findBy(array('luogoVisualizzazione' => 'registrazioneUtente'));
  1387.         $chiaviCampiCustom = array();
  1388.         foreach ($campiCustomUser as $tst) {
  1389.           $chiaviCampiCustom = array_merge($this->servizi->RitornaChiaviUserCampiCustom($tst), $chiaviCampiCustom);
  1390.         }
  1391.         $formBuilder = $this->createFormBuilder();
  1392.         if (!$user){
  1393.             foreach ($campiCustomUser as $itm){
  1394.                 $formBuilder = $this->servizi->AggiungiChildAFormUserCampiCustom($itm, $formBuilder);
  1395.             }
  1396.             $formBuilder = $formBuilder
  1397.                 ->add(Costanti::IO_RIFERIMENTO_ORDINE,  TextType::class, array('required' => false, 'label' => $traduci->OttieniElementoDizionario("carrello_riferimento_ordine", "carrello")->valoreUscita, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')))
  1398.                 ->add(Costanti::IO_MODALITA_SPEDIZIONE,  EntityType::class, array('required' => true, 'class' => 'App\Entity\ModalitaSpedizione', 'choice_label' => function ($modalita) {
  1399.                         return $modalita->getTestoDescrittivo();
  1400.                     }, 'label' => $traduci->OttieniElementoDizionario("carrello_modalita_spedizione", "carrello")->valoreUscita, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')))
  1401.                 ->add(Costanti::IO_MODALITA_PAGAMENTO,  EntityType::class, array('required' => true, 'class' => 'App\Entity\ModalitaPagamento', 'choice_label' => function ($modalita) {
  1402.                     return $modalita->getTestoDescrittivo();
  1403.                 }, 'label' => $traduci->OttieniElementoDizionario("carrello_modalita_pagamento", "carrello")->valoreUscita, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')))
  1404.                 ->add(Costanti::IO_NOTE,  TextareaType::class, array('required' => false, 'label' => $traduci->OttieniElementoDizionario("carrello_note", "carrello")->valoreUscita, 'attr' => array('class' => "form-control", 'rows' => '6', 'style' => 'padding-left:5px;padding-right:5px;')))
  1405.                 ->add('applica', SubmitType::class, array('label' => $traduci->OttieniElementoDizionario("carrello_completa_btn", "carrello")->valoreUscita, 'attr' => array('class' => 'form-inline btn btn-large btn-success', 'style' => 'margin-top:2em;float:right;')));
  1406.             $this->servizi->RitornaFormCompletoRegistrazioneUtente($formBuilder, $request->getLocale());
  1407.         } else {
  1408.             $formBuilder = $formBuilder
  1409.                 ->add(Costanti::IO_DATA_SPEDIZIONE_RITIRO, TextType::class, array('required' => ($dataConsegnaObbligatoria == '1' ? true : false), 'label' => $traduci->OttieniElementoDizionario("carrello_data_spedizione_ritiro_richiesta", "carrello")->valoreUscita, 'attr' => array('class' => "form-control input-sm input-data", 'autocomplete' => 'off', 'style' => 'padding-left:5px;padding-right:5px;')))
  1410.                 ->add(Costanti::IO_RIFERIMENTO_ORDINE, TextType::class, array('required' => false, 'label' => $traduci->OttieniElementoDizionario("carrello_riferimento_ordine", "carrello")->valoreUscita, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')));
  1411.             if ($user->getUtenteComune() || $anagrafica) {
  1412.                 if($consentiAgentiModificaSpedizione || $user->getUtenteComune()) {
  1413.                     $formBuilder = $formBuilder
  1414.                         ->add(Costanti::IO_MODALITA_SPEDIZIONE, EntityType::class, array('required' => true, 'class' => 'App\Entity\ModalitaSpedizione', 'choice_label' => function ($modalita) {
  1415.                             return $modalita->getTestoDescrittivo();
  1416.                         }, 'label' => $traduci->OttieniElementoDizionario("carrello_modalita_spedizione", "carrello")->valoreUscita, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')));
  1417.                 }
  1418.                 if ($anagrafica){
  1419.                     if($consentiAgentiModificaPagamento) {
  1420.                         $formBuilder->add(Costanti::IO_PAGAMENTO, EntityType::class, array('required' => true, 'class' => 'App\Entity\Pagamenti', 'choice_label' => function ($pagamento) {
  1421.                             return $pagamento->getNome();
  1422.                         }, 'label' => $traduci->OttieniElementoDizionario("carrello_modalita_pagamento", "carrello")->valoreUscita, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')));
  1423.                         $arrayChiaviControllo = array_merge($arrayChiaviControllo, array('pagamento'));
  1424.                     }
  1425.                     $formBuilder = $formBuilder->add(Costanti::IO_NOTE_AZIENDALI, TextareaType::class, array('required' => false, 'label' => $traduci->OttieniElementoDizionario("carrello_note_aziendali", "carrello")->valoreUscita, 'attr' => array('class' => "form-control", 'rows' => '6', 'style' => 'padding-left:5px;padding-right:5px;')));
  1426.                 }else {
  1427.                     $formBuilder->add(Costanti::IO_MODALITA_PAGAMENTO, EntityType::class, array('required' => true, 'class' => 'App\Entity\ModalitaPagamento', 'choice_label' => function ($modalita) {
  1428.                         return $modalita->getTestoDescrittivo();
  1429.                     }, 'label' => $traduci->OttieniElementoDizionario("carrello_modalita_pagamento", "carrello")->valoreUscita, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')));
  1430.                     $arrayChiaviControllo = array_merge($arrayChiaviControllo, array('modalitaPagamento'));
  1431.                 }
  1432.                 $arrayChiaviControllo = array_merge($arrayChiaviControllo, array('modalitaSpedizione'));
  1433.             } else {
  1434.                 $formBuilder = $formBuilder
  1435.                     ->add(Costanti::IO_SPEDIZIONE_CONSEGNA, EntityType::class, array('required' => true, 'class' => 'App\Entity\AssociazioneSpedizioniClienti', 'query_builder' => function (EntityRepository $er) use ($user) {
  1436.                         return $er->createQueryBuilder('u')
  1437.                             ->where('u.azienda = :azienda')
  1438.                             ->leftJoin('u.spedizione', 'sped')
  1439.                             ->leftJoin('u.consegna', 'cons')->setParameter('azienda', $user->getId());
  1440.                     }, 'choice_label' => function ($sped) {
  1441.                         return $sped->getSpedizione()->getDescrizione() . ' - ' . $sped->getConsegna()->getDescrizione();
  1442.                     }, 'label' => $traduci->OttieniElementoDizionario("carrello_modalita_spedizione", "carrello")->valoreUscita, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')));
  1443.                 $arrayChiaviControllo = array_merge($arrayChiaviControllo, array('spedizioneConsegna'));
  1444.             }
  1445.             $formBuilder = $formBuilder
  1446.                 ->add(Costanti::IO_NOTE, TextareaType::class, array('required' => false, 'label' => $traduci->OttieniElementoDizionario("carrello_note", "carrello")->valoreUscita, 'attr' => array('class' => "form-control", 'rows' => '6', 'style' => 'padding-left:5px;padding-right:5px;')));
  1447.             if ($carrello && $carrello->getAnagrafica())
  1448.             {
  1449.                 /** @var AnagraficheIndirizzi[] $destinazioni */
  1450.                 $formBuilder = $formBuilder->add(Costanti::IO_DESTINAZIONI, EntityType::class, array('required' => false, 'class' => 'App\Entity\AnagraficheIndirizzi', 'label' => $traduci->OttieniElementoDizionario("carrello_destinazioni", "carrello")->valoreUscita, 'query_builder' => function (EntityRepository  $er) use ($carrello) {
  1451.                     return $er->createQueryBuilder('destinazioni')->where('destinazioni.codice = :cod')->setParameter('cod', $carrello->getAnagrafica()->getCodice());
  1452.                 },  'placeholder' => '', 'choice_label' => function ($destinazione, $key, $value) {
  1453.                     /** @var AnagraficheIndirizzi $destinazione */
  1454.                     return "(" . $destinazione->getTipoIndirizzo() . ") "
  1455.                         . $destinazione->getRagioneSociale() . " "
  1456.                         . $destinazione->getIndirizzo() . " - "
  1457.                         . $destinazione->getCitta() . " (" . $destinazione->getProvincia() . ") " . $destinazione->getCap() . " - "
  1458.                         . $destinazione->getNazione();
  1459.                 }, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')));
  1460.             }else{
  1461.                 $formBuilder = $formBuilder->add(Costanti::IO_DESTINAZIONI, EntityType::class, array('required' => false, 'class' => 'App\Entity\Destinazioni', 'label' => $traduci->OttieniElementoDizionario("carrello_destinazioni", "carrello")->valoreUscita, 'query_builder' => function (EntityRepository  $er) use ($user) {
  1462.                     return $er->createQueryBuilder('destinazioni')->where('destinazioni.azienda = :azie')->setParameter('azie', $user);
  1463.                 }, 'placeholder' => '' , 'choice_label' => function ($destinazione, $key, $value) {
  1464.                     /** @var Destinazioni $destinazione */
  1465.                     return "(" . $destinazione->getDenominazioneDestinazioneDiversa() . ") "
  1466.                         . $destinazione->getRagioneSociale() . " "
  1467.                         . $destinazione->getIndirizzo() . " - "
  1468.                         . $destinazione->getCitta() . " (" . $destinazione->getProvincia() . ")  " . $destinazione->getCap() . " - "
  1469.                         . $destinazione->getStato();
  1470.                 }, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')));
  1471.             }
  1472.             $formBuilder = $formBuilder->add(Costanti::IO_INVIO_ORDINE, SubmitType::class, array('label' => $traduci->OttieniElementoDizionario("carrello_completa_btn", "carrello")->valoreUscita, 'attr' => array('class' => 'form-inline btn btn-large btn-success', 'style' => 'margin-top:2em;float:right;')));
  1473.         }
  1474.         $formBuilder = $formBuilder->getForm();
  1475.         $formBuilder->handleRequest($request);
  1476.         /** @var User $utenteOrdine */
  1477.         $utenteOrdine = $this->servizi->OttieniUtenteCorrente();
  1478.         /** @var Destinazioni|AnagraficheIndirizzi $destinazioneOrdine */
  1479.         $destinazioneOrdine = null;
  1480.         /** @var ModalitaSpedizione $modalitaSpedizioneOrdine */
  1481.         $modalitaSpedizioneOrdine = null;
  1482.         /** @var ModalitaPagamento $modalitaPagamentoOrdine */
  1483.         $modalitaPagamentoOrdine = null;
  1484.         /** @var AssociazioneSpedizioniClienti $spedizioneConsegnaOrdine */
  1485.         $spedizioneConsegnaOrdine = null;
  1486.         /** @var Pagamenti $pagamentoAzienda */
  1487.         $pagamentoAzienda = null;
  1488.         /** @var \DateTime $dataSpedizioneOrdine */
  1489.         $dataSpedizioneOrdine = new \DateTime();
  1490.         $errori_validazione = array();
  1491.         $noteAziendali = '';
  1492.         $problemaUtenteGiaEsistente = false;
  1493.         if ($formBuilder->isSubmitted() && $formBuilder->isValid()) {
  1494.             foreach ($formBuilder as $key => $value) {
  1495.                 if ($formBuilder[$key]->getData() == "" && (in_array($key, $arrayChiaviControllo))) {
  1496.                     array_push($errori_validazione, $key);
  1497.                 }
  1498.             }
  1499.             if (count($errori_validazione) <= 0) {
  1500.                 $gestioneUtenti = $this->gestioneUtenti;
  1501.                 if (!$user) {
  1502.                     $utenteGiaEsistente = $this->servizi->doctrine->getRepository(User::class)->findOneBy(array(
  1503.                         'username' => strtolower($formBuilder[Costanti::RU_USERNAME]->getData())
  1504.                     ));
  1505.                     if(!$utenteGiaEsistente){
  1506.                         $utenteGiaEsistente = $this->servizi->doctrine->getRepository(User::class)->findOneBy(array(
  1507.                             'email' => strtolower($formBuilder[Costanti::RU_INDIRIZZO_MAIL]->getData())
  1508.                         ));
  1509.                     }
  1510.                     if (!$utenteGiaEsistente) {
  1511.                         $privato = $formBuilder[Costanti::RU_AZIENDA_O_PRIVATO]->getData() == "privato" ? true : false;
  1512.                         $ragioneSociale = $formBuilder[Costanti::RU_RAGIONE_SOCIALE]->getData();
  1513.                         if ($privato) {
  1514.                             $ragioneSociale = $formBuilder[Costanti::RU_NOME]->getData() . ' ' . $formBuilder[Costanti::RU_COGNOME]->getData();
  1515.                         }
  1516.                         $nuovoUtente = $gestioneUtenti->CreaUtente(
  1517.                             $ragioneSociale,
  1518.                             $formBuilder[Costanti::RU_NOME]->getData(),
  1519.                             $formBuilder[Costanti::RU_COGNOME]->getData(),
  1520.                             $formBuilder[Costanti::RU_INDIRIZZO_MAIL]->getData(),
  1521.                             $formBuilder[Costanti::RU_INDIRIZZO]->getData(),
  1522.                             $formBuilder[Costanti::RU_CITTA]->getData(),
  1523.                             $formBuilder[Costanti::RU_CAP]->getData(),
  1524.                             $formBuilder[Costanti::RU_PROVINCIA]->getData(),
  1525.                             ($formBuilder[Costanti::RU_STATO]->getData())->getDescrizione(),
  1526.                             $formBuilder[Costanti::RU_TELEFONO]->getData(),
  1527.                             $formBuilder[Costanti::RU_CODICE_FISCALE]->getData(),
  1528.                             $formBuilder[Costanti::RU_PARTITA_IVA]->getData(),
  1529.                             $formBuilder[Costanti::RU_PASSWORD]->getData(),
  1530.                             $formBuilder[Costanti::RU_USERNAME]->getData(),
  1531.                             $formBuilder[Costanti::RU_INDIRIZZO_PEC]->getData(),
  1532.                             $formBuilder[Costanti::RU_CODICE_DESTINATARIO_FATTURAZIONE_ELETTRONICA]->getData(),
  1533.                             $privato,
  1534.                             '',
  1535.                             null,
  1536.                             true
  1537.                         );
  1538.                         //Verifico se ci sono dei campi custom da inserire nel db
  1539.                         if (count($chiaviCampiCustom) > 0) {
  1540.                             $em = $this->servizi->doctrine->getManager();
  1541.                             foreach ($chiaviCampiCustom as $cmpCst) {
  1542.                                 $dettaglioCampoCustom = $this->servizi->RitornaDettaglioUserCampiCustom($cmpCst);
  1543.                                 $campo = $dettaglioCampoCustom->getCampo();
  1544.                                 if ($campo) {
  1545.                                     if ($formBuilder[$cmpCst]->getData() != '') {
  1546.                                         $campoCustom = new UserCampiCustomValori();
  1547.                                         $campoCustom->setDataCreazione(new \DateTime());
  1548.                                         $campoCustom->setDataModifica(new \DateTime());
  1549.                                         $campoCustom->setUser($nuovoUtente);
  1550.                                         $campoCustom->setTestata($dettaglioCampoCustom->getTestata());
  1551.                                         $campoCustom->setCampo($dettaglioCampoCustom->getCampo());
  1552.                                         $campoCustom->setUtenteModifica($this->servizi->OttieniUtenteCorrente());
  1553.                                         $campoCustom->setTipoDato($dettaglioCampoCustom->getCampo()->getTipoDato());
  1554.                                         $campoCustom->setTestoVisualizzato($dettaglioCampoCustom->getCampo()->getTestoVisualizzato());
  1555.                                         $campoCustom->setValore($formBuilder[$cmpCst]->getData());
  1556.                                         $em->persist($campoCustom);
  1557.                                     }
  1558.                                 }
  1559.                             }
  1560.                             $em->flush();
  1561.                         }
  1562.                         $utenteOrdine = $nuovoUtente; //Setto l'utente dell'ordine con l'utente appena creato
  1563.                         //effettuo automaticamente il login per il nuovo utente creato
  1564.                         $token = new UsernamePasswordToken($nuovoUtente,  'main', $nuovoUtente->getRoles());
  1565.                         $this->token->setToken($token);
  1566.                         $this->session->set('_security_main', serialize($token));
  1567.                         /** @var $destinazione Destinazioni */
  1568.                         $destinazione = null;
  1569.                         //Aggiungo la destinazione base
  1570.                         $destinazione = $gestioneUtenti->CreaDestinazione($nuovoUtente, $nuovoUtente->getRagioneSociale(), $nuovoUtente->getIndirizzo(), $nuovoUtente->getCitta(), $nuovoUtente->getProvincia(),
  1571.                             $nuovoUtente->getCap(), $nuovoUtente->getTelefono(), $nuovoUtente->getNazione(), $nuovoUtente->getEmail());
  1572.                         if ($formBuilder[Costanti::RU_DESTINAZIONE_DIVERSA]->getData() == true) {
  1573.                             $destinazione = $gestioneUtenti->CreaDestinazione($nuovoUtente, $formBuilder[Costanti::RU_DD_RAGIONE_SOCIALE]->getData(), $formBuilder[Costanti::RU_DD_INDIRIZZO]->getData(), $formBuilder[Costanti::RU_DD_CITTA]->getData(),
  1574.                                 $formBuilder[Costanti::RU_DD_PROVINCIA]->getData(), $formBuilder[Costanti::RU_DD_CAP]->getData(), $formBuilder[Costanti::RU_DD_TELEFONO]->getData(), ($formBuilder[Costanti::RU_DD_STATO]->getData() ? $formBuilder[Costanti::RU_DD_STATO]->getData()->getDescrizione() : ''),
  1575.                                 $formBuilder[Costanti::RU_DD_INDIRIZZO_MAIL]->getData(), $formBuilder[Costanti::RU_DD_CITTA]->getData());
  1576.                         }
  1577.                         $destinazioneOrdine = $destinazione;
  1578.                         $modalitaPagamentoOrdine = $formBuilder[Costanti::IO_MODALITA_PAGAMENTO]->getData();
  1579.                         $modalitaSpedizioneOrdine = $formBuilder[Costanti::IO_MODALITA_SPEDIZIONE]->getData();
  1580.                     } else {
  1581.                         $problemaUtenteGiaEsistente = true;
  1582.                     }
  1583.                 } else {
  1584.                     if ($utenteOrdine->getUtenteComune() || $anagrafica) {
  1585.                         $noteAziendali = $formBuilder[Costanti::IO_NOTE_AZIENDALI]->getData();
  1586.                         if ($consentiAgentiModificaSpedizione)
  1587.                             $modalitaSpedizioneOrdine = $formBuilder[Costanti::IO_MODALITA_SPEDIZIONE]->getData();
  1588.                         if ($anagrafica) {
  1589.                             if ($consentiAgentiModificaPagamento)
  1590.                                 $pagamentoAzienda = $formBuilder[Costanti::IO_PAGAMENTO]->getData();
  1591.                         } else {
  1592.                             $modalitaPagamentoOrdine = $formBuilder[Costanti::IO_MODALITA_PAGAMENTO]->getData();
  1593.                         }
  1594.                     } else {
  1595.                         $spedizioneConsegnaOrdine = $formBuilder[Costanti::IO_SPEDIZIONE_CONSEGNA]->getData();
  1596.                     }
  1597.                     $dataSpedizioneOrdine = \DateTime::createFromFormat("d/m/Y", $formBuilder[Costanti::IO_DATA_SPEDIZIONE_RITIRO]->getData());
  1598.                     $destinazioneOrdine = $formBuilder[Costanti::IO_DESTINAZIONI]->getData();
  1599.                 }
  1600.                 if (!$problemaUtenteGiaEsistente) {
  1601.                     $noteOrdine = $formBuilder[Costanti::IO_NOTE]->getData();
  1602.                     $riferimentoOrdine = $formBuilder[Costanti::IO_RIFERIMENTO_ORDINE]->getData();
  1603.                     $funzioniCarrello = new FunzioniCarrello($this->servizi->doctrine, $this->imp, $this->servizi);
  1604.                     /** @var RitornoConversioneCarrelloInOrdine $ritornoConversioneCarrelloOrdine */
  1605.                     $ritornoConversioneCarrelloOrdine = $funzioniCarrello->ConvertiCarrelloInOrdine($utenteOrdine, $carrello, $destinazioneOrdine, $modalitaSpedizioneOrdine, $modalitaPagamentoOrdine,
  1606.                         $spedizioneConsegnaOrdine, $dataSpedizioneOrdine, $riferimentoOrdine, $noteOrdine, $pagamentoAzienda, $request, $noteAziendali);
  1607.                     $ordine = $ritornoConversioneCarrelloOrdine->ordine;
  1608.                     $noteInvioOrdine = "";
  1609.                     foreach ($ritornoConversioneCarrelloOrdine->listaMessaggiConversione as $str) {
  1610.                         $noteInvioOrdine .= $str;
  1611.                     }
  1612.                     $inviaConfermaOrdine = $this->imp->ritornaImpostazioneDaNome("InviaConfermaOrdineCliente");
  1613.                     $inviaCopiaConfermaASede = $this->imp->ritornaImpostazioneDaNome("InviaCopiaConfermaOrdineClienteSede");
  1614.                     $nomeShop = $this->imp->ritornaImpostazioneDaNome("NomeShop");
  1615.                     $inviaConfermaAgente = $this->imp->ritornaImpostazioneDaNome('InviaConfermaOrdineAgente');
  1616.                     $translator = $traduci;
  1617.                     $translator->CaricaTraduzioniDaFamiglia("mail_nuovo_ordine", $request->getLocale());
  1618.                     $header = $translator->OttieniElementoDizionario("mail_nuovo_ordine_header", "mail_nuovo_ordine")->valoreUscita;
  1619.                     if ($inviaConfermaOrdine == 1 || $inviaConfermaAgente == 1) {
  1620.                         $mailFrom = $this->imp->ritornaImpostazioneDaNome("IndirizzoMailFromInvioComunicazioni");
  1621.                         $mailer = new Mailer($this->imp, $this->twig, $this->servizi);
  1622.                         $listaMailSecondarie = $this->servizi->doctrine->getRepository(MailSecondarieUtenti::class)->findBy(array('azienda' => $user, 'inviaConfermaOrdine' => true));
  1623.                         $adresses = array();
  1624.                         foreach ($listaMailSecondarie as $ms) {
  1625.                             array_push($adresses, $ms->getIndirizzoMail());
  1626.                         }
  1627.                         if($ordine->getAnagrafica()){
  1628.                             $elencoAltreMail = explode(';', $ordine->getAnagrafica()->getIndirizziMail());
  1629.                             foreach ($elencoAltreMail as $ml){
  1630.                                 if(!in_array($ml, $adresses)){
  1631.                                     array_push($adresses, $ml);
  1632.                                 }
  1633.                             }
  1634.                         }
  1635.                         $ordineFormattato = $ordine;
  1636.                         if ($ordine instanceof Ordini) {
  1637.                             $ordineFormattato = $recuperaDati->recuperaDettagliOrdine($ordine->getId(), $ordine->getUtente(), $request->getLocale(), false);
  1638.                         }
  1639.                         $mailToPrima = $anagrafica && count($adresses) ? $adresses[0] : $utenteOrdine->getEmail();
  1640.                         array_shift($adresses);
  1641.                         if ($inviaConfermaOrdine == 1) {
  1642.                             //INVIO MAIL A CLIENTE
  1643.                             $mailer->SendMail(
  1644.                                 $header . " " . $nomeShop,
  1645.                                 $this->renderView(
  1646.                                     'email/ordini/nuovo_ordine.html.twig',
  1647.                                     array(
  1648.                                         'ordine_inviato_azienda' => false,
  1649.                                         'ordine' => $ordineFormattato,
  1650.                                         'utente' => $user,
  1651.                                         'noteInvioOrdine' => $noteInvioOrdine,
  1652.                                     )
  1653.                                 ),
  1654.                                 $mailToPrima,
  1655.                                 $adresses,
  1656.                                 $mailFrom,
  1657.                                 "text/html",
  1658.                                 false,
  1659.                                 $this->servizi->OttieniUtenteCorrente());
  1660.                         }
  1661.                         if ($inviaCopiaConfermaASede == 1 || $inviaConfermaAgente == 1) {
  1662.                             $cc = array();
  1663.                             //Compongo l'header
  1664.                             $header2 = 'Nuovo ordine cliente WEB - ';
  1665.                             if($ordine->getAnagrafica()){
  1666.                                 $header2 .= ($ordine->getAnagrafica()->getCodice() . " - " . $ordine->getAnagrafica()->getRagioneSociale());
  1667.                             }else if ($ordine->getAzienda()){
  1668.                                 $header2 .= ($ordine->getAzienda()->getCodiceCliente() . " - " . $ordine->getAzienda()->getRagioneSociale());
  1669.                             }
  1670.                             if($inviaCopiaConfermaASede == 1) {
  1671.                                 //INVIO MAIL AZIENDA.
  1672.                                 $mailer->SendMail(
  1673.                                     $header2,
  1674.                                     $this->renderView(
  1675.                                         'email/ordini/nuovo_ordine.html.twig',
  1676.                                         array(
  1677.                                             'ordine_inviato_azienda' => true,
  1678.                                             'ordine' => $ordineFormattato,
  1679.                                             'user' => $user,
  1680.                                             'utente' => $user,
  1681.                                             'noteInvioOrdine' => $noteInvioOrdine,
  1682.                                         )
  1683.                                     ),
  1684.                                     $mailFrom,
  1685.                                     $cc,
  1686.                                     $mailFrom,
  1687.                                     "text/html",
  1688.                                     false,
  1689.                                     $this->servizi->OttieniUtenteCorrente());
  1690.                             }
  1691.                             if ($inviaConfermaAgente == 1){
  1692.                                 $cc = array();
  1693.                                 $mailAgente = "";
  1694.                                 if($ordine->getAgente() && $ordine->getAgente()->getEmail() != '')
  1695.                                     $mailAgente = $ordine->getAgente()->getEmail();
  1696.                                 //INVIO MAIL AZIENDA.
  1697.                                 $mailer->SendMail(
  1698.                                     $header2,
  1699.                                     $this->renderView(
  1700.                                         'email/ordini/nuovo_ordine.html.twig',
  1701.                                         array(
  1702.                                             'ordine_inviato_azienda' => true,
  1703.                                             'ordine' => $ordineFormattato,
  1704.                                             'user' => $user,
  1705.                                             'utente' => $user,
  1706.                                             'noteInvioOrdine' => $noteInvioOrdine,
  1707.                                         )
  1708.                                     ),
  1709.                                     $mailAgente,
  1710.                                     $cc,
  1711.                                     $mailFrom,
  1712.                                     "text/html",
  1713.                                     false,
  1714.                                     $this->servizi->OttieniUtenteCorrente());
  1715.                             }
  1716.                         }
  1717.                     }
  1718.                     if ($modalitaPagamentoOrdine && $modalitaPagamentoOrdine->getServizioPagamentoAutomatico() != '') {
  1719.                         return $this->redirectToRoute('checkout_ordine', array('id_ordine' => $ordine->getId()));
  1720.                     } else {
  1721.                         $this->addFlash(
  1722.                             'notice',
  1723.                             $traduci->OttieniElementoDizionario('carrello_ordine_inserito', 'carrello')->valoreUscita
  1724.                         );
  1725.                         return $this->redirectToRoute('dettagli_storico', array('id' => $ordine->getId()));
  1726.                     }
  1727.                 } else {
  1728.                     $this->addFlash(
  1729.                         'error',
  1730.                         $traduci->OttieniElementoDizionario('carrello_errore_mail_o_user_in_uso', 'carrello')->valoreUscita
  1731.                     );
  1732.                 }
  1733.             }
  1734.         }
  1735.         /** @var $destinazioni Destinazioni[] */
  1736.         $destinazioni = $this->servizi->doctrine->getRepository(Destinazioni::class)->findBy(array('azienda' => $user));
  1737.         return $this->render('ZZ_front_end/carrello/carrello_finalizza.html.twig', array(
  1738.             Costanti::T_CARRELLO => $carrelloEntita,
  1739.             Costanti::T_RIGHE_CARRELLO => $carrelloEntita->righe,
  1740.             'carrelloEntita' => $carrelloEntita,
  1741.             'completato' => false,
  1742.             'checkout' => 1,
  1743.             'anagrafica' => $anagrafica,
  1744.             'user' => $user,
  1745.             Costanti::IO_DESTINAZIONI => $destinazioni,
  1746.             Costanti::IO_RADICE_FORM => $formBuilder->createView(),
  1747.             'errori_validazione' => $errori_validazione,
  1748.             'campiCustomUser' => $chiaviCampiCustom,
  1749.             Costanti::T_LISTA_CATEGORIE => $listaCategorie,
  1750.             Costanti::T_LISTA_CATEGORIE_CHIAVI_PARENT => $listaCategorieChiaviParent,
  1751.             'consentiModificaPagamento' => $consentiAgentiModificaPagamento,
  1752.             'consentiModificaSpedizione' => $consentiAgentiModificaSpedizione,
  1753.             Costanti::ID_MODALITA_PAGAMENTO_SELEZIONATA => ($carrello->getModalitaPagamento() ? $carrello->getModalitaPagamento()->getId() : ''),
  1754.             Costanti::ID_MODALITA_SPEDIZIONE_SELEZIONATA => ($carrello->getModalitaSpedizione() ? $carrello->getModalitaSpedizione()->getId() : '')
  1755.         ));
  1756.     }
  1757. }