Quản lý mua hàngĐơn đặt hàng mua
Cập nhật đơn đặt hàng mua
Cập nhật thông tin, trạng thái và chi tiết sản phẩm của đơn đặt hàng mua (PO)
Endpoint
PUT /v1/purchaseorders/:id
Quyền: Cần ít nhất một trong các quyền:
purchaseorder.edit,purchaseorder.statuscomplete,purchaseorder.statuscancel
Path Parameters
| Tên | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
id | int | Có | ID đơn đặt hàng mua cần cập nhật |
Request Body
Thông tin PO chính
| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
company_id | int | Có | ID công ty |
creator_id | int | Có | ID người thao tác |
status | int | Có | Trạng thái mới. Chỉ được chuyển TỚI trạng thái cao hơn |
cancel_reason | int | Điều kiện | Lý do hủy (bắt buộc khi status = 13). Xem Cancel Reason |
tag | string | Không | Nhãn/Tag |
note | string | Không | Ghi chú |
price_sell | int | Không | Tổng giá bán tham chiếu |
price_shipping | int | Không | Phí vận chuyển |
price_discount | int | Không | Chiết khấu |
price_final | int | Không | Tổng tiền cuối cùng |
details | array | Không | Danh sách chi tiết sản phẩm (khi cần thay đổi detail) |
Chi tiết sản phẩm (details[])
Khi PO chưa hoàn thành/hủy (status < 11), có thể thay đổi chi tiết sản phẩm. Hệ thống tự động phát hiện:
- Thêm mới: Detail item có
id = 0hoặc không cóid→ thêm mới - Cập nhật: Detail item có
id > 0và đã tồn tại → so sánh & cập nhật nếu có thay đổi - Xóa: Detail hiện tại không có trong danh sách request → tự động xóa
| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
id | int | Không | ID chi tiết (0 hoặc bỏ trống = thêm mới, > 0 = cập nhật) |
product_variant_id | int | Có (khi thêm mới) | ID biến thể sản phẩm |
item_name | string | Không | Tên sản phẩm hiển thị |
uom_id | int | Không | ID đơn vị tính |
uom_name | string | Không | Tên đơn vị tính |
uom_factor | int | Có | Hệ số quy đổi UOM |
uom_quantity | int | Có | Số lượng theo UOM |
uom_unit_price | int | Có | Đơn giá theo UOM |
weight_sale_mode | int | Không | Chế độ bán cân |
weight_preset_id | string | Không | ID preset cân |
weight_preset_name | string | Không | Tên preset cân |
weight_preset_factor | int | Không | Hệ số preset cân |
pricing_type | int | Không | Loại định giá |
catch_counting | int | Không | Catch-weight counting |
Ví dụ: Cập nhật trạng thái sang Đã duyệt
{
"company_id": 1,
"creator_id": 10,
"status": 5,
"tag": "approved",
"note": "Đã xác nhận với NCC"
}Ví dụ: Hủy PO
{
"company_id": 1,
"creator_id": 10,
"status": 13,
"cancel_reason": 9
}Ví dụ: Thay đổi chi tiết sản phẩm
{
"company_id": 1,
"creator_id": 10,
"status": 1,
"price_sell": 600000,
"price_final": 630000,
"details": [
{
"id": 100,
"uom_factor": 1,
"uom_quantity": 10,
"uom_unit_price": 120000,
"weight_sale_mode": 0,
"weight_preset_id": "",
"weight_preset_name": "",
"weight_preset_factor": 0,
"pricing_type": 0,
"catch_counting": 0
},
{
"id": 0,
"product_variant_id": 999,
"item_name": "Sản phẩm mới",
"uom_id": 0,
"uom_name": "Cái",
"uom_factor": 1,
"uom_quantity": 3,
"uom_unit_price": 80000,
"weight_sale_mode": 0,
"weight_preset_id": "",
"weight_preset_name": "",
"weight_preset_factor": 0,
"pricing_type": 0,
"catch_counting": 0
}
]
}Lưu ý: Trong ví dụ trên, nếu PO hiện tại có 3 detail (id: 100, 101, 102) nhưng request chỉ gửi detail id 100 và 1 item mới → detail id 101 và 102 sẽ bị xóa tự động.
Response Schema
HTTP 200 - OK
Trả về Purchase Order Object sau khi cập nhật.
Quy tắc phân quyền
| Hành động | Quyền cần thiết |
|---|---|
| Sửa nội dung PO (tag, note, detail, giá) | purchaseorder.edit |
| Chuyển trạng thái sang Hoàn thành (11) | purchaseorder.statuscomplete |
| Chuyển trạng thái sang Đã hủy (13) | purchaseorder.statuscancel |
| Thay đổi chi tiết sản phẩm | purchaseorder.edit + PO chưa hoàn thành/hủy |
Error Codes
Lỗi dữ liệu đầu vào. Trả về mảng các mã lỗi:
| Mã lỗi | Mô tả |
|---|---|
error_not_found | Đối tượng không tồn tại hoặc không thuộc quyền truy cập của bạn |
error_not_permission | Không có quyền thực hiện thao tác |
error_status_backward_not_allow | Không được quay ngược trạng thái |
error_status_complete_not_allow | Không có quyền chuyển sang trạng thái Hoàn thành |
error_status_cancel_not_allow | Không có quyền chuyển sang trạng thái Đã hủy |
error_cancel_reason_require | Hủy PO bắt buộc phải có lý do |
error_cancel_reason_not_exist | Lý do hủy không hợp lệ |
error_not_permission_edit_detail | Không có quyền sửa chi tiết sản phẩm |
error_not_allow_change_detail_in_complete_or_cancel_order | Không được sửa chi tiết khi PO đã Hoàn thành hoặc Đã hủy |
error_details_have_invalid_data_line | Chi tiết sản phẩm có dữ liệu không hợp lệ |
error_company_id_required | ID công ty không được để trống |
error_company_id_notfound | ID công ty không tìm thấy |
error_user1_id_required | ID người tạo không được để trống |
error_user_id_notfound | ID người tạo không tìm thấy |
Webhook
Sau khi cập nhật thành công, hệ thống gửi webhook event: purchaseorder.edit