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