src/Controller/User/UserUserController.php line 85

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