src/Controller/User/UserTicketController.php line 1304

Open in your IDE?
  1. <?php
  2. namespace App\Controller\User;
  3. use App\Entity\Master\CityAlias;
  4. use App\Entity\Slave\Client;
  5. use App\Entity\Slave\ClientPhone;
  6. use App\Entity\Slave\Product;
  7. use App\Entity\Slave\Intervention;
  8. use App\Entity\Slave\InterventionActivity;
  9. use App\Entity\Slave\InterventionExtra;
  10. use App\Entity\Slave\Termid;
  11. use App\Entity\Slave\Ticket;
  12. use App\Entity\Slave\TicketReminder;
  13. use App\Entity\Slave\TicketSuspension;
  14. use App\Entity\Slave\Warehouse;
  15. use App\Form\Base\DocumentType;
  16. use App\Form\Master\CityAliasType;
  17. use App\Form\Model\AssignTechnician;
  18. use App\Form\Model\Document;
  19. use App\Form\Model\ImportTicketsSuspend;
  20. use App\Form\Model\ImportTicketsSusUnlock;
  21. use App\Form\Model\ImportTicketCancels;
  22. use App\Form\Model\ImportTicketClosures;
  23. use App\Form\Model\ImportTicketIntervention;
  24. use App\Form\Model\ImportTicketNew;
  25. use App\Form\Slave\AssignTechnicianType;
  26. use App\Form\Slave\ClientEditType;
  27. use App\Form\Slave\InterventionType;
  28. use App\Form\Slave\InterventionActivityType;
  29. use App\Form\Slave\InterventionSlaType;
  30. use App\Form\Slave\InterventionExtraType;
  31. use App\Form\Slave\OperationKeysMappingType;
  32. use App\Form\Slave\TicketType;
  33. use App\Form\Slave\TicketAddressType;
  34. use App\Form\Slave\TicketErrorProvinceType;
  35. use App\Form\Slave\TicketErrorAddressType;
  36. use App\Form\Slave\TicketErrorSupplierType;
  37. use App\Form\Slave\TicketErrorOperationType;
  38. use App\Form\Slave\TicketDeleteType;
  39. use App\Form\Slave\TicketOperationType;
  40. use App\Form\Slave\TicketOperationTariffAmountType;
  41. use App\Form\Slave\TicketExpirationEditType;
  42. use App\Form\Slave\TicketWaybillEditType;
  43. use App\Form\Slave\TicketNotesEditType;
  44. use App\Form\Slave\TicketReminderType;
  45. use App\Form\Slave\TicketSuspensionEditType;
  46. use App\Form\Slave\TicketSuspensionApproveType;
  47. use App\Form\Slave\TicketSuspensionUnlockType;
  48. use App\Form\Slave\ImportTicketCancelsType;
  49. use App\Form\Slave\ImportTicketClosuresType;
  50. use App\Form\Slave\ImportTicketsSuspendType;
  51. use App\Form\Slave\ImportTicketsSusUnlockType;
  52. use App\Form\Slave\ImportTicketInterventionType;
  53. use App\Form\Slave\ImportTicketNewType;
  54. use App\Service\EncryptionService;
  55. use App\Service\FilterService;
  56. use App\Service\FormValidatorService;
  57. use App\Service\ImportService;
  58. use App\Service\MediaService;
  59. use App\Service\ProductService;
  60. use App\Service\TicketService;
  61. use App\Service\UtilitiesService;
  62. use App\Service\ValidationService;
  63. use Doctrine\Persistence\ManagerRegistry;
  64. use Knp\Snappy\Pdf;
  65. use Knp\Component\Pager\PaginatorInterface;
  66. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  67. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  68. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  69. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  70. use Symfony\Component\Filesystem\Filesystem;
  71. use Symfony\Component\Form\FormError;
  72. use Symfony\Component\Form\FormFactoryInterface;
  73. use Symfony\Component\HttpFoundation\Request;
  74. use Symfony\Component\HttpFoundation\Response;
  75. use Symfony\Component\HttpFoundation\ResponseHeaderBag;
  76. use Symfony\Component\HttpFoundation\StreamedResponse;
  77. use Symfony\Component\Mailer\MailerInterface;
  78. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  79. use Symfony\Component\Routing\Annotation\Route;
  80. use Symfony\Component\Validator\Validator\ValidatorInterface;
  81. /**
  82.  * @Route("/scrivania/ticket")
  83.  * @Security("is_granted('ROLE_USER') and is_granted('active', user) && is_granted('view', 'ticket')")
  84.  */
  85. class UserTicketController extends AbstractController
  86. {
  87.     private $mr;
  88.     private $params;
  89.     public function __construct(ManagerRegistry $mrParameterBagInterface $params){
  90.         $this->mr $mr;
  91.         $this->params $params;
  92.     }
  93.     public function activityProductByType($em$form$type$suppliers){
  94.         if($form->get('product'.$type.'Id')->getData() != null){
  95.             $product $em->getRepository('App\Entity\Slave\Product')->findOneById($form->get('product'.$type.'Id')->getData());
  96.         }
  97.         else{
  98.             $model $em->getRepository('App\Entity\Slave\ProductModel')->findOneById($form->get('model'.$type.'Id')->getData());
  99.             switch($type){
  100.                 case 'Withdraw'
  101.                     $status $em->getRepository('App\Entity\Slave\ProductStatus')->findOneBy(array('slug' => 'not_available'));
  102.                     $condition $em->getRepository('App\Entity\Slave\ProductCondition')->findOneBy(array('slug' => 'broken'));
  103.                     break;
  104.                 case 'Actual':
  105.                     $status $em->getRepository('App\Entity\Slave\ProductStatus')->findOneBy(array('slug' => 'in_use'));
  106.                     $condition $em->getRepository('App\Entity\Slave\ProductCondition')->findOneBy(array('slug' => 'free'));
  107.                     break;
  108.                 default: break;
  109.             }
  110.             $product ProductService::createProduct($em$model$form->get('producer'.$type)->getData(), $form->get('supplier'.$type)->getData(), $suppliers$status$condition);
  111.         }
  112.         return $product;
  113.     }
  114.     public function importCheckFile($em$validator$form){
  115.         $row 0;
  116.         $valid true;
  117.         if($valid$valid ValidationService::validateNotBlank($validator$form->get('separator'));
  118.         if($valid$valid ValidationService::validateCsvDelimiter($form->get('file')->getData()->getPathName(), $form->get('separator')->getData(), $form->get('separator'));
  119.         if($valid$valid ValidationService::validateFile($validator$form->get('path'), true$form->get('file')->getData(), '10', array('csv''txt'));
  120.         if($valid && ($handle fopen($form->get('file')->getData(), "r")) !== FALSE) {
  121.             while(($data fgetcsv($handle2000$form->get('separator')->getData())) !== FALSE) {
  122.                 $data array_map("utf8_encode"$data);
  123.                 if($row 0){
  124.                     $ticket $em->getRepository('App\Entity\Slave\Ticket')->findOneByNumberAndTermid($data[0], $data[1]);
  125.                     if($ticket == null){
  126.                         $valid false;
  127.                         $form->get("path")->addError(new FormError("Ticket non trovato"));
  128.                         $this->addFlash('notice_danger''Il ticket presente alla riga '.$row.' con n° '.$data[0].' e termid '.$data[1].' non è stato trovato! Ricontrolla il file!');
  129.                         break;
  130.                     }
  131.                 }
  132.                 $row++;
  133.             }
  134.             fclose($handle);
  135.         }
  136.         return $valid;
  137.     }
  138.     public function importInterventionCreate($em$ticket$warehouse$datetime){
  139.         $intervention = new Intervention();
  140.         $intervention->setTicket($ticket);
  141.         $intervention->setTechnician($ticket->getTechnician());
  142.         $intervention->setOperator($this->getUser());
  143.         $intervention->setOutcomeType($em->getRepository('App\Entity\Slave\InterventionOutcomeType')->findOneBy(array('slug' => 'completed')));
  144.         $intervention->setOutcome($em->getRepository('App\Entity\Slave\InterventionOutcome')->findOneBy(array('slug' => 'completato-correttamente')));
  145.         $intervention->setWarehouse($warehouse);
  146.         $intervention->setDatetime($datetime);
  147.         $intervention->setDatetimeBilling(date_create_from_format('d-m-Y H:i:s''01-'.$datetime->format('m').'-'.$datetime->format('Y').' 00:00:00'));
  148.         if($ticket->getOperationTariffAmount() != null)
  149.             $intervention->setAmount($ticket->getOperationTariffAmount()->getAmount());
  150.         $intervention->setAmountTechnician('0.00');
  151.         $intervention->setBillable(true);
  152.         $em->persist($intervention);
  153.         return $intervention;
  154.     }
  155.     public function importInterventionSearchProduct($em$code$supplier){
  156.         $product $em->getRepository('App\Entity\Slave\Product')->findOneBy(array('codeProducer' => $code));
  157.         if($product == null)
  158.             $product $em->getRepository('App\Entity\Slave\Product')->findOneBy(array('codeSupplier' => $code));
  159.         return $product;
  160.     }
  161.     public function importInterventionActivity($em$ticket$intervention$activityType$isDisi$prodOld$prodNew$warehouse$datetime){
  162.         $activity = new InterventionActivity();
  163.         $activity->setIntervention($intervention);
  164.         $activity->setType($activityType);
  165.         $skip false;
  166.         if($prodOld != null && $prodNew != null && ($prodNew->getCodeProducer() == $prodOld->getCodeProducer() || $prodNew->getCodeProducer() == '0'.$prodOld->getCodeProducer()))
  167.             $skip true;
  168.         if($prodOld != null){
  169.             $activity->setProductWithdraw($prodOld);
  170.             $activity->setProducerWithdraw($prodOld->getCodeProducer());
  171.             $activity->setSupplierWithdraw($prodOld->getCodeSupplier());
  172.             $newWarehouse $warehouse;
  173.             if($prodOld->movedByDS())
  174.                 $newWarehouse $prodOld->getActualWarehouse();
  175.             else{
  176.                 $prodOld->setStatus($em->getRepository('App\Entity\Slave\ProductStatus')->findOneBy(array('slug' => 'not_available')));
  177.                 $prodOld->setCondition($em->getRepository('App\Entity\Slave\ProductCondition')->findOneBy(array('slug' => 'broken')));
  178.             }
  179.             $prodOld->setActualWarehouse($ticket->getClient()->getWarehouse());
  180.             ProductService::createProductTransferLog($em$prodOldnull$this->getUser(), $warehouse$datetime'forced');
  181.             $prodOld->setActualWarehouse($newWarehouse);
  182.         }
  183.         if($prodNew != null && !$skip){
  184.             if($isDisi){
  185.                 $activity->setProductWithdraw($prodNew);
  186.                 $activity->setProducerWithdraw($prodNew->getCodeProducer());
  187.                 $activity->setSupplierWithdraw($prodNew->getCodeSupplier());
  188.                 $newWarehouse $warehouse;
  189.                 if($prodNew->movedByDS())
  190.                     $newWarehouse $prodNew->getActualWarehouse();
  191.                 else{
  192.                     $prodNew->setStatus($em->getRepository('App\Entity\Slave\ProductStatus')->findOneBy(array('slug' => 'not_available')));
  193.                     $prodNew->setCondition($em->getRepository('App\Entity\Slave\ProductCondition')->findOneBy(array('slug' => 'broken')));
  194.                 }
  195.                 $prodNew->setActualWarehouse($ticket->getClient()->getWarehouse());
  196.                 ProductService::createProductTransferLog($em$prodNewnull$this->getUser(), $warehouse$datetime'forced');
  197.                 $prodNew->setActualWarehouse($newWarehouse);
  198.             }
  199.             else{
  200.                 $activity->setProductInstallation($prodNew);
  201.                 $activity->setProducerInstallation($prodNew->getCodeProducer());
  202.                 $activity->setSupplierInstallation($prodNew->getCodeSupplier());
  203.                 $newWarehouse $ticket->getClient()->getWarehouse();
  204.                 if($prodNew->movedByDS())
  205.                     $newWarehouse $prodNew->getActualWarehouse();
  206.                 else{
  207.                     $prodNew->setTermid($ticket->getTermid());
  208.                     $prodNew->setStatus($em->getRepository('App\Entity\Slave\ProductStatus')->findOneBy(array('slug' => 'in_use')));
  209.                     $prodNew->setCondition($em->getRepository('App\Entity\Slave\ProductCondition')->findOneBy(array('slug' => 'free')));
  210.                 }
  211.                 $prodNew->setActualWarehouse($warehouse);
  212.                 ProductService::createProductTransferLog($em$prodNewnull$this->getUser(), $ticket->getClient()->getWarehouse(), $datetime'forced');
  213.                 $prodNew->setActualWarehouse($newWarehouse);
  214.             }
  215.         }
  216.         $em->persist($activity);
  217.     }
  218.     public function deleteTicketAndConnectedValues($em$ticket){
  219.         $termid $ticket->getTermid();
  220.         $client $ticket->getClient();
  221.         if($termid != null){
  222.             if(sizeof($termid->getTickets()) == 1){
  223.                 foreach($termid->getProducts() as $pr)
  224.                     $pr->setTermid(null);
  225.                 $em->remove($termid);
  226.             }
  227.         }
  228.         if($ticket->getClient() != null){
  229.             if(sizeof($client->getTermids()) == && sizeof($client->getTickets()) == && sizeof($client->getFiles()) == && $client->getWarehouse()->canDelete()){
  230.                 foreach($client->getPhones() as $phone)
  231.                     $em->remove($phone);
  232.                 $em->remove($client->getWarehouse());
  233.                 $em->remove($client);
  234.             }
  235.         }
  236.         foreach($ticket->getLogs() as $log){
  237.             $em->remove($log);
  238.         }
  239.         $em->remove($ticket);
  240.     }
  241.     public function deleteProductAlreadyInserted($em$product){
  242.         foreach($product->getTransferLogs() as $transferLog)
  243.             $em->remove($transferLog);
  244.         foreach($product->getLogs() as $log)
  245.             $em->remove($log);
  246.         $em->remove($product);
  247.         $em->flush();
  248.     }
  249.     // SCRIVANIA
  250.         /**
  251.          * @Route("/sblocca-materiale-mancante", name="user_ticket_unlock_waiting_material")
  252.          */
  253.         public function userTicketUnlockWaitingMaterial(Request $request)
  254.         {    
  255.             $em $this->mr->getManager('slave');
  256.             $ticket $em->getRepository('App\Entity\Slave\Ticket')->findOneById($request->request->get('ticketId'));
  257.             foreach($ticket->getSuspensions() as $s){
  258.                 if(!$s->isUnlocked())
  259.                     $suspension $s;
  260.             }
  261.             $unlockCausal "Ticket sbloccato per materiale mancante ricevuto";
  262.             $suspension->unlock($em$this->getUser(), $unlockCausal, new \DateTime());
  263.             $em->flush();
  264.             $response = array("code" => 200"success" => true);
  265.             return new Response(json_encode($response)); 
  266.         }
  267.     //
  268.     // SCARICA
  269.         /**
  270.          * @Route("/scarica-da-email", name="user_ticket_download_email")
  271.          * @Security("is_granted('edit', 'ticket')")
  272.          */
  273.         public function userTicketDownloadEmail(Request $request)
  274.         {
  275.             $emMaster $this->mr->getManager('master');
  276.             $session $request->getSession();
  277.             $company $emMaster->getRepository('App\Entity\Master\Company')->findOneById($session->get('companyId'));
  278.             $mailbox "{in.postassl.it:993/imap/ssl}INBOX";
  279.             $mailboxOther "{in.postassl.it:993/imap/ssl}INBOX.other";
  280.             $em $this->mr->getManager('slave');
  281.             foreach($company->getMailers() as $mailer){
  282.                 $count 0;
  283.                 $countTicket 0;
  284.                 $countTicketError 0;
  285.                 $inboxOther imap_open($mailboxOther$mailer->getUser(), EncryptionService::decrypt($mailer->getPassword())) or die('Impossibile connettersi alla casella email: '.imap_last_error()); // Connessione alla casella email
  286.                 imap_expunge($inboxOther); // Elimina le mail "marcate"
  287.                 imap_close($inboxOther); // Chiude la connessione
  288.                 
  289.                 $inbox imap_open($mailbox$mailer->getUser(), EncryptionService::decrypt($mailer->getPassword())) or die('Impossibile connettersi alla casella email: '.imap_last_error()); // Connessione alla casella email
  290.                 imap_expunge($inbox); // Elimina le mail "marcate"
  291.                 $emails imap_search($inbox'ALL'); // Cerca tutte le email da leggere
  292.                 $testing $this->params->get('ticket_download_testing');
  293.                 $error false;
  294.                 if($emails){
  295.                     rsort($emails); // Ordino con la più nuova in cima
  296.                     foreach($emails as $email){
  297.                         if($count 600){
  298.                             // INOLTRO A THEBURMANUTENZIONE@GMAIL.COM
  299.                             if($company->getCode() == "BBQV25"){
  300.                                 $overview imap_fetch_overview($inbox$email0);
  301.                                 $isRead = isset($overview[0]->seen) && $overview[0]->seen == 1;
  302.                                 if(!$isRead){
  303.                                     $header imap_headerinfo($inbox$email); // Gestisco l'header                            
  304.                                     // Serve per skippare le email che non hanno mittente o di spam
  305.                                     if(property_exists($header'from') && property_exists($header->from[0], 'host'))
  306.                                         $sender $header->from[0]->mailbox."@".$header->from[0]->host;
  307.                                     if($sender == "thebur.manutenzioni@gmail.com"){
  308.                                         $body imap_fetchbody($inbox$email1);
  309.                                         $subject $header->subject;
  310.                                         $to 'thebur.integrations@gmail.com';
  311.         
  312.                                         $headers "From: $sender\r\n";
  313.                                         $headers .= "Reply-To: $sender\r\n";
  314.                                         $headers .= "X-Mailer: PHP/" phpversion();
  315.         
  316.                                         mail($to$subject$body$headers);
  317.                                         imap_setflag_full($inbox$email"\\SEEN");
  318.                                     }
  319.                                 }
  320.                             }
  321.                             [$countTicket$countTicketError] = TicketService::downloadTicket($em$emMaster$this->getUser(), $inbox$email$mailer$testing$company,$countTicket$countTicketError);
  322.                         }
  323.                         else
  324.                             break;
  325.                         $count++;
  326.                     }
  327.                 }
  328.                 if(!$testing){
  329.                     imap_expunge($inbox); // Elimina le mail "marcate"
  330.                     imap_close($inbox); // Chiude la connessione
  331.                 }
  332.                 
  333.                 if($countTicketError 0)
  334.                     $noticeType "notice_warning";
  335.                 else
  336.                     $noticeType "notice_success";
  337.                 $this->addFlash($noticeType'Casella '.$mailer->getUser().':<br>E-mail processate: '.$count.'<br>Ticket scaricati: '.$countTicket.'<br>Ticket con errori: '.$countTicketError);
  338.             }
  339.             return $this->redirectToRoute("user_ticket_list");
  340.         }
  341.         
  342.         /**
  343.          * @Route("/scarica-da-email-altro", name="user_ticket_download_email_other")
  344.          * @Security("is_granted('edit', 'ticket')")
  345.          */
  346.         public function userTicketDownloadEmailOther(Request $request)
  347.         {
  348.             $session $request->getSession();
  349.             $emMaster $this->mr->getManager('master');
  350.             $company $emMaster->getRepository('App\Entity\Master\Company')->findOneById($session->get('companyId'));
  351.             $mailbox "{in.postassl.it:993/imap/ssl}INBOX.other";
  352.             $mailboxIncoming "{in.postassl.it:993/imap/ssl}INBOX";
  353.             $em $this->mr->getManager('slave');
  354.             
  355.             foreach($company->getMailers() as $mailer){
  356.                 $count 0;
  357.                 $countTicket 0;
  358.                 $countTicketError 0;
  359.                 $inboxIncoming imap_open($mailboxIncoming$mailer->getUser(), EncryptionService::decrypt($mailer->getPassword())) or die('Impossibile connettersi alla casella email: '.imap_last_error()); // Connessione alla casella email
  360.                 imap_expunge($inboxIncoming); // Elimina le mail "marcate"
  361.                 imap_close($inboxIncoming); // Chiude la connessione
  362.                 $inbox imap_open($mailbox$mailer->getUser(), EncryptionService::decrypt($mailer->getPassword())) or die('Impossibile connettersi alla casella email: '.imap_last_error()); // Connessione alla casella email
  363.                 imap_expunge($inbox); // Elimina le mail "marcate"
  364.                 $emails imap_search($inbox'UNSEEN'); // Cerca tutte le email da leggere
  365.                 $testing $this->params->get('ticket_download_testing');;
  366.                 $error false;
  367.                 if($emails){
  368.                     rsort($emails); // Ordino con la più nuova in cima
  369.                     foreach($emails as $email){
  370.                         if($count 600){
  371.                             // INOLTRO A THEBURMANUTENZIONE@GMAIL.COM
  372.                             if($company->getCode() == "BBQV25"){
  373.                                 $overview imap_fetch_overview($inbox$email0);
  374.                                 $isRead = isset($overview[0]->seen) && $overview[0]->seen == 1;
  375.                                 if(!$isRead){
  376.                                     $header imap_headerinfo($inbox$email); // Gestisco l'header                            
  377.                                     // Serve per skippare le email che non hanno mittente o di spam
  378.                                     if(property_exists($header'from') && property_exists($header->from[0], 'host'))
  379.                                         $sender $header->from[0]->mailbox."@".$header->from[0]->host;
  380.                                     if($sender == "thebur.manutenzioni@gmail.com"){
  381.                                         $body imap_fetchbody($inbox$email1);
  382.                                         $subject $header->subject;
  383.                                         $to 'thebur.integrations@gmail.com';
  384.         
  385.                                         $headers "From: $sender\r\n";
  386.                                         $headers .= "Reply-To: $sender\r\n";
  387.                                         $headers .= "X-Mailer: PHP/" phpversion();
  388.         
  389.                                         mail($to$subject$body$headers);
  390.                                         imap_setflag_full($inbox$email"\\SEEN");
  391.                                     }
  392.                                 }
  393.                             }
  394.                             [$countTicket$countTicketError] = TicketService::downloadTicket($em$emMaster$this->getUser(), $inbox$email$mailer$testing$company,$countTicket$countTicketError);
  395.                         }
  396.                         else
  397.                             break;
  398.                         $count++;
  399.                     }
  400.                 }
  401.                 if(!$testing){
  402.                     imap_expunge($inbox); // Elimina le mail "marcate"
  403.                     imap_close($inbox); // Chiude la connessione
  404.                 }
  405.                 
  406.                 if($countTicketError 0)
  407.                     $noticeType "notice_warning";
  408.                 else
  409.                     $noticeType "notice_success";
  410.                 $this->addFlash($noticeType'Casella '.$mailer->getUser().':<br>E-mail processate: '.$count.'<br>Ticket scaricati: '.$countTicket.'<br>Ticket con errori: '.$countTicketError);
  411.             }
  412.             return $this->redirectToRoute("user_ticket_list");
  413.         }
  414.     //
  415.     // IMPORTA CSV
  416.         /**
  417.          * @Route("/importa", name="user_ticket_import")
  418.          * @Security("is_granted('edit', 'ticket')")
  419.          */
  420.         public function userTicketImport(Request $requestValidatorInterface $validatorFormFactoryInterface $formFactoryFileSystem $fsMailerInterface $mailer)
  421.         {    
  422.             $em $this->mr->getManager('slave');
  423.             $emMaster $this->mr->getManager('master');
  424.             $session $request->getSession();
  425.             $company $emMaster->getRepository('App\Entity\Master\Company')->findOneById($session->get('companyId'));
  426.                         
  427.             $arraySuppliers = [];
  428.             $masterSuppliersIds = [];
  429.             $jtcss $emMaster->getRepository('App\Entity\Master\JoinTableCompanySupplier')->findByCompanyOrdered($company->getId());
  430.             foreach($jtcss as $jtcs)
  431.                 array_push($masterSuppliersIds$jtcs->getSupplier()->getId());
  432.             foreach($masterSuppliersIds as $sId){
  433.                 $supplier $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(['idSupplier' => $sId]);
  434.                 if($supplier != null){
  435.                     switch($supplier->getSlug()){
  436.                         case 'demis-adp'$arraySuppliers['DEMIS ADP'] = 'demis-adp'; break;
  437.                         case 'bcc-pos'$arraySuppliers['BCC Pos'] = 'bcc-pos'; break;
  438.                         case 'fabrick'$arraySuppliers['Fabrick'] = 'fabrick'; break;
  439.                         case 'nexi-book-meps':
  440.                         case 'nexi-book-monetica':
  441.                             $arraySuppliers['Nexi (Book MEPS o Book Monetica)'] = 'nexi';
  442.                             break;
  443.                         case 'lottomatica'$arraySuppliers['Lottomatica'] = 'lottomatica'; break;
  444.                         case 'mts&care-srl'$arraySuppliers['MTS CARE'] = 'mts&care-srl'; break;
  445.                         case 'italcard-srl'$arraySuppliers['italcard-srl'] = 'italcard-srl'; break;
  446.                         case 'nexi-book-sia'$arraySuppliers['NEXI Book SIA'] = 'nexi-book-sia'; break;
  447.                         case 'worldline-italia'$arraySuppliers['Worldline Italia'] = 'worldline-italia'; break;
  448.                         case 'csc---axerve':
  449.                         case 'csc---cglobal':
  450.                         case 'csc---cronos':
  451.                         case 'csc---cse':
  452.                         case 'csc---decathlon':
  453.                         case 'csc---euronet':
  454.                         case 'csc---lis-pay':
  455.                         case 'csc---mooney':
  456.                         case 'csc---nexi-book-meps':
  457.                         case 'csc---nexi-book-monetica':
  458.                         case 'csc---nexi-book-sia':
  459.                         case 'csc---numera':
  460.                         case 'csc---p4cards':
  461.                         case 'csc---q8':
  462.                         case 'csc---repas':
  463.                         case 'csc---stripe':
  464.                         case 'csc---worldline-italia':
  465.                         case 'csc---yamamay':
  466.                         case 'csc---ultroneo':
  467.                             $arraySuppliers['CSC'] = 'csc';
  468.                             $arraySuppliers['CSC Nuovo portale'] = 'csc-new';
  469.                             break;
  470.                         case 'sate---worldline':
  471.                         case 'sate---numera':
  472.                         case 'sate---mooney':
  473.                         case 'sate---flagpay':
  474.                         case 'sate---argentea':
  475.                         case 'sate---pluxee':
  476.                         case 'sate---qomodo':
  477.                             $arraySuppliers['SATE'] = 'sate';
  478.                             break;
  479.                         case 'csc---numia':
  480.                             $arraySuppliers['CSC Numia'] = 'csc---numia';
  481.                             break;
  482.                         default: break;
  483.                     }
  484.                 }
  485.             }
  486.             // NUOVI TICKET
  487.             $operationId null;
  488.             $importTicketNew = new ImportTicketNew();
  489.             $formTicket $formFactory->createNamed("form_import_ticket_new"ImportTicketNewType::class, $importTicketNew, array('suppliers' => $arraySuppliers));
  490.             $formTicket->handleRequest($request);
  491.             if($formTicket->isSubmitted()){
  492.                 $valid true;
  493.                 if($valid$valid ValidationService::validateNotBlank($validator$formTicket->get('supplier'));
  494.                 if($valid && ($formTicket->get('supplier')->getData() == 'nexi-book-sia')){
  495.                     if($formTicket->get('operation')->getData() != null)
  496.                         $operationId $formTicket->get('operation')->getData();
  497.                     else
  498.                         $operationId 'all';
  499.                 }
  500.                 if($valid && ($formTicket->get('supplier')->getData() == 'lottomatica' || $formTicket->get('supplier')->getData() == 'mts&care-srl')){
  501.                     $valid ValidationService::validateNotBlank($validator$formTicket->get('operation'));
  502.                     if($valid$valid ValidationService::validateNotBlank($validator$formTicket->get('date'));
  503.                     if($valid$valid ValidationService::validateNotBlank($validator$formTicket->get('time'));
  504.                     if($valid$valid ValidationService::validateFile($validator$formTicket->get('path'), true$formTicket->get('file')->getData(), '10', array('xls''xlsx'));
  505.                 }
  506.                 else if($valid && $formTicket->get('supplier')->getData() == 'italcard-srl'){
  507.                     $valid ValidationService::validateNotBlank($validator$formTicket->get('operation'));
  508.                     if($valid$valid ValidationService::validateNotBlank($validator$formTicket->get('date'));
  509.                     if($valid$valid ValidationService::validateFile($validator$formTicket->get('path'), true$formTicket->get('file')->getData(), '10', array('xls''xlsx'));
  510.                 }
  511.                 else{
  512.                     if($valid$valid ValidationService::validateNotBlank($validator$formTicket->get('separator'));
  513.                     if($valid$valid ValidationService::validateCsvDelimiter($formTicket->get('file')->getData()->getPathName(), $formTicket->get('separator')->getData(), $formTicket->get('separator'));
  514.                     if($valid$valid ValidationService::validateFile($validator$formTicket->get('path'), true$formTicket->get('file')->getData(), '10', array('csv''txt''bin'));
  515.                 }
  516.                 if($valid && $formTicket->isValid()){
  517.                     $error false;
  518.                     $row 0;
  519.                     $countInserted 0;
  520.                     switch($formTicket->get('supplier')->getData()){
  521.                         case 'bcc-pos':
  522.                         case 'csc---numia':
  523.                         case 'demis-adp':
  524.                         case 'fabrick':
  525.                         case 'lis-holding':
  526.                         case 'nexi':
  527.                         case 'nexi-book-sia':
  528.                         case 'sate':
  529.                         case 'worldline-italia':
  530.                             [$error$row$countInserted] = TicketService::importFile($em$emMaster$this->getUser(), $formTicket$company$operationId$row$mailer);
  531.                             break;
  532.                         case 'csc'// CSC
  533.                             [$error$row$countInserted] = TicketService::importFileCSC($em$emMaster$this->getUser(), $formTicket$error$row$countInserted$mailer);
  534.                             break;
  535.                         case 'csc-new'// CSC NEW
  536.                             [$error$row$countInserted] = TicketService::importFileCSCNew($em$emMaster$this->getUser(), $formTicket$error$row$countInserted$mailer);
  537.                             break;
  538.                         case 'lottomatica'// LOTTOMATICA
  539.                         case 'mts&care-srl'// MTS&CARE SRL
  540.                             [$error$row$countInserted] = TicketService::importFileLottomaticaOrMtsCare($em$emMaster$this->getUser(), $formTicket$error$row$countInserted$mailer);
  541.                             break;
  542.                         case 'italcard-srl'// ITALCARD
  543.                             [$error$row$countInserted] = TicketService::importFileItalcard($em$emMaster$this->getUser(), $formTicket$error$row$countInserted$mailer);
  544.                             break;
  545.                         default: break;
  546.                     }
  547.                     if($error)
  548.                         $this->addFlash('notice_warning''Un totale di '.$countInserted.' su '.($row 1).' ticket è stato scaricato dal file, alcuni presentano degli errori!');
  549.                     else
  550.                         $this->addFlash('notice_success''Un totale di '.$countInserted.' su '.($row 1).' ticket è stato scaricato dal file senza errori!');
  551.                     return $this->redirectToRoute('user_ticket_list');
  552.                 }
  553.             }
  554.             // INTERVENTI
  555.             $importTicketIntervention = new ImportTicketIntervention();
  556.             $formIntervention $formFactory->createNamed("form_import_ticket_intervention"ImportTicketInterventionType::class, $importTicketIntervention);
  557.             $formIntervention->handleRequest($request);
  558.             if($formIntervention->isSubmitted()){
  559.                 
  560.                 $valid true;
  561.                 if($valid$valid ValidationService::validateNotBlank($validator$formIntervention->get('separator'));
  562.                 if($valid$valid ValidationService::validateCsvDelimiter($formIntervention->get('file')->getData()->getPathName(), $formIntervention->get('separator')->getData(), $formIntervention->get('separator'));
  563.                 if($valid$valid ValidationService::validateFile($validator$formIntervention->get('path'), true$formIntervention->get('file')->getData(), '10', array('csv''txt'));
  564.                 $row 0;
  565.                 if($valid && ($handle fopen($formIntervention->get('file')->getData(), "r")) !== FALSE) {
  566.                     while(($data fgetcsv($handle2000$formIntervention->get('separator')->getData())) !== FALSE) {
  567.                         // Salta righe vuote
  568.                         if(empty(array_filter($data))) {$row++; continue; }
  569.                         $data array_map("utf8_encode"$data);
  570.                         if($row 0){
  571.                             $ticket null;
  572.                             $nTicket null;
  573.                             $termid null;
  574.                             switch($formIntervention->get('supplier')->getData()){
  575.                                 case 'fabrick-flex':
  576.                                     $ticket $em->getRepository('App\Entity\Slave\Ticket')->findOneByLikeNumberAndTermid($data[1], $data[2]);
  577.                                     if($ticket == null){
  578.                                         $valid false;
  579.                                         $formIntervention->get("path")->addError(new FormError("Ticket non trovato"));
  580.                                         $this->addFlash('notice_danger''Il ticket presente alla riga '.($row 1).' con n° '.$data[1].' e termid '.$data[2].' non è stato trovato! Ricontrolla il file!');
  581.                                         break;
  582.                                     }
  583.                                     if($valid){
  584.                                         $prodPos $this->importInterventionSearchProduct($em$data[9], $ticket->getSupplier());
  585.                                         if($prodPos == null){
  586.                                             $valid false;
  587.                                             $formIntervention->get("path")->addError(new FormError("Matricola non presente"));
  588.                                             $this->addFlash('notice_danger''Non è stato trovato il prodotto presente alla riga '.($row 1).' con matricola '.$data[9].' ! Ricontrolla il file!');
  589.                                             break;
  590.                                         }
  591.                                     }
  592.                                     if($valid){
  593.                                         $prodSim $this->importInterventionSearchProduct($em$data[10], $ticket->getSupplier());
  594.                                         if($prodSim == null){
  595.                                             $valid false;
  596.                                             $formIntervention->get("path")->addError(new FormError("Matricola non presente"));
  597.                                             $this->addFlash('notice_danger''Non è stato trovato il prodotto presente alla riga '.($row 1).' con matricola '.$data[10].'! Ricontrolla il file!');
  598.                                             break;
  599.                                         }
  600.                                     }
  601.                                     break;
  602.                                 default: break;
  603.                             }
  604.                         }
  605.                         $row++;
  606.                     }
  607.                     fclose($handle);
  608.                 }
  609.                 
  610.                 if($valid && $formIntervention->isValid()){
  611.                     $actualNumber 0;
  612.                     $actualTermid 0;
  613.                     $ignored false;
  614.                     $continueIntervention false;
  615.                     $row 0;
  616.                     $ticketStatusClosed $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'closed'));
  617.                     $countClosed 0;
  618.                     $countIgnored 0;
  619.                     if(($handle fopen($formIntervention->get('file')->getData(), "r")) !== FALSE) {
  620.                         while(($data fgetcsv($handle2000$formIntervention->get('separator')->getData())) !== FALSE) {
  621.                             $data array_map("utf8_encode"$data);
  622.                             if($row 0){
  623.                                 switch($formIntervention->get('supplier')->getData()){
  624.                                     case 'fabrick-flex'// FABRICK FLEX
  625.                                         $ticket $em->getRepository('App\Entity\Slave\Ticket')->findOneByLikeNumberAndTermid($data[1], $data[2]);
  626.                                         if($ticket != null && ($ticket->getStatus()->getSlug() == "to_assign" || $ticket->getStatus()->getSlug() == "closed" || $ticket->getStatus()->getSlug() == "closed_portal" || $ticket->getStatus()->getSlug() == "wrong" || $ticket->getStatus()->getSlug() == "canceled"))
  627.                                             $countIgnored++;
  628.                                         if($ticket != null && $ticket->getStatus()->getSlug() != "to_assign" && $ticket->getStatus()->getSlug() != "closed" && $ticket->getStatus()->getSlug() != "closed_portal" && $ticket->getStatus()->getSlug() != "wrong" && $ticket->getStatus()->getSlug() != "canceled"){
  629.                                             $warehouse $ticket->getTechnician()->mainWarehouse();
  630.                                             
  631.                                             // Inserisco intervento
  632.                                             $datetime date_create_from_format('m/d/Y'$data[12]);
  633.                                             $intervention $this->importInterventionCreate($em$ticket$warehouse$datetime);
  634.                                             // Cerco o creo i prodotti del ticket
  635.                                             $pPos $this->importInterventionSearchProduct($em$data[9], $ticket->getSupplier());
  636.                                             $pSim $this->importInterventionSearchProduct($em$data[10], $ticket->getSupplier());
  637.                                             // Inserisco le attività
  638.                                             $activityTypePos $em->getRepository('App\Entity\Slave\InterventionActivityType')->findOneBy(array('slug' => 'installato-pos-fabrick-flex'));
  639.                                             $activityTypeSim $em->getRepository('App\Entity\Slave\InterventionActivityType')->findOneBy(array('slug' => 'installato-accessorio-fabrick-flex'));
  640.                                             $this->importInterventionActivity($em$ticket$intervention$activityTypePosfalsenull$pPos$warehouse$datetime);
  641.                                             $this->importInterventionActivity($em$ticket$intervention$activityTypeSimfalsenull$pSim$warehouse$datetime);
  642.                                             TicketService::createTicketLog($em$this->getUser(), $ticket"cs"$ticket->getStatus(), $ticketStatusClosed->getValue());
  643.                                             $ticket->setStatus($ticketStatusClosed);
  644.                                             $ticket->setWaybill($data[11]);
  645.                                             $ticket->setDatetimeEnd(new \Datetime());
  646.                                             $em->flush();
  647.                                             $countClosed++;
  648.                                         }
  649.                                         break;
  650.                                     default: break;
  651.                                 }
  652.                             }
  653.                             $row++;
  654.                         }
  655.                         fclose($handle);
  656.                     }
  657.                     $em->flush();
  658.                     $this->addFlash('notice_success''Sono stati inseriti '.$countClosed.' interventi e sono stati ignorati '.$countIgnored.' interventi perché sono cancellati/errati/chiusi!');
  659.                     return $this->redirectToRoute('user_ticket_list');
  660.                 }
  661.             }
  662.             // CHIUSURE PORTALE
  663.             $statusClosedPortal $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'closed_portal'));
  664.             $ticketClosures = new ImportTicketClosures();
  665.             $formClosures $formFactory->createNamed("form_import_ticket_closures"ImportTicketClosuresType::class, $ticketClosures);
  666.             $formClosures->handleRequest($request);
  667.             if($formClosures->isSubmitted()){
  668.                 
  669.                 $valid true;
  670.                 if($valid$valid ValidationService::validateNotBlank($validator$formClosures->get('separator'));
  671.                 if($valid$valid ValidationService::validateCsvDelimiter($formClosures->get('file')->getData()->getPathName(), $formClosures->get('separator')->getData(), $formClosures->get('separator'));
  672.                 if($valid$valid ValidationService::validateFile($validator$formClosures->get('path'), true$formClosures->get('file')->getData(), '10', array('csv''txt'));
  673.                 if($valid$valid $this->importCheckFile($em$validator$formClosures);
  674.                 if($valid && $formClosures->isValid()){
  675.                     $row 0;
  676.                     $counterNotUpdated 0;
  677.                     $counterClosed 0;
  678.                     $counterAlreadyClosed 0;
  679.                     if(($handle fopen($formClosures->get('file')->getData(), "r")) !== FALSE) {
  680.                         while(($data fgetcsv($handle2000$formClosures->get('separator')->getData())) !== FALSE) {
  681.                             $data array_map("utf8_encode"$data);
  682.                             if($row 0){
  683.                                 $ticket $em->getRepository('App\Entity\Slave\Ticket')->findOneByNumberAndTermid($data[0], $data[1]);
  684.                                 if($ticket != null){
  685.                                     $ticket->setClosedOnPortal(true);
  686.                                     switch($ticket->getStatus()->getSlug()){
  687.                                         case 'closed'
  688.                                             TicketService::createTicketLog($em$this->getUser(), $ticket"cs"$ticket->getStatus(), $statusClosedPortal->getValue());
  689.                                             $ticket->setStatus($statusClosedPortal); 
  690.                                             $counterClosed++; 
  691.                                             break;
  692.                                         case 'closed_portal'$counterAlreadyClosed++; break;
  693.                                         default: $counterNotUpdated++; break;
  694.                                     }
  695.                                 }
  696.                             }
  697.                             $row++;
  698.                         }
  699.                         fclose($handle);
  700.                     }
  701.                     $em->flush();
  702.                     $this->addFlash('notice_success''Ticket chiusi: '.$counterClosed.'<br>Ticket già chiusi: '.$counterAlreadyClosed.'<br>Ticket stato non aggiornato: '.$counterNotUpdated);
  703.                     return $this->redirectToRoute('user_ticket_list');
  704.                 }
  705.             }
  706.             // ANNULLA TICKET
  707.             $statusCanceled $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'canceled'));
  708.             $ticketCancels = new ImportTicketCancels();
  709.             $formCancels $formFactory->createNamed("form_import_ticket_cancels"ImportTicketCancelsType::class, $ticketCancels);
  710.             $formCancels->handleRequest($request);
  711.             if($formCancels->isSubmitted()){
  712.                 
  713.                 $valid true;
  714.                 if($valid$valid ValidationService::validateNotBlank($validator$formCancels->get('separator'));
  715.                 if($valid$valid ValidationService::validateCsvDelimiter($formCancels->get('file')->getData()->getPathName(), $formCancels->get('separator')->getData(), $formCancels->get('separator'));
  716.                 if($valid$valid ValidationService::validateFile($validator$formCancels->get('path'), true$formCancels->get('file')->getData(), '10', array('csv''txt'));
  717.                 if($valid$valid $this->importCheckFile($em$validator$formCancels);
  718.                 if($valid && $formCancels->isValid()){
  719.                     $row 0;
  720.                     if(($handle fopen($formCancels->get('file')->getData(), "r")) !== FALSE) {
  721.                         while(($data fgetcsv($handle2000$formCancels->get('separator')->getData())) !== FALSE) {
  722.                             $data array_map("utf8_encode"$data);
  723.                             if($row 0){
  724.                                 $ticket $em->getRepository('App\Entity\Slave\Ticket')->findOneByNumberAndTermid($data[0], $data[1]);
  725.                                 if($ticket != null){
  726.                                     TicketService::createTicketLog($em$this->getUser(), $ticket"cs"$ticket->getStatus(), $statusCanceled->getValue());
  727.                                     $ticket->setStatus($statusCanceled);
  728.                                 }
  729.                             }
  730.                             $row++;
  731.                         }
  732.                         fclose($handle);
  733.                     }
  734.                     $em->flush();
  735.                     $this->addFlash('notice_success''Ticket annullati!');
  736.                     return $this->redirectToRoute('user_ticket_list');
  737.                 }
  738.             }
  739.             // SOSPENDI TICKET
  740.             $statusSuspended $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'suspended'));
  741.             $interventionOutcomeTypeSuspended $em->getRepository('App\Entity\Slave\InterventionOutcomeType')->findOneBy(array('slug' => 'suspended'));
  742.             $ticketsSuspend = new ImportTicketsSuspend();
  743.             $formSuspend $formFactory->createNamed("form_import_tickets_suspend"ImportTicketsSuspendType::class, $ticketsSuspend, array('typeSlug' => 'suspended'));
  744.             $formSuspend->handleRequest($request);
  745.             if($formSuspend->isSubmitted()){
  746.                 
  747.                 $today = new \Datetime();
  748.                 $valid true;
  749.                 [$valid$interventionOutcome] = FormValidatorService::validateIntervention($em$validator$formSuspend'suspended');
  750.                 if($valid$valid $this->importCheckFile($em$validator$formSuspend);
  751.                 
  752.                 if($valid && $formSuspend->isValid()){
  753.                     $row 0;
  754.                     if(($handle fopen($formSuspend->get('file')->getData(), "r")) !== FALSE) {
  755.                         while(($data fgetcsv($handle2000$formSuspend->get('separator')->getData())) !== FALSE) {
  756.                             $data array_map("utf8_encode"$data);
  757.                             if($row 0){
  758.                                 $ticket $em->getRepository('App\Entity\Slave\Ticket')->findOneByNumberAndTermid($data[0], $data[1]);
  759.                                 if($ticket != null){
  760.                                     $suspensionDatetimeFrom date_create_from_format("d-m-Y H:i"$formSuspend->get('dateFrom')->getData()->format('d-m-Y').' '.$formSuspend->get('timeFromHour')->getData().':'.$formSuspend->get('timeFromMinute')->getData());
  761.                                     $intervention = new Intervention();
  762.                                     $intervention->setTicket($ticket);
  763.                                     $intervention->setDatetime($suspensionDatetimeFrom);
  764.                                     $intervention->setOutcomeType($interventionOutcomeTypeSuspended);
  765.                                     $intervention->setOutcome($interventionOutcome);
  766.                                     $intervention->setDatetimeBilling(date_create_from_format('d-m-Y H:i:s''01-'.$today->format('m').'-'.$today->format('Y').' 00:00:00'));
  767.                                     $intervention->setBillable(false);
  768.                                     $intervention->setMotivation($formSuspend->get("motivation")->getData());
  769.                                     $intervention->setOperator($this->getUser());
  770.                                     if($interventionOutcome->isReferentRequired()) $intervention->setReferent($formSuspend->get("referent")->getData());
  771.                                     if($interventionOutcome->isPhoneRequired()) $intervention->setPhone($formSuspend->get("phone")->getData());
  772.                                     if($interventionOutcome->isPhotoRequired()) {
  773.                                         $uploadDir $this->params->get('kernel.project_dir').'/'.$this->params->get('web_path').'/companies/'.$company->getDirectoryPath().'/tickets/'.$ticket->getDirectoryPath().'/';
  774.                                         MediaService::uploadImage($fs$formSuspend->get('file')->getData(), null$uploadDir$intervention'photo'1001000200true);
  775.                                     }
  776.                                     $em->persist($intervention);
  777.                     
  778.                                     $ticketSuspension = new TicketSuspension();
  779.                                     $ticketSuspension->setTicket($ticket);
  780.                                     $ticketSuspension->setIntervention($intervention);
  781.                                     $ticketSuspension->setDatetimeFrom($suspensionDatetimeFrom);
  782.                                     if($formSuspend->get('dateTo')->getData() != null && $formSuspend->get('timeToHour')->getData() != null && $formSuspend->get('timeToMinute')->getData() != null){
  783.                                         $ticketSuspension->setDatetimeTo(date_create_from_format("d-m-Y H:i"$formSuspend->get('dateTo')->getData()->format('d-m-Y').' '.$formSuspend->get('timeToHour')->getData().':'.$formSuspend->get('timeToMinute')->getData()));
  784.                                     }
  785.                                     $ticketSuspension->setApproved(true);
  786.                                     $ticketSuspension->setManaged(true);
  787.                                     $ticketSuspension->setRefuseMotivation(null);
  788.                                     $em->persist($ticketSuspension);
  789.                     
  790.                                     $settingUnlockSameTech $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_suspension_unlock_same_technician'));
  791.                                     if($settingUnlockSameTech->getValue() != 1){
  792.                                         TicketService::createTicketLog($em$this->getUser(), $ticket"ct"$ticket->getTechnician(), null);
  793.                                         $ticket->setTechnician(null);
  794.                                     }
  795.                                     TicketService::createTicketLog($em$this->getUser(), $ticket"cs"$ticket->getStatus(), $statusSuspended->getValue());
  796.                                     $ticket->setStatus($statusSuspended);
  797.                                     $em->flush();
  798.                                 }
  799.                             }
  800.                             $row++;
  801.                         }
  802.                         fclose($handle);
  803.                     }
  804.                     $em->flush();
  805.                     $this->addFlash('notice_success''Ticket sospesi!');
  806.                     return $this->redirectToRoute('user_ticket_list');
  807.                 }
  808.             }
  809.             // SBLOCCA SOSPENSIONE TICKET
  810.             $ticketsSusUnlock = new ImportTicketsSusUnlock();
  811.             $formSusUnlock $formFactory->createNamed("form_import_tickets_sus_unlock"ImportTicketsSusUnlockType::class, $ticketsSusUnlock);
  812.             $formSusUnlock->handleRequest($request);
  813.             if($formSusUnlock->isSubmitted()){
  814.                 
  815.                 $valid true;
  816.                 if($valid$valid ValidationService::validateNotBlank($validator$formSusUnlock->get('unlockCausal'));
  817.                 if($valid$valid ValidationService::validateNotBlank($validator$formSusUnlock->get('date'));
  818.                 if($valid$valid ValidationService::validateNotBlank($validator$formSusUnlock->get('hour'));
  819.                 if($valid$valid ValidationService::validateNotBlank($validator$formSusUnlock->get('minute'));
  820.                 if($valid$valid $this->importCheckFile($em$validator$formSusUnlock);
  821.                 if($valid && $formSusUnlock->isValid()){
  822.                     $row 0;
  823.                     if(($handle fopen($formSusUnlock->get('file')->getData(), "r")) !== FALSE) {
  824.                         while(($data fgetcsv($handle2000$formSusUnlock->get('separator')->getData())) !== FALSE) {
  825.                             $data array_map("utf8_encode"$data);
  826.                             if($row 0){
  827.                                 $ticket $em->getRepository('App\Entity\Slave\Ticket')->findOneByNumberAndTermid($data[0], $data[1]);
  828.                                 if($ticket != null){
  829.                                     $datetimeTo date_create_from_format('d-m-Y H:i'$formSusUnlock->get('date')->getData()->format('d-m-Y').' '.$formSusUnlock->get('hour')->getData().':'.$formSusUnlock->get('minute')->getData());
  830.                                     $unlockCausal $formSusUnlock->get('unlockCausal')->getData();
  831.                                     $ticketSuspension $ticket->getActualSuspension();
  832.                                     $ticketSuspension->unlock($em$this->getUser(), $unlockCausal$datetimeTo);
  833.                                 }
  834.                             }
  835.                             $row++;
  836.                         }
  837.                         fclose($handle);
  838.                     }
  839.                     $em->flush();
  840.                     $this->addFlash('notice_success''Sospensioni sbloccate!');
  841.                     return $this->redirectToRoute('user_ticket_list');
  842.                 }
  843.             }
  844.             return $this->render('role/user/ticket/import.html.twig', array(
  845.                 'formTicket' => $formTicket->createView(),
  846.                 'formIntervention' => $formIntervention->createView(),
  847.                 'formClosures' => $formClosures->createView(),
  848.                 'formCancels' => $formCancels->createView(),
  849.                 'formSuspend' => $formSuspend->createView(),
  850.                 'formSusUnlock' => $formSusUnlock->createView()
  851.             ));
  852.         }
  853.     //
  854.     /**
  855.      * @Route("/", name="user_tickets")
  856.      * @Security("is_granted('view', 'ticket')")
  857.      */
  858.     public function userTickets(Request $request)
  859.     {    
  860.         return $this->render('role/user/ticket/index.html.twig');
  861.     }
  862.     /**
  863.      * @Route("/ricerca", name="user_ticket_search")
  864.      * @Security("is_granted('view', 'ticket')")
  865.      */
  866.     public function userTicketSearch(Request $requestPaginatorInterface $paginator)
  867.     {    
  868.         $em $this->mr->getManager('slave');
  869.         $tags $em->getRepository("App\Entity\Slave\TicketTag")->findAllOrdered();
  870.         $suppliers $em->getRepository("App\Entity\Slave\Supplier")->findAllActiveOrdered();
  871.         $operationGroups $em->getRepository("App\Entity\Slave\OperationGroup")->findAllOrdered();
  872.         $ticketStatuses $em->getRepository('App\Entity\Slave\TicketStatus')->findAll();
  873.         $settingProcessedActive $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_processed_active'));
  874.         if($this->getUser()->getAccountTypology() == 'technician'){
  875.             $filters FilterService::ticket3Filter($request);
  876.             $ticketsQuery $em->getRepository("App\Entity\Slave\Ticket")->findByTechnicianFiltered(true$filters$this->getUser()->getId());
  877.             $tickets $paginator->paginate($ticketsQuery$request->getSession()->get($request->get("_route")."_page"), 100);
  878.         }
  879.         else{
  880.             $filters FilterService::ticket2Filter($request);
  881.             $ticketsQuery $em->getRepository("App\Entity\Slave\Ticket")->findFiltered(true$filters);
  882.             $tickets $paginator->paginate($ticketsQuery$request->getSession()->get($request->get("_route")."_page"), 100);
  883.         }
  884.         
  885.         return $this->render('role/user/ticket/search.html.twig', array(
  886.             'tickets' => $tickets,
  887.             'tags' => $tags,
  888.             'suppliers' => $suppliers,
  889.             'operations' => $operationGroups,
  890.             'filters' => $filters,
  891.             'settingProcessedActive' => $settingProcessedActive->getValue(),
  892.             'ticketStatuses' => $ticketStatuses
  893.         ));
  894.     }
  895.     
  896.     /**
  897.      * @Route("/ricerca/esporta-csv", name="user_ticket_search_filter_export")
  898.      * @Security("is_granted('view', 'ticket')")
  899.      */
  900.     public function userTicketSearchFilterExport(Request $request)
  901.     {    
  902.         $em $this->mr->getManager('slave');
  903.         $emMaster $this->mr->getManager('master');
  904.         $session $request->getSession();
  905.         $filters $session->get('user_ticket_search_filters');
  906.         if($this->getUser()->getAccountTypology() == 'technician')
  907.             $tickets $em->getRepository("App\Entity\Slave\Ticket")->findByTechnicianFiltered(false$filters$this->getUser()->getId());
  908.         else
  909.             $tickets $em->getRepository("App\Entity\Slave\Ticket")->findFiltered(false$filters);
  910.         $response = new StreamedResponse();
  911.         $response->setCallback(function() use($emMaster$tickets) {
  912.             $handle fopen('php://output''w+');
  913.             fputcsv($handle, array('Stato','Numero','Termid','Tag','Cliente','Operazione','Fornitore','Tariffa','Provincia','Città','Indirizzo','Tecnico','Data/Ora ricezione','Data/Ora chiusura','Data/Ora scadenza','Fatturabile','Lettera di vettura'), ";"'"'"\\");
  914.             foreach($tickets as $t){
  915.                 $status null;
  916.                 $number null;
  917.                 $termid null;
  918.                 $tags null;
  919.                 $client null;
  920.                 $operation null;
  921.                 $supplier null;
  922.                 $tariff null;
  923.                 $province null;
  924.                 $city null;
  925.                 $address null;
  926.                 $technician null;
  927.                 $datetimeStart null;
  928.                 $datetimeEnd null;
  929.                 $datetimeExpiration null;
  930.                 $billable 'No';
  931.                 $waybill null;
  932.                 
  933.                 if($t->getStatus() != null$status $t->getStatus()->getValue();
  934.                 if($t->getNumber() != null$number $t->getNumber();
  935.                 if($t->getTermid() != null$termid $t->getTermid()->getCode();
  936.                 if(count($t->getTicketTags()) > 0$tags $t->displayTags('string');
  937.                 if($t->getClient() != null$client $t->getClient()->__toString();
  938.                 if($t->getOperation() != null$operation $t->getOperation()->__toString();
  939.                 if($t->getOperationTariffAmount() != null$tariff $t->getOperationTariffAmount()->getValue();
  940.                 if($t->getSupplier() != null$supplier $t->getSupplier()->__toString();
  941.                 if($t->getIdProvince() != null) { $provinceObj $emMaster->getRepository("App\Entity\Master\Province")->find($t->getIdProvince()); if($provinceObj$province $provinceObj->getSign(); }
  942.                 if($t->getIdCity() != null) { $cityObj $emMaster->getRepository("App\Entity\Master\City")->find($t->getIdCity()); if($cityObj$city $cityObj->getName(); }
  943.                 if($t->getAddress() != null$address $t->getAddress();
  944.                 if($t->getTechnician() != null$technician $t->getTechnician()->__toString();
  945.                 if($t->getDatetimeStart() != null$datetimeStart $t->getDatetimeStart()->format('d-m-Y H:i');
  946.                 if($t->getDatetimeEnd() != null$datetimeEnd $t->getDatetimeEnd()->format('d-m-Y H:i');
  947.                 if($t->getDatetimeExpiration() != null$datetimeExpiration $t->getDatetimeExpiration()->format('d-m-Y H:i');
  948.                 if($t->isBillable()) $billable 'Sì';
  949.                 if($t->getWaybill() != null$waybill $t->getWaybill();
  950.                 
  951.                 fputcsv($handle, array($status$number$termid$tags$client$operation$supplier$tariff$province$city$address$technician$datetimeStart$datetimeEnd$datetimeExpiration$billable$waybill), ";"'"'"\\");
  952.             }
  953.             fclose($handle);
  954.         });    
  955.         $response->setStatusCode(200);
  956.         $dispositionHeader $response->headers->makeDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT'Ticket filtrati.csv');
  957.         $response->headers->set('Content-Type''text/csv; charset=UTF-8');
  958.         $response->headers->set('Content-Disposition'$dispositionHeader);
  959.         return $response;
  960.     }
  961.     /**
  962.      * @Route("/lista-tab", name="user_ticket_list_tab")
  963.      * @Security("is_granted('view', 'ticket')")
  964.      */
  965.     public function userTicketListTab(Request $request)
  966.     {    
  967.         $request->getSession()->set('user_ticket_list_tab'$request->request->get('ticketTabOpen'));
  968.         $request->getSession()->set('tab_operation_group'$request->request->get('ticketOperationGroup'));
  969.         $request->getSession()->set('tab_technician'$request->request->get('ticketTechnician'));
  970.         return $this->redirectToRoute('user_ticket_list');
  971.     }
  972.     
  973.     /**
  974.      * @Route("/lista", name="user_ticket_list")
  975.      * @Security("is_granted('view', 'ticket')")
  976.      */
  977.     public function userTicketList(Request $requestPaginatorInterface $paginatorValidatorInterface $validatorFormFactoryInterface $formFactoryFileSystem $fsMailerInterface $mailer)
  978.     {    
  979.         $em $this->mr->getManager('slave');
  980.         $emMaster $this->mr->getManager('master');
  981.         $session $request->getSession();
  982.         $cities $emMaster->getRepository("App\Entity\Master\City")->findByName('');
  983.         $settingBackOffice $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_backoffice_manage'));
  984.         $settingProcessedActive $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_processed_active'));
  985.         $settingTechnicianSendAssignEmail $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_technician_send_assign_email'));
  986.         $tags $em->getRepository("App\Entity\Slave\TicketTag")->findAllOrdered();
  987.         $suppliers $em->getRepository("App\Entity\Slave\Supplier")->findAllActiveOrdered();
  988.         $operationGroups $em->getRepository("App\Entity\Slave\OperationGroup")->findAllOrdered();
  989.         if($this->getUser()->getAccountTypology() == 'agency' || $this->getUser()->getAccountTypology() == 'warehouse'){
  990.             # Agenzia
  991.             $filters FilterService::ticketFilter($request);
  992.             if($session->get('tab_operation_group') != null){
  993.                 $filters['operation'] = $session->get('tab_operation_group');
  994.             }
  995.             if($session->get('tab_technician') != null){
  996.                 $filters['technician'] = $session->get('tab_technician');
  997.             }
  998.             
  999.             $errorTicketsQuery $em->getRepository("App\Entity\Slave\Ticket")->findTicketsErrorFiltered(true$filters);
  1000.             $errorTickets $paginator->paginate($errorTicketsQuery$request->getSession()->get($request->get("_route")."_page"), 100);
  1001.             $toAssignTicketsQuery $em->getRepository("App\Entity\Slave\Ticket")->findTicketsByStatusFiltered(true'to_assign'$filters);
  1002.             $toAssignTickets $paginator->paginate($toAssignTicketsQuery$request->getSession()->get($request->get("_route")."_page"), 100);
  1003.             
  1004.             $assignedTicketsQuery $em->getRepository("App\Entity\Slave\Ticket")->findTicketsByStatusFiltered(true'assigned'$filters);
  1005.             $assignedTickets $paginator->paginate($assignedTicketsQuery$request->getSession()->get($request->get("_route")."_page"), 100);
  1006.             
  1007.             $takenChargeTicketsQuery $em->getRepository("App\Entity\Slave\Ticket")->findTicketsByStatusFiltered(true'taken_charge'$filters);
  1008.             $takenChargeTickets $paginator->paginate($takenChargeTicketsQuery$request->getSession()->get($request->get("_route")."_page"), 100);
  1009.             
  1010.             $suspensionRequestTicketsQuery $em->getRepository("App\Entity\Slave\Ticket")->findTicketsByStatusFiltered(true'suspension_request'$filters);
  1011.             $suspensionRequestTickets $paginator->paginate($suspensionRequestTicketsQuery$request->getSession()->get($request->get("_route")."_page"), 100);
  1012.             $suspendedTicketsQuery $em->getRepository("App\Entity\Slave\Ticket")->findTicketsByStatusFiltered(true'suspended'$filters);
  1013.             $suspendedTickets $paginator->paginate($suspendedTicketsQuery$request->getSession()->get($request->get("_route")."_page"), 100);
  1014.             
  1015.             $closedTicketsQuery $em->getRepository("App\Entity\Slave\Ticket")->findTicketsByStatusFiltered(true'closed'$filters);
  1016.             $closedTickets $paginator->paginate($closedTicketsQuery$request->getSession()->get($request->get("_route")."_page"), 100);
  1017.             
  1018.             $closedPortalTicketsQuery $em->getRepository("App\Entity\Slave\Ticket")->findTicketsByStatusFiltered(true'closed_portal'$filters);
  1019.             $closedPortalTickets $paginator->paginate($closedPortalTicketsQuery$request->getSession()->get($request->get("_route")."_page"), 100);
  1020.             
  1021.             $canceledTicketsQuery $em->getRepository("App\Entity\Slave\Ticket")->findTicketsByStatusFiltered(true'canceled'$filters);
  1022.             $canceledTickets $paginator->paginate($canceledTicketsQuery$request->getSession()->get($request->get("_route")."_page"), 100);
  1023.             
  1024.             $wrongTicketsQuery $em->getRepository("App\Entity\Slave\Ticket")->findTicketsByStatusFiltered(true'wrong'$filters);
  1025.             $wrongTickets $paginator->paginate($wrongTicketsQuery$request->getSession()->get($request->get("_route")."_page"), 100);
  1026.             // Assegna ticket
  1027.             $ticketsError "Ticket assegnati! Ticket non spostati perché hanno un intervento in corso: ";
  1028.             $error false;
  1029.             $first true;
  1030.             $assignTechnician = new AssignTechnician();
  1031.             $formAssignTechnician $formFactory->createNamed("form_assign_technician"AssignTechnicianType::class, $assignTechnician);
  1032.             $formAssignTechnician->handleRequest($request);
  1033.             if($formAssignTechnician->isSubmitted()){
  1034.                 
  1035.                 $valid ValidationService::validateNotBlank($validator$formAssignTechnician->get("technician"));
  1036.                 if($valid && $formAssignTechnician->isValid()){
  1037.                     $statusAssigned $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'assigned'));
  1038.                     $ids $request->request->get('ids');
  1039.                     $ticketIds explode(','$ids);
  1040.                     $tickets = [];
  1041.                     foreach($ticketIds as $ticketId){
  1042.                         $ticket $em->getRepository('App\Entity\Slave\Ticket')->findOneById($ticketId);
  1043.                         $interventionId null;
  1044.                         foreach($ticket->getInterventions() as $int){
  1045.                             if($int->getOutcome() == null){
  1046.                                 $interventionId $int->getId();
  1047.                                 break;
  1048.                             }
  1049.                         }
  1050.                         if($interventionId == null){
  1051.                             TicketService::createTicketLog($em$this->getUser(), $ticket"ct"$ticket->getTechnician(), $formAssignTechnician->get("technician")->getData());
  1052.                             $ticket->setTechnician($formAssignTechnician->get("technician")->getData());
  1053.                             TicketService::createTicketLog($em$this->getUser(), $ticket"cs"$ticket->getStatus(), $statusAssigned->getValue());
  1054.                             $ticket->setStatus($statusAssigned);
  1055.                             array_push($tickets$ticket);
  1056.                         }
  1057.                         else{
  1058.                             $error true;
  1059.                             if($first$first false; else $ticketsError .= ', ';
  1060.                             $ticketsError .= $ticket->getNumber();
  1061.                         }
  1062.                     }
  1063.                     $em->flush();
  1064.                     // Invio messaggio di notifica al tecnico
  1065.                     if($settingTechnicianSendAssignEmail->getValue() == && sizeof($tickets) > && $ticket->getTechnician()->isAssignEmailActive()){
  1066.                         $message = (new TemplatedEmail())
  1067.                             ->subject($this->params->get('subject_ticket_take_charge'))
  1068.                             ->from($this->params->get('email_noreply'))
  1069.                             ->to($ticket->getTechnician()->getEmail())
  1070.                             ->htmlTemplate('email/technician/tickets_assigned.html.twig')
  1071.                             ->context(['user' => $ticket->getTechnician(), 'tickets' => $tickets]);
  1072.                         $mailer->send($message);
  1073.                     }
  1074.                     if(!$error)
  1075.                         $this->addFlash('notice_success'"Tecnico assegnato ai ticket!");
  1076.                     else
  1077.                         $this->addFlash('notice_success'$ticketsError);
  1078.                     return $this->redirectToRoute('user_ticket_list');
  1079.                 }
  1080.             }
  1081.             
  1082.             // Sospendi ticket
  1083.             $intervention = new Intervention();
  1084.             $formSuspension $formFactory->createNamed("form_suspension"InterventionType::class, $intervention, array('typeSlug' => 'suspended'));
  1085.             $formSuspension->handleRequest($request);
  1086.     
  1087.             if($formSuspension->isSubmitted()){
  1088.     
  1089.                 $ids $request->request->get('ids');
  1090.                 [$valid$interventionOutcome] = FormValidatorService::validateIntervention($em$validator$formSuspension'suspended');
  1091.     
  1092.                 if($valid && $formSuspension->isValid()){
  1093.                     $tickets = [];
  1094.                     $ticketIds explode(','$ids);
  1095.                     $today = new \Datetime();
  1096.                     foreach($ticketIds as $ticketId){
  1097.                         $ticket $em->getRepository('App\Entity\Slave\Ticket')->findOneById($ticketId);
  1098.                         $suspensionDatetimeFrom date_create_from_format("d-m-Y H:i"$formSuspension->get('dateFrom')->getData()->format('d-m-Y').' '.$formSuspension->get('timeFromHour')->getData().':'.$formSuspension->get('timeFromMinute')->getData());
  1099.                     
  1100.                         $intervention = new Intervention();
  1101.                         $intervention->setTicket($ticket);
  1102.                         $intervention->setDatetime($suspensionDatetimeFrom);
  1103.                         $intervention->setMotivation($formSuspension->get("motivation")->getData());
  1104.                         $intervention->setOutcomeType($em->getRepository('App\Entity\Slave\InterventionOutcomeType')->findOneBySlug('suspended'));
  1105.                         $intervention->setOutcome($interventionOutcome);
  1106.                         $intervention->setDatetimeBilling(date_create_from_format('d-m-Y H:i:s''01-'.$today->format('m').'-'.$today->format('Y').' 00:00:00'));
  1107.                         $intervention->setBillable(false);
  1108.                         $intervention->setOperator($this->getUser());
  1109.                         if($interventionOutcome->isReferentRequired()) $intervention->setReferent($formSuspension->get("referent")->getData());
  1110.                         if($interventionOutcome->isPhoneRequired()) $intervention->setPhone($formSuspension->get("phone")->getData());
  1111.                         if($interventionOutcome->isPhotoRequired()) {
  1112.                             $uploadDir $this->params->get('kernel.project_dir').'/'.$this->params->get('web_path').'/companies/'.$company->getDirectoryPath().'/tickets/'.$ticket->getDirectoryPath().'/';
  1113.                             MediaService::uploadImage($fs$formSuspension->get('file')->getData(), null$uploadDir$intervention'photo'1001000200true);
  1114.                         }
  1115.                         $em->persist($intervention);
  1116.         
  1117.                         // Inserisco la sospensione del ticket
  1118.                         $suspension = new TicketSuspension();
  1119.                         $suspension->setTicket($ticket);
  1120.                         $suspension->setIntervention($intervention);
  1121.                         $suspension->setDatetimeFrom($suspensionDatetimeFrom);
  1122.                         if($formSuspension->get('dateTo')->getData() != null && $formSuspension->get('timeToHour')->getData() != null && $formSuspension->get('timeToMinute')->getData() != null){
  1123.                             $suspension->setDatetimeTo(date_create_from_format("d-m-Y H:i"$formSuspension->get('dateTo')->getData()->format('d-m-Y').' '.$formSuspension->get('timeToHour')->getData().':'.$formSuspension->get('timeToMinute')->getData()));
  1124.                         }
  1125.                         $suspension->setApproved(true);
  1126.                         $suspension->setManaged(true);
  1127.                         $em->persist($suspension);
  1128.                         $settingUnlockSameTech $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_suspension_unlock_same_technician'));
  1129.                         if($settingUnlockSameTech->getValue() != 1){
  1130.                             TicketService::createTicketLog($em$this->getUser(), $ticket"ct"$ticket->getTechnician(), null);
  1131.                             $ticket->setTechnician(null);
  1132.                         }
  1133.                         $statusSuspended $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'suspended'));
  1134.                         TicketService::createTicketLog($em$this->getUser(), $ticket"cs"$ticket->getStatus(), $statusSuspended->getValue());
  1135.                         $ticket->setStatus($statusSuspended);
  1136.     
  1137.                         $em->flush();
  1138.                         if($ticket->getTechnician() != null)
  1139.                             $tickets[$ticket->getTechnician()->getId()][] = $ticketId;
  1140.                     }
  1141.                     
  1142.                     // Invio messaggio di notifica ai tecnici
  1143.                     foreach($tickets as $techId => $ticketIds){
  1144.                         $technician $em->getRepository('App\Entity\Slave\User')->findOneById($techId);
  1145.                         if($technician && $settingTechnicianSendAssignEmail->getValue() == && count($ticketIds) > && $technician->isAssignEmailActive()){
  1146.                             $ticketsToSend = [];
  1147.                             foreach($ticketIds as $tId){
  1148.                                 $tObj $em->getRepository('App\Entity\Slave\Ticket')->findOneById($tId);
  1149.                                 if($tObj$ticketsToSend[] = $tObj;
  1150.                             }
  1151.                             if(count($ticketsToSend) > 0){
  1152.                                 $message = (new TemplatedEmail())
  1153.                                     ->subject($this->params->get('subject_ticket_suspended'))
  1154.                                     ->from($this->params->get('email_noreply'))
  1155.                                     ->to($technician->getEmail())
  1156.                                     ->htmlTemplate('email/technician/tickets_suspended.html.twig')
  1157.                                     ->context(['technician' => $technician'tickets' => $ticketsToSend]);
  1158.                                 $mailer->send($message);
  1159.                             }
  1160.                         }
  1161.                     }
  1162.                         
  1163.                     $this->addFlash('notice_success''Ticket sospesi');
  1164.                     return $this->redirectToRoute('user_ticket_list');
  1165.                 }
  1166.                 else{
  1167.                     $session->set('openSuspensionModal'true);
  1168.                     $session->set('openSuspensionModalIds'$ids);
  1169.                 }
  1170.             }
  1171.             return $this->render('role/user/ticket/list.html.twig', array(
  1172.                 'cities' => $cities,
  1173.                 'settingBackOffice' => $settingBackOffice != null $settingBackOffice->getValue() : false,
  1174.                 'settingProcessedActive' => $settingProcessedActive != null $settingProcessedActive->getValue() : false,
  1175.                 'errorTickets' => $errorTickets,
  1176.                 'toAssignTickets' => $toAssignTickets,
  1177.                 'assignedTickets' => $assignedTickets,
  1178.                 'takenChargeTickets' => $takenChargeTickets,
  1179.                 'suspensionRequestTickets' => $suspensionRequestTickets,
  1180.                 'suspendedTickets' => $suspendedTickets,
  1181.                 'closedTickets' => $closedTickets,
  1182.                 'closedPortalTickets' => $closedPortalTickets,
  1183.                 'canceledTickets' => $canceledTickets,
  1184.                 'wrongTickets' => $wrongTickets,
  1185.                 'suppliers' => $suppliers,
  1186.                 'operations' => $operationGroups,
  1187.                 'tags' => $tags,
  1188.                 'filters' => $filters,
  1189.                 'formAssignTechnician' => $formAssignTechnician->createView(),
  1190.                 'formSuspension' => $formSuspension->createView()
  1191.             ));
  1192.         }
  1193.         if($this->getUser()->getAccountTypology() == 'technician'){
  1194.             # Tecnico
  1195.             $settingTechUnlockSuspension $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_suspension_unlock_by_technician'));
  1196.             $filters FilterService::ticketTechnicianFilter($request);
  1197.             if($session->get('tab_operation_group') != null){
  1198.                 $filters['all'] = $session->get('tab_operation_group');
  1199.             }
  1200.             if($session->get('numberOrTermid') != null){
  1201.                 $filters['all'] = $session->get('numberOrTermid');
  1202.                 $session->remove('numberOrTermid');
  1203.             }
  1204.             $assignedTicketsQuery $em->getRepository("App\Entity\Slave\Ticket")->findTicketsByUserAndStatusFiltered(true$this->getUser()->getId(), 'assigned'$filters);
  1205.             $assignedTickets $paginator->paginate($assignedTicketsQuery$request->getSession()->get($request->get("_route")."_page"), 100);
  1206.             
  1207.             $takenChargeTicketsQuery $em->getRepository("App\Entity\Slave\Ticket")->findTicketsByUserAndStatusFiltered(true$this->getUser()->getId(), 'taken_charge'$filters);
  1208.             $takenChargeTickets $paginator->paginate($takenChargeTicketsQuery$request->getSession()->get($request->get("_route")."_page"), 100);
  1209.             
  1210.             $suspensionRequestTicketsQuery $em->getRepository("App\Entity\Slave\Ticket")->findTicketsByUserAndStatusFiltered(true$this->getUser()->getId(), 'suspension_request'$filters);
  1211.             $suspensionRequestTickets $paginator->paginate($suspensionRequestTicketsQuery$request->getSession()->get($request->get("_route")."_page"), 100);
  1212.             $suspendedTicketsQuery $em->getRepository("App\Entity\Slave\Ticket")->findTicketsByUserAndStatusFiltered(true$this->getUser()->getId(), 'suspended'$filters);
  1213.             $suspendedTickets $paginator->paginate($suspendedTicketsQuery$request->getSession()->get($request->get("_route")."_page"), 100);
  1214.             
  1215.             $closedTicketsQuery $em->getRepository("App\Entity\Slave\Ticket")->findTicketsByUserAndStatusFiltered(true$this->getUser()->getId(), 'closed'$filters);
  1216.             $closedTickets $paginator->paginate($closedTicketsQuery$request->getSession()->get($request->get("_route")."_page"), 100);
  1217.             
  1218.             $closedPortalTicketsQuery $em->getRepository("App\Entity\Slave\Ticket")->findTicketsByUserAndStatusFiltered(true$this->getUser()->getId(), 'closed_portal'$filters);
  1219.             $closedPortalTickets $paginator->paginate($closedPortalTicketsQuery$request->getSession()->get($request->get("_route")."_page"), 100);
  1220.             
  1221.             $canceledTicketsQuery $em->getRepository("App\Entity\Slave\Ticket")->findTicketsByUserAndStatusFiltered(true$this->getUser()->getId(), 'canceled'$filters);
  1222.             $canceledTickets $paginator->paginate($canceledTicketsQuery$request->getSession()->get($request->get("_route")."_page"), 100);
  1223.             
  1224.             return $this->render('role/user/ticket/list.html.twig', array(
  1225.                 'settingProcessedActive' => $settingProcessedActive->getValue(),
  1226.                 'settingTechUnlockSuspension' => $settingTechUnlockSuspension,
  1227.                 'assignedTickets' => $assignedTickets,
  1228.                 'takenChargeTickets' => $takenChargeTickets,
  1229.                 'suspensionRequestTickets' => $suspensionRequestTickets,
  1230.                 'suspendedTickets' => $suspendedTickets,
  1231.                 'closedTickets' => $closedTickets,
  1232.                 'closedPortalTickets' => $closedPortalTickets,
  1233.                 'canceledTickets' => $canceledTickets,
  1234.                 'tags' => $tags,
  1235.                 'suppliers' => $suppliers,
  1236.                 'operations' => $operationGroups,
  1237.                 'filters' => $filters
  1238.             ));
  1239.         }    
  1240.     }
  1241.     
  1242.     // AZIONI LISTA
  1243.         // MULTIPLE
  1244.             /**
  1245.              * @Route("/selezione-multipla-azione", name="user_ticket_multiple_select_action")
  1246.              * @Security("is_granted('edit', 'ticket')")
  1247.              */
  1248.             public function userTicketMultipleSelectAction(Request $requestMailerInterface $mailer)
  1249.             {    
  1250.                 $em $this->mr->getManager('slave');
  1251.                 $session $request->getSession();
  1252.                 $tab $request->request->get('tab');
  1253.                 $action $request->request->get('action');
  1254.                 $ids $request->request->get('ids');
  1255.                 $causal $request->request->get('causal');
  1256.                 $session->set('ticketsIds'$ids);
  1257.                 $session->set('ticketsAction'$action);
  1258.                 $valid true;
  1259.                 switch($action){
  1260.                     case 'suspend_end'
  1261.                         if($causal == null || $causal == ''){
  1262.                             $valid false;
  1263.                             $session->set('ticketsError''causal');
  1264.                         }
  1265.                         break;
  1266.                     default: break;
  1267.                 }
  1268.                 if($valid){
  1269.                     $tickets = array();
  1270.                     $ticketsIds explode(','$ids);
  1271.                     foreach($ticketsIds as $id){
  1272.                         $t $em->getRepository("App\Entity\Slave\Ticket")->findOneById($id);
  1273.                         array_push($tickets$t);
  1274.                     }
  1275.                     switch($action){
  1276.                         case 'wrong':
  1277.                             $wrongStatus $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBySlug('wrong');
  1278.                             foreach($tickets as $ticket){
  1279.                                 $ticket->setSystemError(false);
  1280.                                 $ticket->setSystemErrorSlug(null);
  1281.                                 $ticket->setSystemErrorDetails(null);
  1282.                                 TicketService::createTicketLog($em$this->getUser(), $ticket"cs"$ticket->getStatus(), $wrongStatus->getValue());
  1283.                                 $ticket->setStatus($wrongStatus);
  1284.                             }
  1285.                             $em->flush();
  1286.                             $this->addFlash('notice_success''Ticket spostati in errati!');
  1287.                             break;
  1288.                         case 'print'
  1289.                             return $this->redirectToRoute('user_ticket_reports_print');
  1290.                             break;
  1291.                         case 'suspend_end':
  1292.                             foreach($tickets as $ticket){
  1293.                                 $ticketSuspension $ticket->getActualSuspension();
  1294.                                 $ticketSuspension->unlock($em$this->getUser(), $causal, new \Datetime());
  1295.                             }
  1296.                             $em->flush();
  1297.                             $this->addFlash('notice_success''Sospensioni sbloccate!');
  1298.                             break;
  1299.                         case 'approve':
  1300.                             $suspendedStatus $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'suspended'));
  1301.                             foreach($tickets as $ticket){
  1302.                                 $ticketSuspension $ticket->getActualSuspension();
  1303.                                 $ticketSuspension->setApproved(true);
  1304.                                 $ticketSuspension->setManaged(true);
  1305.                     
  1306.                                 $settingUnlockSameTech $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_suspension_unlock_same_technician'));
  1307.                                 if($settingUnlockSameTech->getValue() != 1){
  1308.                                     TicketService::createTicketLog($em$this->getUser(), $ticket"ct"$ticket->getTechnician(), null);
  1309.                                     $ticket->setTechnician(null);
  1310.                                 }
  1311.                                 TicketService::createTicketLog($em$this->getUser(), $ticket"cs"$ticket->getStatus(), $suspendedStatus->getValue());
  1312.                                 $ticket->setStatus($suspendedStatus);
  1313.                             }
  1314.                             // TODO inviare una email con l'elenco delle sospensioni approvate per ogni tecnico
  1315.                             $em->flush();
  1316.                             $this->addFlash('notice_success''Sospensioni approvate!');
  1317.                             break;
  1318.                         case 'closed_portal':
  1319.                             $closedPortalStatus $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'closed_portal'));
  1320.                             foreach($tickets as $ticket){
  1321.                                 TicketService::createTicketLog($em$this->getUser(), $ticket"cs"$ticket->getStatus(), $closedPortalStatus->getValue());
  1322.                                 $ticket->setStatus($closedPortalStatus);
  1323.                                 $ticket->setClosedOnPortal(1);
  1324.                             }
  1325.                             $em->flush();
  1326.                             $this->addFlash('notice_success''Ticket chiusi su portal fornitore!');
  1327.                             break;
  1328.                         case 'cancel'
  1329.                             $canceledStatus $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'canceled'));
  1330.                             foreach($tickets as $ticket){
  1331.                                 TicketService::createTicketLog($em$this->getUser(), $ticket"cs"$ticket->getStatus(), $canceledStatus->getValue());
  1332.                                 $ticket->setStatus($canceledStatus);
  1333.                             }
  1334.                             // TODO inviare una email con l'elenco dei ticket annullati per ogni tecnico
  1335.                             $em->flush();
  1336.                             $this->addFlash('notice_success''Ticket annullati!');
  1337.                             break;
  1338.                         case 'delete'
  1339.                             $countDeleted 0;
  1340.                             $countIgnored 0;
  1341.                             foreach($tickets as $ticket){
  1342.                                 if($ticket->canDelete('all')){
  1343.                                     $this->deleteTicketAndConnectedValues($em$ticket);
  1344.                                     $countDeleted++;
  1345.                                 }
  1346.                                 else
  1347.                                     $countIgnored++;
  1348.                             }
  1349.                             $em->flush();
  1350.                             $this->addFlash('notice_success''Rimossi '.$countDeleted.' ticket e ignorati '.$countIgnored.' ticket non eliminabili!');
  1351.                             break;
  1352.                         case 'urge':
  1353.                             $now = new \Datetime();
  1354.                             $settingSunday $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'script_sunday_active'));
  1355.                             $techniciansIds = array();
  1356.                             $users = array();
  1357.                             foreach($tickets as $ticket){
  1358.                                 if(!in_array($ticket->getTechnician()->getId(), $techniciansIds))
  1359.                                     array_push($techniciansIds$ticket->getTechnician()->getId());
  1360.                             }
  1361.                             if($settingSunday->getValue() == || ($settingSunday->getValue() == && $today->format('N') != 7)){
  1362.                                 foreach($techniciansIds as $tId){
  1363.                                     $tmp = array();
  1364.                                     $tmp2 = array();
  1365.                                     $technician $em->getRepository('App\Entity\Slave\User')->findOneById($tId);
  1366.                                     if(!$technician->isInHolidayAtDate($now)){
  1367.                                         foreach($tickets as $ticket){
  1368.                                             if($ticket->getTechnician()->getId() == $technician->getId())
  1369.                                                 array_push($tmp2$ticket);
  1370.                                         }
  1371.                                     }
  1372.                                     array_push($tmp$technician$tmp2);
  1373.                                     array_push($users$tmp);
  1374.                                 }
  1375.                                 
  1376.                                 foreach($users as $u){
  1377.                                     $message = (new TemplatedEmail())
  1378.                                         ->subject($this->params->get('subject_ticket_urge'))
  1379.                                         ->from($this->params->get('email_urgent'))
  1380.                                         ->to($u[0]->getEmail())
  1381.                                         ->htmlTemplate('email/technician/urge_tickets.html.twig')
  1382.                                         ->context(['user' => $u[0], 'tickets' => $u[1]]);
  1383.                                     $mailer->send($message);
  1384.                                 }
  1385.                                 $this->addFlash('notice_success''Email di notifica urgenza inviate!');
  1386.                             }
  1387.                             else{
  1388.                                 $this->addFlash('notice_warning''Notifiche disabilitate la Domenica! Attivale dalle impostazioni');
  1389.                             }
  1390.                             break;
  1391.                         default: break;
  1392.                     }
  1393.                 }
  1394.                 return $this->redirectToRoute('user_ticket_list');
  1395.             }
  1396.             /**
  1397.              * @Route("/verbali-stampa", name="user_ticket_reports_print")
  1398.              * @Security("is_granted('view', 'ticket')")
  1399.              */
  1400.             public function userTicketReportsPrint(Request $request)
  1401.             {    
  1402.                 $em $this->mr->getManager('slave');
  1403.                 $session $request->getSession();
  1404.                 $matrixTickets = array();
  1405.                 $ticketsIds explode(','$session->get('ticketsIds'));
  1406.                 foreach($ticketsIds as $id){
  1407.                     $t $em->getRepository("App\Entity\Slave\Ticket")->findOneById($id);
  1408.                     $jsonReportValues = array();
  1409.                     $tmp = array();
  1410.                     if($t->getJsonReport() != '[]'){
  1411.                         $matrix json_decode($t->getJsonReport(), true);
  1412.                         foreach($matrix as $array)
  1413.                             foreach($array as $a){
  1414.                                 $tcv $em->getRepository('App\Entity\Slave\TicketColumnValue')->findOneBySupplierTicketColumnAndNeedle($t->getSupplier()->getId(), array_keys($array)[0], $a);
  1415.                                 $htmlToAdd '';
  1416.                                 if($tcv != null)
  1417.                                     $htmlToAdd ' ('.$tcv->getValue().')';
  1418.                                 $jsonReportValues[array_keys($array)[0]] = $a.$htmlToAdd;
  1419.                             }
  1420.                     }
  1421.                     array_push($tmp$t$jsonReportValues);
  1422.                     array_push($matrixTickets$tmp);
  1423.                 }
  1424.                 
  1425.                 return $this->render('role/user/print/report.html.twig', array(
  1426.                     'matrixTickets' => $matrixTickets,
  1427.                     'backRoute' => 'list',
  1428.                     'continueRoute' => 'list'
  1429.                 ));
  1430.             }
  1431.             /**
  1432.              * @Route("/verbali-stampati", name="user_ticket_report_printed")
  1433.              * @Security("is_granted('view', 'ticket')")
  1434.              */
  1435.             public function userTicketReportPrinted(Request $request)
  1436.             {    
  1437.                 $em $this->mr->getManager('slave');
  1438.                 $session $request->getSession();
  1439.                 $ticketsIds explode(','$session->get('ticketsIds'));
  1440.                 foreach($ticketsIds as $id){
  1441.                     $t $em->getRepository("App\Entity\Slave\Ticket")->findOneById($id);
  1442.                     $t->setReportPrinted(true);
  1443.                 }
  1444.                 $em->flush();
  1445.                 return $this->redirectToRoute('user_ticket_list');                
  1446.             }
  1447.             
  1448.             /**
  1449.              * @Route("/lista/esporta", name="user_ticket_list_export")
  1450.              * @Security("is_granted('view', 'ticket')")
  1451.              */
  1452.             public function userTicketListExport(Request $request)
  1453.             {    
  1454.                 $em $this->mr->getManager('slave');
  1455.                 $emMaster $this->mr->getManager('master');
  1456.                 $session $request->getSession();
  1457.                 $ids $request->request->get('ids');
  1458.                 $ticketsIds explode(','$ids);
  1459.                 $company $emMaster->getRepository('App\Entity\Master\Company')->findOneById($session->get('companyId'));
  1460.                 $settingProcessedActive $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_processed_active'));
  1461.                 
  1462.                 $response = new StreamedResponse();
  1463.                 $response->setCallback(function() use($em$emMaster$company$ticketsIds$settingProcessedActive){
  1464.                     $handle fopen('php://output''w+');
  1465.                     if($company->isTagTicketActive())
  1466.                         fputcsv($handle, array('Stato''Numero''Termid''Tag''Cliente''Operazione (Dettagli)''Fornitore (SLOT)''Tariffa''Città (Indirizzo)''Provincia''Tecnico''Data/Ora ricezione''Data/Ora scadenza''Note'), ";"'"''\\');
  1467.                     else
  1468.                         fputcsv($handle, array('Stato''Numero''Termid''Cliente''Operazione (Dettagli)''Fornitore (SLOT)''Tariffa''Città (Indirizzo)''Provincia''Tecnico''Data/Ora ricezione''Data/Ora scadenza''Note'), ";"'"''\\');
  1469.                     foreach($ticketsIds as $id){
  1470.                         $status null;
  1471.                         $number null;
  1472.                         $termid null;
  1473.                         $tags null;
  1474.                         $client null;
  1475.                         $operation null;
  1476.                         $key null;
  1477.                         $supplier null;
  1478.                         $slot null;
  1479.                         $tariff null;
  1480.                         $city null;
  1481.                         $province null;
  1482.                         $technician null;
  1483.                         $datetimeStart null;
  1484.                         $datetimeExpiration null;
  1485.                         $notes null;
  1486.                         $t $em->getRepository("App\Entity\Slave\Ticket")->findOneById($id);
  1487.                         $status $t->displayStatus('text'$settingProcessedActive->getValue());
  1488.                         $number $t->getNumber();
  1489.                         $termid $t->getTermid()->__toString();
  1490.                         if($company->isTagTicketActive()) $tags $t->displayTags('string');
  1491.                         $client $t->getClient()->__toString();
  1492.                         if($t->getOperation() !== null){
  1493.                             $operation $t->getOperation()->getValue();
  1494.                             $key $t->getOperation()->getKeyValueByValue('Dettagli operazione');
  1495.                             if($key && $t->displayJsonValueByColumn($key) !== null)
  1496.                                 $operation .= ' (' $t->displayJsonValueByColumn($key) . ')';
  1497.                         }
  1498.                         else $operation 'Operazione non riconosciuta';
  1499.                         if($t->getSupplier() !== null){
  1500.                             $supplier $t->getSupplier()->__toString();
  1501.                             $slot $t->displayJsonValueByColumn('SLOT');
  1502.                             if($slot !== null && $slot !== '')
  1503.                                 $supplier .= ' ('.$slot.')';
  1504.                         }
  1505.                         else $supplier 'Fornitore non riconosciuto';
  1506.                         if($t->getOperationTariffAmount() !== null$tariff $t->getOperationTariffAmount()->getValue();
  1507.                         if($t->getIdCity() !== null){
  1508.                             $cityEntity $emMaster->getRepository('App\Entity\Master\City')->findOneById($t->getIdCity());
  1509.                             $city $cityEntity->getName().' ('.$t->getAddress().')';
  1510.                         }
  1511.                         if($t->getIdProvince() !== null){   
  1512.                             $provinceEntity $emMaster->getRepository('App\Entity\Master\Province')->findOneById($t->getIdProvince());
  1513.                             $province $provinceEntity->getSign();
  1514.                         }
  1515.                         if($t->getStatus()->getSlug() !== 'to_assign'$technician $t->getTechnician();
  1516.                         $datetimeStart $t->getDatetimeStart() !== null $t->getDatetimeStart()->format('d-m-Y H:i') : '---';
  1517.                         if($t->getStatus()->getSlug() !== 'closed' && $t->getStatus()->getSlug() !== 'closed_portal'$datetimeExpiration $t->getDatetimeExpiration() !== null $t->getDatetimeExpiration()->format('d-m-Y H:i') : '---'; else $datetimeExpiration $t->getDatetimeEnd() !== null $t->getDatetimeEnd()->format('d-m-Y H:i') : '---';
  1518.                         $notes $t->getNotes();
  1519.                         if($company->isTagTicketActive())
  1520.                             fputcsv($handle, array($status$number$termid$tags$client$operation$supplier$tariff$city$province$technician$datetimeStart$datetimeExpiration$notes), ";"'"'"\\");
  1521.                         else
  1522.                             fputcsv($handle, array($status$number$termid$client$operation$supplier$tariff$city$province$technician$datetimeStart$datetimeExpiration$notes), ";"'"'"\\");
  1523.                     }
  1524.                     fclose($handle);
  1525.                 });
  1526.                 
  1527.                 $response->setStatusCode(200);
  1528.                 $dispositionHeader $response->headers->makeDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT'Ticket selezionati.csv');
  1529.                 $response->headers->set('Content-Type''text/csv; charset=ISO-8859-15');
  1530.                 $response->headers->set('Content-Disposition'$dispositionHeader);
  1531.                 return $response;
  1532.             }
  1533.         //
  1534.         
  1535.         // SINGOLE
  1536.             /**
  1537.              * @Route("/invia-email-prendi-in-carico", name="user_ticket_send_email_take_charge")
  1538.              * @Security("is_granted('edit', 'ticket')")
  1539.              */
  1540.             public function userTicketSendEmailTakeCharge(Request $requestMailerInterface $mailer)
  1541.             {    
  1542.                 $em $this->mr->getManager('slave');
  1543.                 $emMaster $this->mr->getManager('master');
  1544.                 $session $request->getSession();
  1545.                 $company $emMaster->getRepository('App\Entity\Master\Company')->findOneById($session->get('companyId'));
  1546.                 $now = new \Datetime();
  1547.                 $users = array();
  1548.                 $technicians $em->getRepository("App\Entity\Slave\User")->findTechniciansActive();
  1549.                 $settingSunday $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'script_sunday_active'));
  1550.                 if($settingSunday->getValue() == || ($settingSunday->getValue() == && $today->format('N') != 7)){
  1551.                     foreach($technicians as $t){
  1552.                         $onHoliday false;
  1553.                         foreach($t->getHolidays() as $h){
  1554.                             if($now->format('Ymd') >= $h->getDateFrom()->format('Ymd') && $now->format('Ymd') <= $h->getDateTo()->format('Ymd')){
  1555.                                 $onHoliday true;
  1556.                                 break;
  1557.                             }
  1558.                         }
  1559.                         if(!$onHoliday){
  1560.                             $tickets $em->getRepository('App\Entity\Slave\Ticket')->findByUserAndStatus($t->getId(), 'assigned');
  1561.                             if(sizeof($tickets) > 0)
  1562.                                 array_push($users, array($t$tickets));
  1563.                         }
  1564.                     }
  1565.                     
  1566.                     foreach($users as $u){
  1567.                         $message = (new TemplatedEmail())
  1568.                             ->subject($this->params->get('subject_ticket_take_charge'))
  1569.                             ->from($this->params->get('email_noreply'))
  1570.                             ->to($u[0]->getEmail())
  1571.                             ->htmlTemplate('email/technician/tickets_assigned.html.twig')
  1572.                             ->context(['user' => $u[0], 'tickets' => $u[1]]);
  1573.                         $mailer->send($message);
  1574.                     }
  1575.                     $message = (new TemplatedEmail())
  1576.                         ->subject($this->params->get('subject_event_clicked'))
  1577.                         ->from($this->params->get('email_noreply'))
  1578.                         ->to($this->params->get('email_domini'))
  1579.                         ->htmlTemplate('email/event_clicked.html.twig')
  1580.                         ->context(['user' => $this->getUser(), 'company' => $company'event' => 'Invia email prendi in carico']);
  1581.                     $mailer->send($message);
  1582.                     
  1583.                     $this->addFlash('notice_success''Notifiche email inviate!');
  1584.                 }
  1585.                 else{
  1586.                     $this->addFlash('notice_warning''Notifiche disabilitate la Domenica! Attivale dalle impostazioni');
  1587.                 }
  1588.                 return $this->redirect($request->server->get('HTTP_REFERER'));
  1589.             }
  1590.         
  1591.             /**
  1592.              * @Route("/prendi-in-carico", name="user_ticket_take_charge")
  1593.              * @Security("is_granted('edit', 'ticket')")
  1594.              */
  1595.             public function userTicketTakeCharge(Request $request)
  1596.             {    
  1597.                 $em $this->mr->getManager('slave');
  1598.                 $session $request->getSession();
  1599.                 $tickets $em->getRepository('App\Entity\Slave\Ticket')->findByUserAndStatus($this->getUser()->getId(), 'assigned');
  1600.                 $statusTakenCharge $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBySlug('taken_charge');
  1601.                 foreach($tickets as $ticket){
  1602.                     TicketService::createTicketLog($em$this->getUser(), $ticket"cs"$ticket->getStatus(), $statusTakenCharge->getValue());
  1603.                     $ticket->setStatus($statusTakenCharge);
  1604.                 }
  1605.                 $em->flush();
  1606.                 $this->addFlash('notice_success''Stato aggiornato!');
  1607.                 return $this->redirect($request->server->get('HTTP_REFERER'));
  1608.             }
  1609.         //
  1610.     //
  1611.     
  1612.     // AGGIUNGI MANUALMENTE
  1613.         /**
  1614.          * @Route("/nuovo", name="user_ticket_new")
  1615.          * @Security("is_granted('view', 'ticket')")
  1616.          */
  1617.         public function userTicketNew(Request $requestValidatorInterface $validatorFormFactoryInterface $formFactory)
  1618.         {    
  1619.             $em $this->mr->getManager('slave');
  1620.             $emMaster $this->mr->getManager('master');
  1621.             $session $request->getSession();
  1622.             $company $emMaster->getRepository('App\Entity\Master\Company')->findOneById($session->get('companyId'));
  1623.             $cities $emMaster->getRepository("App\Entity\Master\City")->findByName('');
  1624.             $today = new \DateTime();
  1625.             $ticket = new Ticket();
  1626.             $form $formFactory->createNamed("form_ticket_new"TicketType::class, $ticket);
  1627.             $form->handleRequest($request);
  1628.             if($form->isSubmitted()){
  1629.                 $valid true;
  1630.                 if($form->get("termidsCode")->getData() == null){
  1631.                     $valid false;
  1632.                     $form->get("termidsCode")->addError(new FormError("Campo obbligatorio"));
  1633.                 }
  1634.                 if($valid){
  1635.                     $termids explode(','$form->get("termidsCode")->getData());
  1636.                     foreach($termids as $termid){
  1637.                         $alreadyExist $em->getRepository('App\Entity\Slave\Ticket')->findOneByNumberAndTermid($ticket->getNumber(), $termid);
  1638.                         if($alreadyExist){
  1639.                             $valid false;
  1640.                             $form->get("number")->addError(new FormError("Esiste già un ticket con questo numero e con uno di questi termid!"));
  1641.                             $form->get("termidsCode")->addError(new FormError("Esiste già un ticket con questo numero e con uno di questi termid!"));
  1642.                             break;
  1643.                         }
  1644.                     }
  1645.                 }
  1646.                 
  1647.                 if($valid$valid ValidationService::validateNotBlank($validator$form->get("datetimeStart_date"));
  1648.                 if($valid$valid ValidationService::validateNotBlank($validator$form->get("datetimeStart_hour"));
  1649.                 if($valid$valid ValidationService::validateNotBlank($validator$form->get("datetimeStart_minute"));
  1650.                 if($valid$valid ValidationService::validateNotBlank($validator$form->get("datetimeExpiration_date"));
  1651.                 if($valid$valid ValidationService::validateNotBlank($validator$form->get("datetimeExpiration_hour"));
  1652.                 if($valid$valid ValidationService::validateNotBlank($validator$form->get("datetimeExpiration_minute"));
  1653.                 if($valid$valid ValidationService::validateNotBlank($validator$form->get("anomaly"));
  1654.                 if($form->get('cityId')->getData() == null && $form->get("otherCity")->getData() == null){
  1655.                     $valid false;
  1656.                     $form->get("cityName")->addError(new FormError("Campo obbligatorio"));
  1657.                 }
  1658.                 if($valid$valid ValidationService::validateNotBlank($validator$form->get("clientCode"));
  1659.                 if($valid$valid ValidationService::validateNotBlank($validator$form->get("clientName"));
  1660.                 if($valid$valid ValidationService::validateNotBlank($validator$form->get("clientNickname"));
  1661.                 if($valid$valid ValidationService::validateNotBlank($validator$form->get("clientAddress"));
  1662.                 if($form->get('client_cityId')->getData() == null){
  1663.                     $valid false;
  1664.                     $form->get("client_cityName")->addError(new FormError("Campo obbligatorio"));
  1665.                 }
  1666.                 if($valid$valid ValidationService::validateNotBlank($validator$form->get("client_zip"));
  1667.                 $zip $emMaster->getRepository('App\Entity\Master\Zip')->findOneById($form->get('zip')->getData());
  1668.                 if($zip == null){
  1669.                     $zip $emMaster->getRepository('App\Entity\Master\Zip')->findOneByCode($request->request->get('other_zip'));
  1670.                     if($zip == null){
  1671.                         $form->get('zip')->addError(new FormError('CAP inesistente! Controlla il valore inserito!'));
  1672.                         $valid false;
  1673.                     }
  1674.                 }
  1675.                 
  1676.                 if($valid && $form->isValid()){
  1677.                     
  1678.                     $jsonReport '[{"ABI":'.json_encode($form->get('abi')->getData()).'},{"Anomalia":'.json_encode($form->get('anomaly')->getData()).'}]';
  1679.                     $datetimeStart date_create_from_format('d-m-Y H:i'$form->get('datetimeStart_date')->getData()->format('d-m-Y').' '.$form->get('datetimeStart_hour')->getData().':'.$form->get('datetimeStart_minute')->getData());
  1680.                     $datetimeExpiration date_create_from_format('d-m-Y H:i'$form->get('datetimeExpiration_date')->getData()->format('d-m-Y').' '.$form->get('datetimeExpiration_hour')->getData().':'.$form->get('datetimeExpiration_minute')->getData());
  1681.                     // Client
  1682.                     $client $em->getRepository('App\Entity\Slave\Client')->findOneById($form->get('clientId')->getData());
  1683.                     if($client == null){
  1684.                         $client = new Client();
  1685.                         $client->setDirectoryPath(md5(uniqid()));
  1686.                         $em->persist($client);
  1687.             
  1688.                         $warehouse = new Warehouse();
  1689.                         $warehouse->setClient($client);
  1690.                         $warehouse->setMovable(false);
  1691.                         $warehouse->setNickname('Magazzino cliente - '.$client->getNickname());
  1692.                         $client->setWarehouse($warehouse);
  1693.                         $em->persist($warehouse);
  1694.                         $em->flush();
  1695.                         $clientPhone = new ClientPhone();
  1696.                         $clientPhone->setClient($client);
  1697.                         $clientPhone->setName('Telefono 1');
  1698.                         $em->persist($clientPhone);
  1699.                     }
  1700.                     else{
  1701.                         foreach($client->getPhones() as $phone){
  1702.                             if($phone->getName() == 'Telefono 1'){
  1703.                                 $clientPhone $phone;
  1704.                                 break;
  1705.                             }
  1706.                         }
  1707.                     }
  1708.                     $clientCity $emMaster->getRepository('App\Entity\Master\City')->findOneById($form->get('client_cityId')->getData());
  1709.                     $clientZip $emMaster->getRepository('App\Entity\Master\Zip')->findOneById($form->get('client_zip')->getData());
  1710.                     $client->setCode($form->get('clientCode')->getData());
  1711.                     $client->setName($form->get('clientName')->getData());
  1712.                     $client->setNickname($form->get('clientNickname')->getData());
  1713.                     $client->setReferent($form->get('clientReferent')->getData());
  1714.                     $client->setFiscalCode($form->get('clientFiscalCode')->getData());
  1715.                     $client->setVat($form->get('clientVat')->getData());
  1716.                     $client->setSdi($form->get('clientSdi')->getData());
  1717.                     $client->setClosures($form->get('clientClosures')->getData());
  1718.                     $client->setOpenings($form->get('clientOpenings')->getData());
  1719.                     $client->setAddress($form->get('address')->getData());
  1720.                     $client->setLocality($form->get('locality')->getData());
  1721.                     $client->setIdCity($clientCity->getId());
  1722.                     $client->setZip($clientZip->getCode());
  1723.                     $client->setIdProvince($clientCity->getProvince()->getId());
  1724.                     $client->setNotes($form->get('clientNotes')->getData());
  1725.                     $clientPhone->setNumber($form->get('clientPhone')->getData());
  1726.     
  1727.                     // Termid
  1728.                     $termids explode(','$form->get("termidsCode")->getData());
  1729.                     foreach($termids as $termidCode){
  1730.                         if($form->get('cityId')->getData() != null)
  1731.                             $city $emMaster->getRepository('App\Entity\Master\City')->findOneById($form->get('cityId')->getData());
  1732.                         
  1733.                         $zip $emMaster->getRepository('App\Entity\Master\Zip')->findOneById($form->get('zip')->getData());
  1734.                         $assignStatus $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBySlug('to_assign');
  1735.                         $ticket = new Ticket();
  1736.                         $ticket->setNumber($form->get('number')->getData());
  1737.                         $ticket->setAddress($form->get('address')->getData());
  1738.                         $ticket->setLocality($form->get('locality')->getData());
  1739.                         $ticket->setSupplier($form->get('supplier')->getData());
  1740.                         $ticket->setOperation($form->get('operation')->getData());
  1741.                         $ticket->setZip($zip->getCode());
  1742.                         if($city != null){
  1743.                             $ticket->setIdCity($city->getId());
  1744.                             $ticket->setIdProvince($city->getProvince()->getId());
  1745.                             $ticket->setOtherCity(null);
  1746.                         }
  1747.                         else{
  1748.                             $ticket->setOtherCity($form->get('otherCity')->getData());
  1749.                             $ticket->setIdProvince($zip->getCities()[0]->getProvince()->getId());
  1750.                         }
  1751.                         $ticket->setStatus($assignStatus);
  1752.                         $ticket->setDirectoryPath($today->format("Y").'/'.$today->format("m").'/'.md5(uniqid()));
  1753.                         $ticket->setDatetimeImport(new \DateTime());
  1754.                         $ticket->setClosedOnPortal(false);
  1755.                         $ticket->setSystemError(false);
  1756.                         $ticket->setJson('[{}]');
  1757.                         $ticket->setJsonReport($jsonReport);
  1758.                         $ticket->setDatetimeStart($datetimeStart);
  1759.                         $ticket->setDatetimeExpiration($datetimeExpiration);                        
  1760.                         $ticket->setClient($client);
  1761.                         $em->persist($ticket);
  1762.                         $termid $em->getRepository('App\Entity\Slave\Termid')->findOneByCode($termidCode);
  1763.                         if($termid == null){
  1764.                             $termid = new Termid();
  1765.                             $termid->setClient($client);
  1766.                             $termid->setCode($termidCode);
  1767.                             $em->persist($termid);
  1768.                             $em->flush();
  1769.                         }
  1770.                         $ticket->setTermid($termid);
  1771.                         $em->persist($ticket);
  1772.                         $em->flush();
  1773.                         TicketService::createTicketLog($em$this->getUser(), $ticket"cs"null$assignStatus->getValue());
  1774.                         $error TicketService::ticketAssignOperationTariffAmount($em$emMaster$ticket);
  1775.                     }
  1776.                     $em->flush();
  1777.                     $this->addFlash('notice_success'"Ticket inserito!");
  1778.                     return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
  1779.                 }
  1780.             }
  1781.             return $this->render('role/user/ticket/new.html.twig', array(
  1782.                 'company' => $company,
  1783.                 'cities' => $cities,
  1784.                 'form' => $form->createView()
  1785.             ));
  1786.         }
  1787.     //
  1788.         
  1789.     /**
  1790.      * @Route("/{ticketId}/scheda", name="user_ticket_sheet")
  1791.      * @Security("is_granted('ticket_view', ticketId)")
  1792.      */
  1793.     public function userTicketSheet($ticketIdRequest $requestValidatorInterface $validatorFormFactoryInterface $formFactoryFileSystem $fsUserPasswordHasherInterface $passwordHasherMailerInterface $mailer)
  1794.     {    
  1795.         $em $this->mr->getManager('slave');
  1796.         $emMaster $this->mr->getManager('master');
  1797.         $session $request->getSession();
  1798.         $company $emMaster->getRepository('App\Entity\Master\Company')->findOneById($session->get('companyId'));
  1799.         $settingBackOffice $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_backoffice_manage'));
  1800.         $settingTechUnlockSuspension $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_suspension_unlock_by_technician'));
  1801.         $settingProcessedActive $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_processed_active'));
  1802.         $settingTechnicianExchangeTickets $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'technician_exchange_tickets'));
  1803.         $cities $emMaster->getRepository("App\Entity\Master\City")->findByName('');
  1804.         $ticket $em->getRepository("App\Entity\Slave\Ticket")->findOneById($ticketId);
  1805.         $displayJsonReport '';
  1806.         if($ticket->getJsonReport() != '[]'){
  1807.             $matrix json_decode($ticket->getJsonReport(), true);
  1808.             foreach($matrix as $array)
  1809.                 foreach($array as $a){
  1810.                     $tcv $em->getRepository('App\Entity\Slave\TicketColumnValue')->findOneBySupplierTicketColumnAndNeedle($ticket->getSupplier()->getId(), array_keys($array)[0], $a);
  1811.                     $htmlToAdd '';
  1812.                     if($tcv != null)
  1813.                         $htmlToAdd ' <i>('.$tcv->getValue().')</i>';
  1814.                     $displayJsonReport.= '<tr><th>'.array_keys($array)[0].'</th><td colspan="2">'.$a.$htmlToAdd.'</td></tr>';
  1815.                 }
  1816.         }
  1817.         // TICKET - MODIFICA INDIRIZZO
  1818.         $formAddressEdit $formFactory->createNamed("form_address"TicketAddressType::class, $ticket);
  1819.         $formAddressEdit->handleRequest($request);
  1820.         if($formAddressEdit->isSubmitted()){
  1821.             $valid true;
  1822.             $zip $emMaster->getRepository('App\Entity\Master\Zip')->findOneById($formAddressEdit->get('zip')->getData());
  1823.             if($zip == null){
  1824.                 $zip $emMaster->getRepository('App\Entity\Master\Zip')->findOneByCode($request->request->get('other_zip'));
  1825.                 if($zip == null){
  1826.                     $formAddressEdit->get('zip')->addError(new FormError('CAP inesistente! Controlla il valore inserito!'));
  1827.                     $valid false;
  1828.                 }
  1829.             }
  1830.             if($valid && $formAddressEdit->isValid()){
  1831.                 if($formAddressEdit->get('cityId')->getData() != null)
  1832.                     $city $emMaster->getRepository('App\Entity\Master\City')->findOneById($formAddressEdit->get('cityId')->getData());
  1833.                 $ticket->setZip($zip->getCode());
  1834.                 if($city != null){
  1835.                     $ticket->setIdCity($city->getId());
  1836.                     $ticket->setIdProvince($city->getProvince()->getId());
  1837.                     $ticket->setOtherCity(null);
  1838.                 }
  1839.                 else{
  1840.                     $ticket->setOtherCity($formAddressEdit->get('otherCity')->getData());
  1841.                     $ticket->setIdProvince($zip->getCities()[0]->getProvince()->getId());
  1842.                 }
  1843.                 // SE SCELTO AGGIORNA CLIENTE
  1844.                 if($formAddressEdit->get('updateClient')->getData()){
  1845.                     $ticket->getClient()->setAddress($formAddressEdit->get('address')->getData());
  1846.                     $ticket->getClient()->setZip($zip->getCode());
  1847.                     $ticket->getClient()->setLocality($formAddressEdit->get('locality')->getData());
  1848.                     if($city != null){
  1849.                         $ticket->getClient()->setIdCity($city->getId());
  1850.                         $ticket->getClient()->setIdProvince($city->getProvince()->getId());
  1851.                     }
  1852.                     else{
  1853.                         $ticket->getClient()->setOtherCity($formAddressEdit->get('otherCity')->getData());
  1854.                         $ticket->getClient()->setIdProvince($zip->getCities()[0]->getProvince()->getId());
  1855.                     }
  1856.                 }
  1857.                 
  1858.                 $error TicketService::ticketAssignOperationTariffAmount($em$emMaster$ticket);
  1859.                 if($error){
  1860.                     $this->addFlash('notice_warning'"Nessuna tariffa trovata per questo indirizzo!");
  1861.                     return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
  1862.                 }
  1863.                 $em->flush();
  1864.                 $this->addFlash('notice_success'"Indirizzo ticket aggiornato!");
  1865.                 return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
  1866.             }
  1867.             else{
  1868.                 $session->set('openModalAddressEdit'true);
  1869.             }
  1870.         }
  1871.         // TICKET - CLIENTE - MODIFICA 
  1872.         $numOfPhones 0;
  1873.         if($ticket->getClient() != null)
  1874.             $numOfPhones sizeof($ticket->getClient()->getPhones());
  1875.         $formClientEdit $formFactory->createNamed("form_client_edit"ClientEditType::class, $ticket->getClient(), array('phoneNumber' => $numOfPhones));
  1876.         $formClientEdit->handleRequest($request);
  1877.         if($formClientEdit->isSubmitted()){
  1878.             if($formClientEdit->isValid()){
  1879.                 
  1880.                 foreach($ticket->getClient()->getPhones() as $phone){
  1881.                     if($phone->getName() == 'Telefono 1'$phone->setNumber($formClientEdit->get('phone1')->getData());
  1882.                     if(sizeof($ticket->getClient()->getPhones()) > && $phone->getName() == 'Telefono 2'$phone->setNumber($formClientEdit->get('phone2')->getData());
  1883.                     if(sizeof($ticket->getClient()->getPhones()) > && $phone->getName() == 'Telefono cellulare'$phone->setNumber($formClientEdit->get('phone3')->getData());
  1884.                 }
  1885.                 if(sizeof($ticket->getClient()->getPhones()) == 0){
  1886.                     $clientPhone = new ClientPhone();
  1887.                     $clientPhone->setClient($ticket->getClient());
  1888.                     $clientPhone->setName('Telefono 1');
  1889.                     $clientPhone->setNumber('');
  1890.                     $em->persist($clientPhone);
  1891.                 }
  1892.                 $em->flush();
  1893.                 $this->addFlash('notice_success'"Dati aggiornati");
  1894.                 return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
  1895.             }
  1896.             else{
  1897.                 $session->set('openEditModal'true);
  1898.                 $session->set('openEditModalId'$request->request->get('clientNotesEditId'));
  1899.             }
  1900.         }
  1901.     
  1902.         // TICKET - SOSPENSIONE - SBLOCCA
  1903.         $suspension = new TicketSuspension();
  1904.         $formSusUnlock $formFactory->createNamed("form_suspension_unlock"TicketSuspensionUnlockType::class, $suspension);
  1905.         $formSusUnlock->handleRequest($request);
  1906.         if($formSusUnlock->isSubmitted()){
  1907.             $valid ValidationService::validateNotBlank($validator$formSusUnlock->get("unlockCausal"));
  1908.             if($valid && $formSusUnlock->isValid()){
  1909.                 $suspension $em->getRepository('App\Entity\Slave\TicketSuspension')->findOneById($formSusUnlock->get('id')->getData());
  1910.                 $unlockCausal $formSusUnlock->get("unlockCausal")->getData();
  1911.                 $suspension->unlock($em$this->getUser(), $unlockCausal, new \DateTime());
  1912.                 $em->flush();
  1913.                 $this->addFlash('notice_success'"Sospensione sbloccata!");
  1914.                 return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
  1915.             }
  1916.             else{
  1917.                 $session->set('openModalSuspensionUnlock'true);
  1918.                 $session->set('openModalSuspensionUnlockId'$formSusUnlock->get('id')->getData());
  1919.             }
  1920.         }
  1921.         
  1922.         // TICKET - EXTRA
  1923.         if($this->getUser()->getAccountTypology() == 'agency' || $this->getUser()->getAccountTypology() == 'warehouse'){
  1924.             if($company->getCode() == "3RC419" && ($ticket->getSupplier()->getSlug() == 'nexi-book-monetica' || $ticket->getSupplier()->getSlug() == 'nexi-book-meps'))
  1925.                 $choiceTypes = array('Ore' => 'hours''Spesa' => 'cost''Integrazione tariffa' => 'tariff_extra''Tariffa fuori copertura' => 'tariff_out''App. Nexi Business' => 'nexi_business''Softpos' => 'softpos''Installazioni NBD' => 'nbd_installation''Release sbagliata' => 'wrong_release''Reperibilità domenicale' => 'sunday_on_call');
  1926.             else
  1927.                 $choiceTypes = array('Ore' => 'hours''Spesa' => 'cost''Integrazione tariffa' => 'tariff_extra''Tariffa fuori copertura' => 'tariff_out');
  1928.         }
  1929.         else{
  1930.             if($company->getCode() == "3RC419" && ($ticket->getSupplier()->getSlug() == 'nexi-book-monetica' || $ticket->getSupplier()->getSlug() == 'nexi-book-meps'))
  1931.                 $choiceTypes = array('Ore' => 'hours''Spesa' => 'cost''Integrazione tariffa' => 'tariff_extra''App. Nexi Business' => 'nexi_business''Softpos' => 'softpos''Installazioni NBD' => 'nbd_installation''Release sbagliata' => 'wrong_release');
  1932.             else
  1933.                 $choiceTypes = array('Ore' => 'hours''Spesa' => 'cost''Integrazione tariffa' => 'tariff_extra');
  1934.         }
  1935.         $uploadDir $this->params->get('kernel.project_dir').'/'.$this->params->get('web_path').'/companies/'.$company->getDirectoryPath().'/tickets/'.$ticket->getDirectoryPath().'/';
  1936.         $interventionExtra = new InterventionExtra();
  1937.         $formExtraNew $formFactory->createNamed("form_intervention_extra_new"InterventionExtraType::class, $interventionExtra, array('ticketId' => $ticket->getId(), 'choice_types' => $choiceTypes));
  1938.         $formExtraNew->handleRequest($request);
  1939.         if($formExtraNew->isSubmitted()){
  1940.             $valid FormValidatorService::validateInterventionExtra($validator$formExtraNewfalse$this->getUser());
  1941.             if($valid && $formExtraNew->isValid()){
  1942.                 switch($formExtraNew->get('type')->getData()){
  1943.                     case 'cost':
  1944.                         if($formExtraNew->get('file')->getData()->guessExtension() == 'pdf')
  1945.                             MediaService::uploadDocument($formExtraNew->get('file')->getData(), $uploadDir$interventionExtra'file');
  1946.                         else
  1947.                             MediaService::uploadImage($fs$formExtraNew->get('file')->getData(), null$uploadDir$interventionExtra'file'1001000200true);
  1948.                         break;
  1949.                     case 'tariff_out':
  1950.                         $interventionExtra->setTariffOut(true);
  1951.                         break;
  1952.                     case 'nexi_business':
  1953.                         $interventionExtra->setHours(null);
  1954.                         $interventionExtra->setCost(2);
  1955.                         $interventionExtra->setRevenue(4);
  1956.                         $interventionExtra->setTariffOut(false);
  1957.                         break;
  1958.                     case 'softpos':
  1959.                         $interventionExtra->setHours(null);
  1960.                         $interventionExtra->setCost(4);
  1961.                         $interventionExtra->setRevenue(8);
  1962.                         $interventionExtra->setTariffOut(false);
  1963.                         break;
  1964.                     case 'nbd_installation':
  1965.                         $interventionExtra->setHours(null);
  1966.                         $interventionExtra->setCost(5);
  1967.                         $interventionExtra->setRevenue(8);
  1968.                         $interventionExtra->setTariffOut(false);
  1969.                         break;
  1970.                     case 'wrong_release':
  1971.                         $interventionExtra->setHours(null);
  1972.                         $interventionExtra->setCost(-5);
  1973.                         $interventionExtra->setRevenue(-5);
  1974.                         $interventionExtra->setTariffOut(false);
  1975.                         break;
  1976.                     case 'sunday_on_call':
  1977.                         $interventionExtra->setHours(null);
  1978.                         $interventionExtra->setCost(70);
  1979.                         $interventionExtra->setRevenue(120);
  1980.                         $interventionExtra->setTariffOut(false);
  1981.                         break;
  1982.                     default: break;
  1983.                 }
  1984.                 
  1985.                 if($this->getUser()->getAccountTypology() == 'agency' || $this->getUser()->getAccountTypology() == 'warehouse'){
  1986.                     $interventionExtra->setManaged(true);
  1987.                     $interventionExtra->setApproved(true);
  1988.                 }
  1989.                 else{
  1990.                     $interventionExtra->setManaged(false);
  1991.                     $interventionExtra->setApproved(null);
  1992.                 }
  1993.                 $em->persist($interventionExtra);
  1994.                 $em->flush();
  1995.                 $this->addFlash('notice_success'"Nuovo extra inserito!");
  1996.                 return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
  1997.             }
  1998.             else{
  1999.                 $session->set('openModalExtraNew'true);
  2000.             }
  2001.         }
  2002.         
  2003.         $formExtraEdit $formFactory->createNamed("form_intervention_extra_edit"InterventionExtraType::class, $interventionExtra, array('ticketId' => $ticket->getId(), 'choice_types' => $choiceTypes));
  2004.         $formExtraEdit->handleRequest($request);
  2005.         if($formExtraEdit->isSubmitted()){
  2006.             $valid FormValidatorService::validateInterventionExtra($validator$formExtraEdittrue$this->getUser());
  2007.             if($valid && $formExtraEdit->isValid()){
  2008.                 $interventionExtraEdit $em->getRepository('App\Entity\Slave\InterventionExtra')->findOneById($request->request->get('extraEditId'));
  2009.                 $oldFilePath $interventionExtraEdit->getFilePath();
  2010.                 $interventionExtraEdit->setIntervention($formExtraEdit->get('intervention')->getData());
  2011.                 $interventionExtraEdit->setType($formExtraEdit->get('type')->getData());
  2012.                 $interventionExtraEdit->setNotes($formExtraEdit->get('notes')->getData());
  2013.                 switch($formExtraEdit->get('type')->getData()){
  2014.                     case 'cost':
  2015.                         $interventionExtraEdit->setTariffOut(false);
  2016.                         $interventionExtraEdit->setCost($formExtraEdit->get('cost')->getData());
  2017.                         if($formExtraEdit->get('file')->getData() != null){
  2018.                             // METTO IL NUOVO
  2019.                             if($formExtraEdit->get('file')->getData()->guessExtension() == 'pdf')
  2020.                                 MediaService::uploadDocument($formExtraEdit->get('file')->getData(), $uploadDir$interventionExtra'file');
  2021.                             else
  2022.                                 MediaService::uploadImage($fs$formExtraEdit->get('file')->getData(), null$uploadDir$interventionExtraEdit'file'1001000200true);
  2023.                             // RIMUOVO IL VECCHIO FILE
  2024.                             if(str_contains($oldFilePath'.pdf'))
  2025.                                 MediaService::removeDocument($fs$oldFilePath$uploadDir);
  2026.                             else
  2027.                                 MediaService::removeImage($fs$oldFilePath$uploadDir);
  2028.                         }
  2029.                         break;
  2030.                     case 'hours':
  2031.                         $interventionExtraEdit->setTariffOut(false);
  2032.                         $interventionExtraEdit->setCost($formExtraEdit->get('cost')->getData());
  2033.                         $interventionExtraEdit->setHours($formExtraEdit->get('hours')->getData());
  2034.                         break;
  2035.                     case 'tariff_extra':
  2036.                         $interventionExtraEdit->setHours(null);
  2037.                         $interventionExtraEdit->setCost($formExtraEdit->get('cost')->getData());
  2038.                         $interventionExtraEdit->setTariffOut(false);
  2039.                         break;
  2040.                     case 'tariff_out':
  2041.                         $interventionExtraEdit->setHours(null);
  2042.                         $interventionExtraEdit->setCost($formExtraEdit->get('cost')->getData());
  2043.                         $interventionExtraEdit->setTariffOut(true);
  2044.                         break;
  2045.                     case 'nexi_business':
  2046.                         $interventionExtraEdit->setHours(null);
  2047.                         $interventionExtraEdit->setCost(2);
  2048.                         $interventionExtraEdit->setRevenue(4);
  2049.                         $interventionExtraEdit->setTariffOut(false);
  2050.                         break;
  2051.                     case 'softpos':
  2052.                         $interventionExtraEdit->setHours(null);
  2053.                         $interventionExtraEdit->setCost(4);
  2054.                         $interventionExtraEdit->setRevenue(8);
  2055.                         $interventionExtraEdit->setTariffOut(false);
  2056.                         break;
  2057.                     case 'nbd_installation':
  2058.                         $interventionExtraEdit->setHours(null);
  2059.                         $interventionExtraEdit->setCost(5);
  2060.                         $interventionExtraEdit->setRevenue(8);
  2061.                         $interventionExtraEdit->setTariffOut(false);
  2062.                         break;
  2063.                     case 'wrong_release':
  2064.                         $interventionExtra->setHours(null);
  2065.                         $interventionExtra->setCost(-5);
  2066.                         $interventionExtra->setRevenue(-5);
  2067.                         $interventionExtra->setTariffOut(false);
  2068.                         break;
  2069.                     case 'sunday_on_call':
  2070.                         $interventionExtra->setHours(null);
  2071.                         $interventionExtra->setCost(70);
  2072.                         $interventionExtra->setRevenue(120);
  2073.                         $interventionExtra->setTariffOut(false);
  2074.                         break;
  2075.                     default: break;
  2076.                 }
  2077.                 $em->flush();
  2078.                 $this->addFlash('notice_success'"Modifiche salvate!");
  2079.                 return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
  2080.             }
  2081.             else{
  2082.                 $session->set('openModalExtraEdit'true);
  2083.                 $session->set('openModalExtraEditId'$request->request->get('extraEditId'));
  2084.             }
  2085.         }
  2086.         
  2087.         // TICKET - REMINDER
  2088.         $ticketReminder = new TicketReminder();
  2089.         $formReminderNew $formFactory->createNamed("form_reminder_new"TicketReminderType::class, $ticketReminder);
  2090.         $formReminderNew->handleRequest($request);
  2091.         if($formReminderNew->isSubmitted()){
  2092.             $valid true;
  2093.             if($valid$valid ValidationService::validateNotBlank($validator$formReminderNew->get("date"));
  2094.             if($valid$valid ValidationService::validateNotBlank($validator$formReminderNew->get("hour"));
  2095.             if($valid$valid ValidationService::validateNotBlank($validator$formReminderNew->get("minute"));
  2096.             if($valid && $formReminderNew->isValid()){
  2097.                 
  2098.                 $datetime date_create_from_format('d-m-Y H:i'$formReminderNew->get('date')->getData()->format('d-m-Y').' '.$formReminderNew->get('hour')->getData().':'.$formReminderNew->get('minute')->getData());
  2099.                 $ticketReminder->setDatetime($datetime);
  2100.                 $ticketReminder->setTicket($ticket);
  2101.                 $ticketReminder->setTechnician($this->getUser());
  2102.                 $em->persist($ticketReminder);
  2103.                 $em->flush();
  2104.                 $this->addFlash('notice_success'"Reminder ticket inserito!");
  2105.                 return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
  2106.             }
  2107.             else{
  2108.                 $session->set('openModalReminderNew'true);
  2109.             }
  2110.         }
  2111.         
  2112.         $formReminderEdit $formFactory->createNamed("form_reminder_edit"TicketReminderType::class, $ticketReminder);
  2113.         $formReminderEdit->handleRequest($request);
  2114.         if($formReminderEdit->isSubmitted()){
  2115.             $valid true;
  2116.             if($valid$valid ValidationService::validateNotBlank($validator$formReminderEdit->get("date"));
  2117.             if($valid$valid ValidationService::validateNotBlank($validator$formReminderEdit->get("hour"));
  2118.             if($valid$valid ValidationService::validateNotBlank($validator$formReminderEdit->get("minute"));
  2119.             if($valid && $formReminderEdit->isValid()){
  2120.                 
  2121.                 $reminder $em->getRepository('App\Entity\Slave\TicketReminder')->findOneById($formReminderEdit->get('id')->getData());
  2122.                 $datetime date_create_from_format('d-m-Y H:i'$formReminderEdit->get('date')->getData()->format('d-m-Y').' '.$formReminderEdit->get('hour')->getData().':'.$formReminderEdit->get('minute')->getData());
  2123.                 $reminder->setDatetime($datetime);
  2124.                 $reminder->setDetails($formReminderEdit->get('details')->getData());
  2125.                 $em->flush();
  2126.                 $this->addFlash('notice_success'"Modifiche salvate!");
  2127.                 return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
  2128.             }
  2129.             else{
  2130.                 $session->set('openModalReminderEdit'true);
  2131.                 $session->set('openModalReminderEditId'$formReminderEdit->get('id')->getData());
  2132.             }
  2133.         }
  2134.         $technicians = array();
  2135.         if($ticket->getZip() != null){
  2136.             $zip $emMaster->getRepository('App\Entity\Master\Zip')->findOneBy(array('code' => $ticket->getClient()->getZip()));
  2137.             $allTechs $em->getRepository('App\Entity\Slave\User')->findTechniciansActive();
  2138.             foreach($allTechs as $t){
  2139.                 $supplier false;
  2140.                 $area false;
  2141.                 $tmp = array();
  2142.                 $autoAssignSuppliersIds = array();
  2143.                 foreach($t->getAutoAssignSuppliers() as $supplier)
  2144.                     array_push($autoAssignSuppliersIds$supplier->getId());
  2145.                         
  2146.                 if(in_array($ticket->getOperation()->getSupplier()->getId(), $autoAssignSuppliersIds))
  2147.                     $supplier true;
  2148.                 foreach($t->getTechnicianAreas() as $ta){
  2149.                     $zips = array();
  2150.                     foreach($ta->getZips() as $arrayZip){
  2151.                         array_push($zips$arrayZip[1]);
  2152.                     }
  2153.                     if($ticket->getClient()->getIdProvince() == $ta->getIdProvince() && ($ta->isAllZip() || in_array($ticket->getClient()->getZip(), $zips)))
  2154.                         $area true;
  2155.                 }
  2156.                 
  2157.                 array_push($tmp$t$supplier$area);
  2158.                 array_push($technicians$tmp);
  2159.             }
  2160.         }
  2161.         if($this->getUser()->getAccountTypology() == 'agency' || $this->getUser()->getAccountTypology() == 'warehouse'){
  2162.             
  2163.             // TICKET - MODIFICA OPERAZIONE
  2164.             $formOperationEdit $formFactory->createNamed("form_operation"TicketOperationType::class, $ticket, array('supplierId' => $ticket->getSupplier()->getId()));
  2165.             $formOperationEdit->handleRequest($request);
  2166.             if($formOperationEdit->isSubmitted()){
  2167.                 $valid ValidationService::validateNotBlank($validator$formOperationEdit->get("operation"));
  2168.                 if($valid && $formOperationEdit->isValid()){
  2169.                    
  2170.                     $error TicketService::ticketAssignOperationTariffAmount($em$emMaster$ticket);
  2171.                     if($error){
  2172.                         $this->addFlash('notice_warning'"Nessuna tariffa trovata per questa operazione!");
  2173.                         return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
  2174.                     }
  2175.                     $em->flush();
  2176.                     $this->addFlash('notice_success'"Operazione aggiornata!");
  2177.                     return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
  2178.                 }
  2179.                 else{
  2180.                     $session->set('openModalOperationEdit'true);
  2181.                 }
  2182.             }
  2183.             // TICKET - MODIFICA TARIFFE ASSEGNATA
  2184.             $operationTariffId null;
  2185.             if($ticket->getOperationTariffAmount() != null)
  2186.                 $operationTariffId $ticket->getOperationTariffAmount()->getTariff()->getId();
  2187.             else{
  2188.                 foreach($ticket->getOperation()->getTariffs() as $tar){
  2189.                     $zips = array();
  2190.                     foreach($tar->getZips() as $arrayZip)
  2191.                         array_push($zips$arrayZip[1]);
  2192.                     if($tar->getIdProvince() == $ticket->getIdProvince() && ($tar->isAllZip() || in_array($ticket->getZip(), $zips))){
  2193.                         $operationTariffId $tar->getId();
  2194.                         break;
  2195.                     }
  2196.                 }
  2197.             }
  2198.             $uavOperationTariffId null;
  2199.             if($ticket->getUAVOperationTariffAmount() != null)
  2200.                 $uavOperationTariffId $ticket->getUAVOperationTariffAmount()->getTariff()->getId();
  2201.             else{
  2202.                 foreach($ticket->getSupplier()->getUavOperation()->getTariffs() as $tar){
  2203.                     $zips = array();
  2204.                     foreach($tar->getZips() as $arrayZip)
  2205.                         array_push($zips$arrayZip[1]);
  2206.                     if($tar->getIdProvince() == $ticket->getIdProvince() && ($tar->isAllZip() || in_array($ticket->getZip(), $zips))){
  2207.                         $uavOperationTariffId $tar->getId();
  2208.                         break;
  2209.                     }
  2210.                 }
  2211.             }
  2212.             $formOperationTariffAmount $formFactory->createNamed("form_operation_tariff_amount"TicketOperationTariffAmountType::class, $ticket, array('operationTariffId' => $operationTariffId'uavOperationTariffId' => $uavOperationTariffId));
  2213.             $formOperationTariffAmount->handleRequest($request);
  2214.             if($formOperationTariffAmount->isSubmitted()){
  2215.                 $valid true;
  2216.                 if($valid$valid ValidationService::validateNotBlank($validator$formOperationTariffAmount->get('operationTariffAmount'));
  2217.                 if($valid$valid ValidationService::validateNotBlank($validator$formOperationTariffAmount->get('uavOperationTariffAmount'));
  2218.                 
  2219.                 if($valid && $formOperationTariffAmount->isValid()){
  2220.                     $amountTechnician "0.00";
  2221.                     $uavAmountTechnician "0.00";
  2222.                     $ota $em->getRepository('App\Entity\Slave\OperationTariffAmount')->findOneById($formOperationTariffAmount->get('operationTariffAmount')->getData());
  2223.                     $uavOta $em->getRepository('App\Entity\Slave\OperationTariffAmount')->findOneById($formOperationTariffAmount->get('uavOperationTariffAmount')->getData());
  2224.                     $ticket->setOperationTariffAmount($ota);
  2225.                     $ticket->setUavOperationTariffAmount($uavOta);
  2226.                     // Cerco i prezzi tecnico delle nuove tariffe
  2227.                     foreach($ota->getTechnicianAreas() as $jttaota){
  2228.                         if($jttaota->getTechnicianArea()->getUser()->getId() == $ticket->getTechnician()->getId()){
  2229.                             $amountTechnician $jttaota->getAmount();
  2230.                             break;
  2231.                         }
  2232.                     }
  2233.                     foreach($uavOta->getTechnicianAreas() as $uavJttaota){
  2234.                         if($uavJttaota->getTechnicianArea()->getUser()->getId() == $ticket->getTechnician()->getId()){
  2235.                             $uavAmountTechnician $uavJttaota->getAmount();
  2236.                             break;
  2237.                         }
  2238.                     }
  2239.                     // Aggiorno i prezzi
  2240.                     foreach($ticket->getInterventions() as $i){
  2241.                         switch($i->getOutcomeType()->getSlug()){
  2242.                             case 'completed':
  2243.                                 $i->setAmount($ota->getAmount());
  2244.                                 $i->setAmountTechnician($amountTechnician);
  2245.                                 break;
  2246.                             case 'empty':
  2247.                                 $i->setAmount($uavOta->getAmount());
  2248.                                 $i->setAmountTechnician($uavAmountTechnician);
  2249.                                 break;
  2250.                             default: break;
  2251.                         }
  2252.                     }
  2253.     
  2254.                     $em->flush();
  2255.                     $this->addFlash('notice_success'"Tariffa aggiornata!");
  2256.                     return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
  2257.                 }
  2258.                 else{
  2259.                     $ticket $em->getRepository("App\Entity\Slave\Ticket")->findOneById($ticketId);
  2260.                     $session->set('openModalTariff'true);
  2261.                 }
  2262.             }
  2263.             // TICKET - ERRORI - FORNITORE
  2264.             $formErrorSupplier $formFactory->createNamed("form_error_supplier"TicketErrorSupplierType::class, $ticket);
  2265.             $formErrorSupplier->handleRequest($request);
  2266.             if($formErrorSupplier->isSubmitted()){
  2267.                 
  2268.                 $valid ValidationService::validateNotBlank($validator$formErrorSupplier->get("supplier"));
  2269.                 if($valid && $formErrorSupplier->isValid()){
  2270.                     $ticket->setOperation($formErrorSupplier->get("supplier")->getData()->getOperationMaintenance());
  2271.                     $em->flush();
  2272.                     $error true;
  2273.                     if($ticket->getClient()) $error TicketService::ticketMapClient($em$ticket);
  2274.                     if(!$error$error TicketService::ticketMapColumns($em$emMaster$company$ticket);
  2275.                     if(!$errorTicketService::ticketAutoAssign($em$emMaster$this->getUser(), $ticket$mailer);
  2276.                     if(!$error){
  2277.                         $ticket->setSystemError(false);
  2278.                         $ticket->setSystemErrorDetails(null);
  2279.                     }
  2280.                     $em->flush();
  2281.                     $this->addFlash('notice_success'"Ticket aggiornato!");
  2282.                     return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
  2283.                 }
  2284.             }
  2285.             // TICKET - ERRORI - OPERAZIONE
  2286.             $supplierId 0;
  2287.             if($ticket->getSupplier() != null)
  2288.                 $supplierId $ticket->getSupplier()->getId();
  2289.             
  2290.             $formErrorOperation $formFactory->createNamed("form_error_operation"TicketErrorOperationType::class, $ticket, array('supplierId' => $supplierId));
  2291.             $formErrorOperation->handleRequest($request);
  2292.             if($formErrorOperation->isSubmitted()){
  2293.                 
  2294.                 $valid ValidationService::validateNotBlank($validator$formErrorOperation->get("operation"));
  2295.                 if($valid && $formErrorOperation->isValid()){
  2296.                     $em->flush();
  2297.                     if($ticket->getClient())
  2298.                         $error TicketService::ticketMapClient($em$ticket);
  2299.                     if(!$error$error TicketService::ticketMapColumns($em$emMaster$company$ticket);
  2300.                     if(!$errorTicketService::ticketAutoAssign($em$emMaster$this->getUser(), $ticket$mailer);
  2301.                     if(!$error){
  2302.                         $ticket->setSystemError(false);
  2303.                         $ticket->setSystemErrorDetails(null);
  2304.                     }
  2305.                     $em->flush();
  2306.                     $this->addFlash('notice_success'"Ticket aggiornato!");
  2307.                     return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
  2308.                 }
  2309.             }
  2310.                         
  2311.             // TICKET - ERRORI - CHIAVI COLONNE
  2312.             $formErrorKeyMapping $formFactory->createNamed("form_operation_keys_mapping"OperationKeysMappingType::class, $ticket->getOperation());
  2313.             $formErrorKeyMapping->handleRequest($request);
  2314.             if($formErrorKeyMapping->isSubmitted()){
  2315.                 $valid true;
  2316.                 foreach($formErrorKeyMapping->get('keyMappings') as $keyMapping){
  2317.                     if($valid && $keyMapping->get('keyRequired')->getData()) $valid ValidationService::validateNotBlank($validator$keyMapping->get('mappingValue'));
  2318.                 }
  2319.                 if($valid && $formErrorKeyMapping->isValid()){
  2320.                     $em->flush();
  2321.                     $operationTickets $em->getRepository('App\Entity\Slave\Ticket')->findByOperationAndSystemError($ticket->getOperation(), true);
  2322.                     foreach($operationTickets as $ot){
  2323.                         $error TicketService::ticketMapColumns($em$emMaster$company$ot);
  2324.                         if(!$error$error TicketService::ticketAssignOperationTariffAmount($em$emMaster$ot);
  2325.                         if(!$errorTicketService::ticketAutoAssign($em$emMaster$this->getUser(), $ot$mailer);
  2326.                         if(!$error){
  2327.                             $ot->setSystemError(false);
  2328.                             $ot->setSystemErrorDetails(null);
  2329.                         }
  2330.                     }
  2331.                     $em->flush();
  2332.                     $this->addFlash('notice_success'"Mappatura campi ticket aggiornata!");
  2333.                     return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
  2334.                 }
  2335.             }
  2336.             // TICKET - ERRORI - MODIFICA PROVINCIA
  2337.             $formErrorProvince $formFactory->createNamed("form_error_province"TicketErrorProvinceType::class, $ticket);
  2338.             $formErrorProvince->handleRequest($request);
  2339.             if($formErrorProvince->isSubmitted()){
  2340.                 $valid ValidationService::validateNotBlank($validator$formErrorProvince->get('idProvince'));
  2341.                 if($formErrorProvince->isValid() && $valid){
  2342.                     $ticket->setIdProvince($formErrorProvince->get('idProvince')->getData()->getId());
  2343.                     $error TicketService::ticketAssignOperationTariffAmount($em$emMaster$ticket);
  2344.                     if(!$errorTicketService::ticketAutoAssign($em$emMaster$this->getUser(), $ticket$mailer);
  2345.                     if(!$error){
  2346.                         $ticket->setSystemError(false);
  2347.                         $ticket->setSystemErrorSlug(null);
  2348.                     }
  2349.                     $em->flush();
  2350.                     $this->addFlash('notice_success'"Provincia ticket aggiornata!");
  2351.                     return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
  2352.                 }
  2353.             }
  2354.             // TICKET - ERRORI - MODIFICA INDIRIZZO
  2355.             $formErrorAddress $formFactory->createNamed("form_error_address"TicketErrorAddressType::class, $ticket);
  2356.             $formErrorAddress->handleRequest($request);
  2357.             if($formErrorAddress->isSubmitted()){
  2358.                 if($formErrorAddress->isValid()){
  2359.                     $city $emMaster->getRepository('App\Entity\Master\City')->findOneById($formErrorAddress->get('cityId')->getData());
  2360.                     $zip $emMaster->getRepository('App\Entity\Master\Zip')->findOneById($formErrorAddress->get('zip')->getData());
  2361.                     $ticket->setIdCity($city->getId());
  2362.                     $ticket->setIdProvince($city->getProvince()->getId());
  2363.                     $ticket->setZip($zip->getCode());
  2364.                     $ticket->setSystemError(false);
  2365.                     $ticket->setSystemErrorDetails(null);
  2366.                     
  2367.                     $error TicketService::ticketAssignOperationTariffAmount($em$emMaster$ticket);
  2368.                     if(!$errorTicketService::ticketAutoAssign($em$emMaster$this->getUser(), $ticket$mailer);
  2369.                     if(!$error){
  2370.                         $ticket->setSystemError(false);
  2371.                         $ticket->setSystemErrorSlug(null);
  2372.                     }
  2373.                     $em->flush();
  2374.                     $this->addFlash('notice_success'"Indirizzo ticket aggiornato!");
  2375.                     return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
  2376.                 }
  2377.             }
  2378.             // TICKET - DATA SCADENZA - MODIFICA
  2379.             $formExpirationDatetimeEdit $formFactory->createNamed("form_expiration_edit"TicketExpirationEditType::class, $ticket);
  2380.             $formExpirationDatetimeEdit->handleRequest($request);
  2381.             if($formExpirationDatetimeEdit->isSubmitted()){
  2382.                 $valid true;
  2383.                 if($valid$valid ValidationService::validateNotBlank($validator$formExpirationDatetimeEdit->get("date"));
  2384.                 if($valid$valid ValidationService::validateNotBlank($validator$formExpirationDatetimeEdit->get("timeHour"));
  2385.                 if($valid$valid ValidationService::validateNotBlank($validator$formExpirationDatetimeEdit->get("timeMinute"));
  2386.                 if($valid && $formExpirationDatetimeEdit->isValid()){
  2387.                     $datetime date_create_from_format("d-m-Y H:i"$formExpirationDatetimeEdit->get('date')->getData()->format('d-m-Y').' '.$formExpirationDatetimeEdit->get('timeHour')->getData().':'.$formExpirationDatetimeEdit->get('timeMinute')->getData());
  2388.                     $ticket->setDatetimeExpiration($datetime);
  2389.                     $em->flush();
  2390.                     $this->addFlash('notice_success'"Data scadenza aggiornata!");
  2391.                     return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
  2392.                 }
  2393.             }
  2394.             
  2395.             // TICKET - LETTERA DI VETTURA - MODIFICA
  2396.             $formWaybillEdit $formFactory->createNamed("form_waybill_edit"TicketWaybillEditType::class, $ticket);
  2397.             $formWaybillEdit->handleRequest($request);
  2398.             if($formWaybillEdit->isSubmitted()){
  2399.                 if($formWaybillEdit->isValid()){
  2400.                     $em->flush();
  2401.                     $this->addFlash('notice_success'"Lettera di vettura aggiornata!");
  2402.                     return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
  2403.                 }
  2404.             }
  2405.             // TICKET - NOTE - MODIFICA
  2406.             $formNotesEdit $formFactory->createNamed("form_notes_edit"TicketNotesEditType::class, $ticket);
  2407.             $formNotesEdit->handleRequest($request);
  2408.             if($formNotesEdit->isSubmitted()){
  2409.                 if($formNotesEdit->isValid()){
  2410.                     $em->flush();
  2411.                     $this->addFlash('notice_success'"Note aggiornate!");
  2412.                     return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
  2413.                 }
  2414.             }
  2415.             // TICKET - SOSPENSIONE - MODIFICA
  2416.             $formSusEdit $formFactory->createNamed("form_suspension_edit"TicketSuspensionEditType::class, $suspension);
  2417.             $formSusEdit->handleRequest($request);
  2418.             if($formSusEdit->isSubmitted()){
  2419.                 $valid true;
  2420.                 if($valid$valid ValidationService::validateNotBlank($validator$formSusEdit->get("dateFrom"));
  2421.                 if($valid$valid ValidationService::validateNotBlank($validator$formSusEdit->get("timeFromHour"));
  2422.                 if($valid$valid ValidationService::validateNotBlank($validator$formSusEdit->get("timeFromMinute"));
  2423.                 if($valid$valid ValidationService::validateNotBlank($validator$formSusEdit->get("dateTo"));
  2424.                 if($valid$valid ValidationService::validateNotBlank($validator$formSusEdit->get("timeToHour"));
  2425.                 if($valid$valid ValidationService::validateNotBlank($validator$formSusEdit->get("timeToMinute"));
  2426.                 if($valid && $formSusEdit->isValid()){
  2427.                     $sus $em->getRepository('App\Entity\Slave\TicketSuspension')->findOneById($formSusEdit->get('id')->getData());
  2428.                     $datetimeFrom date_create_from_format("d-m-Y H:i"$formSusEdit->get('dateFrom')->getData()->format('d-m-Y').' '.$formSusEdit->get('timeFromHour')->getData().':'.$formSusEdit->get('timeFromMinute')->getData());
  2429.                     $datetimeTo date_create_from_format("d-m-Y H:i"$formSusEdit->get('dateTo')->getData()->format('d-m-Y').' '.$formSusEdit->get('timeToHour')->getData().':'.$formSusEdit->get('timeToMinute')->getData());
  2430.                     $sus->setDatetimeFrom($datetimeFrom);
  2431.                     $sus->setDatetimeTo($datetimeTo);
  2432.                     $em->flush();
  2433.                     $this->addFlash('notice_success'"Date sospensione aggiornate!");
  2434.                     return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
  2435.                 }
  2436.             }
  2437.             
  2438.             // TICKET - SOSPENSIONE - APPROVARE/NON APPROVARE
  2439.             $formSusApprove $formFactory->createNamed("form_suspension_approve"TicketSuspensionApproveType::class, $suspension);
  2440.             $formSusApprove->handleRequest($request);
  2441.             if($formSusApprove->isSubmitted()){
  2442.                 $valid true;
  2443.                 if($formSusApprove->get("isApproved")->getData() == false$valid ValidationService::validateNotBlank($validator$formSusApprove->get("refuseMotivation"));
  2444.                 if($valid && $formSusApprove->isValid()){
  2445.                     $sus $em->getRepository('App\Entity\Slave\TicketSuspension')->findOneById($formSusApprove->get('id')->getData());
  2446.                     $sus->setManaged(true);
  2447.                     $sus->setApproved($formSusApprove->get("isApproved")->getData());
  2448.                     if($sus->isApproved()){
  2449.                         $suspendedStatus $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBySlug('suspended');
  2450.                         TicketService::createTicketLog($em$this->getUser(), $ticket"cs"$ticket->getStatus(), $suspendedStatus->getValue());
  2451.                         $ticket->setStatus($suspendedStatus);
  2452.                         if($sus->getIntervention()->getOutcomeType()->getSlug() == 'suspended'){
  2453.                             $subject $this->params->get('subject_ticket_suspension_approved');
  2454.                             $template "email/ticket/suspension_approved.html.twig";
  2455.                         }
  2456.                         else{
  2457.                             $subject $this->params->get('subject_ticket_uav_approved');
  2458.                             $template "email/ticket/uav_approved.html.twig";
  2459.                         }
  2460.                         $settingUnlockSameTech $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_suspension_unlock_same_technician'));
  2461.                         if($settingUnlockSameTech->getValue() != 1){
  2462.                             TicketService::createTicketLog($em$this->getUser(), $ticket"ct"$ticket->getTechnician(), null);
  2463.                             $ticket->setTechnician(null);
  2464.                         }
  2465.                     }
  2466.                     else{
  2467.                         $assignedStatus $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBySlug('assigned');
  2468.                         TicketService::createTicketLog($em$this->getUser(), $ticket"cs"$ticket->getStatus(), $assignedStatus->getValue());
  2469.                         $ticket->setStatus($assignedStatus);
  2470.                         $sus->setRefuseMotivation($formSusApprove->get("refuseMotivation")->getData());
  2471.                         $sus->setUnlocked(1);
  2472.                         $sus->setDatetimeTo(new \Datetime());
  2473.                         $sus->getIntervention()->setBillable(false);
  2474.                         if($sus->getIntervention()->getOutcomeType()->getSlug() == 'suspended'){
  2475.                             $subject $this->params->get('subject_ticket_suspension_not_approved');
  2476.                             $template "email/ticket/suspension_not_approved.html.twig";
  2477.                         }
  2478.                         else{
  2479.                             $subject $this->params->get('subject_ticket_uav_not_approved');
  2480.                             $template "email/ticket/uav_not_approved.html.twig";
  2481.                         }
  2482.                     }
  2483.                     $em->flush();
  2484.                     
  2485.                     $message = (new TemplatedEmail())
  2486.                         ->subject($subject.' '.$ticket->getNumber())
  2487.                         ->from($this->params->get('email_noreply'))
  2488.                         ->to($sus->getIntervention()->getTechnician()->getEmail())
  2489.                         ->htmlTemplate($template)
  2490.                         ->context(['company' => $company'ticket' => $ticket'suspension' => $sus]);
  2491.                     $mailer->send($message);
  2492.                     $this->addFlash('notice_success'"Stato sospensione aggiornato!");
  2493.                     return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
  2494.                 }
  2495.                 else{                    
  2496.                     $session->set('openModalSuspensionApprove'true);
  2497.                     $session->set('openModalSuspensionApproveId'$formSusApprove->get('id')->getData());
  2498.                     $session->set('openModalSuspensionApproveIs'$formSusApprove->get('isApproved')->getData());
  2499.                 }
  2500.             }
  2501.                         
  2502.             // INTERVENTO - MODIFICA % FUORI SLA E MESE DI FATTURAZIONE
  2503.             $intervention = new Intervention();
  2504.             $formInterventionSla $formFactory->createNamed("form_intervention_sla"InterventionSlaType::class, $intervention);
  2505.             $formInterventionSla->handleRequest($request);
  2506.             if($formInterventionSla->isSubmitted()){
  2507.                 if($formInterventionSla->isValid()){
  2508.                     $editIntervention $em->getRepository('App\Entity\Slave\Intervention')->findOneById($formInterventionSla->get('id')->getData());
  2509.                     if($formInterventionSla->get('slaOutboundPercentage')->getData() != null)
  2510.                         $editIntervention->setSlaOutboundPercentage($formInterventionSla->get('slaOutboundPercentage')->getData());
  2511.                     
  2512.                     $datetimeBilling date_create_from_format('d-m-Y H:i:s'$formInterventionSla->get('dateBilling')->getData()->format('d-m-Y').' 00:00:00');
  2513.                     $editIntervention->setDatetimeBilling($datetimeBilling);
  2514.                     
  2515.                     $em->flush();
  2516.                     $this->addFlash('notice_success'"Dati aggiornati!");
  2517.                     return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
  2518.                 }
  2519.                 else{
  2520.                     $session->set('openModalInterventionSla'true);
  2521.                     $session->set('openModalInterventionSlaId'$formInterventionSla->get('id')->getData());
  2522.                 }
  2523.             }
  2524.             // TICKET - ELIMINA
  2525.             $formDelete $formFactory->createNamed("form_ticket_delete"TicketDeleteType::class, $ticket);
  2526.             $formDelete->handleRequest($request);
  2527.             if($formDelete->isSubmitted()){
  2528.                 $valid ValidationService::validateNotBlank($validator$formDelete->get('password'));
  2529.                 if($valid && !($passwordHasher->isPasswordValid($this->getUser(), $formDelete->get('password')->getData()))){
  2530.                     $valid false;
  2531.                     $formDelete->get('password')->addError(new FormError('Password errata!'));
  2532.                 }
  2533.                 if($valid && $formDelete->isValid()){
  2534.                     
  2535.                     foreach($ticket->getInterventions() as $intervention){
  2536.                         if($intervention->getSuspension() != null)
  2537.                             $em->remove($intervention->getSuspension());
  2538.                         $em->remove($intervention);
  2539.                     }
  2540.                     
  2541.                     $this->deleteTicketAndConnectedValues($em$ticket);
  2542.                     $em->flush();
  2543.                     $this->addFlash('notice_success'"Ticket eliminato correttamente!");
  2544.                     return $this->redirectToRoute('user_ticket_list');
  2545.                 }
  2546.                 else
  2547.                     $session->set('openDeleteModal'true);
  2548.             }
  2549.             
  2550.             return $this->render('role/user/ticket/sheet.html.twig', array(
  2551.                 'company' => $company,
  2552.                 'ticket' => $ticket,
  2553.                 'cities' => $cities,
  2554.                 'technicians' => $technicians,
  2555.                 'displayJsonReport' => $displayJsonReport,
  2556.                 'settingTechUnlockSuspension' => $settingTechUnlockSuspension,
  2557.                 'settingBackOffice' => $settingBackOffice->getValue(),
  2558.                 'settingProcessedActive' => $settingProcessedActive->getValue(),
  2559.                 'settingTechnicianExchangeTickets' => $settingTechnicianExchangeTickets->getValue(),
  2560.                 'formAddressEdit' => $formAddressEdit->createView(),
  2561.                 'formClientEdit' => $formClientEdit->createView(),
  2562.                 'formDelete' => $formDelete->createView(),
  2563.                 'formErrorAddress' => $formErrorAddress->createView(),
  2564.                 'formErrorKeyMapping' => $formErrorKeyMapping->createView(),
  2565.                 'formErrorOperation' => $formErrorOperation->createView(),
  2566.                 'formErrorProvince' => $formErrorProvince->createView(),
  2567.                 'formErrorSupplier' => $formErrorSupplier->createView(),
  2568.                 'formExpirationDatetimeEdit' => $formExpirationDatetimeEdit->createView(),
  2569.                 'formNotesEdit' => $formNotesEdit->createView(),
  2570.                 'formWaybillEdit' => $formWaybillEdit->createView(),
  2571.                 'formExtraEdit' => $formExtraEdit->createView(),
  2572.                 'formExtraNew' => $formExtraNew->createView(),
  2573.                 'formInterventionSla' => $formInterventionSla->createView(),
  2574.                 'formOperationEdit' => $formOperationEdit->createView(),
  2575.                 'formOperationTariffAmount' => $formOperationTariffAmount->createView(),
  2576.                 'formSusApprove' => $formSusApprove->createView(),
  2577.                 'formSusEdit' => $formSusEdit->createView(),
  2578.                 'formSusUnlock' => $formSusUnlock->createView(),
  2579.                 'formReminderNew' => $formReminderNew->createView(),
  2580.                 'formReminderEdit' => $formReminderEdit->createView()
  2581.             ));
  2582.         }
  2583.         else{
  2584.             return $this->render('role/user/ticket/sheet.html.twig', array(
  2585.                 'company' => $company,
  2586.                 'ticket' => $ticket,
  2587.                 'cities' => $cities,
  2588.                 'technicians' => $technicians,
  2589.                 'displayJsonReport' => $displayJsonReport,
  2590.                 'settingTechUnlockSuspension' => $settingTechUnlockSuspension,
  2591.                 'settingProcessedActive' => $settingProcessedActive->getValue(),
  2592.                 'settingTechnicianExchangeTickets' => $settingTechnicianExchangeTickets->getValue(),
  2593.                 'formClientEdit' => $formClientEdit->createView(),
  2594.                 'settingBackOffice' => $settingBackOffice->getValue(),
  2595.                 'formAddressEdit' => $formAddressEdit->createView(),
  2596.                 'formSusUnlock' => $formSusUnlock->createView(),
  2597.                 'formExtraNew' => $formExtraNew->createView(),
  2598.                 'formExtraEdit' => $formExtraEdit->createView(),
  2599.                 'formReminderNew' => $formReminderNew->createView(),
  2600.                 'formReminderEdit' => $formReminderEdit->createView()
  2601.             ));
  2602.         }
  2603.     }
  2604.     /**
  2605.      * @Route("/{ticketId}/scheda/aggiorna-dati", name="user_ticket_sheet_update_data")
  2606.      * @Security("is_granted('edit', 'ticket')")
  2607.      */
  2608.     public function userTicketSheetUpdateData($ticketIdRequest $requestMailerInterface $mailer)
  2609.     {
  2610.         $em $this->mr->getManager('slave');
  2611.         $emMaster $this->mr->getManager('master');
  2612.         $session $request->getSession();
  2613.         $session->remove('ticket_id_city_alias');
  2614.         $company $emMaster->getRepository("App\Entity\Master\Company")->findOneById($session->get('companyId'));
  2615.         $ticket $em->getRepository('App\Entity\Slave\Ticket')->findOneById($ticketId);
  2616.         $operationTickets $em->getRepository('App\Entity\Slave\Ticket')->findByOperationAndSystemError($ticket->getOperation(), true);
  2617.         $toAssignStatus $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBySlug('to_assign');
  2618.         foreach($operationTickets as $ot){
  2619.             if($ot->getClient() == null)
  2620.                 $error TicketService::ticketMapClient($em$ot);
  2621.             $error TicketService::ticketMapColumns($em$emMaster$company$ot);
  2622.             if(!$error$error TicketService::ticketAssignOperationTariffAmount($em$emMaster$ot);
  2623.             if(!$errorTicketService::ticketAutoAssign($em$emMaster$this->getUser(), $ot$mailer);
  2624.             if(!$error){
  2625.                 $ot->setSystemError(false);
  2626.                 $ot->setSystemErrorDetails(null);
  2627.                 TicketService::createTicketLog($em$this->getUser(), $ticket"cs"$ticket->getStatus(), $toAssignStatus->getValue());
  2628.                 $ot->setStatus($toAssignStatus);
  2629.             }
  2630.         }
  2631.         $em->flush();
  2632.         $this->addFlash('notice_success'"Dati aggiornati");
  2633.         return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
  2634.     }
  2635.     /**
  2636.      * @Route("/{ticketId}/reindirizza-configurazione-alias-citta", name="user_ticket_redirect_alias_city")
  2637.      * @Security("is_granted('edit', 'ticket')")
  2638.      */
  2639.     public function userTicketRedirectAliasCity($ticketIdRequest $request)
  2640.     {    
  2641.         $em $this->mr->getManager('slave');
  2642.         $session $request->getSession();
  2643.         $ticket $em->getRepository('App\Entity\Slave\Ticket')->findOneById($ticketId);
  2644.         $keysRequired $em->getRepository('App\Entity\Slave\OperationKeyMapping')->findByOperationAndRequired($ticket->getOperation()->getId(), true);
  2645.         foreach($keysRequired as $k){
  2646.             foreach(json_decode($ticket->getJson(), true) as $val){
  2647.                 if(array_key_exists($k->getMappingValue(), $val)){
  2648.                     switch($k->getTicketColumn()){
  2649.                         case 'Città'$cityName $val[$k->getMappingValue()]; break;
  2650.                         default: break;
  2651.                     }
  2652.                 }
  2653.                 else{
  2654.                     $altKey $k->displayMappingExtraValue("alt_key");
  2655.                     if(array_key_exists($altKey$val)){
  2656.                         switch($k->getTicketColumn()){
  2657.                             case 'Città'$cityName $val[$altKey]; break;
  2658.                             default: break;
  2659.                         }
  2660.                     }
  2661.                 }
  2662.             }
  2663.         }
  2664.                         
  2665.         $session->set('city_alias_value'$cityName);
  2666.         $session->set('ticket_id_city_alias'$ticket->getId());
  2667.         return $this->redirectToRoute('user_configuration_city_aliases');
  2668.     }
  2669.     
  2670.     /**
  2671.      * @Route("/{ticketId}/reindirizza-fornitore-operazione", name="user_ticket_redirect_supplier_operation")
  2672.      * @Security("is_granted('edit', 'ticket')")
  2673.      */
  2674.     public function userTicketRedirectSupplierOperation($ticketIdRequest $request)
  2675.     {    
  2676.         $em $this->mr->getManager('slave');
  2677.         $session $request->getSession();
  2678.         $ticket $em->getRepository('App\Entity\Slave\Ticket')->findOneById($ticketId);
  2679.         $session->set('supplierId'$ticket->getSupplier()->getId());
  2680.         $session->set('operationId'$ticket->getOperation()->getId());
  2681.         return $this->redirectToRoute('user_anagraphic_supplier_operation_sheet', array('operationId' => $ticket->getOperation()->getId()));
  2682.     }
  2683.     /**
  2684.      * @Route("/fatturabile", name="user_ticket_billable")
  2685.      * @Security("is_granted('edit', 'ticket')")
  2686.      */
  2687.     public function userTicketBillable(Request $request)
  2688.     {    
  2689.         $em $this->mr->getManager('slave');
  2690.         $ticket $em->getRepository("App\Entity\Slave\Ticket")->findOneById($request->request->get("ticketId"));
  2691.         $ticket->setBillable(!$ticket->isBillable());
  2692.         $em->flush();
  2693.         $text 'non fatturabile';
  2694.         if($ticket->isBillable())
  2695.             $text 'da fatturare';
  2696.         $this->addFlash('notice_success'"Ticket reso ".$text."!");
  2697.         return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
  2698.     }
  2699.     /**
  2700.      * @Route("/processato", name="user_ticket_processed")
  2701.      * @Security("is_granted('edit', 'ticket')")
  2702.      */
  2703.     public function userTicketProcessed(Request $request)
  2704.     {    
  2705.         $em $this->mr->getManager('slave');
  2706.         $ticket $em->getRepository("App\Entity\Slave\Ticket")->findOneById($request->request->get("ticketId"));
  2707.         $ticket->setProcessed(!$ticket->isProcessed());
  2708.         $em->flush();
  2709.         $text 'normale';
  2710.         if($ticket->isProcessed())
  2711.             $text 'processato';
  2712.         $this->addFlash('notice_success'"Ticket reso ".$text."!");
  2713.         return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
  2714.     }    
  2715.     
  2716.     /**
  2717.      * @Route("/intervento/non-fatturabile", name="user_ticket_intervention_not_billable")
  2718.      * @Security("is_granted('edit', 'ticket')")
  2719.      */
  2720.     public function userTicketInterventionNotBillable(Request $request)
  2721.     {    
  2722.         $em $this->mr->getManager('slave');
  2723.         $intervention $em->getRepository("App\Entity\Slave\Intervention")->findOneById($request->request->get("interventionId"));
  2724.         $intervention->setBillable(!$intervention->isBillable());
  2725.         $em->flush();
  2726.         $text 'non fatturabile';
  2727.         if($intervention->isBillable())
  2728.             $text 'da fatturare';
  2729.         $this->addFlash('notice_success'"Intervento reso ".$text."!");
  2730.         return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $intervention->getTicket()->getId()));
  2731.     }
  2732.     
  2733.     /**
  2734.      * @Route("/intervento-extra/elimina", name="user_ticket_intervention_extra_delete")
  2735.      * @Security("is_granted('edit', 'ticket')")
  2736.      */
  2737.     public function userTicketInterventionExtraDelete(Request $request)
  2738.     {    
  2739.         $em $this->mr->getManager('slave');
  2740.         $interventionExtra $em->getRepository("App\Entity\Slave\InterventionExtra")->findOneById($request->request->get("interventionExtraDelId"));
  2741.         $ticketId $interventionExtra->getIntervention()->getTicket()->getId();
  2742.         $em->remove($interventionExtra);
  2743.         $em->flush();
  2744.         $this->addFlash('notice_success'"Extra ticket eliminato");
  2745.         return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticketId));
  2746.     }
  2747.     
  2748.     /**
  2749.      * @Route("/promemoria/elimina", name="user_ticket_reminder_delete")
  2750.      * @Security("is_granted('edit', 'ticket')")
  2751.      */
  2752.     public function userTicketReminderDelete(Request $request)
  2753.     {    
  2754.         $em $this->mr->getManager('slave');
  2755.         $ticketReminder $em->getRepository("App\Entity\Slave\TicketReminder")->findOneById($request->request->get("reminderDelId"));
  2756.         $ticketId $ticketReminder->getTicket()->getId();
  2757.         $em->remove($ticketReminder);
  2758.         $em->flush();
  2759.         $this->addFlash('notice_success'"Reminder ticket eliminato");
  2760.         return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticketId));
  2761.     }
  2762.     
  2763.     /**
  2764.      * @Route("/intervento-extra/invia-approva", name="user_ticket_intervention_extra_send_approve")
  2765.      * @Security("is_granted('edit', 'ticket')")
  2766.      */
  2767.     public function userTicketInterventionExtraSendApprove(Request $request)
  2768.     {    
  2769.         $em $this->mr->getManager('slave');
  2770.         $interventionExtra $em->getRepository("App\Entity\Slave\InterventionExtra")->findOneById($request->request->get("interventionExtraId"));
  2771.         $interventionExtra->setManaged(true);
  2772.         if($request->request->get('interventionExtraStatus') == 'approve')
  2773.             $interventionExtra->setApproved(true);
  2774.         else
  2775.             $interventionExtra->setApproved(false);
  2776.         $em->flush();
  2777.         $this->addFlash('notice_success'"Extra ticket aggiornato");
  2778.         return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $interventionExtra->getIntervention()->getTicket()->getId()));
  2779.     }
  2780.     // AZIONI AGENZIA
  2781.     /**
  2782.      * @Route("/scheda/tecnico-assegna", name="user_ticket_technician_assign")
  2783.      * @Security("is_granted('edit', 'ticket')")
  2784.      */
  2785.     public function userTicketTechnicianAssign(Request $requestMailerInterface $mailer)
  2786.     {    
  2787.         $em $this->mr->getManager('slave');
  2788.         $technician $em->getRepository("App\Entity\Slave\User")->findOneById($request->request->get('technicianId'));
  2789.         $ticket $em->getRepository("App\Entity\Slave\Ticket")->findOneById($request->request->get('ticketId'));
  2790.         $statusAssigned $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'assigned'));
  2791.         $settingTechnicianSendAssignEmail $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_technician_send_assign_email'));
  2792.         
  2793.         // Notifico il vecchio tecnico se impostazione attiva
  2794.         $oldTechnician $ticket->getTechnician();
  2795.         $settingSendEmail $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_technician_send_cancel_email'));
  2796.         if($oldTechnician != null && $settingSendEmail->getValue() == 1){
  2797.             $message = (new TemplatedEmail())
  2798.                 ->subject($this->params->get('subject_ticket_canceled').' '.$ticket->getNumber())
  2799.                 ->from($this->params->get('email_noreply'))
  2800.                 ->to($oldTechnician->getEmail())
  2801.                 ->htmlTemplate('email/ticket/canceled.html.twig')
  2802.                 ->context(['technician' => $oldTechnician'ticket' => $ticket]);
  2803.             $mailer->send($message);
  2804.         }
  2805.         TicketService::createTicketLog($em$this->getUser(), $ticket"ct"$ticket->getTechnician(), $technician);
  2806.         $ticket->setTechnician($technician);
  2807.         $statusAssigned $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBySlug('assigned');
  2808.         TicketService::createTicketLog($em$this->getUser(), $ticket"cs"$ticket->getStatus(), $statusAssigned->getValue());
  2809.         $ticket->setStatus($statusAssigned);
  2810.         $em->flush();
  2811.         // Invio messaggio di notifica al tecnico
  2812.         if($settingTechnicianSendAssignEmail->getValue() == && $ticket->getTechnician()->isAssignEmailActive()){
  2813.             $tickets = [];
  2814.             array_push($tickets$ticket);
  2815.             $message = (new TemplatedEmail())
  2816.                 ->subject($this->params->get('subject_ticket_take_charge'))
  2817.                 ->from($this->params->get('email_noreply'))
  2818.                 ->to($ticket->getTechnician()->getEmail())
  2819.                 ->htmlTemplate('email/technician/tickets_assigned.html.twig')
  2820.                 ->context(['user' => $ticket->getTechnician(), 'tickets' => $tickets]);
  2821.             $mailer->send($message);
  2822.         }
  2823.         $this->addFlash('notice_success'"Ticket assegnato");
  2824.         if($this->getUser()->getAccountTypology() == "technician")
  2825.             return $this->redirectToRoute('user_ticket_list');
  2826.         else
  2827.             return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
  2828.     }
  2829.     /**
  2830.      * @Route("/scheda/cancella", name="user_ticket_cancel")
  2831.      * @Security("is_granted('edit', 'ticket')")
  2832.      */
  2833.     public function userTicketCancel(Request $requestMailerInterface $mailer)
  2834.     {    
  2835.         $em $this->mr->getManager('slave');
  2836.         $ticket $em->getRepository("App\Entity\Slave\Ticket")->findOneById($request->request->get('ticketId'));
  2837.         $statusCanceled $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'canceled'));
  2838.         // Notifico il tecnico se impostazione attiva
  2839.         $settingSendEmail $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_technician_send_cancel_email'));
  2840.         if($settingSendEmail->getValue() == && $ticket->getTechnician() != null && ($ticket->getStatus()->getSlug() != 'closed' && $ticket->getStatus()->getSlug() != 'closed_portal')){
  2841.             $message = (new TemplatedEmail())
  2842.                 ->subject($this->params->get('subject_ticket_canceled').' '.$ticket->getNumber())
  2843.                 ->from($this->params->get('email_noreply'))
  2844.                 ->to($ticket->getTechnician()->getEmail())
  2845.                 ->htmlTemplate('email/ticket/canceled.html.twig')
  2846.                 ->context(['technician' => $ticket->getTechnician(), 'ticket' => $ticket]);
  2847.             $mailer->send($message);
  2848.         }
  2849.         TicketService::createTicketLog($em$this->getUser(), $ticket"cs"$ticket->getStatus(), $statusCanceled->getValue());
  2850.         $ticket->setStatus($statusCanceled);
  2851.         $em->flush();
  2852.         $this->addFlash('notice_success'"Ticket annullato");
  2853.         return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
  2854.     }
  2855.     
  2856.     /**
  2857.      * @Route("/scheda/errato", name="user_ticket_wrong")
  2858.      * @Security("is_granted('edit', 'ticket')")
  2859.      */
  2860.     public function userTicketWrong(Request $request)
  2861.     {    
  2862.         $em $this->mr->getManager('slave');
  2863.         $ticket $em->getRepository("App\Entity\Slave\Ticket")->findOneById($request->request->get('ticketId'));
  2864.         $statusWrong $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'wrong'));
  2865.         
  2866.         $ticket->setSystemError(false);
  2867.         $ticket->setSystemErrorSlug(null);
  2868.         $ticket->setSystemErrorDetails(null);
  2869.         TicketService::createTicketLog($em$this->getUser(), $ticket"cs"$ticket->getStatus(), $statusWrong->getValue());
  2870.         $ticket->setStatus($statusWrong);
  2871.         $em->flush();
  2872.         $this->addFlash('notice_success'"Ticket spostato in errati");
  2873.         return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
  2874.     }
  2875.     
  2876.     /**
  2877.      * @Route("/scheda/ripristina", name="user_ticket_restore")
  2878.      * @Security("is_granted('edit', 'ticket')")
  2879.      */
  2880.     public function userTicketRestore(Request $request)
  2881.     {    
  2882.         $em $this->mr->getManager('slave');
  2883.         $ticket $em->getRepository("App\Entity\Slave\Ticket")->findOneById($request->request->get('ticketId'));
  2884.         $statusToAssign $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'to_assign'));
  2885.         $statusAssigned $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'assigned'));
  2886.         if($ticket->getTechnician() != null){
  2887.             TicketService::createTicketLog($em$this->getUser(), $ticket"cs"$ticket->getStatus(), $statusAssigned->getValue());
  2888.             $ticket->setStatus($statusAssigned);
  2889.         }
  2890.         else{
  2891.             TicketService::createTicketLog($em$this->getUser(), $ticket"cs"$ticket->getStatus(), $statusToAssign->getValue());  
  2892.             $ticket->setStatus($statusToAssign);
  2893.         }
  2894.         $em->flush();
  2895.         $this->addFlash('notice_success'"Ticket ripristinato");
  2896.         return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
  2897.     }
  2898.     
  2899.     /**
  2900.      * @Route("/scheda/prendi-in-carico", name="user_ticket_taken_charge")
  2901.      * @Security("is_granted('edit', 'ticket')")
  2902.      */
  2903.     public function userTicketTakenCharge(Request $request)
  2904.     {    
  2905.         $em $this->mr->getManager('slave');
  2906.         $session $request->getSession();
  2907.         $ticket $em->getRepository("App\Entity\Slave\Ticket")->findOneById($request->request->get('ticketId'));
  2908.         $statusTakenCharge $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'taken_charge'));
  2909.         TicketService::createTicketLog($em$this->getUser(), $ticket"cs"$ticket->getStatus(), $statusTakenCharge->getValue());
  2910.         $ticket->setStatus($statusTakenCharge);
  2911.         $em->flush();
  2912.         $this->addFlash('notice_success'"Ticket ripreso in carico");
  2913.         return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
  2914.     }
  2915.     
  2916.     /**
  2917.      * @Route("/scheda/completa", name="user_ticket_close")
  2918.      * @Security("is_granted('edit', 'ticket')")
  2919.      */
  2920.     public function userTicketClose(Request $request)
  2921.     {    
  2922.         $em $this->mr->getManager('slave');
  2923.         $ticket $em->getRepository("App\Entity\Slave\Ticket")->findOneById($request->request->get('ticketClosedId'));
  2924.         $statusClosed $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'closed'));
  2925.         TicketService::createTicketLog($em$this->getUser(), $ticket"cs"$ticket->getStatus(), $statusClosed->getValue());
  2926.         $ticket->setStatus($statusClosed);
  2927.         $ticket->setClosedOnPortal(0);
  2928.         if ($request->request->get('origin') === 'portal') {
  2929.             $ticket->setDatetimeEnd(new \DateTime());
  2930.         }
  2931.         $em->flush();
  2932.         $this->addFlash('notice_success'"Ticket chiuso");
  2933.         return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
  2934.     }
  2935.     /**
  2936.      * @Route("/scheda/chiuso-su-portale-fornitore", name="user_ticket_closed_on_portal")
  2937.      * @Security("is_granted('edit', 'ticket')")
  2938.      */
  2939.     public function userTicketCloseOnPortal(Request $request)
  2940.     {    
  2941.         $em $this->mr->getManager('slave');
  2942.         $ticket $em->getRepository("App\Entity\Slave\Ticket")->findOneById($request->request->get('ticketClosedPortalId'));
  2943.         $statusClosedOnPortal $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'closed_portal'));
  2944.         TicketService::createTicketLog($em$this->getUser(), $ticket"cs"$ticket->getStatus(), $statusClosedOnPortal->getValue());
  2945.         $ticket->setStatus($statusClosedOnPortal);
  2946.         $ticket->setClosedOnPortal(1);
  2947.         $em->flush();
  2948.         $this->addFlash('notice_success'"Ticket contrassegnato come chiuso su portale cliente");
  2949.         return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
  2950.     }
  2951.     // AZIONI TECNICO / AGENZIA SE SETTING TICKET_MANAGE == 1
  2952.     /**
  2953.      * @Route("/{ticketId}/scheda/prendi-in-carico", name="user_ticket_take_charge_single")
  2954.      * @Security("is_granted('edit', 'ticket')")
  2955.      */
  2956.     public function userTicketTakeChargeSingle($ticketIdRequest $request)
  2957.     {    
  2958.         $em $this->mr->getManager('slave');
  2959.         $session $request->getSession();
  2960.         $ticket $em->getRepository("App\Entity\Slave\Ticket")->findOneById($ticketId);
  2961.         $statusTakeCharge $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'taken_charge'));
  2962.         TicketService::createTicketLog($em$this->getUser(), $ticket"cs"$ticket->getStatus(), $statusTakeCharge->getValue());
  2963.         $ticket->setStatus($statusTakeCharge);
  2964.         $em->flush();
  2965.         $this->addFlash('notice_success'"Ticket preso in carico");
  2966.         return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
  2967.     }
  2968.     
  2969.     /**
  2970.      * @Route("/{ticketId}/scheda/verbale-stampa", name="user_ticket_report_print_single")
  2971.      * @Security("is_granted('view', 'ticket')")
  2972.      */
  2973.     public function userTicketReportPrintSingle($ticketIdRequest $request)
  2974.     {    
  2975.         $em $this->mr->getManager('slave');
  2976.         $ticket $em->getRepository("App\Entity\Slave\Ticket")->findOneById($ticketId);
  2977.         $matrixTickets = array();
  2978.         $jsonReportValues = array();
  2979.         $tmp = array();
  2980.         if($ticket->getJsonReport() != '[]'){
  2981.             $matrix json_decode($ticket->getJsonReport(), true);
  2982.             foreach($matrix as $array)
  2983.                 foreach($array as $a){
  2984.                     $tcv $em->getRepository('App\Entity\Slave\TicketColumnValue')->findOneBySupplierTicketColumnAndNeedle($ticket->getSupplier()->getId(), array_keys($array)[0], $a);
  2985.                     $htmlToAdd '';
  2986.                     if($tcv != null)
  2987.                         $htmlToAdd ' ('.$tcv->getValue().')';
  2988.                     $jsonReportValues[array_keys($array)[0]] = $a.$htmlToAdd;
  2989.                 }
  2990.         }
  2991.         array_push($tmp$ticket$jsonReportValues);
  2992.         array_push($matrixTickets$tmp);
  2993.         return $this->render('role/user/print/report.html.twig', array(
  2994.             'matrixTickets' => $matrixTickets,
  2995.             'backRoute' => 'sheet',
  2996.             'continueRoute' => 'sheet'
  2997.         ));
  2998.     }
  2999.     /**
  3000.      * @Route("/{ticketId}/scheda/verbali-stampati", name="user_ticket_report_printed_single")
  3001.      * @Security("is_granted('view', 'ticket')")
  3002.      */
  3003.     public function userTicketReportPrintedSingle(Request $request$ticketId)
  3004.     {    
  3005.         $em $this->mr->getManager('slave');
  3006.         $ticket $em->getRepository("App\Entity\Slave\Ticket")->findOneById($ticketId);
  3007.         $ticket->setReportPrinted(true);
  3008.         $em->flush();
  3009.         return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticketId));             
  3010.     }
  3011.     /**
  3012.      * @Route("/scheda/intervento/seleziona", name="user_ticket_intervention_select")
  3013.      * @Security("is_granted('edit', 'ticket')")
  3014.      */
  3015.     public function userTicketInterventionSelect(Request $request)
  3016.     {    
  3017.         $em $this->mr->getManager('slave');
  3018.         $ticket $em->getRepository('App\Entity\Slave\Ticket')->findOneById($request->request->get('ticketId'));
  3019.         $outcomeType $em->getRepository('App\Entity\Slave\InterventionOutcomeType')->findOneBy(array('slug' => $request->request->get('interventionOutcomeTypeSlug')));
  3020.         $today = new \Datetime();
  3021.         $intervention = new Intervention();
  3022.         $intervention->setTicket($ticket);
  3023.         $intervention->setOutcomeType($outcomeType);
  3024.         $intervention->setDatetime($today);
  3025.         $intervention->setDatetimeBilling(date_create_from_format('d-m-Y H:i:s''01-'.$today->format('m').'-'.$today->format('Y').' 00:00:00'));
  3026.         $em->persist($intervention);
  3027.         $em->flush();
  3028.         if($intervention->getOutcomeType()->getSlug() == 'completed'){
  3029.             // Completato --- Vado al seleziona attivita
  3030.             $warehouse $em->getRepository('App\Entity\Slave\Warehouse')->findOneById($request->request->get('interventionWarehouseId'));
  3031.             $intervention->setWarehouse($warehouse);
  3032.             $em->flush();
  3033.             return $this->redirectToRoute('user_ticket_intervention_activity_summary', array('interventionId' => $intervention->getId()));
  3034.         }
  3035.         else{
  3036.             // A vuoto/Sospeso --- Vado direttamente ai dettagli intervento
  3037.             return $this->redirectToRoute("user_ticket_intervention", array('interventionId' => $intervention->getId()));
  3038.         }
  3039.     }
  3040.     /**
  3041.      * @Route("/intervento-incompleto/elimina", name="user_ticket_intervention_delete")
  3042.      * @Security("is_granted('edit', 'ticket')")
  3043.      */
  3044.     public function userTicketInterventionDelete(Request $request)
  3045.     {    
  3046.         $em $this->mr->getManager('slave');
  3047.         $intervention $em->getRepository("App\Entity\Slave\Intervention")->findOneById($request->request->get("interventionDelId"));
  3048.         $ticket $intervention->getTicket();
  3049.         $ticketId $intervention->getTicket()->getId();
  3050.         foreach($intervention->getActivities() as $activity){
  3051.             // Withdraw
  3052.             if($activity->getProductWithdraw() != null){
  3053.                 // Controllo: se l'ho inserita adesso elimino il prodotto altrimenti lo ritrasferisco indietro
  3054.                 if($activity->getProductWithdraw()->getIsAlreadyInserted('withdraw')){
  3055.                     $productToDelete $activity->getProductWithdraw();
  3056.                     $activity->setProductWithdraw(null);
  3057.                     $this->deleteProductAlreadyInserted($em$productToDelete);
  3058.                 }
  3059.                 else{
  3060.                     $oldStatus $em->getRepository('App\Entity\Slave\ProductStatus')->findOneBy(array('slug' => 'in_use'));
  3061.                     $oldCondition $em->getRepository('App\Entity\Slave\ProductCondition')->findOneById($intervention->getLastProductLog('condition')->getOldDataId());
  3062.                     ProductService::createProductLog($em$activity->getProductWithdraw(), $this->getUser(), null'status'$activity->getProductWithdraw()->getStatus()->getValue(), $oldStatus->getValue());
  3063.                     ProductService::createProductLog($em$activity->getProductWithdraw(), $this->getUser(), null'condition'$activity->getProductWithdraw()->getCondition()->getValue(), $oldCondition->getValue());
  3064.                     $activity->getProductWithdraw()->setStatus($oldStatus);
  3065.                     $activity->getProductWithdraw()->setCondition($oldCondition);
  3066.                     $activity->getProductWithdraw()->setTermid($ticket->getTermid());
  3067.                     ProductService::moveProductClient($em$activity->getProductWithdraw(), $ticket->getClient()->getWarehouse());
  3068.                     ProductService::createProductTransferLogClient($em$activity->getProductWithdraw(), $this->getUser(), $intervention->getWarehouse(), $ticket->getClient()->getWarehouse(), new \Datetime(), 'scan');
  3069.                 }
  3070.             }
  3071.             // Actual
  3072.             if($activity->getProductActual() != null){
  3073.                 // Controllo: se l'ho inserita adesso elimino il prodotto altrimenti lo ritrasferisco indietro
  3074.                 if($activity->getProductActual()->getIsAlreadyInserted('actual')){
  3075.                     $productToDelete $activity->getProductActual();
  3076.                     $activity->setProductActual(null);
  3077.                     $this->deleteProductAlreadyInserted($em$productToDelete);
  3078.                 }
  3079.                 else{
  3080.                     $activity->getProductActual()->setTermid($ticket->getTermid());
  3081.                     ProductService::moveProductClient($em$activity->getProductActual(), $ticket->getClient()->getWarehouse());
  3082.                 }
  3083.             }
  3084.             // Installation
  3085.             if($activity->getProductInstallation() != null){
  3086.                 $oldStatus $em->getRepository('App\Entity\Slave\ProductStatus')->findOneBy(array('slug' => 'available'));
  3087.                 ProductService::createProductLog($em$activity->getProductInstallation(), $this->getUser(), $intervention'status'$activity->getProductInstallation()->getStatus()->getValue(), $oldStatus->getValue());
  3088.                 $activity->getProductInstallation()->setStatus($oldStatus);
  3089.                 $activity->getProductInstallation()->setTermid(null);
  3090.                 ProductService::moveProductClient($em$activity->getProductInstallation(), $intervention->getWarehouse());
  3091.                 ProductService::createProductTransferLogClient($em$activity->getProductInstallation(), $this->getUser(), $ticket->getClient()->getWarehouse(), $intervention->getWarehouse(), new \Datetime(), 'scan');
  3092.             }
  3093.             $em->remove($activity);
  3094.         }
  3095.         foreach($intervention->getProductLogs() as $log){
  3096.             $log->setIntervention(null);
  3097.         }
  3098.         $em->flush();
  3099.         $em->remove($intervention);
  3100.         $em->flush();
  3101.         if($ticket->getInterventionCompleted() == null){
  3102.             $ticket->setDatetimeEnd(null);
  3103.             if($ticket->getStatus()->getSlug() == "closed" || $ticket->getStatus()->getSlug() == "closed_portal"){
  3104.                 $statusAssigned $em->getRepository("App\Entity\Slave\TicketStatus")->findOneBySlug("assigned");
  3105.                 TicketService::createTicketLog($em$this->getUser(), $ticket"cs"$ticket->getStatus(), $statusAssigned->getValue());
  3106.                 $ticket->setStatus($statusAssigned);
  3107.             }
  3108.             $em->flush();
  3109.         }
  3110.         $this->addFlash('notice_success'"Intervento eliminato correttamente");
  3111.         return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticketId));
  3112.     }
  3113.     
  3114.     /**
  3115.      * @Route("/{interventionId}/scheda/intervento/modifica", name="user_ticket_intervention_edit")
  3116.      * @Security("is_granted('edit', 'ticket')")
  3117.      */
  3118.     public function userTicketInterventionEdit($interventionIdRequest $request)
  3119.     {    
  3120.         $em $this->mr->getManager('slave');
  3121.         $intervention $em->getRepository('App\Entity\Slave\Intervention')->findOneById($interventionId);
  3122.         if($intervention->getOutcomeType()->getSlug() == 'completed')
  3123.             return $this->redirectToRoute('user_ticket_intervention_activity_summary', array('interventionId' => $intervention->getId()));
  3124.         else
  3125.             return $this->redirectToRoute("user_ticket_intervention", array('interventionId' => $intervention->getId()));
  3126.     }
  3127.     /**
  3128.      * @Route("/{interventionId}/scheda/intervento/attivita-riassunto", name="user_ticket_intervention_activity_summary")
  3129.      * @Security("is_granted('edit', 'ticket')")
  3130.      */
  3131.     public function userTicketInterventionActivitySelect($interventionIdRequest $request)
  3132.     {    
  3133.         $em $this->mr->getManager('slave');
  3134.         $session $request->getSession();
  3135.         $intervention $em->getRepository("App\Entity\Slave\Intervention")->findOneById($interventionId);
  3136.         $ticket $intervention->getTicket();
  3137.         $components $em->getRepository("App\Entity\Slave\ProductComponent")->findAll();
  3138.         // Se tecnico -> Escludo i tipi attività solo backoffice
  3139.         if($this->getUser()->getAccountTypology() == 'technician')
  3140.             $interventionActivityTypes $em->getRepository('App\Entity\Slave\InterventionActivityType')->findVisibleByOperationGroupAndOnlyBackoffice($ticket->getOperation()->getGroup()->getSlug(), false);
  3141.         else
  3142.             $interventionActivityTypes $em->getRepository('App\Entity\Slave\InterventionActivityType')->findVisibleByOperationGroupAndOnlyBackoffice($ticket->getOperation()->getGroup()->getSlug(), true);
  3143.         return $this->render('role/user/ticket/intervention/activity/summary.html.twig', array(
  3144.             'ticket' => $ticket,
  3145.             'components' => $components,
  3146.             'intervention' => $intervention,
  3147.             'interventionActivityTypes' => $interventionActivityTypes
  3148.         ));
  3149.     }
  3150.     /**
  3151.      * @Route("/scheda/intervento/attivita-cancella", name="user_ticket_intervention_activity_delete")
  3152.      * @Security("is_granted('edit', 'ticket')")
  3153.      */
  3154.     public function userTicketInterventionActivityDelete(Request $request)
  3155.     {    
  3156.         $em $this->mr->getManager('slave');
  3157.         $session $request->getSession();
  3158.         $activity $em->getRepository("App\Entity\Slave\InterventionActivity")->findOneById($request->request->get('activityId'));
  3159.         $intervention $activity->getIntervention();
  3160.         $ticket $intervention->getTicket();
  3161.         // Withdraw
  3162.         if($activity->getProductWithdraw() != null){
  3163.             // Controllo: se l'ho inserita adesso elimino il prodotto altrimenti lo ritrasferisco indietro
  3164.             if($activity->getProductWithdraw()->getIsAlreadyInserted('withdraw')){
  3165.                 $productToDelete $activity->getProductWithdraw();
  3166.                 $activity->setProductWithdraw(null);
  3167.                 $this->deleteProductAlreadyInserted($em$productToDelete);
  3168.             }
  3169.             else{
  3170.                 $oldStatus $em->getRepository('App\Entity\Slave\ProductStatus')->findOneBy(array('slug' => 'in_use'));
  3171.                 $oldCondition $em->getRepository('App\Entity\Slave\ProductCondition')->findOneById($intervention->getLastProductLog('condition')->getOldDataId());
  3172.                 ProductService::createProductLog($em$activity->getProductWithdraw(), $this->getUser(), null'status'$activity->getProductWithdraw()->getStatus()->getValue(), $oldStatus->getValue());
  3173.                 $activity->getProductWithdraw()->setStatus($oldStatus);
  3174.                 if($oldCondition != null){
  3175.                     ProductService::createProductLog($em$activity->getProductWithdraw(), $this->getUser(), null'condition'$activity->getProductWithdraw()->getCondition()->getValue(), $oldCondition->getValue());
  3176.                     $activity->getProductWithdraw()->setCondition($oldCondition);
  3177.                 }
  3178.                 else{
  3179.                     $activity->getProductWithdraw()->setCondition($em->getRepository('App\Entity\Slave\ProductCondition')->findOneBy(['slug' => 'free']));
  3180.                 }
  3181.                 $activity->getProductWithdraw()->setTermid($ticket->getTermid());
  3182.                 ProductService::moveProductClient($em$activity->getProductWithdraw(), $ticket->getClient()->getWarehouse());
  3183.                 ProductService::createProductTransferLogClient($em$activity->getProductWithdraw(), $this->getUser(), $intervention->getWarehouse(), $ticket->getClient()->getWarehouse(), new \Datetime(), 'scan');
  3184.             }
  3185.         }
  3186.         // Actual
  3187.         if($activity->getProductActual() != null){
  3188.             // Controllo: se l'ho inserita adesso elimino il prodotto altrimenti lo ritrasferisco indietro
  3189.             if($activity->getProductActual()->getIsAlreadyInserted('actual')){
  3190.                 $productToDelete $activity->getProductActual();
  3191.                 $activity->setProductActual(null);
  3192.                 $this->deleteProductAlreadyInserted($em$productToDelete);
  3193.             }
  3194.             else{
  3195.                 $activity->getProductActual()->setTermid($ticket->getTermid());
  3196.                 ProductService::moveProductClient($em$activity->getProductActual(), $ticket->getClient()->getWarehouse());
  3197.             }
  3198.         }
  3199.         // Installation
  3200.         if($activity->getProductInstallation() != null){
  3201.             $oldStatus $em->getRepository('App\Entity\Slave\ProductStatus')->findOneBy(array('slug' => 'available'));
  3202.             ProductService::createProductLog($em$activity->getProductInstallation(), $this->getUser(), $intervention'status'$activity->getProductInstallation()->getStatus()->getValue(), $oldStatus->getValue());
  3203.             $activity->getProductInstallation()->setStatus($oldStatus);
  3204.             $activity->getProductInstallation()->setTermid(null);
  3205.             ProductService::moveProductClient($em$activity->getProductInstallation(), $intervention->getWarehouse());
  3206.             ProductService::createProductTransferLogClient($em$activity->getProductInstallation(), $this->getUser(), $ticket->getClient()->getWarehouse(), $intervention->getWarehouse(), new \Datetime(), 'scan');
  3207.         }
  3208.         $em->remove($activity);
  3209.         $em->flush();
  3210.         $this->addFlash('notice_success''Attivita eliminata correttamente!');
  3211.         return $this->redirectToRoute('user_ticket_intervention_activity_summary', array('interventionId' => $intervention->getId()));
  3212.     }
  3213.     /**
  3214.      * @Route("/scheda/intervento/{interventionId}/attivita/{activityTypeId}", name="user_ticket_intervention_activity")
  3215.      * @Security("is_granted('edit', 'ticket')")
  3216.      */
  3217.     public function userTicketInterventionActivity($interventionId$activityTypeIdRequest $requestValidatorInterface $validatorFormFactoryInterface $formFactory)
  3218.     {    
  3219.         $em $this->mr->getManager('slave');
  3220.         $emMaster $this->mr->getManager('master');
  3221.         $session $request->getSession();
  3222.         $company $emMaster->getRepository("App\Entity\Master\Company")->findOneById($session->get('companyId'));
  3223.         $activityType $em->getRepository("App\Entity\Slave\InterventionActivityType")->findOneById($activityTypeId);
  3224.         $intervention $em->getRepository("App\Entity\Slave\Intervention")->findOneById($interventionId);
  3225.         $ticket $intervention->getTicket();
  3226.         $activity = new InterventionActivity();
  3227.         $form $formFactory->createNamed("form_intervention_activity"InterventionActivityType::class, $activity);
  3228.         $form->handleRequest($request);
  3229.         if($form->isSubmitted()){
  3230.             
  3231.             $valid FormValidatorService::validateInterventionActivity($validator$form$activityType$ticket$intervention$em);
  3232.             if($valid && $form->isValid()){
  3233.             
  3234.                 $activity->setIntervention($intervention);
  3235.                 $activity->setType($activityType);
  3236.                 // Withdraw
  3237.                 if($activityType->isProducerWithdrawMandatory() || $activityType->isSupplierWithdrawMandatory()){
  3238.                     $withdrawProduct $this->activityProductByType($em$form'Withdraw', array($ticket->getSupplier()));
  3239.                     // Se cambia il modello lo aggiorno al prodotto che ho disinstallato
  3240.                     $withdrawModel $em->getRepository('App\Entity\Slave\ProductModel')->findOneById($form->get('modelWithdrawId')->getData());
  3241.                     if($withdrawModel != null)
  3242.                         $withdrawProduct->setModel($withdrawModel);
  3243.                     $activity->setProductWithdraw($withdrawProduct);
  3244.                     if($activityType->isSupplierWithdrawMandatory()){
  3245.                         $activity->setSupplierWithdraw($form->get('supplierWithdraw')->getData());
  3246.                         $transferLogType $form->get('scanOrManualSupplierWithdraw')->getData();
  3247.                     }
  3248.                     if($activityType->isProducerWithdrawMandatory()){
  3249.                         $activity->setProducerWithdraw($form->get('producerWithdraw')->getData());
  3250.                         $transferLogType $form->get('scanOrManualProducerWithdraw')->getData();
  3251.                     }
  3252.                     $components $em->getRepository('App\Entity\Slave\ProductComponent')->findAll();
  3253.                     $arrayComponents = array();
  3254.                     foreach($components as $c){
  3255.                         $cp $request->request->get('component_'.$c->getId());
  3256.                         if($cp == 'on')
  3257.                             array_push($arrayComponents$c->getId());
  3258.                     }
  3259.                     $activity->setComponents($arrayComponents);
  3260.                     $newStatus $em->getRepository('App\Entity\Slave\ProductStatus')->findOneBy(array('slug' => 'not_available'));
  3261.                     $newCondition $em->getRepository('App\Entity\Slave\ProductCondition')->findOneBy(array('slug' => 'retired'));
  3262.                     ProductService::createProductLog($em$activity->getProductWithdraw(), $this->getUser(), $intervention'status'$activity->getProductWithdraw()->getStatus()->getValue(), $newStatus->getValue());
  3263.                     if($activity->getProductWithdraw()->getCondition() != nullProductService::createProductLog($em$activity->getProductWithdraw(), $this->getUser(), $intervention'condition'$activity->getProductWithdraw()->getCondition()->getValue(), $newCondition->getValue());
  3264.                     $activity->getProductWithdraw()->setStatus($newStatus);
  3265.                     $activity->getProductWithdraw()->setCondition($newCondition);
  3266.                     $activity->getProductWithdraw()->setTermid(null);
  3267.                     ProductService::createProductTransferLogClient($em$activity->getProductWithdraw(), $this->getUser(), $ticket->getClient()->getWarehouse(), $intervention->getWarehouse(), new \Datetime(), $transferLogType);
  3268.                     ProductService::moveProductClient($em$activity->getProductWithdraw(), $intervention->getWarehouse());
  3269.                 }
  3270.                 // Actual
  3271.                 if($activityType->isProducerActualMandatory() || $activityType->isSupplierActualMandatory()){
  3272.                     $actualProduct $this->activityProductByType($em$form'Actual', array($ticket->getSupplier()));
  3273.                     // Se cambia il modello lo aggiorno al prodotto che c'è installato 
  3274.                     // Questa azione potrebbe creare un problema se un tecnico installa qualcosa, poi fa un evento di aggiornamento dove cambia il modello, poi lo elimina, ha di fatto baypassato l'impossibilità del tecnico di cambiare modello ad un prodotto.
  3275.                     // In ogni caso, quando poi la merce torna in magazzino, viene sistemato il tutto, quindi non è un reale problema.
  3276.                     $actualModel $em->getRepository('App\Entity\Slave\ProductModel')->findOneById($form->get('modelActualId')->getData());
  3277.                     if($actualModel != null)
  3278.                         $actualProduct->setModel($actualModel);
  3279.                     $activity->setProductActual($actualProduct);
  3280.                     if($activityType->isProducerActualMandatory()){
  3281.                         $activity->setProducerActual($form->get('producerActual')->getData());
  3282.                         $transferLogType $form->get('scanOrManualProducerActual')->getData();
  3283.                     }
  3284.                     if($activityType->isSupplierActualMandatory()){
  3285.                         $activity->setSupplierActual($form->get('supplierActual')->getData());
  3286.                         $transferLogType $form->get('scanOrManualSupplierActual')->getData();
  3287.                     }
  3288.                     $activity->getProductActual()->setTermid($ticket->getTermid());
  3289.                     ProductService::moveProductClient($em$activity->getProductActual(), $ticket->getClient()->getWarehouse());
  3290.                 }
  3291.                 // Installation
  3292.                 if($activityType->isProducerInstallationMandatory() || $activityType->isSupplierInstallationMandatory()){
  3293.                     $installationProduct $this->activityProductByType($em$form'Installation', array($ticket->getSupplier()));
  3294.                     // Il modello non cambia mai, perché viene dettato dal magazzino, quindi non consento la modifica
  3295.                     $activity->setProductInstallation($installationProduct);
  3296.                     if($activityType->isProducerInstallationMandatory()){
  3297.                         $activity->setProducerInstallation($form->get('producerInstallation')->getData());
  3298.                         $transferLogType $form->get('scanOrManualProducerInstallation')->getData();
  3299.                     }
  3300.                     if($activityType->isSupplierInstallationMandatory()){
  3301.                         $activity->setSupplierInstallation($form->get('supplierInstallation')->getData());
  3302.                         $transferLogType $form->get('scanOrManualSupplierInstallation')->getData();
  3303.                     }
  3304.                     $newStatus $em->getRepository('App\Entity\Slave\ProductStatus')->findOneBy(array('slug' => 'in_use'));
  3305.                     ProductService::createProductLog($em$activity->getProductInstallation(), $this->getUser(), $intervention'status'$activity->getProductInstallation()->getStatus()->getValue(), $newStatus->getValue());
  3306.                     $activity->getProductInstallation()->setStatus($newStatus);
  3307.                     $activity->getProductInstallation()->setTermid($ticket->getTermid());
  3308.                     ProductService::createProductTransferLogClient($em$activity->getProductInstallation(), $this->getUser(), $intervention->getWarehouse(), $ticket->getClient()->getWarehouse(), new \Datetime(), $transferLogType);
  3309.                     ProductService::moveProductClient($em$activity->getProductInstallation(), $ticket->getClient()->getWarehouse());
  3310.                 }
  3311.                 $em->persist($activity);
  3312.                 $em->flush();
  3313.                 return $this->redirectToRoute('user_ticket_intervention_activity_summary', array('interventionId' => $intervention->getId()));
  3314.             }
  3315.         }
  3316.         return $this->render('role/user/ticket/intervention/activity/single.html.twig', array(
  3317.             'company' => $company,
  3318.             'ticket' => $ticket,
  3319.             'intervention' => $intervention,
  3320.             'activityType' => $activityType,
  3321.             'isPos' => $activityType->isPos(),
  3322.             'form' => $form->createView()
  3323.         ));
  3324.     }
  3325.     /**
  3326.      * @Route("/scheda/intervento/attivita-prodotti-cerca-codice", name="user_ticket_intervention_activity_product_search_code")
  3327.      * @Security("is_granted('edit', 'ticket')")
  3328.      */
  3329.     public function userTicketInterventionActivityProductSearchCode(Request $request)
  3330.     {
  3331.         $em $this->mr->getManager('slave');
  3332.         $session $request->getSession();
  3333.         $ticket $em->getRepository('App\Entity\Slave\Ticket')->findOneById($request->request->get('ticketId'));
  3334.         $intervention $em->getRepository('App\Entity\Slave\Intervention')->findOneById($request->request->get('interventionId'));
  3335.         $interventionActivityType $em->getRepository('App\Entity\Slave\InterventionActivityType')->findOneById($request->request->get('activityTypeId'));
  3336.         $product null;
  3337.         // Controllo se esiste il prodotto
  3338.         switch($request->request->get('type')){
  3339.             case 'producer_withdraw':
  3340.             case 'producer_installation':
  3341.             case 'producer_actual':
  3342.                 $product $em->getRepository('App\Entity\Slave\Product')->findOneBy(array('codeProducer' => $request->request->get('code')));
  3343.                 break;
  3344.             case 'supplier_withdraw':
  3345.             case 'supplier_installation':
  3346.             case 'supplier_actual':
  3347.                 $product $em->getRepository('App\Entity\Slave\Product')->findOneBy(array('codeSupplier' => $request->request->get('code')));
  3348.                 break;
  3349.             default: break;
  3350.         }
  3351.         $found false;
  3352.         $json '{';
  3353.         if($product != null){
  3354.             $found true;
  3355.             $posAccessoryOk false;
  3356.             $supplierOk false;    
  3357.             $canMove true;
  3358.             $editSuppliers false;
  3359.             if($product->getModel()->isPos() == $interventionActivityType->isPos())
  3360.                 $posAccessoryOk true;
  3361.             // Controllo se il fornitore del ticket è tra quelli del prodotto
  3362.             foreach($product->getSuppliers() as $supplier){
  3363.                 if($ticket->getSupplier()->getId() == $supplier->getId()){
  3364.                     $supplierOk true;
  3365.                     break;
  3366.                 }
  3367.             }
  3368.             if(!$supplierOk){
  3369.                 foreach($product->getSuppliers() as $supplier){
  3370.                     if(!$supplier->isInterventionActive()){
  3371.                         $editSuppliers true;
  3372.                         break;
  3373.                     }
  3374.                 }
  3375.             }
  3376.             // Controllo se posso spostare il prodotto
  3377.             switch($request->request->get('type')){
  3378.                 case 'producer_withdraw':
  3379.                 case 'supplier_withdraw':
  3380.                 case 'producer_actual':
  3381.                 case 'supplier_actual':
  3382.                     $warehouse $ticket->getClient()->getWarehouse();
  3383.                     break;
  3384.                 case 'producer_installation':
  3385.                 case 'supplier_installation':
  3386.                     $warehouse $intervention->getWarehouse();
  3387.                     if($product->getStatus()->getSlug() != 'available')
  3388.                         $canMove false;
  3389.                     break;
  3390.                 default: break;
  3391.             }
  3392.             $json.= '"id":"'.$product->getId().'", "model":'.json_encode($product->getModel()->getName()).', "codeProducer":"'.$product->getCodeProducer().'", "codeSupplier":"'.$product->getCodeSupplier().'", "supplierOk":"'.$supplierOk.'", "editSuppliers":"'.$editSuppliers.'", "posAccessoryOk":"'.$posAccessoryOk.'",';
  3393.         
  3394.             if($product->getActualWarehouse()->getId() == $warehouse->getId())
  3395.                 $json.= '"otherWarehouse":"0", "type":"", "warehouse":"", "otherWarehouseId":"", "otherWarehouseNickname":"", "canMove":"'.$canMove.'"';
  3396.             else
  3397.                 $json.= '"otherWarehouse":"1","type":"'.$request->request->get('type').'","warehouse":"'.$warehouse->getId().'", "otherWarehouseId":"'.$product->getActualWarehouse()->getId().'", "otherWarehouseNickname":"'.$product->getActualWarehouse()->getNickname().'", "canMove":"'.$canMove.'"';
  3398.             
  3399.         }
  3400.         $json.= '}';
  3401.         return new Response(json_encode(array("code" => 200"success" => true"found" => $found"product" => $json)));
  3402.     }
  3403.     /**
  3404.      * @Route("/scheda/intervento/attivita-prodotto-cerca", name="user_ticket_intervention_activity_product_search")
  3405.      * @Security("is_granted('edit', 'ticket')")
  3406.      */
  3407.     public function userTicketInterventionActivityProductSearch(Request $request)
  3408.     {    
  3409.         $em $this->mr->getManager('slave');
  3410.         $session $request->getSession();
  3411.         $activityType $em->getRepository("App\Entity\Slave\InterventionActivityType")->findOneById($request->request->get('activityTypeId'));
  3412.         $ticket $em->getRepository("App\Entity\Slave\Ticket")->findOneById($request->request->get('ticketId'));
  3413.         $intervention $em->getRepository("App\Entity\Slave\Intervention")->findOneById($request->request->get('interventionId'));
  3414.         $type $request->request->get('type');
  3415.         $filter $request->request->get('filter');
  3416.         $isPos $request->request->get('isPos');
  3417.         $products = array();
  3418.         if($type == 'installation')
  3419.             $products $em->getRepository('App\Entity\Slave\Product')->findByWarehouseSupplierAndIsPosWithFilter($intervention->getWarehouse()->getId(), $ticket->getSupplier()->getId(), $isPos$filter);
  3420.         
  3421.         if($type == 'actual' || $type == 'withdraw')
  3422.             $products $em->getRepository('App\Entity\Slave\Product')->findByWarehouseSupplierAndIsPosWithFilter($ticket->getClient()->getWarehouse()->getId(), $ticket->getSupplier()->getId(), $isPos$filter);
  3423.         $first true;
  3424.         $json "[";
  3425.         foreach($products as $p){
  3426.             if($first$first false; else $json.= ',';
  3427.             $codeProducer '"---"'; if($p->getCodeProducer() != null && $p->getCodeProducer() != ''$codeProducer json_encode($p->getCodeProducer());
  3428.             $codeSupplier '"---"'; if($p->getCodeSupplier() != null && $p->getCodeSupplier() != ''$codeSupplier json_encode($p->getCodeSupplier());
  3429.             $json.= '{"id":'.$p->getId().', "modelName":'.json_encode($p->getModel()->getName()).', "codeProducer":'.$codeProducer.', "codeSupplier":'.$codeSupplier.'}';
  3430.         }
  3431.         $json.= "]";
  3432.         
  3433.         return new Response(json_encode(array("code" => 200"success" => true"products" => $json)));
  3434.     }
  3435.     
  3436.     /**
  3437.      * @Route("/scheda/intervento/attivita-modello-cerca", name="user_ticket_intervention_activity_model_search")
  3438.      * @Security("is_granted('edit', 'ticket')")
  3439.      */
  3440.     public function userTicketInterventionActivityModelSearch(Request $request)
  3441.     {    
  3442.         $em $this->mr->getManager('slave');
  3443.         $session $request->getSession();
  3444.         $activityType $em->getRepository("App\Entity\Slave\InterventionActivityType")->findOneById($request->request->get('activityTypeId'));
  3445.         $isPos $request->request->get('isPos');
  3446.         $filter $request->request->get('filter');
  3447.         $interventionId $request->request->get('interventionId');
  3448.         $intervention $em->getRepository("App\Entity\Slave\Intervention")->findOneById($interventionId);
  3449.         
  3450.         $supplier $intervention->getTicket()->getSupplier();
  3451.         $models $em->getRepository('App\Entity\Slave\ProductModel')->findAllowedPosModel($isPos$filter$supplier);
  3452.                 
  3453.         $first true;
  3454.         $json "[";
  3455.         foreach($models as $m){
  3456.             if($first$first false; else $json.= ',';
  3457.             $json.= '{"id":'.$m->getId().', "name":'.json_encode($m->getName()).', "subcategory":'.json_encode($m->getSubcategory()->getName()).', "category":'.json_encode($m->getSubcategory()->getCategory()->getName()).', "producer":'.json_encode($m->getProducer()->getName()).'}';
  3458.         }
  3459.         $json.= "]";
  3460.       
  3461.         return new Response(json_encode(array("code" => 200"success" => true"models" => $json)));
  3462.     }
  3463.     /**
  3464.      * @Route("/scheda/intervento/attivita-modello-componenti", name="user_ticket_intervention_activity_model_components")
  3465.      * @Security("is_granted('edit', 'ticket')")
  3466.      */
  3467.     public function userTicketInterventionActivityModelComponents(Request $request)
  3468.     {    
  3469.         $em $this->mr->getManager('slave');
  3470.         $session $request->getSession();
  3471.         $activityType $em->getRepository("App\Entity\Slave\InterventionActivityType")->findOneById($request->request->get('activityTypeId'));
  3472.         $model $em->getRepository('App\Entity\Slave\ProductModel')->findOneById($request->request->get('modelId'));
  3473.                 
  3474.         $first true;
  3475.         $json "[";
  3476.         if($model != null){
  3477.             foreach($model->getComponents() as $c){
  3478.                 if($first$first false; else $json.= ',';
  3479.                 $json.= '{"id":"'.$c->getId().'", "name":"'.$c->getName().'"}';
  3480.             }
  3481.         }
  3482.         $json.= "]";
  3483.       
  3484.         return new Response(json_encode(array("code" => 200"success" => true"components" => $json)));
  3485.     }
  3486.     /**
  3487.      * @Route("/scheda/intervento/{interventionId}/attivita-sposta-prodotto", name="user_ticket_intervention_activity_move_product")
  3488.      * @Security("is_granted('edit', 'ticket')")
  3489.      */
  3490.     public function userTicketInterventionActivityMoveProduct(Request $request$interventionId)
  3491.     {
  3492.         $em $this->mr->getManager('slave');
  3493.         $session $request->getSession();
  3494.         $type $request->request->get('type');
  3495.         $product $em->getRepository('App\Entity\Slave\Product')->findOneById($request->request->get('productId'));
  3496.         $oldStatus $product->getStatus();
  3497.         $intervention $em->getRepository('App\Entity\Slave\Intervention')->findOneById($interventionId);
  3498.         if($type == "installation"){
  3499.             $statusNew $em->getRepository('App\Entity\Slave\ProductStatus')->findOneBy(array('slug' => 'available'));
  3500.             $warehouse $intervention->getWarehouse();
  3501.             $product->setTermid(null);
  3502.             $product->setStatus($statusNew);
  3503.         }
  3504.         else{
  3505.             $statusNew $em->getRepository('App\Entity\Slave\ProductStatus')->findOneBy(array('slug' => 'in_use'));
  3506.             $warehouse $intervention->getTicket()->getClient()->getWarehouse();
  3507.             $product->setTermid($intervention->getTicket()->getTermid());
  3508.             $product->setStatus($statusNew);
  3509.         }
  3510.         
  3511.         if($oldStatus->getId() != $statusNew->getId())
  3512.             ProductService::createProductLog($em$product$this->getUser(), null'status'$statusNew->getValue(), $oldStatus->getValue());
  3513.         ProductService::createProductTransferLog($em$productnull$this->getUser(), $warehouse, new \Datetime(), 'forced');
  3514.         $product->setActualWarehouse($warehouse);
  3515.         $product->setDateLastTransfer(new \Datetime());
  3516.         $product->isToManage(false);
  3517.         $product->setToManagePriority(0);
  3518.         $em->flush();
  3519.         return new Response(json_encode(array("code" => 200"success" => true)));
  3520.     }
  3521.     /**
  3522.      * @Route("/{ticketId}/scheda/intervento/attivita-aggiorna-fornitori", name="user_ticket_intervention_activity_update_suppliers")
  3523.      * @Security("is_granted('edit', 'ticket')")
  3524.      */
  3525.     public function userTicketInterventionActivityUpdateSuppliers(Request $request$ticketId)
  3526.     {
  3527.         $em $this->mr->getManager('slave');
  3528.         $ticket $em->getRepository('App\Entity\Slave\Ticket')->findOneById($ticketId);
  3529.         $product $em->getRepository('App\Entity\Slave\Product')->findOneById($request->request->get('productId'));
  3530.         foreach($product->getSuppliers() as $supplier){
  3531.             if(!$supplier->isInterventionActive()){
  3532.                 $product->removeSupplier($supplier);
  3533.                 $supplier->removeProduct($product);
  3534.             }
  3535.         }
  3536.         $supplierNew $ticket->getSupplier();
  3537.         $product->addSupplier($supplierNew);
  3538.         $supplierNew->addProduct($product);
  3539.         $em->flush();
  3540.         $json '{"id":"'.$product->getId().'", "model":'.json_encode($product->getModel()->getName()).', "modelId":'.$product->getModel()->getId().', "codeProducer":"'.$product->getCodeProducer().'", "codeSupplier":"'.$product->getCodeSupplier().'"}';
  3541.         return new Response(json_encode(array("code" => 200"success" => true"json" => $json)));
  3542.     }
  3543.     
  3544.     /**
  3545.      * @Route("/{interventionId}/scheda/intervento/dettagli", name="user_ticket_intervention")
  3546.      * @Security("is_granted('edit', 'ticket')")
  3547.      */
  3548.     public function userTicketIntervention($interventionIdRequest $requestValidatorInterface $validatorFormFactoryInterface $formFactoryFileSystem $fsMailerInterface $mailer)
  3549.     {    
  3550.         $em $this->mr->getManager('slave');
  3551.         $emMaster $this->mr->getManager('master');
  3552.         $session $request->getSession();
  3553.         $company $emMaster->getRepository('App\Entity\Master\Company')->findOneById($session->get('companyId'));
  3554.         $intervention $em->getRepository("App\Entity\Slave\Intervention")->findOneById($interventionId);
  3555.         $ticket $intervention->getTicket();
  3556.         $settingBillingMonthDefault $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_intervention_billing_month_default'));
  3557.         $settingCompletedDefault $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'outcome_completed_default'));
  3558.         $outcomeCompletedDefault $em->getRepository('App\Entity\Slave\InterventionOutcome')->findOneById($settingCompletedDefault->getValue());
  3559.         $form $formFactory->createNamed("form_intervention"InterventionType::class, $intervention, array('typeSlug' => $intervention->getOutcomeType()->getSlug()));
  3560.         $form->handleRequest($request);
  3561.         if($form->isSubmitted()){
  3562.             [$valid$interventionOutcome] = FormValidatorService::validateIntervention($em$validator$form$intervention->getOutcomeType()->getSlug());
  3563.             if($valid && $form->isValid()){
  3564.                 $intervention->setTechnician($ticket->getTechnician());
  3565.                 $intervention->setOperator($this->getUser());
  3566.                 if($intervention->getOutcomeType()->getSlug() == "completed"){
  3567.                     $datetime date_create_from_format("d-m-Y H:i"$form->get('date')->getData()->format('d-m-Y').' '.$form->get('timeHour')->getData().':'.$form->get('timeMinute')->getData());
  3568.                     switch($settingBillingMonthDefault->getValue()){
  3569.                         case 'intervention'$datetimeBilling = clone($datetime); break;
  3570.                         case 'epos'$datetimeBilling = new Datetime(); break;
  3571.                         default: break;
  3572.                     }
  3573.                     $intervention->setDatetimeBilling($datetimeBilling);
  3574.                 }
  3575.                 else
  3576.                     $datetime = new \Datetime();
  3577.                
  3578.                 $intervention->setDatetime($datetime);
  3579.                 $intervention->setMotivation($form->get("motivation")->getData());
  3580.                 $em->persist($intervention);
  3581.                 switch($intervention->getOutcomeType()->getSlug()){
  3582.                     case 'suspended':
  3583.                     case 'empty':
  3584.                         // Inserisco la sospensione del ticket
  3585.                         $suspension = new TicketSuspension();
  3586.                         $suspension->setTicket($ticket);
  3587.                         $suspension->setIntervention($intervention);
  3588.                         $suspension->setDatetimeFrom(date_create_from_format("d-m-Y H:i"$form->get('dateFrom')->getData()->format('d-m-Y').' '.$form->get('timeFromHour')->getData().':'.$form->get('timeFromMinute')->getData()));
  3589.                         if($form->get('dateTo')->getData() != null && $form->get('timeToHour')->getData() != null && $form->get('timeToMinute')->getData() != null){
  3590.                             $suspension->setDatetimeTo(date_create_from_format("d-m-Y H:i"$form->get('dateTo')->getData()->format('d-m-Y').' '.$form->get('timeToHour')->getData().':'.$form->get('timeToMinute')->getData()));
  3591.                         }
  3592.                         $em->persist($suspension);
  3593.                         // Aggiorno dati intervento
  3594.                         if($interventionOutcome->isReferentRequired()) $intervention->setReferent($form->get("referent")->getData());
  3595.                         if($interventionOutcome->isPhoneRequired()) $intervention->setPhone($form->get("phone")->getData());
  3596.                         if($interventionOutcome->isPhotoRequired()) {
  3597.                             $uploadDir $this->params->get('kernel.project_dir').'/'.$this->params->get('web_path').'/companies/'.$company->getDirectoryPath().'/tickets/'.$ticket->getDirectoryPath().'/';
  3598.                             MediaService::uploadImage($fs$form->get('file')->getData(), null$uploadDir$intervention'photo'1001000200true);
  3599.                         }
  3600.                         // SE empty -> Aggiungo costo UAV
  3601.                         if($intervention->getOutcomeType()->getSlug() == 'empty'){
  3602.                             $amountTechnician null;
  3603.                             // Cerco tra gli UAV di quella provincia e di quell'utente
  3604.                             if($ticket->getUAVOperationTariffAmount() != null){
  3605.                                 foreach($ticket->getUAVOperationTariffAmount()->getTechnicianAreas() as $jttaota){
  3606.                                     if($jttaota->getTechnicianArea()->getUser()->getId() == $ticket->getTechnician()->getId()){
  3607.                                         $amountTechnician $jttaota->getAmount();
  3608.                                         break;
  3609.                                     }
  3610.                                 }
  3611.                             }
  3612.                             // SE non ho risultati -> Fuori zona metto 0.00
  3613.                             if($amountTechnician == null){
  3614.                                 $amountTechnician '0.00';
  3615.                             }
  3616.                             $intervention->setAmount($ticket->getUAVOperationTariffAmount()->getAmount());
  3617.                             $intervention->setAmountTechnician($amountTechnician);
  3618.                         }
  3619.                         // Se account agenzia che gestisce -> approvo automaticamente sospensione --- Altrimenti metto in richiesta sospensione
  3620.                         if($this->getUser()->getAccountTypology() == 'agency' || $this->getUser()->getAccountTypology() == 'warehouse'){
  3621.                             $suspension->setApproved(true);
  3622.                             $suspension->setManaged(true);
  3623.                     
  3624.                             $settingUnlockSameTech $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_suspension_unlock_same_technician'));
  3625.                             if($settingUnlockSameTech->getValue() != 1){
  3626.                                 TicketService::createTicketLog($em$this->getUser(), $ticket"ct"$ticket->getTechnician(), null);
  3627.                                 $ticket->setTechnician(null);
  3628.                             }
  3629.                             $ticketStatus $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'suspended'));
  3630.                         }
  3631.                         else{
  3632.                             $ticketStatus $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'suspension_request'));
  3633.                             if($intervention->getOutcomeType()->getSlug() == "suspended"){
  3634.                                 $settingAgencyEmail $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_suspension_agency_email'));
  3635.                                 $subject $this->params->get('subject_ticket_suspension_request');
  3636.                                 $template "email/ticket/suspension_request.html.twig";
  3637.                             }
  3638.                             else{
  3639.                                 $settingAgencyEmail $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_uav_agency_email'));
  3640.                                 $subject $this->params->get('subject_ticket_uav_request');
  3641.                                 $template "email/ticket/uav_request.html.twig";
  3642.                             }
  3643.                             if($settingAgencyEmail->getValue() != null){
  3644.                                 $emails preg_split('/\,/'$settingAgencyEmail->getValue());
  3645.                                 foreach($emails as $email){
  3646.                                     $message = (new TemplatedEmail())
  3647.                                         ->subject($subject.' '.$ticket->getNumber())
  3648.                                         ->from($this->params->get('email_noreply'))
  3649.                                         ->to(rtrim(ltrim($email" ")," "))
  3650.                                         ->htmlTemplate($template)
  3651.                                         ->context(['company' => $company'ticket' => $ticket'suspension' => $suspension]);
  3652.                                     $mailer->send($message);
  3653.                                 }
  3654.                             }
  3655.                         }
  3656.                         // Aggiorno stato ticket
  3657.                         TicketService::createTicketLog($em$this->getUser(), $ticket"cs"$ticket->getStatus(), $ticketStatus->getValue());
  3658.                         $ticket->setStatus($ticketStatus);
  3659.                         break;
  3660.                     case 'completed'
  3661.                         // Chiudo il ticket
  3662.                         $statusClosed $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'closed'));
  3663.                         TicketService::createTicketLog($em$this->getUser(), $ticket"cs"$ticket->getStatus(), $statusClosed->getValue());
  3664.                         $ticket->setStatus($statusClosed);
  3665.                         $ticket->setDatetimeEnd($intervention->getDatetime());
  3666.                         // Cerco la jt del tecnico-operazione nell'area e setto l'amount
  3667.                         $amountTechnician null;
  3668.                         foreach($ticket->getOperationTariffAmount()->getTechnicianAreas() as $jttaota){
  3669.                             if($jttaota->getTechnicianArea()->getUser()->getId() == $ticket->getTechnician()->getId()){
  3670.                                 $amountTechnician $jttaota->getAmount();
  3671.                                 break;
  3672.                             }
  3673.                         }
  3674.                         // Se non la trovo -> Fuori zona metto 0.00
  3675.                         if($amountTechnician == null){
  3676.                             $amountTechnician '0.00';
  3677.                         }
  3678.                         $intervention->setAmount($ticket->getOperationTariffAmount()->getAmount());
  3679.                         $intervention->setAmountTechnician($amountTechnician);
  3680.                 
  3681.                         $this->addFlash('notice_success''Ticket completato!');
  3682.                         break;
  3683.                     default: break;
  3684.                 }
  3685.                 $em->flush();
  3686.                 $session->set('interventionId'$intervention->getId());
  3687.                 return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
  3688.             }
  3689.         }
  3690.         return $this->render('role/user/ticket/intervention/intervention.html.twig', array(
  3691.             'ticket' => $ticket,
  3692.             'intervention' => $intervention,
  3693.             'outcomeCompletedDefault' => $outcomeCompletedDefault,
  3694.             'form' => $form->createView()
  3695.         ));
  3696.     }
  3697.     /**
  3698.      * @Route("/scheda/intervento/esito-aggiorna", name="user_ticket_intervention_outcome_update")
  3699.      * @Security("is_granted('edit', 'ticket')")
  3700.      */
  3701.     public function userTicketInterventionOutcomeUpdate(Request $request)
  3702.     {    
  3703.         $em $this->mr->getManager('slave');
  3704.         $interventionOutcome $em->getRepository('App\Entity\Slave\InterventionOutcome')->findOneById($request->request->get("outcomeId"));
  3705.         return new Response(json_encode(array(
  3706.             "code" => 200,
  3707.             "success" => true,
  3708.             "suspensionTo" => $interventionOutcome->isSuspensionToRequired(),
  3709.             "referent" => $interventionOutcome->isReferentRequired(),
  3710.             "motivation" => $interventionOutcome->isMotivationRequired(),
  3711.             "phone" => $interventionOutcome->isPhoneRequired(),
  3712.             "photo" => $interventionOutcome->isPhotoRequired()
  3713.         ))); 
  3714.     }
  3715.     /**
  3716.      * @Route("/sistema-duplicati", name="user_ticket_duplicate_to_wrong")
  3717.      */        
  3718.     public function userTicketDuplicateToWrong(Request $request)
  3719.     {    
  3720.         $em $this->mr->getManager('slave');
  3721.         $wrongStatus $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBySlug("wrong");
  3722.         $tickets $em->getRepository('App\Entity\Slave\Ticket')->findAll();
  3723.         $ticketId null;
  3724.         $skipId = array();
  3725.         $wrongTicketArray = array();
  3726.         foreach($tickets as $ticket){
  3727.             $ticketId $ticket->getId();
  3728.             if(!in_array($ticketId$skipId)){
  3729.                 foreach($tickets as $innerTicket){
  3730.                     if($ticketId != $innerTicket->getId() && $ticket->getNumber() == $innerTicket->getNumber() && $ticket->getTermid()->getCode() == $innerTicket->getTermid()->getCode() && $innerTicket->getStatus()->getId() < 4){
  3731.                         array_push($skipId$innerTicket->getId());
  3732.                         array_push($wrongTicketArray$ticket);
  3733.                     }
  3734.                 }
  3735.             }
  3736.         }
  3737.         foreach($wrongTicketArray as $wt){
  3738.             TicketService::createTicketLog($em$this->getUser(), $ticket"cs"$wt->getStatus(), $wrongStatus->getValue());
  3739.             $wt->setStatus($wrongStatus);
  3740.         }
  3741.         $em->flush();
  3742.         return $this->redirectToRoute("user_ticket_list");
  3743.     }
  3744.     /**
  3745.      * @Route("/sposta-temp", name="user_ticket_move_to_temp")
  3746.      */
  3747.     public function userTicketmoveToTemp(Request $request)
  3748.     {    
  3749.         $em $this->mr->getManager('slave');
  3750.         $tempStatus $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBySlug("temp");
  3751.         $ticketArray = [];
  3752.         foreach($ticketArray as $array){
  3753.             $ts $em->getRepository('App\Entity\Slave\Ticket')->findAllByNumber($array[0]);
  3754.             foreach($ts as $t){
  3755.                 if($t->getTermid()->getCode() == $array[1] && $t->getStatus()->getId() < 4){
  3756.                     TicketService::createTicketLog($em$this->getUser(), $ticket"cs"$t->getStatus(), $tempStatus->getValue());
  3757.                     $t->setStatus($tempStatus);
  3758.                 }
  3759.             }
  3760.         }
  3761.         $em->flush();
  3762.         return $this->redirectToRoute("user_ticket_list");
  3763.     }
  3764. }