135 lines
3.8 KiB
Python
135 lines
3.8 KiB
Python
"""
|
|
Call Center models - Call center interaction tracking and ratings
|
|
|
|
This module implements call center tracking that:
|
|
- Records call center interactions
|
|
- Tracks agent performance
|
|
- Monitors wait times and satisfaction
|
|
- Creates PX actions for low ratings
|
|
"""
|
|
from django.db import models
|
|
|
|
from apps.core.models import TimeStampedModel, UUIDModel
|
|
|
|
|
|
class CallCenterInteraction(UUIDModel, TimeStampedModel):
|
|
"""
|
|
Call center interaction - tracks calls with patients.
|
|
|
|
Low ratings trigger PX action creation.
|
|
"""
|
|
# Patient information
|
|
patient = models.ForeignKey(
|
|
'organizations.Patient',
|
|
on_delete=models.CASCADE,
|
|
null=True,
|
|
blank=True,
|
|
related_name='call_center_interactions'
|
|
)
|
|
|
|
# Caller information (if not a patient)
|
|
caller_name = models.CharField(max_length=200, blank=True)
|
|
caller_phone = models.CharField(max_length=20, blank=True)
|
|
caller_relationship = models.CharField(
|
|
max_length=50,
|
|
choices=[
|
|
('patient', 'Patient'),
|
|
('family', 'Family Member'),
|
|
('other', 'Other'),
|
|
],
|
|
default='patient'
|
|
)
|
|
|
|
# Organization
|
|
hospital = models.ForeignKey(
|
|
'organizations.Hospital',
|
|
on_delete=models.CASCADE,
|
|
related_name='call_center_interactions'
|
|
)
|
|
department = models.ForeignKey(
|
|
'organizations.Department',
|
|
on_delete=models.SET_NULL,
|
|
null=True,
|
|
blank=True,
|
|
related_name='call_center_interactions'
|
|
)
|
|
|
|
# Agent information
|
|
agent = models.ForeignKey(
|
|
'accounts.User',
|
|
on_delete=models.SET_NULL,
|
|
null=True,
|
|
blank=True,
|
|
related_name='call_center_interactions'
|
|
)
|
|
|
|
# Call details
|
|
call_type = models.CharField(
|
|
max_length=50,
|
|
choices=[
|
|
('inquiry', 'Inquiry'),
|
|
('complaint', 'Complaint'),
|
|
('appointment', 'Appointment'),
|
|
('follow_up', 'Follow-up'),
|
|
('feedback', 'Feedback'),
|
|
('other', 'Other'),
|
|
],
|
|
db_index=True
|
|
)
|
|
|
|
subject = models.CharField(max_length=500)
|
|
notes = models.TextField(blank=True)
|
|
|
|
# Metrics
|
|
wait_time_seconds = models.IntegerField(
|
|
null=True,
|
|
blank=True,
|
|
help_text="Time caller waited before agent answered"
|
|
)
|
|
call_duration_seconds = models.IntegerField(
|
|
null=True,
|
|
blank=True,
|
|
help_text="Total call duration"
|
|
)
|
|
|
|
# Rating (1-5 scale)
|
|
satisfaction_rating = models.IntegerField(
|
|
null=True,
|
|
blank=True,
|
|
help_text="Caller satisfaction rating (1-5)"
|
|
)
|
|
is_low_rating = models.BooleanField(
|
|
default=False,
|
|
db_index=True,
|
|
help_text="True if rating below threshold (< 3)"
|
|
)
|
|
|
|
# Resolution
|
|
resolved = models.BooleanField(default=False)
|
|
resolution_notes = models.TextField(blank=True)
|
|
|
|
# Timestamps
|
|
call_started_at = models.DateTimeField(auto_now_add=True)
|
|
call_ended_at = models.DateTimeField(null=True, blank=True)
|
|
|
|
# Metadata
|
|
metadata = models.JSONField(default=dict, blank=True)
|
|
|
|
class Meta:
|
|
ordering = ['-call_started_at']
|
|
indexes = [
|
|
models.Index(fields=['hospital', '-call_started_at']),
|
|
models.Index(fields=['agent', '-call_started_at']),
|
|
models.Index(fields=['is_low_rating', '-call_started_at']),
|
|
]
|
|
|
|
def __str__(self):
|
|
caller = self.patient.get_full_name() if self.patient else self.caller_name
|
|
return f"{caller} - {self.call_type} ({self.call_started_at.strftime('%Y-%m-%d %H:%M')})"
|
|
|
|
def save(self, *args, **kwargs):
|
|
"""Check if rating is low"""
|
|
if self.satisfaction_rating and self.satisfaction_rating < 3:
|
|
self.is_low_rating = True
|
|
super().save(*args, **kwargs)
|