Browse Source

adding functionality to hide orders

Medowar 1 month ago
parent
commit
d1df3130b8
5 changed files with 118 additions and 13 deletions
  1. 30 4
      admin/backorders.php
  2. 2 2
      admin/index.php
  3. 26 4
      admin/reservations.php
  4. 5 0
      assets/css/style.css
  5. 55 3
      includes/functions.php

+ 30 - 4
admin/backorders.php

@@ -17,16 +17,29 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['notify_available']))
     $message = $result['success'] ? 'Kunde wurde informiert, dass die Vorbestellung zur Abholung bereit ist.' : $result['message'];
     $messageType = $result['success'] ? 'success' : 'error';
 }
+if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['mark_hidden'])) {
+    $reservationId = sanitize($_POST['reservation_id']);
+    $result = markReservationHidden($reservationId);
+    $message = $result['success'] ? 'Vorbestellung als Spam/Gelöscht markiert und ausgeblendet.' : $result['message'];
+    $messageType = $result['success'] ? 'success' : 'error';
+}
 
 $reservations = getReservations();
 $filter = isset($_GET['filter']) ? sanitize($_GET['filter']) : 'pending';
 $searchOrderNumber = isset($_GET['order_number']) ? sanitize($_GET['order_number']) : '';
+$showAll = $filter === 'all';
 
 // Filter backorders
 $reservations = array_filter($reservations, function($r) {
     return isset($r['type']) && $r['type'] === 'backorder';
 });
 
