From 5261ef3710d74eca0e0a7e4f9d083e24bd45cce1 Mon Sep 17 00:00:00 2001 From: Giuseppe Lombardo Date: Wed, 12 Aug 2026 21:51:22 +0000 Subject: [PATCH] Dateien nach "prisma" hochladen --- prisma/schema.prisma | 87 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 86 insertions(+), 1 deletion(-) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index abaa0c7..faa30bc 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -179,6 +179,8 @@ model User { invitationsSent Invitation[] @relation("InvitationsSent") storageSlots StorageSlot[] documentsUploaded Document[] + utilityStatementsCreated UtilityStatement[] + utilityStatementShares UtilityStatementShare[] @@map("users") } @@ -205,6 +207,7 @@ model Room { inventoryItems Inventory[] meterReadings MeterReading[] invitations Invitation[] + utilityStatementShares UtilityStatementShare[] @@map("rooms") } @@ -309,8 +312,10 @@ model Ticket { id String @id @default(uuid()) creatorId String @map("creator_id") creator User @relation("TicketCreator", fields: [creatorId], references: [id]) - assigneeId String? @map("assignee_id") // Handwerker + assigneeId String? @map("assignee_id") // Handwerker (interner User-Account, optional) assignee User? @relation("TicketAssignee", fields: [assigneeId], references: [id]) + craftsmanId String? @map("craftsman_id") // Handwerker-Kontakt (externer Betrieb ohne Login) + craftsman Craftsman? @relation(fields: [craftsmanId], references: [id]) roomId String? @map("room_id") // NULL = Gemeinschaftsbereich room Room? @relation(fields: [roomId], references: [id]) @@ -598,3 +603,83 @@ model Document { @@map("documents") } + +// ---------------------------------------------------------------------------- +// NEBENKOSTENABRECHNUNG (Utility-Statements) +// ---------------------------------------------------------------------------- + +// Eine Nebenkostenabrechnung für einen Zeitraum (z. B. ein Jahr). Der +// Vermieter trägt den Gesamtbetrag ein; die App verteilt ihn automatisch +// proportional zur Zimmergröße (sizeSqm) auf alle aktuell aktiven Mieter — +// dieselbe faire Grundlage wie bei der Nettokaltmiete. +model UtilityStatement { + id String @id @default(uuid()) + periodStart DateTime @map("period_start") + periodEnd DateTime @map("period_end") + totalAmount Decimal @map("total_amount") @db.Decimal(10, 2) + description String? + createdById String @map("created_by_id") + createdBy User @relation(fields: [createdById], references: [id]) + + createdAt DateTime @default(now()) @map("created_at") + + shares UtilityStatementShare[] + + @@map("utility_statements") +} + +// Anteil eines einzelnen Mieters an einer Nebenkostenabrechnung. Für den +// betroffenen Mieter selbst sichtbar, für alle anderen Mieter NICHT (private +// Abrechnungsdaten) — nur der Vermieter/Admin sieht alle Anteile. +model UtilityStatementShare { + id String @id @default(uuid()) + statementId String @map("statement_id") + statement UtilityStatement @relation(fields: [statementId], references: [id]) + userId String @map("user_id") + user User @relation(fields: [userId], references: [id]) + roomId String? @map("room_id") + room Room? @relation(fields: [roomId], references: [id]) + + shareAmount Decimal @map("share_amount") @db.Decimal(8, 2) + settlementStatus SettlementStatus @default(OPEN) @map("settlement_status") + settledAt DateTime? @map("settled_at") + + createdAt DateTime @default(now()) @map("created_at") + + @@index([userId]) + @@index([statementId]) + @@map("utility_statement_shares") +} + +// ---------------------------------------------------------------------------- +// HANDWERKER-KONTAKTE (Anbindung für Schadensmeldungen) +// ---------------------------------------------------------------------------- + +enum CraftsmanTrade { + SANITAER + ELEKTRIK + HEIZUNG + SCHREINEREI + MALER + SCHLUESSELDIENST + SONSTIGES +} + +// Kontaktkarte eines Handwerksbetriebs (kein eigener Login nötig). Kann +// Tickets zugewiesen werden, damit direkt klar ist, wer sich kümmert und wie +// er erreichbar ist. +model Craftsman { + id String @id @default(uuid()) + name String + trade CraftsmanTrade @default(SONSTIGES) + phone String? + email String? + notes String? + + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + + tickets Ticket[] + + @@map("craftsmen") +}