From 2588c47c290f695dd60dec9968cc2f99e4485eca Mon Sep 17 00:00:00 2001 From: "[dyad]" Date: Sun, 2 Aug 2026 23:42:02 +0200 Subject: [PATCH] Add 1 file, update 2 files --- .../migration.sql | 1 + prisma/prisma/db/custom.db | Bin 2633728 -> 2707456 bytes prisma/schema.prisma | 56 +++++++++++++++++- 3 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 prisma/migrations/20260802211039_sed_n_3694_3709p_users_fatmacetin_dyad_apps_exametra_prisma_schema_prisma/migration.sql diff --git a/prisma/migrations/20260802211039_sed_n_3694_3709p_users_fatmacetin_dyad_apps_exametra_prisma_schema_prisma/migration.sql b/prisma/migrations/20260802211039_sed_n_3694_3709p_users_fatmacetin_dyad_apps_exametra_prisma_schema_prisma/migration.sql new file mode 100644 index 0000000..af5102c --- /dev/null +++ b/prisma/migrations/20260802211039_sed_n_3694_3709p_users_fatmacetin_dyad_apps_exametra_prisma_schema_prisma/migration.sql @@ -0,0 +1 @@ +-- This is an empty migration. \ No newline at end of file diff --git a/prisma/prisma/db/custom.db b/prisma/prisma/db/custom.db index 07f51fbbeb3b3658d4b1d6e3ee86a585fbc4e599..812888cdc64e4360fdacedb2d2050ae81864959a 100644 GIT binary patch delta 5743 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 delta 1423 zcmb7?drTBZ9LHy7Z*O;xeIAeFvB2>VMk8_+Y&4Axpw-%!8Xpt{#j3Rx0Vx{LCdzVn zARaz)(Vxb&UbT-{OiQ_xB~hubG-(=BV~c6jo@;H=q@huh#u!aw=P)(?(SN#`&t!hT z-^_34H{V}p^b_3aMDe~%Fa91O5=2iwe18Ab=?U+&ZJT)JEmi+wGil$yX=TKS{t+9& zQ?FPRPL_hlCt1cR|!I4O}H zEw$#ked{X;dbfG)x{kJ1dv2f7Kwzp@na|C$=0fQWPcEF@r6j?QreXnJt)|He`lV-z zHAnE3m686fu&__@L02_RA?OC2>{d(&jGAr;&KEa;{sougdatFW2{0+h=GVNldUG-4 z*DhQ`qCnsno{`NIK> z{n>H^iMSBS$E6Wziz`*iS0>5h%yAtJpn-@H?I-13FndJIhL^Lw22*rcDOqe5z7?|Fjr=#f>Ds`Z z!*QI;8r*(;&|F3AL4Q^nw$H~*Q*>Ecun^9zr2Dw^U;!9sOn;(r6!>&GYbd&u*1}?c z)+`uY&g#3!OcKlk|1x?2sz%K&mo+(<3x9Xh0TRrC&v(+@2hWxvI?g*u8Lc~{b}VyE~5pC|lD?z`e- z9lnO=porF@{-#zdM_Jc2+L4Ch2s`^e(E6fwINDUa6~1dKR_&X0^co)CN3lPK1CJA0 H{pa`xvYf~c diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 2e4d50e..183f28b 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -1641,7 +1641,7 @@ model EmailTemplate { } model EmailLog { - id String @id @default(cuid()) + id String schoolId String templateId String? recipientEmail String @@ -3707,3 +3707,57 @@ model WidgetTemplate { @@index([schoolId]) @@map("widget_templates") } + +model SchoolPolicy { + id String @id @default(cuid()) + schoolId String + policyType String // ESCALATION, CLASS_LOCKING, etc. + policyData String // JSON: policy configuration + isActive Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + school School @relation(fields: [schoolId], references: [id]) + + @@index([schoolId]) + @@map("school_policies") +} + +model EscalationPolicy { + id String @id @default(cuid()) + schoolId String + fromRole String // PARENT, TEACHER, ADMIN, etc. + toRole String // ADMIN, TEACHER, etc. + requiredPriorContactRole String // TEACHER, etc. + waitingPeriodBusinessDays Int @default(3) + isActive Boolean @default(true) + overriddenByUserId String? // nullable, admin-configured exceptions + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + school School @relation(fields: [schoolId], references: [id]) + overridingUser User? @relation(fields: [overriddenByUserId], references: [id]) + + @@index([schoolId]) + @@index([fromRole, toRole]) + @@map("escalation_policies") +} + +model ClassMessagingLock { + id String @id @default(cuid()) + classGroupId String + lockedByUserId String // teacher who locked + lockedFrom DateTime + lockedUntil DateTime? // nullable = "until class ends" + reason String? // optional reason for lock + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + classGroup ClassGroup @relation(fields: [classGroupId], references: [id]) + lockedByUser User @relation(fields: [lockedByUserId], references: [id]) + + @@index([classGroupId]) + @@index([lockedByUserId]) + @@index([lockedFrom, lockedUntil]) + @@map("class_messaging_locks") +}