+if (!$showAll) {
+    $reservations = array_filter($reservations, function($r) {
+        return !isReservationHidden($r);
+    });
+}
+
 if ($searchOrderNumber) {
     $reservations = array_filter($reservations, function($r) use ($searchOrderNumber) {
         return stripos($r['id'], $searchOrderNumber) !== false;
@@ -45,6 +58,10 @@ $reservations = array_reverse($reservations); // Newest first
 
 $canNotifyMap = [];
 foreach ($reservations as $reservation) {
+    if (isReservationHidden($reservation)) {
+        $canNotifyMap[$reservation['id']] = false;
+        continue;
+    }
     $isNotified = isset($reservation['backorder_status']) && $reservation['backorder_status'] === 'notified';
     $canNotifyMap[$reservation['id']] = !$isNotified && canFulfillReservationItems($reservation['items']);
 }
@@ -186,7 +203,9 @@ include __DIR__ . '/../includes/header.php';
                     <td data-label="Erstellt"><?php echo formatDate($reservation['created']); ?></td>
                     <td data-label="Status">
                         <?php
-                        if (isset($reservation['backorder_status']) && $reservation['backorder_status'] === 'notified') {
+                        if (isReservationHidden($reservation)) {
+                            echo '<span class="status status-hidden">Spam/Gelöscht</span>';
+                        } elseif (isset($reservation['backorder_status']) && $reservation['backorder_status'] === 'notified') {
                             echo '<span class="status status-notified">Informiert</span>';
                         } else {
                             echo '<span class="status status-open">Offen</span>';
@@ -194,12 +213,18 @@ include __DIR__ . '/../includes/header.php';
                         ?>
                     </td>
                     <td data-label="Aktionen">
-                        <?php if ((!isset($reservation['backorder_status']) || $reservation['backorder_status'] !== 'notified') && canFulfillReservationItems($reservation['items'])): ?>
+                        <?php if (!isReservationHidden($reservation) && (!isset($reservation['backorder_status']) || $reservation['backorder_status'] !== 'notified') && canFulfillReservationItems($reservation['items'])): ?>
                             <form method="POST" style="display: inline;" onsubmit="return confirm('Kunden informieren, dass die Vorbestellung zur Abholung bereit ist?');">
                                 <input type="hidden" name="reservation_id" value="<?php echo htmlspecialchars($reservation['id']); ?>">
                                 <button type="submit" name="notify_available" class="btn btn-small">Abholung bereit</button>
                             </form>
                         <?php endif; ?>
+                        <?php if (!isReservationHidden($reservation)): ?>
+                            <form method="POST" style="display: inline;" onsubmit="return confirm('Vorbestellung als Spam/Gelöscht markieren? Die Vorbestellung wird überall ausgeblendet.');">
+                                <input type="hidden" name="reservation_id" value="<?php echo htmlspecialchars($reservation['id']); ?>">
+                                <button type="submit" name="mark_hidden" class="btn btn-secondary btn-small">Spam/Gelöscht</button>
+                            </form>
+                        <?php endif; ?>
                         <button onclick="showDetails('<?php echo htmlspecialchars($reservation['id']); ?>')" class="btn btn-secondary btn-small">Details</button>
                     </td>
                 </tr>
@@ -242,8 +267,9 @@ function showDetails(reservationId) {
     });
     itemsHtml += '</ul>';
     
-    const statusText = reservation.backorder_status === 'notified' ? 'Informiert' : 'Offen';
-    const statusClass = reservation.backorder_status === 'notified' ? 'status-notified' : 'status-open';
+    const isHidden = reservation.is_hidden === true;
+    const statusText = isHidden ? 'Spam/Gelöscht' : (reservation.backorder_status === 'notified' ? 'Informiert' : 'Offen');
+    const statusClass = isHidden ? 'status-hidden' : (reservation.backorder_status === 'notified' ? 'status-notified' : 'status-open');
     const html = `
         <h2>Vorbestellungsdetails</h2>
         <p><strong>Bestellnummer:</strong> <strong class="order-highlight">${reservation.id}</strong></p>

+ 2 - 2
admin/index.php

@@ -19,10 +19,10 @@ expireOldReservations();
 $reservations = getReservations(); // Refresh after expiry
 
 $regularReservations = array_filter($reservations, function($r) {
-    return !isset($r['type']) || $r['type'] !== 'backorder';
+    return (!isset($r['type']) || $r['type'] !== 'backorder') && !isReservationHidden($r);
 });
 $backorderReservations = array_filter($reservations, function($r) {
-    return isset($r['type']) && $r['type'] === 'backorder';
+    return isset($r['type']) && $r['type'] === 'backorder' && !isReservationHidden($r);
 });
 
 $totalProducts = count($products);

+ 26 - 4
admin/reservations.php

@@ -20,16 +20,29 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['mark_picked_up'])) {
     $message = 'Reservierung als abgeholt markiert.';
     $messageType = 'success';
 }
+if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['mark_hidden'])) {
+    $reservationId = sanitize($_POST['reservation_id']);
+    $result = markReservationHidden($reservationId);
+    $message = $result['success'] ? 'Reservierung als Spam/Gelöscht markiert und ausgeblendet.' : $result['message'];
+    $messageType = $result['success'] ? 'success' : 'error';
+}
 
 $reservations = getReservations();
 $filter = isset($_GET['filter']) ? sanitize($_GET['filter']) : 'open';
 $searchOrderNumber = isset($_GET['order_number']) ? sanitize($_GET['order_number']) : '';
+$showAll = $filter === 'all';
 
 // Exclude backorders
 $reservations = array_filter($reservations, function($r) {
     return !isset($r['type']) || $r['type'] !== 'backorder';
 });
 
+if (!$showAll) {
+    $reservations = array_filter($reservations, function($r) {
+        return !isReservationHidden($r);
+    });
+}
+
 // Filter reservations
 if ($searchOrderNumber) {
     $reservations = array_filter($reservations, function($r) use ($searchOrderNumber) {
@@ -130,7 +143,9 @@ include __DIR__ . '/../includes/header.php';
                     <td data-label="Erstellt"><?php echo formatDate($reservation['created']); ?></td>
                     <td data-label="Status">
                         <?php
-                        if ($reservation['picked_up']) {
+                        if (isReservationHidden($reservation)) {
+                            echo '<span class="status status-hidden">Spam/Gelöscht</span>';
+                        } elseif ($reservation['picked_up']) {
                             echo '<span class="status status-picked">Abgeholt</span>';
                         } elseif ($reservation['status'] === 'expired') {
                             echo '<span class="status status-expired">Abgelaufen</span>';
@@ -140,12 +155,18 @@ include __DIR__ . '/../includes/header.php';
                         ?>
                     </td>
                     <td data-label="Aktionen">
-                        <?php if (!$reservation['picked_up'] && $reservation['status'] === 'open'): ?>
+                        <?php if (!isReservationHidden($reservation) && !$reservation['picked_up'] && $reservation['status'] === 'open'): ?>
                             <form method="POST" style="display: inline;" onsubmit="return confirm('Reservierung als abgeholt markieren?');">
                                 <input type="hidden" name="reservation_id" value="<?php echo htmlspecialchars($reservation['id']); ?>">
                                 <button type="submit" name="mark_picked_up" class="btn btn-small">Als abgeholt markieren</button>
                             </form>
                         <?php endif; ?>
+                        <?php if (!isReservationHidden($reservation)): ?>
+                            <form method="POST" style="display: inline;" onsubmit="return confirm('Reservierung als Spam/Gelöscht markieren? Die Reservierung wird überall ausgeblendet.');">
+                                <input type="hidden" name="reservation_id" value="<?php echo htmlspecialchars($reservation['id']); ?>">
+                                <button type="submit" name="mark_hidden" class="btn btn-secondary btn-small">Spam/Gelöscht</button>
+                            </form>
+                        <?php endif; ?>
                         <button onclick="showDetails('<?php echo htmlspecialchars($reservation['id']); ?>')" class="btn btn-secondary btn-small">Details</button>
                     </td>
                 </tr>
@@ -183,8 +204,9 @@ function showDetails(reservationId) {
     });
     itemsHtml += '</ul>';
     
-    const statusText = reservation.picked_up ? 'Abgeholt' : (reservation.status === 'expired' ? 'Abgelaufen' : 'Offen');
-    const statusClass = reservation.picked_up ? 'status-picked' : (reservation.status === 'expired' ? 'status-expired' : 'status-open');
+    const isHidden = reservation.is_hidden === true;
+    const statusText = isHidden ? 'Spam/Gelöscht' : (reservation.picked_up ? 'Abgeholt' : (reservation.status === 'expired' ? 'Abgelaufen' : 'Offen'));
+    const statusClass = isHidden ? 'status-hidden' : (reservation.picked_up ? 'status-picked' : (reservation.status === 'expired' ? 'status-expired' : 'status-open'));
     const html = `
         <h2>Reservierungsdetails</h2>
         <p><strong>Bestellnummer:</strong> <strong class="order-highlight">${reservation.id}</strong></p>

+ 5 - 0
assets/css/style.css

@@ -474,6 +474,11 @@ footer {
     border-color: var(--brand-danger);
 }
 
+.status-hidden {
+    color: #9ca3af;
+    border-color: #6b7280;
+}
+
 .order-highlight {
     font-size: 1.5rem;
     color: var(--brand-accent);

+ 55 - 3
includes/functions.php

@@ -70,13 +70,20 @@ function getReservations() {
 function getReservationByOrderNumber($orderNumber) {
     $reservations = getReservations();
     foreach ($reservations as $reservation) {
-        if (isset($reservation['id']) && $reservation['id'] === $orderNumber) {
+        if (isset($reservation['id']) && $reservation['id'] === $orderNumber && !isReservationHidden($reservation)) {
             return $reservation;
         }
     }
     return null;
 }
 
+/**
+ * Check if reservation is hidden (spam/deleted)
+ */
+function isReservationHidden($reservation) {
+    return isset($reservation['is_hidden']) && $reservation['is_hidden'] === true;
+}
+
 /**
  * Save reservations
  */
@@ -260,7 +267,8 @@ function createReservation($customerName, $customerEmail, $items) {
         'expires' => $expires->format('Y-m-d H:i:s'),
         'status' => 'open',
         'picked_up' => false,
-        'type' => 'regular'
+        'type' => 'regular',
+        'is_hidden' => false
     ];
     
     $reservations[] = $reservation;
@@ -290,7 +298,8 @@ function createBackorderReservation($customerName, $customerEmail, $items) {
         'status' => 'open',
         'picked_up' => false,
         'type' => 'backorder',
-        'backorder_status' => 'pending'
+        'backorder_status' => 'pending',
+        'is_hidden' => false
     ];
     
     $reservations[] = $reservation;
@@ -309,6 +318,9 @@ function markReservationPickedUp($reservationId) {
     $reservations = getReservations();
     foreach ($reservations as &$reservation) {
         if ($reservation['id'] === $reservationId) {
+            if (isReservationHidden($reservation)) {
+                break;
+            }
             $reservation['picked_up'] = true;
             $reservation['status'] = 'picked_up';
             break;
@@ -317,6 +329,40 @@ function markReservationPickedUp($reservationId) {
     saveReservations($reservations);
 }
 
+/**
+ * Mark reservation/backorder as spam/deleted and hide it from non-admin views.
+ * For open regular reservations we release stock, because the order is discarded.
+ */
+function markReservationHidden($reservationId) {
+    $reservations = getReservations();
+    foreach ($reservations as &$reservation) {
+        if ($reservation['id'] !== $reservationId) {
+            continue;
+        }
+        if (isReservationHidden($reservation)) {
+            return ['success' => false, 'message' => 'Bestellung ist bereits als Spam/Gelöscht markiert.'];
+        }
+
+        $isBackorder = isset($reservation['type']) && $reservation['type'] === 'backorder';
+        if (!$isBackorder && isset($reservation['status']) && $reservation['status'] === 'open' && empty($reservation['picked_up'])) {
+            foreach ($reservation['items'] as $item) {
+                $size = isset($item['size']) ? $item['size'] : null;
+                releaseStock($item['product_id'], $item['quantity'], $size);
+            }
+            $reservation['status'] = 'deleted';
+        }
+
+        $reservation['is_hidden'] = true;
+        $reservation['hidden_at'] = date('Y-m-d H:i:s');
+        $reservation['hidden_reason'] = 'spam_deleted';
+        saveReservations($reservations);
+
+        return ['success' => true];
+    }
+
+    return ['success' => false, 'message' => 'Bestellung nicht gefunden.'];
+}
+
 /**
  * Check and expire old reservations
  */
@@ -326,6 +372,9 @@ function expireOldReservations() {
     $changed = false;
     
     foreach ($reservations as &$reservation) {
+        if (isReservationHidden($reservation)) {
+            continue;
+        }
         if ($reservation['status'] === 'open' && !$reservation['picked_up']) {
             if (isset($reservation['type']) && $reservation['type'] === 'backorder') {
                 continue;
@@ -371,6 +420,9 @@ function markBackorderAvailable($reservationId) {
     $reservations = getReservations();
     foreach ($reservations as &$reservation) {
         if ($reservation['id'] === $reservationId) {
+            if (isReservationHidden($reservation)) {
+                return ['success' => false, 'message' => 'Diese Vorbestellung ist als Spam/Gelöscht markiert.'];
+            }
             if (!isset($reservation['type']) || $reservation['type'] !== 'backorder') {
                 return ['success' => false, 'message' => 'Diese Vorbestellung wurde bereits in eine Bestellung umgewandelt.'];
             }