HH/apps/dashboard/migrations/0001_initial.py
ismail fd19216b0d
All checks were successful
Build and Push Docker Image / build (push) Successful in 1m5s
track migrations in git, regenerate fresh initial migrations, add staging-test compose, fix .gitignore
2026-05-11 23:34:39 +03:00

144 lines
14 KiB
Python

# Generated by Django 6.0.1 on 2026-05-11 20:32
import django.db.models.deletion
import uuid
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
('complaints', '0001_initial'),
('organizations', '0001_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='ComplaintRequest',
fields=[
('created_at', models.DateTimeField(auto_now_add=True, db_index=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('patient_name', models.CharField(blank=True, help_text='Patient name', max_length=200)),
('file_number', models.CharField(blank=True, help_text='Patient file number', max_length=100)),
('incident_date', models.DateField(blank=True, help_text='Date of the incident', null=True)),
('phone_number', models.CharField(blank=True, help_text='Patient phone number', max_length=20)),
('filled', models.BooleanField(default=False, help_text='Whether the request was filled')),
('on_hold', models.BooleanField(default=False, help_text='Whether the request is on hold')),
('not_filled', models.BooleanField(default=False, help_text='Whether the request was not filled')),
('from_barcode', models.BooleanField(default=False, help_text='Whether the request came from barcode scanning')),
('filling_time_category', models.CharField(choices=[('same_time', 'Same Time'), ('within_6h', 'Within 6 Hours'), ('6_to_24h', '6 to 24 Hours'), ('after_1_day', 'After 1 Day'), ('not_mentioned', 'Time Not Mentioned')], default='not_mentioned', help_text='When the request was filled', max_length=20)),
('request_date', models.DateField(help_text='Date of the request')),
('request_time', models.TimeField(blank=True, help_text='Time of the request', null=True)),
('form_sent_at', models.DateTimeField(blank=True, help_text='When complaint form was sent to patient', null=True)),
('form_sent_time', models.TimeField(blank=True, help_text='Time when form was sent', null=True)),
('filled_at', models.DateTimeField(blank=True, help_text='When the request was filled', null=True)),
('filled_time', models.TimeField(blank=True, help_text='Time when request was filled', null=True)),
('reason_non_activation', models.CharField(blank=True, choices=[('converted_to_note', 'تم تحويلها ملاحظة (Converted to observation)'), ('issue_resolved_immediately', 'تم حل الاشكالية (Issue resolved immediately)'), ('not_meeting_conditions', 'غير مستوفية للشروط (Does not meet conditions)'), ('raised_via_cchi', 'تم رفع الشكوى عن طريق مجلس الضمان الصحي (Raised via CCHI)'), ('request_not_activated', 'لم يتم تفعيل طلب الشكوى (Request not activated)'), ('complainant_withdrew', 'بناء على طلب المشتكي (Per complainant request)'), ('complainant_retracted', 'المشتكي تنازل عن الشكوى (Complainant retracted)'), ('duplicate', 'مكررة (Duplicate)'), ('other', 'Other')], help_text='Reason complaint was not activated', max_length=50)),
('reason_non_activation_other', models.CharField(blank=True, help_text='Other reason details', max_length=200)),
('pr_observations', models.TextField(blank=True, help_text='PR team observations about this request')),
('notes', models.TextField(blank=True, help_text='Additional notes about the request')),
('complained_department', models.ForeignKey(blank=True, help_text='Department being complained about', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='complaint_requests', to='organizations.department')),
('complaint', models.ForeignKey(blank=True, help_text='Related complaint (if any)', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='complaint_request_records', to='complaints.complaint')),
('hospital', models.ForeignKey(blank=True, help_text='Hospital where the request was made', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='complaint_requests', to='organizations.hospital')),
('staff', models.ForeignKey(help_text='Staff member who sent/filled the request', on_delete=django.db.models.deletion.CASCADE, related_name='complaint_requests_sent', to=settings.AUTH_USER_MODEL)),
],
options={
'verbose_name': 'Complaint Request',
'verbose_name_plural': 'Complaint Requests',
'ordering': ['-request_date', '-created_at'],
'indexes': [models.Index(fields=['staff', 'request_date'], name='dashboard_c_staff_i_6d32eb_idx'), models.Index(fields=['filled', 'on_hold'], name='dashboard_c_filled_9bb46e_idx'), models.Index(fields=['request_date'], name='dashboard_c_request_f114d3_idx'), models.Index(fields=['hospital', 'request_date'], name='dashboard_c_hospita_def391_idx'), models.Index(fields=['reason_non_activation'], name='dashboard_c_reason__fe9deb_idx')],
},
),
migrations.CreateModel(
name='EscalatedComplaintLog',
fields=[
('created_at', models.DateTimeField(auto_now_add=True, db_index=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('escalation_timing', models.CharField(choices=[('before_72h', 'Before 72 Hours'), ('exactly_72h', '72 Hours Exactly'), ('after_72h', 'After 72 Hours')], help_text='When the complaint was escalated relative to 72h SLA', max_length=20)),
('escalated_at', models.DateTimeField(help_text='When the complaint was escalated')),
('is_resolved', models.BooleanField(default=False, help_text='Whether the escalated complaint was resolved')),
('resolved_at', models.DateTimeField(blank=True, help_text='When the escalated complaint was resolved', null=True)),
('resolution_notes', models.TextField(blank=True, help_text='Notes about the resolution')),
('week_start_date', models.DateField(help_text='Start date of the week this escalation is recorded for')),
('complaint', models.ForeignKey(help_text='The escalated complaint', on_delete=django.db.models.deletion.CASCADE, related_name='escalation_logs', to='complaints.complaint')),
('staff', models.ForeignKey(help_text='Staff member who the complaint is assigned to', on_delete=django.db.models.deletion.CASCADE, related_name='escalated_complaints', to=settings.AUTH_USER_MODEL)),
],
options={
'verbose_name': 'Escalated Complaint Log',
'verbose_name_plural': 'Escalated Complaint Logs',
'ordering': ['-escalated_at', '-created_at'],
'indexes': [models.Index(fields=['staff', 'week_start_date'], name='dashboard_e_staff_i_6fc418_idx'), models.Index(fields=['escalation_timing', 'is_resolved'], name='dashboard_e_escalat_06e4bf_idx'), models.Index(fields=['week_start_date'], name='dashboard_e_week_st_bf1d71_idx')],
},
),
migrations.CreateModel(
name='EvaluationNote',
fields=[
('created_at', models.DateTimeField(auto_now_add=True, db_index=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('category', models.CharField(choices=[('non_medical', 'Non-Medical'), ('medical', 'Medical'), ('er', 'ER'), ('hospital', 'Hospital')], help_text='Note category', max_length=50)),
('sub_category', models.CharField(choices=[('it_app', 'IT - App'), ('lab', 'LAB'), ('doctors_managers_reception', 'Doctors/Managers/Reception'), ('hospital_general', 'Hospital'), ('medical_reports', 'Medical Reports'), ('doctors', 'Doctors'), ('other', 'Other')], help_text='Note sub-category', max_length=50)),
('count', models.IntegerField(default=1, help_text='Number of notes in this category')),
('note_date', models.DateField(help_text='Date the note was recorded')),
('description', models.TextField(blank=True, help_text='Optional description')),
('created_by', models.ForeignKey(blank=True, help_text='User who created this note entry', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='notes_created', to=settings.AUTH_USER_MODEL)),
('staff', models.ForeignKey(help_text='Staff member this note is for', on_delete=django.db.models.deletion.CASCADE, related_name='evaluation_notes', to=settings.AUTH_USER_MODEL)),
],
options={
'verbose_name': 'Evaluation Note',
'verbose_name_plural': 'Evaluation Notes',
'ordering': ['-note_date', 'category', 'sub_category'],
'indexes': [models.Index(fields=['staff', 'note_date'], name='dashboard_e_staff_i_5cb15c_idx'), models.Index(fields=['category', 'sub_category'], name='dashboard_e_categor_1b7060_idx'), models.Index(fields=['note_date'], name='dashboard_e_note_da_51e000_idx')],
},
),
migrations.CreateModel(
name='InquiryDetail',
fields=[
('created_at', models.DateTimeField(auto_now_add=True, db_index=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('inquiry_type', models.CharField(choices=[('contact_doctor', 'Contact the doctor'), ('sick_leave_reports', 'Sick-Leave - Medical Reports'), ('blood_test', 'Blood test result'), ('raise_complaint', 'Raise a Complaint'), ('app_problem', 'Problem with the app'), ('medication', 'Ask about medication'), ('insurance_status', 'Insurance request status'), ('general_question', 'General question'), ('other', 'Other')], help_text='Type of inquiry', max_length=50)),
('is_outgoing', models.BooleanField(default=False, help_text='Whether this is an outgoing inquiry')),
('response_time_category', models.CharField(blank=True, choices=[('24h', '24 Hours'), ('48h', '48 Hours'), ('72h', '72 Hours'), ('more_than_72h', 'More than 72 Hours')], help_text='Response time category', max_length=20)),
('inquiry_status', models.CharField(blank=True, choices=[('in_progress', 'تحت الإجراء (In Progress)'), ('contacted', 'تم التواصل (Contacted)'), ('contacted_no_response', 'تم التواصل ولم يتم الرد (Contacted No Response)')], help_text='Current status of the inquiry', max_length=50)),
('inquiry_date', models.DateField(help_text='Date of the inquiry')),
('notes', models.TextField(blank=True, help_text='Additional notes')),
('inquiry', models.OneToOneField(help_text='Related inquiry', on_delete=django.db.models.deletion.CASCADE, related_name='evaluation_detail', to='complaints.inquiry')),
('staff', models.ForeignKey(help_text='Staff member handling the inquiry', on_delete=django.db.models.deletion.CASCADE, related_name='inquiry_details', to=settings.AUTH_USER_MODEL)),
],
options={
'verbose_name': 'Inquiry Detail',
'verbose_name_plural': 'Inquiry Details',
'ordering': ['-inquiry_date', '-created_at'],
'indexes': [models.Index(fields=['staff', 'inquiry_date'], name='dashboard_i_staff_i_cee374_idx'), models.Index(fields=['inquiry_type', 'is_outgoing'], name='dashboard_i_inquiry_5064f6_idx'), models.Index(fields=['inquiry_date'], name='dashboard_i_inquiry_4e47dd_idx')],
},
),
migrations.CreateModel(
name='ReportCompletion',
fields=[
('created_at', models.DateTimeField(auto_now_add=True, db_index=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('report_type', models.CharField(choices=[('complaint_report', 'Complaint Report'), ('complaint_request_report', 'Complaint Request Report'), ('observation_report', 'Observation Report'), ('incoming_inquiries_report', 'Incoming Inquiries Report'), ('outgoing_inquiries_report', 'Outgoing Inquiries Report'), ('extension_report', 'Extension Report'), ('escalated_complaints_report', 'Escalated Complaints Report')], help_text='Type of report', max_length=50)),
('is_completed', models.BooleanField(default=False, help_text='Whether the report is completed')),
('completed_at', models.DateTimeField(blank=True, help_text='When the report was completed', null=True)),
('week_start_date', models.DateField(help_text='Start date of the week this report is for')),
('notes', models.TextField(blank=True, help_text='Notes about the report completion')),
('staff', models.ForeignKey(help_text='Staff member who should complete the report', on_delete=django.db.models.deletion.CASCADE, related_name='report_completions', to=settings.AUTH_USER_MODEL)),
],
options={
'verbose_name': 'Report Completion',
'verbose_name_plural': 'Report Completions',
'ordering': ['-week_start_date', 'report_type'],
'indexes': [models.Index(fields=['staff', 'week_start_date'], name='dashboard_r_staff_i_e94140_idx'), models.Index(fields=['report_type', 'is_completed'], name='dashboard_r_report__6e699b_idx'), models.Index(fields=['week_start_date'], name='dashboard_r_week_st_8558ae_idx')],
'unique_together': {('staff', 'report_type', 'week_start_date')},
},
),
]