import datetime from sqlalchemy import Column, String, Integer, Float, Date, DateTime, Boolean, ForeignKey, JSON, Text from sqlalchemy.orm import relationship from backend.database.database import Base class Member(Base): __tablename__ = "members" id = Column(String, primary_key=True, index=True) # e.g. EMP001 name = Column(String, nullable=False) policy_number = Column(String, nullable=False, default="PLUM_OPD_2024") join_date = Column(Date, nullable=False) annual_limit_remaining = Column(Float, nullable=False, default=50000.0) status = Column(String, nullable=False, default="ACTIVE") # ACTIVE, INACTIVE claims = relationship("Claim", back_populates="member") class Claim(Base): __tablename__ = "claims" id = Column(String, primary_key=True, index=True) # e.g. CLM_12345 member_id = Column(String, ForeignKey("members.id"), nullable=False) patient_name = Column(String, nullable=False) claim_amount = Column(Float, nullable=False) status = Column(String, nullable=False, default="PENDING") # PENDING, PROCESSING, APPROVED, REJECTED, PARTIAL, MANUAL_REVIEW, APPEALED hospital_name = Column(String, nullable=True) cashless_request = Column(Boolean, nullable=False, default=False) treatment_date = Column(Date, nullable=False) submitted_at = Column(DateTime, nullable=False, default=datetime.datetime.utcnow) updated_at = Column(DateTime, nullable=False, default=datetime.datetime.utcnow, onupdate=datetime.datetime.utcnow) member = relationship("Member", back_populates="claims") documents = relationship("ClaimDocument", back_populates="claim", cascade="all, delete-orphan") adjudication_result = relationship("AdjudicationResult", back_populates="claim", uselist=False, cascade="all, delete-orphan") audit_logs = relationship("AuditLog", back_populates="claim", cascade="all, delete-orphan") class ClaimDocument(Base): __tablename__ = "claim_documents" id = Column(Integer, primary_key=True, autoincrement=True) claim_id = Column(String, ForeignKey("claims.id"), nullable=False) document_type = Column(String, nullable=False) # PRESCRIPTION, BILL, LAB_REPORT, OTHER file_path = Column(String, nullable=False) file_name = Column(String, nullable=False) file_size = Column(Integer, nullable=False) extracted_data = Column(JSON, nullable=True) # JSON of parsed fields raw_llm_response = Column(Text, nullable=True) # raw model output claim = relationship("Claim", back_populates="documents") class AdjudicationResult(Base): __tablename__ = "adjudication_results" id = Column(Integer, primary_key=True, autoincrement=True) claim_id = Column(String, ForeignKey("claims.id"), unique=True, nullable=False) decision = Column(String, nullable=False) # APPROVED, REJECTED, PARTIAL, MANUAL_REVIEW approved_amount = Column(Float, nullable=False, default=0.0) confidence_score = Column(Float, nullable=False, default=0.0) reasons = Column(JSON, nullable=False, default=list) # List[str] flags = Column(JSON, nullable=False, default=list) # List[str] notes = Column(Text, nullable=True) next_steps = Column(Text, nullable=True) policy_engine_log = Column(JSON, nullable=True) # details of check results created_at = Column(DateTime, nullable=False, default=datetime.datetime.utcnow) claim = relationship("Claim", back_populates="adjudication_result") class AuditLog(Base): __tablename__ = "audit_logs" id = Column(Integer, primary_key=True, autoincrement=True) claim_id = Column(String, ForeignKey("claims.id"), nullable=False) action = Column(String, nullable=False) # e.g. "CLAIM_SUBMITTED", "OCR_EXTRACTED", "POLICY_VAL_SUCCESS" timestamp = Column(DateTime, nullable=False, default=datetime.datetime.utcnow) details = Column(Text, nullable=True) claim = relationship("Claim", back_populates="audit_logs")