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 update | Backoffice เปลี่ยน status ได้เฉพาะจาก Confirm ไป Completed หรือ NoShow |
| Booking version | การแก้ไข booking สร้าง BookingInfo version ใหม่ ไม่ทับข้อมูลเดิม |
| Booking history | History มาจาก BookingInfo ทุก version โดยเรียง Version ล่าสุดก่อน |
| Member/Guest | CreatedBy มีค่า = Member, ไม่มีค่า = Guest |
Create booking
- Frontend ส่ง car, branch, pickup/return, drivers, contact, add-ons และ price summary
- Booking Service เรียก Catalog quote เพื่อ validate ราคาก่อนบันทึก
- ตรวจ rental day ว่า match กับ
priceSummary.Days - สร้าง
BookingและBookingInfoversion แรก - สร้าง booking number จาก
RunningNumberService - ส่ง booking ไป Payment Service ผ่าน gRPC เพื่อสร้าง booking shadow ฝั่ง payment
- 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 amount | latestInfo.TotalPrice - cancellationFee |
| Refund number | สร้างจาก RunningNumberService.GenerateRefundNumberAsync |
| Refund allocation | ไล่ตัดจาก payment transactions ตาม PaidAt เก่าไปใหม่ |
| Bank account | ต้องมีถ้า refund ผ่าน bank-transfer-like method (PromptPay, TrueMoney) |
Validation rules
| Validator | Rule |
|---|---|
BookingFilterRequestValidator | Page ต้องมากกว่า 0, PageSize อยู่ในช่วง 1..100, date range ต้องเรียงจากวันเริ่มต้นไปวันสิ้นสุด, CustomerType ต้องเป็น Member หรือ Guest |
CancelBookingRequestValidator | Reason required และไม่เกิน 500 chars, AdditionalInfo ไม่เกิน 1000 chars |
BankingAccountValidator | account no/name/bank/image key required และจำกัดความยาว |
CustomerBookingValidator | customer เปิด booking ได้เฉพาะ booking ที่ CreatedBy == customerId |