""" Complaints serializers """ from rest_framework import serializers from .models import Complaint, ComplaintAttachment, ComplaintUpdate, Inquiry class ComplaintAttachmentSerializer(serializers.ModelSerializer): """Complaint attachment serializer""" uploaded_by_name = serializers.SerializerMethodField() class Meta: model = ComplaintAttachment fields = [ 'id', 'complaint', 'file', 'filename', 'file_type', 'file_size', 'uploaded_by', 'uploaded_by_name', 'description', 'created_at', 'updated_at' ] read_only_fields = ['id', 'file_size', 'created_at', 'updated_at'] def get_uploaded_by_name(self, obj): """Get uploader name""" if obj.uploaded_by: return obj.uploaded_by.get_full_name() return None class ComplaintUpdateSerializer(serializers.ModelSerializer): """Complaint update serializer""" created_by_name = serializers.SerializerMethodField() class Meta: model = ComplaintUpdate fields = [ 'id', 'complaint', 'update_type', 'message', 'created_by', 'created_by_name', 'old_status', 'new_status', 'metadata', 'created_at', 'updated_at' ] read_only_fields = ['id', 'created_at', 'updated_at'] def get_created_by_name(self, obj): """Get creator name""" if obj.created_by: return obj.created_by.get_full_name() return None class ComplaintSerializer(serializers.ModelSerializer): """Complaint serializer""" patient_name = serializers.CharField(source='patient.get_full_name', read_only=True) patient_mrn = serializers.CharField(source='patient.mrn', read_only=True) hospital_name = serializers.CharField(source='hospital.name', read_only=True) department_name = serializers.CharField(source='department.name', read_only=True) physician_name = serializers.SerializerMethodField() assigned_to_name = serializers.SerializerMethodField() attachments = ComplaintAttachmentSerializer(many=True, read_only=True) updates = ComplaintUpdateSerializer(many=True, read_only=True) sla_status = serializers.SerializerMethodField() class Meta: model = Complaint fields = [ 'id', 'patient', 'patient_name', 'patient_mrn', 'encounter_id', 'hospital', 'hospital_name', 'department', 'department_name', 'physician', 'physician_name', 'title', 'description', 'category', 'subcategory', 'priority', 'severity', 'source', 'status', 'assigned_to', 'assigned_to_name', 'assigned_at', 'due_at', 'is_overdue', 'sla_status', 'reminder_sent_at', 'escalated_at', 'resolution', 'resolved_at', 'resolved_by', 'closed_at', 'closed_by', 'resolution_survey', 'resolution_survey_sent_at', 'attachments', 'updates', 'metadata', 'created_at', 'updated_at' ] read_only_fields = [ 'id', 'assigned_at', 'is_overdue', 'reminder_sent_at', 'escalated_at', 'resolved_at', 'closed_at', 'resolution_survey_sent_at', 'created_at', 'updated_at' ] def get_physician_name(self, obj): """Get physician name""" if obj.physician: return obj.physician.get_full_name() return None def get_assigned_to_name(self, obj): """Get assigned user name""" if obj.assigned_to: return obj.assigned_to.get_full_name() return None def get_sla_status(self, obj): """Get SLA status""" if obj.is_overdue: return 'overdue' from django.utils import timezone time_remaining = obj.due_at - timezone.now() hours_remaining = time_remaining.total_seconds() / 3600 if hours_remaining < 4: return 'due_soon' return 'on_time' class ComplaintListSerializer(serializers.ModelSerializer): """Simplified complaint serializer for list views""" patient_name = serializers.CharField(source='patient.get_full_name', read_only=True) hospital_name = serializers.CharField(source='hospital.name', read_only=True) sla_status = serializers.SerializerMethodField() class Meta: model = Complaint fields = [ 'id', 'title', 'patient_name', 'hospital_name', 'category', 'severity', 'status', 'sla_status', 'assigned_to', 'created_at' ] def get_sla_status(self, obj): """Get SLA status""" if obj.is_overdue: return 'overdue' from django.utils import timezone time_remaining = obj.due_at - timezone.now() hours_remaining = time_remaining.total_seconds() / 3600 if hours_remaining < 4: return 'due_soon' return 'on_time' class InquirySerializer(serializers.ModelSerializer): """Inquiry serializer""" patient_name = serializers.CharField(source='patient.get_full_name', read_only=True) hospital_name = serializers.CharField(source='hospital.name', read_only=True) department_name = serializers.CharField(source='department.name', read_only=True) assigned_to_name = serializers.SerializerMethodField() class Meta: model = Inquiry fields = [ 'id', 'patient', 'patient_name', 'contact_name', 'contact_phone', 'contact_email', 'hospital', 'hospital_name', 'department', 'department_name', 'subject', 'message', 'category', 'status', 'assigned_to', 'assigned_to_name', 'response', 'responded_at', 'responded_by', 'created_at', 'updated_at' ] read_only_fields = ['id', 'responded_at', 'created_at', 'updated_at'] def get_assigned_to_name(self, obj): """Get assigned user name""" if obj.assigned_to: return obj.assigned_to.get_full_name() return None