Chuyển tới nội dung chính

Trạng Thái Đơn Hàng

Sicommerce sử dụng PHP enum (backed by string) để quản lý trạng thái đơn hàng. Có hai enum riêng biệt: OrderStatus cho trạng thái vận chuyển/xử lý và OrderPay cho trạng thái thanh toán.


OrderStatus – Trạng Thái Xử Lý Đơn

Class: \Ecommerce\Status\OrderStatus
Backed type: string

Danh Sách Trạng Thái

CaseGiá Trị (value)NhãnMàu HexBadge Class
WAITwaitChờ xác nhận#6e7173gray
CONFIRMconfirmĐã xác nhận#186caacyan
WAIT_PICKUPwait-pickupChờ lấy hàng#fdbd41yellow
PICKUP_FAILpickup-failLấy hàng thất bại#fdbd41warning
PICKUPpickupĐang lấy hàng#fdbd41purple
PROCESSINGprocessingĐang xử lý#57d616lime
SHIPPINGshipĐang giao hàng#36a3f7blue
SHIPPING_FAILship-failGiao thất bại#db7878pink
COMPLETEDcompletedHoàn thành#22c993green
CANCELLEDcancelledĐã hủy#db7878red

Sử Dụng Enum Trực Tiếp

use Ecommerce\Status\OrderStatus;

// Lấy giá trị (value)
$value = OrderStatus::WAIT->value; // 'wait'
$value = OrderStatus::COMPLETED->value; // 'completed'

// Lấy label (có hỗ trợ đa ngôn ngữ)
$label = OrderStatus::CONFIRM->label(); // 'Đã xác nhận'

// Lấy màu hex
$color = OrderStatus::SHIPPING->color(); // '#36a3f7'

// Lấy badge class
$badge = OrderStatus::CANCELLED->badge(); // 'red'

// Kiểm tra giá trị có tồn tại không
$exists = OrderStatus::has('confirm'); // true
$exists = OrderStatus::has('invalid'); // false

// Tạo từ string
$status = OrderStatus::tryFrom('ship'); // OrderStatus::SHIPPING
$status = OrderStatus::from('completed'); // OrderStatus::COMPLETED

// Lấy tất cả options cho select
$options = OrderStatus::options()->toArray();
// [['value' => 'wait', 'label' => 'Chờ xác nhận'], ...]

Sử Dụng qua OrderHelper

use Ecommerce\Supports\OrderHelper;

// Lấy tất cả trạng thái (array đầy đủ)
$statuses = OrderHelper::status();
// ['wait' => ['label' => '...', 'color' => '...', 'colorClass' => '...'], ...]

// Lấy một thuộc tính cụ thể
$label = OrderHelper::status('wait', 'label'); // 'Chờ xác nhận'
$color = OrderHelper::status('confirm', 'color'); // '#186caa'
$badge = OrderHelper::status('completed', 'colorClass'); // 'green'

Tuỳ Chỉnh Trạng Thái Qua Filter

// Tuỳ chỉnh tên hiển thị
add_filter('order_status_label', function($label, $value) {
if($value == 'wait') return 'Đơn mới - Chờ xác nhận';
return $label;
}, 10, 2);

// Tuỳ chỉnh màu
add_filter('order_status_color', function($color, $value) {
if($value == 'completed') return '#00aa55'; // Màu xanh đậm hơn
return $color;
}, 10, 2);

// Thêm trạng thái vào danh sách (qua OrderHelper::status)
add_filter('order_status', function($statusData) {
$statusData['packaging'] = [
'label' => 'Đang đóng gói',
'color' => '#ff9900',
'colorClass' => 'orange',
];
return $statusData;
});

OrderPay – Trạng Thái Thanh Toán

Class: \Ecommerce\Status\OrderPay
Backed type: string

Danh Sách Trạng Thái

CaseGiá Trị (value)NhãnMàuBadge
WAITunpaidChưa thanh toán#36a3f7gray
COMPLETEDpaidĐã thanh toán#22c993green
RETURNrefundedĐã hoàn tiền#ffc1c1red

Sử Dụng

use Ecommerce\Status\OrderPay;

$value = OrderPay::COMPLETED->value; // 'paid'
$label = OrderPay::WAIT->label(); // 'Chưa thanh toán'

// Kiểm tra
$exists = OrderPay::has('paid'); // true

// Từ string
$pay = OrderPay::tryFrom('refunded'); // OrderPay::RETURN

// Lấy tất cả options
$options = OrderPay::options()->toArray();

Sử Dụng qua OrderHelper

use Ecommerce\Supports\OrderHelper;

$payStatuses = OrderHelper::statusPay();
$label = OrderHelper::statusPay('paid', 'label'); // 'Đã thanh toán'
$color = OrderHelper::statusPay('unpaid', 'color'); // '#36a3f7'

Hook Liên Quan Đến Trạng Thái

Hooks Thay Đổi Trạng Thái Đơn

// Trước khi lưu trạng thái mới (để validate)
add_action('admin_order_status_before_update', function($statusNew, $statusOld) {
// Ngăn chuyển từ completed về wait
if($statusOld == 'completed' && $statusNew == 'wait') {
response()->error('Không thể chuyển đơn đã hoàn thành về chờ xác nhận!');
}
}, 1, 2);

// Sau khi lưu trạng thái mới
add_action('admin_order_status_update', function($statusNew, $statusOld) {
$orderId = request()->input('id');
// Xử lý logic
}, 10, 2);

// Hook riêng cho từng trạng thái (pattern: admin_order_status_{value}_save)
add_action('admin_order_status_completed_save', function($orderId) {
// Chỉ chạy khi đơn hoàn thành
}, 10, 1);

add_action('admin_order_status_cancelled_save', function($orderId) {
// Chỉ chạy khi đơn bị hủy
}, 10, 1);

Hooks Thay Đổi Trạng Thái Thanh Toán

add_action('admin_order_status_pay_update', function($statusNew, $statusOld) {
// Khi trạng thái thanh toán thay đổi
}, 10, 2);

// Pattern: admin_order_status_pay_{value}_success
add_action('admin_order_status_pay_paid_success', function($orderId) {
// Chỉ chạy khi đơn được đánh dấu đã thanh toán
}, 10, 1);

Tích Hợp Với Plugin Ghi Log

use Ecommerce\Status\OrderStatus;
use Ecommerce\Services\OrderHistoryService;
use Ecommerce\Models\Order;

// Trong plugin của bạn - ghi log khi trạng thái thay đổi
add_action('admin_order_status_update', function($statusNew, $statusOld) {
$orderId = request()->input('id');
$order = Order::find($orderId);

if($statusNew == OrderStatus::SHIPPING->value) {
OrderHistoryService::status($order, $statusNew);
// Thêm thông báo Push Notification cho khách hàng
}
}, 5, 2);