""" Governance & Audit — Reviews, safety signals, audit events, offshore pseudonymous review. """ import uuid from django.db import models class PhysicianReview(models.Model): REVIEW_TYPE_CHOICES = [ ("intake_approval", "Intake Approval"), ("eligibility_decision", "Eligibility Decision"), ("enrollment_decision", "Enrollment Decision"), ("observation_approval", "Observation Approval"), ("pause_escalation", "Pause Escalation"), ("monthly_summary", "Monthly Summary"), ("other", "Other"), ] DECISION_CHOICES = [ ("approved", "Approved"), ("rejected", "Rejected"), ("deferred", "Deferred"), ("needs_more_info", "Needs More Info"), ("pause", "Pause"), ("escalate", "Escalate"), ] id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) intake_record = models.ForeignKey( "intake.IntakeRecord", on_delete=models.SET_NULL, null=True, blank=True, related_name="physician_reviews", ) beneficiary = models.ForeignKey( "identity.Beneficiary", on_delete=models.SET_NULL, null=True, blank=True, related_name="physician_reviews", ) care_period = models.ForeignKey( "monitoring.CarePeriod", on_delete=models.SET_NULL, null=True, blank=True ) review_type = models.TextField(choices=REVIEW_TYPE_CHOICES) review_subject_id = models.UUIDField(null=True, blank=True) review_subject_type = models.TextField() decision = models.TextField(choices=DECISION_CHOICES) notes = models.TextField(null=True, blank=True) reviewed_by = models.ForeignKey("identity.User", on_delete=models.PROTECT) reviewed_at = models.DateTimeField(auto_now_add=True) def __str__(self): return f"Review: {self.review_type} -> {self.decision}" class Meta: app_label = "governance" class ClinicalReviewTask(models.Model): TASK_TYPE_CHOICES = [ ("observation_review", "Observation Review"), ("safety_signal_review", "Safety Signal Review"), ("monthly_summary_review", "Monthly Summary Review"), ("adverse_event_review", "Adverse Event Review"), ] id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) beneficiary = models.ForeignKey( "identity.Beneficiary", on_delete=models.SET_NULL, null=True, blank=True ) care_period = models.ForeignKey( "monitoring.CarePeriod", on_delete=models.SET_NULL, null=True, blank=True ) assigned_to = models.ForeignKey("identity.User", on_delete=models.PROTECT) task_type = models.TextField(choices=TASK_TYPE_CHOICES) status = models.TextField(default="pending") assigned_at = models.DateTimeField(auto_now_add=True) completed_at = models.DateTimeField(null=True, blank=True) notes = models.TextField(null=True, blank=True) def __str__(self): return f"Task: {self.task_type} -> {self.assigned_to} ({self.status})" class Meta: app_label = "governance" class SafetySignalEvent(models.Model): SEVERITY_CHOICES = [ ("red", "Red"), ("yellow", "Yellow"), ("green", "Green"), ] id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) beneficiary = models.ForeignKey( "identity.Beneficiary", on_delete=models.PROTECT, related_name="safety_signals" ) care_period = models.ForeignKey("monitoring.CarePeriod", on_delete=models.PROTECT) signal_severity = models.TextField(choices=SEVERITY_CHOICES) signal_type = models.TextField() signal_details = models.JSONField() source_record_id = models.UUIDField(null=True, blank=True) auto_generated = models.BooleanField(default=False) review_status = models.TextField(default="pending") reviewed_by = models.ForeignKey( "identity.User", on_delete=models.SET_NULL, null=True, blank=True ) reviewed_at = models.DateTimeField(null=True, blank=True) created_at = models.DateTimeField(auto_now_add=True) def __str__(self): return ( f"Signal: {self.beneficiary} - {self.signal_type} ({self.signal_severity})" ) class Meta: app_label = "governance" class ClinicalEventLog(models.Model): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) beneficiary = models.ForeignKey( "identity.Beneficiary", on_delete=models.PROTECT, related_name="event_logs" ) care_period = models.ForeignKey("monitoring.CarePeriod", on_delete=models.PROTECT) event_date = models.DateField() event_type = models.TextField() event_details = models.TextField() source_system = models.TextField() requires_review = models.BooleanField(default=False) created_at = models.DateTimeField(auto_now_add=True) def __str__(self): return f"Event: {self.beneficiary} - {self.event_type} ({self.event_date})" class Meta: app_label = "governance" class CareTeamReviewTask(models.Model): TRIGGER_CHOICES = [ ("safety_signal", "Safety Signal"), ("missed_checkin", "Missed Checkin"), ("symptom_escalation", "Symptom Escalation"), ("monthly_summary", "Monthly Summary"), ("adverse_event", "Adverse Event"), ] PRIORITY_CHOICES = [ ("low", "Low"), ("medium", "Medium"), ("high", "High"), ("urgent", "Urgent"), ] id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) beneficiary = models.ForeignKey( "identity.Beneficiary", on_delete=models.PROTECT, related_name="care_team_tasks" ) care_period = models.ForeignKey("monitoring.CarePeriod", on_delete=models.PROTECT) assigned_to = models.ForeignKey( "identity.User", on_delete=models.SET_NULL, null=True, blank=True ) trigger_type = models.TextField(choices=TRIGGER_CHOICES) trigger_record_id = models.UUIDField() priority = models.TextField(choices=PRIORITY_CHOICES) status = models.TextField(default="pending") notes = models.TextField(null=True, blank=True) assigned_at = models.DateTimeField(auto_now_add=True) completed_at = models.DateTimeField(null=True, blank=True) def __str__(self): return f"Task: {self.beneficiary} - {self.trigger_type} ({self.priority})" class Meta: app_label = "governance" class AuditEvent(models.Model): ACTION_CHOICES = [ ("view", "View"), ("create", "Create"), ("edit", "Edit"), ("approve", "Approve"), ("reject", "Reject"), ("export", "Export"), ("delete", "Delete"), ("lock", "Lock"), ("submit_to_cms", "Submit to CMS"), ] id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) # auth.User (Django's login user), not identity.User: audit rows record who # acted via request.user in the admin/API; system paths leave it null. user = models.ForeignKey( "auth.User", on_delete=models.SET_NULL, null=True, blank=True ) action = models.TextField(choices=ACTION_CHOICES) target_table = models.TextField() target_record_id = models.UUIDField() changed_fields = models.JSONField(null=True, blank=True) old_value_hash = models.TextField(null=True, blank=True) new_value_hash = models.TextField(null=True, blank=True) ip_address = models.TextField(null=True, blank=True) user_agent = models.TextField(null=True, blank=True) created_at = models.DateTimeField(auto_now_add=True) def __str__(self): return f"Audit: {self.user} {self.action} on {self.target_table}" class Meta: app_label = "governance" ordering = ["-created_at"] indexes = [ models.Index(fields=["target_table", "target_record_id"]), models.Index(fields=["user", "created_at"]), ] class PseudonymousCaseRecord(models.Model): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) beneficiary = models.ForeignKey( "identity.Beneficiary", on_delete=models.PROTECT, related_name="pseudonymous_cases", ) case_id = models.TextField(unique=True) age_band = models.TextField(null=True, blank=True) sex = models.TextField() clinical_track = models.TextField(null=True, blank=True) care_period = models.ForeignKey("monitoring.CarePeriod", on_delete=models.PROTECT) created_at = models.DateTimeField(auto_now_add=True) def __str__(self): return f"Case: {self.case_id} (track={self.clinical_track}, sex={self.sex})" class Meta: app_label = "governance" class PseudonymousClinicalPacket(models.Model): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) case_record = models.ForeignKey( PseudonymousCaseRecord, on_delete=models.CASCADE, related_name="packets" ) packet_type = models.TextField() structured_data = models.JSONField() deidentified_at = models.DateTimeField(auto_now_add=True) deidentification_method = models.TextField(null=True, blank=True) review_status = models.TextField(default="pending") reviewed_by = models.ForeignKey( "identity.User", on_delete=models.SET_NULL, null=True, blank=True ) reviewed_at = models.DateTimeField(null=True, blank=True) created_at = models.DateTimeField(auto_now_add=True) def __str__(self): return f"Packet: {self.case_record} ({self.packet_type})" class Meta: app_label = "governance"