File manager - Edit - /home/webapp69.cm.in.th/u69319090041/Shop41/vendor_panel/orders.php
Back
<?php /** * vendor_panel/orders.php — Merchant Order Management * Complete Production-Ready Order Management System with Batch Updates, Filters, Search, Tracking & Print Slips */ ob_start(); // บัฟเฟอร์ output เพื่อให้ header() ทำงานได้แม้หลัง HTML ถูกส่งออกแล้ว // หมายเหตุ: session_start() ถูกจัดการโดย middleware.php แล้ว ไม่ต้องเรียกซ้ำ require_once __DIR__ . '/vendor_header.php'; $db = getDBConnection(); // ── BATCH STATUS UPDATE ───────────────────────────────────── if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['batch_update_status'])) { verifyCSRFToken($_POST['csrf_token'] ?? ''); $orderIds = $_POST['order_ids'] ?? []; $newStatus = sanitize($_POST['batch_status'] ?? ''); $allowed = ['processing', 'shipped', 'completed', 'cancelled']; if (!empty($orderIds) && in_array($newStatus, $allowed)) { $placeholders = implode(',', array_fill(0, count($orderIds), '?')); $params = array_merge([$newStatus, $vendorId], array_map('intval', $orderIds)); // อัปเดตสถานะใน vendor_orders $stmt = $db->prepare("UPDATE vendor_orders SET status=?, updated_at=NOW() WHERE vendor_id=? AND id IN ($placeholders)"); $stmt->execute($params); // Sync สถานะไปยัง orders table (ฝั่งลูกค้า) — ดึง order_id จาก vendor_orders ที่เพิ่งอัปเดต $syncParams = array_merge([$newStatus, $vendorId], array_map('intval', $orderIds)); $db->prepare(" UPDATE orders SET order_status=?, updated_at=NOW() WHERE id IN ( SELECT order_id FROM vendor_orders WHERE vendor_id=? AND id IN ($placeholders) ) ")->execute($syncParams); $_SESSION['flash_success'] = 'อัปเดตสถานะออเดอร์แบบ Batch (' . count($orderIds) . ' รายการ) เรียบร้อยแล้ว'; } else { $_SESSION['flash_error'] = 'กรุณาเลือกออเดอร์อย่างน้อย 1 รายการ และระบุสถานะที่ถูกต้อง'; } header('Location: orders.php'); exit; } // ── SINGLE ORDER STATUS & TRACKING UPDATE ─────────────────── if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['update_single_status'])) { verifyCSRFToken($_POST['csrf_token'] ?? ''); $voId = (int)$_POST['vendor_order_id']; $status = sanitize($_POST['new_status'] ?? ''); $carrier = sanitize($_POST['carrier_name'] ?? ''); $tracking = sanitize($_POST['tracking_number'] ?? ''); requireVendorOrderOwnership($voId); $allowed = ['pending', 'processing', 'shipped', 'completed', 'cancelled']; if (in_array($status, $allowed)) { $shippedAtSql = ($status === 'shipped') ? ", shipped_at = NOW()" : ""; // 1. อัปเดต vendor_orders (ข้อมูลฝั่ง vendor) $stmt = $db->prepare("UPDATE vendor_orders SET status=?, carrier_name=?, tracking_number=?, updated_at=NOW() $shippedAtSql WHERE id=? AND vendor_id=?"); $stmt->execute([$status, $carrier, $tracking, $voId, $vendorId]); // 2. Sync สถานะ + tracking ไปยัง orders table (ฝั่งลูกค้า) $syncStmt = $db->prepare(" UPDATE orders SET order_status = ?, tracking_number = ?, updated_at = NOW() WHERE id = (SELECT order_id FROM vendor_orders WHERE id = ? AND vendor_id = ?) "); $syncStmt->execute([$status, $tracking, $voId, $vendorId]); // 3. ถ้าสถานะเป็น shipped/completed ให้อัปเดต payment_status = 'paid' ด้วย (ถ้ายังไม่ได้ paid) if (in_array($status, ['shipped', 'completed'])) { $db->prepare(" UPDATE orders SET payment_status = 'paid' WHERE id = (SELECT order_id FROM vendor_orders WHERE id = ? AND vendor_id = ?) AND payment_status != 'paid' ")->execute([$voId, $vendorId]); } $_SESSION['flash_success'] = 'อัปเดตข้อมูลและสถานะออเดอร์เรียบร้อยแล้ว'; } header('Location: orders.php' . (isset($_GET['view']) ? '?view='.$voId : '')); exit; } // ── SEARCH & FILTER PARAMETERS ────────────────────────────── $filterStatus = sanitize($_GET['status'] ?? ''); $search = sanitize($_GET['search'] ?? ''); $startDate = sanitize($_GET['start_date'] ?? ''); $endDate = sanitize($_GET['end_date'] ?? ''); $where = ["vo.vendor_id = $vendorId"]; $params = []; if (!empty($filterStatus)) { $where[] = "vo.status = ?"; $params[] = $filterStatus; } if (!empty($search)) { $where[] = "(o.order_no LIKE ? OR o.shipping_name LIKE ? OR vo.tracking_number LIKE ?)"; $params[] = "%$search%"; $params[] = "%$search%"; $params[] = "%$search%"; } if (!empty($startDate) && !empty($endDate)) { $where[] = "DATE(vo.created_at) BETWEEN ? AND ?"; $params[] = $startDate; $params[] = $endDate; } $whereSql = "WHERE " . implode(" AND ", $where); // Fetch orders list $stmt = $db->prepare(" SELECT vo.*, o.order_no, o.shipping_name, o.shipping_phone, o.shipping_address, o.payment_status, o.payment_method, o.note AS customer_note, COUNT(oi.id) AS item_count, COALESCE(SUM(oi.quantity), 0) AS total_quantity FROM vendor_orders vo JOIN orders o ON vo.order_id = o.id LEFT JOIN order_items oi ON oi.vendor_order_id = vo.id $whereSql GROUP BY vo.id ORDER BY vo.created_at DESC "); $stmt->execute($params); $orders = $stmt->fetchAll(); // Counts per status $statusCounts = [ 'all' => 0, 'pending' => 0, 'processing' => 0, 'shipped' => 0, 'completed' => 0, 'cancelled' => 0 ]; $countRows = $db->prepare("SELECT status, COUNT(*) AS cnt FROM vendor_orders WHERE vendor_id=? GROUP BY status"); $countRows->execute([$vendorId]); foreach ($countRows->fetchAll() as $r) { $statusCounts[$r['status']] = (int)$r['cnt']; $statusCounts['all'] += (int)$r['cnt']; } // ── SINGLE ORDER VIEW DETAIL ───────────────────────────────── $viewId = (int)($_GET['view'] ?? 0); $viewOrder = null; $viewItems = []; if ($viewId > 0) { requireVendorOrderOwnership($viewId); $viewStmt = $db->prepare(" SELECT vo.*, o.order_no, o.shipping_name, o.shipping_phone, o.shipping_address, o.payment_status, o.payment_method, o.note AS customer_note, o.created_at AS order_date, o.payment_slip FROM vendor_orders vo JOIN orders o ON vo.order_id = o.id WHERE vo.id = ? AND vo.vendor_id = ? "); $viewStmt->execute([$viewId, $vendorId]); $viewOrder = $viewStmt->fetch(); if ($viewOrder) { $itemStmt = $db->prepare(" SELECT oi.*, p.main_image FROM order_items oi LEFT JOIN products p ON oi.product_id = p.id WHERE oi.vendor_order_id = ? "); $itemStmt->execute([$viewId]); $viewItems = $itemStmt->fetchAll(); } } // ── PRINT MODE (Packing Slip / Shipping Label) ─────────────── $printMode = sanitize($_GET['print'] ?? ''); if (!empty($printMode) && $viewOrder) { ?> <div class="printable-area p-4 bg-white" id="printableArea"> <div class="d-flex justify-content-between align-items-center mb-4 no-print border-bottom pb-3"> <h5 class="fw-bold mb-0">🖨️ ตัวอย่างก่อนพิมพ์: <?php echo $printMode === 'shipping_label' ? 'ใบปะหน้าพัสดุ (Shipping Label)' : 'ใบจดรายการออเดอร์ (Packing Slip)'; ?></h5> <div> <button onclick="window.print()" class="btn btn-primary btn-sm px-4 me-2">🖨️ พิมพ์เอกสาร</button> <a href="orders.php?view=<?php echo $viewId; ?>" class="btn btn-outline-secondary btn-sm">ปิดหน้าต่างนี้</a> </div> </div> <?php if ($printMode === 'shipping_label'): ?> <!-- SHIPPING LABEL DESIGN --> <div style="max-width: 480px; margin: 0 auto; border: 2px dashed #000; padding: 20px; font-family: sans-serif;"> <div style="border-bottom: 2px solid #000; padding-bottom: 10px; margin-bottom: 15px;" class="d-flex justify-content-between align-items-center"> <div> <h4 style="margin:0; font-weight:bold;"><?php echo htmlspecialchars($vendor['store_name']); ?></h4> <small>ผู้ส่ง (FROM)</small> </div> <div style="text-align:right;"> <div style="font-weight:bold; font-size:1.1rem;">#<?php echo htmlspecialchars($viewOrder['order_no']); ?></div> <small><?php echo date('d/m/Y H:i', strtotime($viewOrder['created_at'])); ?></small> </div> </div> <div style="min-height: 120px; border-bottom: 2px solid #000; padding-bottom: 15px; margin-bottom: 15px;"> <small style="text-transform:uppercase; font-weight:bold; color:#555;">ผู้รับ (SHIP TO):</small> <div style="font-size: 1.2rem; font-weight: bold; margin-top: 5px;"><?php echo htmlspecialchars($viewOrder['shipping_name']); ?></div> <div style="font-size: 1rem; margin-top: 3px;">โทร: <?php echo htmlspecialchars($viewOrder['shipping_phone']); ?></div> <div style="font-size: 0.95rem; margin-top: 5px; line-height: 1.4;"><?php echo nl2br(htmlspecialchars($viewOrder['shipping_address'])); ?></div> </div> <div class="d-flex justify-content-between align-items-center"> <div> <small>ผู้จัดส่ง:</small> <div style="font-weight:bold;"><?php echo !empty($viewOrder['carrier_name']) ? htmlspecialchars($viewOrder['carrier_name']) : 'standard'; ?></div> </div> <div style="text-align:right;"> <small>เลข Tracking:</small> <div style="font-weight:bold; font-size:1.1rem;"><?php echo !empty($viewOrder['tracking_number']) ? htmlspecialchars($viewOrder['tracking_number']) : '-'; ?></div> </div> </div> </div> <?php else: ?> <!-- PACKING SLIP DESIGN --> <div style="max-width: 700px; margin: 0 auto; border: 1px solid #ddd; padding: 30px; font-family: sans-serif;"> <div class="d-flex justify-content-between align-items-center border-bottom pb-3 mb-4"> <div> <h3 style="margin:0; font-weight:bold;"><?php echo htmlspecialchars($vendor['store_name']); ?></h3> <div class="text-muted">ใบรายการจัดเตรียมสินค้า (Packing Slip)</div> </div> <div class="text-end"> <h4>Order #<?php echo htmlspecialchars($viewOrder['order_no']); ?></h4> <div>วันที่สั่งซื้อ: <?php echo date('d/m/Y H:i', strtotime($viewOrder['order_date'])); ?></div> </div> </div> <div class="row mb-4"> <div class="col-6"> <strong>ข้อมูลผู้รับ:</strong><br> <?php echo htmlspecialchars($viewOrder['shipping_name']); ?><br> โทร: <?php echo htmlspecialchars($viewOrder['shipping_phone']); ?><br> <?php echo nl2br(htmlspecialchars($viewOrder['shipping_address'])); ?> </div> <div class="col-6 text-end"> <strong>สถานะการชำระเงิน:</strong> <?php echo strtoupper($viewOrder['payment_status']); ?><br> <strong>ช่องทางชำระเงิน:</strong> <?php echo strtoupper($viewOrder['payment_method']); ?> </div> </div> <table class="table table-bordered align-middle"> <thead class="table-light"> <tr> <th style="width:50px;">#</th> <th>สินค้า</th> <th style="width:100px;" class="text-center">จำนวน</th> <th style="width:120px;" class="text-end">ราคา/ชิ้น</th> <th style="width:120px;" class="text-end">รวม</th> </tr> </thead> <tbody> <?php foreach ($viewItems as $i => $item): ?> <tr> <td><?php echo $i + 1; ?></td> <td> <strong><?php echo htmlspecialchars($item['product_name']); ?></strong> <?php if (!empty($item['size']) || !empty($item['color'])): ?> <div class="small text-muted">ตัวเลือก: <?php echo htmlspecialchars($item['size'] . ' ' . $item['color']); ?></div> <?php endif; ?> </td> <td class="text-center fw-bold"><?php echo $item['quantity']; ?></td> <td class="text-end">฿<?php echo number_format($item['price'], 2); ?></td> <td class="text-end fw-bold">฿<?php echo number_format($item['subtotal'], 2); ?></td> </tr> <?php endforeach; ?> </tbody> <tfoot> <tr> <th colspan="4" class="text-end">รวมยอดสุทธิ</th> <th class="text-end fw-bold">฿<?php echo number_format($viewOrder['subtotal'], 2); ?></th> </tr> </tfoot> </table> </div> <?php endif; ?> </div> <?php require_once __DIR__ . '/vendor_footer.php'; exit; } ?> <!-- ── HEADER & SEARCH / FILTERS ─────────────────────────────── --> <div class="d-flex flex-wrap align-items-center justify-content-between gap-3 mb-4"> <div> <h4 class="fw-bold mb-1" style="color: #0f172a;">🛒 รายการคำสั่งซื้อ (Orders Management)</h4> <p class="text-muted small mb-0">จัดการคำสั่งซื้อ อัปเดตสถานะ ออกใบปะหน้า และกรอกเลขพัสดุ</p> </div> </div> <!-- Status Filter Tabs --> <ul class="nav nav-pills gap-2 mb-4 bg-white p-2 rounded-3 border"> <li class="nav-item"> <a class="nav-link px-3 py-2 text-dark <?php echo empty($filterStatus) ? 'active bg-primary text-white' : ''; ?>" href="orders.php"> ทั้งหมด <span class="badge bg-light text-dark ms-1"><?php echo $statusCounts['all']; ?></span> </a> </li> <li class="nav-item"> <a class="nav-link px-3 py-2 text-dark <?php echo $filterStatus === 'pending' ? 'active bg-warning text-dark' : ''; ?>" href="orders.php?status=pending"> ⏳ รอดำเนินการ <span class="badge bg-warning-subtle text-dark ms-1"><?php echo $statusCounts['pending']; ?></span> </a> </li> <li class="nav-item"> <a class="nav-link px-3 py-2 text-dark <?php echo $filterStatus === 'processing' ? 'active bg-primary text-white' : ''; ?>" href="orders.php?status=processing"> 📦 กำลังแพ็ค <span class="badge bg-primary-subtle text-dark ms-1"><?php echo $statusCounts['processing']; ?></span> </a> </li> <li class="nav-item"> <a class="nav-link px-3 py-2 text-dark <?php echo $filterStatus === 'shipped' ? 'active bg-info text-white' : ''; ?>" href="orders.php?status=shipped"> 🚚 จัดส่งแล้ว <span class="badge bg-info-subtle text-dark ms-1"><?php echo $statusCounts['shipped']; ?></span> </a> </li> <li class="nav-item"> <a class="nav-link px-3 py-2 text-dark <?php echo $filterStatus === 'completed' ? 'active bg-success text-white' : ''; ?>" href="orders.php?status=completed"> ✅ สำเร็จ <span class="badge bg-success-subtle text-dark ms-1"><?php echo $statusCounts['completed']; ?></span> </a> </li> <li class="nav-item"> <a class="nav-link px-3 py-2 text-dark <?php echo $filterStatus === 'cancelled' ? 'active bg-secondary text-white' : ''; ?>" href="orders.php?status=cancelled"> ❌ ยกเลิกแล้ว <span class="badge bg-secondary-subtle text-dark ms-1"><?php echo $statusCounts['cancelled']; ?></span> </a> </li> </ul> <!-- Filter Form & Batch Actions Bar --> <form method="GET" action="orders.php" class="v-card p-3 mb-4"> <div class="row g-2 align-items-center"> <div class="col-12 col-md-5"> <div class="input-group"> <span class="input-group-text bg-light">🔍</span> <input type="text" name="search" class="form-control" placeholder="ค้นหาด้วย Order ID, ชื่อลูกค้า, เลขพัสดุ..." value="<?php echo htmlspecialchars($search); ?>"> </div> </div> <div class="col-6 col-md-3"> <input type="date" name="start_date" class="form-control" value="<?php echo htmlspecialchars($startDate); ?>"> </div> <div class="col-6 col-md-3"> <input type="date" name="end_date" class="form-control" value="<?php echo htmlspecialchars($endDate); ?>"> </div> <div class="col-12 col-md-1 text-end"> <button type="submit" class="btn btn-vendor-primary w-100">ค้นหา</button> </div> </div> </form> <!-- ── ORDERS LIST TABLE WITH BATCH ACTION ────────────────────────── --> <form method="POST" action="orders.php" id="batchForm"> <input type="hidden" name="csrf_token" value="<?php echo generateCSRFToken(); ?>"> <!-- Batch Action Toolbar --> <div class="d-flex align-items-center justify-content-between bg-white p-3 rounded-3 border mb-3"> <div class="d-flex align-items-center gap-2"> <input type="checkbox" id="selectAll" class="form-check-input"> <label for="selectAll" class="form-check-label fw-semibold small">เลือกทั้งหมด</label> <span class="text-muted small">|</span> <span class="small text-muted">อัปเดตสถานะแบบ Batch สำหรับรายการที่เลือก:</span> </div> <div class="d-flex align-items-center gap-2"> <select name="batch_status" class="form-select form-select-sm" style="width: 160px;"> <option value="">-- เลือกสถานะ --</option> <option value="processing">📦 กำลังแพ็ค</option> <option value="shipped">🚚 จัดส่งแล้ว</option> <option value="completed">✅ สำเร็จแล้ว</option> <option value="cancelled">❌ ยกเลิกออเดอร์</option> </select> <button type="submit" name="batch_update_status" class="btn btn-sm btn-dark px-3">อัปเดตสถานะพร้อมกัน</button> </div> </div> <div class="v-card overflow-hidden mb-4"> <div class="table-responsive"> <table class="table table-hover align-middle mb-0"> <thead> <tr> <th style="width:40px;"></th> <th>Order No</th> <th>ลูกค้า / เบอร์โทร</th> <th>จำนวนสินค้า</th> <th>ยอดรวมสุทธิ</th> <th>สถานะ</th> <th>บริษัทขนส่ง / Tracking</th> <th>วันที่สั่งซื้อ</th> <th class="text-end">จัดการ</th> </tr> </thead> <tbody> <?php if (empty($orders)): ?> <tr> <td colspan="9" class="text-center py-5 text-muted"> <div>🛒</div> <div class="mt-2">ไม่พบรายการคำสั่งซื้อตรงกับเงื่อนไขการค้นหา</div> </td> </tr> <?php else: ?> <?php foreach ($orders as $o): ?> <tr> <td> <input type="checkbox" name="order_ids[]" value="<?php echo $o['id']; ?>" class="form-check-input order-checkbox"> </td> <td class="fw-bold">#<?php echo htmlspecialchars($o['order_no']); ?></td> <td> <div class="fw-semibold text-dark"><?php echo htmlspecialchars($o['shipping_name']); ?></div> <div class="small text-muted">📞 <?php echo htmlspecialchars($o['shipping_phone']); ?></div> </td> <td class="fw-semibold"><?php echo $o['total_quantity']; ?> ชิ้น</td> <td class="fw-bold text-success">฿<?php echo number_format($o['subtotal'], 2); ?></td> <td> <span class="badge-status badge-status-<?php echo strtolower($o['status']); ?>"> <?php echo strtoupper($o['status']); ?> </span> </td> <td> <?php if (!empty($o['tracking_number'])): ?> <span class="badge bg-light text-dark border"><?php echo htmlspecialchars($o['carrier_name'] ?? 'standard'); ?></span> <div class="small font-monospace text-primary fw-bold"><?php echo htmlspecialchars($o['tracking_number']); ?></div> <?php else: ?> <span class="text-muted small">- ยังไม่กรอก -</span> <?php endif; ?> </td> <td class="small text-muted"><?php echo date('d/m/Y H:i', strtotime($o['created_at'])); ?></td> <td class="text-end"> <a href="orders.php?view=<?php echo $o['id']; ?>" class="btn btn-sm btn-outline-primary rounded-pill px-3"> 👁️ รายละเอียด / อัปเดต </a> </td> </tr> <?php endforeach; ?> <?php endif; ?> </tbody> </table> </div> </div> </form> <!-- ── SINGLE ORDER DETAIL MODAL / PANEL ───────────────────────── --> <?php if ($viewOrder): ?> <div class="v-card p-4 border border-primary border-2 mb-4"> <div class="d-flex justify-content-between align-items-center border-bottom pb-3 mb-3"> <div> <h5 class="fw-bold mb-1">📦 รายละเอียดคำสั่งซื้อ #<?php echo htmlspecialchars($viewOrder['order_no']); ?></h5> <span class="small text-muted">วันที่สั่งซื้อ: <?php echo date('d/m/Y H:i', strtotime($viewOrder['order_date'])); ?></span> </div> <div class="d-flex align-items-center gap-2"> <!-- Print Buttons --> <a href="orders.php?view=<?php echo $viewId; ?>&print=packing_slip" target="_blank" class="btn btn-outline-dark btn-sm">🖨️ ใบรายการ (Packing Slip)</a> <a href="orders.php?view=<?php echo $viewId; ?>&print=shipping_label" target="_blank" class="btn btn-outline-primary btn-sm">🏷️ ใบปะหน้า (Shipping Label)</a> <a href="orders.php" class="btn-close ms-2"></a> </div> </div> <div class="row g-4 mb-4"> <!-- Customer Info --> <div class="col-md-6"> <div class="p-3 bg-light rounded-3 border h-100"> <h6 class="fw-bold mb-2 text-dark">👤 ข้อมูลผู้รับสินค้า</h6> <div><strong>ชื่อ-นามสกุล:</strong> <?php echo htmlspecialchars($viewOrder['shipping_name']); ?></div> <div><strong>เบอร์โทรศัพท์:</strong> <?php echo htmlspecialchars($viewOrder['shipping_phone']); ?></div> <div class="mt-2"><strong>ที่อยู่จัดส่ง:</strong><br><?php echo nl2br(htmlspecialchars($viewOrder['shipping_address'])); ?></div> <div class="mt-2"> <strong>การชำระเงิน (<?php echo strtoupper($viewOrder['payment_method']); ?>):</strong> <span class="badge bg-secondary"><?php echo strtoupper($viewOrder['payment_status']); ?></span> <?php if (!empty($viewOrder['payment_slip'])): ?> <a href="<?php echo UPLOAD_URL . htmlspecialchars($viewOrder['payment_slip']); ?>" target="_blank" class="btn btn-sm btn-outline-info ms-2">📄 ดูสลิปชำระเงิน</a> <?php endif; ?> </div> <?php if (!empty($viewOrder['customer_note'])): ?> <div class="mt-2 text-danger small"><strong>หมายเหตุจากลูกค้า:</strong> <?php echo htmlspecialchars($viewOrder['customer_note']); ?></div> <?php endif; ?> </div> </div> <!-- Update Form (Carrier & Tracking & Status) --> <div class="col-md-6"> <form method="POST" action="orders.php" class="p-3 bg-light rounded-3 border h-100"> <input type="hidden" name="csrf_token" value="<?php echo generateCSRFToken(); ?>"> <input type="hidden" name="vendor_order_id" value="<?php echo $viewId; ?>"> <h6 class="fw-bold mb-2 text-dark">🚚 อัปเดตสถานะและเลขพัสดุ</h6> <div class="mb-2"> <label class="form-label small fw-semibold">บริษัทขนส่ง (Carrier):</label> <select name="carrier_name" class="form-select form-select-sm"> <option value="Kerry Express" <?php echo ($viewOrder['carrier_name'] === 'Kerry Express') ? 'selected' : ''; ?>>Kerry Express</option> <option value="Flash Express" <?php echo ($viewOrder['carrier_name'] === 'Flash Express') ? 'selected' : ''; ?>>Flash Express</option> <option value="ไปรษณีย์ไทย (EMS)" <?php echo ($viewOrder['carrier_name'] === 'ไปรษณีย์ไทย (EMS)') ? 'selected' : ''; ?>>ไปรษณีย์ไทย (EMS)</option> <option value="J&T Express" <?php echo ($viewOrder['carrier_name'] === 'J&T Express') ? 'selected' : ''; ?>>J&T Express</option> <option value="Ninja Van" <?php echo ($viewOrder['carrier_name'] === 'Ninja Van') ? 'selected' : ''; ?>>Ninja Van</option> </select> </div> <div class="mb-2"> <label class="form-label small fw-semibold">หมายเลขพัสดุ (Tracking Number):</label> <input type="text" name="tracking_number" class="form-control form-control-sm" placeholder="เช่น KRY12345678TH" value="<?php echo htmlspecialchars($viewOrder['tracking_number'] ?? ''); ?>"> </div> <div class="mb-3"> <label class="form-label small fw-semibold">เปลี่ยนสถานะออเดอร์:</label> <select name="new_status" class="form-select form-select-sm fw-bold"> <option value="pending" <?php echo $viewOrder['status'] === 'pending' ? 'selected' : ''; ?>>⏳ รอดำเนินการ (Pending)</option> <option value="processing" <?php echo $viewOrder['status'] === 'processing' ? 'selected' : ''; ?>>📦 กำลังแพ็ค (Processing)</option> <option value="shipped" <?php echo $viewOrder['status'] === 'shipped' ? 'selected' : ''; ?>>🚚 จัดส่งแล้ว (Shipped)</option> <option value="completed" <?php echo $viewOrder['status'] === 'completed' ? 'selected' : ''; ?>>✅ สำเร็จแล้ว (Completed)</option> <option value="cancelled" <?php echo $viewOrder['status'] === 'cancelled' ? 'selected' : ''; ?>>❌ ยกเลิก (Cancelled)</option> </select> </div> <button type="submit" name="update_single_status" class="btn btn-vendor-primary btn-sm w-100"> 💾 บันทึกการอัปเดต </button> </form> </div> </div> <!-- Items Table --> <h6 class="fw-bold mb-2">📋 รายการสินค้าในออเดอร์นี้</h6> <div class="table-responsive"> <table class="table table-bordered align-middle mb-0"> <thead class="table-light"> <tr> <th>สินค้า</th> <th class="text-center">ตัวเลือก</th> <th class="text-center">จำนวน</th> <th class="text-end">ราคา/ชิ้น</th> <th class="text-end">รวม</th> </tr> </thead> <tbody> <?php foreach ($viewItems as $item): ?> <tr> <td> <div class="d-flex align-items-center gap-2"> <img src="<?php echo !empty($item['main_image']) ? htmlspecialchars($item['main_image']) : 'https://via.placeholder.com/40'; ?>" class="rounded-2" style="width:36px;height:36px;object-fit:cover;"> <span class="fw-semibold text-dark"><?php echo htmlspecialchars($item['product_name']); ?></span> </div> </td> <td class="text-center small text-muted"> <?php echo (!empty($item['size']) || !empty($item['color'])) ? htmlspecialchars($item['size'] . ' / ' . $item['color']) : '-'; ?> </td> <td class="text-center fw-bold"><?php echo $item['quantity']; ?></td> <td class="text-end">฿<?php echo number_format($item['price'], 2); ?></td> <td class="text-end fw-bold text-success">฿<?php echo number_format($item['subtotal'], 2); ?></td> </tr> <?php endforeach; ?> </tbody> <tfoot> <tr> <th colspan="4" class="text-end">รวมยอดขายสุทธิ:</th> <th class="text-end fs-6 fw-bold text-primary">฿<?php echo number_format($viewOrder['subtotal'], 2); ?></th> </tr> </tfoot> </table> </div> </div> <?php endif; ?> <script> // Toggle select all checkboxes document.getElementById('selectAll').addEventListener('change', function() { const checkboxes = document.querySelectorAll('.order-checkbox'); checkboxes.forEach(cb => cb.checked = this.checked); }); </script> <?php require_once __DIR__ . '/vendor_footer.php'; ?>
| ver. 1.4 |
Github
|
.
| PHP 7.4.33 | Generation time: 0.24 |
proxy
|
phpinfo
|
Settings