164 lines
6.5 KiB
Python
164 lines
6.5 KiB
Python
from django.core.management.base import BaseCommand
|
|
from django.utils import timezone
|
|
from apps.surveys.models import SurveyTemplate, SurveyQuestion
|
|
from apps.integrations.models import SurveyTemplateMapping
|
|
from apps.organizations.models import Hospital
|
|
from django.db import transaction
|
|
|
|
|
|
class Command(BaseCommand):
|
|
help = 'Seed survey template mappings for HIS integration'
|
|
|
|
SATISFACTION_OPTIONS = [
|
|
'Very Unsatisfied',
|
|
'Poor',
|
|
'Neutral',
|
|
'Good',
|
|
'Very Satisfied'
|
|
]
|
|
|
|
def handle(self, *args, **options):
|
|
self.stdout.write(self.style.SUCCESS('Seeding survey template mappings...'))
|
|
|
|
# Get or create satisfaction surveys
|
|
inpatient_survey = self.get_or_create_satisfaction_survey(
|
|
'Inpatient Satisfaction Survey',
|
|
'How satisfied were you with your inpatient stay?'
|
|
)
|
|
|
|
outpatient_survey = self.get_or_create_satisfaction_survey(
|
|
'Outpatient Satisfaction Survey',
|
|
'How satisfied were you with your outpatient visit?'
|
|
)
|
|
|
|
appointment_survey = self.get_or_create_satisfaction_survey(
|
|
'Appointment Satisfaction Survey',
|
|
'How satisfied were you with your appointment?'
|
|
)
|
|
|
|
# Create mappings for patient types
|
|
self.create_or_update_mapping('INPATIENT', inpatient_survey, 'Inpatient')
|
|
self.create_or_update_mapping('OUTPATIENT', outpatient_survey, 'Outpatient')
|
|
self.create_or_update_mapping('APPOINTMENT', appointment_survey, 'Appointment')
|
|
|
|
self.stdout.write(self.style.SUCCESS('Survey template mappings seeded successfully!'))
|
|
self.stdout.write('\nSurvey Templates:')
|
|
self.stdout.write(f' - Inpatient: {inpatient_survey.name} (ID: {inpatient_survey.id})')
|
|
self.stdout.write(f' - Outpatient: {outpatient_survey.name} (ID: {outpatient_survey.id})')
|
|
self.stdout.write(f' - Appointment: {appointment_survey.name} (ID: {appointment_survey.id})')
|
|
|
|
def get_or_create_satisfaction_survey(self, name, question_text):
|
|
"""Get or create a satisfaction survey with multiple choice question"""
|
|
survey = SurveyTemplate.objects.filter(name=name).first()
|
|
|
|
if not survey:
|
|
self.stdout.write(f'Creating survey: {name}')
|
|
# Get first hospital (default)
|
|
hospital = Hospital.objects.first()
|
|
if not hospital:
|
|
self.stdout.write(self.style.ERROR('No hospital found! Please create a hospital first.'))
|
|
return None
|
|
|
|
survey = SurveyTemplate.objects.create(
|
|
name=name,
|
|
description=f'{name} for patient feedback collection',
|
|
hospital=hospital,
|
|
survey_type='general',
|
|
is_active=True
|
|
)
|
|
|
|
# Create the satisfaction question with choices
|
|
choices = []
|
|
for idx, option_text in enumerate(self.SATISFACTION_OPTIONS, 1):
|
|
choices.append({
|
|
'value': str(idx),
|
|
'label': option_text,
|
|
'label_ar': option_text
|
|
})
|
|
|
|
question = SurveyQuestion.objects.create(
|
|
survey_template=survey,
|
|
text=question_text,
|
|
question_type='multiple_choice',
|
|
order=1,
|
|
is_required=True,
|
|
choices_json=choices
|
|
)
|
|
|
|
self.stdout.write(f' Created question: {question_text}')
|
|
self.stdout.write(f' Added {len(self.SATISFACTION_OPTIONS)} satisfaction options')
|
|
else:
|
|
# Ensure the question has correct options
|
|
self.update_satisfaction_question(survey)
|
|
self.stdout.write(f'Found existing survey: {name}')
|
|
|
|
return survey
|
|
|
|
def update_satisfaction_question(self, survey):
|
|
"""Update survey question to ensure it has correct satisfaction options"""
|
|
question = survey.questions.filter(
|
|
question_type='multiple_choice'
|
|
).first()
|
|
|
|
if not question:
|
|
self.stdout.write(f' Warning: No multiple choice question found in {survey.name}')
|
|
return
|
|
|
|
# Check if all options exist
|
|
existing_choices = question.choices_json or []
|
|
existing_labels = {choice['label'] for choice in existing_choices}
|
|
required_options = set(self.SATISFACTION_OPTIONS)
|
|
|
|
if existing_labels == required_options:
|
|
self.stdout.write(f' Question has correct satisfaction options')
|
|
return
|
|
|
|
# Rebuild choices with all required options
|
|
choices = []
|
|
for idx, option_text in enumerate(self.SATISFACTION_OPTIONS, 1):
|
|
# Find existing choice if it exists
|
|
existing_choice = next(
|
|
(c for c in existing_choices if c['label'] == option_text),
|
|
None
|
|
)
|
|
if existing_choice:
|
|
choices.append(existing_choice)
|
|
else:
|
|
choices.append({
|
|
'value': str(idx),
|
|
'label': option_text,
|
|
'label_ar': option_text
|
|
})
|
|
|
|
question.choices_json = choices
|
|
question.save()
|
|
self.stdout.write(f' Updated question with correct satisfaction options')
|
|
|
|
def create_or_update_mapping(self, patient_type, survey_template, description):
|
|
"""Create or update a survey template mapping"""
|
|
mapping = SurveyTemplateMapping.objects.filter(
|
|
patient_type=patient_type,
|
|
is_active=True
|
|
).first()
|
|
|
|
if mapping:
|
|
if mapping.survey_template != survey_template:
|
|
mapping.survey_template = survey_template
|
|
mapping.save()
|
|
self.stdout.write(f'Updated mapping for {description}: {survey_template.name}')
|
|
else:
|
|
self.stdout.write(f'Existing mapping for {description}: {survey_template.name}')
|
|
else:
|
|
# Deactivate existing mappings for this patient type
|
|
SurveyTemplateMapping.objects.filter(
|
|
patient_type=patient_type
|
|
).update(is_active=False)
|
|
|
|
# Create new active mapping
|
|
mapping = SurveyTemplateMapping.objects.create(
|
|
patient_type=patient_type,
|
|
survey_template=survey_template,
|
|
is_active=True
|
|
)
|
|
self.stdout.write(f'Created mapping for {description}: {survey_template.name}')
|