// This is your Prisma schema file, // learn more about it in the docs: https://pris.ly/d/prisma-schema // // https://dev.to/connelevalsam/a-simple-crud-app-with-nextjs-prisma-sqlite-and-flutter-3oe1 // > npx prisma // // to update prisma DB/generate migration // >npx prisma migrate dev // //to generate schema // > npx prisma // GPT // This is a Prisma database schema definition, which describes the structure and relationships between various entities in the database. Here's a brief overview of the different models: // Publisher: Represents a publisher, with attributes such as first name, last name, email, phone, age, and availability. A publisher can have many availabilities and assignments, and can also have multiple user accounts and sessions. // Availability: Represents the availability of a publisher on a specific day and time range. An availability belongs to a publisher and can have a name, day of the week, day of the month, start time, and end time. // CartEvent: Represents a cart event, which is an event that requires a certain number of publishers to work. A cart event has a start and end time, a duration, and can have multiple shifts. It also has a location and an event type. // Shift: Represents a shift, which is a specific time period during a cart event where one or more publishers are required to work. A shift belongs to a cart event and can have a name, start and end time, and can require transport. // Assignment: Represents an assignment of a publisher to a specific shift. An assignment belongs to a shift and a publisher and can be tentative or final. // Location: Represents a location where a cart event can take place. A location can have a name, address, and multiple cart events. // Overall, this schema seems to represent a system for managing publishers and their assignments to cart events, including their availabilities and locations. datasource db { provider = "mysql" url = env("DATABASE_URL") } generator client { provider = "prisma-client-js" binaryTargets = ["native", "debian-openssl-3.0.x"] } // graphql schema generator // https://github.com/prisma-korea/graphql-schema-generator // generator graphql { // provider = "graphql-schema-generator" // createCRUD = "true" // // # output = "./generated" This is default path. // } enum UserRole { ADMIN POWERUSER USER EXTERNAL } enum EventType { PW_Cart KH_Cleaning } //prisma type for day of week for sqlite db enum DayOfWeek { Monday Tuesday Wednesday Thursday Friday Saturday Sunday } enum AvailabilityType { Weekly Monthly OneTime PreviousAssignment ReplacementOnly } // Вестител // Бетелит // Редовен Пионер // Специален Пионер/Мисионер enum PublisherType { Publisher Bethelite RegularPioneer SpecialPioneer_Missionary } enum ReportType { ServiceReport Experience Feedback_Problem Feedback_Suggestion Feedback } model Publisher { id String @id @default(cuid()) firstName String lastName String email String @unique phone String? isActive Boolean @default(true) isImported Boolean @default(false) isTrained Boolean @default(false) age Int? availabilities Availability[] assignments Assignment[] // Optional relation to User userId String? @unique user User? @relation(fields: [userId], references: [id]) role UserRole @default(USER) desiredShiftsPerMonth Int @default(4) isMale Boolean @default(true) isNameForeign Boolean @default(false) familyHeadId String? // Optional familyHeadId for each family member familyHead Publisher? @relation("FamilyMember", fields: [familyHeadId], references: [id]) familyMembers Publisher[] @relation("FamilyMember") alwaysAsFamily Boolean? @default(false) //NEW v1.0.1 // New field to indicate if the publisher always wants to be assigned with the family type PublisherType @default(Publisher) town String? comments String? reports Report[] Message Message[] } model Availability { id Int @id @default(autoincrement()) publisher Publisher @relation(fields: [publisherId], references: [id], onDelete: Cascade) publisherId String name String dayofweek DayOfWeek dayOfMonth Int? weekOfMonth Int? startTime DateTime endTime DateTime isActive Boolean @default(true) type AvailabilityType @default(Weekly) isWithTransportIn Boolean @default(false) isWithTransportOut Boolean @default(false) isFromPreviousAssignment Boolean @default(false) isFromPreviousMonth Boolean @default(false) repeatWeekly Boolean? // New field to indicate weekly repetition // until now dayofweek was used for repetition when dayOfMonth is null repeatFrequency Int? // New field to indicate repetition frequency endDate DateTime? // New field for the end date of repetition dateOfEntry DateTime? //NEW v1.0.1 parentAvailabilityId Int? parentAvailability Availability? @relation("ParentAvailability", fields: [parentAvailabilityId], references: [id]) ChildAvailabilities Availability[] @relation("ParentAvailability") } model CartEvent { id Int @id @default(autoincrement()) startTime DateTime endTime DateTime shiftDuration Int shifts Shift[] dayofweek DayOfWeek isActive Boolean @default(true) location Location @relation(fields: [locationId], references: [id]) locationId Int eventType EventType @default(PW_Cart) numberOfPublishers Int @default(3) @@map("CartEvent") } model Shift { id Int @id @default(autoincrement()) cartEvent CartEvent @relation(fields: [cartEventId], references: [id], onDelete: Cascade) cartEventId Int assignments Assignment[] name String startTime DateTime endTime DateTime isActive Boolean @default(true) requiresTransport Boolean @default(false) notes String? //date DateTime reportId Int? @unique Report Report? @relation(fields: [reportId], references: [id]) isPublished Boolean @default(false) //NEW v1.0.1 @@map("Shift") } model Assignment { id Int @id @default(autoincrement()) shift Shift @relation(fields: [shiftId], references: [id], onDelete: Cascade) shiftId Int publisher Publisher @relation(fields: [publisherId], references: [id], onDelete: Cascade) publisherId String isBySystem Boolean @default(false) // if no availability for it, when importing previous schedules isConfirmed Boolean @default(false) isWithTransport Boolean @default(false) isMailSent Boolean @default(false) publicGuid String? @unique @@map("Assignment") } model Location { id Int @id @default(autoincrement()) name String address String isActive Boolean @default(true) content String? @db.LongText cartEvents CartEvent[] reports Report[] picture1 String? picture2 String? picture3 String? backupLocationId Int? backupLocation Location? @relation("BackupLocation", fields: [backupLocationId], references: [id]) BackupForLocations Location[] @relation("BackupLocation") @@map("Location") } model Report { id Int @id @default(autoincrement()) date DateTime publisherId String publisher Publisher @relation(fields: [publisherId], references: [id], onDelete: Cascade) locationId Int? location Location? @relation(fields: [locationId], references: [id]) shift Shift? placementCount Int? videoCount Int? returnVisitInfoCount Int? conversationCount Int? experienceInfo String? @db.LongText type ReportType @default(ServiceReport) @@map("Report") } //message types enum MessageType { Email SMS Push InApp } model Message { id Int @id @default(autoincrement()) publisher Publisher @relation(fields: [publisherId], references: [id]) publisherId String date DateTime content String isRead Boolean @default(false) isPublic Boolean @default(false) type MessageType @default(Email) } //user auth and session management model User { id String @id @default(cuid()) name String? email String? @unique emailVerified DateTime? image String? accounts Account[] sessions Session[] // Optional relation to Publisher publisherId String? @unique publisher Publisher? @relation } model Account { id String @id @default(cuid()) userId String type String provider String providerAccountId String refresh_token String? access_token String? expires_at Int? token_type String? scope String? id_token String? session_state String? user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@unique([provider, providerAccountId]) } model Session { id String @id @default(cuid()) sessionToken String @unique userId String expires DateTime user User @relation(fields: [userId], references: [id], onDelete: Cascade) } model VerificationToken { identifier String token String @unique expires DateTime @@unique([identifier, token]) }