สมอง SML

คลังความรู้ / API & Process actions

#api#process#gl

API บัญชีแยกประเภท (gl/*, workflow GL/สินทรัพย์/AI-GL)

กลุ่ม action ที่สร้าง ตรวจ ผ่านรายการ และปิดงวดสมุดรายวัน รวมทั้งเอกสารสินทรัพย์ถาวรที่ลงบัญชี. ทั้งหมดเป็น POST ใต้ /api/v1/process/ (และ /process/ ชื่อซ้ำ) ต้องมี Authorization: Bearer <token>; envelope สำเร็จ {"ok":true,"data":...}; ข้อผิดพลาด {"error":{"message":"..."}} (ภาพรวมที่ API เครื่องยนต์ process /process/* — เส้นทาง สิทธิ์ ขนาดบอดี้ (Process engine run API)). ทุก action เติม ProviderCode/DatabaseName/UserCode จาก claims ไม่ใช่จากบอดี้. ไม่มี rate limit; เพดานเวลาทั้ง request 60 วินาที. แนวคิดบัญชี: กระบวนการสร้างสมุดรายวัน GL ใหม่ (GL Rebuild Process), การลงบัญชี Dr/Cr มาตรฐานแยกตามชนิดเอกสาร (Standard GL Posting), เครื่องมือลงบัญชีตามรูปแบบ GL (GL Template Engine), งวดบัญชีและด่านตรวจงวดปิด (Accounting Period Guard), ค่าเสื่อมราคาสินทรัพย์ถาวร (Fixed Asset Depreciation), ขายสินทรัพย์ถาวร (Fixed Asset Sale 1802), กลุ่ม route workflow เมนูกระบวนการระบบ (Workflow Menus), เครื่องมือกระบวนการระบบ ตรวจ ic_trans / คำนวณแต้มใหม่ / นำเข้าที่อยู่จัดส่ง (Sysproc Tools), ผู้ช่วย AI แบบกฎคำนวณ 6 ตัว (AI Copilot ai-*).

ตาราง action

action หน้าที่ input สำคัญ ตาราง path:line สิทธิ์ / บอดี้
gl/rebuild ลบสมุดรายวันที่ระบบสร้างอัตโนมัติ (COALESCE(trans_direct,0)<>1) ของเอกสารเป้าหมาย แล้วสร้าง gl_journal + gl_journal_detail ที่สมดุลใหม่จาก ic_trans ใน transaction เดียว docNo, transFlag, dateFrom, dateTo gl_journal, gl_journal_detail, ic_trans, ic_inventory, ic_trans_detail, ap_supplier, ar_customer handler.go:98 → service.go:1297 docNo ไม่ว่าง = Write, ทั้งฐาน = Admin (permission.go:74-78); 16 MB
gl/template-defaults แถวรูปแบบ GL เริ่มต้นของจอหนึ่ง (ปุ่ม "ดึงรูปแบบ" ของ DocFormat); ระบบสต็อกต่อเนื่อง (inventory_gl_post=0) ตัด action 101/103 ออก screenCode erp_option gl_template_handler.go:12 → gl_template_defaults.go:58 Read; 1 MB
gl/recurring รายการเทมเพลตสมุดรายวันประจำพร้อมแถวที่ถอดรหัสแล้ว (คอมโบของจอสมุดรายวัน) {} (ไม่มีฟิลด์) gl_recurring gl_recurring_handler.go:12 → gl_recurring.go:42 Read; 1 MB
workflow/journal-list ใบสำคัญตามเงื่อนไขพร้อมข้อผิดพลาดที่ทำให้ผ่านรายการไม่ได้ dateFrom, dateTo, docFrom, docTo, undo gl_journal, gl_journal_detail, gl_chart_of_account workflow_handler.go:45 → workflow.go:442 Read; 1 MB
workflow/journal-pass ตั้ง gl_journal.is_pass (1 ผ่าน / 0 ยกเลิก) ตามเลขที่ที่เลือก แล้วซิงก์ gl_journal_detail.is_pass menuName, docNos[] (1-5000 ใบ), undo gl_journal, gl_journal_detail, gl_chart_of_account :52 → workflow.go:480 Write; 1 MB
workflow/gl-check ตรวจ 9 ข้อตามลำดับของ C# (เขียนเฉพาะการซิงก์ journal_type ของรายละเอียดจากหัว) dateFrom, dateTo, showAll, onlyBookSelect, skipCancelDoc ic_trans, erp_doc_format, gl_journal, gl_journal_detail, gl_chart_of_account, gl_journal_book, ap_ar_trans :59 → workflow.go:554 Read; 1 MB
workflow/gl-close พรีวิวหรือบันทึกรายการปิดบัญชีสิ้นงวด/สิ้นปี; บันทึกซ้ำได้ (เอกสารปิดเลขเดิมถูกแทนที่ใน transaction เดียวกัน) menuName, mode (period/year), periodNumber, accountYear, dateFrom, dateTo, docNo, docFormatCode, bookCode, closeToAccount, remark, save erp_account_period, gl_chart_of_account, gl_journal, gl_journal_detail, gl_journal_book :66 → workflow.go:817 Admin (permission.go:50); 1 MB
workflow/fa-depreciation พรีวิว (save:false) หรือบันทึกเอกสารโอนค่าเสื่อมสินทรัพย์ (1801) พร้อมสมุดรายวัน; delete:true ลบเอกสาร menuName, dateBegin, dateEnd, processBy (1 วัน/2 เดือน/3 ปี), processMode (0 สรรพากร/1 บัญชี/2 วันจริง), fromAsCode..toAsType, docNo, docDate, docFormatCode, bookCode, branchCode, save, delete as_trans, as_trans_detail, as_asset, as_asset_detail, erp_account_period, erp_option, gl_chart_of_account :73 → fa_depreciation.go:794 delete:true = Delete, ไม่งั้น Write (permission.go:112-117); 1 MB
workflow/asset-sale พรีวิว / บันทึก (เพิ่มหรือแก้ idempotent ตาม docNo) / ลบ เอกสารขายสินทรัพย์ (1802) menuName, op (preview/save/delete), docNo, oldDocNo, docDate, docFormatCode, bookCode, custCode, inquiryType, vatType, vatRate, creditDay, lines[], wht[] as_trans_detail, as_asset, as_asset_detail, ar_customer_detail, ap_supplier, gl_chart_of_account, erp_option :80 → fa_sale.go:382 preview = Read, delete = Delete, อื่น = Write (permission.go:118-127); 1 MB
workflow/ai-auto-gl เสนอรายการสมุดรายวันสมดุลจากคำอธิบายภาษาไทย + จำนวนเงิน (ใช้ *big.Rat) description, amount (string ทศนิยม), includeVat gl_chart_of_account :159 → ai_copilot.go:1089 ไม่อยู่ใน routeRights = Admin; 1 MB
workflow/ai-bank-reconcile จับคู่รายการ statement ธนาคารกับ cb_chq_list, ap_ar_trans, ic_trans passBookCode, dateFrom, dateTo, statementLines[] cb_chq_list, ic_trans, ap_supplier, ar_customer :138 → ai_copilot.go:494 ไม่อยู่ใน routeRights = Admin; 1 MB

หมายเหตุ: workflow/audit-list และ workflow/change-code อยู่ใน API เวิร์กโฟลว์ระบบ (Process workflow actions: change-code, audit-list, import-transport-label, province-*, ai-audit-copilot และดัชนี 19 action); ตัวช่วยสต็อกที่ผูกกับ GL (stock/rebuild, workflow/point-recal) อยู่ใน API สต็อกสินค้า (Process stock actions: stock/rebuild, stocktools/*, point-recal, check-ic-trans, ai-smart-reorder).

รายละเอียดรายตัว

gl/rebuild

  • Request: {"docNo":"<docNo>","transFlag":<transFlag>,"dateFrom":"2026-01-01","dateTo":"2026-12-31"} (handler.go:90-95). ส่ง docNo = post ใหม่เฉพาะเอกสารที่เพิ่งบันทึก (ใช้หลังหน้าจอรายการค้า); ไม่ส่ง = ทั้งฐานตามช่วงวันที่ (ต้อง Admin)
  • Response 200: {"ok":true,"data":{"docsProcessed","journalsCreated","linesCreated","warnings":[...]}} — warnings คือเอกสารที่ GL template engine ข้ามหรือส่งกลับไปใช้การลงบัญชีมาตรฐาน (service.go:60-66)
  • Errors: 401 ไม่มี token; 403 สิทธิ์ไม่พอ (ข้อความไทย); 400 บอดี้เสีย; 500 ภายใน
  • ผู้เรียก: rebuildGl() ที่ query-client.ts:105-114 (หลังบันทึกเอกสาร), account/process/SystemProcessWorkbenchScreen.tsx:652 (ประมวลผลทั้งช่วง)

gl/template-defaults และ gl/recurring

  • POST gl/template-defaults บอดี้ {"screenCode":"<screenCode>"} → อาร์เรย์แถวเริ่มต้นของ erp_doc_format_gl (ผู้เรียก account/master/DocFormatScreen.tsx:856; ตาราง erp_doc_format_gl — เทมเพลตลงบัญชี GL ต่อรูปแบบเอกสาร)
  • POST gl/recurring บอดี้ {} → อาร์เรย์เทมเพลต; ถ้า XML เดิมถอดไม่ได้ จะ log เตือนด้วย code ของเทมเพลตแล้วคืนแถวนั้นต่อ (gl_recurring_handler.go:13-23). ผู้เรียก account/transaction/GlRecurringBar.tsx:23

workflow/journal-list, journal-pass, gl-check

  • journal-list ต้องระบุช่วงวันที่ (YYYY-MM-DD) มิฉะนั้น 400 "ต้องระบุช่วงวันที่ (YYYY-MM-DD)" (workflow.go:444); journal-pass เลือก 1-5000 ใบ มิฉะนั้น 400 "ต้องเลือกใบสำคัญ 1-5000 ใบ" (workflow.go:488)
  • ผลลัพธ์: journal-pass {"journals":<n>}; gl-check อาร์เรย์ {check,detail,error} ต่อข้อ (SystemProcessWorkbenchScreen.tsx:658,671)
  • ตัวอย่าง:
POST /api/v1/process/workflow/journal-pass     (Authorization: Bearer <token>)
{"menuName":"<menuKey>","docNos":["<docNo1>","<docNo2>"],"undo":false}

workflow/gl-close

  • Request: {"menuName":"<menuKey>","mode":"period","periodNumber":<n>,"accountYear":<year>,"dateFrom":"...","dateTo":"...","docNo":"<docNo>","docFormatCode":"<code>","bookCode":"<bookCode>","closeToAccount":"<accountCode>","remark":"","save":false}
  • Response 200: {"ok":true,"data":{"dateFrom","dateTo","docDate","profit","lines":[...],"totalDebit","totalCredit","saved"}} — profit เป็น string, ติดลบ = ขาดทุน (workflow.go GLCloseResult). ตัวเลขทั้งหมดเป็น string ทศนิยม
  • ผู้เรียก: SystemProcessWorkbenchScreen.tsx:533

workflow/fa-depreciation และ asset-sale

  • fa-depreciation: processMode เป็น pointer — ไม่ส่งใช้ค่า 1 (บัญชี); processBy ไม่ส่งใช้ 2 (เดือน). service ไม่เรียก _checkOpenPeriod จึงไม่ปฏิเสธงวดที่ปิดแล้ว ตามพฤติกรรม C# (fa_depreciation.go:794 doc). ผู้เรียก: SystemProcessWorkbenchScreen.tsx:571,580
  • asset-sale: สถานะ "ขายแล้ว" คำนวณจากแถว 1802 ดังนั้นการลบเอกสารคืนสถานะสินทรัพย์ (fa_sale.go:382 doc). ผู้เรียก: account/transaction/AssetSaleScreen.tsx:30 (API = "/api/process/workflow/asset-sale")
  • ตัวอย่าง asset-sale (ค่าสมมติ):
POST /api/v1/process/workflow/asset-sale     (Authorization: Bearer <token>)
{"menuName":"<menuKey>","op":"preview","docNo":"<docNo>","docDate":"2026-01-31","custCode":"<custCode>",
 "vatType":0,"vatRate":"7","lines":[{"<field>":"<value>"}]}

ai-auto-gl และ ai-bank-reconcile

  • ไม่เรียก LLM ภายนอก; คำนวณด้วยกฎ + *big.Rat. ai-auto-gl คืน {"description","totalDebit","totalCredit","confidence","reason","lines":[...]} (ai_copilot.go:1060-1088)
  • ผู้เรียก: SystemProcessWorkbenchScreen.tsx:305 (ai-bank-reconcile), :355 (ai-auto-gl) — เรียกผ่าน helper workflow() ที่ยิง /api/process/workflow/<action> และโยน error ถ้า ok:false (บรรทัด 34-38). เนื่องจากสองตัวนี้ต้อง Admin (ดูตาราง) ผู้ใช้ที่ไม่ใช่ Admin จะได้ 403

Next whitelist

ทุก workflow/* ผ่าน src/app/api/process/workflow/[action]/route.ts ซึ่งมี ACTIONS ครบ 19 ตัว (บรรทัด 12-32); ชื่ออื่น = 404 NOT_FOUND "ไม่พบคำสั่ง". gl/* มี Next route แยกต่อ action ใต้ src/app/api/process/gl/{rebuild,recurring,template-defaults}/ ไม่ใช้ [action].

ที่มาในโค้ด

  • backend/internal/adapter/inbound/http/router.go:131-133,172-174 (gl/rebuild, template-defaults, recurring)
  • backend/internal/adapter/inbound/http/process/handler.go:90-140 (rebuildGLRequest, RebuildGL)
  • backend/internal/adapter/inbound/http/process/gl_template_handler.go:12; gl_recurring_handler.go:12
  • backend/internal/adapter/inbound/http/process/workflow_handler.go:18-30,45-90,138,159 (decode ≤ 1 MB, case ต่อ action)
  • backend/internal/adapter/inbound/http/process/permission.go:24-52,73-78,112-127
  • backend/internal/application/process/service.go:50-66,1297-1331; gl_template_defaults.go:31,58; gl_recurring.go:15,42
  • backend/internal/application/process/workflow.go:365,442,463,480,532,554,679,817; fa_depreciation.go:534,794; fa_sale.go:36,382; ai_copilot.go:438,494,1060,1089
  • frontend/src/lib/query-client.ts:105-114; frontend/account/process/SystemProcessWorkbenchScreen.tsx:34-38,305,355,426,533,571,580,652,658,671; account/transaction/{AssetSaleScreen.tsx:30,GlRecurringBar.tsx:23}; account/master/DocFormatScreen.tsx:856