หน้านี้สกัดจาก BookingPriceCalculator.cs, BookingValidator.cs, Catalog quote และ unit tests ใน BookingService.Tests/Services/*
Price validation กับ Catalog
ก่อนสร้างหรือแก้ไข booking ระบบตรวจราคาที่ frontend ส่งมาเทียบกับ Catalog quote:
| Field | Validation |
|---|
| Car total | car.TotalPrice ต้องเท่ากับ catalogQuote.Car.TotalPrice หลัง round 2 ตำแหน่ง |
| Add-on price | แต่ละ add-on ที่มี Code ต้องตรงกับ Catalog add-on price |
| OWR price | priceSummary.OwrPrice ต้องตรงกับ catalogQuote.Addon.OneWayRentalPrice |
| Additional price | car/addon/vat/refund/additional amount ต้องตรงกับค่าที่ Booking Service คำนวณเอง |
VAT และ total
| รายการ | สูตร |
|---|
| Car VAT | totalPriceCarIncludeVat - (totalPriceCarIncludeVat / 1.07) |
| Add-on VAT | totalAddonPrice * 0.07 |
| Total VAT | carVat + addonVat |
| Grand total | totalPriceCarIncludeVat + totalAddonPrice + addonVat |
| Rounding | ใช้ Math.Round(..., 2, MidpointRounding.AwayFromZero) |
Add-on pricing
| PriceRateType | วิธีคิด |
|---|
PerCar | ใช้ราคาต่อรถ 1 รายการ |
PerDriverUnder21YearsOld | ราคา x จำนวน driver อายุไม่ถึง 21 ปี |
PerDriverMoreThanOrEqual3 | ถ้า driver ตั้งแต่ 3 คนขึ้นไป คิดเพิ่มเฉพาะคนที่ 3 เป็นต้นไป; ถ้าน้อยกว่า 3 ยังคิด 1 unit ตาม code ปัจจุบัน |
| PriceRateCalculate | วิธีคิด |
|---|
OneTimeRate | คิดครั้งเดียว |
DayRate | คูณจำนวนวันเช่า (daysRental) |
Bundle / tree add-on rule
Add-on เป็น tree ได้ด้วย ParentId
| กรณี | วิธีคิด |
|---|
| Root selected และลูกทุกตัว selected | คิดราคา root อย่างเดียว เพราะ root cover bundle แล้ว |
| Root selected แต่ลูกบางตัวไม่ selected | คิด root + ลูกหลานที่ selected |
| Root ไม่ selected | คิดเฉพาะลูกหลานที่ selected |
Insurance/Extra ที่ IsSpecifyQuantity = true | ไม่คิดราคาใน calculator นี้ |
Mandatory ที่ IsIncludedItem = true | ไม่คิดราคา |
Catalog add-on มี IsMaximumRate | ถ้าคำนวณเกิน MaximumRate ให้ cap ที่ maximum |
Price difference ตอน edit
| Field | สูตร |
|---|
AdditionalCarPrice | (newCarTotal / 1.07) - (oldCarTotal / 1.07) |
AdditionalAddonPrice | new selected addon/fuel total - old selected addon/fuel total |
AdditionalVat | new VAT - old VAT |
priceDifference | oldPrice - newGrandTotal |
priceDifference เป็นค่าบวก | refund |
priceDifference เป็นค่าลบ | additional payment |