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}
+
+ >
+ );
+}
diff --git a/app/login/layout.tsx b/app/(public)/login/layout.tsx
similarity index 100%
rename from app/login/layout.tsx
rename to app/(public)/login/layout.tsx
diff --git a/app/login/page.tsx b/app/(public)/login/page.tsx
similarity index 93%
rename from app/login/page.tsx
rename to app/(public)/login/page.tsx
index fd4be9c..ee54476 100644
--- a/app/login/page.tsx
+++ b/app/(public)/login/page.tsx
@@ -1,7 +1,7 @@
"use client";
import { useState, Suspense } from "react";
-import { signIn } from "next-auth/react";
+import { signIn, getSession } from "next-auth/react";
import { useRouter, useSearchParams } from "next/navigation";
import Link from "next/link";
import Image from "next/image";
@@ -38,7 +38,13 @@ function LoginForm() {
if (result?.error) {
setError(result.error);
} else {
- const next = safeInternalPath(searchParams.get("callbackUrl"));
+ const rawCallback = searchParams.get("callbackUrl");
+ let next = safeInternalPath(rawCallback);
+ // Tanpa callbackUrl eksplisit, arahkan admin ke dashboard /admin.
+ if (!rawCallback) {
+ const session = await getSession();
+ if (session?.user?.isAdmin) next = "/admin";
+ }
router.push(next);
router.refresh();
}
diff --git a/app/page.tsx b/app/(public)/page.tsx
similarity index 100%
rename from app/page.tsx
rename to app/(public)/page.tsx
diff --git a/app/people/page.tsx b/app/(public)/people/page.tsx
similarity index 100%
rename from app/people/page.tsx
rename to app/(public)/people/page.tsx
diff --git a/app/privacy/layout.tsx b/app/(public)/privacy/layout.tsx
similarity index 100%
rename from app/privacy/layout.tsx
rename to app/(public)/privacy/layout.tsx
diff --git a/app/privacy/page.tsx b/app/(public)/privacy/page.tsx
similarity index 100%
rename from app/privacy/page.tsx
rename to app/(public)/privacy/page.tsx
diff --git a/app/profile/page.tsx b/app/(public)/profile/page.tsx
similarity index 96%
rename from app/profile/page.tsx
rename to app/(public)/profile/page.tsx
index 5d12c96..b22bf24 100644
--- a/app/profile/page.tsx
+++ b/app/(public)/profile/page.tsx
@@ -5,9 +5,11 @@ import Link from "next/link";
import { getServerSession } from "next-auth";
import { authOptions } from "@/lib/auth";
import { profileService } from "@/server/services/profile.service";
+import { payoutRepo } from "@/server/repositories/payout.repo";
import { TripCard } from "@/features/trip/components/trip-card";
import { ProfileTripRow } from "@/features/profile/components/profile-trip-row";
import { ProfileEditor } from "@/features/profile/components/profile-editor";
+import { EarningsSection } from "@/features/payout/components/earnings-section";
export const metadata: Metadata = {
title: "Profil Saya",
@@ -20,9 +22,10 @@ export default async function ProfilePage() {
redirect("/login?callbackUrl=/profile");
}
- const [data, ownProfile] = await Promise.all([
+ const [data, ownProfile, payouts] = await Promise.all([
profileService.getProfileDashboard(session.user.id),
profileService.getOwnProfile(session.user.id),
+ payoutRepo.listForOrganizer(session.user.id),
]);
const {
user,
@@ -84,6 +87,9 @@ export default async function ProfilePage() {
+ {/* Pendapatan dari peserta (escrow payout) */}
+
+
{/* Profil sosial publik */}
+
+
🔒
+
+ Halaman khusus admin
+
+
+ Akun kamu tidak punya akses ke panel admin SeTrip.
+
+ Uang peserta ditahan (escrow) sampai trip selesai + 3 hari. Setelah
+ status Siap transfer, admin transfer manual ke
+ rekening organizer lalu tandai sudah dibayar.
+