Skip to main content

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) และ BankBookImageKey
  • RefundAllocations: ใช้สำหรับระบุการจัดสรรเงินคืนจากยอดชำระรายการใด (กรณีที่การจองเดิมมีการจ่ายเงินหลายรอบหรือแยกช่องทางจ่ายเงิน)
  • RefundTransactions: บันทึกข้อมูลการทำธุรกรรมจริงของการคืนเงินสำเร็จ (วันที่ทำรายการ, หมายเลขการโอนเงิน)