#faq#ic#stock#cost#moving-average#troubleshoot
ทำไมต้นทุนของเอกสารเก่าเปลี่ยนเอง ทั้งที่ไม่ได้แก้เอกสารนั้น
ตอบสั้น: ต้นทุนในบรรทัดเอกสารเป็นค่าที่ระบบคำนวณขึ้นใหม่ได้ตลอด ไม่ใช่ค่าที่ล็อกตายตัว ทุกครั้งที่บันทึก แก้ ลบ หรือยกเลิกเอกสารของสินค้าตัวใด ระบบจะไล่คำนวณต้นทุนถัวเฉลี่ยของสินค้าตัวนั้นใหม่ตั้งแต่รายการแรก ดังนั้นเอกสารที่ลงวันที่ย้อนหลังจะเปลี่ยน sum_of_cost / average_cost ของเอกสารที่ลงวันที่หลังจากนั้นทั้งหมด
รายละเอียด
ทุกครั้งที่บันทึกหรือลบเอกสาร ระบบจะเรียก rebuildTransDerived ซึ่งทำงานตามลำดับนี้
rebuildStockTxคำนวณสต็อกใหม่เฉพาะรหัสสินค้าที่อยู่ในเอกสาร (ทั้งรายการเดิมและรายการใหม่) โดยไล่บรรทัดเคลื่อนไหวทั้งหมดของสินค้านั้นตั้งแต่ต้น แล้วเขียนsum_of_cost,average_costทับลงทุกบรรทัดที่ค่าเปลี่ยน รวมถึงบรรทัดของเอกสารอื่น และอัปเดตic_inventory.average_costrebuildGLTxสร้าง GL ใหม่ เฉพาะเอกสารที่บันทึก- ถ้าเป็นใบโอน 72 จะซิงก์หัวเอกสารรับโอน 70 ด้วย
กรณีที่ทำให้ต้นทุนเปลี่ยนบ่อย
- บันทึกซื้อหรือรับเข้าย้อนวันที่ ต้นทุนเฉลี่ยของรายการขายหรือเบิกที่อยู่หลังวันนั้นจะเปลี่ยน
- แก้วันที่หรือเวลาเอกสาร ลำดับการไล่เปลี่ยนตามวันที่ เวลา และ
calc_flag(ดู ต้นทุนสินค้าคิดแบบไหน ถัวเฉลี่ยเคลื่อนที่คำนวณยังไง) - สต็อกเคยติดลบ เมื่อมีรายการรับเข้าระบบจะเริ่มนับใหม่จากรายการรับนั้น ถ้าเอกสารที่ทำให้ติดลบย้ายตำแหน่งไป ผลจึงต่างไปมาก (ดู ทำไมสต็อกติดลบได้ และตั้งห้ามติดลบที่ไหน)
- ยกเลิกเอกสาร (
last_status= 1) เอกสารนั้นจะหลุดออกจากการคำนวณ - แก้หน่วยนับ หรือแก้อัตราส่วน
stand_value/divide_valueแล้วรันคำนวณสต็อกใหม่ (ดู ขายเป็นกล่อง/โหล แต่สต็อกนับเป็นชิ้น ระบบแปลงหน่วยยังไง) - บันทึกต้นทุนแฝง (เอกสาร 66 ที่จำนวนเป็น 0) มูลค่าจะถูกเพิ่มเข้าในวันที่ของเอกสารนั้น (ดู ค่าขนส่ง ค่าอากรขาเข้า (ต้นทุนแฝง / Landed Cost) เข้าต้นทุนสินค้ายังไง)
ถ้าต้องการให้บรรทัดใดไม่เปลี่ยนเลย ระบบมีกลไก "ล็อกต้นทุน" ที่ใช้ค่า sum_of_cost_fix แทนการคำนวณ
ข้อควรระวัง
- เมื่อต้นทุนของเอกสารอื่นเปลี่ยน GL ของเอกสารเหล่านั้นไม่ได้ถูกสร้างใหม่ตาม ตัวอย่างเช่น เอกสารสต็อก 56/58/60/66/68 ที่หัวเอกสารมี
total_amount= 0 GL จะใช้ผลรวมsum_of_costของบรรทัด ณ เวลาที่สร้าง GL ครั้งล่าสุด ต้องรัน "ประมวลผล GL ใหม่" เพื่อให้ GL ตรงกับต้นทุนชุดใหม่ (ดู ต้องกดประมวลผลลงบัญชี (Rebuild GL) ใหม่เมื่อไร มันลบอะไรทิ้งบ้าง) - ใบขาย 44 ตาม GL มาตรฐานไม่ได้ลงต้นทุนขาย (ดู ขายสินค้า (ใบกำกับ 44) แล้วลงบัญชี GL อะไรบ้าง) ต้นทุนขายที่เปลี่ยนจึงเห็นในรายงานสต็อก ไม่ใช่ใน GL ของใบขาย
ดูเพิ่ม
- ต้นทุนสินค้าคิดแบบไหน ถัวเฉลี่ยเคลื่อนที่คำนวณยังไง
- คำนวณยอดสต๊อกใหม่ (Rebuild Stock) ทำอะไรบ้าง ต้องกดเมื่อไหร่
- ยอดในรายงานไม่ตรงกับงบทดลอง (สต็อก ลูกหนี้ เจ้าหนี้) ต้องเช็กอะไรบ้าง
- การคำนวณยอดสต็อกคงเหลือใหม่ (Stock Balance Rebuild)
- บทเรียนบั๊กสต็อกและต้นทุนถัวเฉลี่ย (Stock & Moving Average Cost Bugs)
ที่มาในโค้ด
backend/internal/application/process/trans.go:593rebuildTransDerivedคำนวณสต็อกใหม่ แล้วสร้าง GL ของเอกสารนี้ใหม่backend/internal/application/process/service.go:1007rebuildStockTxคำนวณใหม่ต่อรหัสสินค้าbackend/internal/application/process/service.go:1162ลำดับวันที่ เวลา และcalc_flagที่ใช้ไล่รายการbackend/internal/application/process/service.go:286เริ่มนับใหม่เมื่อจำนวนสะสม ≤0backend/internal/application/process/service.go:1459GL เอกสารสต็อกใช้ผลรวมsum_of_costเมื่อtotal_amount= 0backend/internal/application/process/service.go:1278อัปเดตic_inventory.average_cost