File manager - Edit - /home/webapp69.cm.in.th/u69319090028/Shop/app/Services/SellerOrderService.php
Back
<?php /** * SellerOrderService * Handles seller order fulfillment lifecycle and strict store data isolation */ require_once __DIR__ . '/../Models/Order.php'; require_once __DIR__ . '/../Models/Store.php'; require_once __DIR__ . '/../Models/ActivityLog.php'; class SellerOrderService { private Order $orderModel; private Store $storeModel; private ActivityLog $activityLog; public function __construct() { $this->orderModel = new Order(); $this->storeModel = new Store(); $this->activityLog = new ActivityLog(); } private function getSellerStore(int $userId): ?array { return $this->storeModel->findByUserId($userId); } public function getSellerOrders(int $userId, array $filters = [], int $page = 1, int $perPage = 20): array { $store = $this->getSellerStore($userId); if (!$store) { return ['orders' => [], 'total' => 0, 'page' => 1, 'pages' => 0, 'filters' => $filters]; } $storeId = (int)$store['id']; $page = max(1, $page); $offset = ($page - 1) * $perPage; $total = $this->orderModel->countSellerOrders($storeId, $filters); $orders = $this->orderModel->getSellerOrders($storeId, $filters, $perPage, $offset); return [ 'orders' => $orders, 'total' => $total, 'page' => $page, 'pages' => ceil($total / $perPage), 'filters' => $filters ]; } public function getSellerOrderDetail(int $userId, string $orderNo): ?array { $store = $this->getSellerStore($userId); if (!$store) { return null; } $order = $this->orderModel->findSellerOrderByNo($orderNo, (int)$store['id']); if (!$order) { return null; } $order['items'] = $this->orderModel->getOrderItems((int)$order['id']); $order['store'] = $store; return $order; } public function updateFulfillmentStatus(int $userId, string $orderNo, string $targetStatus, ?string $trackingNo = null, ?string $shippingCarrier = null): array { $store = $this->getSellerStore($userId); if (!$store) { return ['success' => false, 'message' => 'ไม่พบข้อมูลร้านค้าของคุณ']; } $order = $this->orderModel->findSellerOrderByNo($orderNo, (int)$store['id']); if (!$order) { return ['success' => false, 'message' => 'ไม่พบข้อมูลคำสั่งซื้อ หรือคุณไม่มีสิทธิ์จัดการคำสั่งซื้อนี้']; } $currentStatus = $order['order_status']; // Strict Fulfillment State Machine Workflow $validTransitions = [ 'payment_confirmed' => ['preparing'], 'awaiting_shipment' => ['preparing', 'shipping'], 'preparing' => ['shipping'], 'shipping' => ['completed'] ]; // If currently in pending payment or awaiting verification, seller cannot advance until payment is confirmed if ($currentStatus === 'pending_payment' || ($order['payment_method'] !== 'COD' && ($order['payment_status'] ?? '') !== 'confirmed')) { return ['success' => false, 'message' => 'คำสั่งซื้อยังไม่ได้รับการชำระเงิน หรืออยู่ระหว่างรอตรวจสอบสลิป กรุณารอผู้ดูแลระบบยืนยันการชำระเงินก่อน']; } if (!isset($validTransitions[$currentStatus]) || !in_array($targetStatus, $validTransitions[$currentStatus], true)) { return ['success' => false, 'message' => "ไม่อนุญาตให้เปลี่ยนสถานะจาก {$currentStatus} ไปเป็น {$targetStatus} โดยตรง"]; } if ($targetStatus === 'shipping') { $trackingNo = trim($trackingNo ?? ''); $shippingCarrier = trim($shippingCarrier ?? $order['shipping_method'] ?? 'Standard Delivery'); if (empty($trackingNo)) { return ['success' => false, 'message' => 'กรุณาระบุหมายเลขพัสดุ (Tracking Number) ก่อนเปลี่ยนสถานะเป็นจัดส่งแล้ว']; } } $success = $this->orderModel->updateSellerOrderStatus((int)$order['id'], (int)$store['id'], $targetStatus, $trackingNo, $shippingCarrier); if (!$success) { return ['success' => false, 'message' => 'ไม่สามารถอัปเดตสถานะคำสั่งซื้อได้']; } $this->activityLog->record($userId, 'order_status_updated', 'orders', (int)$order['id'], "Updated order #{$orderNo} status to {$targetStatus}"); return [ 'success' => true, 'message' => "อัปเดตสถานะคำสั่งซื้อเป็น \"{$targetStatus}\" เรียบร้อยแล้ว", 'new_status' => $targetStatus ]; } }
| ver. 1.4 |
Github
|
.
| PHP 7.4.33 | Generation time: 0.24 |
proxy
|
phpinfo
|
Settings