from datetime import datetime from typing import List, Optional from pydantic import BaseModel class MerchantListResponse(BaseModel): """Slim response for merchant list — only fields used on the frontend.""" id: int merchant_name: Optional[str] = None category_name: Optional[str] = None slug: Optional[str] = None # used by frontend to build partner/checkout URLs status: Optional[str] = None # resolved display status (mirrors blade logic) code: Optional[str] = None # referral code contact_number: Optional[str] = None # phone is_guest_active: Optional[int] = None is_agreement_signed: bool = False has_module: bool = False pending_docs: List[str] = [] # alert section — mirrors getHelperTxt() logic class Config: from_attributes = True class MerchantResponse(BaseModel): """Pydantic schema for merchant API responses.""" id: int category_id: Optional[str] = None merchant_name: Optional[str] = None slug: Optional[str] = None merchant_logo: Optional[str] = None financial_partner: Optional[str] = None contact_number: Optional[str] = None email: Optional[str] = None address: Optional[str] = None grade_id: Optional[str] = None status: Optional[str] = None max_no_cases: Optional[int] = None max_approval_value: Optional[int] = None hypothecation_charges: Optional[int] = None status_changed_by: Optional[int] = None deleted_at: Optional[datetime] = None created_at: Optional[datetime] = None created_by: Optional[int] = None updated_at: Optional[datetime] = None type_of_firm: Optional[str] = None nature_of_business: Optional[str] = None owner_name: Optional[str] = None title: Optional[str] = None gst_number: Optional[str] = None is_processing_fees: Optional[int] = None is_collected: Optional[int] = None code: Optional[str] = None referred_by: Optional[str] = None rcp: Optional[str] = None sales_head: Optional[str] = None finance_head: Optional[str] = None avg_ticket_size: Optional[int] = None rcp_email: Optional[str] = None rcp_mobile: Optional[str] = None sales_head_email: Optional[str] = None sales_head_mobile: Optional[str] = None finance_head_email: Optional[str] = None finance_head_mobile: Optional[str] = None is_guest_active: Optional[int] = None is_gst: Optional[int] = None state: Optional[str] = None anchor_merchant_id: Optional[int] = None pincode: Optional[str] = None source: Optional[str] = None gender: Optional[int] = None dob: Optional[datetime] = None pan_card: Optional[str] = None is_auto_abort: Optional[int] = None city: Optional[str] = None co_applicant_hyphen: Optional[int] = None co_applicant: Optional[int] = None gst_is_defaulter: Optional[int] = None gst_is_any_delay: Optional[int] = None months_gst_filled: Optional[int] = None gst_data: Optional[str] = None is_physical_verification: Optional[int] = None is_auto_abort_approved: Optional[int] = None rm_id: Optional[int] = None is_auto_doc: Optional[int] = None is_auto_approve: Optional[int] = None high_risk: Optional[int] = None vulnerable_merchant: Optional[int] = None vulnerable_merchant_date: Optional[datetime] = None pre_approval: Optional[int] = None send_collection_report: Optional[int] = None pending_adjustable_amount: Optional[str] = None pending_collection_report: Optional[int] = None special_notes: Optional[str] = None longitude: Optional[str] = None latitude: Optional[str] = None year_in_business: Optional[str] = None location_audit: Optional[str] = None liability_percent: Optional[str] = None insurance_premium: Optional[int] = None insurance_collection_method: Optional[int] = None location_serviceable: Optional[str] = None user_banking_reason: Optional[str] = None pre_status: Optional[int] = None charge_subvention_remaining_amount: Optional[int] = None welcome_letter_sent: Optional[int] = None send_da_on_checklist: Optional[int] = None target_number_application: Optional[str] = None target_value_application: Optional[str] = None custom_grade_id: Optional[int] = None remove_esign_otp: Optional[int] = None pay_data_sharing: Optional[int] = None official_merchant_name: Optional[str] = None collect_advance_amount: Optional[int] = None is_fldg_active: Optional[int] = None is_trade_advance: Optional[int] = None trade_advance_amount: Optional[str] = None trade_advance_balance: Optional[str] = None agreement_signed_with: Optional[str] = None agreement_signed_by: Optional[str] = None merchant_reg_type: Optional[str] = None designation_of_sign_auth: Optional[str] = None available_exposure: Optional[str] = None skip_appl_otp: Optional[int] = None auto_approve_category: Optional[int] = None combined_sl_la: Optional[int] = None ips: Optional[str] = None mis_frequency: Optional[int] = None create_app_lead_on_map: Optional[int] = None subv_inv_on_center: Optional[int] = None processing_fee_on_advance_amount: Optional[int] = None hold_liability: Optional[int] = None total_revenue_per_month: Optional[int] = None percentage_of_sales_in_emi: Optional[int] = None number_of_lenders: Optional[int] = None number_of_visits: Optional[int] = None landmark: Optional[str] = None table_of_offers: Optional[int] = None send_da: Optional[int] = None grade_name: Optional[str] = None is_hypothecation_active: Optional[int] = None remove_ip_whitelist: Optional[int] = None pf_surcharge_active: Optional[int] = None kw_capping: Optional[int] = None disb_post_installation: Optional[int] = None receive_application: Optional[int] = None class Config: from_attributes = True class MerchantLocationResponse(BaseModel): id: int merchant_id: int name: str slug: Optional[str] = None email: Optional[str] = None phone: Optional[str] = None address: Optional[str] = None city: Optional[str] = None state: Optional[str] = None pincode: Optional[str] = None landmark: Optional[str] = None total_revenue_per_month: Optional[int] = None percentage_of_sales_in_emi: Optional[int] = None number_of_lenders: Optional[int] = None number_of_visits: Optional[int] = None created_at: Optional[datetime] = None class Config: from_attributes = True class PaginatedMerchantsResponse(BaseModel): items: List[MerchantResponse] total: int limit: int skip: int class CreateLocationRequest(BaseModel): name: str email: Optional[str] = None phone: Optional[str] = None address: Optional[str] = None city: Optional[str] = None state: Optional[str] = None pincode: Optional[str] = None gst_number: Optional[str] = None landmark: Optional[str] = None total_revenue_per_month: Optional[int] = None percentage_of_sales_in_emi: Optional[int] = None number_of_lenders: Optional[int] = None number_of_visits: Optional[int] = None class UpdateLocationRequest(BaseModel): name: Optional[str] = None email: Optional[str] = None phone: Optional[str] = None address: Optional[str] = None city: Optional[str] = None state: Optional[str] = None pincode: Optional[str] = None gst_number: Optional[str] = None landmark: Optional[str] = None total_revenue_per_month: Optional[int] = None percentage_of_sales_in_emi: Optional[int] = None number_of_lenders: Optional[int] = None number_of_visits: Optional[int] = None