#process#doc#save-doc#delete-doc#ap_ar_trans#gl_journal#bills#idempotent
บันทึก/ลบเอกสารนอก ic_trans (Save Doc / Doc Plan)
docs.go เป็นแกนของ route doc/save, doc/delete, doc/bills ที่หน้าจอ UniversalTransScreen ใช้บันทึกเอกสารที่ ไม่ได้อยู่ใน ic_trans ได้แก่ ap_ar_trans (เอกสารลูกหนี้/เจ้าหนี้) และ gl_journal (สมุดรายวันทั่วไป) ส่วนเอกสารซื้อ-ขาย-สต็อกใช้ trans/save (กลุ่มอื่น) โน้ตนี้อธิบายกลไกของ handler/แผนคำสั่ง รายละเอียดบัญชีของเอกสารเหล่านี้ดู ภาพรวมระบบบัญชี SML AI Account (Accounting Overview)
ทำงานอย่างไร
Route และสิทธิ์
POST /process/doc/save,/doc/delete,/doc/bills,/doc/flow(และ/api/v1/process/...) ผูกที่router.go:136-141, 177-182- สิทธิ์ (
permission.go):doc/saveต้องมีสิทธิ์เพิ่มเมื่อ body มีisNew = trueนอกนั้นเป็นสิทธิ์แก้ไข (:81-85);doc/delete= สิทธิ์ลบ;doc/bills= สิทธิ์อ่าน ดู การตรวจสิทธิ์เมนูของ route process (Process route rights) - handler ใส่
ProviderCode,DatabaseNameและ (เฉพาะ save)UserCodeจาก token ไม่รับจาก body (handler.go:168-186) ส่วนdoc/billsใช้ตัวถอดรหัสของกลุ่ม cheque (bills_handler.go:11-24)
ชนิดเอกสารและ input (SaveDocInput :35)
kind:ap_ar_trans,gl_journalหรือcb_chq_list(:17-22) --cb_chq_list(ทะเบียนเช็ค/บัตรเครดิต) ดูอย่างเดียว บันทึก/ลบจะได้ error "ทะเบียนเช็ค/บัตรเครดิตเป็นหน้าจอดูข้อมูลอย่างเดียว" (:435) ทั้งที่คอมเมนต์ของ handler ยังเขียนว่าเขียนcb_chq_listได้ (handler.go:168-169)isNew = true= ปฏิเสธถ้ามีคีย์อยู่แล้ว;false= แทนที่เอกสารเดิม จึงบันทึกซ้ำได้ผลเดิม (idempotent ตามคอมเมนต์ :33-34)- ฟิลด์หลัก:
docNo,docDate(YYYY-MM-DD),docTime(HH:MM),transType,transFlag,custCode,bookCode(gl_journal, ว่าง =JV), สาขา/แผนก,vatType/vatRate, ส่วนลด, เงินล่วงหน้า,dueDate,docRef/docRefDate,creditDay,remark,docFormatCode, รหัสพนักงานขาย/โครงการ/จัดสรร/ด้าน/งาน/กลุ่มเอกสาร,currencyCode/exchangeRate,fxMode - ตารางย่อย:
lines(รายการ),bills(กริดบิลของ flag 213/235/19/239),pay(แท็บรับ/จ่ายชำระของ 19/239 ->cb_trans),glLines(รายการบัญชีของสมุดรายวัน), และแท็บภาษีvatBuy,vatSale,whtIn,whtOut - เงินทุกช่องเป็นสตริงทศนิยมผ่านตัวแกะ
decimalParserไม่ผ่านfloat64
โครงแผน docPlan (:108) และ runDocPlan (:179)
buildSaveDocPlan / buildDeleteDocPlan ตรวจ input แล้วสร้าง "แผน" (คำสั่ง SQL แบบพารามิเตอร์เรียงลำดับ + ตัวตรวจหลังเขียน) จากนั้น runDocPlan รันใน transaction เดียวตามลำดับ:
- ล็อกเอกสารด้วย
pg_advisory_xact_lock(hashtext(lockKey))(gl_journal:<เลขที่>หรือap_ar_trans:<เลขที่>) และล็อกร่วมระดับบัญชีแยกประเภท (lockGLShared) isNew= ตรวจซ้ำด้วยexistsSQL; ถ้าไม่ใช่และเป็นap_ar_transล็อกคีย์เดียวกับการยกเลิกเอกสาร (ic_trans:<เลขที่>:<flag>) แล้วตรวจcheckStoredApArEditable-- เอกสารที่ถูกใช้ (used), เสร็จสมบูรณ์ (success) หรือยกเลิกแล้ว (last_status) แก้/ลบไม่ได้ (apArEditLocked:457 อ้างอิง C#_ar_ap_trans._myManageData1__checkEditData); เอกสารที่ไม่มีอยู่ผ่าน- ถ้าเป็นเอกสารที่ผูกการอ้างอิง (
docFlow) อ่านเอกสารต้นทางเดิมไว้ก่อน - รันคำสั่งทีละตัว (ลบของเดิมแล้วแทรกใหม่); ข้อผิดพลาดฐานข้อมูลแปลงด้วย
execError - รันตัวตรวจหลังเขียน (
checks, ไฟล์pay_check.go-- เช่นยอดแท็บชำระครบ) docFlow: คำนวณสถานะ used/success ของเอกสารที่บิล/ชำระอ้างถึงใหม่ทั้งก่อนและหลัง (docFlowTx) ดู สถานะต่อเนื่องของเอกสาร กราฟโยงเอกสาร และเลขที่เอกสารถัดไป (Doc flow & numbering)glFlag > 0(:219): สร้างรายการบัญชีของเลขที่นั้นใหม่ด้วยrebuildGLTx-- ตั้งเฉพาะตอนบันทึกap_ar_transflag 19 และ 239 (:389-391) และrebuildGLTxรองรับสองแฟลกนี้จริง (service.go:1485,1495,1738) ส่วนแฟลกอื่นของap_ar_transและgl_journalไม่สร้างบัญชีซ้ำ; คอมเมนต์ที่docs.go:73ยังเขียนว่า "no GL rebuild ... no-op" ซึ่งขัดกับโค้ดที่ตั้งglFlag(ถือว่าคอมเมนต์ค้างเก่า -- ยังไม่ยืนยันโดยรันจริง) การลบไม่ตั้งglFlagแต่ลบgl_journalตามdoc_noตรง ๆ
ก่อนรัน SaveDoc (:119)
- หาสาขาตามผู้ใช้ (
userBranchCode), เตรียมค่าหลายสกุลเงิน (billFx,checkFxMode) สำหรับ flag 19/239, อ่านจำนวนทศนิยมของแท็บชำระ (faAmountScale) บน pool ก่อนเปิด transaction (เพื่อให้การอ่านพลาดไม่ทำ transaction ล้ม) - ใน transaction:
checkSaveDocPeriod(period.go:109; กลุ่มงวดบัญชี ไม่ได้อธิบายที่นี่) แล้วจึงสร้าง/รันแผน -- เอกสารหลายสกุลเงินสร้างแผนใน transaction หลังrefreshFxBillsอ่านคอลัมน์หนี้ล่าสุด
สมุดรายวัน gl_journal (:227-)
- เลขที่เอกสาร 1-25 ตัวอักษร, วันที่เอกสารบังคับ; ข้ามแถวที่ไม่มีรหัสบัญชี; ยอดเดบิตรวมต้องเท่ากับเครดิตรวม ไม่งั้น error "ยอดเดบิต (...) และเครดิต (...) ไม่เท่ากัน"
- เขียน
gl_journal_detail+gl_journalพร้อมงวด/ปีบัญชีหาจากerp_account_period(ไม่พบ ใช้เดือน/ปีของวันที่) journalPlan(:441) แตะเฉพาะ JV มือ (trans_flag0 หรือ 1999 ตามคอมเมนต์อ้าง C#JournalDataProcess.cs:20) -- GL ที่rebuildGLTxสร้างจากเอกสารอื่นเลขเดียวกันไม่ถูกลบ; ลบสมุดรายวันลบแท็บภาษีด้วย (journalTaxDeleteStmts)
เอกสาร ap_ar_trans (:300-)
apArPlan(:483) ลบแถวเดิมในap_ar_trans_detail,ap_ar_trans,cb_trans_detail,cb_trans,cb_chq_list(เช็คจากแท็บชำระ) ของเลขที่+flag นั้น แล้วแทรกหัวap_ar_trans, กริดบิล, แท็บชำระ และแท็บภาษี (19: ภาษีซื้อ + หัก ณ ที่จ่ายรับ, 239: ภาษีขาย + หัก ณ ที่จ่ายจ่าย)- flag ที่มีกริดบิล: 213/235/19/239; ถ้าไม่มี ยอดรวมมาจาก
lines; กรณีมีกริดบิลtotal_net_value= ผลรวมsum_pay_moneyตาม C#_reCalc ap_ar_transเป็นคีย์เดียวด้วยdoc_no(ชื่อ constraint ในคอมเมนต์ :482) จึงตรวจแก้ไขด้วยdoc_noอย่างเดียว กันแก้ผิด flag แล้วหลุดจากตัวป้องกัน- ลบ (
buildDeleteDocPlan:402): นอกจากแผนข้างต้น ลบgl_journal_detail/gl_journalตามdoc_noและแท็บภาษีตามdoc_no+ flag (อ้างอิง C#_ar_ap_trans.cs:3068, 2972-2986) ต้องระบุtransFlag> 0
รายการเอกสารหนี้ค้างชำระ doc/bills (OutstandingBills :628)
- Input
{transFlag (213/235/19/239), custCode, docDate, docNo}:docNoคือเอกสารที่กำลังแก้ ยอดชำระของมันเองไม่หักยอดคงค้าง; ไม่รู้จัก flag = "ประเภทเอกสารนี้ไม่มีรายการเอกสารหนี้"; ไม่ระบุรหัสลูกหนี้/เจ้าหนี้ = error - คัดเอกสารหนี้/ใบลดหนี้จาก
ic_transรวมการขายสินทรัพย์เชื่อ (as_transflag 1802) ด้วยชุดเงื่อนไข flag ในarDebtWhere/arCreditWhere/apDebtWhere/apCreditWhere(:599-609, อ้างอิง C#_process.cs _createQuery588-956) ใบลดหนี้คิดเป็นยอดติดลบ; กรองใบวางบิลซ้ำเมื่อerp_option.filter_pay_bill = 1 - ผลลัพธ์คือ
BillLine[](ใช้เติมกริดบิล) รองรับหลายสกุลเงินผ่านbillFx
ที่มาในโค้ด
backend/internal/application/process/docs.go:17-98- ชนิดเอกสาร,SaveDocInput,DeleteDocInputbackend/internal/application/process/docs.go:100-225-docPlan,SaveDoc,DeleteDoc,runDocPlanbackend/internal/application/process/docs.go:227-427-buildSaveDocPlan,buildDeleteDocPlanbackend/internal/application/process/docs.go:429-497- ทะเบียนเช็คอ่านอย่างเดียว,journalPlan, ล็อกแก้ไขap_ar_trans,apArPlanbackend/internal/application/process/docs.go:498-702-BillLine,billStmts,OutstandingBillsbackend/internal/adapter/inbound/http/process/handler.go:168-186-SaveDoc,DeleteDocbackend/internal/adapter/inbound/http/process/bills_handler.go:11-24-DocBillsbackend/internal/adapter/inbound/http/router.go:136-141,177-182- ผูก routebackend/internal/adapter/inbound/http/process/permission.go:24,39,47,81-85- สิทธิ์
ดูเพิ่ม
- สถานะต่อเนื่องของเอกสาร กราฟโยงเอกสาร และเลขที่เอกสารถัดไป (Doc flow & numbering)
- ยกเลิกและอนุมัติเอกสาร (Document cancel / approve)
- การตรวจสิทธิ์เมนูของ route process (Process route rights)
- ตัวกระจายคำขอของ process (Process dispatcher)
- ภาพรวมระบบบัญชี SML AI Account (Accounting Overview)
- ภาพรวมกลุ่ม process ของ Backend (Process overview)