orders.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. <?php
  2. require_once __DIR__ . "/../config.php";
  3. require_once __DIR__ . "/../includes/functions.php";
  4. if (empty($_SESSION['admin_logged_in'])) {
  5. header("Location: login.php");
  6. exit();
  7. }
  8. expirePendingOrders();
  9. if (isset($_GET['details']) && trim((string) $_GET['details']) !== "") {
  10. header(
  11. "Location: order.php?id=" .
  12. urlencode(trim((string) $_GET['details'])),
  13. );
  14. exit();
  15. }
  16. $pageTitle = "Bestellungen";
  17. $orders = getOrders();
  18. usort($orders, function ($left, $right) {
  19. return strcmp($right["created_at"], $left["created_at"]);
  20. });
  21. $filter = trim((string) ($_GET['filter'] ?? "all"));
  22. $searchOrderId = trim((string) ($_GET['order_id'] ?? ""));
  23. if ($searchOrderId !== "") {
  24. $orders = array_values(
  25. array_filter($orders, function ($order) use ($searchOrderId) {
  26. return stripos($order["id"], $searchOrderId) !== false;
  27. }),
  28. );
  29. }
  30. if ($filter !== "all") {
  31. $orders = array_values(
  32. array_filter($orders, function ($order) use ($filter) {
  33. switch ($filter) {
  34. case "unconfirmed":
  35. return $order["confirmation_status"] === "pending";
  36. case "expired":
  37. return $order["confirmation_status"] === "expired";
  38. case "open":
  39. return $order["confirmation_status"] !== "pending" &&
  40. $order["status"] === "open";
  41. case "partial":
  42. return $order["status"] === "partial";
  43. case "processed":
  44. return $order["status"] === "processed";
  45. case "cancelled":
  46. return $order["status"] === "cancelled";
  47. }
  48. return true;
  49. }),
  50. );
  51. }
  52. $bodyClass = "admin-page";
  53. include __DIR__ . "/../includes/header.php";
  54. ?>
  55. <div class="admin-header">
  56. <h2>Bestellungen</h2>
  57. <div>
  58. <a href="index.php" class="btn btn-secondary">Zurück zum Dashboard</a>
  59. </div>
  60. </div>
  61. <div class="panel">
  62. <form method="GET" class="admin-filter-form">
  63. <div class="admin-filter-field admin-filter-field-wide">
  64. <label for="order_id">Bestellnummer suchen</label>
  65. <input type="text" id="order_id" name="order_id" value="<?php echo escape(
  66. $searchOrderId,
  67. ); ?>" placeholder="z. B. FWFS-2026-001">
  68. </div>
  69. <div>
  70. <label for="filter">Filter</label>
  71. <select id="filter" name="filter">
  72. <option value="all" <?php echo $filter === "all"
  73. ? "selected"
  74. : ""; ?>>Alle</option>
  75. <option value="unconfirmed" <?php echo $filter === "unconfirmed"
  76. ? "selected"
  77. : ""; ?>>Unbestätigt</option>
  78. <option value="expired" <?php echo $filter === "expired"
  79. ? "selected"
  80. : ""; ?>>Bestätigung abgelaufen</option>
  81. <option value="open" <?php echo $filter === "open"
  82. ? "selected"
  83. : ""; ?>>Offen</option>
  84. <option value="partial" <?php echo $filter === "partial"
  85. ? "selected"
  86. : ""; ?>>Teilweise bearbeitet</option>
  87. <option value="processed" <?php echo $filter === "processed"
  88. ? "selected"
  89. : ""; ?>>Bearbeitet</option>
  90. <option value="cancelled" <?php echo $filter === "cancelled"
  91. ? "selected"
  92. : ""; ?>>Storniert</option>
  93. </select>
  94. </div>
  95. <div class="admin-filter-actions">
  96. <button type="submit" class="btn">Filtern</button>
  97. <a href="orders.php" class="btn btn-secondary">Zurücksetzen</a>
  98. </div>
  99. </form>
  100. </div>
  101. <?php if (empty($orders)): ?>
  102. <div class="alert alert-info">
  103. <p>Keine Bestellungen gefunden.</p>
  104. </div>
  105. <?php else: ?>
  106. <div class="table-responsive">
  107. <table class="responsive-table">
  108. <thead>
  109. <tr>
  110. <th>Bestellnummer</th>
  111. <th>Name</th>
  112. <th>Organisation</th>
  113. <th>Artikel</th>
  114. <th>Erstellt</th>
  115. <th>Status</th>
  116. <th>Aktionen</th>
  117. </tr>
  118. </thead>
  119. <tbody>
  120. <?php foreach ($orders as $order): ?>
  121. <tr>
  122. <td data-label="Bestellnummer"><strong><?php echo escape(
  123. $order["id"],
  124. ); ?></strong></td>
  125. <td data-label="Name"><?php echo escape(
  126. $order["customer_name"],
  127. ); ?></td>
  128. <td data-label="Organisation"><?php echo escape(
  129. $order["organization_label"],
  130. ); ?></td>
  131. <td data-label="Artikel"><?php echo count(
  132. $order["items"],
  133. ); ?></td>
  134. <td data-label="Erstellt"><?php echo escape(
  135. formatDate($order["created_at"]),
  136. ); ?></td>
  137. <td data-label="Status"><span class="status <?php echo escape(
  138. getOrderStatusClass($order),
  139. ); ?>"><?php echo escape(
  140. getOrderStatusLabel($order),
  141. ); ?></span></td>
  142. <td data-label="Aktionen">
  143. <a href="order.php?id=<?php echo urlencode(
  144. $order["id"],
  145. ); ?>" class="btn btn-small">Details</a>
  146. </td>
  147. </tr>
  148. <?php endforeach; ?>
  149. </tbody>
  150. </table>
  151. </div>
  152. <?php endif; ?>
  153. <?php include __DIR__ . "/../includes/footer.php"; ?>