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 07f51fb..812888c 100644 Binary files a/prisma/prisma/db/custom.db and b/prisma/prisma/db/custom.db differ 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") +}