Huỷ payment & hoàn tiền

Bệnh nhân đã thanh toán dịch vụ nhưng sau đó yêu cầu huỷ hoặc hoàn tiền. Kế toán cần ghi nhận hủy payment, hoàn tiền từ sổ quỹ (cash), và xử lý e-invoice nếu đã phát. CI-07 đảm bảo e-invoice không làm thay đổi payment hay cash — cần điều chỉnh hoá đơn riêng nếu có.

Giao diện payment cancel
Luồng huỷ thanh toán: từ payment detail → xác nhận huỷ → cash void → audit trail

Bối cảnh

BN đã trả tiền mặt hoặc chuyển khoản cho phòng khám ngày hôm trước. Hôm nay, BN gọi điện yêu cầu huỷ dịch vụ đó và xin hoàn lại tiền. Kế toán cần kiểm tra:

  • Payment đó có liên kết e-invoice chưa?
  • Kỳ chốt quỹ của ngày đó đã close chưa?
  • Có charge hoặc công nợ khác liên quan không?

Diễn viên & quyền cần

Vai tròQuyền cầnTác vụ
Kế toán / Lễ tânpayment.manageHuỷ thanh toán, phát hành biên bản hoàn tiền
Quản lý phòng khámcash.managePhê duyệt hoàn tiền lớn, reopen kỳ chốt nếu cần
Kế toáneinvoice.manageNếu e-invoice đã phát, xử lý cancel/adjust hoá đơn

Quy trình từng bước

  1. Mở Patient 360 của BN → tab "Tài chính" → tìm payment cần huỷ (xem ngày, số tiền, phương thức).
  2. Kiểm tra status payment: nếu `CANCELED` rồi, báo BN rằng tiền đã được ghi nhận huỷ. Nếu `COMPLETED`, tiếp tục.
  3. Click "Huỷ thanh toán" (hoặc "Cancel payment") → hệ thống mở dialog xác nhận.
  4. Kiểm tra rào cản (nếu có):
    • Nếu kỳ chốt quỹ đã `CLOSED`: dialog sẽ báo "Kỳ chốt quỹ đã đóng. Vui lòng reopen trước khi huỷ." → bấm "Reopen quỹ ca" để mở lại.
    • Nếu e-invoice đã `ISSUED`: dialog sẽ báo "E-invoice đã phát. Vui lòng xử lý cancel/adjust hoá đơn trước khi huỷ payment." → qua bước xử lý e-invoice (tìm hiểu ở workflow `wf-einvoice-failed`).
  5. Nhập lý do huỷ (bắt buộc): "BN yêu cầu huỷ dịch vụ", "Ghi sai số tiền", "BN chuyển sang phòng khám khác", etc.
  6. Bấm "Xác nhận huỷ" → hệ thống lưu trạng thái `CANCELED`, khôi phục `outstandingAmount` ban đầu, và void cash/bank ledger entry.
  7. Phát hành phiếu hoàn tiền (REFUND): hệ thống tự động sinh, hiển thị khoảng tiền hoàn + BN + lý do. In hoặc gửi Zalo cho BN.
  8. Cập nhật quỹ ca hoặc sổ ngân hàng: nếu payment lúc đầu là tiền mặt, bạn cần trừ tiền từ quỹ ca hiện tại. Nếu là chuyển khoản, BN cần chuyển lại.

Kết quả mong đợi

  • Payment status đổi từ `COMPLETED` → `CANCELED`.
  • Outstanding amount khôi phục (tăng lên như lúc chưa trả).
  • Cash ledger entry từ payment đó được `VOID` — tiền mặt phòng khám giảm.
  • Phiếu hoàn tiền (REFUND) tự động sinh và có mã tra cứu.
  • Patient 360 timeline hiển thị sự kiện "Payment canceled" với lý do.
  • Dashboard/KPI doanh thu giảm (loại bỏ khoản payment hủy đó khỏi doanh số).
  • Doctor earnings KHÔNG bị thay đổi — chỉ cash & outstanding thay đổi (CI-07).

Khi nào hỏng & cách xử lý

Tình huốngDấu hiệuGiải pháp
Kỳ chốt đã đóngDialog báo "Closed cash period"Click "Reopen quỹ ca" → confirm → thử huỷ lại. Sau đó reopen kỳ chốt sau để balance đúng.
E-invoice đã phátDialog báo "Invoice ISSUED"Vào e-invoice detail → bấm "Huỷ hoá đơn" hoặc "Điều chỉnh" (tuỳ provider). Sau đó huỷ payment.
Nút "Huỷ" bị disableButton grey out, không click đượcKiểm tra quyền `payment.manage`. Hoặc payment đã `CANCELED` rồi, không cần huỷ lại.
Dialog báo "Outstanding > 0 còn lại"Có charge khác chưa trảBình thường — hệ thống khôi phục outstanding của tất cả charge liên quan. Xem Patient 360 để kiểm tra.
Phiếu hoàn tiền không sinhHuỷ thành công nhưng không thấy phiếuRefresh trang. Hoặc vào Payment detail lại → "Phiếu hoàn tiền" tab để xem lịch sử.

Dấu vết để lại (audit & branch ownership)

Khi huỷ payment, DentIQ ghi lại:

  • PaymentAuditLog: người huỷ, thời gian, lý do, trước/sau amount, outstanding cũ/mới.
  • CashLedger.status = VOID: nếu payment là tiền mặt, entry này được void, cash balance giảm.
  • DocumentAuditLog: phiếu hoàn tiền (REFUND) được phát — có mã tra cứu, quyền `document.print` cần thiết.
  • Branch ownership (CI-01): payment branch lấy từ visit/charge gốc, không phải active branch trên header. Nếu lễ tân của chi nhánh A huỷ payment của chi nhánh B (cross-branch), hệ thống vẫn ghi nhân branch B làm chủ sở hữu.
  • Realtime event: phát `PAYMENT_CHANGED` event → client refresh Patient 360, payment list, dashboard doanh thu.
Quan trọng (CI-07)

E-invoice và payment là hai hệ thống độc lập. Huỷ payment KHÔNG huỷ e-invoice tự động. Nếu e-invoice đã `ISSUED`, bạn phải xử lý cancel/adjust hoá đơn riêng (liên hệ provider VNPT/MISA). Sau đó mới huỷ payment. Lý do: tài liệu pháp lý (e-invoice) không thể thay đổi vì dịch vụ — phải lập hoá đơn điều chỉnh.

Lưu ý: Hoàn tiền thực tế

Khi huỷ payment, hệ thống ghi nhận `outstanding` tăng lên (BN nợ lại). Nhưng tiền mặt (cash) hoặc ngân hàng của phòng khám cần trả lại BN. Nếu ban đầu BN trả tiền mặt: bạn phải lấy tiền từ quỹ ca hôm nay để hoàn. Nếu là chuyển khoản: BN cần chuyển lại, hoặc bạn chuyển từ TK phòng khám về TK BN.

Khác biệt: Huỷ trước/sau e-invoice

Trước khi phát e-invoice: Huỷ payment → void cash → phát phiếu hoàn tiền. Đơn giản, không liên lạc provider.

Sau khi phát e-invoice (ISSUED): Huỷ payment → provider (VNPT/MISA) phải được thông báo → provider xác nhận hoặc lập hoá đơn điều chỉnh. Phòng khám gửi hoá đơn điều chỉnh cho BN cùng phiếu hoàn tiền. Quá trình này thường mất 1-2 ngày vì phụ thuộc vào provider.