from dataclasses import dataclass from typing import Optional, List @dataclass class DividendsData: previous_payment: Optional[str] = None previous_pay_date: Optional[str] = None previous_ex_date: Optional[str] = None frequency: Optional[str] = None annual_dividend_rate: Optional[str] = None annual_dividend_yield: Optional[str] = None @dataclass class MorningstarPdfData: fair_value: Optional[str] = None economic_moat: Optional[str] = None capital_allocation: Optional[str] = None rating: Optional[int] = None one_star_price: Optional[str] = None five_star_price: Optional[str] = None assessment: Optional[str] = None range_52_week: Optional[str] = None dividend_yield: Optional[str] = None investment_style: Optional[str] = None report_url: Optional[str] = None report_date: Optional[str] = None @dataclass class ScrapeResult: ticker: str company_name: Optional[str] dividends: DividendsData morningstar: MorningstarPdfData source: str # "live" | "cache" # -------------------- Transactions Feature -------------------- @dataclass class AccountInfo: account_type: str # e.g., "Joint", "IRA", "Individual" account_ending: str # e.g., "604", "197", "873" full_description: str # e.g., "Joint …604 (Account ending in 6 0 4)" is_selected: bool = False @dataclass class TransactionRecord: date: str action: str symbol: Optional[str] description: str quantity: Optional[str] price: Optional[str] fees_comm: Optional[str] amount: Optional[str] @dataclass class TransactionData: account_info: AccountInfo transactions: List[TransactionRecord] date_range: str export_date: str total_transactions: int source: str # "live" | "cache"