<?php
namespace App\Controller\User;
use App\Entity\Slave\JoinTableTechnicianAreaOperationTariffAmount;
use App\Entity\Slave\JoinTableTechnicianOperationDefault;
use App\Entity\Slave\JoinTableUserSupplier;
use App\Entity\Slave\JoinTableUserWarehouse;
use App\Entity\Slave\TechnicianArea;
use App\Entity\Slave\User;
use App\Entity\Slave\UserDocument;
use App\Entity\Slave\UserProfile;
use App\Entity\Slave\UserHoliday;
use App\Form\Default\PasswordChangeType;
use App\Form\Model\PasswordChange;
use App\Form\Master\CompanyAccessType;
use App\Form\Slave\JoinTableUserSupplierType;
use App\Form\Slave\JoinTableUserSupplierAutoAssignType;
use App\Form\Slave\JoinTableUserWarehouseNewType;
use App\Form\Slave\JoinTableUserWarehouseEditType;
use App\Form\Slave\JoinTableTechnicianAreaOperationTariffAmountCloneType;
use App\Form\Slave\TechnicianAreaType;
use App\Form\Slave\TechnicianEconomicType;
use App\Form\Slave\UserProfileEditType;
use App\Form\Slave\UserDocumentNewType;
use App\Form\Slave\UserDocumentEditType;
use App\Form\Slave\UserHolidayType;
use App\Form\Slave\UserProfileType;
use App\Form\Slave\UserStaffType;
use App\Form\Slave\UserTechnicianType;
use App\Service\FilterService;
use App\Service\FormValidatorService;
use App\Service\MediaService;
use App\Service\TechnicianTariffService;
use App\Service\ValidationService;
use Doctrine\Persistence\ManagerRegistry;
use Knp\Component\Pager\PaginatorInterface;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Spipu\Html2Pdf\Html2Pdf;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Form\FormError;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @Route("/scrivania/utenti")
* @Security("is_granted('ROLE_USER') and is_granted('active', user)")
*/
class UserUserController extends AbstractController
{
private $mr;
private $params;
public function __construct(ManagerRegistry $mr, ParameterBagInterface $params)
{
$this->mr = $mr;
$this->params = $params;
}
/**
* @Route("/", name="user_users_index")
* @Security("is_granted('view', 'staff') || is_granted('view', 'technician')")
*/
public function userUsersIndex(Request $request, FormFactoryInterface $formFactory, ValidatorInterface $validator)
{
return $this->render('role/user/users/index.html.twig');
}
/**
* @Route("/profilo", name="user_user_profile")
*/
public function userUserProfile(Request $request, UserPasswordHasherInterface $passwordHasher, FormFactoryInterface $formFactory, ValidatorInterface $validator)
{
$em = $this->mr->getManager('slave');
$emMaster = $this->mr->getManager('master');
$session = $request->getSession();
$company = $emMaster->getRepository("App\Entity\Master\Company")->findOneById($session->get("companyId"));
$cities = $emMaster->getRepository("App\Entity\Master\City")->findByName('');
$zip = $emMaster->getRepository('App\Entity\Master\Zip')->findOneByCode($this->getUser()->getProfile()->getZip());
$operationGroups = $em->getRepository('App\Entity\Slave\OperationGroup')->findAllOrderedByUav();
$profile = $this->getUser()->getProfile();
// EDIT DATA
$formData = $formFactory->createNamed("user_profile", UserProfileEditType::class, $profile);
$formData->handleRequest($request);
if($formData->isSubmitted()){
if($formData->isValid()){
$newZip = $emMaster->getRepository('App\Entity\Master\Zip')->findOneById($formData->get('zip')->getData());
$profile->setIdCity($formData->get('cityId')->getData());
$profile->setZip($newZip->getCode());
$this->addFlash('notice_success', 'Modifiche salvate!');
$em->flush();
return $this->redirectToRoute('user_user_profile');
}
else{
$session->set('openModalData', true);
}
}
// PASSWORD CHANGE
$passwordChange = new PasswordChange();
$formPassword = $this->createForm(PasswordChangeType::class, $passwordChange);
$formPassword->handleRequest($request);
if($formPassword->isSubmitted()){
$valid = true;
$valid = ValidationService::validateNotBlank($validator, $formPassword->get('oldPassword'));
if($formPassword->get('newPassword')->getData() != null){
$psw = $formPassword->get('newPassword')->getData();
$count = 0;
if(preg_match('/[0-9]/', $psw)) $count++;
if(preg_match('/[a-z]/', $psw)) $count++;
if(preg_match('/[A-Z]/', $psw)) $count++;
if(preg_match('/[\!\#\$\&\(\)\.\+\-_]/', $psw)) $count++;
if($count < 3)
{
$formPassword->get('newPassword')->addError(new FormError("Inserisci una password RESISTENTE."));
$valid = false;
}
}
if($valid && $formPassword->isValid()){
if($passwordHasher->isPasswordValid($this->getUser(), $formPassword->get('oldPassword')->getData())){
$newPassword = $passwordHasher->hashPassword($this->getUser(), $formPassword->get("newPassword")->getData());
$this->getUser()->setPassword($newPassword);
$em->flush();
$this->addFlash('notice_success', "La password รจ stata modificata con successo");
return $this->redirect($request->server->get('HTTP_REFERER'));
}
else{
$formPassword->get('oldPassword')->addError(New FormError('La password non coincide con quella salvata'));
$session->set('openModalPassword', true);
}
}
else{
$session->set('openModalPassword', true);
}
}
return $this->render('role/user/users/profile.html.twig', array(
'company' => $company,
'zip' => $zip,
'cities' => $cities,
'operationGroups' => $operationGroups,
'formData' => $formData->createView(),
'formPassword' => $formPassword->createView()
));
}
/**
* @Route("/profilo/imposta-principale", name="user_user_profile_main")
*/
public function userUserProfileMain(Request $request)
{
$em = $this->mr->getManager();
$jtuw = $em->getRepository('App\Entity\Slave\JoinTableUserWarehouse')->findOneById($request->request->get('jtuwId'));
foreach($this->getUser()->getWarehouses() as $jt)
$jt->setMain(false);
$jtuw->setMain(true);
$em->flush();
$this->addFlash('notice_success', "Magazzino principale aggiornato");
return $this->redirectToRoute('user_user_profile');
}
/**
* @Route("/profilo/economico-esporta", name="user_user_profile_economic_export")
*/
public function userUserProfileEconomicExport(Request $request)
{
$em = $this->mr->getManager('slave');
$emMaster = $this->mr->getManager('master');
$session = $request->getSession();
$year = $request->request->get('year');
$month = $request->request->get('month');
$allInterventions = $em->getRepository("App\Entity\Slave\Intervention")->findByTechnicianToPayByYearAndMonth($this->getUser()->getId(), $year, $month);
// Rimuovo gli interventi che hanno una sospensione -> Gestita e non approvata / Non gestita
$interventions = array();
foreach($allInterventions as $int){
$toCalculate = true;
if($int->getSuspension() != null && ($int->getSuspension()->isManaged() == false || $int->getSuspension()->isApproved() == false))
$toCalculate = false;
if($toCalculate)
array_push($interventions, $int);
}
$response = new StreamedResponse();
$response->setCallback(function() use($emMaster, $interventions) {
$handle = fopen('php://output', 'w+');
fputcsv($handle, array('Provincia','Citta','CAP','Operazione','Ticket','Cliente','Term ID','Data/Ora','Esito','Attivita svolte','Paga intervento'), ";", '"', "\\");
$provinceSign = '';
$cityName = '';
$zip = '';
$operation = '';
$ticket = '';
$client = '';
$termid = '';
$datetime = '';
$outcome = '';
$total = 0;
$totalTotal = 0;
foreach($interventions as $int){
$provinceSign = $emMaster->getRepository('App\Entity\Master\Province')->findOneById($int->getTicket()->getIdProvince())->getSign();
$cityName = $emMaster->getRepository('App\Entity\Master\City')->findOneById($int->getTicket()->getIdCity())->getName();
$zip = $int->getTicket()->getZip();
$operation = $int->getTicket()->getOperation();
$ticket = $int->getTicket()->getNumber();
$client = $int->getTicket()->getClient();
$termid = $int->getTicket()->getTermid();
$datetime = $int->getDatetime()->format('d-m-Y H:i');
$outcome = $int->getOutcomeType().' - '.$int->getOutcome();
$activities = '';
$first = true;
foreach($int->getActivities() as $act){
if($first) $first = false; else $activities.= ' --- ';
if($act->getProductWithdraw() != null){
$pr = $act->getProductWithdraw();
$codeProd = $act->getProducerWithdraw();
$codeSupp = $act->getSupplierWithdraw();
}
if($act->getProductActual() != null){
$pr = $act->getProductActual();
$codeProd = $act->getProducerActual();
$codeSupp = $act->getSupplierActual();
}
if($act->getProductInstallation() != null){
$pr = $act->getProductInstallation();
$codeProd = $act->getProducerInstallation();
$codeSupp = $act->getSupplierInstallation();
}
$activities.= $act->getType();
}
$total = $int->calculateTotalTechnicianAmount();
$totalTotal = $totalTotal + $total;
fputcsv($handle, array($provinceSign, $cityName, $zip, $operation, $ticket, $client, $termid, $datetime, $outcome, $activities, number_format($total, 2, '.', ',')), ";", '"', "\\");
}
fputcsv($handle, array('Totale', '', '', '', '', '', '', '', '', '', number_format($totalTotal, 2, '.', ',')), ";", '"', "\\");
fclose($handle);
});
$response->setStatusCode(200);
$dispositionHeader = $response->headers->makeDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, 'Profilo economico '.$this->getUser().' --- '.$year.'-'.$month.'.csv');
$response->headers->set('Content-Type', 'text/csv; charset=ISO-8859-15');
$response->headers->set('Content-Disposition', $dispositionHeader);
return $response;
}
/**
* @Route("/profilo/economico-crea-pdf", name="user_user_profile_economic_pdf")
*/
public function userUserProfileEconomicPdf(Request $request)
{
$em = $this->mr->getManager('slave');
$emMaster = $this->mr->getManager('master');
$session = $request->getSession();
$company = $emMaster->getRepository("App\Entity\Master\Company")->findOneById($session->get("companyId"));
$year = $request->request->get('year');
$month = $request->request->get('month');
$allInterventions = $em->getRepository("App\Entity\Slave\Intervention")->findByTechnicianToPayByYearAndMonth($this->getUser()->getId(), $year, $month);
// Rimuovo gli interventi che hanno una sospensione -> Gestita e non approvata / Non gestita
$interventions = array();
foreach($allInterventions as $int){
$toCalculate = true;
if($int->getSuspension() != null && ($int->getSuspension()->isManaged() == false || $int->getSuspension()->isApproved() == false))
$toCalculate = false;
if($toCalculate)
array_push($interventions, $int);
}
$html2pdf = new Html2Pdf('P', 'A4', 'it', true, 'UTF-8', array(5, 5, 5, 5), false);
$html2pdf->writeHTML($this->renderView('role/user/print/economic.html.twig', array(
'company' => $company,
'interventions' => $interventions,
'year' => $year,
'month' => $month
)));
ob_end_clean();
$html2pdf->Output('Profilo economico '.$this->getUser().' --- '.$year.'-'.$month.'.pdf', 'D');
}
// STAFF
/**
* @Route("/staff", name="user_users_staff")
* @Security("is_granted('view', 'staff')")
*/
public function userUsersStaff(Request $request, PaginatorInterface $paginator, FormFactoryInterface $formFactory, ValidatorInterface $validator)
{
$em = $this->mr->getManager('slave');
$emMaster = $this->mr->getManager('master');
$session = $request->getSession();
$cities = $emMaster->getRepository("App\Entity\Master\City")->findByName('');
$filters = FilterService::userFilter($request);
$usersQuery = $em->getRepository("App\Entity\Slave\User")->queryStaffUsersFiltered($filters, $this->getUser()->getId());
$users = $paginator->paginate($usersQuery, $request->getSession()->get($request->get("_route")."_page"), 50);
$user = new User();
$form = $formFactory->createNamed("user", UserStaffType::class, $user);
$form->handleRequest($request);
if($form->isSubmitted()){
$valid = true;
if($valid) $valid = ValidationService::validateNotBlank($validator, $form->get('name'));
if($valid) $valid = ValidationService::validateLength($form->get('name'), '191');
if($valid) $valid = ValidationService::validateNotBlank($validator, $form->get('surname'));
if($valid) $valid = ValidationService::validateLength($form->get('surname'), '191');
if($valid) $valid = ValidationService::validateNotBlank($validator, $form->get('phone'));
if($valid) $valid = ValidationService::validateLength($form->get('phone'), '191');
if($valid) $valid = ValidationService::validateLength($form->get('address'), '191');
if($valid) $valid = ValidationService::validateLength($form->get('civic'), '191');
if($valid) $valid = ValidationService::validateLength($form->get('zip'), '5');
if($valid && $form->isValid()){
$user->setRole('ROLE_USER');
$user->setAdminActive(true);
$em->persist($user);
$userProfile = new UserProfile();
$userProfile->setUser($user);
$userProfile->setName($form->get('name')->getData());
$userProfile->setSurname($form->get('surname')->getData());
$userProfile->setPhone($form->get('phone')->getData());
if($form->get('address')->getData() != null) $userProfile->setAddress($form->get('address')->getData());
if($form->get('civic')->getData() != null) $userProfile->setCivic($form->get('civic')->getData());
if($form->get('zip')->getData() != null) $userProfile->setZip($emMaster->getRepository('App\Entity\Master\Zip')->findOneById($form->get('zip')->getData())->getCode());
if($form->get('cityId')->getData() != null) $userProfile->setIdCity($form->get('cityId')->getData());
$em->persist($userProfile);
$em->flush();
$this->addFlash('notice_success', "Nuovo membro dello staff inserito");
$session->set('userId', $user->getId());
return $this->redirectToRoute('user_users_staff');
}
else
$session->set('openModal', true);
}
return $this->render('role/user/users/staff/list.html.twig', array(
'users' => $users,
'cities' => $cities,
'filters' => $filters,
'form' => $form->createView()
));
}
/**
* @Route("/staff/invia-credenziali", name="user_users_staff_send_credentials")
* @Security("is_granted('edit', 'staff')")
*/
public function userUsersStaffSendCredentials(Request $request, MailerInterface $mailer)
{
$em = $this->mr->getManager('slave');
$emMaster = $this->mr->getManager('master');
$session = $request->getSession();
$company = $emMaster->getRepository('App\Entity\Master\Company')->findOneById($session->get('companyId'));
$user = $em->getRepository('App\Entity\Slave\User')->findOneById($request->request->get('userSendCredentialsId'));
$user->setOneTimeCode(md5(uniqid()));
$user->setExpirationOneTimeCode(date_modify(new \DateTime(), '+3 hours'));
$em->flush();
// INVIA EMAIL CON LINK PER CREARE NUOVA PASSWORD
$message = (new TemplatedEmail())
->from($this->params->get('email_noreply'))
->to($user->getEmail())
->subject($this->params->get('subject_create_password'))
->htmlTemplate('email/user_credentials.html.twig')
->context(['user' => $user, 'company' => $company]);
$mailer->send($message);
$this->addFlash('notice_success', 'Credenziali inviate!');
return $this->redirectToRoute('user_users_staff');
}
/**
* @Route("/{userId}/staff/scheda", name="user_users_staff_sheet")
* @Security("is_granted('view', 'staff')")
*/
public function userUsersStaffSheet($userId, Request $request, FormFactoryInterface $formFactory, ValidatorInterface $validator, FileSystem $fs)
{
$em = $this->mr->getManager('slave');
$emMaster = $this->mr->getManager('master');
$session = $request->getSession();
$user = $em->getRepository('App\Entity\Slave\User')->findOneById($userId);
$cities = $emMaster->getRepository("App\Entity\Master\City")->findByName('');
$company = $emMaster->getRepository("App\Entity\Master\Company")->findOneById($session->get("companyId"));
$uploadDir = $this->params->get('kernel.project_dir').'/'.$this->params->get('web_path').'/companies/'.$company->getDirectoryPath().'/users/';
$oldZipId = null;
if($user->getProfile()->getZip() != null){
$oldZip = $emMaster->getRepository('App\Entity\Master\Zip')->findOneByCode($user->getProfile()->getZip());
$oldZipId = $oldZip->getId();
}
// Anagrafica
$form = $formFactory->createNamed("user_profile", UserProfileType::class, $user->getProfile());
$form->handleRequest($request);
if($form->isSubmitted()){
$valid = true;
if($valid) $valid = ValidationService::validateNotBlank($validator, $form->get('email'));
if($valid) $valid = ValidationService::validateNotBlank($validator, $form->get('accountType'));
if($valid) $valid = ValidationService::validateNotBlank($validator, $form->get('cityId'));
if($valid) $valid = ValidationService::validateNotBlank($validator, $form->get('zip'));
if($valid && $form->isValid()){
$user->setAccountType($form->get('accountType')->getData());
$user->getProfile()->setIdCity($form->get('cityId')->getData());
$zip = $emMaster->getRepository('App\Entity\Master\Zip')->findOneById($form->get('zip')->getData());
$user->getProfile()->setZip($zip->getCode());
$em->flush();
$this->addFlash('notice_success', "Modifiche salvate");
return $this->redirectToRoute('user_users_staff_sheet', array('userId' => $user->getId()));
}
else
$session->set('openModal', true);
}
// Documenti
$document = new UserDocument();
$formDocumentNew = $formFactory->createNamed("document_new", UserDocumentNewType::class, $document);
$formDocumentNew->handleRequest($request);
if($formDocumentNew->isSubmitted()){
$valid = ValidationService::validateFile($validator, $formDocumentNew->get('path'), true, $formDocumentNew->get('file')->getData(), '5', array('pdf', 'doc', 'docx', 'jpg', 'jpeg', 'png', 'webp'));
if($valid && $formDocumentNew->isValid()){
$document->setUser($user);
switch($formDocumentNew->get('file')->getData()->guessExtension()){
case 'pdf':
case 'doc':
case 'docx':
MediaService::uploadDocument($formDocumentNew->get('file')->getData(), $uploadDir, $document, 'document');
break;
case 'jpg':
case 'jpeg':
case 'png':
case 'webp':
MediaService::uploadImage($fs, $formDocumentNew->get('file')->getData(), null, $uploadDir, $document, 'path', 100, 1000, 200, false);
break;
default: break;
}
$em->persist($document);
$em->flush();
$this->addFlash('notice_success', "Documento inserito");
return $this->redirectToRoute('user_users_staff_sheet', array('userId' => $user->getId()));
}
else
$session->set('openModalDocumentNew', true);
}
$formDocumentEdit = $formFactory->createNamed("document_edit", UserDocumentEditType::class, $document);
$formDocumentEdit->handleRequest($request);
if($formDocumentEdit->isSubmitted()){
if($formDocumentEdit->isValid()){
$editDocument = $em->getRepository("App\Entity\Slave\UserDocument")->findOneById($request->request->get('id'));
$editDocument->setName($formDocumentEdit->get('name')->getData());
$em->flush();
$this->addFlash('notice_success', "Documento modificato");
return $this->redirectToRoute('user_users_staff_sheet', array('userId' => $user->getId()));
}
else{
$session->set('openModalDocumentEdit', true);
$session->set('openModalDocumentEditId', $request->request->get('id'));
}
}
return $this->render('role/user/users/staff/sheet.html.twig', array(
'company' => $company,
'user' => $user,
'idZip' => $oldZipId,
'cities' => $cities,
'form' => $form->createView(),
'formDocumentNew' => $formDocumentNew->createView(),
'formDocumentEdit' => $formDocumentEdit->createView()
));
}
/**
* @Route("/staff/scheda/documento-elimina", name="user_users_staff_document_delete")
* @Security("is_granted('edit', 'staff')")
*/
public function userUsersStaffDocumentDelete(Request $request, FileSystem $fs)
{
$em = $this->mr->getManager('slave');
$emMaster = $this->mr->getManager('master');
$session = $request->getSession();
$company = $emMaster->getRepository("App\Entity\Master\Company")->findOneById($session->get("companyId"));
$uploadDir = $this->params->get('kernel.project_dir').'/'.$this->params->get('web_path').'/companies/'.$company->getDirectoryPath().'/users/';
$document = $em->getRepository("App\Entity\Slave\UserDocument")->findOneById($request->request->get("documentDelId"));
$userId = $document->getUser()->getId();
MediaService::removeDocument($fs, $document->getPath(), $uploadDir);
$em->remove($document);
$em->flush();
$this->addFlash('notice_success', "Documento eliminato");
return $this->redirectToRoute('user_users_staff_sheet', array('userId' => $userId));
}
/**
* @Route("/staff/cambia-stato", name="user_users_staff_change_status")
* @Security("is_granted('edit', 'staff')")
*/
public function userUsersStaffChangeStatus(Request $request)
{
$em = $this->mr->getManager('slave');
$session = $request->getSession();
$user = $em->getRepository("App\Entity\Slave\User")->findOneById($request->request->get("userChangeId"));
$user->setCompanyActive(!$user->isCompanyActive());
$em->flush();
$this->addFlash('notice_success', "Stato aggiornato");
return $this->redirectToRoute('user_users_staff');
}
/**
* @Route("/staff/elimina", name="user_users_staff_delete")
* @Security("is_granted('edit', 'staff')")
*/
public function userUsersStaffDelete(Request $request)
{
$em = $this->mr->getManager('slave');
$user = $em->getRepository("App\Entity\Slave\User")->findOneById($request->request->get("userDelId"));
$em->remove($user->getProfile());
$em->remove($user);
$em->flush();
$this->addFlash('notice_success', "Membro dello staff eliminato");
return $this->redirectToRoute('user_users_staff');
}
//
// TECNICI
/**
* @Route("/tecnici", name="user_users_technicians")
* @Security("is_granted('view', 'technician')")
*/
public function userUsersTechnicians(Request $request, PaginatorInterface $paginator, FormFactoryInterface $formFactory, ValidatorInterface $validator)
{
$em = $this->mr->getManager('slave');
$emMaster = $this->mr->getManager('master');
$session = $request->getSession();
$cities = $emMaster->getRepository("App\Entity\Master\City")->findByName('');
$filters = FilterService::userFilter($request);
$activeTechniciansQuery = $em->getRepository("App\Entity\Slave\User")->queryTechnicianUsersByCompanyActiveFiltered(1, $filters);
$activeTechnicians = $paginator->paginate($activeTechniciansQuery, $request->getSession()->get($request->get("_route")."_page"), 50);
$deactiveTechniciansQuery = $em->getRepository("App\Entity\Slave\User")->queryTechnicianUsersByCompanyActiveFiltered(0, $filters);
$deactiveTechnicians = $paginator->paginate($deactiveTechniciansQuery, $request->getSession()->get($request->get("_route")."_page"), 50);
$countActiveTechnicians = sizeof($activeTechnicians);
$countTotalTechnicians = sizeof($activeTechnicians) + sizeof($deactiveTechnicians);
$user = new User();
$form = $formFactory->createNamed("user", UserTechnicianType::class, $user);
$form->handleRequest($request);
if($form->isSubmitted()){
$valid = true;
if($valid) $valid = ValidationService::validateNotBlank($validator, $form->get('name'));
if($valid) $valid = ValidationService::validateLength($form->get('name'), '191');
if($valid) $valid = ValidationService::validateNotBlank($validator, $form->get('surname'));
if($valid) $valid = ValidationService::validateLength($form->get('surname'), '191');
if($valid) $valid = ValidationService::validateNotBlank($validator, $form->get('phone'));
if($valid) $valid = ValidationService::validateLength($form->get('phone'), '191');
if($valid) $valid = ValidationService::validateLength($form->get('address'), '191');
if($valid) $valid = ValidationService::validateLength($form->get('civic'), '191');
if($valid) $valid = ValidationService::validateLength($form->get('zip'), '5');
if($valid && $form->isValid()){
$user->setRole('ROLE_USER');
$user->setAdminActive(true);
$em->persist($user);
$userProfile = new UserProfile();
$userProfile->setUser($user);
$userProfile->setName($form->get('name')->getData());
$userProfile->setSurname($form->get('surname')->getData());
$userProfile->setPhone($form->get('phone')->getData());
if($form->get('address')->getData() != null) $userProfile->setAddress($form->get('address')->getData());
if($form->get('civic')->getData() != null) $userProfile->setCivic($form->get('civic')->getData());
if($form->get('zip')->getData() != null) $userProfile->setZip($emMaster->getRepository('App\Entity\Master\Zip')->findOneById($form->get('zip')->getData())->getCode());
if($form->get('cityId')->getData() != null) $userProfile->setIdCity($form->get('cityId')->getData());
$em->persist($userProfile);
$em->flush();
$this->addFlash('notice_success', "Nuovo tecnico inserito");
$session->set('userId', $user->getId());
return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $user->getId()));
}
else
$session->set('openModal', true);
}
return $this->render('role/user/users/technician/list.html.twig', array(
'activeTechnicians' => $activeTechnicians,
'deactiveTechnicians' => $deactiveTechnicians,
'countTotalTechnicians' => $countTotalTechnicians,
'countActiveTechnicians' => $countActiveTechnicians,
'cities' => $cities,
'filters' => $filters,
'form' => $form->createView()
));
}
/**
* @Route("/tecnici/invia-credenziali", name="user_users_technician_send_credentials")
* @Security("is_granted('edit', 'technician')")
*/
public function userUsersTechnicianSendCredentials(Request $request, MailerInterface $mailer)
{
$em = $this->mr->getManager('slave');
$emMaster = $this->mr->getManager('master');
$session = $request->getSession();
$company = $emMaster->getRepository('App\Entity\Master\Company')->findOneById($session->get('companyId'));
$user = $em->getRepository('App\Entity\Slave\User')->findOneById($request->request->get('userSendCredentialsId'));
$user->setOneTimeCode(md5(uniqid()));
$user->setExpirationOneTimeCode(date_modify(new \DateTime(), '+3 hours'));
$em->flush();
// INVIA EMAIL CON LINK PER CREARE NUOVA PASSWORD
$message = (new TemplatedEmail())
->from($this->params->get('email_noreply'))
->to($user->getEmail())
->subject($this->params->get('subject_create_password'))
->htmlTemplate('email/user_credentials.html.twig')
->context(['user' => $user, 'company' => $company]);
$mailer->send($message);
$this->addFlash('notice_success', 'Credenziali inviate!');
return $this->redirectToRoute('user_users_technicians');
}
/**
* @Route("/tecnici/cambia-stato", name="user_users_technician_change_status")
* @Security("is_granted('edit', 'technician')")
*/
public function userUsersTechnicianChangeStatus(Request $request)
{
$em = $this->mr->getManager('slave');
$session = $request->getSession();
$user = $em->getRepository("App\Entity\Slave\User")->findOneById($request->request->get("userChangeId"));
$user->setCompanyActive(!$user->isCompanyActive());
$em->flush();
$this->addFlash('notice_success', "Stato aggiornato");
return $this->redirectToRoute('user_users_technicians');
}
/**
* @Route("/tecnici/elimina", name="user_users_technician_delete")
* @Security("is_granted('edit', 'technician')")
*/
public function userUsersTechnicianDelete(Request $request)
{
$em = $this->mr->getManager('slave');
$user = $em->getRepository("App\Entity\Slave\User")->findOneById($request->request->get("userDelId"));
foreach($user->getTechnicianAreas() as $ta)
$em->remove($ta);
$em->remove($user->getProfile());
$em->remove($user);
$em->flush();
$this->addFlash('notice_success', "Tecnico eliminato");
return $this->redirectToRoute('user_users_technicians');
}
/**
* @Route("/tecnici/{userId}/scheda", name="user_users_technician_sheet")
* @Security("is_granted('view', 'technician')")
*/
public function userUsersTechnicianSheet($userId, Request $request, FormFactoryInterface $formFactory, ValidatorInterface $validator, FileSystem $fs)
{
$em = $this->mr->getManager('slave');
$emMaster = $this->mr->getManager('master');
$session = $request->getSession();
$company = $emMaster->getRepository("App\Entity\Master\Company")->findOneById($session->get("companyId"));
$uploadDir = $this->params->get('kernel.project_dir').'/'.$this->params->get('web_path').'/companies/'.$company->getDirectoryPath().'/users/';
$user = $em->getRepository('App\Entity\Slave\User')->findOneById($userId);
$cities = $emMaster->getRepository("App\Entity\Master\City")->findByName('');
$oldZipId = null;
if($user->getProfile()->getZip() != null){
$oldZip = $emMaster->getRepository('App\Entity\Master\Zip')->findOneByCode($user->getProfile()->getZip());
$oldZipId = $oldZip->getId();
}
$regionIds = array();
foreach($company->getRegions() as $r)
array_push($regionIds, $r->getId());
// Anagrafica - Dati tecnico
$formData = $formFactory->createNamed("user_profile", UserProfileType::class, $user->getProfile());
$formData->handleRequest($request);
if($formData->isSubmitted()){
$valid = true;
if($valid) $valid = ValidationService::validateNotBlank($validator, $formData->get('email'));
if($valid) $valid = ValidationService::validateNotBlank($validator, $formData->get('accountType'));
if($valid) $valid = ValidationService::validateNotBlank($validator, $formData->get('cityId'));
if($valid) $valid = ValidationService::validateNotBlank($validator, $formData->get('zip'));
if($valid && $formData->isValid()){
$zip = $emMaster->getRepository('App\Entity\Master\Zip')->findOneById($formData->get('zip')->getData());
$user->setAccountType($formData->get('accountType')->getData());
$user->setEmail($formData->get('email')->getData());
$user->getProfile()->setIdCity($formData->get('cityId')->getData());
$user->getProfile()->setZip($zip->getCode());
$em->flush();
$this->addFlash('notice_success', "Modifiche salvate");
return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $user->getId()));
}
else
$session->set('openModalData', true);
}
// Anagrafica - Documenti
$document = new UserDocument();
$formDocumentNew = $formFactory->createNamed("document_new", UserDocumentNewType::class, $document);
$formDocumentNew->handleRequest($request);
if($formDocumentNew->isSubmitted()){
$valid = ValidationService::validateFile($validator, $formDocumentNew->get('path'), true, $formDocumentNew->get('file')->getData(), '5', array('pdf', 'doc', 'docx', 'jpg', 'jpeg', 'png', 'webp'));
if($valid && $formDocumentNew->isValid()){
$document->setUser($user);
switch($formDocumentNew->get('file')->getData()->guessExtension()){
case 'pdf':
case 'doc':
case 'docx':
MediaService::uploadDocument($formDocumentNew->get('file')->getData(), $uploadDir, $document, 'document');
break;
case 'jpg':
case 'jpeg':
case 'png':
case 'webp':
MediaService::uploadImage($fs, $formDocumentNew->get('file')->getData(), null, $uploadDir, $document, 'path', 100, 1000, 200, false);
break;
default: break;
}
$em->persist($document);
$em->flush();
$this->addFlash('notice_success', "Documento inserito");
return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $user->getId()));
}
else
$session->set('openModalDocumentNew', true);
}
$formDocumentEdit = $formFactory->createNamed("document_edit", UserDocumentEditType::class, $document);
$formDocumentEdit->handleRequest($request);
if($formDocumentEdit->isSubmitted()){
if($formDocumentEdit->isValid()){
$editDocument = $em->getRepository("App\Entity\Slave\UserDocument")->findOneById($request->request->get('id'));
$editDocument->setName($formDocumentEdit->get('name')->getData());
$em->flush();
$this->addFlash('notice_success', "Documento modificato");
return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $user->getId()));
}
else{
$session->set('openModalDocumentEdit', true);
$session->set('openModalDocumentEditId', $request->request->get('id'));
}
}
// Anagrafica - Utenze
$jtus = new JoinTableUserSupplier();
$formJtusNew = $formFactory->createNamed("jtus_new", JoinTableUserSupplierType::class, $jtus);
$formJtusNew->handleRequest($request);
if($formJtusNew->isSubmitted()){
if($formJtusNew->isValid()){
$jtus->setUser($user);
$em->persist($jtus);
$em->flush();
$this->addFlash('notice_success', "Utenza inserita");
return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $user->getId()));
}
else
$session->set('openModalJtusNew', true);
}
$formJtusEdit = $formFactory->createNamed("jtus_edit", JoinTableUserSupplierType::class, $jtus);
$formJtusEdit->handleRequest($request);
if($formJtusEdit->isSubmitted()){
if($formJtusEdit->isValid()){
$editJtus = $em->getRepository("App\Entity\Slave\JoinTableUserSupplier")->findOneById($request->request->get('id'));
$editJtus->setSupplier($formJtusEdit->get('supplier')->getData());
$editJtus->setValue($formJtusEdit->get('value')->getData());
$em->flush();
$this->addFlash('notice_success', "Modifiche salvate");
return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $user->getId()));
}
else
$session->set('openModalJtusEdit', true);
$session->set('openModalJtusEditId', $request->request->get('id'));
}
// Magazzini
$jtuw = new JoinTableUserWarehouse();
$formJtuwNew = $formFactory->createNamed("jtuw_new", JoinTableUserWarehouseNewType::class, $jtuw, ['user' => $user]);
$formJtuwNew->handleRequest($request);
if($formJtuwNew->isSubmitted()){
if($formJtuwNew->isValid()){
$jtuw->setUser($user);
$em->persist($jtuw);
$em->flush();
$this->addFlash('notice_success', "Permesso magazzino-utente inserito");
return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $user->getId()));
}
else
$session->set('openJtuwNew', true);
}
$jtuwEdit = new JoinTableUserWarehouse();
$formJtuwEdit = $formFactory->createNamed("jtuw_edit", JoinTableUserWarehouseEditType::class, $jtuwEdit);
$formJtuwEdit->handleRequest($request);
if($formJtuwEdit->isSubmitted()){
if($formJtuwEdit->isValid()){
$jt = $em->getRepository('App\Entity\Slave\JoinTableUserWarehouse')->findOneById($request->request->get('id'));
$jt->setPermission($jtuwEdit->getPermission());
$em->flush();
$this->addFlash('notice_success', "Modifiche salvate");
return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $user->getId()));
}
else{
$session->set('openJtuwEdit', true);
$session->set('openJtuwEditId', $request->request->get('id'));
}
}
$provinces = array();
foreach($company->getRegions() as $r)
foreach($r->getProvinces() as $p)
array_push($provinces, $p);
$operationsBySupplier = array();
$supplier = $em->getRepository('App\Entity\Slave\Supplier')->findAll();
foreach($supplier as $s){
$tmp = array();
array_push($tmp, $s, $s->getOperations());
array_push($operationsBySupplier, $tmp);
}
// Copertura e tariffario
$jttaotas = array();
foreach($user->getTechnicianAreas() as $ta){
$jts = $em->getRepository('App\Entity\Slave\JoinTableTechnicianAreaOperationTariffAmount')->findByTechnicianAndProvinceOrderedBySupplierAndOperation($user->getId(), $ta->getIdProvince());
$tmp = array();
array_push($tmp, $ta->getIdProvince(), $jts);
array_push($jttaotas, $tmp);
}
$formSuppliersAutoAssign = $formFactory->createNamed("form_suppliers_auto_assign", JoinTableUserSupplierAutoAssignType::class, $user);
$formSuppliersAutoAssign->handleRequest($request);
if($formSuppliersAutoAssign->isSubmitted()){
if($formSuppliersAutoAssign->isValid()){
$em->flush();
$this->addFlash('notice_success', "Fornitori tecnico aggiornati!");
return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $user->getId()));
}
}
// Clona tariffario da altro tecnico
$jttaota = new JoinTableTechnicianAreaOperationTariffAmount();
$formCloneJttaota = $formFactory->createNamed("jttaota_clone", JoinTableTechnicianAreaOperationTariffAmountCloneType::class, $jttaota, ['userId' => $user->getId()]);
$formCloneJttaota->handleRequest($request);
if($formCloneJttaota->isSubmitted()){
$valid = ValidationService::validateNotBlank($validator, $formCloneJttaota->get('userToClone'));
if($valid && $formCloneJttaota->isValid()){
$userToClone = $em->getRepository('App\Entity\Slave\User')->findOneById($formCloneJttaota->get('userToClone')->getData());
foreach($user->getTechnicianAreas() as $ta){
$taToClone = null;
foreach($userToClone->getTechnicianAreas() as $utcta){
if($ta->getIdProvince() == $utcta->getIdProvince()){
$taToClone = $utcta;
break;
}
}
if($taToClone != null){
foreach($ta->getOperationTariffAmounts() as $jttaota){
$jttaotaToClone = $em->getRepository('App\Entity\Slave\JoinTableTechnicianAreaOperationTariffAmount')->findOneByTechnicianAreaAndOperationTariffAmount($taToClone->getId(), $jttaota->getOperationTariffAmount()->getId());
if($jttaotaToClone != null){
$jttaota->setAmount($jttaotaToClone->getAmount());
}
}
}
}
$em->flush();
$this->addFlash('notice_success', "Tariffe clonate");
return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $user->getId()));
}
else
$session->set('openCloneJttaota', true);
}
// Ferie
$holiday = new UserHoliday();
$formHolidayNew = $formFactory->createNamed("holiday_new", UserHolidayType::class, $holiday, array('userId' => $user->getId()));
$formHolidayNew->handleRequest($request);
if($formHolidayNew->isSubmitted()){
$valid = true;
if($valid) $valid = ValidationService::validateNotBlank($validator, $formHolidayNew->get('substitute'));
if($valid) $valid = ValidationService::validateNotBlank($validator, $formHolidayNew->get('dateFrom'));
if($valid) $valid = ValidationService::validateNotBlank($validator, $formHolidayNew->get('dateTo'));
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!');
if($valid && $formHolidayNew->isValid()){
$holiday->setUser($user);
$em->persist($holiday);
$em->flush();
$this->addFlash('notice_success', "Ferie inserite");
return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $user->getId()));
}
else
$session->set('openModalHolidayNew', true);
}
$formHolidayEdit = $formFactory->createNamed("holiday_edit", UserHolidayType::class, $holiday, array('userId' => $user->getId()));
$formHolidayEdit->handleRequest($request);
if($formHolidayEdit->isSubmitted()){
$valid = true;
if($valid) $valid = ValidationService::validateNotBlank($validator, $formHolidayEdit->get('substitute'));
if($valid) $valid = ValidationService::validateNotBlank($validator, $formHolidayEdit->get('dateFrom'));
if($valid) $valid = ValidationService::validateNotBlank($validator, $formHolidayEdit->get('dateTo'));
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!');
if($valid && $formHolidayEdit->isValid()){
$editHoliday = $em->getRepository("App\Entity\Slave\UserHoliday")->findOneById($request->request->get("id"));
$editHoliday->setSubstitute($formHolidayEdit->get('substitute')->getData());
$editHoliday->setDateFrom($formHolidayEdit->get('dateFrom')->getData());
$editHoliday->setDateTo($formHolidayEdit->get('dateTo')->getData());
$em->flush();
$this->addFlash('notice_success', "Ferie modificate");
return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $user->getId()));
}
else{
$session->set('openModalHolidayEdit', true);
$session->set('openModalHolidayEditId', $request->request->get("id"));
}
}
// Economico e pagamenti
$formEconomicVisible = $formFactory->createNamed("economic_visible", TechnicianEconomicType::class, $user);
$formEconomicVisible->handleRequest($request);
if($formEconomicVisible->isSubmitted()){
if($formEconomicVisible->isValid()){
$em->flush();
$this->addFlash('notice_success', "Dati aggiornati");
return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $user->getId()));
}
}
$operations = $em->getRepository('App\Entity\Slave\Operation')->findAll();
$operationGroups = $em->getRepository('App\Entity\Slave\OperationGroup')->findAllOrderedByUav();
$interventions = $em->getRepository('App\Entity\Slave\Intervention')->findByTechnicianToPay($user->getId());
return $this->render('role/user/users/technician/sheet.html.twig', array(
'company' => $company,
'user' => $user,
'idZip' => $oldZipId,
'cities' => $cities,
'provinces' => $provinces,
'operationsBySupplier' => $operationsBySupplier,
'operationGroups' => $operationGroups,
'interventions' => $interventions,
'jttaotas' => $jttaotas,
'formData' => $formData->createView(),
'formDocumentNew' => $formDocumentNew->createView(),
'formDocumentEdit' => $formDocumentEdit->createView(),
'formJtusNew' => $formJtusNew->createView(),
'formJtusEdit' => $formJtusEdit->createView(),
'formSuppliersAutoAssign' => $formSuppliersAutoAssign->createView(),
'formJtuwNew' => $formJtuwNew->createView(),
'formJtuwEdit' => $formJtuwEdit->createView(),
'formCloneJttaota' => $formCloneJttaota->createView(),
'formHolidayNew' => $formHolidayNew->createView(),
'formHolidayEdit' => $formHolidayEdit->createView(),
'formEconomicVisible' => $formEconomicVisible->createView()
));
}
/**
* @Route("/tecnici/scheda/documento-elimina", name="user_users_technician_document_delete")
* @Security("is_granted('edit', 'technician')")
*/
public function userUsersTechnicianDocumentDelete(Request $request, FileSystem $fs)
{
$em = $this->mr->getManager('slave');
$emMaster = $this->mr->getManager('master');
$session = $request->getSession();
$company = $emMaster->getRepository("App\Entity\Master\Company")->findOneById($session->get("companyId"));
$uploadDir = $this->params->get('kernel.project_dir').'/'.$this->params->get('web_path').'/companies/'.$company->getDirectoryPath().'/users/';
$document = $em->getRepository("App\Entity\Slave\UserDocument")->findOneById($request->request->get("documentDelId"));
$userId = $document->getUser()->getId();
MediaService::removeDocument($fs, $document->getPath(), $uploadDir);
$em->remove($document);
$em->flush();
$this->addFlash('notice_success', "Documento eliminato");
return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $userId));
}
/**
* @Route("/tecnici/scheda/utenza-elimina", name="user_users_technician_jtus_delete")
* @Security("is_granted('edit', 'technician')")
*/
public function userUsersTechnicianJtusDelete(Request $request)
{
$em = $this->mr->getManager('slave');
$session = $request->getSession();
$jtus = $em->getRepository("App\Entity\Slave\JoinTableUserSupplier")->findOneById($request->request->get("jtusDelId"));
$userId = $jtus->getUser()->getId();
$em->remove($jtus);
$em->flush();
$this->addFlash('notice_success', "Utenza eliminata");
return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $userId));
}
/**
* @Route("/tecnici/scheda/magazzino-elimina", name="user_users_technician_warehouse_delete")
* @Security("is_granted('edit', 'technician')")
*/
public function userUsersTechnicianWarehouseDelete(Request $request)
{
$em = $this->mr->getManager('slave');
$emMaster = $this->mr->getManager('master');
$session = $request->getSession();
$jtuw = $em->getRepository('App\Entity\Slave\JoinTableUserWarehouse')->findOneById($request->request->get('jtuwDelId'));
$userId = $jtuw->getUser()->getId();
$em->remove($jtuw);
$em->flush();
$this->addFlash('notice_success', "Collegamento con il magazzino eliminato");
return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $userId));
}
/**
* @Route("/tecnici/{userId}/scheda/area-copertura/nuova", name="user_users_technician_area_new")
* @Security("is_granted('edit', 'technician')")
*/
public function userUsersTechnicianAreaNew($userId, Request $request, ValidatorInterface $validator, FormFactoryInterface $formFactory)
{
$emMaster = $this->mr->getManager('master');
$em = $this->mr->getManager('slave');
$session = $request->getSession();
$company = $emMaster->getRepository("App\Entity\Master\Company")->findOneById($session->get("companyId"));
$user = $em->getRepository('App\Entity\Slave\User')->findOneById($userId);
$regionIds = array();
foreach($company->getRegions() as $r)
array_push($regionIds, $r->getId());
$technicianArea = new TechnicianArea();
$form = $formFactory->createNamed("form_technician_area", TechnicianAreaType::class, $technicianArea, array('regionIds' => $regionIds));
$form->handleRequest($request);
if($form->isSubmitted()){
$valid = FormValidatorService::validateTechnicianArea($validator, $form, $user->getTechnicianAreas(), 0);
if($valid && $form->isValid()){
$matrixZips = array();
if(!$form->get('allZip')->getData()){
$zips = explode('-', $form->get('zips')->getData());
foreach($zips as $z){
$arrayTmp = array();
$zip = $emMaster->getRepository('App\Entity\Master\Zip')->findOneById($z);
array_push($arrayTmp, $zip->getId(), $zip->getCode());
array_push($matrixZips, $arrayTmp);
}
}
$technicianArea->setUser($user);
$technicianArea->setIdProvince($form->get('province')->getData()->getId());
$technicianArea->setZips($matrixZips);
$technicianArea->setAllZip($form->get('allZip')->getData());
$em->persist($technicianArea);
$em->flush();
TechnicianTariffService::updateTechnicianTariffs($em, $technicianArea->getId());
$this->addFlash('notice_success', "Area tecnico inserita");
return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $user->getId()));
}
}
return $this->render('role/user/users/technician/area_new.html.twig', array(
'form' => $form->createView(),
'user' => $user
));
}
/**
* @Route("/tecnici/scheda/area-copertura/{technicianAreaId}/modifica", name="user_users_technician_area_edit")
* @Security("is_granted('edit', 'technician')")
*/
public function userUsersTechnicianAreaEdit($technicianAreaId, Request $request, ValidatorInterface $validator, FormFactoryInterface $formFactory)
{
$emMaster = $this->mr->getManager('master');
$em = $this->mr->getManager('slave');
$session = $request->getSession();
$company = $emMaster->getRepository("App\Entity\Master\Company")->findOneById($session->get("companyId"));
$technicianArea = $em->getRepository("App\Entity\Slave\TechnicianArea")->findOneById($technicianAreaId);
$user = $technicianArea->getUser();
$regionIds = array();
foreach($company->getRegions() as $r)
array_push($regionIds, $r->getId());
$form = $formFactory->createNamed("form_technician_area", TechnicianAreaType::class, $technicianArea, array('regionIds' => $regionIds));
$form->handleRequest($request);
if($form->isSubmitted()){
$valid = FormValidatorService::validateTechnicianArea($validator, $form, $user->getTechnicianAreas(), $technicianArea->getId());
if($valid && $form->isValid()){
$matrixZips = array();
if(!$form->get('allZip')->getData()){
$zips = explode('-', $form->get('zips')->getData());
foreach($zips as $z){
$arrayTmp = array();
$zip = $emMaster->getRepository('App\Entity\Master\Zip')->findOneById($z);
array_push($arrayTmp, $zip->getId(), $zip->getCode());
array_push($matrixZips, $arrayTmp);
}
}
$technicianArea->setUser($user);
$technicianArea->setIdProvince($form->get('province')->getData()->getId());
$technicianArea->setZips($matrixZips);
$technicianArea->setAllZip($form->get('allZip')->getData());
$em->persist($technicianArea);
$em->flush();
TechnicianTariffService::updateTechnicianTariffs($em, $technicianArea->getId());
$this->addFlash('notice_success', "Area tecnico modificata");
return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $user->getId()));
}
}
return $this->render('role/user/users/technician/area_edit.html.twig', array(
'form' => $form->createView(),
'technicianArea' => $technicianArea
));
}
/**
* @Route("/tecnici/scheda/area-copertura/elimina", name="user_users_technician_area_delete")
* @Security("is_granted('edit', 'technician')")
*/
public function userUsersTechnicianAreaDelete(Request $request)
{
$em = $this->mr->getManager('slave');
$session = $request->getSession();
$technicianArea = $em->getRepository("App\Entity\Slave\TechnicianArea")->findOneById($request->request->get("technicianAreaDelId"));
$userId = $technicianArea->getUser()->getId();
foreach($technicianArea->getOperationTariffAmounts() as $jt)
$em->remove($jt);
$em->remove($technicianArea);
$em->flush();
$this->addFlash('notice_success', "Area copertura eliminata");
return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $userId));
}
/**
* @Route("/tecnici/scheda/tariffe-ammontare-aggiorna", name="user_technician_tariff_amount_update")
* @Security("is_granted('edit', 'technician')")
*/
public function userUsersTechnicianTariffAmountUpdate(Request $request, ValidatorInterface $validator)
{
$em = $this->mr->getManager('slave');
$session = $request->getSession();
$user = $em->getRepository('App\Entity\Slave\User')->findOneById($request->request->get('userId'));
$assert = new Assert\Regex(['pattern' => '/^[-]?[0-9]|^[-]?[0-9]+([.|,][0-9]{2})$/']);
$error = false;
foreach($user->getTechnicianAreas() as $ta){
foreach($ta->getOperationTariffAmounts() as $jttaota){
// Controllo che sia un numero scritto come 12.34 o 12
$value = $request->request->get('jttaota_'.$jttaota->getId());
$errors = $validator->validate($value, $assert);
if(count($errors) !== 0){
$error = true;
break;
break;
}
$jttaota->setAmount($value);
}
}
if($error){
$this->addFlash('notice_warning', 'Errore! Inserire i valori nel formato corretto: "12", "12.34" o "12,34"');
}
else{
$em->flush();
$this->addFlash('notice_success', "Tariffe aggiornate");
}
return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $user->getId()));
}
/**
* @Route("/tecnici/scheda/ferie-elimina", name="user_users_technician_holiday_delete")
* @Security("is_granted('edit', 'technician')")
*/
public function userUsersTechnicianHolidayDelete(Request $request)
{
$em = $this->mr->getManager('slave');
$holiday = $em->getRepository("App\Entity\Slave\UserHoliday")->findOneById($request->request->get("holidayDelId"));
$userId = $holiday->getUser()->getId();
$em->remove($holiday);
$em->flush();
$session = $request->getSession();
$this->addFlash('notice_success', "Ferie eliminate");
return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $userId));
}
/**
* @Route("/tecnici/scheda/aggiorna-economico-interventi", name="user_users_technician_economic_recalculate")
* @Security("is_granted('edit', 'technician')")
*/
public function userUsersTechnicianEconomicRecalculate(Request $request)
{
$em = $this->mr->getManager('slave');
$session = $request->getSession();
$userId = $request->request->get('userId');
$year = $request->request->get('year');
$month = $request->request->get('month');
$interventions = $em->getRepository('App\Entity\Slave\Intervention')->findByTechnicianByYearAndMonth($userId, $year, $month);
foreach($interventions as $int){
$amountTechnician = null;
if($int->getOutcomeType()->getSlug() == 'completed'){
// Se completato -> Prendo ammontare tariffa normale
foreach($int->getTicket()->getOperationTariffAmount()->getTechnicianAreas() as $jttaota){
if($jttaota->getTechnicianArea()->getUser()->getId() == $userId){
$amountTechnician = $jttaota->getAmount();
break;
}
}
}
else{
// Se sospeso/uav -> Prendo ammontare tariffa UAV
if($int->getTicket()->getUAVOperationTariffAmount() != null){
foreach($int->getTicket()->getUAVOperationTariffAmount()->getTechnicianAreas() as $jttaota){
if($jttaota->getTechnicianArea()->getUser()->getId() == $userId){
$amountTechnician = $jttaota->getAmount();
break;
}
}
}
}
if($amountTechnician == null)
$amountTechnician = '0.00';
$int->setAmountTechnician($amountTechnician);
}
$em->flush();
$this->addFlash('notice_success', "Ammontare del mese ricalcolati con successo!");
return $this->redirectToRoute('user_users_technician_sheet', array('userId' => $userId));
}
/**
* @Route("/tecnici/scheda/economico-esporta", name="user_users_technician_economic_export")
* @Security("is_granted('edit', 'technician')")
*/
public function userUsersTechnicianEconomicExport(Request $request)
{
$em = $this->mr->getManager('slave');
$emMaster = $this->mr->getManager('master');
$session = $request->getSession();
$userId = $request->request->get('userId');
$year = $request->request->get('year');
$month = $request->request->get('month');
$user = $em->getRepository('App\Entity\Slave\User')->findOneById($userId);
$allInterventions = $em->getRepository("App\Entity\Slave\Intervention")->findByTechnicianToPayByYearAndMonth($user->getId(), $year, $month);
// Rimuovo gli interventi che hanno una sospensione -> Gestita e non approvata / Non gestita
$interventions = array();
foreach($allInterventions as $int){
$toCalculate = true;
if($int->getSuspension() != null && ($int->getSuspension()->isManaged() == false || $int->getSuspension()->isApproved() == false))
$toCalculate = false;
if($toCalculate)
array_push($interventions, $int);
}
$response = new StreamedResponse();
$response->setCallback(function() use($emMaster, $interventions) {
$handle = fopen('php://output', 'w+');
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'), ";", '"', "\\");
$provinceSign = '';
$cityName = '';
$zip = '';
$operation = '';
$ticket = '';
$client = '';
$termid = '';
$datetime = '';
$outcome = '';
$cost = 0;
$amount = 0;
$amountExtra = 0;
$total = 0;
$totalCost = 0;
$totalAmount = 0;
$totalAmountExtra = 0;
$totalAmountNotBillable = 0;
$totalTotal = 0;
foreach($interventions as $int){
$provinceSign = $emMaster->getRepository('App\Entity\Master\Province')->findOneById($int->getTicket()->getIdProvince())->getSign();
$cityName = $emMaster->getRepository('App\Entity\Master\City')->findOneById($int->getTicket()->getIdCity())->getName();
$zip = $int->getTicket()->getZip();
$operation = $int->getTicket()->getOperation();
$ticket = $int->getTicket()->getNumber();
$client = $int->getTicket()->getClient();
$termid = $int->getTicket()->getTermid();
$datetime = $int->getDatetime()->format('d-m-Y H:i');
$outcome = $int->getOutcomeType().' '.$int->getOutcome();
$first = true;
$activities = '';
foreach($int->getActivities() as $act){
if($first) $first = false; else $activities.= ' --- ';
if($act->getProductWithdraw() != null){
$pr = $act->getProductWithdraw();
$codeProd = $act->getProducerWithdraw();
$codeSupp = $act->getSupplierWithdraw();
}
if($act->getProductActual() != null){
$pr = $act->getProductActual();
$codeProd = $act->getProducerActual();
$codeSupp = $act->getSupplierActual();
}
if($act->getProductInstallation() != null){
$pr = $act->getProductInstallation();
$codeProd = $act->getProducerInstallation();
$codeSupp = $act->getSupplierInstallation();
}
$activities.= $act->getType();
}
$cost = $int->getAmount();
$amount = $int->getAmountTechnician();
$amountExtra = $int->takeAllExtraAmount();
$amountNotBillable = $int->takeAllExtraNotBillableAmount();
$total = $int->calculateTotalTechnicianAmount();
$totalCost = $totalCost + $cost;
$totalAmount = $totalAmount + $amount;
$totalAmountExtra = $totalAmountExtra + $amountExtra;
$totalAmountNotBillable = $totalAmountNotBillable + $amountNotBillable;
$totalTotal = $totalTotal + $total;
fputcsv($handle, array($provinceSign, $cityName, $zip, $operation, $ticket, $client, $termid, $datetime, $outcome, $activities, number_format($cost, 2, '.', ','), number_format($amount, 2, '.', ','), number_format($amountExtra, 2, '.', ','), number_format($amountNotBillable, 2, '.', ','), number_format($total, 2, '.', ',')), ";", '"', "\\");
}
fputcsv($handle, array('Totali', '', '', '', '', '', '', '', '', '', number_format($totalCost, 2, '.', ','), number_format($totalAmount, 2, '.', ','), number_format($totalAmountExtra, 2, '.', ','), number_format($totalAmountNotBillable, 2, '.', ','), number_format($totalTotal, 2, '.', ',')), ";", '"', "\\");
fclose($handle);
});
$response->setStatusCode(200);
$dispositionHeader = $response->headers->makeDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, 'Riassunto economico '.$user.' --- '.$year.'-'.$month.'.csv');
$response->headers->set('Content-Type', 'text/csv; charset=ISO-8859-15');
$response->headers->set('Content-Disposition', $dispositionHeader);
return $response;
}
//
}