Files
lehuo/apps/api/prisma/schema.prisma
T

1257 lines
71 KiB
Plaintext

generator client {
provider = "prisma-client"
output = "../src/generated/prisma"
moduleFormat = "cjs"
importFileExtension = ""
}
datasource db {
provider = "mysql"
}
enum UserStatus {
ACTIVE
SUSPENDED
DISABLED
}
enum UserType {
PUBLIC
STAFF
}
enum StaffStatus {
ACTIVE
INACTIVE
}
enum SessionChannel {
WECHAT
ADMIN
}
enum AuditResult {
SUCCESS
FAILURE
}
enum ServiceCategory {
OLD_AGE
WOMEN
CHILD
DISABILITY
LIFE_DIFFICULTY
OTHER
}
enum ApplicationApplyMode {
SELF
FAMILY
COMMUNITY
VOLUNTEER
OTHER
}
enum ServiceApplicationStatus {
SUBMITTED
PENDING_CONTACT
ASSESSING
REJECTED
OUT_OF_SCOPE
REFERRED
ACCEPTED
SERVICE_PLANNED
IN_SERVICE
SERVICE_COMPLETED
FOLLOW_UP_PENDING
CLOSED
CANCELLED
SUSPENDED
}
enum ApplicationSource {
WECHAT_MINIPROGRAM
ADMIN
FOLLOW_UP
}
enum ConsentType {
SERVICE_APPLICATION
BENEFICIARY_GUARDIAN
VOLUNTEER_APPLICATION
}
enum ConsentGrantedBy {
SELF
APPLICANT
GUARDIAN
}
enum BeneficiaryGender {
FEMALE
MALE
OTHER
UNDISCLOSED
}
enum BeneficiaryStatus {
ACTIVE
INACTIVE
ARCHIVED
}
enum ServiceCasePriority {
LOW
NORMAL
HIGH
URGENT
}
enum ServiceCaseStatus {
ASSIGNED
IN_SERVICE
SERVICE_COMPLETED
SUSPENDED
CANCELLED
}
enum CaseAssigneeType {
STAFF
VOLUNTEER
}
enum CaseAssigneeRole {
OWNER
COLLABORATOR
}
enum ServiceRecordType {
HOME_VISIT
PHONE_CONTACT
ESCORT
MATERIAL_SUPPORT
ACTIVITY
OTHER
}
enum BeneficiaryConfirmStatus {
NOT_REQUESTED
CONFIRMED
PARTIALLY_CONFIRMED
DISPUTED
}
enum FileStatus {
UPLOAD_PENDING
AVAILABLE
QUARANTINED
DELETED
}
enum FileBusinessType {
SERVICE_RECORD
PROJECT_COVER
ACTIVITY_COVER
CONTENT_COVER
}
enum ContentPostType {
ORGANIZATION_INTRO
PUBLIC_WELFARE_NEWS
SERVICE_STORY
NOTICE
FAQ
}
enum ContentPostStatus {
DRAFT
PENDING_REVIEW
PUBLISHED
ARCHIVED
}
enum FinancialDisclosureStatus {
DRAFT
PUBLISHED
ARCHIVED
}
enum NotificationType {
APPLICATION_SUBMITTED
APPLICATION_ACCEPTED
SERVICE_ARRANGED
SERVICE_COMPLETED
FOLLOW_UP_PENDING
ACTIVITY_REGISTRATION_RESULT
}
enum NotificationChannel {
WECHAT_SUBSCRIPTION
}
enum NotificationDeliveryStatus {
PENDING
PROCESSING
SENT
FAILED
DEAD
}
enum VolunteerStatus {
APPLIED
APPROVED
REJECTED
SUSPENDED
INACTIVE
}
enum ProjectStatus {
DRAFT
PUBLISHED
COMPLETED
}
enum ActivityStatus {
DRAFT
PUBLISHED
REGISTRATION_CLOSED
IN_PROGRESS
COMPLETED
CANCELLED
}
enum ActivityRegistrationStatus {
PENDING
APPROVED
REJECTED
CANCELLED
}
enum ActivityCheckInStatus {
NOT_CHECKED_IN
CHECKED_IN
ABSENT
}
enum FollowUpType {
SERVICE_COMPLETION
KEY_CARE
MANUAL
}
enum FollowUpStatus {
PENDING
COMPLETED
CANCELLED
}
enum FollowUpResultCode {
SATISFIED
GENERALLY_SATISFIED
UNSATISFIED
NEED_MORE_HELP
UNREACHABLE
OTHER
}
enum FollowUpSource {
AUTO_SERVICE_COMPLETION
STAFF_MANUAL
KEY_CARE_PLAN
}
model User {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
publicId String @unique @map("public_id") @db.Char(36)
status UserStatus @default(ACTIVE)
userType UserType @map("user_type")
mobileEncrypted String? @map("mobile_encrypted") @db.VarChar(512)
mobileHash String? @unique @map("mobile_hash") @db.Char(64)
nickname String? @db.VarChar(100)
avatarUrl String? @map("avatar_url") @db.VarChar(512)
lastLoginAt DateTime? @map("last_login_at") @db.DateTime(3)
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
updatedAt DateTime @updatedAt @map("updated_at") @db.DateTime(3)
wechatIdentities WechatIdentity[]
staffProfile StaffProfile?
adminCredential AdminCredential?
sessions AuthSession[]
userRoles UserRole[]
auditLogs AuditLog[] @relation("AuditActor")
assignedRoles UserRole[] @relation("UserRoleAssigner")
serviceApplications ServiceApplication[] @relation("ApplicationApplicant")
applicationStatusChanges ServiceApplicationStatusHistory[] @relation("ApplicationStatusOperator")
consents Consent[]
createdBeneficiaries BeneficiaryProfile[] @relation("BeneficiaryCreator")
updatedBeneficiaries BeneficiaryProfile[] @relation("BeneficiaryUpdater")
ownedServiceCases ServiceCase[] @relation("CaseOwner")
createdServiceCases ServiceCase[] @relation("CaseCreator")
updatedServiceCases ServiceCase[] @relation("CaseUpdater")
caseAssignments CaseAssignee[]
caseStatusChanges ServiceCaseStatusHistory[] @relation("CaseStatusOperator")
createdServiceRecords ServiceRecord[] @relation("ServiceRecordCreator")
updatedServiceRecords ServiceRecord[] @relation("ServiceRecordUpdater")
uploadedFiles File[] @relation("FileUploader")
assignedBeneficiaryTags BeneficiaryTag[] @relation("BeneficiaryTagAssigner")
assignedCaseMembers CaseAssignee[] @relation("CaseAssigneeAssigner")
revisedServiceRecords ServiceRecordRevision[] @relation("ServiceRecordReviser")
ownedFollowUpTasks FollowUpTask[] @relation("FollowUpOwner")
createdFollowUpTasks FollowUpTask[] @relation("FollowUpCreator")
updatedFollowUpTasks FollowUpTask[] @relation("FollowUpUpdater")
followUpStatusChanges FollowUpStatusHistory[] @relation("FollowUpStatusOperator")
volunteerProfile Volunteer?
reviewedVolunteers Volunteer[] @relation("VolunteerReviewer")
createdVolunteers Volunteer[] @relation("VolunteerCreator")
updatedVolunteers Volunteer[] @relation("VolunteerUpdater")
volunteerStatusChanges VolunteerStatusHistory[] @relation("VolunteerStatusOperator")
managedProjects Project[] @relation("ProjectManager")
createdProjects Project[] @relation("ProjectCreator")
updatedProjects Project[] @relation("ProjectUpdater")
projectStatusChanges ProjectStatusHistory[] @relation("ProjectStatusOperator")
createdActivities Activity[] @relation("ActivityCreator")
updatedActivities Activity[] @relation("ActivityUpdater")
activityStatusChanges ActivityStatusHistory[] @relation("ActivityStatusOperator")
activityRegistrations ActivityRegistration[] @relation("ActivityRegistrationUser")
reviewedRegistrations ActivityRegistration[] @relation("RegistrationReviewer")
checkedInRegistrations ActivityRegistration[] @relation("RegistrationCheckInOperator")
recordedServiceMinutes ActivityRegistration[] @relation("RegistrationMinutesOperator")
registrationChanges ActivityRegistrationHistory[] @relation("RegistrationHistoryOperator")
createdContentPosts ContentPost[] @relation("ContentCreator")
updatedContentPosts ContentPost[] @relation("ContentUpdater")
reviewedContentPosts ContentPost[] @relation("ContentReviewer")
contentStatusChanges ContentPostStatusHistory[] @relation("ContentStatusOperator")
notifications Notification[]
notificationPreferences NotificationPreference[]
createdFinancialDisclosures FinancialDisclosure[] @relation("FinancialDisclosureCreator")
updatedFinancialDisclosures FinancialDisclosure[] @relation("FinancialDisclosureUpdater")
financialDisclosureStatusChanges FinancialDisclosureStatusHistory[] @relation("FinancialDisclosureStatusOperator")
@@map("users")
}
model WechatIdentity {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
userId BigInt @map("user_id") @db.UnsignedBigInt
appid String @db.VarChar(64)
openidCiphertext String @map("openid_ciphertext") @db.VarChar(512)
openidHash String @map("openid_hash") @db.Char(64)
unionidCiphertext String? @map("unionid_ciphertext") @db.VarChar(512)
unionidHash String? @map("unionid_hash") @db.Char(64)
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
updatedAt DateTime @updatedAt @map("updated_at") @db.DateTime(3)
user User @relation(fields: [userId], references: [id], onDelete: Restrict)
@@unique([appid, openidHash], map: "wechat_identities_appid_openid_hash_key")
@@index([userId], map: "wechat_identities_user_id_idx")
@@map("wechat_identities")
}
model StaffProfile {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
userId BigInt @unique @map("user_id") @db.UnsignedBigInt
employeeNo String? @unique @map("employee_no") @db.VarChar(50)
displayName String @map("display_name") @db.VarChar(100)
department String? @db.VarChar(100)
status StaffStatus @default(ACTIVE)
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
updatedAt DateTime @updatedAt @map("updated_at") @db.DateTime(3)
user User @relation(fields: [userId], references: [id], onDelete: Restrict)
@@map("staff_profiles")
}
model AdminCredential {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
userId BigInt @unique @map("user_id") @db.UnsignedBigInt
username String @unique @db.VarChar(64)
passwordHash String @map("password_hash") @db.VarChar(255)
failedLoginCount Int @default(0) @map("failed_login_count") @db.UnsignedInt
lockedUntil DateTime? @map("locked_until") @db.DateTime(3)
passwordChangedAt DateTime @default(now()) @map("password_changed_at") @db.DateTime(3)
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
updatedAt DateTime @updatedAt @map("updated_at") @db.DateTime(3)
user User @relation(fields: [userId], references: [id], onDelete: Restrict)
@@map("admin_credentials")
}
model AuthSession {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
publicId String @unique @map("public_id") @db.Char(36)
userId BigInt @map("user_id") @db.UnsignedBigInt
channel SessionChannel
tokenHash String @unique @map("token_hash") @db.Char(64)
expiresAt DateTime @map("expires_at") @db.DateTime(3)
lastUsedAt DateTime? @map("last_used_at") @db.DateTime(3)
revokedAt DateTime? @map("revoked_at") @db.DateTime(3)
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
user User @relation(fields: [userId], references: [id], onDelete: Restrict)
@@index([userId, channel, revokedAt, expiresAt], map: "auth_sessions_user_channel_status_idx")
@@index([expiresAt], map: "auth_sessions_expires_at_idx")
@@map("auth_sessions")
}
model Role {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
publicId String @unique @map("public_id") @db.Char(36)
code String @unique @db.VarChar(64)
name String @db.VarChar(100)
description String? @db.VarChar(255)
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
updatedAt DateTime @updatedAt @map("updated_at") @db.DateTime(3)
userRoles UserRole[]
rolePermissions RolePermission[]
@@map("roles")
}
model Permission {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
code String @unique @db.VarChar(100)
name String @db.VarChar(100)
description String? @db.VarChar(255)
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
rolePermissions RolePermission[]
@@map("permissions")
}
model UserRole {
userId BigInt @map("user_id") @db.UnsignedBigInt
roleId BigInt @map("role_id") @db.UnsignedBigInt
assignedBy BigInt? @map("assigned_by") @db.UnsignedBigInt
assignedAt DateTime @default(now()) @map("assigned_at") @db.DateTime(3)
user User @relation(fields: [userId], references: [id], onDelete: Restrict)
role Role @relation(fields: [roleId], references: [id], onDelete: Restrict)
assigner User? @relation("UserRoleAssigner", fields: [assignedBy], references: [id], onDelete: Restrict)
@@id([userId, roleId])
@@index([roleId], map: "user_roles_role_id_idx")
@@index([assignedBy], map: "user_roles_assigned_by_idx")
@@map("user_roles")
}
model RolePermission {
roleId BigInt @map("role_id") @db.UnsignedBigInt
permissionId BigInt @map("permission_id") @db.UnsignedBigInt
role Role @relation(fields: [roleId], references: [id], onDelete: Restrict)
permission Permission @relation(fields: [permissionId], references: [id], onDelete: Restrict)
@@id([roleId, permissionId])
@@index([permissionId], map: "role_permissions_permission_id_idx")
@@map("role_permissions")
}
model AuditLog {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
requestId String @map("request_id") @db.Char(36)
actorUserId BigInt? @map("actor_user_id") @db.UnsignedBigInt
actorRole String? @map("actor_role") @db.VarChar(64)
action String @db.VarChar(100)
resourceType String? @map("resource_type") @db.VarChar(100)
resourcePublicId String? @map("resource_public_id") @db.VarChar(100)
result AuditResult
metadataJson Json? @map("metadata_json")
ipHash String? @map("ip_hash") @db.Char(64)
userAgentSummary String? @map("user_agent_summary") @db.VarChar(255)
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
actor User? @relation("AuditActor", fields: [actorUserId], references: [id], onDelete: Restrict)
@@index([actorUserId, createdAt], map: "audit_logs_actor_created_at_idx")
@@index([resourceType, resourcePublicId, createdAt], map: "audit_logs_resource_created_at_idx")
@@index([action, createdAt], map: "audit_logs_action_created_at_idx")
@@map("audit_logs")
}
model Consent {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
publicId String @unique @map("public_id") @db.Char(36)
userId BigInt? @map("user_id") @db.UnsignedBigInt
beneficiaryId BigInt? @map("beneficiary_id") @db.UnsignedBigInt
consentType ConsentType @map("consent_type")
version String @db.VarChar(32)
grantedBy ConsentGrantedBy @map("granted_by")
grantedAt DateTime @map("granted_at") @db.DateTime(3)
revokedAt DateTime? @map("revoked_at") @db.DateTime(3)
evidenceJson Json? @map("evidence_json")
ipHash String? @map("ip_hash") @db.Char(64)
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
user User? @relation(fields: [userId], references: [id], onDelete: Restrict)
beneficiary BeneficiaryProfile? @relation(fields: [beneficiaryId], references: [id], onDelete: Restrict)
application ServiceApplication?
beneficiaryContact BeneficiaryContact?
volunteer Volunteer?
@@index([userId, consentType, grantedAt], map: "consents_user_type_granted_at_idx")
@@index([beneficiaryId, consentType, grantedAt], map: "consents_beneficiary_type_granted_at_idx")
@@map("consents")
}
model ServiceApplication {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
publicId String @unique @map("public_id") @db.Char(36)
applicationNo String @unique @map("application_no") @db.VarChar(32)
applicantUserId BigInt @map("applicant_user_id") @db.UnsignedBigInt
beneficiaryId BigInt? @map("beneficiary_id") @db.UnsignedBigInt
consentId BigInt @unique @map("consent_id") @db.UnsignedBigInt
sourceFollowUpTaskId BigInt? @unique @map("source_follow_up_task_id") @db.UnsignedBigInt
parentApplicationId BigInt? @map("parent_application_id") @db.UnsignedBigInt
clientRequestId String @map("client_request_id") @db.Char(36)
requestFingerprint String @map("request_fingerprint") @db.Char(64)
applyMode ApplicationApplyMode @map("apply_mode")
serviceCategory ServiceCategory @map("service_category")
beneficiaryNameEncrypted String @map("beneficiary_name_encrypted") @db.VarChar(512)
contactMobileEncrypted String @map("contact_mobile_encrypted") @db.VarChar(512)
contactMobileHash String @map("contact_mobile_hash") @db.Char(64)
regionCode String @map("region_code") @db.VarChar(100)
descriptionEncrypted String @map("description_encrypted") @db.Text
preferredContactTime String? @map("preferred_contact_time") @db.VarChar(100)
needsHomeVisit Boolean? @map("needs_home_visit")
mobilityDifficulty Boolean? @map("mobility_difficulty")
status ServiceApplicationStatus @default(SUBMITTED)
source ApplicationSource @default(WECHAT_MINIPROGRAM)
submittedAt DateTime @map("submitted_at") @db.DateTime(3)
acceptedAt DateTime? @map("accepted_at") @db.DateTime(3)
closedAt DateTime? @map("closed_at") @db.DateTime(3)
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
updatedAt DateTime @updatedAt @map("updated_at") @db.DateTime(3)
applicant User @relation("ApplicationApplicant", fields: [applicantUserId], references: [id], onDelete: Restrict)
beneficiary BeneficiaryProfile? @relation(fields: [beneficiaryId], references: [id], onDelete: Restrict)
consent Consent @relation(fields: [consentId], references: [id], onDelete: Restrict)
statusHistory ServiceApplicationStatusHistory[]
serviceCase ServiceCase?
sourceFollowUpTask FollowUpTask? @relation("FollowUpContinuedApplication", fields: [sourceFollowUpTaskId], references: [id], onDelete: Restrict)
parentApplication ServiceApplication? @relation("ContinuedApplications", fields: [parentApplicationId], references: [id], onDelete: Restrict)
continuedApplications ServiceApplication[] @relation("ContinuedApplications")
@@unique([applicantUserId, clientRequestId], map: "service_applications_applicant_client_request_key")
@@index([applicantUserId, submittedAt], map: "service_applications_applicant_submitted_at_idx")
@@index([status, submittedAt], map: "service_applications_status_submitted_at_idx")
@@index([serviceCategory, submittedAt], map: "service_applications_category_submitted_at_idx")
@@index([contactMobileHash], map: "service_applications_contact_mobile_hash_idx")
@@index([beneficiaryId, submittedAt], map: "service_applications_beneficiary_submitted_at_idx")
@@index([parentApplicationId, submittedAt], map: "service_applications_parent_submitted_at_idx")
@@map("service_applications")
}
model ServiceApplicationStatusHistory {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
applicationId BigInt @map("application_id") @db.UnsignedBigInt
fromStatus ServiceApplicationStatus? @map("from_status")
toStatus ServiceApplicationStatus @map("to_status")
operatorUserId BigInt @map("operator_user_id") @db.UnsignedBigInt
reasonCode String @map("reason_code") @db.VarChar(100)
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
application ServiceApplication @relation(fields: [applicationId], references: [id], onDelete: Restrict)
operator User @relation("ApplicationStatusOperator", fields: [operatorUserId], references: [id], onDelete: Restrict)
@@index([applicationId, createdAt], map: "application_status_history_application_created_at_idx")
@@index([operatorUserId, createdAt], map: "application_status_history_operator_created_at_idx")
@@map("service_application_status_history")
}
model BeneficiaryProfile {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
publicId String @unique @map("public_id") @db.Char(36)
displayNameEncrypted String @map("display_name_encrypted") @db.VarChar(512)
displayNameHash String @map("display_name_hash") @db.Char(64)
gender BeneficiaryGender?
birthYear Int? @map("birth_year") @db.UnsignedSmallInt
mobileEncrypted String? @map("mobile_encrypted") @db.VarChar(512)
mobileHash String? @map("mobile_hash") @db.Char(64)
regionCode String @map("region_code") @db.VarChar(100)
addressDetailEncrypted String? @map("address_detail_encrypted") @db.VarChar(1024)
primaryCategory ServiceCategory @map("primary_category")
keyCareFlag Boolean @default(false) @map("key_care_flag")
isMinor Boolean @default(false) @map("is_minor")
status BeneficiaryStatus @default(ACTIVE)
notesEncrypted String? @map("notes_encrypted") @db.Text
createdById BigInt @map("created_by") @db.UnsignedBigInt
updatedById BigInt @map("updated_by") @db.UnsignedBigInt
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
updatedAt DateTime @updatedAt @map("updated_at") @db.DateTime(3)
creator User @relation("BeneficiaryCreator", fields: [createdById], references: [id], onDelete: Restrict)
updater User @relation("BeneficiaryUpdater", fields: [updatedById], references: [id], onDelete: Restrict)
contacts BeneficiaryContact[]
beneficiaryTags BeneficiaryTag[]
applications ServiceApplication[]
serviceCases ServiceCase[]
serviceRecords ServiceRecord[]
consents Consent[]
followUpTasks FollowUpTask[]
@@index([displayNameHash], map: "beneficiary_profiles_display_name_hash_idx")
@@index([mobileHash], map: "beneficiary_profiles_mobile_hash_idx")
@@index([primaryCategory, status, createdAt], map: "beneficiary_profiles_category_status_created_at_idx")
@@index([keyCareFlag, status, createdAt], map: "beneficiary_profiles_key_care_status_created_at_idx")
@@map("beneficiary_profiles")
}
model BeneficiaryContact {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
publicId String @unique @map("public_id") @db.Char(36)
beneficiaryId BigInt @map("beneficiary_id") @db.UnsignedBigInt
nameEncrypted String @map("name_encrypted") @db.VarChar(512)
relation String @db.VarChar(50)
mobileEncrypted String @map("mobile_encrypted") @db.VarChar(512)
mobileHash String @map("mobile_hash") @db.Char(64)
isGuardian Boolean @default(false) @map("is_guardian")
isEmergencyContact Boolean @default(false) @map("is_emergency_contact")
consentRecordId BigInt? @unique @map("consent_record_id") @db.UnsignedBigInt
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
updatedAt DateTime @updatedAt @map("updated_at") @db.DateTime(3)
removedAt DateTime? @map("removed_at") @db.DateTime(3)
beneficiary BeneficiaryProfile @relation(fields: [beneficiaryId], references: [id], onDelete: Restrict)
consentRecord Consent? @relation(fields: [consentRecordId], references: [id], onDelete: Restrict)
@@index([beneficiaryId, removedAt, isGuardian], map: "beneficiary_contacts_beneficiary_active_guardian_idx")
@@index([mobileHash], map: "beneficiary_contacts_mobile_hash_idx")
@@map("beneficiary_contacts")
}
model Tag {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
publicId String @unique @map("public_id") @db.Char(36)
code String @unique @db.VarChar(64)
name String @db.VarChar(50)
description String? @db.VarChar(255)
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
beneficiaryTags BeneficiaryTag[]
@@map("tags")
}
model BeneficiaryTag {
beneficiaryId BigInt @map("beneficiary_id") @db.UnsignedBigInt
tagId BigInt @map("tag_id") @db.UnsignedBigInt
assignedById BigInt @map("assigned_by") @db.UnsignedBigInt
assignedAt DateTime @default(now()) @map("assigned_at") @db.DateTime(3)
beneficiary BeneficiaryProfile @relation(fields: [beneficiaryId], references: [id], onDelete: Restrict)
tag Tag @relation(fields: [tagId], references: [id], onDelete: Restrict)
assigner User @relation("BeneficiaryTagAssigner", fields: [assignedById], references: [id], onDelete: Restrict)
@@id([beneficiaryId, tagId])
@@index([tagId], map: "beneficiary_tags_tag_id_idx")
@@map("beneficiary_tags")
}
model ServiceCase {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
publicId String @unique @map("public_id") @db.Char(36)
caseNo String @unique @map("case_no") @db.VarChar(32)
applicationId BigInt @unique @map("application_id") @db.UnsignedBigInt
acceptRequestId String @map("accept_request_id") @db.Char(36)
acceptRequestFingerprint String @map("accept_request_fingerprint") @db.Char(64)
beneficiaryId BigInt @map("beneficiary_id") @db.UnsignedBigInt
projectId BigInt? @map("project_id") @db.UnsignedBigInt
ownerStaffId BigInt @map("owner_staff_id") @db.UnsignedBigInt
category ServiceCategory
priority ServiceCasePriority @default(NORMAL)
status ServiceCaseStatus @default(ASSIGNED)
plannedStartAt DateTime? @map("planned_start_at") @db.DateTime(3)
plannedEndAt DateTime? @map("planned_end_at") @db.DateTime(3)
serviceLocationEncrypted String? @map("service_location_encrypted") @db.VarChar(1024)
summaryEncrypted String @map("summary_encrypted") @db.Text
resultSummaryEncrypted String? @map("result_summary_encrypted") @db.Text
followUpPlanEncrypted String? @map("follow_up_plan_encrypted") @db.Text
completedAt DateTime? @map("completed_at") @db.DateTime(3)
completeRequestId String? @unique @map("complete_request_id") @db.Char(36)
completeRequestFingerprint String? @map("complete_request_fingerprint") @db.Char(64)
createdById BigInt @map("created_by") @db.UnsignedBigInt
updatedById BigInt @map("updated_by") @db.UnsignedBigInt
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
updatedAt DateTime @updatedAt @map("updated_at") @db.DateTime(3)
application ServiceApplication @relation(fields: [applicationId], references: [id], onDelete: Restrict)
beneficiary BeneficiaryProfile @relation(fields: [beneficiaryId], references: [id], onDelete: Restrict)
project Project? @relation(fields: [projectId], references: [id], onDelete: Restrict)
owner User @relation("CaseOwner", fields: [ownerStaffId], references: [id], onDelete: Restrict)
creator User @relation("CaseCreator", fields: [createdById], references: [id], onDelete: Restrict)
updater User @relation("CaseUpdater", fields: [updatedById], references: [id], onDelete: Restrict)
assignees CaseAssignee[]
statusHistory ServiceCaseStatusHistory[]
serviceRecords ServiceRecord[]
files File[]
followUpTasks FollowUpTask[]
@@unique([createdById, acceptRequestId], map: "service_cases_creator_accept_request_key")
@@index([ownerStaffId, status, plannedStartAt], map: "service_cases_owner_status_planned_idx")
@@index([beneficiaryId, createdAt], map: "service_cases_beneficiary_created_at_idx")
@@index([projectId, createdAt], map: "service_cases_project_created_at_idx")
@@index([status, createdAt], map: "service_cases_status_created_at_idx")
@@map("service_cases")
}
model CaseAssignee {
caseId BigInt @map("case_id") @db.UnsignedBigInt
userId BigInt @map("user_id") @db.UnsignedBigInt
assigneeType CaseAssigneeType @map("assignee_type")
role CaseAssigneeRole
assignedById BigInt @map("assigned_by") @db.UnsignedBigInt
assignedAt DateTime @default(now()) @map("assigned_at") @db.DateTime(3)
removedAt DateTime? @map("removed_at") @db.DateTime(3)
serviceCase ServiceCase @relation(fields: [caseId], references: [id], onDelete: Restrict)
user User @relation(fields: [userId], references: [id], onDelete: Restrict)
assigner User @relation("CaseAssigneeAssigner", fields: [assignedById], references: [id], onDelete: Restrict)
@@id([caseId, userId])
@@index([userId, removedAt, assignedAt], map: "case_assignees_user_active_assigned_idx")
@@map("case_assignees")
}
model ServiceCaseStatusHistory {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
caseId BigInt @map("case_id") @db.UnsignedBigInt
fromStatus ServiceCaseStatus? @map("from_status")
toStatus ServiceCaseStatus @map("to_status")
operatorUserId BigInt @map("operator_user_id") @db.UnsignedBigInt
reasonCode String @map("reason_code") @db.VarChar(100)
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
serviceCase ServiceCase @relation(fields: [caseId], references: [id], onDelete: Restrict)
operator User @relation("CaseStatusOperator", fields: [operatorUserId], references: [id], onDelete: Restrict)
@@index([caseId, createdAt], map: "case_status_history_case_created_at_idx")
@@index([operatorUserId, createdAt], map: "case_status_history_operator_created_at_idx")
@@map("service_case_status_history")
}
model ServiceRecord {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
publicId String @unique @map("public_id") @db.Char(36)
caseId BigInt @map("case_id") @db.UnsignedBigInt
beneficiaryId BigInt @map("beneficiary_id") @db.UnsignedBigInt
clientRequestId String @map("client_request_id") @db.Char(36)
requestFingerprint String @map("request_fingerprint") @db.Char(64)
serviceStartAt DateTime @map("service_start_at") @db.DateTime(3)
serviceEndAt DateTime? @map("service_end_at") @db.DateTime(3)
serviceType ServiceRecordType @map("service_type")
contentEncrypted String @map("content_encrypted") @db.Text
resultEncrypted String @map("result_encrypted") @db.Text
followUpSuggestionEncrypted String? @map("follow_up_suggestion_encrypted") @db.Text
beneficiaryConfirmStatus BeneficiaryConfirmStatus @default(NOT_REQUESTED) @map("beneficiary_confirm_status")
createdById BigInt @map("created_by") @db.UnsignedBigInt
updatedById BigInt @map("updated_by") @db.UnsignedBigInt
revision Int @default(1) @db.UnsignedInt
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
updatedAt DateTime @updatedAt @map("updated_at") @db.DateTime(3)
serviceCase ServiceCase @relation(fields: [caseId], references: [id], onDelete: Restrict)
beneficiary BeneficiaryProfile @relation(fields: [beneficiaryId], references: [id], onDelete: Restrict)
creator User @relation("ServiceRecordCreator", fields: [createdById], references: [id], onDelete: Restrict)
updater User @relation("ServiceRecordUpdater", fields: [updatedById], references: [id], onDelete: Restrict)
attachments ServiceRecordFile[]
revisions ServiceRecordRevision[]
@@unique([createdById, clientRequestId], map: "service_records_creator_client_request_key")
@@index([caseId, serviceStartAt], map: "service_records_case_start_at_idx")
@@index([beneficiaryId, serviceStartAt], map: "service_records_beneficiary_start_at_idx")
@@map("service_records")
}
model ServiceRecordRevision {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
serviceRecordId BigInt @map("service_record_id") @db.UnsignedBigInt
revision Int @db.UnsignedInt
serviceStartAt DateTime @map("service_start_at") @db.DateTime(3)
serviceEndAt DateTime? @map("service_end_at") @db.DateTime(3)
serviceType ServiceRecordType @map("service_type")
contentEncrypted String @map("content_encrypted") @db.Text
resultEncrypted String @map("result_encrypted") @db.Text
followUpSuggestionEncrypted String? @map("follow_up_suggestion_encrypted") @db.Text
beneficiaryConfirmStatus BeneficiaryConfirmStatus @map("beneficiary_confirm_status")
revisedById BigInt @map("revised_by") @db.UnsignedBigInt
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
serviceRecord ServiceRecord @relation(fields: [serviceRecordId], references: [id], onDelete: Restrict)
reviser User @relation("ServiceRecordReviser", fields: [revisedById], references: [id], onDelete: Restrict)
@@unique([serviceRecordId, revision], map: "service_record_revisions_record_revision_key")
@@index([revisedById, createdAt], map: "service_record_revisions_reviser_created_at_idx")
@@map("service_record_revisions")
}
model File {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
publicId String @unique @map("public_id") @db.Char(36)
caseId BigInt? @map("case_id") @db.UnsignedBigInt
clientRequestId String @map("client_request_id") @db.Char(36)
requestFingerprint String @map("request_fingerprint") @db.Char(64)
storageProvider String @map("storage_provider") @db.VarChar(50)
bucket String @db.VarChar(255)
objectKey String @unique @map("object_key") @db.VarChar(512)
originalFilenameEncrypted String @map("original_filename_encrypted") @db.VarChar(1024)
mimeType String @map("mime_type") @db.VarChar(100)
size BigInt @db.UnsignedBigInt
sha256 String? @db.Char(64)
businessType FileBusinessType @map("business_type")
uploaderUserId BigInt @map("uploader_user_id") @db.UnsignedBigInt
status FileStatus @default(UPLOAD_PENDING)
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
updatedAt DateTime @updatedAt @map("updated_at") @db.DateTime(3)
serviceCase ServiceCase? @relation(fields: [caseId], references: [id], onDelete: Restrict)
uploader User @relation("FileUploader", fields: [uploaderUserId], references: [id], onDelete: Restrict)
serviceRecords ServiceRecordFile[]
projectCover Project? @relation("ProjectCover")
activityCover Activity? @relation("ActivityCover")
contentCover ContentPost? @relation("ContentCover")
@@unique([uploaderUserId, clientRequestId], map: "files_uploader_client_request_key")
@@index([caseId, status, createdAt], map: "files_case_status_created_at_idx")
@@index([uploaderUserId, status, createdAt], map: "files_uploader_status_created_at_idx")
@@map("files")
}
model ServiceRecordFile {
serviceRecordId BigInt @map("service_record_id") @db.UnsignedBigInt
fileId BigInt @map("file_id") @db.UnsignedBigInt
attachedAt DateTime @default(now()) @map("attached_at") @db.DateTime(3)
serviceRecord ServiceRecord @relation(fields: [serviceRecordId], references: [id], onDelete: Restrict)
file File @relation(fields: [fileId], references: [id], onDelete: Restrict)
@@id([serviceRecordId, fileId])
@@index([fileId], map: "service_record_files_file_id_idx")
@@map("service_record_files")
}
model FollowUpTask {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
publicId String @unique @map("public_id") @db.Char(36)
followUpNo String @unique @map("follow_up_no") @db.VarChar(32)
beneficiaryId BigInt @map("beneficiary_id") @db.UnsignedBigInt
caseId BigInt? @map("case_id") @db.UnsignedBigInt
ownerStaffId BigInt @map("owner_staff_id") @db.UnsignedBigInt
dueAt DateTime @map("due_at") @db.DateTime(3)
followUpType FollowUpType @map("follow_up_type")
status FollowUpStatus @default(PENDING)
source FollowUpSource
reasonEncrypted String @map("reason_encrypted") @db.Text
resultCode FollowUpResultCode? @map("result_code")
resultNoteEncrypted String? @map("result_note_encrypted") @db.Text
createRequestId String @map("create_request_id") @db.Char(36)
createRequestFingerprint String @map("create_request_fingerprint") @db.Char(64)
completeRequestId String? @map("complete_request_id") @db.Char(36)
completeRequestFingerprint String? @map("complete_request_fingerprint") @db.Char(64)
completedAt DateTime? @map("completed_at") @db.DateTime(3)
createdById BigInt @map("created_by") @db.UnsignedBigInt
updatedById BigInt @map("updated_by") @db.UnsignedBigInt
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
updatedAt DateTime @updatedAt @map("updated_at") @db.DateTime(3)
beneficiary BeneficiaryProfile @relation(fields: [beneficiaryId], references: [id], onDelete: Restrict)
serviceCase ServiceCase? @relation(fields: [caseId], references: [id], onDelete: Restrict)
owner User @relation("FollowUpOwner", fields: [ownerStaffId], references: [id], onDelete: Restrict)
creator User @relation("FollowUpCreator", fields: [createdById], references: [id], onDelete: Restrict)
updater User @relation("FollowUpUpdater", fields: [updatedById], references: [id], onDelete: Restrict)
statusHistory FollowUpStatusHistory[]
continuedApplication ServiceApplication? @relation("FollowUpContinuedApplication")
@@unique([createdById, createRequestId], map: "follow_up_tasks_creator_request_key")
@@index([ownerStaffId, status, dueAt], map: "follow_up_tasks_owner_status_due_at_idx")
@@index([status, dueAt], map: "follow_up_tasks_status_due_at_idx")
@@index([beneficiaryId, dueAt], map: "follow_up_tasks_beneficiary_due_at_idx")
@@index([caseId, createdAt], map: "follow_up_tasks_case_created_at_idx")
@@map("follow_up_tasks")
}
model FollowUpStatusHistory {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
followUpTaskId BigInt @map("follow_up_task_id") @db.UnsignedBigInt
fromStatus FollowUpStatus? @map("from_status")
toStatus FollowUpStatus @map("to_status")
operatorUserId BigInt @map("operator_user_id") @db.UnsignedBigInt
reasonCode String @map("reason_code") @db.VarChar(100)
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
followUpTask FollowUpTask @relation(fields: [followUpTaskId], references: [id], onDelete: Restrict)
operator User @relation("FollowUpStatusOperator", fields: [operatorUserId], references: [id], onDelete: Restrict)
@@index([followUpTaskId, createdAt], map: "follow_up_status_history_task_created_at_idx")
@@index([operatorUserId, createdAt], map: "follow_up_status_history_operator_created_at_idx")
@@map("follow_up_status_history")
}
model Volunteer {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
publicId String @unique @map("public_id") @db.Char(36)
userId BigInt @unique @map("user_id") @db.UnsignedBigInt
consentId BigInt @unique @map("consent_id") @db.UnsignedBigInt
realNameEncrypted String @map("real_name_encrypted") @db.VarChar(512)
realNameHash String @map("real_name_hash") @db.Char(64)
mobileEncrypted String @map("mobile_encrypted") @db.VarChar(512)
mobileHash String @map("mobile_hash") @db.Char(64)
regionCode String @map("region_code") @db.VarChar(100)
availabilityNoteEncrypted String @map("availability_note_encrypted") @db.Text
status VolunteerStatus @default(APPLIED)
approvedById BigInt? @map("approved_by") @db.UnsignedBigInt
approvedAt DateTime? @map("approved_at") @db.DateTime(3)
revision Int @default(1) @db.UnsignedInt
createdById BigInt @map("created_by") @db.UnsignedBigInt
updatedById BigInt @map("updated_by") @db.UnsignedBigInt
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
updatedAt DateTime @updatedAt @map("updated_at") @db.DateTime(3)
user User @relation(fields: [userId], references: [id], onDelete: Restrict)
consent Consent @relation(fields: [consentId], references: [id], onDelete: Restrict)
reviewer User? @relation("VolunteerReviewer", fields: [approvedById], references: [id], onDelete: Restrict)
creator User @relation("VolunteerCreator", fields: [createdById], references: [id], onDelete: Restrict)
updater User @relation("VolunteerUpdater", fields: [updatedById], references: [id], onDelete: Restrict)
skills VolunteerSkill[]
interests VolunteerInterest[]
statusHistory VolunteerStatusHistory[]
registrations ActivityRegistration[]
@@index([status, createdAt], map: "volunteers_status_created_at_idx")
@@index([mobileHash], map: "volunteers_mobile_hash_idx")
@@index([regionCode, status], map: "volunteers_region_status_idx")
@@map("volunteers")
}
model VolunteerSkill {
volunteerId BigInt @map("volunteer_id") @db.UnsignedBigInt
skillCode String @map("skill_code") @db.VarChar(64)
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
volunteer Volunteer @relation(fields: [volunteerId], references: [id], onDelete: Restrict)
@@id([volunteerId, skillCode])
@@index([skillCode], map: "volunteer_skills_code_idx")
@@map("volunteer_skills")
}
model VolunteerInterest {
volunteerId BigInt @map("volunteer_id") @db.UnsignedBigInt
category ServiceCategory
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
volunteer Volunteer @relation(fields: [volunteerId], references: [id], onDelete: Restrict)
@@id([volunteerId, category])
@@index([category], map: "volunteer_interests_category_idx")
@@map("volunteer_interests")
}
model VolunteerStatusHistory {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
volunteerId BigInt @map("volunteer_id") @db.UnsignedBigInt
requestId String @unique @map("request_id") @db.Char(36)
requestFingerprint String @map("request_fingerprint") @db.Char(64)
fromStatus VolunteerStatus? @map("from_status")
toStatus VolunteerStatus @map("to_status")
operatorUserId BigInt @map("operator_user_id") @db.UnsignedBigInt
reasonCode String @map("reason_code") @db.VarChar(100)
noteEncrypted String? @map("note_encrypted") @db.Text
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
volunteer Volunteer @relation(fields: [volunteerId], references: [id], onDelete: Restrict)
operator User @relation("VolunteerStatusOperator", fields: [operatorUserId], references: [id], onDelete: Restrict)
@@index([volunteerId, createdAt], map: "volunteer_status_history_volunteer_created_at_idx")
@@index([operatorUserId, createdAt], map: "volunteer_status_history_operator_created_at_idx")
@@map("volunteer_status_history")
}
model Project {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
publicId String @unique @map("public_id") @db.Char(36)
projectNo String @unique @map("project_no") @db.VarChar(32)
clientRequestId String @map("client_request_id") @db.Char(36)
requestFingerprint String @map("request_fingerprint") @db.Char(64)
name String @db.VarChar(200)
category ServiceCategory
summary String @db.VarChar(500)
content String @db.Text
coverFileId BigInt? @unique @map("cover_file_id") @db.UnsignedBigInt
managerUserId BigInt @map("manager_user_id") @db.UnsignedBigInt
startDate DateTime @map("start_date") @db.Date
endDate DateTime @map("end_date") @db.Date
targetPeople Int? @map("target_people") @db.UnsignedInt
status ProjectStatus @default(DRAFT)
isPublic Boolean @default(false) @map("is_public")
sortOrder Int @default(0) @map("sort_order")
revision Int @default(1) @db.UnsignedInt
createdById BigInt @map("created_by") @db.UnsignedBigInt
updatedById BigInt @map("updated_by") @db.UnsignedBigInt
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
updatedAt DateTime @updatedAt @map("updated_at") @db.DateTime(3)
coverFile File? @relation("ProjectCover", fields: [coverFileId], references: [id], onDelete: Restrict)
manager User @relation("ProjectManager", fields: [managerUserId], references: [id], onDelete: Restrict)
creator User @relation("ProjectCreator", fields: [createdById], references: [id], onDelete: Restrict)
updater User @relation("ProjectUpdater", fields: [updatedById], references: [id], onDelete: Restrict)
statusHistory ProjectStatusHistory[]
activities Activity[]
serviceCases ServiceCase[]
@@unique([createdById, clientRequestId], map: "projects_creator_request_key")
@@index([status, isPublic, sortOrder, createdAt], map: "projects_public_status_sort_idx")
@@index([managerUserId, status, createdAt], map: "projects_manager_status_idx")
@@map("projects")
}
model ProjectStatusHistory {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
projectId BigInt @map("project_id") @db.UnsignedBigInt
requestId String @unique @map("request_id") @db.Char(36)
requestFingerprint String @map("request_fingerprint") @db.Char(64)
fromStatus ProjectStatus? @map("from_status")
toStatus ProjectStatus @map("to_status")
operatorUserId BigInt @map("operator_user_id") @db.UnsignedBigInt
reasonCode String @map("reason_code") @db.VarChar(100)
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
project Project @relation(fields: [projectId], references: [id], onDelete: Restrict)
operator User @relation("ProjectStatusOperator", fields: [operatorUserId], references: [id], onDelete: Restrict)
@@index([projectId, createdAt], map: "project_status_history_project_created_at_idx")
@@map("project_status_history")
}
model Activity {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
publicId String @unique @map("public_id") @db.Char(36)
activityNo String @unique @map("activity_no") @db.VarChar(32)
projectId BigInt? @map("project_id") @db.UnsignedBigInt
clientRequestId String @map("client_request_id") @db.Char(36)
requestFingerprint String @map("request_fingerprint") @db.Char(64)
title String @db.VarChar(200)
summary String @db.VarChar(500)
content String @db.Text
coverFileId BigInt? @unique @map("cover_file_id") @db.UnsignedBigInt
startAt DateTime @map("start_at") @db.DateTime(3)
endAt DateTime @map("end_at") @db.DateTime(3)
registrationDeadline DateTime @map("registration_deadline") @db.DateTime(3)
locationText String @map("location_text") @db.VarChar(300)
capacity Int? @db.UnsignedInt
status ActivityStatus @default(DRAFT)
publishedAt DateTime? @map("published_at") @db.DateTime(3)
revision Int @default(1) @db.UnsignedInt
createdById BigInt @map("created_by") @db.UnsignedBigInt
updatedById BigInt @map("updated_by") @db.UnsignedBigInt
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
updatedAt DateTime @updatedAt @map("updated_at") @db.DateTime(3)
project Project? @relation(fields: [projectId], references: [id], onDelete: Restrict)
coverFile File? @relation("ActivityCover", fields: [coverFileId], references: [id], onDelete: Restrict)
creator User @relation("ActivityCreator", fields: [createdById], references: [id], onDelete: Restrict)
updater User @relation("ActivityUpdater", fields: [updatedById], references: [id], onDelete: Restrict)
statusHistory ActivityStatusHistory[]
registrations ActivityRegistration[]
@@unique([createdById, clientRequestId], map: "activities_creator_request_key")
@@index([status, startAt], map: "activities_status_start_at_idx")
@@index([projectId, startAt], map: "activities_project_start_at_idx")
@@map("activities")
}
model ActivityStatusHistory {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
activityId BigInt @map("activity_id") @db.UnsignedBigInt
requestId String @unique @map("request_id") @db.Char(36)
requestFingerprint String @map("request_fingerprint") @db.Char(64)
fromStatus ActivityStatus? @map("from_status")
toStatus ActivityStatus @map("to_status")
operatorUserId BigInt @map("operator_user_id") @db.UnsignedBigInt
reasonCode String @map("reason_code") @db.VarChar(100)
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
activity Activity @relation(fields: [activityId], references: [id], onDelete: Restrict)
operator User @relation("ActivityStatusOperator", fields: [operatorUserId], references: [id], onDelete: Restrict)
@@index([activityId, createdAt], map: "activity_status_history_activity_created_at_idx")
@@map("activity_status_history")
}
model ActivityRegistration {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
publicId String @unique @map("public_id") @db.Char(36)
activityId BigInt @map("activity_id") @db.UnsignedBigInt
userId BigInt @map("user_id") @db.UnsignedBigInt
volunteerId BigInt @map("volunteer_id") @db.UnsignedBigInt
clientRequestId String @map("client_request_id") @db.Char(36)
requestFingerprint String @map("request_fingerprint") @db.Char(64)
status ActivityRegistrationStatus @default(PENDING)
checkInStatus ActivityCheckInStatus @default(NOT_CHECKED_IN) @map("check_in_status")
registeredAt DateTime @default(now()) @map("registered_at") @db.DateTime(3)
reviewedById BigInt? @map("reviewed_by") @db.UnsignedBigInt
reviewedAt DateTime? @map("reviewed_at") @db.DateTime(3)
reviewNoteEncrypted String? @map("review_note_encrypted") @db.Text
checkedInAt DateTime? @map("checked_in_at") @db.DateTime(3)
checkedInById BigInt? @map("checked_in_by") @db.UnsignedBigInt
serviceMinutes Int? @map("service_minutes") @db.UnsignedInt
serviceMinutesRecordedAt DateTime? @map("service_minutes_recorded_at") @db.DateTime(3)
serviceMinutesRecordedById BigInt? @map("service_minutes_recorded_by") @db.UnsignedBigInt
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
updatedAt DateTime @updatedAt @map("updated_at") @db.DateTime(3)
activity Activity @relation(fields: [activityId], references: [id], onDelete: Restrict)
user User @relation("ActivityRegistrationUser", fields: [userId], references: [id], onDelete: Restrict)
volunteer Volunteer @relation(fields: [volunteerId], references: [id], onDelete: Restrict)
reviewer User? @relation("RegistrationReviewer", fields: [reviewedById], references: [id], onDelete: Restrict)
checkInOperator User? @relation("RegistrationCheckInOperator", fields: [checkedInById], references: [id], onDelete: Restrict)
serviceMinutesOperator User? @relation("RegistrationMinutesOperator", fields: [serviceMinutesRecordedById], references: [id], onDelete: Restrict)
history ActivityRegistrationHistory[]
@@unique([activityId, userId], map: "activity_registrations_activity_user_key")
@@unique([userId, clientRequestId], map: "activity_registrations_user_request_key")
@@index([activityId, status, registeredAt], map: "activity_registrations_activity_status_idx")
@@index([volunteerId, registeredAt], map: "activity_registrations_volunteer_registered_idx")
@@map("activity_registrations")
}
model ActivityRegistrationHistory {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
registrationId BigInt @map("registration_id") @db.UnsignedBigInt
requestId String @unique @map("request_id") @db.Char(36)
requestFingerprint String @map("request_fingerprint") @db.Char(64)
fromStatus ActivityRegistrationStatus? @map("from_status")
toStatus ActivityRegistrationStatus? @map("to_status")
fromCheckInStatus ActivityCheckInStatus? @map("from_check_in_status")
toCheckInStatus ActivityCheckInStatus? @map("to_check_in_status")
serviceMinutesBefore Int? @map("service_minutes_before") @db.UnsignedInt
serviceMinutesAfter Int? @map("service_minutes_after") @db.UnsignedInt
operatorUserId BigInt @map("operator_user_id") @db.UnsignedBigInt
actionCode String @map("action_code") @db.VarChar(100)
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
registration ActivityRegistration @relation(fields: [registrationId], references: [id], onDelete: Restrict)
operator User @relation("RegistrationHistoryOperator", fields: [operatorUserId], references: [id], onDelete: Restrict)
@@index([registrationId, createdAt], map: "registration_history_registration_created_at_idx")
@@map("activity_registration_history")
}
model ContentPost {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
publicId String @unique @map("public_id") @db.Char(36)
clientRequestId String @map("client_request_id") @db.Char(36)
requestFingerprint String @map("request_fingerprint") @db.Char(64)
type ContentPostType
title String @db.VarChar(200)
summary String @db.VarChar(500)
content String @db.Text
coverFileId BigInt? @unique @map("cover_file_id") @db.UnsignedBigInt
status ContentPostStatus @default(DRAFT)
revision Int @default(1) @db.UnsignedInt
privacyReviewedAt DateTime? @map("privacy_reviewed_at") @db.DateTime(3)
reviewedById BigInt? @map("reviewed_by") @db.UnsignedBigInt
reviewedAt DateTime? @map("reviewed_at") @db.DateTime(3)
publishedAt DateTime? @map("published_at") @db.DateTime(3)
createdById BigInt @map("created_by") @db.UnsignedBigInt
updatedById BigInt @map("updated_by") @db.UnsignedBigInt
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
updatedAt DateTime @updatedAt @map("updated_at") @db.DateTime(3)
coverFile File? @relation("ContentCover", fields: [coverFileId], references: [id], onDelete: Restrict)
creator User @relation("ContentCreator", fields: [createdById], references: [id], onDelete: Restrict)
updater User @relation("ContentUpdater", fields: [updatedById], references: [id], onDelete: Restrict)
reviewer User? @relation("ContentReviewer", fields: [reviewedById], references: [id], onDelete: Restrict)
statusHistory ContentPostStatusHistory[]
@@unique([createdById, clientRequestId], map: "content_posts_creator_request_key")
@@index([status, type, publishedAt], map: "content_posts_status_type_published_idx")
@@index([createdById, status, updatedAt], map: "content_posts_creator_status_updated_idx")
@@map("content_posts")
}
model ContentPostStatusHistory {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
contentPostId BigInt @map("content_post_id") @db.UnsignedBigInt
requestId String @unique @map("request_id") @db.Char(36)
requestFingerprint String @map("request_fingerprint") @db.Char(64)
fromStatus ContentPostStatus? @map("from_status")
toStatus ContentPostStatus @map("to_status")
operatorUserId BigInt @map("operator_user_id") @db.UnsignedBigInt
reasonCode String @map("reason_code") @db.VarChar(100)
noteEncrypted String? @map("note_encrypted") @db.Text
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
contentPost ContentPost @relation(fields: [contentPostId], references: [id], onDelete: Restrict)
operator User @relation("ContentStatusOperator", fields: [operatorUserId], references: [id], onDelete: Restrict)
@@index([contentPostId, createdAt], map: "content_status_history_post_created_idx")
@@index([operatorUserId, createdAt], map: "content_status_history_operator_created_idx")
@@map("content_post_status_history")
}
model FinancialDisclosure {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
publicId String @unique @map("public_id") @db.Char(36)
clientRequestId String @map("client_request_id") @db.Char(36)
requestFingerprint String @map("request_fingerprint") @db.Char(64)
title String @db.VarChar(200)
summary String? @db.VarChar(500)
richText String @map("rich_text") @db.MediumText
status FinancialDisclosureStatus @default(DRAFT)
isPinned Boolean @default(false) @map("is_pinned")
sortOrder Int @default(0) @map("sort_order")
revision Int @default(1) @db.UnsignedInt
publishedAt DateTime? @map("published_at") @db.DateTime(3)
createdById BigInt @map("created_by") @db.UnsignedBigInt
updatedById BigInt @map("updated_by") @db.UnsignedBigInt
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
updatedAt DateTime @updatedAt @map("updated_at") @db.DateTime(3)
creator User @relation("FinancialDisclosureCreator", fields: [createdById], references: [id], onDelete: Restrict)
updater User @relation("FinancialDisclosureUpdater", fields: [updatedById], references: [id], onDelete: Restrict)
statusHistory FinancialDisclosureStatusHistory[]
@@unique([createdById, clientRequestId], map: "financial_disclosures_creator_request_key")
@@index([status, isPinned, sortOrder, publishedAt], map: "financial_disclosures_public_list_idx")
@@index([updatedAt], map: "financial_disclosures_updated_at_idx")
@@map("financial_disclosures")
}
model FinancialDisclosureStatusHistory {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
financialDisclosureId BigInt @map("financial_disclosure_id") @db.UnsignedBigInt
requestId String @unique @map("request_id") @db.Char(36)
requestFingerprint String @map("request_fingerprint") @db.Char(64)
fromStatus FinancialDisclosureStatus? @map("from_status")
toStatus FinancialDisclosureStatus @map("to_status")
operatorUserId BigInt @map("operator_user_id") @db.UnsignedBigInt
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
financialDisclosure FinancialDisclosure @relation(fields: [financialDisclosureId], references: [id], onDelete: Restrict)
operator User @relation("FinancialDisclosureStatusOperator", fields: [operatorUserId], references: [id], onDelete: Restrict)
@@index([financialDisclosureId, createdAt], map: "financial_disclosure_history_document_idx")
@@index([operatorUserId, createdAt], map: "financial_disclosure_history_operator_idx")
@@map("financial_disclosure_status_history")
}
model Notification {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
publicId String @unique @map("public_id") @db.Char(36)
userId BigInt @map("user_id") @db.UnsignedBigInt
eventKey String @map("event_key") @db.VarChar(160)
type NotificationType
title String @db.VarChar(120)
body String @db.VarChar(500)
resourceType String? @map("resource_type") @db.VarChar(80)
resourcePublicId String? @map("resource_public_id") @db.Char(36)
readAt DateTime? @map("read_at") @db.DateTime(3)
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
user User @relation(fields: [userId], references: [id], onDelete: Restrict)
deliveries NotificationDelivery[]
@@unique([userId, eventKey], map: "notifications_user_event_key")
@@index([userId, readAt, createdAt], map: "notifications_user_read_created_idx")
@@map("notifications")
}
model NotificationPreference {
userId BigInt @map("user_id") @db.UnsignedBigInt
type NotificationType
inAppEnabled Boolean @default(true) @map("in_app_enabled")
wechatEnabled Boolean @default(false) @map("wechat_enabled")
authorizedAt DateTime? @map("authorized_at") @db.DateTime(3)
updatedAt DateTime @updatedAt @map("updated_at") @db.DateTime(3)
user User @relation(fields: [userId], references: [id], onDelete: Restrict)
@@id([userId, type])
@@index([type, wechatEnabled], map: "notification_preferences_type_wechat_idx")
@@map("notification_preferences")
}
model NotificationDelivery {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
publicId String @unique @map("public_id") @db.Char(36)
notificationId BigInt @map("notification_id") @db.UnsignedBigInt
channel NotificationChannel
status NotificationDeliveryStatus @default(PENDING)
attemptCount Int @default(0) @map("attempt_count") @db.UnsignedInt
nextAttemptAt DateTime @default(now()) @map("next_attempt_at") @db.DateTime(3)
lastAttemptAt DateTime? @map("last_attempt_at") @db.DateTime(3)
providerMessageId String? @map("provider_message_id") @db.VarChar(160)
errorCode String? @map("error_code") @db.VarChar(100)
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
updatedAt DateTime @updatedAt @map("updated_at") @db.DateTime(3)
notification Notification @relation(fields: [notificationId], references: [id], onDelete: Restrict)
@@unique([notificationId, channel], map: "notification_deliveries_notification_channel_key")
@@index([status, nextAttemptAt], map: "notification_deliveries_status_next_idx")
@@map("notification_deliveries")
}