Extra luggage, tourism package, manage my trip and other updates

This commit is contained in:
Stephanos A
2026-06-23 19:45:15 +03:00
parent 2bd76756a4
commit e25066d6d5
26 changed files with 2374 additions and 411 deletions

View File

@@ -670,6 +670,70 @@ async function seedFraudRules() {
console.log(`${rules.length} fraud detection rules created`);
}
async function seedKulubbiPackage() {
console.log('\n🚆 Seeding Kulubbi Gabriel 2025 package...');
const addisStation = await prisma.station.findFirst({ where: { code: 'SBT' } });
const direDawaStation = await prisma.station.findFirst({ where: { code: 'DRE' } });
if (!addisStation || !direDawaStation) {
console.log(' ⚠️ Stations not found, skipping Kulubbi package seed');
return;
}
// Use the first two schedules as outbound/return (or create dedicated ones)
const schedules = await prisma.trainSchedule.findMany({ take: 2, orderBy: { departureAt: 'asc' } });
if (schedules.length < 2) {
console.log(' ⚠️ Not enough schedules found, skipping Kulubbi package seed');
return;
}
const [outboundSchedule, returnSchedule] = schedules;
await prisma.travelPackage.upsert({
where: { code: 'KULUBBI-2025' },
update: {},
create: {
code: 'KULUBBI-2025',
name: 'Kulubbi Gabriel Pilgrimage Package',
description: 'Annual pilgrimage round-trip package to Kulubi Gabriel Church. Includes train travel, bus transfer, meals, and entertainment.',
outboundScheduleId: outboundSchedule.id,
returnScheduleId: returnSchedule.id,
originStationId: addisStation.id,
destinationStationId: direDawaStation.id,
boardingTime: new Date('2025-07-24T07:00:00+03:00'),
departureTime: new Date('2025-07-24T09:00:00+03:00'),
arrivalTime: new Date('2025-07-25T06:00:00+03:00'),
totalCapacity: 912,
coachConfiguration: '1 Locomotive + 2SBC + 2HBC + 6HSC',
busTransferIncluded: true,
busTransferRoute: 'Dire Dawa ↔ Kulubi Gabriel',
validFrom: new Date('2025-07-01'),
validUntil: new Date('2025-07-24T09:00:00+03:00'),
status: 'ACTIVE',
includedServices: [
'Round-trip train travel (Addis Ababa ↔ Dire Dawa)',
'Lunch served on board',
'Refreshments and bottled water',
'Round-trip bus transfer (Dire Dawa ↔ Kulubi Gabriel)',
'Onboard first aid and medical support',
'Entertainment (audio/video)',
'Service briefing and pilgrimage guidance',
'Pick-up and drop-off coordination',
],
priceTiers: {
create: [
{ seatType: 'HSC', label: 'Regular Seat (HSC)', priceMinor: 1023200, availableSeats: 550 },
{ seatType: 'ECU', label: 'Economic Bed Upper (ECU)', priceMinor: 1295200, availableSeats: 80 },
{ seatType: 'ECM', label: 'Economic Bed Middle (ECM)', priceMinor: 1364000, availableSeats: 80 },
{ seatType: 'ECL', label: 'Economic Bed Lower (ECL)', priceMinor: 1430200, availableSeats: 80 },
{ seatType: 'VIU', label: 'VIP Bed Upper (VIU)', priceMinor: 1243500, availableSeats: 61 },
{ seatType: 'VIL', label: 'VIP Bed Lower (VIL)', priceMinor: 1643500, availableSeats: 61 },
],
},
},
});
console.log(' ✅ Kulubbi Gabriel 2025 package created');
}
// Run a seed step in isolation: if it throws (FK conflict, duplicate row,
// missing record, etc.) log the error and keep going so the rest of the seed —
// and the API startup that follows it — are never blocked by one bad step.
@@ -691,7 +755,8 @@ async function main() {
['fare rules', seedFareRules],
['segment fares', seedSegmentFares],
['currency', seedCurrency],
['notification templates', seedNotificationTemplates]
['notification templates', seedNotificationTemplates],
['kulubbi package', seedKulubbiPackage],
];
let failed = 0;