HH/apps/complaints/management/commands/setup_source_based_sla.py

146 lines
7.8 KiB
Python

"""
Management command to set up source-based SLA configs.
Creates MOH and CCHI sources and sets up SLA configurations for all hospitals.
"""
from django.core.management.base import BaseCommand
from django.utils import timezone
from apps.organizations.models import Hospital
from apps.px_sources.models import PXSource
from apps.complaints.models import ComplaintSLAConfig
class Command(BaseCommand):
help = 'Set up source-based SLA configurations'
def handle(self, *args, **options):
self.stdout.write('Setting up source-based SLA configurations...')
# Step 1: Create MOH source
moh_source, created = PXSource.objects.get_or_create(
name_en='Ministry of Health',
defaults={
'name_ar': 'وزارة الصحة',
'description': 'Ministry of Health external complaints',
'is_active': True,
}
)
if created:
self.stdout.write(self.style.SUCCESS(f'✓ Created MOH source: {moh_source.name_en}'))
else:
self.stdout.write(self.style.WARNING(f'⊙ MOH source already exists: {moh_source.name_en}'))
# Step 2: Create CCHI source
cchi_source, created = PXSource.objects.get_or_create(
name_en='Council of Cooperative Health Insurance',
defaults={
'name_ar': 'مجلس التعاون الصحي المشترك',
'description': 'Council of Cooperative Health Insurance external complaints',
'is_active': True,
}
)
if created:
self.stdout.write(self.style.SUCCESS(f'✓ Created CCHI source: {cchi_source.name_en}'))
else:
self.stdout.write(self.style.WARNING(f'⊙ CCHI source already exists: {cchi_source.name_en}'))
# Get internal sources
patient_source = PXSource.objects.filter(name_en='Patient').first()
family_source = PXSource.objects.filter(name_en='Family Member').first()
staff_source = PXSource.objects.filter(name_en='Staff').first()
survey_source = PXSource.objects.filter(name_en='Survey').first()
# Step 3: Create SLA configs for each hospital
hospitals = Hospital.objects.all()
self.stdout.write(f'\nCreating SLA configs for {hospitals.count()} hospitals...\n')
created_count = 0
existing_count = 0
for hospital in hospitals:
self.stdout.write(f'\nHospital: {hospital.name}')
# MOH Config (24 hours SLA)
moh_config, created = ComplaintSLAConfig.objects.get_or_create(
hospital=hospital,
source=moh_source,
defaults={
'sla_hours': 24,
'first_reminder_hours_after': 12, # 12 hours from creation
'second_reminder_hours_after': 30, # 12 + 18 hours from creation
'escalation_hours_after': 24, # 24 hours from creation
'is_active': True,
}
)
if created:
created_count += 1
self.stdout.write(self.style.SUCCESS(f' ✓ MOH SLA Config: {moh_config.sla_hours}h, reminders at {moh_config.first_reminder_hours_after}h/{moh_config.second_reminder_hours_after}h, escalation at {moh_config.escalation_hours_after}h'))
else:
existing_count += 1
self.stdout.write(self.style.WARNING(f' ⊙ MOH SLA Config already exists'))
# CCHI Config (48 hours SLA)
cchi_config, created = ComplaintSLAConfig.objects.get_or_create(
hospital=hospital,
source=cchi_source,
defaults={
'sla_hours': 48,
'first_reminder_hours_after': 24, # 24 hours from creation
'second_reminder_hours_after': 60, # 24 + 36 hours from creation
'escalation_hours_after': 48, # 48 hours from creation
'is_active': True,
}
)
if created:
created_count += 1
self.stdout.write(self.style.SUCCESS(f' ✓ CCHI SLA Config: {cchi_config.sla_hours}h, reminders at {cchi_config.first_reminder_hours_after}h/{cchi_config.second_reminder_hours_after}h, escalation at {cchi_config.escalation_hours_after}h'))
else:
existing_count += 1
self.stdout.write(self.style.WARNING(f' ⊙ CCHI SLA Config already exists'))
# Internal Configs (72 hours SLA)
internal_sources = [
(patient_source, 'Patient'),
(family_source, 'Family Member'),
(staff_source, 'Staff'),
(survey_source, 'Survey'),
]
for source, source_name in internal_sources:
if source:
internal_config, created = ComplaintSLAConfig.objects.get_or_create(
hospital=hospital,
source=source,
defaults={
'sla_hours': 72,
'first_reminder_hours_after': 24, # 24 hours from creation
'second_reminder_hours_after': 72, # 24 + 48 hours from creation
'escalation_hours_after': 72, # 72 hours from creation
'is_active': True,
}
)
if created:
created_count += 1
self.stdout.write(self.style.SUCCESS(f'{source_name} SLA Config: {internal_config.sla_hours}h, reminders at {internal_config.first_reminder_hours_after}h/{internal_config.second_reminder_hours_after}h, escalation at {internal_config.escalation_hours_after}h'))
else:
existing_count += 1
self.stdout.write(self.style.WARNING(f'{source_name} SLA Config already exists'))
else:
self.stdout.write(self.style.WARNING(f'{source_name} source not found'))
# Summary
self.stdout.write('\n' + '='*60)
self.stdout.write(self.style.SUCCESS(f'Setup complete!'))
self.stdout.write(f'Created: {created_count} SLA configs')
self.stdout.write(f'Already existed: {existing_count} SLA configs')
self.stdout.write('='*60)
self.stdout.write('\nSLA Configuration Summary:')
self.stdout.write('┌─────────────────────────────────────┬─────────┬──────────┬──────────┬────────────┐')
self.stdout.write('│ Source │ SLA (h) │ 1st Rem │ 2nd Rem │ Escalation │')
self.stdout.write('├─────────────────────────────────────┼─────────┼──────────┼──────────┼────────────┤')
self.stdout.write('│ Ministry of Health │ 24 │ 12 │ 30 │ 24 │')
self.stdout.write('│ Council of Cooperative Health Ins. │ 48 │ 24 │ 60 │ 48 │')
self.stdout.write('│ Internal (Patient/Family/Staff) │ 72 │ 24 │ 72 │ 72 │')
self.stdout.write('└─────────────────────────────────────┴─────────┴──────────┴──────────┴────────────┘')