รายการบัญชี
อ่านสมุดรายวันทั่วไป และบันทึกรายการปรับปรุงที่ดุลกัน
เอกสารขายและเอกสารซื้อลงบัญชีให้เองอยู่แล้ว คุณไม่จำเป็นต้องใช้ endpoint นี้กับเอกสารเหล่านั้น ให้ใช้เมื่อรายการนั้นไม่มีเอกสารรองรับจริง ๆ เช่น การคิดค่าเสื่อมราคา การตั้งค้างรับค้างจ่าย การแก้ไขรายการ หรือยอดยกมาที่นำเข้าจากระบบเดิม
response ห่อด้วย data
ค้นหารายการ
GET /journal-entries → แบ่งหน้า อยู่ใน data
| พารามิเตอร์ | หมายเหตุ |
|---|---|
referenceType | สิ่งที่สร้างรายการนี้ — MANUAL, GR, PI, PV, … (ไม่เกิน 20 ตัวอักษร) |
fromDate / toDate | YYYY-MM-DD อ้างอิงวันที่รายการ |
page / limit | ดูการแบ่งหน้า |
curl -X GET "$ABSERP_API_URL/openapi/v1/journal-entries?fromDate=2026-09-01&toDate=2026-09-30&limit=100" \
-H "Authorization: Bearer $ABSERP_API_KEY"การกรองด้วย referenceType=MANUAL จะได้เฉพาะรายการที่คนบันทึกเอง ซึ่งมักเป็นสิ่งที่รายงานกระทบยอดต้องการ
แถวในรายการอาจไม่มี lines หากต้องการให้เรียกอ่านรายละเอียด
สร้างรายการ
POST /journal-entries → 201 คืนรายการใน data
ต้องระบุ entryDate และ บรรทัดอย่างน้อยสองบรรทัด แต่ละบรรทัดต้องมี accountId
curl -X POST "$ABSERP_API_URL/openapi/v1/journal-entries" \
-H "Authorization: Bearer $ABSERP_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"entryDate": "2026-09-30",
"description": "ค่าเสื่อมราคาเดือนกันยายน",
"lines": [
{ "accountId": 63, "debit": 4500, "credit": 0, "description": "ค่าเสื่อมราคา" },
{ "accountId": 18, "debit": 0, "credit": 4500, "description": "ค่าเสื่อมราคาสะสม" }
]
}'| ฟิลด์ | ชนิด | จำเป็น | หมายเหตุ |
|---|---|---|---|
entryDate | string | ใช่ | YYYY-MM-DD |
description | string | ไม่ | ไม่เกิน 255 ตัวอักษร |
lines | array | ใช่ | อย่างน้อยสองรายการ |
lines[].accountId | integer | ใช่ | จากผังบัญชี |
lines[].debit | number | ไม่ | 0 หรือมากกว่า |
lines[].credit | number | ไม่ | 0 หรือมากกว่า |
lines[].description | string | ไม่ | ไม่เกิน 255 ตัวอักษร |
กฎสองข้อที่มักทำให้เกิดข้อผิดพลาด
- ยอดเดบิตรวมต้องเท่ากับยอดเครดิตรวม รายการที่ไม่ดุลจะถูกปฏิเสธด้วย
errorCode: "JournalEntryImbalanced"และไม่มีการบันทึกใด ๆ ควรรวมยอดทั้งสองด้านก่อนส่ง - หนึ่งบรรทัดคือหนึ่งด้าน ให้ใส่จำนวนเงินใน
debitหรือcreditอย่างใดอย่างหนึ่ง และส่ง0ให้อีกด้าน บรรทัดที่ใส่ทั้งสองด้านไม่ใช่ทางลัดสำหรับยอดสุทธิ
อีกเรื่องที่ควรทราบ: entryNumber ระบบกำหนดให้ และงวดบัญชีที่ปิดแล้วจะปฏิเสธรายการใหม่ที่ลงวันที่ตรงกับหรือก่อนวันที่ปิดงวดด้วย errorCode: "PeriodLocked" หากคุณบันทึกรายการปรับปรุงสิ้นเดือน ให้ทำก่อนปิดงวด
อ่านรายการรายรายการ
GET /journal-entries/{id} → คืนรายการใน data
{
"success": true,
"data": {
"id": 104,
"entryNumber": "JE-2026-0104",
"referenceType": "MANUAL",
"referenceId": null,
"entryDate": 1759190400,
"description": "ค่าเสื่อมราคาเดือนกันยายน",
"totalDebit": 4500,
"totalCredit": 4500,
"status": "posted",
"reversedBy": null,
"createdBy": 3,
"createdAt": 1759190400,
"lines": [
{
"id": 301,
"accountId": 63,
"accountCode": "5810",
"accountName": "ค่าเสื่อมราคา",
"debit": 4500,
"credit": 0,
"description": "ค่าเสื่อมราคา"
},
{
"id": 302,
"accountId": 18,
"accountCode": "1690",
"accountName": "ค่าเสื่อมราคาสะสม",
"debit": 0,
"credit": 4500,
"description": "ค่าเสื่อมราคาสะสม"
}
]
}
}สังเกตความไม่สมมาตร: คุณ ส่ง entryDate เป็น YYYY-MM-DD แต่ อ่าน กลับมาเป็น Unix seconds และบรรทัดจะมี accountCode กับ accountName เพิ่มมาให้ตอนอ่าน จึงแทบไม่ต้องไปดึงผังบัญชีมาต่อข้อมูลเพื่อแสดงผล
การกลับรายการ
POST /journal-entries/{id}/reverseไม่เปิดให้ใช้ผ่าน Open API (ใช้ได้ในเว็บแอปเท่านั้น) เพราะการกลับรายการคือการแก้บัญชีที่บันทึกแล้ว จึงให้ตัดสินใจใน ABSERP และรายการที่บันทึกแล้วก็ไม่มีการลบโดยเจตนาเช่นกัน
ผลลัพธ์ยังอ่านได้ รายการที่ถูกกลับแล้วจะมี reversedBy ติดมาตอนอ่าน หากระบบที่เชื่อมต่อต้องการแก้รายการที่ตัวเองบันทึกไว้ ให้บันทึกรายการกลับด้านที่ดุลกันเองผ่าน POST /journal-entries หรือให้ผู้ดูแลบัญชีกลับรายการใน ABSERP
รหัสข้อผิดพลาด
| สถานะ | รหัส | สาเหตุ |
|---|---|---|
| 400 | BadRequest | บรรทัดน้อยกว่าสอง, บรรทัดขาด accountId, จำนวนเงินติดลบ, บรรทัดที่ใส่ทั้ง debit และ credit (หรือไม่ใส่เลย), หรือ accountId ของบรรทัดอยู่นอกองค์กรนี้ |
| 400 | JournalEntryImbalanced | ยอดเดบิตรวมไม่เท่ากับยอดเครดิตรวม |
| 400 | PeriodLocked | entryDate ตรงกับหรือก่อนงวดบัญชีที่องค์กรปิดไว้แล้ว |
| 404 | NotFound | ไม่พบ :id ในองค์กรนี้ |
entryDate (หรือ fromDate/toDate ของ endpoint รายการ) ที่แปลงไม่ได้ ปัจจุบันจะได้ 500 InternalError แทนที่จะเป็น 400 BadRequest — ส่งวันที่ในรูปแบบ YYYY-MM-DD ที่ถูกต้องแล้วจะไม่เจอกรณีนี้ แต่อย่าเข้าใจว่า 500 ทุกครั้งที่นี่คือปัญหาฝั่งเซิร์ฟเวอร์เสมอไป
ขั้นตอนถัดไป
อ่านต่อที่ ผังบัญชี