All checks were successful
Build and Push Docker Image / build (push) Successful in 1m5s
111 lines
8.2 KiB
Python
111 lines
8.2 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 = [
|
|
('organizations', '0001_initial'),
|
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
|
]
|
|
|
|
operations = [
|
|
migrations.CreateModel(
|
|
name='DoctorRatingImportJob',
|
|
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)),
|
|
('name', models.CharField(max_length=200)),
|
|
('status', models.CharField(choices=[('pending', 'Pending'), ('processing', 'Processing'), ('completed', 'Completed'), ('failed', 'Failed'), ('partial', 'Partial Success')], default='pending', max_length=20)),
|
|
('source', models.CharField(choices=[('his_api', 'HIS API'), ('csv_upload', 'CSV Upload')], max_length=20)),
|
|
('total_records', models.IntegerField(default=0)),
|
|
('processed_count', models.IntegerField(default=0)),
|
|
('success_count', models.IntegerField(default=0)),
|
|
('failed_count', models.IntegerField(default=0)),
|
|
('skipped_count', models.IntegerField(default=0)),
|
|
('started_at', models.DateTimeField(blank=True, null=True)),
|
|
('completed_at', models.DateTimeField(blank=True, null=True)),
|
|
('results', models.JSONField(blank=True, default=dict, help_text='Processing results and errors')),
|
|
('error_message', models.TextField(blank=True)),
|
|
('raw_data', models.JSONField(blank=True, default=list, help_text='Stored raw data for processing')),
|
|
('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='doctor_rating_jobs', to=settings.AUTH_USER_MODEL)),
|
|
('hospital', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='doctor_rating_jobs', to='organizations.hospital')),
|
|
],
|
|
options={
|
|
'ordering': ['-created_at'],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='PhysicianIndividualRating',
|
|
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)),
|
|
('source', models.CharField(choices=[('his_api', 'HIS API'), ('csv_import', 'CSV Import'), ('manual', 'Manual Entry')], default='manual', max_length=20)),
|
|
('source_reference', models.CharField(blank=True, help_text='Reference ID from source system (e.g., HIS record ID)', max_length=100)),
|
|
('doctor_name_raw', models.CharField(help_text='Doctor name as received (may include ID prefix)', max_length=300)),
|
|
('doctor_id', models.CharField(blank=True, db_index=True, help_text="Doctor ID extracted from source (e.g., '10738')", max_length=50)),
|
|
('doctor_name', models.CharField(blank=True, help_text='Clean doctor name without ID', max_length=200)),
|
|
('department_name', models.CharField(blank=True, help_text='Department name from source', max_length=200)),
|
|
('patient_uhid', models.CharField(blank=True, db_index=True, help_text='Patient UHID/MRN (optional for HIS ratings)', max_length=100, null=True)),
|
|
('patient_name', models.CharField(blank=True, max_length=300, null=True)),
|
|
('patient_gender', models.CharField(blank=True, default='', max_length=20)),
|
|
('patient_age', models.CharField(blank=True, default='', max_length=50)),
|
|
('patient_nationality', models.CharField(blank=True, default='', max_length=100)),
|
|
('patient_phone', models.CharField(blank=True, default='', max_length=30)),
|
|
('patient_type', models.CharField(blank=True, choices=[('IP', 'Inpatient'), ('OP', 'Outpatient'), ('ER', 'Emergency'), ('DC', 'Day Case')], max_length=10, null=True)),
|
|
('admit_date', models.DateTimeField(blank=True, null=True)),
|
|
('discharge_date', models.DateTimeField(blank=True, null=True)),
|
|
('rating', models.IntegerField(help_text='Rating from 1-5')),
|
|
('feedback', models.TextField(blank=True)),
|
|
('rating_date', models.DateTimeField()),
|
|
('is_aggregated', models.BooleanField(default=False, help_text='Whether this rating has been included in monthly aggregation')),
|
|
('aggregated_at', models.DateTimeField(blank=True, null=True)),
|
|
('metadata', models.JSONField(blank=True, default=dict, help_text='Additional data from source')),
|
|
('hospital', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='physician_ratings', to='organizations.hospital')),
|
|
('staff', models.ForeignKey(blank=True, help_text='Linked staff record (if matched)', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='individual_ratings', to='organizations.staff')),
|
|
],
|
|
options={
|
|
'ordering': ['-rating_date', '-created_at'],
|
|
'indexes': [models.Index(fields=['hospital', '-rating_date'], name='physicians__hospita_aeea63_idx'), models.Index(fields=['staff', '-rating_date'], name='physicians__staff_i_6b8c39_idx'), models.Index(fields=['doctor_id', '-rating_date'], name='physicians__doctor__b60e4e_idx'), models.Index(fields=['is_aggregated', 'rating_date'], name='physicians__is_aggr_01d659_idx'), models.Index(fields=['patient_uhid', '-rating_date'], name='physicians__patient_5e8644_idx')],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='PhysicianMonthlyRating',
|
|
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)),
|
|
('year', models.IntegerField(db_index=True)),
|
|
('month', models.IntegerField(db_index=True, help_text='1-12')),
|
|
('average_rating', models.DecimalField(decimal_places=2, help_text='Average rating (1-5)', max_digits=3)),
|
|
('total_surveys', models.IntegerField(help_text='Number of surveys included')),
|
|
('positive_count', models.IntegerField(default=0)),
|
|
('neutral_count', models.IntegerField(default=0)),
|
|
('negative_count', models.IntegerField(default=0)),
|
|
('rating_1_count', models.IntegerField(default=0)),
|
|
('rating_2_count', models.IntegerField(default=0)),
|
|
('rating_3_count', models.IntegerField(default=0)),
|
|
('rating_4_count', models.IntegerField(default=0)),
|
|
('rating_5_count', models.IntegerField(default=0)),
|
|
('md_consult_rating', models.DecimalField(blank=True, decimal_places=2, max_digits=3, null=True)),
|
|
('hospital_rank', models.IntegerField(blank=True, help_text='Rank within hospital', null=True)),
|
|
('department_rank', models.IntegerField(blank=True, help_text='Rank within department', null=True)),
|
|
('metadata', models.JSONField(blank=True, default=dict)),
|
|
('staff', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='monthly_ratings', to='organizations.staff')),
|
|
],
|
|
options={
|
|
'ordering': ['-year', '-month', '-average_rating'],
|
|
'indexes': [models.Index(fields=['staff', '-year', '-month'], name='physicians__staff_i_f4cc8b_idx'), models.Index(fields=['year', 'month', '-average_rating'], name='physicians__year_e38883_idx')],
|
|
'unique_together': {('staff', 'year', 'month')},
|
|
},
|
|
),
|
|
]
|