| """ |
| DBT under PCR/PoA Acts models |
| """ |
| from sqlalchemy import Column, Integer, String, Float, DateTime, Boolean, Enum, ForeignKey, Text |
| from sqlalchemy.orm import relationship |
| from sqlalchemy.sql import func |
| import enum |
| from database import Base |
|
|
| class CaseType(str, enum.Enum): |
| """Case type enumeration""" |
| PCR = "pcr" |
| POA = "poa" |
|
|
| class VerificationStatus(str, enum.Enum): |
| """Verification status""" |
| PENDING = "pending" |
| VERIFIED = "verified" |
| REJECTED = "rejected" |
|
|
| class AssistanceType(str, enum.Enum): |
| """Assistance type enumeration""" |
| RELIEF = "relief" |
| REHABILITATION = "rehabilitation" |
| INTER_CASTE_MARRIAGE_INCENTIVE = "inter_caste_marriage_incentive" |
|
|
| class DBTStatus(str, enum.Enum): |
| """DBT case status""" |
| REGISTERED = "registered" |
| UNDER_REVIEW = "under_review" |
| SANCTIONED = "sanctioned" |
| DISBURSED = "disbursed" |
| CLOSED = "closed" |
|
|
| class GrievanceCategory(str, enum.Enum): |
| """Grievance categories""" |
| DELAY = "delay" |
| WRONG_AMOUNT = "wrong_amount" |
| HARASSMENT = "harassment" |
| OTHER = "other" |
|
|
| class GrievanceStatus(str, enum.Enum): |
| """Grievance status""" |
| OPEN = "open" |
| IN_PROGRESS = "in_progress" |
| RESOLVED = "resolved" |
|
|
| class Victim(Base): |
| """Victim registration""" |
| __tablename__ = "victims" |
| |
| id = Column(Integer, primary_key=True, index=True) |
| name = Column(String(100), nullable=False) |
| aadhaar_last4 = Column(String(4), nullable=True) |
| mobile = Column(String(10), nullable=False) |
| state = Column(String(50), nullable=False) |
| district = Column(String(50), nullable=False) |
| case_type = Column(Enum(CaseType), nullable=False) |
| fir_number = Column(String(50), nullable=False) |
| court_case_number = Column(String(50), nullable=True) |
| incident_date = Column(DateTime(timezone=True), nullable=False) |
| verification_status = Column(Enum(VerificationStatus), default=VerificationStatus.PENDING) |
| digilocker_verified = Column(Boolean, default=False) |
| cctns_verified = Column(Boolean, default=False) |
| created_at = Column(DateTime(timezone=True), server_default=func.now()) |
| updated_at = Column(DateTime(timezone=True), onupdate=func.now()) |
| |
| |
| dbt_cases = relationship("DBTCase", back_populates="victim") |
| grievances = relationship("GrievanceTicket", back_populates="victim") |
|
|
| class DBTCase(Base): |
| """DBT case for victims""" |
| __tablename__ = "dbt_cases" |
| |
| id = Column(Integer, primary_key=True, index=True) |
| victim_id = Column(Integer, ForeignKey("victims.id"), nullable=False) |
| assistance_type = Column(Enum(AssistanceType), nullable=False) |
| approved_amount = Column(Float, nullable=False) |
| disbursed_amount = Column(Float, default=0.0) |
| status = Column(Enum(DBTStatus), default=DBTStatus.REGISTERED) |
| assigned_officer_id = Column(Integer, ForeignKey("users.id"), nullable=True) |
| created_at = Column(DateTime(timezone=True), server_default=func.now()) |
| updated_at = Column(DateTime(timezone=True), onupdate=func.now()) |
| |
| |
| victim = relationship("Victim", back_populates="dbt_cases") |
| assigned_officer = relationship("User", foreign_keys=[assigned_officer_id], back_populates="dbt_cases_assigned") |
| disbursements = relationship("Disbursement", back_populates="dbt_case") |
| grievances = relationship("GrievanceTicket", back_populates="dbt_case") |
|
|
| class Disbursement(Base): |
| """Disbursement records""" |
| __tablename__ = "disbursements" |
| |
| id = Column(Integer, primary_key=True, index=True) |
| case_id = Column(Integer, ForeignKey("dbt_cases.id"), nullable=False) |
| amount = Column(Float, nullable=False) |
| disbursed_at = Column(DateTime(timezone=True), server_default=func.now()) |
| transaction_ref = Column(String(50), nullable=False) |
| bank_account_last4 = Column(String(4), nullable=True) |
| remarks = Column(Text, nullable=True) |
| |
| |
| dbt_case = relationship("DBTCase", back_populates="disbursements") |
|
|
| class GrievanceTicket(Base): |
| """Grievance tickets""" |
| __tablename__ = "grievance_tickets" |
| |
| id = Column(Integer, primary_key=True, index=True) |
| case_id = Column(Integer, ForeignKey("dbt_cases.id"), nullable=True) |
| victim_id = Column(Integer, ForeignKey("victims.id"), nullable=True) |
| category = Column(Enum(GrievanceCategory), nullable=False) |
| description = Column(Text, nullable=False) |
| status = Column(Enum(GrievanceStatus), default=GrievanceStatus.OPEN) |
| created_at = Column(DateTime(timezone=True), server_default=func.now()) |
| resolution_notes = Column(Text, nullable=True) |
| resolved_at = Column(DateTime(timezone=True), nullable=True) |
| |
| |
| dbt_case = relationship("DBTCase", back_populates="grievances") |
| victim = relationship("Victim", back_populates="grievances") |