Refund Flow (กระบวนการและสถานะการคืนเงิน)
หน้านี้อธิบายขั้นตอนและสถานะการทำงานของการคืนเงิน (Refund) ในระบบพัฒนาหลัก ซึ่งจัดการภายใต้ ccr-booking-service สำหรับธุรกรรมการเงินที่ต้องการคืนให้แก่ลูกค้าหลังจากเกิดการยกเลิกการจอง (Cancellation) หรือการแก้ไขการจองที่มีส่วนต่างราคาส่วนลด (Booking Modification)
1. วงจรสถานะการคืนเงิน (Refund State Machine)
กระบวนการอนุมัติการคืนเงินมีขั้นตอนทั้งหมด 5 สถานะหลัก และ 1 สถานะปฏิเสธ (Rejected) โดยต้องผ่านการตรวจสอบจากเจ้าหน้าที่ในแผนกต่างๆ ของ Backoffice ระบบ
📸 ไดอะแกรมสถานะการคืนเงิน (Refund State Transitions)
2. รายละเอียดขั้นตอนการดำเนินงานคืนเงิน (Action Steps)
ขั้นที่ 1: การสร้างรายการคืนเงิน (Refund Creation)
รายการคืนเงินจะถูกสร้างโดยอัตโนมัติจากฝั่งระบบเมื่อเกิดเหตุการณ์:
- ลูกค้าหรือแอดมินยกเลิกการจอง (Booking Cancelled) และมียอดคงเหลือที่ต้องคืนหลังหักค่าธรรมเนียม
- การแก้ไขข้อมูลการจอง (Booking Edited) แล้วค่าเช่าใหม่ถูกกว่าค่าเช่าเดิม
- สถานะเริ่มต้น:
PendingSaleCheck - ข้อมูลที่เก็บบันทึก: ข้อมูลการจอง (
BookingId), รายละเอียดลูกค้า (CustomerId), จำนวนเงินที่ต้องคืน (RefundAmount), และหลักฐานรูปภาพสมุดบัญชีธนาคาร (BankBookImageKeyที่อัปโหลดไปยัง Azure Blob Storage)
ขั้นที่ 2: ฝ่ายขายตรวจสอบเอกสาร (Sale Check)
- ผู้ดำเนินการ: เจ้าหน้าที่ฝ่ายขาย (Sales Staff)
- สิทธิ์ที่ต้องการ:
operation:refund:update-sale-checked - พฤติกรรม: เจ้าหน้าที่เข้ามาตรวจสอบว่า ข้อมูลบัญชีธนาคาร ชื่อผู้รับเงิน และยอดเงินคำนวณถูกต้องหรือไม่ หากถูกต้องจะทำการกดตรวจเช็คเพื่อส่งต่อ
- ผลลัพธ์: สถานะเปลี่ยนเป็น
PendingSaleApprovalระบบส่งอีเมลแจ้งเตือนหัวหน้าฝ่ายขาย (Sale Manager)
ขั้นที่ 3: หัวหน้าฝ่ายขายอนุมัติ (Sale Approve)
- ผู้ดำเนินการ: หัวหน้าฝ่ายขาย (Sale Manager / Supervisor)
- สิทธิ์ที่ต้องการ:
operation:refund:update-sale-approved - พฤติกรรม: ตรวจสอบและอนุมัติความถูกต้องในภาพรวมของยอดขายและนโยบาย
- ผลลัพธ์: สถานะเปลี่ยนเป็น
PendingAccountingApprovalระบบส่งอีเมลแจ้งเตือนไปยังแผนกบัญชี (Accounting Team)
ขั้นที่ 4: ฝ่ายบัญชีตรวจสอบและอนุมัติ (Accounting Approve)
- ผู้ดำเนินการ: เจ้าหน้าที่ฝ่ายบัญชี (Accounting Staff)
- สิทธิ์ที่ต้องการ:
operation:refund:update-accounting-approved - พฤติกรรม: ตรวจสอบความถูกต้องทางเอกสารบัญชีและการชำระเงินของยอดจองเดิม
- ผลลัพธ์: สถานะเปลี่ยนเป็น
Approvedระบบส่งอีเมลแจ้งเตือนแผนกการเงิน (Finance Team) เพื่อทำการโอนเงินเข้าบัญชีลูกค้าตามรายละเอียดที่แนบมา
ขั้นที่ 5: การบันทึกผลสำเร็จการโอนเงิน (Mark as Refunded)
- ผู้ดำเนินการ: เจ้าหน้าที่การเงิน (Finance / Accountant)
- สิทธิ์ที่ต้องการ:
operation:refund:update-refunded - พฤติกรรม: หลังจากโอนเงินผ่านระบบธนาคารสำเร็จ เจ้าหน้าที่จะกรอกข้อมูล วันที่โอนเงิน เลขที่อ้างอิงธุรกรรม (
TransactionRef) และอัปโหลดสลิปหลักฐานโอนเงิน - ผลลัพธ์: สถานะเปลี่ยนเป็น
Refunded(เสร็จสมบูรณ์) และส่งอีเมลยืนยันการคืนเงินสำเร็จพร้อมแนบสลิปให้กับลูกค้าผ่าน SendGrid
การปฏิเสธคำขอคืนเงิน (Reject Refund)
- เจ้าหน้าที่ที่รับผิดชอบในขั้นตอนอนุมัติใดๆ สามารถกด "Reject" ได้หากพบว่า ข้อมูลไม่ถูกต้อง หรือไม่มีสิทธิ์ได้รับเงินคืน
- ผลลัพธ์: สถานะเปลี่ยนเป็น
Rejectedระบบจะส่งอีเมลแจ้งเหตุผลของการปฏิเสธให้กับลูกค้าทันที
3. สิทธิ์การใช้งานและการจัดการหลังบ้าน (Backoffice Permissions)
ตารางสรุปสิทธิ์สำหรับนักพัฒนาและผู้ดูแลสิทธิ์ในการจัดสรรสิทธิ์ผู้ใช้ (RBAC) เพื่อเข้าใช้งานเมนูและเรียกใช้งาน API:
| สิทธิ์การใช้งาน (Permission) | คำอธิบายความหมายการใช้งาน | API Endpoint ที่เรียกใช้ |
|---|---|---|
operation:refund:read | สิทธิ์ในการดูรายการประวัติและค้นหารายการ Refund ทั้งหมด | GET /refunds |
operation:refund:detail | สิทธิ์เปิดดูรายละเอียดเอกสารและประวัติผู้ตรวจเช็คย้อนหลัง | GET /refunds/{refundId} |
operation:refund:update-sale-checked | ตรวจสอบเอกสารความถูกต้องโดยฝ่ายขายเพื่อเตรียมขออนุมัติ | PATCH /refunds/{refundId}/sale-check |
operation:refund:update-sale-approved | อนุมัติการคืนเงินเบื้องต้นโดยหัวหน้าฝ่ายขาย | PATCH /refunds/{refundId}/sale-approve |
operation:refund:update-accounting-approved | อนุมัติผ่านรายการเอกสารโดยฝ่ายบัญชี | PATCH /refunds/{refundId}/accounting-approve |
operation:refund:update-refunded | ระบุหลักฐานและบันทึกว่าเงินโอนคืนให้ลูกค้าสำเร็จแล้ว | PATCH /refunds/{refundId}/refunded |
operation:refund:reject | ปฏิเสธรายการคืนเงินในทุกระดับชั้นการตรวจสอบ | PATCH /refunds/{refundId}/reject |
4. โครงสร้างข้อมูลตารางที่เกี่ยวข้อง (Database Schema Snapshots)
ตารางฐานข้อมูลที่บันทึกข้อมูลและประวัติกระบวนการคืนเงิน:
Refunds: ตารางหลักเก็บยอดเงินคืน (RefundAmount), สถานะปัจจุบัน, และข้อมูลผู้จัดการRefundInfos: เก็บข้อมูลผู้จอง ข้อมูลธนาคารปลายทาง (BankName,BankAccountNumber,BankAccountName) และBankBookImageKeyRefundAllocations: ใช้สำหรับระบุการจัดสรรเงินคืนจากยอดชำระรายการใด (กรณีที่การจองเดิมมีการจ่ายเงินหลายรอบหรือแยกช่องทางจ่ายเงิน)RefundTransactions: บันทึกข้อมูลการทำธุรกรรมจริงของการคืนเงินสำเร็จ (วันที่ทำรายการ, หมายเลขการโอนเงิน)