From 958514d575552fb55bac3e83de9b0a9ee5d620d9 Mon Sep 17 00:00:00 2001 From: arifal Date: Tue, 12 May 2026 00:05:30 +0700 Subject: [PATCH] create public layout and admin and fix escrow and refund --- TERMS.md | 23 +- app/{ => (public)}/accept-terms/form.tsx | 0 app/{ => (public)}/accept-terms/page.tsx | 0 app/{ => (public)}/create-trip/layout.tsx | 0 app/{ => (public)}/create-trip/page.tsx | 0 app/(public)/layout.tsx | 25 ++ app/{ => (public)}/login/layout.tsx | 0 app/{ => (public)}/login/page.tsx | 10 +- app/{ => (public)}/page.tsx | 0 app/{ => (public)}/people/page.tsx | 0 app/{ => (public)}/privacy/layout.tsx | 0 app/{ => (public)}/privacy/page.tsx | 0 app/{ => (public)}/profile/page.tsx | 8 +- app/{ => (public)}/register/layout.tsx | 0 app/{ => (public)}/register/page.tsx | 0 app/{ => (public)}/terms/layout.tsx | 0 app/{ => (public)}/terms/page.tsx | 0 .../trips/[id]/opengraph-image.tsx | 0 app/{ => (public)}/trips/[id]/page.tsx | 0 .../trips/[id]/payment/page.tsx | 0 app/{ => (public)}/trips/page.tsx | 0 app/{ => (public)}/u/[id]/page.tsx | 0 app/{ => (public)}/verify/layout.tsx | 0 app/{ => (public)}/verify/page.tsx | 0 app/admin/layout.tsx | 59 +++ app/admin/page.tsx | 371 ++++++++++++++++++ app/admin/payouts/layout.tsx | 17 + app/admin/payouts/page.tsx | 110 ++++++ app/api/cron/auto-complete-trips/route.ts | 8 +- app/layout.tsx | 8 +- components/admin/admin-sidebar.tsx | 162 ++++++++ components/shared/footer.tsx | 82 ++++ features/payout/actions.ts | 43 ++ .../payout/components/earnings-section.tsx | 161 ++++++++ .../payout/components/payout-review-card.tsx | 271 +++++++++++++ features/payout/schemas.ts | 16 + lib/auth.ts | 2 + .../20260511_add_payout_model/migration.sql | 47 +++ prisma/schema.prisma | 75 ++++ server/repositories/organizer.repo.ts | 19 + server/repositories/payout.repo.ts | 122 ++++++ server/repositories/refund.repo.ts | 30 ++ server/services/booking.service.ts | 4 + server/services/payment.service.ts | 5 + server/services/payout.service.ts | 248 ++++++++++++ server/services/refund.service.ts | 7 + server/services/trip.service.ts | 12 + types/next-auth.d.ts | 1 + 48 files changed, 1928 insertions(+), 18 deletions(-) rename app/{ => (public)}/accept-terms/form.tsx (100%) rename app/{ => (public)}/accept-terms/page.tsx (100%) rename app/{ => (public)}/create-trip/layout.tsx (100%) rename app/{ => (public)}/create-trip/page.tsx (100%) create mode 100644 app/(public)/layout.tsx rename app/{ => (public)}/login/layout.tsx (100%) rename app/{ => (public)}/login/page.tsx (93%) rename app/{ => (public)}/page.tsx (100%) rename app/{ => (public)}/people/page.tsx (100%) rename app/{ => (public)}/privacy/layout.tsx (100%) rename app/{ => (public)}/privacy/page.tsx (100%) rename app/{ => (public)}/profile/page.tsx (96%) rename app/{ => (public)}/register/layout.tsx (100%) rename app/{ => (public)}/register/page.tsx (100%) rename app/{ => (public)}/terms/layout.tsx (100%) rename app/{ => (public)}/terms/page.tsx (100%) rename app/{ => (public)}/trips/[id]/opengraph-image.tsx (100%) rename app/{ => (public)}/trips/[id]/page.tsx (100%) rename app/{ => (public)}/trips/[id]/payment/page.tsx (100%) rename app/{ => (public)}/trips/page.tsx (100%) rename app/{ => (public)}/u/[id]/page.tsx (100%) rename app/{ => (public)}/verify/layout.tsx (100%) rename app/{ => (public)}/verify/page.tsx (100%) create mode 100644 app/admin/layout.tsx create mode 100644 app/admin/page.tsx create mode 100644 app/admin/payouts/layout.tsx create mode 100644 app/admin/payouts/page.tsx create mode 100644 components/admin/admin-sidebar.tsx create mode 100644 components/shared/footer.tsx create mode 100644 features/payout/actions.ts create mode 100644 features/payout/components/earnings-section.tsx create mode 100644 features/payout/components/payout-review-card.tsx create mode 100644 features/payout/schemas.ts create mode 100644 prisma/migrations/20260511_add_payout_model/migration.sql create mode 100644 server/repositories/payout.repo.ts create mode 100644 server/services/payout.service.ts diff --git a/TERMS.md b/TERMS.md index 8dde10f..13bd66e 100644 --- a/TERMS.md +++ b/TERMS.md @@ -59,19 +59,28 @@ Dengan menggunakan SeTrip, Anda menyatakan bahwa: --- -# 6. Pembayaran +# 6. Pembayaran & Escrow -- Pembayaran dilakukan sesuai metode yang tersedia di platform -- Dalam fase awal, pembayaran dapat dilakukan langsung kepada organizer -- SeTrip tidak menjamin keamanan transaksi yang dilakukan di luar platform +- Pembayaran dilakukan melalui metode yang tersedia di platform (Midtrans atau transfer manual yang dikonfirmasi organizer) +- **Uang peserta ditahan oleh SeTrip (escrow)** sejak pembayaran berhasil hingga trip selesai + 3 hari, baru kemudian diteruskan ke organizer +- Buffer 3 hari memberi waktu peserta dan organizer melaporkan masalah trip sebelum uang cair +- Pembayaran di luar platform tidak dijamin keamanannya oleh SeTrip — kami tidak dapat memediasi sengketa untuk transaksi off-platform --- # 7. Pembatalan & Refund -- Kebijakan pembatalan ditentukan oleh organizer -- SeTrip tidak bertanggung jawab atas refund yang tidak diberikan oleh organizer -- Pengguna disarankan untuk memahami kebijakan sebelum melakukan pembayaran +**Saat peserta membatalkan booking sendiri** (kebijakan default platform): + +- **≥ 7 hari** sebelum tanggal berangkat → refund **80%** dari nominal booking +- **3–6 hari** sebelum tanggal berangkat → refund **50%** dari nominal booking +- **< 3 hari** sebelum tanggal berangkat / setelah berangkat → **tidak ada refund** + +**Saat organizer membatalkan trip:** peserta yang sudah bayar mendapat refund **100%**. + +**Pengembalian dana** diproses manual oleh admin SeTrip — perlu 1–3 hari kerja sejak refund disetujui untuk uang masuk ke rekening kamu. Setiap pengajuan refund tercatat (tidak pernah dihapus) untuk audit trail. + +Kebijakan di atas berlaku platform-wide; organizer tidak dapat menetapkan policy yang lebih ketat tanpa persetujuan tertulis dari SeTrip. --- diff --git a/app/accept-terms/form.tsx b/app/(public)/accept-terms/form.tsx similarity index 100% rename from app/accept-terms/form.tsx rename to app/(public)/accept-terms/form.tsx diff --git a/app/accept-terms/page.tsx b/app/(public)/accept-terms/page.tsx similarity index 100% rename from app/accept-terms/page.tsx rename to app/(public)/accept-terms/page.tsx diff --git a/app/create-trip/layout.tsx b/app/(public)/create-trip/layout.tsx similarity index 100% rename from app/create-trip/layout.tsx rename to app/(public)/create-trip/layout.tsx diff --git a/app/create-trip/page.tsx b/app/(public)/create-trip/page.tsx similarity index 100% rename from app/create-trip/page.tsx rename to app/(public)/create-trip/page.tsx diff --git a/app/(public)/layout.tsx b/app/(public)/layout.tsx new file mode 100644 index 0000000..e000b35 --- /dev/null +++ b/app/(public)/layout.tsx @@ -0,0 +1,25 @@ +import { Navbar } from "@/components/shared/navbar"; +import { ProfileNudgeBanner } from "@/components/shared/profile-nudge-banner"; +import { Footer } from "@/components/shared/footer"; + +/** + * Layout user-facing (semua halaman publik + dashboard organizer/peserta). + * Berisi navbar global, profile-nudge banner, dan footer. + * + * Tidak berlaku untuk halaman admin — admin punya layout sendiri di + * app/admin/layout.tsx dengan sidebar khusus. + */ +export default function PublicLayout({ + children, +}: { + children: React.ReactNode; +}) { + return ( + <> + + +
{children}
+