diff --git a/backend/src/routes/invitations.ts b/backend/src/routes/invitations.ts index 76aba7c..7fc82a2 100644 --- a/backend/src/routes/invitations.ts +++ b/backend/src/routes/invitations.ts @@ -220,6 +220,34 @@ invitationsRouter.post('/invitations/:token/accept', async (req: Request, res: R where: { id: invitation.id }, data: { status: 'ACCEPTED', acceptedAt: new Date() }, }); + + // War der Einladung ein Zimmer zugeordnet, entsteht daraus jetzt auch ein + // Mietvertrag — sonst taucht der Mieter zwar mit roomId beim User auf, + // aber nirgendwo in Miet-Ampel/Vertragsdokumenten/Kündigungsfristen, da + // die überall an Contract hängen, nicht an User.roomId. Warmmiete/Kaution + // werden aus den bereits am Zimmer hinterlegten Werten übernommen (wie + // beim „Wieder aufnehmen“-Formular) — der Vermieter kann sie danach über + // den Vertragsdokumente-Bereich jederzeit anpassen. + if (invitation.roomId && invitation.role === UserRole.TENANT) { + const room = await tx.room.findUnique({ where: { id: invitation.roomId } }); + const activeContract = room + ? await tx.contract.findFirst({ where: { roomId: room.id, isActive: true } }) + : null; + if (room && !activeContract) { + await tx.contract.create({ + data: { + userId: created.id, + roomId: room.id, + startDate: new Date(), + totalWarmRent: Number(room.baseRent) + Number(room.utilityPauschal), + depositAmount: Number(room.baseRent) * 3, + isActive: true, + }, + }); + await tx.room.update({ where: { id: room.id }, data: { status: 'OCCUPIED' } }); + } + } + return created; });