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 }