diff --git a/src/components/applicant/my-logistics-card.tsx b/src/components/applicant/my-logistics-card.tsx index d9e58b7..cd3e267 100644 --- a/src/components/applicant/my-logistics-card.tsx +++ b/src/components/applicant/my-logistics-card.tsx @@ -175,7 +175,7 @@ export function MyLogisticsCard() { if (!data) return null - const { hotel, myFlight, visaVisible, myVisa } = data + const { hotel, room, myFlight, visaVisible, myVisa } = data const hasFlightData = myFlight && @@ -227,6 +227,38 @@ export function MyLogisticsCard() { )} + {/* Room */} + {room && ( +
+ Room +
+Room {room.roomNumber}
+ )} + {room.checkInAt && ( ++ Check-in:{' '} + + {formatMonacoTime(room.checkInAt)} + {' '} + (Monaco time) +
+ )} + {room.checkOutAt && ( ++ Check-out:{' '} + + {formatMonacoTime(room.checkOutAt)} + {' '} + (Monaco time) +
+ )} +diff --git a/src/server/routers/applicant.ts b/src/server/routers/applicant.ts index 0e80a44..4a42772 100644 --- a/src/server/routers/applicant.ts +++ b/src/server/routers/applicant.ts @@ -2895,22 +2895,33 @@ export const applicantRouter = router({ const confirmationId = project.finalistConfirmation.id const visaVisible = project.program.visaStatusVisibleToMembers - // Hotel (1:1 per program) - const hotelRow = await ctx.prisma.hotel.findUnique({ - where: { programId }, - select: { name: true, address: true, link: true, notes: true }, - }) - const hotel = hotelRow ?? null - - // Caller's own AttendingMember + flight + visa + // Caller's own AttendingMember + hotel stay + flight + visa const attendee = await ctx.prisma.attendingMember.findFirst({ where: { confirmationId, userId: ctx.user.id }, include: { + hotelStay: { include: { hotel: true } }, flightDetail: true, visaApplication: visaVisible, }, }) + const stay = attendee?.hotelStay ?? null + const hotel = stay?.hotel + ? { + name: stay.hotel.name, + address: stay.hotel.address, + link: stay.hotel.link, + notes: stay.hotel.notes, + } + : null + const room = stay + ? { + roomNumber: stay.roomNumber, + checkInAt: stay.checkInAt, + checkOutAt: stay.checkOutAt, + } + : null + const fd = attendee?.flightDetail ?? null const myFlight = fd ? { @@ -2931,6 +2942,7 @@ export const applicantRouter = router({ projectTitle: project.title, confirmationStatus: project.finalistConfirmation.status, hotel, + room, myFlight, visaVisible, myVisa, diff --git a/tests/unit/applicant-my-logistics.test.ts b/tests/unit/applicant-my-logistics.test.ts index b9d6fbb..dee2239 100644 --- a/tests/unit/applicant-my-logistics.test.ts +++ b/tests/unit/applicant-my-logistics.test.ts @@ -66,8 +66,16 @@ async function buildConfirmedFinalist() { }, }) - // Hotel for the program (1:1) - await prisma.hotel.create({ + const attendee = await prisma.attendingMember.create({ + data: { + confirmationId: confirmation.id, + userId: user.id, + needsVisa: true, + }, + }) + + // Hotel for the program + HotelStay assigning the attendee to it + const hotel = await prisma.hotel.create({ data: { programId: program.id, name: 'Hotel Hermitage', @@ -77,11 +85,13 @@ async function buildConfirmedFinalist() { }, }) - const attendee = await prisma.attendingMember.create({ + await prisma.hotelStay.create({ data: { - confirmationId: confirmation.id, - userId: user.id, - needsVisa: true, + attendingMemberId: attendee.id, + hotelId: hotel.id, + roomNumber: '204', + checkInAt: new Date('2026-06-20T14:00:00Z'), + checkOutAt: new Date('2026-06-23T11:00:00Z'), }, }) @@ -125,6 +135,9 @@ describe('applicant.getMyLogistics', () => { await prisma.flightDetail.deleteMany({ where: { attendingMember: { confirmation: { project: { programId } } } }, }) + await prisma.hotelStay.deleteMany({ + where: { attendingMember: { confirmation: { project: { programId } } } }, + }) await prisma.hotel.deleteMany({ where: { programId } }) await prisma.attendingMember.deleteMany({ where: { confirmation: { project: { programId } } }, @@ -154,6 +167,8 @@ describe('applicant.getMyLogistics', () => { expect(result!.confirmationStatus).toBe('CONFIRMED') expect(result!.hotel).not.toBeNull() expect(result!.hotel!.name).toBe('Hotel Hermitage') + expect(result!.room).not.toBeNull() + expect(result!.room!.roomNumber).toBe('204') expect(result!.myFlight).not.toBeNull() expect(result!.myFlight!.arrivalFlightNumber).toBe('AF1234') expect(result!.myFlight!.arrivalAirport).toBe('NCE') @@ -227,6 +242,9 @@ describe('applicant.updateMyVisaNationality', () => { await prisma.flightDetail.deleteMany({ where: { attendingMember: { confirmation: { project: { programId } } } }, }) + await prisma.hotelStay.deleteMany({ + where: { attendingMember: { confirmation: { project: { programId } } } }, + }) await prisma.hotel.deleteMany({ where: { programId } }) await prisma.attendingMember.deleteMany({ where: { confirmation: { project: { programId } } },