Skip to main content

Booking Business Rules

หน้านี้สกัดจาก BookingService.cs, validators และ sequence diagrams ใน ccr-architect-design/sequence-diagram/booking-flow/*

Lifecycle หลัก

Ruleรายละเอียดจาก code
Edit cutoffแก้ไข booking ได้เมื่อเวลาห่างจาก pickup อย่างน้อย 24 ชั่วโมง (EDIT_CUTOFF_HOURS)
Cancel cutoffยกเลิกได้เมื่อเวลาห่างจาก pickup อย่างน้อย 48 ชั่วโมง และ booking status ต้องเป็น Confirm
Status updateBackoffice เปลี่ยน status ได้เฉพาะจาก Confirm ไป Completed หรือ NoShow
Booking versionการแก้ไข booking สร้าง BookingInfo version ใหม่ ไม่ทับข้อมูลเดิม
Booking historyHistory มาจาก BookingInfo ทุก version โดยเรียง Version ล่าสุดก่อน
Member/GuestCreatedBy มีค่า = Member, ไม่มีค่า = Guest

Create booking

  1. Frontend ส่ง car, branch, pickup/return, drivers, contact, add-ons และ price summary
  2. Booking Service เรียก Catalog quote เพื่อ validate ราคาก่อนบันทึก
  3. ตรวจ rental day ว่า match กับ priceSummary.Days
  4. สร้าง Booking และ BookingInfo version แรก
  5. สร้าง booking number จาก RunningNumberService
  6. ส่ง booking ไป Payment Service ผ่าน gRPC เพื่อสร้าง booking shadow ฝั่ง payment
  7. Queue email ตาม status ที่เกิดขึ้น

Update booking

Scenarioผลลัพธ์
ราคาใหม่มากกว่าราคาเดิมAdditionalAmount ถูกตั้งค่า, booking กลับเป็น Created เพื่อรอชำระเพิ่ม
ราคาใหม่น้อยกว่าราคาเดิมRefundAmount ถูกตั้งค่า, booking เป็น Confirm, สร้าง refund ได้
ราคาเท่าเดิมสร้าง version ใหม่โดยไม่ต้อง additional payment/refund
มี payment method เป็น PromptPay หรือ TrueMoneyต้องใช้ bank book / bank account ใน flow refund

Cancel booking

Ruleรายละเอียด
เงื่อนไขCanCancelBooking ต้องผ่าน: pickup อีกอย่างน้อย 48 ชั่วโมง และ status เป็น Confirm
Cancellation feeถ้าเช่า 1 วัน คิด PricePerDay * 0.5; ถ้าเช่า 2 วันขึ้นไป คิด PricePerDay
Refund amountlatestInfo.TotalPrice - cancellationFee
Refund numberสร้างจาก RunningNumberService.GenerateRefundNumberAsync
Refund allocationไล่ตัดจาก payment transactions ตาม PaidAt เก่าไปใหม่
Bank accountต้องมีถ้า refund ผ่าน bank-transfer-like method (PromptPay, TrueMoney)

Validation rules

ValidatorRule
BookingFilterRequestValidatorPage ต้องมากกว่า 0, PageSize อยู่ในช่วง 1..100, date range ต้องเรียงจากวันเริ่มต้นไปวันสิ้นสุด, CustomerType ต้องเป็น Member หรือ Guest
CancelBookingRequestValidatorReason required และไม่เกิน 500 chars, AdditionalInfo ไม่เกิน 1000 chars
BankingAccountValidatoraccount no/name/bank/image key required และจำกัดความยาว
CustomerBookingValidatorcustomer เปิด booking ได้เฉพาะ booking ที่ CreatedBy == customerId