146 lines
7.8 KiB
Python
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('└─────────────────────────────────────┴─────────┴──────────┴──────────┴────────────┘') |