";
+
+ // QR / Kopfspalten
if (Enable_QR_Code_CheckIn) {
- echo "| " . ' ' . (new QRCode($options))->render($packingjob->packingnote_no) . " | ";
+ echo "" . (new QRCode($options))->render($packingjob->packingnote_no) . " | ";
} else {
echo "" . $packingjob->packingnote_no . " | ";
}
echo "" . $packingjob->contact->name . " | ";
echo "" . $packingjob->event . " | ";
- if(!HideCheckOutTimeOnCheckin){
- if ($NachbereitungsTimeDetail->date_start != null) {
+
+ // Zeitspalte öffnen, wenn mindestens eine Anzeige aktiv ist
+ if (ShowCheckInTimeOnCheckin || ShowNachbereitungTimeOnCheckin || ShowRePackagingTimeOnCheckin || ShowReDeliveryTimeOnCheckin) {
echo "";
- if(!HideDispoTimes){
- echo "" . date_format(new \DateTime($packingjob->date_start), 'd.m.Y') . " " . getTimeFromSeconds($packingjob->time_start) . " ";
- }
- echo "" . date_format(new \DateTime($NachbereitungsTimeDetail->date_start), 'd.m.Y') . " " . getTimeFromSeconds($NachbereitungsTimeDetail->time_start) . " | ";
-
- } else if(!HideDispoTimes){
- echo "" . date_format(new \DateTime($packingjob->date_start), 'd.m.Y') . " " . getTimeFromSeconds($packingjob->time_start) . " | ";
}
+
+ // Dispo-Ende (Check-In Termin) — ENDE korrekt verwendet
+ if (ShowCheckInTimeOnCheckin && $packingjob->date_end != null) {
+ echoMarkedTimeLine($packingjob->date_end, (int)$packingjob->time_end, $today, ShowTimesOnCheckin);
}
- if ($NachbereitungsTimeDetail->date_end != null) {
- echo "";
- if(!HideDispoTimes){
- echo "" . date_format(new \DateTime($packingjob->date_end), 'd.m.Y') . " " . getTimeFromSeconds($packingjob->time_end) . " ";
- }
- echo "" . date_format(new \DateTime($NachbereitungsTimeDetail->date_end), 'd.m.Y') . " " . getTimeFromSeconds($NachbereitungsTimeDetail->time_end) . " | ";
-
-
- } else if(!HideDispoTimes){
- echo "" . date_format(new \DateTime($packingjob->date_end), 'd.m.Y') . " " . getTimeFromSeconds($packingjob->time_end) . " | ";
+
+ // Nachbereitung (START) — wie von dir bereits genutzt
+ if (ShowNachbereitungTimeOnCheckin && $NachbereitungsTimeDetail && $NachbereitungsTimeDetail->date_start != null) {
+ if (ShowCheckInTimeOnCheckin) echo "
";
+ echoMarkedTimeLine($NachbereitungsTimeDetail->date_start, (int)$NachbereitungsTimeDetail->time_start, $today, ShowTimesOnCheckin);
}
+
+ // Rückpacken (START)
+ if (ShowRePackagingTimeOnCheckin && $RePackagingTimeDetail && $RePackagingTimeDetail->date_start != null) {
+ if (ShowCheckInTimeOnCheckin || ShowNachbereitungTimeOnCheckin) echo "
";
+ echoMarkedTimeLine($RePackagingTimeDetail->date_start, (int)$RePackagingTimeDetail->time_start, $today, ShowTimesOnCheckin);
+ }
+
+ // Rücklieferung (REDELIVERY) — delivery ↔ redelivery gespiegelt
+ if (ShowReDeliveryTimeOnCheckin && $PackingNoteDetail && $PackingNoteDetail->date_redelivery != null) {
+ if (ShowCheckInTimeOnCheckin || ShowNachbereitungTimeOnCheckin || ShowRePackagingTimeOnCheckin) echo "
";
+ echoMarkedTimeLine($PackingNoteDetail->date_redelivery, (int)$PackingNoteDetail->time_redelivery, $today, ShowTimesOnCheckin);
+ }
+
+ if (ShowCheckInTimeOnCheckin || ShowNachbereitungTimeOnCheckin || ShowRePackagingTimeOnCheckin || ShowReDeliveryTimeOnCheckin) {
+ echo "";
+ }
+
+ // Fortschritt
echo "";
-
-
-
- if ($packingjob->is_all_in ==0) {
+ if ($packingjob->is_all_in == 0) {
echo "";
} else {
-
- echo '';
-
+ echo '';
echo "";
}
-
- echo ( $packingjob->pieces_sum_total - abs($packingjob->is_all_out) - abs($packingjob->is_all_in)) . "/" . ($packingjob->pieces_sum_total - $packingjob ->is_all_out) . " (" . $packingjob->pieces_sum_total.")";
+ echo ( $packingjob->pieces_sum_total - abs($packingjob->is_all_out) - abs($packingjob->is_all_in)) . "/" . ($packingjob->pieces_sum_total - $packingjob->is_all_out) . " (" . $packingjob->pieces_sum_total . ")";
echo " | ";
-
- if(ShowShippingIcons){
-
- if(UseShippingStatus){
- if(($PackingNote_data_output->status==ShippingInOrganizedStatus)||($PackingNote_data_output->status==ShippingOrganizedStatus)){
- echo "";
- }else{
- echo " | ";
- }
-
- if($PackingNote_data_output->is_self_redeliver){
- echo '';
- } else{
- if(preg_match('/'.KurierContainsText.'/i',$PackingNote_data_output->shipping_in)){
- echo '';
+ // Shipping-Icons (inbound)
+ if (ShowShippingIcons) {
+ if (UseShippingStatus) {
+ if (($PackingNoteDetail->status == ShippingInOrganizedStatus) || ($PackingNoteDetail->status == ShippingOrganizedStatus)) {
+ echo " | ";
+ } else {
+ echo " | ";
}
- if(preg_match('/'.SpeditionContainsText.'/i',$PackingNote_data_output->shipping_in)){
- echo '';
- }
- if(preg_match('/'.DHLContainsText.'/i',$PackingNote_data_output->shipping_in)){
- echo '';
- }
- if(preg_match('/'.LKWContainsText.'/i',$PackingNote_data_output->shipping_in)){
- echo '';
- }
- if(preg_match('/'.TransporterContainsText.'/i',$PackingNote_data_output->shipping_in)){
- echo '';
- }
- if(preg_match('/'.PKWContainsText.'/i',$PackingNote_data_output->shipping_in)){
- echo '';
+
+ if ($PackingNoteDetail->is_self_redeliver) {
+ echo '';
+ } else {
+ if (preg_match('/' . KurierContainsText . '/i', $PackingNoteDetail->shipping_in)) {
+ echo '';
+ }
+ if (preg_match('/' . SpeditionContainsText . '/i', $PackingNoteDetail->shipping_in)) {
+ echo '';
+ }
+ if (preg_match('/' . DHLContainsText . '/i', $PackingNoteDetail->shipping_in)) {
+ echo '';
+ }
+ if (preg_match('/' . LKWContainsText . '/i', $PackingNoteDetail->shipping_in)) {
+ echo '';
+ }
+ if (preg_match('/' . TransporterContainsText . '/i', $PackingNoteDetail->shipping_in)) {
+ echo '';
+ }
+ if (preg_match('/' . PKWContainsText . '/i', $PackingNoteDetail->shipping_in)) {
+ echo '';
+ }
}
+ echo " | ";
}
- echo "";
-
- }
-
+
+ echo "
";
+ }
+
echo "";
}
-
- }
}
}
function getTimeFromSeconds(string $timestring) {
-
$hours = floor($timestring / 3600);
- $mins = floor($timestring / 60 % 60);
- $secs = floor($timestring % 60);
-
+ $mins = floor($timestring / 60 % 60);
+ $secs = floor($timestring % 60);
$timeFormat = sprintf('%02d:%02d', $hours, $mins);
-
return $timeFormat;
}
-
diff --git a/sources/getCheckOutTable.php b/sources/getCheckOutTable.php
index 57b971e..04401d0 100644
--- a/sources/getCheckOutTable.php
+++ b/sources/getCheckOutTable.php
@@ -1,5 +1,6 @@
1
]);
-
$Epi = new Epirent();
-if(UseDeliveredForCheckOutCompleted){
- $result = $Epi->requestEpiApi('/v1/packingnote/open?isco=False&cl=' . Epirent_Mandant);
+const APP_TZ = 'Europe/Berlin';
-}else{
-$result = $Epi->requestEpiApi('/v1/packingnote/open?isci=False&cl=' . Epirent_Mandant);
+/** Hilfsfunktionen für die Row-Marking-Logik (ohne weitere Änderungen am Rest) */
+function dt(?string $s): ?DateTimeImmutable {
+ if (!$s)
+ return null;
+ try {
+ return new DateTimeImmutable($s, new DateTimeZone(APP_TZ));
+ } catch (Throwable $e) {
+ return null;
+ }
+}
+
+function dayStart(DateTimeImmutable $d): DateTimeImmutable {
+ return $d->setTime(0, 0, 0);
+}
+
+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;
+}
+
+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 '';
+}
+
+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);
}
$data_output = json_decode($result)->payload;
-
-
if (SortCheckOut == 2) {
-
-
// Prüfen, ob $data_output ein Array ist
if (is_array($data_output)) {
usort($data_output, function ($a, $b) {
@@ -60,70 +102,54 @@ if (SortCheckOut == 2) {
foreach ($data_output as $packingjob) {
+ $PackingNoteDetail = null;
-$PackingNote_data_output;
-
-if($packingjob->is_archived != true && UseDeliveredForCheckOutCompleted){
- $PackingNoteDetailResult = $Epi->requestEpiApi('/v1/packingnote/' . $packingjob->primary_key . '?cl=' . Epirent_Mandant);
- $PackingNote_data_output = json_decode($PackingNoteDetailResult)->payload[0];
-}
-
- if ($packingjob->is_archived != true && (!UseDeliveredForCheckOutCompleted || ($PackingNote_data_output->date_delivered == "0000-00-00" && $PackingNote_data_output->time_delivered == 0))) {
+ 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
+ && (
+ !UseDeliveredForCheckOutCompleted
+ || ($PackingNoteDetail->date_delivered !== "0000-00-00" || (int)$PackingNoteDetail->time_delivered !== 0)
+ )
+ && (int)$PackingNoteDetail->is_all_out !== 0
+) {
//get OrderDetails
$result = $Epi->requestEpiApi('/v1/order/' . $packingjob->order_pk . '?cl=' . Epirent_Mandant);
-
$orderdetail_output = json_decode($result)->payload[0];
- // get PackingNote Details
- if(!UseDeliveredForCheckOutCompleted){
- $PackingNoteDetailResult = $Epi->requestEpiApi('/v1/packingnote/' . $packingjob->primary_key . '?cl=' . Epirent_Mandant);
- $PackingNote_data_output = json_decode($PackingNoteDetailResult)->payload[0];
+ // get PackingNote Details, aber nur wenn nicht schon vor der schleife geholt.
+ if (!UseDeliveredForCheckOutCompleted) {
+ $PackingNoteDetailResult = $Epi->requestEpiApi('/v1/packingnote/' . $packingjob->primary_key . '?cl=' . Epirent_Mandant);
+ $PackingNoteDetail = json_decode($PackingNoteDetailResult)->payload[0];
}
- $VorbereitungsTimeDetail;
+
+ $VorbereitungsTimeDetail = null;
foreach ($orderdetail_output->order_schedule as $scheduledetail) {
-
-
- if (UsePackingNoteDateForCheckout) {
-
- $tempTimeObject = new stdClass();
- $tempTimeObject->date_start = $PackingNote_data_output->date_packing;
- $tempTimeObject->time_start = $PackingNote_data_output->time_packing;
-
- $VorbereitungsTimeDetail = $tempTimeObject;
- } else {
- if ($scheduledetail->name == Vorbereitungs_Zeitvariable) {
- $VorbereitungsTimeDetail = $scheduledetail;
- }
+ if ($scheduledetail->name == Vorbereitungs_Zeitvariable) {
+ $VorbereitungsTimeDetail = $scheduledetail;
}
}
- //End Of get Order Details
- if (CheckOut_UseDispoStartForRowMarking || ($VorbereitungsTimeDetail->date_start == null)) {
- $date = new DateTime($packingjob->date_start);
- } else if(UseDeliveredForCheckOutCompleted ){
- {
- $date = new DateTime($PackingNote_data_output->date_delivery);
-
- }
- }else{
- $date = new DateTime($VorbereitungsTimeDetail->date_start);
+ // --- Row-Marking Datum bestimmen (konfigurierbar) ---
+ $today = dayStart(new DateTimeImmutable('today', new DateTimeZone(APP_TZ)));
+ $todayFilter = $today; // für die Window-Berechnung
+ $limit = null;
+ if (CheckOut_FutureDays != -1) {
+ $limit = $todayFilter->modify('+' . (int) CheckOut_FutureDays . ' day');
}
- $date->setTime(0, 0, 0);
- $today = new DateTime();
- $today->setTime(0, 0, 0);
+ $markDate = resolveRowMarkDate($packingjob, $VorbereitungsTimeDetail, $PackingNoteDetail, (int) CheckOutRowMarkSource);
- $todayFilter = new DateTime();
- $todayFilter->setTime(0, 0, 0);
- if (CheckOut_FutureDays == -1 || $date <= ($todayFilter->modify('+' . CheckOut_FutureDays . ' day'))) {
- //prüfe, ob entweder unbegrenzte (-1) Anzeige Aktiv ist, oder das Datum kleiner oder Gleich heute + Zukunftsspanne ist
- if ($date == $today) {
+ if (CheckOut_FutureDays == -1 || ($markDate && $markDate <= $limit)) {
+ $trClass = rowClassForDate($markDate, $today);
- echo "";
}
@@ -136,61 +162,37 @@ if($packingjob->is_archived != true && UseDeliveredForCheckOutCompleted){
echo "| " . $packingjob->contact->name . " | ";
echo "" . $packingjob->event . " | ";
-
+ if (ShowCheckoutTimeOnCheckout || ShowVorbereitungTimeOnCheckout || ShowPackagingTimeOnCheckout || ShowDeliveryTimeOnCheckout) { echo "";}
+
- if(UseDeliveredForCheckOutCompleted){
-
- if (CheckOut_UseDispoStartForRowMarking || ($VorbereitungsTimeDetail->date_start == null)) {
- $date = new DateTime($packingjob->date_start);
- } else {
- $date = new DateTime($VorbereitungsTimeDetail->date_start);
- }
-
- if ($date == $today) {
-
- echo " | ";
- } else if ($date < $today) {
- echo " | ";
- } else {
- echo " | ";
+ if (ShowCheckoutTimeOnCheckout && $packingjob->date_start != null) {
+ echoMarkedTimeLine($packingjob->date_start, (int) $packingjob->time_start, $today, ShowTimesOnCheckout);
+ }
+ if (ShowVorbereitungTimeOnCheckout && $VorbereitungsTimeDetail && $VorbereitungsTimeDetail->date_start != null) {
+ if (ShowCheckoutTimeOnCheckout) {
+ echo " ";
+ }
+ echoMarkedTimeLine($VorbereitungsTimeDetail->date_start, (int) $VorbereitungsTimeDetail->time_start, $today, ShowTimesOnCheckout);
+ }
+ if (ShowPackagingTimeOnCheckout && $PackingNoteDetail && $PackingNoteDetail->date_packing != null) {
+ if (ShowCheckoutTimeOnCheckout || ShowVorbereitungTimeOnCheckout) {
+ echo " ";
+ }
+ echoMarkedTimeLine($PackingNoteDetail->date_packing, (int) $PackingNoteDetail->time_packing, $today, ShowTimesOnCheckout);
+ }
+ if (ShowDeliveryTimeOnCheckout && $PackingNoteDetail && $PackingNoteDetail->date_delivery != null) {
+ if (ShowCheckoutTimeOnCheckout || ShowVorbereitungTimeOnCheckout || ShowPackagingTimeOnCheckout) {
+ echo " ";
+ }
+ echoMarkedTimeLine($PackingNoteDetail->date_delivery, (int) $PackingNoteDetail->time_delivery, $today, ShowTimesOnCheckout);
+ }
+
+
+ if (ShowCheckoutTimeOnCheckout || ShowVorbereitungTimeOnCheckout || ShowPackagingTimeOnCheckout || ShowDeliveryTimeOnCheckout) {
+ echo " | ";
}
-
- }else{
echo "";
-
- }
-
- if ($VorbereitungsTimeDetail->date_start != null) {
-
- if(!HideDispoTimes){
- echo "".date_format(new \DateTime($packingjob->date_start), 'd.m.Y') . " " . getTimeFromSeconds($packingjob->time_start) . " ";
- }
- echo "" . date_format(new \DateTime($VorbereitungsTimeDetail->date_start), 'd.m.Y') . " " . getTimeFromSeconds($VorbereitungsTimeDetail->time_start) . " | ";
-
-
-
- } else if(!HideDispoTimes){
- date_format(new \DateTime($packingjob->date_start), 'd.m.Y') . " " . getTimeFromSeconds($packingjob->time_start) . "";
- }
-
-
-
- if (!HideCheckInTimeOnCheckout) {
- if (($VorbereitungsTimeDetail->date_end != null)) {
-
- if(!HideDispoTimes){
-
- echo "" . date_format(new \DateTime($packingjob->date_end), 'd.m.Y') . " " . getTimeFromSeconds($packingjob->time_end) . "
";
- }
- echo "" . date_format(new \DateTime($VorbereitungsTimeDetail->date_end), 'd.m.Y') . " " . getTimeFromSeconds($VorbereitungsTimeDetail->time_end) . "";
-
- } else if(!HideDispoTimes){
- echo date_format(new \DateTime($packingjob->date_end), 'd.m.Y') . " " . getTimeFromSeconds($packingjob->time_end) . "";
- }
- }
- echo "";
-
if ($packingjob->is_all_out == 0) {
echo "";
@@ -203,52 +205,65 @@ if($packingjob->is_archived != true && UseDeliveredForCheckOutCompleted){
echo ($packingjob->pieces_sum_total - abs($packingjob->is_all_out)) . "/" . $packingjob->pieces_sum_total;
echo " | ";
-
- if(ShowShippingIcons){
-
- if(UseShippingStatus){
- if(($PackingNote_data_output->status==ShippingOutOrganizedStatus)||($PackingNote_data_output->status==ShippingOrganizedStatus)){
- echo "";
- }else{
- echo " | ";
- }
-
- if($PackingNote_data_output->is_self_pickup){
- echo '';
- } else{
- if(preg_match('/'.KurierContainsText.'/i',$PackingNote_data_output->shipping_out)){
- echo '';
+ if (ShowShippingIcons) {
+
+ if (UseShippingStatus) {
+ if (($PackingNoteDetail->status == ShippingOutOrganizedStatus) || ($PackingNoteDetail->status == ShippingOrganizedStatus)) {
+ echo " | ";
+ } else {
+ echo " | ";
}
- if(preg_match('/'.SpeditionContainsText.'/i',$PackingNote_data_output->shipping_out)){
- echo '';
- }
- if(preg_match('/'.DHLContainsText.'/i',$PackingNote_data_output->shipping_out)){
- echo '';
- }
- if(preg_match('/'.LKWContainsText.'/i',$PackingNote_data_output->shipping_out)){
- echo '';
- }
- if(preg_match('/'.TransporterContainsText.'/i',$PackingNote_data_output->shipping_out)){
- echo '';
- }
- if(preg_match('/'.PKWContainsText.'/i',$PackingNote_data_output->shipping_out)){
- echo '';
+
+ if ($PackingNoteDetail->is_self_pickup) {
+ echo '';
+ } else {
+ if (preg_match('/' . KurierContainsText . '/i', $PackingNoteDetail->shipping_out)) {
+ echo '';
+ }
+ if (preg_match('/' . SpeditionContainsText . '/i', $PackingNoteDetail->shipping_out)) {
+ echo '';
+ }
+ if (preg_match('/' . DHLContainsText . '/i', $PackingNoteDetail->shipping_out)) {
+ echo '';
+ }
+ if (preg_match('/' . LKWContainsText . '/i', $PackingNoteDetail->shipping_out)) {
+ echo '';
+ }
+ if (preg_match('/' . TransporterContainsText . '/i', $PackingNoteDetail->shipping_out)) {
+ echo '';
+ }
+ if (preg_match('/' . PKWContainsText . '/i', $PackingNoteDetail->shipping_out)) {
+ echo '';
+ }
}
+ echo " | ";
}
- echo "";
-
- }
-
- echo "
";
- }
-
-
+
+ echo "";
+ }
+
echo "";
}
}
}
+function echoMarkedTimeLine(?string $dateStr, ?int $timeSeconds, DateTimeImmutable $today, $ReturnTime): void {
+ if (!$dateStr)
+ return;
+ $d = dt($dateStr);
+ if (!$d)
+ return;
+
+ $mark = dayStart($d);
+ $cls = rowClassForDate($mark, $today);
+
+ echo $cls ? "