src/Controller/User/UserUserController.php line 88

Open in your IDE?
  1. <?php
  2. namespace App\Controller\User;
  3. use App\Entity\Slave\JoinTableTechnicianAreaOperationTariffAmount;
  4. use App\Entity\Slave\JoinTableTechnicianOperationDefault;
  5. use App\Entity\Slave\JoinTableUserSupplier;
  6. use App\Entity\Slave\JoinTableUserWarehouse;
  7. use App\Entity\Slave\TechnicianArea;
  8. use App\Entity\Slave\User;
  9. use App\Entity\Slave\UserDocument;
  10. use App\Entity\Slave\UserProfile;
  11. use App\Entity\Slave\UserHoliday;
  12. use App\Form\Default\PasswordChangeType;
  13. use App\Form\Model\PasswordChange;
  14. use App\Form\Master\CompanyAccessType;
  15. use App\Form\Slave\JoinTableUserSupplierType;
  16. use App\Form\Slave\JoinTableUserSupplierAutoAssignType;
  17. use App\Form\Slave\JoinTableUserWarehouseNewType;
  18. use App\Form\Slave\JoinTableUserWarehouseEditType;
  19. use App\Form\Slave\JoinTableTechnicianAreaOperationTariffAmountCloneType;
  20. use App\Form\Slave\JoinTableTechnicianAreaOperationTariffAmountCloneProvinceType;
  21. use App\Form\Slave\TechnicianAreaType;
  22. use App\Form\Slave\TechnicianEconomicType;
  23. use App\Form\Slave\TechnicianTicketSettingsType;
  24. use App\Form\Slave\UserProfileEditType;
  25. use App\Form\Slave\UserDocumentNewType;
  26. use App\Form\Slave\UserDocumentEditType;
  27. use App\Form\Slave\UserHolidayType;
  28. use App\Form\Slave\UserProfileType;
  29. use App\Form\Slave\UserStaffType;
  30. use App\Form\Slave\UserTechnicianSettingsType;
  31. use App\Form\Slave\UserTechnicianType;
  32. use App\Service\FilterService;
  33. use App\Service\FormValidatorService;
  34. use App\Service\MediaService;
  35. use App\Service\TechnicianTariffService;
  36. use App\Service\ValidationService;
  37. use Doctrine\Persistence\ManagerRegistry;
  38. use Knp\Component\Pager\PaginatorInterface;
  39. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  40. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  41. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  42. use Spipu\Html2Pdf\Html2Pdf;
  43. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  44. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  45. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  46. use Symfony\Component\Filesystem\Filesystem;
  47. use Symfony\Component\Form\FormError;
  48. use Symfony\Component\Form\FormFactoryInterface;
  49. use Symfony\Component\HttpFoundation\Request;
  50. use Symfony\Component\HttpFoundation\Response;
  51. use Symfony\Component\HttpFoundation\StreamedResponse;
  52. use Symfony\Component\HttpFoundation\ResponseHeaderBag;
  53. use Symfony\Component\Mailer\MailerInterface;
  54. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  55. use Symfony\Component\Routing\Annotation\Route;
  56. use Symfony\Component\Validator\Validator\ValidatorInterface;
  57. use Symfony\Component\Validator\Constraints as Assert;
  58. /**
  59.  * @Route("/scrivania/utenti")
  60.  * @Security("is_granted('ROLE_USER') and is_granted('active', user)")
  61.  */
  62. class UserUserController extends AbstractController
  63. {
  64.     private $mr;
  65.     private $params;
  66.     public function __construct(ManagerRegistry $mrParameterBagInterface $params)
  67.     {
  68.         $this->mr $mr;
  69.         $this->params $params;
  70.     }
  71.     
  72.     /**
  73.      * @Route("/", name="user_users_index")
  74.      * @Security("is_granted('view', 'staff') || is_granted('view', 'technician')")
  75.      */
  76.     public function userUsersIndex(Request $requestFormFactoryInterface $formFactoryValidatorInterface $validator)
  77.     {           
  78.         return $this->render('role/user/users/index.html.twig');
  79.     }
  80.     /**
  81.      * @Route("/profilo", name="user_user_profile")
  82.      */
  83.     public function userUserProfile(Request $requestUserPasswordHasherInterface $passwordHasherFormFactoryInterface $formFactoryValidatorInterface $validator)
  84.     {    
  85.         $em $this->mr->getManager('slave');
  86.         $emMaster $this->mr->getManager('master');
  87.         $session $request->getSession();
  88.         $company $emMaster->getRepository("App\Entity\Master\Company")->findOneById($session->get("companyId"));
  89.         $cities $emMaster->getRepository("App\Entity\Master\City")->findByName('');
  90.         $zip $emMaster->getRepository('App\Entity\Master\Zip')->findOneByCode($this->getUser()->getProfile()->getZip());
  91.         $operationGroups $em->getRepository('App\Entity\Slave\OperationGroup')->findAllOrderedByUav();
  92.         $profile $this->getUser()->getProfile();
  93.         // EDIT DATA
  94.         $formData $formFactory->createNamed("user_profile"UserProfileEditType::class, $profile);
  95.         $formData->handleRequest($request);
  96.         if($formData->isSubmitted()){
  97.             if($formData->isValid()){
  98.                 $newZip $emMaster->getRepository('App\Entity\Master\Zip')->findOneById($formData->get('zip')->getData());
  99.                 $profile->setIdCity($formData->get('cityId')->getData());
  100.                 $profile->setZip($newZip->getCode());
  101.                 $this->addFlash('notice_success''Modifiche salvate!');
  102.                 $em->flush();
  103.                 return $this->redirectToRoute('user_user_profile');
  104.             }
  105.             else{
  106.                 $session->set('openModalData'true);
  107.             }
  108.         }
  109.         // SETTINGS
  110.         $user $this->getUser();
  111.         $formSettings $formFactory->createNamed("form_user_settings"UserTechnicianSettingsType::class, $user);
  112.         $formSettings->handleRequest($request);
  113.         if($formSettings->isSubmitted()){
  114.             if($formSettings->isValid()){
  115.                 $this->addFlash('notice_success''Modifiche salvate!');
  116.                 $em->flush();
  117.                 return $this->redirectToRoute('user_user_profile');
  118.             }
  119.         }
  120.         // PASSWORD CHANGE
  121.         $passwordChange = new PasswordChange();
  122.         $formPassword $this->createForm(PasswordChangeType::class, $passwordChange);
  123.         $formPassword->handleRequest($request);
  124.         if($formPassword->isSubmitted()){
  125.             
  126.             $valid true;
  127.             $valid ValidationService::validateNotBlank($validator$formPassword->get('oldPassword'));
  128.             if($formPassword->get('newPassword')->getData() != null){
  129.                 $psw $formPassword->get('newPassword')->getData();
  130.                 $count 0;
  131.                 if(preg_match('/[0-9]/'$psw)) $count++;
  132.                 if(preg_match('/[a-z]/'$psw)) $count++;
  133.                 if(preg_match('/[A-Z]/'$psw)) $count++;
  134.                 if(preg_match('/[\!\#\$\&\(\)\.\+\-_]/'$psw)) $count++;
  135.                 if($count 3)
  136.                 {
  137.                     $formPassword->get('newPassword')->addError(new FormError("Inserisci una password RESISTENTE."));
  138.                     $valid false;
  139.                 }
  140.             }
  141.             if($valid && $formPassword->isValid()){
  142.                 if($passwordHasher->isPasswordValid($this->getUser(), $formPassword->get('oldPassword')->getData())){
  143.                     $newPassword $passwordHasher->hashPassword($this->getUser(), $formPassword->get("newPassword")->getData());
  144.                     $this->getUser()->setPassword($newPassword);
  145.                     $em->flush();
  146.                     
  147.                     $this->addFlash('notice_success'"La password รจ stata modificata con successo");
  148.                     
  149.                     return $this->redirect($request->server->get('HTTP_REFERER'));
  150.                 }
  151.                 else{
  152.                     $formPassword->get('oldPassword')->addError(New FormError('La password non coincide con quella salvata'));
  153.                     $session->set('openModalPassword'true);
  154.                 }
  155.             }
  156.             else{
  157.                 $session->set('openModalPassword'true);
  158.             }
  159.         }
  160.         $jttaotas = array();
  161.         foreach($this->getUser()->getTechnicianAreas() as $ta){
  162.             $jts $em->getRepository('App\Entity\Slave\JoinTableTechnicianAreaOperationTariffAmount')->findByTechnicianAndProvinceOrderedBySupplierAndOperation($this->getUser()->getId(), $ta->getIdProvince());
  163.             $tmp = array();
  164.             array_push($tmp$ta->getIdProvince(), $jts);
  165.             array_push($jttaotas$tmp);
  166.         }
  167.         return $this->render('role/user/users/profile.html.twig', array(
  168.             'company' => $company,
  169.             'zip' => $zip,
  170.             'cities' => $cities,
  171.             'operationGroups' => $operationGroups,
  172.             'jttaotas' => $jttaotas,
  173.             'formData' => $formData->createView(),
  174.             'formSettings' => $formSettings->createView(),
  175.             'formPassword' => $formPassword->createView()
  176.         ));
  177.     }
  178.     
  179.     /**
  180.      * @Route("/profilo/imposta-principale", name="user_user_profile_main")
  181.      */
  182.     public function userUserProfileMain(Request $request)
  183.     {
  184.         $em $this->mr->getManager();
  185.         $jtuw $em->getRepository('App\Entity\Slave\JoinTableUserWarehouse')->findOneById($request->request->get('jtuwId'));
  186.         foreach($this->getUser()->getWarehouses() as $jt)
  187.             $jt->setMain(false);
  188.         $jtuw->setMain(true);
  189.         $em->flush();
  190.         $this->addFlash('notice_success'"Magazzino principale aggiornato");
  191.         return $this->redirectToRoute('user_user_profile');
  192.     }
  193.     /**
  194.      * @Route("/profilo/economico-esporta", name="user_user_profile_economic_export")
  195.      */
  196.     public function userUserProfileEconomicExport(Request $request)
  197.     {
  198.         $em $this->mr->getManager('slave');
  199.         $emMaster $this->mr->getManager('master');
  200.         $session $request->getSession();
  201.         $year $request->request->get('year');
  202.         $month $request->request->get('month');
  203.         $allInterventions $em->getRepository("App\Entity\Slave\Intervention")->findByTechnicianToPayByYearAndMonth($this->getUser()->getId(), $year$month);
  204.         // Rimuovo gli interventi che hanno una sospensione -> Gestita e non approvata / Non gestita
  205.         $interventions = array();
  206.         foreach($allInterventions as $int){
  207.             $toCalculate true;
  208.             if($int->getSuspension() != null && ($int->getSuspension()->isManaged() == false || $int->getSuspension()->isApproved() == false))
  209.                 $toCalculate false;
  210.             if($toCalculate)
  211.                 array_push($interventions$int);
  212.         }
  213.         $response = new StreamedResponse();
  214.         $response->setCallback(function() use($emMaster$interventions) {
  215.             $handle fopen('php://output''w+');
  216.             fputcsv($handle, array('Provincia','Citta','CAP','Operazione','Ticket','Cliente','Term ID','Data/Ora','Esito','Attivita svolte','SLA','Paga intervento'), ";"'"'"\\");
  217.             
  218.             $provinceSign '';
  219.             $cityName '';
  220.             $zip '';
  221.             $operation '';
  222.             $ticket '';
  223.             $client '';
  224.             $termid '';
  225.             $datetime '';
  226.             $outcome '';
  227.             $slaOutbound '';
  228.             $total 0;
  229.             $totalTotal 0;
  230.             foreach($interventions as $int){
  231.             
  232.                 $provinceSign $emMaster->getRepository('App\Entity\Master\Province')->findOneById($int->getTicket()->getIdProvince())->getSign();
  233.                 $cityName $emMaster->getRepository('App\Entity\Master\City')->findOneById($int->getTicket()->getIdCity())->getName();
  234.                 $zip $int->getTicket()->getZip();
  235.                 $operation $int->getTicket()->getOperation();
  236.                 $ticket $int->getTicket()->getNumber();
  237.                 $client $int->getTicket()->getClient();
  238.                 $termid $int->getTicket()->getTermid();
  239.                 $datetime $int->getDatetime()->format('d-m-Y H:i');
  240.                 $outcome $int->getOutcomeType().' - '.$int->getOutcome();
  241.                 $activities '';
  242.                 $first true;
  243.                 foreach($int->getActivities() as $act){
  244.                     if($first$first false; else $activities.= ' --- ';
  245.                     if($act->getProductWithdraw() != null){
  246.                         $pr $act->getProductWithdraw();
  247.                         $codeProd $act->getProducerWithdraw();
  248.                         $codeSupp $act->getSupplierWithdraw();
  249.                     }
  250.                     if($act->getProductActual() != null){
  251.                         $pr $act->getProductActual();
  252.                         $codeProd $act->getProducerActual();
  253.                         $codeSupp $act->getSupplierActual();
  254.                     }
  255.                     if($act->getProductInstallation() != null){
  256.                         $pr $act->getProductInstallation();
  257.                         $codeProd $act->getProducerInstallation();
  258.                         $codeSupp $act->getSupplierInstallation();
  259.                     }
  260.                     $activities.= $act->getType();
  261.                 }
  262.                 $slaOutbound $int->getSlaOutboundPercentage();
  263.                 $total $int->calculateTotalTechnicianAmount(true);
  264.                 $totalTotal $totalTotal $total;
  265.                 fputcsv($handle, array($provinceSign$cityName$zip$operation$ticket$client$termid$datetime$outcome$activities$slaOutboundnumber_format($total2'.'',')), ";"'"'"\\");
  266.             }
  267.             fputcsv($handle, array('Totale'''''''''''''''''''number_format($totalTotal2'.'',')), ";"'"'"\\");
  268.             fclose($handle);
  269.         });
  270.     
  271.         $response->setStatusCode(200);
  272.         $dispositionHeader $response->headers->makeDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT'Profilo economico '.$this->getUser().' --- '.$year.'-'.$month.'.csv');
  273.         $response->headers->set('Content-Type''text/csv; charset=ISO-8859-15');
  274.         $response->headers->set('Content-Disposition'$dispositionHeader);
  275.         return $response;
  276.     }
  277.     /**
  278.      * @Route("/profilo/economico-crea-pdf", name="user_user_profile_economic_pdf")
  279.      */
  280.     public function userUserProfileEconomicPdf(Request $request)
  281.     {
  282.         $em $this->mr->getManager('slave');
  283.         $emMaster $this->mr->getManager('master');
  284.         $session $request->getSession();
  285.         $company $emMaster->getRepository("App\Entity\Master\Company")->findOneById($session->get("companyId"));
  286.         $year $request->request->get('year');
  287.         $month $request->request->get('month');
  288.         $allInterventions $em->getRepository("App\Entity\Slave\Intervention")->findByTechnicianToPayByYearAndMonth($this->getUser()->getId(), $year$month);
  289.         // Rimuovo gli interventi che hanno una sospensione -> Gestita e non approvata / Non gestita
  290.         $interventions = array();
  291.         foreach($allInterventions as $int){
  292.             $toCalculate true;
  293.             if($int->getSuspension() != null && ($int->getSuspension()->isManaged() == false || $int->getSuspension()->isApproved() == false))
  294.                 $toCalculate false;
  295.             if($toCalculate)
  296.                 array_push($interventions$int);
  297.         }
  298.         
  299.         $html2pdf = new Html2Pdf('P''A4''it'true'UTF-8', array(5555), false);
  300.         $html2pdf->writeHTML($this->renderView('role/user/print/economic.html.twig', array(
  301.             'company' => $company,
  302.             'interventions' => $interventions,
  303.             'year' => $year,
  304.             'month' => $month
  305.         )));
  306.         ob_end_clean();
  307.         
  308.         $html2pdf->Output('Profilo economico '.$this->getUser().' --- '.$year.'-'.$month.'.pdf''D');
  309.     }
  310.     // STAFF
  311.         /**
  312.          * @Route("/staff", name="user_users_staff")
  313.          * @Security("is_granted('view', 'staff')")
  314.          */
  315.         public function userUsersStaff(Request $requestPaginatorInterface $paginatorFormFactoryInterface $formFactoryValidatorInterface $validator)
  316.         {    
  317.             $em $this->mr->getManager('slave');
  318.             $emMaster $this->mr->getManager('master');
  319.             $session $request->getSession();
  320.             $cities $emMaster->getRepository("App\Entity\Master\City")->findByName('');
  321.             $filters FilterService::userFilter($request);
  322.             $usersQuery $em->getRepository("App\Entity\Slave\User")->queryStaffUsersFiltered($filters$this->getUser()->getId());
  323.             $users $paginator->paginate($usersQuery$request->getSession()->get($request->get("_route")."_page"), 50);
  324.             $user = new User();
  325.             $form $formFactory->createNamed("user"UserStaffType::class, $user);
  326.             $form->handleRequest($request);
  327.             if($form->isSubmitted()){
  328.                 $valid true;
  329.                 if($valid$valid ValidationService::validateNotBlank($validator$form->get('name'));
  330.                 if($valid$valid ValidationService::validateLength($form->get('name'), '191');
  331.                 if($valid$valid ValidationService::validateNotBlank($validator$form->get('surname'));
  332.                 if($valid$valid ValidationService::validateLength($form->get('surname'), '191');
  333.                 if($valid$valid ValidationService::validateNotBlank($validator$form->get('phone'));
  334.                 if($valid$valid ValidationService::validateLength($form->get('phone'), '191');
  335.                 if($valid$valid ValidationService::validateLength($form->get('address'), '191');
  336.                 if($valid$valid ValidationService::validateLength($form->get('civic'), '191');
  337.                 if($valid$valid ValidationService::validateLength($form->get('zip'), '5');
  338.                 if($valid && $form->isValid()){
  339.                     $user->setRole('ROLE_USER');
  340.                     $user->setAdminActive(true);
  341.                     $em->persist($user);
  342.                     $userProfile = new UserProfile();
  343.                     $userProfile->setUser($user);
  344.                     $userProfile->setName($form->get('name')->getData());
  345.                     $userProfile->setSurname($form->get('surname')->getData());
  346.                     $userProfile->setPhone($form->get('phone')->getData());
  347.                     if($form->get('address')->getData() != null$userProfile->setAddress($form->get('address')->getData());
  348.                     if($form->get('civic')->getData() != null$userProfile->setCivic($form->get('civic')->getData());
  349.                     if($form->get('zip')->getData() != null$userProfile->setZip($emMaster->getRepository('App\Entity\Master\Zip')->findOneById($form->get('zip')->getData())->getCode());
  350.                     if($form->get('cityId')->getData() != null$userProfile->setIdCity($form->get('cityId')->getData());
  351.                     $em->persist($userProfile);
  352.                     $em->flush();
  353.                     $this->addFlash('notice_success'"Nuovo membro dello staff inserito");
  354.                     $session->set('userId'$user->getId());
  355.                     return $this->redirectToRoute('user_users_staff');
  356.                 }
  357.                 else
  358.                     $session->set('openModal'true);
  359.             }
  360.             return $this->render('role/user/users/staff/list.html.twig', array(
  361.                 'users' => $users,
  362.                 'cities' => $cities,
  363.                 'filters' => $filters,
  364.                 'form' => $form->createView()
  365.             ));
  366.         }
  367.             
  368.         /**
  369.          * @Route("/staff/invia-credenziali", name="user_users_staff_send_credentials")
  370.          * @Security("is_granted('edit', 'staff')")
  371.          */
  372.         public function userUsersStaffSendCredentials(Request $requestMailerInterface $mailer)
  373.         {
  374.             $em $this->mr->getManager('slave');
  375.             $emMaster $this->mr->getManager('master');
  376.             $session $request->getSession();
  377.             $company $emMaster->getRepository('App\Entity\Master\Company')->findOneById($session->get('companyId'));
  378.             $user $em->getRepository('App\Entity\Slave\User')->findOneById($request->request->get('userSendCredentialsId'));
  379.             $user->setOneTimeCode(md5(uniqid()));
  380.             $user->setExpirationOneTimeCode(date_modify(new \DateTime(), '+3 hours'));
  381.             $em->flush();
  382.             // INVIA EMAIL CON LINK PER CREARE NUOVA PASSWORD
  383.             $message = (new TemplatedEmail())
  384.                 ->from($this->params->get('email_noreply'))
  385.                 ->to($user->getEmail())
  386.                 ->subject($this->params->get('subject_create_password'))
  387.                 ->htmlTemplate('email/user_credentials.html.twig')
  388.                 ->context(['user' => $user'company' => $company]);
  389.             $mailer->send($message);
  390.             $this->addFlash('notice_success''Credenziali inviate!');
  391.             return $this->redirectToRoute('user_users_staff');
  392.         }
  393.         /**
  394.          * @Route("/{userId}/staff/scheda", name="user_users_staff_sheet")
  395.          * @Security("is_granted('view', 'staff')")
  396.          */
  397.         public function userUsersStaffSheet($userIdRequest $requestFormFactoryInterface $formFactoryValidatorInterface $validatorFileSystem $fs)
  398.         {    
  399.             $em $this->mr->getManager('slave');
  400.             $emMaster $this->mr->getManager('master');
  401.             $session $request->getSession();
  402.             $user $em->getRepository('App\Entity\Slave\User')->findOneById($userId);
  403.             $cities $emMaster->getRepository("App\Entity\Master\City")->findByName('');
  404.             $company $emMaster->getRepository("App\Entity\Master\Company")->findOneById($session->get("companyId"));
  405.             $uploadDir $this->params->get('kernel.project_dir').'/'.$this->params->get('web_path').'/companies/'.$company->getDirectoryPath().'/users/';
  406.             $oldZipId null;
  407.             if($user->getProfile()->getZip() != null){
  408.                 $oldZip $emMaster->getRepository('App\Entity\Master\Zip')->findOneByCode($user->getProfile()->getZip());
  409.                 $oldZipId $oldZip->getId();
  410.             }
  411.             // Anagrafica
  412.             $form $formFactory->createNamed("user_profile"UserProfileType::class, $user->getProfile());
  413.             $form->handleRequest($request);
  414.             if($form->isSubmitted()){
  415.                 $valid true;
  416.                 if($valid$valid ValidationService::validateNotBlank($validator$form->get('email'));
  417.                 if($valid$valid ValidationService::validateNotBlank($validator$form->get('accountType'));
  418.                 if($valid$valid ValidationService::validateNotBlank($validator$form->get('cityId'));
  419.                 if($valid$valid ValidationService::validateNotBlank($validator$form->get('zip'));
  420.                 if($valid && $form->isValid()){
  421.                     $user->setEmail($form->get('email')->getData());
  422.                     $user->setAccountType($form->get('accountType')->getData());
  423.                     $user->getProfile()->setIdCity($form->get('cityId')->getData());
  424.                     $zip $emMaster->getRepository('App\Entity\Master\Zip')->findOneById($form->get('zip')->getData());
  425.                     $user->getProfile()->setZip($zip->getCode());
  426.                     $em->flush();
  427.                     $this->addFlash('notice_success'"Modifiche salvate");
  428.                     return $this->redirectToRoute('user_users_staff_sheet', array('userId' => $user->getId()));
  429.                 }
  430.                 else
  431.                     $session->set('openModal'true);
  432.             }
  433.             // Documenti
  434.             $document = new UserDocument();
  435.             $formDocumentNew $formFactory->createNamed("document_new"UserDocumentNewType::class, $document);
  436.             $formDocumentNew->handleRequest($request);
  437.             if($formDocumentNew->isSubmitted()){
  438.                 $valid ValidationService::validateFile($validator$formDocumentNew->get('path'), true$formDocumentNew->get('file')->getData(), '5', array('pdf''doc''docx''jpg''jpeg''png''webp'));
  439.                 if($valid && $formDocumentNew->isValid()){
  440.                     $document->setUser($user);
  441.                     switch($formDocumentNew->get('file')->getData()->guessExtension()){
  442.                         case 'pdf':
  443.                         case 'doc':
  444.                         case 'docx':
  445.                             MediaService::uploadDocument($formDocumentNew->get('file')->getData(), $uploadDir$document'document');
  446.                             break;
  447.                         case 'jpg':
  448.                         case 'jpeg':
  449.                         case 'png':
  450.                         case 'webp':
  451.                             MediaService::uploadImage($fs$formDocumentNew->get('file')->getData(), null$uploadDir$document'path'1001000200false);
  452.                             break;
  453.                         default: break;
  454.                     }
  455.                     $em->persist($document);
  456.                     $em->flush();
  457.                     $this->addFlash('notice_success'"Documento inserito");
  458.                     return $this->redirectToRoute('user_users_staff_sheet', array('userId' => $user->getId()));
  459.                 }
  460.                 else
  461.                     $session->set('openModalDocumentNew'true);
  462.             }
  463.             
  464.             $formDocumentEdit $formFactory->createNamed("document_edit"UserDocumentEditType::class, $document);
  465.             $formDocumentEdit->handleRequest($request);
  466.             if($formDocumentEdit->isSubmitted()){
  467.                 if($formDocumentEdit->isValid()){
  468.                     $editDocument $em->getRepository("App\Entity\Slave\UserDocument")->findOneById($request->request->get('id'));
  469.                     $editDocument->setName($formDocumentEdit->get('name')->getData());
  470.                     $em->flush();
  471.                     $this->addFlash('notice_success'"Documento modificato");
  472.                     return $this->redirectToRoute('user_users_staff_sheet', array('userId' => $user->getId()));
  473.                 }
  474.                 else{
  475.                     $session->set('openModalDocumentEdit'true);
  476.                     $session->set('openModalDocumentEditId'$request->request->get('id'));
  477.                 }
  478.             }
  479.             return $this->render('role/user/users/staff/sheet.html.twig', array(
  480.                 'company' => $company,
  481.                 'user' => $user,
  482.                 'idZip' => $oldZipId,
  483.                 'cities' => $cities,
  484.                 'form' => $form->createView(),
  485.                 'formDocumentNew' => $formDocumentNew->createView(),
  486.                 'formDocumentEdit' => $formDocumentEdit->createView()
  487.             ));
  488.         }
  489.         /**
  490.          * @Route("/staff/scheda/documento-elimina", name="user_users_staff_document_delete")
  491.          * @Security("is_granted('edit', 'staff')")
  492.          */
  493.         public function userUsersStaffDocumentDelete(Request $requestFileSystem $fs)
  494.         {    
  495.             $em $this->mr->getManager('slave');
  496.             $emMaster $this->mr->getManager('master');
  497.             $session $request->getSession();
  498.             $company $emMaster->getRepository("App\Entity\Master\Company")->findOneById($session->get("companyId"));
  499.             $uploadDir $this->params->get('kernel.project_dir').'/'.$this->params->get('web_path').'/companies/'.$company->getDirectoryPath().'/users/';
  500.             $document $em->getRepository("App\Entity\Slave\UserDocument")->findOneById($request->request->get("documentDelId"));
  501.             $userId $document->getUser()->getId();
  502.             MediaService::removeDocument($fs$document->getPath(), $uploadDir);
  503.             $em->remove($document);
  504.             $em->flush();
  505.             
  506.             $this->addFlash('notice_success'"Documento eliminato");
  507.             return $this->redirectToRoute('user_users_staff_sheet', array('userId' => $userId));
  508.         }
  509.         /**
  510.          * @Route("/staff/cambia-stato", name="user_users_staff_change_status")
  511.          * @Security("is_granted('edit', 'staff')")
  512.          */
  513.         public function userUsersStaffChangeStatus(Request $request)
  514.         {    
  515.             $em $this->mr->getManager('slave');
  516.             $session $request->getSession();
  517.             $user $em->getRepository("App\Entity\Slave\User")->findOneById($request->request->get("userChangeId"));
  518.             $user->setCompanyActive(!$user->isCompanyActive());
  519.             $em->flush();
  520.             
  521.             $this->addFlash('notice_success'"Stato aggiornato");
  522.             return $this->redirectToRoute('user_users_staff');
  523.         }
  524.         /**
  525.          * @Route("/staff/elimina", name="user_users_staff_delete")
  526.          * @Security("is_granted('edit', 'staff')")
  527.          */
  528.         public function userUsersStaffDelete(Request $request)
  529.         {    
  530.             $em $this->mr->getManager('slave');
  531.             $user $em->getRepository("App\Entity\Slave\User")->findOneById($request->request->get("userDelId"));
  532.             $em->remove($user->getProfile());
  533.             $em->remove($user);
  534.             $em->flush();
  535.             $this->addFlash('notice_success'"Membro dello staff eliminato");
  536.             return $this->redirectToRoute('user_users_staff');
  537.         }
  538.     //
  539.     // TECNICI
  540.         /**
  541.          * @Route("/tecnici", name="user_users_technicians")
  542.          * @Security("is_granted('view', 'technician')")
  543.          */
  544.         public function userUsersTechnicians(Request $requestPaginatorInterface $paginatorFormFactoryInterface $formFactoryValidatorInterface $validator)
  545.         {    
  546.             $em $this->mr->getManager('slave');
  547.             $emMaster $this->mr->getManager('master');
  548.             $session $request->getSession();
  549.             $cities $emMaster->getRepository("App\Entity\Master\City")->findByName('');
  550.             $filters FilterService::userFilter($request);
  551.             $activeTechniciansQuery $em->getRepository("App\Entity\Slave\User")->queryTechnicianUsersByCompanyActiveFiltered(true1$filters);
  552.             $activeTechnicians $paginator->paginate($activeTechniciansQuery$request->getSession()->get($request->get("_route")."_page"), 50);
  553.             
  554.             $deactiveTechniciansQuery $em->getRepository("App\Entity\Slave\User")->queryTechnicianUsersByCompanyActiveFiltered(true0$filters);
  555.             $deactiveTechnicians $paginator->paginate($deactiveTechniciansQuery$request->getSession()->get($request->get("_route")."_page"), 50);
  556.             $countActiveTechnicians sizeof($activeTechnicians);
  557.             $countTotalTechnicians sizeof($activeTechnicians) + sizeof($deactiveTechnicians);
  558.             $user = new User();
  559.             $form $formFactory->createNamed("user"UserTechnicianType::class, $user);
  560.             $form->handleRequest($request);
  561.             if($form->isSubmitted()){
  562.                 $valid true;
  563.                 if($valid$valid ValidationService::validateNotBlank($validator$form->get('name'));
  564.                 if($valid$valid ValidationService::validateLength($form->get('name'), '191');
  565.                 if($valid$valid ValidationService::validateNotBlank($validator$form->get('surname'));
  566.                 if($valid$valid ValidationService::validateLength($form->get('surname'), '191');
  567.                 if($valid$valid ValidationService::validateNotBlank($validator$form->get('phone'));
  568.                 if($valid$valid ValidationService::validateLength($form->get('phone'), '191');
  569.                 if($valid$valid ValidationService::validateLength($form->get('address'), '191');
  570.                 if($valid$valid ValidationService::validateLength($form->get('civic'), '191');
  571.                 if($valid$valid ValidationService::validateLength($form->get('zip'), '5');
  572.                 if($valid && $form->isValid()){
  573.                     $user->setRole('ROLE_USER');
  574.                     $user->setAdminActive(true);
  575.                     $em->persist($user);
  576.                     $userProfile = new UserProfile();
  577.                     $userProfile->setUser($user);
  578.                     $userProfile->setName($form->get('name')->getData());
  579.                     $userProfile->setSurname($form->get('surname')->getData());
  580.                     $userProfile->setPhone($form->get('phone')->getData());
  581.                     if($form->get('address')->getData() != null$userProfile->setAddress($form->get('address')->getData());
  582.                     if($form->get('civic')->getData() != null$userProfile->setCivic($form->get('civic')->getData());
  583.                     if($form->get('zip')->getData() != null$userProfile->setZip($emMaster->getRepository('App\Entity\Master\Zip')->findOneById($form->get('zip')->getData())->getCode());
  584.                     if($form->get('cityId')->getData() != null$userProfile->setIdCity($form->get('cityId')->getData());
  585.                     $em->persist($userProfile);
  586.                     $em->flush();
  587.                     $this->addFlash('notice_success'"Nuovo tecnico inserito");
  588.                     $session->set('userId'$user->getId());
  589.                     return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $user->getId()));
  590.                 }
  591.                 else
  592.                     $session->set('openModal'true);
  593.             }
  594.             return $this->render('role/user/users/technician/list.html.twig', array(
  595.                 'activeTechnicians' => $activeTechnicians,
  596.                 'deactiveTechnicians' => $deactiveTechnicians,
  597.                 'countTotalTechnicians' => $countTotalTechnicians,
  598.                 'countActiveTechnicians' => $countActiveTechnicians,
  599.                 'cities' => $cities,
  600.                 'filters' => $filters,
  601.                 'form' => $form->createView()
  602.             ));
  603.         }
  604.             
  605.         /**
  606.          * @Route("/tecnici/invia-credenziali", name="user_users_technician_send_credentials")
  607.          * @Security("is_granted('edit', 'technician')")
  608.          */
  609.         public function userUsersTechnicianSendCredentials(Request $requestMailerInterface $mailer)
  610.         {
  611.             $em $this->mr->getManager('slave');
  612.             $emMaster $this->mr->getManager('master');
  613.             $session $request->getSession();
  614.             $company $emMaster->getRepository('App\Entity\Master\Company')->findOneById($session->get('companyId'));
  615.             $user $em->getRepository('App\Entity\Slave\User')->findOneById($request->request->get('userSendCredentialsId'));
  616.             $user->setOneTimeCode(md5(uniqid()));
  617.             $user->setExpirationOneTimeCode(date_modify(new \DateTime(), '+3 hours'));
  618.             $em->flush();
  619.             // INVIA EMAIL CON LINK PER CREARE NUOVA PASSWORD
  620.             $message = (new TemplatedEmail())
  621.                 ->from($this->params->get('email_noreply'))
  622.                 ->to($user->getEmail())
  623.                 ->subject($this->params->get('subject_create_password'))
  624.                 ->htmlTemplate('email/user_credentials.html.twig')
  625.                 ->context(['user' => $user'company' => $company]);
  626.             $mailer->send($message);
  627.             $this->addFlash('notice_success''Credenziali inviate!');
  628.             return $this->redirectToRoute('user_users_technicians');
  629.         }
  630.         /**
  631.          * @Route("/tecnici/cambia-stato", name="user_users_technician_change_status")
  632.          * @Security("is_granted('edit', 'technician')")
  633.          */
  634.         public function userUsersTechnicianChangeStatus(Request $request)
  635.         {    
  636.             $em $this->mr->getManager('slave');
  637.             $session $request->getSession();
  638.             $user $em->getRepository("App\Entity\Slave\User")->findOneById($request->request->get("userChangeId"));
  639.             $user->setCompanyActive(!$user->isCompanyActive());
  640.             $em->flush();
  641.             
  642.             $this->addFlash('notice_success'"Stato aggiornato");
  643.             return $this->redirectToRoute('user_users_technicians');
  644.         }
  645.         /**
  646.          * @Route("/tecnici/elimina", name="user_users_technician_delete")
  647.          * @Security("is_granted('edit', 'technician')")
  648.          */
  649.         public function userUsersTechnicianDelete(Request $request)
  650.         {    
  651.             $em $this->mr->getManager('slave');
  652.             $user $em->getRepository("App\Entity\Slave\User")->findOneById($request->request->get("userDelId"));
  653.             foreach($user->getTechnicianAreas() as $ta)
  654.                 $em->remove($ta);
  655.             $em->remove($user->getProfile());
  656.             $em->remove($user);
  657.             $em->flush();
  658.             $this->addFlash('notice_success'"Tecnico eliminato");
  659.             return $this->redirectToRoute('user_users_technicians');
  660.         }
  661.         /**
  662.          * @Route("/tecnici/esporta-csv", name="user_users_technician_export")
  663.          * @Security("is_granted('view', 'technician')")
  664.          */
  665.         public function userUsersTechnicianExport(Request $request)
  666.         {    
  667.             $em $this->mr->getManager('slave');
  668.             $emMaster $this->mr->getManager('master');
  669.             $session $request->getSession();
  670.             $filters $session->get('user_users_technicians_filters');
  671.             $technicians $em->getRepository("App\Entity\Slave\User")->findTechnicianUsersFiltered($filters);
  672.             $response = new StreamedResponse();
  673.             $response->setCallback(function() use($emMaster$technicians) {
  674.                 $handle fopen('php://output''w+');
  675.                 fputcsv($handle, array('Attivo''Nome','Cognome','Codice fiscale','Partita IVA','Email aziendale','Telefono aziendale','Email personale','Telefono personale','Indirizzo'), ";"'"'"\\");
  676.                 foreach($technicians as $t){
  677.                     $active 'No'; if($t->isCompanyActive() != null$active 'Sรฌ';
  678.                     $name null; if($t->getProfile()->getName() != null$name $t->getProfile()->getName();
  679.                     $surname null; if($t->getProfile()->getSurname() != null$surname $t->getProfile()->getSurname();
  680.                     $fiscalCode null; if($t->getProfile()->getFiscalCode() != null$fiscalCode $t->getProfile()->getFiscalCode();
  681.                     $vat null; if($t->getProfile()->getVat() != null$vat $t->getProfile()->getVat();
  682.                     $companyEmail null; if($t->getEmail() != null$companyEmail $t->getEmail();
  683.                     $companyPhone null; if($t->getProfile()->getPhone() != null$companyPhone $t->getProfile()->getPhone();
  684.                     $personalEmail null; if($t->getProfile()->getEmailPersonal() != null$personalEmail $t->getProfile()->getEmailPersonal();
  685.                     $personalPhone null; if($t->getProfile()->getPhonePersonal() != null$personalPhone $t->getProfile()->getPhonePersonal();
  686.                     $address null;
  687.                     if($t->getProfile()->getAddress() != null){
  688.                         $city $emMaster->getRepository('App\Entity\Master\City')->findOneById($t->getProfile()->getIdCity());
  689.                         if($city != null)
  690.                             $address $t->getProfile()->displayAddress().' '.$city->getName().' ('.$city->getProvince()->getSign().')';
  691.                         else
  692.                             $address $t->getProfile()->displayAddress();
  693.                     }
  694.                     fputcsv($handle, array($active$name$surname$fiscalCode$vat$companyEmail$companyPhone$personalEmail$personalPhone$address), ";"'"'"\\");
  695.                 }
  696.                 fclose($handle);
  697.             });
  698.             
  699.             $response->setStatusCode(200);
  700.             $dispositionHeader $response->headers->makeDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT'Elenco tecnici filtrati.csv');
  701.             $response->headers->set('Content-Type''text/csv; charset=ISO-8859-15');
  702.             $response->headers->set('Content-Disposition'$dispositionHeader);
  703.             return $response;
  704.         }
  705.         
  706.         /**
  707.          * @Route("/tecnici/{userId}/scheda", name="user_users_technician_sheet")
  708.          * @Security("is_granted('view', 'technician')")
  709.          */
  710.         public function userUsersTechnicianSheet($userIdRequest $requestFormFactoryInterface $formFactoryValidatorInterface $validatorFileSystem $fs)
  711.         {    
  712.             $em $this->mr->getManager('slave');
  713.             $emMaster $this->mr->getManager('master');
  714.             $session $request->getSession();
  715.             $company $emMaster->getRepository("App\Entity\Master\Company")->findOneById($session->get("companyId"));
  716.             $uploadDir $this->params->get('kernel.project_dir').'/'.$this->params->get('web_path').'/companies/'.$company->getDirectoryPath().'/users/';
  717.             $user $em->getRepository('App\Entity\Slave\User')->findOneById($userId);
  718.             $cities $emMaster->getRepository("App\Entity\Master\City")->findByName('');
  719.             
  720.             $oldZipId null;
  721.             if($user->getProfile()->getZip() != null){
  722.                 $oldZip $emMaster->getRepository('App\Entity\Master\Zip')->findOneByCode($user->getProfile()->getZip());
  723.                 $oldZipId $oldZip->getId();
  724.             }
  725.             $regionIds = array();
  726.             foreach($company->getRegions() as $r)
  727.                 array_push($regionIds$r->getId());
  728.             // Anagrafica - Dati tecnico
  729.             $formData $formFactory->createNamed("user_profile"UserProfileType::class, $user->getProfile());
  730.             $formData->handleRequest($request);
  731.             if($formData->isSubmitted()){
  732.                 
  733.                 $valid true;
  734.                 if($valid$valid ValidationService::validateNotBlank($validator$formData->get('email'));
  735.                 if($valid$valid ValidationService::validateNotBlank($validator$formData->get('accountType'));
  736.                 if($valid$valid ValidationService::validateNotBlank($validator$formData->get('cityId'));
  737.                 if($valid$valid ValidationService::validateNotBlank($validator$formData->get('zip'));
  738.                 if($valid && $formData->isValid()){
  739.                     $zip $emMaster->getRepository('App\Entity\Master\Zip')->findOneById($formData->get('zip')->getData());
  740.                     $user->setAccountType($formData->get('accountType')->getData());
  741.                     $user->setEmail($formData->get('email')->getData());
  742.                     $user->getProfile()->setIdCity($formData->get('cityId')->getData());
  743.                     $user->getProfile()->setZip($zip->getCode());
  744.                     $em->flush();
  745.                     $this->addFlash('notice_success'"Modifiche salvate");
  746.                     return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $user->getId()));
  747.                 }
  748.                 else
  749.                     $session->set('openModalData'true);
  750.             }
  751.         
  752.             // Anagrafica - Documenti
  753.             $document = new UserDocument();
  754.             $formDocumentNew $formFactory->createNamed("document_new"UserDocumentNewType::class, $document);
  755.             $formDocumentNew->handleRequest($request);
  756.             if($formDocumentNew->isSubmitted()){
  757.                 $valid ValidationService::validateFile($validator$formDocumentNew->get('path'), true$formDocumentNew->get('file')->getData(), '5', array('pdf''doc''docx''jpg''jpeg''png''webp'));
  758.                 if($valid && $formDocumentNew->isValid()){
  759.                     $document->setUser($user);
  760.                     switch($formDocumentNew->get('file')->getData()->guessExtension()){
  761.                         case 'pdf':
  762.                         case 'doc':
  763.                         case 'docx':
  764.                             MediaService::uploadDocument($formDocumentNew->get('file')->getData(), $uploadDir$document'document');
  765.                             break;
  766.                         case 'jpg':
  767.                         case 'jpeg':
  768.                         case 'png':
  769.                         case 'webp':
  770.                             MediaService::uploadImage($fs$formDocumentNew->get('file')->getData(), null$uploadDir$document'path'1001000200false);
  771.                             break;
  772.                         default: break;
  773.                     }
  774.                     $em->persist($document);
  775.                     $em->flush();
  776.                     $this->addFlash('notice_success'"Documento inserito");
  777.                     return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $user->getId()));
  778.                 }
  779.                 else
  780.                     $session->set('openModalDocumentNew'true);
  781.             }
  782.             
  783.             $formDocumentEdit $formFactory->createNamed("document_edit"UserDocumentEditType::class, $document);
  784.             $formDocumentEdit->handleRequest($request);
  785.             if($formDocumentEdit->isSubmitted()){
  786.                 if($formDocumentEdit->isValid()){
  787.                     $editDocument $em->getRepository("App\Entity\Slave\UserDocument")->findOneById($request->request->get('id'));
  788.                     $editDocument->setName($formDocumentEdit->get('name')->getData());
  789.                     $em->flush();
  790.                     $this->addFlash('notice_success'"Documento modificato");
  791.                     return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $user->getId()));
  792.                 }
  793.                 else{
  794.                     $session->set('openModalDocumentEdit'true);
  795.                     $session->set('openModalDocumentEditId'$request->request->get('id'));
  796.                 }
  797.             }
  798.             // Anagrafica - Utenze
  799.             $jtus = new JoinTableUserSupplier();
  800.             $formJtusNew $formFactory->createNamed("jtus_new"JoinTableUserSupplierType::class, $jtus);
  801.             $formJtusNew->handleRequest($request);
  802.             if($formJtusNew->isSubmitted()){
  803.                 if($formJtusNew->isValid()){
  804.                     $jtus->setUser($user);
  805.                     $em->persist($jtus);
  806.                     $em->flush();
  807.                     $this->addFlash('notice_success'"Utenza inserita");
  808.                     return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $user->getId()));
  809.                 }
  810.                 else
  811.                     $session->set('openModalJtusNew'true);
  812.             }
  813.             
  814.             $formJtusEdit $formFactory->createNamed("jtus_edit"JoinTableUserSupplierType::class, $jtus);
  815.             $formJtusEdit->handleRequest($request);
  816.             if($formJtusEdit->isSubmitted()){
  817.                 if($formJtusEdit->isValid()){
  818.                     $editJtus $em->getRepository("App\Entity\Slave\JoinTableUserSupplier")->findOneById($request->request->get('id'));
  819.                     $editJtus->setSupplier($formJtusEdit->get('supplier')->getData());
  820.                     $editJtus->setValue($formJtusEdit->get('value')->getData());
  821.                     $em->flush();
  822.                     $this->addFlash('notice_success'"Modifiche salvate");
  823.                     return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $user->getId()));
  824.                 }
  825.                 else
  826.                     $session->set('openModalJtusEdit'true);
  827.                     $session->set('openModalJtusEditId'$request->request->get('id'));
  828.             }
  829.             // Magazzini
  830.             $jtuw = new JoinTableUserWarehouse();
  831.             $formJtuwNew $formFactory->createNamed("jtuw_new"JoinTableUserWarehouseNewType::class, $jtuw, ['user' => $user]);
  832.             $formJtuwNew->handleRequest($request);
  833.             if($formJtuwNew->isSubmitted()){
  834.                 if($formJtuwNew->isValid()){
  835.                     $jtuw->setUser($user);
  836.                     $em->persist($jtuw);
  837.                     $em->flush();
  838.                     $this->addFlash('notice_success'"Permesso magazzino-utente inserito");
  839.                     return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $user->getId()));
  840.                 }
  841.                 else
  842.                     $session->set('openJtuwNew'true);
  843.             }
  844.             $jtuwEdit = new JoinTableUserWarehouse();
  845.             $formJtuwEdit $formFactory->createNamed("jtuw_edit"JoinTableUserWarehouseEditType::class, $jtuwEdit);
  846.             $formJtuwEdit->handleRequest($request);
  847.             if($formJtuwEdit->isSubmitted()){
  848.                 if($formJtuwEdit->isValid()){
  849.                     $jt $em->getRepository('App\Entity\Slave\JoinTableUserWarehouse')->findOneById($request->request->get('id'));
  850.                     $jt->setPermission($jtuwEdit->getPermission());
  851.                     $em->flush();
  852.                     $this->addFlash('notice_success'"Modifiche salvate");
  853.                     return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $user->getId()));
  854.                 }
  855.                 else{
  856.                     $session->set('openJtuwEdit'true);
  857.                     $session->set('openJtuwEditId'$request->request->get('id'));
  858.                 }
  859.             }
  860.             $provinces = array();
  861.             foreach($company->getRegions() as $r)
  862.                 foreach($r->getProvinces() as $p)
  863.                     array_push($provinces$p);
  864.                 
  865.             $operationsBySupplier = array();
  866.             $supplier $em->getRepository('App\Entity\Slave\Supplier')->findAll();
  867.             foreach($supplier as $s){
  868.                 $tmp = array();
  869.                 array_push($tmp$s$s->getOperations());
  870.                 array_push($operationsBySupplier$tmp);
  871.             }
  872.             // Copertura e tariffario
  873.             $jttaotas = array();
  874.             foreach($user->getTechnicianAreas() as $ta){
  875.                 $jts $em->getRepository('App\Entity\Slave\JoinTableTechnicianAreaOperationTariffAmount')->findByTechnicianAndProvinceOrderedBySupplierAndOperation($user->getId(), $ta->getIdProvince());
  876.                 $tmp = array();
  877.                 array_push($tmp$ta->getIdProvince(), $jts);
  878.                 array_push($jttaotas$tmp);
  879.             }
  880.             
  881.             $formSuppliersAutoAssign $formFactory->createNamed("form_suppliers_auto_assign"JoinTableUserSupplierAutoAssignType::class, $user);
  882.             $formSuppliersAutoAssign->handleRequest($request);
  883.             if($formSuppliersAutoAssign->isSubmitted()){
  884.                 if($formSuppliersAutoAssign->isValid()){
  885.                     $em->flush();
  886.                     $this->addFlash('notice_success'"Fornitori tecnico aggiornati!");
  887.                     return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $user->getId()));
  888.                 }
  889.             }
  890.             // Clona tariffario da altro tecnico
  891.             $jttaota = new JoinTableTechnicianAreaOperationTariffAmount();
  892.             $formCloneJttaota $formFactory->createNamed("jttaota_clone_tech"JoinTableTechnicianAreaOperationTariffAmountCloneType::class, $jttaota, ['userId' => $user->getId()]);
  893.             $formCloneJttaota->handleRequest($request);
  894.             if($formCloneJttaota->isSubmitted()){
  895.                 $valid ValidationService::validateNotBlank($validator$formCloneJttaota->get('userToClone'));
  896.                 if($valid && $formCloneJttaota->isValid()){
  897.                     $userToClone $em->getRepository('App\Entity\Slave\User')->findOneById($formCloneJttaota->get('userToClone')->getData());
  898.                     foreach($user->getTechnicianAreas() as $ta){
  899.                         $taToClone null;
  900.                         foreach($userToClone->getTechnicianAreas() as $utcta){
  901.                             if($ta->getIdProvince() == $utcta->getIdProvince()){
  902.                                 $taToClone $utcta;
  903.                                 break;
  904.                             }
  905.                         }
  906.         
  907.                         if($taToClone != null){
  908.                             foreach($ta->getOperationTariffAmounts() as $jttaota){
  909.                                 $jttaotaToClone $em->getRepository('App\Entity\Slave\JoinTableTechnicianAreaOperationTariffAmount')->findOneByTechnicianAreaAndOperationTariffAmount($taToClone->getId(), $jttaota->getOperationTariffAmount()->getId());
  910.                                 if($jttaotaToClone != null){
  911.                                     $jttaota->setAmount($jttaotaToClone->getAmount());
  912.                                 }
  913.                             }
  914.                         }
  915.                     }
  916.         
  917.                     $em->flush();
  918.                     $this->addFlash('notice_success'"Tariffe clonate");
  919.                     return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $user->getId()));
  920.                 }
  921.                 else
  922.                     $session->set('openCloneJttaota'true);
  923.             }
  924.             // Clona tariffe da altra provincia
  925.             $jttaota = new JoinTableTechnicianAreaOperationTariffAmount();
  926.             $formCloneProvinceJttaota $formFactory->createNamed("jttaota_clone"JoinTableTechnicianAreaOperationTariffAmountCloneProvinceType::class, $jttaota, ['userId' => $user->getId()]);
  927.             $formCloneProvinceJttaota->handleRequest($request);
  928.             if($formCloneProvinceJttaota->isSubmitted()){
  929.                 $valid ValidationService::validateNotBlank($validator$formCloneProvinceJttaota->get('technicianAreaToClone'));
  930.                 if($valid && $formCloneProvinceJttaota->isValid()){
  931.                     $taToClone $em->getRepository('App\Entity\Slave\TechnicianArea')->findOneById($formCloneProvinceJttaota->get('technicianAreaToClone')->getData());
  932.                     $taObjective $em->getRepository('App\Entity\Slave\TechnicianArea')->findOneById($formCloneProvinceJttaota->get('technicianAreaObjective')->getData());
  933.                     foreach($taObjective->getOperationTariffAmounts() as $jttaotaObjective){
  934.                         if($jttaotaObjective->getOperationTariffAmount()->getTariff()->isAllZip()){
  935.                             foreach($taToClone->getOperationTariffAmounts() as $jttaotaToClone){
  936.                                 if($jttaotaToClone->getOperationTariffAmount()->getTariff()->isAllZip()){
  937.                                     if($jttaotaObjective->getOperationTariffAmount()->getTariff()->getOperation()->getId() == $jttaotaToClone->getOperationTariffAmount()->getTariff()->getOperation()->getId() && $jttaotaObjective->getOperationTariffAmount()->getValue() == $jttaotaToClone->getOperationTariffAmount()->getValue()){
  938.                                         $jttaotaObjective->setAmount($jttaotaToClone->getAmount());
  939.                                         continue;
  940.                                     }
  941.                                 }
  942.                             }
  943.                         }
  944.                     }
  945.   
  946.                     $em->flush();
  947.                     $this->addFlash('notice_success'"Tariffe clonate");
  948.                     return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $user->getId()));
  949.                 }
  950.                 else{
  951.                     $session->set('openCloneProvinceJttaota'true);
  952.                     $session->set('openCloneProvinceIdJttaota'$formCloneProvinceJttaota->get('technicianAreaObjective')->getData());
  953.                 }
  954.             }
  955.             // Ferie
  956.             $holiday = new UserHoliday();
  957.             $formHolidayNew $formFactory->createNamed("holiday_new"UserHolidayType::class, $holiday, array('userId' => $user->getId()));
  958.             $formHolidayNew->handleRequest($request);
  959.             if($formHolidayNew->isSubmitted()){
  960.                 $valid true;
  961.                 if($valid$valid ValidationService::validateNotBlank($validator$formHolidayNew->get('substitute'));
  962.                 if($valid$valid ValidationService::validateNotBlank($validator$formHolidayNew->get('dateFrom'));
  963.                 if($valid$valid ValidationService::validateNotBlank($validator$formHolidayNew->get('dateTo'));
  964.                 if($valid$valid ValidationService::validateCompareDate($formHolidayNew->get('dateFrom'), $formHolidayNew->get('dateTo'), 'major''La data di fine deve essere maggiore o uguale a quella di inizio!');
  965.                 if($valid && $formHolidayNew->isValid()){
  966.                     $holiday->setUser($user);
  967.                     $em->persist($holiday);
  968.                     $em->flush();
  969.                     $this->addFlash('notice_success'"Ferie inserite");
  970.                     return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $user->getId()));
  971.                 }
  972.                 else
  973.                     $session->set('openModalHolidayNew'true);
  974.             }
  975.             
  976.             $formHolidayEdit $formFactory->createNamed("holiday_edit"UserHolidayType::class, $holiday, array('userId' => $user->getId()));
  977.             $formHolidayEdit->handleRequest($request);
  978.             if($formHolidayEdit->isSubmitted()){
  979.                 $valid true;
  980.                 if($valid$valid ValidationService::validateNotBlank($validator$formHolidayEdit->get('substitute'));
  981.                 if($valid$valid ValidationService::validateNotBlank($validator$formHolidayEdit->get('dateFrom'));
  982.                 if($valid$valid ValidationService::validateNotBlank($validator$formHolidayEdit->get('dateTo'));
  983.                 if($valid$valid ValidationService::validateCompareDate($formHolidayEdit->get('dateFrom'), $formHolidayEdit->get('dateTo'), 'major''La data di fine deve essere maggiore o uguale a quella di inizio!');
  984.                 if($valid && $formHolidayEdit->isValid()){
  985.                     $editHoliday $em->getRepository("App\Entity\Slave\UserHoliday")->findOneById($request->request->get("id"));
  986.                     $editHoliday->setSubstitute($formHolidayEdit->get('substitute')->getData());
  987.                     $editHoliday->setDateFrom($formHolidayEdit->get('dateFrom')->getData());
  988.                     $editHoliday->setDateTo($formHolidayEdit->get('dateTo')->getData());
  989.                     $em->flush();
  990.                     $this->addFlash('notice_success'"Ferie modificate");
  991.                     return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $user->getId()));
  992.                 }
  993.                 else{
  994.                     $session->set('openModalHolidayEdit'true);
  995.                     $session->set('openModalHolidayEditId'$request->request->get("id"));
  996.                 }
  997.             }
  998.             
  999.             // Impostazioni
  1000.             $formEconomicVisible $formFactory->createNamed("economic_visible"TechnicianEconomicType::class, $user);
  1001.             $formEconomicVisible->handleRequest($request);
  1002.             if($formEconomicVisible->isSubmitted()){
  1003.                 if($formEconomicVisible->isValid()){
  1004.                     $em->flush();
  1005.                     $this->addFlash('notice_success'"Dati aggiornati");
  1006.                     return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $user->getId()));
  1007.                 }
  1008.             }
  1009.             $formTicketSettings $formFactory->createNamed("ticket_settings"TechnicianTicketSettingsType::class, $user);
  1010.             $formTicketSettings->handleRequest($request);
  1011.             if($formTicketSettings->isSubmitted()){
  1012.                 if($formTicketSettings->isValid()){
  1013.                     $em->flush();
  1014.                     $this->addFlash('notice_success'"Dati aggiornati");
  1015.                     return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $user->getId()));
  1016.                 }
  1017.             }
  1018.             $operations $em->getRepository('App\Entity\Slave\Operation')->findAll();
  1019.             $operationGroups $em->getRepository('App\Entity\Slave\OperationGroup')->findAllOrderedByUav();
  1020.             $interventions $em->getRepository('App\Entity\Slave\Intervention')->findByTechnicianToPay($user->getId());
  1021.             $settingTechnicianExchangeTickets $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'technician_exchange_tickets'));
  1022.             return $this->render('role/user/users/technician/sheet.html.twig', array(
  1023.                 'company' => $company,
  1024.                 'user' => $user,
  1025.                 'idZip' => $oldZipId,
  1026.                 'cities' => $cities,
  1027.                 'provinces' => $provinces,
  1028.                 'operationsBySupplier' => $operationsBySupplier,
  1029.                 'operationGroups' => $operationGroups,
  1030.                 'interventions' => $interventions,
  1031.                 'jttaotas' => $jttaotas,
  1032.                 'settingTechnicianExchangeTickets' => $settingTechnicianExchangeTickets->getValue(),
  1033.                 'formData' => $formData->createView(),
  1034.                 'formDocumentNew' => $formDocumentNew->createView(),
  1035.                 'formDocumentEdit' => $formDocumentEdit->createView(),
  1036.                 'formJtusNew' => $formJtusNew->createView(),
  1037.                 'formJtusEdit' => $formJtusEdit->createView(),
  1038.                 'formSuppliersAutoAssign' => $formSuppliersAutoAssign->createView(),
  1039.                 'formJtuwNew' => $formJtuwNew->createView(),
  1040.                 'formJtuwEdit' => $formJtuwEdit->createView(),
  1041.                 'formCloneJttaota' => $formCloneJttaota->createView(),
  1042.                 'formCloneProvinceJttaota' => $formCloneProvinceJttaota->createView(),
  1043.                 'formHolidayNew' => $formHolidayNew->createView(),
  1044.                 'formHolidayEdit' => $formHolidayEdit->createView(),
  1045.                 'formEconomicVisible' => $formEconomicVisible->createView(),
  1046.                 'formTicketSettings' => $formTicketSettings->createView()
  1047.             ));
  1048.         }
  1049.         /**
  1050.          * @Route("/tecnici/scheda/documento-elimina", name="user_users_technician_document_delete")
  1051.          * @Security("is_granted('edit', 'technician')")
  1052.          */
  1053.         public function userUsersTechnicianDocumentDelete(Request $requestFileSystem $fs)
  1054.         {    
  1055.             $em $this->mr->getManager('slave');
  1056.             $emMaster $this->mr->getManager('master');
  1057.             $session $request->getSession();
  1058.             $company $emMaster->getRepository("App\Entity\Master\Company")->findOneById($session->get("companyId"));
  1059.             $uploadDir $this->params->get('kernel.project_dir').'/'.$this->params->get('web_path').'/companies/'.$company->getDirectoryPath().'/users/';
  1060.             $document $em->getRepository("App\Entity\Slave\UserDocument")->findOneById($request->request->get("documentDelId"));
  1061.             $userId $document->getUser()->getId();
  1062.             MediaService::removeDocument($fs$document->getPath(), $uploadDir);
  1063.             $em->remove($document);
  1064.             $em->flush();
  1065.             
  1066.             $this->addFlash('notice_success'"Documento eliminato");
  1067.             return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $userId));
  1068.         }
  1069.         /**
  1070.          * @Route("/tecnici/scheda/utenza-elimina", name="user_users_technician_jtus_delete")
  1071.          * @Security("is_granted('edit', 'technician')")
  1072.          */
  1073.         public function userUsersTechnicianJtusDelete(Request $request)
  1074.         {    
  1075.             $em $this->mr->getManager('slave');
  1076.             $session $request->getSession();
  1077.             $jtus $em->getRepository("App\Entity\Slave\JoinTableUserSupplier")->findOneById($request->request->get("jtusDelId"));
  1078.             $userId $jtus->getUser()->getId();
  1079.             $em->remove($jtus);
  1080.             $em->flush();
  1081.             $this->addFlash('notice_success'"Utenza eliminata");
  1082.             return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $userId));
  1083.         }
  1084.         /**
  1085.          * @Route("/tecnici/scheda/magazzino-elimina", name="user_users_technician_warehouse_delete")
  1086.          * @Security("is_granted('edit', 'technician')")
  1087.          */
  1088.         public function userUsersTechnicianWarehouseDelete(Request $request)
  1089.         {    
  1090.             $em $this->mr->getManager('slave');
  1091.             $emMaster $this->mr->getManager('master');
  1092.             $session $request->getSession();
  1093.             $jtuw $em->getRepository('App\Entity\Slave\JoinTableUserWarehouse')->findOneById($request->request->get('jtuwDelId'));
  1094.             $userId $jtuw->getUser()->getId();
  1095.             $em->remove($jtuw);
  1096.             $em->flush();
  1097.             
  1098.             $this->addFlash('notice_success'"Collegamento con il magazzino eliminato");
  1099.             return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $userId));
  1100.         }
  1101.         
  1102.         /**
  1103.          * @Route("/tecnici/{userId}/scheda/area-copertura/nuova", name="user_users_technician_area_new")
  1104.          * @Security("is_granted('edit', 'technician')")
  1105.          */
  1106.         public function userUsersTechnicianAreaNew($userIdRequest $requestValidatorInterface $validatorFormFactoryInterface $formFactory)
  1107.         {
  1108.             $emMaster $this->mr->getManager('master');
  1109.             $em $this->mr->getManager('slave');
  1110.             $session $request->getSession();
  1111.             $company $emMaster->getRepository("App\Entity\Master\Company")->findOneById($session->get("companyId"));
  1112.             $user $em->getRepository('App\Entity\Slave\User')->findOneById($userId);
  1113.         
  1114.             $regionIds = array();
  1115.             foreach($company->getRegions() as $r)
  1116.                 array_push($regionIds$r->getId());
  1117.             $technicianArea = new TechnicianArea();
  1118.             $form $formFactory->createNamed("form_technician_area"TechnicianAreaType::class, $technicianArea, array('regionIds' => $regionIds));
  1119.             $form->handleRequest($request);
  1120.             if($form->isSubmitted()){
  1121.                 
  1122.                 $valid FormValidatorService::validateTechnicianArea($validator$form$user->getTechnicianAreas(), 0);
  1123.                 
  1124.                 if($valid && $form->isValid()){
  1125.                     $matrixZips = array();
  1126.                     if(!$form->get('allZip')->getData()){
  1127.                         $zips explode('-'$form->get('zips')->getData());
  1128.                         foreach($zips as $z){
  1129.                             $arrayTmp = array();
  1130.                             $zip $emMaster->getRepository('App\Entity\Master\Zip')->findOneById($z);
  1131.                             array_push($arrayTmp$zip->getId(), $zip->getCode());
  1132.                             array_push($matrixZips$arrayTmp);
  1133.                         }
  1134.                     }
  1135.                     $technicianArea->setUser($user);
  1136.                     $technicianArea->setIdProvince($form->get('province')->getData()->getId());
  1137.                     $technicianArea->setZips($matrixZips);
  1138.                     $technicianArea->setAllZip($form->get('allZip')->getData());
  1139.                     $em->persist($technicianArea);
  1140.                     $em->flush();
  1141.                     TechnicianTariffService::updateTechnicianTariffs($em$technicianArea->getId());
  1142.                     $this->addFlash('notice_success'"Area tecnico inserita");
  1143.                     return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $user->getId()));
  1144.                 }
  1145.             }
  1146.             return $this->render('role/user/users/technician/area_new.html.twig', array(
  1147.                 'form' => $form->createView(),
  1148.                 'user' => $user
  1149.             ));
  1150.         }
  1151.         
  1152.         /**
  1153.          * @Route("/tecnici/scheda/area-copertura/{technicianAreaId}/modifica", name="user_users_technician_area_edit")
  1154.          * @Security("is_granted('edit', 'technician')")
  1155.          */
  1156.         public function userUsersTechnicianAreaEdit($technicianAreaIdRequest $requestValidatorInterface $validatorFormFactoryInterface $formFactory)
  1157.         {
  1158.             $emMaster $this->mr->getManager('master');
  1159.             $em $this->mr->getManager('slave');
  1160.             $session $request->getSession();
  1161.             $company $emMaster->getRepository("App\Entity\Master\Company")->findOneById($session->get("companyId"));
  1162.             $technicianArea $em->getRepository("App\Entity\Slave\TechnicianArea")->findOneById($technicianAreaId);
  1163.             $user $technicianArea->getUser();
  1164.         
  1165.             $regionIds = array();
  1166.             foreach($company->getRegions() as $r)
  1167.                 array_push($regionIds$r->getId());
  1168.             $form $formFactory->createNamed("form_technician_area"TechnicianAreaType::class, $technicianArea, array('regionIds' => $regionIds));
  1169.             $form->handleRequest($request);
  1170.             if($form->isSubmitted()){
  1171.                 $valid FormValidatorService::validateTechnicianArea($validator$form$user->getTechnicianAreas(), $technicianArea->getId());
  1172.                 if($valid && $form->isValid()){
  1173.                     
  1174.                     $matrixZips = array();
  1175.                     if(!$form->get('allZip')->getData()){
  1176.                         $zips explode('-'$form->get('zips')->getData());
  1177.                         foreach($zips as $z){
  1178.                             $arrayTmp = array();
  1179.                             $zip $emMaster->getRepository('App\Entity\Master\Zip')->findOneById($z);
  1180.                             array_push($arrayTmp$zip->getId(), $zip->getCode());
  1181.                             array_push($matrixZips$arrayTmp);
  1182.                         }
  1183.                     }
  1184.                     $technicianArea->setUser($user);
  1185.                     $technicianArea->setIdProvince($form->get('province')->getData()->getId());
  1186.                     $technicianArea->setZips($matrixZips);
  1187.                     $technicianArea->setAllZip($form->get('allZip')->getData());
  1188.                     $em->persist($technicianArea);
  1189.                     $em->flush();
  1190.                     TechnicianTariffService::updateTechnicianTariffs($em$technicianArea->getId());
  1191.                     $this->addFlash('notice_success'"Area tecnico modificata");
  1192.                     return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $user->getId()));
  1193.                 }
  1194.             }
  1195.             return $this->render('role/user/users/technician/area_edit.html.twig', array(
  1196.                 'form' => $form->createView(),
  1197.                 'technicianArea' => $technicianArea
  1198.             ));
  1199.         }
  1200.         /**
  1201.          * @Route("/tecnici/scheda/area-copertura/elimina", name="user_users_technician_area_delete")
  1202.          * @Security("is_granted('edit', 'technician')")
  1203.          */
  1204.         public function userUsersTechnicianAreaDelete(Request $request)
  1205.         {    
  1206.             $em $this->mr->getManager('slave');
  1207.             $session $request->getSession();
  1208.             $technicianArea $em->getRepository("App\Entity\Slave\TechnicianArea")->findOneById($request->request->get("technicianAreaDelId"));
  1209.             $userId $technicianArea->getUser()->getId();
  1210.             foreach($technicianArea->getOperationTariffAmounts() as $jt)
  1211.                 $em->remove($jt);
  1212.             $em->remove($technicianArea);
  1213.             $em->flush();
  1214.             
  1215.             $this->addFlash('notice_success'"Area copertura eliminata");
  1216.             return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $userId));
  1217.         }
  1218.         
  1219.         /**
  1220.          * @Route("/tecnici/scheda/tariffe-ammontare-aggiorna", name="user_technician_tariff_amount_update")
  1221.          * @Security("is_granted('edit', 'technician')")
  1222.          */
  1223.         public function userUsersTechnicianTariffAmountUpdate(Request $requestValidatorInterface $validator)
  1224.         {    
  1225.             $em $this->mr->getManager('slave');
  1226.             $session $request->getSession();
  1227.             $user $em->getRepository('App\Entity\Slave\User')->findOneById($request->request->get('userId'));
  1228.             $assert = new Assert\Regex(['pattern' => '/^[-]?[0-9]|^[-]?[0-9]+([.|,][0-9]{2})$/']);
  1229.             $error false;
  1230.             foreach($user->getTechnicianAreas() as $ta){
  1231.                 foreach($ta->getOperationTariffAmounts() as $jttaota){
  1232.                     // Controllo che sia un numero scritto come 12.34 o 12
  1233.                     $value $request->request->get('jttaota_'.$jttaota->getId());
  1234.                     $errors $validator->validate($value$assert);
  1235.                     if(count($errors) !== 0){
  1236.                         $error true;
  1237.                         break;
  1238.                     }
  1239.                     if($value != null)
  1240.                         $jttaota->setAmount($value);
  1241.                 }
  1242.             }
  1243.             if($error){
  1244.                 $this->addFlash('notice_warning''Errore! Inserire i valori nel formato corretto: "12", "12.34" o "12,34"');
  1245.             }
  1246.             else{
  1247.                 $em->flush();
  1248.                 $this->addFlash('notice_success'"Tariffe aggiornate");
  1249.             }
  1250.             return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $user->getId()));
  1251.         }
  1252.         /**
  1253.          * @Route("/tecnici/scheda/ferie-elimina", name="user_users_technician_holiday_delete")
  1254.          * @Security("is_granted('edit', 'technician')")
  1255.          */
  1256.         public function userUsersTechnicianHolidayDelete(Request $request)
  1257.         {    
  1258.             $em $this->mr->getManager('slave');
  1259.             $holiday $em->getRepository("App\Entity\Slave\UserHoliday")->findOneById($request->request->get("holidayDelId"));
  1260.             $userId $holiday->getUser()->getId();
  1261.             $em->remove($holiday);
  1262.             $em->flush();
  1263.             
  1264.             $session $request->getSession();
  1265.             $this->addFlash('notice_success'"Ferie eliminate");
  1266.             return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $userId));
  1267.         }
  1268.         
  1269.         /**
  1270.          * @Route("/tecnici/scheda/aggiorna-economico-interventi", name="user_users_technician_economic_recalculate")
  1271.          * @Security("is_granted('edit', 'technician')")
  1272.          */
  1273.         public function userUsersTechnicianEconomicRecalculate(Request $request)
  1274.         {    
  1275.             $em $this->mr->getManager('slave');
  1276.             $session $request->getSession();
  1277.             
  1278.             $userId $request->request->get('userId');
  1279.             $year $request->request->get('year');
  1280.             $month $request->request->get('month');
  1281.             $ds $request->request->get('dateStart');
  1282.             $de $request->request->get('dateEnd');
  1283.     
  1284.             $periodInterventions = [];
  1285.             $dateStart date_create_from_format('d-m-Y'$ds);
  1286.             $dateEnd date_create_from_format('d-m-Y'$de);
  1287.             $interventions $em->getRepository('App\Entity\Slave\Intervention')->findByTechnicianByYearAndMonth($userId$year$month);
  1288.     
  1289.             foreach($interventions as $i){
  1290.                 if($i->getDatetime()->format('Ymd') >= $dateStart->format('Ymd') && $i->getDatetime()->format('Ymd') <= $dateEnd->format('Ymd'))
  1291.                     array_push($periodInterventions$i);
  1292.             }
  1293.          
  1294.             foreach($periodInterventions as $int){
  1295.                 $amountTechnician null
  1296.                 if($int->getOutcomeType()->getSlug() == 'completed'){
  1297.                     // Se completato -> Prendo ammontare tariffa normale
  1298.                     foreach($int->getTicket()->getOperationTariffAmount()->getTechnicianAreas() as $jttaota){
  1299.                         if($jttaota->getTechnicianArea()->getUser()->getId() == $userId){
  1300.                             $amountTechnician $jttaota->getAmount();
  1301.                             break;
  1302.                         }
  1303.                     }
  1304.                 }
  1305.                 else{
  1306.                     // Se sospeso/uav -> Prendo ammontare tariffa UAV
  1307.                     if($int->getTicket()->getUAVOperationTariffAmount() != null){
  1308.                         foreach($int->getTicket()->getUAVOperationTariffAmount()->getTechnicianAreas() as $jttaota){
  1309.                             if($jttaota->getTechnicianArea()->getUser()->getId() == $userId){
  1310.                                 $amountTechnician $jttaota->getAmount();
  1311.                                 break;
  1312.                             }
  1313.                         }
  1314.                     }
  1315.                 }
  1316.                 if($amountTechnician == null)
  1317.                     $amountTechnician '0.00';
  1318.                 $int->setAmountTechnician($amountTechnician);
  1319.             }
  1320.            
  1321.             $em->flush();
  1322.             $this->addFlash('notice_success'"Ammontare del mese ricalcolati con successo!");
  1323.             return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $userId));
  1324.         }
  1325.         /**
  1326.          * @Route("/tecnici/scheda/economico-esporta", name="user_users_technician_economic_export")
  1327.          * @Security("is_granted('edit', 'technician')")
  1328.          */
  1329.         public function userUsersTechnicianEconomicExport(Request $request)
  1330.         {    
  1331.             $em $this->mr->getManager('slave');
  1332.             $emMaster $this->mr->getManager('master');
  1333.             $session $request->getSession();
  1334.             $userId $request->request->get('userId');
  1335.             $year $request->request->get('year');
  1336.             $month $request->request->get('month');
  1337.             $user $em->getRepository('App\Entity\Slave\User')->findOneById($userId);
  1338.             $allInterventions $em->getRepository("App\Entity\Slave\Intervention")->findByTechnicianToPayByYearAndMonth($user->getId(), $year$month);
  1339.             // Rimuovo gli interventi che hanno una sospensione -> Gestita e non approvata / Non gestita
  1340.             $interventions = array();
  1341.             foreach($allInterventions as $int){
  1342.                 $toCalculate true;
  1343.                 if($int->getSuspension() != null && ($int->getSuspension()->isManaged() == false || $int->getSuspension()->isApproved() == false))
  1344.                     $toCalculate false;
  1345.                 if($toCalculate)
  1346.                     array_push($interventions$int);
  1347.             }
  1348.             $response = new StreamedResponse();
  1349.             $response->setCallback(function() use($emMaster$interventions) {
  1350.                 $handle fopen('php://output''w+');
  1351.                 fputcsv($handle, array('Provincia','Citta','CAP','Operazione','Ticket','Cliente','Term ID','Data/Ora','Esito','Attivita svolte','Costo','Costo tecnico','Costo extra','Costi non fatturabili','SLA','Totale'), ";"'"'"\\");
  1352.                 
  1353.                 $provinceSign '';
  1354.                 $cityName '';
  1355.                 $zip '';
  1356.                 $operation '';
  1357.                 $ticket '';
  1358.                 $client '';
  1359.                 $termid '';
  1360.                 $datetime '';
  1361.                 $outcome '';
  1362.                 $cost 0;
  1363.                 $amount 0;
  1364.                 $amountExtra 0;
  1365.                 $slaOutbound 0;
  1366.                 $total 0;
  1367.                 $totalCost 0;
  1368.                 $totalAmount 0;
  1369.                 $totalAmountExtra 0;
  1370.                 $totalAmountNotBillable 0;
  1371.                 $totalTotal 0;
  1372.                 foreach($interventions as $int){
  1373.                 
  1374.                     $provinceSign $emMaster->getRepository('App\Entity\Master\Province')->findOneById($int->getTicket()->getIdProvince())->getSign();
  1375.                     $cityName $emMaster->getRepository('App\Entity\Master\City')->findOneById($int->getTicket()->getIdCity())->getName();
  1376.                     $zip $int->getTicket()->getZip();
  1377.                     $operation $int->getTicket()->getOperation();
  1378.                     $ticket $int->getTicket()->getNumber();
  1379.                     $client $int->getTicket()->getClient();
  1380.                     $termid $int->getTicket()->getTermid();
  1381.                     $datetime $int->getDatetime()->format('d-m-Y H:i');
  1382.                     $outcome $int->getOutcomeType().' '.$int->getOutcome();
  1383.                     $first true;
  1384.                     $activities '';
  1385.                     foreach($int->getActivities() as $act){
  1386.                         if($first$first false; else $activities.= ' --- ';
  1387.                         if($act->getProductWithdraw() != null){
  1388.                             $pr $act->getProductWithdraw();
  1389.                             $codeProd $act->getProducerWithdraw();
  1390.                             $codeSupp $act->getSupplierWithdraw();
  1391.                         }
  1392.                         if($act->getProductActual() != null){
  1393.                             $pr $act->getProductActual();
  1394.                             $codeProd $act->getProducerActual();
  1395.                             $codeSupp $act->getSupplierActual();
  1396.                         }
  1397.                         if($act->getProductInstallation() != null){
  1398.                             $pr $act->getProductInstallation();
  1399.                             $codeProd $act->getProducerInstallation();
  1400.                             $codeSupp $act->getSupplierInstallation();
  1401.                         }
  1402.                         $activities.= $act->getType();
  1403.                     }
  1404.                     $cost $int->getAmount();
  1405.                     $amount $int->calculateTechnicianAmount(false);
  1406.                     $amountExtra $int->calculateExtraCost();
  1407.                     $amountNotBillable $int->takeAllExtraNotBillableCost();
  1408.                     $slaOutbound $int->getSlaOutboundPercentage();
  1409.                     $total $int->calculateTotalTechnicianAmount(true);
  1410.                     $totalCost $totalCost $cost;
  1411.                     $totalAmount $totalAmount $amount;
  1412.                     $totalAmountExtra $totalAmountExtra $amountExtra;
  1413.                     $totalAmountNotBillable $totalAmountNotBillable $amountNotBillable;
  1414.                     $totalTotal $totalTotal $total;
  1415.                     fputcsv($handle, array($provinceSign$cityName$zip$operation$ticket$client$termid$datetime$outcome$activitiesnumber_format($cost2'.'','), number_format($amount2'.'','), number_format($amountExtra2'.'','), number_format($amountNotBillable2'.'','), $slaOutboundnumber_format($total2'.'',')), ";"'"'"\\");
  1416.                 }
  1417.                 fputcsv($handle, array('Totali'''''''''''''''''''number_format($totalCost2'.'','), number_format($totalAmount2'.'','), number_format($totalAmountExtra2'.'','), number_format($totalAmountNotBillable2'.'','), number_format($totalTotal2'.'',')), ";"'"'"\\");
  1418.                 fclose($handle);
  1419.             });
  1420.         
  1421.             $response->setStatusCode(200);
  1422.             $dispositionHeader $response->headers->makeDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT'Riassunto economico '.$user->getPlainName().' --- '.$year.'-'.$month.'.csv');
  1423.             $response->headers->set('Content-Type''text/csv; charset=ISO-8859-15');
  1424.             $response->headers->set('Content-Disposition'$dispositionHeader);
  1425.             return $response;
  1426.         }
  1427.     //
  1428. }