Sharma7's picture
feat: 'Claim Guardian' Upgrade — IRDAI 2024 (June) compliant
6fcc8ab
Raw
History Blame Contribute Delete
2.67 kB
"""
Pydantic schemas for insurance policy rules.
"""
from pydantic import BaseModel, Field
from typing import Optional
from enum import Enum
class LimitType(str, Enum):
PERCENTAGE = "percentage"
ABSOLUTE = "absolute"
SUBLIMIT = "sublimit"
EXCLUSION = "exclusion"
COPAY = "copay"
WAITING_PERIOD = "waiting_period"
DEDUCTIBLE = "deductible"
class PolicyRule(BaseModel):
"""A single extracted rule from a policy document."""
category: str = Field(
...,
description="Rule category: room_rent, copay, sublimit, exclusion, waiting_period, deductible, etc."
)
condition: str = Field(
...,
description="Human-readable condition text, e.g. 'Room rent capped at 1% of sum insured per day'"
)
limit_type: LimitType = Field(
...,
description="Type of limit applied by this rule"
)
limit_value: Optional[float] = Field(
None,
description="Numeric limit value (percentage as decimal, absolute in INR)"
)
limit_unit: Optional[str] = Field(
None,
description="Unit for the limit: 'per_day', 'per_claim', 'per_year', 'per_illness', etc."
)
clause_reference: str = Field(
...,
description="Reference to the specific clause in the policy document"
)
source_provenance: Optional[str] = Field(
None,
description="Exact text snippet or page number from source PDF"
)
applies_to: Optional[str] = Field(
None,
description="What this rule applies to: 'all', specific procedure types, room types, etc."
)
class PolicyDocument(BaseModel):
"""Structured representation of an insurance policy."""
id: Optional[int] = None
insurer: str = Field(..., description="Insurance company name")
plan_name: str = Field(..., description="Policy plan name")
sum_insured: float = Field(..., description="Sum insured amount in INR")
policy_type: str = Field(
"individual",
description="Policy type: individual, family_floater, group"
)
rules: list[PolicyRule] = Field(
default_factory=list,
description="List of extracted policy rules"
)
raw_text_hash: Optional[str] = Field(
None,
description="Hash of the raw PDF text for deduplication"
)
is_reviewed: bool = Field(
False,
description="Whether the extracted rules have been human-reviewed"
)
class PolicyUploadResponse(BaseModel):
"""Response after uploading and processing a policy PDF."""
policy_id: int
insurer: str
plan_name: str
sum_insured: float
rules_count: int
message: str