<?php
namespace KVBundle\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Pimcore\Model\DataObject\LadeeinheitArt;
use Pimcore\Model\DataObject\AuftragStatus;
use Pimcore\Model\DataObject\TransportlaufStatus;
use Pimcore\Model\DataObject\Bahnhof;
use Pimcore\Model\DataObject\SavedFilter;
use Symfony\Contracts\Translation\TranslatorInterface;
use Pimcore\Model\DataObject\SavedFilterZuege;
use Carbon\Carbon;
class DefaultController extends KombiVerkehrController
{
public function mobileAction(Request $request, TranslatorInterface $translator): Response
{
$appMode = 'mobile';
$userLoggedIn = $this->checkUserLoggedIn($request);
if ($userLoggedIn)
{
$userSessionData = $this->getUserSessionData();
$viewModel = [
'auftragStatusArray' => $this->getAuftragStatusArray($translator),
'transportlaufStatusArray' => $this->getTransportlaufStatusArray($translator),
'ladeeinheitArray' => $this->getLadeeinheitArray(),
'bahnhoefe' => $this->getBahnhofArray(),
'savedFilter' => $this->getSavedFilter(),
'savedFilterZuege' => $this->getSavedFilterZuege(),
'userPermissions' => json_encode($userSessionData['data']['PERMISSIONS']),
'geschaeftspartnerId' => $this->getGeschaeftspartnerId(),
'ansprechpartnerId' => $this->getLoginUserId(),
'email' => $userSessionData['catData']['email'],
'name' => $userSessionData['catData']['name'],
'appMode' => $appMode,
];
return $this->render("bundles/KVBundle/layouts/mobile/default-mobile.html.twig", $viewModel);
}
$redirect_suffix = '';
if ($request->getLocale() == 'en') {
$redirect_suffix = '_en';
}
return $this->login($request, $this->getParameter('kv_mobile_url') . $redirect_suffix, "Mobile" . $redirect_suffix, $appMode);
}
public function desktopAction(Request $request, TranslatorInterface $translator): Response
{
$appMode = 'desktop';
$userLoggedIn = $this->checkUserLoggedIn($request);
if ($userLoggedIn) {
// $translator->setlocale("en");
$userSessionData = $this->getUserSessionData();
$viewModel = [
'auftragStatusArray' => $this->getAuftragStatusArray($translator),
'transportlaufStatusArray' => $this->getTransportlaufStatusArray($translator),
'ladeeinheitArray' => $this->getLadeeinheitArray(),
'bahnhoefe' => $this->getBahnhofArray(),
'savedFilter' => $this->getSavedFilter(),
'savedFilterZuege' => $this->getSavedFilterZuege(),
'userPermissions' => json_encode($userSessionData['data']['PERMISSIONS']),
'geschaeftspartnerId' => $this->getGeschaeftspartnerId(),
'ansprechpartnerId' => $this->getLoginUserId(),
'email' => $userSessionData['catData']['email'],
'name' => $userSessionData['catData']['name'],
'appMode' => $appMode,
];
return $this->render("bundles/KVBundle/layouts/default.html.twig", $viewModel);
}
$redirect_suffix = '';
if ($request->getLocale() == 'en') {
$redirect_suffix = '_en';
}
return $this->login($request, $this->getParameter('kv_desktop_url') . $redirect_suffix, 'Desktop' . $redirect_suffix, $appMode);
}
public function login(Request $request, $redirect_uri, $redirect_name, $appMode){
if ($request->query->get('code'))
{
$content = $this->hwi->getAccessToken($request, $redirect_uri);
if(isset($content["access_token"]))
{
$access_token = array("access_token" =>$content["access_token"]);
$info = $this->hwi->getUserInformation($access_token);
$this->setLoggedInSessionKey($info);
}
else
{
//TODO think about a useful response/error when no token is received
return new Response('did not receive user auth token');
}
return $this->redirectToRoute($redirect_name);
}
else
{
$redirect_suffix = '';
if ($request->getLocale() == 'en') {
$redirect_suffix = '_en';
}
return $this->redirectToRoute("hwi_oauth_service_redirect", array("service" => "next_tuesday_" . $appMode . $redirect_suffix));
}
}
/**
* @Route("/logout", name="Logout")
*/
public function logoutAction(Request $request): Response
{
if ($request->getMethod() == "POST")
{
$userLoggedIn = $this->checkUserLoggedIn($request);
if ($userLoggedIn)
{
$this->removeUserSessionData();
return new Response('', Response::HTTP_OK);
}
return new Response('', Response::HTTP_NO_CONTENT);
}
return new Response('', Response::HTTP_METHOD_NOT_ALLOWED);
}
private function getAuftragStatusArray(TranslatorInterface $translator)
{
$auftragStatusListing = new AuftragStatus\Listing();
$auftragStatusArray = [];
foreach ($auftragStatusListing as $auftrag) {
$auftragStatusArray[$auftrag->getkv_id()]['auftragNameFormated'] = $translator->trans($auftrag->getName());
$auftragStatusArray[$auftrag->getkv_id()]['kv_id'] = $auftrag->getkv_id();
}
return $auftragStatusArray;
}
private function getTransportlaufStatusArray(TranslatorInterface $translator)
{
$transportlaufStatusListing = new TransportlaufStatus\Listing();
$transportlaufStatusArray = [];
foreach ($transportlaufStatusListing as $transportlauf) {
// Folgende Transportlaufstatus werden nicht genutzt als Filter: ABBESTELLT (6), AUSFALL_FTR (7), DEAKTIVIERT (8), ZWISCHENHALT (9)
if (in_array($transportlauf->getkv_id(), array(6, 7, 8, 9))) {
continue;
}
$transportlaufStatusArray[$transportlauf->getkv_id()]['auftragNameFormated'] = $translator->trans($transportlauf->getName());
$transportlaufStatusArray[$transportlauf->getkv_id()]['kv_id'] = $transportlauf->getkv_id();
}
return $transportlaufStatusArray;
}
private function getLadeeinheitArray()
{
$ladeeinheitListing = new LadeeinheitArt\Listing();
$ladeeinheitArray = [];
foreach ($ladeeinheitListing as $ladeeinheit) {
$ladeeinheitArray[$ladeeinheit->getCode()]['Code'] = $ladeeinheit->getCode();
$ladeeinheitArray[$ladeeinheit->getCode()]['kv_id'] = $ladeeinheit->getkv_id();
}
ksort($ladeeinheitArray);
return $ladeeinheitArray;
}
private function getBahnhofArray()
{
$bahnhofsListing = new Bahnhof\Listing();
$bahnhofsListing->setOrderKey("Langname");
$bahnhofsListing->setOrder("asc");
$bahnhofContainer = [];
foreach ($bahnhofsListing as $b) {
array_push($bahnhofContainer, array( "kv_id" => $b->getkv_id(), "label" => $b->getLangname() ));
}
$bahnhoefe = json_encode($bahnhofContainer, JSON_THROW_ON_ERROR, 512);
return $bahnhoefe;
}
private function getSavedFilter()
{
$loginUserId = $this->getLoginUserId();
$savedFilterListing = new SavedFilter\Listing();
$savedFilterListing->setCondition("user_id = $loginUserId");
$savedFilterListing->setOrderKey("Name");
$savedFilterListing->setOrder("asc");
$savedFilterContainer = [];
foreach ($savedFilterListing as $filter) {
$startdate = substr($filter->getStartdate(),0,10);
$enddate = substr($filter->getEnddate(),0,10);
$startdate_indikator = false;
$enddate_indikator = false;
// KV-129:
$creationDate = Carbon::createFromTimestamp($filter->getModificationDate(), 'Europe/Berlin')->format('Y-m-d');
if (!empty($startdate)) {
$startdate_indikator = $this->daysDiff($startdate, $creationDate);
$startdate = Carbon::createFromTimestamp(time(), 'Europe/Berlin') ->addDays($startdate_indikator)->format('Y-m-d');
}
if (!empty($enddate)) {
$enddate_indikator = $this->daysDiff($enddate, $creationDate);
$enddate = Carbon::createFromTimestamp(time(), 'Europe/Berlin')->addDays($enddate_indikator)->format('Y-m-d');
}
array_push($savedFilterContainer, array(
"id" => $filter->getId(),
"name" => $filter->getName(),
"uid" => $filter->getUser_id(),
"startdate" => $startdate,
"enddate" => $enddate,
"auftragStatus" => $filter->getAuftragStatus(),
"laufende" => $filter->getLaufende(),
"verspaetete" => $filter->getVerspaetete(),
"startterminalterm" => $filter->getStartterminalterm(),
"zielterminalterm" => $filter->getZielterminalterm(),
"startterminals" => $filter->getStartterminals(),
"zielterminals" => $filter->getZielterminals(),
"abholbereitSeit" => $filter->getAbholbereitSeit(),
"leArt" => $filter->getLeArt(),
"gefahrgut" => $filter->getGefahrgut(),
"abfall" => $filter->getAbfall(),
"zollpflicht" => $filter->getZollpflicht(),
"temperaturgefuehrt" => $filter->getTemperaturgefuehrt(),
"meineAuftraege" => $filter->getMeineAuftraege(),
"favorit" => $filter->getFavorit(),
"startdate_indikator" => $startdate_indikator,
"enddate_indikator" => $enddate_indikator
));
}
$savedFilter = json_encode($savedFilterContainer, JSON_THROW_ON_ERROR, 512);
return $savedFilter;
}
public function daysDiffToNow($date) {
$now = time();
$then = strtotime($date);
$datediff = $now - $then;
return round($datediff / (60 * 60 * 24));
}
public function daysDiff($date1, $date2) {
$date1 = strtotime($date1);
$date2 = strtotime($date2);
$datediff = $date1 - $date2;
return round($datediff / (60 * 60 * 24));
}
private function getSavedFilterZuege()
{
$loginUserId = $this->getLoginUserId();
$savedFilterZuegeListing = new SavedFilterZuege\Listing();
$savedFilterZuegeListing->setCondition("user_id = $loginUserId");
$savedFilterZuegeListing->setOrderKey("Name");
$savedFilterZuegeListing->setOrder("asc");
$savedFilterZuegeContainer = [];
foreach ($savedFilterZuegeListing as $filter) {
array_push($savedFilterZuegeContainer, array(
"id" => $filter->getId(),
"name" => $filter->getName(),
"uid" => $filter->getUser_id(),
"startdate" => substr($filter->getStartdate(),0,10),
"enddate" => substr($filter->getEnddate(),0,10) ,
"startterminalterm" => $filter->getStartterminalterm(),
"zielterminalterm" => $filter->getZielterminalterm(),
"startterminals" => $filter->getStartterminals(),
"zielterminals" => $filter->getZielterminals(),
"transportlaufStatus" => $filter->getTransportlaufStatus(),
"favorit" => $filter->getFavorit()
));
}
$savedFilterZuege = json_encode($savedFilterZuegeContainer, JSON_THROW_ON_ERROR, 512);
return $savedFilterZuege;
}
public function statisticAction(Request $request, TranslatorInterface $translator): Response
{
$userSessionData = $this->getUserSessionData();
$userLoggedIn = $this->checkUserLoggedIn($request);
if (empty($userLoggedIn)) {
http_response_code(401);
die;
}
$emailAddress = $userSessionData['data']['LOGIN'];
if ($userLoggedIn && strstr($emailAddress, 'krankikom.de') !== false)
{
$userSessionData = $this->getUserSessionData();
$viewModel = [
];
return $this->render("bundles/KVBundle/layouts/statistic.html.twig", $viewModel);
}
http_response_code(404);
die;
}
public function helpdeskAction(Request $request): Response
{
$userSessionData = $this->getUserSessionData();
$userLoggedIn = $this->checkUserLoggedIn($request);
if (empty($userLoggedIn) || ($userSessionData['data']['PERMISSIONS']['krankikom-orders-view-customers-orders'] !== true && $userSessionData['data']['LOGIN'] !== 'service.kombiverkehr@krankikom.de')) {
http_response_code(401);
die('Not authorized...');
}
$locale = 'de';
if ($request->getPathInfo() == '/helpdesk_en') {
$locale = 'en';
}
if ($userLoggedIn) {
$userSessionData = $this->getUserSessionData();
$this->catJsonWebservice->fetchGeschaeftspartnerCsvFromCat();
$sessionId = sha1(session_id());
$helpdeskData = [];
if (($handle = fopen("/tmp/gp.csv", "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$urlString = '#'.$data[0].'#'.$data[1]; // # + geschaeftspartnerId + # + loginUserId
$randomString = $this->getRandomString(20);
$urlString = $randomString . base64_encode($sessionId . $urlString);
$helpdeskData[$data[3].' - '.$data[2].' - '.$data[4].' ('.$data[0].' / '.$data[1].') '] = $urlString;
}
fclose($handle);
}
$viewModel = [
'users' => $helpdeskData,
'locale' => $locale
];
return $this->render("bundles/KVBundle/layouts/helpdesk.html.twig", $viewModel);
}
http_response_code(404);
die('Not found...');
}
public function getRandomString($random_string_length = 10): string
{
$characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$string = '';
$max = strlen($characters) - 1;
for ($i = 0; $i < $random_string_length; $i++) {
$string .= $characters[mt_rand(0, $max)];
}
return $string;
}
}