src/Service/TicketService.php line 30

Open in your IDE?
  1. <?php
  2. namespace App\Service;
  3. use App\Entity\Slave\Client;
  4. use App\Entity\Slave\ClientPhone;
  5. use App\Entity\Slave\Termid;
  6. use App\Entity\Slave\Ticket;
  7. use App\Entity\Slave\Warehouse;
  8. use App\Entity\Slave\TicketLog;
  9. use App\Service\UtilitiesService;
  10. use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
  11. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  12. use Symfony\Component\HttpFoundation\Response;
  13. class TicketService
  14. {
  15.     // IMPORT DA EMAIL
  16.     // Chiamata da ScriptController
  17.     static public function importTickets($em$emMaster$user$inbox$email$header$supplierTicketEmails)
  18.     {
  19.         if(property_exists($header"subject"))
  20.             $subject $header->subject// Prendo l'oggetto
  21.         else
  22.             $subject "";
  23.         if($subject != "")
  24.             $subject imap_mime_header_decode($subject)[0]->text;
  25.         $isHtml false;
  26.         $dt explode(', '$header->date); // Prendo la data di creazione
  27.         $dts explode(' ('$dt[sizeof($dt) - 1]); // Pulisco mettendo il formato per il create_date_from_format
  28.         $datetimeStart date_create_from_format('j M Y H:i:s O'$dts[0]); //4 Jul 2023 16:00:11 +0200"
  29.         
  30.         $supplier null;
  31.         foreach($supplierTicketEmails as $ste){
  32.             if($supplier == null){
  33.                 foreach($ste->getSupplier()->getOperations() as $op){
  34.                     if($supplier == null){
  35.                         foreach($op->getSubjectMappings() as $subj){
  36.                             if(strpos($subject$subj->getValue()) !== false){
  37.                                 $supplier $ste->getSupplier();
  38.                                 $isHtml $ste->isHtml();
  39.                                 break;
  40.                             }
  41.                         }
  42.                     }
  43.                 }
  44.             }
  45.         }
  46.         $tickets = array();
  47.         $arrayNumberTermids = array();
  48.         if($supplier != null){
  49.             switch($supplier->getSlug()){
  50.                 case 'nexi-book-monetica':
  51.                 case 'nexi-book-meps':
  52.                     $json TicketService::createJsonFromEmail($inbox$emailfalsefalsefalse);
  53.                     $supplierMonetica $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'nexi-book-monetica'));
  54.                     $supplierMeps $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'nexi-book-meps'));
  55.                     $supplier TicketService::nexiSupplierSearch($supplierMonetica$json);
  56.                     if($supplier == null$supplier TicketService::nexiSupplierSearch($supplierMeps$json);
  57.                     switch($supplier){
  58.                         case 'Monetica':
  59.                             $supplier $supplierMonetica
  60.                             break;
  61.                         case 'Meps':
  62.                             $supplier $supplierMeps
  63.                             break;
  64.                         default: break;
  65.                     }
  66.                     $subjectMapping null;
  67.                     if($supplier != null){
  68.                         foreach($supplier->getOperations() as $op){
  69.                             if($subjectMapping == null){
  70.                                 foreach($op->getSubjectMappings() as $sm){
  71.                                     if(strpos($subject$sm->getValue()) !== false){
  72.                                         $subjectMapping $sm;
  73.                                         break;
  74.                                     }
  75.                                 }
  76.                             }
  77.                             else
  78.                                 break;
  79.                         }
  80.                     }
  81.                     if($subjectMapping != null){
  82.                         $operation $subjectMapping->getOperation();
  83.                         [$ticket$arrayNumberTermids] = TicketService::createTicket($em$user$supplier$operation$datetimeStart$json$arrayNumberTermids);
  84.                         if($supplier == null){
  85.                             $ticket->setSystemError(true);
  86.                             $ticket->setSystemErrorSlug('supplier');
  87.                             $ticket->setSystemErrorDetails("Non è stato possibile comprendere qual'è il fornitore NEXI (Meps o Monetica)");
  88.                             $em->flush();
  89.                         }
  90.                         if($ticket != null)
  91.                             array_push($tickets$ticket);
  92.                     }
  93.                     break;
  94.                 case 'csc---nexi-book-monetica':
  95.                 case 'csc---nexi-book-meps':
  96.                     if($isHtml)
  97.                         $json TicketService::createJsonFromEmail($inbox$emailtruefalsefalse);
  98.                     else
  99.                         $json TicketService::createJsonFromEmail($inbox$emailfalsefalsefalse);
  100.                     $supplierMonetica $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---nexi-book-monetica'));
  101.                     $supplierMeps $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---nexi-book-meps'));
  102.                     $supplier TicketService::nexiSupplierSearch($supplierMonetica$json);
  103.                     if($supplier == null$supplier TicketService::nexiSupplierSearch($supplierMeps$json);
  104.                     switch($supplier){
  105.                         case 'Monetica':
  106.                             $supplier $supplierMonetica
  107.                             break;
  108.                         case 'Meps':
  109.                             $supplier $supplierMeps
  110.                             break;
  111.                         default: break;
  112.                     }
  113.                     $subjectMapping null;
  114.                     if($supplier != null){
  115.                         foreach($supplier->getOperations() as $op){
  116.                             if($subjectMapping == null){
  117.                                 foreach($op->getSubjectMappings() as $sm){
  118.                                     if(strpos($subject$sm->getValue()) !== false){
  119.                                         $subjectMapping $sm;
  120.                                         break;
  121.                                     }
  122.                                 }
  123.                             }
  124.                             else
  125.                                 break;
  126.                         }
  127.                     }
  128.                     if($subjectMapping != null){
  129.                         $operation $subjectMapping->getOperation();
  130.                         [$ticket$arrayNumberTermids] = TicketService::createTicket($em$user$supplier$operation$datetimeStart$json$arrayNumberTermids);
  131.                         if($supplier == null){
  132.                             $ticket->setSystemError(true);
  133.                             $ticket->setSystemErrorSlug('supplier');
  134.                             $ticket->setSystemErrorDetails("Non è stato possibile comprendere qual'è il fornitore CSC NEXI (Meps o Monetica)");
  135.                             $em->flush();
  136.                         }
  137.                         if($ticket != null)
  138.                             array_push($tickets$ticket);
  139.                     }
  140.                     break;
  141.                 case 'bcc-pos':
  142.                     $found false;
  143.                     foreach($supplier->getOperations() as $op){
  144.                         $subjectMapping $em->getRepository('App\Entity\Slave\OperationSubjectMapping')->findOneByOperationLikeSubject($op->getId(), $subject);
  145.                         if($subjectMapping){
  146.                             $found true;
  147.                             break;
  148.                         }
  149.                     }
  150.                     if($found){
  151.                         // Assegno operazione guardando la chiave tipo intervento e confrontandola con la regex
  152.                         $attachmentsCheck TicketService::getAttachmentsFromEmail($inbox$email); // Prendo allegati email -> struttura array(["is_attachment"] => true/false, ["attachment"] => file)
  153.                         $attachments = array();
  154.                         foreach($attachmentsCheck as $att){
  155.                             if($att['is_attachment'] == 1){
  156.                                 array_push($attachments$att);
  157.                             }
  158.                         }
  159.                         foreach($attachments as $attachment){
  160.                             $jsons = array();
  161.                             $index null;
  162.                             $rows explode("\r\n"$attachment['attachment']);
  163.                             $keys explode(';'$rows[0]);
  164.                             for($i 0$i sizeof($keys); $i++){
  165.                                 if(rtrim(ltrim($keys[$i], '"'), '"') == $supplier->getOperationMapping()){
  166.                                     $index $i;
  167.                                     break;
  168.                                 }
  169.                             }
  170.                             $operation null;
  171.                             for($i 1$i sizeof($rows); $i++){
  172.                                 if($rows[$i] != ''){
  173.                                     $columns explode(';'preg_replace('/\"/'''$rows[$i]));
  174.                                     // Cerco l'operazione che corrisponde al regex
  175.                                     if($index != null){
  176.                                         foreach($supplier->getOperations() as $op){
  177.                                             if(!$op->isUav()){
  178.                                                 if(preg_match('/'.$op->getIdentifierRegex().'/'$columns[$index])){
  179.                                                     $operation $op;
  180.                                                     break;
  181.                                                 }
  182.                                             }
  183.                                         }
  184.                                     }
  185.                                     // In ogni caso creo il json del ticket
  186.                                     $first true;
  187.                                     $json '[';
  188.                                     $rowValues explode(';'$rows[$i]);
  189.                                     for($k 0$k sizeof($rowValues); $k++)
  190.                                         [$json$first] = TicketService::addToJson($json$firstjson_decode($keys[$k]), json_decode($rowValues[$k]));
  191.                                     $json.= ']';
  192.                                     if(sizeof($rowValues) > 1){
  193.                                         [$ticket$arrayNumberTermids] = TicketService::createTicket($em$user$supplier$operation$datetimeStart$json$arrayNumberTermids);
  194.                                         if($operation == null){
  195.                                             $ticket->setSystemError(true);
  196.                                             $ticket->setSystemErrorSlug('key_mapping');
  197.                                             $ticket->setSystemErrorDetails("Non esiste la chiave \"".$supplier->getOperationMapping()."\" nei dettagli del ticket");
  198.                                             $em->flush();
  199.                                         }
  200.                                         if($ticket != null)
  201.                                             array_push($tickets$ticket);
  202.                                     }
  203.                                 }
  204.                             }
  205.                         }
  206.                     }
  207.                     break;
  208.                 case 'fabrick':
  209.                 case 'fabrick---flex':
  210.                     $datetimeStart date_modify($datetimeStart"+2 hours");
  211.                     $operation null;
  212.                     $json TicketService::createJsonFromEmail($inbox$emailfalsefalsetrue);
  213.                     $subjectMappings $em->getRepository('App\Entity\Slave\OperationSubjectMapping')->findAllLikeSubject($supplier->getId(), $subject);
  214.                     foreach($subjectMappings as $sm){
  215.                         if($operation != null)
  216.                             break;
  217.                         $opField $supplier->getOperationMapping();
  218.                         $op $sm->getOperation();
  219.                         $jsonControl json_decode($jsontrue);
  220.                         for($i=0$i<sizeof($jsonControl); $i++){
  221.                             if(array_key_exists($opField$jsonControl[$i]) && preg_match('/'.$op->getIdentifierRegex().'/'$jsonControl[$i][$opField])){
  222.                                 $operation $op;
  223.                                 break;
  224.                             }
  225.                         }
  226.                     }
  227.                     
  228.                     [$ticket$arrayNumberTermids] = TicketService::createTicket($em$user$supplier$operation$datetimeStart$json$arrayNumberTermids);
  229.                     if($operation == null){
  230.                         $ticket->setSystemError(true);
  231.                         $ticket->setSystemErrorSlug('operation');
  232.                         $ticket->setSystemErrorDetails("Non è stato possibile comprendere qual'è l'operazione dal soggetto \"".$subject."\" dell'email");
  233.                         $em->flush();
  234.                     }
  235.                     if($ticket != null)
  236.                         array_push($tickets$ticket);
  237.                     break;
  238.                 case 'demis-adp':
  239.                     $supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'adp'));
  240.                     break;
  241.                 case 'worldline-italia':
  242.                 case 'worldline-ccb':
  243.                     $json TicketService::createJsonFromEmail($inbox$emailfalsetruefalse);
  244.                     $identifier TicketService::worldlineSupplierSearch('email'$json);
  245.                     $supplierNormal $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'worldline-italia'));
  246.                     $supplierCCB $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'worldline-ccb'));
  247.                     switch($identifier){
  248.                         case 'Normal'$supplier $supplierNormal; break;
  249.                         case 'CCB'$supplier $supplierCCB; break;
  250.                         default: break;
  251.                     }
  252.                     
  253.                     $subjectMapping null;
  254.                     if($supplier != null){
  255.                         foreach($supplier->getOperations() as $op){
  256.                             if($subjectMapping == null){
  257.                                 foreach($op->getSubjectMappings() as $sm){
  258.                                     if(strpos($subject$sm->getValue()) !== false){
  259.                                         $subjectMapping $sm;
  260.                                         break;
  261.                                     }
  262.                                 }
  263.                             }
  264.                             else
  265.                                 break;
  266.                         }
  267.                     }
  268.                     if($subjectMapping != null){
  269.                         $operation $subjectMapping->getOperation();
  270.                         [$ticket$arrayNumberTermids] = TicketService::createTicket($em$user$supplier$operation$datetimeStart$json$arrayNumberTermids);
  271.                         if($supplier == null){
  272.                             $ticket->setSystemError(true);
  273.                             $ticket->setSystemErrorSlug('supplier');
  274.                             $ticket->setSystemErrorDetails("Non è stato possibile comprendere qual'è il fornitore WORLDLINE (Normale o CCB)");
  275.                             $em->flush();
  276.                         }
  277.                         if($ticket != null)
  278.                             array_push($tickets$ticket);
  279.                     }
  280.                     break;
  281.                 case 'csc---axerve':
  282.                 case 'csc---cglobal':
  283.                 case 'csc---cronos':
  284.                 case 'csc---cse':
  285.                 case 'csc---decathlon':
  286.                 case 'csc---euronet':
  287.                 case 'csc---lis-pay':
  288.                 case 'csc---mooney':
  289.                 case 'csc---nexi-book-sia':
  290.                 case 'csc---numera':
  291.                 case 'csc---p4cards':
  292.                 case 'csc---q8':
  293.                 case 'csc---repas':
  294.                 case 'csc---stripe':
  295.                 case 'csc---worldline-italia':
  296.                 case 'csc---yamamay':
  297.                 case 'lis-holding':
  298.                     // Assegno operazione guardando l'oggetto delle email
  299.                     $operation null;
  300.                     if($supplier->getSlug() == 'lis-holding')
  301.                         $json TicketService::createJsonFromEmail($inbox$emailfalsefalsefalse);
  302.                     else
  303.                         $json TicketService::createJsonFromEmail($inbox$emailtruefalsefalse);
  304.                     
  305.                     $subjectMapping $em->getRepository('App\Entity\Slave\OperationSubjectMapping')->findOneLikeSubject($supplier->getId(), $subject);
  306.                     if($subjectMapping != null){
  307.                         $operation $subjectMapping->getOperation();
  308.                         [$ticket$arrayNumberTermids] = TicketService::createTicket($em$user$supplier$operation$datetimeStart$json$arrayNumberTermids);
  309.                         if($operation == null){
  310.                             $ticket->setSystemError(true);
  311.                             $ticket->setSystemErrorSlug('operation');
  312.                             $ticket->setSystemErrorDetails("Non è stato possibile comprendere qual'è l'operazione dal soggetto \"".$subject."\" dell'email");
  313.                             $em->flush();
  314.                         }
  315.                         if($ticket != null)
  316.                             array_push($tickets$ticket);
  317.                     }
  318.                     break;
  319.                 default: break;
  320.             }
  321.         }
  322.         return [$supplier$tickets];
  323.     }
  324.     // Case BCC-POS
  325.     static public function getAttachmentsFromEmail($inbox$email)
  326.     {
  327.         $structure imap_fetchstructure($inbox$email);
  328.         $attachments = array();
  329.         if(isset($structure->parts) && count($structure->parts) && $structure->ifid != "1"){
  330.             for($i 0$i count($structure->parts); $i++) {
  331.                 $attachments[$i] = array('is_attachment' => false'attachment' => '');
  332.                 if($structure->parts[$i]->ifdparameters)
  333.                     foreach($structure->parts[$i]->dparameters as $object)
  334.                         if(strtolower($object->attribute) == 'filename')
  335.                             $attachments[$i]['is_attachment'] = true;
  336.                 if($structure->parts[$i]->ifparameters)
  337.                     foreach($structure->parts[$i]->parameters as $object)
  338.                         if(strtolower($object->attribute) == 'name')
  339.                             $attachments[$i]['is_attachment'] = true;
  340.                 if($attachments[$i]['is_attachment']){
  341.                     $attachments[$i]['attachment'] = imap_fetchbody($inbox$email$i+1);
  342.                     /* 3 = BASE64 encoding */
  343.                     if($structure->parts[$i]->encoding == 3$attachments[$i]['attachment'] = base64_decode($attachments[$i]['attachment']);
  344.                     /* 4 = QUOTED-PRINTABLE encoding */
  345.                     elseif($structure->parts[$i]->encoding == 4$attachments[$i]['attachment'] = quoted_printable_decode($attachments[$i]['attachment']);
  346.                 }
  347.             }
  348.         }
  349.         return $attachments;
  350.     }
  351.     // Case NEXI MONETICA o NEXI MEPS
  352.     static public function nexiSupplierSearch($sup$json)
  353.     {
  354.         $supplier null;
  355.         foreach($sup->getOperations() as $operation){
  356.             if(!$operation->isUav()){
  357.                 $supplier TicketService::nexiSupplierSearchMepsOrMonetica($json$operation->getKeyTicketNumber());
  358.                 if($supplier != null) break;
  359.             }
  360.         }
  361.         return $supplier;
  362.     }
  363.     static public function nexiMaintenanceSupplierSearch($sup$json)
  364.     {
  365.         return TicketService::nexiSupplierSearchMepsOrMonetica($json$sup->getOperationMaintenance()->getKeyTicketNumber());
  366.     }
  367.     static public function nexiSupplierSearchMepsOrMonetica($json$key)
  368.     {
  369.         $array json_decode($jsontrue);
  370.         foreach($array as $val){
  371.             $extraArray json_decode($key->getMappingExtra(), true);
  372.             if(array_key_exists($key->getMappingValue(), $val)){
  373.                 if(substr($val[$key->getMappingValue()], 01) == 'K' || substr($val[$key->getMappingValue()], 01) == 'S')
  374.                     return 'Meps';
  375.                 else
  376.                     return 'Monetica';
  377.             }
  378.             else{
  379.                 $altKey $key->displayMappingExtraValue("alt_key");
  380.                 if($altKey !== false){
  381.                     if(array_key_exists($altKey$val)){
  382.                         if(substr($val[$altKey], 01) == 'K' || substr($val[$altKey], 01) == 'S')
  383.                             return 'Meps';
  384.                         else
  385.                             return 'Monetica';
  386.                     }
  387.                 }
  388.             }
  389.         }
  390.         return null;
  391.     }
  392.     // Case WORLDLINE CCB o Normale
  393.     static public function worldlineSupplierSearch($from$json)
  394.     {
  395.         $identifier null;
  396.         $json json_decode($jsontrue);
  397.         $value "";
  398.         $key "";
  399.         switch($from){
  400.             case 'import'$key "Canale brand"; break;
  401.             case 'email'$key "Canale Brand"; break;
  402.             default: break;
  403.         }
  404.         for($i=0$i sizeof($json); $i++){
  405.             if(array_key_exists($key$json[$i])){
  406.                 $value $json[$i][$key];
  407.                 break;
  408.             }
  409.         }
  410.         switch($value){
  411.             case 'WL-BNL':
  412.             case 'WL-Desio':
  413.             case 'WL-Fucino':
  414.             case 'Worldline'$identifier 'Normal'; break;
  415.             case 'WL-CCB'$identifier 'CCB'; break;
  416.             default: $identifier 'Normal'; break;
  417.         }
  418.         return $identifier;
  419.     }
  420.     // Case SATE
  421.     static public function sateSupplierSearch($from$json)
  422.     {
  423.         $identifier null;
  424.         $json json_decode($jsontrue);
  425.         switch($from){
  426.             case 'import'$key "Cliente"; break;
  427.             case 'email'$key ""; break;
  428.             default: break;
  429.         }
  430.         for($i=0$i sizeof($json); $i++){
  431.             if(array_key_exists($key$json[$i])){
  432.                 $value $json[$i][$key];
  433.                 break;
  434.             }
  435.         }
  436.         switch($value){
  437.             case 'Argentea'$identifier 'Sate-Argentea'; break;
  438.             case 'FlagPay'$identifier 'Sate-Flagpay'; break;
  439.             case 'Mooney'$identifier 'Sate-Mooney'; break;
  440.             case 'Numera'$identifier 'Sate-Numera'; break;
  441.             case 'Pluxee'$identifier 'Sate-Pluxee'; break;
  442.             case 'Worldline'$identifier 'Sate-Worldline'; break;
  443.             default: break;
  444.         }
  445.         return $identifier;
  446.     }
  447.     // Altri case tranne BCC-POS
  448.     static public function createJsonFromEmail($inbox$email$isCsc$isWorldline$isFabrick)
  449.     {
  450.         $body imap_fetchbody($inbox$email1FT_PEEK);
  451.         $body UtilitiesService::convertAsciiToHtml($body$isFabrick);
  452.         $body preg_replace("<<br>>"""$body);
  453.         if($isCsc){
  454.             $body strip_tags($body);
  455.             $startIndex strpos($body"Cliente");
  456.             if ($startIndex !== false) {
  457.                 $body substr($body$startIndex);
  458.                 $endIndex =  strpos($body"QUESTA MAIL");
  459.                 if ($endIndex !== false) {
  460.                     $body substr($body0$endIndex);
  461.                 }
  462.             }
  463.             $bodyArray preg_split("/(#+)/"$body, -1PREG_SPLIT_DELIM_CAPTURE);
  464.         }
  465.         elseif($isFabrick){
  466.             $body strip_tags($body);
  467.             $startIndex strpos($body"Stato");
  468.             if ($startIndex !== false) {
  469.                 $body substr($body$startIndex);
  470.             }
  471.             $body preg_replace("/\\r\\n/""-#-"$body);
  472.             $bodyArray preg_split("/(-#-)+/"$body, -1PREG_SPLIT_DELIM_CAPTURE);
  473.         }
  474.         else{
  475.             $body preg_replace("/\\r\\n/""-#-"$body);
  476.             $bodyArray preg_split("/(-#-)+/"$body, -1PREG_SPLIT_DELIM_CAPTURE);
  477.         }
  478.         $fields = array();
  479.         foreach($bodyArray as $string){
  480.             $string preg_replace('/\r\n/'''$string);
  481.             $string preg_replace('/\n/'''$string);
  482.             $string preg_replace('/Questa e-mailC3=A8 stata generata automaticamente\. Si prega di non rispondere a questo messaggio\./i'''$string);
  483.             if($isCsc)
  484.                 $string preg_replace('/#/'''$string);
  485.             if(str_contains($string':'))
  486.                 array_push($fields$string);
  487.             // Serve per concatenare le note o i campi che vanno a capo a caso, se non ci sono i : nella stringa, aggiungo il valore al campo precedente, ignorando dove c'è solo a capo, senza altri valori
  488.             elseif(sizeof($fields) > && $string != "-#-")
  489.                 $fields[sizeof($fields) - 1].= $string;
  490.         }
  491.         $json TicketService::createJsonData($fields);
  492.         return $json;
  493.     }
  494.     
  495.     static public function checkTicketExistanceCsv($em$json$number$termid$arrayNumberTermids){
  496.         $array json_decode($jsontrue);
  497.         $ticketAlreadyExist false;
  498.         // Cerco il ticket-termid nel database
  499.         $tickets $em->getRepository('App\Entity\Slave\Ticket')->findAllByNumber($number);
  500.         foreach($tickets as $t){
  501.             if($t != null && $t->getTermid()->getCode() == $termid){
  502.                 $ticketAlreadyExist true;
  503.                 break;
  504.             }
  505.         }
  506.         // Cerco il ticket-termid nell'array numero-termid del CSV che sto importando -> serve a evitare che non sia ancora nel database perchè non è ancora stato pushato ma è era già presente nel file
  507.         if(!$ticketAlreadyExist){
  508.             foreach($arrayNumberTermids as $nt){
  509.                 if($nt[0] == $number && $nt[1] == $termid){
  510.                     $ticketAlreadyExist true;
  511.                     $ticket $t;
  512.                     break;
  513.                 }
  514.             }
  515.         }
  516.         if(!$ticketAlreadyExist){
  517.             $tmp = [];
  518.             array_push($tmp$number$termid);
  519.             array_push($arrayNumberTermids$tmp);
  520.         }
  521.         return [$ticketAlreadyExist$arrayNumberTermids];
  522.     }
  523.     static public function checkTicketExistanceDownload($em$supplier$operation$json$arrayNumberTermids){
  524.         $ticketAlreadyExist null;
  525.         $ticket null;
  526.         $keyNumber $operation->getKeyTicketNumber();
  527.         $altKeyNumber $operation->getKeyTicketNumber()->displayMappingExtraValue("alt_key");
  528.         $keyTermid $operation->getKeyTermid();
  529.         $altKeyTermid $operation->getKeyTermid()->displayMappingExtraValue("alt_key");
  530.         $array json_decode($jsontrue);
  531.         $number null;
  532.         $termid null;
  533.         foreach($array as $val){
  534.             if($number == null && array_key_exists($keyNumber->getMappingValue(), $val))
  535.                 $number preg_replace('/<br>/'''$val[$keyNumber->getMappingValue()]);
  536.             else{
  537.                 if($number == null && $altKeyNumber !== false && array_key_exists($altKeyNumber$val))
  538.                     $number preg_replace('/<br>/'''$val[$altKeyNumber]);
  539.             }
  540.             if($termid == null && array_key_exists($keyTermid->getMappingValue(), $val))
  541.                 $termid preg_replace('/<br>/'''$val[$keyTermid->getMappingValue()]);
  542.             else{
  543.                 if($termid == null && $altKeyTermid !== false && array_key_exists($altKeyTermid$val))
  544.                     $termid preg_replace('/<br>/'''$val[$altKeyTermid]);
  545.             }
  546.         }
  547.             
  548.         if($number != null && $termid != null){
  549.             $ticketAlreadyExist false;
  550.             // Cerco il ticket-termid nel database
  551.             $tickets $em->getRepository('App\Entity\Slave\Ticket')->findAllByNumber($number);
  552.             foreach($tickets as $t){
  553.                 if($t != null && $t->getTermid()->getCode() == $termid){
  554.                     $ticketAlreadyExist true;
  555.                     $ticket $t;
  556.                     break;
  557.                 }
  558.             }
  559.             // Cerco il ticket-termid nell'array numero-termid del CSV che sto importando -> serve a evitare che non sia ancora nel database perchè non è ancora stato pushato ma è era già presente nel file
  560.             if(!$ticketAlreadyExist){
  561.                 foreach($arrayNumberTermids as $nt){
  562.                     if($nt[0] == $number && $nt[1] == $termid){
  563.                         $ticketAlreadyExist true;
  564.                         break;
  565.                     }
  566.                 }
  567.             }
  568.             if(!$ticketAlreadyExist){
  569.                 $tmp = [];
  570.                 array_push($tmp$number$termid);
  571.                 array_push($arrayNumberTermids$tmp);
  572.             }
  573.         }
  574.         return [$ticketAlreadyExist$ticket$arrayNumberTermids];
  575.     }
  576.     // Funzioni importTickets
  577.     static public function createTicket($em$user$supplier$operation$datetimeStart$json$arrayNumberTermids){
  578.         // Controllo se esiste già un ticket con lo stesso numero e termid
  579.         [$ticketAlreadyExist$returnTicket$arrayNumberTermids] = TicketService::checkTicketExistanceDownload($em$supplier$operation$json$arrayNumberTermids);
  580.         
  581.         if(!$ticketAlreadyExist){
  582.             $statusToAssign $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'to_assign'));
  583.             $today = new \Datetime();
  584.             $ticket = new Ticket();
  585.             $ticket->setSupplier($supplier);
  586.             $ticket->setOperation($operation);
  587.             $ticket->setDatetimeStart($datetimeStart);
  588.             $ticket->setStatus($statusToAssign);
  589.             $ticket->setDirectoryPath($today->format("Y").'/'.$today->format("m").'/'.md5(uniqid()));
  590.             $ticket->setJson($json);
  591.             $ticket->setJsonReport('[]');
  592.             $ticket->setDatetimeImport(new \DateTime());
  593.             
  594.             $array json_decode($jsontrue);
  595.             for($i=0$i<sizeof($array); $i++){
  596.                 if($supplier->getOperationNotBillableCodes() != null && $supplier->getOperationNotBillableCodes() != '' && array_key_exists($supplier->getOperationMapping(), $array[$i]) && preg_match('/'.$supplier->getOperationNotBillableCodes().'/'$array[$i][$supplier->getOperationMapping()]))
  597.                     $ticket->setBillable(false);
  598.             }
  599.             try {
  600.                 $em->persist($ticket);
  601.                 $em->flush();
  602.             } catch (UniqueConstraintViolationException $exception) {
  603.                 return null;
  604.             } catch (\Throwable $exception) {
  605.                 // TO DO
  606.                 switch($exception->getCode()){
  607.                     case 1062:
  608.                     case 1557:
  609.                     case 1569:
  610.                     case 1586: return null; break;
  611.                 }
  612.             }
  613.             return [$ticket$arrayNumberTermids];
  614.         }
  615.         else{
  616.             if($supplier->getSlug() == 'worldline-ccb' || $supplier->getSlug() == 'worldline-italia'){
  617.                 if($returnTicket != null){
  618.                     $actualJson $returnTicket->getJson();
  619.                     $dateExpirationKeyMapping $em->getRepository('App\Entity\Slave\OperationKeyMapping')->findOneBy(["operation" => $returnTicket->getOperation()->getId(), "ticketColumn"=>"Data scadenza"]);
  620.                     $actualK $dateExpirationKeyMapping->getMappingValue();
  621.                     $newK $dateExpirationKeyMapping->displayMappingExtraValue("alt_key");
  622.                     $newFormat $dateExpirationKeyMapping->displayMappingExtraValue("alt_date_format");
  623.                     $newV "";
  624.                     $newArray json_decode($jsontrue);
  625.                     foreach ($newArray as $newItem) {
  626.                         if(array_key_exists($newK$newItem)){
  627.                             $newV $newItem[$newK];
  628.                             break;
  629.                         }
  630.                     }
  631.                     if($newV != ""){
  632.                         // CERCO SE ESISTE GIA' LA CHIAVE NEL JSON
  633.                         $actualArray json_decode($actualJsontrue);
  634.                         if($actualArray != null){
  635.                             for($i 0$isizeof($actualArray); $i++){
  636.                                 if (array_key_exists($actualK$actualArray[$i])) {
  637.                                     $actualArray[$i] = [$newK => $newV];
  638.                                     $datetimeExpiration date_create_from_format($newFormat$newV);
  639.                                     $returnTicket->setDatetimeExpiration($datetimeExpiration);
  640.                                     break;
  641.                                 }
  642.                             }
  643.                             $json json_encode($actualArrayJSON_PRETTY_PRINT);
  644.                             $returnTicket->setJson($json);
  645.                             $em->flush();
  646.                         }
  647.                     }
  648.                 }
  649.                 return [$returnTicket$arrayNumberTermids];
  650.             }
  651.         }
  652.         return [null$arrayNumberTermids];
  653.     }
  654.     static public function createJsonData($array)
  655.     {
  656.         $first true;
  657.         $json '[';
  658.         foreach($array as $string){
  659.             $parts explode(':'$string2);
  660.             [$json$first] = TicketService::addToJson($json$first$parts[0], $parts[1]);
  661.         }
  662.         $json.= ']';
  663.         return $json;
  664.     }
  665.     static public function addToJson($json$first$key$value)
  666.     {
  667.         if($first$first false; else $json.= ',';
  668.         $k preg_replace('/<br>/'''ltrim(rtrim($key" "), " "));
  669.         $k preg_replace("/\s\/\s/""/"$k);
  670.         $v preg_replace('/<br>/'''ltrim(rtrim($value" "), " "));
  671.         $json.= '{'.json_encode($k).':'.json_encode($v).'}';
  672.         return [$json$first];
  673.     }
  674.     static public function ticketMapClient($em$ticket)
  675.     {
  676.         $found false;
  677.         $error false;
  678.         $code '';
  679.         $json json_decode($ticket->getJson(), true);
  680.         $keys preg_split('/\|/'$ticket->getOperation()->getCodeClient());
  681.         
  682.         foreach($keys as $key){
  683.             if(!$found){
  684.                 $parts explode('+'$key);
  685.                 for($i 0$i sizeof($json); $i++){
  686.                     foreach($parts as $p){
  687.                         if(array_key_exists(preg_replace("/\s\/\s/""/"$p), $json[$i])){
  688.                             $code .= $json[$i][preg_replace("/\s\/\s/""/"$p)];
  689.                             $found true;
  690.                             break;
  691.                         }
  692.                     }
  693.                 }
  694.             }
  695.         }
  696.         if(!$found){
  697.             $error true;
  698.             $ticket->setSystemError(true);
  699.             $ticket->setSystemErrorSlug('client');
  700.             $ticket->setSystemErrorDetails("Non è configurata la chiave per identificare il cliente nell'operazione");
  701.         }
  702.         else{
  703.             $found false;
  704.             $termid null;
  705.             $keysRequired $em->getRepository('App\Entity\Slave\OperationKeyMapping')->findByOperationAndRequired($ticket->getOperation()->getId(), true);
  706.             foreach($keysRequired as $k){
  707.                 if(!$found){
  708.                     $altKey $k->displayMappingExtraValue("alt_key");
  709.                     for($i 0$i sizeof($json); $i++){
  710.                         if(array_key_exists($k->getMappingValue(), $json[$i]) || ($altKey !== false && array_key_exists($altKey$json[$i]))){
  711.                             if(array_key_exists($k->getMappingValue(), $json[$i]))
  712.                                 $value $json[$i][$k->getMappingValue()];
  713.                             else
  714.                                 $value $json[$i][$altKey]; 
  715.                             //if($code == '' && $k->getTicketColumn() == 'Term ID'){
  716.                             if($k->getTicketColumn() == 'Term ID'){
  717.                                 $code UtilitiesService::updateTermidCodeToEightChars($value);
  718.                                 $termid $em->getRepository('App\Entity\Slave\Termid')->findOneBy(array('code' => $code));
  719.                                 $found true;
  720.                                 break;
  721.                             }
  722.                         }
  723.                     }
  724.                 }
  725.             }
  726.             $client null;
  727.             if($termid != null && $termid->getClient() != null)
  728.                 $client $termid->getClient();
  729.             if($client == null)
  730.                 $client $em->getRepository('App\Entity\Slave\Client')->findOneBy(array('code' => $code));
  731.             if($client == null){
  732.                 $client = new Client();
  733.                 $client->setCode($code);
  734.                 $client->setDirectoryPath(md5(uniqid()));
  735.                 $em->persist($client);
  736.     
  737.                 $warehouse = new Warehouse();
  738.                 $warehouse->setClient($client);
  739.                 $warehouse->setMovable(false);
  740.                 $client->setWarehouse($warehouse);
  741.                 $em->persist($warehouse);
  742.                 $em->flush();
  743.             }
  744.     
  745.             $ticket->setClient($client);
  746.         }
  747.         $em->flush();
  748.         return $error;
  749.     }
  750.     static public function isInCoverCompany($company$regionId)
  751.     {        
  752.         foreach($company->getRegions() as $region){
  753.             if($regionId == $region->getId()){
  754.                 return true;
  755.                 break;
  756.             }
  757.         }
  758.         return false;
  759.     }
  760.     static public function ticketMapColumns($em$emMaster$company$ticket)
  761.     {
  762.         $array json_decode($ticket->getJson(), true);
  763.         $client $ticket->getClient();
  764.         $first true;
  765.         $json '[';
  766.         $keysOptional $em->getRepository('App\Entity\Slave\OperationKeyMapping')->findByOperationAndRequired($ticket->getOperation()->getId(), false);
  767.         foreach($keysOptional as $k){
  768.             $altKey $k->displayMappingExtraValue("alt_key");
  769.             foreach($array as $val){
  770.                 $isAlt false;
  771.                 if(array_key_exists($k->getMappingValue(), $val) || ($altKey !== false && array_key_exists($altKey$val))){
  772.                     if(array_key_exists($k->getMappingValue(), $val))
  773.                         $value $val[$k->getMappingValue()];
  774.                     else{
  775.                         $value $val[$altKey];
  776.                         $isAlt true;
  777.                     }
  778.                     switch($k->getTicketColumn()){
  779.                         case 'Telefono 1'TicketService::managePhone($em$client$value"Telefono 1"); break;
  780.                         case 'Telefono 2'TicketService::managePhone($em$client$value"Telefono 2"); break;
  781.                         case 'Telefono 3'TicketService::managePhone($em$client$value"Telefono cellulare"); break;
  782.                         case 'Referente'$client->setReferent($value); break;
  783.                         case 'Orari apertura'$client->setOpenings($value); break;
  784.                         case 'Giorno chiusura'$client->setClosures($value); break;
  785.                         case 'Data scadenza':
  786.                             if(!$isAlt){
  787.                                 if($k->displayMappingExtraValue('date_format') != null && $k->displayMappingExtraValue('date_format') != ''){
  788.                                     $datetime date_create_from_format($k->displayMappingExtraValue('date_format'), $value);
  789.                                     if($datetime != "")
  790.                                         $ticket->setDatetimeExpiration($datetime);
  791.                                 }
  792.                             }
  793.                             else{
  794.                                 if($k->displayMappingExtraValue('alt_date_format') != null && $k->displayMappingExtraValue('alt_date_format') != ''){
  795.                                     $datetime date_create_from_format($k->displayMappingExtraValue('alt_date_format'), $value);
  796.                                     if($datetime != "")
  797.                                         $ticket->setDatetimeExpiration($datetime);
  798.                                 }
  799.                             }
  800.                             $found true;
  801.                             break;
  802.                         case 'Cassa'
  803.                         case 'ABI'
  804.                         case 'Risorsa'
  805.                         case 'Risorsa upgrade'
  806.                         case 'Accessori'
  807.                         case 'Matricole'
  808.                         case 'Anomalia'
  809.                         case 'Connessioni'
  810.                         case 'Dettagli operazione'
  811.                         case 'Dettagli intervento'
  812.                         case 'Note'
  813.                             [$json$first] = TicketService::addToJson($json$first$k->getTicketColumn(), $value);
  814.                             break;
  815.                         case 'Data richiesta':
  816.                             if($k->displayMappingExtraValue('date_format') != null && $k->displayMappingExtraValue('date_format') != ''){
  817.                                 $datetime date_create_from_format($k->displayMappingExtraValue('date_format'), $value);
  818.                                 if($datetime != "")
  819.                                     $ticket->setDatetimeStart($datetime);
  820.                             }
  821.                         case 'Ora richiesta':
  822.                             if($k->displayMappingExtraValue('time_format') != null && $k->displayMappingExtraValue('time_format') != ''){
  823.                                 $datetime date_create_from_format('Ymd'.$k->displayMappingExtraValue('time_format'), $ticket->getDatetimeStart()->format('Ymd').$value);
  824.                                 if($datetime != "")
  825.                                     $ticket->setDatetimeStart($datetime);
  826.                             }
  827.                             break;
  828.                         default: break;
  829.                     }
  830.                 }
  831.             }
  832.         }
  833.         $json .= ']';
  834.         $ticket->setJsonReport($json);
  835.         $keysRequired $em->getRepository('App\Entity\Slave\OperationKeyMapping')->findByOperationAndRequired($ticket->getOperation()->getId(), true);
  836.         foreach($keysRequired as $k){
  837.             $errorSlug 'key_mapping';
  838.             $errorMsg "Non esiste la chiave \"".$k->getMappingValue()."\" per la colonna \"".$k->getTicketColumn()."\" nel dettaglio del ticket";
  839.             $found false;
  840.             $zip null;
  841.             $altKey $k->displayMappingExtraValue("alt_key");
  842.             foreach($array as $val){
  843.                 $isAlt false;
  844.                 if(array_key_exists($k->getMappingValue(), $val) || ($altKey !== false && array_key_exists($altKey$val))){
  845.                     if(array_key_exists($k->getMappingValue(), $val))
  846.                         $value $val[$k->getMappingValue()];
  847.                     else{
  848.                         $value $val[$altKey];
  849.                         $isAlt true;
  850.                     }
  851.                     switch($k->getTicketColumn()){
  852.                         case 'Numero intervento'
  853.                             $ticket->setNumber($value);
  854.                             $found true;
  855.                             break;
  856.                         case 'Term ID'
  857.                             $code UtilitiesService::updateTermidCodeToEightChars($value);
  858.                             $termid $em->getRepository('App\Entity\Slave\Termid')->findOneBy(array('code' => $code));
  859.                             if($termid == null){
  860.                                 $termid = new Termid();
  861.                                 $termid->setClient($client);
  862.                                 $termid->setCode($value);
  863.                                 $em->persist($termid);
  864.                             }
  865.                             $found true;
  866.                             $ticket->setTermid($termid);
  867.                             if(sizeof($termid->getProducts()) > 0){
  868.                                 foreach($termid->getProducts() as $prod)
  869.                                     $prod->getActualWarehouse($client->getWarehouse());
  870.                             }
  871.                             break;
  872.                         case 'Insegna'
  873.                             $client->setNickname($value);
  874.                             if($client->getWarehouse()->getNickname() == null)
  875.                                 $client->getWarehouse()->setNickname('Cliente - '.$value);
  876.                             $found true;
  877.                             break;
  878.                         case 'CAP'
  879.                             if($ticket->getZip() == null)
  880.                                 $ticket->setZip($value);
  881.                             if($client->getZip() == null)
  882.                                 $client->setZip($value);
  883.                             $found true;
  884.                             $zip $emMaster->getRepository('App\Entity\Master\Zip')->findOneByCode($value);
  885.                             if($zip != null){
  886.                                 $ticket->setIdProvince($zip->getCities()[0]->getProvince()->getId());
  887.                                 $client->setIdProvince($zip->getCities()[0]->getProvince()->getId());
  888.                             }
  889.                             break;
  890.                         case 'Provincia'
  891.                             $province $emMaster->getRepository('App\Entity\Master\Province')->findOneBySignOrName($value);
  892.                             if($province == null){
  893.                                 if($zip != null)
  894.                                     $province $zip->getCity()->getProvince();
  895.                             }
  896.                             if($province != null){
  897.                                 $ticket->setIdProvince($province->getId());
  898.                                 $client->setIdProvince($province->getId());
  899.                                 if(TicketService::isInCoverCompany($company$province->getRegion()->getId()))
  900.                                     $found true;
  901.                                 else{
  902.                                     $errorSlug 'city';
  903.                                     $errorMsg "L'indirizzo del ticket non è in copertura all'azienda; assegna manualmente l'indirizzo!";
  904.                                 }
  905.                             }
  906.                             else{
  907.                                 $errorSlug 'province_alias';
  908.                                 $errorMsg 'Il server non ha trovato la provincia; seleziona la provincia corrispondente a: "'.$value.'"';
  909.                             }
  910.                             break;
  911.                         case 'Città':
  912.                             $city $emMaster->getRepository('App\Entity\Master\City')->findByNameOrAliasAndProvince($value$ticket->getIdProvince());
  913.                             if($city != null){
  914.                                 $ticket->setIdCity($city->getId());
  915.                                 $client->setIdCity($city->getId());
  916.                                 
  917.                                 $ticket->setIdProvince($city->getProvince()->getId());
  918.                                 $client->setIdProvince($city->getProvince()->getId());
  919.                                 if($zip == null && sizeof($city->getZips()) == 1){
  920.                                     $client->setZip($city->getZips()[0]->getCode());
  921.                                     $ticket->setZip($city->getZips()[0]->getCode());
  922.                                 }
  923.                                 if(TicketService::isInCoverCompany($company$city->getProvince()->getRegion()->getId())){
  924.                                     $found true;
  925.                                 }
  926.                                 else{
  927.                                     $errorSlug 'city';
  928.                                     $errorMsg "L'indirizzo del ticket non è in copertura all'azienda; assegna manualmente l'indirizzo!";
  929.                                 }
  930.                             }
  931.                             else{
  932.                                 $province $emMaster->getRepository('App\Entity\Master\Province')->findOneById($ticket->getIdProvince());
  933.                                 $errorSlug 'city_alias';
  934.                                 $errorMsg 'Il server non ha trovato la città; verifica se devi inserire un alias per: "'.$value.'"';
  935.                             }
  936.                             break;
  937.                         case 'Indirizzo':
  938.                             $client->setAddress($value);
  939.                             $ticket->setAddress($value);
  940.                             $found true;
  941.                             break;
  942.                         default: break;
  943.                     }
  944.                 }
  945.             }
  946.             if(!$found){
  947.                 $ticket->setSystemError(true);
  948.                 $ticket->setSystemErrorSlug($errorSlug);
  949.                 $ticket->setSystemErrorDetails($errorMsg);
  950.                 $em->flush();
  951.                 return true;
  952.             }
  953.         }
  954.         if($client->getZip() == null && $client->getIdCity() != null){
  955.             $city $emMaster->getRepository('App\Entity\Master\City')->findOneById($client->getIdCity());
  956.             if(sizeof($city->getZips()) == 1)
  957.                 $zip $city->getZips()[0]->getCode();
  958.             else{
  959.                 $zip $city->getZips()[0]->getCode();
  960.                 /* TODO
  961.                 $address = $client->getAddress().' '.$city->getName().' '.$city->getProvince()->getSign();
  962.                 $zip = UtilitiesService::calculateZipFromAddress($address);
  963.                 */
  964.             }
  965.             $client->setZip($zip);
  966.             $ticket->setZip($zip);
  967.         }
  968.         $em->flush();
  969.         return false;
  970.     }
  971.     
  972.     static public function ticketMapOptionalColumns($em$ticket)
  973.     {
  974.         $array json_decode($ticket->getJson(), true);
  975.         $client $ticket->getClient();
  976.         $first true;
  977.         $json '[';
  978.         $keysOptional $em->getRepository('App\Entity\Slave\OperationKeyMapping')->findByOperationAndRequired($ticket->getOperation()->getId(), false);
  979.         foreach($keysOptional as $k){
  980.             $altKey $k->displayMappingExtraValue("alt_key");
  981.             foreach($array as $val){
  982.                 $isAlt false;
  983.                 if(array_key_exists($k->getMappingValue(), $val) || ($altKey !== false && array_key_exists($altKey$val))){
  984.                     if(array_key_exists($k->getMappingValue(), $val))
  985.                         $value $val[$k->getMappingValue()];
  986.                     else{
  987.                         $value $val[$altKey];
  988.                         $isAlt true;
  989.                     }
  990.                     switch($k->getTicketColumn()){
  991.                         case 'Telefono 1'TicketService::managePhone($em$client$value"Telefono 1"); break;
  992.                         case 'Telefono 2'TicketService::managePhone($em$client$value"Telefono 2"); break;
  993.                         case 'Telefono 3'TicketService::managePhone($em$client$value"Telefono cellulare"); break;
  994.                         case 'Referente'$client->setReferent($value); break;
  995.                         case 'Orari apertura'$client->setOpenings($value); break;
  996.                         case 'Giorno chiusura'$client->setClosures($value); break;
  997.                         case 'Data scadenza':
  998.                             if(!$isAlt){
  999.                                 if($k->displayMappingExtraValue('date_format') != null && $k->displayMappingExtraValue('date_format') != ''){
  1000.                                     $datetime date_create_from_format($k->displayMappingExtraValue('date_format'), $value);
  1001.                                     if($datetime != "")
  1002.                                         $ticket->setDatetimeExpiration($datetime);
  1003.                                 }
  1004.                             }
  1005.                             else{
  1006.                                 if($k->displayMappingExtraValue('alt_date_format') != null && $k->displayMappingExtraValue('alt_date_format') != ''){
  1007.                                     $datetime date_create_from_format($k->displayMappingExtraValue('alt_date_format'), $value);
  1008.                                     if($datetime != "")
  1009.                                         $ticket->setDatetimeExpiration($datetime);
  1010.                                 }
  1011.                             }
  1012.                             $found true;
  1013.                             break;
  1014.                         case 'Cassa'
  1015.                         case 'ABI'
  1016.                         case 'Risorsa'
  1017.                         case 'Risorsa upgrade'
  1018.                         case 'Accessori'
  1019.                         case 'Matricole'
  1020.                         case 'Anomalia'
  1021.                         case 'Connessioni'
  1022.                         case 'Dettagli operazione'
  1023.                         case 'Dettagli intervento'
  1024.                         case 'Note'
  1025.                             [$json$first] = TicketService::addToJson($json$first$k->getTicketColumn(), $value);
  1026.                             break;
  1027.                         case 'Data richiesta':
  1028.                             if($k->displayMappingExtraValue('date_format') != null && $k->displayMappingExtraValue('date_format') != ''){
  1029.                                 $datetime date_create_from_format($k->displayMappingExtraValue('date_format'), $value);
  1030.                                 if($datetime != "")
  1031.                                     $ticket->setDatetimeStart($datetime);
  1032.                             }
  1033.                         case 'Ora richiesta':
  1034.                             if($k->displayMappingExtraValue('time_format') != null && $k->displayMappingExtraValue('time_format') != ''){
  1035.                                 $datetime date_create_from_format('Ymd'.$k->displayMappingExtraValue('time_format'), $ticket->getDatetimeStart()->format('Ymd').$value);
  1036.                                 if($datetime != "")
  1037.                                     $ticket->setDatetimeStart($datetime);
  1038.                             }
  1039.                             break;
  1040.                         default: break;
  1041.                     }
  1042.                 }
  1043.             }
  1044.         }
  1045.         $json .= ']';
  1046.         $ticket->setJsonReport($json);
  1047.         $em->flush();
  1048.     }
  1049.     static public function managePhone($em$client$number$name)
  1050.     {
  1051.         $found false;
  1052.         if($number != ""){
  1053.             foreach($client->getPhones() as $phone){
  1054.                 if($phone->getNumber() == $number){
  1055.                     $found true;
  1056.                     break;
  1057.                 }
  1058.             }
  1059.             if(!$found){
  1060.                 $clientPhone = new ClientPhone();
  1061.                 $clientPhone->setClient($client);
  1062.                 $clientPhone->setNumber($number);
  1063.                 $clientPhone->setName($name);
  1064.                 $em->persist($clientPhone);
  1065.                 $client->addPhone($clientPhone);
  1066.             }
  1067.         }
  1068.     }
  1069.     static public function ticketAssignOperationTariffAmount($em$emMaster$ticket)
  1070.     {
  1071.         $tariff null;
  1072.         $uavTariff null;
  1073.         $city $emMaster->getRepository('App\Entity\Master\City')->findOneById($ticket->getIdCity());
  1074.         // CERCO LA TARIFFA OPERAZIONE
  1075.         if($city != null){
  1076.             foreach($ticket->getOperation()->getTariffs() as $tar){
  1077.                 $zips = array();
  1078.                 foreach($tar->getZips() as $arrayZip)
  1079.                     array_push($zips$arrayZip[1]);
  1080.                 if($tar->getIdProvince() == $city->getProvince()->getId() && ($tar->isAllZip() || in_array($ticket->getZip(), $zips))){
  1081.                     $tariff $tar;
  1082.                     break;
  1083.                 }
  1084.             }
  1085.         }
  1086.         // SE LA TARIFFA ESISTE, CONTROLLO GLI ALGORITMI DEI SUOI AMOUNT
  1087.         if($tariff != null){
  1088.             $found false;
  1089.             foreach($tariff->getAmounts() as $ota){
  1090.                 if($ota->getAlgorithm() != null && !$found){
  1091.                     switch($ota->getAlgorithm()->getSlug()){
  1092.                         case "monetica-massive-dll":
  1093.                             $matrix json_decode($ticket->getJsonReport(), true);
  1094.                             foreach($matrix as $array){
  1095.                                 if(array_key_exists('Anomalia'$array) && str_contains(strtolower($array["Anomalia"]), strtolower("Aggiornamento mandate")) && str_contains(strtolower($array["Anomalia"]), strtolower("effettuare DLL"))){
  1096.                                     $operationTariffAmount $ota;
  1097.                                     $found true;
  1098.                                     break;
  1099.                                 }
  1100.                             }
  1101.                             break;
  1102.                         default: break;
  1103.                     }
  1104.                 }
  1105.             }
  1106.             if(!$found)
  1107.                 $operationTariffAmount $tariff->getStandardAmount();
  1108.             $ticket->setOperationTariffAmount($operationTariffAmount);
  1109.             $ticket->setSystemError(false);
  1110.         }
  1111.         else{
  1112.             $ticket->setSystemError(true);
  1113.             $ticket->setSystemErrorSlug('tariff');
  1114.             $ticket->setSystemErrorDetails("Tariffa operazione corrispondente a questa provincia/città/CAP da assegnare al ticket non trovata!");
  1115.             $em->flush();
  1116.             return true;
  1117.         }
  1118.         
  1119.         // CERCO L'OPERAZIONE UAV DEL FORNITORE
  1120.         $uavOt null;
  1121.         foreach($ticket->getSupplier()->getOperations() as $op){
  1122.             if($op->isUav()){
  1123.                 $uavOt $op;
  1124.                 break;
  1125.             }
  1126.         }
  1127.         // CERCO LE TARIFFE DELL'UAV
  1128.         foreach($uavOt->getTariffs() as $uavTar){
  1129.             $zips = array();
  1130.             foreach($uavTar->getZips() as $arrayZip)
  1131.                 array_push($zips$arrayZip[1]);
  1132.             if($uavTar->getIdProvince() == $city->getProvince()->getId() && ($uavTar->isAllZip() || in_array($ticket->getZip(), $zips))){
  1133.                 $uavTariff $uavTar;
  1134.                 break;
  1135.             }
  1136.         }
  1137.         
  1138.         if($uavTariff != null){
  1139.             $ticket->setUavOperationTariffAmount($uavTariff->getStandardAmount());
  1140.         }
  1141.         else{
  1142.             $ticket->setSystemError(true);
  1143.             $ticket->setSystemErrorSlug('tariff-uav');
  1144.             $ticket->setSystemErrorDetails("Tariffa UAV per il fornitore non trovata!");
  1145.             $em->flush();
  1146.             return true;
  1147.         }
  1148.         $em->flush();
  1149.     }
  1150.     static public function ticketAutoAssign($em$emMaster$user$ticket$mailer)
  1151.     {     
  1152.         $autoAssign $em->getRepository('App\Entity\Slave\Setting')->findOneBySlug('ticket_auto_assign');
  1153.         
  1154.         if($autoAssign->getValue() && $ticket->getTechnician() == null){
  1155.             $technicians = array();
  1156.             $statusAssigned $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'assigned'));
  1157.             $city $emMaster->getRepository('App\Entity\Master\City')->findOneById($ticket->getIdCity());
  1158.             $techincianAreas $em->getRepository('App\Entity\Slave\TechnicianArea')->findByIdProvinceAndUserAutoAssignIncluded($city->getProvince()->getId());
  1159.             // Creo un array con i tecnici assegnabili
  1160.             foreach($techincianAreas as $ta){
  1161.                 $zips = array();
  1162.                 foreach($ta->getZips() as $arrayZip)
  1163.                     array_push($zips$arrayZip[1]);
  1164.                 
  1165.                 $autoAssignSuppliersIds = array();
  1166.                 foreach($ta->getUser()->getAutoAssignSuppliers() as $supplier)
  1167.                     array_push($autoAssignSuppliersIds$supplier->getId());
  1168.                 // SE tecnico gestisce quei fornitori E copre tutta l'area O il CAP del cliente ---> pusho nell'array
  1169.                 if(in_array($ticket->getOperation()->getSupplier()->getId(), $autoAssignSuppliersIds) && ($ta->isAllZip() || in_array($ticket->getZip(), $zips)))
  1170.                     array_push($technicians$ta->getUser());
  1171.             }
  1172.             if(sizeof($technicians) > 0){
  1173.                 TicketService::createTicketLog($em$user$ticket"cs"$ticket->getStatus(), $statusAssigned->getValue());
  1174.                 $ticket->setStatus($statusAssigned);
  1175.                 if(sizeof($technicians) == 1){
  1176.                     // Se c'è solo un tecnico --- Se non è in ferie lo assegno altrimenti assegno il sostituto
  1177.                     if($technicians[0]->getActualHoliday() == false){
  1178.                         $ticket->setTechnician($technicians[0]);
  1179.                         TicketService::createTicketLog($em$user$ticket"ct"$ticket->getTechnician(), $technicians[0]);
  1180.                     }
  1181.                     else{
  1182.                         TicketService::createTicketLog($em$user$ticket"ct"$ticket->getTechnician(), $technicians[0]->getActualHoliday()->getSubstitute());
  1183.                         $ticket->setTechnician($technicians[0]->getActualHoliday()->getSubstitute());
  1184.                     }
  1185.                 }
  1186.                 else{
  1187.                     // Scremo i tecnici che sono in ferie
  1188.                     $techs = array();
  1189.                     foreach($technicians as $technician){
  1190.                         if($technician->getActualHoliday() == false)
  1191.                             array_push($techs$technician);
  1192.                     }
  1193.                     if(sizeof($techs) > 0){
  1194.                         if(sizeof($techs) == 1){
  1195.                             $technician $techs[0];
  1196.                         }
  1197.                         else{
  1198.                             $first true;
  1199.                             foreach($techs as $t){
  1200.                                 if($first){
  1201.                                     $first false;
  1202.                                     $technician $t;
  1203.                                 }
  1204.                                 if($technician->countTicketsUnderManagement('actual') > $t->countTicketsUnderManagement('actual'))
  1205.                                     $technician $t;
  1206.                             }
  1207.                         }
  1208.                         TicketService::createTicketLog($em$user$ticket"ct"$ticket->getTechnician(), $technician);
  1209.                         $ticket->setTechnician($technician);
  1210.                     }
  1211.                 }
  1212.             }
  1213.             
  1214.             $em->flush();
  1215.             
  1216.             // Invio messaggio di notifica al tecnico
  1217.             $settingTechnicianSendAssignEmail $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_technician_send_assign_email'));
  1218.             if($settingTechnicianSendAssignEmail->getValue() == && $ticket->getTechnician()->isAssignEmailActive()){
  1219.                 $tickets = [];
  1220.                 array_push($tickets$ticket);
  1221.                 $message = (new TemplatedEmail())
  1222.                     ->subject($this->params->get('subject_ticket_take_charge'))
  1223.                     ->from($this->params->get('email_noreply'))
  1224.                     ->to($ticket->getTechnician()->getEmail())
  1225.                     ->htmlTemplate('email/technician_tickets.html.twig')
  1226.                     ->context(['user' => $ticket->getTechnician(), 'tickets' => $tickets]);
  1227.                 $mailer->send($message);
  1228.             }
  1229.         }
  1230.         return true;
  1231.     }
  1232.     // SCARICA DA EMAIL
  1233.     static public function downloadTicket($em$emMaster$user$inbox$email$mailer$testing$company$countTicket$countTicketError)
  1234.     {
  1235.         $header imap_headerinfo($inbox$email); // Gestisco l'header
  1236.         $sender null;
  1237.         
  1238.         // Serve per skippare le email che non hanno mittente o di spam
  1239.         if(property_exists($header'from') && property_exists($header->from[0], 'host'))
  1240.             $sender $header->from[0]->mailbox."@".$header->from[0]->host;
  1241.         $supplierTicketEmails $em->getRepository('App\Entity\Slave\SupplierTicketEmail')->findBySenderAndMailer($sender$mailer);
  1242.         [$supplier$tickets] = TicketService::importTickets($em$emMaster$user$inbox$email$header$supplierTicketEmails);
  1243.         $now = new \DateTime();
  1244.         if(!$testing){
  1245.             if($tickets != null){
  1246.                 // Se ha creato ticket -> Segno email vista e sposto nella cartella fornitore
  1247.                 imap_setflag_full($inbox$email"\\SEEN");
  1248.                 if($supplier != null)
  1249.                     imap_mail_move($inbox$email'INBOX.'.$supplier->getSlug());
  1250.                 else
  1251.                     imap_mail_move($inbox$email'INBOX.nexi');
  1252.                 $countTicket++;
  1253.             }
  1254.             else{
  1255.                 $dt explode(', '$header->date); // Prendo la data di creazione
  1256.                 $dts explode(' ('$dt[sizeof($dt) - 1]); // Pulisco mettendo il formato per il create_date_from_format
  1257.                 $dtsTrim rtrim(ltrim($dts[0]));
  1258.                 $datetimeStart date_create_from_format('j M Y H:i:s O'$dtsTrim); //4 Jul 2023 16:00:11 +0200"
  1259.                 $threeHours date_modify(clone($datetimeStart), "+3 hours");
  1260.                 // Se non ha creato ticket -> Controllo se è lì da più di 3 ore la sposto in "other"
  1261.                 if($threeHours->format("YmdHis") < $now->format("YmdHis"))
  1262.                     imap_mail_move($inbox$email'INBOX.other');
  1263.             }
  1264.         }
  1265.         else{
  1266.             if($tickets != null)
  1267.                 $countTicket++;
  1268.         }
  1269.         foreach($tickets as $ticket){
  1270.             if($ticket->getOperation() != null){
  1271.                 $error TicketService::ticketMapClient($em$ticket);
  1272.                 if(!$error$error TicketService::ticketMapColumns($em$emMaster$company$ticket);
  1273.                 if(!$error$error TicketService::ticketAssignOperationTariffAmount($em$emMaster$ticket);
  1274.                 if(!$errorTicketService::ticketAutoAssign($em$emMaster$user$ticket$mailer);
  1275.             }
  1276.             else{
  1277.                 $error true;
  1278.                 if($supplier != null){
  1279.                     $ticket->setSystemError(true);
  1280.                     $ticket->setSystemErrorSlug('operation');
  1281.                     $ticket->setSystemErrorDetails("Impossibile determinare l'<b>operazione</b> del ticket");
  1282.                     $em->flush();
  1283.                 }
  1284.             }
  1285.             if($error)
  1286.                 $countTicketError++;
  1287.         }
  1288.         return [$countTicket$countTicketError];
  1289.     }
  1290.     // IMPORT CSV
  1291.     // Chiamata da UserTicketController
  1292.     static public function importFile($em$emMaster$user$form$company$operationId$row$mailer)
  1293.     {
  1294.         $supplierSlug $form->get('supplier')->getData();
  1295.         $file $form->get('file')->getData();
  1296.         $separator $form->get('separator')->getData();
  1297.         $tickets = array();
  1298.         $arrayNumberTermids = array();
  1299.         $countInserted 0;
  1300.         $content file_get_contents($file);
  1301.         $content preg_replace('/\\\\/''/'$content);
  1302.         switch($supplierSlug){
  1303.             case 'demis-adp':
  1304.             case 'bcc-pos':
  1305.             case 'lis-holding':
  1306.             case 'nexi':
  1307.             case 'nexi-book-sia':
  1308.             case 'worldline-italia':
  1309.             case 'worldline-ccb':
  1310.                 $content preg_replace('/,,/'',"",'$content);
  1311.                 $content preg_replace('/\",\"/''";"'$content);
  1312.                 $separator ";";
  1313.                 break;
  1314.             case 'fabrick':
  1315.             case 'sate':
  1316.                 break;
  1317.             default: break;
  1318.         }
  1319.         file_put_contents($file$content);
  1320.         if(($handle fopen($file"r")) !== FALSE) {
  1321.             while(($data fgetcsv($handle5000$separator)) !== FALSE) {
  1322.                 // Data
  1323.                 switch($supplierSlug){
  1324.                     case 'bcc-pos':
  1325.                     case 'fabrick':
  1326.                     case 'lis-holding':
  1327.                     case 'nexi':
  1328.                     case 'sate':
  1329.                     case 'worldline-italia':
  1330.                     case 'worldline-ccb':
  1331.                         $dataEncoded array_map("utf8_encode"$data);
  1332.                         break;
  1333.                     case 'demis-adp':
  1334.                     case 'nexi-book-sia':
  1335.                         $dataEncoded $data;
  1336.                         break;
  1337.                     default: break;
  1338.                 }
  1339.                 if($row == 0){
  1340.                     $keys TicketService::importFileGetKeys($dataEncoded);
  1341.                 }
  1342.                 else{                    
  1343.                     switch($supplierSlug){
  1344.                         case 'fabrick'$json TicketService::importFileCreateJson($dataEncoded$keystrue); break;
  1345.                         default: $json TicketService::importFileCreateJson($dataEncoded$keysfalse); break;
  1346.                     }
  1347.                     // Supplier
  1348.                     switch($supplierSlug){
  1349.                         case 'demis-adp':
  1350.                         case 'bcc-pos':
  1351.                         case 'fabrick':
  1352.                         case 'lis-holding':
  1353.                         case 'nexi-book-sia':
  1354.                             $supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => $supplierSlug));
  1355.                             break;
  1356.                         case 'nexi':
  1357.                         case 'sate':
  1358.                         case 'worldline':
  1359.                         case 'worldline-italia':
  1360.                         case 'worldline-ccb':
  1361.                             $supplierIdentifier TicketService::importFileFindSupplier($em$supplierSlug$json);
  1362.                             switch($supplierIdentifier){
  1363.                                 case "Meps"$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'nexi-book-meps')); break;
  1364.                                 case "Monetica"$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'nexi-book-monetica')); break;
  1365.                                 case "CCB"$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'worldline-ccb')); break;
  1366.                                 case "Normal"$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'worldline-italia')); break;
  1367.                                 case "Sate-Argentea"$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'sate---argentea')); break;
  1368.                                 case "Sate-Flagpay"$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'sate---flagpay')); break;
  1369.                                 case "Sate-Mooney"$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'sate---mooney')); break;
  1370.                                 case "Sate-Numera"$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'sate---numera')); break;
  1371.                                 case "Sate-Pluxee"$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'sate---pluxee')); break;
  1372.                                 case "Sate-Worldline"$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'sate---worldline')); break;
  1373.                                 default: break;
  1374.                             }
  1375.                             break;
  1376.                         default: break;
  1377.                     }
  1378.                     // Operation
  1379.                     $operation null;
  1380.                     switch($supplierSlug){
  1381.                         case 'demis-adp':
  1382.                         case 'bcc-pos':
  1383.                         case 'fabrick':
  1384.                         case 'lis-holding':
  1385.                         case 'nexi'
  1386.                         case 'sate':
  1387.                         case 'worldline-italia':
  1388.                         case 'worldline-ccb':
  1389.                             $operation TicketService::importFileDefineOperation($supplier$keys$data);
  1390.                             break;
  1391.                         case 'nexi-book-sia':
  1392.                             $operation $em->getRepository('App\Entity\Slave\Operation')->findOneById($operationId);
  1393.                             break;
  1394.                         default: break;
  1395.                     }
  1396.                     
  1397.                     // Datetime start
  1398.                     $array json_decode($jsontrue);
  1399.                     $datetime null;
  1400.                     $datetimeField null;
  1401.                     $datetimeFormat null;
  1402.                     switch($supplierSlug){
  1403.                         case 'bcc-pos':
  1404.                             foreach($array as $val){
  1405.                                 if(array_key_exists('DataScheda'$val)) $date $val['DataScheda'];
  1406.                                 if(array_key_exists('Dataordine'$val)) $date $val['Dataordine'];
  1407.                                 if(array_key_exists('Ora Ordine'$val)) $time $val['Ora Ordine'];
  1408.                             }
  1409.                             $datetime $date." ".$time;
  1410.                             $datetimeFormat 'dmY Hi';
  1411.                             break;
  1412.                         case 'fabrick':
  1413.                             $datetimeField 'Data creazione';
  1414.                             $datetimeFormat 'd-m-Y H:i:s';
  1415.                             break;
  1416.                         case 'lis-holding':
  1417.                             // MANCA DATA DI RICEZIONE
  1418.                             break;
  1419.                         case 'nexi'
  1420.                             $datetimeField 'Data ora assegnazione';
  1421.                             $datetimeFormat 'd/m/Y H.i';
  1422.                             break;
  1423.                         case 'demis-adp':
  1424.                         case 'worldline-italia':
  1425.                         case 'worldline-ccb':
  1426.                             $datetimeField 'Data apertura';
  1427.                             $datetimeFormat 'd/m/Y H:i';
  1428.                             break;
  1429.                         case 'nexi-book-sia':
  1430.                             $datetimeField 'sys_created_on';
  1431.                             $datetimeFormat 'd-m-Y H:i:s';
  1432.                             break;
  1433.                         case 'sate':
  1434.                             $datetimeField 'Data apertura';
  1435.                             $datetimeFormat 'd/m/Y H:i:s';
  1436.                             break;
  1437.                         default: break;
  1438.                     }
  1439.                     if($datetime == null){
  1440.                         foreach($array as $val){
  1441.                             if(array_key_exists($datetimeField$val))
  1442.                                 $datetime $val[$datetimeField];
  1443.                         }
  1444.                     }
  1445.                     $datetimeStart date_create_from_format($datetimeFormat$datetime);
  1446.                     [$tickets$arrayNumberTermids] = TicketService::importFileCreateTicket($em$user$tickets$supplier$operation$datetimeStart$json$arrayNumberTermids);
  1447.                 }
  1448.                 $row++;
  1449.             }
  1450.             fclose($handle);
  1451.         }
  1452.         $error false;
  1453.         foreach($tickets as $ticket){
  1454.             //QUESTO IF SERVE PERCHE' IL CONTROLLO DEI DOPPIONI SE ESISTE RITORNA COMUNQUE UN TICKET NULL
  1455.             if($ticket != null){
  1456.                 if($ticket->getOperation() != null){
  1457.                     $error TicketService::ticketMapClient($em$ticket);
  1458.                     if(!$error$error TicketService::ticketMapColumns($em$emMaster$company$ticket);
  1459.                     if(!$errorTicketService::ticketAssignOperationTariffAmount($em$emMaster$ticket);
  1460.                     if(!$errorTicketService::ticketAutoAssign($em$emMaster$user$ticket$mailer);
  1461.                 }
  1462.                 else{
  1463.                     $error true;
  1464.                     if($supplier != null){
  1465.                         $ticket->setSystemError(true);
  1466.                         $ticket->setSystemErrorSlug('operation');
  1467.                         $ticket->setSystemErrorDetails("Impossibile determinare l'<b>operazione</b> del ticket");
  1468.                         $em->flush();
  1469.                     }
  1470.                 }
  1471.                 $countInserted++;
  1472.             }
  1473.         }
  1474.         return [$error$row$countInserted];
  1475.     }
  1476.     static public function importFileCSC($em$emMaster$user$form$error$row$countInserted$mailer)
  1477.     {        
  1478.         $arrayNumberTermids = [];
  1479.         
  1480.         if(($handle fopen($form->get('file')->getData(), "r")) !== FALSE) {
  1481.             while(($data fgetcsv($handle2000$form->get('separator')->getData())) !== FALSE) {
  1482.                 if($row == 0){
  1483.                     $data preg_replace("/à/""a"$data);
  1484.                     $keys TicketService::importFileGetKeys(array_map("utf8_encode"$data));
  1485.                 }
  1486.                 else{
  1487.                     $json TicketService::importFileCreateJson(array_map("utf8_encode"$data), $keysfalse);
  1488.                     $array json_decode($jsontrue);
  1489.                     $supplier null;
  1490.                     $supOpPrefix null;
  1491.                     switch(strtolower($array[10]['Cliente'])){
  1492.                         case 'c global'$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---cglobal')); $supOpPrefix 'csc_cglobal'; break;
  1493.                         case 'c-global spa'$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---cglobal')); $supOpPrefix 'csc_cglobal'; break;
  1494.                         case 'stripe'$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---stripe')); $supOpPrefix 'csc_stripe'; break;
  1495.                         case 'cronos'$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---cronos')); $supOpPrefix 'csc_cronos'; break;
  1496.                         case 'cronos s.r.l.'$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---cronos')); $supOpPrefix 'csc_cronos'; break;
  1497.                         case 'c.s.e. centro servizi elettronici'$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---cse')); $supOpPrefix 'csc_cse'; break;
  1498.                         case 'decathlon italia s.r.l'$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---decathlon')); $supOpPrefix 'csc_decathlon'; break;
  1499.                         case 'euronet'$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---euronet')); $supOpPrefix 'csc_euronet'; break;
  1500.                         case 'get your bill'$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---get-your-bill')); $supOpPrefix 'csc_euronet'; break;
  1501.                         case 'lis pay'$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---lis-pay')); $supOpPrefix 'csc_lis_pay'; break;
  1502.                         case 'lis poste pay'$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---lispostepay')); $supOpPrefix 'csc_lis_poste_pay'; break;
  1503.                         case 'numera sist. e inform. spa':  $supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---numera')); $supOpPrefix 'csc_numera'; break;
  1504.                         case 'q8'$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---q8')); $supOpPrefix 'csc_q8'; break;
  1505.                         case 'pay distribution-yamamay'$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---yamamay')); $supOpPrefix 'csc_yamamay'; break;
  1506.                         case 'nexi payments s.p.a.'$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---nexi-book-monetica')); $supOpPrefix 'csc_nexi_book_monetica'; break;
  1507.                         case 'p4cards'$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---p4cards')); $supOpPrefix 'csc_p4cards'; break;
  1508.                         case 'repas'$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---repas')); $supOpPrefix 'csc_repas'; break;
  1509.                         default: break;
  1510.                     }
  1511.                     $operation null;
  1512.                     switch(strtolower($array[24]['Tipo int.'])){
  1513.                         case 'assistenza':
  1514.                         case 'intervento tecnico':
  1515.                         case 'intervento tecnico premium':
  1516.                         case 'intervento tecnico - upgrade pos':
  1517.                         case 'ritorno x intervento errato':
  1518.                             $operation $em->getRepository('App\Entity\Slave\Operation')->findOneBy(array('slugMaster' => $supOpPrefix.'_maintenance'));
  1519.                             break;
  1520.                         case 'migrazione':
  1521.                         case 'sostituzione massiva':
  1522.                             $operation $em->getRepository('App\Entity\Slave\Operation')->findOneBy(array('slugMaster' => $supOpPrefix.'_massive'));
  1523.                             break;
  1524.                         case 'disinstallazione':
  1525.                             $operation $em->getRepository('App\Entity\Slave\Operation')->findOneBy(array('slugMaster' => $supOpPrefix.'_uninstallation'));
  1526.                             break;
  1527.                         case 'installazione pos':
  1528.                         case 'installazione ordinaria':
  1529.                         case 'Installazione pos Urgente':
  1530.                             $operation $em->getRepository('App\Entity\Slave\Operation')->findOneBy(array('slugMaster' => $supOpPrefix.'_installation'));
  1531.                             break;
  1532.                         case 'sostituzione':
  1533.                         case 'sostituzione terminale':
  1534.                         case 'reinst/riconfig terminale':
  1535.                         case 'sost pos (no rientro pos old)':
  1536.                             $operation $em->getRepository('App\Entity\Slave\Operation')->findOneBy(array('slugMaster' => $supOpPrefix.'_replacement'));
  1537.                             break;
  1538.                         default: break;
  1539.                     }
  1540.                     
  1541.                     $technician null;
  1542.                     switch(strtolower($array[18]['Tecnico Assegnatario'])){
  1543.                         case 'biondist'$technician $em->getRepository('App\Entity\Slave\User')->findOneBy(array('email' => 'stefanobiondi71@gmail.com')); break;
  1544.                         case 'butialb'$technician $em->getRepository('App\Entity\Slave\User')->findOneBy(array('email' => 'alberto.buti@stsolution.biz')); break;
  1545.                         case 'centroufficioelba'$technician $em->getRepository('App\Entity\Slave\User')->findOneBy(array('email' => 'cuelba@elba2000.it')); break;
  1546.                         case 'chellis'$technician $em->getRepository('App\Entity\Slave\User')->findOneBy(array('email' => 'chelli.simone@gmail.com')); break;
  1547.                         case 'delbiancogiulio'$technician $em->getRepository('App\Entity\Slave\User')->findOneBy(array('email' => 'giulio.delbianco@stsolution.biz')); break;
  1548.                         case 'gemolimirko'$technician $em->getRepository('App\Entity\Slave\User')->findOneBy(array('email' => 'mirko.gemoli@stsolution.biz')); break;
  1549.                         case 'iavernarogianluca'$technician $em->getRepository('App\Entity\Slave\User')->findOneBy(array('email' => 'gianluca.iavernaro@stsolution.biz')); break;
  1550.                         case 'lippiluca'$technician $em->getRepository('App\Entity\Slave\User')->findOneBy(array('email' => 'luca.lippi@stsolution.biz')); break;
  1551.                         case 'loriniandrea'$technician $em->getRepository('App\Entity\Slave\User')->findOneBy(array('email' => 'andrea.lorini@stsolution.biz')); break;
  1552.                         case 'marinof'$technician $em->getRepository('App\Entity\Slave\User')->findOneBy(array('email' => 'francesco.marino@stsolution.biz')); break;
  1553.                         case 'speedyline'$technician $em->getRepository('App\Entity\Slave\User')->findOneBy(array('email' => 'speedylineservice@gmail.com')); break;
  1554.                         case 'toscana01':
  1555.                         case 'zelonimanuel':
  1556.                             $technician $em->getRepository('App\Entity\Slave\User')->findOneBy(array('email' => 'diessesrl@eposmanager.software'));
  1557.                             break;
  1558.                         default: break;
  1559.                     }
  1560.                     [$ticketAlreadyExist$arrayNumberTermids] = TicketService::checkTicketExistanceCsv($em$json$array[1]['ID intervento cliente'], $array[8]['Termid'], $arrayNumberTermids);
  1561.                     if(!$ticketAlreadyExist){
  1562.                         
  1563.                         $countInserted++;
  1564.                         $today = new \Datetime();
  1565.                         $datetimeStart date_create_from_format('d/m/Y H:i'$array[2]['D/O Ricezione']);
  1566.                         $datetimeExpiration date_create_from_format('d/m/Y H:i'$array[4]['D/O Scadenza']);
  1567.                         $datetimeEnd date_create_from_format('d/m/Y H:i'$array[6]['Data/ora chiusura']);
  1568.                         $province $emMaster->getRepository('App\Entity\Master\Province')->findOneBy(array('sign' => $array[17]['Prov']));
  1569.                         $city $emMaster->getRepository('App\Entity\Master\City')->findByNameOrAliasAndProvince($array[16]['Localita'], $province->getId());
  1570.                         $jsonReport '[{"ABI":'.json_encode($array[11]['ABI Rif.']).'}, {"Matricole":'.json_encode($array[22]['Matricola']).'}, {"Anomalia":'.json_encode($array[26]['Anomalia']).'}]';
  1571.                         $termid $em->getRepository('App\Entity\Slave\Termid')->findOneByCode($array[8]['Termid']);
  1572.                         if($termid == null){
  1573.                             $termid = new Termid();
  1574.                             $termid->setCode($array[8]['Termid']);
  1575.                             $em->persist($termid);
  1576.                         }
  1577.                         $client $termid->getClient();
  1578.                         if($client == null){
  1579.                             $client $em->getRepository('App\Entity\Slave\Termid')->findOneByCode($array[9]['SIA']);
  1580.                             if($client == null){
  1581.                                 $client = new Client();
  1582.                                 $client->setCode($array[9]['SIA']);
  1583.                                 $client->setName($array[12]['Rag.Soc.']);
  1584.                                 $client->setNickname($array[13]['Insegna']);
  1585.                                 $client->setAddress($array[14]['Indirizzo']);
  1586.                                 $client->setZip($array[15]['CAP']);
  1587.                                 if($city != null$client->setIdCity($city->getId());
  1588.                                 $client->setIdProvince($province->getId());
  1589.                                 $em->persist($client);
  1590.                                 $clientPhone = new ClientPhone();
  1591.                                 $clientPhone->setClient($client);
  1592.                                 $clientPhone->setName('Telefono 1');
  1593.                                 $clientPhone->setNumber($array[19]['Tel.']);
  1594.                                 $em->persist($clientPhone);
  1595.                     
  1596.                                 $warehouse = new Warehouse();
  1597.                                 $warehouse->setClient($client);
  1598.                                 $warehouse->setNickname('Magazzino cliente - '.$client->getNickname());
  1599.                                 $warehouse->setMovable(false);
  1600.                                 $client->setWarehouse($warehouse);
  1601.                                 $em->persist($warehouse);
  1602.                             }
  1603.                             
  1604.                             $termid->setClient($client);
  1605.                         }
  1606.                         $ticket = new Ticket();
  1607.                         $ticket->setNumber($array[0]['id scheda']);
  1608.                         $ticket->setSupplier($supplier);
  1609.                         $ticket->setClient($client);
  1610.                         $ticket->setOperation($operation);
  1611.                         $ticket->setTermid($termid);
  1612.                         $ticket->setDatetimeStart($datetimeStart);
  1613.                         $ticket->setDatetimeExpiration($datetimeExpiration);
  1614.                         $ticket->setDatetimeEnd($datetimeEnd);
  1615.                         $ticket->setJson($json);
  1616.                         $ticket->setDirectoryPath($today->format("Y").'/'.$today->format("m").'/'.md5(uniqid()));
  1617.                         $ticket->setJsonReport($jsonReport);
  1618.                         $ticket->setAddress($array[14]['Indirizzo']);
  1619.                         $ticket->setZip($array[15]['CAP']);
  1620.                         if($city != null)
  1621.                             $ticket->setIdCity($city->getId());
  1622.                         else
  1623.                             $ticket->setOtherCity($array[16]['Localita']);
  1624.                         $ticket->setIdProvince($province->getId());
  1625.                         $ticket->setClosedOnPortal(false);
  1626.                         $ticket->setDatetimeImport(new \DateTime());
  1627.                         $array json_decode($jsontrue);
  1628.                         for($i=0$i<sizeof($array); $i++){
  1629.                             if($supplier->getOperationNotBillableCodes() != null && $supplier->getOperationNotBillableCodes() != '' && array_key_exists($supplier->getOperationMapping(), $array[$i]) && preg_match('/'.$supplier->getOperationNotBillableCodes().'/'$array[$i][$supplier->getOperationMapping()]))
  1630.                                 $ticket->setBillable(false);
  1631.                         }
  1632.             
  1633.                         $em->persist($ticket);
  1634.                         TicketService::createTicketLog($em$user$ticket"ct"$ticket->getTechnician(), $technician);
  1635.                         $ticket->setTechnician($technician);
  1636.                         if($technician == null){
  1637.                             $statusToAssign $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'to_assign'));
  1638.                             TicketService::createTicketLog($em$user$ticket"cs"null$statusToAssign->getValue());
  1639.                             $ticket->setStatus($statusToAssign);
  1640.                         }
  1641.                         else{
  1642.                             $statusAssigned $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'assigned'));
  1643.                             TicketService::createTicketLog($em$user$ticket"cs"null$statusAssigned->getValue());
  1644.                             $ticket->setStatus($statusAssigned);
  1645.                         }
  1646.                         
  1647.                         $em->flush();
  1648.                         TicketService::ticketAssignOperationTariffAmount($em$emMaster$ticket);
  1649.                         // Invio messaggio di notifica al tecnico
  1650.                         $settingTechnicianSendAssignEmail $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_technician_send_assign_email'));
  1651.                         if($settingTechnicianSendAssignEmail->getValue() == && $ticket->getTechnician()->isAssignEmailActive()){
  1652.                             $tickets = [];
  1653.                             array_push($tickets$ticket);
  1654.                             $message = (new TemplatedEmail())
  1655.                                 ->subject($this->params->get('subject_ticket_take_charge'))
  1656.                                 ->from($this->params->get('email_noreply'))
  1657.                                 ->to($ticket->getTechnician()->getEmail())
  1658.                                 ->htmlTemplate('email/technician_tickets.html.twig')
  1659.                                 ->context(['user' => $ticket->getTechnician(), 'tickets' => $tickets]);
  1660.                             $mailer->send($message);
  1661.                         }
  1662.                     }
  1663.                 }
  1664.                 $row++;
  1665.             }
  1666.         }
  1667.         return [$error$row$countInserted];
  1668.     }
  1669.     static public function importFileCSCNew($em$emMaster$user$form$error$row$countInserted$mailer)
  1670.     {        
  1671.         $arrayNumberTermids = [];
  1672.         
  1673.         if(($handle fopen($form->get('file')->getData(), "r")) !== FALSE) {
  1674.             while(($data fgetcsv($handle2000$form->get('separator')->getData())) !== FALSE) {
  1675.                 if($row == 0){
  1676.                     $data preg_replace("/à/""a"$data);
  1677.                     $keys TicketService::importFileGetKeys(array_map("utf8_encode"$data));
  1678.                 }
  1679.                 else{
  1680.                     $json TicketService::importFileCreateJson(array_map("utf8_encode"$data), $keysfalse);
  1681.                     $array json_decode($jsontrue);
  1682.                     $supplier null;
  1683.                     $supOpPrefix null;
  1684.                     switch(strtolower($array[0]['Cliente'])){
  1685.                         case 'c global'$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---cglobal')); $supOpPrefix 'csc_cglobal'; break;
  1686.                         case 'c-global spa'$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---cglobal')); $supOpPrefix 'csc_cglobal'; break;
  1687.                         case 'stripe'$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---stripe')); $supOpPrefix 'csc_stripe'; break;
  1688.                         case 'cronos'$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---cronos')); $supOpPrefix 'csc_cronos'; break;
  1689.                         case 'cronos s.r.l.'$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---cronos')); $supOpPrefix 'csc_cronos'; break;
  1690.                         case 'c.s.e. centro servizi elettronici'$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---cse')); $supOpPrefix 'csc_cse'; break;
  1691.                         case 'decathlon italia s.r.l'$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---decathlon')); $supOpPrefix 'csc_decathlon'; break;
  1692.                         case 'euronet'$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---euronet')); $supOpPrefix 'csc_euronet'; break;
  1693.                         case 'get your bill'$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---get-your-bill')); $supOpPrefix 'csc_euronet'; break;
  1694.                         case 'lis pay'$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---lis-pay')); $supOpPrefix 'csc_lis_pay'; break;
  1695.                         case 'lis poste pay'$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---lispostepay')); $supOpPrefix 'csc_lis_poste_pay'; break;
  1696.                         case 'numera sist. e inform. spa':  $supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---numera')); $supOpPrefix 'csc_numera'; break;
  1697.                         case 'q8'$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---q8')); $supOpPrefix 'csc_q8'; break;
  1698.                         case 'pay distribution-yamamay'$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---yamamay')); $supOpPrefix 'csc_yamamay'; break;
  1699.                         case 'nexi payments s.p.a.'$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---nexi-book-monetica')); $supOpPrefix 'csc_nexi_book_monetica'; break;
  1700.                         case 'p4cards'$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---p4cards')); $supOpPrefix 'csc_p4cards'; break;
  1701.                         case 'repas'$supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---repas')); $supOpPrefix 'csc_repas'; break;
  1702.                         default: break;
  1703.                     }
  1704.                     $operation null;
  1705.                     switch(strtolower($array[1]['Tipo'])){
  1706.                         case 'assistenza':
  1707.                         case 'intervento tecnico':
  1708.                         case 'intervento tecnico premium':
  1709.                         case 'intervento tecnico - upgrade pos':
  1710.                         case 'ritorno x intervento errato':
  1711.                             $operation $em->getRepository('App\Entity\Slave\Operation')->findOneBy(array('slugMaster' => $supOpPrefix.'_maintenance'));
  1712.                             break;
  1713.                         case 'migrazione':
  1714.                         case 'sostituzione massiva':
  1715.                             $operation $em->getRepository('App\Entity\Slave\Operation')->findOneBy(array('slugMaster' => $supOpPrefix.'_massive'));
  1716.                             break;
  1717.                         case 'disinstallazione':
  1718.                             $operation $em->getRepository('App\Entity\Slave\Operation')->findOneBy(array('slugMaster' => $supOpPrefix.'_uninstallation'));
  1719.                             break;
  1720.                         case 'installazione pos':
  1721.                         case 'installazione ordinaria':
  1722.                         case 'Installazione pos Urgente':
  1723.                             $operation $em->getRepository('App\Entity\Slave\Operation')->findOneBy(array('slugMaster' => $supOpPrefix.'_installation'));
  1724.                             break;
  1725.                         case 'sostituzione':
  1726.                         case 'sostituzione terminale':
  1727.                         case 'reinst/riconfig terminale':
  1728.                         case 'sost pos (no rientro pos old)':
  1729.                             $operation $em->getRepository('App\Entity\Slave\Operation')->findOneBy(array('slugMaster' => $supOpPrefix.'_replacement'));
  1730.                             break;
  1731.                         default: break;
  1732.                     }
  1733.                     
  1734.                     $technician null;
  1735.                     [$ticketAlreadyExist$arrayNumberTermids] = TicketService::checkTicketExistanceCsv($em$json$array[2]['Intervento cliente'], $array[3]['TID'], $arrayNumberTermids);
  1736.                     if(!$ticketAlreadyExist){
  1737.                         
  1738.                         $countInserted++;
  1739.                         $today = new \Datetime();
  1740.                         $datetimeStart date_create_from_format('d/m/Y H:i:s'$array[8]['Data apertura']);
  1741.                         $datetimeExpiration date_create_from_format('d/m/Y H:i:s'$array[11]['Data scadenza']);
  1742.                         $province $emMaster->getRepository('App\Entity\Master\Province')->findOneBy(array('name' => $array[29]['Provincia']));
  1743.                         $city $emMaster->getRepository('App\Entity\Master\City')->findByNameOrAliasAndProvince($array[31]['Citta'], $province->getId());
  1744.                         $termid $em->getRepository('App\Entity\Slave\Termid')->findOneByCode($array[3]['TID']);
  1745.                         if($termid == null){
  1746.                             $termid = new Termid();
  1747.                             $termid->setCode($array[3]['TID']);
  1748.                             $em->persist($termid);
  1749.                         }
  1750.                         $client $termid->getClient();
  1751.                         if($client == null){
  1752.                             $client = new Client();
  1753.                             $client->setCode($array[3]['TID']);
  1754.                             $client->setName($array[5]['Insegna']);
  1755.                             $client->setNickname($array[5]['Insegna']);
  1756.                             $client->setAddress($array[32]['Indirizzo']);
  1757.                             $client->setZip($array[30]['Cap']);
  1758.                             if($city != null$client->setIdCity($city->getId());
  1759.                             $client->setIdProvince($province->getId());
  1760.                             $em->persist($client);
  1761.                             $clientPhone = new ClientPhone();
  1762.                             $clientPhone->setClient($client);
  1763.                             $clientPhone->setName('Telefono 1');
  1764.                             $clientPhone->setNumber($array[34]['Telefono 1']);
  1765.                             $em->persist($clientPhone);
  1766.                             if($array[35]['Telefono 2'] != "" && $array[35]['Telefono 2'] != '-'){
  1767.                                 $clientPhone = new ClientPhone();
  1768.                                 $clientPhone->setClient($client);
  1769.                                 $clientPhone->setName('Telefono 2');
  1770.                                 $clientPhone->setNumber($array[35]['Telefono 2']);
  1771.                                 $em->persist($clientPhone);
  1772.                             }
  1773.                 
  1774.                             $warehouse = new Warehouse();
  1775.                             $warehouse->setClient($client);
  1776.                             $warehouse->setNickname('Magazzino cliente - '.$client->getNickname());
  1777.                             $warehouse->setMovable(false);
  1778.                             $client->setWarehouse($warehouse);
  1779.                             $em->persist($warehouse);
  1780.                             
  1781.                             $termid->setClient($client);
  1782.                         }
  1783.                         $ticket = new Ticket();
  1784.                         $ticket->setNumber($array[2]['Intervento cliente']);
  1785.                         $ticket->setSupplier($supplier);
  1786.                         $ticket->setClient($client);
  1787.                         $ticket->setOperation($operation);
  1788.                         $ticket->setTermid($termid);
  1789.                         $ticket->setDatetimeStart($datetimeStart);
  1790.                         $ticket->setDatetimeExpiration($datetimeExpiration);
  1791.                         $ticket->setJson($json);
  1792.                         $ticket->setDirectoryPath($today->format("Y").'/'.$today->format("m").'/'.md5(uniqid()));
  1793.                         $ticket->setAddress($array[32]['Indirizzo']);
  1794.                         $ticket->setZip($array[30]['Cap']);
  1795.                         if($city != null)
  1796.                             $ticket->setIdCity($city->getId());
  1797.                         else
  1798.                             $ticket->setOtherCity($array[31]['Citta']);
  1799.                         $ticket->setIdProvince($province->getId());
  1800.                         $ticket->setClosedOnPortal(false);
  1801.                         $ticket->setDatetimeImport(new \DateTime());
  1802.                         $array json_decode($jsontrue);
  1803.                         for($i=0$i<sizeof($array); $i++){
  1804.                             if($supplier->getOperationNotBillableCodes() != null && $supplier->getOperationNotBillableCodes() != '' && array_key_exists($supplier->getOperationMapping(), $array[$i]) && preg_match('/'.$supplier->getOperationNotBillableCodes().'/'$array[$i][$supplier->getOperationMapping()]))
  1805.                                 $ticket->setBillable(false);
  1806.                         }
  1807.             
  1808.                         $em->persist($ticket);
  1809.                         TicketService::createTicketLog($em$user$ticket"ct"$ticket->getTechnician(), $technician);
  1810.                         $ticket->setTechnician($technician);
  1811.                         if($technician == null){
  1812.                             $statusToAssign $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'to_assign'));
  1813.                             TicketService::createTicketLog($em$user$ticket"cs"null$statusToAssign->getValue());
  1814.                             $ticket->setStatus($statusToAssign);
  1815.                         }
  1816.                         else{
  1817.                             $statusAssigned $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'assigned'));
  1818.                             TicketService::createTicketLog($em$user$ticket"cs"null$statusAssigned->getValue());
  1819.                             $ticket->setStatus($statusAssigned);
  1820.                         }
  1821.                         
  1822.                         $em->flush();
  1823.                         TicketService::ticketAssignOperationTariffAmount($em$emMaster$ticket);
  1824.                         // Invio messaggio di notifica al tecnico
  1825.                         $settingTechnicianSendAssignEmail $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_technician_send_assign_email'));
  1826.                         if($settingTechnicianSendAssignEmail->getValue() == && $ticket->getTechnician()->isAssignEmailActive()){
  1827.                             $tickets = [];
  1828.                             array_push($tickets$ticket);
  1829.                             $message = (new TemplatedEmail())
  1830.                                 ->subject($this->params->get('subject_ticket_take_charge'))
  1831.                                 ->from($this->params->get('email_noreply'))
  1832.                                 ->to($ticket->getTechnician()->getEmail())
  1833.                                 ->htmlTemplate('email/technician_tickets.html.twig')
  1834.                                 ->context(['user' => $ticket->getTechnician(), 'tickets' => $tickets]);
  1835.                             $mailer->send($message);
  1836.                         }
  1837.                     }
  1838.                 }
  1839.                 $row++;
  1840.             }
  1841.         }
  1842.         return [$error$row$countInserted];
  1843.     }
  1844.     // Funzioni di gestione
  1845.     static public function importFileGetKeys($data)
  1846.     {
  1847.         $keys = array();
  1848.         foreach($data as $d)
  1849.             array_push($keys$d);
  1850.         return $keys;
  1851.     }
  1852.     static public function importFileCreateJson($data$keys$utf8Decode)
  1853.     {
  1854.         $first true;
  1855.         $json '[';
  1856.         for($i 0$i sizeof($data); $i++){
  1857.             if($utf8Decode)
  1858.                 $keys[$i] = utf8_decode($keys[$i]);
  1859.             [$json$first] = TicketService::addToJson($json$first$keys[$i], $data[$i]);
  1860.         }
  1861.         $json.= ']';
  1862.         return $json;
  1863.     }
  1864.     static public function importFileFindSupplier($em$supplierType$json)
  1865.     {
  1866.         $identifier null;
  1867.         switch($supplierType){
  1868.             case 'nexi':
  1869.                 $supplierMonetica $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'nexi-book-monetica'));
  1870.                 $supplierMeps $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'nexi-book-meps'));
  1871.                 $identifier TicketService::nexiSupplierSearch($supplierMonetica$json);
  1872.                 if($identifier == null)
  1873.                     $identifier TicketService::nexiSupplierSearch($supplierMeps$json);
  1874.                 break;
  1875.             case 'demis-adp':
  1876.             case 'worldline':
  1877.             case 'worldline-italia':
  1878.             case 'worldline-ccb':
  1879.                 $identifier TicketService::worldlineSupplierSearch('import'$json);
  1880.                 break;
  1881.             case 'sate':
  1882.                 $identifier TicketService::sateSupplierSearch('import'$json);
  1883.                 break;
  1884.             default: break;
  1885.         }
  1886.         return $identifier;
  1887.     }
  1888.     static public function importFileDefineOperation($supplier$keys$data)
  1889.     {
  1890.         $index null;
  1891.         $operation null;
  1892.         for($k 0$k sizeof($keys); $k++){
  1893.             $keys[$k] = preg_replace("/\"/",""$keys[$k]);
  1894.             $keys[$k] = preg_replace("//",""$keys[$k]);
  1895.             if(rtrim(ltrim(strtolower($keys[$k]), '"'), '"') == strtolower($supplier->getOperationMapping())){
  1896.                 $index $k;
  1897.                 break;
  1898.             }
  1899.         }
  1900.         if($index !== null){
  1901.             foreach($supplier->getOperations() as $op){
  1902.                 if(!$op->isUav() && $op->getIdentifierRegex() != null){
  1903.                     if(preg_match('/'.$op->getIdentifierRegex().'/'$data[$index])){
  1904.                         $operation $op;
  1905.                         break;
  1906.                     }
  1907.                 }
  1908.             }
  1909.         }
  1910.         return $operation;
  1911.     }
  1912.     static public function importFileCreateTicket($em$user$tickets$supplier$operation$datetimeStart$json$arrayNumberTermids)
  1913.     {
  1914.         [$ticket$arrayNumberTermids] = TicketService::createTicket($em$user$supplier$operation$datetimeStart$json$arrayNumberTermids);
  1915.         if($ticket != null && $operation == null){
  1916.             $ticket->setSystemError(true);
  1917.             $ticket->setSystemErrorSlug('key_mapping');
  1918.             $ticket->setSystemErrorDetails("Non esiste la chiave \"".$supplier->getOperationMapping()."\" nei dettagli del ticket");
  1919.             $em->flush();
  1920.         }
  1921.         if($ticket != null)
  1922.             array_push($tickets$ticket);
  1923.         return [$tickets$arrayNumberTermids];
  1924.     }
  1925.     static public function createTicketLog($em$user$ticket$action$oldValue$newValue)
  1926.     {
  1927.         $persist false;
  1928.         switch($action){
  1929.             case 'cs':
  1930.                 if(($oldValue != null && $oldValue->getValue() != $newValue) || ($oldValue == null && $newValue != null))
  1931.                     $persist true;
  1932.                 break;
  1933.             case 'ct':
  1934.                 if(($oldValue != null && $newValue != null && $oldValue->__toString() != $newValue->__toString()) || ($oldValue == null && $newValue != null) || ($oldValue != null && $newValue == null))
  1935.                     $persist true;
  1936.                 break;
  1937.             default: break;
  1938.         }
  1939.         if($persist){
  1940.             $ticketLog = new TicketLog();
  1941.             $ticketLog->setTicket($ticket);
  1942.             $ticketLog->setDatetime(new \Datetime());
  1943.             $ticketLog->setAction($action);
  1944.             if($user != null)
  1945.                 $ticketLog->setOperator($user->__toString());
  1946.             else
  1947.                 $ticketLog->setOperator('Script');
  1948.             switch($action){
  1949.                 case 'cs':
  1950.                     if($oldValue == null$oldValue "Nessuno"; else $oldValue $oldValue->getValue();
  1951.                     if($newValue == null$newValue "Nessuno";
  1952.                     $ticketLog->setOldValue($oldValue);
  1953.                     $ticketLog->setNewValue($newValue);
  1954.                     break;
  1955.                 case 'ct':
  1956.                     if($oldValue == null$oldValue "Nessuno"; else $oldValue $oldValue->__toString();
  1957.                     if($newValue == null$newValue "Nessuno"; else $newValue $newValue->__toString();
  1958.                     $ticketLog->setOldValue($oldValue);
  1959.                     $ticketLog->setNewValue($newValue);
  1960.                     break;
  1961.                 default: break;
  1962.             }
  1963.             $em->persist($ticketLog);
  1964.             
  1965.             $em->flush($ticketLog);
  1966.         }
  1967.     }
  1968. }