ทำไมสต็อกติดลบได้ และตั้งห้ามติดลบที่ไหน
ตอบสั้น: ระบบตรวจยอดคงเหลือเฉพาะตอนบันทึก เอกสารใหม่ ของเอกสาร 5 ประเภท คือ ขาย 44, สั่งขาย 36, รับคืน 46 (บางกรณี), เบิก 56 และโอนย้าย 72 และตรวจเมื่อเปิดสวิตช์ใน erp_option ไว้เท่านั้น เอกสารอื่น เช่น ปรับปรุงลด 68 หรือส่งคืนผู้จำหน่าย 16 รวมถึงการแก้เอกสารเดิม จึงทำให้สต็อกติดลบได้
รายละเอียด
เงื่อนไขที่ระบบจะตรวจ (checkTransSaveRules) ต้องครบทุกข้อ
- เป็นเอกสารใหม่ (
IsNew) - เปิด
erp_option.issue_stock_control trans_flagอยู่ในชุด 72, 36, 46, 44, 56 โดยไม่นับ 46 ที่inquiry_typeเป็น 1 หรือ 2
สวิตช์ต่อประเภทเอกสาร (stockSwitchesFor)
- ค่าพื้นฐานมาจาก
stock_balance_control - ขาย 44: ตรวจเสมอเมื่อเปิด
ic_stock_control - เบิก 56: ตรวจเสมอเมื่อเปิด
issue_stock_control - 36, 34, 44, 144, 46: ถ้าไม่ได้เปิด
ic_stock_controlจะไม่ตรวจยอด - โอนย้าย 72/70: ไม่ตรวจถ้าไม่ได้เปิด
transfer_stock_control balance_control_typeกำหนดระดับที่ตรวจ: 0 = ต่อรหัสสินค้า, 1 = ต่อคลัง, 2 = ต่อที่เก็บ- สินค้าที่ตั้ง
ic_inventory_detail.balance_control= 1 จะไม่ถูกตรวจ - มีตัวตรวจเสริมคือยอดจอง (
stock_reserved_control, เฉพาะขาย 44) และยอดค้างส่ง (stock_accrued_control)
ถ้ายอดไม่พอ ระบบจะไม่บันทึก และแสดงข้อความที่มีคำว่า "ห้ามติดลบ" พร้อมรหัสสินค้าที่ไม่ผ่าน
ผลต่อต้นทุนเมื่อติดลบ: เมื่อจ่ายออกจนจำนวนสะสม ≤0 มูลค่าสะสมจะถูกตั้งเป็น 0 ส่วนต้นทุนเฉลี่ยยังเป็นค่าเดิม เมื่อมีรายการรับเข้าครั้งถัดไป ระบบเริ่มนับใหม่จากรายการรับนั้นทันที ต้นทุนที่ตัดตอนติดลบจึงไม่ถูกปรับย้อนหลัง (ดู ต้นทุนสินค้าคิดแบบไหน ถัวเฉลี่ยเคลื่อนที่คำนวณยังไง)
ข้อควรระวัง
- ไม่ตรวจตอนแก้เอกสารเดิม เพราะเงื่อนไขคือ
in.IsNewการเพิ่มจำนวนในใบขายเดิมจึงทำให้ติดลบได้ - เอกสารที่บันทึกผ่านเครื่องมือโดยตรง (ปรับยอดจากการตรวจนับ LOT, ต้นทุนแฝง) เรียก
saveTransTxเองโดยไม่ผ่านการตรวจยอดคงเหลือ (ดู ตรวจนับสต็อกแล้วปรับยอดยังไง (ตรวจนับ 76 → ปรับปรุงเพิ่ม 66 / ลด 68), ค่าขนส่ง ค่าอากรขาเข้า (ต้นทุนแฝง / Landed Cost) เข้าต้นทุนสินค้ายังไง) - ต้นทุนที่ผ่านช่วงติดลบขึ้นกับลำดับเอกสาร แก้วันที่เอกสารเพียงใบเดียวอาจเปลี่ยนต้นทุนของเอกสารหลายใบ (ดู ทำไมต้นทุนของเอกสารเก่าเปลี่ยนเอง ทั้งที่ไม่ได้แก้เอกสารนั้น)
ดูเพิ่ม
- ยอดคงเหลือสินค้า และต้นทุนเฉลี่ย (stock balance / balance_qty / average_cost / sum_of_cost)
- ลำดับการบันทึกเอกสาร (Transaction Save Flow)
- บทเรียนกฎตอนบันทึกเอกสาร (Trans Save Rules & Validation)
- โอนสินค้าระหว่างคลัง/ที่เก็บ (72/70) ทำงานยังไง ต้นทุนเปลี่ยนไหม
- ยอดในรายงานไม่ตรงกับงบทดลอง (สต็อก ลูกหนี้ เจ้าหนี้) ต้องเช็กอะไรบ้าง
ที่มาในโค้ด
backend/internal/application/process/trans_save_rules.go:30readSaveRuleOptionsอ่านสวิตช์สต็อกจากerp_optionbackend/internal/application/process/trans_save_rules.go:55stockCheckFlags= 72, 36, 46, 44, 56backend/internal/application/process/trans_save_rules.go:151ตรวจเฉพาะin.IsNewและissue_stock_controlbackend/internal/application/process/trans_save_rules.go:280stockSwitchesForสวิตช์ต่อประเภทเอกสารbackend/internal/application/process/trans_save_rules.go:389checkStockBalancebackend/internal/application/process/service.go:286รับเข้าหลังติดลบให้เริ่มนับใหม่