<?php
namespace App\Controller;
use App\Entity\LoginLog;
use App\Repository\AwbexportRepository;
use App\Repository\C4rgoNewsRepository;
use App\Repository\DecodeRepository;
use App\Repository\LoginLogRepository;
use App\Repository\LuoghiRepository;
use App\Repository\UserRepository;
use App\Repository\VettoriRepository;
use App\Services\OktaApiService;
use App\Utils\Counters;
use App\Utils\Formatter;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Contracts\Translation\TranslatorInterface;
class WelcomeController extends AbstractController
{
private SessionInterface $session;
private OktaApiService $okta;
private UserRepository $userRepository;
private EntityManagerInterface $em;
private VettoriRepository $vettoriRepository;
private LuoghiRepository $luoghiRepository;
private LoginLogRepository $loginLogRepository;
private DecodeRepository $decodeRepository;
private C4rgoNewsRepository $c4rgoNewsRepository;
private AwbexportRepository $awbexportRepository;
private TokenStorageInterface $tokenStorage;
public function __construct(
SessionInterface $session,
OktaApiService $okta,
UserRepository $UserRepository,
EntityManagerInterface $em,
VettoriRepository $vettoriRepository,
LuoghiRepository $luoghiRepository,
LoginLogRepository $loginLogRepository,
DecodeRepository $decodeRepository,
C4rgoNewsRepository $c4rgoNewsRepository,
AwbexportRepository $awbexportRepository,
TokenStorageInterface $tokenStorage
) {
$this->session = $session;
$this->okta = $okta;
$this->userRepository = $UserRepository;
$this->em = $em;
$this->vettoriRepository = $vettoriRepository;
$this->luoghiRepository = $luoghiRepository;
$this->loginLogRepository = $loginLogRepository;
$this->decodeRepository = $decodeRepository;
$this->c4rgoNewsRepository = $c4rgoNewsRepository;
$this->awbexportRepository = $awbexportRepository;
$this->tokenStorage = $tokenStorage;
}
protected function getValue(TranslatorInterface $translator, Counters $counters, string $data = "D", string $filtri = "N") {
/* Anagrafiche utente loggato */
$filtriVect = explode('&', $filtri);
$delivered = FALSE;
$mode = FALSE;
$warehouse = FALSE;
$customer = FALSE;
foreach($filtriVect as $val) {
$v = explode("=", $val);
if (count($v) == 2 && $v[1] !== 'null') {
switch($v[0]) {
case 'delivered':
$delivered = $v[1];
break;
case 'mode':
$mode = $v[1];
break;
case 'warehouse':
$warehouse = $v[1];
break;
case 'customer':
$customer = $v[1];
break;
}
}
}
// throw new \Exception(print_r($customer, true));
$counters->setGlobalFilter($delivered, $mode, $warehouse, $customer);
$user = $this->getUser();
$profilo = $user->getProfilo();
$azienda = $user->getAzienda();
if ($this->isGranted('ROLE_ALL_LOC')) {
$vettori = $this->vettoriRepository->findAll();
$luoghi = $this->luoghiRepository->findAll();
}
else {
$vettori = $this->vettoriRepository->findByCliente($azienda->getId());
$luoghi = $this->luoghiRepository->findByAzienda($azienda);
}
$loginLog = $this->loginLogRepository->findOneByUserId($user);
$formattatore = new Formatter();
/* Tempi medi macchina / persona */
$tempo_medio_macchina = (double) $this->decodeRepository->getDECValue("CONFIG", "tempo.medio.macchina");
$tempo_medio_persona = (double) $this->decodeRepository->getDECValue("CONFIG", "tempo.medio.persona");
$news = $this->c4rgoNewsRepository->findPub();
$awbRep = $this->awbexportRepository;
$d = new \DateTime();
if ($data !== '') {
if (strlen($data) > 1) {
$d = new \DateTime(substr($data, 1));
}
/* else {
if ($data == 'L') {
$em = $this->getDoctrine()->getManager();
$stmt = $em->getConnection()->prepare(" SELECT MAX(DataIns) AS dt FROM awbexport ");
$results = $stmt->executeQuery()->fetchAllAssociative();
if ($results !== null && count($results) > 0) {
$d = new \DateTime($results[0]['dt']);
}
else {
$d = new \DateTime();
}
}
}*/
}
// throw new \Exception($d->format("Y"));
$rilday = "";
$nawb = $counters->countAWB($d->format("Y-m-d"));
$nawbY = $counters->countAWB("Y" . $d->format("Y"));
// $nawby = $awbRep->countAWB("Y");
$sumV = $awbRep->sumV($d->format("Y-m-d"));
$sumW = 0; //$counters->totaliPesi("D" . $d->format("Y"));
// $sumW = $awbRep->sumW($d->format("Y-m-d"));
$countRec = $awbRep->countRec($d->format("Y-m-d"));
$countRecY = $awbRep->countRec("Y" . $d->format("Y"));
$tottempoelaborazionedati = 0;
$tottemporisparmiato = 0;
if ($tempo_medio_persona !== null && $tempo_medio_macchina !== null && $countRecY !== null) {
$tottemporisparmiato = (double)(($tempo_medio_persona - $tempo_medio_macchina) * $countRecY) / 3600.0;
}
if ($tempo_medio_macchina !== null && $countRecY !== null) {
$tottempoelaborazionedati = (double)($tempo_medio_macchina * $countRecY) / 3600.0;
}
$differenzaGiorni = 5;
$dMin7 = clone $d;
$dMin7->sub(new \DateInterval("P{$differenzaGiorni}D"));
$giornitot = $counters->totaliGiorni("P" . $d->format("Y-m-d"));
$giorni = $counters->totaliGiorni("D" . $d->format("Y-m-d"));
$giornisettimana = $counters->totaliGiorni("W" . $d->format("Y-W"));
$giornimese = $counters->totaliGiorni("M" . $d->format("Y-m"));
$pesitot = $counters->totaliPesi("P" . $d->format("Y-m-d"));
$pesigiorno = $counters->totaliPesi("D" . $d->format("Y-m-d"));
$pesisettimana = $counters->totaliPesi("W" . $d->format("Y-W"));
$pesimese = $counters->totaliPesi("M" . $d->format("Y-m"));
if ($giornitot !== FALSE && $pesitot !== FALSE) {
$pesigiornomedio = ($giornitot > 0) ? ((float) $pesitot['valore']) / ((float) $giornitot) : 0.0;
$pesigiornomediogiorno = $pesigiornomedio * $giorni;
$pesigiornomediosettimana = $pesigiornomedio * $giornisettimana;
$pesigiornomediomese = $pesigiornomedio * $giornimese;
$pesigiornoincrementogiorno = ((int) ($pesigiornomediogiorno * 1000) > 0) ? ((((float) $pesigiorno['valore']) / $pesigiornomediogiorno) - 1) * 100.0 : FALSE;
$pesigiornoincrementosettimana = ((int) ($pesigiornomediosettimana * 1000) > 0) ? ((((float) $pesisettimana['valore']) / $pesigiornomediosettimana) - 1) * 100.0 : FALSE;
$pesigiornoincrementomese = ((int) ($pesigiornomediomese * 1000) > 0) ? ((((float) $pesimese['valore']) / $pesigiornomediomese) - 1) * 100.0 : FALSE;
}
else {
$pesigiornoincrementogiorno = FALSE;
$pesigiornoincrementosettimana = FALSE;
$pesigiornoincrementomese = FALSE;
}
$volumitot = $counters->totaliVolumi("P" . $d->format("Y-m-d"));
$volumigiorno = $counters->totaliVolumi("D" . $d->format("Y-m-d"));
$volumisettimana = $counters->totaliVolumi("W" . $d->format("Y-W"));
$volumimese = $counters->totaliVolumi("M" . $d->format("Y-m"));
if ($giornitot !== FALSE && $volumitot !== FALSE) {
$volgiornomedio = ($giornitot > 0) ? ((float) $volumitot['valore']) / ((float) $giornitot) : 0.0;
$volgiornomediogiorno = $volgiornomedio * $giorni;
$volgiornomediosettimana = $volgiornomedio * $giornisettimana;
$volgiornomediomese = $volgiornomedio * $giornimese;
$volgiornoincrementogiorno = ((int) ($volgiornomediogiorno * 1000) > 0) ? ((((float) $volumigiorno['valore']) / $volgiornomediogiorno) - 1) * 100.0 : FALSE;
$volgiornoincrementosettimana = ((int) ($volgiornomediosettimana * 1000) > 0) ? ((((float) $volumisettimana['valore']) / $volgiornomediosettimana) - 1) * 100.0 : FALSE;
$volgiornoincrementomese = ((int) ($volgiornomediomese * 1000) > 0) ? ((((float) $volumimese['valore']) / $volgiornomediomese) - 1) * 100.0 : FALSE;
}
else {
$volgiornoincrementogiorno = FALSE;
$volgiornoincrementosettimana = FALSE;
$volgiornoincrementomese = FALSE;
}
$objtot = $counters->conteggiObj("P" . $d->format("Y-m-d"));
$objgiorno = $counters->conteggiObj("D" . $d->format("Y-m-d"));
if ($giornitot !== FALSE && $objtot !== FALSE) {
$awbgiornomediogiorno = (float) (($giornitot > 0) ? ((float) $objtot['nawb']) / ((float) $giornitot) : 0.0) * $giorni;
$objgiornomediogiorno = (($giornitot > 0) ? ((float) $objtot['nobj']) / ((float) $giornitot) : 0.0) * $giorni;
$ncolligiornomediogiorno = (($giornitot > 0) ? ((float) $objtot['ncolli']) / ((float) $giornitot) : 0.0) * $giorni;
$awbgiornoincrementogiorno = ((int) ($awbgiornomediogiorno * 1000) > 0) ? ((((float) $objtot['nawb']) / $awbgiornomediogiorno) - 1) * 100.0 : FALSE;
$objgiornoincrementogiorno = ((int) ($objgiornomediogiorno * 1000) > 0) ? ((((float) $objtot['nobj']) / $objgiornomediogiorno) - 1) * 100.0 : FALSE;
$ncolligiornoincrementogiorno = ((int) ($ncolligiornomediogiorno * 1000) > 0) ? ((((float) $objtot['ncolli']) / $ncolligiornomediogiorno) - 1) * 100.0 : FALSE;
}
else {
$awbgiornomediogiorno = 0;
$objgiornomediogiorno = 0;
$ncolligiornomediogiorno = 0;
$awbgiornoincrementogiorno = FALSE;
$objgiornoincrementosettimana = FALSE;
$ncolligiornoincrementomese = FALSE;
}
// throw new \Exception($d->format("Y") . " $pesigiornomediogiorno = $pesigiornomedio * $giorni $pesigiornoincrementogiorno $pesigiornoincrementosettimana $pesigiornoincrementomese $giornitot $giorni $giornisettimana $giornimese {$pesitot['valore']} {$pesigiorno['valore']} {$pesisettimana['valore']} {$pesimese['valore']} {$volumitot['valore']} {$volumigiorno['valore']} {$volumisettimana['valore']} {$volumimese['valore']}");
$totpesianno = $counters->totaliPesi("A" . $d->format("Y"));
$totpesigiorno = $counters->totaliPesi("D" . $d->format("Y-m-d"));
$totpesiannoparziale = $counters->totaliPesi("P" . $d->format("Y-m-d"));
if ($totpesigiorno !== false) {
if ($totpesiannoparziale !== FALSE) {
$tempPesi = ((float) $totpesianno['valore']) - ((float) $totpesigiorno['valore']);
}
else {
$tempPesi = (float) $totpesigiorno['valore'];
}
$incremento = ($tempPesi > 0) ? ((float) $totpesigiorno['valore'] / $tempPesi) * 100.0 : 0.0;
}
$sospesi = $counters->contaSospesi('A' . $d->format("Y"));
$sql = "
SELECT d.decvalue, IFNULL(t.termine, IFNULL(tdef.termine, d.decvalue)) AS termine
FROM
decode as d LEFT JOIN
traduzioni AS t ON d.decvalue = t.idtermine AND t.area = 3 AND t.codice = ? LEFT JOIN
traduzioni AS tdef ON d.decvalue = tdef.idtermine AND tdef.area = 3 AND tdef.codice = 'en'
WHERE
d.decclass = 'TIPOVETTORE'
ORDER BY d.decorder ASC
";
$stmt = $this->em->getConnection()->prepare($sql);
$stmt->bindValue(1, $translator->getLocale(), \PDO::PARAM_STR);
$deliveredby = $stmt->executeQuery()->fetchAllAssociative();
//throw new \Exception(print_r($loginLog->getGeoLoc(), true));
$loghipath = $this->getParameter('logo_path');
$logoUrl = '';
if ($azienda !== null) {
$logoUrl = "$loghipath/" . $azienda->getLogo();
}
return [
'controller_name' => 'WelcomeController',
'deliveredby' => $deliveredby,
'data' => $data,
'delivered' => $delivered,
'mode' => $mode,
'warehouse' => $warehouse,
'customer' => $customer,
'target_annuale' => $translator->trans('welcome.on.target.year', array('%year%' => $d->format('Y'))),
'news' => $news,
'rilday' => $rilday,
'awbgestite' => $nawb,
'awbgestiteanno' => $nawbY,
'datenow' => $d,
'tempomediocollo' => $tempo_medio_macchina,
'recordstrasferiti' => $countRec,
'volumirilevati' => $formattatore->floatValue(($sumV === null) ? 0 : $sumV, 2, "", ""),
'pesirilevati' => $formattatore->floatValue(($sumW === null) ? 0: $sumW, 2, "", ""),
'totvolumirilevati' => $counters->totaliVolumi("A" . $d->format("Y")),
'totpesirilevati' => $counters->totaliPesi("A" . $d->format("Y")),
'pesigiornoincrementogiorno' => $pesigiornoincrementogiorno,
'pesigiornoincrementosettimana' => $pesigiornoincrementosettimana,
'pesigiornoincrementomese' => $pesigiornoincrementomese,
'pesigiorno' => $pesigiorno,
'pesisettimana' => $pesisettimana,
'pesimese' => $pesimese,
'volgiornoincrementogiorno' => $volgiornoincrementogiorno,
'volgiornoincrementosettimana' => $volgiornoincrementosettimana,
'volgiornoincrementomese' => $volgiornoincrementomese,
'volumigiorno' => $volumigiorno,
'volumisettimana' => $volumisettimana,
'volumimese' => $volumimese,
'awbgiornomediogiorno' => $awbgiornomediogiorno,
'objgiornomediogiorno' => $objgiornomediogiorno,
'ncolligiornomediogiorno' => $ncolligiornomediogiorno,
'objgiorno' => $objgiorno,
'totpesigiorno' => array('valore' => $totpesianno, 'incremento' => ''),
// Pesi espressi in grammi: minore o uguale a 100,999, maggiore di 100,999 e minore o uguale a 1000,999 e maggiore di 1000,999
'pesilimiti' => $counters->contaPesiLimiti("A" . $d->format("Y"), [100999, 1000999]),
'pesinocongruita' => $counters->totaliPesiNoCongruita("A" . $d->format("Y")),
// Volumi espressi in Mc * 1000: minore o uguale a 5,999, maggiore di 5,999 e minore o uguale a 30,999 e maggiore di 30,999
'volumilimiti' => $counters->contaVolumiLimiti("A" . $d->format("Y"), [999, 5999]),
'voluminocongruita' => $counters->totaliVolumiNoCongruita("A" . $d->format("Y")),
// 'awbsosspese' => $counters->contaSospesi("R" . $dMin7->format("Y-m-d") . ';' . $d->format("Y-m-d")),
'awbsosspese' => ($sospesi !== FALSE) ? $sospesi['valore'] : '', //$counters->contaSospesi('R;' . $d->format("Y-m-d"))['val'],
'awbsosspesediffgiorni' => ($sospesi !== FALSE) ? $sospesi['data']->diff($d)->format("%a") : '', // $differenzaGiorni,
'tottemporisparmiato' => $formattatore->floatValue($tottemporisparmiato, 2, "", ""),
'totrecordtrasferiti' => $countRecY,
'tottempoelaborazionedati' => $formattatore->floatValue($tottempoelaborazionedati, 2, "", ""),
'numluoghi' => count($luoghi),
'listaluoghi' => $luoghi,
'listavettori' => $vettori,
'pageicon' => 'fa fa-search',
'logoazienda' => $azienda->getLogo(),
'logoUrl' => $logoUrl,
'fullname' => ($profilo !== null) ? $profilo->getNome() . ' ' . $profilo->getCognome() : $user->getFullname(),
'lastlogin' => ($loginLog != null) ? $loginLog->getDataLogin() : null,
'lastlogininfo' => ($loginLog != null) ? $loginLog->getGeoLoc() : null,
'filtri' => $filtri,
];
}
/**
* @Route("/welcomejson", name="welcome_json", defaults={"data": "D"})
* @Route("/welcomejson/{data}", name="welcome_json", defaults={"data": "D"})
* @Route("/welcomejson/{data}/{filtri}", name="welcome_json", defaults={"data": "D","filtri":"N"})
*/
public function welcomejson(TranslatorInterface $translator, Counters $counter, string $data = "D", string $filtri = "N"): JsonResponse {
$value = $this->getValue($translator, $counter, $data, $filtri);
return new JsonResponse($value);
}
/**
* @Route("/secwelcome", name="welcome_page", defaults={"data": "D"})
* @Route("/secwelcome/{data}", name="welcome_page", defaults={"data": "D"})
* @Route("/secwelcome/{data}/{filtri}", name="welcome_page", defaults={"data": "D","filtri":"N"})
*/
public function index(Session $session, TranslatorInterface $translator, Counters $counter, string $data = "D", string $filtri = "N")
{
$value = $this->getValue($translator, $counter, $data, $filtri);
return $this->render('welcome/index.html.twig', $value);
}
private function LoginLog($user, $username, $action, $attuale, $request) {
$ip = $request->getClientIp();
$location = unserialize(file_get_contents('https://ipinfo.io/' . $ip . '/json')); //$_SERVER['REMOTE_ADDR']);
$loginLog = new LoginLog();
$loginLog->setUser($user);
$loginLog->setUsername($username);
$loginLog->setDataLogin(new \DateTime());
$loginLog->setAttuale($attuale);
$loginLog->setAAction($action);
$loginLog->setAIp($ip);
$loginLog->setAAgent($request->headers->get('User-Agent'));
$loginLog->setGeoLoc($location);
$this->em->persist($loginLog);
$this->em->flush();
}
/**
* @Route("/welcome", name="callbackwelcome_page")
*/
public function callback(Request $request, Session $session, TranslatorInterface $translator)
{
$token = $this->okta->authorizeUser($request);
if (!$token) {
$this->LoginLog(null, "", 9005, 0, $request);
return $this->redirectToRoute('security_errorlogin');
}
//throw new \Exception(print_r($token, true));
$email = $token->email;
$username = $token->preferred_username;
$username = str_replace('@ent.bhicorp.com', '', $username);
$user = $this->userRepository->loadUserByUsername($username);
if ($user) {
//throw new \Exception(print_r($token, true));
$token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
$this->tokenStorage->setToken($token);
$this->session->set('_security_main', serialize($token));
$query = "
UPDATE login_log
SET
attuale = 0
WHERE
user_id = ?";
$statement = $this->em->getConnection()->prepare($query);
$statement->bindValue(1, $user->getId(), \PDO::PARAM_INT);
$statement->execute();
$this->LoginLog($user, $username, 9002, 1, $request);
if ($this->getParameter('app.site_online') === 'Y') {
return $this->redirectToRoute('welcome_page');
}
else {
return $this->redirectToRoute('monitor_page');
}
} else {
$this->LoginLog(null, $username, 9004, 0, $request);
return $this->redirectToRoute('security_errorlogin');
}
}
}