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
+
= (int)$cntOverdue ?>
+
+
+
+
+
+
+
+
+
+
+
+
Heutige CheckIns
+
= (int)$cntToday ?>
+
+
+
+
+
+
+
+
+
+
+
+
+ Zukünftige CheckIns
+
+ (≤ = htmlspecialchars($limit->format('d.m.Y')) ?>)
+
+
+
= (int)$cntFuture ?>
+
+
+
+
+
+
+
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
+
= (int)$cntOverdue ?>
+
+
+
+
+
+
+
+
+
+
+
+
Heutige CheckOuts
+
= (int)$cntToday ?>
+
+
+
+
+
+
+
+
+
+
+
+
Zukünftige CheckOuts= (CheckOut_FutureDays != -1 ? ' (≤ '.$limit->format('d.m.Y').')' : '') ?>
+
= (int)$cntFuture ?>
+
+
+
+
+
+
+
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);