Skip to content

m-medical Module

CGHS/CSMA-style medical claims and reimbursement.


class MedicalAdvance(BaseDocType):
"""Medical advance application."""
advance_number: str = Field(max_length=50, unique=True)
depot: str # FK to Depot
employee: str # FK to Employee
dependent: str | None = None # FK to EmployeeFamily (None = self)
illness_name: str
application_date: date
amount_requested: Decimal
amount_approved: Decimal | None = None
justification: str | None = None
status: str = "Pending" # Pending, Approved, Rejected, Recovered
# Recovery tracking
recovery_status: str = "Unrecovered" # Unrecovered, UnderRecovery, Recovered
remarks: str | None = None
class Meta:
table_name = "medical_advance"
class MedicalClaim(BaseDocType):
"""Form 97 medical reimbursement claim."""
form_97_number: str = Field(max_length=50, unique=True)
depot: str
employee: str
submission_date: date
# Patient
dependent: str | None = None # None = self
place_of_illness: str | None = None
treatment_reason: str
treatment_start_date: date
treatment_end_date: date | None = None
# TBCT (special fund)
is_tbct_case: bool = False
# Amounts
net_claim_amount: Decimal = Decimal("0")
net_admissible_amount: Decimal = Decimal("0")
amount_approved: Decimal = Decimal("0")
# Reference to advance
medical_advance: str | None = None # FK to MedicalAdvance
status: str = "Pending" # Pending, Verified, Approved, Rejected
remarks: str | None = None
# Child tables
medicines: list["MedicalClaimMedicine"] = []
tests: list["MedicalClaimTest"] = []
hospitalizations: list["MedicalClaimHospitalization"] = []
consultations: list["MedicalClaimConsultation"] = []
miscellaneous: list["MedicalClaimMisc"] = []
class Meta:
table_name = "medical_claim"
class MedicalClaimMedicine(BaseDocType):
"""Medicine details in claim."""
parent: str # FK to MedicalClaim
serial_no: int
medicine: str | None = None # FK to MedicineMaster
medicine_name: str
claimed_amount: Decimal
admissible_amount: Decimal = Decimal("0")
is_admissible: bool = True
remarks: str | None = None
class Meta:
table_name = "medical_claim_medicine"
class MedicalClaimTest(BaseDocType):
"""Test details in claim."""
parent: str
serial_no: int
test: str | None = None # FK to TestMaster
hospital_name: str | None = None
claimed_amount: Decimal
admissible_amount: Decimal = Decimal("0")
is_admissible: bool = True
remarks: str | None = None
class Meta:
table_name = "medical_claim_test"
class MedicalClaimHospitalization(BaseDocType):
"""Hospitalization details in claim."""
parent: str
serial_no: int
hospital: str | None = None # FK to HospitalMaster
hospital_name: str
admission_date: date
discharge_date: date | None = None
emergency_certificate: bool = False
distant_hospital_certificate: bool = False
claimed_amount: Decimal
admissible_amount: Decimal = Decimal("0")
is_admissible: bool = True
remarks: str | None = None
class Meta:
table_name = "medical_claim_hospitalization"
class MedicalClaimConsultation(BaseDocType):
"""Consultation details in claim."""
parent: str
serial_no: int
ama: str | None = None # FK to AMAMaster
doctor_name: str
is_specialist: bool = False
hospital_name: str | None = None
claimed_amount: Decimal
admissible_amount: Decimal = Decimal("0")
is_admissible: bool = True
remarks: str | None = None
class Meta:
table_name = "medical_claim_consultation"
class MedicalClaimMisc(BaseDocType):
"""Miscellaneous expenses in claim."""
parent: str
serial_no: int
csma_code: str | None = None # FK to CSMARates
description: str
claimed_amount: Decimal
admissible_amount: Decimal = Decimal("0")
is_admissible: bool = True
remarks: str | None = None
class Meta:
table_name = "medical_claim_misc"

class HospitalMaster(BaseDocType):
"""Legacy ERP authorized hospitals."""
code: str = Field(max_length=20, unique=True)
name: str = Field(max_length=200)
address_line_1: str | None = None
address_line_2: str | None = None
city: str | None = None
pincode: str | None = None
class Meta:
table_name = "hospital_master"
class MedicineMaster(BaseDocType):
"""Approved medicines."""
code: str = Field(max_length=20, unique=True)
name: str = Field(max_length=200)
category: str # Allopathic, Ayurvedic, Unani, Homoeopathic, Siddha
medicine_type: str | None = None # Tablet, Capsule, Syrup, Injection, etc.
is_admissible: bool = True
class Meta:
table_name = "medicine_master"
class TestMaster(BaseDocType):
"""Medical tests with admissible rates."""
code: str = Field(max_length=20, unique=True)
name: str = Field(max_length=200)
admissible_amount: Decimal = Decimal("0")
class Meta:
table_name = "test_master"
class AMAMaster(BaseDocType):
"""Authorized Medical Attendants."""
code: str = Field(max_length=20, unique=True)
name: str = Field(max_length=200)
qualification: str | None = None
registration_number: str | None = None
address_line_1: str | None = None
city: str | None = None
pincode: str | None = None
class Meta:
table_name = "ama_master"
class CSMARates(BaseDocType):
"""CSMA miscellaneous rates (ambulance, nurse, etc.)."""
code: str = Field(max_length=20, unique=True)
description: str = Field(max_length=200)
rate: Decimal = Decimal("0")
remarks: str | None = None
class Meta:
table_name = "csma_rates"

Endpoint Method Description
/api/v1/medical-advance GET, POST Advances
/api/v1/medical-claim GET, POST Claims (Form 97)
/api/v1/medical-claim/{id}/verify POST Verify claim
/api/v1/medical-claim/{id}/approve POST Approve claim
/api/v1/hospital GET, POST Hospital master
/api/v1/medicine GET, POST Medicine master
/api/v1/test GET, POST Test master