<?php
namespace App\Controller;
use App\Entity\Slave\Intervention;
use App\Entity\Slave\OperationKeyMapping;
use App\Entity\Slave\TicketSuspension;
use App\Service\CompanyService;
use App\Service\EncryptionService;
use App\Service\TicketService;
use App\Service\UtilitiesService;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\BufferedOutput;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Form\FormError;
/**
* @Route("/script")
*/
class ScriptController extends AbstractController
{
protected $mr;
private $params;
public function __construct(ManagerRegistry $managerRegistry, ParameterBagInterface $params)
{
$this->mr = $managerRegistry;
$this->params = $params;
}
/**
* @Route("/aggiorna_master_db", name="admin_update_master_db")
*/
public function adminUpdateMasterDb(Request $request, KernelInterface $kernel)
{
$application = new Application($kernel);
$application->setAutoExit(false);
$input = new ArrayInput(array(
'command' => 'doctrine:schema:update',
'--force' => true,
'--dump-sql' => true,
'--complete' => true,
'--em' => 'master'
));
$output = new BufferedOutput();
$application->run($input, $output);
$content = $output->fetch();
return new Response($content);
}
/**
* @Route("/aggiorna_tutti_db", name="admin_update_all_db")
*/
public function adminUpdateAllDb(Request $request, KernelInterface $kernel)
{
$application = new Application($kernel);
$application->setAutoExit(false);
$emMaster = $this->mr->getManager('master');
$companies = $emMaster->getRepository("App\Entity\Master\Company")->findAll();
$content = "{ \"database aggiornati\" : [";
$first = true;
foreach($companies as $company){
if($first) $first = false; else $content.=", ";
$this->mr->getConnection('slave')->changeDatabase($this->getParameter('slave_database_host'), $this->getParameter('slave_database_port'), $this->getParameter('slave_database_user'), $this->getParameter('slave_database_password'), $company->getDbName());
$input = new ArrayInput(array(
'command' => 'doctrine:schema:update',
'--force' => true,
'--dump-sql' => true,
'--complete' => true,
'--em' => 'slave'
));
$output = new BufferedOutput();
$application->run($input, $output);
$content.= "{\"Nome database\" : ".json_encode($company->getDbName()).", \"output\" : ".json_encode($output->fetch())."}";
}
$content.="]}";
return new Response(json_encode($content));
}
// LICENZE
/**
* @Route("/licenze-funzionalita/controlla", name="script_licenses_features_check")
*/
public function scriptLicensesFeaturesCheck(Request $request)
{
$em = $this->mr->getManager();
$today = new \Datetime();
$licenses = $em->getRepository('App\Entity\Master\License')->findAllActive();
$jtlfs = $em->getRepository('App\Entity\Master\JoinTableLicenseFeature')->findAllActive();
foreach($licenses as $license){
if($license->getExpirationDate()->format('Ymd') < $today->format('Ymd')){
$license->setActive(false);
}
}
foreach($jtlfs as $jtlf){
if($jtlf->getExpirationDate()->format('Ymd') < $today->format('Ymd')){
$jtlf->setActive(false);
}
}
$em->flush();
return $this->redirectToRoute("homepage");
}
//
// TICKET
/**
* @Route("/ticket/scarica-da-email", name="script_ticket_download_email")
*/
/*public function scriptTicketDownloadEmail(Request $request)
{
$emMaster = $this->mr->getManager('master');
$session = $request->getSession();
$companies = $emMaster->getRepository('App\Entity\Master\Company')->findAll();
$mailbox = "{in.postassl.it:993/imap/ssl}INBOX";
$first = true;
$json = "[";
foreach($companies as $company){
$session->set('companyId', $company->getId());
$em = CompanyService::getSlaveManagerByCompany($this->mr, $this->params, $company);
foreach($company->getMailers() as $mailer){
$count = 0;
$countTicket = 0;
$countTicketError = 0;
$inbox = imap_open($mailbox, $mailer->getUser(), EncryptionService::decrypt($mailer->getPassword())) or die('Impossibile connettersi alla casella email: '.imap_last_error()); // Connessione alla casella email
$emails = imap_search($inbox, 'UNSEEN'); // Cerca tutte le email da leggere
$testing = $this->params->get('ticket_download_script_testing');
$error = false;
if($emails){
rsort($emails); // Ordino con la più nuova in cima
foreach($emails as $email){
if($count < 600)
[$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($first) $first = false; else $json.=", ";
$json.= '{"Account": "'.$mailer->getUser().'", "E-mail processate":"'.$count.'", "Ticket scaricati":"'.$countTicket.'", "Ticket con errori":"'.$countTicketError.'"}';
}
}
$json.= "]";
return new Response(json_encode(array("scriptTicketDownloadEmail" => $json)));
}*/
/**
* @Route("/ticket/scarica-da-email-per-mailer/{mailerNickname}", name="script_ticket_download_email_by_mailer")
*/
public function scriptTicketDownloadEmailByMailer(Request $request, MailerInterface $theburMailer, $mailerNickname)
{
$emMaster = $this->mr->getManager('master');
$mailer = $emMaster->getRepository('App\Entity\Master\CompanyMailer')->findOneByNickname($mailerNickname);
$mailbox = "{in.postassl.it:993/imap/ssl}INBOX";
$em = CompanyService::getSlaveManagerByCompany($this->mr, $this->params, $mailer->getCompany());
$count = 0;
$countTicket = 0;
$countTicketError = 0;
$inbox = imap_open($mailbox, $mailer->getUser(), EncryptionService::decrypt($mailer->getPassword())) or die('Impossibile connettersi alla casella email: '.imap_last_error()); // Connessione alla casella email
$emails = imap_search($inbox, 'UNSEEN'); // Cerca tutte le email da leggere
$testing = $this->params->get('ticket_download_script_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($mailerNickname == "thebursrl"){
$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.2);
$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, $mailer->getCompany(), $countTicket, $countTicketError);
}
else
break;
$count++;
}
}
if(!$testing){
imap_expunge($inbox); // Elimina le mail "marcate"
imap_close($inbox); // Chiude la connessione
}
$json= '{"Account": "'.$mailer->getUser().'", "E-mail processate":"'.$count.'", "Ticket scaricati":"'.$countTicket.'", "Ticket con errori":"'.$countTicketError.'"}';
return new Response(json_encode(array("scriptTicketDownloadEmailByMailer" => $json)));
}
/**
* @Route("/ticket/sblocca-sospensioni-approvate-e-concluse", name="script_ticket_unlock_approved_and_expired_suspensions")
*/
public function scriptTicketUnlockApprovedAndExpiredSuspensions(Request $request)
{
$emMaster = $this->mr->getManager('master');
$session = $request->getSession();
$companies = $emMaster->getRepository('App\Entity\Master\Company')->findAll();
$first = true;
$json='[';
foreach($companies as $company){
$session->set('companyId', $company->getId());
$em = CompanyService::getSlaveManagerByCompany($this->mr, $this->params, $company);
$approvedAndLockedSuspensionsExpired = $em->getRepository('App\Entity\Slave\TicketSuspension')->findAllApprovedLockedExpired();
foreach($approvedAndLockedSuspensionsExpired as $sus){
if($first) $first = false; else $json.= ', ';
$json.='{"ticket":"'.$sus->getTicket()->getNumber().'", "Motivo":"Sospensione terminata"}';
$unlockCausal = "Sbloccato automaticamente per fine sospensione";
$sus->unlock($unlockCausal, $sus->getDatetimeTo(), $em);
}
$em->flush();
}
$json.=']';
return new Response(json_encode(array("script_ticket_unlock_approved_and_expired_suspensions" => $json)));
}
/**
* @Route("/ticket/notifica-prendi-in-carico/{companyCode}", name="script_ticket_notify_take_charge")
*/
public function scriptTicketNotifyTakeCharge(Request $request, MailerInterface $mailer, $companyCode)
{
$emMaster = $this->mr->getManager('master');
$company = $emMaster->getRepository('App\Entity\Master\Company')->findOneByCode($companyCode);
$now = new \Datetime();
$first = true;
$json='{';
$em = CompanyService::getSlaveManagerByCompany($this->mr, $this->params, $company);
$technicians = $em->getRepository("App\Entity\Slave\User")->findTechniciansActive();
$settingMinutesTakeCharge = $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_technician_minutes_take_charge'));
$settingSunday = $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'script_sunday_active'));
$json.= '"Frequenza":"'.$settingMinutesTakeCharge->getValue().'","Invia la domenica":"'.$settingSunday->getValue().'","Da prendere in carico":[';
if($settingMinutesTakeCharge->getValue() != 'never' && ($now->format('i') % $settingMinutesTakeCharge->getValue() == 0) && ($settingSunday->getValue() == 1 || ($settingSunday->getValue() == 0 && $now->format('N') != 7))){
$users = array();
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){
if($first) $first = false; else $json.= ', ';
$json.='{"Tecnico":"'.$u[0].'", "E-mail":"'.$u[0]->getEmail().'", "Ticket da prendere in carico":"'.sizeof($u[1]).'"}';
$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);
}
}
$json.=']}';
return new Response(json_encode(array("script_ticket_notify_take_charge" => $json)));
}
/**
* @Route("/chiavi-mappatura/aggiungi", name="script_mapping_key_add")
*/
public function scriptMappingKeyAdd(Request $request)
{
//return false;
$emMaster = $this->mr->getManager('master');
$session = $request->getSession();
$companies = $emMaster->getRepository('App\Entity\Master\Company')->findAll();
$now = new \Datetime();
$first = true;
$json='[';
foreach($companies as $company){
$em = CompanyService::getSlaveManagerByCompany($this->mr, $this->params, $company);
$addCount = 0;
$skipCount = 0;
$session->set('companyId', $company->getId());
$operations = $em->getRepository("App\Entity\Slave\Operation")->findAll();
foreach($operations as $operation){
// SE NON E UAV -> INSERISCO I KEY MAPPING
if(!$operation->isUav()){
$arrayKeyMappings = array(
//0 => array('Cluster', '122', '0', '0', '0')
);
foreach($arrayKeyMappings as $km){
$operationKeyMapping = $em->getRepository("App\Entity\Slave\OperationKeyMapping")->findOneByOperationAndColumn($operation->getId(), $km[0]);
if($operationKeyMapping == null){
$addCount++;
$operationKeyMapping = new OperationKeyMapping();
$operationKeyMapping->setOperation($operation);
$operationKeyMapping->setTicketColumn($km[0]);
$operationKeyMapping->setPriority($km[1]);
$operationKeyMapping->setKeyRequired($km[2]);
$operationKeyMapping->setTicketNumber($km[3]);
$operationKeyMapping->setTermid($km[4]);
$em->persist($operationKeyMapping);
}
else
$skipCount++;
}
}
else
$skipCount++;
}
$em->flush();
if($first) $first = false; else $json.=', ';
$json.='{"Azienda":"'.$company->getName().'", "Chiavi inserite":"'.$addCount.'", "Chiavi già presenti":"'.$skipCount.'"}';
}
$json.=']';
return new Response(json_encode(array("script_mapping_key_add" => $json)));
}
//
}