src/Controller/ServiziController.php line 1695

  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\AlberoMenuProdotti;
  4. use App\Entity\Anagrafiche;
  5. use App\Entity\Articoli;
  6. use App\Entity\AssociazioneCategorieAlberoMappaCategorieArticoli;
  7. use App\Entity\AssociazioneCodiciAgentiUtente;
  8. use App\Entity\BarcodeArticoli;
  9. use App\Entity\Categorie;
  10. use App\Entity\CategorieAlbero;
  11. use App\Entity\CouponDettaglio;
  12. use App\Entity\Lingue;
  13. use App\Entity\MagazzinoSecondarioDisponibilita;
  14. use App\Entity\MappaCategorieArticoli;
  15. use App\Entity\NascondiEsauritiSuMarca;
  16. use App\Entity\Report;
  17. use Doctrine\ORM\Query\Expr;
  18. use App\Entity\Offerte;
  19. use App\Entity\Ordini;
  20. use App\Entity\OrdiniRighe;
  21. use App\Entity\PagineEComponenti;
  22. use App\Entity\PermessiAccessoUtenti;
  23. use App\Entity\RegistroMail;
  24. use App\Entity\RigheCarrello;
  25. use App\Entity\RisorseAnagrafiche;
  26. use App\Entity\RisorseAnagraficheColonneValori;
  27. use App\Entity\ScontiAnagrafiche;
  28. use App\Entity\TipologiePreimpostate;
  29. use App\Entity\TipoOrdine;
  30. use App\Entity\UserCampiCustomDettaglio;
  31. use App\Entity\UserCampiCustomTestata;
  32. use App\Entity\Varianti;
  33. use App\Model\Carrello\RitornoCalcoloPrezzoNetto;
  34. use App\Model\ContenitoreCategoriePerFiltri;
  35. use App\Model\Costanti;
  36. use App\Model\Coupon\RitornoValiditaCoupon;
  37. use App\Model\DizionarioDatabase;
  38. use App\Model\Entita\AlberoCategorie;
  39. use App\Model\Entita\AltriDatiUtente;
  40. use App\Model\Entita\Articolo;
  41. use App\Model\Entita\Carrello;
  42. use App\Model\Entita\MappaCategoriaArticolo;
  43. use App\Model\Entita\Offerta;
  44. use App\Model\Entita\OffertaRiga;
  45. use App\Model\Entita\Ordine;
  46. use App\Model\Entita\OrdineRiga;
  47. use App\Model\Entita\RigaCarrello;
  48. use App\Model\Entita\Sconti;
  49. use App\Model\Entita\Variante;
  50. use App\Model\RecuperoDati;
  51. use App\Model\SubstringWithFind;
  52. use App\Model\Templating\RitornoBreadCrumb;
  53. use App\Model\Templating\RitornoButton;
  54. use App\Model\Templating\RitornoCalcoloDisponibile;
  55. use App\Model\Templating\RitornoDaMoltiplicatoreLayout;
  56. use App\Model\Templating\RitornoElementiBase;
  57. use App\Model\Templating\RitornoElementoDizionario;
  58. use App\Model\Templating\Templating;
  59. use App\Model\Templating\VerificatoreMatchForm;
  60. use App\Model\Translating\RitornoTradotto;
  61. use App\Model\Translating\Translating;
  62. use Carbon\Carbon;
  63. use App\Entity\User;
  64. use phpDocumentor\Reflection\Types\Self_;
  65. use Psr\Log\LoggerInterface;
  66. use Random\RandomException;
  67. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  68. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  69. use Doctrine\Persistence\ManagerRegistry;
  70. use App\Entity\Nazioni;
  71. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  72. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  73. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  74. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  75. use Symfony\Component\Form\Extension\Core\Type\PasswordType;
  76. use Symfony\Component\Form\Extension\Core\Type\TextType;
  77. use Symfony\Component\Form\FormBuilderInterface;
  78. use Symfony\Component\HttpFoundation\Request;
  79. use Symfony\Component\HttpFoundation\RequestStack;
  80. use Symfony\Component\Routing\Router;
  81. use Symfony\Component\Routing\RouterInterface;
  82. use Symfony\Bundle\SecurityBundle\Security;
  83. use Symfony\Component\Security\Core\User\UserInterface;
  84. use Twig\Environment;
  85. /**
  86.  * Class ServiziController
  87.  * @package App\Controller
  88.  */
  89. class ServiziController extends AbstractController
  90. {
  91.     public $doctrine;
  92.     public $logger;
  93.     public $twig;
  94.     /** @var RouterInterface $router */
  95.     public $router;
  96.     /** @var Translating $translating */
  97.     public $translating;
  98.     /** @var ReturnImpostazioniServiceController $impostazioni */
  99.     public $impostazioni;
  100.     /** @var RequestStack $requestStack */
  101.     public $requestStack;
  102.     /** @var Security $security */
  103.     public $security;
  104.     /** @var ParameterBagInterface */
  105.     public $parameterBag;
  106.     public $locale = 'it';
  107.     /** @var RecuperoDati */
  108.     public $recuperoDati;
  109.     // TEMPLATING
  110.     public $imageNotFound = null;
  111.     public function __construct(ManagerRegistry $registry, LoggerInterface $_logger, Environment $_twig, Translating $_translating, RouterInterface $_router, ReturnImpostazioniServiceController $_impostazioni, RequestStack $_requestStack, Security $_security, ParameterBagInterface $_parameterBag)
  112.     {
  113.         $this->doctrine = $registry;
  114.         $this->logger = $_logger;
  115.         $this->twig = $_twig;
  116.         $this->router = $_router;
  117.         $this->translating = $_translating;
  118.         $this->impostazioni = $_impostazioni;
  119.         $this->requestStack = $_requestStack;
  120.         $this->parameterBag = $_parameterBag;
  121.         $this->security = $_security;
  122.         $this->recuperoDati = new RecuperoDati($registry, $_impostazioni, $this);
  123.         return $this;
  124.     }
  125.     /**
  126.      * @param $collezione
  127.      * @return string
  128.      * NON FUNZIONA
  129.      */
  130.     public function generaTabellaHtmlDaCollezioneDiOggetti($collezione){
  131.         $stringa = "";
  132.         if (count($collezione) > 0){
  133.             $ar = get_object_vars($collezione[0]);
  134.             $stringa .= "<table class='table table-striped'>";
  135.             $stringa .= "<tr>";
  136.             foreach (array_keys($ar) as $key ) {
  137.                 $stringa .= ("<th>" . $key . "</th>");
  138.             }
  139.             $stringa .= "</tr>";
  140.             foreach($collezione as $i){
  141.                 $dati = get_object_vars($i);
  142.                 $stringa .= "<tr>";
  143.                 foreach(array_keys($dati) as $dt){
  144.                     $stringa .= ("<td>" . ($dati[$dt] instanceof \Closure ? "" : strval($dati[$dt])) . '</td>');
  145.                 }
  146.                 $stringa .= "</tr>";
  147.             }
  148.             $stringa .= "</table>";
  149.         }
  150.         return $stringa;
  151.     }
  152.     /**
  153.      * @param $ip
  154.      * @return bool
  155.      */
  156.     public function verificaSeIpAutorizzatoChiamateImportExport($ip){
  157.         $this->impostazioni->caricaCacheImpostazioniDaNomi(['IpAbilitatiChiamateExpImp']);
  158.         $elencoIp = [];
  159.         try{
  160.             $el = $this->impostazioni->ritornaImpostazioneDaNome('IpAbilitatiChiamateExpImp');
  161.             if($el == ''){
  162.                 return true;
  163.             }
  164.             if(strpos($el, ',') !== false){
  165.                 $elencoIp = explode(',', $el);
  166.             }else{
  167.                 $elencoIp = [$el];
  168.             }
  169.         }catch (\Exception $ex){
  170.         }
  171.         return in_array($ip, $elencoIp);
  172.     }
  173.     /**
  174.      * @param $idOrdine
  175.      * @return int|mixed
  176.      */
  177.     public function OttieniQtaArticoliOrdinatiDaOrdine($idOrdine){
  178.         $ritorno = 0;
  179.         $con = $this->doctrine->getConnection();
  180.         $stmt = $con->prepare("SELECT SUM(quantita) as 'qta' FROM ordini_righe WHERE ordine_id = :id");
  181.         $stmt->bindParam("id", $idOrdine);
  182.         $rst = $stmt->executeQuery();
  183.         $ris = $rst->fetchAllAssociative();
  184.         if(count($ris) > 0){
  185.             $ritorno = $ris[0]['qta'];
  186.         }
  187.         return $ritorno;
  188.     }
  189.     /**
  190.      * @param $idCarrello
  191.      * @return int|mixed
  192.      */
  193.     public function OttieniQtaArticoliOrdinatiDaCarrello($idCarrello){
  194.         $ritorno = 0;
  195.         $con = $this->doctrine->getConnection();
  196.         $stmt = $con->prepare("SELECT SUM(quantita) as 'qta' FROM righe_carrello WHERE carrello_id = :id");
  197.         $stmt->bindParam("id", $idCarrello);
  198.         $rst = $stmt->executeQuery();
  199.         $ris = $rst->fetchAllAssociative();
  200.         if(count($ris) > 0){
  201.             $ritorno = $ris[0]['qta'];
  202.         }
  203.         return $ritorno;
  204.     }
  205.     /**
  206.      * @param $role
  207.      * @return bool
  208.      */
  209.     public function checkRole($role){
  210.         try {
  211.             if ($this->security->isGranted($role)) {
  212.                 return true;
  213.             } else {
  214.                 return false;
  215.             }
  216.         }catch (\Exception $ex){
  217.             return false;
  218.         }
  219.     }
  220.     /**
  221.      * @param $chiave
  222.      * @return mixed
  223.      */
  224.     public function OttieniParametro($chiave){
  225.         return $this->parameterBag->get($chiave);
  226.     }
  227.     /**
  228.      * @param int $length
  229.      * @return string
  230.      */
  231.     function randomString($length = 6) {
  232.         $str = "";
  233.         $characters = array_merge(range('A','Z'), range('a','z'), range('0','9'));
  234.         $max = count($characters) - 1;
  235.         for ($i = 0; $i < $length; $i++) {
  236.             $rand = mt_rand(0, $max);
  237.             $str .= $characters[$rand];
  238.         }
  239.         return $str;
  240.     }
  241.     /**
  242.      * @param string $codiceAnagrafica
  243.      * @param MappaCategoriaArticolo $mappa
  244.      * @param null|Variante $variante
  245.      */
  246.     public function RitornaScontiAnagrafica($codiceAnagrafica, $mappa, $variante = null) {
  247.         /** @var ScontiAnagrafiche[] $ritorno */
  248.         $ritorno = []; //Cumulo di tutti gli sconti
  249.         //Prima estraggo sconti anagrafica
  250.         $scontiAnagrafica = $this->doctrine->getRepository(ScontiAnagrafiche::class)->createQueryBuilder('sconti')
  251.             ->where("sconti.codiceAnagrafica = :codA AND sconti.codiceArticolo = '' AND sconti.codiceVariante = '' AND (sconti.codiceGruppoCategorie = '' OR sconti.codiceGruppoCategorie IS NULL) ")->setParameter('codA', $codiceAnagrafica)
  252.             ->getQuery()->getResult();
  253.         if(count($scontiAnagrafica) > 0){
  254.             $ritorno = array_merge($ritorno, $scontiAnagrafica);
  255.         }
  256.         $codiceVariante = '';
  257.         if($variante != null) {
  258.             $codiceVariante = ltrim(str_replace($mappa->articolo->codice, '', $variante->codiceVariante));
  259.         }
  260.         //Verifico le combinazioni partendo dalla più restrittiva
  261.         $sc = $this->doctrine->getRepository(ScontiAnagrafiche::class)->createQueryBuilder('sconti')
  262.             ->where("sconti.codiceAnagrafica = :codA AND sconti.codiceArticolo = :codArt AND sconti.codiceVariante = :codVar AND (sconti.codiceGruppoCategorie = '' OR sconti.codiceGruppoCategorie IS NULL)")
  263.             ->setParameter('codA', $codiceAnagrafica)->setParameter('codArt', $mappa->articolo->codice)->setParameter('codVar', $codiceVariante)
  264.             ->getQuery()->getResult();
  265.         if(!count($sc) > 0){
  266.             //Verifico combinazione codice articolo - variante
  267.             $scArtVar = $this->doctrine->getRepository(ScontiAnagrafiche::class)->createQueryBuilder('sconti')
  268.                 ->where("sconti.codiceArticolo = :codArt AND sconti.codiceVariante = :codVar AND (sconti.codiceAnagrafica = '' OR sconti.codiceAnagrafica IS NULL) AND (sconti.codiceGruppoCategorie = '' OR sconti.codiceGruppoCategorie IS NULL)")
  269.                 ->setParameter('codArt', $mappa->articolo->codice)->setParameter('codVar', $codiceVariante)
  270.                 ->getQuery()->getResult();
  271.             if(!count($scArtVar) > 0){
  272.                 //Verifico combinazione codice articolo
  273.                 $scArt = $this->doctrine->getRepository(ScontiAnagrafiche::class)->createQueryBuilder('sconti')
  274.                     ->where("sconti.codiceArticolo = :codArt AND (sconti.codiceVariante = '' OR sconti.codiceVariante IS NULL) AND (sconti.codiceAnagrafica = '' OR sconti.codiceAnagrafica IS NULL) AND (sconti.codiceGruppoCategorie = '' OR sconti.codiceGruppoCategorie IS NULL) ")
  275.                     ->setParameter('codArt', $mappa->articolo->codice)
  276.                     ->getQuery()->getResult();
  277.                 if(count($scArtVar) > 0)
  278.                     $ritorno = array_merge($ritorno, $scArt);
  279.             }else{
  280.                 $ritorno = array_merge($ritorno, $scArtVar);
  281.             }
  282.         }else{
  283.             $ritorno = array_merge($ritorno, $sc);
  284.         }
  285.         if($this->impostazioni->ritornaImpostazioneDaNome('AbilitaScontisticheDaGruppoCategorieArticoli') == '1') {
  286.             //Estraggo scontistiche su codice gruppo categorie
  287.             $scontiCodiceGruppoCategorie = $this->doctrine->getRepository(ScontiAnagrafiche::class)->createQueryBuilder('sconti')
  288.                 ->where('sconti.codiceGruppoCategorie = :codGrCat AND sconti.codiceAnagrafica = :codA')
  289.                 ->setParameter('codA', $codiceAnagrafica)->setParameter('codGrCat', $mappa->codiceGruppoCategorie)
  290.                 ->getQuery()->getResult();
  291.             switch ($this->impostazioni->ritornaImpostazioneDaNome('ModalitaApplicazioneScontisticheDaGruppoCategorieArticoli')){
  292.                 case "Solo se non ci sono sconti":{
  293.                     if (count($ritorno) <= 0){
  294.                         $ritorno = array_merge($ritorno, $scontiCodiceGruppoCategorie);
  295.                     }
  296.                     break;
  297.                 }
  298.                 case "Applica sempre":{
  299.                     if (count($scontiCodiceGruppoCategorie) > 0) {
  300.                         $ritorno = array_merge($ritorno, $scontiCodiceGruppoCategorie);
  301.                     }
  302.                     break;
  303.                 }
  304.             }
  305.         }
  306.         if($this->impostazioni->ritornaImpostazioneDaNome('AbilitaScontisticheDaGruppoArticoli') == '1') {
  307.             //Estraggo scontistiche su codice gruppo articoli
  308.             $scontiCodiceGruppoArticoli = $this->doctrine->getRepository(ScontiAnagrafiche::class)->createQueryBuilder('sconti')
  309.                 ->where('sconti.codiceGruppoArticoli = :codGrCat AND sconti.codiceAnagrafica = :codA')
  310.                 ->setParameter('codA', $codiceAnagrafica)->setParameter('codGrCat', $mappa->articolo->codiceGruppoArticoli)
  311.                 ->getQuery()->getResult();
  312.             switch ($this->impostazioni->ritornaImpostazioneDaNome('ModalitaApplicazioneScontisticheDaGruppoArticoli')){
  313.                 case "Solo se non ci sono sconti":{
  314.                     if (count($ritorno) <= 0){
  315.                         $ritorno = array_merge($ritorno, $scontiCodiceGruppoArticoli);
  316.                     }
  317.                     break;
  318.                 }
  319.                 case "Applica sempre":{
  320.                     if (count($scontiCodiceGruppoArticoli) > 0) {
  321.                         $ritorno = array_merge($ritorno, $scontiCodiceGruppoArticoli);
  322.                     }
  323.                     break;
  324.                 }
  325.             }
  326.         }
  327.         return $ritorno;
  328.     }
  329.     /**
  330.      * @param string $coda
  331.      * @return string
  332.      * //Se coda è diverso da '' vuol dire che devo accodare qualcosa quindi verifico se inizia con / se vero lo rimuovo perchè già presente
  333.      */
  334.     public function RitornaPathBase($coda = ''){
  335.         $pathFileBase = $this->impostazioni->ritornaImpostazioneDaNome('PathFileBaseScambioDati');
  336.         if (!$this->endsWith($pathFileBase, DIRECTORY_SEPARATOR))
  337.             $pathFileBase .= DIRECTORY_SEPARATOR;
  338.         $pathFileBase .= ('OUT' . DIRECTORY_SEPARATOR);
  339.         if($coda != ''){
  340.             if(substr($coda, 0, 1) == DIRECTORY_SEPARATOR){
  341.                 $coda = substr($coda, 1, strlen($coda) - 1);
  342.             }
  343.             $pathFileBase .= $coda;
  344.         }
  345.         return $pathFileBase;
  346.     }
  347.     /**
  348.      * @param $haystack
  349.      * @param $needle
  350.      * @return bool
  351.      */
  352.     function endsWith($haystack, $needle)
  353.     {
  354.         $length = strlen($needle);
  355.         if ($length == 0) {
  356.             return true;
  357.         }
  358.         return (substr($haystack, -$length) === $needle);
  359.     }
  360.     /**
  361.      * @param $haystack
  362.      * @param $needle
  363.      * @return bool
  364.      */
  365.     function startsWith($haystack, $needle)
  366.     {
  367.         $length = strlen($needle);
  368.         return (substr($haystack, 0, $length) === $needle);
  369.     }
  370.     /**
  371.      * @return UserInterface
  372.      */
  373.     public function OttieniUtenteCorrente(){
  374.         return $this->security->getUser();
  375.     }
  376.     /**
  377.      * @param $nomeUnivoco
  378.      * @param string $locale
  379.      * @return mixed|null
  380.      */
  381.     public function RitornaIdCategoriaDaNomeUnivoco($nomeUnivoco, $locale = ''){
  382.         $usaCategorieAlbero = $this->impostazioni->ritornaImpostazioneDaNome('UtilizzaCategorieAlberoPerGenerazione');
  383.         $sql = '';
  384.         if($usaCategorieAlbero == '1'){
  385.             $sql = 'SELECT categorie_albero.id as identificativo FROM categorie_albero
  386.                     LEFT JOIN categorie_albero_in_lingua cil on categorie_albero.id = cil.categoria_albero_id AND cil.locale = ?
  387.                     WHERE (categorie_albero.nome_univoco = ? OR cil.nome_univoco = ?) AND categorie_albero.attivo = 1 LIMIT 1';
  388.         }else {
  389.             $sql = 'SELECT categorie.id as identificativo FROM categorie 
  390.                     LEFT JOIN categorie_in_lingua cil on categorie.id = cil.categoria_id AND cil.locale = ?
  391.                     WHERE (categorie.nome_univoco = ? OR cil.nome_univoco = ?) AND categorie.attivo = 1 LIMIT 1';
  392.         }
  393.         $stmt = $this->doctrine->getConnection()->prepare($sql);
  394.         $stmt->bindValue(1, $locale);
  395.         $stmt->bindValue(2, $nomeUnivoco);
  396.         $stmt->bindValue(3, $nomeUnivoco);
  397.         $rst = $stmt->executeQuery();
  398.         $risultati = $rst->fetchAllAssociative();
  399.         if(count($risultati) > 0){
  400.             return $risultati[0]['identificativo'];
  401.         }
  402.         return null;
  403.     }
  404.     /**
  405.      * @return string
  406.      */
  407.     public function OttieniLocale(){
  408.         return $this->requestStack->getCurrentRequest()->getLocale();
  409.     }
  410.     /**
  411.      * @param $username
  412.      * @param $email
  413.      * @return bool
  414.      */
  415.     public function VerificaEsistenzaUsernameOEmail($username, $email){
  416.         $esistenza = false;
  417.         $user = $this->doctrine->getRepository(User::class)->findBy(['username' => $username]);
  418.         if($user && count($user) > 0){
  419.             $esistenza = true;
  420.         }else{
  421.             $mail = $this->doctrine->getRepository(User::class)->findBy(['email' => $email]);
  422.             if($mail && count($mail) > 0){
  423.                 $esistenza = true;
  424.             }
  425.         }
  426.         return $esistenza;
  427.     }
  428.     /**
  429.      * @return Report[]
  430.      */
  431.     public function OttieniElencoReport(){
  432.         $report = $this->doctrine->getRepository(Report::class)->createQueryBuilder('report');
  433.         /** @var User $utenteAttuale */
  434.         $utenteAttuale = $this->OttieniUtenteCorrente();
  435.         if ($utenteAttuale->getAgente() && !$this->isGranted('ROLE_ADMIN')) {
  436.             $report = $report->andWhere("report.livelloPermesso LIKE '%AGENTE%'")
  437.                 ->andWhere("report.codiceCliente IS NULL OR report.codiceCliente = '' ")
  438.                 ->andWhere('report.agente = :ag')->setParameter('ag', $utenteAttuale->getCodiceCliente());
  439.         }
  440.         if ($utenteAttuale->getCommerciale() && !$this->isGranted('ROLE_ADMIN')) {
  441.             $report = $report->andWhere("report.livelloPermesso LIKE '%COMMERCIALE%'")
  442.                 ->andWhere("report.codiceCliente IS NULL OR report.codiceCliente = '' ")
  443.                 ->andWhere('report.agente = :ag')->setParameter('ag', $utenteAttuale->getCodiceCliente());
  444.         }
  445.         if (!$utenteAttuale->getAgente() && !$utenteAttuale->getCommerciale() && !$this->isGranted('ROLE_ADMIN')) {
  446.             $report = $report->andWhere("report.livelloPermesso LIKE '%UTENTE%' AND report.livelloPermesso IS NOT NULL")
  447.                 ->andWhere("report.codiceCliente = :codCli")->setParameter('codCli', $utenteAttuale->getCodiceCliente());
  448.         }
  449.         if ($this->isGranted('ROLE_ADMIN')) {
  450.             $report = $report->andWhere("report.livelloPermesso LIKE '%AMMINISTRATORE%' OR report.livelloPermesso IS NULL OR report.livelloPermesso = ''")
  451.                 ->andWhere("report.codiceCliente IS NULL OR report.codiceCliente = '' ");
  452.         }
  453.         /** @var Report[] $report */
  454.         $rpt = $report->getQuery()->getResult();
  455.         return $rpt;
  456.     }
  457.     /**
  458.      * @param Request $request
  459.      * @return string|null
  460.      */
  461.     public function getRefererRoute(Request $request)
  462.     {
  463.         $referer = $request->headers->get('referer');
  464.         if ($referer == NULL) {
  465.             $url = $this->router->generate('homepage');
  466.         } else {
  467.             $url = $referer;
  468.         }
  469.         return $url;
  470.     }
  471.     /**
  472.      * @param $mappa
  473.      * @return string
  474.      */
  475.     public function creaCodiceIdMappaPerDettaglioProdotto($mappa){
  476.         if ($mappa instanceof MappaCategorieArticoli){
  477.             return $mappa->getId() . '-' . $mappa->getArticolo()->getCodice();
  478.         } else if ($mappa instanceof MappaCategoriaArticolo){
  479.             return $mappa->id . '-' . $mappa->articolo->codice;
  480.         } else if ($mappa instanceof RigaCarrello){
  481.             return $mappa->mappaCategoriaArticolo->id . '-' . $mappa->mappaCategoriaArticolo->articolo->codice;
  482.         } else if ($mappa instanceof RigheCarrello){
  483.             return $mappa->getMappaCategorieArticoli()->getId() . '-' . $mappa->getMappaCategorieArticoli()->getArticolo()->getCodice();
  484.         } else if ($mappa instanceof OrdineRiga){
  485.             return $mappa->mappaCategoriaArticolo->id . '-' . $mappa->mappaCategoriaArticolo->articolo->codice;
  486.         } else if ($mappa instanceof OrdiniRighe){
  487.             return $mappa->getMappaCategorieArticoli()->getId() . '-' . $mappa->getMappaCategorieArticoli()->getArticolo()->getCodice();
  488.         } else{
  489.             return '-';
  490.         }
  491.     }
  492.     /**
  493.      * @param $costante
  494.      * @return mixed
  495.      */
  496.     public function RitornaCostante($costante){
  497.         return Costanti::ritornaCostante($costante);
  498.     }
  499.     /**
  500.      * @return AltriDatiUtente|null
  501.      */
  502.     public function RitornaAltriDatiUtente(){
  503.         return AltriDatiUtente::CreaDaUtente(self::OttieniUtenteCorrente());
  504.     }
  505.     /**
  506.      * @return Anagrafiche|null
  507.      */
  508.     public function RitornaAnagraficaCollegataUtente(){
  509.         /** @var User $user */
  510.         $user = self::OttieniUtenteCorrente();
  511.         if($user) {
  512.             $anagraficaUtente = $this->doctrine->getRepository(Anagrafiche::class)->findOneBy(array('codice' => $user->getCodiceCliente()));
  513.             return $anagraficaUtente;
  514.         }else{
  515.             return null;
  516.         }
  517.     }
  518.     /**
  519.      * @return TipoOrdine|object|null
  520.      */
  521.     public function RitornaTipoOrdineAttuale(){
  522.         if($this->impostazioni->ritornaImpostazioneDaNome('AbilitaTipoOrdine') == '1') {
  523.             $dat = self::RitornaAltriDatiUtente();
  524.             return self::RitornaTipoOrdine($dat->tipoOrdine);
  525.         }else{
  526.             return null;
  527.         }
  528.     }
  529.     /**
  530.      * @param $id
  531.      * @return TipoOrdine|object|null
  532.      */
  533.     public function RitornaTipoOrdine($id){
  534.         if($id && $id != null && $id != '') {
  535.             return $this->doctrine->getRepository(TipoOrdine::class)->find($id);
  536.         }else{
  537.             return null;
  538.         }
  539.     }
  540.     /**
  541.      * @param $codiceEsito string
  542.      * @param $successo boolean
  543.      * @param $oggetto string
  544.      * @param $contenuto string
  545.      * @param $da string
  546.      * @param $a string
  547.      * @param null $utente
  548.      * @param string $messaggioSupplementare
  549.      * @param string $cc
  550.      * @param string $ccn
  551.      */
  552.     public function InserisciRegistroMail($successo, $oggetto, $contenuto, $da, $a, $utente = null, $log = '', $messaggioSupplementare = '', $cc = '', $ccn = '', $contentType = ''){
  553.         try {
  554.             $rm = new RegistroMail();
  555.             $rm->setUtente($utente);
  556.             $rm->setDataInvio(new \DateTime());
  557.             $rm->setLog($log);
  558.             $rm->setSuccesso($successo);
  559.             $rm->setOggetto($oggetto);
  560.             $rm->setMessaggioSupplementare($messaggioSupplementare);
  561.             $rm->setContenuto($contenuto);
  562.             $rm->setDa($da);
  563.             $rm->setA($a);
  564.             $rm->setContentType($contentType);
  565.             $rm->setCc($cc);
  566.             $rm->setCcn($ccn);
  567.             $em = $this->doctrine->getManager();
  568.             $em->persist($rm);
  569.             $em->flush();
  570.         }catch (\Exception $ex){
  571.             $this->DebuggaException($ex);
  572.         }
  573.     }
  574.     public static function OttieniCodiceGruppoCategorieDaMappa(MappaCategorieArticoli $mappa){
  575.         $ritorno = "";
  576.         if($mappa->getCategoria1()){
  577.             $ritorno .= $mappa->getCategoria1()->getCodice();
  578.         }
  579.         if($mappa->getCategoria2()){
  580.             $ritorno .= $mappa->getCategoria2()->getCodice();
  581.         }
  582.         if($mappa->getCategoria3()){
  583.             $ritorno .= $mappa->getCategoria3()->getCodice();
  584.         }
  585.         if($mappa->getCategoria4()){
  586.             $ritorno .= $mappa->getCategoria4()->getCodice();
  587.         }
  588.         if($mappa->getCategoria5()){
  589.             $ritorno .= $mappa->getCategoria5()->getCodice();
  590.         }
  591.         return $ritorno;
  592.     }
  593.     public static function convertiInNumero($valore, $ritorna0SeVuoto = false){
  594.         $rit = $valore;
  595.         if ($rit == ''){
  596.             if($ritorna0SeVuoto)
  597.                 $rit = 0;
  598.             else
  599.                 $rit = null;
  600.         }
  601.         if ($rit)
  602.             $rit = str_replace(',', '.', $rit);
  603.         return $rit;
  604.     }
  605.     public static function convertiInBoolean($valore, $ritornaFalseSeVuoto = false){
  606.         $rit = null;
  607.         if(strtolower($valore) == 'true' || $valore == '1' || $valore == 1){
  608.             $rit = true;
  609.         }
  610.         elseif (strtolower($valore) == 'false' || $valore = '0' || $valore == 0){
  611.             $rit = false;
  612.         } else {
  613.             if ($ritornaFalseSeVuoto) {
  614.                 $rit = false;
  615.             } else {
  616.                 $rit = null;
  617.             }
  618.         }
  619.         return $rit;
  620.     }
  621.     public static function convertiInDatetime($valore, $conOra = false, $format = 'd/m/Y'){
  622.         $rit = null;
  623.         try {
  624.             $rit = \DateTime::createFromFormat($format, $valore);
  625.             if (!$conOra) {
  626.                 $rit->setTime(0, 0, 0);
  627.             }
  628.         }catch (\Exception $ex){
  629.         }
  630.         return $rit;
  631.     }
  632.     /**
  633.      * @param $barcode
  634.      * @param bool $ritornoJson
  635.      * @return MappaCategoriaArticolo
  636.      */
  637.     public function ritornaJsonArticoloDaBarcode($barcode, bool $ritornoJson = false){
  638.         $ritorno = null;
  639.         $risultato = $this->doctrine->getRepository(BarcodeArticoli::class)
  640.             ->createQueryBuilder('barcode_articoli')
  641.             ->leftJoin('barcode_articoli.mappaCategoriaArticoli', 'mappa')
  642.             ->leftJoin('mappa.articolo', 'articolo')
  643.             ->where('barcode_articoli.barcode = :brcd')->setParameter('brcd', $barcode)
  644.             ->setMaxResults(1)
  645.             ->getQuery()->getResult();
  646.         if(count($risultato) > 0){
  647.             /** @var BarcodeArticoli $brc */
  648.             $brc = $risultato[0];
  649.             $mappa = null;
  650.             if ($brc->getMappaCategoriaArticoli())
  651.                 $mappa = MappaCategoriaArticolo::CreaDaEntitaDoctrine($this->doctrine, $this, '', $brc->getMappaCategoriaArticoli(), $this->OttieniUtenteCorrente());
  652.             $ritorno = $mappa;
  653.         }
  654.         if($ritornoJson) {
  655.             $ritorno = json_encode($ritorno);
  656.         }
  657.         return $ritorno;
  658.     }
  659.     /**
  660.      * @param User $agente
  661.      * @return array
  662.      */
  663.     public function ritornaArrayCodiciAssociatiAgenteFornitoreUtente(User $agente, $aggiungiApici = false, $fornitore = false): array
  664.     {
  665.         $arrayCodici = array();
  666.         $db = $this->doctrine->getRepository(AssociazioneCodiciAgentiUtente::class)->createQueryBuilder('ass')
  667.             ->where('ass.utente = :utente')->setParameter('utente', $agente);
  668.         if(!$fornitore){
  669.             $db = $db->andWhere('ass.tipo = :tp OR ass.tipo IS NULL')->setParameter('tp', 'AGENTE');
  670.         } else{
  671.             $db = $db->andWhere('ass.tipo = :tp')->setParameter('tp', 'FORNITORE');
  672.         }
  673.         $db = $db->getQuery()->getResult();
  674.         /** @var AssociazioneCodiciAgentiUtente $itm */
  675.         foreach ($db as $itm){
  676.             array_push($arrayCodici, $aggiungiApici ? ("'" . $itm->getCodice() . "'") : $itm->getCodice());
  677.         }
  678.         return $arrayCodici;
  679.     }
  680.     public function aggiungiApiciAdArrayString($elenco){
  681.         $ritorno = array();
  682.         foreach ($elenco as $item){
  683.             array_push($ritorno, "'" . $item . "'");
  684.         }
  685.         return $ritorno;
  686.     }
  687.     /**
  688.      * @return array
  689.      */
  690.     public function ritornaArrayMarcheDaNascondereSeNonDisponibili(){
  691.         $arrayCodici = array();
  692.         /** @var NascondiEsauritiSuMarca[] $db */
  693.         $db = $this->doctrine->getRepository(NascondiEsauritiSuMarca::class)->findAll();
  694.         /** @var NascondiEsauritiSuMarca $itm */
  695.         foreach ($db as $itm){
  696.             if($itm->getAttivo())
  697.                 array_push($arrayCodici, "'" . $itm->getMarca() . "'");
  698.         }
  699.         return $arrayCodici;
  700.     }
  701.     /**
  702.      * @param $link
  703.      * @return false|string
  704.      */
  705.     public function estraiIdMappaDaLink($link){
  706.         $pos = strpos($link, '-');
  707.         return substr($link, 0, $pos);
  708.     }
  709.     /**
  710.      * @param Categorie $categoria
  711.      * @param Request $request
  712.      * @param $user
  713.      * @return void
  714.      */
  715.     public function inserisciStatisticaNavigazioneCategoria(Categorie $categoria, Request $request, $user){
  716.         try{
  717.             $conn = $this->doctrine->getConnection();
  718.             $sql = "INSERT INTO statistiche_categorie (categoria_id, azienda_id, data, indirizzo_ip, nome, codice, user_agent) VALUES (?, ?, NOW(), ?, ?, ?, ?);";
  719.             $stmt = $conn->prepare($sql);
  720.             $stmt->bindValue(1, $categoria->getId());
  721.             $stmt->bindValue(2, $user ? $user->getId() : null);
  722.             $stmt->bindValue(3, $request->getClientIp());
  723.             $stmt->bindValue(4, $categoria->getNome());
  724.             $stmt->bindValue(5, $categoria->getCodice());
  725.             $stmt->bindValue(6, $request->headers->get('User-Agent'));
  726.             $stmt->execute();
  727.         } catch (\Exception $ex){
  728.             $this->DebuggaException($ex, 'Errore inserimento statistica navigazione categoria');
  729.         }
  730.     }
  731.     /**
  732.      * @return TipoOrdine[]
  733.      */
  734.     public function RitornaTipiOrdine(): array
  735.     {
  736.         /** @var TipoOrdine[] $ritorno */
  737.         $ritorno = $this->doctrine->getRepository(TipoOrdine::class)->createQueryBuilder('tipoOrdine')
  738.             ->orderBy('tipoOrdine.testoVisualizzato')
  739.             ->getQuery()->getResult();
  740.         return $ritorno;
  741.     }
  742.     /**
  743.      * @param User $user
  744.      * @param string $ambito
  745.      * @param string $dettaglio
  746.      * @param bool $forzaInserimento
  747.      */
  748.     public function ScriviRegistroAttivitaUtente($user, $ambito, $dettaglio, $forzaInserimento = false)
  749.     {
  750.         try {
  751.             if(true) {
  752.                 $conn = $this->doctrine->getConnection();
  753.                 $sql = "INSERT INTO registro_attivita_utenti(user_id, role, ragione_sociale, data, ambito, dettaglio) VALUES(?,?,?,NOW(),?,?);";
  754.                 $stmt = $conn->prepare($sql);
  755.                 $stmt->bindValue(1, $user != null ? $user->getId() : null);
  756.                 $stmt->bindValue(2, $user != null ? print_r($user->getRoles(), true) : null);
  757.                 $stmt->bindValue(3, $user != null ? $user->getRagioneSociale() : null);
  758.                 $stmt->bindValue(4, $ambito);
  759.                 $stmt->bindValue(5, $dettaglio);
  760.                 $stmt->execute();
  761.             }
  762.         }catch (PDOException $ex){
  763.             $this->logger->critical("Errore inserimento registro attività utente --- " . $ambito . ' -- ' . $dettaglio . "-EXC:" . $ex->getMessage() . "Trace: " . $ex->getTraceAsString());
  764.         }catch (\Exception $ex){
  765.             $this->logger->critical("Errore inserimento registro attività utente --- " . $ambito . ' -- ' . $dettaglio . "-EXC:" . $ex->getMessage() . "Trace: " . $ex->getTraceAsString());
  766.         }
  767.     }
  768.     /**
  769.      * @param $lenght
  770.      * @return string
  771.      * @throws RandomException
  772.      */
  773.     public function randomString2($lenght = 10): string
  774.     {
  775.         return bin2hex(random_bytes($lenght));
  776.     }
  777.     /**
  778.      * @param $ip string
  779.      * @param $debug string
  780.      * @param $esito boolean
  781.      * @param $messaggio string
  782.      * @param $utente User
  783.      */
  784.     public function ScriviRegistroAttivita($ip, $debug, $esito, $messaggio, $utente, $collegamento="", $categoria1="", $categoria2="")
  785.     {
  786.         try {
  787.             $conn = $this->doctrine->getConnection();
  788.             $sql = "INSERT INTO registro_attivita(utente_id, data, esito, messaggio, client_ip, debug, collegamento, categoria1, categoria2) VALUES(?,NOW(),?,?,?,?,?,?,?);";
  789.             $stmt = $conn->prepare($sql);
  790.             $stmt->bindValue(1, $utente != null ? $utente->getId() : null);
  791.             $stmt->bindValue(2, $esito ? 1 : 0);
  792.             $stmt->bindValue(3, $messaggio);
  793.             $stmt->bindValue(4, $ip);
  794.             $stmt->bindValue(5, $debug);
  795.             $stmt->bindValue(6, $collegamento);
  796.             $stmt->bindValue(7, $categoria1);
  797.             $stmt->bindValue(8, $categoria2);
  798.             $stmt->execute();
  799.         }catch (PDOException $ex){
  800.             $this->logger->critical("Errore inserimento registro attività --- " . $messaggio . "-EXC:" . $ex->getMessage() . "Trace: " . $ex->getTraceAsString());
  801.         }catch (\Exception $ex){
  802.             $this->logger->critical("Errore inserimento registro attività --- " . $messaggio . "-EXC:" . $ex->getMessage() . "Trace: " . $ex->getTraceAsString());
  803.         }
  804.     }
  805.     public function DebuggaException(\Exception $ex, $messaggioIniziale = '', $ritornaStringa = false, $utente = null, $collegamento="", $categoria1="", $categoria2=""){
  806.         $this->logger->error($messaggioIniziale . ' Eccezzione: ' . $ex->getMessage() . '<br/>Riga: ' . $ex->getLine() . '<br/>File: ' . $ex->getFile() . '<br/>Trace: ' . $ex->getTraceAsString());
  807.         $this->ScriviRegistroAttivita('', '', false, $messaggioIniziale . ' Eccezzione: ' . $ex->getMessage() . '<br/>Riga: ' . $ex->getLine() . '<br/>File: ' . $ex->getFile() . '<br/>Trace: ' . $ex->getTraceAsString(), $utente, $collegamento, $categoria1, $categoria2);
  808.         if($ritornaStringa){
  809.             return $messaggioIniziale . ' Eccezzione: ' . $ex->getMessage() . '<br/>Riga: ' . $ex->getLine() . '<br/>File: ' . $ex->getFile() . '<br/>Trace: ' . $ex->getTraceAsString();
  810.         }
  811.         return true;
  812.     }
  813.     public function ScriviLogDebug($messaggio){
  814.         if ($this->logger){
  815.             $this->logger->debug($messaggio);
  816.         }
  817.     }
  818.     /**
  819.      * @param Request $request
  820.      * @param $codiceAnagrafica
  821.      * @param false $soloVisibiliAlCliente
  822.      * @param string $cat1
  823.      * @param string $cat2
  824.      * @param string $cat3
  825.      * @param string $cat4
  826.      * @param string $cat5
  827.      * @param string $articolo
  828.      * @param string $marca
  829.      * @param string $codDim1
  830.      * @param string $codDim2
  831.      * @param string $codDim3
  832.      * @param string $codDim4
  833.      * @param string $codDim5
  834.      * @return array
  835.      */
  836.     public function ritornaRisorseAnagrafiche(Request $request, $codiceAnagrafica = "", $soloVisibiliAlCliente = false, $cat1 = '', $cat2 = '', $cat3 = '', $cat4 = '', $cat5 = '', $articolo = '', $marca = '', $codDim1 = '', $codDim2 = '', $codDim3 = '', $codDim4 = '', $codDim5 = '' ){
  837.         /** @var RisorseAnagrafiche[] $risorse */
  838.         $risorse = $this->doctrine->getRepository(RisorseAnagrafiche::class)->createQueryBuilder('risorse_anagrafiche')
  839.             ->where("risorse_anagrafiche.codiceAnagrafica = :anagrafica")->setParameter('anagrafica', $codiceAnagrafica)
  840.             ->andWhere('risorse_anagrafiche.categoria = :cat')->setParameter('cat', $request->get('categoria'))
  841.             ->andWhere("risorse_anagrafiche.codiceCategoria1 = :cat1")->setParameter('cat1', $cat1)
  842.             ->andWhere('risorse_anagrafiche.codiceCategoria2 = :cat2')->setParameter('cat2', $cat2)
  843.             ->andWhere('risorse_anagrafiche.codiceCategoria3 = :cat3')->setParameter('cat3', $cat3)
  844.             ->andWhere('risorse_anagrafiche.codiceCategoria4 = :cat4')->setParameter('cat4', $cat4)
  845.             ->andWhere('risorse_anagrafiche.codiceCategoria5 = :cat5')->setParameter('cat5', $cat5)
  846.             ->andWhere('risorse_anagrafiche.codiceArticolo = :art')->setParameter('art', $articolo)
  847.             ->andWhere('risorse_anagrafiche.marca = :marca')->setParameter('marca', $marca)
  848.             ->andWhere('risorse_anagrafiche.codiceDimensione1 = :dim1')->setParameter('dim1', $codDim1)
  849.             ->andWhere('risorse_anagrafiche.codiceDimensione2 = :dim2')->setParameter('dim2', $codDim2)
  850.             ->andWhere('risorse_anagrafiche.codiceDimensione3 = :dim3')->setParameter('dim3', $codDim3)
  851.             ->andWhere('risorse_anagrafiche.codiceDimensione4 = :dim4')->setParameter('dim4', $codDim4)
  852.             ->andWhere('risorse_anagrafiche.codiceDimensione5 = :dim5')->setParameter('dim5', $codDim5);
  853.         if($soloVisibiliAlCliente){
  854.             $risorse = $risorse->andWhere('risorse_anagrafiche.visibileAlCliente = 1');
  855.         }
  856.         $risorse = $risorse->orderBy('risorse_anagrafiche.dataRisorsa', 'DESC')->getQuery()->getResult();
  857.         $ritorno = array();
  858.         $sorting = array();
  859.         $colonne = array(
  860.             array(
  861.                 'title' => 'idRisorsa',
  862.                 'field' => 'idRisorsa',
  863.                 'visible' => false
  864.             ),
  865.         );
  866.         $getCol = true;
  867.         if(count($risorse) > 0){
  868.             foreach ($risorse as $r){
  869.                 $arrTemp = array(
  870.                     'idRisorsa' => $r->getId(),
  871.                 );
  872.                 $arrTempCol = array();
  873.                 /** @var RisorseAnagraficheColonneValori[] $campi */
  874.                 $campi = $r->getDettaglioCampi();
  875.                 foreach ($campi as $dettaglio){
  876.                     if($getCol){
  877.                         $arrTempCol['title'] = $dettaglio->getColonna()->getHeaderVisualizzato();
  878.                         $arrTempCol['field'] = $dettaglio->getNomeColonna();
  879.                         if($dettaglio->getColonna()->getOrdinazioneOrdinamento()){ //è presente l'ordinamento
  880.                             $sorting[$dettaglio->getColonna()->getOrdinazioneOrdinamento()] = array(
  881.                                 'field' => $dettaglio->getNomeColonna(),
  882.                                 'direction' => $dettaglio->getColonna()->getDirezioneOrdinamento() == 'desc' ? 'desc' : 'asc',
  883.                             );
  884.                         }
  885.                     }
  886.                     switch ($dettaglio->getColonna()->getTipoDato()){
  887.                         case 'text':{
  888.                             if($getCol){
  889.                                 $arrTempCol['sorter'] = 'text';
  890.                                 $arrTempCol['headerFilter'] = 'input';
  891.                             }
  892.                             $arrTemp[$dettaglio->getNomeColonna()] = $dettaglio->getValore();
  893.                             break;
  894.                         }
  895.                         case 'integer':{
  896.                             if($getCol){
  897.                                 $arrTempCol['align'] = 'right';
  898.                                 $arrTempCol['sorter'] = 'number';
  899.                                 $arrTempCol['headerFilter'] = 'number';
  900.                             }
  901.                             $arrTemp[$dettaglio->getNomeColonna()] = $dettaglio->getValoreInteger();
  902.                             break;
  903.                         }
  904.                         case 'decimal':{
  905.                             if($getCol){
  906.                                 $arrTempCol['align'] = 'right';
  907.                                 $arrTempCol['sorter'] = 'number';
  908.                                 $arrTempCol['headerFilter'] = 'number';
  909.                             }
  910.                             $arrTemp[$dettaglio->getNomeColonna()] = $dettaglio->getValoreDecimale();
  911.                             break;
  912.                         }
  913.                         case 'boolean':{
  914.                             if($getCol){
  915.                                 $arrTempCol['align'] = 'center';
  916.                                 $arrTempCol['sorter'] = 'boolean';
  917.                                 $arrTempCol['headerFilter'] = 'checkbox';
  918.                             }
  919.                             $arrTemp[$dettaglio->getNomeColonna()] = $dettaglio->getValoreBoolean();
  920.                             break;
  921.                         }
  922.                         case 'datetime':
  923.                         case 'date':
  924.                         case 'time':{
  925.                             if($getCol){
  926.                                 $arrTempCol['sorter'] = 'date';
  927.                                 $arrTempCol['headerFilter'] = 'input';
  928.                             }
  929.                             if($dettaglio->getColonna()->getTipoDato() == 'datetime'){
  930.                                 $arrTemp[$dettaglio->getNomeColonna()] = $dettaglio->getValoreDatetime()->format('d/m/Y H:i:s');
  931.                             }else if ($dettaglio->getColonna()->getTipoDato() == 'date'){
  932.                                 $arrTemp[$dettaglio->getNomeColonna()] = $dettaglio->getValoreDatetime()->format('d/m/Y');
  933.                             }else if ($dettaglio->getColonna()->getTipoDato() == 'time'){
  934.                                 $arrTemp[$dettaglio->getNomeColonna()] = $dettaglio->getValoreDatetime()->format('H:i:s');
  935.                             }
  936.                             break;
  937.                         }
  938.                     }
  939.                     if($getCol){
  940.                         array_push($colonne, $arrTempCol);
  941.                     }
  942.                 }
  943.                 if($getCol){
  944.                     $getCol = false;
  945.                 }
  946.                 array_push($ritorno, $arrTemp);
  947.             }
  948.         }
  949.         ksort($sorting, SORT_NUMERIC); //Ordino in base alle chiavi che sono le posizioni di ordinamento
  950.         return array(
  951.             'data' => $ritorno,
  952.             'colonne' => $colonne,
  953.             'sorting' => $sorting,
  954.         );
  955.     }
  956.     public function ritornaPathRisorse(){
  957.         $pathBaseRisorse = $this->impostazioni->ritornaImpostazioneDaNome('PathRecuperoRisorse');
  958.         if (!$this->endsWith($pathBaseRisorse, DIRECTORY_SEPARATOR))
  959.             $pathBaseRisorse .= DIRECTORY_SEPARATOR;
  960.         return $pathBaseRisorse;
  961.     }
  962.     public function ritornaPathBaseScambioDati(){
  963.         $pathBaseRisorse = $this->impostazioni->ritornaImpostazioneDaNome('PathFileBaseScambioDati');
  964.         if (!$this->endsWith($pathBaseRisorse, DIRECTORY_SEPARATOR))
  965.             $pathBaseRisorse .= DIRECTORY_SEPARATOR;
  966.         return $pathBaseRisorse;
  967.     }
  968.     public function ritornaTempFolderPath(){
  969.         $ret = sys_get_temp_dir();
  970.         if(!$this->endsWith($ret, DIRECTORY_SEPARATOR))
  971.             $ret = $ret . DIRECTORY_SEPARATOR;
  972.         return $ret;
  973.     }
  974.     /** @return array */
  975.     public function pagineEComponentiRitornaTipiPagina(){
  976.         return Templating::PagineEComponentiRitornaTipiPagina();
  977.     }
  978.     /** @return array */
  979.     public function ritonaTipiPaginaMetaTags(){
  980.         return Templating::RitornaTipiPaginaPerMetaTag();
  981.     }
  982.     /** @return Articoli
  983.      *  @param $codiceArticolo string
  984.      */
  985.     function ritornaArticoloSeInserito($codiceArticolo, $codiceMacroCategoria=null)
  986.     {
  987.         if($codiceMacroCategoria){
  988.             $repo = $this->doctrine->getRepository(Articoli::class)->findBy(array('codice' => $codiceArticolo, 'macroCategoria' => $codiceMacroCategoria));
  989.         }else{
  990.             $repo = $this->doctrine->getRepository(Articoli::class)->findBy(array('codice' => $codiceArticolo));
  991.         }
  992.         if (count($repo) > 0)
  993.             return $repo[0];
  994.         else
  995.             return null;
  996.     }
  997.     /** @return Categorie
  998.      * @param $codiceCategoria string
  999.      */
  1000.     function ritornaCategoriaSeInserita($codiceCategoria, $colonnaProvenienza)
  1001.     {
  1002.         $repo = $this->doctrine->getRepository(Categorie::class)->findBy(['codice' => $codiceCategoria, 'colonnaProvenienza' => $colonnaProvenienza]);
  1003.         if (count($repo) > 0)
  1004.             return $repo[0];
  1005.         else
  1006.             return null;
  1007.     }
  1008.     /** @return CategorieAlbero
  1009.      * @param $codiceCategoriaAlbero string
  1010.      */
  1011.     function ritornaCategoriaAlberoSeInserita($codiceCategoriaAlbero, $livello)
  1012.     {
  1013.         $repo = $this->doctrine->getRepository(CategorieAlbero::class)->findBy(['codice' => $codiceCategoriaAlbero, 'colonnaProvenienza' => $livello]);
  1014.         if (count($repo) > 0)
  1015.             return $repo[0];
  1016.         else
  1017.             return null;
  1018.     }
  1019.     /**
  1020.      * @param User|UserInterface $agente
  1021.      * @param Ordini $ordine
  1022.      * @return bool
  1023.      */
  1024.     function VerificaAssociazioneOrdineAgente(User|UserInterface $agente, Ordini $ordine){
  1025.         $ritorno = false;
  1026.         $codiciAgente = self::ritornaArrayCodiciAssociatiAgenteFornitoreUtente($agente);
  1027.         if($ordine->getAgente() == $agente && in_array($ordine->getAnagrafica()->getCodiceAgente(), $codiciAgente)){
  1028.             $ritorno = true;
  1029.         }
  1030.         return $ritorno;
  1031.     }
  1032.     /**
  1033.      * @param $idTipologiaPreimpostata
  1034.      * @return TipologiePreimpostate|null
  1035.      */
  1036.     public function ritornaTipologiaPreimpostataDaId($idTipologiaPreimpostata){
  1037.         /** @var TipologiePreimpostate[] $tip */
  1038.         $tip = $this->doctrine->getRepository(TipologiePreimpostate::class)->createQueryBuilder('tipologie_preimpostate')
  1039.             ->leftJoin('tipologie_preimpostate.lista', 'lista')
  1040.             ->where('tipologie_preimpostate.id = :i')->setParameter('i', $idTipologiaPreimpostata)
  1041.             ->getQuery()->getResult();
  1042.         if (count($tip) > 0){
  1043.             $tip = $tip[0];
  1044.         }
  1045.         /** @var $tip TipologiePreimpostate */
  1046.         return $tip;
  1047.     }
  1048.     /** @return MappaCategorieArticoli
  1049.      * @param $articolo Articoli|Articolo
  1050.      * @param $cat1 Categorie
  1051.      * @param $cat2 Categorie
  1052.      * @param $cat3 Categorie
  1053.      * @param $cat4 Categorie
  1054.      * @param $cat5 Categorie
  1055.      * @param $marca string
  1056.      */
  1057.     function ritornaMappaCategoriaArticoliSeInserita($articolo, $cat1, $cat2, $cat3, $cat4, $marca, $cat5 = null)
  1058.     {
  1059.         $repo = $this->doctrine->getRepository(MappaCategorieArticoli::class);
  1060.         $idArticolo = '';
  1061.         if($articolo instanceof Articoli)
  1062.             $idArticolo = $articolo->getId();
  1063.         else if ($articolo instanceof Articolo)
  1064.             $idArticolo = $articolo->id;
  1065.         $qb = $repo->createQueryBuilder('mappa_categorie_articoli')->select()
  1066.             ->where('mappa_categorie_articoli.articolo = :articolo')
  1067.             ->setParameter('articolo', $idArticolo);
  1068.         if ($cat1 != null)
  1069.             $qb->andWhere('mappa_categorie_articoli.categoria1 = :cat1')->setParameter('cat1', $cat1->getId());
  1070.         if ($cat2 != null)
  1071.             $qb->andWhere('mappa_categorie_articoli.categoria2 = :cat2')->setParameter('cat2', $cat2->getId());
  1072.         if ($cat3 != null)
  1073.             $qb->andWhere('mappa_categorie_articoli.categoria3 = :cat3')->setParameter('cat3', $cat3->getId());
  1074.         if ($cat4 != null)
  1075.             $qb->andWhere('mappa_categorie_articoli.categoria4 = :cat4')->setParameter('cat4', $cat4->getId());
  1076.         if ($cat5 != null)
  1077.             $qb->andWhere('mappa_categorie_articoli.categoria5 = :cat5')->setParameter('cat5', $cat5->getId());
  1078.         if ($marca != null)
  1079.             $qb->andWhere('mappa_categorie_articoli.marca = :marca')->setParameter('marca', $marca);
  1080.         $res = $qb->getQuery()->getResult();
  1081.         if (count($res) > 0)
  1082.             return $res[0];
  1083.         else
  1084.             return null;
  1085.     }
  1086.     /** @param $mappaCatArt MappaCategorieArticoli
  1087.      * @param CategorieAlbero$cat1
  1088.      * @param $cat2 CategorieAlbero
  1089.      * @param $cat3 CategorieAlbero
  1090.      * @param $cat4 CategorieAlbero
  1091.      * @param $cat5 CategorieAlbero
  1092.      * @param CategorieAlbero $cat6
  1093.      * @param $cat7 CategorieAlbero
  1094.      * @param $cat8 CategorieAlbero
  1095.      * @param $cat9 CategorieAlbero
  1096.      * @param $cat10 CategorieAlbero
  1097.      *@return AssociazioneCategorieAlberoMappaCategorieArticoli
  1098.      */
  1099.     function ritornaAssociazioneCategorieAlberoMappaCategoriaArticoliSeInserita($mappaCatArt, $cat1, $cat2, $cat3, $cat4, $cat5 = null, $cat6 = null, $cat7 = null, $cat8 = null, $cat9 = null, $cat10 = null)
  1100.     {
  1101.         $repo = $this->doctrine->getRepository(AssociazioneCategorieAlberoMappaCategorieArticoli::class);
  1102.         $qb = $repo->createQueryBuilder('associazione_categorie_albero_mappa_categorie_articoli')
  1103.             ->leftJoin('associazione_categorie_albero_mappa_categorie_articoli.categoriaAlbero1', 'cat1')
  1104.             ->leftJoin('associazione_categorie_albero_mappa_categorie_articoli.categoriaAlbero2', 'cat2')
  1105.             ->leftJoin('associazione_categorie_albero_mappa_categorie_articoli.categoriaAlbero3', 'cat3')
  1106.             ->leftJoin('associazione_categorie_albero_mappa_categorie_articoli.categoriaAlbero4', 'cat4')
  1107.             ->leftJoin('associazione_categorie_albero_mappa_categorie_articoli.categoriaAlbero5', 'cat5')
  1108.             ->leftJoin('associazione_categorie_albero_mappa_categorie_articoli.categoriaAlbero6', 'cat6')
  1109.             ->leftJoin('associazione_categorie_albero_mappa_categorie_articoli.categoriaAlbero7', 'cat7')
  1110.             ->leftJoin('associazione_categorie_albero_mappa_categorie_articoli.categoriaAlbero8', 'cat8')
  1111.             ->leftJoin('associazione_categorie_albero_mappa_categorie_articoli.categoriaAlbero9', 'cat9')
  1112.             ->leftJoin('associazione_categorie_albero_mappa_categorie_articoli.categoriaAlbero10', 'cat10')
  1113.             ->where('associazione_categorie_albero_mappa_categorie_articoli.mappaCategoriaArticolo = :mappa')
  1114.             ->setParameter(":mappa", $mappaCatArt);
  1115.         if ($cat1 != null)
  1116.             $qb->andWhere('cat1.id = :ct1')->setParameter('ct1', $cat1->getId());
  1117.         if ($cat2 != null)
  1118.             $qb->andWhere('cat2.id = :ct2')->setParameter('ct2', $cat2->getId());
  1119.         if ($cat3 != null)
  1120.             $qb->andWhere('cat3.id = :ct3')->setParameter('ct3', $cat3->getId());
  1121.         if ($cat4 != null)
  1122.             $qb->andWhere('cat4.id = :ct4')->setParameter('ct4', $cat4->getId());
  1123.         if ($cat5 != null)
  1124.             $qb->andWhere('cat5.id = :ct5')->setParameter('ct5', $cat5->getId());
  1125.         if ($cat6 != null)
  1126.             $qb->andWhere('cat6.id = :ct6')->setParameter('ct6', $cat6->getId());
  1127.         if ($cat7 != null)
  1128.             $qb->andWhere('cat7.id = :ct7')->setParameter('ct7', $cat7->getId());
  1129.         if ($cat8 != null)
  1130.             $qb->andWhere('cat8.id = :ct8')->setParameter('ct8', $cat8->getId());
  1131.         if ($cat9 != null)
  1132.             $qb->andWhere('cat9.id = :ct9')->setParameter('ct9', $cat9->getId());
  1133.         if ($cat10 != null)
  1134.             $qb->andWhere('cat10.id = :ct10')->setParameter('ct10', $cat10->getId());
  1135.         $res = $qb->getQuery()->getResult();
  1136.         if (count($res) > 0)
  1137.             return $res[0];
  1138.         else
  1139.             return null;
  1140.     }
  1141.     /**
  1142.      * @param $tipoPagina
  1143.      * @param $valoriSupporto
  1144.      * @return string|null
  1145.      */
  1146.     public function ritornaDefaultLayoutPagineEComponenti($tipoPagina, $valoriSupporto, $soloForm = false){
  1147.         return Templating::ritornaDefaultLayoutPagineEComponenti($tipoPagina, $valoriSupporto, $this->twig, $soloForm);
  1148.     }
  1149.     /**
  1150.      *  @param $tipoPagina string
  1151.      *  @return string
  1152.      */
  1153.     public function pagineEComponentiRitornaNomeDaValoreTipoPagina($tipoPagina){
  1154.         $arr = $this->pagineEComponentiRitornaTipiPagina();
  1155.         foreach ($arr as $key => $value){
  1156.             if ($value == $tipoPagina)
  1157.                 return $key;
  1158.         }
  1159.         return "";
  1160.     }
  1161.     /**
  1162.      * @param Ordine|Carrello $ordine
  1163.      * @return array|null
  1164.      */
  1165.     public function creaArrayRaggruppatoPerVariantiVisualizzazioneOrizzontaleOrdineCarrello($ordine){
  1166.         $arrayDivisioneArticoli = array(); // {
  1167.         //   codiceArticolo : { articolo : (classeArticolo), divisioneHeaderRiga : [ arrayDi->divisioneHeaderRiga ] },
  1168.         //   articoliSenzaVarianti : [ righe ]
  1169.         // }
  1170.         $arrayDivisioneHeaderRiga = array(); // { headerRiga : [ arrayDivisioneInColonne ] }
  1171.         $arrayDivisioneInColonne = array(); // { codiceVariante5 : [ righe ]} codiceVariante5 è il codice dell'ultima variante da inserire in colonna usata come chiave
  1172.         //VARIABILI ESAME
  1173.         $esameCodiceArticolo = '';
  1174.         $classeArticoloEsame = null;
  1175.         $arrayTemporaneHeaderRiga = array();
  1176.         $esameHeaderRiga = '';
  1177.         $arrayTemporaneoDivisioneIncolonne = array();
  1178.         $arrayTemporaneoSchemaVariantiDisponibiliArticolo = array();
  1179.         $codiceDimensione5Inserita = array();
  1180.         $listaRigheSenzaVarianti = array();
  1181.         $this->logger->info("Conteggio righe ordine: " . count($ordine->righe));
  1182.         foreach ($ordine->righe as $riga) {
  1183.             $this->logger->info("Array raggruppato varianti 1: Codice variante: " . $riga->codiceVariante);
  1184.             $trovataVariante = true;
  1185.             if ($riga->variante == null || $riga->variante->id == '') {
  1186.                 array_push($listaRigheSenzaVarianti, $riga);
  1187.                 $trovataVariante = false;
  1188.             }
  1189.             $this->logger->info("Valore di -trovata variante- : " . ($trovataVariante ? 'True' : 'False'));
  1190.             if($trovataVariante) {
  1191.                 if ($esameCodiceArticolo == '' || $esameCodiceArticolo != $riga->mappaCategoriaArticolo->articolo->codice) {
  1192.                     if ($esameCodiceArticolo != '') {
  1193.                         $arrayTemporaneHeaderRiga[$esameHeaderRiga] = $arrayTemporaneoDivisioneIncolonne;
  1194.                         $arrayDivisioneArticoli['articoliConVarianti'][$esameCodiceArticolo] = array(
  1195.                             'articolo' => $classeArticoloEsame,
  1196.                             'divisioneHeaderRiga' => $arrayTemporaneHeaderRiga,
  1197.                             'schemaVariantiDisponibili' => $arrayTemporaneoSchemaVariantiDisponibiliArticolo
  1198.                         );
  1199.                     }
  1200.                     $classeArticoloEsame = $riga->mappaCategoriaArticolo->articolo;
  1201.                     $esameCodiceArticolo = $riga->mappaCategoriaArticolo->articolo->codice;
  1202.                     $this->logger->info("Esame codice articolo: " . $esameCodiceArticolo);
  1203.                     $arrayTemporaneHeaderRiga = array();
  1204.                     $arrayTemporaneoSchemaVariantiDisponibiliArticolo = array();
  1205.                     $codiceDimensione5Inserita = array();
  1206.                     for ($i = 1; $i <= count($riga->mappaCategoriaArticolo->varianti); $i++) {
  1207.                         $vrtn = $riga->mappaCategoriaArticolo->varianti[$i - 1];
  1208.                         if (!in_array($vrtn->codiceDimensione5, $codiceDimensione5Inserita)) {
  1209.                             $arrayTemporaneoSchemaVariantiDisponibiliArticolo[$vrtn->codiceDimensione5] = $vrtn;
  1210.                             array_push($codiceDimensione5Inserita, $vrtn->codiceDimensione5);
  1211.                         }
  1212.                     }
  1213.                     $esameHeaderRiga = $this->generaHeaderRiga($riga->variante);
  1214.                     $this->logger->info("Esame header riga: " . $esameHeaderRiga);
  1215.                     $arrayTemporaneoDivisioneIncolonne = array();
  1216.                 }
  1217.                 if ($esameHeaderRiga != $this->generaHeaderRiga($riga->variante)) {
  1218.                     $this->logger->info("Esame header riga diverso da nuovo generato. Vecchio: " . $esameHeaderRiga . " --- Nuovo: " . $this->generaHeaderRiga($riga->variante));
  1219.                     $arrayTemporaneHeaderRiga[$esameHeaderRiga] = $arrayTemporaneoDivisioneIncolonne;
  1220.                     $esameHeaderRiga = $this->generaHeaderRiga($riga->variante);
  1221.                     $arrayTemporaneoDivisioneIncolonne = array();
  1222.                 }
  1223.                 if (key_exists($riga->variante->codiceDimensione5, $arrayTemporaneoDivisioneIncolonne)) {
  1224.                     $this->logger->info("Array temporaneo divisione in colonne contiene codiceDimensione5: " . $riga->variante->codiceDimensione5);
  1225.                     array_push($arrayTemporaneoDivisioneIncolonne[$riga->variante->codiceDimensione5], $riga);
  1226.                 } else {
  1227.                     $this->logger->info("Array temporaneo divisione in colonne NON contiene codiceDimensione5: " . $riga->variante->codiceDimensione5);
  1228.                     $arrayTemporaneoDivisioneIncolonne[$riga->variante->codiceDimensione5] = array($riga);
  1229.                 }
  1230.             }
  1231.         }
  1232.         if (count($arrayTemporaneoDivisioneIncolonne) > 0) {
  1233.             $arrayTemporaneHeaderRiga[$esameHeaderRiga] = $arrayTemporaneoDivisioneIncolonne;
  1234.             $arrayDivisioneArticoli['articoliConVarianti'][$esameCodiceArticolo] = array(
  1235.                 'articolo' => $classeArticoloEsame,
  1236.                 'divisioneHeaderRiga' => $arrayTemporaneHeaderRiga,
  1237.                 'schemaVariantiDisponibili' => $arrayTemporaneoSchemaVariantiDisponibiliArticolo
  1238.             );
  1239.         }else{
  1240.             $arrayDivisioneArticoli['articoliConVarianti'] = array();
  1241.         }
  1242.         $arrayDivisioneArticoli['articoliSenzaVarianti'] = $listaRigheSenzaVarianti;
  1243.         return $arrayDivisioneArticoli;
  1244.     }
  1245.     /**
  1246.      * @param $offerta Offerta
  1247.      * @return array|null
  1248.      */
  1249.     public function creaArrayRaggruppatoPerVariantiVisualizzazioneOrizzontaleOfferta($offerta){
  1250.         if($offerta instanceof Offerte){
  1251.             $offerta = Offerta::CreaDaConversioneEntita($offerta, $this->doctrine, $this, $this->OttieniUtenteCorrente(), $this->locale);
  1252.         }
  1253.         $arrayDivisioneArticoli = array(); // {
  1254.         //   codiceArticolo : { articolo : (classeArticolo), divisioneHeaderRiga : [ arrayDi->divisioneHeaderRiga ] },
  1255.         //   articoliSenzaVarianti : [ righe ]
  1256.         // }
  1257.         $arrayDivisioneHeaderRiga = array(); // { headerRiga : [ arrayDivisioneInColonne ] }
  1258.         $arrayDivisioneInColonne = array(); // { codiceVariante5 : [ righe ]} codiceVariante5 è il codice dell'ultima variante da inserire in colonna usata come chiave
  1259.         //VARIABILI ESAME
  1260.         $esameCodiceArticolo = '';
  1261.         $classeArticoloEsame = null;
  1262.         $arrayTemporaneHeaderRiga = array();
  1263.         $esameHeaderRiga = '';
  1264.         $arrayTemporaneoDivisioneIncolonne = array();
  1265.         $arrayTemporaneoSchemaVariantiDisponibiliArticolo = array();
  1266.         $codiceDimensione5Inserita = array();
  1267.         $listaRigheSenzaVarianti = array();
  1268.         $this->logger->info("Conteggio righe offerta: " . count($offerta->righe));
  1269.         foreach ($offerta->righe as $riga) {
  1270.             //$this->logger->info("Array raggruppato varianti 1: Codice variante: " . $riga->codiceVariante);
  1271.             $trovataVariante = true;
  1272.             if ($riga->collegamentoVariante == null || $riga->collegamentoVariante->id == '') {
  1273.                 array_push($listaRigheSenzaVarianti, $riga);
  1274.                 $trovataVariante = false;
  1275.             }
  1276.             $this->logger->info("Valore di -trovata variante- : " . ($trovataVariante ? 'True' : 'False'));
  1277.             if($trovataVariante) {
  1278.                 if ($esameCodiceArticolo == '' || $esameCodiceArticolo != $riga->collegamentoMappaCategoriaArticolo->articolo->codice) {
  1279.                     if ($esameCodiceArticolo != '') {
  1280.                         $arrayTemporaneHeaderRiga[$esameHeaderRiga] = $arrayTemporaneoDivisioneIncolonne;
  1281.                         $arrayDivisioneArticoli['articoliConVarianti'][$esameCodiceArticolo] = array(
  1282.                             'articolo' => $classeArticoloEsame,
  1283.                             'divisioneHeaderRiga' => $arrayTemporaneHeaderRiga,
  1284.                             'schemaVariantiDisponibili' => $arrayTemporaneoSchemaVariantiDisponibiliArticolo
  1285.                         );
  1286.                     }
  1287.                     $classeArticoloEsame = $riga->collegamentoMappaCategoriaArticolo->articolo;
  1288.                     $esameCodiceArticolo = $riga->collegamentoMappaCategoriaArticolo->articolo->codice;
  1289.                     $this->logger->info("Esame codice articolo: " . $esameCodiceArticolo);
  1290.                     $arrayTemporaneHeaderRiga = array();
  1291.                     $arrayTemporaneoSchemaVariantiDisponibiliArticolo = array();
  1292.                     $codiceDimensione5Inserita = array();
  1293.                     for ($i = 1; $i <= count($riga->collegamentoMappaCategoriaArticolo->varianti); $i++) {
  1294.                         $vrtn = $riga->collegamentoMappaCategoriaArticolo->varianti[$i - 1];
  1295.                         if (!in_array($vrtn->codiceDimensione5, $codiceDimensione5Inserita)) {
  1296.                             $arrayTemporaneoSchemaVariantiDisponibiliArticolo[$vrtn->codiceDimensione5] = $vrtn;
  1297.                             array_push($codiceDimensione5Inserita, $vrtn->codiceDimensione5);
  1298.                         }
  1299.                     }
  1300.                     $esameHeaderRiga = $this->generaHeaderRiga($riga->collegamentoVariante);
  1301.                     $this->logger->info("Esame header riga: " . $esameHeaderRiga);
  1302.                     $arrayTemporaneoDivisioneIncolonne = array();
  1303.                 }
  1304.                 if ($esameHeaderRiga != $this->generaHeaderRiga($riga->collegamentoVariante)) {
  1305.                     $this->logger->info("Esame header riga diverso da nuovo generato. Vecchio: " . $esameHeaderRiga . " --- Nuovo: " . $this->generaHeaderRiga($riga->collegamentoVariante));
  1306.                     $arrayTemporaneHeaderRiga[$esameHeaderRiga] = $arrayTemporaneoDivisioneIncolonne;
  1307.                     $esameHeaderRiga = $this->generaHeaderRiga($riga->collegamentoVariante);
  1308.                     $arrayTemporaneoDivisioneIncolonne = array();
  1309.                 }
  1310.                 if (key_exists($riga->collegamentoVariante->codiceDimensione5, $arrayTemporaneoDivisioneIncolonne)) {
  1311.                     $this->logger->info("Array temporaneo divisione in colonne contiene codiceDimensione5: " . $riga->collegamentoVariante->codiceDimensione5);
  1312.                     array_push($arrayTemporaneoDivisioneIncolonne[$riga->collegamentoVariante->codiceDimensione5], $riga);
  1313.                 } else {
  1314.                     $this->logger->info("Array temporaneo divisione in colonne NON contiene codiceDimensione5: " . $riga->collegamentoVariante->codiceDimensione5);
  1315.                     $arrayTemporaneoDivisioneIncolonne[$riga->collegamentoVariante->codiceDimensione5] = array($riga);
  1316.                 }
  1317.             }
  1318.         }
  1319.         if (count($arrayTemporaneoDivisioneIncolonne) > 0) {
  1320.             $arrayTemporaneHeaderRiga[$esameHeaderRiga] = $arrayTemporaneoDivisioneIncolonne;
  1321.             $arrayDivisioneArticoli['articoliConVarianti'][$esameCodiceArticolo] = array(
  1322.                 'articolo' => $classeArticoloEsame,
  1323.                 'divisioneHeaderRiga' => $arrayTemporaneHeaderRiga,
  1324.                 'schemaVariantiDisponibili' => $arrayTemporaneoSchemaVariantiDisponibiliArticolo
  1325.             );
  1326.         }else{
  1327.             $arrayDivisioneArticoli['articoliConVarianti'] = array();
  1328.         }
  1329.         $arrayDivisioneArticoli['articoliSenzaVarianti'] = $listaRigheSenzaVarianti;
  1330.         return $arrayDivisioneArticoli;
  1331.     }
  1332.     /**
  1333.      * @param $ordine Ordine
  1334.      * @return array|null
  1335.      */
  1336.     public function creaArrayRaggruppatoPerVariantiVisualizzazioneOrizzontaleOrdine($ordine){
  1337.         $arrayDivisioneArticoli = array(); // {
  1338.                                            //   codiceArticolo : { articolo : (classeArticolo), divisioneHeaderRiga : [ arrayDi->divisioneHeaderRiga ] },
  1339.                                            //   articoliSenzaVarianti : [ righe ]
  1340.                                            // }
  1341.         $arrayDivisioneHeaderRiga = array(); // { headerRiga : [ arrayDivisioneInColonne ] }
  1342.         $arrayDivisioneInColonne = array(); // { codiceVariante5 : [ righe ]} codiceVariante5 è il codice dell'ultima variante da inserire in colonna usata come chiave
  1343.         //VARIABILI ESAME
  1344.         $esameCodiceArticolo = '';
  1345.         $classeArticoloEsame = null;
  1346.         $arrayTemporaneHeaderRiga = array();
  1347.         $esameHeaderRiga = '';
  1348.         $arrayTemporaneoDivisioneIncolonne = array();
  1349.         $arrayTemporaneoSchemaVariantiDisponibiliArticolo = array();
  1350.         $codiceDimensione5Inserita = array();
  1351.         $listaRigheSenzaVarianti = array();
  1352.         $this->logger->info("Conteggio righe ordine: " . count($ordine->righe));
  1353.         foreach ($ordine->righe as $riga) {
  1354.             //$this->logger->info("Array raggruppato varianti 1: Codice variante: " . $riga->codiceVariante);
  1355.             $trovataVariante = true;
  1356.             if ($riga->variante == null || $riga->variante->id == '') {
  1357.                 array_push($listaRigheSenzaVarianti, $riga);
  1358.                 $trovataVariante = false;
  1359.             }
  1360.             $this->logger->info("Valore di -trovata variante- : " . ($trovataVariante ? 'True' : 'False'));
  1361.             if($trovataVariante) {
  1362.                 if ($esameCodiceArticolo == '' || $esameCodiceArticolo != $riga->mappaCategoriaArticolo->articolo->codice) {
  1363.                     if ($esameCodiceArticolo != '') {
  1364.                         $arrayTemporaneHeaderRiga[$esameHeaderRiga] = $arrayTemporaneoDivisioneIncolonne;
  1365.                         $arrayDivisioneArticoli['articoliConVarianti'][$esameCodiceArticolo] = array(
  1366.                             'articolo' => $classeArticoloEsame,
  1367.                             'divisioneHeaderRiga' => $arrayTemporaneHeaderRiga,
  1368.                             'schemaVariantiDisponibili' => $arrayTemporaneoSchemaVariantiDisponibiliArticolo
  1369.                         );
  1370.                     }
  1371.                     $classeArticoloEsame = $riga->mappaCategoriaArticolo->articolo;
  1372.                     $esameCodiceArticolo = $riga->mappaCategoriaArticolo->articolo->codice;
  1373.                     $this->logger->info("Esame codice articolo: " . $esameCodiceArticolo);
  1374.                     $arrayTemporaneHeaderRiga = array();
  1375.                     $arrayTemporaneoSchemaVariantiDisponibiliArticolo = array();
  1376.                     $codiceDimensione5Inserita = array();
  1377.                     for ($i = 1; $i <= count($riga->mappaCategoriaArticolo->varianti); $i++) {
  1378.                         $vrtn = $riga->mappaCategoriaArticolo->varianti[$i - 1];
  1379.                         if (!in_array($vrtn->codiceDimensione5, $codiceDimensione5Inserita)) {
  1380.                             $arrayTemporaneoSchemaVariantiDisponibiliArticolo[$vrtn->codiceDimensione5] = $vrtn;
  1381.                             array_push($codiceDimensione5Inserita, $vrtn->codiceDimensione5);
  1382.                         }
  1383.                     }
  1384.                     $esameHeaderRiga = $this->generaHeaderRiga($riga->variante);
  1385.                     $this->logger->info("Esame header riga: " . $esameHeaderRiga);
  1386.                     $arrayTemporaneoDivisioneIncolonne = array();
  1387.                 }
  1388.                 if ($esameHeaderRiga != $this->generaHeaderRiga($riga->variante)) {
  1389.                     $this->logger->info("Esame header riga diverso da nuovo generato. Vecchio: " . $esameHeaderRiga . " --- Nuovo: " . $this->generaHeaderRiga($riga->variante));
  1390.                     $arrayTemporaneHeaderRiga[$esameHeaderRiga] = $arrayTemporaneoDivisioneIncolonne;
  1391.                     $esameHeaderRiga = $this->generaHeaderRiga($riga->variante);
  1392.                     $arrayTemporaneoDivisioneIncolonne = array();
  1393.                 }
  1394.                 if (key_exists($riga->variante->codiceDimensione5, $arrayTemporaneoDivisioneIncolonne)) {
  1395.                     $this->logger->info("Array temporaneo divisione in colonne contiene codiceDimensione5: " . $riga->variante->codiceDimensione5);
  1396.                     array_push($arrayTemporaneoDivisioneIncolonne[$riga->variante->codiceDimensione5], $riga);
  1397.                 } else {
  1398.                     $this->logger->info("Array temporaneo divisione in colonne NON contiene codiceDimensione5: " . $riga->variante->codiceDimensione5);
  1399.                     $arrayTemporaneoDivisioneIncolonne[$riga->variante->codiceDimensione5] = array($riga);
  1400.                 }
  1401.             }
  1402.         }
  1403.         if (count($arrayTemporaneoDivisioneIncolonne) > 0) {
  1404.             $arrayTemporaneHeaderRiga[$esameHeaderRiga] = $arrayTemporaneoDivisioneIncolonne;
  1405.             $arrayDivisioneArticoli['articoliConVarianti'][$esameCodiceArticolo] = array(
  1406.                 'articolo' => $classeArticoloEsame,
  1407.                 'divisioneHeaderRiga' => $arrayTemporaneHeaderRiga,
  1408.                 'schemaVariantiDisponibili' => $arrayTemporaneoSchemaVariantiDisponibiliArticolo
  1409.             );
  1410.         }else{
  1411.             $arrayDivisioneArticoli['articoliConVarianti'] = array();
  1412.         }
  1413.         $arrayDivisioneArticoli['articoliSenzaVarianti'] = $listaRigheSenzaVarianti;
  1414.         return $arrayDivisioneArticoli;
  1415.     }
  1416.     /**
  1417.      * @param $carrello Carrello
  1418.      * @return array|null
  1419.      */
  1420.     public function creaArrayRaggruppatoPerVariantiVisualizzazioneOrizzontaleCarrello($carrello){
  1421.         $arrayDivisioneArticoli = array(); // {
  1422.         //   codiceArticolo : { articolo : (classeArticolo), divisioneHeaderRiga : [ arrayDi->divisioneHeaderRiga ] },
  1423.         //   articoliSenzaVarianti : [ righe ]
  1424.         // }
  1425.         $arrayDivisioneHeaderRiga = array(); // { headerRiga : [ arrayDivisioneInColonne ] }
  1426.         $arrayDivisioneInColonne = array(); // { codiceVariante5 : [ righe ]} codiceVariante5 è il codice dell'ultima variante da inserire in colonna usata come chiave
  1427.         //VARIABILI ESAME
  1428.         $esameCodiceArticolo = '';
  1429.         $classeArticoloEsame = null;
  1430.         $arrayTemporaneHeaderRiga = array();
  1431.         $esameHeaderRiga = '';
  1432.         $arrayTemporaneoDivisioneIncolonne = array();
  1433.         $arrayTemporaneoSchemaVariantiDisponibiliArticolo = array();
  1434.         $codiceDimensione5Inserita = array();
  1435.         $listaRigheSenzaVarianti = array();
  1436.         foreach ($carrello->righe as $riga){
  1437.             if (!$riga->variante){
  1438.                 array_push($listaRigheSenzaVarianti, $riga);
  1439.                 continue;
  1440.             }
  1441.             if ($esameCodiceArticolo == '' || $esameCodiceArticolo != $riga->mappaCategoriaArticolo->articolo->codice)
  1442.             {
  1443.                 if ($esameCodiceArticolo != ''){
  1444.                     $arrayTemporaneHeaderRiga[$esameHeaderRiga] = $arrayTemporaneoDivisioneIncolonne;
  1445.                     $arrayDivisioneArticoli['articoliConVarianti'][$esameCodiceArticolo] = array(
  1446.                         'articolo' => $classeArticoloEsame,
  1447.                         'divisioneHeaderRiga' => $arrayTemporaneHeaderRiga,
  1448.                         'schemaVariantiDisponibili' => $arrayTemporaneoSchemaVariantiDisponibiliArticolo
  1449.                     );
  1450.                 }
  1451.                 $classeArticoloEsame = $riga->mappaCategoriaArticolo->articolo;
  1452.                 $esameCodiceArticolo = $riga->mappaCategoriaArticolo->articolo->codice;
  1453.                 $arrayTemporaneHeaderRiga = array();
  1454.                 $arrayTemporaneoSchemaVariantiDisponibiliArticolo = array();
  1455.                 $codiceDimensione5Inserita = array();
  1456.                 for ($i = 1; $i <= count($riga->mappaCategoriaArticolo->varianti); $i++) {
  1457.                     $vrtn = $riga->mappaCategoriaArticolo->varianti[$i - 1];
  1458.                     if (!in_array($vrtn->codiceDimensione5, $codiceDimensione5Inserita)){
  1459.                         $arrayTemporaneoSchemaVariantiDisponibiliArticolo[$vrtn->codiceDimensione5] = $vrtn;
  1460.                         array_push($codiceDimensione5Inserita, $vrtn->codiceDimensione5);
  1461.                     }
  1462.                 }
  1463.                 $esameHeaderRiga = $this->generaHeaderRiga($riga->variante);
  1464.                 $arrayTemporaneoDivisioneIncolonne = array();
  1465.             }
  1466.             if ($esameHeaderRiga != $this->generaHeaderRiga($riga->variante)){
  1467.                 $arrayTemporaneHeaderRiga[$esameHeaderRiga] = $arrayTemporaneoDivisioneIncolonne;
  1468.                 $esameHeaderRiga = $this->generaHeaderRiga($riga->variante);
  1469.                 $arrayTemporaneoDivisioneIncolonne = array();
  1470.             }
  1471.             if (key_exists($riga->variante->codiceDimensione5, $arrayTemporaneoDivisioneIncolonne)){
  1472.                 array_push($arrayTemporaneoDivisioneIncolonne[$riga->variante->codiceDimensione5], $riga);
  1473.             }else{
  1474.                 $arrayTemporaneoDivisioneIncolonne[$riga->variante->codiceDimensione5] = array($riga);
  1475.             }
  1476.         }
  1477.         $arrayTemporaneHeaderRiga[$esameHeaderRiga] = $arrayTemporaneoDivisioneIncolonne;
  1478.         $arrayDivisioneArticoli['articoliConVarianti'][$esameCodiceArticolo] = array(
  1479.             'articolo' => $classeArticoloEsame,
  1480.             'divisioneHeaderRiga' => $arrayTemporaneHeaderRiga,
  1481.             'schemaVariantiDisponibili' => $arrayTemporaneoSchemaVariantiDisponibiliArticolo
  1482.         );
  1483.         $arrayDivisioneArticoli['articoliSenzaVarianti'] = $listaRigheSenzaVarianti;
  1484.         return $arrayDivisioneArticoli;
  1485.     }
  1486.     /**
  1487.      * @param $variante Variante
  1488.      * @return string
  1489.      */
  1490.     public function generaHeaderRiga($variante){
  1491.         $ritorno = "";
  1492.         if ($variante->codiceDimensione1 != ""){
  1493.             if($variante->associazioneArticoliCliente && $variante->associazioneArticoliCliente->codiceDimensione1 != '')
  1494.                 $ritorno .= $variante->associazioneArticoliCliente->descrizioneDimensione1 . "/////";
  1495.             else
  1496.                 $ritorno .= $variante->descrizioneDimensione1 . "/////";
  1497.         }
  1498.         if ($variante->codiceDimensione2 != ""){
  1499.             if($variante->associazioneArticoliCliente && $variante->associazioneArticoliCliente->codiceDimensione2 != '')
  1500.                 $ritorno .= $variante->associazioneArticoliCliente->descrizioneDimensione2 . "/////";
  1501.             else
  1502.                 $ritorno .= $variante->descrizioneDimensione2 . "/////";
  1503.         }
  1504.         if ($variante->codiceDimensione3 != ""){
  1505.             if($variante->associazioneArticoliCliente && $variante->associazioneArticoliCliente->codiceDimensione3 != '')
  1506.                 $ritorno .= $variante->associazioneArticoliCliente->descrizioneDimensione3 . "/////";
  1507.             else
  1508.                 $ritorno .= $variante->descrizioneDimensione3 . "/////";
  1509.         }
  1510.         if ($variante->codiceDimensione4 != ""){
  1511.             if($variante->associazioneArticoliCliente && $variante->associazioneArticoliCliente->codiceDimensione4 != '')
  1512.                 $ritorno .= $variante->associazioneArticoliCliente->descrizioneDimensione4 . "/////";
  1513.             else
  1514.                 $ritorno .= $variante->descrizioneDimensione4 . "/////";
  1515.         }
  1516.         //Salto il codiceDimensione5 perchè è incolonnato
  1517.         return substr($ritorno, 0, strlen($ritorno));
  1518.     }
  1519.     /*================================================================================================================
  1520.     =====================================================  SEO META  =================================================
  1521.     ==================================================================================================================*/
  1522.     public function ritornaSeoMetatags($route, $variabiliTemplate, $idPagina = null){
  1523.         return Templating::ritornaMetaTagsRoute($route, $variabiliTemplate, $this->doctrine, $this, $idPagina);
  1524.     }
  1525.     /*================================================================================================================
  1526.     =======================================================  COUPON  =================================================
  1527.     ==================================================================================================================*/
  1528.     /**
  1529.      * @param $dettaglioCoupon CouponDettaglio
  1530.      * @param $carrello Carrello
  1531.      * @return RitornoValiditaCoupon
  1532.      * @throws \Exception
  1533.      */
  1534.     public function verificaValiditaCoupon($dettaglioCoupon, $carrello){
  1535.         $ritorno = new RitornoValiditaCoupon();
  1536.         $ritorno->esito = $dettaglioCoupon->getCoupon()->getAttivo();
  1537.         if (!$ritorno->esito) {
  1538.             $ritorno->messaggio = "Coupon non attivo!";
  1539.             return $ritorno;
  1540.         }else{
  1541.             //il coupon è attivo
  1542.             //VERIFICO SE IL COUPON NON è ANCORA STATO UTILIZZATO
  1543.             if ($dettaglioCoupon->getUtilizzato()){
  1544.                 $ritorno->esito = false;
  1545.                 $ritorno->messaggio = "Coupon già utilizzato!";
  1546.                 return $ritorno;
  1547.             }
  1548.             //VERIFICO SE IL COUPON HA RAGGIUNTO IL LIMITE DI UTILIZZI
  1549.             if ($dettaglioCoupon->getNumeroUtilizziConsentiti() != -1 && (count($dettaglioCoupon->getUtilizzo()) > $dettaglioCoupon->getNumeroUtilizziConsentiti())){
  1550.                 $ritorno->esito = false;
  1551.                 $ritorno->messaggio = "E' stato raggiunto il limite di utilizzi per il coupon selezionato!";
  1552.                 return $ritorno;
  1553.             }
  1554.             //VERIFICO SE ESISTONO IMPORTi MINIMI
  1555.             if ($dettaglioCoupon->getImportoMinimoOrdine()){
  1556.                 if ($dettaglioCoupon->getImportoMinimoOrdine() > $carrello->totale){
  1557.                     $ritorno->esito = false;
  1558.                     $ritorno->messaggio = "Per utilizzare questo coupon il carrello deve avere un valore di almeno € " . $dettaglioCoupon->getImportoMinimoOrdine();
  1559.                     return $ritorno;
  1560.                 }
  1561.             } else if ($dettaglioCoupon->getCoupon()->getImportoMinimoOrdine()){
  1562.                 if ($dettaglioCoupon->getCoupon()->getImportoMinimoOrdine() > $carrello->totale){
  1563.                     $ritorno->esito = false;
  1564.                     $ritorno->messaggio = "Per utilizzare questo coupon il carrello deve avere un valore di almeno € " . $dettaglioCoupon->getCoupon()->getImportoMinimoOrdine();
  1565.                     return $ritorno;
  1566.                 }
  1567.             }
  1568.             //VERIFICO SE IL COUPON E' SCADUTO
  1569.             if ($dettaglioCoupon->getLimiteValidita()){
  1570.                 $dataEsame = $dettaglioCoupon->getLimiteValidita();
  1571.                 $dataEsame->setTime(0, 0, 0);
  1572.                 $adesso = new \DateTime();
  1573.                 $adesso->setTime(0, 0, 0);
  1574.                 if ($adesso > $dataEsame){
  1575.                     $ritorno->esito = false;
  1576.                     $ritorno->messaggio = "Il coupon è scaduto il " . $dataEsame->format("d/m/Y");
  1577.                     return $ritorno;
  1578.                 }
  1579.             }
  1580.         }
  1581.         return $ritorno;
  1582.     }
  1583.     /**
  1584.      * @param $length
  1585.      * @return string
  1586.      * @throws \Exception
  1587.      */
  1588.     public function generaStringaCasuale($length){
  1589.         $token = "";
  1590.         $codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  1591.         $codeAlphabet.= "abcdefghijklmnopqrstuvwxyz";
  1592.         $codeAlphabet.= "0123456789";
  1593.         $max = strlen($codeAlphabet); // edited
  1594.         for ($i=0; $i < $length; $i++) {
  1595.             $token .= $codeAlphabet[random_int(0, $max-1)];
  1596.         }
  1597.         return $token;
  1598.     }
  1599.     /**
  1600.      * @param $carrello \App\Entity\Carrello
  1601.      * @return double
  1602.      */
  1603.     function calcolaValoreScontoCoupon($carrello){
  1604.         $totaleScontoCoupon = 0;
  1605.         if ($carrello->getCouponDettaglioUtilizzo()){
  1606.             /** @var CouponDettaglio $coupon */
  1607.             $coupon = $carrello->getCouponDettaglioUtilizzo()->getDettaglioCoupon();
  1608.             //Non c'è il dettaglio allora prendo la testata
  1609.             if ($coupon->getCoupon()->getScontoPercentuale() != 0){
  1610.                 $imponibileScontato = $carrello->getTotale();
  1611.                 $imponibileScontato = $imponibileScontato - ($imponibileScontato * ($coupon->getCoupon()->getScontoPercentuale() / (float)100));
  1612.                 $totaleScontoCoupon += $carrello->getTotale() - $imponibileScontato;
  1613.             }
  1614.             if ($coupon->getCoupon()->getScontoGenerico() != 0){
  1615.                 $totaleScontoCoupon += $coupon->getCoupon()->getScontoGenerico();
  1616.             }
  1617.             if ($coupon->getScontoGenericoExtra() || $coupon->getScontoPercentualeExtra()){
  1618.               if ($coupon->getScontoPercentualeExtra() != 0){
  1619.                   $imponibileScontato = $carrello->getTotale() - $totaleScontoCoupon;
  1620.                   $imponibileScontato = $imponibileScontato - ($imponibileScontato * ($coupon->getScontoPercentualeExtra() / (float)100));
  1621.                   $totaleScontoCoupon += $carrello->getTotale() - $imponibileScontato;
  1622.               }
  1623.               if ($coupon->getScontoGenericoExtra() != 0){
  1624.                   $totaleScontoCoupon += $coupon->getScontoGenericoExtra();
  1625.               }
  1626.             }
  1627.         }
  1628.         return $totaleScontoCoupon;
  1629.     }
  1630.     //==================================================================================================================
  1631.     /** @return bool */
  1632.     public function controllaSeNazioneBlackList($nazione)
  1633.     {
  1634.         $imp = $this->doctrine->getRepository(Nazioni::class)->findOneBy(array('siglaIso' => $nazione));
  1635.         if ($imp) {
  1636.             if ($imp->getBlacklist())
  1637.                 return true;
  1638.             else
  1639.                 return false;
  1640.         }else{
  1641.             $this->ScriviRegistroAttivita("", "", false, "Sigla iso nazione non trovata. Sigla: " . $nazione, null);
  1642.             return false;
  1643.         }
  1644.     }
  1645.     /**
  1646.      * @param $tipoSchedulazione string
  1647.      * @param $ricorrenza string
  1648.      * @param $valoreRicorrenza string
  1649.      * @return \DateTime
  1650.      */
  1651.     public function ottieniProssimaDataEsecuzione($tipoSchedulazione, $ricorrenza, $valoreRicorrenza)
  1652.     {
  1653.         $ritorno = null;
  1654.         /*
  1655.          * TIPO_SCHEDULAZIONE
  1656.          *      "Una volta" => 'unaVolta',
  1657.          *      "Ogni" => 'ogni'
  1658.          *
  1659.          * RICORRENZA
  1660.          *      "Ora" => 'ora',
  1661.          *      "Giorno" => 'giorni',
  1662.          *      "Mese" => 'mese'
  1663.          *
  1664.          * Una volta si intente per esempio una volta all'ora $valore di ogni giorno oppure una volta al giorno numero $valore di ogni mese
  1665.          * La ricorrenza invece è ogni $valore ora oppure ogni $valore giorno
  1666.          *
  1667.          * Se non è presente la data di ultimo avvio parte subito
  1668.          */
  1669.         $dataAttuale = new Carbon();
  1670.         $dataProssimaEsecuzione = $dataAttuale;
  1671.         switch ($tipoSchedulazione) {
  1672.             case "unaVolta":
  1673.                 {
  1674.                     if ($ricorrenza == "ora") {
  1675.                         $dataProssimaEsecuzione->setTime($valoreRicorrenza, $dataProssimaEsecuzione->format('i'), $dataProssimaEsecuzione->format('s'));
  1676.                         $dataProssimaEsecuzione = $dataAttuale->addDay();
  1677.                     } else if ($ricorrenza == "giorni") {
  1678.                         $dataProssimaEsecuzione = $dataProssimaEsecuzione->addMonth();
  1679.                         $dataProssimaEsecuzione->setDate($dataProssimaEsecuzione->format('y'), $dataProssimaEsecuzione->format('m'), $valoreRicorrenza);
  1680.                     } else if ($ricorrenza == "mese") {
  1681.                         $dataProssimaEsecuzione->addYear();
  1682.                         $dataProssimaEsecuzione->setDate($dataProssimaEsecuzione->format('y'), $valoreRicorrenza, 1);
  1683.                     }
  1684.                     break;
  1685.                 }
  1686.             case "ogni":
  1687.                 {
  1688.                     if ($ricorrenza == "ora") {
  1689.                         $dataProssimaEsecuzione = $dataProssimaEsecuzione->addHours($valoreRicorrenza);
  1690.                         $dataProssimaEsecuzione->setTime($dataProssimaEsecuzione->format('h'), 0, 0);
  1691.                     } else if ($ricorrenza == "giorni") {
  1692.                         $dataProssimaEsecuzione = $dataProssimaEsecuzione->addDays($valoreRicorrenza);
  1693.                         $dataProssimaEsecuzione->setTime(0, 0, 0);
  1694.                     } else if ($ricorrenza == "mese") {
  1695.                         $dataProssimaEsecuzione = $dataProssimaEsecuzione->addMonths($valoreRicorrenza);
  1696.                         $dataProssimaEsecuzione->setTime(0,0,0);
  1697.                         $dataProssimaEsecuzione->setDate($dataProssimaEsecuzione->format('y'), $dataProssimaEsecuzione->format('m'), $dataProssimaEsecuzione->format('d'));
  1698.                     }
  1699.                     break;
  1700.                 }
  1701.         }
  1702.         return $dataProssimaEsecuzione;
  1703.     }
  1704.     /**
  1705.      * @param $nomePermesso string
  1706.      * @param $utente User
  1707.      * @return boolean
  1708.      */
  1709.     public function controllaPermessoPresente($nomePermesso, $utente){
  1710.         $ritorno = false;
  1711.         /** @var  $permessi PermessiAccessoUtenti[] */
  1712.         $permessi = $this->doctrine->getRepository(PermessiAccessoUtenti::class)->findBy(array('utente' => $utente, 'nomePermesso' => $nomePermesso));
  1713.         if (count($permessi) > 0){
  1714.             $ritorno = true;
  1715.         }
  1716.         return $ritorno;
  1717.     }
  1718.     /**
  1719.      * @param Sconti[] $sconti
  1720.      * @param boolean $soloDaApplicareSempre  //Se attiva ritorna solo la stringa sconti con i prezzi da applicare solo se il prezzo è flaggato come netto
  1721.      */
  1722.     public static function CreaStringaScontiDaArray($sconti, $soloDaApplicareSempre = false){
  1723.         $ritorno = "";
  1724.         foreach ($sconti as $sc){
  1725.             if($soloDaApplicareSempre)
  1726.             {
  1727.                 if($sc->applicaSempre){
  1728.                     $ritorno = ($ritorno . "#" . $sc->sconto);
  1729.                 }
  1730.             }else{
  1731.                 $ritorno = ($ritorno . "#" . $sc->sconto);
  1732.             }
  1733.         }
  1734.         return $ritorno;
  1735.     }
  1736.     /**
  1737.      * @param $secret string
  1738.      * @param $agente User|null
  1739.      * @param $anagrafica Anagrafiche|null
  1740.      * @param $utente User|null
  1741.      */
  1742.     public function RecuperaCarrello($secret, $agente, $anagrafica, $utente){
  1743.         $altriDati = $this->RitornaAltriDatiUtente();
  1744.         if ($secret && $secret != '') {
  1745.             $carrello = $this->doctrine->getRepository(\App\Entity\Carrello::class)->findOneBy(array('secret' => $secret));
  1746.         } else {
  1747.             if ($agente && $anagrafica && ($agente->hasRole("ROLE_ADMIN") || $agente->hasRole('ROLE_COMMERCIALE') || $agente->hasRole("ROLE_AGENTE"))) {
  1748.                 $carrello = $this->doctrine->getRepository(\App\Entity\Carrello::class)->findOneBy(array('anagrafica' => $anagrafica, 'agente' => $agente, 'tipoOrdine' => $altriDati->tipoOrdine != '' ? $altriDati->tipoOrdine : null));
  1749.                 if ($anagrafica->getCodiceAliquotaIva() != '' && $anagrafica->getCodiceAliquotaIva()){
  1750.                     $aliquotaIva = $anagrafica->getValoreAliquotaIva();
  1751.                 }
  1752.             } else if ($agente) {
  1753.                 if ($utente->getCodiceAliquotaIva() != '' && $utente->getCodiceAliquotaIva()){
  1754.                     $aliquotaIva = $utente->getValoreAliquotaIva();
  1755.                 }
  1756.                 $carrello = $this->doctrine->getRepository(\App\Entity\Carrello::class)->findOneBy(array('anagrafica' => null, 'agente' => $agente, 'cliente' => $utente, 'tipoOrdine' => $altriDati->tipoOrdine != '' ? $altriDati->tipoOrdine : null));
  1757.             } else{
  1758.                 if ($utente->getCodiceAliquotaIva() != '' && $utente->getCodiceAliquotaIva()){
  1759.                     $aliquotaIva = $utente->getValoreAliquotaIva();
  1760.                 }
  1761.                 $carrello = $this->doctrine->getRepository(\App\Entity\Carrello::class)->findOneBy(array('cliente' => $utente, 'agente' => null, 'tipoOrdine' => $altriDati->tipoOrdine != '' ? $altriDati->tipoOrdine : null));
  1762.             }
  1763.         }
  1764.         return $carrello;
  1765.     }
  1766.     /**
  1767.      * @param $mappa MappaCategoriaArticolo
  1768.      * @param $variante Variante
  1769.      * @return RitornoCalcoloPrezzoNetto
  1770.      */
  1771.     public function calcolaPrezzoNettoMappaOVariante($mappa, $variante = null){
  1772.         $prezzoNetto = (double)0;
  1773.         $ritorno = new RitornoCalcoloPrezzoNetto();
  1774.         $flagPrezzoNetto = false;
  1775.         if ($variante){
  1776.             if ($variante->listino){
  1777.                 $prezzoNetto = $variante->listino->prezzo;
  1778.                 $flagPrezzoNetto = $variante->listino->flagPrezzoNetto;
  1779.                 $ritorno->prezzoLordo = $prezzoNetto;
  1780.                 $ritorno->prezzoNetto = $prezzoNetto;
  1781.             } else {
  1782.                 $ritorno->errori = "Listino non presente!";
  1783.             }
  1784.         }else if ($mappa){
  1785.             if ($mappa->listinoVendita){
  1786.                 $prezzoNetto = $mappa->listinoVendita->prezzo;
  1787.                 $flagPrezzoNetto = $mappa->listinoVendita->flagPrezzoNetto;
  1788.                 $ritorno->prezzoLordo = $prezzoNetto;
  1789.                 $ritorno->prezzoNetto = $prezzoNetto;
  1790.             } else{
  1791.                 $ritorno->errori = "Listino non presente!";
  1792.             }
  1793.         } else{
  1794.             $ritorno->errori = "Mappa o variante non specificata!";
  1795.         }
  1796.         if ($ritorno->errori == "" && !$flagPrezzoNetto){
  1797.             $stringaSconti = ""; //-0.00#-3.00#-0.00#-0.00#-0.00#-0.00
  1798.             if (($variante != null && count($variante->sconti) > 0) || $mappa != null && count($mappa->sconti) > 0){
  1799.                 $stringaSconti = ServiziController::CreaStringaScontiDaArray($variante != null ? $variante->sconti : $mappa->sconti);
  1800.                 $ritorno->stringaSconti = $stringaSconti;
  1801.                 $prezzoNetto = $this->elaboraStringaSconti($stringaSconti, $prezzoNetto);
  1802.                 $ritorno->prezzoNetto = $prezzoNetto;
  1803.             }else if (count($mappa->scontiBase) > 0){
  1804.                 $stringaSconti = $mappa->scontiBase[0]->sconto;
  1805.                 $ritorno->stringaSconti = $stringaSconti;
  1806.                 $prezzoNetto = $this->elaboraStringaSconti($stringaSconti, $prezzoNetto);
  1807.                 $ritorno->prezzoNetto = $prezzoNetto;
  1808.             }
  1809.         }
  1810.         if ($ritorno->errori == "" && $flagPrezzoNetto){{
  1811.         }
  1812.             if (($variante != null && count($variante->sconti) > 0) || $mappa != null && count($mappa->sconti) > 0){
  1813.                 $stringaSconti = ServiziController::CreaStringaScontiDaArray($variante != null ? $variante->sconti : $mappa->sconti, true);
  1814.                 $ritorno->stringaSconti = $stringaSconti;
  1815.                 $prezzoNetto = $this->elaboraStringaSconti($stringaSconti, $prezzoNetto);
  1816.                 $ritorno->prezzoNetto = $prezzoNetto;
  1817.             }
  1818.         }
  1819.         $valorizzaPrezzo0SeScontisticaNonPresente = $this->impostazioni->ritornaImpostazioneDaNome('ValorizzaPrezzo0PerTuttiGliArticoliSenzaSconti');
  1820.         if($valorizzaPrezzo0SeScontisticaNonPresente == '1' && $ritorno->prezzoNetto == $ritorno->prezzoLordo){
  1821.             $ritorno->prezzoLordo = 0;
  1822.             $ritorno->prezzoNetto = 0;
  1823.             $ritorno->stringaSconti = '';
  1824.         }
  1825.         return $ritorno;
  1826.     }
  1827.     /**
  1828.      * @param $mappa MappaCategoriaArticolo|MappaCategorieArticoli
  1829.      * @param $imp ReturnImpostazioniServiceController
  1830.      * @param $variante Variante|Varianti
  1831.      * @param $richiestaDaB2b boolean
  1832.      * @return RitornoCalcoloDisponibile
  1833.      */
  1834.     public function calcolaDisponibileMappaOVariante($mappa, ReturnImpostazioniServiceController $imp, $variante = null, $richiestaDaB2b = false){
  1835.         $imp->caricaCacheImpostazioniDaNomi(array('MostraDisponibilitaShop', 'MostraDisponibilitaMagazziniSecondari', 'DisponibileSommatoMagazziniSecondari', 'DisponibileSommatoMagazziniSecondariB2B'));
  1836.         $mostraDisponibilita = $imp->ritornaImpostazioneDaNome('MostraDisponibilitaShop');
  1837.         $mostraDisponibilitaMagazziniSecondari = $imp->ritornaImpostazioneDaNome('MostraDisponibilitaMagazziniSecondari');
  1838.         $sommaDisponibilita = $imp->ritornaImpostazioneDaNome('DisponibileSommatoMagazziniSecondari');
  1839.         $sommaDisponibilitaB2b = $imp->ritornaImpostazioneDaNome('DisponibileSommatoMagazziniSecondariB2B');
  1840.         $ritorno = new RitornoCalcoloDisponibile();
  1841.         $disponibile = 0;
  1842.         if ($mostraDisponibilita) {
  1843.             if ($variante) {
  1844.                 if($variante instanceof Varianti){
  1845.                     if ($variante->getDisponibile() !== null) {
  1846.                         $disponibile = $variante->getDisponibile();
  1847.                         $ritorno->disponibile = $disponibile;
  1848.                         $ritorno->disponibileFinale = $disponibile;
  1849.                     }
  1850.                 }else {
  1851.                     if ($variante->disponibile !== null) {
  1852.                         $disponibile = $variante->disponibile;
  1853.                         $ritorno->disponibile = $disponibile;
  1854.                         $ritorno->disponibileFinale = $disponibile;
  1855.                     }
  1856.                 }
  1857.             } else if ($mappa) {
  1858.                 if($mappa instanceof MappaCategorieArticoli){
  1859.                     $disponibile = $mappa->getDisponibile();
  1860.                     $ritorno->disponibile = $disponibile;
  1861.                     $ritorno->disponibileFinale = $disponibile;
  1862.                 }else {
  1863.                     $disponibile = $mappa->disponibile;
  1864.                     $ritorno->disponibile = $disponibile;
  1865.                     $ritorno->disponibileFinale = $disponibile;
  1866.                 }
  1867.                 if ($mostraDisponibilitaMagazziniSecondari) {
  1868.                     if($mappa instanceof MappaCategorieArticoli){
  1869.                         /** @var MagazzinoSecondarioDisponibilita[] $magazziniSecondari */
  1870.                         $magazziniSecondari = $this->doctrine->getRepository(MagazzinoSecondarioDisponibilita::class)->findBy(array('mappaCategorieArticoli' => $mappa));
  1871.                         foreach ($magazziniSecondari as $itm){
  1872.                             if($itm->getDisponibilita() && $itm->getDisponibilita() > 0){
  1873.                                 $ritorno->magazziniSecondari += $itm->getDisponibilita();
  1874.                             }
  1875.                         }
  1876.                     }else {
  1877.                         if ($mappa->magazziniSecondari && count($mappa->magazziniSecondari) > 0) {
  1878.                             foreach ($mappa->magazziniSecondari as $itm) {
  1879.                                 if ($itm->disponibilita && count($itm->disponibilita) > 0) {
  1880.                                     foreach ($itm->disponibilita as $dsp) {
  1881.                                         $ritorno->magazziniSecondari += $dsp->disponibilita;
  1882.                                     }
  1883.                                 }
  1884.                             }
  1885.                         }
  1886.                     }
  1887.                     if($sommaDisponibilitaB2b && $richiestaDaB2b){
  1888.                         $ritorno->disponibileFinale = $ritorno->disponibile + $ritorno->magazziniSecondari;
  1889.                     }else if ($sommaDisponibilita && !$richiestaDaB2b) {
  1890.                         $ritorno->disponibileFinale = $ritorno->disponibile + $ritorno->magazziniSecondari;
  1891.                     }
  1892.                 }
  1893.             }
  1894.         }
  1895.         return $ritorno;
  1896.     }
  1897.     /**
  1898.      * @param $albero AlberoMenuProdotti
  1899.      * @return ContenitoreCategoriePerFiltri
  1900.      */
  1901.     public function ricavaCategorieDaAlbero($albero){
  1902.         $alberoEntity = $this->doctrine->getRepository(AlberoMenuProdotti::class)->find($albero);
  1903.         /** @var Categorie[]|CategorieAlbero[] $categorie */
  1904.         $categorie = $this->risaliAlberoCategorie($alberoEntity);
  1905.         $categorie = array_reverse($categorie);
  1906.         $contenitoreCategorie = new ContenitoreCategoriePerFiltri();
  1907.         if (array_key_exists(0, $categorie)){
  1908.             $contenitoreCategorie->idCat1 = $categorie[0]->getId();
  1909.             $contenitoreCategorie->nomeUnivocoCat1 = $categorie[0]->getNomeUnivoco();
  1910.         }
  1911.         if (array_key_exists(1, $categorie)){
  1912.             $contenitoreCategorie->idCat2 = $categorie[1]->getId();
  1913.             $contenitoreCategorie->nomeUnivocoCat2 = $categorie[1]->getNomeUnivoco();
  1914.         }
  1915.         if (array_key_exists(2, $categorie)){
  1916.             $contenitoreCategorie->idCat3 = $categorie[2]->getId();
  1917.             $contenitoreCategorie->nomeUnivocoCat3 = $categorie[2]->getNomeUnivoco();
  1918.         }
  1919.         if (array_key_exists(3, $categorie)){
  1920.             $contenitoreCategorie->idCat4 = $categorie[3]->getId();
  1921.             $contenitoreCategorie->nomeUnivocoCat4 = $categorie[3]->getNomeUnivoco();
  1922.         }
  1923.         if (array_key_exists(4, $categorie)){
  1924.             $contenitoreCategorie->idCat5 = $categorie[4]->getId();
  1925.             $contenitoreCategorie->nomeUnivocoCat5 = $categorie[4]->getNomeUnivoco();
  1926.         }
  1927.         return $contenitoreCategorie;
  1928.     }
  1929.     /**
  1930.      * @param $albero AlberoMenuProdotti
  1931.      * @param array $categorieTrovate
  1932.      * @return array
  1933.      */
  1934.     function risaliAlberoCategorie($albero, $categorieTrovate = array())
  1935.     {
  1936.         $usaCategorieAlbero = $this->impostazioni->ritornaImpostazioneDaNome('UtilizzaCategorieAlberoPerGenerazione');
  1937.         if($usaCategorieAlbero == '1'){
  1938.             array_push($categorieTrovate, $albero->getCategoriaAlbero());
  1939.         }else {
  1940.             array_push($categorieTrovate, $albero->getCategoria());
  1941.         }
  1942.         if ($albero->getParentId()){
  1943.             $categorieTrovate = $this->risaliAlberoCategorie($albero->getParentId(), $categorieTrovate);
  1944.         }
  1945.         return $categorieTrovate;
  1946.     }
  1947.     /**
  1948.      * @param string $codiceCliente
  1949.      * @param User $agente
  1950.      * @return Anagrafiche|null
  1951.      */
  1952.     public function ritornaAnagraficaShopSelezionataDaCookieIdentificativo($codiceCliente, $agente){
  1953.         $ritorno = null;
  1954.         if (!$agente->hasRole("ROLE_ADMIN") && !$agente->hasRole("ROLE_COMMERCIALE") ) {
  1955.             $listaCodiciAgente = self::ritornaArrayCodiciAssociatiAgenteFornitoreUtente($this->OttieniUtenteCorrente());
  1956.         }
  1957.         /** @var Anagrafiche[] $clSel */
  1958.         $clSel = $this->doctrine->getRepository(Anagrafiche::class)->createQueryBuilder('anagrafiche')
  1959.             ->where('anagrafiche.codice = :cod')->setParameter('cod', $codiceCliente);
  1960.         if (!$agente->hasRole("ROLE_ADMIN") && !$agente->hasRole("ROLE_COMMERCIALE") ) {
  1961.             $clSel = $clSel->andWhere('anagrafiche.codiceAgente IN (:list)')->setParameter('list', $listaCodiciAgente);
  1962.         }
  1963.             $clSel = $clSel->setMaxResults(1)->getQuery()->getResult();
  1964.         if (count($clSel) > 0)
  1965.         {
  1966.             $ritorno = $clSel[0];
  1967.         }
  1968.         return $ritorno;
  1969.     }
  1970.     /**
  1971.      *  @param $importo double
  1972.      *  @param $valoreAliquota double
  1973.      *  @return double
  1974.      */
  1975.     public function calcolaImpostaSuImporto($importo, $valoreAliquota){
  1976.         $imposta = 0;
  1977.         $imposta = ($importo * ((double)1 + $valoreAliquota / (double)100)) - $importo;
  1978.         return $imposta;
  1979.     }
  1980.     /**
  1981.      * @param $stringSconti
  1982.      * @return string
  1983.      */
  1984.     public function pulisciStringaScontiEMantieniSoloQuelliValidi($stringSconti){
  1985.         $nuovaStringaRitorno = "";
  1986.         $arr = array();
  1987.         if(strpos($stringSconti, '#') !== false){
  1988.             $arr = explode('#', $stringSconti);
  1989.         }else{
  1990.             array_push($arr, $stringSconti);
  1991.         }
  1992.         foreach ($arr as $item){
  1993.             if($item != '' && floatval($item) != 0){
  1994.                 $nuovaStringaRitorno .= ("#" . $item);
  1995.             }
  1996.         }
  1997.         return $nuovaStringaRitorno;
  1998.     }
  1999.     /**
  2000.      * @param $stringSconti string
  2001.      * @param $prezzoLordo double
  2002.      * @return double
  2003.      */
  2004.     public function elaboraStringaSconti($stringSconti, $prezzoLordo){
  2005.         $prezzoNetto = (double)$prezzoLordo;
  2006.         //StringaSconti ===>   -0.00#-3.00#-0.00#-0.00#-0.00#-0.00
  2007.         $arr = array();
  2008.         if(strpos($stringSconti, '#') !== false){
  2009.             $arr = explode('#', $stringSconti);
  2010.         }else{
  2011.             array_push($arr, $stringSconti);
  2012.         }
  2013.         foreach ($arr as $item){
  2014.             if($item != '') {
  2015.                 //$this->logger->info("Stringa sconto: " . $item);
  2016.                 $segno = substr($item, 0, 1);
  2017.                 $valore = substr($item, 1, strlen($item) - 1);
  2018.                 if ($segno == '-') {
  2019.                     $prezzoNetto = $prezzoNetto - ($prezzoNetto * ($valore / (float)100));
  2020.                 } else {
  2021.                     $prezzoNetto = $prezzoNetto + ($prezzoNetto * ($valore / (float)100));
  2022.                 }
  2023.             }
  2024.         }
  2025.         return $prezzoNetto;
  2026.     }
  2027.     /**
  2028.      * @param $stringaSconti string
  2029.      * @return string
  2030.      */
  2031.     public function ritornaStringaScontiPerVisualizzazione($stringaSconti){
  2032.         $ritorno = "";
  2033.         try {
  2034.             if ($stringaSconti != null && $stringaSconti != '') {
  2035.                 if(!str_contains($stringaSconti, '#')){
  2036.                     $ritorno = $stringaSconti;
  2037.                 }else {
  2038.                     $arr = array();
  2039.                     if (strpos($stringaSconti, '#') !== false) {
  2040.                         $arr = explode('#', $stringaSconti);
  2041.                     } else {
  2042.                         array_push($arr, $stringaSconti);
  2043.                     }
  2044.                     foreach ($arr as $item) {
  2045.                         if ($item != '') {
  2046.                             $segno = substr($item, 0, 1);
  2047.                             $valore = substr($item, 1, strlen($item) - 1);
  2048.                             if ((float)$valore != 0 && $valore != '') {
  2049.                                 $ritorno .= ($segno . number_format((float)$valore, 2, ',', '.') . "% ");
  2050.                             }
  2051.                         }
  2052.                     }
  2053.                 }
  2054.             }
  2055.         }catch (\Exception $e){
  2056.             $ritorno = $stringaSconti;
  2057.         }
  2058.         return $ritorno;
  2059.     }
  2060.     /**
  2061.      * @param $variabile Variante
  2062.      * @return string
  2063.      */
  2064.     public function ottieniImmagineDaVariabileEsclusoLivello5($variabile): string
  2065.     {
  2066.         $ritorno = '';
  2067.         if ($variabile->immagineDimensione4 != ''){
  2068.             $ritorno = $variabile->immagineDimensione4;
  2069.             return $ritorno;
  2070.         } elseif ($variabile->immagineDimensione3 != ''){
  2071.             $ritorno = $variabile->immagineDimensione3;
  2072.             return $ritorno;
  2073.         } elseif ($variabile->immagineDimensione2 != ''){
  2074.             $ritorno = $variabile->immagineDimensione2;
  2075.             return $ritorno;
  2076.         } elseif ($variabile->immagineDimensione1 != ''){
  2077.             $ritorno = $variabile->immagineDimensione1;
  2078.             return $ritorno;
  2079.         } elseif ($variabile->mappa){
  2080.             $mappa = $variabile->mappa;
  2081.             if ($mappa->articolo && $mappa->articolo->image != ""){
  2082.                 $ritorno = $mappa->articolo->image;
  2083.                 return $ritorno;
  2084.             } else {
  2085.                 if ($mappa->categoria5 && $mappa->categoria5->immagine != ""){
  2086.                     $ritorno = $mappa->categoria5->immagine;
  2087.                 } elseif ($mappa->categoria4 && $mappa->categoria4->immagine != ""){
  2088.                     $ritorno = $mappa->categoria4->immagine;
  2089.                 } elseif ($mappa->categoria3 && $mappa->categoria3->immagine != ""){
  2090.                     $ritorno = $mappa->categoria3->immagine;
  2091.                 } elseif ($mappa->categoria2 && $mappa->categoria2->immagine != ""){
  2092.                     $ritorno = $mappa->categoria2->immagine;
  2093.                 } elseif ($mappa->categoria1 && $mappa->categoria1->immagine != ""){
  2094.                     $ritorno = $mappa->categoria1->immagine;
  2095.                 }
  2096.                 return $ritorno;
  2097.             }
  2098.         }
  2099.         return $ritorno;
  2100.     }
  2101.     /**
  2102.      * @param $mappa MappaCategoriaArticolo
  2103.      * @return string
  2104.      */
  2105.     public function ottieniImmagineDaMappaCategoriaArticolo($mappa, $absolutePath = false){
  2106.         $ritorno = "";
  2107.         if ($mappa->articolo->image != ''){
  2108.             $ritorno = $mappa->articolo->image;
  2109.         }
  2110.         else{
  2111.             if ($mappa->categoria5 && $mappa->categoria5->immagine != ''){
  2112.                 $ritorno = $mappa->categoria5->immagine;
  2113.             } elseif ($mappa->categoria4 && $mappa->categoria4->immagine != ''){
  2114.                 $ritorno = $mappa->categoria4->immagine;
  2115.             } elseif ($mappa->categoria3 && $mappa->categoria3->immagine != ''){
  2116.                 $ritorno = $mappa->categoria3->immagine;
  2117.             } elseif ($mappa->categoria2 && $mappa->categoria2->immagine != ''){
  2118.                 $ritorno = $mappa->categoria2->immagine;
  2119.             } elseif ($mappa->categoria1 && $mappa->categoria1->immagine != ''){
  2120.                 $ritorno = $mappa->categoria1->immagine;
  2121.             }
  2122.         }
  2123.         if ($absolutePath){
  2124.             $ritorno = $this->requestStack->getCurrentRequest()->getSchemeAndHttpHost() . $ritorno;
  2125.         }
  2126.         return $ritorno;
  2127.     }
  2128.     public function OttieniImmagineRigaOrdineRigaCarrello(OrdineRiga|RigaCarrello $riga){
  2129.         $pathRitorno = '';
  2130.         if($riga->variante){
  2131.             $varianteAgg = null;
  2132.             if($riga->variante != null && $riga->variante->codiceVariante != $riga->codiceVariante){
  2133.                 $varianteAgg = $this->doctrine->getRepository(Varianti::class)->findOneBy(['codiceVariante' => $riga->codiceVariante]);
  2134.             }
  2135.             if ($riga->variante->immagineDimensione3 != '' || ($varianteAgg != null && $varianteAgg->getImmagineDimensione3() != '')) {
  2136.                 $pathRitorno = $varianteAgg ? $varianteAgg->getImmagineDimensione3() : $riga->variante->immagineDimensione3;
  2137.             } elseif ($riga->variante->immagineDimensione2 != ''|| ($varianteAgg != null && $varianteAgg->getImmagineDimensione2() != '')) {
  2138.                 $pathRitorno = $varianteAgg ? $varianteAgg->getImmagineDimensione2() : $riga->variante->immagineDimensione2;
  2139.             } elseif ($riga->variante->immagineDimensione1 != ''|| ($varianteAgg != null && $varianteAgg->getImmagineDimensione1() != '')) {
  2140.                 $pathRitorno = $varianteAgg ? $varianteAgg->getImmagineDimensione1() : $riga->variante->immagineDimensione1;
  2141.             }
  2142.             if($pathRitorno != '')
  2143.                 return $pathRitorno;
  2144.         }
  2145.         if($pathRitorno == ''){
  2146.             $artAgg = null;
  2147.             if($riga->articolo != null &&  $riga->articolo->codice != $riga->codiceArticolo) {
  2148.                 $artAgg = $this->doctrine->getRepository(Articoli::class)->findOneBy(['codice' => $riga->codiceArticolo]);
  2149.                 if($artAgg && $artAgg->getImage() != '')
  2150.                     $pathRitorno = $artAgg->getImage();
  2151.             }else{
  2152.                 if($riga->articolo != null && $riga->articolo->image != '')
  2153.                     $pathRitorno = $riga->articolo->image;
  2154.             }
  2155.             if($pathRitorno != '')
  2156.                 return $pathRitorno;
  2157.         }
  2158.         //Se ancora non ho l'immagine verifico le varie categorie
  2159.         if($pathRitorno == ''){
  2160.             //CATEGORIA 5
  2161.             if($riga->codiceCat5 != ''){
  2162.                 if($riga->mappaCategoriaArticolo && $riga->mappaCategoriaArticolo->categoria5 && $riga->mappaCategoriaArticolo->categoria5->codice != $riga->codiceCat5){
  2163.                     $cat5 = $this->doctrine->getRepository(Categorie::class)->findOneBy(['codice' => $riga->codiceCat5]);
  2164.                     if($cat5){
  2165.                         $pathRitorno = $cat5->getImmagine();
  2166.                     }
  2167.                 }else{
  2168.                     $pathRitorno = $riga->mappaCategoriaArticolo->categoria5->immagine;
  2169.                 }
  2170.                 if($pathRitorno != '')
  2171.                     return $pathRitorno;
  2172.             }
  2173.             //CATEGORIA 4
  2174.             if($riga->codiceCat5 != ''){
  2175.                 if($riga->mappaCategoriaArticolo && $riga->mappaCategoriaArticolo->categoria4 && $riga->mappaCategoriaArticolo->categoria4->codice != $riga->codiceCat4){
  2176.                     $cat4 = $this->doctrine->getRepository(Categorie::class)->findOneBy(['codice' => $riga->codiceCat4]);
  2177.                     if($cat4){
  2178.                         $pathRitorno = $cat4->getImmagine();
  2179.                     }
  2180.                 }else{
  2181.                     $pathRitorno = $riga->mappaCategoriaArticolo->categoria4->immagine;
  2182.                 }
  2183.                 if($pathRitorno != '')
  2184.                     return $pathRitorno;
  2185.             }
  2186.             //CATEGORIA 3
  2187.             if($riga->codiceCat5 != ''){
  2188.                 if($riga->mappaCategoriaArticolo && $riga->mappaCategoriaArticolo->categoria3 && $riga->mappaCategoriaArticolo->categoria3->codice != $riga->codiceCat3){
  2189.                     $cat3 = $this->doctrine->getRepository(Categorie::class)->findOneBy(['codice' => $riga->codiceCat3]);
  2190.                     if($cat3){
  2191.                         $pathRitorno = $cat3->getImmagine();
  2192.                     }
  2193.                 }else{
  2194.                     $pathRitorno = $riga->mappaCategoriaArticolo->categoria3->immagine;
  2195.                 }
  2196.                 if($pathRitorno != '')
  2197.                     return $pathRitorno;
  2198.             }
  2199.             //CATEGORIA 2
  2200.             if($riga->codiceCat5 != ''){
  2201.                 if($riga->mappaCategoriaArticolo && $riga->mappaCategoriaArticolo->categoria2 && $riga->mappaCategoriaArticolo->categoria2->codice != $riga->codiceCat2){
  2202.                     $cat2 = $this->doctrine->getRepository(Categorie::class)->findOneBy(['codice' => $riga->codiceCat2]);
  2203.                     if($cat2){
  2204.                         $pathRitorno = $cat2->getImmagine();
  2205.                     }
  2206.                 }else{
  2207.                     $pathRitorno = $riga->mappaCategoriaArticolo->categoria2->immagine;
  2208.                 }
  2209.                 if($pathRitorno != '')
  2210.                     return $pathRitorno;
  2211.             }
  2212.             //CATEGORIA 1
  2213.             if($riga->codiceCat5 != ''){
  2214.                 if($riga->mappaCategoriaArticolo && $riga->mappaCategoriaArticolo->categoria1 && $riga->mappaCategoriaArticolo->categoria1->codice != $riga->codiceCat1){
  2215.                     $cat1 = $this->doctrine->getRepository(Categorie::class)->findOneBy(['codice' => $riga->codiceCat1]);
  2216.                     if($cat1){
  2217.                         $pathRitorno = $cat1->getImmagine();
  2218.                     }
  2219.                 }else{
  2220.                     $pathRitorno = $riga->mappaCategoriaArticolo->categoria1->immagine;
  2221.                 }
  2222.                 if($pathRitorno != '')
  2223.                     return $pathRitorno;
  2224.             }
  2225.         }
  2226.         return $pathRitorno;
  2227.     }
  2228.     public function OttieniImmagineRigaOfferta(OffertaRiga $riga){
  2229.         $pathRitorno = '';
  2230.         if($riga->collegamentoVariante){
  2231.             $varianteAgg = null;
  2232.             if($riga->collegamentoVariante != null && $riga->collegamentoVariante->codiceVariante != $riga->codiceVariante){
  2233.                 $varianteAgg = $this->doctrine->getRepository(Varianti::class)->findOneBy(['codiceVariante' => $riga->codiceVariante]);
  2234.             }
  2235.             if($riga->collegamentoVariante->immagineDimensione3 != '' || ($varianteAgg != null && $varianteAgg->getImmagineDimensione3() != ''))
  2236.                 $pathRitorno = $varianteAgg ? $varianteAgg->getImmagineDimensione3() : $riga->collegamentoVariante->immagineDimensione3;
  2237.             if($riga->collegamentoVariante->immagineDimensione2 != ''|| ($varianteAgg != null && $varianteAgg->getImmagineDimensione2() != ''))
  2238.                 $pathRitorno = $varianteAgg ? $varianteAgg->getImmagineDimensione2() : $riga->collegamentoVariante->immagineDimensione2;
  2239.             if($riga->collegamentoVariante->immagineDimensione1 != ''|| ($varianteAgg != null && $varianteAgg->getImmagineDimensione1() != ''))
  2240.                 $pathRitorno = $varianteAgg ? $varianteAgg->getImmagineDimensione1() : $riga->collegamentoVariante->immagineDimensione1;
  2241.             if($pathRitorno != '')
  2242.                 return $pathRitorno;
  2243.         }
  2244.         if($pathRitorno == ''){
  2245.             $artAgg = null;
  2246.             if($riga->collegamentoMappaCategoriaArticolo != null && $riga->collegamentoMappaCategoriaArticolo->articolo != null &&  $riga->collegamentoMappaCategoriaArticolo->articolo->codice != $riga->codiceArticolo) {
  2247.                 $artAgg = $this->doctrine->getRepository(Articoli::class)->findOneBy(['codice' => $riga->codiceArticolo]);
  2248.                 if($artAgg && $artAgg->getImage() != '')
  2249.                     $pathRitorno = $artAgg->getImage();
  2250.             }else{
  2251.                 if($riga->collegamentoMappaCategoriaArticolo != null && $riga->collegamentoMappaCategoriaArticolo->articolo != null && $riga->collegamentoMappaCategoriaArticolo->articolo->image != '')
  2252.                     $pathRitorno = $riga->collegamentoMappaCategoriaArticolo->articolo->image;
  2253.             }
  2254.             if($pathRitorno != '')
  2255.                 return $pathRitorno;
  2256.         }
  2257.         //Se ancora non ho l'immagine verifico le varie categorie
  2258.         if($pathRitorno == ''){
  2259.             //CATEGORIA 5
  2260.             if($riga->codiceCat5 != ''){
  2261.                 if($riga->collegamentoMappaCategoriaArticolo && $riga->collegamentoMappaCategoriaArticolo->categoria5 && $riga->collegamentoMappaCategoriaArticolo->categoria5->codice != $riga->codiceCat5){
  2262.                     $cat5 = $this->doctrine->getRepository(Categorie::class)->findOneBy(['codice' => $riga->codiceCat5]);
  2263.                     if($cat5){
  2264.                         $pathRitorno = $cat5->getImmagine();
  2265.                     }
  2266.                 }else{
  2267.                     $pathRitorno = $riga->collegamentoMappaCategoriaArticolo->categoria5->immagine;
  2268.                 }
  2269.                 if($pathRitorno != '')
  2270.                     return $pathRitorno;
  2271.             }
  2272.             //CATEGORIA 4
  2273.             if($riga->codiceCat5 != ''){
  2274.                 if($riga->collegamentoMappaCategoriaArticolo && $riga->collegamentoMappaCategoriaArticolo->categoria4 && $riga->collegamentoMappaCategoriaArticolo->categoria4->codice != $riga->codiceCat4){
  2275.                     $cat4 = $this->doctrine->getRepository(Categorie::class)->findOneBy(['codice' => $riga->codiceCat4]);
  2276.                     if($cat4){
  2277.                         $pathRitorno = $cat4->getImmagine();
  2278.                     }
  2279.                 }else{
  2280.                     $pathRitorno = $riga->collegamentoMappaCategoriaArticolo->categoria4->immagine;
  2281.                 }
  2282.                 if($pathRitorno != '')
  2283.                     return $pathRitorno;
  2284.             }
  2285.             //CATEGORIA 3
  2286.             if($riga->codiceCat5 != ''){
  2287.                 if($riga->collegamentoMappaCategoriaArticolo && $riga->collegamentoMappaCategoriaArticolo->categoria3 && $riga->collegamentoMappaCategoriaArticolo->categoria3->codice != $riga->codiceCat3){
  2288.                     $cat3 = $this->doctrine->getRepository(Categorie::class)->findOneBy(['codice' => $riga->codiceCat3]);
  2289.                     if($cat3){
  2290.                         $pathRitorno = $cat3->getImmagine();
  2291.                     }
  2292.                 }else{
  2293.                     $pathRitorno = $riga->collegamentoMappaCategoriaArticolo->categoria3->immagine;
  2294.                 }
  2295.                 if($pathRitorno != '')
  2296.                     return $pathRitorno;
  2297.             }
  2298.             //CATEGORIA 2
  2299.             if($riga->codiceCat5 != ''){
  2300.                 if($riga->collegamentoMappaCategoriaArticolo && $riga->collegamentoMappaCategoriaArticolo->categoria2 && $riga->collegamentoMappaCategoriaArticolo->categoria2->codice != $riga->codiceCat2){
  2301.                     $cat2 = $this->doctrine->getRepository(Categorie::class)->findOneBy(['codice' => $riga->codiceCat2]);
  2302.                     if($cat2){
  2303.                         $pathRitorno = $cat2->getImmagine();
  2304.                     }
  2305.                 }else{
  2306.                     $pathRitorno = $riga->collegamentoMappaCategoriaArticolo->categoria2->immagine;
  2307.                 }
  2308.                 if($pathRitorno != '')
  2309.                     return $pathRitorno;
  2310.             }
  2311.             //CATEGORIA 1
  2312.             if($riga->codiceCat5 != ''){
  2313.                 if($riga->collegamentoMappaCategoriaArticolo && $riga->collegamentoMappaCategoriaArticolo->categoria1 && $riga->collegamentoMappaCategoriaArticolo->categoria1->codice != $riga->codiceCat1){
  2314.                     $cat1 = $this->doctrine->getRepository(Categorie::class)->findOneBy(['codice' => $riga->codiceCat1]);
  2315.                     if($cat1){
  2316.                         $pathRitorno = $cat1->getImmagine();
  2317.                     }
  2318.                 }else{
  2319.                     $pathRitorno = $riga->collegamentoMappaCategoriaArticolo->categoria1->immagine;
  2320.                 }
  2321.                 if($pathRitorno != '')
  2322.                     return $pathRitorno;
  2323.             }
  2324.         }
  2325.         return $pathRitorno;
  2326.     }
  2327.     /**
  2328.      * @param $alberoProdotti AlberoMenuProdotti|AlberoCategorie
  2329.      * @return string
  2330.      */
  2331.     public function saliAlberoPerImmagine($alberoProdotti){
  2332.         $usaCategorieAlbero = $this->impostazioni->ritornaImpostazioneDaNome('UtilizzaCategorieAlberoPerGenerazione');
  2333.         if ($alberoProdotti instanceof AlberoMenuProdotti) {
  2334.             /** @var $alberoProdotti AlberoMenuProdotti */
  2335.             if($usaCategorieAlbero){
  2336.                 if ($alberoProdotti->getCategoriaAlbero()->getImmagine() != '') {
  2337.                     return $alberoProdotti->getCategoriaAlbero()->getImmagine();
  2338.                 } else {
  2339.                     if ($alberoProdotti->getParentId()) {
  2340.                         return $this->saliAlberoPerImmagine($alberoProdotti->getParentId());
  2341.                     } else {
  2342.                         return '';
  2343.                     }
  2344.                 }
  2345.             }else {
  2346.                 if ($alberoProdotti->getCategoria()->getImmagine() != '') {
  2347.                     return $alberoProdotti->getCategoria()->getImmagine();
  2348.                 } else {
  2349.                     if ($alberoProdotti->getParentId()) {
  2350.                         return $this->saliAlberoPerImmagine($alberoProdotti->getParentId());
  2351.                     } else {
  2352.                         return '';
  2353.                     }
  2354.                 }
  2355.             }
  2356.         } elseif ($alberoProdotti instanceof AlberoCategorie){
  2357.             /** @var $alberoProdotti AlberoCategorie */
  2358.             if ($usaCategorieAlbero){
  2359.                 if ($alberoProdotti->categoriaAlbero->immagine != '') {
  2360.                     return $alberoProdotti->categoriaAlbero->immagine;
  2361.                 } else {
  2362.                     if ($alberoProdotti->parent) {
  2363.                         return $this->saliAlberoPerImmagine($alberoProdotti->parent);
  2364.                     } else {
  2365.                         return '';
  2366.                     }
  2367.                 }
  2368.             }else {
  2369.                 if ($alberoProdotti->categoria->immagine != '') {
  2370.                     return $alberoProdotti->categoria->immagine;
  2371.                 } else {
  2372.                     if ($alberoProdotti->parent) {
  2373.                         return $this->saliAlberoPerImmagine($alberoProdotti->parent);
  2374.                     } else {
  2375.                         return '';
  2376.                     }
  2377.                 }
  2378.             }
  2379.         } else {
  2380.             return '';
  2381.         }
  2382.     }
  2383.     /*
  2384.     * ============================================================================================================================
  2385.     * ====================================================  TRANSLATING  =========================================================
  2386.     * ============================================================================================================================
  2387.     */
  2388.     /**
  2389.      * @param $famiglia
  2390.      * @param $locale
  2391.      * @param bool $famigliaIniziaPer
  2392.      */
  2393.     public function caricaArrayTraduzioni($famiglia, $locale, $famigliaIniziaPer = true){
  2394.         $this->translating->CaricaTraduzioniDaFamiglia($famiglia, $locale, $famigliaIniziaPer);
  2395.     }
  2396.     /**
  2397.      * @param $identificativo
  2398.      * @param $famiglia
  2399.      * @return RitornoTradotto|null
  2400.      */
  2401.     public function ottieniVoceDizionario($identificativo, $famiglia){
  2402.         return $this->translating->OttieniElementoDizionario($identificativo, $famiglia);
  2403.     }
  2404.     /**
  2405.      * @return array
  2406.      */
  2407.     public function ritornaIdentificativiDizionario()
  2408.     {
  2409.         $sql = "SELECT DISTINCT(dizionario.identificativo_campo) FROM dizionario ORDER BY dizionario.identificativo_campo";
  2410.         $conn = $this->servizi->doctrine->getConnection();
  2411.         $stmt = $conn->prepare($sql);
  2412.         $stmt->execute();
  2413.         $risultati = $stmt->fetchArray();
  2414.         return $risultati;
  2415.     }
  2416.     /**
  2417.      * @return Lingue[]
  2418.      */
  2419.     public function RitornaLingue(){
  2420.         /** @var  $lingue Lingue[] */
  2421.         $lingue = $this->doctrine->getRepository(Lingue::class)->findAll();
  2422.         return $lingue;
  2423.     }
  2424.     /**
  2425.      * @param $locale string
  2426.      * @return Lingue|null
  2427.      */
  2428.     public function RitornaLinguaDaLocale($locale){
  2429.         $lingua = $this->doctrine->getRepository(Lingue::class)->findOneBy(array('locale' => $locale));
  2430.         return $lingua;
  2431.     }
  2432.     /*
  2433.      * ============================================================================================================================
  2434.      * ==================================================  DATI DATABASE  =========================================================
  2435.      * ============================================================================================================================
  2436.      */
  2437.     public function RitornaArrayElementiDatabase($categoriaPagina){
  2438.         $dizionarioDb = new DizionarioDatabase($this->doctrine);
  2439.         /** @var  $listaCollegamentiDbPossibili */
  2440.         $listaCollegamentiDbPossibili = $dizionarioDb->ritornaArrayColonneDaTipo($categoriaPagina, true);
  2441.         return $listaCollegamentiDbPossibili;
  2442.     }
  2443.     /*
  2444.      * ============================================================================================================================
  2445.      * ============================================  REGISTRAZIONE UTENTE  ========================================================
  2446.      * ============================================================================================================================
  2447.      */
  2448.     /**
  2449.      * @param FormBuilderInterface $formBuilder
  2450.      * @param string $locale
  2451.      * @return FormBuilderInterface
  2452.      */
  2453.     public function RitornaFormCompletoRegistrazioneUtente(FormBuilderInterface $formBuilder, $locale = 'it'){
  2454.         $traduci = $this->translating;
  2455.         $traduci->CaricaTraduzioniDaFamiglia("carrello", $locale, false);
  2456.         $traduci->CaricaTraduzioniDaFamiglia('dati_utente', $locale, false);
  2457.         $formBuilder->add(Costanti::RU_AZIENDA_O_PRIVATO, ChoiceType::class, array('label' => $traduci->OttieniElementoDizionario('dati_utente_privato_o_azienda', 'dati_utente')->valoreUscita, 'expanded' => true, 'multiple' => false, 'choices' => array($traduci->OttieniElementoDizionario('dati_utente_azienda', 'dati_utente')->valoreUscita => 'azienda', $traduci->OttieniElementoDizionario('dati_utente_privato', 'dati_utente')->valoreUscita => 'privato'), 'attr' => array()))
  2458.             ->add(Costanti::RU_RAGIONE_SOCIALE, TextType::class, array('required' => false, 'label' => $traduci->OttieniElementoDizionario('dati_utente_ragione_sociale', 'dati_utente')->valoreUscita, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')))
  2459.             ->add(Costanti::RU_NOME, TextType::class, array('required' => false, 'label' => $traduci->OttieniElementoDizionario('dati_utente_nome', 'dati_utente')->valoreUscita, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')))
  2460.             ->add(Costanti::RU_COGNOME, TextType::class, array('required' => false, 'label' => $traduci->OttieniElementoDizionario('dati_utente_cognome', 'dati_utente')->valoreUscita, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')))
  2461.             ->add(Costanti::RU_CODICE_FISCALE, TextType::class, array('required' => false, 'label' => $traduci->OttieniElementoDizionario('dati_utente_codice_fiscale', 'dati_utente')->valoreUscita, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')))
  2462.             ->add(Costanti::RU_PARTITA_IVA, TextType::class, array('required' => false, 'label' => $traduci->OttieniElementoDizionario('dati_utente_partita_iva', 'dati_utente')->valoreUscita, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')))
  2463.             ->add(Costanti::RU_INDIRIZZO, TextType::class, array('required' => false, 'label' => $traduci->OttieniElementoDizionario('dati_utente_indirizzo', 'dati_utente')->valoreUscita, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')))
  2464.             ->add(Costanti::RU_CITTA, TextType::class, array('required' => false, 'label' => $traduci->OttieniElementoDizionario('dati_utente_citta', 'dati_utente')->valoreUscita, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')))
  2465.             ->add(Costanti::RU_PROVINCIA, TextType::class, array('required' => false, 'label' => $traduci->OttieniElementoDizionario('dati_utente_provincia', 'dati_utente')->valoreUscita, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')))
  2466.             ->add(Costanti::RU_CAP, TextType::class, array('required' => false, 'label' => $traduci->OttieniElementoDizionario('dati_utente_cap', 'dati_utente')->valoreUscita, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')))
  2467.             ->add(Costanti::RU_STATO,  EntityType::class, array('required' => true, 'class' => Nazioni::class, 'choice_label' => function ($nazione) {
  2468.                 /** @var $nazione Nazioni */
  2469.                 return $nazione->getDescrizione();
  2470.             }, 'label' => $traduci->OttieniElementoDizionario('dati_utente_nazione', 'dati_utente')->valoreUscita, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')))
  2471.             ->add(Costanti::RU_TELEFONO, TextType::class, array('required' => false, 'label' => $traduci->OttieniElementoDizionario('dati_utente_cellulare', 'dati_utente')->valoreUscita, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')))
  2472.             ->add(Costanti::RU_FAX, TextType::class, array('required' => false, 'label' => $traduci->OttieniElementoDizionario('dati_utente_fax', 'dati_utente')->valoreUscita, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')))
  2473.             ->add(Costanti::RU_INDIRIZZO_MAIL, EmailType::class, array('required' => true, 'label' => $traduci->OttieniElementoDizionario('dati_utente_email', 'dati_utente')->valoreUscita, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')))
  2474.             ->add(Costanti::RU_INDIRIZZO_PEC, EmailType::class, array('required' => false, 'label' => $traduci->OttieniElementoDizionario('dati_utente_indirizzo_pec', 'dati_utente')->valoreUscita, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')))
  2475.             ->add(Costanti::RU_CODICE_DESTINATARIO_FATTURAZIONE_ELETTRONICA, TextType::class, array('required' => false, 'label' => $traduci->OttieniElementoDizionario('dati_utente_codice_destinatario_fattura_elettronica', 'dati_utente')->valoreUscita, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')))
  2476.             ->add(Costanti::RU_DESTINAZIONE_DIVERSA,  CheckboxType::class, array('required' => false, 'label' => $traduci->OttieniElementoDizionario("carrello_rdu_destinazione_diversa", "carrello")->valoreUscita, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')))
  2477.             ->add(Costanti::RU_DD_RAGIONE_SOCIALE, TextType::class, array('required' => false, 'label' => $traduci->OttieniElementoDizionario('dati_utente_destinazione_ragione_sociale', 'dati_utente')->valoreUscita, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')))
  2478.             ->add(Costanti::RU_DD_INDIRIZZO, TextType::class, array('required' => false, 'label' => $traduci->OttieniElementoDizionario('dati_utente_destinazione_indirizzo', 'dati_utente')->valoreUscita, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')))
  2479.             ->add(Costanti::RU_DD_CITTA, TextType::class, array('required' => false, 'label' => $traduci->OttieniElementoDizionario('dati_utente_destinazione_citta', 'dati_utente')->valoreUscita, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')))
  2480.             ->add(Costanti::RU_DD_PROVINCIA, TextType::class, array('required' => false, 'label' => $traduci->OttieniElementoDizionario('dati_utente_destinazione_provincia', 'dati_utente')->valoreUscita, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')))
  2481.             ->add(Costanti::RU_DD_CAP, TextType::class, array('required' => false, 'label' => $traduci->OttieniElementoDizionario('dati_utente_destinazione_cap', 'dati_utente')->valoreUscita, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')))
  2482.             ->add(Costanti::RU_DD_TELEFONO, TextType::class, array('required' => false, 'label' => $traduci->OttieniElementoDizionario('dati_utente_destinazione_telefono', 'dati_utente')->valoreUscita, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')))
  2483.             ->add(Costanti::RU_DD_STATO,  EntityType::class, array('required' => false, 'class' => Nazioni::class, 'choice_label' => function ($nazione) {
  2484.                 /** @var $nazione Nazioni */
  2485.                 return $nazione->getDescrizione();
  2486.             }, 'label' => $traduci->OttieniElementoDizionario('dati_utente_destinazione_nazione', 'dati_utente')->valoreUscita, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')))->add('telefono', TextType::class, array('required' => false, 'label' => "Telefono", 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')))
  2487.             ->add(Costanti::RU_DD_INDIRIZZO_MAIL, EmailType::class, array('required' => false, 'label' => $traduci->OttieniElementoDizionario('dati_utente_destinazione_mail', 'dati_utente')->valoreUscita, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')))
  2488.             ->add(Costanti::RU_USERNAME, TextType::class, array('required' => true, 'label' => $traduci->OttieniElementoDizionario('dati_utente_username', 'dati_utente')->valoreUscita, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')))
  2489.             ->add(Costanti::RU_PASSWORD, PasswordType::class, array('required' => true, 'label' => $traduci->OttieniElementoDizionario('dati_utente_password', 'dati_utente')->valoreUscita, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')))
  2490.             ->add(Costanti::RU_RIPETI_PASSWORD, PasswordType::class, array('required' => true, 'label' => $traduci->OttieniElementoDizionario('dati_utente_ripeti_password', 'dati_utente')->valoreUscita, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')))
  2491.             ->add(Costanti::RU_PRIVACY,  CheckboxType::class, array('required' => true,'label' => $traduci->OttieniElementoDizionario("carrello_privacy_esprimo_il_consenso", "carrello")->valoreUscita, 'attr' => array('class' => "form-control input-sm", 'style' => 'padding-left:5px;padding-right:5px;')));
  2492.         /** @var UserCampiCustomTestata[] $campiCustomUser */
  2493.         $campiCustomUser = $this->doctrine->getRepository(UserCampiCustomTestata::class)->findBy(array('luogoVisualizzazione' => 'registrazioneUtente'));
  2494.         foreach ($campiCustomUser as $tst) {
  2495.             $formBuilder = $this->AggiungiChildAFormUserCampiCustom($tst, $formBuilder);
  2496.         }
  2497.         return $formBuilder;
  2498.     }
  2499.     /*
  2500.      * ============================================================================================================================
  2501.      * ============================================  RISORSE ANAGRAFICHE  =========================================================
  2502.      * ============================================================================================================================
  2503.      */
  2504.     public function RitornaArrayTipoRisorsa(){
  2505.         return array(
  2506.             'Immagine' => 'immagine',
  2507.             'Pdf' => 'pdf',
  2508.             'Link esterno' => 'linkEsterno',
  2509.             'File' => 'file'
  2510.         );
  2511.     }
  2512.     public function RitornaArrayTipoDato(){
  2513.         return array(
  2514.             'Testo' => 'text',
  2515.             'Numero intero' => 'integer',
  2516.             'Numero decimale' => 'decimal',
  2517.             'Boolean' => 'boolean',
  2518.             'Data' => 'date',
  2519.             'Time' => 'time',
  2520.             'Data e ora' => 'datetime'
  2521.         );
  2522.     }
  2523.     /*
  2524.      * ============================================================================================================================
  2525.      * ============================================  USER CAMPI CUSTOM  =========================================================
  2526.      * ============================================================================================================================
  2527.      */
  2528.     public function RitornaArrayLuoghiVisualizzazione(){
  2529.         return array(
  2530.             'Registrazione utente' => 'registrazioneUtente',
  2531.             'Effettuo ordine' => 'effettuoOrdine',
  2532.         );
  2533.     }
  2534.     public function RitornaChiaviUserCampiCustom(UserCampiCustomTestata $testata){
  2535.         $ritorno = array();
  2536.         /** @var UserCampiCustomDettaglio $item */
  2537.         foreach ($testata->getDettaglio() as $item) {
  2538.             /*
  2539.              *  'Testo' => 'text',
  2540.                     'Checkbox' => 'checkbox',
  2541.                     'Radio' => 'radio',
  2542.                     'Select' => 'select'
  2543.              */
  2544.             $campo = $item->getCampo();
  2545.             if ($campo) {
  2546.                 array_push($ritorno, 'usrCst_' . $item->getId());
  2547.             }
  2548.         }
  2549.         return $ritorno;
  2550.     }
  2551.     /**
  2552.      * @param $stringaCompleta
  2553.      * @return UserCampiCustomDettaglio|null
  2554.      */
  2555.     public function RitornaDettaglioUserCampiCustom($stringaCompleta){
  2556.         $id = str_replace('usrCst_', '', $stringaCompleta);
  2557.         return $this->doctrine->getRepository(UserCampiCustomDettaglio::class)->find($id);
  2558.     }
  2559.     public function AggiungiChildAFormUserCampiCustom(UserCampiCustomTestata $testata, FormBuilderInterface $formBuilder){
  2560.         /** @var UserCampiCustomDettaglio $item */
  2561.         foreach ($testata->getDettaglio() as $item) {
  2562.             /*
  2563.              *  'Testo' => 'text',
  2564.                     'Checkbox' => 'checkbox',
  2565.                     'Radio' => 'radio',
  2566.                     'Select' => 'select'
  2567.              */
  2568.             $campo = $item->getCampo();
  2569.             if ($campo) {
  2570.                 $tipo = "";
  2571.                 $arrayValoriSelect = array();
  2572.                 if ($campo->getObbligatorio()) {
  2573.                     array_push($chiaviControllo, $campo->getId());
  2574.                 }
  2575.                 switch ($campo->getTipoDato()) {
  2576.                     case "text":
  2577.                     default:
  2578.                     {
  2579.                         $tipo = TextType::class;
  2580.                         break;
  2581.                     }
  2582.                     case "checkbox":
  2583.                     {
  2584.                         $tipo = CheckboxType::class;
  2585.                         break;
  2586.                     }
  2587.                     case "radio":
  2588.                     case "select":
  2589.                     {
  2590.                         $tipo = ChoiceType::class;
  2591.                         if (strpos($campo->getValoriSelect(), "$$") !== false) {
  2592.                             $arr = explode("$$", $campo->getValoriSelect());
  2593.                             $arrayValoriSelect = array();
  2594.                             foreach ($arr as $item) {
  2595.                                 $arrayValoriSelect[$item] = $item;
  2596.                             }
  2597.                         } else if ($tipo != "") {
  2598.                             array_push($arrayValoriSelect, $tipo);
  2599.                         }
  2600.                         break;
  2601.                     }
  2602.                 }
  2603.                 $arrayConfigurazione = array(
  2604.                     'label' => $campo->getTestoVisualizzato(),
  2605.                     'required' => $campo->getObbligatorio(),
  2606.                     'attr' => array(
  2607.                         'class' => "form-control input-sm",
  2608.                         'style' => 'padding-left:5px;padding-right:5px;'
  2609.                     )
  2610.                 );
  2611.                 if ($campo->getTipoDato() == "select" || $campo->getTipoDato() == 'radio') {
  2612.                     $arrayConfigurazione["choices"] = $arrayValoriSelect;
  2613.                     if ($campo->getTipoDato() == 'radio') {
  2614.                         $arrayConfigurazione["expanded"] = true;
  2615.                         $arrayConfigurazione["multiple"] = false;
  2616.                     }
  2617.                 }
  2618.                 $formBuilder->add(
  2619.                     'usrCst_' . $item->getId(),
  2620.                     $tipo,
  2621.                     $arrayConfigurazione
  2622.                 );
  2623.             }
  2624.         }
  2625.         return $formBuilder;
  2626.     }
  2627.     /*
  2628.      * ============================================================================================================================
  2629.      * ====================================================  TEMPLATING  ==========================================================
  2630.      * ============================================================================================================================
  2631.      */
  2632.     public function RitornaListaBlocchiPerLayout($tipoLayout){
  2633.         $lat = Templating::RitornaArrayFinaleInBaseAlLayout($tipoLayout, $this->router);
  2634.         return $lat;
  2635.     }
  2636.     public function VerificaSeMappaConPrezzoSuRichiesta(MappaCategoriaArticolo $mappa){
  2637.         $ritorno = false;
  2638.         if($mappa){
  2639.             if($mappa->articolo){
  2640.                 $ritorno = $mappa->articolo->prezzoSuRichiesta;
  2641.             }
  2642.             if(!$ritorno){
  2643.                 if($mappa->categoria1){
  2644.                     $ritorno = $mappa->categoria1->prezzoSuRichiesta;
  2645.                 }
  2646.                 if(!$ritorno && $mappa->categoria2){
  2647.                     $ritorno = $mappa->categoria2->prezzoSuRichiesta;
  2648.                 }
  2649.                 if(!$ritorno && $mappa->categoria3){
  2650.                     $ritorno = $mappa->categoria3->prezzoSuRichiesta;
  2651.                 }
  2652.                 if(!$ritorno && $mappa->categoria4){
  2653.                     $ritorno = $mappa->categoria4->prezzoSuRichiesta;
  2654.                 }
  2655.                 if(!$ritorno && $mappa->categoria5){
  2656.                     $ritorno = $mappa->categoria5->prezzoSuRichiesta;
  2657.                 }
  2658.             }
  2659.         }
  2660.         return $ritorno;
  2661.     }
  2662.     /**
  2663.      * @param $idPagina
  2664.      * @param $ritorno array|null
  2665.      * @param $valoriSupporto array
  2666.      * @param $twigAppArray array|null
  2667.      * @return array
  2668.      * <p>Valori di supporto viene passato a twig nel render del template</p>
  2669.      */
  2670.     public function renderizzaPaginaOComponente($idPagina, $ritorno, $valoriSupporto, $locale = 'it', $htmlCustom = '', $ordineCasuale = false, $padreAvvio = false, $twigAppArray = null)
  2671.     {
  2672.         if (!$ritorno){
  2673.             $ritorno = array(
  2674.                 'html' => '',
  2675.                 'css' => ''
  2676.             );
  2677.         }
  2678.         $this->locale = $locale;
  2679.         $pagina = null;
  2680.         if ($idPagina != 0) {
  2681.             $pagina = $this->doctrine->getRepository(PagineEComponenti::class)->find($idPagina);
  2682.             // Carico le traduzioni
  2683.             $this->translating->CaricaTraduzioniPerLayoutPagineEComponenti($pagina, $locale);
  2684.         }
  2685.         if ($pagina){
  2686.             if ($padreAvvio)
  2687.             {
  2688.                 $ritorno['css'] = $ritorno['css'] . ' ' . ($pagina->getCssAggiuntivo() ? $pagina->getCssAggiuntivo() : '');
  2689.             }
  2690.             $ritorno['css'] = $ritorno['css'] . ' ' . $pagina->getCss();
  2691.             $ritorno['html'] = $pagina->getHtml();
  2692.         }else if ($htmlCustom != ''){
  2693.             $ritorno['html'] = $htmlCustom;
  2694.         }
  2695.         if($pagina->getTipoPagina() == ("rigaHomeShop"||"paginaDettaglioArticolo"||"dettaglioArticolo"||"modalRichiestaPrezzo") && strpos($ritorno["html"], '<sezione-da-verificare ') !== false) {
  2696.             $prezzoSuRichiesta = false;
  2697.             $chiaveRighe = Templating::ottieniElementoDaUtilizzareInBaseATipoPagina($pagina->getTipoPagina(), $ordineCasuale);
  2698.             $percorso = array('articolo');
  2699.             if(array_key_exists($chiaveRighe, $valoriSupporto))
  2700.                 $prezzoSuRichiesta = Templating::ritornaValoreDaPercorso($valoriSupporto[$chiaveRighe], $percorso, 'prezzoSuRichiesta');
  2701.             if(!$prezzoSuRichiesta){
  2702.                 //Verifico se le categorie hanno il flag su prezzo a richiesta
  2703.                 $prezzoSuRichiesta = Templating::ritornaValoreDaPercorso($valoriSupporto[$chiaveRighe], array('categoria1'), 'prezzoSuRichiesta');
  2704.                 if(!$prezzoSuRichiesta)
  2705.                     $prezzoSuRichiesta = Templating::ritornaValoreDaPercorso($valoriSupporto[$chiaveRighe], array('categoria2'), 'prezzoSuRichiesta');
  2706.                 if(!$prezzoSuRichiesta)
  2707.                     $prezzoSuRichiesta = Templating::ritornaValoreDaPercorso($valoriSupporto[$chiaveRighe], array('categoria3'), 'prezzoSuRichiesta');
  2708.                 if(!$prezzoSuRichiesta)
  2709.                     $prezzoSuRichiesta = Templating::ritornaValoreDaPercorso($valoriSupporto[$chiaveRighe], array('categoria4'), 'prezzoSuRichiesta');
  2710.                 if(!$prezzoSuRichiesta)
  2711.                     $prezzoSuRichiesta = Templating::ritornaValoreDaPercorso($valoriSupporto[$chiaveRighe], array('categoria5'), 'prezzoSuRichiesta');
  2712.             }
  2713.             $stringaRicercaWhile = '<sezione-da-verificare type="sezione" ';
  2714.             if($prezzoSuRichiesta)
  2715.                 $stringaRicercaWhile .= 'ambito="prezzo"';
  2716.             else
  2717.                 $stringaRicercaWhile .= 'ambito="prezzo-su-richiesta"';
  2718.             while (strpos($ritorno["html"], $stringaRicercaWhile) !== false) {
  2719.                 //substringo l'intero tag
  2720.                 $sbs1 = SubstringWithFind::SubstringWithFind(
  2721.                     $stringaRicercaWhile,
  2722.                     '</sezione-da-verificare>',
  2723.                     $ritorno['html']);
  2724.                 $elementoTagCompleto = $sbs1->substring;
  2725.                 $sbTipo = SubstringWithFind::SubstringWithFind(
  2726.                     'type="',
  2727.                     '"',
  2728.                     $elementoTagCompleto,
  2729.                     0,
  2730.                     true
  2731.                 );
  2732.                 $tipo = $sbTipo->substring;
  2733.                 $sbAmbito = SubstringWithFind::SubstringWithFind(
  2734.                     'ambito="',
  2735.                     '"',
  2736.                     $elementoTagCompleto,
  2737.                     0,
  2738.                     true
  2739.                 );
  2740.                 $ambito = $sbAmbito->substring;
  2741.                 $ritorno['html'] = str_replace($elementoTagCompleto, '', $ritorno['html']);
  2742.             }
  2743.         }
  2744.         while(strpos($ritorno["html"], "<TMPLT ") !== false){
  2745.             //se trovo l'elemento TMPLT effettuo l'azione in base al tp
  2746.             //substringo l'intero tag
  2747.             $sbs1 = SubstringWithFind::SubstringWithFind(
  2748.                 '<TMPLT ',
  2749.                 '/>',
  2750.                 $ritorno['html']);
  2751.             $elementoTagCompleto = $sbs1->substring;
  2752.             //ottengo il tp
  2753.             $sbTipo = SubstringWithFind::SubstringWithFind(
  2754.                 'tp="',
  2755.                 '"',
  2756.                 $elementoTagCompleto,
  2757.                 0,
  2758.                 true
  2759.             );
  2760.             $tipo = $sbTipo->substring;
  2761.             switch ($tipo){
  2762.                 case 'ALTRO-LAYOUT':{
  2763.                     $sbs2 = SubstringWithFind::SubstringWithFind(
  2764.                         'component-id="',
  2765.                         '"',
  2766.                         $elementoTagCompleto,
  2767.                         0,
  2768.                         true
  2769.                     );
  2770.                     $riferimentoId = $sbs2->substring;
  2771.                     if ($riferimentoId == 'default' || $riferimentoId == 'form_default') {
  2772.                         $ritorno['html'] = str_replace(
  2773.                             $elementoTagCompleto,
  2774.                             $this->ritornaDefaultLayoutPagineEComponenti($pagina->getTipoPagina(), $valoriSupporto, ($riferimentoId == 'form_default' ? true : false)),
  2775.                             $ritorno['html']
  2776.                         );
  2777.                     } else {
  2778.                         $rit = $this->renderizzaPaginaOComponente($riferimentoId, null, $valoriSupporto, $locale, '', $ordineCasuale, false, $twigAppArray);
  2779.                         $ritorno['css'] = $ritorno['css'] . ' ' . $rit["css"];
  2780.                         $ritorno['html'] = str_replace($elementoTagCompleto, $rit['html'], $ritorno['html']);
  2781.                     }
  2782.                     break;
  2783.                 }
  2784.                 case "DATO-DB":{
  2785.                     $ritornoConvertDb = Templating::ConvertiStringaDatoDb($elementoTagCompleto);
  2786.                     $chiaveRighe = Templating::ottieniElementoDaUtilizzareInBaseATipoPagina($pagina->getTipoPagina(), $ordineCasuale);
  2787.                     if (array_key_exists($chiaveRighe, $valoriSupporto)) {
  2788.                         $valoreSostituito = '';
  2789.                         $valoreInizialeLink = '';
  2790.                         if($this->logger)
  2791.                             $this->logger->debug('Click automatico: ' . $ritornoConvertDb->clickLinkAutomatico);
  2792.                         if($ritornoConvertDb->clickLinkAutomatico != '' || $ritornoConvertDb->clickLink != ''){
  2793.                             $valoreLink = $ritornoConvertDb->clickLink;
  2794.                             if($valoreLink == '' && $ritornoConvertDb->clickLinkAutomatico != ''){
  2795.                                 $valoreLink = Templating::creaLinkAutomatico($ritornoConvertDb->clickLinkAutomatico, $this->router, $valoriSupporto, $pagina, $ordineCasuale, $this->logger, $this);
  2796.                             }
  2797.                             $valoreInizialeLink .= ('<a href="' . $valoreLink . '">');
  2798.                             if($this->startsWith($ritornoConvertDb->clickLinkAutomatico, 'js_')){//Ad esempio js_ApriModal(false);
  2799.                                 $valoreInizialeLink .= '<a onclick="' . substr($ritornoConvertDb->clickLinkAutomatico, 3) . '">';
  2800.                             }
  2801.                         }
  2802.                         if ($ritornoConvertDb->datoSpeciale != '') {
  2803.                             $valoreSostituito = Templating::ritornaValoreDatoDbSpeciale($ritornoConvertDb, $this, $valoriSupporto[$chiaveRighe]);
  2804.                         } else {
  2805.                             $valoreSostituito = Templating::ritornaValoreDaPercorso($valoriSupporto[$chiaveRighe], $ritornoConvertDb->percorso, $ritornoConvertDb->nomeColonna, $ritornoConvertDb);
  2806.                         }
  2807.                         if ($ritornoConvertDb->immagine) {
  2808.                             if ($this->imageNotFound == null){
  2809.                                 $this->imageNotFound = $this->impostazioni->ritornaImpostazioneDaNome('ImmagineNonPresenteProdotto');
  2810.                             }
  2811.                             $valoreSostituito = ('<img src="' . ($valoreSostituito != '' ? $valoreSostituito : $this->imageNotFound ) . '" class="' . $ritornoConvertDb->class . '" id="' . $ritornoConvertDb->id . '" style="' . $ritornoConvertDb->style . '" />');
  2812.                         }
  2813.                         $valoreSostituito = ('<span style="' . $ritornoConvertDb->style . '" class="' . $ritornoConvertDb->class . '" id="' . $ritornoConvertDb->id . '">' . $valoreSostituito . '</span>');
  2814.                         if($ritornoConvertDb->clickLinkAutomatico != '' || $ritornoConvertDb->clickLink != ''){
  2815.                             $valoreSostituito = $valoreInizialeLink . $valoreSostituito . '</a>';
  2816.                         }
  2817.                         $ritorno['html'] = str_replace($elementoTagCompleto, $valoreSostituito, $ritorno['html']);
  2818.                     }else{
  2819.                         $ritorno['html'] = str_replace($elementoTagCompleto, '<p style="color:red; font-weight: bold; text-decoration: underline; font-style: oblique;">Errore DATO-DB. Chiave righe: ' . $chiaveRighe . ' non trovata</p>', $ritorno['html']);
  2820.                     }
  2821.                     break;
  2822.                 }
  2823.                 case "TIPOLOGIE-PREIMPOSTATE-SELECT":{
  2824.                     $ritornoElementiBase = RitornoElementiBase::OttieniDaElementoTag($elementoTagCompleto);
  2825.                     $chiaveRighe = Templating::ottieniElementoDaUtilizzareInBaseATipoPagina($pagina->getTipoPagina(), $ordineCasuale);
  2826.                     $this->translating->CaricaTraduzioniDaFamiglia('home_shop', $locale);
  2827.                     if (array_key_exists($chiaveRighe, $valoriSupporto)){
  2828.                         $ritorno['html'] = str_replace($elementoTagCompleto, Templating::ritornaSelectTipologiePreimpostate($valoriSupporto[$chiaveRighe], $ritornoElementiBase, $this), $ritorno['html']);
  2829.                     }else{
  2830.                         $ritorno['html'] = str_replace($elementoTagCompleto, '<p style="color:red; font-weight: bold; text-decoration: underline; font-style: oblique;">Errore TIPOLOGIE-PREIMPOSTATE-SELECT. Chiave righe: ' . $chiaveRighe . ' non trovata</p>', $ritorno['html']);
  2831.                     }
  2832.                     break;
  2833.                 }
  2834.                 case "ELEMENTO-DIZIONARIO":{
  2835.                     $ritornoDizionario = RitornoElementoDizionario::OttieniDaElementoTag($elementoTagCompleto);
  2836.                     $traduzione = $this->translating->OttieniElementoDizionario($ritornoDizionario->identificativo, $ritornoDizionario->famiglia);
  2837.                     $ritornoElementiBase = RitornoElementiBase::OttieniDaElementoTag($elementoTagCompleto);
  2838.                     if ($traduzione){
  2839.                         if ($ritornoDizionario->link != '' || $ritornoDizionario->linkAutomatico != ''){
  2840.                             $link = $ritornoDizionario->link;
  2841.                             if ($ritornoDizionario->linkAutomatico != ''){
  2842.                                 $link = Templating::creaLinkAutomatico($ritornoDizionario->linkAutomatico, $this->router, $valoriSupporto, $pagina, $ordineCasuale, $this->logger, $this);
  2843.                             }
  2844.                             $valFinale = '<a ' . $ritornoElementiBase->RitornaStringaElementiBase() . ' href="' . $link . '" title="' . $traduzione->valoreUscita . '">' . $traduzione->valoreUscita . '</a>';
  2845.                         } else {
  2846.                             $valFinale = '<span ' . $ritornoElementiBase->RitornaStringaElementiBase() . '>' . $traduzione->valoreUscita . '</span>';
  2847.                         }
  2848.                         $ritorno['html'] = str_replace($elementoTagCompleto, $valFinale, $ritorno['html']);
  2849.                     }else{
  2850.                         $ritorno['html'] = str_replace($elementoTagCompleto, '<p style="color: red; font-weight: bold; text-decoration: underline; font-style: oblique;">Errore! Identificativo o famiglia non trovato!</p>', $ritorno['html']);
  2851.                     }
  2852.                     break;
  2853.                 }
  2854.                 case "BREADCRUMB":{
  2855.                     $ritornoElemento = RitornoBreadCrumb::OttieniDaElementoTag($elementoTagCompleto);
  2856.                     $rttt = Templating::eseguiBreadcrumb($ritornoElemento, $valoriSupporto, $this, $locale, $this->logger);
  2857.                     $ritorno['html'] = str_replace($elementoTagCompleto, $rttt["html"] , $ritorno['html']);
  2858.                     $ritorno["css"] = $ritorno["css"] . $rttt["css"];
  2859.                 }
  2860.                 case "MOLTIPLICATORE-LAYOUT":{
  2861.                     $ritornoMoltiplicatore = RitornoDaMoltiplicatoreLayout::OttieniDaElementoTag($elementoTagCompleto);
  2862.                     /** @var  $listaPagine PagineEComponenti[] */
  2863.                     $listaPagine = $this->doctrine->getRepository(PagineEComponenti::class)->createQueryBuilder('pagine_ecomponenti')
  2864.                         ->where("pagine_ecomponenti.tipoPagina NOT LIKE :pag")->setParameter('pag', 'Pagina%')
  2865.                         ->andWhere("pagine_ecomponenti.tipoPagina NOT LIKE :mail")->setParameter('mail', 'Mail%')
  2866.                         ->andWhere("pagine_ecomponenti.html <> '' AND pagine_ecomponenti.html IS NOT NULL")
  2867.                         ->andWhere('pagine_ecomponenti.id = :iden')->setParameter('iden', $ritornoMoltiplicatore->componentId)
  2868.                         ->setMaxResults(1)
  2869.                         ->orderBy('pagine_ecomponenti.categoria, pagine_ecomponenti.tipoPagina')
  2870.                         ->getQuery()->getResult();
  2871.                     if (count($listaPagine) > 0){
  2872.                         $rttt = Templating::eseguiMoltiplicatoreLayout($listaPagine[0], $ritornoMoltiplicatore, $valoriSupporto, $this, $locale, $ritornoMoltiplicatore->ordineCasuale, $this->logger, $twigAppArray);
  2873.                         $ritorno['html'] = str_replace($elementoTagCompleto, $rttt["html"] , $ritorno['html']);
  2874.                         $ritorno["css"] = $ritorno["css"] . $rttt["css"];
  2875.                     }else{
  2876.                         $ritorno['html'] = str_replace($elementoTagCompleto, '<p style="color:red; font-weight: bold; text-decoration: underline; font-style: oblique;">Errore. Componente con ID: ' . $ritornoMoltiplicatore->componentId . ' non trovato</p>', $ritorno['html']);
  2877.                     }
  2878.                     break;
  2879.                 }
  2880.                 case "PAGINATION":{
  2881.                     $ritornoBase = RitornoElementiBase::OttieniDaElementoTag($elementoTagCompleto);
  2882.                     $sbs2 = SubstringWithFind::SubstringWithFind(
  2883.                         'mstr-avanti="',
  2884.                         '"',
  2885.                         $elementoTagCompleto,
  2886.                         0,
  2887.                         true
  2888.                     );
  2889.                     $mostraAvanti = $sbs2->substring;
  2890.                     $sbs3 = SubstringWithFind::SubstringWithFind(
  2891.                         'mstr-indietro="',
  2892.                         '"',
  2893.                         $elementoTagCompleto,
  2894.                         0,
  2895.                         true
  2896.                     );
  2897.                     $mostraIndietro = $sbs3->substring;
  2898.                     $sbs4 = SubstringWithFind::SubstringWithFind(
  2899.                         'nr-pag="',
  2900.                         '"',
  2901.                         $elementoTagCompleto,
  2902.                         0,
  2903.                         true
  2904.                     );
  2905.                     $nrPag = $sbs4->substring;
  2906.                     $routeRiferimento = Templating::ritornaRoutePaginationInBaseATipoPagina($pagina->getTipoPagina());
  2907.                     $stringaRitorno = Templating::ritornaStringaPagination($mostraAvanti, $mostraIndietro, $nrPag, $this, $routeRiferimento, $this->router, $valoriSupporto, $this->logger, $twigAppArray);
  2908.                     $ritorno['html'] = str_replace($elementoTagCompleto, $stringaRitorno, $ritorno['html']);
  2909.                     break;
  2910.                 }
  2911.                 case "MENU-CATEGORIE":{
  2912.                     $sbs1 = SubstringWithFind::SubstringWithFind(
  2913.                         '<TMPLT ',
  2914.                         '<TMPLT />',
  2915.                         $ritorno['html']);
  2916.                     $elementoTagCompleto = $sbs1->substring;
  2917.                     //$this->logger->debug($sbs1->substring);
  2918.                     $rtt = Templating::eseguiStrutturaMenuCategorie($elementoTagCompleto, $valoriSupporto, $pagina, $this, $locale, $this->router, $this->translating, null, $this->logger, $twigAppArray);
  2919.                     $ritorno['html'] = str_replace($elementoTagCompleto, $rtt['html'], $ritorno['html']);
  2920.                     $ritorno['css'] = $ritorno['css'] . $rtt['css'];
  2921.                     break;
  2922.                 }
  2923.                 case "MENU-CATEGORIE-ORIZZONTALE-DROPDOWN":{
  2924.                     $sbs1 = SubstringWithFind::SubstringWithFind(
  2925.                         '<TMPLT ',
  2926.                         ' />',
  2927.                         $ritorno['html']);
  2928.                     $elementoTagCompleto = $sbs1->substring;
  2929.                     //$this->logger->debug($sbs1->substring);
  2930.                     $rtt = Templating::eseguiStrutturaMenuCategorieOrizzontaleDropdown($elementoTagCompleto, $valoriSupporto, $pagina, $this, $locale, $this->router, $this->translating, null, $this->logger, $twigAppArray);
  2931.                     $ritorno['html'] = str_replace($elementoTagCompleto, $rtt['html'], $ritorno['html']);
  2932.                     $ritorno['css'] = $ritorno['css'] . $rtt['css'];
  2933.                     break;
  2934.                 }
  2935.                 case "GRIGLIA-ORDINAZIONE-VARIANTI":{
  2936.                     $sbs1 = SubstringWithFind::SubstringWithFind(
  2937.                         '<TMPLT ',
  2938.                         ' />',
  2939.                         $ritorno['html']);
  2940.                     $elementoTagCompleto = $sbs1->substring;
  2941.                     //$this->logger->debug($sbs1->substring);
  2942.                     $rtt = Templating::eseguiGrigliaOrdinazioneVarianti($elementoTagCompleto, $valoriSupporto, $pagina, $this, $locale, $this->router, $this->translating, null, $this->logger, $twigAppArray);
  2943.                     $ritorno['html'] = str_replace($elementoTagCompleto, $rtt['html'], $ritorno['html']);
  2944.                     $ritorno['css'] = $ritorno['css'] . $rtt['css'];
  2945.                     break;
  2946.                 }
  2947.                 case "CORENAV": {
  2948.                     $sbs1 = SubstringWithFind::SubstringWithFind(
  2949.                         '<TMPLT tp="CORENAV" ',
  2950.                         '<TMPLT CORENAV />',
  2951.                         $ritorno['html']);
  2952.                     $elementoNuovo = $sbs1->substring;
  2953.                     $sbsTestata = SubstringWithFind::SubstringWithFind(
  2954.                         '<TMPLT tp="CORENAV" ',
  2955.                         '>',
  2956.                         $elementoNuovo
  2957.                     );
  2958.                     $testata = $sbsTestata->substring;
  2959.                     $sbElementoDb = SubstringWithFind::SubstringWithFind(
  2960.                         ' elemento-visualizzato="',
  2961.                         '"',
  2962.                         $elementoTagCompleto,
  2963.                         0,
  2964.                         true
  2965.                     );
  2966.                     $elementoDbDaVisualizzare = $sbElementoDb->substring;
  2967.                     $rtt = Templating::eseguiStrutturaCoreNav($elementoTagCompleto, $elementoNuovo, $testata, $elementoDbDaVisualizzare, $valoriSupporto, $pagina, $this, $locale, $this->router, $this->translating, $this->logger, $twigAppArray);
  2968.                     $ritorno['html'] = str_replace($elementoNuovo, $rtt, $ritorno['html']);
  2969.                     break;
  2970.                 }
  2971.                 case "DIV-CLICCABILE":{
  2972.                     $sbs1 = SubstringWithFind::SubstringWithFind(
  2973.                         '<TMPLT ',
  2974.                         '<TMPLT DIV-CLICCABILE />',
  2975.                         $ritorno['html']);
  2976.                     $elementoNuovo = $sbs1->substring;
  2977.                     $sbsTestata = SubstringWithFind::SubstringWithFind(
  2978.                         '<TMPLT ',
  2979.                         '>',
  2980.                         $elementoNuovo
  2981.                     );
  2982.                     //$this->logger->debug('Sbs testata: ' . $sbsTestata->substring);
  2983.                     $stringaSostituireTestata = Templating::convertiTestataDivSecondario($sbsTestata->substring, $this, $this->router, $pagina, $valoriSupporto, $this->logger, $ordineCasuale);
  2984.                     //$this->logger->debug('Stringa sostituire testat: ' . $stringaSostituireTestata);
  2985.                     $elementoNuovo = str_replace($sbsTestata->substring, $stringaSostituireTestata, $elementoNuovo);
  2986.                     $elementoNuovo = str_replace('<TMPLT DIV-CLICCABILE />', '</a>', $elementoNuovo);
  2987.                     $ritorno['html'] = str_replace($sbs1->substring, $elementoNuovo, $ritorno['html']);
  2988.                     break;
  2989.                 }
  2990.                 case "GENERA_ROUTE":{
  2991.                     $sbRoute = SubstringWithFind::SubstringWithFind(
  2992.                         ' route="',
  2993.                         '"',
  2994.                         $elementoTagCompleto,
  2995.                         0,
  2996.                         true
  2997.                     );
  2998.                     $sostituzione = Templating::creaLinkAutomatico($sbRoute->substring, $this->router, $valoriSupporto, $pagina, $ordineCasuale, $this->logger, $this);
  2999.                     $ritorno['html'] = str_replace($elementoTagCompleto, $sostituzione, $ritorno['html']);
  3000.                     break;
  3001.                 }
  3002.                 case "BUTTON":{
  3003.                     $ritornoButton = RitornoButton::RitonaDaTagCompleto($elementoTagCompleto);
  3004.                     $valoreLink = $ritornoButton->clicLink;
  3005.                     if ($ritornoButton->linkAutomatico != '' && !$this->startsWith($ritornoButton->linkAutomatico, 'js_')){
  3006.                         $valoreLink = Templating::creaLinkAutomatico($ritornoButton->linkAutomatico, $this->router, $valoriSupporto, $pagina, $ordineCasuale, $this->logger, $this);
  3007.                     }
  3008.                     $testo = $ritornoButton->testo;
  3009.                     if ($ritornoButton->identificativo != ''){
  3010.                         $trad = $this->translating->OttieniElementoDizionario($ritornoButton->identificativo, $ritornoButton->famiglia);
  3011.                         $testo = $trad->valoreUscita;
  3012.                     }
  3013.                     if($this->startsWith($ritornoButton->linkAutomatico, 'js_')){//Ad esempio js_ApriModal(false);
  3014.                         $onClk = substr($ritornoButton->linkAutomatico, 3);
  3015.                         if($this->startsWith($ritornoButton->linkAutomatico, 'js_ApriModalRichiestaPrezzo(')){
  3016.                             $chiaveRighe = Templating::ottieniElementoDaUtilizzareInBaseATipoPagina($pagina->getTipoPagina(), $ordineCasuale);
  3017.                             $idMp = Templating::ritornaValoreDaPercorso($valoriSupporto[$chiaveRighe], array(), 'id');
  3018.                             $onClk = "ApriModalRichiestaPrezzo('" . $idMp . "');";
  3019.                         }
  3020.                         $stringaSostituzione = ('<button onclick="' . $onClk . '" id="' . $ritornoButton->id . '" name="' . $ritornoButton->name . '" class="' . $ritornoButton->class . '" style="' . $ritornoButton->style . '">' . $testo . '</button>');
  3021.                     }else {
  3022.                         $tag = '<button ';
  3023.                         if ($valoreLink != '') {
  3024.                             $tag = '<a ';
  3025.                         } else {
  3026.                             if ($ritornoButton->type != '' && $ritornoButton->type != 'button') {
  3027.                                 $tag = '<input type="' . $ritornoButton->type . '" ';
  3028.                             }
  3029.                         }
  3030.                         $aggiungiOnClick = '';
  3031.                         if (($ritornoButton->type == 'button' || $ritornoButton->type == '') && !$ritornoButton->linkAutomatico != '') {
  3032.                             $aggiungiOnClick = ' onclick="location.href=\'' . $ritornoButton->clicLink . '\'" ';
  3033.                         }
  3034.                         $stringaSostituzione = $tag . $aggiungiOnClick . '  href="' . $valoreLink . '" id="' . $ritornoButton->id . '" name="' . $ritornoButton->name . '" class="' . $ritornoButton->class . '" style="' . $ritornoButton->style . '" ';
  3035.                         if ($ritornoButton->type != '' && $ritornoButton->type != 'button') {
  3036.                             $stringaSostituzione .= ' value="' . $testo . '">';
  3037.                         } else {
  3038.                             $stringaSostituzione .= '">' . $testo . ($valoreLink != '' ? '</a>' : '</button>');
  3039.                         }
  3040.                     }
  3041.                     $ritorno['html'] = str_replace($elementoTagCompleto, $stringaSostituzione, $ritorno['html']);
  3042.                     break;
  3043.                 }
  3044.                 case "VISTA-ATTRIBUTI":{
  3045.                     $sbs1 = SubstringWithFind::SubstringWithFind(
  3046.                         '<TMPLT ',
  3047.                         '</VISTA-ATTRIBUTI>',
  3048.                         $ritorno['html']);
  3049.                     $elementoNuovo = $sbs1->substring;
  3050.                     $sbsTestata = SubstringWithFind::SubstringWithFind(
  3051.                         '<TMPLT ',
  3052.                         '>',
  3053.                         $elementoNuovo
  3054.                     );
  3055.                     $rtt = Templating::eseguiStrutturaVistaAttributi($elementoNuovo, $valoriSupporto, $this, $locale, $this->router, $this->translating, null, $this->logger);
  3056.                     $ritorno['html'] = str_replace($elementoNuovo, $rtt['html'], $ritorno['html']);
  3057.                     $ritorno['css'] = $ritorno['css'] . $rtt['css'];
  3058.                 }
  3059.                 default:{
  3060.                     //se non trovo il corripondente Tp lo sostituisco con una striga di errore
  3061.                     $ritorno['html'] = str_replace($elementoTagCompleto, '<p style="color:red; font-weight: bold; text-decoration: underline; font-style: oblique;">Errore. Tipo elemento non trovato: ' . $tipo . '</p>', $ritorno['html']);
  3062.                     break;
  3063.                 }
  3064.             }
  3065.         }
  3066.         if ($padreAvvio && $pagina){
  3067.             //Verifico se i vari form mappati hanno il corrispondente nella variabile passata a twig
  3068.             $verificatoreForm = new VerificatoreMatchForm($this);
  3069.             $ritorno['html'] = $verificatoreForm->VerificaCodiceHtml($valoriSupporto, $ritorno['html']);
  3070.             $ritorno['html'] = Templating::ElaboraValoriSpecialiInCodiceHTML($ritorno['html'], $valoriSupporto, $this, $pagina, $ordineCasuale, $this->logger); //Sostituisco i valori speciali %%: :%% con i corrispondenti dopo aver caricato tutto il layout
  3071.             $ritorno['html'] = Templating::ElaboraTagSostituzionePercorso($ritorno['html'], $valoriSupporto, $this, $this->logger); // Sostituisco i valori %££% con i valori corrispondenti al percorso indicato all'interno
  3072.             $ritorno['html'] = Templating::ElaboraTagSostituzioneEntita($ritorno['html'], $valoriSupporto, $this, $this->logger); // Sostituisco i valori entità per popolare le opzioni select
  3073.         }
  3074.         return $ritorno;
  3075.     }
  3076. }