2025-08-12 13:33:25 +03:00

137 lines
6.2 KiB
Python

from rest_framework import serializers
from ..models import MedicalBill, Payment, InsuranceClaim, BillLineItem, ClaimStatusUpdate, BillingConfiguration
class BaseSerializer(serializers.ModelSerializer):
"""Base serializer with common functionality"""
class Meta:
fields = ['id']
read_only_fields = ['created_at', 'updated_at']
class BillLineItemSerializer(serializers.ModelSerializer):
"""Serializer for BillLineItem model"""
class Meta:
model = BillLineItem
fields = [
'line_item_id', 'service_code', 'service_description',
'quantity', 'unit_price', 'total_amount', 'modifier_codes',
'diagnosis_codes', 'provider', 'service_date', 'place_of_service',
'notes', 'created_at', 'updated_at'
]
read_only_fields = ['line_item_id', 'created_at', 'updated_at']
class MedicalBillSerializer(serializers.ModelSerializer):
"""Serializer for MedicalBill model"""
line_items = BillLineItemSerializer(many=True, read_only=True)
patient_name = serializers.CharField(source='patient.get_full_name', read_only=True)
patient_mrn = serializers.CharField(source='patient.mrn', read_only=True)
days_outstanding = serializers.IntegerField(read_only=True)
is_overdue = serializers.BooleanField(read_only=True)
class Meta:
model = MedicalBill
fields = [
'bill_id', 'bill_number', 'patient', 'patient_name', 'patient_mrn',
'encounter', 'admission', 'bill_type', 'bill_date', 'due_date',
'service_date_from', 'service_date_to', 'provider', 'facility',
'referring_provider', 'total_amount', 'paid_amount', 'balance_amount',
'status', 'priority', 'billing_address', 'insurance_info',
'authorization_number', 'claim_frequency', 'statement_message',
'internal_notes', 'days_outstanding', 'is_overdue', 'line_items',
'created_at', 'updated_at'
]
read_only_fields = [
'bill_id', 'bill_number', 'paid_amount', 'balance_amount',
'days_outstanding', 'is_overdue', 'created_at', 'updated_at'
]
class PaymentSerializer(serializers.ModelSerializer):
"""Serializer for Payment model"""
medical_bill_number = serializers.CharField(source='medical_bill.bill_number', read_only=True)
patient_name = serializers.CharField(source='medical_bill.patient.get_full_name', read_only=True)
received_by_name = serializers.CharField(source='received_by.get_full_name', read_only=True)
processed_by_name = serializers.CharField(source='processed_by.get_full_name', read_only=True)
class Meta:
model = Payment
fields = [
'payment_id', 'payment_number', 'medical_bill', 'medical_bill_number',
'patient_name', 'payment_date', 'payment_amount', 'refund_amount',
'payment_method', 'payment_source', 'check_number', 'card_type',
'card_last_four', 'authorization_code', 'transaction_id',
'bank_name', 'deposit_date', 'status', 'insurance_claim',
'eob_number', 'received_by', 'received_by_name', 'processed_by',
'processed_by_name', 'notes', 'created_at', 'updated_at'
]
read_only_fields = [
'payment_id', 'payment_number', 'created_at', 'updated_at'
]
class ClaimStatusUpdateSerializer(serializers.ModelSerializer):
"""Serializer for ClaimStatusUpdate model"""
class Meta:
model = ClaimStatusUpdate
fields = [
'update_id', 'status', 'status_date', 'response_code',
'response_description', 'notes', 'updated_by',
'created_at', 'updated_at'
]
read_only_fields = ['update_id', 'created_at', 'updated_at']
class InsuranceClaimSerializer(serializers.ModelSerializer):
"""Serializer for InsuranceClaim model"""
medical_bill_number = serializers.CharField(source='medical_bill.bill_number', read_only=True)
patient_name = serializers.CharField(source='medical_bill.patient.get_full_name', read_only=True)
insurance_company = serializers.CharField(source='insurance_info.insurance_company', read_only=True)
status_updates = ClaimStatusUpdateSerializer(many=True, read_only=True)
days_pending = serializers.IntegerField(read_only=True)
class Meta:
model = InsuranceClaim
fields = [
'claim_id', 'claim_number', 'medical_bill', 'medical_bill_number',
'patient_name', 'insurance_info', 'insurance_company', 'claim_type',
'submission_date', 'response_date', 'billed_amount', 'allowed_amount',
'paid_amount', 'patient_responsibility', 'deductible_amount',
'copay_amount', 'coinsurance_amount', 'status', 'denial_reason',
'prior_auth_number', 'claim_frequency', 'place_of_service',
'diagnosis_codes', 'procedure_codes', 'provider_npi',
'facility_npi', 'subscriber_id', 'group_number', 'plan_name',
'payer_id', 'clearinghouse', 'electronic_claim_id',
'paper_claim_tracking', 'resubmission_code', 'original_claim_number',
'corrected_claim_indicator', 'days_pending', 'status_updates',
'created_at', 'updated_at'
]
read_only_fields = [
'claim_id', 'claim_number', 'days_pending', 'created_at', 'updated_at'
]
class BillingConfigurationSerializer(serializers.ModelSerializer):
"""Serializer for BillingConfiguration model"""
class Meta:
model = BillingConfiguration
fields = [
'config_id', 'payment_terms_days', 'late_fee_percentage',
'minimum_payment_amount', 'auto_generate_statements',
'statement_frequency', 'electronic_billing_enabled',
'paper_billing_enabled', 'credit_card_processing_enabled',
'ach_processing_enabled', 'payment_plan_enabled',
'collection_agency_threshold', 'write_off_threshold',
'default_payment_method', 'require_authorization',
'auto_post_payments', 'auto_post_adjustments',
'billing_address_required', 'insurance_verification_required',
'copay_collection_required', 'created_at', 'updated_at'
]
read_only_fields = ['config_id', 'created_at', 'updated_at']