seller_orders.php 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. <?php
  2. // Αρχείο: /var/www/html/hockey-cms/seller_orders.php
  3. session_start();
  4. if (!isset($_SESSION['user_id']) or empty($_SESSION['is_seller'])) {
  5. header("Location: index.php");
  6. exit;
  7. }
  8. require_once __DIR__ . '/vendor/autoload.php';
  9. require_once __DIR__ . '/config/database.php';
  10. // --- Μηχανισμός Αλλαγής Γλώσσας ---
  11. if (isset($_GET['lang']) and in_array($_GET['lang'], ['el', 'en'])) {
  12. $_SESSION['lang'] =$_GET['lang'];
  13. }
  14. $current_lang =$_SESSION['lang'] ?? 'el';
  15. // --- Λεξικό Μεταφράσεων ---
  16. $translations = [
  17. 'el' => [
  18. 'seller_panel' => 'Πίνακας Πωλητή',
  19. 'my_listings' => 'Οι Αγγελίες Μου',
  20. 'customer_orders' => 'Παραγγελίες Πελατών',
  21. 'order_id' => 'Κωδ. Παραγγελίας',
  22. 'customer' => 'Πελάτης',
  23. 'contact' => 'Επικοινωνία / Αποστολή',
  24. 'date' => 'Ημερομηνία',
  25. 'my_products' => 'Τα Προϊόντα μου στην παραγγελία',
  26. 'status' => 'Κατάσταση',
  27. 'no_orders' => 'Δεν υπάρχουν ακόμα παραγγελίες για τα προϊόντα σου.',
  28. 'status_pending' => 'Εκκρεμεί',
  29. 'status_completed' => 'Ολοκληρώθηκε',
  30. 'status_cancelled' => 'Ακυρώθηκε',
  31. 'btn_update' => 'Ενημέρωση',
  32. 'btn_delete' => 'Διαγραφή',
  33. 'confirm_delete' => 'Σίγουρα θέλετε να διαγράψετε αυτή την παραγγελία;',
  34. 'msg_status_ok' => 'Η κατάσταση της παραγγελίας ενημερώθηκε!',
  35. 'msg_delete_ok' => 'Η παραγγελία διαγράφηκε επιτυχώς!',
  36. 'error' => 'Σφάλμα:'
  37. ],
  38. 'en' => [
  39. 'seller_panel' => 'Seller Dashboard',
  40. 'my_listings' => 'My Listings',
  41. 'customer_orders' => 'Customer Orders',
  42. 'order_id' => 'Order ID',
  43. 'customer' => 'Customer',
  44. 'contact' => 'Contact / Shipping',
  45. 'date' => 'Date',
  46. 'my_products' => 'My Products in this order',
  47. 'status' => 'Status',
  48. 'no_orders' => 'No orders found for your products yet.',
  49. 'status_pending' => 'Pending',
  50. 'status_completed' => 'Completed',
  51. 'status_cancelled' => 'Cancelled',
  52. 'btn_update' => 'Update',
  53. 'btn_delete' => 'Delete',
  54. 'confirm_delete' => 'Are you sure you want to delete this order?',
  55. 'msg_status_ok' => 'Order status updated successfully!',
  56. 'msg_delete_ok' => 'Order deleted successfully!',
  57. 'error' => 'Error:'
  58. ]
  59. ];
  60. $t =$translations[$current_lang];$seller_id = $_SESSION['user_id'];$message = '';
  61. // --- Χειρισμός Φόρμας (Αλλαγή Status ή Διαγραφή) ---
  62. if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  63. if (isset($_POST['action']) &&$_POST['action'] === 'update_status') {
  64. $order_id = (int)$_POST['order_id'];
  65. $new_status =$_POST['status'];
  66. try {
  67. $stmt =$pdo->prepare("UPDATE orders SET status = ? WHERE id = ?");
  68. $stmt->execute([$new_status, $order_id]);$message = "<div class='alert success'>{$t['msg_status_ok']}</div>";
  69. } catch (Exception $e) {$message = "<div class='alert error'>{$t['error']} " . $e->getMessage() . "</div>";
  70. }
  71. }
  72. elseif (isset($_POST['action']) &&$_POST['action'] === 'delete_order') {
  73. $order_id = (int)$_POST['order_id'];
  74. try {
  75. // Διαγράφουμε πρώτα τα είδη από το order_items και μετά την παραγγελία
  76. $pdo->beginTransaction();
  77. $pdo->prepare("DELETE FROM order_items WHERE order_id = ?")->execute([$order_id]);
  78. $pdo->prepare("DELETE FROM orders WHERE id = ?")->execute([$order_id]);
  79. $pdo->commit();$message = "<div class='alert success'>{$t['msg_delete_ok']}</div>";
  80. } catch (Exception $e) {
  81. $pdo->rollBack();$message = "<div class='alert error'>{$t['error']} " . $e->getMessage() . "</div>";
  82. }
  83. }
  84. }
  85. // --- Ανάκτηση Κατηγοριών (ΓΙΑ ΤΟ ΜΕΝΟΥ / SIDEBAR) ---
  86. try {
  87. $categoriesRaw =$pdo->query("SELECT * FROM categories ORDER BY sort_order ASC, name_el ASC")->fetchAll(PDO::FETCH_ASSOC);
  88. $categories = [];
  89. foreach ($categoriesRaw as $cat) {$cat['display_name'] = ($current_lang === 'en' && !empty($cat['name_en'])) ? $cat['name_en'] :$cat['name_el'];
  90. $categories[] =$cat;
  91. }
  92. } catch (Exception $e) {$categories = [];
  93. }
  94. // Ανάκτηση Παραγγελιών που περιέχουν προϊόντα αυτού του Πωλητή
  95. $stmtOrders =$pdo->prepare("
  96. SELECT o.id as order_id, o.customer_name, o.customer_email, o.customer_phone, o.shipping_address, o.status as order_status, o.created_at,
  97. oi.quantity, oi.price, p.title as product_title, p.id as product_id
  98. FROM orders o
  99. JOIN order_items oi ON o.id = oi.order_id
  100. JOIN products p ON oi.product_id = p.id
  101. WHERE p.seller_id = ?
  102. ORDER BY o.created_at DESC
  103. ");
  104. $stmtOrders->execute([$seller_id]);
  105. $raw_orders =$stmtOrders->fetchAll(PDO::FETCH_ASSOC);
  106. // Ομαδοποίηση παραγγελιών ανά order_id
  107. $orders = [];
  108. foreach ($raw_orders as$row) {
  109. $oid =$row['order_id'];
  110. if (!isset($orders[$oid])) {
  111. $orders[$oid] = [
  112. 'id' => $oid,
  113. 'customer_name' => $row['customer_name'],
  114. 'customer_email' => $row['customer_email'],
  115. 'customer_phone' => $row['customer_phone'],
  116. 'shipping_address' => $row['shipping_address'],
  117. 'status' => $row['order_status'],
  118. 'created_at' => $row['created_at'],
  119. 'items' => []
  120. ];
  121. }
  122. $orders[$oid]['items'][] = [
  123. 'product_id' => $row['product_id'],
  124. 'title' => $row['product_title'],
  125. 'quantity' => $row['quantity'],
  126. 'price' => $row['price']
  127. ];
  128. }
  129. // --- ΦΟΡΤΩΣΗ TWIG THEME ---
  130. // --- ΦΟΡΤΩΣΗ SETTINGS (Theme, Logo, Title) ---
  131. $active_theme = 'default';
  132. $site_logo = '';$site_title = 'Hockey CMS';
  133. try {
  134. $stmtSettings =$pdo->query("SELECT `key`, value FROM settings WHERE `key` IN ('active_theme', 'site_logo', 'site_title')");
  135. while ($row =$stmtSettings->fetch(PDO::FETCH_ASSOC)) {
  136. if ($row['key'] === 'active_theme' && !empty($row['value'])) {
  137. $active_theme =$row['value'];
  138. } elseif ($row['key'] === 'site_logo') {
  139. $site_logo =$row['value'];
  140. } elseif ($row['key'] === 'site_title' && !empty($row['value'])) {
  141. $site_title =$row['value'];
  142. }
  143. }
  144. } catch (Exception $e) {}
  145. $theme_dir = __DIR__ . '/themes/' .$active_theme;
  146. if (!is_dir($theme_dir)) {
  147. $active_theme = 'default';$theme_dir = __DIR__ . '/themes/default';
  148. }
  149. $loader = new \Twig\Loader\FilesystemLoader($theme_dir);
  150. $twig = new \Twig\Environment($loader, ['cache' => false]);
  151. $twig->addGlobal('session',$_SESSION);
  152. $twig->addGlobal('current_lang',$current_lang);
  153. $twig->addGlobal('site_logo',$site_logo); // Ορισμός global για να εμφανίζεται σωστά το λογότυπο
  154. echo $twig->render('seller_orders.html.twig', [
  155. 'site_title' => $site_title,
  156. 't' => $t,
  157. 'message' => $message,
  158. 'orders' => $orders,
  159. 'categories' => $categories
  160. ]);