<?php
namespace App\Controller\User;
use App\Entity\Master\CityAlias;
use App\Entity\Slave\Client;
use App\Entity\Slave\ClientPhone;
use App\Entity\Slave\Product;
use App\Entity\Slave\Intervention;
use App\Entity\Slave\InterventionActivity;
use App\Entity\Slave\InterventionExtra;
use App\Entity\Slave\Termid;
use App\Entity\Slave\Ticket;
use App\Entity\Slave\TicketReminder;
use App\Entity\Slave\TicketSuspension;
use App\Entity\Slave\Warehouse;
use App\Form\Base\DocumentType;
use App\Form\Master\CityAliasType;
use App\Form\Model\AssignTechnician;
use App\Form\Model\Document;
use App\Form\Model\ImportTicketsSuspend;
use App\Form\Model\ImportTicketsSusUnlock;
use App\Form\Model\ImportTicketCancels;
use App\Form\Model\ImportTicketClosures;
use App\Form\Model\ImportTicketIntervention;
use App\Form\Model\ImportTicketNew;
use App\Form\Slave\AssignTechnicianType;
use App\Form\Slave\ClientEditType;
use App\Form\Slave\InterventionType;
use App\Form\Slave\InterventionActivityType;
use App\Form\Slave\InterventionSlaType;
use App\Form\Slave\InterventionExtraType;
use App\Form\Slave\OperationKeysMappingType;
use App\Form\Slave\TicketType;
use App\Form\Slave\TicketAddressType;
use App\Form\Slave\TicketErrorProvinceType;
use App\Form\Slave\TicketErrorAddressType;
use App\Form\Slave\TicketErrorSupplierType;
use App\Form\Slave\TicketErrorOperationType;
use App\Form\Slave\TicketDeleteType;
use App\Form\Slave\TicketOperationType;
use App\Form\Slave\TicketOperationTariffAmountType;
use App\Form\Slave\TicketExpirationEditType;
use App\Form\Slave\TicketWaybillEditType;
use App\Form\Slave\TicketReminderType;
use App\Form\Slave\TicketSuspensionEditType;
use App\Form\Slave\TicketSuspensionApproveType;
use App\Form\Slave\TicketSuspensionUnlockType;
use App\Form\Slave\ImportTicketCancelsType;
use App\Form\Slave\ImportTicketClosuresType;
use App\Form\Slave\ImportTicketsSuspendType;
use App\Form\Slave\ImportTicketsSusUnlockType;
use App\Form\Slave\ImportTicketInterventionType;
use App\Form\Slave\ImportTicketNewType;
use App\Service\EncryptionService;
use App\Service\FilterService;
use App\Service\FormValidatorService;
use App\Service\ImportService;
use App\Service\MediaService;
use App\Service\ProductService;
use App\Service\TicketService;
use App\Service\UtilitiesService;
use App\Service\ValidationService;
use Doctrine\Persistence\ManagerRegistry;
use Knp\Snappy\Pdf;
use Knp\Component\Pager\PaginatorInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
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\ResponseHeaderBag;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Validator\Validator\ValidatorInterface;
/**
* @Route("/scrivania/ticket")
* @Security("is_granted('ROLE_USER') and is_granted('active', user) && is_granted('view', 'ticket')")
*/
class UserTicketController extends AbstractController
{
private $mr;
private $params;
public function __construct(ManagerRegistry $mr, ParameterBagInterface $params)
{
$this->mr = $mr;
$this->params = $params;
}
public function activityProductByType($em, $form, $type, $suppliers){
if($form->get('product'.$type.'Id')->getData() != null){
$product = $em->getRepository('App\Entity\Slave\Product')->findOneById($form->get('product'.$type.'Id')->getData());
}
else{
$model = $em->getRepository('App\Entity\Slave\ProductModel')->findOneById($form->get('model'.$type.'Id')->getData());
switch($type){
case 'Withdraw':
$status = $em->getRepository('App\Entity\Slave\ProductStatus')->findOneBy(array('slug' => 'not_available'));
$condition = $em->getRepository('App\Entity\Slave\ProductCondition')->findOneBy(array('slug' => 'broken'));
break;
case 'Actual':
$status = $em->getRepository('App\Entity\Slave\ProductStatus')->findOneBy(array('slug' => 'in_use'));
$condition = $em->getRepository('App\Entity\Slave\ProductCondition')->findOneBy(array('slug' => 'free'));
break;
default: break;
}
$product = ProductService::createProduct($em, $model, $form->get('producer'.$type)->getData(), $form->get('supplier'.$type)->getData(), $suppliers, $status, $condition);
}
return $product;
}
public function importCheckFile($em, $validator, $form)
{
$row = 0;
$valid = true;
if($valid) $valid = ValidationService::validateNotBlank($validator, $form->get('separator'));
if($valid) $valid = ValidationService::validateFile($validator, $form->get('path'), true, $form->get('file')->getData(), '10', array('csv', 'txt'));
if($valid && ($handle = fopen($form->get('file')->getData(), "r")) !== FALSE) {
while(($data = fgetcsv($handle, 2000, $form->get('separator')->getData())) !== FALSE) {
$data = array_map("utf8_encode", $data);
if($row > 0){
$ticket = $em->getRepository('App\Entity\Slave\Ticket')->findOneByNumberAndTermid($data[0], $data[1]);
if($ticket == null){
$valid = false;
$form->get("path")->addError(new FormError("Ticket non trovato"));
$this->addFlash('notice_danger', 'Il ticket presente alla riga '.$row.' con n° '.$data[0].' e termid '.$data[1].' non è stato trovato! Ricontrolla il file!');
break;
}
}
$row++;
}
fclose($handle);
}
return $valid;
}
public function importInterventionCreate($em, $ticket, $warehouse, $datetime)
{
$intervention = new Intervention();
$intervention->setTicket($ticket);
$intervention->setTechnician($ticket->getTechnician());
$intervention->setOperator($this->getUser());
$intervention->setOutcomeType($em->getRepository('App\Entity\Slave\InterventionOutcomeType')->findOneBy(array('slug' => 'completed')));
$intervention->setOutcome($em->getRepository('App\Entity\Slave\InterventionOutcome')->findOneBy(array('slug' => 'completato-correttamente')));
$intervention->setWarehouse($warehouse);
$intervention->setDatetime($datetime);
$intervention->setDatetimeBilling(date_create_from_format('d-m-Y H:i:s', '01-'.$datetime->format('m').'-'.$datetime->format('Y').' 00:00:00'));
if($ticket->getOperationTariffAmount() != null)
$intervention->setAmount($ticket->getOperationTariffAmount()->getAmount());
$intervention->setAmountTechnician('0.00');
$intervention->setBillable(true);
$em->persist($intervention);
return $intervention;
}
public function importInterventionSearchProduct($em, $code, $supplier){
$product = $em->getRepository('App\Entity\Slave\Product')->findOneBy(array('codeProducer' => $code));
if($product == null)
$product = $em->getRepository('App\Entity\Slave\Product')->findOneBy(array('codeSupplier' => $code));
return $product;
}
public function importInterventionActivity($em, $ticket, $intervention, $activityType, $isDisi, $prodOld, $prodNew, $warehouse, $datetime)
{
$activity = new InterventionActivity();
$activity->setIntervention($intervention);
$activity->setType($activityType);
$skip = false;
if($prodOld != null && $prodNew != null && ($prodNew->getCodeProducer() == $prodOld->getCodeProducer() || $prodNew->getCodeProducer() == '0'.$prodOld->getCodeProducer()))
$skip = true;
if($prodOld != null){
$activity->setProductWithdraw($prodOld);
$activity->setProducerWithdraw($prodOld->getCodeProducer());
$activity->setSupplierWithdraw($prodOld->getCodeSupplier());
$newWarehouse = $warehouse;
if($prodOld->movedByDS())
$newWarehouse = $prodOld->getActualWarehouse();
else{
$prodOld->setStatus($em->getRepository('App\Entity\Slave\ProductStatus')->findOneBy(array('slug' => 'not_available')));
$prodOld->setCondition($em->getRepository('App\Entity\Slave\ProductCondition')->findOneBy(array('slug' => 'broken')));
}
$prodOld->setActualWarehouse($ticket->getClient()->getWarehouse());
ProductService::createProductTransferLog($em, $prodOld, null, $this->getUser(), $warehouse, $datetime, 'forced');
$prodOld->setActualWarehouse($newWarehouse);
}
if($prodNew != null && !$skip){
if($isDisi){
$activity->setProductWithdraw($prodNew);
$activity->setProducerWithdraw($prodNew->getCodeProducer());
$activity->setSupplierWithdraw($prodNew->getCodeSupplier());
$newWarehouse = $warehouse;
if($prodNew->movedByDS())
$newWarehouse = $prodNew->getActualWarehouse();
else{
$prodNew->setStatus($em->getRepository('App\Entity\Slave\ProductStatus')->findOneBy(array('slug' => 'not_available')));
$prodNew->setCondition($em->getRepository('App\Entity\Slave\ProductCondition')->findOneBy(array('slug' => 'broken')));
}
$prodNew->setActualWarehouse($ticket->getClient()->getWarehouse());
ProductService::createProductTransferLog($em, $prodNew, null, $this->getUser(), $warehouse, $datetime, 'forced');
$prodNew->setActualWarehouse($newWarehouse);
}
else{
$activity->setProductInstallation($prodNew);
$activity->setProducerInstallation($prodNew->getCodeProducer());
$activity->setSupplierInstallation($prodNew->getCodeSupplier());
$newWarehouse = $ticket->getClient()->getWarehouse();
if($prodNew->movedByDS())
$newWarehouse = $prodNew->getActualWarehouse();
else{
$prodNew->setTermid($ticket->getTermid());
$prodNew->setStatus($em->getRepository('App\Entity\Slave\ProductStatus')->findOneBy(array('slug' => 'in_use')));
$prodNew->setCondition($em->getRepository('App\Entity\Slave\ProductCondition')->findOneBy(array('slug' => 'free')));
}
$prodNew->setActualWarehouse($warehouse);
ProductService::createProductTransferLog($em, $prodNew, null, $this->getUser(), $ticket->getClient()->getWarehouse(), $datetime, 'forced');
$prodNew->setActualWarehouse($newWarehouse);
}
}
$em->persist($activity);
}
public function deleteTicketAndConnectedValues($em, $ticket){
$termid = $ticket->getTermid();
$client = $ticket->getClient();
if($termid != null){
if(sizeof($termid->getTickets()) == 1){
foreach($termid->getProducts() as $pr)
$pr->setTermid(null);
$em->remove($termid);
}
}
if($ticket->getClient() != null){
if(sizeof($client->getTermids()) == 1 && sizeof($client->getTickets()) == 1 && sizeof($client->getFiles()) == 0 && $client->getWarehouse()->canDelete()){
foreach($client->getPhones() as $phone)
$em->remove($phone);
$em->remove($client->getWarehouse());
$em->remove($client);
}
}
$em->remove($ticket);
}
public function deleteProductAlreadyInserted($em, $product)
{
foreach($product->getTransferLogs() as $transferLog)
$em->remove($transferLog);
foreach($product->getLogs() as $log)
$em->remove($log);
$em->remove($product);
$em->flush();
}
// SCRIVANIA
/**
* @Route("/sblocca-materiale-mancante", name="user_ticket_unlock_waiting_material")
*/
public function userTicketUnlockWaitingMaterial(Request $request)
{
$em = $this->mr->getManager('slave');
$ticket = $em->getRepository('App\Entity\Slave\Ticket')->findOneById($request->request->get('ticketId'));
foreach($ticket->getSuspensions() as $s){
if(!$s->isUnlocked())
$suspension = $s;
}
$unlockCausal = "Ticket sbloccato per materiale mancante ricevuto";
$suspension->unlock($unlockCausal, new \DateTime(), $em);
$em->flush();
$response = array("code" => 200, "success" => true);
return new Response(json_encode($response));
}
//
// SCARICA
/**
* @Route("/scarica-da-email", name="user_ticket_download_email")
* @Security("is_granted('edit', 'ticket')")
*/
public function userTicketDownloadEmail(Request $request)
{
$emMaster = $this->mr->getManager('master');
$session = $request->getSession();
$company = $emMaster->getRepository('App\Entity\Master\Company')->findOneById($session->get('companyId'));
$mailbox = "{in.postassl.it:993/imap/ssl}INBOX";
$mailboxOther = "{in.postassl.it:993/imap/ssl}INBOX.other";
$em = $this->mr->getManager('slave');
foreach($company->getMailers() as $mailer){
$count = 0;
$countTicket = 0;
$countTicketError = 0;
$inboxOther = imap_open($mailboxOther, $mailer->getUser(), EncryptionService::decrypt($mailer->getPassword())) or die('Impossibile connettersi alla casella email: '.imap_last_error()); // Connessione alla casella email
imap_expunge($inboxOther); // Elimina le mail "marcate"
imap_close($inboxOther); // Chiude la connessione
$inbox = imap_open($mailbox, $mailer->getUser(), EncryptionService::decrypt($mailer->getPassword())) or die('Impossibile connettersi alla casella email: '.imap_last_error()); // Connessione alla casella email
imap_expunge($inbox); // Elimina le mail "marcate"
$emails = imap_search($inbox, 'ALL'); // Cerca tutte le email da leggere
$testing = $this->params->get('ticket_download_testing');
$error = false;
if($emails){
rsort($emails); // Ordino con la più nuova in cima
foreach($emails as $email){
if($count < 600){
// INOLTRO A THEBURMANUTENZIONE@GMAIL.COM
if($company->getCode() == "BBQV25"){
$overview = imap_fetch_overview($inbox, $email, 0);
$isRead = isset($overview[0]->seen) && $overview[0]->seen == 1;
if(!$isRead){
$header = imap_headerinfo($inbox, $email); // Gestisco l'header
// Serve per skippare le email che non hanno mittente o di spam
if(property_exists($header, 'from') && property_exists($header->from[0], 'host'))
$sender = $header->from[0]->mailbox."@".$header->from[0]->host;
if($sender == "thebur.manutenzioni@gmail.com"){
$body = imap_fetchbody($inbox, $email, 1);
$subject = $header->subject;
$to = 'thebur.integrations@gmail.com';
$headers = "From: $sender\r\n";
$headers .= "Reply-To: $sender\r\n";
$headers .= "X-Mailer: PHP/" . phpversion();
mail($to, $subject, $body, $headers);
imap_setflag_full($inbox, $email, "\\SEEN");
}
}
}
[$countTicket, $countTicketError] = TicketService::downloadTicket($em, $emMaster, $inbox, $email, $mailer, $testing, $company,$countTicket, $countTicketError);
}
else
break;
$count++;
}
}
if(!$testing){
imap_expunge($inbox); // Elimina le mail "marcate"
imap_close($inbox); // Chiude la connessione
}
if($countTicketError > 0)
$noticeType = "notice_warning";
else
$noticeType = "notice_success";
$this->addFlash($noticeType, 'Casella '.$mailer->getUser().':<br>E-mail processate: '.$count.'<br>Ticket scaricati: '.$countTicket.'<br>Ticket con errori: '.$countTicketError);
}
return $this->redirectToRoute("user_ticket_list");
}
/**
* @Route("/scarica-da-email-altro", name="user_ticket_download_email_other")
* @Security("is_granted('edit', 'ticket')")
*/
public function userTicketDownloadEmailOther(Request $request)
{
$session = $request->getSession();
$emMaster = $this->mr->getManager('master');
$company = $emMaster->getRepository('App\Entity\Master\Company')->findOneById($session->get('companyId'));
$mailbox = "{in.postassl.it:993/imap/ssl}INBOX.other";
$mailboxIncoming = "{in.postassl.it:993/imap/ssl}INBOX";
$em = $this->mr->getManager('slave');
foreach($company->getMailers() as $mailer){
$count = 0;
$countTicket = 0;
$countTicketError = 0;
$inboxIncoming = imap_open($mailboxIncoming, $mailer->getUser(), EncryptionService::decrypt($mailer->getPassword())) or die('Impossibile connettersi alla casella email: '.imap_last_error()); // Connessione alla casella email
imap_expunge($inboxIncoming); // Elimina le mail "marcate"
imap_close($inboxIncoming); // Chiude la connessione
$inbox = imap_open($mailbox, $mailer->getUser(), EncryptionService::decrypt($mailer->getPassword())) or die('Impossibile connettersi alla casella email: '.imap_last_error()); // Connessione alla casella email
imap_expunge($inbox); // Elimina le mail "marcate"
$emails = imap_search($inbox, 'UNSEEN'); // Cerca tutte le email da leggere
$testing = $this->params->get('ticket_download_testing');;
$error = false;
if($emails){
rsort($emails); // Ordino con la più nuova in cima
foreach($emails as $email){
if($count < 600){
// INOLTRO A THEBURMANUTENZIONE@GMAIL.COM
if($company->getCode() == "BBQV25"){
$overview = imap_fetch_overview($inbox, $email, 0);
$isRead = isset($overview[0]->seen) && $overview[0]->seen == 1;
if(!$isRead){
$header = imap_headerinfo($inbox, $email); // Gestisco l'header
// Serve per skippare le email che non hanno mittente o di spam
if(property_exists($header, 'from') && property_exists($header->from[0], 'host'))
$sender = $header->from[0]->mailbox."@".$header->from[0]->host;
if($sender == "thebur.manutenzioni@gmail.com"){
$body = imap_fetchbody($inbox, $email, 1);
$subject = $header->subject;
$to = 'thebur.integrations@gmail.com';
$headers = "From: $sender\r\n";
$headers .= "Reply-To: $sender\r\n";
$headers .= "X-Mailer: PHP/" . phpversion();
mail($to, $subject, $body, $headers);
imap_setflag_full($inbox, $email, "\\SEEN");
}
}
}
[$countTicket, $countTicketError] = TicketService::downloadTicket($em, $emMaster, $inbox, $email, $mailer, $testing, $company,$countTicket, $countTicketError);
}
else
break;
$count++;
}
}
if(!$testing){
imap_expunge($inbox); // Elimina le mail "marcate"
imap_close($inbox); // Chiude la connessione
}
if($countTicketError > 0)
$noticeType = "notice_warning";
else
$noticeType = "notice_success";
$this->addFlash($noticeType, 'Casella '.$mailer->getUser().':<br>E-mail processate: '.$count.'<br>Ticket scaricati: '.$countTicket.'<br>Ticket con errori: '.$countTicketError);
}
return $this->redirectToRoute("user_ticket_list");
}
//
// IMPORTA CSV
/**
* @Route("/importa", name="user_ticket_import")
* @Security("is_granted('edit', 'ticket')")
*/
public function userTicketImport(Request $request, ValidatorInterface $validator, FormFactoryInterface $formFactory)
{
$em = $this->mr->getManager('slave');
$emMaster = $this->mr->getManager('master');
$session = $request->getSession();
$company = $emMaster->getRepository('App\Entity\Master\Company')->findOneById($session->get('companyId'));
$arraySuppliers = [];
$masterSuppliersIds = [];
foreach($company->getSuppliers() as $jtcs){
array_push($masterSuppliersIds, $jtcs->getSupplier()->getId());
}
foreach($masterSuppliersIds as $sId){
$supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(['idSupplier' => $sId]);
switch($supplier->getSlug()){
case 'bcc-pos': $arraySuppliers['BCC Pos'] = 'bcc-pos'; break;
case 'fabrick': $arraySuppliers['Fabrick'] = 'fabrick'; break;
case 'nexi-book-meps':
case 'nexi-book-monetica':
$arraySuppliers['Nexi (Book MEPS o Book Monetica)'] = 'nexi';
break;
case 'nexi-book-sia': $arraySuppliers['NEXI Book SIA'] = 'nexi-book-sia'; break;
case 'worldline-italia': $arraySuppliers['Worldline Italia'] = 'worldline-italia'; break;
case 'csc---axerve':
case 'csc---cglobal':
case 'csc---cronos':
case 'csc---cse':
case 'csc---decathlon':
case 'csc---euronet':
case 'csc---lis-pay':
case 'csc---mooney':
case 'csc---nexi-book-meps':
case 'csc---nexi-book-monetica':
case 'csc---nexi-book-sia':
case 'csc---numera':
case 'csc---p4cards':
case 'csc---q8':
case 'csc---repas':
case 'csc---worldline-italia':
case 'csc---yamamay':
$arraySuppliers['CSC'] = 'csc';
break;
case 'sate---worldline':
case 'sate---numera':
case 'sate---mooney':
case 'sate---flagpay':
case 'sate---argentea':
$arraySuppliers['SATE'] = 'sate';
break;
default: break;
}
}
// NUOVI TICKET
$operationId = null;
$importTicketNew = new ImportTicketNew();
$formTicket = $formFactory->createNamed("form_import_ticket_new", ImportTicketNewType::class, $importTicketNew, array('suppliers' => $arraySuppliers));
$formTicket->handleRequest($request);
if($formTicket->isSubmitted()){
$valid = true;
if($valid) $valid = ValidationService::validateNotBlank($validator, $formTicket->get('supplier'));
if($valid && $formTicket->get('supplier')->getData() == 'nexi-book-sia'){
$valid = ValidationService::validateNotBlank($validator, $formTicket->get('operation'));
$operationId = $formTicket->get('operation')->getData();
}
if($valid) $valid = ValidationService::validateNotBlank($validator, $formTicket->get('separator'));
if($valid) $valid = ValidationService::validateFile($validator, $formTicket->get('file'), true, $formTicket->get('file')->getData(), '10', array('csv', 'txt', 'bin'));
if($valid && $formTicket->isValid()){
$error = false;
$row = 0;
$countInserted = 0;
switch($formTicket->get('supplier')->getData()){
case 'bcc-pos':
case 'fabrick':
case 'lis-holding':
case 'nexi':
case 'nexi-book-sia':
case 'sate':
case 'worldline-italia':
[$error, $row, $countInserted] = TicketService::importFile($em, $emMaster, $formTicket, $company, $operationId, $row);
break;
case 'csc': // CSC
[$error, $row, $countInserted] = TicketService::importFileCSC($em, $emMaster, $formTicket, $error, $row, $countInserted);
break;
default: break;
}
if($error)
$this->addFlash('notice_warning', 'Un totale di '.$countInserted.' su '.($row - 1).' ticket è stato scaricato dal file CSV, alcuni presentano degli errori!');
else
$this->addFlash('notice_success', 'Un totale di '.$countInserted.' su '.($row - 1).' ticket è stato scaricato dal file CSV senza errori!');
return $this->redirectToRoute('user_ticket_list');
}
}
// INTERVENTI
$importTicketIntervention = new ImportTicketIntervention();
$formIntervention = $formFactory->createNamed("form_import_ticket_intervention", ImportTicketInterventionType::class, $importTicketIntervention);
$formIntervention->handleRequest($request);
if($formIntervention->isSubmitted()){
$valid = true;
if($valid) $valid = ValidationService::validateNotBlank($validator, $formIntervention->get('separator'));
if($valid) $valid = ValidationService::validateFile($validator, $formIntervention->get('file'), true, $formIntervention->get('file')->getData(), '10', array('csv', 'txt'));
$row = 0;
if(($handle = fopen($formIntervention->get('file')->getData(), "r")) !== FALSE) {
while(($data = fgetcsv($handle, 2000, $formIntervention->get('separator')->getData())) !== FALSE) {
// Salta righe vuote
if(empty(array_filter($data))) {$row++; continue; }
$data = array_map("utf8_encode", $data);
if($row > 0){
$ticket = null;
$nTicket = null;
$termid = null;
switch($formIntervention->get('supplier')->getData()){
case 'fabrick-flex':
$ticket = $em->getRepository('App\Entity\Slave\Ticket')->findOneByLikeNumberAndTermid($data[1], $data[2]);
if($ticket == null){
$valid = false;
$formIntervention->get("path")->addError(new FormError("Ticket non trovato"));
$this->addFlash('notice_danger', 'Il ticket presente alla riga '.($row + 1).' con n° '.$data[1].' e termid '.$data[2].' non è stato trovato! Ricontrolla il file!');
break;
}
if($valid){
$prodPos = $this->importInterventionSearchProduct($em, $data[9], $ticket->getSupplier());
if($prodPos == null){
$valid = false;
$formIntervention->get("path")->addError(new FormError("Matricola non presente"));
$this->addFlash('notice_danger', 'Non è stato trovato il prodotto presente alla riga '.($row + 1).' con matricola '.$data[9].' ! Ricontrolla il file!');
break;
}
}
if($valid){
$prodSim = $this->importInterventionSearchProduct($em, $data[10], $ticket->getSupplier());
if($prodSim == null){
$valid = false;
$formIntervention->get("path")->addError(new FormError("Matricola non presente"));
$this->addFlash('notice_danger', 'Non è stato trovato il prodotto presente alla riga '.($row + 1).' con matricola '.$data[10].'! Ricontrolla il file!');
break;
}
}
break;
default: break;
}
}
$row++;
}
fclose($handle);
}
if($valid && $formIntervention->isValid()){
$actualNumber = 0;
$actualTermid = 0;
$ignored = false;
$continueIntervention = false;
$row = 0;
$ticketStatusClosed = $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'closed'));
$countClosed = 0;
$countIgnored = 0;
if(($handle = fopen($formIntervention->get('file')->getData(), "r")) !== FALSE) {
while(($data = fgetcsv($handle, 2000, $formIntervention->get('separator')->getData())) !== FALSE) {
$data = array_map("utf8_encode", $data);
if($row > 0){
switch($formIntervention->get('supplier')->getData()){
case 'fabrick-flex': // FABRICK FLEX
$ticket = $em->getRepository('App\Entity\Slave\Ticket')->findOneByLikeNumberAndTermid($data[1], $data[2]);
if($ticket != null && ($ticket->getStatus()->getSlug() == "closed" || $ticket->getStatus()->getSlug() != "closed_portal"))
$countIgnored++;
if($ticket != null && $ticket->getStatus()->getSlug() != "to_assign" && $ticket->getStatus()->getSlug() != "closed" && $ticket->getStatus()->getSlug() != "closed_portal" && $ticket->getStatus()->getSlug() != "wrong" && $ticket->getStatus()->getSlug() != "canceled"){
$warehouse = $ticket->getTechnician()->mainWarehouse();
// Inserisco intervento
$datetime = date_create_from_format('m/d/Y', $data[12]);
$intervention = $this->importInterventionCreate($em, $ticket, $warehouse, $datetime);
// Cerco o creo i prodotti del ticket
$pPos = $this->importInterventionSearchProduct($em, $data[9], $ticket->getSupplier());
$pSim = $this->importInterventionSearchProduct($em, $data[10], $ticket->getSupplier());
// Inserisco le attività
$activityTypePos = $em->getRepository('App\Entity\Slave\InterventionActivityType')->findOneBy(array('slug' => 'installato-pos-fabrick-flex'));
$activityTypeSim = $em->getRepository('App\Entity\Slave\InterventionActivityType')->findOneBy(array('slug' => 'installato-accessorio-fabrick-flex'));
$this->importInterventionActivity($em, $ticket, $intervention, $activityTypePos, false, null, $pPos, $warehouse, $datetime);
$this->importInterventionActivity($em, $ticket, $intervention, $activityTypeSim, false, null, $pSim, $warehouse, $datetime);
$ticket->setStatus($ticketStatusClosed);
$ticket->setWaybill($data[11]);
$ticket->setDatetimeEnd(new \Datetime());
$em->flush();
$countClosed++;
}
break;
default: break;
}
}
$row++;
}
fclose($handle);
}
$em->flush();
$this->addFlash('notice_success', 'Sono stati inseriti '.$countClosed.' interventi e sono stati ignorati '.$countIgnored.' interventi perché già chiusi!');
return $this->redirectToRoute('user_ticket_list');
}
}
// CHIUSURE PORTALE
$statusClosedPortal = $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'closed_portal'));
$ticketClosures = new ImportTicketClosures();
$formClosures = $formFactory->createNamed("form_import_ticket_closures", ImportTicketClosuresType::class, $ticketClosures);
$formClosures->handleRequest($request);
if($formClosures->isSubmitted()){
$valid = true;
if($valid) $valid = ValidationService::validateNotBlank($validator, $formClosures->get('separator'));
if($valid) $valid = ValidationService::validateFile($validator, $formClosures->get('file'), true, $formClosures->get('file')->getData(), '10', array('csv', 'txt'));
if($valid) $valid = $this->importCheckFile($em, $validator, $formClosures);
if($valid && $formClosures->isValid()){
$row = 0;
$counterNotUpdated = 0;
$counterClosed = 0;
$counterAlreadyClosed = 0;
if(($handle = fopen($formClosures->get('file')->getData(), "r")) !== FALSE) {
while(($data = fgetcsv($handle, 2000, $formClosures->get('separator')->getData())) !== FALSE) {
$data = array_map("utf8_encode", $data);
if($row > 0){
$ticket = $em->getRepository('App\Entity\Slave\Ticket')->findOneByNumberAndTermid($data[0], $data[1]);
if($ticket != null){
$ticket->setClosedOnPortal(true);
switch($ticket->getStatus()->getSlug()){
case 'closed': $ticket->setStatus($statusClosedPortal); $counterClosed++; break;
case 'closed_portal': $counterAlreadyClosed++; break;
default: $counterNotUpdated++; break;
}
}
}
$row++;
}
fclose($handle);
}
$em->flush();
$this->addFlash('notice_success', 'Ticket chiusi: '.$counterClosed.'<br>Ticket già chiusi: '.$counterAlreadyClosed.'<br>Ticket stato non aggiornato: '.$counterNotUpdated);
return $this->redirectToRoute('user_ticket_list');
}
}
// ANNULLA TICKET
$statusCanceled = $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'canceled'));
$ticketCancels = new ImportTicketCancels();
$formCancels = $formFactory->createNamed("form_import_ticket_cancels", ImportTicketCancelsType::class, $ticketCancels);
$formCancels->handleRequest($request);
if($formCancels->isSubmitted()){
$valid = true;
if($valid) $valid = ValidationService::validateNotBlank($validator, $formCancels->get('separator'));
if($valid) $valid = ValidationService::validateFile($validator, $formCancels->get('file'), true, $formCancels->get('file')->getData(), '10', array('csv', 'txt'));
if($valid) $valid = $this->importCheckFile($em, $validator, $formCancels);
if($valid && $formCancels->isValid()){
$row = 0;
if(($handle = fopen($formCancels->get('file')->getData(), "r")) !== FALSE) {
while(($data = fgetcsv($handle, 2000, $formCancels->get('separator')->getData())) !== FALSE) {
$data = array_map("utf8_encode", $data);
if($row > 0){
$ticket = $em->getRepository('App\Entity\Slave\Ticket')->findOneByNumberAndTermid($data[0], $data[1]);
if($ticket != null){
$ticket->setStatus($statusCanceled);
}
}
$row++;
}
fclose($handle);
}
$em->flush();
$this->addFlash('notice_success', 'Ticket annullati!');
return $this->redirectToRoute('user_ticket_list');
}
}
// SOSPENDI TICKET
$statusSuspended = $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'suspended'));
$interventionOutcomeTypeSuspended = $em->getRepository('App\Entity\Slave\InterventionOutcomeType')->findOneBy(array('slug' => 'suspended'));
$interventionOutcomeSuspendedMassiva = $em->getRepository('App\Entity\Slave\InterventionOutcome')->findOneBy(array('slug' => 'suspended-massiva'));
$ticketsSuspend = new ImportTicketsSuspend();
$formSuspend = $formFactory->createNamed("form_import_tickets_suspend", ImportTicketsSuspendType::class, $ticketsSuspend);
$formSuspend->handleRequest($request);
if($formSuspend->isSubmitted()){
$valid = true;
if($valid) $valid = ValidationService::validateNotBlank($validator, $formSuspend->get('causal'));
if($valid) $valid = $this->importCheckFile($em, $validator, $formSuspend);
if($valid && $formSuspend->isValid()){
$row = 0;
if(($handle = fopen($formSuspend->get('file')->getData(), "r")) !== FALSE) {
while(($data = fgetcsv($handle, 2000, $formSuspend->get('separator')->getData())) !== FALSE) {
$data = array_map("utf8_encode", $data);
if($row > 0){
$ticket = $em->getRepository('App\Entity\Slave\Ticket')->findOneByNumberAndTermid($data[0], $data[1]);
if($ticket != null){
$today = new \Datetime();
$intervention = new Intervention();
$intervention->setTicket($ticket);
$intervention->setOutcomeType($interventionOutcomeTypeSuspended);
$intervention->setOutcome($interventionOutcomeSuspendedMassiva);
$intervention->setDatetime(new \Datetime());
$intervention->setDatetimeBilling(date_create_from_format('d-m-Y H:i:s', '01-'.$today->format('m').'-'.$today->format('Y').' 00:00:00'));
$intervention->setBillable(false);
$em->persist($intervention);
$ticketSuspension = new TicketSuspension();
$ticketSuspension->setTicket($ticket);
$ticketSuspension->setIntervention($intervention);
$ticketSuspension->setDatetimeFrom(new \Datetime());
$ticketSuspension->setApproved(true);
$ticketSuspension->setManaged(true);
$ticketSuspension->setUnlockCausal($formSuspend->get('causal')->getData());
$ticketSuspension->setRefuseMotivation(null);
$em->persist($ticketSuspension);
$settingUnlockSameTech = $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_suspension_unlock_same_technician'));
if($settingUnlockSameTech->getValue() != 1)
$ticket->setTechnician(null);
$ticket->setStatus($statusSuspended);
$em->flush();
}
}
$row++;
}
fclose($handle);
}
$em->flush();
$this->addFlash('notice_success', 'Ticket sospesi!');
return $this->redirectToRoute('user_ticket_list');
}
}
// SBLOCCA SOSPENSIONE TICKET
$ticketsSusUnlock = new ImportTicketsSusUnlock();
$formSusUnlock = $formFactory->createNamed("form_import_tickets_sus_unlock", ImportTicketsSusUnlockType::class, $ticketsSusUnlock);
$formSusUnlock->handleRequest($request);
if($formSusUnlock->isSubmitted()){
$valid = true;
if($valid) $valid = ValidationService::validateNotBlank($validator, $formSusUnlock->get('unlockCausal'));
if($valid) $valid = ValidationService::validateNotBlank($validator, $formSusUnlock->get('date'));
if($valid) $valid = ValidationService::validateNotBlank($validator, $formSusUnlock->get('hour'));
if($valid) $valid = ValidationService::validateNotBlank($validator, $formSusUnlock->get('minute'));
if($valid) $valid = $this->importCheckFile($em, $validator, $formSusUnlock);
if($valid && $formSusUnlock->isValid()){
$row = 0;
if(($handle = fopen($formSusUnlock->get('file')->getData(), "r")) !== FALSE) {
while(($data = fgetcsv($handle, 2000, $formSusUnlock->get('separator')->getData())) !== FALSE) {
$data = array_map("utf8_encode", $data);
if($row > 0){
$ticket = $em->getRepository('App\Entity\Slave\Ticket')->findOneByNumberAndTermid($data[0], $data[1]);
if($ticket != null){
$datetimeTo = date_create_from_format('d-m-Y H:i', $formSusUnlock->get('date')->getData()->format('d-m-Y').' '.$formSusUnlock->get('hour')->getData().':'.$formSusUnlock->get('minute')->getData());
$unlockCausal = $formSusUnlock->get('unlockCausal')->getData();
$ticketSuspension = $ticket->getActualSuspension();
$ticketSuspension->unlock($unlockCausal, $datetimeTo, $em);
}
}
$row++;
}
fclose($handle);
}
$em->flush();
$this->addFlash('notice_success', 'Sospensioni sbloccate!');
return $this->redirectToRoute('user_ticket_list');
}
}
return $this->render('role/user/ticket/import.html.twig', array(
'formTicket' => $formTicket->createView(),
'formIntervention' => $formIntervention->createView(),
'formClosures' => $formClosures->createView(),
'formCancels' => $formCancels->createView(),
'formSuspend' => $formSuspend->createView(),
'formSusUnlock' => $formSusUnlock->createView()
));
}
//
/**
* @Route("/", name="user_tickets")
* @Security("is_granted('view', 'ticket')")
*/
public function userTickets(Request $request)
{
return $this->render('role/user/ticket/index.html.twig');
}
/**
* @Route("/ricerca", name="user_ticket_search")
* @Security("is_granted('view', 'ticket')")
*/
public function userTicketSearch(Request $request, PaginatorInterface $paginator)
{
$em = $this->mr->getManager('slave');
$suppliers = $em->getRepository("App\Entity\Slave\Supplier")->findAllOrdered();
$operationGroups = $em->getRepository("App\Entity\Slave\OperationGroup")->findAllOrdered();
$ticketStatuses = $em->getRepository('App\Entity\Slave\TicketStatus')->findAll();
if($this->getUser()->getAccountTypology() == 'technician'){
$filters = FilterService::ticket3Filter($request);
$ticketsQuery = $em->getRepository("App\Entity\Slave\Ticket")->findByTechnicianFiltered(true, $filters, $this->getUser()->getId());
$tickets = $paginator->paginate($ticketsQuery, $request->getSession()->get($request->get("_route")."_page"), 100);
$ticketsCount = sizeof($em->getRepository("App\Entity\Slave\Ticket")->findByTechnicianFiltered(false, $filters, $this->getUser()->getId()));
}
else{
$filters = FilterService::ticket2Filter($request);
$ticketsQuery = $em->getRepository("App\Entity\Slave\Ticket")->findFiltered(true, $filters);
$tickets = $paginator->paginate($ticketsQuery, $request->getSession()->get($request->get("_route")."_page"), 100);
$ticketsCount = sizeof($em->getRepository("App\Entity\Slave\Ticket")->findFiltered(false, $filters));
}
return $this->render('role/user/ticket/search.html.twig', array(
'tickets' => $tickets,
'ticketsCount' => $ticketsCount,
'suppliers' => $suppliers,
'operations' => $operationGroups,
'filters' => $filters,
'ticketStatuses' => $ticketStatuses
));
}
/**
* @Route("/ricerca/esporta-csv", name="user_ticket_search_filter_export")
* @Security("is_granted('view', 'ticket')")
*/
public function userTicketSearchFilterExport(Request $request)
{
$em = $this->mr->getManager('slave');
$emMaster = $this->mr->getManager('master');
$session = $request->getSession();
$filters = $session->get('user_ticket_search_filters');
if($this->getUser()->getAccountTypology() == 'technician')
$tickets = $em->getRepository("App\Entity\Slave\Ticket")->findByTechnicianFiltered(false, $filters, $this->getUser()->getId());
else
$tickets = $em->getRepository("App\Entity\Slave\Ticket")->findFiltered(false, $filters);
$response = new StreamedResponse();
$response->setCallback(function() use($emMaster, $tickets) {
$handle = fopen('php://output', 'w+');
fputcsv($handle, array('Stato','Numero','Termid','Cliente','Operazione','Fornitore','Tariffa','Provincia','Tecnico','Data/Ora ricezione','Data/Ora chiusura','Data/Ora scadenza'), ";", '"', "\\");
foreach($tickets as $t){
$status = null;
$number = null;
$termid = null;
$client = null;
$operation = null;
$supplier = null;
$tariff = null;
$province = null;
$technician = null;
$datetimeStart = null;
$datetimeEnd = null;
$datetimeExpiration = null;
if($t->getStatus() != null) $status = $t->getStatus()->getValue();
if($t->getNumber() != null) $number = $t->getNumber();
if($t->getTermid() != null) $termid = $t->getTermid()->getCode();
if($t->getClient() != null) $client = $t->getClient()->__toString();
if($t->getOperation() != null) $operation = $t->getOperation()->__toString();
if($t->getOperationTariffAmount() != null) $tariff = $t->getOperationTariffAmount()->getValue();
if($t->getSupplier() != null) $supplier = $t->getSupplier()->__toString();
if($t->getIdProvince() != null) $province = $emMaster->getRepository("App\Entity\Master\Province")->findOneById($t->getIdProvince())->getSign();
if($t->getTechnician() != null) $technician = $t->getTechnician()->__toString();
if($t->getDatetimeStart() != null) $datetimeStart = $t->getDatetimeStart()->format('d-m-Y H:i');
if($t->getDatetimeEnd() != null) $datetimeEnd = $t->getDatetimeEnd()->format('d-m-Y H:i');
if($t->getDatetimeExpiration() != null) $datetimeExpiration = $t->getDatetimeExpiration()->format('d-m-Y H:i');
fputcsv($handle, array($status, $number, $termid, $client, $operation, $supplier, $tariff, $province, $technician, $datetimeStart, $datetimeEnd, $datetimeExpiration), ";", '"', "\\");
}
fclose($handle);
});
$response->setStatusCode(200);
$dispositionHeader = $response->headers->makeDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, 'Ticket filtrati.csv');
$response->headers->set('Content-Type', 'text/csv; charset=ISO-8859-15');
$response->headers->set('Content-Disposition', $dispositionHeader);
return $response;
}
/**
* @Route("/lista-tab", name="user_ticket_list_tab")
* @Security("is_granted('view', 'ticket')")
*/
public function userTicketListTab(Request $request)
{
$request->getSession()->set('user_ticket_list_tab', $request->request->get('ticketTabOpen'));
$request->getSession()->set('tab_operation_group', $request->request->get('ticketOperationGroup'));
$request->getSession()->set('tab_technician', $request->request->get('ticketTechnician'));
return $this->redirectToRoute('user_ticket_list');
}
/**
* @Route("/lista", name="user_ticket_list")
* @Security("is_granted('view', 'ticket')")
*/
public function userTicketList(Request $request, PaginatorInterface $paginator, ValidatorInterface $validator, FormFactoryInterface $formFactory)
{
$em = $this->mr->getManager('slave');
$emMaster = $this->mr->getManager('master');
$session = $request->getSession();
$cities = $emMaster->getRepository("App\Entity\Master\City")->findByName('');
$settingBackOffice = $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_backoffice_manage'));
$suppliers = $em->getRepository("App\Entity\Slave\Supplier")->findAllOrdered();
$operationGroups = $em->getRepository("App\Entity\Slave\OperationGroup")->findAllOrdered();
if($this->getUser()->getAccountTypology() == 'agency' || $this->getUser()->getAccountTypology() == 'warehouse'){
# Agenzia
$filters = FilterService::ticketFilter($request);
if($session->get('tab_operation_group') != null){
$filters['operation'] = $session->get('tab_operation_group');
}
if($session->get('tab_technician') != null){
$filters['technician'] = $session->get('tab_technician');
}
$errorTicketsQuery = $em->getRepository("App\Entity\Slave\Ticket")->findTicketsErrorFiltered(true, $filters);
$errorTickets = $paginator->paginate($errorTicketsQuery, $request->getSession()->get($request->get("_route")."_page"), 100);
$errorCount = sizeof($em->getRepository("App\Entity\Slave\Ticket")->findTicketsErrorFiltered(false, $filters));
$toAssignTicketsQuery = $em->getRepository("App\Entity\Slave\Ticket")->findTicketsByStatusFiltered(true, 'to_assign', $filters);
$toAssignTickets = $paginator->paginate($toAssignTicketsQuery, $request->getSession()->get($request->get("_route")."_page"), 100);
$toAssignCount = sizeof($em->getRepository("App\Entity\Slave\Ticket")->findTicketsByStatusFiltered(false, 'to_assign', $filters));
$assignedTicketsQuery = $em->getRepository("App\Entity\Slave\Ticket")->findTicketsByStatusFiltered(true, 'assigned', $filters);
$assignedTickets = $paginator->paginate($assignedTicketsQuery, $request->getSession()->get($request->get("_route")."_page"), 100);
$assignedCount = sizeof($em->getRepository("App\Entity\Slave\Ticket")->findTicketsByStatusFiltered(false, 'assigned', $filters));
$takenChargeTicketsQuery = $em->getRepository("App\Entity\Slave\Ticket")->findTicketsByStatusFiltered(true, 'taken_charge', $filters);
$takenChargeTickets = $paginator->paginate($takenChargeTicketsQuery, $request->getSession()->get($request->get("_route")."_page"), 100);
$takenChargeCount = sizeof($em->getRepository("App\Entity\Slave\Ticket")->findTicketsByStatusFiltered(false, 'taken_charge', $filters));
$suspensionRequestTicketsQuery = $em->getRepository("App\Entity\Slave\Ticket")->findTicketsByStatusFiltered(true, 'suspension_request', $filters);
$suspensionRequestTickets = $paginator->paginate($suspensionRequestTicketsQuery, $request->getSession()->get($request->get("_route")."_page"), 100);
$suspensionRequestCount = sizeof($em->getRepository("App\Entity\Slave\Ticket")->findTicketsByStatusFiltered(false, 'suspension_request', $filters));
$suspendedTicketsQuery = $em->getRepository("App\Entity\Slave\Ticket")->findTicketsByStatusFiltered(true, 'suspended', $filters);
$suspendedTickets = $paginator->paginate($suspendedTicketsQuery, $request->getSession()->get($request->get("_route")."_page"), 100);
$suspendedCount = sizeof($em->getRepository("App\Entity\Slave\Ticket")->findTicketsByStatusFiltered(false, 'suspended', $filters));
$closedTicketsQuery = $em->getRepository("App\Entity\Slave\Ticket")->findTicketsByStatusFiltered(true, 'closed', $filters);
$closedTickets = $paginator->paginate($closedTicketsQuery, $request->getSession()->get($request->get("_route")."_page"), 100);
$closedCount = sizeof($em->getRepository("App\Entity\Slave\Ticket")->findTicketsByStatusFiltered(false, 'closed', $filters));
$closedPortalTicketsQuery = $em->getRepository("App\Entity\Slave\Ticket")->findTicketsByStatusFiltered(true, 'closed_portal', $filters);
$closedPortalTickets = $paginator->paginate($closedPortalTicketsQuery, $request->getSession()->get($request->get("_route")."_page"), 100);
$closedPortalCount = sizeof($em->getRepository("App\Entity\Slave\Ticket")->findTicketsByStatusFiltered(false, 'closed_portal', $filters));
$canceledTicketsQuery = $em->getRepository("App\Entity\Slave\Ticket")->findTicketsByStatusFiltered(true, 'canceled', $filters);
$canceledTickets = $paginator->paginate($canceledTicketsQuery, $request->getSession()->get($request->get("_route")."_page"), 100);
$canceledCount = sizeof($em->getRepository("App\Entity\Slave\Ticket")->findTicketsByStatusFiltered(false, 'canceled', $filters));
$wrongTicketsQuery = $em->getRepository("App\Entity\Slave\Ticket")->findTicketsByStatusFiltered(true, 'wrong', $filters);
$wrongTickets = $paginator->paginate($wrongTicketsQuery, $request->getSession()->get($request->get("_route")."_page"), 100);
$wrongCount = sizeof($em->getRepository("App\Entity\Slave\Ticket")->findTicketsByStatusFiltered(false, 'wrong', $filters));
// Assegna ticket
$ticketsError = "Ticket assegnati! Ticket non spostati perché hanno un intervento in corso: ";
$error = false;
$first = true;
$assignTechnician = new AssignTechnician();
$formAssignTechnician = $formFactory->createNamed("form_assign_technician", AssignTechnicianType::class, $assignTechnician);
$formAssignTechnician->handleRequest($request);
if($formAssignTechnician->isSubmitted()){
$valid = ValidationService::validateNotBlank($validator, $formAssignTechnician->get("technician"));
if($valid && $formAssignTechnician->isValid()){
$statusAssigned = $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'assigned'));
$ids = $request->request->get('ids');
$ticketIds = explode(',', $ids);
foreach($ticketIds as $ticketId){
$ticket = $em->getRepository('App\Entity\Slave\Ticket')->findOneById($ticketId);
$interventionId = null;
foreach($ticket->getInterventions() as $int){
if($int->getOutcome() == null){
$interventionId = $int->getId();
break;
}
}
if($interventionId == null){
$ticket->setTechnician($formAssignTechnician->get("technician")->getData());
$ticket->setStatus($statusAssigned);
}
else{
$error = true;
if($first) $first = false; else $ticketsError .= ', ';
$ticketsError .= $ticket->getNumber();
}
}
$em->flush();
if(!$error)
$this->addFlash('notice_success', "Tecnico assegnato ai ticket!");
else
$this->addFlash('notice_success', $ticketsError);
return $this->redirectToRoute('user_ticket_list');
}
}
return $this->render('role/user/ticket/list.html.twig', array(
'cities' => $cities,
'settingBackOffice' => $settingBackOffice->getValue(),
'errorTickets' => $errorTickets,
'errorCount' => $errorCount,
'toAssignTickets' => $toAssignTickets,
'toAssignCount' => $toAssignCount,
'assignedTickets' => $assignedTickets,
'assignedCount' => $assignedCount,
'takenChargeTickets' => $takenChargeTickets,
'takenChargeCount' => $takenChargeCount,
'suspensionRequestTickets' => $suspensionRequestTickets,
'suspensionRequestCount' => $suspensionRequestCount,
'suspendedTickets' => $suspendedTickets,
'suspendedCount' => $suspendedCount,
'closedTickets' => $closedTickets,
'closedCount' => $closedCount,
'closedPortalTickets' => $closedPortalTickets,
'closedPortalCount' => $closedPortalCount,
'canceledTickets' => $canceledTickets,
'canceledCount' => $canceledCount,
'wrongTickets' => $wrongTickets,
'wrongCount' => $wrongCount,
'suppliers' => $suppliers,
'operations' => $operationGroups,
'filters' => $filters,
'formAssignTechnician' => $formAssignTechnician->createView()
));
}
if($this->getUser()->getAccountTypology() == 'technician'){
# Tecnico
$settingTechUnlockSuspension = $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_suspension_unlock_by_technician'));
$filters = FilterService::ticketTechnicianFilter($request);
if($session->get('tab_operation_group') != null){
$filters['all'] = $session->get('tab_operation_group');
}
if($session->get('numberOrTermid') != null){
$filters['all'] = $session->get('numberOrTermid');
$session->remove('numberOrTermid');
}
$assignedTicketsQuery = $em->getRepository("App\Entity\Slave\Ticket")->findTicketsByUserAndStatusFiltered(true, $this->getUser()->getId(), 'assigned', $filters);
$assignedTickets = $paginator->paginate($assignedTicketsQuery, $request->getSession()->get($request->get("_route")."_page"), 100);
$assignedCount = sizeof($em->getRepository("App\Entity\Slave\Ticket")->findTicketsByUserAndStatusFiltered(false, $this->getUser()->getId(), 'assigned', $filters));
$takenChargeTicketsQuery = $em->getRepository("App\Entity\Slave\Ticket")->findTicketsByUserAndStatusFiltered(true, $this->getUser()->getId(), 'taken_charge', $filters);
$takenChargeTickets = $paginator->paginate($takenChargeTicketsQuery, $request->getSession()->get($request->get("_route")."_page"), 100);
$takenChargeCount = sizeof($em->getRepository("App\Entity\Slave\Ticket")->findTicketsByUserAndStatusFiltered(false, $this->getUser()->getId(), 'taken_charge', $filters));
$suspensionRequestTicketsQuery = $em->getRepository("App\Entity\Slave\Ticket")->findTicketsByUserAndStatusFiltered(true, $this->getUser()->getId(), 'suspension_request', $filters);
$suspensionRequestTickets = $paginator->paginate($suspensionRequestTicketsQuery, $request->getSession()->get($request->get("_route")."_page"), 100);
$suspensionRequestCount = sizeof($em->getRepository("App\Entity\Slave\Ticket")->findTicketsByUserAndStatusFiltered(false, $this->getUser()->getId(), 'suspension_request', $filters));
$suspendedTicketsQuery = $em->getRepository("App\Entity\Slave\Ticket")->findTicketsByUserAndStatusFiltered(true, $this->getUser()->getId(), 'suspended', $filters);
$suspendedTickets = $paginator->paginate($suspendedTicketsQuery, $request->getSession()->get($request->get("_route")."_page"), 100);
$suspendedCount = sizeof($em->getRepository("App\Entity\Slave\Ticket")->findTicketsByUserAndStatusFiltered(false, $this->getUser()->getId(), 'suspended', $filters));
$closedTicketsQuery = $em->getRepository("App\Entity\Slave\Ticket")->findTicketsByUserAndStatusFiltered(true, $this->getUser()->getId(), 'closed', $filters);
$closedTickets = $paginator->paginate($closedTicketsQuery, $request->getSession()->get($request->get("_route")."_page"), 100);
$closedCount = sizeof($em->getRepository("App\Entity\Slave\Ticket")->findTicketsByUserAndStatusFiltered(false, $this->getUser()->getId(), 'closed', $filters));
$closedPortalTicketsQuery = $em->getRepository("App\Entity\Slave\Ticket")->findTicketsByUserAndStatusFiltered(true, $this->getUser()->getId(), 'closed_portal', $filters);
$closedPortalTickets = $paginator->paginate($closedPortalTicketsQuery, $request->getSession()->get($request->get("_route")."_page"), 100);
$closedPortalCount = sizeof($em->getRepository("App\Entity\Slave\Ticket")->findTicketsByUserAndStatusFiltered(false, $this->getUser()->getId(), 'closed_portal', $filters));
$canceledTicketsQuery = $em->getRepository("App\Entity\Slave\Ticket")->findTicketsByUserAndStatusFiltered(true, $this->getUser()->getId(), 'canceled', $filters);
$canceledTickets = $paginator->paginate($canceledTicketsQuery, $request->getSession()->get($request->get("_route")."_page"), 100);
$canceledCount = sizeof($em->getRepository("App\Entity\Slave\Ticket")->findTicketsByUserAndStatusFiltered(false, $this->getUser()->getId(), 'canceled', $filters));
return $this->render('role/user/ticket/list.html.twig', array(
'settingTechUnlockSuspension' => $settingTechUnlockSuspension,
'assignedTickets' => $assignedTickets,
'takenChargeTickets' => $takenChargeTickets,
'suspensionRequestTickets' => $suspensionRequestTickets,
'suspendedTickets' => $suspendedTickets,
'closedTickets' => $closedTickets,
'closedPortalTickets' => $closedPortalTickets,
'canceledTickets' => $canceledTickets,
'assignedCount' => $assignedCount,
'takenChargeCount' => $takenChargeCount,
'suspensionRequestCount' => $suspensionRequestCount,
'suspendedCount' => $suspendedCount,
'closedCount' => $closedCount,
'closedPortalCount' => $closedPortalCount,
'canceledCount' => $canceledCount,
'suppliers' => $suppliers,
'operations' => $operationGroups,
'filters' => $filters
));
}
}
// AZIONI LISTA
// MULTIPLE
/**
* @Route("/selezione-multipla-azione", name="user_ticket_multiple_select_action")
* @Security("is_granted('edit', 'ticket')")
*/
public function userTicketMultipleSelectAction(Request $request, MailerInterface $mailer)
{
$em = $this->mr->getManager('slave');
$session = $request->getSession();
$tab = $request->request->get('tab');
$action = $request->request->get('action');
$ids = $request->request->get('ids');
$causal = $request->request->get('causal');
$session->set('ticketsIds', $ids);
$session->set('ticketsAction', $action);
$valid = true;
if($action == 'suspend' || $action == 'suspend_end'){
if($causal == null || $causal == ''){
$valid = false;
$session->set('ticketsError', 'causal');
}
}
if($valid){
$tickets = array();
$ticketsIds = explode(',', $ids);
foreach($ticketsIds as $id){
$t = $em->getRepository("App\Entity\Slave\Ticket")->findOneById($id);
array_push($tickets, $t);
}
switch($action){
case 'wrong':
foreach($tickets as $ticket){
$ticket->setSystemError(false);
$ticket->setSystemErrorSlug(null);
$ticket->setSystemErrorDetails(null);
$ticket->setStatus($em->getRepository('App\Entity\Slave\TicketStatus')->findOneBySlug('wrong'));
}
$em->flush();
$this->addFlash('notice_success', 'Ticket spostati in errati!');
break;
case 'print':
return $this->redirectToRoute('user_ticket_reports_print');
break;
case 'suspend':
foreach($tickets as $ticket){
$today = new \Datetime();
$intervention = new Intervention();
$intervention->setTicket($ticket);
$intervention->setOutcomeType($em->getRepository('App\Entity\Slave\InterventionOutcomeType')->findOneBySlug('suspended'));
$intervention->setOutcome($em->getRepository('App\Entity\Slave\InterventionOutcome')->findOneBySlug('suspended-massiva'));
$intervention->setDatetime(new \Datetime());
$intervention->setDatetimeBilling(date_create_from_format('d-m-Y H:i:s', '01-'.$today->format('m').'-'.$today->format('Y').' 00:00:00'));
$intervention->setBillable(false);
$em->persist($intervention);
$ticketSuspension = new TicketSuspension();
$ticketSuspension->setTicket($ticket);
$ticketSuspension->setIntervention($intervention);
$ticketSuspension->setDatetimeFrom(new \Datetime());
$ticketSuspension->setApproved(true);
$ticketSuspension->setManaged(true);
$ticketSuspension->setUnlockCausal($causal);
$ticketSuspension->setRefuseMotivation(null);
$em->persist($ticketSuspension);
$settingUnlockSameTech = $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_suspension_unlock_same_technician'));
if($settingUnlockSameTech->getValue() != 1)
$ticket->setTechnician(null);
$ticket->setStatus($em->getRepository('App\Entity\Slave\TicketStatus')->findOneBySlug('suspended'));
}
$em->flush();
$this->addFlash('notice_success', 'Sospensioni inserite!');
break;
case 'suspend_end':
foreach($tickets as $ticket){
$ticketSuspension = $ticket->getActualSuspension();
$ticketSuspension->unlock($causal, new \Datetime(), $em);
}
$em->flush();
$this->addFlash('notice_success', 'Sospensioni sbloccate!');
break;
case 'approve':
foreach($tickets as $ticket){
$ticketSuspension = $ticket->getActualSuspension();
$ticketSuspension->setApproved(true);
$ticketSuspension->setManaged(true);
$settingUnlockSameTech = $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_suspension_unlock_same_technician'));
if($settingUnlockSameTech->getValue() != 1)
$ticket->setTechnician(null);
$ticket->setStatus($em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'suspended')));
}
// TODO inviare una email con l'elenco delle sospensioni approvate per ogni tecnico
$em->flush();
$this->addFlash('notice_success', 'Sospensioni approvate!');
break;
case 'closed_portal':
foreach($tickets as $ticket){
$ticket->setStatus($em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'closed_portal')));
$ticket->setClosedOnPortal(1);
}
$em->flush();
$this->addFlash('notice_success', 'Ticket chiusi su portal fornitore!');
break;
case 'cancel':
foreach($tickets as $ticket){
$ticket->setStatus($em->getRepository('App\Entity\Slave\TicketStatus')->findOneBySlug('canceled'));
}
// TODO inviare una email con l'elenco dei ticket annullati per ogni tecnico
$em->flush();
$this->addFlash('notice_success', 'Ticket annullati!');
break;
case 'delete':
$countDeleted = 0;
$countIgnored = 0;
foreach($tickets as $ticket){
if($ticket->canDelete('all')){
$this->deleteTicketAndConnectedValues($em, $ticket);
$countDeleted++;
}
else
$countIgnored++;
}
$em->flush();
$this->addFlash('notice_success', 'Rimossi '.$countDeleted.' ticket e ignorati '.$countIgnored.' ticket non eliminabili!');
break;
case 'urge':
$now = new \Datetime();
$settingSunday = $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'script_sunday_active'));
$techniciansIds = array();
$users = array();
foreach($tickets as $ticket){
if(!in_array($ticket->getTechnician()->getId(), $techniciansIds))
array_push($techniciansIds, $ticket->getTechnician()->getId());
}
if($settingSunday->getValue() == 1 || ($settingSunday->getValue() == 0 && $today->format('N') != 7)){
foreach($techniciansIds as $tId){
$tmp = array();
$tmp2 = array();
$technician = $em->getRepository('App\Entity\Slave\User')->findOneById($tId);
if(!$technician->isInHolidayAtDate($now)){
foreach($tickets as $ticket){
if($ticket->getTechnician()->getId() == $technician->getId())
array_push($tmp2, $ticket);
}
}
array_push($tmp, $technician, $tmp2);
array_push($users, $tmp);
}
foreach($users as $u){
$message = (new TemplatedEmail())
->subject($this->params->get('subject_ticket_urge'))
->from($this->params->get('email_noreply'))
->to($u[0]->getEmail())
->htmlTemplate('email/technician_urge_tickets.html.twig')
->context(['user' => $u[0], 'tickets' => $u[1]]);
$mailer->send($message);
}
$this->addFlash('notice_success', 'Email di notifica urgenza inviate!');
}
else{
$this->addFlash('notice_warning', 'Notifiche disabilitate la Domenica! Attivale dalle impostazioni');
}
break;
default: break;
}
}
return $this->redirectToRoute('user_ticket_list');
}
/**
* @Route("/verbali-stampa", name="user_ticket_reports_print")
* @Security("is_granted('view', 'ticket')")
*/
public function userTicketReportsPrint(Request $request)
{
$em = $this->mr->getManager('slave');
$session = $request->getSession();
$matrixTickets = array();
$ticketsIds = explode(',', $session->get('ticketsIds'));
foreach($ticketsIds as $id){
$t = $em->getRepository("App\Entity\Slave\Ticket")->findOneById($id);
$jsonReportValues = array();
$tmp = array();
if($t->getJsonReport() != '[]'){
$matrix = json_decode($t->getJsonReport(), true);
foreach($matrix as $array)
foreach($array as $a){
$tcv = $em->getRepository('App\Entity\Slave\TicketColumnValue')->findOneBySupplierTicketColumnAndNeedle($t->getSupplier()->getId(), array_keys($array)[0], $a);
$htmlToAdd = '';
if($tcv != null)
$htmlToAdd = ' ('.$tcv->getValue().')';
$jsonReportValues[array_keys($array)[0]] = $a.$htmlToAdd;
}
}
array_push($tmp, $t, $jsonReportValues);
array_push($matrixTickets, $tmp);
}
return $this->render('role/user/print/report.html.twig', array(
'matrixTickets' => $matrixTickets,
'backRoute' => 'sheet',
'continueRoute' => 'sheet'
));
}
//
// SINGOLE
/**
* @Route("/invia-email-prendi-in-carico", name="user_ticket_send_email_take_charge")
* @Security("is_granted('edit', 'ticket')")
*/
public function userTicketSendEmailTakeCharge(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'));
$now = new \Datetime();
$users = array();
$technicians = $em->getRepository("App\Entity\Slave\User")->findTechniciansActive();
$settingSunday = $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'script_sunday_active'));
if($settingSunday->getValue() == 1 || ($settingSunday->getValue() == 0 && $today->format('N') != 7)){
foreach($technicians as $t){
$onHoliday = false;
foreach($t->getHolidays() as $h){
if($now->format('Ymd') >= $h->getDateFrom()->format('Ymd') && $now->format('Ymd') <= $h->getDateTo()->format('Ymd')){
$onHoliday = true;
break;
}
}
if(!$onHoliday){
$tickets = $em->getRepository('App\Entity\Slave\Ticket')->findByUserAndStatus($t->getId(), 'assigned');
if(sizeof($tickets) > 0)
array_push($users, array($t, $tickets));
}
}
foreach($users as $u){
$message = (new TemplatedEmail())
->subject($this->params->get('subject_ticket_take_charge'))
->from($this->params->get('email_noreply'))
->to($u[0]->getEmail())
->htmlTemplate('email/technician_tickets.html.twig')
->context(['user' => $u[0], 'tickets' => $u[1]]);
$mailer->send($message);
}
$message = (new TemplatedEmail())
->subject($this->params->get('subject_event_clicked'))
->from($this->params->get('email_noreply'))
->to($this->params->get('email_domini'))
->htmlTemplate('email/event_clicked.html.twig')
->context(['user' => $this->getUser(), 'company' => $company, 'event' => 'Invia email prendi in carico']);
$mailer->send($message);
$this->addFlash('notice_success', 'Notifiche email inviate!');
}
else{
$this->addFlash('notice_warning', 'Notifiche disabilitate la Domenica! Attivale dalle impostazioni');
}
return $this->redirect($request->server->get('HTTP_REFERER'));
}
/**
* @Route("/prendi-in-carico", name="user_ticket_take_charge")
* @Security("is_granted('edit', 'ticket')")
*/
public function userTicketTakeCharge(Request $request)
{
$em = $this->mr->getManager('slave');
$session = $request->getSession();
$tickets = $em->getRepository('App\Entity\Slave\Ticket')->findByUserAndStatus($this->getUser()->getId(), 'assigned');
$statusTakenCharge = $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBySlug('taken_charge');
foreach($tickets as $ticket){
$ticket->setStatus($statusTakenCharge);
}
$em->flush();
$this->addFlash('notice_success', 'Stato aggiornato!');
return $this->redirect($request->server->get('HTTP_REFERER'));
}
//
//
// AGGIUNGI MANUALMENTE
/**
* @Route("/nuovo", name="user_ticket_new")
* @Security("is_granted('view', 'ticket')")
*/
public function userTicketNew(Request $request, ValidatorInterface $validator, FormFactoryInterface $formFactory)
{
$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('');
$today = new \DateTime();
$ticket = new Ticket();
$form = $formFactory->createNamed("form_ticket_new", TicketType::class, $ticket);
$form->handleRequest($request);
if($form->isSubmitted()){
$valid = true;
if($form->get('termid')->getData() == null && $form->get("termidCode")->getData() == null){
$valid = false;
$form->get("termidCode")->addError(new FormError("Campo obbligatorio"));
}
if($valid){
$termidCode = $form->get("termidCode")->getData();
if($form->get('termid')->getData() != null)
$termidCode = $em->getRepository('App\Entity\Slave\Termid')->findOneById($form->get('termid')->getData())->getCode();
$alreadyExist = $em->getRepository('App\Entity\Slave\Ticket')->findOneByNumberAndTermid($ticket->getNumber(), $termidCode);
if($alreadyExist){
$valid = false;
$form->get("number")->addError(new FormError("Esiste già un ticket con questo numero e con questo termid!"));
$form->get("termidCode")->addError(new FormError("Esiste già un ticket con questo numero e con questo termid!"));
}
}
if($valid) $valid = ValidationService::validateNotBlank($validator, $form->get("datetimeStart_date"));
if($valid) $valid = ValidationService::validateNotBlank($validator, $form->get("datetimeStart_date"));
if($valid) $valid = ValidationService::validateNotBlank($validator, $form->get("datetimeStart_hour"));
if($valid) $valid = ValidationService::validateNotBlank($validator, $form->get("datetimeStart_minute"));
if($valid) $valid = ValidationService::validateNotBlank($validator, $form->get("datetimeExpiration_date"));
if($valid) $valid = ValidationService::validateNotBlank($validator, $form->get("datetimeExpiration_hour"));
if($valid) $valid = ValidationService::validateNotBlank($validator, $form->get("datetimeExpiration_minute"));
if($valid) $valid = ValidationService::validateNotBlank($validator, $form->get("anomaly"));
if($form->get('cityId')->getData() == null && $form->get("otherCity")->getData() == null){
$valid = false;
$form->get("cityName")->addError(new FormError("Campo obbligatorio"));
}
if($valid && $form->get('client')->getData() == null){
if($valid) $valid = ValidationService::validateNotBlank($validator, $form->get("clientCode"));
if($valid) $valid = ValidationService::validateNotBlank($validator, $form->get("clientName"));
if($valid) $valid = ValidationService::validateNotBlank($validator, $form->get("clientNickname"));
if($valid) $valid = ValidationService::validateNotBlank($validator, $form->get("clientAddress"));
if($form->get('client_cityId')->getData() == null){
$valid = false;
$form->get("client_cityName")->addError(new FormError("Campo obbligatorio"));
}
if($valid) $valid = ValidationService::validateNotBlank($validator, $form->get("client_zip"));
}
$valid = true;
$zip = $emMaster->getRepository('App\Entity\Master\Zip')->findOneById($form->get('zip')->getData());
if($zip == null){
$zip = $emMaster->getRepository('App\Entity\Master\Zip')->findOneByCode($request->request->get('other_zip'));
if($zip == null){
$form->get('zip')->addError(new FormError('CAP inesistente! Controlla il valore inserito!'));
$valid = false;
}
}
if($valid && $form->isValid()){
$jsonReport = '[{"ABI":'.json_encode($form->get('abi')->getData()).'},{"Anomalia":'.json_encode($form->get('anomaly')->getData()).'}]';
$datetimeStart = date_create_from_format('d-m-Y H:i', $form->get('datetimeStart_date')->getData()->format('d-m-Y').' '.$form->get('datetimeStart_hour')->getData().':'.$form->get('datetimeStart_minute')->getData());
$datetimeExpiration = date_create_from_format('d-m-Y H:i', $form->get('datetimeExpiration_date')->getData()->format('d-m-Y').' '.$form->get('datetimeExpiration_hour')->getData().':'.$form->get('datetimeExpiration_minute')->getData());
if($form->get('cityId')->getData() != null)
$city = $emMaster->getRepository('App\Entity\Master\City')->findOneById($form->get('cityId')->getData());
$zip = $emMaster->getRepository('App\Entity\Master\Zip')->findOneById($form->get('zip')->getData());
$ticket->setZip($zip->getCode());
if($city != null){
$ticket->setIdCity($city->getId());
$ticket->setIdProvince($city->getProvince()->getId());
$ticket->setOtherCity(null);
}
else{
$ticket->setOtherCity($form->get('otherCity')->getData());
$ticket->setIdProvince($zip->getCities()[0]->getProvince()->getId());
}
$ticket->setStatus($em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'to_assign')));
$ticket->setDirectoryPath($today->format("Y").'/'.$today->format("m").'/'.md5(uniqid()));
$ticket->setDatetimeImport(new \DateTime());
$ticket->setClosedOnPortal(false);
$ticket->setSystemError(false);
$ticket->setJson('[{}]');
$ticket->setJsonReport($jsonReport);
$ticket->setDatetimeStart($datetimeStart);
$ticket->setDatetimeExpiration($datetimeExpiration);
// Client
$client = $em->getRepository('App\Entity\Slave\Client')->findOneById($form->get('client')->getData());
if($client == null){
$client = new Client();
$client->setCode($form->get('clientCode')->getData());
$client->setName($form->get('clientName')->getData());
$client->setNickname($form->get('clientNickname')->getData());
$client->setReferent($form->get('clientReferent')->getData());
$client->setFiscalCode($form->get('clientFiscalCode')->getData());
$client->setVat($form->get('clientVat')->getData());
$client->setSdi($form->get('clientSdi')->getData());
$client->setClosures($form->get('clientClosures')->getData());
$client->setOpenings($form->get('clientOpenings')->getData());
$clientCity = $emMaster->getRepository('App\Entity\Master\City')->findOneById($form->get('client_cityId')->getData());
$clientZip = $emMaster->getRepository('App\Entity\Master\Zip')->findOneById($form->get('client_zip')->getData());
$client->setAddress($form->get('address')->getData());
$client->setLocality($form->get('locality')->getData());
$client->setIdCity($clientCity->getId());
$client->setZip($clientZip->getCode());
$client->setIdProvince($clientCity->getProvince()->getId());
$client->setNotes($form->get('clientNotes')->getData());
$client->setDirectoryPath(md5(uniqid()));
$em->persist($client);
$clientPhone = new ClientPhone();
$clientPhone->setClient($client);
$clientPhone->setName('Telefono 1');
$clientPhone->setNumber($form->get('clientPhone')->getData());
$em->persist($clientPhone);
$warehouse = new Warehouse();
$warehouse->setClient($client);
$warehouse->setMovable(false);
$warehouse->setNickname('Magazzino cliente - '.$client->getNickname());
$client->setWarehouse($warehouse);
$em->persist($warehouse);
$em->flush();
}
$ticket->setClient($client);
// Termid
$termid = $em->getRepository('App\Entity\Slave\Termid')->findOneById($form->get('termid')->getData());
if($termid == null){
$termid = new Termid();
$termid->setClient($client);
$termid->setCode($form->get('termidCode')->getData());
$em->persist($termid);
$em->flush();
}
$ticket->setTermid($termid);
$em->persist($ticket);
$em->flush();
$error = TicketService::ticketAssignOperationTariffAmount($em, $emMaster, $ticket);
$this->addFlash('notice_success', "Ticket inserito!");
return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
}
}
return $this->render('role/user/ticket/new.html.twig', array(
'company' => $company,
'cities' => $cities,
'form' => $form->createView()
));
}
//
/**
* @Route("/{ticketId}/scheda", name="user_ticket_sheet")
* @Security("is_granted('ticket_view', ticketId)")
*/
public function userTicketSheet($ticketId, Request $request, ValidatorInterface $validator, FormFactoryInterface $formFactory, FileSystem $fs, UserPasswordHasherInterface $passwordHasher, 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'));
$settingBackOffice = $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_backoffice_manage'));
$settingTechUnlockSuspension = $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_suspension_unlock_by_technician'));
$cities = $emMaster->getRepository("App\Entity\Master\City")->findByName('');
$ticket = $em->getRepository("App\Entity\Slave\Ticket")->findOneById($ticketId);
$displayJsonReport = '';
if($ticket->getJsonReport() != '[]'){
$matrix = json_decode($ticket->getJsonReport(), true);
foreach($matrix as $array)
foreach($array as $a){
$tcv = $em->getRepository('App\Entity\Slave\TicketColumnValue')->findOneBySupplierTicketColumnAndNeedle($ticket->getSupplier()->getId(), array_keys($array)[0], $a);
$htmlToAdd = '';
if($tcv != null)
$htmlToAdd = ' <i>('.$tcv->getValue().')</i>';
$displayJsonReport.= '<tr><th>'.array_keys($array)[0].'</th><td colspan="2">'.$a.$htmlToAdd.'</td></tr>';
}
}
// TICKET - MODIFICA INDIRIZZO
$formAddressEdit = $formFactory->createNamed("form_address", TicketAddressType::class, $ticket);
$formAddressEdit->handleRequest($request);
if($formAddressEdit->isSubmitted()){
$valid = true;
$zip = $emMaster->getRepository('App\Entity\Master\Zip')->findOneById($formAddressEdit->get('zip')->getData());
if($zip == null){
$zip = $emMaster->getRepository('App\Entity\Master\Zip')->findOneByCode($request->request->get('other_zip'));
if($zip == null){
$formAddressEdit->get('zip')->addError(new FormError('CAP inesistente! Controlla il valore inserito!'));
$valid = false;
}
}
if($valid && $formAddressEdit->isValid()){
if($formAddressEdit->get('cityId')->getData() != null)
$city = $emMaster->getRepository('App\Entity\Master\City')->findOneById($formAddressEdit->get('cityId')->getData());
$ticket->setZip($zip->getCode());
if($city != null){
$ticket->setIdCity($city->getId());
$ticket->setIdProvince($city->getProvince()->getId());
$ticket->setOtherCity(null);
}
else{
$ticket->setOtherCity($formAddressEdit->get('otherCity')->getData());
$ticket->setIdProvince($zip->getCities()[0]->getProvince()->getId());
}
// SE SCELTO AGGIORNA CLIENTE
if($formAddressEdit->get('updateClient')->getData()){
$ticket->getClient()->setAddress($formAddressEdit->get('address')->getData());
$ticket->getClient()->setZip($zip->getCode());
$ticket->getClient()->setLocality($formAddressEdit->get('locality')->getData());
if($city != null){
$ticket->getClient()->setIdCity($city->getId());
$ticket->getClient()->setIdProvince($city->getProvince()->getId());
}
else{
$ticket->getClient()->setOtherCity($formAddressEdit->get('otherCity')->getData());
$ticket->getClient()->setIdProvince($zip->getCities()[0]->getProvince()->getId());
}
}
$error = TicketService::ticketAssignOperationTariffAmount($em, $emMaster, $ticket);
if($error){
$this->addFlash('notice_warning', "Nessuna tariffa trovata per questo indirizzo!");
return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
}
$em->flush();
$this->addFlash('notice_success', "Indirizzo ticket aggiornato!");
return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
}
else{
$session->set('openModalAddressEdit', true);
}
}
// TICKET - CLIENTE - MODIFICA
$numOfPhones = 0;
if($ticket->getClient() != null)
$numOfPhones = sizeof($ticket->getClient()->getPhones());
$formClientEdit = $formFactory->createNamed("form_client_edit", ClientEditType::class, $ticket->getClient(), array('phoneNumber' => $numOfPhones));
$formClientEdit->handleRequest($request);
if($formClientEdit->isSubmitted()){
if($formClientEdit->isValid()){
foreach($ticket->getClient()->getPhones() as $phone){
if($phone->getName() == 'Telefono 1') $phone->setNumber($formClientEdit->get('phone1')->getData());
if(sizeof($ticket->getClient()->getPhones()) > 1 && $phone->getName() == 'Telefono 2') $phone->setNumber($formClientEdit->get('phone2')->getData());
if(sizeof($ticket->getClient()->getPhones()) > 2 && $phone->getName() == 'Telefono cellulare') $phone->setNumber($formClientEdit->get('phone3')->getData());
}
if(sizeof($ticket->getClient()->getPhones()) == 0){
$clientPhone = new ClientPhone();
$clientPhone->setClient($ticket->getClient());
$clientPhone->setName('Telefono 1');
$clientPhone->setNumber('');
$em->persist($clientPhone);
}
$em->flush();
$this->addFlash('notice_success', "Dati aggiornati");
return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
}
else{
$session->set('openEditModal', true);
$session->set('openEditModalId', $request->request->get('clientNotesEditId'));
}
}
// TICKET - SOSPENSIONE - SBLOCCA
$suspension = new TicketSuspension();
$formSusUnlock = $formFactory->createNamed("form_suspension_unlock", TicketSuspensionUnlockType::class, $suspension);
$formSusUnlock->handleRequest($request);
if($formSusUnlock->isSubmitted()){
$valid = ValidationService::validateNotBlank($validator, $formSusUnlock->get("unlockCausal"));
if($valid && $formSusUnlock->isValid()){
$suspension = $em->getRepository('App\Entity\Slave\TicketSuspension')->findOneById($formSusUnlock->get('id')->getData());
$unlockCausal = $formSusUnlock->get("unlockCausal")->getData();
$suspension->unlock($unlockCausal, new \DateTime(), $em);
$em->flush();
$this->addFlash('notice_success', "Sospensione sbloccata!");
return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
}
else{
$session->set('openModalSuspensionUnlock', true);
$session->set('openModalSuspensionUnlockId', $formSusUnlock->get('id')->getData());
}
}
// TICKET - EXTRA
if($this->getUser()->getAccountTypology() == 'agency' || $this->getUser()->getAccountTypology() == 'warehouse')
$choiceTypes = array('Ore' => 'hours', 'Spesa' => 'cost', 'Integrazione tariffa' => 'tariff_extra', 'Tariffa fuori copertura' => 'tariff_out');
else
$choiceTypes = array('Ore' => 'hours', 'Spesa' => 'cost', 'Integrazione tariffa' => 'tariff_extra');
$uploadDir = $this->params->get('kernel.project_dir').'/'.$this->params->get('web_path').'/companies/'.$company->getDirectoryPath().'/tickets/'.$ticket->getDirectoryPath().'/';
$interventionExtra = new InterventionExtra();
$formExtraNew = $formFactory->createNamed("form_intervention_extra_new", InterventionExtraType::class, $interventionExtra, array('ticketId' => $ticket->getId(), 'choice_types' => $choiceTypes));
$formExtraNew->handleRequest($request);
if($formExtraNew->isSubmitted()){
$valid = FormValidatorService::validateInterventionExtra($validator, $formExtraNew, false, $this->getUser());
if($valid && $formExtraNew->isValid()){
switch($formExtraNew->get('type')->getData()){
case 'cost':
if($formExtraNew->get('file')->getData()->guessExtension() == 'pdf')
MediaService::uploadDocument($formExtraNew->get('file')->getData(), $uploadDir, $interventionExtra, 'file');
else
MediaService::uploadImage($fs, $formExtraNew->get('file')->getData(), null, $uploadDir, $interventionExtra, 'file', 100, 1000, 200, true);
break;
case 'tariff_out':
$interventionExtra->setTariffOut(true);
default: break;
}
if($this->getUser()->getAccountTypology() == 'agency' || $this->getUser()->getAccountTypology() == 'warehouse'){
$interventionExtra->setManaged(true);
$interventionExtra->setApproved(true);
}
else{
$interventionExtra->setManaged(false);
$interventionExtra->setApproved(null);
}
$em->persist($interventionExtra);
$em->flush();
$this->addFlash('notice_success', "Nuovo extra inserito!");
return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
}
else{
$session->set('openModalExtraNew', true);
}
}
$formExtraEdit = $formFactory->createNamed("form_intervention_extra_edit", InterventionExtraType::class, $interventionExtra, array('ticketId' => $ticket->getId(), 'choice_types' => $choiceTypes));
$formExtraEdit->handleRequest($request);
if($formExtraEdit->isSubmitted()){
$valid = FormValidatorService::validateInterventionExtra($validator, $formExtraEdit, true, $this->getUser());
if($valid && $formExtraEdit->isValid()){
$interventionExtraEdit = $em->getRepository('App\Entity\Slave\InterventionExtra')->findOneById($request->request->get('extraEditId'));
$oldFilePath = $interventionExtraEdit->getFilePath();
$interventionExtraEdit->setIntervention($formExtraEdit->get('intervention')->getData());
$interventionExtraEdit->setType($formExtraEdit->get('type')->getData());
$interventionExtraEdit->setNotes($formExtraEdit->get('notes')->getData());
switch($formExtraEdit->get('type')->getData()){
case 'cost':
$interventionExtraEdit->setTariffOut(false);
$interventionExtraEdit->setCost($formExtraEdit->get('cost')->getData());
if($formExtraEdit->get('file')->getData() != null){
// METTO IL NUOVO
if($formExtraEdit->get('file')->getData()->guessExtension() == 'pdf')
MediaService::uploadDocument($formExtraEdit->get('file')->getData(), $uploadDir, $interventionExtra, 'file');
else
MediaService::uploadImage($fs, $formExtraEdit->get('file')->getData(), null, $uploadDir, $interventionExtraEdit, 'file', 100, 1000, 200, true);
// RIMUOVO IL VECCHIO FILE
if(str_contains($oldFilePath, '.pdf'))
MediaService::removeDocument($fs, $oldFilePath, $uploadDir);
else
MediaService::removeImage($fs, $oldFilePath, $uploadDir);
}
break;
case 'hours':
$interventionExtraEdit->setTariffOut(false);
$interventionExtraEdit->setCost($formExtraEdit->get('cost')->getData());
$interventionExtraEdit->setHours($formExtraEdit->get('hours')->getData());
break;
case 'tariff_extra':
$interventionExtraEdit->setHours(null);
$interventionExtraEdit->setCost($formExtraEdit->get('cost')->getData());
$interventionExtraEdit->setTariffOut(false);
break;
case 'tariff_out':
$interventionExtraEdit->setHours(null);
$interventionExtraEdit->setCost($formExtraEdit->get('cost')->getData());
$interventionExtraEdit->setTariffOut(true);
break;
default: break;
}
$em->flush();
$this->addFlash('notice_success', "Modifiche salvate!");
return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
}
else{
$session->set('openModalExtraEdit', true);
$session->set('openModalExtraEditId', $request->request->get('extraEditId'));
}
}
// TICKET - REMINDER
$ticketReminder = new TicketReminder();
$formReminderNew = $formFactory->createNamed("form_reminder_new", TicketReminderType::class, $ticketReminder);
$formReminderNew->handleRequest($request);
if($formReminderNew->isSubmitted()){
$valid = true;
if($valid) $valid = ValidationService::validateNotBlank($validator, $formReminderNew->get("date"));
if($valid) $valid = ValidationService::validateNotBlank($validator, $formReminderNew->get("hour"));
if($valid) $valid = ValidationService::validateNotBlank($validator, $formReminderNew->get("minute"));
if($valid && $formReminderNew->isValid()){
$datetime = date_create_from_format('d-m-Y H:i', $formReminderNew->get('date')->getData()->format('d-m-Y').' '.$formReminderNew->get('hour')->getData().':'.$formReminderNew->get('minute')->getData());
$ticketReminder->setDatetime($datetime);
$ticketReminder->setTicket($ticket);
$ticketReminder->setTechnician($this->getUser());
$em->persist($ticketReminder);
$em->flush();
$this->addFlash('notice_success', "Reminder ticket inserito!");
return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
}
else{
$session->set('openModalReminderNew', true);
}
}
$formReminderEdit = $formFactory->createNamed("form_reminder_edit", TicketReminderType::class, $ticketReminder);
$formReminderEdit->handleRequest($request);
if($formReminderEdit->isSubmitted()){
$valid = true;
if($valid) $valid = ValidationService::validateNotBlank($validator, $formReminderEdit->get("date"));
if($valid) $valid = ValidationService::validateNotBlank($validator, $formReminderEdit->get("hour"));
if($valid) $valid = ValidationService::validateNotBlank($validator, $formReminderEdit->get("minute"));
if($valid && $formReminderEdit->isValid()){
$reminder = $em->getRepository('App\Entity\Slave\TicketReminder')->findOneById($formReminderEdit->get('id')->getData());
$datetime = date_create_from_format('d-m-Y H:i', $formReminderEdit->get('date')->getData()->format('d-m-Y').' '.$formReminderEdit->get('hour')->getData().':'.$formReminderEdit->get('minute')->getData());
$reminder->setDatetime($datetime);
$reminder->setDetails($formReminderEdit->get('details')->getData());
$em->flush();
$this->addFlash('notice_success', "Modifiche salvate!");
return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
}
else{
$session->set('openModalReminderEdit', true);
$session->set('openModalReminderEditId', $formReminderEdit->get('id')->getData());
}
}
if($this->getUser()->getAccountTypology() == 'agency' || $this->getUser()->getAccountTypology() == 'warehouse'){
// AGENZIA
// TECNICI
$technicians = array();
if($ticket->getZip() != null){
$zip = $emMaster->getRepository('App\Entity\Master\Zip')->findOneBy(array('code' => $ticket->getClient()->getZip()));
$allTechs = $em->getRepository('App\Entity\Slave\User')->findTechniciansActive();
foreach($allTechs as $t){
$supplier = false;
$area = false;
$tmp = array();
$autoAssignSuppliersIds = array();
foreach($t->getAutoAssignSuppliers() as $supplier)
array_push($autoAssignSuppliersIds, $supplier->getId());
if(in_array($ticket->getOperation()->getSupplier()->getId(), $autoAssignSuppliersIds))
$supplier = true;
foreach($t->getTechnicianAreas() as $ta){
$zips = array();
foreach($ta->getZips() as $arrayZip){
array_push($zips, $arrayZip[1]);
if($ticket->getClient()->getIdProvince() == $ta->getIdProvince() && ($ta->isAllZip() || in_array($ticket->getClient()->getZip(), $zips)))
$area = true;
}
}
array_push($tmp, $t, $supplier, $area);
array_push($technicians, $tmp);
}
}
// TICKET - MODIFICA OPERAZIONE
$formOperationEdit = $formFactory->createNamed("form_operation", TicketOperationType::class, $ticket, array('supplierId' => $ticket->getSupplier()->getId()));
$formOperationEdit->handleRequest($request);
if($formOperationEdit->isSubmitted()){
$valid = ValidationService::validateNotBlank($validator, $formOperationEdit->get("operation"));
if($valid && $formOperationEdit->isValid()){
$error = TicketService::ticketAssignOperationTariffAmount($em, $emMaster, $ticket);
if($error){
$this->addFlash('notice_warning', "Nessuna tariffa trovata per questa operazione!");
return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
}
$em->flush();
$this->addFlash('notice_success', "Operazione aggiornata!");
return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
}
else{
$session->set('openModalOperationEdit', true);
}
}
// TICKET - MODIFICA TARIFFA ASSEGNATA
$operationTariffId = null;
if($ticket->getOperationTariffAmount() != null)
$operationTariffId = $ticket->getOperationTariffAmount()->getTariff()->getId();
else{
foreach($ticket->getOperation()->getTariffs() as $tar){
$zips = array();
foreach($tar->getZips() as $arrayZip)
array_push($zips, $arrayZip[1]);
if($tar->getIdProvince() == $ticket->getIdProvince() && ($tar->isAllZip() || in_array($ticket->getZip(), $zips))){
$operationTariffId = $tar->getId();
break;
}
}
}
$formOperationTariffAmount = $formFactory->createNamed("form_operation_tariff_amount", TicketOperationTariffAmountType::class, $ticket, array('operationTariffId' => $operationTariffId));
$formOperationTariffAmount->handleRequest($request);
if($formOperationTariffAmount->isSubmitted()){
$valid = ValidationService::validateNotBlank($validator, $formOperationTariffAmount->get('operationTariffAmount'));
if($valid && $formOperationTariffAmount->isValid()){
$amountTechnician = "0.00";
$ota = $em->getRepository('App\Entity\Slave\OperationTariffAmount')->findOneById($formOperationTariffAmount->get('operationTariffAmount')->getData());
$ticket->setOperationTariffAmount($ota);
foreach($ota->getTechnicianAreas() as $jttaota){
if($jttaota->getTechnicianArea()->getUser()->getId() == $ticket->getTechnician()->getId()){
$amountTechnician = $jttaota->getAmount();
break;
}
}
foreach($ticket->getInterventions() as $i){
$i->setAmount($ota->getAmount());
$i->setAmountTechnician($amountTechnician);
}
if($ticket->getUavOperationTariffAmount() == null){
$uavOt = null;
foreach($ticket->getSupplier()->getOperations() as $op){
if($op->isUav()){
$uavOt = $op;
break;
}
}
foreach($uavOt->getTariffs() as $uavTar){
$zips = array();
foreach($uavTar->getZips() as $arrayZip)
array_push($zips, $arrayZip[1]);
if($uavTar->getIdProvince() == $ticket->getIdProvince() && ($uavTar->isAllZip() || in_array($ticket->getZip(), $zips))){
$uavTariff = $uavTar;
break;
}
}
$ticket->setUavOperationTariffAmount($uavTariff->getStandardAmount());
}
$em->flush();
$this->addFlash('notice_success', "Tariffa aggiornata!");
return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
}
else{
$ticket = $em->getRepository("App\Entity\Slave\Ticket")->findOneById($ticketId);
$session->set('openModalTariff', true);
}
}
// TICKET - ERRORI - FORNITORE
$formErrorSupplier = $formFactory->createNamed("form_error_supplier", TicketErrorSupplierType::class, $ticket);
$formErrorSupplier->handleRequest($request);
if($formErrorSupplier->isSubmitted()){
$valid = ValidationService::validateNotBlank($validator, $formErrorSupplier->get("supplier"));
if($valid && $formErrorSupplier->isValid()){
$ticket->setOperation($formErrorSupplier->get("supplier")->getData()->getOperationMaintenance());
$em->flush();
$error = true;
if($ticket->getClient()) $error = TicketService::ticketMapClient($em, $ticket);
if(!$error) $error = TicketService::ticketMapColumns($em, $emMaster, $company, $ticket);
if(!$error) TicketService::ticketAutoAssign($em, $emMaster, $ticket);
if(!$error){
$ticket->setSystemError(false);
$ticket->setSystemErrorDetails(null);
}
$em->flush();
$this->addFlash('notice_success', "Ticket aggiornato!");
return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
}
}
// TICKET - ERRORI - OPERAZIONE
$supplierId = 0;
if($ticket->getSupplier() != null)
$supplierId = $ticket->getSupplier()->getId();
$formErrorOperation = $formFactory->createNamed("form_error_operation", TicketErrorOperationType::class, $ticket, array('supplierId' => $supplierId));
$formErrorOperation->handleRequest($request);
if($formErrorOperation->isSubmitted()){
$valid = ValidationService::validateNotBlank($validator, $formErrorOperation->get("operation"));
if($valid && $formErrorOperation->isValid()){
$em->flush();
if($ticket->getClient())
$error = TicketService::ticketMapClient($em, $ticket);
if(!$error) $error = TicketService::ticketMapColumns($em, $emMaster, $company, $ticket);
if(!$error) TicketService::ticketAutoAssign($em, $emMaster, $ticket);
if(!$error){
$ticket->setSystemError(false);
$ticket->setSystemErrorDetails(null);
}
$em->flush();
$this->addFlash('notice_success', "Ticket aggiornato!");
return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
}
}
// TICKET - ERRORI - CHIAVI COLONNE
$formErrorKeyMapping = $formFactory->createNamed("form_operation_keys_mapping", OperationKeysMappingType::class, $ticket->getOperation());
$formErrorKeyMapping->handleRequest($request);
if($formErrorKeyMapping->isSubmitted()){
$valid = true;
foreach($formErrorKeyMapping->get('keyMappings') as $keyMapping){
if($valid && $keyMapping->get('keyRequired')->getData()) $valid = ValidationService::validateNotBlank($validator, $keyMapping->get('mappingValue'));
}
if($valid && $formErrorKeyMapping->isValid()){
$em->flush();
$operationTickets = $em->getRepository('App\Entity\Slave\Ticket')->findByOperationAndSystemError($ticket->getOperation(), true);
foreach($operationTickets as $ot){
$error = TicketService::ticketMapColumns($em, $emMaster, $company, $ot);
if(!$error) $error = TicketService::ticketAssignOperationTariffAmount($em, $emMaster, $ot);
if(!$error) TicketService::ticketAutoAssign($em, $emMaster, $ot);
if(!$error){
$ot->setSystemError(false);
$ot->setSystemErrorDetails(null);
}
}
$em->flush();
$this->addFlash('notice_success', "Mappatura campi ticket aggiornata!");
return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
}
}
// TICKET - ERRORI - MODIFICA PROVINCIA
$formErrorProvince = $formFactory->createNamed("form_error_province", TicketErrorProvinceType::class, $ticket);
$formErrorProvince->handleRequest($request);
if($formErrorProvince->isSubmitted()){
$valid = ValidationService::validateNotBlank($validator, $formErrorProvince->get('idProvince'));
if($formErrorProvince->isValid() && $valid){
$ticket->setIdProvince($formErrorProvince->get('idProvince')->getData()->getId());
$error = TicketService::ticketAssignOperationTariffAmount($em, $emMaster, $ticket);
if(!$error) TicketService::ticketAutoAssign($em, $emMaster, $ticket);
if(!$error){
$ticket->setSystemError(false);
$ticket->setSystemErrorSlug(null);
}
$em->flush();
$this->addFlash('notice_success', "Provincia ticket aggiornata!");
return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
}
}
// TICKET - ERRORI - MODIFICA INDIRIZZO
$formErrorAddress = $formFactory->createNamed("form_error_address", TicketErrorAddressType::class, $ticket);
$formErrorAddress->handleRequest($request);
if($formErrorAddress->isSubmitted()){
if($formErrorAddress->isValid()){
$city = $emMaster->getRepository('App\Entity\Master\City')->findOneById($formErrorAddress->get('cityId')->getData());
$zip = $emMaster->getRepository('App\Entity\Master\Zip')->findOneById($formErrorAddress->get('zip')->getData());
$ticket->setIdCity($city->getId());
$ticket->setIdProvince($city->getProvince()->getId());
$ticket->setZip($zip->getCode());
$ticket->setSystemError(false);
$ticket->setSystemErrorDetails(null);
$em->flush();
$this->addFlash('notice_success', "Indirizzo ticket aggiornato!");
return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
}
}
// TICKET - DATA SCADENZA - MODIFICA
$formExpirationDatetimeEdit = $formFactory->createNamed("form_expiration_edit", TicketExpirationEditType::class, $ticket);
$formExpirationDatetimeEdit->handleRequest($request);
if($formExpirationDatetimeEdit->isSubmitted()){
$valid = true;
if($valid) $valid = ValidationService::validateNotBlank($validator, $formExpirationDatetimeEdit->get("date"));
if($valid) $valid = ValidationService::validateNotBlank($validator, $formExpirationDatetimeEdit->get("timeHour"));
if($valid) $valid = ValidationService::validateNotBlank($validator, $formExpirationDatetimeEdit->get("timeMinute"));
if($valid && $formExpirationDatetimeEdit->isValid()){
$datetime = date_create_from_format("d-m-Y H:i", $formExpirationDatetimeEdit->get('date')->getData()->format('d-m-Y').' '.$formExpirationDatetimeEdit->get('timeHour')->getData().':'.$formExpirationDatetimeEdit->get('timeMinute')->getData());
$ticket->setDatetimeExpiration($datetime);
$em->flush();
$this->addFlash('notice_success', "Data scadenza aggiornata!");
return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
}
}
// TICKET - LETTERA DI VETTURA - MODIFICA
$formWaybillEdit = $formFactory->createNamed("form_waybill_edit", TicketWaybillEditType::class, $ticket);
$formWaybillEdit->handleRequest($request);
if($formWaybillEdit->isSubmitted()){
if($formWaybillEdit->isValid()){
$em->flush();
$this->addFlash('notice_success', "Lettera di vettura aggiornata!");
return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
}
}
// TICKET - SOSPENSIONE - MODIFICA
$formSusEdit = $formFactory->createNamed("form_suspension_edit", TicketSuspensionEditType::class, $suspension);
$formSusEdit->handleRequest($request);
if($formSusEdit->isSubmitted()){
$valid = true;
if($valid) $valid = ValidationService::validateNotBlank($validator, $formSusEdit->get("dateFrom"));
if($valid) $valid = ValidationService::validateNotBlank($validator, $formSusEdit->get("timeFromHour"));
if($valid) $valid = ValidationService::validateNotBlank($validator, $formSusEdit->get("timeFromMinute"));
if($valid) $valid = ValidationService::validateNotBlank($validator, $formSusEdit->get("dateTo"));
if($valid) $valid = ValidationService::validateNotBlank($validator, $formSusEdit->get("timeToHour"));
if($valid) $valid = ValidationService::validateNotBlank($validator, $formSusEdit->get("timeToMinute"));
if($valid && $formSusEdit->isValid()){
$sus = $em->getRepository('App\Entity\Slave\TicketSuspension')->findOneById($formSusEdit->get('id')->getData());
$datetimeFrom = date_create_from_format("d-m-Y H:i", $formSusEdit->get('dateFrom')->getData()->format('d-m-Y').' '.$formSusEdit->get('timeFromHour')->getData().':'.$formSusEdit->get('timeFromMinute')->getData());
$datetimeTo = date_create_from_format("d-m-Y H:i", $formSusEdit->get('dateTo')->getData()->format('d-m-Y').' '.$formSusEdit->get('timeToHour')->getData().':'.$formSusEdit->get('timeToMinute')->getData());
$sus->setDatetimeFrom($datetimeFrom);
$sus->setDatetimeTo($datetimeTo);
$em->flush();
$this->addFlash('notice_success', "Date sospensione aggiornate!");
return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
}
}
// TICKET - SOSPENSIONE - APPROVARE/NON APPROVARE
$formSusApprove = $formFactory->createNamed("form_suspension_approve", TicketSuspensionApproveType::class, $suspension);
$formSusApprove->handleRequest($request);
if($formSusApprove->isSubmitted()){
$valid = true;
if($formSusApprove->get("isApproved")->getData() == false) $valid = ValidationService::validateNotBlank($validator, $formSusApprove->get("refuseMotivation"));
if($valid && $formSusApprove->isValid()){
$sus = $em->getRepository('App\Entity\Slave\TicketSuspension')->findOneById($formSusApprove->get('id')->getData());
$sus->setManaged(true);
$sus->setApproved($formSusApprove->get("isApproved")->getData());
if($sus->isApproved()){
$ticket->setStatus($em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'suspended')));
if($sus->getIntervention()->getOutcomeType()->getSlug() == 'suspended'){
$subject = $this->params->get('subject_ticket_suspension_approved');
$template = "email/ticket_suspension_approved.html.twig";
}
else{
$subject = $this->params->get('subject_ticket_uav_approved');
$template = "email/ticket_uav_approved.html.twig";
}
$settingUnlockSameTech = $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_suspension_unlock_same_technician'));
if($settingUnlockSameTech->getValue() != 1)
$ticket->setTechnician(null);
}
else{
$ticket->setStatus($em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'assigned')));
$sus->setRefuseMotivation($formSusApprove->get("refuseMotivation")->getData());
$sus->setUnlocked(1);
$sus->setDatetimeTo(new \Datetime());
$sus->getIntervention()->setBillable(false);
if($sus->getIntervention()->getOutcomeType()->getSlug() == 'suspended'){
$subject = $this->params->get('subject_ticket_suspension_not_approved');
$template = "email/ticket_suspension_not_approved.html.twig";
}
else{
$subject = $this->params->get('subject_ticket_uav_not_approved');
$template = "email/ticket_uav_not_approved.html.twig";
}
}
$em->flush();
$message = (new TemplatedEmail())
->subject($subject.' '.$ticket->getNumber())
->from($this->params->get('email_noreply'))
->to($sus->getIntervention()->getTechnician()->getEmail())
->htmlTemplate($template)
->context(['company' => $company, 'ticket' => $ticket, 'suspension' => $sus]);
$mailer->send($message);
$this->addFlash('notice_success', "Stato sospensione aggiornato!");
return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
}
else{
$session->set('openModalSuspensionApprove', true);
$session->set('openModalSuspensionApproveId', $formSusApprove->get('id')->getData());
$session->set('openModalSuspensionApproveIs', $formSusApprove->get('isApproved')->getData());
}
}
// INTERVENTO - MODIFICA % FUORI SLA E MESE DI FATTURAZIONE
$intervention = new Intervention();
$formInterventionSla = $formFactory->createNamed("form_intervention_sla", InterventionSlaType::class, $intervention);
$formInterventionSla->handleRequest($request);
if($formInterventionSla->isSubmitted()){
if($formInterventionSla->isValid()){
$editIntervention = $em->getRepository('App\Entity\Slave\Intervention')->findOneById($formInterventionSla->get('id')->getData());
if($formInterventionSla->get('slaOutboundPercentage')->getData() != null)
$editIntervention->setSlaOutboundPercentage($formInterventionSla->get('slaOutboundPercentage')->getData());
$datetimeBilling = date_create_from_format('d-m-Y H:i:s', $formInterventionSla->get('dateBilling')->getData()->format('d-m-Y').' 00:00:00');
$editIntervention->setDatetimeBilling($datetimeBilling);
$em->flush();
$this->addFlash('notice_success', "Dati aggiornati!");
return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
}
else{
$session->set('openModalInterventionSla', true);
$session->set('openModalInterventionSlaId', $formInterventionSla->get('id')->getData());
}
}
// TICKET - ELIMINA
$formDelete = $formFactory->createNamed("form_ticket_delete", TicketDeleteType::class, $ticket);
$formDelete->handleRequest($request);
if($formDelete->isSubmitted()){
$valid = ValidationService::validateNotBlank($validator, $formDelete->get('password'));
if($valid && !($passwordHasher->isPasswordValid($this->getUser(), $formDelete->get('password')->getData()))){
$valid = false;
$formDelete->get('password')->addError(new FormError('Password errata!'));
}
if($valid && $formDelete->isValid()){
foreach($ticket->getInterventions() as $intervention){
if($intervention->getSuspension() != null)
$em->remove($intervention->getSuspension());
$em->remove($intervention);
}
$this->deleteTicketAndConnectedValues($em, $ticket);
$em->flush();
$this->addFlash('notice_success', "Ticket eliminato correttamente!");
return $this->redirectToRoute('user_ticket_list');
}
else
$session->set('openDeleteModal', true);
}
return $this->render('role/user/ticket/sheet.html.twig', array(
'company' => $company,
'ticket' => $ticket,
'cities' => $cities,
'technicians' => $technicians,
'displayJsonReport' => $displayJsonReport,
'settingTechUnlockSuspension' => $settingTechUnlockSuspension,
'settingBackOffice' => $settingBackOffice->getValue(),
'formAddressEdit' => $formAddressEdit->createView(),
'formClientEdit' => $formClientEdit->createView(),
'formDelete' => $formDelete->createView(),
'formErrorAddress' => $formErrorAddress->createView(),
'formErrorKeyMapping' => $formErrorKeyMapping->createView(),
'formErrorOperation' => $formErrorOperation->createView(),
'formErrorProvince' => $formErrorProvince->createView(),
'formErrorSupplier' => $formErrorSupplier->createView(),
'formExpirationDatetimeEdit' => $formExpirationDatetimeEdit->createView(),
'formWaybillEdit' => $formWaybillEdit->createView(),
'formExtraEdit' => $formExtraEdit->createView(),
'formExtraNew' => $formExtraNew->createView(),
'formInterventionSla' => $formInterventionSla->createView(),
'formOperationEdit' => $formOperationEdit->createView(),
'formOperationTariffAmount' => $formOperationTariffAmount->createView(),
'formSusApprove' => $formSusApprove->createView(),
'formSusEdit' => $formSusEdit->createView(),
'formSusUnlock' => $formSusUnlock->createView(),
'formReminderNew' => $formReminderNew->createView(),
'formReminderEdit' => $formReminderEdit->createView()
));
}
else{
return $this->render('role/user/ticket/sheet.html.twig', array(
'company' => $company,
'ticket' => $ticket,
'cities' => $cities,
'displayJsonReport' => $displayJsonReport,
'settingTechUnlockSuspension' => $settingTechUnlockSuspension,
'formClientEdit' => $formClientEdit->createView(),
'settingBackOffice' => $settingBackOffice->getValue(),
'formAddressEdit' => $formAddressEdit->createView(),
'formSusUnlock' => $formSusUnlock->createView(),
'formExtraNew' => $formExtraNew->createView(),
'formExtraEdit' => $formExtraEdit->createView(),
'formReminderNew' => $formReminderNew->createView(),
'formReminderEdit' => $formReminderEdit->createView()
));
}
}
/**
* @Route("/{ticketId}/scheda/aggiorna-dati", name="user_ticket_sheet_update_data")
* @Security("is_granted('edit', 'ticket')")
*/
public function userTicketSheetUpdateData($ticketId, Request $request)
{
$em = $this->mr->getManager('slave');
$emMaster = $this->mr->getManager('master');
$session = $request->getSession();
$session->remove('ticket_id_city_alias');
$company = $emMaster->getRepository("App\Entity\Master\Company")->findOneById($session->get('companyId'));
$ticket = $em->getRepository('App\Entity\Slave\Ticket')->findOneById($ticketId);
$operationTickets = $em->getRepository('App\Entity\Slave\Ticket')->findByOperationAndSystemError($ticket->getOperation(), true);
foreach($operationTickets as $ot){
if($ot->getClient() == null)
$error = TicketService::ticketMapClient($em, $ot);
$error = TicketService::ticketMapColumns($em, $emMaster, $company, $ot);
if(!$error) $error = TicketService::ticketAssignOperationTariffAmount($em, $emMaster, $ot);
if(!$error) TicketService::ticketAutoAssign($em, $emMaster, $ot);
if(!$error){
$ot->setSystemError(false);
$ot->setSystemErrorDetails(null);
$ot->setStatus($em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'to_assign')));
}
}
$em->flush();
$this->addFlash('notice_success', "Dati aggiornati");
return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
}
/**
* @Route("/{ticketId}/reindirizza-configurazione-alias-citta", name="user_ticket_redirect_alias_city")
* @Security("is_granted('edit', 'ticket')")
*/
public function userTicketRedirectAliasCity($ticketId, Request $request)
{
$em = $this->mr->getManager('slave');
$session = $request->getSession();
$ticket = $em->getRepository('App\Entity\Slave\Ticket')->findOneById($ticketId);
$keysRequired = $em->getRepository('App\Entity\Slave\OperationKeyMapping')->findByOperationAndRequired($ticket->getOperation()->getId(), true);
foreach($keysRequired as $k){
foreach(json_decode($ticket->getJson(), true) as $val){
if(array_key_exists($k->getMappingValue(), $val)){
switch($k->getTicketColumn()){
case 'Città': $cityName = $val[$k->getMappingValue()]; break;
default: break;
}
}
else{
$altKey = $k->displayMappingExtraValue("alt_key");
if(array_key_exists($altKey, $val)){
switch($k->getTicketColumn()){
case 'Città': $cityName = $val[$altKey]; break;
default: break;
}
}
}
}
}
$session->set('city_alias_value', $cityName);
$session->set('ticket_id_city_alias', $ticket->getId());
return $this->redirectToRoute('user_configuration_city_aliases');
}
/**
* @Route("/{ticketId}/reindirizza-fornitore-operazione", name="user_ticket_redirect_supplier_operation")
* @Security("is_granted('edit', 'ticket')")
*/
public function userTicketRedirectSupplierOperation($ticketId, Request $request)
{
$em = $this->mr->getManager('slave');
$session = $request->getSession();
$ticket = $em->getRepository('App\Entity\Slave\Ticket')->findOneById($ticketId);
$session->set('supplierId', $ticket->getSupplier()->getId());
$session->set('operationId', $ticket->getOperation()->getId());
return $this->redirectToRoute('user_anagraphic_supplier_operation_sheet', array('operationId' => $ticket->getOperation()->getId()));
}
/**
* @Route("/fatturabile", name="user_ticket_billable")
* @Security("is_granted('edit', 'ticket')")
*/
public function userTicketBillable(Request $request)
{
$em = $this->mr->getManager('slave');
$ticket = $em->getRepository("App\Entity\Slave\Ticket")->findOneById($request->request->get("ticketId"));
$ticket->setBillable(!$ticket->isBillable());
$em->flush();
$text = 'non fatturabile';
if($ticket->isBillable())
$text = 'da fatturare';
$this->addFlash('notice_success', "Ticket reso ".$text."!");
return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
}
/**
* @Route("/intervento/non-fatturabile", name="user_ticket_intervention_not_billable")
* @Security("is_granted('edit', 'ticket')")
*/
public function userTicketInterventionNotBillable(Request $request)
{
$em = $this->mr->getManager('slave');
$intervention = $em->getRepository("App\Entity\Slave\Intervention")->findOneById($request->request->get("interventionId"));
$intervention->setBillable(!$intervention->isBillable());
$em->flush();
$text = 'non fatturabile';
if($intervention->isBillable())
$text = 'da fatturare';
$this->addFlash('notice_success', "Intervento reso ".$text."!");
return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $intervention->getTicket()->getId()));
}
/**
* @Route("/intervento-extra/elimina", name="user_ticket_intervention_extra_delete")
* @Security("is_granted('edit', 'ticket')")
*/
public function userTicketInterventionExtraDelete(Request $request)
{
$em = $this->mr->getManager('slave');
$interventionExtra = $em->getRepository("App\Entity\Slave\InterventionExtra")->findOneById($request->request->get("interventionExtraDelId"));
$ticketId = $interventionExtra->getIntervention()->getTicket()->getId();
$em->remove($interventionExtra);
$em->flush();
$this->addFlash('notice_success', "Extra ticket eliminato");
return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticketId));
}
/**
* @Route("/promemoria/elimina", name="user_ticket_reminder_delete")
* @Security("is_granted('edit', 'ticket')")
*/
public function userTicketReminderDelete(Request $request)
{
$em = $this->mr->getManager('slave');
$ticketReminder = $em->getRepository("App\Entity\Slave\TicketReminder")->findOneById($request->request->get("reminderDelId"));
$ticketId = $ticketReminder->getTicket()->getId();
$em->remove($ticketReminder);
$em->flush();
$this->addFlash('notice_success', "Reminder ticket eliminato");
return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticketId));
}
/**
* @Route("/intervento-extra/invia-approva", name="user_ticket_intervention_extra_send_approve")
* @Security("is_granted('edit', 'ticket')")
*/
public function userTicketInterventionExtraSendApprove(Request $request)
{
$em = $this->mr->getManager('slave');
$interventionExtra = $em->getRepository("App\Entity\Slave\InterventionExtra")->findOneById($request->request->get("interventionExtraId"));
$interventionExtra->setManaged(true);
if($request->request->get('interventionExtraStatus') == 'approve')
$interventionExtra->setApproved(true);
else
$interventionExtra->setApproved(false);
$em->flush();
$this->addFlash('notice_success', "Extra ticket aggiornato");
return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $interventionExtra->getIntervention()->getTicket()->getId()));
}
// AZIONI AGENZIA
/**
* @Route("/scheda/tecnico-assegna", name="user_ticket_technician_assign")
* @Security("is_granted('edit', 'ticket')")
*/
public function userTicketTechnicianAssign(Request $request, MailerInterface $mailer)
{
$em = $this->mr->getManager('slave');
$technician = $em->getRepository("App\Entity\Slave\User")->findOneById($request->request->get('technicianId'));
$ticket = $em->getRepository("App\Entity\Slave\Ticket")->findOneById($request->request->get('ticketId'));
$statusAssigned = $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'assigned'));
// Notifico il vecchio tecnico se impostazione attiva
$oldTechnician = $ticket->getTechnician();
$settingSendEmail = $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_technician_send_cancel_email'));
if($oldTechnician != null && $settingSendEmail->getValue() == 1){
$message = (new TemplatedEmail())
->subject($this->params->get('subject_ticket_canceled').' '.$ticket->getNumber())
->from($this->params->get('email_noreply'))
->to($oldTechnician->getEmail())
->htmlTemplate('email/ticket_canceled.html.twig')
->context(['technician' => $oldTechnician, 'ticket' => $ticket]);
$mailer->send($message);
}
$ticket->setTechnician($technician);
$ticket->setStatus($statusAssigned);
$em->flush();
$this->addFlash('notice_success', "Ticket assegnato");
return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
}
/**
* @Route("/scheda/cancella", name="user_ticket_cancel")
* @Security("is_granted('edit', 'ticket')")
*/
public function userTicketCancel(Request $request, MailerInterface $mailer)
{
$em = $this->mr->getManager('slave');
$ticket = $em->getRepository("App\Entity\Slave\Ticket")->findOneById($request->request->get('ticketId'));
$statusCanceled = $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'canceled'));
// Notifico il tecnico se impostazione attiva
$settingSendEmail = $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_technician_send_cancel_email'));
if($settingSendEmail->getValue() == 1 && $ticket->getTechnician() != null && ($ticket->getStatus()->getSlug() != 'closed' && $ticket->getStatus()->getSlug() != 'closed_portal')){
$message = (new TemplatedEmail())
->subject($this->params->get('subject_ticket_canceled').' '.$ticket->getNumber())
->from($this->params->get('email_noreply'))
->to($ticket->getTechnician()->getEmail())
->htmlTemplate('email/ticket_canceled.html.twig')
->context(['technician' => $ticket->getTechnician(), 'ticket' => $ticket]);
$mailer->send($message);
}
$ticket->setStatus($statusCanceled);
$em->flush();
$this->addFlash('notice_success', "Ticket annullato");
return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
}
/**
* @Route("/scheda/errato", name="user_ticket_wrong")
* @Security("is_granted('edit', 'ticket')")
*/
public function userTicketWrong(Request $request)
{
$em = $this->mr->getManager('slave');
$ticket = $em->getRepository("App\Entity\Slave\Ticket")->findOneById($request->request->get('ticketId'));
$statusWrong = $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'wrong'));
$ticket->setSystemError(false);
$ticket->setSystemErrorSlug(null);
$ticket->setSystemErrorDetails(null);
$ticket->setStatus($statusWrong);
$em->flush();
$this->addFlash('notice_success', "Ticket spostato in errati");
return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
}
/**
* @Route("/scheda/ripristina", name="user_ticket_restore")
* @Security("is_granted('edit', 'ticket')")
*/
public function userTicketRestore(Request $request)
{
$em = $this->mr->getManager('slave');
$ticket = $em->getRepository("App\Entity\Slave\Ticket")->findOneById($request->request->get('ticketId'));
$statusToAssign = $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'to_assign'));
$statusAssigned = $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'assigned'));
if($ticket->getTechnician() != null)
$ticket->setStatus($statusAssigned);
else
$ticket->setStatus($statusToAssign);
$em->flush();
$this->addFlash('notice_success', "Ticket ripristinato");
return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
}
/**
* @Route("/scheda/prendi-in-carico", name="user_ticket_taken_charge")
* @Security("is_granted('edit', 'ticket')")
*/
public function userTicketTakenCharge(Request $request)
{
$em = $this->mr->getManager('slave');
$session = $request->getSession();
$ticket = $em->getRepository("App\Entity\Slave\Ticket")->findOneById($request->request->get('ticketId'));
$ticket->setStatus($em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'taken_charge')));
$em->flush();
$this->addFlash('notice_success', "Ticket ripreso in carico");
return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
}
/**
* @Route("/scheda/completa", name="user_ticket_close")
* @Security("is_granted('edit', 'ticket')")
*/
public function userTicketClose(Request $request)
{
$em = $this->mr->getManager('slave');
$ticket = $em->getRepository("App\Entity\Slave\Ticket")->findOneById($request->request->get('ticketClosedId'));
$ticket->setStatus($em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'closed')));
$ticket->setClosedOnPortal(0);
$ticket->setDatetimeEnd(new \Datetime());
$em->flush();
$this->addFlash('notice_success', "Ticket chiuso");
return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
}
/**
* @Route("/scheda/chiuso-su-portale-fornitore", name="user_ticket_closed_on_portal")
* @Security("is_granted('edit', 'ticket')")
*/
public function userTicketCloseOnPortal(Request $request)
{
$em = $this->mr->getManager('slave');
$ticket = $em->getRepository("App\Entity\Slave\Ticket")->findOneById($request->request->get('ticketClosedPortalId'));
$ticket->setStatus($em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'closed_portal')));
$ticket->setClosedOnPortal(1);
$em->flush();
$this->addFlash('notice_success', "Ticket contrassegnato come chiuso su portale cliente");
return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
}
// AZIONI TECNICO / AGENZIA SE SETTING TICKET_MANAGE == 1
/**
* @Route("/{ticketId}/scheda/prendi-in-carico", name="user_ticket_take_charge_single")
* @Security("is_granted('edit', 'ticket')")
*/
public function userTicketTakeChargeSingle($ticketId, Request $request)
{
$em = $this->mr->getManager('slave');
$session = $request->getSession();
$ticket = $em->getRepository("App\Entity\Slave\Ticket")->findOneById($ticketId);
$statusTakeCharge = $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'taken_charge'));
$ticket->setStatus($statusTakeCharge);
$em->flush();
$this->addFlash('notice_success', "Ticket preso in carico");
return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
}
/**
* @Route("/{ticketId}/scheda/verbale-stampa", name="user_ticket_report_print_single")
* @Security("is_granted('view', 'ticket')")
*/
public function userTicketReportPrintSingle($ticketId, Request $request)
{
$em = $this->mr->getManager('slave');
$ticket = $em->getRepository("App\Entity\Slave\Ticket")->findOneById($ticketId);
$matrixTickets = array();
$jsonReportValues = array();
$tmp = array();
if($ticket->getJsonReport() != '[]'){
$matrix = json_decode($ticket->getJsonReport(), true);
foreach($matrix as $array)
foreach($array as $a){
$tcv = $em->getRepository('App\Entity\Slave\TicketColumnValue')->findOneBySupplierTicketColumnAndNeedle($ticket->getSupplier()->getId(), array_keys($array)[0], $a);
$htmlToAdd = '';
if($tcv != null)
$htmlToAdd = ' ('.$tcv->getValue().')';
$jsonReportValues[array_keys($array)[0]] = $a.$htmlToAdd;
}
}
array_push($tmp, $ticket, $jsonReportValues);
array_push($matrixTickets, $tmp);
return $this->render('role/user/print/report.html.twig', array(
'matrixTickets' => $matrixTickets,
'backRoute' => 'sheet',
'continueRoute' => 'sheet'
));
}
/**
* @Route("/scheda/intervento/seleziona", name="user_ticket_intervention_select")
* @Security("is_granted('edit', 'ticket')")
*/
public function userTicketInterventionSelect(Request $request)
{
$em = $this->mr->getManager('slave');
$ticket = $em->getRepository('App\Entity\Slave\Ticket')->findOneById($request->request->get('ticketId'));
$outcomeType = $em->getRepository('App\Entity\Slave\InterventionOutcomeType')->findOneBy(array('slug' => $request->request->get('interventionOutcomeTypeSlug')));
$today = new \Datetime();
$intervention = new Intervention();
$intervention->setTicket($ticket);
$intervention->setOutcomeType($outcomeType);
$intervention->setDatetime($today);
$intervention->setDatetimeBilling(date_create_from_format('d-m-Y H:i:s', '01-'.$today->format('m').'-'.$today->format('Y').' 00:00:00'));
$em->persist($intervention);
$em->flush();
if($intervention->getOutcomeType()->getSlug() == 'completed'){
// Completato --- Vado al seleziona attivita
$warehouse = $em->getRepository('App\Entity\Slave\Warehouse')->findOneById($request->request->get('interventionWarehouseId'));
$intervention->setWarehouse($warehouse);
$em->flush();
return $this->redirectToRoute('user_ticket_intervention_activity_summary', array('interventionId' => $intervention->getId()));
}
else{
// A vuoto/Sospeso --- Vado direttamente ai dettagli intervento
return $this->redirectToRoute("user_ticket_intervention", array('interventionId' => $intervention->getId()));
}
}
/**
* @Route("/intervento-incompleto/elimina", name="user_ticket_intervention_delete")
* @Security("is_granted('edit', 'ticket')")
*/
public function userTicketInterventionDelete(Request $request)
{
$em = $this->mr->getManager('slave');
$intervention = $em->getRepository("App\Entity\Slave\Intervention")->findOneById($request->request->get("interventionDelId"));
$ticket = $intervention->getTicket();
$ticketId = $intervention->getTicket()->getId();
foreach($intervention->getActivities() as $activity){
// Withdraw
if($activity->getProductWithdraw() != null){
// Controllo: se l'ho inserita adesso elimino il prodotto altrimenti lo ritrasferisco indietro
if($activity->getProductWithdraw()->getIsAlreadyInserted('withdraw')){
$productToDelete = $activity->getProductWithdraw();
$activity->setProductWithdraw(null);
$this->deleteProductAlreadyInserted($em, $productToDelete);
}
else{
$oldStatus = $em->getRepository('App\Entity\Slave\ProductStatus')->findOneBy(array('slug' => 'in_use'));
$oldCondition = $em->getRepository('App\Entity\Slave\ProductCondition')->findOneById($intervention->getLastProductLog('condition')->getOldDataId());
ProductService::createProductLog($em, $activity->getProductWithdraw(), $this->getUser(), 'status', $oldStatus->getValue(), null, $activity->getProductWithdraw()->getStatus()->getId());
ProductService::createProductLog($em, $activity->getProductWithdraw(), $this->getUser(), 'condition', $oldCondition->getValue(), null, $activity->getProductWithdraw()->getCondition()->getId());
$activity->getProductWithdraw()->setStatus($oldStatus);
$activity->getProductWithdraw()->setCondition($oldCondition);
$activity->getProductWithdraw()->setTermid($ticket->getTermid());
ProductService::moveProductClient($em, $activity->getProductWithdraw(), $ticket->getClient()->getWarehouse());
ProductService::createProductTransferLogClient($em, $activity->getProductWithdraw(), $this->getUser(), $intervention->getWarehouse(), $ticket->getClient()->getWarehouse(), new \Datetime(), 'scan');
}
}
// Actual
if($activity->getProductActual() != null){
// Controllo: se l'ho inserita adesso elimino il prodotto altrimenti lo ritrasferisco indietro
if($activity->getProductActual()->getIsAlreadyInserted('actual')){
$productToDelete = $activity->getProductActual();
$activity->setProductActual(null);
$this->deleteProductAlreadyInserted($em, $productToDelete);
}
else{
$activity->getProductActual()->setTermid($ticket->getTermid());
ProductService::moveProductClient($em, $activity->getProductActual(), $ticket->getClient()->getWarehouse());
}
}
// Installation
if($activity->getProductInstallation() != null){
$oldStatus = $em->getRepository('App\Entity\Slave\ProductStatus')->findOneBy(array('slug' => 'available'));
ProductService::createProductLog($em, $activity->getProductInstallation(), $this->getUser(), 'status', $oldStatus->getValue(), $intervention, $activity->getProductInstallation()->getStatus()->getId());
$activity->getProductInstallation()->setStatus($oldStatus);
$activity->getProductInstallation()->setTermid(null);
ProductService::moveProductClient($em, $activity->getProductInstallation(), $intervention->getWarehouse());
ProductService::createProductTransferLogClient($em, $activity->getProductInstallation(), $this->getUser(), $ticket->getClient()->getWarehouse(), $intervention->getWarehouse(), new \Datetime(), 'scan');
}
$em->remove($activity);
}
foreach($intervention->getProductLogs() as $log){
$log->setIntervention(null);
}
$em->flush();
$em->remove($intervention);
$em->flush();
if($ticket->getInterventionCompleted() == null){
$ticket->setDatetimeEnd(null);
if($ticket->getStatus()->getSlug() == "closed" || $ticket->getStatus()->getSlug() == "closed_portal"){
$statusAssigned = $em->getRepository("App\Entity\Slave\TicketStatus")->findOneBySlug("assigned");
$ticket->setStatus($statusAssigned);
}
$em->flush();
}
$this->addFlash('notice_success', "Intervento eliminato correttamente");
return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticketId));
}
/**
* @Route("/{interventionId}/scheda/intervento/modifica", name="user_ticket_intervention_edit")
* @Security("is_granted('edit', 'ticket')")
*/
public function userTicketInterventionEdit($interventionId, Request $request)
{
$em = $this->mr->getManager('slave');
$intervention = $em->getRepository('App\Entity\Slave\Intervention')->findOneById($interventionId);
if($intervention->getOutcomeType()->getSlug() == 'completed')
return $this->redirectToRoute('user_ticket_intervention_activity_summary', array('interventionId' => $intervention->getId()));
else
return $this->redirectToRoute("user_ticket_intervention", array('interventionId' => $intervention->getId()));
}
/**
* @Route("/{interventionId}/scheda/intervento/attivita-riassunto", name="user_ticket_intervention_activity_summary")
* @Security("is_granted('edit', 'ticket')")
*/
public function userTicketInterventionActivitySelect($interventionId, Request $request)
{
$em = $this->mr->getManager('slave');
$session = $request->getSession();
$intervention = $em->getRepository("App\Entity\Slave\Intervention")->findOneById($interventionId);
$ticket = $intervention->getTicket();
$components = $em->getRepository("App\Entity\Slave\ProductComponent")->findAll();
// Se tecnico -> Escludo i tipi attività solo backoffice
if($this->getUser()->getAccountTypology() == 'technician')
$interventionActivityTypes = $em->getRepository('App\Entity\Slave\InterventionActivityType')->findVisibleByOperationGroupAndOnlyBackoffice($ticket->getOperation()->getGroup()->getSlug(), false);
else
$interventionActivityTypes = $em->getRepository('App\Entity\Slave\InterventionActivityType')->findVisibleByOperationGroupAndOnlyBackoffice($ticket->getOperation()->getGroup()->getSlug(), true);
return $this->render('role/user/ticket/intervention/activity/summary.html.twig', array(
'ticket' => $ticket,
'components' => $components,
'intervention' => $intervention,
'interventionActivityTypes' => $interventionActivityTypes
));
}
/**
* @Route("/scheda/intervento/attivita-cancella", name="user_ticket_intervention_activity_delete")
* @Security("is_granted('edit', 'ticket')")
*/
public function userTicketInterventionActivityDelete(Request $request)
{
$em = $this->mr->getManager('slave');
$session = $request->getSession();
$activity = $em->getRepository("App\Entity\Slave\InterventionActivity")->findOneById($request->request->get('activityId'));
$intervention = $activity->getIntervention();
$ticket = $intervention->getTicket();
// Withdraw
if($activity->getProductWithdraw() != null){
// Controllo: se l'ho inserita adesso elimino il prodotto altrimenti lo ritrasferisco indietro
if($activity->getProductWithdraw()->getIsAlreadyInserted('withdraw')){
$productToDelete = $activity->getProductWithdraw();
$activity->setProductWithdraw(null);
$this->deleteProductAlreadyInserted($em, $productToDelete);
}
else{
$oldStatus = $em->getRepository('App\Entity\Slave\ProductStatus')->findOneBy(array('slug' => 'in_use'));
$oldCondition = $em->getRepository('App\Entity\Slave\ProductCondition')->findOneById($intervention->getLastProductLog('condition')->getOldDataId());
ProductService::createProductLog($em, $activity->getProductWithdraw(), $this->getUser(), 'status', $oldStatus->getValue(), null, $activity->getProductWithdraw()->getStatus()->getId());
ProductService::createProductLog($em, $activity->getProductWithdraw(), $this->getUser(), 'condition', $oldCondition->getValue(), null, $activity->getProductWithdraw()->getCondition()->getId());
$activity->getProductWithdraw()->setStatus($oldStatus);
$activity->getProductWithdraw()->setCondition($oldCondition);
$activity->getProductWithdraw()->setTermid($ticket->getTermid());
ProductService::moveProductClient($em, $activity->getProductWithdraw(), $ticket->getClient()->getWarehouse());
ProductService::createProductTransferLogClient($em, $activity->getProductWithdraw(), $this->getUser(), $intervention->getWarehouse(), $ticket->getClient()->getWarehouse(), new \Datetime(), 'scan');
}
}
// Actual
if($activity->getProductActual() != null){
// Controllo: se l'ho inserita adesso elimino il prodotto altrimenti lo ritrasferisco indietro
if($activity->getProductActual()->getIsAlreadyInserted('actual')){
$productToDelete = $activity->getProductActual();
$activity->setProductActual(null);
$this->deleteProductAlreadyInserted($em, $productToDelete);
}
else{
$activity->getProductActual()->setTermid($ticket->getTermid());
ProductService::moveProductClient($em, $activity->getProductActual(), $ticket->getClient()->getWarehouse());
}
}
// Installation
if($activity->getProductInstallation() != null){
$oldStatus = $em->getRepository('App\Entity\Slave\ProductStatus')->findOneBy(array('slug' => 'available'));
ProductService::createProductLog($em, $activity->getProductInstallation(), $this->getUser(), 'status', $oldStatus->getValue(), $intervention, $activity->getProductInstallation()->getStatus()->getId());
$activity->getProductInstallation()->setStatus($oldStatus);
$activity->getProductInstallation()->setTermid(null);
ProductService::moveProductClient($em, $activity->getProductInstallation(), $intervention->getWarehouse());
ProductService::createProductTransferLogClient($em, $activity->getProductInstallation(), $this->getUser(), $ticket->getClient()->getWarehouse(), $intervention->getWarehouse(), new \Datetime(), 'scan');
}
$em->remove($activity);
$em->flush();
$this->addFlash('notice_success', 'Attivita eliminata correttamente!');
return $this->redirectToRoute('user_ticket_intervention_activity_summary', array('interventionId' => $intervention->getId()));
}
/**
* @Route("/scheda/intervento/{interventionId}/attivita/{activityTypeId}", name="user_ticket_intervention_activity")
* @Security("is_granted('edit', 'ticket')")
*/
public function userTicketInterventionActivity($interventionId, $activityTypeId, Request $request, ValidatorInterface $validator, FormFactoryInterface $formFactory)
{
$em = $this->mr->getManager('slave');
$emMaster = $this->mr->getManager('master');
$session = $request->getSession();
$company = $emMaster->getRepository("App\Entity\Master\Company")->findOneById($session->get('companyId'));
$activityType = $em->getRepository("App\Entity\Slave\InterventionActivityType")->findOneById($activityTypeId);
$intervention = $em->getRepository("App\Entity\Slave\Intervention")->findOneById($interventionId);
$ticket = $intervention->getTicket();
$activity = new InterventionActivity();
$form = $formFactory->createNamed("form_intervention_activity", InterventionActivityType::class, $activity);
$form->handleRequest($request);
if($form->isSubmitted()){
$valid = FormValidatorService::validateInterventionActivity($validator, $form, $activityType, $ticket, $intervention, $em);
if($valid && $form->isValid()){
$activity->setIntervention($intervention);
$activity->setType($activityType);
// Withdraw
if($activityType->isProducerWithdrawMandatory() || $activityType->isSupplierWithdrawMandatory()){
$withdrawProduct = $this->activityProductByType($em, $form, 'Withdraw', array($ticket->getSupplier()));
// Se cambia il modello lo aggiorno al prodotto che ho disinstallato
$withdrawModel = $em->getRepository('App\Entity\Slave\ProductModel')->findOneById($form->get('modelWithdrawId')->getData());
if($withdrawModel != null)
$withdrawProduct->setModel($withdrawModel);
$activity->setProductWithdraw($withdrawProduct);
if($activityType->isSupplierWithdrawMandatory()){
$activity->setSupplierWithdraw($form->get('supplierWithdraw')->getData());
$transferLogType = $form->get('scanOrManualSupplierWithdraw')->getData();
}
if($activityType->isProducerWithdrawMandatory()){
$activity->setProducerWithdraw($form->get('producerWithdraw')->getData());
$transferLogType = $form->get('scanOrManualProducerWithdraw')->getData();
}
$components = $em->getRepository('App\Entity\Slave\ProductComponent')->findAll();
$arrayComponents = array();
foreach($components as $c){
$cp = $request->request->get('component_'.$c->getId());
if($cp == 'on')
array_push($arrayComponents, $c->getId());
}
$activity->setComponents($arrayComponents);
$newStatus = $em->getRepository('App\Entity\Slave\ProductStatus')->findOneBy(array('slug' => 'not_available'));
$newCondition = $em->getRepository('App\Entity\Slave\ProductCondition')->findOneBy(array('slug' => 'retired'));
ProductService::createProductLog($em, $activity->getProductWithdraw(), $this->getUser(), 'status', $newStatus->getValue(), $intervention, $activity->getProductWithdraw()->getStatus()->getId());
ProductService::createProductLog($em, $activity->getProductWithdraw(), $this->getUser(), 'condition', $newCondition->getValue(), $intervention, $activity->getProductWithdraw()->getCondition()->getId());
$activity->getProductWithdraw()->setStatus($newStatus);
$activity->getProductWithdraw()->setCondition($newCondition);
$activity->getProductWithdraw()->setTermid(null);
ProductService::createProductTransferLogClient($em, $activity->getProductWithdraw(), $this->getUser(), $ticket->getClient()->getWarehouse(), $intervention->getWarehouse(), new \Datetime(), $transferLogType);
ProductService::moveProductClient($em, $activity->getProductWithdraw(), $intervention->getWarehouse());
}
// Actual
if($activityType->isProducerActualMandatory() || $activityType->isSupplierActualMandatory()){
$actualProduct = $this->activityProductByType($em, $form, 'Actual', array($ticket->getSupplier()));
// Se cambia il modello lo aggiorno al prodotto che c'è installato
// Questa azione potrebbe creare un problema se un tecnico installa qualcosa, poi fa un evento di aggiornamento dove cambia il modello, poi lo elimina, ha di fatto baypassato l'impossibilità del tecnico di cambiare modello ad un prodotto.
// In ogni caso, quando poi la merce torna in magazzino, viene sistemato il tutto, quindi non è un reale problema.
$actualModel = $em->getRepository('App\Entity\Slave\ProductModel')->findOneById($form->get('modelActualId')->getData());
if($actualModel != null)
$actualProduct->setModel($actualModel);
$activity->setProductActual($actualProduct);
if($activityType->isProducerActualMandatory()){
$activity->setProducerActual($form->get('producerActual')->getData());
$transferLogType = $form->get('scanOrManualProducerActual')->getData();
}
if($activityType->isSupplierActualMandatory()){
$activity->setSupplierActual($form->get('supplierActual')->getData());
$transferLogType = $form->get('scanOrManualSupplierActual')->getData();
}
$activity->getProductActual()->setTermid($ticket->getTermid());
ProductService::moveProductClient($em, $activity->getProductActual(), $ticket->getClient()->getWarehouse());
}
// Installation
if($activityType->isProducerInstallationMandatory() || $activityType->isSupplierInstallationMandatory()){
$installationProduct = $this->activityProductByType($em, $form, 'Installation', array($ticket->getSupplier()));
// Il modello non cambia mai, perché viene dettato dal magazzino, quindi non consento la modifica
$activity->setProductInstallation($installationProduct);
if($activityType->isProducerInstallationMandatory()){
$activity->setProducerInstallation($form->get('producerInstallation')->getData());
$transferLogType = $form->get('scanOrManualProducerInstallation')->getData();
}
if($activityType->isSupplierInstallationMandatory()){
$activity->setSupplierInstallation($form->get('supplierInstallation')->getData());
$transferLogType = $form->get('scanOrManualSupplierInstallation')->getData();
}
$newStatus = $em->getRepository('App\Entity\Slave\ProductStatus')->findOneBy(array('slug' => 'in_use'));
ProductService::createProductLog($em, $activity->getProductInstallation(), $this->getUser(), 'status', $newStatus->getValue(), $intervention, $activity->getProductInstallation()->getStatus()->getId());
$activity->getProductInstallation()->setStatus($newStatus);
$activity->getProductInstallation()->setTermid($ticket->getTermid());
ProductService::createProductTransferLogClient($em, $activity->getProductInstallation(), $this->getUser(), $intervention->getWarehouse(), $ticket->getClient()->getWarehouse(), new \Datetime(), $transferLogType);
ProductService::moveProductClient($em, $activity->getProductInstallation(), $ticket->getClient()->getWarehouse());
}
$em->persist($activity);
$em->flush();
return $this->redirectToRoute('user_ticket_intervention_activity_summary', array('interventionId' => $intervention->getId()));
}
}
return $this->render('role/user/ticket/intervention/activity/single.html.twig', array(
'company' => $company,
'ticket' => $ticket,
'intervention' => $intervention,
'activityType' => $activityType,
'isPos' => $activityType->isPos(),
'form' => $form->createView()
));
}
/**
* @Route("/scheda/intervento/attivita-prodotti-cerca-codice", name="user_ticket_intervention_activity_product_search_code")
* @Security("is_granted('edit', 'ticket')")
*/
public function userTicketInterventionActivityProductSearchCode(Request $request)
{
$em = $this->mr->getManager('slave');
$session = $request->getSession();
$ticket = $em->getRepository('App\Entity\Slave\Ticket')->findOneById($request->request->get('ticketId'));
$intervention = $em->getRepository('App\Entity\Slave\Intervention')->findOneById($request->request->get('interventionId'));
$interventionActivityType = $em->getRepository('App\Entity\Slave\InterventionActivityType')->findOneById($request->request->get('activityTypeId'));
$product = null;
// Controllo se esiste il prodotto
switch($request->request->get('type')){
case 'producer_withdraw':
case 'producer_installation':
case 'producer_actual':
$product = $em->getRepository('App\Entity\Slave\Product')->findOneBy(array('codeProducer' => $request->request->get('code')));
break;
case 'supplier_withdraw':
case 'supplier_installation':
case 'supplier_actual':
$product = $em->getRepository('App\Entity\Slave\Product')->findOneBy(array('codeSupplier' => $request->request->get('code')));
break;
default: break;
}
$found = false;
$json = '{';
if($product != null){
$found = true;
$posAccessoryOk = false;
$supplierOk = false;
$canMove = true;
if($product->getModel()->isPos() == $interventionActivityType->isPos())
$posAccessoryOk = true;
// Controllo se il fornitore del ticket è tra quelli del prodotto
foreach($product->getSuppliers() as $supplier){
if($ticket->getSupplier()->getId() == $supplier->getId()){
$supplierOk = true;
break;
}
}
// Controllo se posso spostare il prodotto
switch($request->request->get('type')){
case 'producer_withdraw':
case 'supplier_withdraw':
case 'producer_actual':
case 'supplier_actual':
$warehouse = $ticket->getClient()->getWarehouse();
break;
case 'producer_installation':
case 'supplier_installation':
$warehouse = $intervention->getWarehouse();
if($product->getStatus()->getSlug() != 'available')
$canMove = false;
break;
default: break;
}
$json.= '"id":"'.$product->getId().'", "model":'.json_encode($product->getModel()->getName()).', "codeProducer":"'.$product->getCodeProducer().'", "codeSupplier":"'.$product->getCodeSupplier().'", "supplierOk":"'.$supplierOk.'", "posAccessoryOk":"'.$posAccessoryOk.'",';
if($product->getActualWarehouse()->getId() == $warehouse->getId())
$json.= '"otherWarehouse":"0", "type":"", "warehouse":"", "otherWarehouseId":"", "otherWarehouseNickname":"", "canMove":"'.$canMove.'"';
else
$json.= '"otherWarehouse":"1","type":"'.$request->request->get('type').'","warehouse":"'.$warehouse->getId().'", "otherWarehouseId":"'.$product->getActualWarehouse()->getId().'", "otherWarehouseNickname":"'.$product->getActualWarehouse()->getNickname().'", "canMove":"'.$canMove.'"';
}
$json.= '}';
return new Response(json_encode(array("code" => 200, "success" => true, "found" => $found, "product" => $json)));
}
/**
* @Route("/scheda/intervento/attivita-prodotto-cerca", name="user_ticket_intervention_activity_product_search")
* @Security("is_granted('edit', 'ticket')")
*/
public function userTicketInterventionActivityProductSearch(Request $request)
{
$em = $this->mr->getManager('slave');
$session = $request->getSession();
$activityType = $em->getRepository("App\Entity\Slave\InterventionActivityType")->findOneById($request->request->get('activityTypeId'));
$ticket = $em->getRepository("App\Entity\Slave\Ticket")->findOneById($request->request->get('ticketId'));
$intervention = $em->getRepository("App\Entity\Slave\Intervention")->findOneById($request->request->get('interventionId'));
$type = $request->request->get('type');
$filter = $request->request->get('filter');
$isPos = $request->request->get('isPos');
$products = array();
if($type == 'installation')
$products = $em->getRepository('App\Entity\Slave\Product')->findByWarehouseSupplierAndIsPosWithFilter($intervention->getWarehouse()->getId(), $ticket->getSupplier()->getId(), $isPos, $filter);
if($type == 'actual' || $type == 'withdraw')
$products = $em->getRepository('App\Entity\Slave\Product')->findByWarehouseSupplierAndIsPosWithFilter($ticket->getClient()->getWarehouse()->getId(), $ticket->getSupplier()->getId(), $isPos, $filter);
$first = true;
$json = "[";
foreach($products as $p){
if($first) $first = false; else $json.= ',';
$codeProducer = '"---"'; if($p->getCodeProducer() != null && $p->getCodeProducer() != '') $codeProducer = json_encode($p->getCodeProducer());
$codeSupplier = '"---"'; if($p->getCodeSupplier() != null && $p->getCodeSupplier() != '') $codeSupplier = json_encode($p->getCodeSupplier());
$json.= '{"id":'.$p->getId().', "modelName":'.json_encode($p->getModel()->getName()).', "codeProducer":'.$codeProducer.', "codeSupplier":'.$codeSupplier.'}';
}
$json.= "]";
return new Response(json_encode(array("code" => 200, "success" => true, "products" => $json)));
}
/**
* @Route("/scheda/intervento/attivita-modello-cerca", name="user_ticket_intervention_activity_model_search")
* @Security("is_granted('edit', 'ticket')")
*/
public function userTicketInterventionActivityModelSearch(Request $request)
{
$em = $this->mr->getManager('slave');
$session = $request->getSession();
$activityType = $em->getRepository("App\Entity\Slave\InterventionActivityType")->findOneById($request->request->get('activityTypeId'));
$isPos = $request->request->get('isPos');
$filter = $request->request->get('filter');
$interventionId = $request->request->get('interventionId');
$intervention = $em->getRepository("App\Entity\Slave\Intervention")->findOneById($interventionId);
$supplier = $intervention->getTicket()->getSupplier();
$models = $em->getRepository('App\Entity\Slave\ProductModel')->findAllowedPosModel($isPos, $filter, $supplier);
$first = true;
$json = "[";
foreach($models as $m){
if($first) $first = false; else $json.= ',';
$json.= '{"id":'.$m->getId().', "name":'.json_encode($m->getName()).', "subcategory":'.json_encode($m->getSubcategory()->getName()).', "category":'.json_encode($m->getSubcategory()->getCategory()->getName()).', "producer":'.json_encode($m->getProducer()->getName()).'}';
}
$json.= "]";
return new Response(json_encode(array("code" => 200, "success" => true, "models" => $json)));
}
/**
* @Route("/scheda/intervento/attivita-modello-componenti", name="user_ticket_intervention_activity_model_components")
* @Security("is_granted('edit', 'ticket')")
*/
public function userTicketInterventionActivityModelComponents(Request $request)
{
$em = $this->mr->getManager('slave');
$session = $request->getSession();
$activityType = $em->getRepository("App\Entity\Slave\InterventionActivityType")->findOneById($request->request->get('activityTypeId'));
$model = $em->getRepository('App\Entity\Slave\ProductModel')->findOneById($request->request->get('modelId'));
$first = true;
$json = "[";
if($model != null){
foreach($model->getComponents() as $c){
if($first) $first = false; else $json.= ',';
$json.= '{"id":"'.$c->getId().'", "name":"'.$c->getName().'"}';
}
}
$json.= "]";
return new Response(json_encode(array("code" => 200, "success" => true, "components" => $json)));
}
/**
* @Route("/{interventionId}/scheda/intervento/attivita-sposta-prodotto", name="user_ticket_intervention_activity_move_product")
* @Security("is_granted('edit', 'ticket')")
*/
public function userTicketInterventionActivityMoveProduct(Request $request, $interventionId)
{
$em = $this->mr->getManager('slave');
$session = $request->getSession();
$type = $request->request->get('type');
$product = $em->getRepository('App\Entity\Slave\Product')->findOneById($request->request->get('productId'));
$oldStatus = $product->getStatus();
$intervention = $em->getRepository('App\Entity\Slave\Intervention')->findOneById($interventionId);
if($type == "installation"){
$statusNew = $em->getRepository('App\Entity\Slave\ProductStatus')->findOneBy(array('slug' => 'available'));
$warehouse = $intervention->getWarehouse();
$product->setTermid(null);
$product->setStatus($statusNew);
}
else{
$statusNew = $em->getRepository('App\Entity\Slave\ProductStatus')->findOneBy(array('slug' => 'in_use'));
$warehouse = $intervention->getTicket()->getClient()->getWarehouse();
$product->setTermid($intervention->getTicket()->getTermid());
$product->setStatus($statusNew);
}
if($oldStatus->getId() != $statusNew->getId())
ProductService::createProductLog($em, $product, $this->getUser(), 'status', $oldStatus->getValue(), null, $statusNew->getId());
ProductService::createProductTransferLog($em, $product, null, $this->getUser(), $warehouse, new \Datetime(), 'forced');
$product->setActualWarehouse($warehouse);
$product->setDateLastTransfer(new \Datetime());
$product->isToManage(false);
$product->setToManagePriority(0);
$em->flush();
return new Response(json_encode(array("code" => 200, "success" => true)));
}
/**
* @Route("/{interventionId}/scheda/intervento/dettagli", name="user_ticket_intervention")
* @Security("is_granted('edit', 'ticket')")
*/
public function userTicketIntervention($interventionId, Request $request, ValidatorInterface $validator, FormFactoryInterface $formFactory, FileSystem $fs, 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'));
$intervention = $em->getRepository("App\Entity\Slave\Intervention")->findOneById($interventionId);
$ticket = $intervention->getTicket();
$settingCompletedDefault = $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'outcome_completed_default'));
$outcomeCompletedDefault = $em->getRepository('App\Entity\Slave\InterventionOutcome')->findOneById($settingCompletedDefault->getValue());
$form = $formFactory->createNamed("form_intervention", InterventionType::class, $intervention, array('typeSlug' => $intervention->getOutcomeType()->getSlug()));
$form->handleRequest($request);
if($form->isSubmitted()){
[$valid, $interventionOutcome] = FormValidatorService::validateIntervention($em, $validator, $form, $intervention->getOutcomeType()->getSlug());
if($valid && $form->isValid()){
$intervention->setTechnician($ticket->getTechnician());
$intervention->setOperator($this->getUser());
if($intervention->getOutcomeType()->getSlug() == "completed")
$datetime = date_create_from_format("d-m-Y H:i", $form->get('date')->getData()->format('d-m-Y').' '.$form->get('timeHour')->getData().':'.$form->get('timeMinute')->getData());
else
$datetime = new \Datetime();
$intervention->setDatetime($datetime);
$intervention->setMotivation($form->get("motivation")->getData());
$em->persist($intervention);
switch($intervention->getOutcomeType()->getSlug()){
case 'suspended':
case 'empty':
// Inserisco la sospensione del ticket
$suspension = new TicketSuspension();
$suspension->setTicket($ticket);
$suspension->setIntervention($intervention);
$suspension->setDatetimeFrom(date_create_from_format("d-m-Y H:i", $form->get('dateFrom')->getData()->format('d-m-Y').' '.$form->get('timeFromHour')->getData().':'.$form->get('timeFromMinute')->getData()));
if($form->get('dateTo')->getData() != null && $form->get('timeToHour')->getData() != null && $form->get('timeToMinute')->getData() != null){
$suspension->setDatetimeTo(date_create_from_format("d-m-Y H:i", $form->get('dateTo')->getData()->format('d-m-Y').' '.$form->get('timeToHour')->getData().':'.$form->get('timeToMinute')->getData()));
}
$em->persist($suspension);
// Aggiorno dati intervento
if($interventionOutcome->isReferentRequired()) $intervention->setReferent($form->get("referent")->getData());
if($interventionOutcome->isPhoneRequired()) $intervention->setPhone($form->get("phone")->getData());
if($interventionOutcome->isPhotoRequired()) {
$uploadDir = $this->params->get('kernel.project_dir').'/'.$this->params->get('web_path').'/companies/'.$company->getDirectoryPath().'/tickets/'.$ticket->getDirectoryPath().'/';
MediaService::uploadImage($fs, $form->get('file')->getData(), null, $uploadDir, $intervention, 'photo', 100, 1000, 200, true);
}
// SE empty -> Aggiungo costo UAV
if($intervention->getOutcomeType()->getSlug() == 'empty'){
$amountTechnician = null;
// Cerco tra gli UAV di quella provincia e di quell'utente
if($ticket->getUAVOperationTariffAmount() != null){
foreach($ticket->getUAVOperationTariffAmount()->getTechnicianAreas() as $jttaota){
if($jttaota->getTechnicianArea()->getUser()->getId() == $ticket->getTechnician()->getId())
$amountTechnician = $jttaota->getAmount();
}
}
// SE non ho risultati -> Fuori zona metto 0.00
if($amountTechnician == null){
$amountTechnician = '0.00';
}
$intervention->setAmount($ticket->getUAVOperationTariffAmount()->getAmount());
$intervention->setAmountTechnician($amountTechnician);
}
// Se account agenzia che gestisce -> approvo automaticamente sospensione --- Altrimenti metto in richiesta sospensione
if($this->getUser()->getAccountTypology() == 'agency' || $this->getUser()->getAccountTypology() == 'warehouse'){
$suspension->setApproved(true);
$suspension->setManaged(true);
$settingUnlockSameTech = $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_suspension_unlock_same_technician'));
if($settingUnlockSameTech->getValue() != 1)
$ticket->setTechnician(null);
$ticketStatus = $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'suspended'));
}
else{
$ticketStatus = $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'suspension_request'));
if($intervention->getOutcomeType()->getSlug() == "suspended"){
$settingAgencyEmail = $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_suspension_agency_email'));
$subject = $this->params->get('subject_ticket_suspension_request');
$template = "email/ticket_suspension_request.html.twig";
}
else{
$settingAgencyEmail = $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_uav_agency_email'));
$subject = $this->params->get('subject_ticket_uav_request');
$template = "email/ticket_uav_request.html.twig";
}
if($settingAgencyEmail->getValue() != null){
$emails = preg_split('/\,/', $settingAgencyEmail->getValue());
foreach($emails as $email){
$message = (new TemplatedEmail())
->subject($subject.' '.$ticket->getNumber())
->from($this->params->get('email_noreply'))
->to(rtrim(ltrim($email, " ")," "))
->htmlTemplate($template)
->context(['company' => $company, 'ticket' => $ticket, 'suspension' => $suspension]);
$mailer->send($message);
}
}
}
// Aggiorno stato ticket
$ticket->setStatus($ticketStatus);
break;
case 'completed':
// Chiudo il ticket
$statusClosed = $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'closed'));
$ticket->setStatus($statusClosed);
$ticket->setDatetimeEnd($intervention->getDatetime());
// Cerco la jt del tecnico-operazione nell'area e setto l'amount
$amountTechnician = null;
foreach($ticket->getOperationTariffAmount()->getTechnicianAreas() as $jttaota){
if($jttaota->getTechnicianArea()->getUser()->getId() == $ticket->getTechnician()->getId()){
$amountTechnician = $jttaota->getAmount();
break;
}
}
// Se non la trovo -> Fuori zona metto 0.00
if($amountTechnician == null){
$amountTechnician = '0.00';
}
$intervention->setAmount($ticket->getOperationTariffAmount()->getAmount());
$intervention->setAmountTechnician($amountTechnician);
$this->addFlash('notice_success', 'Ticket completato!');
break;
default: break;
}
$em->flush();
$session->set('interventionId', $intervention->getId());
return $this->redirectToRoute('user_ticket_sheet', array('ticketId' => $ticket->getId()));
}
}
return $this->render('role/user/ticket/intervention/intervention.html.twig', array(
'ticket' => $ticket,
'intervention' => $intervention,
'outcomeCompletedDefault' => $outcomeCompletedDefault,
'form' => $form->createView()
));
}
/**
* @Route("/scheda/intervento/esito-aggiorna", name="user_ticket_intervention_outcome_update")
* @Security("is_granted('edit', 'ticket')")
*/
public function userTicketInterventionOutcomeUpdate(Request $request)
{
$em = $this->mr->getManager('slave');
$interventionOutcome = $em->getRepository('App\Entity\Slave\InterventionOutcome')->findOneById($request->request->get("outcomeId"));
return new Response(json_encode(array(
"code" => 200,
"success" => true,
"suspensionTo" => $interventionOutcome->isSuspensionToRequired(),
"referent" => $interventionOutcome->isReferentRequired(),
"motivation" => $interventionOutcome->isMotivationRequired(),
"phone" => $interventionOutcome->isPhoneRequired(),
"photo" => $interventionOutcome->isPhotoRequired()
)));
}
/**
* @Route("/sistema-duplicati", name="user_ticket_duplicate_to_wrong")
*/
public function userTicketDuplicateToWrong(Request $request)
{
$em = $this->mr->getManager('slave');
$wrongStatus = $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBySlug("wrong");
$tickets = $em->getRepository('App\Entity\Slave\Ticket')->findAll();
$ticketId = null;
$skipId = array();
$wrongTicketArray = array();
foreach($tickets as $ticket){
$ticketId = $ticket->getId();
if(!in_array($ticketId, $skipId)){
foreach($tickets as $innerTicket){
if($ticketId != $innerTicket->getId() && $ticket->getNumber() == $innerTicket->getNumber() && $ticket->getTermid()->getCode() == $innerTicket->getTermid()->getCode() && $innerTicket->getStatus()->getId() < 4){
array_push($skipId, $innerTicket->getId());
array_push($wrongTicketArray, $ticket);
}
}
}
}
foreach($wrongTicketArray as $wt){
$wt->setStatus($wrongStatus);
}
$em->flush();
return $this->redirectToRoute("user_ticket_list");
}
/**
* @Route("/sposta-temp", name="user_ticket_move_to_temp")
*/
public function userTicketmoveToTemp(Request $request)
{
$em = $this->mr->getManager('slave');
$tempStatus = $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBySlug("temp");
$ticketArray = [];
foreach($ticketArray as $array){
$ts = $em->getRepository('App\Entity\Slave\Ticket')->findAllByNumber($array[0]);
foreach($ts as $t){
if($t->getTermid()->getCode() == $array[1] && $t->getStatus()->getId() < 4)
$t->setStatus($tempStatus);
}
}
$em->flush();
return $this->redirectToRoute("user_ticket_list");
}
}