stellar413/AI_adjudication
0
1import datetime2from sqlalchemy import Column, String, Integer, Float, Date, DateTime, Boolean, ForeignKey, JSON, Text3from sqlalchemy.orm import relationship4from backend.database.database import Base5 6class Member(Base):7 __tablename__ = "members"8 9 id = Column(String, primary_key=True, index=True) # e.g. EMP00110 name = Column(String, nullable=False)11 policy_number = Column(String, nullable=False, default="PLUM_OPD_2024")12 join_date = Column(Date, nullable=False)13 annual_limit_remaining = Column(Float, nullable=False, default=50000.0)14 status = Column(String, nullable=False, default="ACTIVE") # ACTIVE, INACTIVE15 16 claims = relationship("Claim", back_populates="member")17 18class Claim(Base):19 __tablename__ = "claims"20 21 id = Column(String, primary_key=True, index=True) # e.g. CLM_1234522 member_id = Column(String, ForeignKey("members.id"), nullable=False)23 patient_name = Column(String, nullable=False)24 claim_amount = Column(Float, nullable=False)25 status = Column(String, nullable=False, default="PENDING") # PENDING, PROCESSING, APPROVED, REJECTED, PARTIAL, MANUAL_REVIEW, APPEALED26 hospital_name = Column(String, nullable=True)27 cashless_request = Column(Boolean, nullable=False, default=False)28 treatment_date = Column(Date, nullable=False)29 submitted_at = Column(DateTime, nullable=False, default=datetime.datetime.utcnow)30 updated_at = Column(DateTime, nullable=False, default=datetime.datetime.utcnow, onupdate=datetime.datetime.utcnow)31 32 member = relationship("Member", back_populates="claims")33 documents = relationship("ClaimDocument", back_populates="claim", cascade="all, delete-orphan")34 adjudication_result = relationship("AdjudicationResult", back_populates="claim", uselist=False, cascade="all, delete-orphan")35 audit_logs = relationship("AuditLog", back_populates="claim", cascade="all, delete-orphan")36 37class ClaimDocument(Base):38 __tablename__ = "claim_documents"39 40 id = Column(Integer, primary_key=True, autoincrement=True)41 claim_id = Column(String, ForeignKey("claims.id"), nullable=False)42 document_type = Column(String, nullable=False) # PRESCRIPTION, BILL, LAB_REPORT, OTHER43 file_path = Column(String, nullable=False)44 file_name = Column(String, nullable=False)45 file_size = Column(Integer, nullable=False)46 extracted_data = Column(JSON, nullable=True) # JSON of parsed fields47 raw_llm_response = Column(Text, nullable=True) # raw model output48 49 claim = relationship("Claim", back_populates="documents")50 51class AdjudicationResult(Base):52 __tablename__ = "adjudication_results"53 54 id = Column(Integer, primary_key=True, autoincrement=True)55 claim_id = Column(String, ForeignKey("claims.id"), unique=True, nullable=False)56 decision = Column(String, nullable=False) # APPROVED, REJECTED, PARTIAL, MANUAL_REVIEW57 approved_amount = Column(Float, nullable=False, default=0.0)58 confidence_score = Column(Float, nullable=False, default=0.0)59 reasons = Column(JSON, nullable=False, default=list) # List[str]60 flags = Column(JSON, nullable=False, default=list) # List[str]61 notes = Column(Text, nullable=True)62 next_steps = Column(Text, nullable=True)63 policy_engine_log = Column(JSON, nullable=True) # details of check results64 created_at = Column(DateTime, nullable=False, default=datetime.datetime.utcnow)65 66 claim = relationship("Claim", back_populates="adjudication_result")67 68class AuditLog(Base):69 __tablename__ = "audit_logs"70 71 id = Column(Integer, primary_key=True, autoincrement=True)72 claim_id = Column(String, ForeignKey("claims.id"), nullable=False)73 action = Column(String, nullable=False) # e.g. "CLAIM_SUBMITTED", "OCR_EXTRACTED", "POLICY_VAL_SUCCESS"74 timestamp = Column(DateTime, nullable=False, default=datetime.datetime.utcnow)75 details = Column(Text, nullable=True)76 77 claim = relationship("Claim", back_populates="audit_logs")78 