#systems#market#sales#credit#rebate#rounding
ราคาขั้นบันได คูปอง และการสั่งซื้อ B2B ที่ซิงก์ข้ามระบบ (sys-market-checkout-sync)
โน้ตนี้อธิบายการคิดราคาในตะกร้าของ /market และสิ่งที่เกิดขึ้นเมื่อกดสั่งซื้อ (action_type: "PLACE_B2B_ORDER") ใน market/handler.go
ราคาในตะกร้า (ADD_TO_CART)
- ค่าตั้งต้นเมื่อไม่ส่งมา: SKU ตัวอย่าง จำนวน 10 และร้านค้าช่วงรหัส
AR-0001(handler.go:305-317) - ถ้า SKU ยังไม่อยู่ใน
market_product_catalogจะดึงจากic_inventoryมาเพิ่มในแคตตาล็อก โดยตั้งราคาจากaverage_cost(ต้นทุน 350 เมื่อไม่มีค่า) ตามตารางด้านล่าง ราคาเหล่านี้ปัดเป็นบาทเต็มด้วยmath.Round(:336-391)
| ราคา | สูตรในโค้ด | จำนวนขั้นต่ำ |
|---|---|---|
ปลีก (retail_price) |
ต้นทุน × 1.35 | - |
| Tier 1 | ต้นทุน × 1.22 | 1 |
| Tier 2 | ต้นทุน × 1.14 | 20 |
| Tier 3 | ต้นทุน × 1.07 | 50 |
computeTierPriceเลือก Tier 3 ก่อน แล้วจึง Tier 2 ตามจำนวนขั้นต่ำ ถ้าไม่ถึงทั้งสองใช้ Tier 1 (:805-813)- ยอดบรรทัด =
mulSatang(จำนวน, ราคาที่ใช้)ส่วนลดบรรทัด = (ราคาปลีก − ราคาที่ใช้) × จำนวน (:414-416) - แถวแคตตาล็อกที่ดึงเพิ่มและแถวในตะกร้าบันทึกใน transaction เดียว (
:444)
สรุปยอดตอนสั่งซื้อ (:550-646)
- อ่านทุกแถวใน
market_cart_item(SQL ไม่มีเงื่อนไขร้านค้าช่วง) และอ่านโปรไฟล์ร้านค้าช่วงตามdealer_code - รวมยอด:
gross= Σ ราคาปลีก × จำนวน,subTotal= Σ ยอดบรรทัด, ส่วนลดขั้นบันได = Σ ส่วนลดบรรทัด - ส่วนลดคูปอง:
VIP3000= 3000 เมื่อsubTotal≥ 30000 ไม่เช่นนั้น 1000,YIPUA1500= 1500,DEALER500= 500 (:631-644) - ยอดหลังหักส่วนลด =
subSatangNonNeg(subTotal, คูปอง)แล้วคิด VAT และยอดสุทธิด้วยvatAndNetSatangคือ VAT = ปัด 2 ตำแหน่ง (ยอด × 7/100) (:645-646,:2046-2056)
หน้าจอคิดยอดเดียวกันในเบราว์เซอร์เพื่อแสดงผล โดย VAT = Math.round(afterDisc × 0.07 × 100) / 100 (MarketDashboard.tsx:800-834) ยอดที่บันทึกจริงมาจาก backend
เลขเอกสารที่สร้าง (:648-653)
| เอกสาร | รูปแบบ |
|---|---|
| คำสั่งซื้อ | MKT-SO-<เวลา> |
| เลขอ้างอิง ERP | INV6910-<เวลา> |
| ใบจัดสินค้า WMS | WMS-MKT-<เวลา> |
| เที่ยวรถ TMS | TRIP-6910-02 (ค่าคงที่) |
| e-Tax | ETAX-MKT-<เวลา> |
สิ่งที่บันทึกใน transaction เดียว (:665-794)
marketDealerOpeningSQLล็อกแถวร้านค้าช่วง และบันทึกยอดยกมาครั้งแรก- insert
market_b2b_orderสถานะWMS_PACKING marketDealerBalanceSQLคำนวณวงเงินและ rebate ใหม่- insert
wms_fulfillment_orderสถานะPICKING - insert
tms_delivery_stopสถานะPENDING_LOADโดยpayment_termเก็บเฉพาะรหัสประเภทคำสั่งซื้อ - insert
crm_customer_activityบันทึกว่าปิดการขายแล้ว - insert
etax_document_logเป็นETAX_SALES_INVOICEฐานภาษี = ยอดหลังหักส่วนลด,vat_rate7,etda_status=TIMESTAMP_VERIFIED(เลขผู้เสียภาษีเป็นค่าคงที่ในโค้ด ไม่คัดลอกมาที่นี่)
ถ้าขั้นใดล้มจะคืน error และไม่มีอะไรถูกบันทึก (:786-793) บทเรียนเดิมที่เคยตัดเครดิตทั้งที่ insert ล้มบันทึกไว้ที่ KMS_SECURITY_DATA_INTEGRITY_LESSONS.md:30 และแนวทาง transaction เดียวอยู่ที่ :77 ดู ความถูกต้องของข้อมูล: เงิน ภาษี Transaction เดียว และ Rebuild (Data Integrity, big.Rat, ExecBatch)
วงเงินและ rebate ของร้านค้าช่วง (:1864-1897)
| ค่า | สูตร |
|---|---|
credit_used |
credit_used_opening + Σ net_order_amount |
credit_available |
GREATEST(0, credit_limit − credit_used) |
rebate_accumulated |
rebate_opening + Σ ปัด 2 ตำแหน่ง ((net_order_amount − vat_amount) × 0.01) |
- นับเฉพาะคำสั่งซื้อที่
order_statusไม่ขึ้นต้นด้วยCANCEL(marketDealerOrdersFilter) - คำนวณจากผลรวมใหม่ทุกครั้ง ไม่ใช้
credit_used = credit_used + xเพื่อไม่ให้คำขอที่ส่งซ้ำตัดวงเงินสองครั้ง
ข้อสังเกตจากโค้ด
- ไม่พบการตรวจว่ายอดสั่งซื้อเกิน
credit_availableก่อนรับคำสั่งซื้อ ค่าคงเหลือถูกกดไว้ที่ 0 ด้วยGREATEST - ไม่มีการล้างตะกร้าหลังสั่งซื้อ และตะกร้าเป็นตารางเดียวของทุกร้านค้าช่วง
- ใบจัดสินค้า WMS และจุดส่ง TMS ใช้ SKU และ bin ของบรรทัดแรก พร้อมจำนวนรวมของทุกบรรทัด
- ใน
market/handler.goไม่มีการเขียนic_transหรือgl_journalเลขINV6910-…จึงเป็นเพียงเลขอ้างอิง ยังไม่มีใบกำกับภาษีขายในระบบบัญชี ดู ขายสินค้า/บริการ และใบกำกับภาษีเต็มรูป (Sales Invoice) และ ขายถึงรับเงิน (Order-to-Cash) - แถว e-Tax ที่สร้างถูกนับเป็นภาษีขายในหน้า
/etaxดู สรุปภาษีขาย ภาษีซื้อ หัก ณ ที่จ่าย ในระบบ e-Tax (sys-etax-vat-wht-summary)
ที่มาในโค้ด
backend/internal/adapter/inbound/http/market/handler.go:305-453ADD_TO_CARTและการดึงสินค้าจาก ERPbackend/internal/adapter/inbound/http/market/handler.go:550-646รวมยอดและคูปองbackend/internal/adapter/inbound/http/market/handler.go:648-653เลขเอกสารbackend/internal/adapter/inbound/http/market/handler.go:665-794ชุดคำสั่งใน transaction เดียวbackend/internal/adapter/inbound/http/market/handler.go:805-813computeTierPricebackend/internal/adapter/inbound/http/market/handler.go:1864-1897วงเงินและ rebatebackend/internal/adapter/inbound/http/market/handler.go:1989-2056ตัวช่วยปัดเงิน (roundSatang,mulSatang,addSatang,subSatangNonNeg,vatAndNetSatang)frontend/market/MarketDashboard.tsx:800-834คิดยอดฝั่งหน้าจอ,:950-970ส่งPLACE_B2B_ORDERdocs/kms/KMS_SECURITY_DATA_INTEGRITY_LESSONS.md:30-31,:77บทเรียน B8, B9 และแนวทาง transaction- ดูเพิ่ม: ร้านค้าส่งออนไลน์ B2B (sys-market) · การปัดเศษ ทศนิยม และตัวเลขเงิน (Rounding & Decimal Policy) · ระบบบริหารความสัมพันธ์ลูกค้า (sys-crm) · ระบบใบกำกับภาษีอิเล็กทรอนิกส์ (sys-etax)