csa-backend-test/prisma/schema.utility.prisma

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
}