Sale Order Cancel Service
API ยกเลิกใบสั่งขาย
Header Request
| Field | Value |
|---|---|
| GUID | GUID สำหรับการเชื่อมต่อ (smlx เสมอ) |
| provider | ชื่อผู้ใช้บริการ |
| databaseName | ชื่อฐานข้อมูล |
| configFileName | ชื่อไฟล์ตั้งค่า — รูปแบบ SMLConfig<provider>.xml |
| Content-Type | application/json; charset=utf-8 |
Header Example
json
{
"GUID": "smlx",
"provider": "DATA",
"databaseName": "data1",
"configFileName": "SMLConfigDATA.xml",
"Content-Type": "application/json; charset=utf-8"
}HTTP Response
| Status | ความหมาย |
|---|---|
200 | สำเร็จ |
400 | ข้อมูลผิดพลาด (code = 99) เช่น เลขที่เอกสารซ้ำ / ข้อมูลไม่ถูกต้อง — ดูสาเหตุจริงใน message |
404 | ไม่พบใบสั่งขายตาม doc_ref (code = 98) หรือเรียก URL / path ไม่ถูกต้อง |
405 | ใช้ HTTP method ไม่ถูกต้อง |
500 | payload ผิดรูป หรือข้อผิดพลาดภายในระบบ |
Add SaleOrderCancel
ยกเลิกใบสั่งขาย — ระบบจะสร้างเอกสาร ยกเลิกใบสั่งขาย (trans_flag = 37) อ้างอิงใบสั่งขายตาม doc_ref
| กรณี | วิธีส่ง | ผลลัพธ์ |
|---|---|---|
| ยกเลิกทั้งใบ | ไม่ส่ง details หรือส่ง [] | เอกสารยกเลิก cancel_type = 1 (มีแค่หัวเอกสาร ยอดเงิน 0) และใบสั่งขายถูกปิด (last_status = 1) |
| ยกเลิกบางรายการ | ส่ง details (รหัสสินค้า + หน่วยนับ + จำนวน) | เอกสารยกเลิก cancel_type = 2 พร้อมรายการ ราคา/ยอดเงินคิดตามสัดส่วนของบรรทัดในใบสั่งขาย และหักยอดค้างส่งของใบสั่งขาย |
เงื่อนไข
- ใบสั่งขายต้องยังไม่ถูกยกเลิก
- ยกเลิกทั้งใบไม่ได้ ถ้าใบสั่งขายถูกเปิดบิลขายไปแล้ว — ให้ยกเลิกเฉพาะรายการที่ค้างแทน
- ยกเลิกบางรายการ:
item_code+unit_codeต้องมีอยู่ในใบสั่งขาย และจำนวนต้องไม่เกินยอดค้าง (ยอดสั่งขาย − ยอดที่เปิดบิลแล้ว − ยอดที่ยกเลิกไปแล้ว คิดเป็นหน่วยนับหลัก) doc_noของเอกสารยกเลิกต้องไม่ซ้ำ
ปิดใบสั่งขาย (ยกเลิกบางรายการ)
- ยกเลิกจนไม่เหลือยอดค้าง → ใบสั่งขายปิด (
doc_success = 1) ทันที - ยังเหลือยอดค้าง → ออกใบขาย อ้างอิงใบสั่งขายสำหรับส่วนที่เหลือได้ ใบสั่งขายจะปิดเมื่อยอดที่เปิดบิล + ยอดที่ยกเลิกครบยอดสั่งขาย
สินค้าชุด
- ส่งมาเฉพาะ ตัวชุด (รหัสสินค้าชุด + หน่วยนับ + จำนวนชุด) — ระบบสร้างบรรทัดสินค้าในชุดให้เองตามสัดส่วน (จำนวนต่อชุด × จำนวนชุดที่ยกเลิก)
- ห้ามส่งสินค้าในชุดมาเอง — ระบบจะปฏิเสธ และแจ้งให้ยกเลิกที่ตัวชุด
- ถ้าใบสั่งขายไม่มีบรรทัดสินค้าในชุดผูกกับตัวชุด (เช่น ใบสั่งขายที่สร้างผ่าน API) จะยกเลิกเฉพาะบรรทัดตัวชุด และบรรทัดอื่นถือเป็นสินค้าธรรมดา
- สินค้าในชุดทุกตัวต้องมียอดค้างพอ ถ้าตัวใดตัวหนึ่งไม่พอ จะปฏิเสธทั้งคำขอ
EndPoint
POST /SMLJavaRESTService/saleorder/v4/cancel
Body Data:
| Field Name | Field Type | Length | Description |
|---|---|---|---|
| details | Array | รายการที่ต้องการยกเลิก — ไม่ส่ง = ยกเลิกทั้งใบ | |
| doc_date | Date | วันที่เอกสารยกเลิก (yyyy-MM-dd) (required) | |
| doc_format_code | String | 25 | รหัสรูปแบบเอกสาร เช่น SSC |
| doc_no | String | 25 | เลขที่เอกสารยกเลิก (required) |
| doc_ref | String | 255 | เลขที่ใบสั่งขายที่ต้องการยกเลิก (required) |
| doc_time | String | 5 | เวลาเอกสาร (HH:mm) — ไม่ส่ง = เวลาปัจจุบัน |
| remark | String | 255 | หมายเหตุ |
details
| Field Name | Field Type | Length | Description |
|---|---|---|---|
| item_code | String | 25 | รหัสสินค้า (required) |
| qty | Float | จำนวนที่ยกเลิก (มากกว่า 0) (required) | |
| unit_code | String | 25 | หน่วยนับ (ต้องตรงกับในใบสั่งขาย) (required) |
example: ยกเลิกทั้งใบ
json
{
"doc_no": "SSC-2610-0002",
"doc_date": "2026-10-15",
"doc_time": "15:30",
"doc_format_code": "SSC",
"doc_ref": "SO-2610-0001",
"remark": "ลูกค้ายกเลิกคำสั่งซื้อ"
}example: ยกเลิกบางรายการ
json
{
"doc_no": "SSC-2610-0003",
"doc_date": "2026-10-15",
"doc_format_code": "SSC",
"doc_ref": "SO-2610-0001",
"details": [
{ "item_code": "G03-0001", "unit_code": "กระบอก", "qty": 2 },
{ "item_code": "G03-0003", "unit_code": "ถุง", "qty": 1 }
]
}example: ยกเลิกสินค้าชุด — ส่งแค่ตัวชุด
json
{
"doc_no": "SSC-2610-0004",
"doc_date": "2026-10-16",
"doc_format_code": "SSC",
"doc_ref": "SO-2610-0002",
"details": [
{ "item_code": "G10-0034", "unit_code": "ชุด", "qty": 1 }
]
}ถ้าในใบสั่งขาย ชุด G10-0034 ประกอบด้วย G04-0001, G04-0002, G04-0008 อย่างละ 1 แพ็คต่อชุด เอกสารยกเลิกจะมี 4 บรรทัด: G10-0034 x1 (ตัวชุด) + G04-0001 / G04-0002 / G04-0008 อย่างละ 1 แพ็ค (สร้างให้อัตโนมัติ) ยอดเงินหัวเอกสารคิดจากตัวชุดเท่านั้น (บรรทัดสินค้าในชุดไม่นับซ้ำ)
Response Success
json
{
"success": true,
"data": {
"code": "SSC-2610-0003"
}
}Response Error
| Status | code | ตัวอย่าง message |
|---|---|---|
400 | 400 | doc_ref (เลขที่ใบสั่งขาย) is required / details: item_code และ unit_code is required |
400 | 99 | ใบสั่งขาย SO-2610-0001 ถูกเปิดบิลขายไปแล้ว ยกเลิกทั้งใบไม่ได้ ... / จำนวนยกเลิกสินค้า G03-0001 เกินยอดค้างในใบสั่งขาย ... |
404 | 98 | Not Found Sale Order : SO-2610-0001 |
json
{
"error": true,
"code": "99",
"message": "ใบสั่งขาย SO-2610-0001 ถูกยกเลิกไปแล้ว"
}