#accounting#validation#credit-limit#ar#stock-control
ด่านตรวจก่อนบันทึกเอกสารและวงเงินเครดิต
checkTransScreenSave (trans_validate.go:43) รันใน transaction ของ SaveTrans ก่อนเขียนเอกสาร ตรวจงวด สิทธิ์แก้ไข ข้อมูลหน้าจอ เอกสารอ้างอิง แล้วจบด้วยกฎสต็อก/ต้นทุน/วงเงินเครดิต ผลมี 3 แบบ: ห้ามบันทึก (validation), ถามยืนยัน (CONFIRM: :50) และขอรหัสผู้อนุมัติ (CREDIT_PASSWORD: trans_credit.go:26)
ทำงานอย่างไร
ลำดับใน checkTransScreenSave
- งวดเปิด (ยกเว้น 521/522/523) ดู งวดบัญชีและด่านตรวจงวดปิด (Accounting Period Guard)
- แก้ไขเอกสารเดิม:
refuseLockedRecord(:112)is_lock_record= 1 → "Lock เด็ดขาด : ห้ามแก้ไข หรือลบข้อมูล" (ถ้าเป็นเอกสารจากเมนูต้นทุนแฝงมีข้อความเฉพาะ);editLocked(:132) ห้ามแก้เมื่อถูกใช้ / สำเร็จ / ยกเลิก / คัดลอก หรือ 34 ที่อนุมัติแล้ว (30 แก้ได้เมื่อเปิดsale_order_edit); แก้เอกสารที่ไม่มีอยู่ = not-found - flag มัดจำและเอกสารยอดหัว จบตรงนี้ ไม่ผ่านขั้นที่เหลือ (comment: เป็นหน้าจอคนละชนิดใน C#)
- ช่องบังคับของหน้าจอ,
checkParty(:216) คู่ค้าต้องมีและไม่ปิดการใช้งาน checkReferencedLines(:339) ห้ามดึง/คืนเกินเอกสารอ้างอิง "ส่งคืนเกินมูลค่า"; ข้ามเมื่อ 44 +sale_over_reserveหรือ 12/310 +receive_more_pocheckTransSaveRules(trans_save_rules.go:134)
- มัดจำที่ตัดต้องไม่เกินมูลค่าสุทธิ (
checkAdvance:258) ดู เงินมัดจำและเงินล่วงหน้า (Deposits & Advances) - การลบ (
checkTransScreenDelete:95) ใช้ด่าน lock + editable + งวดของวันที่ที่เก็บ
กฎใน checkTransSaveRules (สวิตช์จาก erp_option อ่านที่ :30; ไม่มีแถว = ปิดทุกตัว)
check_input_vat: flag ภาษีซื้อที่ vat_type 0/1 ต้องมีเลขและวันที่ใบกำกับภาษี- lot ของสินค้า (
lotMessage:180) ยกเว้น 46 inquiry 1/2 - ขายต่ำกว่าทุน: ที่นี่ตรวจเฉพาะ 144 เมื่อเปิดทั้ง
warning_low_costและlock_low_cost(flag อื่นตรวจรายบรรทัดในกริด); ข้ามของแถม (lowCostMessage:192) - สต็อกไม่พอ (
checkStockBalance:389): เฉพาะเอกสารใหม่ +issue_stock_controlตรวจได้ระดับคลัง / ที่เก็บ / lot และรวมยอดค้างส่ง/จองตามสวิตช์ (accruedSQL:447) ดู การคำนวณยอดสต็อกคงเหลือใหม่ (Stock Balance Rebuild) - วงเงินเครดิต (
checkTransCredittrans_credit.go:33)
วงเงินเครดิตใบขาย (checkCreditLimit :522)
- ตรวจเฉพาะ (
creditChecked:488): 44 inquiry 0, 99 ทุกกรณี, 250 / 254 inquiry 0 หรือ 2 ar_customer_detail.credit_status≠ 0 → "ลูกค้า ... ถูกปิดสถานะเครดิต" (ไม่ขึ้นกับสวิตช์); status 2 +sr_ss_credit_checkซื้อได้เมื่อใบสั่งที่ดึงมาได้รับอนุมัติในerp_credit_request(refOrdersApproved:579)- ตรวจวงเงินเมื่อเปิด
warning_credit_moneyหรือlock_credit_moneyและcredit_money≠ 0 - ยอดค้าง = ลูกหนี้คงค้าง (
arBalanceSQL:599 ตั้งหนี้ + เพิ่มหนี้ - ลดหนี้ - รับชำระ ไม่นับเอกสารนี้) + เช็คในมือ (creditChqSQL:610 เมื่อเปิดar_credit_chq_outstanding, สถานะไม่ใช่ 2/7/8, ตัดเศษเป็นบาท) - มัดจำ/ล่วงหน้าคงเหลือ (creditDepositSQL:616 เมื่อเปิดcredit_sale_include_deposit) - เกินเมื่อ ยอดเอกสาร > วงเงิน - ยอดค้าง (
creditOutcome:503)request_ar_creditหรือlock_credit_money= ห้ามบันทึก "ยอดวงเงินเครดิตของลูกค้า เกินที่กำหนดไว้"- lock +
password_ar_credit(ไม่เปิด request) = ขอรหัสผู้อนุมัติ (creditApprover:50) ผู้ใช้ต้องมีapprove_ar_credit= 1; ผ่านแล้วบันทึกชื่อผู้อนุมัติที่ic_trans.user_approve - warning อย่างเดียว = ถามยืนยัน
วงเงินของใบสั่งขาย/สั่งจอง 34 / 36 (planOrderCredit :147)
- ทำงานเมื่อเปิด
sr_ss_credit_check; เงินเชื่อ inquiry 0/2: ไม่เกิน =auto_approved= 1; เกินและเปิดcheck_credit_sale_reserve_sale_order= ห้ามบันทึก; มิฉะนั้นถามยืนยันแล้วบันทึกเป็นis_hold= 1 พร้อมแถวerp_credit_request(ยอดเกินและ % ปัด HALF_UP 2) - 34 เงินสด (inquiry 1/3) ถูก hold เพื่อตรวจ % มัดจำ; 36 เงินสดอนุมัติอัตโนมัติ
- ยอดที่ต้องพอ = ยอดเอกสาร + ลูกหนี้คงค้าง + ยอดค้างของใบสั่งจอง 34 และใบสั่งขาย 36 ที่ยังไม่ถูกดึงไปทำเอกสารต่อ (
orderRemainSQL:216) + เช็คในมือ (orderCreditCheck:100); ลูกค้าที่ตั้งclose_over_credit_warningเกินแล้วห้ามบันทึก "เกินวงเงินเครดิต ไม่สามารถบันทึกเอกสารได้"
จุดเสี่ยง
- รหัสผู้อนุมัติเครดิตเทียบกับค่า
erp_user.passwordตรงๆ (constant time, trans_credit.go:77) บ่งว่าคอลัมน์ไม่ได้เก็บแบบ hash (ยังไม่ยืนยันรูปแบบที่เก็บ) และไม่มีตัวจำกัดจำนวนครั้งที่ผิด (comment ponytail ในโค้ด) - ไม่ได้ port: ขออนุมัติเครดิตด้วย OTP (
request_ar_creditจึงบล็อกเสมอ) และวงเงินร่วมข้ามฐาน (dblinkjoin_money_credit) (comment :515-521) - กฎสต็อกตรวจเฉพาะเอกสารใหม่ แก้ไขเอกสารเดิมให้สต็อกติดลบได้
- เช็คในมือถูกตัดเศษเป็นบาทตาม C# ยอดค้างจึงต่ำกว่าจริงได้ไม่เกิน 1 บาท
- flag มัดจำและเอกสารยอดหัวข้ามช่องบังคับ คู่ค้า และเอกสารอ้างอิงทั้งหมด
ที่มาในโค้ด
backend/internal/application/process/trans_validate.go:43checkTransScreenSavebackend/internal/application/process/trans_validate.go:132editLockedbackend/internal/application/process/trans_validate.go:339checkReferencedLinesbackend/internal/application/process/trans_save_rules.go:134checkTransSaveRulesbackend/internal/application/process/trans_save_rules.go:389checkStockBalancebackend/internal/application/process/trans_save_rules.go:522checkCreditLimitbackend/internal/application/process/trans_save_rules.go:599arBalanceSQLbackend/internal/application/process/trans_credit.go:77approveCreditbackend/internal/application/process/trans_credit.go:147planOrderCredit