index.php 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  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. $pageTitle = 'Admin Dashboard';
  10. $orders = getOrders();
  11. $products = getProducts();
  12. $organizations = getOrganizations(false);
  13. $backorderGroups = getBackorderGroups();
  14. $backorderCount = 0;
  15. foreach ($backorderGroups as $group) {
  16. $backorderCount += (int) $group['to_be_backordered'] + (int) $group['ordered'];
  17. }
  18. $stats = [
  19. 'products' => count($products),
  20. 'organizations' => count($organizations),
  21. 'unconfirmed' => 0,
  22. 'open' => 0,
  23. 'partial' => 0,
  24. 'processed' => 0,
  25. 'cancelled' => 0,
  26. 'backorder' => $backorderCount,
  27. ];
  28. foreach ($orders as $order) {
  29. if ($order['confirmation_status'] === 'pending') {
  30. $stats['unconfirmed']++;
  31. } elseif ($order['status'] === 'cancelled') {
  32. $stats['cancelled']++;
  33. } elseif ($order['status'] === 'processed') {
  34. $stats['processed']++;
  35. } elseif ($order['status'] === 'partial') {
  36. $stats['partial']++;
  37. } else {
  38. $stats['open']++;
  39. }
  40. }
  41. $recentOrders = $orders;
  42. usort($recentOrders, function ($left, $right) {
  43. return strcmp($right['created_at'], $left['created_at']);
  44. });
  45. $recentOrders = array_slice($recentOrders, 0, 5);
  46. $outstandingItems = [];
  47. foreach ($orders as $order) {
  48. $label = getOrderStatusLabel($order);
  49. if ($label !== 'Offen' && $label !== 'Teilweise bearbeitet') {
  50. continue;
  51. }
  52. foreach ($order['items'] as $item) {
  53. if (!empty($item['is_processed'])) {
  54. continue;
  55. }
  56. $outstandingItems[] = [
  57. 'order_id' => $order['id'],
  58. 'customer_name' => $order['customer_name'],
  59. 'organization_label' => $order['organization_label'],
  60. 'created_at' => $order['created_at'],
  61. 'product_name' => $item['product_name'],
  62. 'size' => $item['size'],
  63. 'availability_label' => $item['availability_label'],
  64. 'backorder_status' => $item['backorder_status'] ?? '',
  65. ];
  66. }
  67. }
  68. usort($outstandingItems, function ($left, $right) {
  69. $cmp = strcmp($left['created_at'], $right['created_at']);
  70. if ($cmp !== 0) {
  71. return $cmp;
  72. }
  73. $cmp = strcmp($left['order_id'], $right['order_id']);
  74. if ($cmp !== 0) {
  75. return $cmp;
  76. }
  77. return strcmp($left['product_name'], $right['product_name']);
  78. });
  79. $bodyClass = 'admin-page';
  80. include __DIR__ . '/../includes/header.php';
  81. ?>
  82. <div class="admin-header">
  83. <h2>Admin Dashboard</h2>
  84. <div class="admin-dashboard-actions">
  85. <a href="orders.php" class="btn">Bestellungen</a>
  86. <details class="admin-actions-dropdown">
  87. <summary class="btn btn-secondary">Verwaltung</summary>
  88. <div class="admin-actions-menu">
  89. <a href="products.php">Produkte verwalten</a>
  90. <a href="categories.php">Kategorien verwalten</a>
  91. <a href="organizations.php">Organisationen verwalten</a>
  92. <a href="settings.php">Einstellungen</a>
  93. <a href="faq.php">FAQ bearbeiten</a>
  94. <a href="backorders.php">Nachbestellungen verwalten</a>
  95. <a href="admins.php">Admins verwalten</a>
  96. <form method="POST" action="login.php" class="inline-form">
  97. <?php echo csrfField(); ?>
  98. <button type="submit" name="logout" class="btn btn-secondary btn-small">Abmelden</button>
  99. </form>
  100. </div>
  101. </details>
  102. </div>
  103. </div>
  104. <div class="admin-stats">
  105. <div class="stat-card">
  106. <h3>Produkte</h3>
  107. <div class="stat-value"><?php echo $stats['products']; ?></div>
  108. </div>
  109. <div class="stat-card">
  110. <h3>Organisationen</h3>
  111. <div class="stat-value"><?php echo $stats['organizations']; ?></div>
  112. </div>
  113. <div class="stat-card">
  114. <h3>Unbestätigt</h3>
  115. <div class="stat-value"><?php echo $stats['unconfirmed']; ?></div>
  116. </div>
  117. <div class="stat-card">
  118. <h3>Offen</h3>
  119. <div class="stat-value"><?php echo $stats['open']; ?></div>
  120. </div>
  121. <div class="stat-card">
  122. <h3>Teilweise bearbeitet</h3>
  123. <div class="stat-value"><?php echo $stats['partial']; ?></div>
  124. </div>
  125. <div class="stat-card">
  126. <h3>Bearbeitet</h3>
  127. <div class="stat-value"><?php echo $stats['processed']; ?></div>
  128. </div>
  129. <div class="stat-card">
  130. <h3>Storniert</h3>
  131. <div class="stat-value"><?php echo $stats['cancelled']; ?></div>
  132. </div>
  133. <div class="stat-card">
  134. <h3>Nachbestellung</h3>
  135. <div class="stat-value"><?php echo $stats['backorder']; ?></div>
  136. </div>
  137. </div>
  138. <h3 class="section-title mt-4">Letzte Bestellungen</h3>
  139. <?php if (empty($recentOrders)): ?>
  140. <p>Keine Bestellungen vorhanden.</p>
  141. <?php else: ?>
  142. <div class="table-responsive">
  143. <table class="responsive-table">
  144. <thead>
  145. <tr>
  146. <th>Bestellnummer</th>
  147. <th>Name</th>
  148. <th>Organisation</th>
  149. <th>Erstellt</th>
  150. <th>Status</th>
  151. <th>Aktionen</th>
  152. </tr>
  153. </thead>
  154. <tbody>
  155. <?php foreach ($recentOrders as $order): ?>
  156. <tr>
  157. <td data-label="Bestellnummer"><strong><?php echo escape($order['id']); ?></strong></td>
  158. <td data-label="Name"><?php echo escape($order['customer_name']); ?></td>
  159. <td data-label="Organisation"><?php echo escape($order['organization_label']); ?></td>
  160. <td data-label="Erstellt"><?php echo escape(formatDate($order['created_at'])); ?></td>
  161. <td data-label="Status"><span class="status <?php echo escape(getOrderStatusClass($order)); ?>"><?php echo escape(getOrderStatusLabel($order)); ?></span></td>
  162. <td data-label="Aktionen"><a href="orders.php?order_id=<?php echo urlencode($order['id']); ?>" class="btn btn-small">Details</a></td>
  163. </tr>
  164. <?php endforeach; ?>
  165. </tbody>
  166. </table>
  167. </div>
  168. <?php endif; ?>
  169. <h3 class="section-title mt-4">Offene Positionen</h3>
  170. <?php if (empty($outstandingItems)): ?>
  171. <p>Keine offenen Positionen vorhanden.</p>
  172. <?php else: ?>
  173. <div class="table-responsive">
  174. <table class="responsive-table">
  175. <thead>
  176. <tr>
  177. <th>Bestellnummer</th>
  178. <th>Name</th>
  179. <th>Organisation</th>
  180. <th>Artikel</th>
  181. <th>Größe</th>
  182. <th>Lieferhinweis</th>
  183. <th>Nachbestellung</th>
  184. <th>Erstellt</th>
  185. <th>Aktionen</th>
  186. </tr>
  187. </thead>
  188. <tbody>
  189. <?php foreach ($outstandingItems as $row): ?>
  190. <tr>
  191. <td data-label="Bestellnummer"><strong><?php echo escape($row['order_id']); ?></strong></td>
  192. <td data-label="Name"><?php echo escape($row['customer_name']); ?></td>
  193. <td data-label="Organisation"><?php echo escape($row['organization_label']); ?></td>
  194. <td data-label="Artikel"><?php echo escape($row['product_name']); ?></td>
  195. <td data-label="Größe"><?php echo $row['size'] !== '' ? escape($row['size']) : '-'; ?></td>
  196. <td data-label="Lieferhinweis"><?php echo $row['availability_label'] !== '' ? escape($row['availability_label']) : '-'; ?></td>
  197. <td data-label="Nachbestellung">
  198. <?php if (($row['backorder_status'] ?? '') !== ''): ?>
  199. <span class="status <?php echo escape(getBackorderStatusClass($row['backorder_status'])); ?>"><?php echo escape(getBackorderStatusLabel($row['backorder_status'])); ?></span>
  200. <?php else: ?>
  201. -
  202. <?php endif; ?>
  203. </td>
  204. <td data-label="Erstellt"><?php echo escape(formatDate($row['created_at'])); ?></td>
  205. <td data-label="Aktionen"><a href="orders.php?details=<?php echo urlencode($row['order_id']); ?>" class="btn btn-small">Details</a></td>
  206. </tr>
  207. <?php endforeach; ?>
  208. </tbody>
  209. </table>
  210. </div>
  211. <?php endif; ?>
  212. <?php include __DIR__ . '/../includes/footer.php'; ?>