137 lines
6.2 KiB
Python
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']
|
|
|