Update Employee Loan
แก้ไขข้อมูลเงินกู้/ภาระหนี้สินของพนักงาน พร้อมปรับปรุงตารางงวดผ่อน
ใช้ API นี้เพื่อแก้ไขรายละเอียดเงินกู้ที่มีอยู่ และปรับปรุงยอดเงินต้น ดอกเบี้ย หรือยอดชำระของแต่ละงวดผ่อน เหมาะสำหรับแก้ไขข้อผิดพลาดหรือปรับปรุงข้อมูลตามข้อตกลงใหม่ แก้ไขได้เฉพาะเงินกู้ที่ยังใช้งานอยู่ (สถานะ N) เท่านั้น
Endpoint
POST /api/v1/open-apis/employee-loans/updateสิทธิ์ที่ต้องการ: API Key ต้องมีสิทธิ์ ข้อมูลการยื่นเอกสาร (document:manage)
Request Parameters
Required Parameters
| Parameter | Type | Required | Description | Example |
|---|---|---|---|---|
employee_loan_id | string | Yes | รหัสเงินกู้ (Base64) | MjAyNjA3MDRBMUIyQzNENEU1RjY= |
Optional Parameters
| Parameter | Type | Required | Description | Example |
|---|---|---|---|---|
employee_loan_desc | string | No | รายละเอียดเงินกู้ (ถ้าไม่ส่งจะไม่เปลี่ยนแปลง) | อัพเดตข้อมูลตามข้อตกลงใหม่ |
period | array | No | รายการงวดผ่อนที่ต้องการแก้ไข (ดูโครงสร้างด้านล่าง) | ดูตัวอย่างด้านล่าง |
authorize_id | string | No | ID ผู้ทำรายการ (Base64) — ถ้าส่งมา ต้องเป็น user ที่มีอยู่จริง มิฉะนั้นได้ 422 | MjAyNjA3MDRVU0VSMDAwMDAx |
ยอดสัญญาถูกล็อกหลังสร้างเงินกู้ — update แก้ได้เฉพาะ employee_loan_desc และ period[] เท่านั้น ห้ามส่งฟิลด์ยอดสัญญา (employee_loan_amt, employee_loan_total, employee_loan_down, employee_loan_pay_period, employee_loan_interest) มาในคำขอ มิฉะนั้นจะได้รับ HTTP 422
หา authorize_id ได้อย่างไร: รับค่าจาก Get Employee Data Filter โดยใช้ path_action=get-user พร้อม employee_code ของผู้ทำรายการ — ใช้ค่า user_id ที่ได้กลับมาเป็น authorize_id
period Structure
แต่ละรายการใน period ต้องมีครบทั้ง 5 ฟิลด์ต่อไปนี้ โดย employee_loan_period_id ต้องเข้ารหัส Base64 ส่วนฟิลด์ยอดเงิน (employee_loan_period_principle, employee_loan_period_interest, employee_loan_period_amt) ต้องเป็นตัวเลข ≥ 0
| Field | Type | Required | Description | Example |
|---|---|---|---|---|
employee_loan_period_id | string | Yes | รหัสงวดผ่อนที่ต้องการแก้ไข (Base64) | MjAyNjA3MDRBQUFBMTExMTIyMjI= |
employee_loan_period_principle | number | Yes | เงินต้นของงวด (≥ 0) | 1000 |
employee_loan_period_interest | number | Yes | ดอกเบี้ยของงวด (≥ 0) | 10 |
employee_loan_period_amt | number | Yes | ยอดชำระของงวด (≥ 0) | 1010 |
employee_loan_period_month | string | Yes | เดือนของงวด (YYYY-MM) | 2026-07 |
รหัสงวดผ่อน (employee_loan_period_id) ที่จะนำมาแก้ไขดูได้จาก Get Employee Loan Detail ในฟิลด์ loan[].period[].employee_loan_period_id แล้วเข้ารหัส Base64 ก่อนส่ง โดยต้องเป็นงวดของ employee_loan_id นี้เท่านั้น
Request Body Example
{
"employee_loan_id": "MjAyNjA3MDRBMUIyQzNENEU1RjY=",
"employee_loan_desc": "อัพเดตข้อมูลตามข้อตกลงใหม่",
"period": [
{
"employee_loan_period_id": "MjAyNjA3MDRBQUFBMTExMTIyMjI=",
"employee_loan_period_principle": 1000,
"employee_loan_period_interest": 10,
"employee_loan_period_amt": 1010,
"employee_loan_period_month": "2026-07"
},
{
"employee_loan_period_id": "MjAyNjA4MDRCQkJCMzMzMzQ0NDQ=",
"employee_loan_period_principle": 990,
"employee_loan_period_interest": 0,
"employee_loan_period_amt": 990,
"employee_loan_period_month": "2026-08"
}
]
}ตัวอย่างข้างต้นแสดงโครงสร้างคำขอ — คำขอจริงต้องส่ง period[] ครบทุกงวดของเงินกู้ และผลรวมเงินต้น (employee_loan_period_principle) ของทุกงวดต้องเท่ากับเงินต้นของสัญญา ผลรวมดอกเบี้ย (employee_loan_period_interest) ต้องเท่ากับดอกเบี้ยของสัญญา (การแก้ไขงวดคือการกระจายยอดใหม่ ห้ามเปลี่ยนยอดรวม) มิฉะนั้นจะได้รับ HTTP 422 (ดู Validation Rules)
Response Format
Success Response (HTTP 200)
payload เป็น array ที่มีโครงสร้างเดียวกับ Get Employee Loan Detail (ระบบดึงข้อมูลเงินกู้ล่าสุดกลับมาหลังอัปเดตสำเร็จ) แต่ละรายการประกอบด้วย profile (ข้อมูลพนักงาน) และ loan[] (ข้อมูลเงินกู้ที่อัปเดตแล้ว พร้อม period[] ตารางงวดผ่อนล่าสุดทั้งหมด)
{
"code": 200,
"message": "แก้ไขข้อมูลเงินกู้สำเร็จ",
"payload": [
{
"profile": {
"employee_id": "20260704112233AABBCC",
"employee_code": "EMP001",
"employee_name": "สมชาย",
"employee_last_name": "ใจดี",
"employee_nickname": "ชาย",
"branch_name": "สำนักงานใหญ่",
"department_name": "ฝ่ายบุคคล",
"division_name": "งานบริหารบุคคล",
"section_name": "งานสวัสดิการ",
"position_name": "เจ้าหน้าที่บุคคล"
},
"loan": [
{
"employee_loan_id": "20260704A1B2C3D4E5F6",
"salary_type_id": "MjAyNjAzMTY2RTZCQzg3NjQ4MDI=",
"salary_type_name": "เงินกู้ยืมพนักงาน",
"salary_type_name_en": "Employee Loan",
"employee_loan_dt": "2026-07-04",
"employee_loan_start": "2026-07",
"employee_loan_type_lv": "01",
"employee_loan_total": 10000,
"employee_loan_down": 100,
"employee_loan_amt": 9900,
"employee_loan_interest": 0,
"employee_loan_interest_type": "0",
"employee_loan_amt_principle": 9900,
"employee_loan_amt_interest": 10,
"employee_loan_amt_period": 2000,
"employee_loan_period": 10,
"employee_loan_pay_period": 990,
"employee_loan_desc": "อัพเดตข้อมูลตามข้อตกลงใหม่",
"employee_loan_status": "N",
"employee_loan_status_update": null,
"employee_loan_status_remark": null,
"period": [
{
"employee_loan_period_id": "20260704AAAA11112222",
"employee_loan_period_month": "2026-07",
"employee_loan_period_seq": 1,
"employee_loan_period_principle": 1000,
"employee_loan_period_interest": 10,
"employee_loan_period_amt": 1010,
"employee_loan_period_status": "N"
},
{
"employee_loan_period_id": "20260804BBBB33334444",
"employee_loan_period_month": "2026-08",
"employee_loan_period_seq": 2,
"employee_loan_period_principle": 990,
"employee_loan_period_interest": 0,
"employee_loan_period_amt": 990,
"employee_loan_period_status": "N"
}
]
}
]
}
]
}ตัวอย่างข้างต้นแสดง period[] เพียง 2 งวดเพื่อความกระชับ — response จริงจะคืนงวดผ่อนครบทุกงวดของเงินกู้ (ตามจำนวนใน employee_loan_period)
salary_type_id ใน response ถูกเข้ารหัส Base64 มาแล้ว สามารถนำไปส่งกลับเป็นพารามิเตอร์ salary_type_id ได้โดยตรง ส่วน employee_id, employee_loan_id และ employee_loan_period_id ใน response เป็น Plain text
Error Response - Forbidden (HTTP 403)
{
"code": 403,
"message": "Forbidden: Insufficient permissions",
"error": {
"type": "PERMISSION_DENIED"
}
}สาเหตุ: API Key ไม่มีสิทธิ์ document:manage
Error Response - Validation Failed (HTTP 422)
{
"code": 422,
"message": "การตรวจสอบข้อมูลล้มเหลว",
"errors": [
"'employee_loan_id' is required"
]
}สาเหตุ: ไม่ได้ส่ง employee_loan_id, หรือ authorize_id ที่ส่งมาไม่ถูกต้อง/ไม่มีในระบบ
Error Response - Period Does Not Belong To This Loan (HTTP 422)
{
"code": 422,
"message": "การตรวจสอบข้อมูลล้มเหลว",
"errors": [
"one or more 'employee_loan_period_id' do not belong to this loan"
]
}สาเหตุ: มี period[].employee_loan_period_id อย่างน้อยหนึ่งรายการที่ไม่ใช่งวดของ employee_loan_id นี้ ระบบจะตรวจสอบก่อนบันทึกข้อมูล จึงไม่มีการเปลี่ยนแปลงใด ๆ เมื่อเกิดกรณีนี้
Error Response - Invalid Period Fields (HTTP 422)
{
"code": 422,
"message": "การตรวจสอบข้อมูลล้มเหลว",
"errors": [
"'employee_loan_period_amt' is required in period[0]",
"'employee_loan_period_interest' must be numeric and >= 0 in period[0]"
]
}สาเหตุ: period[] ที่ส่งมาขาดฟิลด์ที่จำเป็นอย่างน้อยหนึ่งฟิลด์ (employee_loan_period_id, employee_loan_period_principle, employee_loan_period_interest, employee_loan_period_amt, employee_loan_period_month) หรือฟิลด์ยอดเงิน (employee_loan_period_principle, employee_loan_period_interest, employee_loan_period_amt) ไม่ใช่ตัวเลข หรือมีค่าน้อยกว่า 0
Error Response - Period Amount / Decimal Invalid (HTTP 422)
{
"code": 422,
"message": "การตรวจสอบข้อมูลล้มเหลว",
"errors": [
"'employee_loan_period_amt' must have at most 2 decimal places in period[0]",
"'employee_loan_period_amt' must equal principle + interest in period[9]"
]
}สาเหตุ: ยอดเงินในงวดมีทศนิยมเกิน 2 ตำแหน่ง หรือ employee_loan_period_amt ไม่เท่ากับ employee_loan_period_principle + employee_loan_period_interest ของงวดนั้น
Error Response - Totals Do Not Reconcile (HTTP 422)
{
"code": 422,
"message": "การตรวจสอบข้อมูลล้มเหลว",
"errors": [
"sum of employee_loan_period_principle (1,984.00) must equal the loan principal (1,989.00)",
"sum of employee_loan_period_interest (458.00) must equal the loan interest (448.00)"
]
}สาเหตุ: ผลรวมเงินต้น/ดอกเบี้ยของทุกงวดที่ส่งมาไม่เท่ากับยอดของสัญญา (เช่น ส่ง period[] มาไม่ครบทุกงวด หรือกระจายยอดผิด) — การแก้ไขงวดต้องรักษายอดรวมเดิมของสัญญาไว้
Error Response - Amount Fields Not Editable (HTTP 422)
{
"code": 422,
"message": "การตรวจสอบข้อมูลล้มเหลว",
"errors": [
"'employee_loan_amt' cannot be modified via update — loan amounts are fixed; edit period[] only"
]
}สาเหตุ: ส่งฟิลด์ยอดสัญญา (employee_loan_amt, employee_loan_total, employee_loan_down, employee_loan_pay_period, employee_loan_interest) มาในคำขอ — ยอดถูกล็อกหลังสร้างเงินกู้ แก้ได้เฉพาะ employee_loan_desc และ period[]
Error Response - Employee Loan Not Found (HTTP 404)
{
"code": 404,
"message": "ไม่พบข้อมูลเงินกู้"
}สาเหตุ: employee_loan_id ที่ส่งมาไม่มีอยู่ในระบบ
Error Response - Cannot Update Closed Or Finished Loan (HTTP 400)
{
"code": 400,
"message": "ไม่สามารถแก้ไขเงินกู้ที่ปิดหรือชำระครบแล้ว (แก้ได้เฉพาะสถานะ N)"
}สาเหตุ: เงินกู้มีสถานะ C (Cancel) หรือ Y (Finished) แก้ไขได้เฉพาะเงินกู้ที่มีสถานะ N (Active) เท่านั้น
Response Fields
Profile Fields (payload[].profile)
| Field | Type | Nullable | Description |
|---|---|---|---|
employee_id | string | No | รหัสพนักงาน (Plain text) |
employee_code | string | No | รหัสพนักงาน |
employee_name | string | No | ชื่อพนักงาน |
employee_last_name | string | No | นามสกุลพนักงาน |
employee_nickname | string | No | ชื่อเล่น |
branch_name | string | No | สาขา |
department_name | string | No | แผนก |
division_name | string | No | ฝ่าย |
section_name | string | No | ส่วนงาน |
position_name | string | No | ตำแหน่ง |
Loan Fields (payload[].loan[])
| Field | Type | Nullable | Description |
|---|---|---|---|
employee_loan_id | string | No | รหัสเงินกู้ (Plain text) |
salary_type_id | string | No | รหัสประเภทเงินหักในสลิป (Base64 — นำไปใช้เป็นพารามิเตอร์ salary_type_id ได้โดยตรง) |
salary_type_name | string | No | ชื่อประเภทเงินหัก |
salary_type_name_en | string | No | ชื่อประเภทเงินหัก (ภาษาอังกฤษ) |
employee_loan_dt | string | No | วันที่ยื่นกู้ (YYYY-MM-DD) |
employee_loan_start | string | No | เดือนเริ่มหัก (YYYY-MM) |
employee_loan_type_lv | string | No | ประเภทเงินกู้ |
employee_loan_total | float | No | ยอดกู้ทั้งหมด |
employee_loan_down | float | No | ยอดหักครั้งแรก (เงินดาวน์) |
employee_loan_amt | float | No | ยอดกู้สุทธิ |
employee_loan_interest | float | No | ยอดดอกเบี้ย |
employee_loan_interest_type | string | No | ประเภทดอกเบี้ย (0 = ต้นลดดอกลด, 1 = คงที่, 2 = ระบุดอกเบี้ยรวม) |
employee_loan_amt_principle | float | No | ยอดเงินต้นรวม |
employee_loan_amt_interest | float | No | ผลรวมดอกเบี้ยของงวดที่ส่งมาอัปเดตในคำขอนี้ |
employee_loan_amt_period | float | No | ผลรวมยอดชำระของงวดที่ส่งมาอัปเดตในคำขอนี้ |
employee_loan_period | int | No | จำนวนงวด |
employee_loan_pay_period | float | No | ยอดที่ชำระต่องวด |
employee_loan_desc | string | Yes | รายละเอียดเงินกู้ (หลังอัปเดต) |
employee_loan_status | string | No | สถานะเงินกู้ (N = Active, C = Cancel, Y = Finished) |
employee_loan_status_update | string | Yes | วันเวลาที่เปลี่ยนสถานะล่าสุด |
employee_loan_status_remark | string | Yes | หมายเหตุการเปลี่ยนสถานะ |
Period Fields (payload[].loan[].period[])
| Field | Type | Nullable | Description |
|---|---|---|---|
employee_loan_period_id | string | No | รหัสงวดผ่อน (Plain text) |
employee_loan_period_month | string | No | เดือนของงวด (YYYY-MM) |
employee_loan_period_seq | int | No | ลำดับงวด |
employee_loan_period_principle | float | No | เงินต้นของงวด (หลังอัปเดต) |
employee_loan_period_interest | float | No | ดอกเบี้ยของงวด (หลังอัปเดต) |
employee_loan_period_amt | float | No | ยอดชำระของงวด (หลังอัปเดต) |
employee_loan_period_status | string | No | สถานะงวด (N = ยังไม่ชำระ, Y = ชำระแล้ว) |
Code Examples
cURL
curl -X POST "https://openapi.humansoft.co.th/api/v1/open-apis/employee-loans/update" \
-H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"employee_loan_id": "MjAyNjA3MDRBMUIyQzNENEU1RjY=",
"employee_loan_desc": "อัพเดตข้อมูลตามข้อตกลงใหม่",
"period": [
{
"employee_loan_period_id": "MjAyNjA3MDRBQUFBMTExMTIyMjI=",
"employee_loan_period_principle": 1000,
"employee_loan_period_interest": 10,
"employee_loan_period_amt": 1010,
"employee_loan_period_month": "2026-07"
}
]
}'Validation Rules
| Parameter | Validation | Error Message |
|---|---|---|
employee_loan_id | ต้องระบุ และเข้ารหัสเป็น Base64 | 'employee_loan_id' is required |
employee_loan_id | ต้องมีอยู่ในระบบ | คืน HTTP 404 ไม่พบข้อมูลเงินกู้ |
period[].employee_loan_period_id | ต้องเข้ารหัส Base64 และเป็นงวดของ employee_loan_id นี้เท่านั้น | one or more 'employee_loan_period_id' do not belong to this loan |
period[] | แต่ละรายการต้องเป็น object และมีครบทั้ง 5 ฟิลด์ | '<field>' is required in period[<index>] / period[<index>] must be an object |
period[].employee_loan_period_principle / _interest / _amt | ต้องเป็นตัวเลข ≥ 0 และมีทศนิยมไม่เกิน 2 ตำแหน่ง | '<field>' must be numeric and >= 0 in period[<index>] / '<field>' must have at most 2 decimal places in period[<index>] |
period[].employee_loan_period_amt | ต้องเท่ากับ employee_loan_period_principle + employee_loan_period_interest ของงวดนั้น | 'employee_loan_period_amt' must equal principle + interest in period[<index>] |
period[] (totals) | ต้องส่งครบทุกงวด — ผลรวมเงินต้นต้องเท่ากับเงินต้นของสัญญา และผลรวมดอกเบี้ยต้องเท่ากับดอกเบี้ยของสัญญา | sum of employee_loan_period_principle (...) must equal the loan principal (...) / sum of employee_loan_period_interest (...) must equal the loan interest (...) |
ยอดสัญญา (employee_loan_amt, employee_loan_total, employee_loan_down, employee_loan_pay_period, employee_loan_interest) | ห้ามส่งมาในคำขอ (ล็อกหลังสร้าง) | '<field>' cannot be modified via update — loan amounts are fixed; edit period[] only |
| Current Status | แก้ไขได้เฉพาะเงินกู้สถานะ N (Active) — C/Y แก้ไม่ได้ | คืน HTTP 400 ไม่สามารถแก้ไขเงินกู้ที่ปิดหรือชำระครบแล้ว (แก้ได้เฉพาะสถานะ N) |
authorize_id | optional — หากส่งมาต้องเป็น user ที่มีอยู่จริง | 'authorize_id' is invalid or does not exist |
Business Rules
ข้อจำกัดการแก้ไขเงินกู้:
- แก้ไขได้เฉพาะเงินกู้สถานะ
N(Active) เท่านั้น — เงินกู้ที่ปิดบัญชี (C) หรือชำระครบแล้ว (Y) จะแก้ไขไม่ได้ และจะได้รับ HTTP 400 - ยอดสัญญาถูกล็อกหลังสร้างเงินกู้ — แก้ได้เฉพาะ
employee_loan_descและperiod[]เท่านั้น หากส่งฟิลด์ยอดสัญญา (employee_loan_amt,employee_loan_total,employee_loan_down,employee_loan_pay_period,employee_loan_interest) มาจะได้รับ 422 - การแก้ไข
period[]เป็นการกระจายยอดใหม่ ไม่ใช่การเปลี่ยนยอดรวม จึงต้องส่งperiod[]ครบทุกงวด และผลรวมเงินต้น/ดอกเบี้ยต้องเท่ากับยอดของสัญญาเดิม (แต่ละงวดemployee_loan_period_amtต้องเท่ากับprinciple + interest) - ทุก
employee_loan_period_idที่ส่งมาต้องเป็นงวดของเงินกู้นี้ และมีฟิลด์ครบถ้วนถูกต้อง ระบบจะตรวจสอบ ก่อน เขียนข้อมูลใด ๆ จึงไม่มีการเปลี่ยนแปลงบางส่วนเมื่อการตรวจสอบไม่ผ่าน (ตอบกลับ 422) - ฟิลด์
employee_loan_amt_interestและemployee_loan_amt_periodใน response สะท้อนผลรวมของงวดที่ส่งมาในคำขอนี้ ส่วนperiod[]ที่คืนกลับมาจะแสดงงวดผ่อนล่าสุดทั้งหมดของเงินกู้
Notes
Use Cases
- แก้ไขคำอธิบายเงินกู้ - ส่งเฉพาะ
employee_loan_idและemployee_loan_descโดยไม่ต้องส่งperiod - ปรับปรุงตารางงวดผ่อน - ส่ง
period[]เพื่อปรับเงินต้น ดอกเบี้ย หรือยอดชำระของแต่ละงวด - ตรวจสอบก่อนแก้ไข - เรียก Get Employee Loan Detail เพื่อดูรหัสงวดผ่อนและยอดปัจจุบันก่อนส่งอัปเดต
Related APIs
- Get Employee Loan Detail - ตรวจสอบข้อมูลและรหัสงวดผ่อนก่อนแก้ไข
- Get Employee Loan List - ดึงรายการเงินกู้ของพนักงาน
- Create Employee Loan - สร้างเงินกู้ใหม่
- Close Employee Loan - ปิดบัญชีเงินกู้ (หยุดหักเงินเดือน)
- Re-Activate Employee Loan - เปิดเงินกู้ที่ปิดไปแล้วกลับมาใช้งาน