3.8 KiB
3.8 KiB
Setrip — Admin Payment Operations Roadmap (ARCHIVED — DELIVERED 2026-05-18)
Admin perlu visibilitas + kontrol penuh atas alur uang: payment Midtrans, refund, payout. Saat webhook gagal atau status mismatch, admin harus bisa reconcile tanpa edit DB.
Skenario nyata: webhook Midtrans drop di production.
Booking.status = AWAITING_PAYpadahal user sudah bayar (confirm email dari Midtrans). User komplain via WhatsApp. Saat ini admin harus query DB manual lalu update via Prisma Studio.
Status delivery
| Phase | Status | Catatan |
|---|---|---|
| Phase 1 — Booking + Payment Detail View | ✅ Delivered | Timeline lintas Payment + Refund + Payout dengan raw callback viewer. |
| Phase 2 — Admin Midtrans Reconcile UI | ✅ Delivered | Tombol reconcile per Payment Midtrans, panggil Core API + apply state-machine. Bulk reconcile deferred. |
| Phase 3 — Dispute & Chargeback Tracking | ⏳ Deferred | Enum DISPUTE_RESOLVED sudah ada — admin bisa pakai existing flow refund. UI filter khusus bisa ditambah nanti. |
Phase 1 — Booking + Payment Detail View ✅
| # | Item | Status | File |
|---|---|---|---|
| 1.1 | bookingRepo.findByIdForAdmin(id) — include payments (with raw), refunds, payout, trip, user |
✅ | server/repositories/booking.repo.ts |
| 1.2 | Page /admin/bookings/[id] — header booking + timeline events |
✅ | app/admin/bookings/[id]/page.tsx |
| 1.3 | Inline timeline (Payment + Refund + Payout) sorted by createdAt — implemented inline di page | ✅ | app/admin/bookings/[id]/page.tsx |
| 1.4 | Component RawCallbackViewer — collapsible JSON pretty-printed |
✅ | features/booking/components/raw-callback-viewer.tsx |
| 1.5 | Link "Lihat timeline" dari /admin/refunds ke /admin/bookings/[id] |
✅ | features/refund/components/refund-review-card.tsx |
| 1.6 | Link "Lihat timeline" dari /admin/payouts ke /admin/bookings/[id] |
✅ | features/payout/components/payout-review-card.tsx |
Phase 2 — Admin Midtrans Reconciliation UI ✅
| # | Item | Status | File |
|---|---|---|---|
| 2.1 | paymentService.adminReconcile(orderId) — variant tanpa ownership check, reuse applyGatewayStatus helper |
✅ | server/services/payment.service.ts |
| 2.2 | Server action adminReconcileMidtransAction(orderId) (guard isAdmin) |
✅ | features/booking/actions.ts |
| 2.3 | Component AdminReconcileButton per Payment Midtrans di timeline |
✅ | features/booking/components/admin-reconcile-button.tsx |
| 2.4 | Tampilkan Payment.rejectionReason (amount mismatch log) di card payment |
✅ | app/admin/bookings/[id]/page.tsx |
| 2.5 | Bulk reconcile: /admin/payments/stale — list Payment AWAITING > 6 jam |
⏳ | Deferred — admin bisa filter manual via list saat itu butuh, tidak ada incident concrete yang minta bulk. |
Tindakan manual yang masih perlu dilakukan ops:
- Brief admin: kapan pakai tombol "Reconcile Midtrans" — saat peserta lapor "sudah bayar tapi status belum update".
- Tombol idempotent — aman ditekan berkali-kali. Tidak menggandakan payment.
- Pakai
RawCallbackVieweruntuk inspeksi error gateway / metadata transaksi saat investigasi dispute.
Phase 3 — Dispute & Chargeback Tracking ⏳ (deferred)
Lihat versi awal di ADMIN_ROADMAP.md. Akan diangkat kembali kalau volume chargeback membesar.