src/Controller/WelcomeController.php line 353

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\LoginLog;
  4. use App\Repository\AwbexportRepository;
  5. use App\Repository\C4rgoNewsRepository;
  6. use App\Repository\DecodeRepository;
  7. use App\Repository\LoginLogRepository;
  8. use App\Repository\LuoghiRepository;
  9. use App\Repository\UserRepository;
  10. use App\Repository\VettoriRepository;
  11. use App\Services\OktaApiService;
  12. use App\Utils\Counters;
  13. use App\Utils\Formatter;
  14. use Doctrine\ORM\EntityManagerInterface;
  15. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  16. use Symfony\Component\HttpFoundation\JsonResponse;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Symfony\Component\HttpFoundation\Response;
  19. use Symfony\Component\HttpFoundation\Session\Session;
  20. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  21. use Symfony\Component\Routing\Annotation\Route;
  22. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  23. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  24. use Symfony\Contracts\Translation\TranslatorInterface;
  25. class WelcomeController extends AbstractController
  26. {
  27. private SessionInterface $session;
  28. private OktaApiService $okta;
  29. private UserRepository $userRepository;
  30. private EntityManagerInterface $em;
  31. private VettoriRepository $vettoriRepository;
  32. private LuoghiRepository $luoghiRepository;
  33. private LoginLogRepository $loginLogRepository;
  34. private DecodeRepository $decodeRepository;
  35. private C4rgoNewsRepository $c4rgoNewsRepository;
  36. private AwbexportRepository $awbexportRepository;
  37. private TokenStorageInterface $tokenStorage;
  38. public function __construct(
  39. SessionInterface $session,
  40. OktaApiService $okta,
  41. UserRepository $UserRepository,
  42. EntityManagerInterface $em,
  43. VettoriRepository $vettoriRepository,
  44. LuoghiRepository $luoghiRepository,
  45. LoginLogRepository $loginLogRepository,
  46. DecodeRepository $decodeRepository,
  47. C4rgoNewsRepository $c4rgoNewsRepository,
  48. AwbexportRepository $awbexportRepository,
  49. TokenStorageInterface $tokenStorage
  50. ) {
  51. $this->session = $session;
  52. $this->okta = $okta;
  53. $this->userRepository = $UserRepository;
  54. $this->em = $em;
  55. $this->vettoriRepository = $vettoriRepository;
  56. $this->luoghiRepository = $luoghiRepository;
  57. $this->loginLogRepository = $loginLogRepository;
  58. $this->decodeRepository = $decodeRepository;
  59. $this->c4rgoNewsRepository = $c4rgoNewsRepository;
  60. $this->awbexportRepository = $awbexportRepository;
  61. $this->tokenStorage = $tokenStorage;
  62. }
  63. protected function getValue(TranslatorInterface $translator, Counters $counters, string $data = "D", string $filtri = "N") {
  64. /* Anagrafiche utente loggato */
  65. $filtriVect = explode('&', $filtri);
  66. $delivered = FALSE;
  67. $mode = FALSE;
  68. $warehouse = FALSE;
  69. $customer = FALSE;
  70. foreach($filtriVect as $val) {
  71. $v = explode("=", $val);
  72. if (count($v) == 2 && $v[1] !== 'null') {
  73. switch($v[0]) {
  74. case 'delivered':
  75. $delivered = $v[1];
  76. break;
  77. case 'mode':
  78. $mode = $v[1];
  79. break;
  80. case 'warehouse':
  81. $warehouse = $v[1];
  82. break;
  83. case 'customer':
  84. $customer = $v[1];
  85. break;
  86. }
  87. }
  88. }
  89. // throw new \Exception(print_r($customer, true));
  90. $counters->setGlobalFilter($delivered, $mode, $warehouse, $customer);
  91. $user = $this->getUser();
  92. $profilo = $user->getProfilo();
  93. $azienda = $user->getAzienda();
  94. if ($this->isGranted('ROLE_ALL_LOC')) {
  95. $vettori = $this->vettoriRepository->findAll();
  96. $luoghi = $this->luoghiRepository->findAll();
  97. }
  98. else {
  99. $vettori = $this->vettoriRepository->findByCliente($azienda->getId());
  100. $luoghi = $this->luoghiRepository->findByAzienda($azienda);
  101. }
  102. $loginLog = $this->loginLogRepository->findOneByUserId($user);
  103. $formattatore = new Formatter();
  104. /* Tempi medi macchina / persona */
  105. $tempo_medio_macchina = (double) $this->decodeRepository->getDECValue("CONFIG", "tempo.medio.macchina");
  106. $tempo_medio_persona = (double) $this->decodeRepository->getDECValue("CONFIG", "tempo.medio.persona");
  107. $news = $this->c4rgoNewsRepository->findPub();
  108. $awbRep = $this->awbexportRepository;
  109. $d = new \DateTime();
  110. if ($data !== '') {
  111. if (strlen($data) > 1) {
  112. $d = new \DateTime(substr($data, 1));
  113. }
  114. /* else {
  115. if ($data == 'L') {
  116. $em = $this->getDoctrine()->getManager();
  117. $stmt = $em->getConnection()->prepare(" SELECT MAX(DataIns) AS dt FROM awbexport ");
  118. $results = $stmt->executeQuery()->fetchAllAssociative();
  119. if ($results !== null && count($results) > 0) {
  120. $d = new \DateTime($results[0]['dt']);
  121. }
  122. else {
  123. $d = new \DateTime();
  124. }
  125. }
  126. }*/
  127. }
  128. // throw new \Exception($d->format("Y"));
  129. $rilday = "";
  130. $nawb = $counters->countAWB($d->format("Y-m-d"));
  131. $nawbY = $counters->countAWB("Y" . $d->format("Y"));
  132. // $nawby = $awbRep->countAWB("Y");
  133. $sumV = $awbRep->sumV($d->format("Y-m-d"));
  134. $sumW = 0; //$counters->totaliPesi("D" . $d->format("Y"));
  135. // $sumW = $awbRep->sumW($d->format("Y-m-d"));
  136. $countRec = $awbRep->countRec($d->format("Y-m-d"));
  137. $countRecY = $awbRep->countRec("Y" . $d->format("Y"));
  138. $tottempoelaborazionedati = 0;
  139. $tottemporisparmiato = 0;
  140. if ($tempo_medio_persona !== null && $tempo_medio_macchina !== null && $countRecY !== null) {
  141. $tottemporisparmiato = (double)(($tempo_medio_persona - $tempo_medio_macchina) * $countRecY) / 3600.0;
  142. }
  143. if ($tempo_medio_macchina !== null && $countRecY !== null) {
  144. $tottempoelaborazionedati = (double)($tempo_medio_macchina * $countRecY) / 3600.0;
  145. }
  146. $differenzaGiorni = 5;
  147. $dMin7 = clone $d;
  148. $dMin7->sub(new \DateInterval("P{$differenzaGiorni}D"));
  149. $giornitot = $counters->totaliGiorni("P" . $d->format("Y-m-d"));
  150. $giorni = $counters->totaliGiorni("D" . $d->format("Y-m-d"));
  151. $giornisettimana = $counters->totaliGiorni("W" . $d->format("Y-W"));
  152. $giornimese = $counters->totaliGiorni("M" . $d->format("Y-m"));
  153. $pesitot = $counters->totaliPesi("P" . $d->format("Y-m-d"));
  154. $pesigiorno = $counters->totaliPesi("D" . $d->format("Y-m-d"));
  155. $pesisettimana = $counters->totaliPesi("W" . $d->format("Y-W"));
  156. $pesimese = $counters->totaliPesi("M" . $d->format("Y-m"));
  157. if ($giornitot !== FALSE && $pesitot !== FALSE) {
  158. $pesigiornomedio = ($giornitot > 0) ? ((float) $pesitot['valore']) / ((float) $giornitot) : 0.0;
  159. $pesigiornomediogiorno = $pesigiornomedio * $giorni;
  160. $pesigiornomediosettimana = $pesigiornomedio * $giornisettimana;
  161. $pesigiornomediomese = $pesigiornomedio * $giornimese;
  162. $pesigiornoincrementogiorno = ((int) ($pesigiornomediogiorno * 1000) > 0) ? ((((float) $pesigiorno['valore']) / $pesigiornomediogiorno) - 1) * 100.0 : FALSE;
  163. $pesigiornoincrementosettimana = ((int) ($pesigiornomediosettimana * 1000) > 0) ? ((((float) $pesisettimana['valore']) / $pesigiornomediosettimana) - 1) * 100.0 : FALSE;
  164. $pesigiornoincrementomese = ((int) ($pesigiornomediomese * 1000) > 0) ? ((((float) $pesimese['valore']) / $pesigiornomediomese) - 1) * 100.0 : FALSE;
  165. }
  166. else {
  167. $pesigiornoincrementogiorno = FALSE;
  168. $pesigiornoincrementosettimana = FALSE;
  169. $pesigiornoincrementomese = FALSE;
  170. }
  171. $volumitot = $counters->totaliVolumi("P" . $d->format("Y-m-d"));
  172. $volumigiorno = $counters->totaliVolumi("D" . $d->format("Y-m-d"));
  173. $volumisettimana = $counters->totaliVolumi("W" . $d->format("Y-W"));
  174. $volumimese = $counters->totaliVolumi("M" . $d->format("Y-m"));
  175. if ($giornitot !== FALSE && $volumitot !== FALSE) {
  176. $volgiornomedio = ($giornitot > 0) ? ((float) $volumitot['valore']) / ((float) $giornitot) : 0.0;
  177. $volgiornomediogiorno = $volgiornomedio * $giorni;
  178. $volgiornomediosettimana = $volgiornomedio * $giornisettimana;
  179. $volgiornomediomese = $volgiornomedio * $giornimese;
  180. $volgiornoincrementogiorno = ((int) ($volgiornomediogiorno * 1000) > 0) ? ((((float) $volumigiorno['valore']) / $volgiornomediogiorno) - 1) * 100.0 : FALSE;
  181. $volgiornoincrementosettimana = ((int) ($volgiornomediosettimana * 1000) > 0) ? ((((float) $volumisettimana['valore']) / $volgiornomediosettimana) - 1) * 100.0 : FALSE;
  182. $volgiornoincrementomese = ((int) ($volgiornomediomese * 1000) > 0) ? ((((float) $volumimese['valore']) / $volgiornomediomese) - 1) * 100.0 : FALSE;
  183. }
  184. else {
  185. $volgiornoincrementogiorno = FALSE;
  186. $volgiornoincrementosettimana = FALSE;
  187. $volgiornoincrementomese = FALSE;
  188. }
  189. $objtot = $counters->conteggiObj("P" . $d->format("Y-m-d"));
  190. $objgiorno = $counters->conteggiObj("D" . $d->format("Y-m-d"));
  191. if ($giornitot !== FALSE && $objtot !== FALSE) {
  192. $awbgiornomediogiorno = (float) (($giornitot > 0) ? ((float) $objtot['nawb']) / ((float) $giornitot) : 0.0) * $giorni;
  193. $objgiornomediogiorno = (($giornitot > 0) ? ((float) $objtot['nobj']) / ((float) $giornitot) : 0.0) * $giorni;
  194. $ncolligiornomediogiorno = (($giornitot > 0) ? ((float) $objtot['ncolli']) / ((float) $giornitot) : 0.0) * $giorni;
  195. $awbgiornoincrementogiorno = ((int) ($awbgiornomediogiorno * 1000) > 0) ? ((((float) $objtot['nawb']) / $awbgiornomediogiorno) - 1) * 100.0 : FALSE;
  196. $objgiornoincrementogiorno = ((int) ($objgiornomediogiorno * 1000) > 0) ? ((((float) $objtot['nobj']) / $objgiornomediogiorno) - 1) * 100.0 : FALSE;
  197. $ncolligiornoincrementogiorno = ((int) ($ncolligiornomediogiorno * 1000) > 0) ? ((((float) $objtot['ncolli']) / $ncolligiornomediogiorno) - 1) * 100.0 : FALSE;
  198. }
  199. else {
  200. $awbgiornomediogiorno = 0;
  201. $objgiornomediogiorno = 0;
  202. $ncolligiornomediogiorno = 0;
  203. $awbgiornoincrementogiorno = FALSE;
  204. $objgiornoincrementosettimana = FALSE;
  205. $ncolligiornoincrementomese = FALSE;
  206. }
  207. // 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']}");
  208. $totpesianno = $counters->totaliPesi("A" . $d->format("Y"));
  209. $totpesigiorno = $counters->totaliPesi("D" . $d->format("Y-m-d"));
  210. $totpesiannoparziale = $counters->totaliPesi("P" . $d->format("Y-m-d"));
  211. if ($totpesigiorno !== false) {
  212. if ($totpesiannoparziale !== FALSE) {
  213. $tempPesi = ((float) $totpesianno['valore']) - ((float) $totpesigiorno['valore']);
  214. }
  215. else {
  216. $tempPesi = (float) $totpesigiorno['valore'];
  217. }
  218. $incremento = ($tempPesi > 0) ? ((float) $totpesigiorno['valore'] / $tempPesi) * 100.0 : 0.0;
  219. }
  220. $sospesi = $counters->contaSospesi('A' . $d->format("Y"));
  221. $sql = "
  222. SELECT d.decvalue, IFNULL(t.termine, IFNULL(tdef.termine, d.decvalue)) AS termine
  223. FROM
  224. decode as d LEFT JOIN
  225. traduzioni AS t ON d.decvalue = t.idtermine AND t.area = 3 AND t.codice = ? LEFT JOIN
  226. traduzioni AS tdef ON d.decvalue = tdef.idtermine AND tdef.area = 3 AND tdef.codice = 'en'
  227. WHERE
  228. d.decclass = 'TIPOVETTORE'
  229. ORDER BY d.decorder ASC
  230. ";
  231. $stmt = $this->em->getConnection()->prepare($sql);
  232. $stmt->bindValue(1, $translator->getLocale(), \PDO::PARAM_STR);
  233. $deliveredby = $stmt->executeQuery()->fetchAllAssociative();
  234. //throw new \Exception(print_r($loginLog->getGeoLoc(), true));
  235. $loghipath = $this->getParameter('logo_path');
  236. $logoUrl = '';
  237. if ($azienda !== null) {
  238. $logoUrl = "$loghipath/" . $azienda->getLogo();
  239. }
  240. return [
  241. 'controller_name' => 'WelcomeController',
  242. 'deliveredby' => $deliveredby,
  243. 'data' => $data,
  244. 'delivered' => $delivered,
  245. 'mode' => $mode,
  246. 'warehouse' => $warehouse,
  247. 'customer' => $customer,
  248. 'target_annuale' => $translator->trans('welcome.on.target.year', array('%year%' => $d->format('Y'))),
  249. 'news' => $news,
  250. 'rilday' => $rilday,
  251. 'awbgestite' => $nawb,
  252. 'awbgestiteanno' => $nawbY,
  253. 'datenow' => $d,
  254. 'tempomediocollo' => $tempo_medio_macchina,
  255. 'recordstrasferiti' => $countRec,
  256. 'volumirilevati' => $formattatore->floatValue(($sumV === null) ? 0 : $sumV, 2, "", ""),
  257. 'pesirilevati' => $formattatore->floatValue(($sumW === null) ? 0: $sumW, 2, "", ""),
  258. 'totvolumirilevati' => $counters->totaliVolumi("A" . $d->format("Y")),
  259. 'totpesirilevati' => $counters->totaliPesi("A" . $d->format("Y")),
  260. 'pesigiornoincrementogiorno' => $pesigiornoincrementogiorno,
  261. 'pesigiornoincrementosettimana' => $pesigiornoincrementosettimana,
  262. 'pesigiornoincrementomese' => $pesigiornoincrementomese,
  263. 'pesigiorno' => $pesigiorno,
  264. 'pesisettimana' => $pesisettimana,
  265. 'pesimese' => $pesimese,
  266. 'volgiornoincrementogiorno' => $volgiornoincrementogiorno,
  267. 'volgiornoincrementosettimana' => $volgiornoincrementosettimana,
  268. 'volgiornoincrementomese' => $volgiornoincrementomese,
  269. 'volumigiorno' => $volumigiorno,
  270. 'volumisettimana' => $volumisettimana,
  271. 'volumimese' => $volumimese,
  272. 'awbgiornomediogiorno' => $awbgiornomediogiorno,
  273. 'objgiornomediogiorno' => $objgiornomediogiorno,
  274. 'ncolligiornomediogiorno' => $ncolligiornomediogiorno,
  275. 'objgiorno' => $objgiorno,
  276. 'totpesigiorno' => array('valore' => $totpesianno, 'incremento' => ''),
  277. // 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
  278. 'pesilimiti' => $counters->contaPesiLimiti("A" . $d->format("Y"), [100999, 1000999]),
  279. 'pesinocongruita' => $counters->totaliPesiNoCongruita("A" . $d->format("Y")),
  280. // 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
  281. 'volumilimiti' => $counters->contaVolumiLimiti("A" . $d->format("Y"), [999, 5999]),
  282. 'voluminocongruita' => $counters->totaliVolumiNoCongruita("A" . $d->format("Y")),
  283. // 'awbsosspese' => $counters->contaSospesi("R" . $dMin7->format("Y-m-d") . ';' . $d->format("Y-m-d")),
  284. 'awbsosspese' => ($sospesi !== FALSE) ? $sospesi['valore'] : '', //$counters->contaSospesi('R;' . $d->format("Y-m-d"))['val'],
  285. 'awbsosspesediffgiorni' => ($sospesi !== FALSE) ? $sospesi['data']->diff($d)->format("%a") : '', // $differenzaGiorni,
  286. 'tottemporisparmiato' => $formattatore->floatValue($tottemporisparmiato, 2, "", ""),
  287. 'totrecordtrasferiti' => $countRecY,
  288. 'tottempoelaborazionedati' => $formattatore->floatValue($tottempoelaborazionedati, 2, "", ""),
  289. 'numluoghi' => count($luoghi),
  290. 'listaluoghi' => $luoghi,
  291. 'listavettori' => $vettori,
  292. 'pageicon' => 'fa fa-search',
  293. 'logoazienda' => $azienda->getLogo(),
  294. 'logoUrl' => $logoUrl,
  295. 'fullname' => ($profilo !== null) ? $profilo->getNome() . ' ' . $profilo->getCognome() : $user->getFullname(),
  296. 'lastlogin' => ($loginLog != null) ? $loginLog->getDataLogin() : null,
  297. 'lastlogininfo' => ($loginLog != null) ? $loginLog->getGeoLoc() : null,
  298. 'filtri' => $filtri,
  299. ];
  300. }
  301. /**
  302. * @Route("/welcomejson", name="welcome_json", defaults={"data": "D"})
  303. * @Route("/welcomejson/{data}", name="welcome_json", defaults={"data": "D"})
  304. * @Route("/welcomejson/{data}/{filtri}", name="welcome_json", defaults={"data": "D","filtri":"N"})
  305. */
  306. public function welcomejson(TranslatorInterface $translator, Counters $counter, string $data = "D", string $filtri = "N"): JsonResponse {
  307. $value = $this->getValue($translator, $counter, $data, $filtri);
  308. return new JsonResponse($value);
  309. }
  310. /**
  311. * @Route("/secwelcome", name="welcome_page", defaults={"data": "D"})
  312. * @Route("/secwelcome/{data}", name="welcome_page", defaults={"data": "D"})
  313. * @Route("/secwelcome/{data}/{filtri}", name="welcome_page", defaults={"data": "D","filtri":"N"})
  314. */
  315. public function index(Session $session, TranslatorInterface $translator, Counters $counter, string $data = "D", string $filtri = "N")
  316. {
  317. $value = $this->getValue($translator, $counter, $data, $filtri);
  318. return $this->render('welcome/index.html.twig', $value);
  319. }
  320. private function LoginLog($user, $username, $action, $attuale, $request) {
  321. $ip = $request->getClientIp();
  322. $location = unserialize(file_get_contents('https://ipinfo.io/' . $ip . '/json')); //$_SERVER['REMOTE_ADDR']);
  323. $loginLog = new LoginLog();
  324. $loginLog->setUser($user);
  325. $loginLog->setUsername($username);
  326. $loginLog->setDataLogin(new \DateTime());
  327. $loginLog->setAttuale($attuale);
  328. $loginLog->setAAction($action);
  329. $loginLog->setAIp($ip);
  330. $loginLog->setAAgent($request->headers->get('User-Agent'));
  331. $loginLog->setGeoLoc($location);
  332. $this->em->persist($loginLog);
  333. $this->em->flush();
  334. }
  335. /**
  336. * @Route("/welcome", name="callbackwelcome_page")
  337. */
  338. public function callback(Request $request, Session $session, TranslatorInterface $translator)
  339. {
  340. $token = $this->okta->authorizeUser($request);
  341. if (!$token) {
  342. $this->LoginLog(null, "", 9005, 0, $request);
  343. return $this->redirectToRoute('security_errorlogin');
  344. }
  345. //throw new \Exception(print_r($token, true));
  346. $email = $token->email;
  347. $username = $token->preferred_username;
  348. $username = str_replace('@ent.bhicorp.com', '', $username);
  349. $user = $this->userRepository->loadUserByUsername($username);
  350. if ($user) {
  351. //throw new \Exception(print_r($token, true));
  352. $token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
  353. $this->tokenStorage->setToken($token);
  354. $this->session->set('_security_main', serialize($token));
  355. $query = "
  356. UPDATE login_log
  357. SET
  358. attuale = 0
  359. WHERE
  360. user_id = ?";
  361. $statement = $this->em->getConnection()->prepare($query);
  362. $statement->bindValue(1, $user->getId(), \PDO::PARAM_INT);
  363. $statement->execute();
  364. $this->LoginLog($user, $username, 9002, 1, $request);
  365. if ($this->getParameter('app.site_online') === 'Y') {
  366. return $this->redirectToRoute('welcome_page');
  367. }
  368. else {
  369. return $this->redirectToRoute('monitor_page');
  370. }
  371. } else {
  372. $this->LoginLog(null, $username, 9004, 0, $request);
  373. return $this->redirectToRoute('security_errorlogin');
  374. }
  375. }
  376. }