general category trip

This commit is contained in:
2026-05-07 18:47:45 +07:00
parent 12f13f2049
commit 49aa64c522
25 changed files with 904 additions and 386 deletions
@@ -0,0 +1,8 @@
-- CreateEnum
CREATE TYPE "ActivityCategory" AS ENUM ('HIKING', 'CAMPING', 'SNORKELING', 'DIVING', 'ISLAND_HOPPING', 'CITY_TRIP', 'CULINARY', 'CONCERT', 'WORKSHOP', 'RETREAT');
-- AlterTable
ALTER TABLE "Trip" ADD COLUMN "category" "ActivityCategory" NOT NULL DEFAULT 'HIKING';
-- CreateIndex
CREATE INDEX "Trip_category_status_date_idx" ON "Trip"("category", "status", "date");
@@ -0,0 +1,2 @@
-- AlterTable: rename column without data loss
ALTER TABLE "Trip" RENAME COLUMN "mountain" TO "destination";
+19 -1
View File
@@ -97,7 +97,10 @@ model Trip {
id String @id @default(cuid())
title String
description String?
mountain String
/// Kategori aktivitas.
category ActivityCategory @default(HIKING)
/// Destinasi/subjek aktivitas — interpretasinya tergantung kategori (gunung untuk HIKING, spot untuk DIVING, venue untuk CONCERT, tema untuk WORKSHOP, dst).
destination String
location String
/// Titik kumpul / meeting point (teks bebas)
meetingPoint String?
@@ -121,6 +124,8 @@ model Trip {
participants TripParticipant[]
images TripImage[]
reviews TripReview[]
@@index([category, status, date])
}
model TripReview {
@@ -174,6 +179,19 @@ enum TripStatus {
COMPLETED
}
enum ActivityCategory {
HIKING
CAMPING
SNORKELING
DIVING
ISLAND_HOPPING
CITY_TRIP
CULINARY
CONCERT
WORKSHOP
RETREAT
}
enum ParticipantStatus {
PENDING
CONFIRMED
+350 -230
View File
@@ -24,70 +24,29 @@ async function main() {
const password = await bcrypt.hash("password123", 12);
// Organizer
const dede = await prisma.user.create({
data: {
name: "Dede Inoen",
email: "dede.inoen@setrip.id",
password,
},
data: { name: "Dede Inoen", email: "dede.inoen@setrip.id", password },
});
const panji = await prisma.user.create({
data: {
name: "Panji Petualang",
email: "panji@setrip.id",
password,
},
data: { name: "Panji Petualang", email: "panji@setrip.id", password },
});
const fiersa = await prisma.user.create({
data: {
name: "Fiersa Besari",
email: "fiersa@setrip.id",
password,
},
data: { name: "Fiersa Besari", email: "fiersa@setrip.id", password },
});
// User biasa (peserta)
const budi = await prisma.user.create({
data: {
name: "Budi Santoso",
email: "budi@gmail.com",
password,
},
data: { name: "Budi Santoso", email: "budi@gmail.com", password },
});
const sari = await prisma.user.create({
data: {
name: "Sari Dewi",
email: "sari@gmail.com",
password,
},
data: { name: "Sari Dewi", email: "sari@gmail.com", password },
});
const doni = await prisma.user.create({
data: {
name: "Doni Prasetyo",
email: "doni@gmail.com",
password,
},
data: { name: "Doni Prasetyo", email: "doni@gmail.com", password },
});
const maya = await prisma.user.create({
data: {
name: "Maya Putri",
email: "maya@gmail.com",
password,
},
data: { name: "Maya Putri", email: "maya@gmail.com", password },
});
const raka = await prisma.user.create({
data: {
name: "Raka Aditya",
email: "raka@gmail.com",
password,
},
data: { name: "Raka Aditya", email: "raka@gmail.com", password },
});
console.log("✅ Users created");
@@ -140,278 +99,439 @@ async function main() {
// ==================== TRIPS + IMAGES ====================
/**
* Tanggal disimpan eksplisit di UTC agar filter `from`/`to` (YYYY-MM-DD UTC)
* cocok dengan yang tampil di daftar.
*
* - Multi hari: isi `endDate` = hari terakhir trip (UTC).
* - Satu hari / night hike satu malam: `endDate` null — filter memakai instan `date`
* dalam rentang hari UTC yang sama (jam tetap masuk hari itu).
* Tanggal disimpan eksplisit di UTC. Multi hari isi `endDate` (hari terakhir
* trip). Trip 1 hari / night-event: `endDate` null.
*/
const utc = (y: number, m0: number, d: number, h = 12, min = 0) =>
new Date(Date.UTC(y, m0, d, h, min, 0, 0));
// Unsplash mountain photos (URL CDN publik, gratis, stabil).
// Slug ID di komentar = id di unsplash.com/photos/{slug} buat ditelusuri ulang.
// Unsplash CDN photo helper. Slug ID di komentar = id di unsplash.com/photos/{slug}.
const img = (id: string) =>
`https://images.unsplash.com/photo-${id}?w=1200&q=80&auto=format&fit=crop`;
const MOUNTAIN_PHOTOS = {
papandayan1: img("1554629947-334ff61d85dc"), // xfngap_DToE
papandayan2: img("1464822759023-fed622ff2c3b"), // Bkci_8qcdvQ
papandayan3: img("1454496522488-7a8e488e8606"), // 9wg5jCEPBsw
ciremai1: img("1480497490787-505ec076689f"), // 6bKxagnIDtk
ciremai2: img("1483728642387-6c3bdd6c93e5"), // YFFGkE3y4F8
ciremai3: img("1502085671122-2d218cd434e6"), // NNmiv6zcFvk
gede1: img("1478059299873-f047d8c5fe1a"), // DXQB5D1njMY
gede2: img("1519681393784-d120267933ba"), // z8ct_Q3oCqM
gede3: img("1501785888041-af3ef285b470"), // T7K4aEPoGGk
gede4: img("1540979388789-6cee28a1cdc9"), // eUFfY6cwjSU
tangkuban1: img("1506905925346-21bda4d32df4"), // 1527pjeb6jg
tangkuban2: img("1490682143684-14369e18dce8"), // 8c6eS43iq1o
malabar1: img("1494548162494-384bba4ab999"), // xP_AGmeEa6s
malabar2: img("1500964757637-c85e8a162699"), // twukN12EN7c
malabar3: img("1549880181-56a44cf4a9a5"), // ePpaQC2c1xA
guntur1: img("1558883493-8b86ff880fec"), // vaG8rOJLDHo
guntur2: img("1554629947-334ff61d85dc"), // reuse — xfngap_DToE
guntur3: img("1464822759023-fed622ff2c3b"), // reuse — Bkci_8qcdvQ
} as const;
// --- Trip 1: Papandayan (by Dede Inoen) — 2 hari ---
const trip1 = await prisma.trip.create({
// --- HIKING: Papandayan ---
const tripHiking = await prisma.trip.create({
data: {
category: "HIKING",
title: "Open Trip Papandayan Weekend",
description: `Pendakian santai ke Gunung Papandayan, cocok untuk pemula!
⚠️ Bawa: Sleeping bag, jaket, headlamp, air 2L`,
meetingPoint:
"Alun-alun Garut (depan pendopo), Sabtu 05:00 WIB — detail grup WA.",
meetingPoint: "Alun-alun Garut, Sabtu 05:00 WIB — detail grup WA.",
itinerary: `Sabtu
• 05:00 Meeting & briefing
• 07:00 Berangkat menuju basecamp
• 12:00 Makan siang trail
• 15:00 Camp area Pondok Salada
Minggu
• 04:00 Summit attack
• 08:00 Sarap & packing
• 11:00 Turun
• 16:00 Estimasi kembali ke Garut`,
whatsIncluded: `• Transport PP Garutbasecamp
• Guide lokal
• Tenda tim (kapasitas sesuai muatan)
• Konsumsi: makan 3x + snack`,
whatsExcluded: `• Tiket masuk TNGGP
• Sleeping bag & matras pribadi
• Tenda tim
• Konsumsi 3x + snack`,
whatsExcluded: `• Tiket masuk TN
• Sleeping bag pribadi
• Asuransi perjalanan`,
mountain: "Gunung Papandayan",
destination: "Gunung Papandayan",
location: "Garut, Jawa Barat",
date: utc(2026, 3, 23, 8, 0),
endDate: utc(2026, 3, 24, 18, 0),
date: utc(2026, 5, 13, 22, 0),
endDate: utc(2026, 5, 14, 18, 0),
maxParticipants: 10,
price: 250000,
status: "OPEN",
organizerId: dede.id,
images: {
create: [
{ url: MOUNTAIN_PHOTOS.papandayan1, caption: "Kawah Papandayan", order: 0 },
{ url: MOUNTAIN_PHOTOS.papandayan2, caption: "Track menuju puncak", order: 1 },
{ url: MOUNTAIN_PHOTOS.papandayan3, caption: "Camping ground Pondok Salada", order: 2 },
{ url: img("1554629947-334ff61d85dc"), caption: "Kawah Papandayan", order: 0 },
{ url: img("1464822759023-fed622ff2c3b"), caption: "Track menuju puncak", order: 1 },
],
},
},
});
// --- Trip 2: Ciremai (by Panji Petualang) — 2 hari ---
const trip2 = await prisma.trip.create({
// --- HIKING: Ciremai ---
const tripHikingCiremai = await prisma.trip.create({
data: {
category: "HIKING",
title: "Pendakian Ciremai via Apuy",
description: `Trip ke puncak tertinggi Jawa Barat! 🏔️
📍 Meeting Point: Stasiun Kuningan, 04:00 WIB
🎒 Fasilitas: Transport lokal, guide, logistik
⚠️ Level: Menengah — perlu stamina baik
Itinerary:
- Hari 1: Basecamp → Pos 3 → Camp
- Hari 2: Summit attack → Turun → Pulang`,
mountain: "Gunung Ciremai",
⚠️ Level: Menengah — perlu stamina baik`,
destination: "Gunung Ciremai",
location: "Kuningan, Jawa Barat",
date: utc(2026, 3, 25, 4, 0),
endDate: utc(2026, 3, 26, 18, 0),
date: utc(2026, 5, 23, 4, 0),
endDate: utc(2026, 5, 24, 18, 0),
maxParticipants: 8,
price: 350000,
status: "OPEN",
organizerId: panji.id,
images: {
create: [
{ url: MOUNTAIN_PHOTOS.ciremai1, caption: "Puncak Ciremai 3.078 mdpl", order: 0 },
{ url: MOUNTAIN_PHOTOS.ciremai2, caption: "Jalur pendakian via Apuy", order: 1 },
{ url: MOUNTAIN_PHOTOS.ciremai3, caption: "Sunrise dari puncak", order: 2 },
{ url: img("1480497490787-505ec076689f"), caption: "Puncak Ciremai 3.078 mdpl", order: 0 },
{ url: img("1502085671122-2d218cd434e6"), caption: "Sunrise dari puncak", order: 1 },
],
},
},
});
// --- Trip 3: Gede-Pangrango (by Fiersa Besari) — 2 hari ---
const trip3 = await prisma.trip.create({
// --- CAMPING: Ranca Upas ---
const tripCamping = await prisma.trip.create({
data: {
title: "Sunrise Trip Gede-Pangrango",
description: `Combo 2 puncak sekaligus! Gede + Pangrango.
category: "CAMPING",
title: "Camping Santai di Ranca Upas",
description: `Camping bareng di tengah hutan pinus dengan ditemani rusa-rusa! Cocok buat first-timer.
📍 Meeting Point: Cibodas, 22:00 WIB (malam)
🎒 Fasilitas: Guide, tenda, makan
⚠️ Level: Advance — night hike
Start malam, summit saat sunrise. View epic dijamin!`,
mountain: "Gunung Gede",
location: "Bogor/Cianjur, Jawa Barat",
date: utc(2026, 3, 27, 22, 0),
endDate: utc(2026, 3, 28, 16, 0),
📍 Meeting Point: Lembang, Sabtu 13:00 WIB
🎒 Fasilitas: Tenda dome, sleeping bag, BBQ, api unggun
🔥 Bonus: Live music akustik malam hari`,
meetingPoint: "Pertigaan Pasar Lembang, Sabtu 13:00 WIB",
whatsIncluded: `• Tenda + sleeping bag + matras
• Logistik camp
• Makan malam BBQ + sarapan
• Tiket masuk lokasi`,
whatsExcluded: `• Transport pribadi
• Snack tambahan`,
destination: "Ranca Upas",
location: "Bandung Selatan, Jawa Barat",
date: utc(2026, 5, 16, 6, 0),
endDate: utc(2026, 5, 17, 12, 0),
maxParticipants: 12,
price: 280000,
status: "OPEN",
organizerId: fiersa.id,
images: {
create: [
{ url: MOUNTAIN_PHOTOS.gede1, caption: "Puncak Gunung Gede", order: 0 },
{ url: MOUNTAIN_PHOTOS.gede2, caption: "Surya Kencana padang edelweis", order: 1 },
{ url: MOUNTAIN_PHOTOS.gede3, caption: "Blue lake / Danau Biru", order: 2 },
{ url: MOUNTAIN_PHOTOS.gede4, caption: "Night hike track Cibodas", order: 3 },
],
},
},
});
// --- Trip 4: Tangkuban Parahu (by Dede Inoen) — 1 hari ---
const trip4 = await prisma.trip.create({
data: {
title: "Trip Hemat Tangkuban Parahu",
description: `Trip santai ke kawah Tangkuban Parahu. Cocok buat first-timer!
📍 Meeting Point: Lembang, 07:00 WIB
🎒 Fasilitas: Transport, snack, guide
⚠️ Level: Easy — bisa pakai sandal gunung
Explore Kawah Ratu, Kawah Domas, foto-foto, terus makan sate maranggi!`,
mountain: "Gunung Tangkuban Parahu",
location: "Bandung, Jawa Barat",
date: utc(2026, 3, 22, 0, 0),
endDate: null,
maxParticipants: 15,
price: 120000,
price: 220000,
status: "OPEN",
organizerId: dede.id,
images: {
create: [
{ url: MOUNTAIN_PHOTOS.tangkuban1, caption: "Kawah Ratu", order: 0 },
{ url: MOUNTAIN_PHOTOS.tangkuban2, caption: "Kawah Domas", order: 1 },
{ url: img("1504280390367-361c6d9f38f4"), caption: "Tenda di hutan pinus", order: 0 },
{ url: img("1517824806704-9040b037703b"), caption: "Sunset di camp", order: 1 },
],
},
},
});
// --- Trip 5: Malabar (by Fiersa Besari) — 1 hari (night hike, `endDate` null) ---
const trip5 = await prisma.trip.create({
// --- SNORKELING: Pulau Pahawang ---
const tripSnorkel = await prisma.trip.create({
data: {
title: "Malabar Night Hike",
description: `Night hike ke Gunung Malabar — view kota Bandung dari atas!
category: "SNORKELING",
title: "Snorkeling Pulau Pahawang",
description: `Air kristal-jernih, ikan warna-warni, dan pasir putih lembut. Spot terumbu karang Pahawang Kecil masuk daftar must-visit di Lampung.
📍 Meeting Point: Pangalengan, 20:00 WIB
🎒 Fasilitas: Guide, teh hangat di puncak
⚠️ Bawa: Headlamp WAJIB, jaket tebal
Trip ringan, 3-4 jam naik. Cocok buat yang mau healing malam-malam.`,
mountain: "Gunung Malabar",
location: "Bandung, Jawa Barat",
date: utc(2026, 3, 20, 14, 0),
🤿 Pemula friendly — guide profesional
📷 Underwater photo session included`,
meetingPoint: "Dermaga Ketapang, Lampung Selatan, 07:00 WIB",
whatsIncluded: `• Boat PP
• Alat snorkel (masker, fin, life vest)
• Guide & pemandu underwater
• Konsumsi 2x`,
whatsExcluded: `• Transport ke Lampung
• Penginapan Sabtu malam`,
destination: "Pulau Pahawang Kecil",
location: "Lampung Selatan, Lampung",
date: utc(2026, 5, 30, 0, 0),
endDate: null,
maxParticipants: 10,
price: 150000,
status: "OPEN",
organizerId: fiersa.id,
images: {
create: [
{ url: MOUNTAIN_PHOTOS.malabar1, caption: "Puncak Malabar malam hari", order: 0 },
{ url: MOUNTAIN_PHOTOS.malabar2, caption: "View Bandung dari atas", order: 1 },
{ url: MOUNTAIN_PHOTOS.malabar3, caption: "Track pendakian", order: 2 },
],
},
},
});
// --- Trip 6: Guntur (by Panji Petualang) — 2 hari ---
const trip6 = await prisma.trip.create({
data: {
title: "Guntur Challenge Trip",
description: `Trip ke Gunung Guntur — jalur menantang tapi worth it!
📍 Meeting Point: Alun-alun Garut, 04:30 WIB
🎒 Fasilitas: Transport, guide, logistik
⚠️ Level: Hard — medan berbatu & terjal
Buat yang suka challenge. Pemandangan kawah aktif dari dekat!`,
mountain: "Gunung Guntur",
location: "Garut, Jawa Barat",
date: utc(2026, 3, 30, 4, 0),
endDate: utc(2026, 4, 1, 18, 0),
maxParticipants: 8,
price: 300000,
price: 380000,
status: "OPEN",
organizerId: panji.id,
images: {
create: [
{ url: MOUNTAIN_PHOTOS.guntur1, caption: "Kawah aktif Gunung Guntur", order: 0 },
{ url: MOUNTAIN_PHOTOS.guntur2, caption: "Jalur berbatu menuju puncak", order: 1 },
{ url: MOUNTAIN_PHOTOS.guntur3, caption: "View dari puncak", order: 2 },
{ url: img("1583212292454-1fe6229603b7"), caption: "Snorkeling di Pahawang", order: 0 },
{ url: img("1559825481-12a05cc00344"), caption: "Pasir putih Pahawang Kecil", order: 1 },
],
},
},
});
console.log("✅ 6 Trips + images created (tanggal UTC + endDate untuk trip multi hari)\n");
console.log(
` Guntur: ${trip6.title} ${trip6.date.toISOString().slice(0, 10)}${trip6.endDate?.toISOString().slice(0, 10) ?? "-"}\n`
);
// --- DIVING: Tulamben ---
const tripDiving = await prisma.trip.create({
data: {
category: "DIVING",
title: "Fun Dive Tulamben — USS Liberty Wreck",
description: `Dive trip ke USS Liberty Wreck, salah satu wreck dive paling ikonik di dunia. Visibility tinggi, kedalaman ramah open water diver.
⚠️ Sertifikasi minimal: Open Water (PADI/SSI)`,
meetingPoint: "Dive shop Tulamben, 06:30 WITA",
whatsIncluded: `• 2x dive guided
• Full gear rental
• Tank & weight
• Konsumsi siang`,
whatsExcluded: `• Transport ke Bali
• Penginapan
• Sertifikasi (cek validitas)`,
destination: "USS Liberty Wreck",
location: "Tulamben, Karangasem, Bali",
date: utc(2026, 6, 4, 0, 0),
endDate: utc(2026, 6, 5, 12, 0),
maxParticipants: 6,
price: 1850000,
status: "OPEN",
organizerId: fiersa.id,
images: {
create: [
{ url: img("1544551763-46a013bb70d5"), caption: "Wreck dive Tulamben", order: 0 },
{ url: img("1566024287286-457247b70310"), caption: "Reef Tulamben", order: 1 },
],
},
},
});
// --- ISLAND HOPPING: Karimun Jawa ---
const tripIslandHop = await prisma.trip.create({
data: {
category: "ISLAND_HOPPING",
title: "Karimun Jawa Island Hopping 3D2N",
description: `Hopping 5 pulau favorit di Karimun Jawa: Menjangan Kecil, Menjangan Besar, Cemara, Cilik, Geleang. Snorkeling, sunset, dan barbeque tepi pantai.
🏝️ Cocok untuk solo traveler & couple`,
meetingPoint: "Pelabuhan Kartini Jepara, Jumat 07:00 WIB",
whatsIncluded: `• Tiket kapal feri PP JeparaKarimun
• Homestay 2 malam (twin sharing)
• Boat hopping 2 hari
• Alat snorkel
• Makan 6x`,
whatsExcluded: `• Transport ke Jepara
• Tiket pesawat`,
destination: "Kepulauan Karimun Jawa",
location: "Jepara, Jawa Tengah",
date: utc(2026, 6, 12, 0, 0),
endDate: utc(2026, 6, 14, 18, 0),
maxParticipants: 12,
price: 1450000,
status: "OPEN",
organizerId: panji.id,
images: {
create: [
{ url: img("1507525428034-b723cf961d3e"), caption: "Pantai Karimun", order: 0 },
{ url: img("1519046904884-53103b34b206"), caption: "Boat hopping", order: 1 },
],
},
},
});
// --- CITY TRIP: Yogyakarta ---
const tripCityTrip = await prisma.trip.create({
data: {
category: "CITY_TRIP",
title: "City Trip Jogja Hidden Gems",
description: `Bukan Malioboro lagi. Trip jelajah Jogja sisi 'lokal' — Kotagede, Tamansari, Kalibiru, sampai angkringan andalan warga.
🚐 Mobil grup, bukan tour bus`,
meetingPoint: "Stasiun Tugu Yogyakarta, Sabtu 08:00 WIB",
whatsIncluded: `• Transport mobil grup 2 hari
• Tour leader lokal
• Makan 3x (kuliner lokal)
• Tiket masuk semua spot`,
whatsExcluded: `• Transport ke Jogja
• Penginapan (rekomendasi disediakan)`,
destination: "Yogyakarta",
location: "Yogyakarta",
date: utc(2026, 5, 22, 0, 0),
endDate: utc(2026, 5, 23, 20, 0),
maxParticipants: 8,
price: 650000,
status: "OPEN",
organizerId: fiersa.id,
images: {
create: [
{ url: img("1596402184320-417e7178b2cd"), caption: "Tamansari", order: 0 },
{ url: img("1583309217394-d191d747bc66"), caption: "Sudut Jogja", order: 1 },
],
},
},
});
// --- CULINARY: Bandung Street Food ---
const tripCulinary = await prisma.trip.create({
data: {
category: "CULINARY",
title: "Kulineran Street Food Bandung",
description: `Hopping 8 spot kuliner legend Bandung dalam satu hari: Surabi Enhaii, Mie Kocok Mang Dadeng, Lotek Kalipah Apo, sampai Es Cendol Elizabeth.
🍜 Cocok buat foodie & first-timer`,
meetingPoint: "Stasiun Bandung pintu utara, 09:00 WIB",
whatsIncluded: `• Transport angkot/grup
• Tour leader food explorer
• Sample setiap spot (8 tempat)`,
whatsExcluded: `• Pembelian extra di luar sample`,
destination: "Street Food Tour Bandung",
location: "Bandung, Jawa Barat",
date: utc(2026, 5, 17, 0, 0),
endDate: null,
maxParticipants: 8,
price: 175000,
status: "OPEN",
organizerId: dede.id,
images: {
create: [
{ url: img("1565299624946-b28f40a0ae38"), caption: "Street food", order: 0 },
],
},
},
});
// --- CONCERT: Coldplay Jakarta ---
const tripConcert = await prisma.trip.create({
data: {
category: "CONCERT",
title: "Nonton Coldplay Bareng — Music of the Spheres Jakarta",
description: `Cari teman buat nonton Coldplay tapi gak mau nonton sendirian? Gabung grup ini.
🎤 Tiket BUKAN termasuk — peserta bawa tiket masing-masing
🤝 Grup hanya untuk koordinasi meet-up & after-party`,
meetingPoint: "Plaza GBK, depan loket Cat 1, 17:00 WIB",
whatsIncluded: `• Koordinasi grup
• Foto bareng pre-show
• After-party dinner di Senayan`,
whatsExcluded: `• Tiket konser (bawa sendiri!)
• Transport ke GBK`,
destination: "Coldplay — Music of the Spheres",
location: "Stadion Utama GBK, Jakarta",
date: utc(2026, 6, 20, 10, 0),
endDate: null,
maxParticipants: 6,
price: 0,
status: "OPEN",
organizerId: fiersa.id,
images: {
create: [
{ url: img("1470229722913-7c0e2dbbafd3"), caption: "Konser malam", order: 0 },
],
},
},
});
// --- WORKSHOP: Fotografi Lanskap ---
const tripWorkshop = await prisma.trip.create({
data: {
category: "WORKSHOP",
title: "Workshop Fotografi Lanskap — Pangalengan",
description: `Belajar fotografi lanskap langsung di lapangan. Sunrise di kebun teh, golden hour di danau, milky way di malam hari (cuaca permitting).
📷 Bawa kamera DSLR/mirrorless + tripod
👨‍🏫 Mentor: fotografer pro (10+ tahun pengalaman)`,
meetingPoint: "Alun-alun Pangalengan, Sabtu 04:00 WIB",
whatsIncluded: `• Materi workshop (briefing + on-field)
• Tour leader & mentor
• Penginapan villa 1 malam
• Konsumsi 3x`,
whatsExcluded: `• Kamera & tripod (bawa sendiri)
• Transport ke Pangalengan`,
destination: "Fotografi Lanskap",
location: "Pangalengan, Bandung Selatan",
date: utc(2026, 6, 6, 0, 0),
endDate: utc(2026, 6, 7, 18, 0),
maxParticipants: 6,
price: 850000,
status: "OPEN",
organizerId: panji.id,
images: {
create: [
{ url: img("1452587925148-ce544e77e70d"), caption: "Sunrise kebun teh", order: 0 },
{ url: img("1444080748397-f442aa95c3e5"), caption: "Workshop on-field", order: 1 },
],
},
},
});
// --- RETREAT: Mindfulness Ubud ---
const tripRetreat = await prisma.trip.create({
data: {
category: "RETREAT",
title: "Mindfulness Retreat 3D — Ubud",
description: `Retreat 3 hari di tengah sawah Ubud. Yoga pagi, meditasi guided, journaling, dan sound healing.
🧘 Untuk yang lagi burnout & butuh reset
👥 Grup kecil (max 8) — pengalaman akrab`,
meetingPoint: "Villa Sawah Ubud (alamat dikirim H-3 via WA)",
whatsIncluded: `• Penginapan villa 2 malam
• Yoga 4 sesi + meditasi 6 sesi
• Sound healing (1 sesi)
• Konsumsi vegan 6x
• Welcome kit (jurnal, herbal tea)`,
whatsExcluded: `• Transport ke Ubud
• Treatment spa opsional`,
destination: "Mindfulness Retreat Ubud",
location: "Ubud, Gianyar, Bali",
date: utc(2026, 6, 26, 0, 0),
endDate: utc(2026, 6, 28, 14, 0),
maxParticipants: 8,
price: 2400000,
status: "OPEN",
organizerId: fiersa.id,
images: {
create: [
{ url: img("1545389336-cf090694435e"), caption: "Yoga di sawah Ubud", order: 0 },
{ url: img("1518609878373-06d740f60d8b"), caption: "Villa retreat", order: 1 },
],
},
},
});
console.log("✅ 11 Trips dibuat (10 kategori, semua tanggal masa depan)\n");
// ==================== PARTICIPANTS ====================
await prisma.tripParticipant.createMany({
data: [
// Papandayan — 4 peserta
{ tripId: trip1.id, userId: budi.id, status: "CONFIRMED" },
{ tripId: trip1.id, userId: sari.id, status: "CONFIRMED" },
{ tripId: trip1.id, userId: doni.id, status: "CONFIRMED" },
{ tripId: trip1.id, userId: raka.id, status: "CONFIRMED" },
// Hiking Papandayan — 4 peserta
{ tripId: tripHiking.id, userId: budi.id, status: "CONFIRMED" },
{ tripId: tripHiking.id, userId: sari.id, status: "CONFIRMED" },
{ tripId: tripHiking.id, userId: doni.id, status: "CONFIRMED" },
{ tripId: tripHiking.id, userId: raka.id, status: "CONFIRMED" },
// Ciremai — 2 peserta
{ tripId: trip2.id, userId: budi.id, status: "CONFIRMED" },
{ tripId: trip2.id, userId: maya.id, status: "CONFIRMED" },
// Hiking Ciremai — 2 peserta
{ tripId: tripHikingCiremai.id, userId: budi.id, status: "CONFIRMED" },
{ tripId: tripHikingCiremai.id, userId: maya.id, status: "CONFIRMED" },
// Gede — 5 peserta
{ tripId: trip3.id, userId: budi.id, status: "CONFIRMED" },
{ tripId: trip3.id, userId: sari.id, status: "CONFIRMED" },
{ tripId: trip3.id, userId: doni.id, status: "CONFIRMED" },
{ tripId: trip3.id, userId: maya.id, status: "CONFIRMED" },
{ tripId: trip3.id, userId: raka.id, status: "CONFIRMED" },
// Camping — 5 peserta
{ tripId: tripCamping.id, userId: budi.id, status: "CONFIRMED" },
{ tripId: tripCamping.id, userId: sari.id, status: "CONFIRMED" },
{ tripId: tripCamping.id, userId: doni.id, status: "CONFIRMED" },
{ tripId: tripCamping.id, userId: maya.id, status: "CONFIRMED" },
{ tripId: tripCamping.id, userId: raka.id, status: "CONFIRMED" },
// Tangkuban Parahu5 peserta
{ tripId: trip4.id, userId: budi.id, status: "CONFIRMED" },
{ tripId: trip4.id, userId: sari.id, status: "CONFIRMED" },
{ tripId: trip4.id, userId: doni.id, status: "CONFIRMED" },
{ tripId: trip4.id, userId: maya.id, status: "CONFIRMED" },
{ tripId: trip4.id, userId: raka.id, status: "CONFIRMED" },
// Snorkeling3 peserta
{ tripId: tripSnorkel.id, userId: sari.id, status: "CONFIRMED" },
{ tripId: tripSnorkel.id, userId: maya.id, status: "CONFIRMED" },
{ tripId: tripSnorkel.id, userId: raka.id, status: "PENDING" },
// Malabar2 peserta
{ tripId: trip5.id, userId: sari.id, status: "CONFIRMED" },
{ tripId: trip5.id, userId: maya.id, status: "CONFIRMED" },
// Diving1 peserta (paid trip, mahal)
{ tripId: tripDiving.id, userId: doni.id, status: "PENDING" },
// Guntur0 peserta
// Island hopping4 peserta
{ tripId: tripIslandHop.id, userId: budi.id, status: "CONFIRMED" },
{ tripId: tripIslandHop.id, userId: sari.id, status: "CONFIRMED" },
{ tripId: tripIslandHop.id, userId: maya.id, status: "CONFIRMED" },
{ tripId: tripIslandHop.id, userId: raka.id, status: "PENDING" },
// City trip — 3 peserta
{ tripId: tripCityTrip.id, userId: budi.id, status: "CONFIRMED" },
{ tripId: tripCityTrip.id, userId: maya.id, status: "CONFIRMED" },
{ tripId: tripCityTrip.id, userId: sari.id, status: "PENDING" },
// Culinary — 5 peserta
{ tripId: tripCulinary.id, userId: budi.id, status: "CONFIRMED" },
{ tripId: tripCulinary.id, userId: sari.id, status: "CONFIRMED" },
{ tripId: tripCulinary.id, userId: doni.id, status: "CONFIRMED" },
{ tripId: tripCulinary.id, userId: maya.id, status: "CONFIRMED" },
{ tripId: tripCulinary.id, userId: raka.id, status: "CONFIRMED" },
// Concert — 2 peserta
{ tripId: tripConcert.id, userId: maya.id, status: "CONFIRMED" },
{ tripId: tripConcert.id, userId: raka.id, status: "CONFIRMED" },
// Workshop — 2 peserta
{ tripId: tripWorkshop.id, userId: doni.id, status: "CONFIRMED" },
{ tripId: tripWorkshop.id, userId: sari.id, status: "CONFIRMED" },
// Retreat — 1 peserta (mahal, niche)
{ tripId: tripRetreat.id, userId: maya.id, status: "PENDING" },
],
});
console.log("✅ Participants joined");
console.log(" Papandayan: 4/10 | Ciremai: 2/8 | Gede: 5/12");
console.log(" Tangkuban Parahu: 5/15 | Malabar: 2/10 | Guntur: 0/8\n");
console.log("✅ Participants joined (mix CONFIRMED & PENDING per trip)\n");
console.log("🎉 Seed complete!");
}