752 lines
42 KiB
Plaintext
752 lines
42 KiB
Plaintext
generator client_utility {
|
|
provider = "prisma-client-js"
|
|
output = "clients/utility"
|
|
}
|
|
|
|
datasource db_utility {
|
|
provider = "mysql"
|
|
url = env("DATABASE_URL_UTILITY")
|
|
}
|
|
|
|
model alert_recipients {
|
|
id String @id @default(dbgenerated("(uuid())")) @db_utility.Char(36)
|
|
alert_id String @db_utility.Char(36)
|
|
recipient_type String @db_utility.VarChar(20)
|
|
recipient_id String? @db_utility.VarChar(255)
|
|
recipient_name String? @db_utility.VarChar(255)
|
|
recipient_contact Json?
|
|
channel String @db_utility.VarChar(20)
|
|
delivery_status String? @default("PENDING") @db_utility.VarChar(20)
|
|
sent_at DateTime? @db_utility.Timestamp(0)
|
|
delivered_at DateTime? @db_utility.Timestamp(0)
|
|
acknowledged_at DateTime? @db_utility.Timestamp(0)
|
|
failed_at DateTime? @db_utility.Timestamp(0)
|
|
delivery_attempts Int? @default(0)
|
|
last_attempt_at DateTime? @db_utility.Timestamp(0)
|
|
failure_reason String? @db_utility.Text
|
|
delivery_metadata Json? @default(dbgenerated("(_utf8mb4\\'{}\\')"))
|
|
response_data Json?
|
|
response_time Int?
|
|
created_at DateTime? @default(now()) @db_utility.Timestamp(0)
|
|
updated_at DateTime? @default(now()) @db_utility.Timestamp(0)
|
|
alerts alerts @relation(fields: [alert_id], references: [id], onDelete: Cascade, onUpdate: NoAction, map: "alert_recipients_ibfk_1")
|
|
|
|
@@index([acknowledged_at], map: "idx_alert_recipients_acknowledged_at")
|
|
@@index([alert_id], map: "idx_alert_recipients_alert_id")
|
|
@@index([alert_id, delivery_status], map: "idx_alert_recipients_alert_status")
|
|
@@index([channel], map: "idx_alert_recipients_channel")
|
|
@@index([channel, delivery_status], map: "idx_alert_recipients_channel_status")
|
|
@@index([created_at], map: "idx_alert_recipients_created_at")
|
|
@@index([delivered_at], map: "idx_alert_recipients_delivered_at")
|
|
@@index([delivery_status], map: "idx_alert_recipients_delivery_status")
|
|
@@index([failed_at], map: "idx_alert_recipients_failed_at")
|
|
@@index([recipient_id], map: "idx_alert_recipients_recipient_id")
|
|
@@index([recipient_id, delivery_status], map: "idx_alert_recipients_recipient_status")
|
|
@@index([recipient_type], map: "idx_alert_recipients_recipient_type")
|
|
@@index([sent_at], map: "idx_alert_recipients_sent_at")
|
|
}
|
|
|
|
/// This table contains check constraints and requires additional setup for migrations. Visit https://pris.ly/d/check-constraints for more info.
|
|
model alerts {
|
|
id String @id @default(dbgenerated("(uuid())")) @db_utility.Char(36)
|
|
alert_id String @unique(map: "alert_id") @db_utility.VarChar(100)
|
|
title String @db_utility.VarChar(255)
|
|
message String @db_utility.Text
|
|
type String @db_utility.VarChar(50)
|
|
category String? @db_utility.VarChar(100)
|
|
severity String @default("MEDIUM") @db_utility.VarChar(20)
|
|
priority String @default("MEDIUM") @db_utility.VarChar(20)
|
|
status String @default("ACTIVE") @db_utility.VarChar(30)
|
|
is_emergency Boolean? @default(false)
|
|
is_broadcast Boolean? @default(false)
|
|
is_recurring Boolean? @default(false)
|
|
location Json?
|
|
coordinates_lat Decimal? @db_utility.Decimal(10, 8)
|
|
coordinates_lng Decimal? @db_utility.Decimal(11, 8)
|
|
target_zones Json? @default(dbgenerated("(_utf8mb4\\'[]\\')"))
|
|
target_buildings Json? @default(dbgenerated("(_utf8mb4\\'[]\\')"))
|
|
target_roles Json? @default(dbgenerated("(_utf8mb4\\'[]\\')"))
|
|
target_teams Json? @default(dbgenerated("(_utf8mb4\\'[]\\')"))
|
|
target_users Json? @default(dbgenerated("(_utf8mb4\\'[]\\')"))
|
|
geofence_ids Json? @default(dbgenerated("(_utf8mb4\\'[]\\')"))
|
|
scheduled_at DateTime? @db_utility.Timestamp(0)
|
|
starts_at DateTime? @default(now()) @db_utility.Timestamp(0)
|
|
ends_at DateTime? @db_utility.Timestamp(0)
|
|
expires_at DateTime? @db_utility.Timestamp(0)
|
|
acknowledged_at DateTime? @db_utility.Timestamp(0)
|
|
resolved_at DateTime? @db_utility.Timestamp(0)
|
|
recurrence_pattern Json?
|
|
next_occurrence DateTime? @db_utility.Timestamp(0)
|
|
content Json? @default(dbgenerated("(_utf8mb4\\'{}\\')"))
|
|
attachments Json? @default(dbgenerated("(_utf8mb4\\'[]\\')"))
|
|
media_urls Json? @default(dbgenerated("(_utf8mb4\\'[]\\')"))
|
|
action_buttons Json? @default(dbgenerated("(_utf8mb4\\'[]\\')"))
|
|
channels Json? @default(dbgenerated("(_utf8mb4\\'[\"app\"]\\')"))
|
|
delivery_config Json? @default(dbgenerated("(_utf8mb4\\'{}\\')"))
|
|
source String? @default("manual") @db_utility.VarChar(100)
|
|
source_id String? @db_utility.VarChar(255)
|
|
context Json? @default(dbgenerated("(_utf8mb4\\'{}\\')"))
|
|
incident_id String? @db_utility.Char(36)
|
|
camera_ids Json? @default(dbgenerated("(_utf8mb4\\'[]\\')"))
|
|
related_alerts Json? @default(dbgenerated("(_utf8mb4\\'[]\\')"))
|
|
total_recipients Int? @default(0)
|
|
delivered_count Int? @default(0)
|
|
acknowledged_count Int? @default(0)
|
|
failed_count Int? @default(0)
|
|
tags Json? @default(dbgenerated("(_utf8mb4\\'[]\\')"))
|
|
metadata Json? @default(dbgenerated("(_utf8mb4\\'{}\\')"))
|
|
custom_fields Json? @default(dbgenerated("(_utf8mb4\\'{}\\')"))
|
|
created_at DateTime? @default(now()) @db_utility.Timestamp(0)
|
|
updated_at DateTime? @default(now()) @db_utility.Timestamp(0)
|
|
created_by String? @db_utility.VarChar(255)
|
|
updated_by String? @db_utility.VarChar(255)
|
|
deleted_at DateTime? @db_utility.Timestamp(0)
|
|
deleted_by String? @db_utility.VarChar(255)
|
|
alert_recipients alert_recipients[]
|
|
incidents incidents? @relation(fields: [incident_id], references: [id], onDelete: NoAction, onUpdate: NoAction, map: "alerts_ibfk_1")
|
|
|
|
@@index([category], map: "idx_alerts_category")
|
|
@@index([coordinates_lat], map: "idx_alerts_coordinates_lat")
|
|
@@index([coordinates_lng], map: "idx_alerts_coordinates_lng")
|
|
@@index([created_at], map: "idx_alerts_created_at")
|
|
@@index([created_by], map: "idx_alerts_created_by")
|
|
@@index([deleted_at], map: "idx_alerts_deleted_at")
|
|
@@index([ends_at], map: "idx_alerts_ends_at")
|
|
@@index([expires_at], map: "idx_alerts_expires_at")
|
|
@@index([incident_id], map: "idx_alerts_incident_id")
|
|
@@index([is_broadcast], map: "idx_alerts_is_broadcast")
|
|
@@index([is_emergency], map: "idx_alerts_is_emergency")
|
|
@@index([is_recurring], map: "idx_alerts_is_recurring")
|
|
@@index([next_occurrence], map: "idx_alerts_next_occurrence")
|
|
@@index([priority], map: "idx_alerts_priority")
|
|
@@index([scheduled_at], map: "idx_alerts_scheduled_at")
|
|
@@index([severity], map: "idx_alerts_severity")
|
|
@@index([source], map: "idx_alerts_source")
|
|
@@index([source_id], map: "idx_alerts_source_id")
|
|
@@index([starts_at], map: "idx_alerts_starts_at")
|
|
@@index([status], map: "idx_alerts_status")
|
|
@@index([status, priority], map: "idx_alerts_status_priority")
|
|
@@index([type], map: "idx_alerts_type")
|
|
@@index([type, severity], map: "idx_alerts_type_severity")
|
|
}
|
|
|
|
/// This table contains check constraints and requires additional setup for migrations. Visit https://pris.ly/d/check-constraints for more info.
|
|
model basemap_configs {
|
|
id String @id @default(dbgenerated("(uuid())")) @db_utility.Char(36)
|
|
name String @unique(map: "name") @db_utility.VarChar(255)
|
|
description String? @db_utility.Text
|
|
svg_data String @db_utility.LongText
|
|
calibration Json
|
|
dimensions Json
|
|
is_active Boolean? @default(false)
|
|
is_default Boolean? @default(false)
|
|
version Int? @default(1)
|
|
settings Json? @default(dbgenerated("(_utf8mb4\\'{}\\')"))
|
|
metadata Json? @default(dbgenerated("(_utf8mb4\\'{}\\')"))
|
|
file_size Int?
|
|
checksum String? @db_utility.VarChar(64)
|
|
created_at DateTime? @default(now()) @db_utility.Timestamp(0)
|
|
updated_at DateTime? @default(now()) @db_utility.Timestamp(0)
|
|
created_by String? @db_utility.VarChar(255)
|
|
updated_by String? @db_utility.VarChar(255)
|
|
|
|
@@unique([name, version], map: "idx_basemap_configs_name_version")
|
|
@@index([is_active, is_default], map: "idx_basemap_configs_active_default")
|
|
@@index([checksum], map: "idx_basemap_configs_checksum")
|
|
@@index([created_at], map: "idx_basemap_configs_created_at")
|
|
@@index([is_active], map: "idx_basemap_configs_is_active")
|
|
@@index([is_default], map: "idx_basemap_configs_is_default")
|
|
@@index([name], map: "idx_basemap_configs_name")
|
|
@@index([version], map: "idx_basemap_configs_version")
|
|
}
|
|
|
|
model camera_health_log {
|
|
id Int @id @default(autoincrement())
|
|
camera_id String @db_utility.VarChar(50)
|
|
status String @db_utility.VarChar(20)
|
|
response_time Int
|
|
health_score Int
|
|
error_message String? @db_utility.Text
|
|
stream_accessible Boolean? @default(false)
|
|
timestamp DateTime? @default(now()) @db_utility.Timestamp(0)
|
|
cameras cameras @relation(fields: [camera_id], references: [id], onDelete: Cascade, onUpdate: NoAction, map: "camera_health_log_ibfk_1")
|
|
|
|
@@index([camera_id, timestamp], map: "idx_camera_timestamp")
|
|
@@index([timestamp], map: "idx_timestamp")
|
|
}
|
|
|
|
model cameras {
|
|
id String @id @db_utility.VarChar(50)
|
|
label String @db_utility.VarChar(255)
|
|
area String @db_utility.VarChar(100)
|
|
lat Decimal @db_utility.Decimal(10, 8)
|
|
lng Decimal @db_utility.Decimal(11, 8)
|
|
stream_url String @db_utility.VarChar(500)
|
|
status cameras_status? @default(offline)
|
|
last_heartbeat DateTime? @db_utility.Timestamp(0)
|
|
response_time Int? @default(0)
|
|
health_score Int? @default(0)
|
|
error_message String? @db_utility.Text
|
|
created_at DateTime? @default(now()) @db_utility.Timestamp(0)
|
|
updated_at DateTime? @default(now()) @db_utility.Timestamp(0)
|
|
camera_health_log camera_health_log[]
|
|
|
|
@@index([area], map: "idx_area")
|
|
@@index([last_heartbeat], map: "idx_last_heartbeat")
|
|
@@index([status], map: "idx_status")
|
|
}
|
|
|
|
/// This table contains check constraints and requires additional setup for migrations. Visit https://pris.ly/d/check-constraints for more info.
|
|
model feature_flags {
|
|
id String @id @default(dbgenerated("(uuid())")) @db_utility.Char(36)
|
|
key String @unique(map: "idx_feature_flags_key") @db_utility.VarChar(100)
|
|
name String @db_utility.VarChar(255)
|
|
description String? @db_utility.Text
|
|
is_enabled Boolean? @default(false)
|
|
type String @default("BOOLEAN") @db_utility.VarChar(20)
|
|
value Json?
|
|
default_value Json?
|
|
environment String? @default("all") @db_utility.VarChar(50)
|
|
category String? @db_utility.VarChar(100)
|
|
tags Json? @default(dbgenerated("(_utf8mb4\\'[]\\')"))
|
|
conditions Json? @default(dbgenerated("(_utf8mb4\\'{}\\')"))
|
|
rollout_percentage Decimal? @default(100.00) @db_utility.Decimal(5, 2)
|
|
user_segments Json? @default(dbgenerated("(_utf8mb4\\'[]\\')"))
|
|
is_archived Boolean? @default(false)
|
|
is_permanent Boolean? @default(false)
|
|
expires_at DateTime? @db_utility.Timestamp(0)
|
|
last_evaluated_at DateTime? @db_utility.Timestamp(0)
|
|
evaluation_count BigInt? @default(0)
|
|
metadata Json? @default(dbgenerated("(_utf8mb4\\'{}\\')"))
|
|
created_at DateTime? @default(now()) @db_utility.Timestamp(0)
|
|
updated_at DateTime? @default(now()) @db_utility.Timestamp(0)
|
|
created_by String? @db_utility.VarChar(255)
|
|
updated_by String? @db_utility.VarChar(255)
|
|
enabled_at DateTime? @db_utility.Timestamp(0)
|
|
disabled_at DateTime? @db_utility.Timestamp(0)
|
|
|
|
@@index([category], map: "idx_feature_flags_category")
|
|
@@index([category, is_enabled], map: "idx_feature_flags_category_enabled")
|
|
@@index([created_at], map: "idx_feature_flags_created_at")
|
|
@@index([is_enabled, is_archived], map: "idx_feature_flags_enabled_archived")
|
|
@@index([is_enabled, environment], map: "idx_feature_flags_enabled_env")
|
|
@@index([environment], map: "idx_feature_flags_environment")
|
|
@@index([expires_at], map: "idx_feature_flags_expires_at")
|
|
@@index([is_archived], map: "idx_feature_flags_is_archived")
|
|
@@index([is_enabled], map: "idx_feature_flags_is_enabled")
|
|
@@index([is_permanent], map: "idx_feature_flags_is_permanent")
|
|
@@index([last_evaluated_at], map: "idx_feature_flags_last_evaluated_at")
|
|
@@index([rollout_percentage], map: "idx_feature_flags_rollout_percentage")
|
|
@@index([type], map: "idx_feature_flags_type")
|
|
}
|
|
|
|
/// This table contains check constraints and requires additional setup for migrations. Visit https://pris.ly/d/check-constraints for more info.
|
|
model geofence_breaches {
|
|
id String @id @default(dbgenerated("(uuid())")) @db_utility.Char(36)
|
|
geofence_id String @db_utility.Char(36)
|
|
team_member_id String? @db_utility.Char(36)
|
|
breach_type String @db_utility.VarChar(20)
|
|
location Json
|
|
severity String? @default("MEDIUM") @db_utility.VarChar(20)
|
|
is_resolved Boolean? @default(false)
|
|
resolved_at DateTime? @db_utility.Timestamp(0)
|
|
resolved_by String? @db_utility.VarChar(255)
|
|
notes String? @db_utility.Text
|
|
metadata Json? @default(dbgenerated("(_utf8mb4\\'{}\\')"))
|
|
created_at DateTime? @default(now()) @db_utility.Timestamp(0)
|
|
updated_at DateTime? @default(now()) @db_utility.Timestamp(0)
|
|
geofences geofences @relation(fields: [geofence_id], references: [id], onDelete: Cascade, onUpdate: NoAction, map: "geofence_breaches_ibfk_1")
|
|
|
|
@@index([breach_type], map: "idx_geofence_breaches_breach_type")
|
|
@@index([created_at], map: "idx_geofence_breaches_created_at")
|
|
@@index([geofence_id], map: "idx_geofence_breaches_geofence_id")
|
|
@@index([is_resolved], map: "idx_geofence_breaches_is_resolved")
|
|
@@index([severity], map: "idx_geofence_breaches_severity")
|
|
@@index([team_member_id], map: "idx_geofence_breaches_team_member_id")
|
|
}
|
|
|
|
/// This table contains check constraints and requires additional setup for migrations. Visit https://pris.ly/d/check-constraints for more info.
|
|
model geofences {
|
|
id String @id @default(dbgenerated("(uuid())")) @db_utility.Char(36)
|
|
name String @db_utility.VarChar(255)
|
|
type String @db_utility.VarChar(50)
|
|
coordinates Json
|
|
description String? @db_utility.Text
|
|
is_active Boolean? @default(true)
|
|
priority String? @default("MEDIUM") @db_utility.VarChar(20)
|
|
notification_settings Json? @default(dbgenerated("(_utf8mb4\\'{}\\')"))
|
|
metadata Json? @default(dbgenerated("(_utf8mb4\\'{}\\')"))
|
|
created_at DateTime? @default(now()) @db_utility.Timestamp(0)
|
|
updated_at DateTime? @default(now()) @db_utility.Timestamp(0)
|
|
created_by String? @db_utility.VarChar(255)
|
|
updated_by String? @db_utility.VarChar(255)
|
|
geofence_breaches geofence_breaches[]
|
|
incidents incidents[]
|
|
map_pins map_pins[]
|
|
|
|
@@index([created_at], map: "idx_geofences_created_at")
|
|
@@index([is_active], map: "idx_geofences_is_active")
|
|
@@index([priority], map: "idx_geofences_priority")
|
|
@@index([type], map: "idx_geofences_type")
|
|
}
|
|
|
|
model houses {
|
|
id String @id @default(dbgenerated("(uuid())")) @db_utility.VarChar(36)
|
|
house_number String @db_utility.VarChar(20)
|
|
block String @db_utility.VarChar(10)
|
|
street String @db_utility.Text
|
|
owner_name String @db_utility.VarChar(255)
|
|
owner_phone String @db_utility.VarChar(20)
|
|
status houses_status? @default(active)
|
|
perumahan_id String? @db_utility.VarChar(36)
|
|
created_at DateTime? @default(now()) @db_utility.Timestamp(0)
|
|
updated_at DateTime? @default(now()) @db_utility.Timestamp(0)
|
|
|
|
@@unique([house_number, block], map: "unique_house_block")
|
|
@@index([block], map: "idx_block")
|
|
@@index([house_number], map: "idx_house_number")
|
|
@@index([owner_name], map: "idx_owner_name")
|
|
@@index([status], map: "idx_status")
|
|
}
|
|
|
|
/// This table contains check constraints and requires additional setup for migrations. Visit https://pris.ly/d/check-constraints for more info.
|
|
model incident_updates {
|
|
id String @id @default(dbgenerated("(uuid())")) @db_utility.Char(36)
|
|
incident_id String @db_utility.Char(36)
|
|
update_type String @db_utility.VarChar(50)
|
|
title String? @db_utility.VarChar(255)
|
|
description String? @db_utility.Text
|
|
old_values Json? @default(dbgenerated("(_utf8mb4\\'{}\\')"))
|
|
new_values Json? @default(dbgenerated("(_utf8mb4\\'{}\\')"))
|
|
changed_fields Json? @default(dbgenerated("(_utf8mb4\\'[]\\')"))
|
|
is_internal Boolean? @default(false)
|
|
is_system_generated Boolean? @default(false)
|
|
attachments Json? @default(dbgenerated("(_utf8mb4\\'[]\\')"))
|
|
created_at DateTime? @default(now()) @db_utility.Timestamp(0)
|
|
created_by String @db_utility.VarChar(255)
|
|
notifications_sent Json? @default(dbgenerated("(_utf8mb4\\'[]\\')"))
|
|
notification_status String? @default("PENDING") @db_utility.VarChar(20)
|
|
incidents incidents @relation(fields: [incident_id], references: [id], onDelete: Cascade, onUpdate: NoAction, map: "incident_updates_ibfk_1")
|
|
|
|
@@index([created_at], map: "idx_incident_updates_created_at")
|
|
@@index([created_by], map: "idx_incident_updates_created_by")
|
|
@@index([incident_id], map: "idx_incident_updates_incident_id")
|
|
@@index([is_internal], map: "idx_incident_updates_is_internal")
|
|
@@index([notification_status], map: "idx_incident_updates_notification_status")
|
|
@@index([update_type], map: "idx_incident_updates_update_type")
|
|
}
|
|
|
|
/// This table contains check constraints and requires additional setup for migrations. Visit https://pris.ly/d/check-constraints for more info.
|
|
model incidents {
|
|
id String @id @default(dbgenerated("(uuid())")) @db_utility.Char(36)
|
|
incident_number String @unique(map: "idx_incidents_incident_number") @db_utility.VarChar(50)
|
|
title String @db_utility.VarChar(255)
|
|
description String? @db_utility.Text
|
|
type String @db_utility.VarChar(50)
|
|
severity String @default("MEDIUM") @db_utility.VarChar(20)
|
|
priority String @default("MEDIUM") @db_utility.VarChar(20)
|
|
status String @default("OPEN") @db_utility.VarChar(30)
|
|
location Json
|
|
coordinates_lat Decimal? @db_utility.Decimal(10, 8)
|
|
coordinates_lng Decimal? @db_utility.Decimal(11, 8)
|
|
address String? @db_utility.Text
|
|
zone String? @db_utility.VarChar(100)
|
|
building String? @db_utility.VarChar(100)
|
|
floor String? @db_utility.VarChar(50)
|
|
room String? @db_utility.VarChar(50)
|
|
reported_by String? @db_utility.Char(36)
|
|
reporter_name String? @db_utility.VarChar(255)
|
|
reporter_contact String? @db_utility.VarChar(100)
|
|
reporter_type String? @default("INTERNAL") @db_utility.VarChar(50)
|
|
assigned_to String? @db_utility.Char(36)
|
|
assigned_team String? @db_utility.VarChar(100)
|
|
assigned_at DateTime? @db_utility.Timestamp(0)
|
|
occurred_at DateTime @db_utility.Timestamp(0)
|
|
reported_at DateTime? @default(now()) @db_utility.Timestamp(0)
|
|
acknowledged_at DateTime? @db_utility.Timestamp(0)
|
|
resolved_at DateTime? @db_utility.Timestamp(0)
|
|
closed_at DateTime? @db_utility.Timestamp(0)
|
|
due_date DateTime? @db_utility.Timestamp(0)
|
|
tags Json? @default(dbgenerated("(_utf8mb4\\'[]\\')"))
|
|
attachments Json? @default(dbgenerated("(_utf8mb4\\'[]\\')"))
|
|
evidence Json? @default(dbgenerated("(_utf8mb4\\'[]\\')"))
|
|
witnesses Json? @default(dbgenerated("(_utf8mb4\\'[]\\')"))
|
|
related_incidents Json? @default(dbgenerated("(_utf8mb4\\'[]\\')"))
|
|
camera_ids Json? @default(dbgenerated("(_utf8mb4\\'[]\\')"))
|
|
geofence_id String? @db_utility.Char(36)
|
|
alert_id String? @db_utility.Char(36)
|
|
metadata Json? @default(dbgenerated("(_utf8mb4\\'{}\\')"))
|
|
custom_fields Json? @default(dbgenerated("(_utf8mb4\\'{}\\')"))
|
|
created_at DateTime? @default(now()) @db_utility.Timestamp(0)
|
|
updated_at DateTime? @default(now()) @db_utility.Timestamp(0)
|
|
created_by String? @db_utility.VarChar(255)
|
|
updated_by String? @db_utility.VarChar(255)
|
|
deleted_at DateTime? @db_utility.Timestamp(0)
|
|
deleted_by String? @db_utility.VarChar(255)
|
|
alerts alerts[]
|
|
incident_updates incident_updates[]
|
|
team_members_incidents_reported_byToteam_members team_members? @relation("incidents_reported_byToteam_members", fields: [reported_by], references: [id], onDelete: NoAction, onUpdate: NoAction, map: "incidents_ibfk_1")
|
|
team_members_incidents_assigned_toToteam_members team_members? @relation("incidents_assigned_toToteam_members", fields: [assigned_to], references: [id], onDelete: NoAction, onUpdate: NoAction, map: "incidents_ibfk_2")
|
|
geofences geofences? @relation(fields: [geofence_id], references: [id], onDelete: NoAction, onUpdate: NoAction, map: "incidents_ibfk_3")
|
|
|
|
@@index([alert_id], map: "idx_incidents_alert_id")
|
|
@@index([assigned_to, status], map: "idx_incidents_assigned_status")
|
|
@@index([assigned_team], map: "idx_incidents_assigned_team")
|
|
@@index([assigned_to], map: "idx_incidents_assigned_to")
|
|
@@index([building], map: "idx_incidents_building")
|
|
@@index([coordinates_lat], map: "idx_incidents_coordinates_lat")
|
|
@@index([coordinates_lng], map: "idx_incidents_coordinates_lng")
|
|
@@index([created_at], map: "idx_incidents_created_at")
|
|
@@index([deleted_at], map: "idx_incidents_deleted_at")
|
|
@@index([due_date], map: "idx_incidents_due_date")
|
|
@@index([geofence_id], map: "idx_incidents_geofence_id")
|
|
@@index([occurred_at], map: "idx_incidents_occurred_at")
|
|
@@index([occurred_at, status], map: "idx_incidents_occurred_status")
|
|
@@index([priority], map: "idx_incidents_priority")
|
|
@@index([reported_at], map: "idx_incidents_reported_at")
|
|
@@index([reported_by], map: "idx_incidents_reported_by")
|
|
@@index([resolved_at], map: "idx_incidents_resolved_at")
|
|
@@index([severity], map: "idx_incidents_severity")
|
|
@@index([status], map: "idx_incidents_status")
|
|
@@index([status, priority], map: "idx_incidents_status_priority")
|
|
@@index([type], map: "idx_incidents_type")
|
|
@@index([type, severity], map: "idx_incidents_type_severity")
|
|
@@index([zone], map: "idx_incidents_zone")
|
|
@@index([zone, status], map: "idx_incidents_zone_status")
|
|
}
|
|
|
|
/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments
|
|
model ktp_validation_audit {
|
|
id String @id @db_utility.Char(36)
|
|
ktp_data_id String @db_utility.Char(36)
|
|
action ktp_validation_audit_action
|
|
old_values Json?
|
|
new_values Json?
|
|
performed_by String @db_utility.VarChar(255)
|
|
ip_address String? @db_utility.VarChar(45)
|
|
user_agent String? @db_utility.Text
|
|
reason String? @db_utility.Text
|
|
created_at DateTime @default(now()) @db_utility.DateTime(0)
|
|
metadata Json?
|
|
visitor_ktp_data visitor_ktp_data @relation(fields: [ktp_data_id], references: [id], onDelete: Cascade, map: "ktp_validation_audit_ibfk_1")
|
|
|
|
@@index([action], map: "idx_action")
|
|
@@index([created_at], map: "idx_created_at")
|
|
@@index([ktp_data_id], map: "idx_ktp_data")
|
|
@@index([performed_by], map: "idx_performed_by")
|
|
}
|
|
|
|
/// This table contains check constraints and requires additional setup for migrations. Visit https://pris.ly/d/check-constraints for more info.
|
|
model map_pins {
|
|
id String @id @default(dbgenerated("(uuid())")) @db_utility.Char(36)
|
|
type String @db_utility.VarChar(50)
|
|
coordinates Json? @default(dbgenerated("(_utf8mb4\\'{}\\')"))
|
|
title String @db_utility.VarChar(255)
|
|
description String? @db_utility.Text
|
|
status String? @default("ACTIVE") @db_utility.VarChar(20)
|
|
priority String? @default("MEDIUM") @db_utility.VarChar(20)
|
|
icon_type String? @db_utility.VarChar(100)
|
|
icon_color String? @db_utility.VarChar(50)
|
|
size String? @default("MEDIUM") @db_utility.VarChar(20)
|
|
is_visible Boolean? @default(true)
|
|
is_clickable Boolean? @default(true)
|
|
metadata Json? @default(dbgenerated("(_utf8mb4\\'{}\\')"))
|
|
alert_id String? @db_utility.Char(36)
|
|
incident_id String? @db_utility.Char(36)
|
|
team_member_id String? @db_utility.Char(36)
|
|
camera_id String? @db_utility.Char(36)
|
|
geofence_id String? @db_utility.Char(36)
|
|
created_at DateTime? @default(now()) @db_utility.Timestamp(0)
|
|
updated_at DateTime? @default(now()) @db_utility.Timestamp(0)
|
|
created_by String? @db_utility.VarChar(255)
|
|
updated_by String? @db_utility.VarChar(255)
|
|
geofences geofences? @relation(fields: [geofence_id], references: [id], onUpdate: NoAction, map: "map_pins_ibfk_1")
|
|
|
|
@@index([alert_id], map: "idx_map_pins_alert_id")
|
|
@@index([camera_id], map: "idx_map_pins_camera_id")
|
|
@@index([created_at], map: "idx_map_pins_created_at")
|
|
@@index([geofence_id], map: "idx_map_pins_geofence_id")
|
|
@@index([incident_id], map: "idx_map_pins_incident_id")
|
|
@@index([is_clickable], map: "idx_map_pins_is_clickable")
|
|
@@index([is_visible], map: "idx_map_pins_is_visible")
|
|
@@index([priority], map: "idx_map_pins_priority")
|
|
@@index([status], map: "idx_map_pins_status")
|
|
@@index([team_member_id], map: "idx_map_pins_team_member_id")
|
|
@@index([type], map: "idx_map_pins_type")
|
|
@@index([type, status], map: "idx_map_pins_type_status")
|
|
}
|
|
|
|
model perumahan_facilities {
|
|
id Int @id @default(autoincrement())
|
|
name String @db_utility.VarChar(255)
|
|
type String @db_utility.VarChar(100)
|
|
description String? @db_utility.Text
|
|
location String @db_utility.VarChar(255)
|
|
lat Decimal @db_utility.Decimal(10, 8)
|
|
lng Decimal @db_utility.Decimal(11, 8)
|
|
status perumahan_facilities_status? @default(active)
|
|
operating_hours Json?
|
|
contact_info Json?
|
|
created_at DateTime? @default(now()) @db_utility.Timestamp(0)
|
|
updated_at DateTime? @default(now()) @db_utility.Timestamp(0)
|
|
|
|
@@index([lat, lng], map: "idx_location")
|
|
@@index([status], map: "idx_status")
|
|
@@index([type], map: "idx_type")
|
|
}
|
|
|
|
model perumahan_info {
|
|
id Int @id @default(autoincrement())
|
|
name String @db_utility.VarChar(255)
|
|
total_units Int
|
|
clusters Json
|
|
address String? @db_utility.Text
|
|
created_at DateTime? @default(now()) @db_utility.Timestamp(0)
|
|
updated_at DateTime? @default(now()) @db_utility.Timestamp(0)
|
|
}
|
|
|
|
model qr_codes {
|
|
id String @id @default(dbgenerated("(uuid())")) @db_utility.VarChar(36)
|
|
entry_point String @db_utility.VarChar(100)
|
|
qr_data String @unique(map: "qr_codes_qr_data_unique") @db_utility.VarChar(500)
|
|
location_lat Decimal @db_utility.Decimal(10, 8)
|
|
location_lng Decimal @db_utility.Decimal(11, 8)
|
|
geofence_radius Int @default(50)
|
|
is_active Boolean @default(true)
|
|
description String? @db_utility.Text
|
|
max_daily_registrations Int?
|
|
operating_hours Json?
|
|
security_level qr_codes_security_level @default(medium)
|
|
requires_approval Boolean @default(true)
|
|
auto_approve_roles Json? @default(dbgenerated("(_utf8mb4\\'[]\\')"))
|
|
metadata Json? @default(dbgenerated("(_utf8mb4\\'{}\\')"))
|
|
last_used_at DateTime? @db_utility.DateTime(0)
|
|
usage_count Int @default(0)
|
|
created_by String? @db_utility.VarChar(255)
|
|
updated_by String? @db_utility.VarChar(255)
|
|
created_at DateTime @default(now()) @db_utility.DateTime(0)
|
|
updated_at DateTime @default(now()) @db_utility.DateTime(0)
|
|
visitor_registrations visitor_registrations[]
|
|
|
|
@@index([created_at], map: "idx_qr_codes_created_at")
|
|
@@index([entry_point], map: "idx_qr_codes_entry_point")
|
|
@@index([is_active], map: "idx_qr_codes_is_active")
|
|
@@index([last_used_at], map: "idx_qr_codes_last_used_at")
|
|
@@index([security_level], map: "idx_qr_codes_security_level")
|
|
@@index([created_at], map: "qr_codes_created_at")
|
|
@@index([entry_point], map: "qr_codes_entry_point")
|
|
@@index([is_active], map: "qr_codes_is_active")
|
|
@@index([last_used_at], map: "qr_codes_last_used_at")
|
|
@@index([security_level], map: "qr_codes_security_level")
|
|
}
|
|
|
|
model security_activities {
|
|
id Int @id @default(autoincrement())
|
|
type String @db_utility.VarChar(50)
|
|
ref_id String? @db_utility.VarChar(100)
|
|
actor String @db_utility.VarChar(255)
|
|
note String @db_utility.Text
|
|
severity security_activities_severity? @default(INFO)
|
|
timestamp DateTime? @default(now()) @db_utility.Timestamp(0)
|
|
metadata Json?
|
|
source String? @default("system") @db_utility.VarChar(50)
|
|
|
|
@@index([actor], map: "idx_actor")
|
|
@@index([ref_id], map: "idx_ref_id")
|
|
@@index([severity], map: "idx_severity")
|
|
@@index([timestamp], map: "idx_timestamp")
|
|
@@index([type], map: "idx_type")
|
|
}
|
|
|
|
model sequelizemeta {
|
|
name String @id @unique(map: "name") @db_utility.VarChar(255)
|
|
}
|
|
|
|
model team_location_history {
|
|
id Int @id @default(autoincrement())
|
|
member_id String @db_utility.VarChar(50)
|
|
location String @db_utility.VarChar(255)
|
|
lat Decimal? @db_utility.Decimal(10, 8)
|
|
lng Decimal? @db_utility.Decimal(11, 8)
|
|
activity_type String? @db_utility.VarChar(50)
|
|
timestamp DateTime? @default(now()) @db_utility.Timestamp(0)
|
|
team_members team_members @relation(fields: [member_id], references: [id], onDelete: Cascade, onUpdate: NoAction, map: "team_location_history_ibfk_1")
|
|
|
|
@@index([member_id, timestamp], map: "idx_member_timestamp")
|
|
@@index([timestamp], map: "idx_timestamp")
|
|
}
|
|
|
|
model team_members {
|
|
id String @id @db_utility.VarChar(50)
|
|
nama String @db_utility.VarChar(255)
|
|
role String @db_utility.VarChar(100)
|
|
status team_members_status? @default(OFF_DUTY)
|
|
phone String @db_utility.VarChar(20)
|
|
email String? @db_utility.VarChar(255)
|
|
current_location String? @db_utility.VarChar(255)
|
|
last_update DateTime? @default(now()) @db_utility.Timestamp(0)
|
|
shift_start DateTime? @db_utility.Time(0)
|
|
shift_end DateTime? @db_utility.Time(0)
|
|
created_at DateTime? @default(now()) @db_utility.Timestamp(0)
|
|
updated_at DateTime? @default(now()) @db_utility.Timestamp(0)
|
|
incidents_incidents_reported_byToteam_members incidents[] @relation("incidents_reported_byToteam_members")
|
|
incidents_incidents_assigned_toToteam_members incidents[] @relation("incidents_assigned_toToteam_members")
|
|
team_location_history team_location_history[]
|
|
|
|
@@index([last_update], map: "idx_last_update")
|
|
@@index([role], map: "idx_role")
|
|
@@index([status], map: "idx_status")
|
|
}
|
|
|
|
model visitor_ktp_data {
|
|
id String @id @db_utility.Char(36)
|
|
visitor_registration_id String @db_utility.Char(36)
|
|
ktp_number String? @unique(map: "ktp_number") @db_utility.VarChar(20)
|
|
full_name String? @db_utility.VarChar(255)
|
|
birth_date DateTime? @db_utility.Date
|
|
birth_place String? @db_utility.VarChar(255)
|
|
gender visitor_ktp_data_gender?
|
|
address String? @db_utility.Text
|
|
rt_rw String? @db_utility.VarChar(20)
|
|
kelurahan String? @db_utility.VarChar(100)
|
|
kecamatan String? @db_utility.VarChar(100)
|
|
religion String? @db_utility.VarChar(50)
|
|
marital_status String? @db_utility.VarChar(50)
|
|
occupation String? @db_utility.VarChar(100)
|
|
nationality String? @default("WNI") @db_utility.VarChar(50)
|
|
ktp_photo_url String? @db_utility.VarChar(500)
|
|
ktp_photo_hash String? @db_utility.VarChar(64)
|
|
validation_status visitor_ktp_data_validation_status @default(pending)
|
|
validation_confidence Decimal? @db_utility.Decimal(3, 2)
|
|
validation_notes String? @db_utility.Text
|
|
validated_by String? @db_utility.VarChar(255)
|
|
validated_at DateTime? @db_utility.DateTime(0)
|
|
ocr_raw_data Json?
|
|
manual_corrections Json?
|
|
created_at DateTime @default(now()) @db_utility.DateTime(0)
|
|
updated_at DateTime @default(now()) @db_utility.DateTime(0)
|
|
ktp_validation_audit ktp_validation_audit[]
|
|
|
|
@@index([ktp_number], map: "idx_ktp_number")
|
|
@@index([ktp_photo_hash], map: "idx_ktp_photo_hash")
|
|
@@index([validation_status], map: "idx_validation_status")
|
|
@@index([visitor_registration_id], map: "idx_visitor_registration")
|
|
}
|
|
|
|
model visitor_registrations {
|
|
id String @id @default(dbgenerated("(uuid())")) @db_utility.VarChar(36)
|
|
name String @db_utility.VarChar(255)
|
|
phone String @db_utility.VarChar(20)
|
|
photo_url String? @db_utility.VarChar(500)
|
|
purpose String? @default("Visit") @db_utility.VarChar(100)
|
|
entry_point String @db_utility.VarChar(100)
|
|
location_lat Decimal? @db_utility.Decimal(10, 8)
|
|
location_lng Decimal? @db_utility.Decimal(11, 8)
|
|
qr_code_id String? @db_utility.VarChar(36)
|
|
status visitor_registrations_status @default(pending)
|
|
approved_by String? @db_utility.VarChar(255)
|
|
approved_at DateTime? @db_utility.DateTime(0)
|
|
rejected_by String? @db_utility.VarChar(255)
|
|
rejected_at DateTime? @db_utility.DateTime(0)
|
|
rejection_reason String? @db_utility.Text
|
|
expires_at DateTime? @db_utility.DateTime(0)
|
|
checked_in_at DateTime? @db_utility.DateTime(0)
|
|
checked_out_at DateTime? @db_utility.DateTime(0)
|
|
metadata Json? @default(dbgenerated("(_utf8mb4\\'{}\\')"))
|
|
created_by String? @db_utility.VarChar(255)
|
|
updated_by String? @db_utility.VarChar(255)
|
|
created_at DateTime @default(now()) @db_utility.DateTime(0)
|
|
updated_at DateTime @default(now()) @db_utility.DateTime(0)
|
|
location_address String? @db_utility.VarChar(500)
|
|
location_updated_at DateTime? @db_utility.DateTime(0)
|
|
qr_codes qr_codes? @relation(fields: [qr_code_id], references: [id], map: "visitor_registrations_ibfk_1")
|
|
|
|
@@index([created_at], map: "idx_visitor_registrations_created_at")
|
|
@@index([entry_point], map: "idx_visitor_registrations_entry_point")
|
|
@@index([expires_at], map: "idx_visitor_registrations_expires_at")
|
|
@@index([phone], map: "idx_visitor_registrations_phone")
|
|
@@index([qr_code_id], map: "idx_visitor_registrations_qr_code_id")
|
|
@@index([status], map: "idx_visitor_registrations_status")
|
|
@@index([status, created_at], map: "idx_visitor_registrations_status_created_at")
|
|
@@index([created_at], map: "visitor_registrations_created_at")
|
|
@@index([entry_point], map: "visitor_registrations_entry_point")
|
|
@@index([expires_at], map: "visitor_registrations_expires_at")
|
|
@@index([phone], map: "visitor_registrations_phone")
|
|
@@index([qr_code_id], map: "visitor_registrations_qr_code_id")
|
|
@@index([status], map: "visitor_registrations_status")
|
|
@@index([status, created_at], map: "visitor_registrations_status_created_at")
|
|
}
|
|
|
|
enum ktp_validation_audit_action {
|
|
created
|
|
updated
|
|
verified
|
|
rejected
|
|
manual_override
|
|
duplicate_detected
|
|
validation_error
|
|
manual_validation
|
|
manual_validation_error
|
|
}
|
|
|
|
enum team_members_status {
|
|
ON_DUTY
|
|
OFF_DUTY
|
|
PATROLLING
|
|
BREAK
|
|
}
|
|
|
|
enum security_activities_severity {
|
|
INFO
|
|
WARNING
|
|
ERROR
|
|
CRITICAL
|
|
}
|
|
|
|
enum cameras_status {
|
|
online
|
|
offline
|
|
degraded
|
|
error
|
|
}
|
|
|
|
enum houses_status {
|
|
active
|
|
inactive
|
|
}
|
|
|
|
enum visitor_ktp_data_gender {
|
|
L
|
|
P
|
|
}
|
|
|
|
enum perumahan_facilities_status {
|
|
active
|
|
inactive
|
|
maintenance
|
|
}
|
|
|
|
enum visitor_registrations_status {
|
|
pending
|
|
approved
|
|
rejected
|
|
expired
|
|
checked_in
|
|
checked_out
|
|
}
|
|
|
|
enum qr_codes_security_level {
|
|
low
|
|
medium
|
|
high
|
|
restricted
|
|
}
|
|
|
|
enum visitor_ktp_data_validation_status {
|
|
pending
|
|
processing
|
|
verified
|
|
rejected
|
|
manual_review
|
|
}
|