<?php
namespace KVBundle\Controller;
use DateInterval;
use DatePeriod;
use DateTime;
use DateTimeImmutable;
use DateTimeZone;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;
use Pimcore\Model\DataObject\Auftrag;
use Pimcore\Model\DataObject\AuftragJson;
use Symfony\Contracts\Translation\TranslatorInterface;
use Pimcore\Model\DataObject\Bahnhof;
use Pimcore\Model\DataObject\AuftragStatus;
use Pimcore\Model\DataObject\TransportlaufStatus;
use Pimcore\Model\DataObject\LadeeinheitArt;
use Carbon\Carbon;
use Pimcore\Model\DataObject\Folder as DataObjectFolder;
use Pimcore\Model\DataObject\SavedFilter;
use Pimcore\Model\DataObject\SavedFilterZuege;
use Pimcore\Model\DataObject\Teilstrecke;
use Pimcore\Model\DataObject\TeilstreckeJson;
use \Psr\Log\LoggerInterface;
class AjaxController extends KombiVerkehrController
{
/**
* @param Request $request
* @param TranslatorInterface $translator
*
* @Route("/data/auftraege")
*
* return Response
*/
public function getAuftraegeFromLocalOrCat(Request $request, TranslatorInterface $translator, LoggerInterface $kvUsageLogLogger): JsonResponse
{
if ($this->getHelpdeskMode() === false) {
if ($request->getMethod() !== "POST" || $this->checkUserLoggedIn($request) === false) {
return new JsonResponse(['success' => false, 'message' => Response::HTTP_METHOD_NOT_ALLOWED]);
}
}
$loginUserId = $this->getLoginUserId();
$geschaeftspartnerId = $this->getGeschaeftspartnerId();
// handle params
$limit = (int) $request->request->get('limit', 50);
$offset = (int) $request->request->get('offset', 0);
$loadFromKkDatabase = $request->request->get('loadFromKkDatabase', false);
$abfall = $request->request->get('abfall');
$abholbereitSeit = $request->request->get('abholbereitSeit');
$auftragStatus = $request->request->get('auftragStatus');
$endDate = $request->request->get('endDate');
$gefahrgut = $request->request->get('gefahrgut');
$laufende = $request->request->get('laufende');
$leArt = $request->request->get('leArt');
$meineAuftraege = $request->request->get('meineAuftraege');
$startDate = $request->request->get('startDate');
$startterminals = $request->request->get('startterminals');
$temperaturgefuehrt = $request->request->get('temperaturgefuehrt');
$verspaetete = $request->request->get('verspaetete');
$zielterminals = $request->request->get('zielterminals');
$zollpflicht = $request->request->get('zollpflicht');
$columnFilters = (array) $request->request->get('columnFilters');
$loadingTriggeredBy = $request->request->get('loadingTriggeredBy');
$unvollstaendig = $request->request->get('unvollstaendig');
$geaenderterAnnahmeschluss = $request->request->get('geaenderterAnnahmeschluss');
$abweichenderAbholbeginn = $request->request->get('abweichenderAbholbeginn');
$abholbereit = $request->request->get('abholbereit');
$schnellsuche = $request->request->get('schnellsuche');
$auftragIds = $request->request->get('auftragIds');
$debugString = 'limit='.$limit.'---offset='.$offset.'---loadFromKkDatabase='.$loadFromKkDatabase.'---abfall='.$abfall.'---abholbereitSeit='.$abholbereitSeit.'---auftragStatus='.$auftragStatus.'---endDate='.$endDate.'---gefahrgut='.$gefahrgut.'---laufende='.$laufende.'---leArt='.$leArt.'---meineAuftraege='.$meineAuftraege.'---startDate='.$startDate.'---startterminals='.$startterminals.'---temperaturgefuehrt='.$temperaturgefuehrt.'---verspaetete='.$verspaetete.'---zielterminals='.$zielterminals.'---zollpflicht='.$zollpflicht.'---columnFilters='.count($columnFilters).'---loadingTriggeredBy='.$loadingTriggeredBy.'---unvollstaendig='.$unvollstaendig.'---geaenderterAnnahmeschluss='.$geaenderterAnnahmeschluss.'---abweichenderAbholbeginn='.$abweichenderAbholbeginn.'---abholbereit='.$abholbereit.'---schnellsuche='.$schnellsuche.'---auftragIds='.$auftragIds;
// read Auftraege (from CAT or KK)
if ($loadFromKkDatabase === false || $loadFromKkDatabase === 'false') {
$sortParams = '';
$searchString = 'geschaeftspartnerId:' . $geschaeftspartnerId;
if (!empty($abholbereitSeit)) {
$searchString .= ',abholbereitSeit<' . $abholbereitSeit;
}
if ($meineAuftraege === 'true') {
$searchString .= ',erfasserKunde:' . $loginUserId;
}
if ($gefahrgut === 'true') {
$searchString .= ',gefahrgut:true';
}
// echo $auftragStatus;
if (isset($auftragStatus) && $auftragStatus != "") {
$s = explode(',', $auftragStatus);
foreach ($s as $status) {
$searchString .= ',auftragStatus:' . intval($status);
}
}
if ($abfall === 'true') {
$searchString .= ',abfall:true';
}
if (!empty($leArt)) {
$arten = explode(',', $leArt);
foreach ($arten as $art) {
$searchString .= ',leArtId:' . intval($art);
}
}
if (!empty($startDate)) {
$searchString .= ',datum>' . $startDate;
}
if (!empty($endDate)) {
$searchString .= ',datum<' . $endDate;
}
if (!empty($startterminals)) {
$terminals = explode(',', $startterminals);
foreach ($terminals as $t) {
$searchString .= ',versandTerminal:' . intval($t);
}
}
if (!empty($zielterminals)) {
$terminals = explode(',', $zielterminals);
foreach ($terminals as $t) {
$searchString .= ',empfangsTerminal:' . intval($t);
}
}
if ($temperaturgefuehrt === 'true') {
$searchString .= ',temperaturgefuehrt:true';
}
if ($zollpflicht === 'true') {
$searchString .= ',zollpflicht:true';
}
if (!empty($schnellsuche)) {
$time = strtotime("-1 year", time());
$datumMinusEinJahr = date("Ymd", $time);
$searchString .= ',schnellsucheAuftraege:' . $schnellsuche . ',datum>' . $datumMinusEinJahr . '-000000';
}
if (!empty($auftragIds)) {
$auftragIdsArray = explode(',', $auftragIds);
foreach ($auftragIdsArray as $a) {
$searchString .= ',auftragId:'.(int)$a;
}
}
$this->log('Reading Auftraege for geschaeftspartnerId ' . $geschaeftspartnerId . ', loginUserId ' . $loginUserId . ' from CAT', 3);
$auftragFolderId = DataObjectFolder::getByPath('/Aufträge/')->getId();
$oldAuftragJson = AuftragJson::getByLoginUserId($loginUserId);
foreach ($oldAuftragJson as $o) {
$o->delete();
}
$auftraegeArray = $this->catJsonWebservice->fetchAuftraegeByGeschaeftspartnerId($searchString, $sortParams);
$auftraege = json_encode($auftraegeArray);
\Pimcore\Cache::save($auftraege, 'auftrag-JSON-' . $geschaeftspartnerId . '-' . $loginUserId . $this->getHelpdeskSuffix(), [], 2592000, 0, true); // 30 Tage
$this->log('Done reading ' . count($auftraegeArray['auftraege']) . ' Auftraege for geschaeftspartnerId ' . $geschaeftspartnerId . ', loginUserId ' . $loginUserId . ' from CAT', 2);
// create cache
$unvollstaendigeAuftraegeArray = [];
$geaenderterAnnahmeschlussArray = [];
$abweichenderAbholbeginnArray = [];
$abholbereitArray = [];
$unvollstaendigeAuftraegeCounter = 0;
$geaenderterAnnahmeschlussCounter = 0;
$abweichenderAbholbeginnCounter = 0;
$abholbereitCounter = 0;
$this->log('Creating Auftrag Items-Object-Cache for geschaeftspartnerId ' . $geschaeftspartnerId . ', loginUserId ' . $loginUserId.' - triggered by CAT DATA LOAD', 3);
foreach ($auftraegeArray['auftraege'] as $key => $a) {
\Pimcore\Cache::save($a, 'auftrag-' . $a['auftragId'] . '-' . $geschaeftspartnerId . '-' . $loginUserId, [], 300, 0, true);
if ($a['datenVollstaendig'] === false) {
array_push($unvollstaendigeAuftraegeArray, $a);
$unvollstaendigeAuftraegeCounter++;
}
if ($a['abweichungGeplanteAnlieferungAnnahmeschluss'] || $a['abweichungAnnahmeschlussGelesen'] === false) {
array_push($geaenderterAnnahmeschlussArray, $a);
$geaenderterAnnahmeschlussCounter++;
}
if ($a['abweichungAbholbeginn']) {
array_push($abweichenderAbholbeginnArray, $a);
$abweichenderAbholbeginnCounter++;
}
if ($a['auftragStatus'] == 7) {
array_push($abholbereitArray, $a);
$abholbereitCounter++;
}
}
\Pimcore\Cache::save($unvollstaendigeAuftraegeArray, 'auftrag-unvollstaendig-' . $geschaeftspartnerId . '-' . $loginUserId . $this->getHelpdeskSuffix(), [], 2592000, 0, true);
\Pimcore\Cache::save($geaenderterAnnahmeschlussArray, 'auftrag-geaenderter-annahmeschluss-' . $geschaeftspartnerId . '-' . $loginUserId . $this->getHelpdeskSuffix(), [], 2592000, 0, true);
\Pimcore\Cache::save($abweichenderAbholbeginnArray, 'auftrag-abweichung-abholbeginn-' . $geschaeftspartnerId . '-' . $loginUserId . $this->getHelpdeskSuffix(), [], 2592000, 0, true);
\Pimcore\Cache::save($abholbereitArray, 'auftrag-abholbereit-' . $geschaeftspartnerId . '-' . $loginUserId . $this->getHelpdeskSuffix(), [], 2592000, 0, true);
\Pimcore\Cache::save($unvollstaendigeAuftraegeCounter, 'auftrag-unvollstaendig-counter-' . $geschaeftspartnerId . '-' . $loginUserId . $this->getHelpdeskSuffix(), [], 2592000, 0, true);
\Pimcore\Cache::save($geaenderterAnnahmeschlussCounter, 'auftrag-geaenderter-annahmeschluss-counter-' . $geschaeftspartnerId . '-' . $loginUserId . $this->getHelpdeskSuffix(), [], 2592000, 0, true);
\Pimcore\Cache::save($abweichenderAbholbeginnCounter, 'auftrag-abweichung-abholbeginn-counter-' . $geschaeftspartnerId . '-' . $loginUserId . $this->getHelpdeskSuffix(), [], 2592000, 0, true);
\Pimcore\Cache::save($abholbereitCounter, 'auftrag-abholbereit-counter-' . $geschaeftspartnerId . '-' . $loginUserId . $this->getHelpdeskSuffix(), [], 2592000, 0, true);
// for statistics only
$userSessionData = $this->getUserSessionData();
$kvUsageLogLogger->info('auftrag-data-load', array('loginUserId' => $loginUserId, 'email' => $userSessionData['data']['LOGIN'], 'count_auftraege' => count($auftraegeArray['auftraege'])));
} else {
$auftraegeArray = $this->getAuftrageArrayByLoginUser();
$unvollstaendigeAuftraegeCounter = \Pimcore\Cache::load('auftrag-unvollstaendig-counter-' . $geschaeftspartnerId . '-' . $loginUserId . $this->getHelpdeskSuffix());
$geaenderterAnnahmeschlussCounter = \Pimcore\Cache::load('auftrag-geaenderter-annahmeschluss-counter-' . $geschaeftspartnerId . '-' . $loginUserId . $this->getHelpdeskSuffix());
$abweichenderAbholbeginnCounter = \Pimcore\Cache::load('auftrag-abweichung-abholbeginn-counter-' . $geschaeftspartnerId . '-' . $loginUserId . $this->getHelpdeskSuffix());
$abholbereitCounter = \Pimcore\Cache::load('auftrag-abholbereit-counter-' . $geschaeftspartnerId . '-' . $loginUserId . $this->getHelpdeskSuffix());
}
$countAllAuftraegeInDb = count($auftraegeArray['auftraege']);
if ($columnFilters) {
$countAllAuftraegeInDb = 0;
$unvollstaendigeAuftraegeCounter = 0;
$geaenderterAnnahmeschlussCounter = 0;
$abweichenderAbholbeginnCounter = 0;
$abholbereitCounter = 0;
} else {
if ($unvollstaendig) {
$auftraegeArray['auftraege'] = \Pimcore\Cache::load('auftrag-unvollstaendig-' . $geschaeftspartnerId . '-' . $loginUserId . $this->getHelpdeskSuffix());
} else if ($geaenderterAnnahmeschluss) {
$auftraegeArray['auftraege'] = \Pimcore\Cache::load('auftrag-geaenderter-annahmeschluss-' . $geschaeftspartnerId . '-' . $loginUserId . $this->getHelpdeskSuffix());
} else if ($abweichenderAbholbeginn) {
$auftraegeArray['auftraege'] = \Pimcore\Cache::load('auftrag-abweichung-abholbeginn-' . $geschaeftspartnerId . '-' . $loginUserId . $this->getHelpdeskSuffix());
} else if ($abholbereit) {
$auftraegeArray['auftraege'] = \Pimcore\Cache::load('auftrag-abholbereit-' . $geschaeftspartnerId . '-' . $loginUserId . $this->getHelpdeskSuffix());
}
$auftraegeArray['auftraege'] = array_slice($auftraegeArray['auftraege'], $offset, $limit);
}
$timingBegin = microtime(true);
$returnAuftraege = [];
$returnAuftraege['auftraege'] = [];
$offsetCounter = 0;
$addedAuftraegeCounter = 0;
if (isset($auftraegeArray['auftraege'])) {
$this->log('Creating Auftraege for geschaeftspartnerId ' . $geschaeftspartnerId . ', loginUserId ' . $loginUserId, 3);
foreach ($auftraegeArray['auftraege'] as $index => $a) {
$a = (array) $a;
$auftrag = $this->createAuftragObjectFromArrayData($a);
$unvollstaendigFlag = false;
$geaenderterAnnahmeschlussFlag = false;
$abweichenderAbholbeginnFlag = false;
$abholbereitFlag = false;
$addAuftrag = true;
if ($columnFilters) {
$addAuftrag = $this->checkColumnFilters($auftrag, $columnFilters);
if ($addAuftrag) {
$countAllAuftraegeInDb++;
// UNVOLLSTĂ„NDIG JA/NEIN
if ($auftrag->getDatenVollstaendig() == false) {
$unvollstaendigFlag = true;
$unvollstaendigeAuftraegeCounter++;
if ($unvollstaendig) {
if (!$unvollstaendigFlag) {
$addAuftrag = false;
}
}
}
// geaenderterAnnahmeschluss JA/NEIN
if ($auftrag->getAbweichungGeplanteAnlieferungAnnahmeschluss() || !$auftrag->getAbweichungAnnahmeschlussGelesen()) {
$geaenderterAnnahmeschlussFlag = true;
$geaenderterAnnahmeschlussCounter++;
if ($geaenderterAnnahmeschluss) {
if (!$geaenderterAnnahmeschlussFlag) {
$addAuftrag = false;
}
}
}
// abweichenderAbholbeginnFlag JA/NEIN
if ($auftrag->getAbweichungAbholbeginn()) {
$abweichenderAbholbeginnFlag = true;
$abweichenderAbholbeginnCounter++;
if ($abweichenderAbholbeginn) {
if (!$abweichenderAbholbeginnFlag) {
$addAuftrag = false;
}
}
}
// abholbereitFlag JA/NEIN
if ($auftrag->getAuftragStatus() == 7) {
$abholbereitFlag = true;
$abholbereitCounter++;
if ($abholbereit) {
if (!$abholbereitFlag) {
$addAuftrag = false;
}
}
}
}
if ($addAuftrag == true && $offset > $offsetCounter) {
$offsetCounter++;
$addAuftrag = false;
continue; // offset to small --> go to next one...
}
if ($addedAuftraegeCounter >= $limit) {
$addAuftrag = false;
continue; // we're already above the limit --> but we have to loop until the end, because we need the total count for $countAllAuftraegeInDb
}
}
if ($addAuftrag) {
$returnAuftraege['auftraege'][$auftrag->getAuftragId()] = array(
// 'maxAnzahlErreicht' => $auftrag->getMaxAnzahlErreicht(),
'geschaeftspartnerId' => $auftrag->getGeschaeftspartnerId(),
'auftragId' => $auftrag->getAuftragId(),
'abfall' => $auftrag->getAbfall(),
'abholbeginn' => $auftrag->getAbholbeginn(),
'abholbereitSeit' => $auftrag->getAbholbereitSeit(),
'aktuellerTerminal' => $auftrag->getAktuellerTerminal(),
'anlieferArt' => $auftrag->getAnlieferArt(),
'anlieferArtText' => $this->getLieferartById($auftrag->getAnlieferArt(), $translator),
'anlieferCode' => $auftrag->getAnlieferCode(),
'anlieferung' => $auftrag->getAnlieferung(),
'annahmeschluss' => $auftrag->getAnnahmeschluss(),
'auftragStatus' => $auftrag->getAuftragStatus(),
'auslieferArt' => $auftrag->getAuslieferart(),
'auslieferArtText' => $this->getLieferartById($auftrag->getAuslieferart(), $translator),
'beladezustand' => $auftrag->getBeladezustand(),
'bereitstellung' => $auftrag->getBereitstellung(),
'bruttogewicht' => $auftrag->getBruttogewicht(),
'buchenderKunde' => $auftrag->getBuchenderKunde(),
'nameBuchenderKunde' => $auftrag->getNameBuchenderKunde(),
'daten_vollständig' => $auftrag->getDatenVollstaendig(),
'empfaenger' => $auftrag->getEmpfaenger(),
'nameEmpfaenger' => $auftrag->getNameEmpfaenger(),
'empfangsLadestelle' => $auftrag->getEmpfangsLadestelle(),
'empfangsTerminal' => $auftrag->getEmpfangsTerminal(),
'nameErfasserKunde' => $auftrag->getNameErfasserKunde(),
'erfasserKunde' => $auftrag->getErfasserKunde(),
'freistellCode' => $auftrag->getFreistellCode(),
'freigestellt' => $auftrag->getFreigestellt(),
'gefahrgut' => $auftrag->getGefahrgut(),
'gelesen' => $auftrag->getGelesen(),
'gelesenVon' => $auftrag->getGelesenVon(),
// 'abweichungAnnahmeschlussGelesen' => $auftrag->getAbweichungAnnahmeschlussGelesen(),
'abweichungAnnahmeschlussGelesen' => true, // KV-121
'kundenreferenz' => $auftrag->getKundenreferenz(),
'ladegut' => $auftrag->getLadegut(),
'leArt' => $auftrag->getLeArt(),
'leBauart' => $auftrag->getLeBauart(),
'leNummer' => $auftrag->getLeNummer(),
'nettogewicht' => $auftrag->getNettogewicht(),
'rechnungsEmpfaenger' => $auftrag->getRechnungsEmpfaenger(),
'nameRechnungsEmpfaenger' => $auftrag->getNameRechnungsEmpfaenger(),
'taragewicht' => $auftrag->getTaragewicht(),
'temperaturgefuehrt' => $auftrag->getTemperaturgefuehrt(),
'versandLadestelle' => $auftrag->getVersandLadestelle(),
'versandTerminal' => $auftrag->getVersandTerminal(),
'versender' => $auftrag->getVersender(),
'nameVersender' => $auftrag->getNameVersender(),
'zollpflicht' => $auftrag->getZollpflicht(),
'aktuelleTeilstrecke' => $auftrag->getAktuelleTeilstrecke(),
'erwarteteAbweichungSeconds' => $auftrag->getErwarteteAbweichungSeconds(),
'anzAuftraegeAufZug' => $auftrag->getAnzAuftraegeAufZug(),
'startterminal' => $auftrag->getStartterminal(),
'zielterminal' => $auftrag->getZielterminal(),
'status' => $auftrag->getStatus(),
'abweichungGeplanteAnlieferungAnnahmeschluss' => $auftrag->getAbweichungGeplanteAnlieferungAnnahmeschluss(),
'abweichungAbholbeginn' => $auftrag->getAbweichungAbholbeginn(),
'transportUnterbrochen' => $auftrag->getTransportUnterbrochen(),
);
$addedAuftraegeCounter++;
}
}
}
$returnAuftraege['countAllAuftraegeInDb'] = $countAllAuftraegeInDb;
$returnAuftraege['maxAnzahlErreicht'] = $auftraegeArray['maxAnzahlErreicht'];
$returnAuftraege['unvollstaendigeAuftraegeCounter'] = $unvollstaendigeAuftraegeCounter;
$returnAuftraege['geaenderterAnnahmeschlussCounter'] = $geaenderterAnnahmeschlussCounter;
$returnAuftraege['abweichenderAbholbeginnCounter'] = $abweichenderAbholbeginnCounter;
$returnAuftraege['abholbereitCounter'] = $abholbereitCounter;
$returnAuftraege['isAbweichenderAbholbeginn'] = $abweichenderAbholbeginn;
$returnAuftraege['isGeaenderterAnnahmeschluss'] = $geaenderterAnnahmeschluss;
$returnAuftraege['isUnvollstaendigeAuftraege'] = $unvollstaendig;
$returnAuftraege['isAbholbereit'] = $abholbereit;
$timingEnd = microtime(true);
$this->log('Done creating ' . $addedAuftraegeCounter . ' Auftraege for geschaeftspartnerId ' . $geschaeftspartnerId . ', loginUserId ' . $loginUserId . ' (' . number_format(($timingEnd - $timingBegin), 3) . 's) '.$debugString, 1);
return $this->json([
"success" => true,
"data" => $returnAuftraege
]);
}
/**
* @return array
*/
public function getAuftrageArrayByLoginUser(): array
{
$loginUserId = $this->getLoginUserId();
$geschaeftspartnerId = $this->getGeschaeftspartnerId();
$timingBegin = microtime(true);
$this->log('Reading Auftraege for geschaeftspartnerId ' . $geschaeftspartnerId . ', loginUserId ' . $loginUserId . ' from KK DB', 3);
// $auftragJson = new AuftragJson\Listing();
// $auftragJson->setCondition('loginUserId = ? ', [$loginUserId]);
// foreach ($auftragJson as $key => $auftrag) {
// $auftraegeArray = $auftrag->getJson();
// $auftraegeArray = (array) json_decode($auftraegeArray, true);
// }
$auftragJson = \Pimcore\Cache::load('auftrag-JSON-' . $geschaeftspartnerId . '-' . $loginUserId . $this->getHelpdeskSuffix());
$auftraegeArray = (array) json_decode($auftragJson, true);
$timingEnd = microtime(true);
$this->log('Done reading ' . count($auftraegeArray['auftraege']) . ' Auftraege for geschaeftspartnerId ' . $geschaeftspartnerId . ', loginUserId ' . $loginUserId . ' from KK DB (' . number_format(($timingEnd - $timingBegin), 3) . 's)', 2);
return $auftraegeArray;
}
/**
* @param array $a
*
* @return Auftrag
*/
public function createAuftragObjectFromArrayData(array $a)
{
$loginUserId = $this->getLoginUserId();
$geschaeftspartnerId = $this->getGeschaeftspartnerId();
$auftragFolderId = DataObjectFolder::getByPath('/Aufträge/')->getId();
$auftrag = new Auftrag();
// general system info
$auftrag->setLoginUserId($loginUserId);
$auftrag->setKey($geschaeftspartnerId . '-' . $loginUserId . '-' . $a['auftragId']); // anzeigename im pimcore cms listing
$auftrag->setParentId($auftragFolderId);
// KV data
// $auftrag->setMaxAnzahlErreicht($auftraegeArray['maxAnzahlErreicht']);
$auftrag->setGeschaeftspartnerId($geschaeftspartnerId);
$auftrag->setAuftragId($a['auftragId']);
$auftrag->setAbfall($a['abfall']);
// $auftrag->setAbholbeginn(!empty($a['abholbeginn']) ? Carbon::createFromTimeString($a['abholbeginn'], 'Europe/Berlin') : null);
$auftrag->setAbholbeginn(!empty($a['abholbeginnETP']) ? Carbon::createFromTimeString($a['abholbeginnETP'], 'Europe/Berlin') : null);
$auftrag->setAbholbereitSeit(!empty($a['abholbereitSeit']) ? Carbon::createFromTimeString($a['abholbereitSeit'], 'Europe/Berlin') : null);
$auftrag->setAktuellerTerminal($a['aktuellerTerminal']);
$auftrag->setAnlieferArt($a['anlieferArt']);
$auftrag->setAnlieferCode($a['anlieferCode']);
$auftrag->setAnlieferung(!empty($a['anlieferung']) ? Carbon::createFromTimeString($a['anlieferung'], 'Europe/Berlin') : null);
$auftrag->setAnnahmeschluss(!empty($a['annahmeschluss']) ? Carbon::createFromTimeString($a['annahmeschluss'], 'Europe/Berlin') : null);
$auftrag->setAuftragStatus($a['auftragStatus']);
$auftrag->setAuslieferart($a['auslieferart']);
$auftrag->setBeladezustand($a['beladezustand']);
$auftrag->setBereitstellung(!empty($a['bereitstellung']) ? Carbon::createFromTimeString($a['bereitstellung'], 'Europe/Berlin') : null);
$auftrag->setBruttogewicht($a['bruttogewicht']);
$auftrag->setBuchenderKunde($a['buchenderKunde']);
$auftrag->setNameBuchenderKunde($a['nameBuchenderKunde']);
$auftrag->setDatenVollstaendig($a['datenVollstaendig']);
$auftrag->setEmpfaenger($a['empfaenger']);
$auftrag->setNameEmpfaenger($a['nameEmpfaenger']);
$auftrag->setEmpfangsLadestelle($a['empfangsLadestelle']);
$auftrag->setEmpfangsTerminal($a['empfangsTerminal']);
$auftrag->setNameErfasserKunde($a['nameErfasserKunde']);
$auftrag->setErfasserKunde($a['erfasserKunde']);
$auftrag->setFreistellCode($a['freistellCode']);
$auftrag->setFreigestellt(!empty($a['freigestellt']) ? Carbon::createFromTimeString($a['freigestellt'], 'Europe/Berlin') : null);
$auftrag->setGefahrgut($a['gefahrgut']);
$auftrag->setGelesen($a['gelesen']);
$auftrag->setGelesenVon($a['gelesenVon']);
$auftrag->setAbweichungAnnahmeschlussGelesen($a['abweichungAnnahmeschlussGelesen']);
$auftrag->setKundenreferenz($a['kundenreferenz']);
$auftrag->setLadegut($a['ladegut']);
$auftrag->setLeArt($this->getLadeeinheitById($a['leArtId']));
$auftrag->setLeBauart($a['leBauart']);
$auftrag->setLeNummer($a['leNummer']);
$auftrag->setNettogewicht($a['nettogewicht']);
$auftrag->setRechnungsEmpfaenger($a['rechnungsEmpfaenger']);
$auftrag->setNameRechnungsEmpfaenger($a['nameRechnungsEmpfaenger']);
$auftrag->setTaragewicht($a['taragewicht']);
$auftrag->setTemperaturgefuehrt($a['temperaturgefuehrt']);
$auftrag->setVersandLadestelle($a['versandLadestelle']);
$auftrag->setVersandTerminal($a['versandTerminal']);
$auftrag->setVersender($a['versender']);
$auftrag->setNameVersender($a['nameVersender']);
$auftrag->setZollpflicht($a['zollpflicht']);
$auftrag->setAktuelleTeilstrecke($a['aktuelleTeilstrecke']);
$auftrag->setErwarteteAbweichungSeconds($a['erwarteteAbweichungSeconds']);
// $auftrag->setAnzAuftraegeAufZug($a['anzAuftraegeAufZug']);
$auftrag->setAbweichungGeplanteAnlieferungAnnahmeschluss($a['abweichungGeplanteAnlieferungAnnahmeschluss']);
$auftrag->setAbweichungAbholbeginn($a['abweichungAbholbeginn']);
$auftrag->setTransportUnterbrochen($a['transportUnterbrochen']);
// add/map some data
$auftrag->setStartterminal($this->getStartterminalNameById($auftrag->getVersandTerminal()));
$auftrag->setZielterminal($this->getZielterminalNameById($auftrag->getEmpfangsTerminal()));
$auftrag->setStatus($this->getAuftragStatusById($auftrag->getAuftragStatus()));
$auftrag->setPublished(true);
return $auftrag;
}
public function checkColumnFilters($object, array $columnFilters)
{
$ok = true;
foreach ($columnFilters as $filter) {
$ok = $this->checkFilters($object, $filter["identifier"], $filter["value"], $filter["filtertype"], $filter["callfunction"]);
if (!$ok) {
return false;
};
}
return $ok;
}
public function checkFilters($object, $field, $searchValue, $filtertype, $callfunction)
{
$ok = false;
$value = strtolower($object->$callfunction());
switch ($field) {
case 'annahmeschluss':
case 'anlieferung':
case 'bereitstellung':
case 'abholbereitSeit':
case 'freigestellt':
case 'abholbeginn':
// $searchValue = str_replace('.', '-', $searchValue);
$arr = explode('.', $searchValue);
$searchValue = implode('-', array_reverse($arr));
break;
}
switch ($filtertype) {
case 'text':
if (str_contains($value, strtolower($searchValue))) {
$ok = true;
}
break;
}
return $ok;
}
/**
* @param Request $request
*
* @Route("/data/auftraege-meta")
*
* return Response
*/
public function getAuftragTransportlaufData(Request $request): JsonResponse
{
if ($request->getMethod() !== "POST" || $this->checkUserLoggedIn($request) === false) {
return new JsonResponse(['success' => false, 'message' => Response::HTTP_METHOD_NOT_ALLOWED]);
}
$loginUserId = $this->getLoginUserId();
$geschaeftspartnerId = $this->getGeschaeftspartnerId();
$timingBegin = microtime(true);
$this->log('Creating TransportlaufData (Aufträge) for geschaeftspartnerId ' . $geschaeftspartnerId . ', loginUserId ' . $loginUserId, 3);
$returnData = [];
$success = false;
$auftragIdsString = $request->request->get('auftragIds');
$auftragIdsString = trim($auftragIdsString, ',');
$auftragIdsArray = explode(',', $auftragIdsString);
if ($auftragIdsString && strlen($auftragIdsString) > 0) {
$success = true;
$transportlaufDataArray = $this->catJsonWebservice->fetchTransportlaufDataFromCat();
foreach ($auftragIdsArray as $key => $auftragId) {
$auftrag = $this->getAuftragById($auftragId);
$transportlaufIndex = array_search($auftrag->getAktuelleTeilstrecke(), array_column($transportlaufDataArray, 'teilstrecke'));
if ($transportlaufIndex !== false) {
$transportlaufData = $transportlaufDataArray[$transportlaufIndex];
$transportlaufData['success'] = true;
$returnData[$auftrag->getAuftragId()] = $transportlaufData;
} else {
$returnData[$auftrag->getAuftragId()] = ['success' => false];
}
}
}
$timingEnd = microtime(true);
$this->log('Done creating TransportlaufData (Aufträge) (' . count($auftragIdsArray) . ' Auftraege) for geschaeftspartnerId ' . $geschaeftspartnerId . ', loginUserId ' . $loginUserId . ' (' . number_format(($timingEnd - $timingBegin), 3) . 's)', 2);
// for statistics only
\Pimcore\Cache::save($loginUserId, 'idle-user-count-' . $geschaeftspartnerId . '-' . $loginUserId, ['idle-user-count'], 600, 0, false);
return $this->json([
"success" => $success,
"data" => $returnData
]);
}
/**
* @param Request $request
*
* @Route("/data/zuege-meta")
*
* return Response
*/
public function getZuegeTransportlaufData(Request $request): JsonResponse
{
if ($request->getMethod() !== "POST" || $this->checkUserLoggedIn($request) === false) {
return new JsonResponse(['success' => false, 'message' => Response::HTTP_METHOD_NOT_ALLOWED]);
}
$loginUserId = $this->getLoginUserId();
$geschaeftspartnerId = $this->getGeschaeftspartnerId();
$timingBegin = microtime(true);
$this->log('Creating TransportlaufData (ZĂĽge) for geschaeftspartnerId ' . $geschaeftspartnerId . ', loginUserId ' . $loginUserId, 3);
$returnData = [];
$success = false;
$teilstreckeIdsString = $request->request->get('teilstreckeIds');
$teilstreckeIdsString = trim($teilstreckeIdsString, ',');
$teilstreckeIdsArray = explode(',', $teilstreckeIdsString);
if ($teilstreckeIdsString && strlen($teilstreckeIdsString) > 0) {
$success = true;
$transportlaufDataArray = $this->catJsonWebservice->fetchTransportlaufDataFromCat();
foreach ($teilstreckeIdsArray as $key => $teilstreckeId) {
//$auftrag = $this->getAuftragById($auftragId);
$transportlaufIndex = array_search($teilstreckeId, array_column($transportlaufDataArray, 'teilstrecke'));
if ($transportlaufIndex !== false) {
$transportlaufData = $transportlaufDataArray[$transportlaufIndex];
$transportlaufData['success'] = true;
$returnData[$teilstreckeId] = $transportlaufData;
} else {
$returnData[$teilstreckeId] = ['success' => false];
}
}
}
$timingEnd = microtime(true);
$this->log('Done creating TransportlaufData (ZĂĽge) (' . count($teilstreckeIdsArray) . ' ZĂĽge) for geschaeftspartnerId ' . $geschaeftspartnerId . ', loginUserId ' . $loginUserId . ' (' . number_format(($timingEnd - $timingBegin), 3) . 's)', 2);
return $this->json([
"success" => $success,
"data" => $returnData
]);
}
/**
* @param Request $request
*
* @Route("/data/auftrag-detail")
*
* return Response
*/
public function getAuftragDetailData(Request $request): JsonResponse
{
if ($request->getMethod() !== "POST" || $this->checkUserLoggedIn($request) === false) {
return new JsonResponse(['success' => false, 'message' => Response::HTTP_METHOD_NOT_ALLOWED]);
}
$loginUserId = $this->getLoginUserId();
$geschaeftspartnerId = $this->getGeschaeftspartnerId();
$auftragId = $request->request->get('auftragId');
$auftragDetailData = [];
$timingBegin = microtime(true);
$this->log('Creating AuftragDetail for Auftrag ' . $auftragId . ' for geschaeftspartnerId ' . $geschaeftspartnerId . ', loginUserId ' . $loginUserId, 3);
$success = false;
if (!empty($auftragId)) {
$auftrag = $this->getAuftragById($auftragId);
if ($auftrag) {
$success = true;
$auftragDetailData = $this->catJsonWebservice->fetchAuftragDetailDataFromCat($auftragId);
}
}
$timingEnd = microtime(true);
$this->log('Done creating AuftragDetail for Auftrag ' . $auftragId . ' (success = ' . $success . ') for geschaeftspartnerId ' . $geschaeftspartnerId . ', loginUserId ' . $loginUserId . ' (' . number_format(($timingEnd - $timingBegin), 3) . 's)', 2);
return $this->json([
"success" => $success,
"data" => $auftragDetailData
]);
}
/**
* @param int $auftragId
*
* @return Auftrag $auftrag
*/
public function getAuftragById(int $auftragId): Auftrag|bool
{
$loginUserId = $this->getLoginUserId();
$geschaeftspartnerId = $this->getGeschaeftspartnerId();
$cacheKey = 'auftrag-' . $auftragId . '-' . $geschaeftspartnerId . '-' . $loginUserId;
$auftrag = \Pimcore\Cache::load($cacheKey);
if (!$auftrag) {
$this->log('Creating Auftrag Items-Object-Cache for geschaeftspartnerId ' . $geschaeftspartnerId . ', loginUserId ' . $loginUserId.' - triggered by auftragID = '.$auftragId, 2);
$auftraegeArray = $this->getAuftrageArrayByLoginUser();
foreach ($auftraegeArray['auftraege'] as $key => $a) {
\Pimcore\Cache::save($a, 'auftrag-' . $a['auftragId'] . '-' . $geschaeftspartnerId . '-' . $loginUserId, [], 300);
if ($auftragId == $a['auftragId']) {
$auftrag = $a;
}
}
}
if ($auftrag) {
return $this->createAuftragObjectFromArrayData($auftrag);
} else {
return false;
}
}
/**
* @param Request $request
*
* @Route("/data/savedfilter-delete")
*
* return Response
*/
public function deleteSavedfilter(Request $request): JsonResponse
{
$loginUserId = $this->getLoginUserId();
$geschaeftspartnerId = $this->getGeschaeftspartnerId();
$savedId = $request->request->get('id');
if (is_numeric($savedId)) {
$savedFilter = \Pimcore\Model\DataObject::getById($savedId);
if ($savedFilter->getUser_id() == $loginUserId) {
$savedFilter->delete();
}
}
return $this->json([
"success" => true
]);
}
/**
* @param Request $request
*
* @Route("/data/savedfilter-favorite")
*
* return Response
*/
public function setFavoritefilter(Request $request): JsonResponse
{
if ($this->getHelpdeskMode() === true) {
return new JsonResponse(['success' => false, 'message' => Response::HTTP_METHOD_NOT_ALLOWED]);
}
$loginUserId = $this->getLoginUserId();
$geschaeftspartnerId = $this->getGeschaeftspartnerId();
$savedId = $request->request->get('id');
$type = $request->request->get('type');
if (is_numeric($savedId)) {
if ($type == "Zuege") {
$savedFilterListing = new SavedFilterZuege\Listing();
} else {
$savedFilterListing = new SavedFilter\Listing();
}
$savedFilterListing->setCondition("user_id = $loginUserId");
$savedFilterListing->setCondition("favorit = 1");
foreach ($savedFilterListing as $filter) {
$filter->setFavorit(0);
$filter->save();
}
$savedFilter = \Pimcore\Model\DataObject::getById($savedId);
if ($savedFilter->getUser_id() == $loginUserId) {
$savedFilter->setFavorit(1);
$savedFilter->save();
}
}
return $this->json([
"success" => true
]);
}
/**
* @param Request $request
*
* @Route("/data/savedfilter-deletefavorite")
*
* return Response
*/
public function deleteFavoritefilter(Request $request): JsonResponse
{
if ($this->getHelpdeskMode() === true) {
return new JsonResponse(['success' => false, 'message' => Response::HTTP_METHOD_NOT_ALLOWED]);
}
$loginUserId = $this->getLoginUserId();
$geschaeftspartnerId = $this->getGeschaeftspartnerId();
$savedId = $request->request->get('id');
if (is_numeric($savedId)) {
$savedFilter = \Pimcore\Model\DataObject::getById($savedId);
if ($savedFilter->getUser_id() == $loginUserId) {
$savedFilter->setFavorit(1);
$savedFilter->save();
}
$savedFilter->setFavorit(0);
$savedFilter->save();
}
return $this->json([
"success" => true
]);
}
/**
* @param Request $request
*
* @Route("/data/vorlage-save")
*
* return Response
*/
public function saveVorlage(Request $request): JsonResponse
{
if ($request->getMethod() !== "POST" || $this->getHelpdeskMode() === true) {
return new JsonResponse(['success' => false, 'message' => Response::HTTP_METHOD_NOT_ALLOWED]);
}
$loginUserId = $this->getLoginUserId();
$geschaeftspartnerId = $this->getGeschaeftspartnerId();
$token = bin2hex(random_bytes(16));
$now = Carbon::now();
$start = $request->request->get('startdate');
if ($start && $start != "") {
$start = substr($start, 0, 4) . "-" . substr($start, 4, 2) . "-" . substr($start, 6, 2);
}
$end = $request->request->get('enddate');
if ($end && $end != "") {
$end = substr($end, 0, 4) . "-" . substr($end, 4, 2) . "-" . substr($end, 6, 2);
}
if ($request->request->get('type') == "Auftrag") {
if (is_numeric($request->request->get('update'))) {
$filter = \Pimcore\Model\DataObject::getById($request->request->get('update'));
$isFavorit = $filter->getFavorit();
} else {
$filter = new SavedFilter;
$isFavorit = 0;
}
$parentFolderId = DataObjectFolder::getByPath('/Saved Filter Auftrag/')->getId();
$filter->setParentId($parentFolderId);
$filter->setPublished(1);
$filter->setCreated($now);
$filter->setKey(\Pimcore\Model\Element\Service::getValidKey($token, 'object'));
$filter->setName($request->request->get('name'));
$filter->setUser_id($loginUserId);
$filter->setStartdate($start);
$filter->setEnddate($end);
$filter->setAuftragStatus($request->request->get('auftragStatus'));
$filter->setLaufende(($request->request->get('laufende') == 'true') ? 1 : 0);
$filter->setVerspaetete(($request->request->get('verspaetete') == 'true') ? 1 : 0);
$filter->setStartterminalterm($request->request->get('startterminalterm'));
$filter->setZielterminalterm($request->request->get('zielterminalterm'));
$filter->setStartterminals($request->request->get('startterminals'));
$filter->setZielterminals($request->request->get('zielterminals'));
$filter->setAbholbereitSeit($request->request->get('abholbereitSeitInt'));
$filter->setLeArt($request->request->get('leArt'));
$filter->setGefahrgut(($request->request->get('gefahrgut') == 'true') ? 1 : 0);
$filter->setAbfall(($request->request->get('abfall') == 'true') ? 1 : 0);
$filter->setZollpflicht(($request->request->get('zollpflicht') == 'true') ? 1 : 0);
$filter->setTemperaturgefuehrt(($request->request->get('temperaturgefuehrt') == 'true') ? 1 : 0);
$filter->setMeineAuftraege(($request->request->get('meineAuftraege') == 'true') ? 1 : 0);
$filter->setFavorit($isFavorit);
$filter->save();
$savedFilterListing = new SavedFilter\Listing();
$savedFilterListing->setCondition("user_id = $loginUserId");
$savedFilterListing->setOrderKey("Name");
$savedFilterListing->setOrder("asc");
$savedFilterContainer = [];
foreach ($savedFilterListing as $filter) {
array_push($savedFilterContainer, array(
"id" => $filter->getId(),
"name" => $filter->getName(),
"startdate" => substr($filter->getStartdate(), 0, 10),
"enddate" => substr($filter->getEnddate(), 0, 10),
"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()
));
}
$savedFilter = json_encode($savedFilterContainer, JSON_THROW_ON_ERROR, 512);
return $this->json([
"success" => true,
"data" => $savedFilter
]);
} else { // if ($request->request->get('type') == "Zuege") {
if (is_numeric($request->request->get('update'))) {
$filter = \Pimcore\Model\DataObject::getById($request->request->get('update'));
$isFavorit = $filter->getFavorit();
} else {
$filter = new SavedFilterZuege;
$isFavorit = 0;
}
$parentFolderId = DataObjectFolder::getByPath('/Saved Filter ZĂĽge/')->getId();
$filter->setParentId($parentFolderId);
$filter->setPublished(1);
$filter->setCreated($now);
$filter->setKey(\Pimcore\Model\Element\Service::getValidKey($token, 'object'));
$filter->setName($request->request->get('name'));
$filter->setUser_id($loginUserId);
$filter->setStartdate($start);
$filter->setEnddate($end);
$filter->setStartterminalterm($request->request->get('startterminalterm'));
$filter->setZielterminalterm($request->request->get('zielterminalterm'));
$filter->setStartterminals($request->request->get('startterminals'));
$filter->setZielterminals($request->request->get('zielterminals'));
$filter->setTransportlaufStatus($request->request->get('transportlaufStatus'));
$filter->setFavorit($isFavorit);
$filter->save();
$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 $this->json([
"success" => true,
"data" => $savedFilterZuege
]);
}
}
/**
* @param Request $request
*
* @Route("/data/zuege")
*
* return Response
*/
public function getAuftragTeilstreckenData(Request $request): JsonResponse
{
if ($this->getHelpdeskMode() === false) {
if ($request->getMethod() !== "POST" || $this->checkUserLoggedIn($request) === false) {
return new JsonResponse(['success' => false, 'message' => Response::HTTP_METHOD_NOT_ALLOWED]);
}
}
$limit = (int) $request->request->get('limit', 50);
$offset = (int) $request->request->get('offset', 0);
$loadFromKkDatabase = $request->request->get('loadFromKkDatabase', false);
$transportlaufStatus = $request->request->get('transportlaufStatus');
$startDate = $request->request->get('startdate');
$endDate = $request->request->get('enddate');
$startterminals = $request->request->get('startterminals');
$zielterminals = $request->request->get('zielterminals');
$columnFilters = (array) $request->request->get('columnFilters');
$laufendeZuege = $request->request->get('laufendeZuege');
$verspaeteteZuege = $request->request->get('verspaeteteZuege');
$loginUserId = $this->getLoginUserId();
$geschaeftspartnerId = $this->getGeschaeftspartnerId();
if ($loadFromKkDatabase === false || $loadFromKkDatabase === 'false') {
// fetch new Teilstrecken (Zuege)
$searchString = 'geschaeftspartnerId:' . $geschaeftspartnerId;
if (isset($transportlaufStatus) && $transportlaufStatus != "") {
$s = explode(',', $transportlaufStatus);
foreach ($s as $status) {
$searchString .= ',transportlaufStatus:' . intval($status);
}
}
if (!empty($startDate)) {
$searchString .= ',annahmeschluss>' . $startDate;
}
if (!empty($endDate)) {
$searchString .= ',annahmeschluss<' . $endDate;
}
if (!empty($startterminals)) {
$terminals = explode(',', $startterminals);
foreach ($terminals as $t) {
$searchString .= ',startTerminal:' . intval($t);
}
}
if (!empty($zielterminals)) {
$terminals = explode(',', $zielterminals);
foreach ($terminals as $t) {
$searchString .= ',zielTerminal:' . intval($t);
}
}
$teilstreckenDataArray = $this->catJsonWebservice->fetchTeilstreckeDataFromCat($searchString);
$oldZuege = TeilstreckeJson::getByLoginUserId($loginUserId);
foreach ($oldZuege as $o) {
$o->delete();
}
$teilstreckenDataFolder = DataObjectFolder::getByPath('/zuege-teilstrecken/');
// $teilstreckeObject = new TeilstreckeJson();
// $teilstreckeObject->setParentId($teilstreckenDataFolder->getId());
// $teilstreckeObject->setKey('teilstreckeJson-' . $geschaeftspartnerId . '-' . $loginUserId);
// $teilstreckeObject->setLoginUserId($loginUserId);
// $teilstreckeObject->setGeschaeftspartnerId($geschaeftspartnerId);
// $teilstreckeObject->setJson(json_encode($teilstreckenDataArray));
// $teilstreckeObject->setPublished(true);
// $teilstreckeObject->save();
\Pimcore\Cache::save(json_encode($teilstreckenDataArray), 'teilstrecke-JSON-' . $geschaeftspartnerId . '-' . $loginUserId . $this->getHelpdeskSuffix(), [], 2592000, 0, true); // 30 Tage
} else {
$teilstreckenDataArray = $this->getTeilstreckenArrayByLoginUser();
}
// slice big Auftraege array into the chunk we need (--> offset / limit)
$countAllzuegeInDb = count($teilstreckenDataArray['teilstrecken']);
$laufendeZuegeCounter = 0;
$verspaeteteZuegeCounter = 0;
if (isset($teilstreckenDataArray['teilstrecken'])) {
foreach ($teilstreckenDataArray['teilstrecken'] as $index => $t) {
$teilstrecke = $this->createTeilstreckeObjectFromArrayData($t);
//am_versandbahnhof (0), fährt (1), angekommen (4) oder zwischenhalt (9)
if ($teilstrecke->getTransportlaufStatus() == 0 || $teilstrecke->getTransportlaufStatus() == 1 || $teilstrecke->getTransportlaufStatus() == 4 || $teilstrecke->getTransportlaufStatus() == 9) {
$laufendeZuegeCounter++;
}
//fährt_verspätet (2) oder steht (3)
if ($teilstrecke->getTransportlaufStatus() == 2 || $teilstrecke->getTransportlaufStatus() == 3) {
$verspaeteteZuegeCounter++;
}
}
}
if ($columnFilters) {
$countAllzuegeInDb = 0;
$laufendeZuegeCounter = 0;
$verspaeteteZuegeCounter = 0;
} else {
if (!$laufendeZuege && !$verspaeteteZuege) {
$teilstreckenDataArray['teilstrecken'] = array_slice($teilstreckenDataArray['teilstrecken'], $offset, $limit);
}
}
$timingBegin = microtime(true);
$returnData = [];
$returnData['teilstrecken'] = [];
$createTeilstreckenCounter = 0;
$offsetCounter = 0;
if (isset($teilstreckenDataArray['teilstrecken'])) {
$this->log('Creating Teilstrecken for geschaeftspartnerId ' . $geschaeftspartnerId . ', loginUserId ' . $loginUserId, 3);
foreach ($teilstreckenDataArray['teilstrecken'] as $key => $t) {
$teilstrecke = $this->createTeilstreckeObjectFromArrayData($t);
$laufendeZuegeFlag = false;
$verspaeteteZuegeFlag = false;
$ok = true;
//am_versandbahnhof (0), fährt (1), angekommen (4) oder zwischenhalt (9)
if ($teilstrecke->getTransportlaufStatus() == 0 || $teilstrecke->getTransportlaufStatus() == 1 || $teilstrecke->getTransportlaufStatus() == 4 || $teilstrecke->getTransportlaufStatus() == 9) {
$laufendeZuegeFlag = true;
}
if ($laufendeZuege) {
if (!$laufendeZuegeFlag) {
$ok = false;
}
}
//fährt_verspätet (2) oder steht (3)
if ($teilstrecke->getTransportlaufStatus() == 2 || $teilstrecke->getTransportlaufStatus() == 3) {
$verspaeteteZuegeFlag = true;
}
if ($verspaeteteZuege) {
if (!$verspaeteteZuegeFlag) {
$ok = false;
}
}
if ($columnFilters) {
$ok = $this->checkColumnFilters($teilstrecke, $columnFilters);
if ($ok) {
$countAllzuegeInDb++;
if ($laufendeZuegeFlag) {
$laufendeZuegeCounter++;
}
if ($laufendeZuege) {
if (!$laufendeZuegeFlag) {
$addAuftrag = false;
}
}
if ($verspaeteteZuegeFlag) {
$verspaeteteZuegeCounter++;
}
if ($verspaeteteZuege) {
if (!$verspaeteteZuegeFlag) {
$addAuftrag = false;
}
}
}
if ($ok == true && $offset > $offsetCounter) {
$offsetCounter++;
$ok = false;
continue; // offset to small --> go to next one...
}
if ($createTeilstreckenCounter >= $limit) {
$ok = false;
continue; // we're already above the limit --> but we have to loop until the end, because we need the total count for $countAllAuftraegeInDb
}
}
if ($ok) {
$returnData['teilstrecken'][$teilstrecke->getTeilstreckeId()] = array(
'maxAnzahlErreicht' => $teilstrecke->getMaxAnzahlErreicht(),
'geschaeftspartnerId' => $teilstrecke->getGeschaeftspartnerId(),
'annahmeschluss' => $teilstrecke->getAnnahmeschluss(),
'abholbeginn' => $teilstrecke->getAbholbeginn(),
'versandterminal_code' => $teilstrecke->getStartTerminal(),
'empfangsterminal_code' => $teilstrecke->getZielTerminal(),
'zugnummer' => $teilstrecke->getZugnummer(),
'erwarteteAbweichung' => $teilstrecke->getErwarteteAbweichung(),
'transportlaufstatus_code' => $teilstrecke->getTransportlaufStatus(),
'anzAuftraegeAufZug' => $teilstrecke->getAnzAuftraegeAufZug(),
'auftraegeAufZug' => $teilstrecke->getAuftraegeAufZug(),
'sondertransportZoll' => $teilstrecke->getSondertransportZoll(),
'sondertransportGefahrgut' => $teilstrecke->getSondertransportGefahrgut(),
'sondertransportAbfall' => $teilstrecke->getSondertransportAbfall(),
'sondertransportTemperaturgefuehrt' => $teilstrecke->getSondertransportTemperaturgefuehrt(),
// KK only data
'versandterminal' => $teilstrecke->getStartTerminalString(),
'empfangsterminal' => $teilstrecke->getZielTerminalString(),
'transportlaufstatus' => $teilstrecke->getTransportlaufStatusString(),
'baustellen' => unserialize($teilstrecke->getBaustellen())
);
$createTeilstreckenCounter++;
}
}
}
$returnData['countAllZuegeInDb'] = $countAllzuegeInDb;
$returnData['laufendeZuegeCounter'] = $laufendeZuegeCounter;
$returnData['verspaeteteZuegeCounter'] = $verspaeteteZuegeCounter;
$returnData['isLaufendeZuege'] = $laufendeZuege;
$returnData['isVerspaeteteZuege'] = $verspaeteteZuege;
$returnData['maxAnzahlErreicht'] = $teilstreckenDataArray['maxAnzahlErreicht'];
$timingEnd = microtime(true);
$this->log('Done creating ' . $createTeilstreckenCounter . ' Teilstrecken for geschaeftspartnerId ' . $geschaeftspartnerId . ', loginUserId ' . $loginUserId . ' (' . number_format(($timingEnd - $timingBegin), 3) . 's)', 2);
return $this->json([
"success" => true,
"data" => $returnData
]);
}
/**
* @return array
*/
public function getTeilstreckenArrayByLoginUser()
{
$loginUserId = $this->getLoginUserId();
$geschaeftspartnerId = $this->getGeschaeftspartnerId();
$timingBegin = microtime(true);
$this->log('Reading Teilstrecken for geschaeftspartnerId ' . $geschaeftspartnerId . ', loginUserId ' . $loginUserId . ' from KK DB', 3);
// $teilstreckeJson = new TeilstreckeJson\Listing();
// $teilstreckeJson->setCondition('loginUserId = ? ', [$loginUserId]);
// foreach ($teilstreckeJson as $key => $teilstrecke) {
// $teilstreckenArray = $teilstrecke->getJson();
// $teilstreckenArray = (array) json_decode($teilstreckenArray, true);
// }
$teilstreckeJson = \Pimcore\Cache::load('teilstrecke-JSON-' . $geschaeftspartnerId . '-' . $loginUserId . $this->getHelpdeskSuffix());
$teilstreckenArray = (array) json_decode($teilstreckeJson, true);
$timingEnd = microtime(true);
$this->log('Done reading ' . count($teilstreckenArray['teilstrecken']) . ' Teilstrecken for geschaeftspartnerId ' . $geschaeftspartnerId . ', loginUserId ' . $loginUserId . ' from KK DB (' . number_format(($timingEnd - $timingBegin), 3) . 's)', 2);
return $teilstreckenArray;
}
/**
* @param array $t
*
* @return Teilstrecke
*/
public function createTeilstreckeObjectFromArrayData(array $t)
{
$teilstrecke = new Teilstrecke();
$teilstrecke->setTeilstreckeId($t['teilstreckeId']);
$teilstrecke->setAnnahmeschluss(!empty($t['annahmeschluss']) ? Carbon::createFromTimeString($t['annahmeschluss'], 'Europe/Berlin') : null);
$teilstrecke->setAbholbeginn(!empty($t['abholbeginn']) ? Carbon::createFromTimeString($t['abholbeginn'], 'Europe/Berlin') : null);
$teilstrecke->setStartTerminal($t['startTerminal']);
$teilstrecke->setZielTerminal($t['zielTerminal']);
$teilstrecke->setZugnummer($t['zugnummer']);
$teilstrecke->setErwarteteAbweichung($t['erwarteteAbweichung']);
$teilstrecke->setTransportlaufStatus($t['transportlaufStatus']);
// $teilstrecke->setAnzAuftraegeAufZug($t['anzAuftraegeAufZug']);
if (!empty($t['anzAuftraegeAufZug'])) {
$teilstrecke->setAnzAuftraegeAufZug($t['anzAuftraegeAufZug']);
} else if (!empty($t['auftraegeAufZug'])) {
$teilstrecke->setAnzAuftraegeAufZug(count($t['auftraegeAufZug']));
$teilstrecke->setAuftraegeAufZug(implode(',', $t['auftraegeAufZug']));
} else {
$teilstrecke->setAnzAuftraegeAufZug(0);
}
$teilstrecke->setAuftraegeAufZug(implode(',', $t['auftraegeAufZug']));
$teilstrecke->setSondertransportZoll($t['sondertransportZoll']);
$teilstrecke->setSondertransportGefahrgut($t['sondertransportGefahrgut']);
$teilstrecke->setSondertransportAbfall($t['sondertransportAbfall']);
$teilstrecke->setSondertransportTemperaturgefuehrt($t['sondertransportTemperaturgefuehrt']);
// KK only data
$teilstrecke->setStartTerminalString($this->getStartterminalNameById($t['startTerminal']));
$teilstrecke->setZielTerminalString($this->getZielterminalNameById($t['zielTerminal']));
$teilstrecke->setTransportlaufStatusString($this->getTransportlaufStatusById($t['transportlaufStatus']));
$teilstrecke->setBaustellen(serialize($t['baustellen']));
$teilstrecke->setPublished(true);
return $teilstrecke;
}
/**
* @param int $id
*
* @return string
*/
public function getStartterminalNameById($id)
{
if ($id === null) {
return null;
}
$startterminal = '';
try {
$terminal = Bahnhof::getByKv_id($id, 1, 0);
if ($terminal) {
$startterminal = $terminal->getLangname();
} else {
$startterminal = 'n/a ('.$id.')';
}
} catch (\Exception $e) {
$startterminal = 'n/a ('.$id.')';
}
return $startterminal;
}
/**
* @param int $id
*
* @return string
*/
public function getZielterminalNameById($id)
{
if ($id === null) {
return null;
}
$zielterminal = '';
try {
$terminal = Bahnhof::getByKv_id($id, 1, 0);
if ($terminal) {
$zielterminal = $terminal->getLangname();
} else {
$zielterminal = 'n/a ('.$id.')';
}
} catch (\Exception $e) {
$zielterminal = 'n/a ('.$id.')';
}
return $zielterminal;
}
/**
* @param int $id
*
* @return string
*/
public function getLadeeinheitById($id)
{
if ($id === null) {
return null;
}
$ladeeinheit = '';
try {
$le = LadeeinheitArt::getByKv_id($id, 1, 0);
if ($le) {
$ladeeinheit = $le->getCode();
} else {
$ladeeinheit = 'n/a ('.$id.')';
}
} catch (\Exception $e) {
$ladeeinheit = 'n/a ('.$id.')';
}
return $ladeeinheit;
}
/**
* @param int $id
*
* @return string
*/
public function getAuftragStatusById($id)
{
if ($id === null) {
return null;
}
$status = '';
try {
$s = AuftragStatus::getByKv_id($id, 1, 0);
if ($s) {
$status = $s->getName();
} else {
$status = 'n/a ('.$id.')';
}
} catch (\Exception $e) {
$status = 'n/a ('.$id.')';
}
return $status;
}
/**
* @param int $id
*
* @return string
*/
public function getTransportlaufStatusById($id)
{
if ($id === null) {
return null;
}
$status = '';
try {
$s = TransportlaufStatus::getByKv_id($id, 1, 0);
if ($s) {
$status = $s->getName();
} else {
$status = 'n/a ('.$id.')';
}
} catch (\Exception $e) {
$status = 'n/a ('.$id.')';
}
return $status;
}
/**
* @param Request $request
*
* @Route("/data/annahmeschluss-confirm")
*
* return Response
*/
public function confirmAnnahmeschlussGelesen(Request $request): JsonResponse
{
$loginUserId = $this->getLoginUserId();
$geschaeftspartnerId = $this->getGeschaeftspartnerId();
$auftragId = $request->request->get('auftragId');
$auftrag = $this->getAuftragById($auftragId);
$this->log('confirmAnnahmeschlussGelesen for Auftrag ' . $auftragId . ' for geschaeftspartnerId ' . $geschaeftspartnerId . ', loginUserId ' . $loginUserId, 2);
$success = false;
if ($auftrag) {
$success = $this->catJsonWebservice->confirmAnnahmeschlussGelesen($auftragId, $geschaeftspartnerId, $loginUserId);
}
return $this->json([
"success" => $success
]);
}
/**
* @param int $id
*
* @return string
*/
public function getLieferartById($id, $translator)
{
$string = "";
switch ($id) {
case 0:
$string = $translator->trans("STRASSE");
break;
case 1:
$string = $translator->trans("SCHIENE");
break;
case 2:
$string = $translator->trans("FAEHRE");
break;
case 3:
$string = $translator->trans("SCHIFF");
break;
case 4:
$string = $translator->trans("DEPOT");
break;
case 5:
$string = $translator->trans("KEINE_LIEFERANGABEN");
break;
case 6:
$string = $translator->trans("VONAUFPLATZ");
break;
case 7:
$string = $translator->trans("UNKNOWN");
break;
default:
$string = $translator->trans("UNKNOWN");
break;
}
return $string;
}
/**
* @param Request $request
*
* @Route("/data/auftrag-detail-validation")
*
* return Response
*/
public function getAuftragDetailValidationData(Request $request): JsonResponse
{
if ($request->getMethod() !== "POST" || $this->checkUserLoggedIn($request) === false) {
return new JsonResponse(['success' => false, 'message' => Response::HTTP_METHOD_NOT_ALLOWED]);
}
$loginUserId = $this->getLoginUserId();
$geschaeftspartnerId = $this->getGeschaeftspartnerId();
$auftragId = $request->request->get('auftragId');
$auftragDetailData = [];
$timingBegin = microtime(true);
$this->log('Creating AuftragDetailValidation for Auftrag ' . $auftragId . ' for geschaeftspartnerId ' . $geschaeftspartnerId . ', loginUserId ' . $loginUserId, 3);
if (!empty($auftragId)) {
$success = false;
$auftrag = $this->getAuftragById($auftragId);
if ($auftrag) {
$success = true;
$auftragDetailData = $this->catJsonWebservice->fetchAuftragDetailValidationDataFromCat($auftragId);
}
}
$timingEnd = microtime(true);
$this->log('Done creating AuftragDetailValidation for Auftrag ' . $auftragId . ' (success = ' . $success . ') for geschaeftspartnerId ' . $geschaeftspartnerId . ', loginUserId ' . $loginUserId . ' (' . number_format(($timingEnd - $timingBegin), 3) . 's)', 2);
return $this->json([
"success" => $success,
"data" => $auftragDetailData
]);
}
/**
* @param Request $request
*
* @Route("/data/statistic")
*
* return Response
*/
public function getStatistic(Request $request): JsonResponse
{
$userSessionData = $this->getUserSessionData();
$emailAddress = $userSessionData['data']['LOGIN'];
if (strstr($emailAddress, 'krankikom.de') === false) {
die();
}
$start = DateTime::createFromImmutable(new DateTimeImmutable($request->get('start') ?? '-6 hour'));
$end = DateTime::createFromImmutable(new DateTimeImmutable($request->get('end') ?? 'now'));
return $this->json([
"success" => true,
"data" => [
'userCount' => $this->userCount($start, $end),
]
]);
}
function getLogs($file, ?DateTime $start = null, ?DateTime $end = null)
{
$log = fopen($file, 'r');
$lines = [];
$datePattern = '/^\[(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{6}\+\d{2}:\d{2})\]/';
while (!feof($log)) {
$line = fgets($log);
if (str_contains($line, 'auftrag-data-load')) {
preg_match($datePattern, $line, $matches);
if (isset($matches[1])) {
$dateString = $matches[1];
$dateTime = DateTime::createFromImmutable(new DateTimeImmutable($dateString));
if (preg_match('/{.*}/', $line, $json)) {
$json_object = json_decode($json[0], true);
}
if ($start !== null && $end !== null) {
if ($dateTime >= $start && $dateTime <= $end) {
$lines[] = [
'timestamp' => $dateTime->format("Y-m-d H:i:s"),
'data' => $json_object
];
}
} else {
$lines[] = [
'timestamp' => $dateTime->format("Y-m-d H:i:s"),
'data' => $json_object
];
}
}
}
}
return $lines;
}
private function userCount(?DateTime $start = null, ?DateTime $end = null, $format = 'Y-m-d H:i') {
$data = [];
$empty = [];
$interval = DateInterval::createFromDateString('1 min');
$diff = $start->diff($end);
if ($diff->format('%a') > 0 || $diff->format('%H') > 12) {
$format = 'Y-m-d H:00';
$interval = DateInterval::createFromDateString('1 hour');
}
$period = new DatePeriod($start, $interval, $end);
foreach ($period as $timestamp) {
$empty[$timestamp->format($format)] = [
'users' => [],
'count' => 0
];
}
$entries = $this->getLogs('/var/www/html/var/log/kv_usage_log.log', $start, $end);
foreach($entries as $entry) {
$timestamp = DateTime::createFromImmutable(new DateTimeImmutable($entry['timestamp']))->setTimezone(new DateTimeZone('Europe/Berlin'))->format($format);
// Nothing saved for current timestamp
if(!isset($data[$timestamp]['users'])) {
$data[$timestamp]['users'][] = $entry['data']['loginUserId'];
} else if(!in_array($entry['data']['loginUserId'], $data[$timestamp]['users'])) {
// User is not already saved
$data[$timestamp]['users'][] = $entry['data']['loginUserId'];
}
}
$data = array_map(function ($entry) {
$entry['count'] = count($entry['users']);
return $entry;
}, $data);
return array_merge($empty, $data);
}
/**
* @param Request $request
*
* @Route("/data/update-csv")
*
* return Response
*/
public function updateGeschaeftspartnerCsv(Request $request): JsonResponse
{
if ($this->checkUserLoggedIn($request) === false) {
return new JsonResponse(['success' => false, 'message' => Response::HTTP_METHOD_NOT_ALLOWED]);
}
$this->catJsonWebservice->fetchGeschaeftspartnerCsvFromCat();
return $this->json([
"success" => true
]);
}
// /**
// * @param Request $request
// *
// * @Route("/data/auftrag-filter-meta")
// *
// * return Response
// */
// public function loadAuftragFilterMetaData(Request $request): JsonResponse
// {
// if ($this->getHelpdeskMode() === false) {
// if ($request->getMethod() !== "POST" || $this->checkUserLoggedIn($request) === false) {
// return new JsonResponse(['success' => false, 'message' => Response::HTTP_METHOD_NOT_ALLOWED]);
// }
// }
// $unvollstaendigeAuftraegeCounter = 0;
// $geaenderterAnnahmeschlussCounter = 0;
// $abweichenderAbholbeginnCounter = 0;
// $abholbereitCounter = 0;
// $auftraegeArray = $this->getAuftrageArrayByLoginUser();
// foreach ($auftraegeArray['auftraege'] as $index => $a) {
// $auftrag = $this->createAuftragObjectFromArrayData($a);
// if ($auftrag->getDatenVollstaendig() === false) { //UNVOLLSTĂ„NDIG JA/NEIN
// $unvollstaendigeAuftraegeCounter++;
// }
// if ($auftrag->getAbweichungGeplanteAnlieferungAnnahmeschluss() || !$auftrag->getAbweichungAnnahmeschlussGelesen()) { //geaenderterAnnahmeschluss JA/NEIN
// $geaenderterAnnahmeschlussCounter++;
// }
// if ($auftrag->getAbweichungAbholbeginn()) { //abweichenderAbholbeginn JA/NEIN
// $abweichenderAbholbeginnCounter++;
// }
// if ($auftrag->getAuftragStatus() == 7) {
// $abholbereitCounter++;
// }
// }
// return $this->json([
// 'success' => true,
// 'unvollstaendigeAuftraegeCounter' => $unvollstaendigeAuftraegeCounter,
// 'geaenderterAnnahmeschlussCounter' => $geaenderterAnnahmeschlussCounter,
// 'abweichenderAbholbeginnCounter' => $abweichenderAbholbeginnCounter,
// 'abholbereitCounter' => $abholbereitCounter,
// 'allCounter' => count($auftraegeArray['auftraege']),
// 'maxAnzahlErreicht' => $auftraegeArray['maxAnzahlErreicht']
// ]);
// }
}