HH/apps/physicians/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

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')},
},
),
]