from datetime import date, datetime from decimal import Decimal from typing import List, Optional from pydantic import BaseModel from app.schemas.portfolio import FloatDecimal class ScreeningSignalResponse(BaseModel): id: int screen_date: date ticker: str name: Optional[str] = None sector: Optional[str] = None market_cap: Optional[int] = None trading_value: Optional[int] = None is_limit_up: bool = False daily_return: Optional[FloatDecimal] = None trigger_low: Optional[FloatDecimal] = None market_state: Optional[str] = None status: str entry_date: Optional[date] = None entry_price: Optional[FloatDecimal] = None exit_date: Optional[date] = None exit_price: Optional[FloatDecimal] = None created_at: datetime class Config: from_attributes = True class AutoOrderResponse(BaseModel): id: int order_date: datetime ticker: str order_type: Optional[str] = None qty: Optional[int] = None price: Optional[FloatDecimal] = None order_no: Optional[str] = None status: Optional[str] = None screening_signal_id: Optional[int] = None created_at: datetime class Config: from_attributes = True class WatchlistItem(BaseModel): ticker: str name: Optional[str] = None sector: Optional[str] = None screen_date: date trading_value: Optional[int] = None is_limit_up: bool = False daily_return: Optional[FloatDecimal] = None trigger_low: Optional[FloatDecimal] = None market_state: Optional[str] = None status: str class Config: from_attributes = True class ScreeningSummary(BaseModel): date: date market_state: str total_screened: int limit_up_count: int watchlist_count: int signals: List[ScreeningSignalResponse]