ราคาขาย/ส่วนลดที่ขึ้นอัตโนมัติในเอกสาร ดึงมาจากไหน
ตอบสั้น: เมื่อกรอกจำนวนในบรรทัดของเอกสารขาย ระบบหาราคาตามลำดับนี้ ใช้แหล่งแรกที่เจอ: ราคาเฉพาะลูกค้า → ราคาตามกลุ่มลูกค้า → ราคาทั่วไป (ราคาโปรโมชั่น price_mode 1 ก่อนราคามาตรฐาน 0) → สูตรราคาตามระดับราคาของลูกค้า → ราคาที่ผูกกับบาร์โค้ด → ราคาขายครั้งล่าสุดหรือราคาเฉลี่ยที่เคยขายให้ลูกค้ารายนี้ ส่วนลดหาแยก: ส่วนลดเฉพาะลูกค้า → ส่วนลดตามกลุ่ม → ส่วนลดทั่วไป
รายละเอียด
เมื่อไหร่ที่ระบบหาราคา: เอกสาร 30, 34, 36, 44, 46, 48, 76, 144 เมื่อแก้จำนวน (ไม่เท่ากับ 0) และบรรทัดนั้นไม่ได้ดึงมาจากเอกสารอ้างอิง (บรรทัดที่ดึงมาใช้ราคาจากเอกสารต้นทาง) และไม่ใช่ของแถม ส่วนเอกสารตรวจนับ 76 แสดงต้นทุนเฉลี่ยแทนราคาขาย (ดู ตรวจนับสต็อกแล้วปรับยอดยังไง (ตรวจนับ 76 → ปรับปรุงเพิ่ม 66 / ลด 68))
ตารางราคาขาย ic_inventory_price ทุกขั้นกรองด้วยรหัสสินค้า หน่วยนับ ช่วงวันที่ (from_date–to_date) ช่วงจำนวน (from_qty–to_qty) ประเภทการขาย (sale_type 0 = ทุกแบบ หรือตรงกับเงินสด/เชื่อ) และสกุลเงินเมื่อเปิดหลายสกุลเงิน
price_type3 +cust_code= ลูกค้าprice_type2 + กลุ่มลูกค้า (cust_group_1= กลุ่มหลักgroup_mainและcust_group_2= กลุ่มย่อยgroup_sub_1–group_sub_4หรือว่าง ของar_customer_detail)price_type1 +price_mode1price_type1 +price_mode0
- ถ้าเอกสารเป็นภาษีแยกนอก (
vat_type0) ใช้sale_price1แบบอื่นใช้sale_price2
ถ้าไม่เจอในตารางราคา
5. สูตรราคา ic_inventory_price_formula: ใช้ช่องราคาตาม ar_customer.price_level 1–9 ถ้าระดับเป็น 0 ใช้ราคาช่องแรก
6. ราคาบาร์โค้ด ic_inventory_barcode.price (เมื่อบรรทัดมีบาร์โค้ด)
7. ตาม erp_option.get_last_price_type: 1 = ราคาขาย 44 ครั้งล่าสุดให้ลูกค้ารายนี้, 2 = ค่าเฉลี่ยของราคาที่เคยขาย (ถ้าเอกสารเป็นภาษีรวมใน ระบบบวก VAT ให้)
ส่วนลด ic_inventory_discount: discount_type 2 (ลูกค้า) → 1 (กลุ่ม) → 0 (ทั่วไป) ค่าที่เจอเป็นข้อความส่วนลด เช่น 5% แล้วใส่ลงช่องส่วนลดของบรรทัด
ราคาซื้อ (12, 310, 2, 6 เมื่อเปิด get_purchase_price): ic_inventory_purchase_price ของผู้จำหน่าย (price_type 3) → ราคาทั่วไป (price_type 1) → ราคาซื้อ 12/315 ครั้งล่าสุดจากผู้จำหน่ายรายนี้ ถ้าไม่เจอจะใช้ราคาที่พิมพ์ไว้
Price center: ถ้าเปิด erp_option.use_price_center ราคาขายทั้งหมดจะมาจากบริการรายการราคาภายนอกแทนตารางในฐานข้อมูล
ข้อควรระวัง
- ราคาซื้อหาโดยใช้ "วันนี้" ไม่ใช่วันที่เอกสาร (ตาม C# เดิม) ราคาที่ตั้งเป็นช่วงวันที่จึงอาจไม่ตรงกับเอกสารที่ลงวันที่ย้อนหลัง
- ราคาเฉลี่ยแบบ
get_last_price_type2 เป็นค่าเฉลี่ยธรรมดาของราคาต่อหน่วยทุกบรรทัด ไม่ได้ถ่วงน้ำหนักด้วยจำนวน - ราคาสำหรับ POS (
_findPricePOS) ยังไม่ได้พอร์ต (คอมเมนต์ในprice_center.go)
ดูเพิ่ม
- เครื่องมือหาราคาและแก้ราคา (Price engine / price center / modify price)
- ราคา ส่วนลด และของแถม (price / discount word / price_type / is_permium)
- ราคาขายสินค้าตามเงื่อนไข (ic_inventory_price)
- ปรับราคาสินค้า นำเข้าไฟล์ราคาทั้งชุด (ModifyPriceScreen)
- VAT แยกนอก กับ รวมใน คำนวณต่างกันยังไง ส่วนลดท้ายบิลหักก่อนหรือหลังภาษี
ที่มาในโค้ด
backend/internal/application/process/price_engine.go:49priceCondกรองวันที่ จำนวน และประเภทการขายbackend/internal/application/process/price_engine.go:67salePriceStepsลำดับ ลูกค้า → กลุ่ม → ทั่วไปbackend/internal/application/process/price_engine.go:79saleDiscountStepsลำดับส่วนลดbackend/internal/application/process/price_engine.go:103findSalePriceราคา1/ราคา2 สูตร บาร์โค้ด และราคาล่าสุด/เฉลี่ยbackend/internal/application/process/price_engine.go:237findPurchasePriceใช้วันที่วันนี้backend/internal/application/process/trans_grid.go:96salePriceFlags/purchasePriceFlagsbackend/internal/application/process/trans_grid.go:490หาราคาเมื่อแก้จำนวนและไม่มีเอกสารอ้างอิงbackend/internal/application/process/price_center.go:18use_price_centerและ POS ที่ยังไม่พอร์ต