""" PIT Dividend Calendar schemas """ from datetime import date, datetime from typing import Any, Dict, List, Optional from pydantic import BaseModel, ConfigDict, Field class DividendCalendarEntry(BaseModel): model_config = ConfigDict(from_attributes=True) ticker: str ex_dividend_date: date amount: float declaration_date: Optional[date] = None record_date: Optional[date] = None payment_date: Optional[date] = None currency: str = "USD" dividend_type: str = "regular" frequency: Optional[str] = None as_of_date: date source: str @classmethod def from_orm_obj(cls, obj) -> "DividendCalendarEntry": def _to_date(val): if val is None: return None return val.date() if hasattr(val, "date") else val return cls( ticker=obj.ticker, ex_dividend_date=_to_date(obj.ex_dividend_date), amount=obj.amount, declaration_date=_to_date(obj.declaration_date), record_date=_to_date(obj.record_date), payment_date=_to_date(obj.payment_date), currency=obj.currency or "USD", dividend_type=obj.dividend_type or "regular", frequency=obj.frequency, as_of_date=_to_date(obj.as_of_date), source=obj.source, ) class DividendUpcomingResponse(BaseModel): """Response for PIT upcoming dividends query.""" dividends: List[DividendCalendarEntry] total_count: int metadata: Dict[str, Any] = Field(default_factory=dict) class DividendHistoryResponse(BaseModel): """Response for single-symbol dividend history.""" symbol: str dividends: List[DividendCalendarEntry] total_count: int annual_yield_estimate: Optional[float] = None metadata: Dict[str, Any] = Field(default_factory=dict) class DividendIngestRequest(BaseModel): """Request body for bulk backfill ingest.""" symbols: List[str] = Field(..., min_length=1, max_length=200) force_refresh: bool = Field(False, description="Re-ingest even if data exists") class DividendIngestResponse(BaseModel): """Response for admin ingest endpoint.""" symbols_processed: int total_records_upserted: int failed_symbols: List[str] = Field(default_factory=list) status: str metadata: Dict[str, Any] = Field(default_factory=dict)