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']