ต้นทุนแฝง เฉลี่ยค่าใช้จ่ายเข้าสินค้า (Hidden Cost, เมนู 2.22)
เมนูนี้นำ "เอกสารค่าใช้จ่าย" (flag 87, 260) และ/หรือค่าใช้จ่ายนำเข้าที่กรอกตรง (Freight, Insurance, Import Duty, Customs Clearance — parseLandedBreakdown :172, ดู ค่าขนส่ง ค่าอากรขาเข้า (ต้นทุนแฝง / Landed Cost) เข้าต้นทุนสินค้ายังไง) ไปเฉลี่ยเข้า "รายการสินค้า" ของเอกสารซื้อ (flag 12, 310, 60) ตามมูลค่า จำนวน น้ำหนัก/หน่วยขนาน หรือเท่ากันทุกบรรทัด แล้วบันทึกเอกสารต้นทุนแฝง (ic_hidden_cost_process*) พร้อมใบปรับปรุงมูลค่าอย่างเดียว (ic_trans flag 66) เพื่อให้การคำนวณสต็อกบวกส่วนเฉลี่ยเข้าต้นทุนสินค้า พอร์ตจาก C# BCERPIC/_icHiddenCost (คอมเมนต์ hidden_cost.go:15-21)
ทำงานอย่างไร
3 action (route POST /process/stocktools/{action} และ /api/v1/process/stocktools/{action})
| action | สิทธิ์ | หน้าที่ |
|---|---|---|
hiddencostcalc |
read | ปุ่ม "ประมวลผล" แสดงผลเฉลี่ยล่วงหน้า ไม่เขียนข้อมูล (HiddenCostCalc :372) |
hiddencostsave |
write | คำนวณใหม่แล้วบันทึกเอกสาร + ใบปรับปรุง ใน transaction เดียว (HiddenCostSave :443) |
hiddencostdelete |
del | ลบเอกสารต้นทุนแฝงและใบปรับปรุงของมัน (HiddenCostDelete :591) |
สิทธิ์อยู่ใน permission.go:35,43,47 ดู การตรวจสิทธิ์เมนูของ route process (Process route rights)
Input (HiddenCostInput, hidden_cost.go:40-64)
docNo (ว่าง = เลขถัดไป prefix AFC), oldDocNo (เมื่อแก้ไข), docDate, docTime (ว่างใช้ 08:00, ยาวเกิน 5 ตัวอักษรไม่ผ่าน), docFormatCode, branchCode, remark (<= 255 ตัวอักษร), docNoAdjust (ว่าง = เลขถัดไป prefix IA), docFormatCodeAdjust, calFrom (0 = มูลค่าสุทธิ, 1 = มูลค่าก่อนภาษี), calFollow (0 = มูลค่าสินค้า, 1 = จำนวน, 2 = น้ำหนักจริง/หน่วยขนาน qty_2, 3 = เท่ากันทุกรายการ), ข้อมูลนำเข้า customsEntryNo, vesselContainerNo, incoterms, currencyCode, exchangeRate (:57), ค่านำเข้าตรง transportValue (:58), insuranceAmount, importDutyAmount, clearancePortAmount (สตริงทศนิยม), expenses[] และ purchases[] (แต่ละรายการ {refType, docNo})
ลูกค้าส่งแค่ "เลือกเอกสารไหน" กับค่านำเข้าที่กรอกตรง ตัวเลขของเอกสารทุกตัวอ่านจาก ic_trans / ic_trans_detail ฝั่งเซิร์ฟเวอร์ (คอมเมนต์ :188-189)
ประเภทเอกสาร (hidden_cost.go:31-32)
- ค่าใช้จ่าย:
87-> doc_ref_type 0 (ตั้งหนี้อื่น ๆ เจ้าหนี้),260-> 1 (ค่าใช้จ่ายอื่น ๆ) ตามคอมเมนต์ท้ายบรรทัด - เอกสารซื้อ:
12-> 0 (ซื้อสินค้า),310-> 1 (รับสินค้า),60-> 2 (รับสินค้าสำเร็จรูป) refTypeนอกตาราง = error "ประเภท... ไม่ถูกต้อง"; ซ้ำ = "เอกสารซ้ำ"; เกินhiddenCostRefCap= 200 ใบต่อฝั่ง = error (cleanHiddenCostRefs:149)
ลำดับคำนวณ (hiddenCostCalc :190)
calFromต้องเป็น 0/1 และcalFollow0-3 (:192); ค่านำเข้าตรงช่องใดติดลบไม่ผ่าน (:177-178) ผลรวม 4 ช่อง =directLandedแบบไม่ปัด (:180-184)- ต้องมีเอกสารซื้ออย่างน้อย 1 ใบ และมีเอกสารค่าใช้จ่ายอย่างน้อย 1 ใบ หรือ
directLanded> 0 (:207) — ข้อความ error ยังเขียนว่า "อย่างละ 1 ใบ" (:208); ไม่เลือกเอกสารค่าใช้จ่ายexpensesเป็นอาร์เรย์ว่าง (:215) hiddenCostRefRows(:295) อ่านหัวเอกสารจากic_transเฉพาะlast_status = 0; ไม่พบหรือถูกยกเลิก = error "ไม่พบเอกสาร ... หรือเอกสารถูกยกเลิกแล้ว" ยอดก่อน VAT ใช้total_before_vatแต่ถ้าvat_type > 1(ยกเว้น VAT) ใช้total_amountตาม C# (คอมเมนต์ :300 ระบุ vat_type 2; โค้ดเช็กvat_type > 1ที่ :303)hiddenCostItems(:334) อ่านบรรทัดสินค้าของเอกสารซื้อ (รวมqty_2:343) เรียงตามลำดับ C#: flag 12 ก่อน 310 แล้ว 60 จากนั้นdoc_no,line_number,roworder; ข้ามบรรทัดที่ไม่มีitem_code;stand_value/divide_valueที่เป็น 0 ถือเป็น 1;ItemAmount = qty x priceแบบไม่ปัด (exactDecimal:362)- ยอด 2 ตัว (:226-235):
total=directLanded+ ผลรวมamount(มูลค่าสุทธิเสมอ) ->totalAmount;spreadTotal=directLanded+ ผลรวมamountหรือamountBeforeVatตามcalFrom->hiddenCostAmount(ยอดที่ปันส่วนจริง) ทั้งสองตัวส่งออกแบบไม่ปัด (exactDecimal:280-281,stock_rebuild.go:213) - น้ำหนักต่อบรรทัดตาม
calFollow(:238-256): 0 =ItemAmount, 1 =Qty, 2 =Qty2ถ้า > 0 ไม่งั้นใช้Qty(เลือกทีละบรรทัด), 3 = 1 ทุกบรรทัด allocateHiddenCost(spreadTotal, ...)(:257, ฟังก์ชัน :125): ส่วนแบ่ง =spreadTotalx น้ำหนัก / ผลรวมน้ำหนัก ปัด HALF_UP ที่ scale 2 (hiddenCostScale:26,RoundHalfUpservice.go:149ปัดครึ่งออกจากศูนย์); ผลรวมน้ำหนักเป็น 0 ทุกส่วนเป็น 0; เศษปัดที่เหลือ (spreadTotal- ผลรวมส่วนแบ่ง) บวกให้บรรทัดแรกที่น้ำหนัก > 0 และมากกว่าทุกบรรทัดก่อนหน้า (ไม่มีน้ำหนัก > 0 เลย = บรรทัดที่ 0) ผลรวมส่วนแบ่งจึงเท่าspreadTotalเป๊ะ (คอมเมนต์ :122-124)- ต่อบรรทัด (:259-275):
adjustAmount= ส่วนแบ่ง (2 ตำแหน่ง, :260);ratio= เปอร์เซ็นต์ น้ำหนัก x 100 / ผลรวมน้ำหนัก ปัด HALF_UP 2 ตำแหน่ง (ผลรวม <= 0 = 0, :261-265);sumTotalAmount=ItemAmount+ ส่วนแบ่ง ปัด HALF_UP 2 ตำแหน่ง (:266-268);averageCost= (ItemAmount+ ส่วนแบ่ง) /Qtyปัด HALF_UP 4 ตำแหน่ง (Qty<= 0 = 0) โดยหารจากยอดก่อนปัด (:269-274) - ข้อมูลนำเข้า (:276-291):
exchangeRateว่างหรือ <= 0 = 1 (:276-279) แล้วส่งกลับ/บันทึกเฉย ๆ (:287) ไม่นำไปคูณยอดใด (currencyCodeก็เช่นกัน);incotermsว่าง =CIF,currencyCodeว่าง =THB(แปลงเป็นตัวพิมพ์ใหญ่); ค่านำเข้า 4 ช่องและdirectLandedTotalส่งกลับแบบปัด HALF_UP 2 ตำแหน่ง แต่spreadTotalใช้ค่าก่อนปัด - ผลลัพธ์
HiddenCostResult(:97-115):docNo,docNoAdjust,totalAmount,hiddenCostAmount,directLandedTotal, ข้อมูลนำเข้า (รวมexchangeRate,transportValue),expenses,purchases,items[](qty2,adjustAmount,ratio,sumTotalAmount,averageCost—HiddenCostItem:75-95)
บันทึก (HiddenCostSave :443)
ตรวจวันที่/เวลา/หมายเหตุ และหาสาขาของผู้ใช้ก่อน (:445-459) แล้วทำใน inTransTx (transaction เดียว, :461):
ensureHiddenCostImportCols(:462, ฟังก์ชัน :416-439) รันALTER TABLE ... ADD COLUMN IF NOT EXISTSเพิ่มคอลัมน์นำเข้า/ผลปันส่วน (หัว 10 คอลัมน์ :419-428, item 7 คอลัมน์ :430-436 ชื่อตามมาตรฐาน เช่นexchange_rate,weight,ratio,average_cost) ทุกครั้งที่บันทึก ภายใน transaction ของการบันทึกเอง ดู ต้นทุนแฝง/ต้นทุนนำเข้า (ic_hidden_cost_process, _ref, _item)- ได้เลขเอกสารจาก
nextDocNo(... "ic_hidden_cost_process", -1, ..., "AFC")ถ้าdocNoว่าง (:467); ยาวเกิน 25 ตัวอักษรไม่ผ่าน (:472) lockHiddenCost(:475, ฟังก์ชัน :380) ล็อก advisoryhashtext('hiddencost:'+doc_no)ตามลำดับเรียง (ป้องกัน deadlock เมื่อแก้ไขแล้วเปลี่ยนเลข)- ถ้า
oldDocNo != docNoตรวจเลขซ้ำในic_hidden_cost_process(:479) - ถ้าเป็นการแก้ไข (
oldDocNoไม่ว่าง)dropHiddenCostTx(:484, ฟังก์ชัน :394) ลบใบปรับปรุงเดิม (ic_transflag 66 ที่doc_ref = doc_no) ผ่านdeleteTransTx(สต็อกและ GL ถูก rebuild) แล้วลบic_hidden_cost_process_item/_ref/และตารางหัว - เลขใบปรับปรุงจาก
nextDocNo(... "ic_trans", adjustUpFlag, ..., "IA")ถ้าไม่ระบุ (:489;adjustUpFlag= 66 ที่stock_lot.go:29) - คำนวณใหม่ด้วย
hiddenCostCalcใน transaction เดียวกัน (:493) แล้วinsertHiddenCostRows(:499, ฟังก์ชัน :533) เขียน 3 ตาราง:ic_hidden_cost_process(หัว + ข้อมูลนำเข้า, :534-546),ic_hidden_cost_process_ref(เอกสารอ้างอิง; ฝั่งเอกสารซื้อamount_before_vat= 0 ตาม C#, :552-553),ic_hidden_cost_process_item(บรรทัด,line_numberเริ่ม 0, :577-586) โดยบางค่าของ item เขียนซ้ำลง 2 คอลัมน์ (weight/qty_2,item_amount/sum_amount,adjust_amount/hidden_cost_amount:579-581) ดูที่ ต้นทุนแฝง/ต้นทุนนำเข้า (ic_hidden_cost_process, _ref, _item) - สร้างใบปรับปรุง
SaveTransInput(:502-507:TransType 3,TransFlag 66,DocRef= เลขเอกสารต้นทุนแฝง) ที่แต่ละบรรทัดมีQty "0",Price "0",SumAmount = adjustAmount(บรรทัดมูลค่าอย่างเดียว) บันทึกผ่านbuildTransArgs+saveTransTx(:509, :514) แล้วตั้งis_lock_record = 1(:518) และbranch_codeของบรรทัดตามสาขาหัวเอกสาร (:521, ตาม C#) - เขียน log ผ่าน
writeProcessLogข้อความ "ประมวลผลเฉลี่ยต้นทุนแฝง" (:524) ดู กลุ่ม route workflow เมนูกระบวนการระบบ (Workflow Menus)
บันทึกซ้ำด้วยข้อมูลเดิมได้แถวเท่าเดิม เพราะการแก้ไขลบคู่เอกสารเก่าก่อนเสมอ (คอมเมนต์ :441-442)
ลบ (HiddenCostDelete :591)
ล็อกเลข (:597) -> ตรวจว่ามีใน ic_hidden_cost_process (:601; ไม่มี = error "ไม่พบเอกสารต้นทุนแฝง" :605) -> dropHiddenCostTx (:607) -> log "ลบเอกสารต้นทุนแฝง" (:610) คืน TransResult{DocNo}
ที่มาในโค้ด
backend/internal/application/process/hidden_cost.go:23-33- ค่าคงที่hiddenCostRefCap,hiddenCostScaleและตาราง flag ค่าใช้จ่าย/เอกสารซื้อbackend/internal/application/process/hidden_cost.go:40-64-HiddenCostInput;:97-115HiddenCostResultbackend/internal/application/process/hidden_cost.go:125-allocateHiddenCost(C#_recal+_rebalance)backend/internal/application/process/hidden_cost.go:149-cleanHiddenCostRefs;:172parseLandedBreakdownbackend/internal/application/process/hidden_cost.go:190-hiddenCostCalc;:295hiddenCostRefRows;:334hiddenCostItemsbackend/internal/application/process/hidden_cost.go:380-414-lockHiddenCost,dropHiddenCostTxbackend/internal/application/process/hidden_cost.go:416-439-ensureHiddenCostImportColsbackend/internal/application/process/hidden_cost.go:443-531-HiddenCostSavebackend/internal/application/process/hidden_cost.go:533-588-insertHiddenCostRowsbackend/internal/application/process/hidden_cost.go:591-612-HiddenCostDeletebackend/internal/application/process/service.go:149-RoundHalfUp;:177FormatRat(ปัด HALF_UP ก่อนจัดรูป)backend/internal/application/process/stock_lot.go:29-adjustUpFlag = 66backend/internal/adapter/inbound/http/process/stocktools_handler.go:120-131- 3 action ของเมนูนี้ (body จำกัด 4 MiB,smallที่:90)backend/internal/adapter/inbound/http/process/permission.go:35,43,47- สิทธิ์ read/write/del
ดูเพิ่ม
- เครื่องมือสต็อก กลุ่ม route stocktools (Stock Tools)
- กลุ่ม route workflow เมนูกระบวนการระบบ (Workflow Menus)
- สถานะต่อเนื่องของเอกสาร กราฟโยงเอกสาร และเลขที่เอกสารถัดไป (Doc flow & numbering)
- การตรวจสิทธิ์เมนูของ route process (Process route rights)
- ตัวกระจายคำขอของ process (Process dispatcher)
- ภาพรวมกลุ่ม process ของ Backend (Process overview)