diff --git a/EpiApi.php b/EpiApi.php index 4be60c3..e074c5c 100644 --- a/EpiApi.php +++ b/EpiApi.php @@ -12,7 +12,7 @@ public function requestEpiApi(string $requestString){ $requestUrl = Epirent_Connectionprotocol."://".Epirent_Server.":".Epirent_Port.$requestString; $response = $client->request('GET', $requestUrl,[ 'headers' =>[ - 'X-EPI-NO-SESSION' => 'True', + 'X-EPI-NO-SESSION' => 'true', 'X-EPI-ACC-TOK' => Epirent_Token ] ]); diff --git a/dist/index.php b/dist/index.php index afe48e8..e125e90 100644 --- a/dist/index.php +++ b/dist/index.php @@ -30,9 +30,7 @@ require('../EpiApi.php'); $(function () { loadSidenav(); loadFooter(); - loadKpis(); - loadTrends(); - loadOrders(); + }); function loadSidenav() { diff --git a/sources/getCheckInCards.php b/sources/getCheckInCards.php new file mode 100644 index 0000000..749eb2b --- /dev/null +++ b/sources/getCheckInCards.php @@ -0,0 +1,193 @@ +setTime(0, 0, 0); +} +function rowClassForDate(?DateTimeImmutable $markDate, ?DateTimeImmutable $today): string { + if (!$markDate || !$today) return ''; + if ($markDate == $today) return 'text-dark bg-warning'; + if ($markDate < $today) return 'bg-danger'; + return ''; +} + +/** + * Row-Marking Quelle (Check-In) – identisch zu deiner Tabelle: + * 1 = $packingjob->date_end + * 2 = $NachbereitungsTimeDetail->date_start + * 3 = $RePackagingTimeDetail->date_start + * 4 = $PackingNoteDetail->date_redelivery + * Fallback: $packingjob->date_end + */ +function resolveRowMarkDateCheckIn( + $packingjob, + $NachbereitungsTimeDetail, + $RePackagingTimeDetail, + $PackingNoteDetail, + int $source +): ?DateTimeImmutable { + $candidate = null; + switch ($source) { + case 1: $candidate = dt($packingjob->date_end ?? null); break; + case 2: $candidate = dt($NachbereitungsTimeDetail->date_start ?? null); break; + case 3: $candidate = dt($RePackagingTimeDetail->date_start ?? null); break; + case 4: $candidate = dt($PackingNoteDetail->date_redelivery ?? null); break; + default: $candidate = null; break; + } + if (!$candidate) { + $candidate = dt($packingjob->date_end ?? null); + } + return $candidate ? dayStart($candidate) : null; +} + +/** ---------- Daten holen (wie in deiner Check-In-Datei) ---------- */ +// Offene Packingnotes für Check-IN-Seite: isco=False +$result = $Epi->requestEpiApi('/v1/packingnote/open?isco=False&cl=' . Epirent_Mandant); +$data_output = json_decode($result)->payload ?? []; + +/** ---------- Zähler ---------- */ +$today = dayStart(new DateTimeImmutable('today', new DateTimeZone(APP_TZ))); + +$limit = null; +if (CheckIn_FutureDays != -1) { + $limit = $today->modify('+' . (int)CheckIn_FutureDays . ' day'); +} + +$cntOverdue = 0; +$cntToday = 0; +$cntFuture = 0; + +/** ---------- Zählen mit exakt deiner Logik ---------- */ +foreach ($data_output as $packingjob) { + if ($packingjob->is_archived == true) continue; + + // OrderDetails (für Nachbereitung / Rückpacken) + $orderRes = $Epi->requestEpiApi('/v1/order/' . $packingjob->order_pk . '?cl=' . Epirent_Mandant); + $orderdetail_output = json_decode($orderRes)->payload[0] ?? null; + + // PackingNote Details (für Redelivery) + $pnRes = $Epi->requestEpiApi('/v1/packingnote/' . $packingjob->primary_key . '?cl=' . Epirent_Mandant); + $PackingNoteDetail = json_decode($pnRes)->payload[0] ?? null; + + // Zeit-Slots aus dem Schedule + $NachbereitungsTimeDetail = null; + $RePackagingTimeDetail = null; + if ($orderdetail_output && !empty($orderdetail_output->order_schedule)) { + foreach ($orderdetail_output->order_schedule as $scheduledetail) { + if ($scheduledetail->name == Nachbereitung_Zeitvariable) { + $NachbereitungsTimeDetail = $scheduledetail; + } + if ($scheduledetail->name == Rückpacken_Zeitvariable) { + $RePackagingTimeDetail = $scheduledetail; + } + } + } + + // Row-Mark Source (mit Override-Flag) + $source = CheckIn_UseDispoEndForRowMarking ? 1 : (int)CheckInRowMarkSource; + + $markDate = resolveRowMarkDateCheckIn( + $packingjob, + $NachbereitungsTimeDetail, + $RePackagingTimeDetail, + $PackingNoteDetail, + $source + ); + if (!$markDate) continue; + + // Fenster berücksichtigen (gleich wie in deiner Tabelle) + if (CheckIn_FutureDays != -1 && $limit && $markDate > $limit) { + continue; + } + + // Zählen + if ($markDate < $today) { + $cntOverdue++; + } elseif ($markDate == $today) { + $cntToday++; + } else { + $cntFuture++; + } +} + +$ts = (new DateTimeImmutable('now', new DateTimeZone(APP_TZ)))->format('H:i:s'); +?> +

+ CheckIn +

+
+
+
+
+
+
Überfällige CheckIns
+
+
+ +
+ +
+
+ +
+
+
+
+
Heutige CheckIns
+
+
+ +
+ +
+
+ +
+
+
+
+
+ Zukünftige CheckIns + + (≤ format('d.m.Y')) ?>) + +
+
+
+ +
+ +
+
+
diff --git a/sources/getCheckOutCards.php b/sources/getCheckOutCards.php new file mode 100644 index 0000000..f00b23d --- /dev/null +++ b/sources/getCheckOutCards.php @@ -0,0 +1,189 @@ +setTime(0, 0, 0); +} + +/** + * Quelle für das Markierungsdatum (identisch zu deiner Liste): + * 1 = $packingjob->date_start + * 2 = $VorbereitungsTimeDetail->date_start + * 3 = $PackingNoteDetail->date_packing + * 4 = $PackingNoteDetail->date_delivery + * Fallback: $packingjob->date_start + */ +function resolveRowMarkDate($packingjob, $VorbereitungsTimeDetail, $PackingNoteDetail, int $source): ?DateTimeImmutable { + $candidate = null; + switch ($source) { + case 1: $candidate = dt($packingjob->date_start ?? null); break; + case 2: $candidate = dt($VorbereitungsTimeDetail->date_start ?? null); break; + case 3: $candidate = dt($PackingNoteDetail->date_packing ?? null); break; + case 4: $candidate = dt($PackingNoteDetail->date_delivery ?? null); break; + default:$candidate = null; break; + } + if (!$candidate) $candidate = dt($packingjob->date_start ?? null); + return $candidate ? dayStart($candidate) : null; +} + +/** ---- Daten laden wie bisher (Checkout-Quelle) ---- */ +if (UseDeliveredForCheckOutCompleted) { + // isco=False -> Checkout-Ansicht offen + $result = $Epi->requestEpiApi('/v1/packingnote/open?isco=False&cl=' . Epirent_Mandant); +} else { + // isci=False -> Alternative Logik (wie in deiner Datei) + $result = $Epi->requestEpiApi('/v1/packingnote/open?isci=False&cl=' . Epirent_Mandant); +} +$data_output = json_decode($result)->payload ?? []; + +/** ---- Zähler vorbereiten ---- */ +$today = dayStart(new DateTimeImmutable('today', new DateTimeZone(APP_TZ))); +$limit = null; // optionales Fenster wie in deiner Liste +if (CheckOut_FutureDays != -1) { + $limit = $today->modify('+' . (int)CheckOut_FutureDays . ' day'); +} + +$cntOverdue = 0; +$cntToday = 0; +$cntFuture = 0; + +/** ---- Iteration identisch zur bisherigen Logik ---- */ +foreach ($data_output as $packingjob) { + + // Details nur holen, wenn nötig & wie gehabt + $PackingNoteDetail = null; + if ($packingjob->is_archived != true && UseDeliveredForCheckOutCompleted) { + $PackingNoteDetailResult = $Epi->requestEpiApi('/v1/packingnote/' . $packingjob->primary_key . '?cl=' . Epirent_Mandant); + $PackingNoteDetail = json_decode($PackingNoteDetailResult)->payload[0] ?? null; + } + + // Aufnahmebedingung exakt wie bei dir: + if ( + $packingjob->is_archived != true + && ( + !UseDeliveredForCheckOutCompleted + || ($PackingNoteDetail && ($PackingNoteDetail->date_delivered !== "0000-00-00" || (int)$PackingNoteDetail->time_delivered !== 0)) + ) + && ($PackingNoteDetail && (int)$PackingNoteDetail->is_all_out !== 0) + ) { + // OrderDetails (für Vorbereitungszeit) + $result = $Epi->requestEpiApi('/v1/order/' . $packingjob->order_pk . '?cl=' . Epirent_Mandant); + $orderdetail_output = (json_decode($result)->payload[0] ?? null); + + // PackingNoteDetail nachladen, falls oben noch nicht geholt + if (!UseDeliveredForCheckOutCompleted) { + $PackingNoteDetailResult = $Epi->requestEpiApi('/v1/packingnote/' . $packingjob->primary_key . '?cl=' . Epirent_Mandant); + $PackingNoteDetail = json_decode($PackingNoteDetailResult)->payload[0] ?? null; + if (!$PackingNoteDetail) continue; + } + + // Vorbereitungs-Zeitdetail ermitteln + $VorbereitungsTimeDetail = null; + if ($orderdetail_output && !empty($orderdetail_output->order_schedule)) { + foreach ($orderdetail_output->order_schedule as $scheduledetail) { + if ($scheduledetail->name == Vorbereitungs_Zeitvariable) { + $VorbereitungsTimeDetail = $scheduledetail; + break; + } + } + } + + // Markierungsdatum wie in der Tabelle + $markDate = resolveRowMarkDate($packingjob, $VorbereitungsTimeDetail, $PackingNoteDetail, (int)CheckOutRowMarkSource); + if (!$markDate) continue; + + // Optionales Zukunftsfenster berücksichtigen (wie bisher) + if (CheckOut_FutureDays != -1 && $limit && $markDate > $limit) { + // außerhalb des Fensters ignorieren + continue; + } + + // Zählen + if ($markDate < $today) { + $cntOverdue++; + } elseif ($markDate == $today) { + $cntToday++; + } else { // $markDate > $today + $cntFuture++; + } + } +} + +// Zeitstempel für die Karten +$ts = (new DateTimeImmutable('now', new DateTimeZone(APP_TZ)))->format('H:i:s'); + +/** ---- Ausgabe: 3 Bootstrap-Karten ---- */ +?> +

+ Checkout +

+ +
+ +
+
+
+
+
Überfällige CheckOuts
+
+
+ +
+ +
+
+ +
+
+
+
+
Heutige CheckOuts
+
+
+ +
+ +
+
+ +
+
+
+
+
Zukünftige CheckOutsformat('d.m.Y').')' : '') ?>
+
+
+ +
+ +
+
+
diff --git a/sources/getCheckOutTable.php b/sources/getCheckOutTable.php index 04401d0..6bacb8f 100644 --- a/sources/getCheckOutTable.php +++ b/sources/getCheckOutTable.php @@ -71,6 +71,7 @@ function rowClassForDate(?DateTimeImmutable $markDate, ?DateTimeImmutable $today if (UseDeliveredForCheckOutCompleted) { $result = $Epi->requestEpiApi('/v1/packingnote/open?isco=False&cl=' . Epirent_Mandant); + } else { $result = $Epi->requestEpiApi('/v1/packingnote/open?isci=False&cl=' . Epirent_Mandant); } @@ -107,15 +108,17 @@ foreach ($data_output as $packingjob) { if ($packingjob->is_archived != true && UseDeliveredForCheckOutCompleted) { $PackingNoteDetailResult = $Epi->requestEpiApi('/v1/packingnote/' . $packingjob->primary_key . '?cl=' . Epirent_Mandant); $PackingNoteDetail = json_decode($PackingNoteDetailResult)->payload[0]; + + } - if ( - $packingjob->is_archived != true +if ( + ($packingjob->is_archived ?? false) != true && ( - !UseDeliveredForCheckOutCompleted - || ($PackingNoteDetail->date_delivered !== "0000-00-00" || (int)$PackingNoteDetail->time_delivered !== 0) + ((int)($PackingNoteDetail->is_all_out ?? 0)) !== 0 + || (($PackingNoteDetail->date_delivered ?? "0000-00-00") === "0000-00-00" + || (int)($PackingNoteDetail->time_delivered ?? 0) === 0) ) - && (int)$PackingNoteDetail->is_all_out !== 0 ) { //get OrderDetails $result = $Epi->requestEpiApi('/v1/order/' . $packingjob->order_pk . '?cl=' . Epirent_Mandant);