Dateien nach "prisma" hochladen

This commit is contained in:
Giuseppe Lombardo 2026-08-12 21:51:22 +00:00
parent 1dc1eade8f
commit 5261ef3710

View File

@ -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")
}