from typing import Dict, List, Optional from pydantic import BaseModel, Field, validator, field_validator from datetime import datetime class PsxStock(BaseModel): script_code: str script_name: str ldcp: str open: str high: str low: str current: str change: str volume: str trend: str class PsxMarketResponse(BaseModel): sectors: Dict[str, List[PsxStock]] class CircuitBreaker(BaseModel): lower_limit: float = Field(..., alias="lowerLimit") upper_limit: float = Field(..., alias="upperLimit") current_price: float = Field(..., alias="currentPrice") class DayRange(BaseModel): low: float high: float current: float class YearRange(BaseModel): low: float high: float current: float class TradingStats(BaseModel): open_price: Optional[float] = Field(None, alias="open") high_price: Optional[float] = Field(None, alias="high") low_price: Optional[float] = Field(None, alias="low") close_price: Optional[float] = Field(None, alias="close") volume: Optional[int] = None ask_price: Optional[float] = Field(None, alias="askPrice") ask_volume: Optional[int] = Field(None, alias="askVolume") bid_price: Optional[float] = Field(None, alias="bidPrice") bid_volume: Optional[int] = Field(None, alias="bidVolume") ldcp: Optional[float] = None var: Optional[float] = None haircut: Optional[float] = None pe_ratio: Optional[float] = Field(None, alias="peRatio") class QuoteData(BaseModel): company_name: str = Field(..., alias="companyName") symbol: str sector: str current_price: float = Field(..., alias="currentPrice") change: float change_percent: float = Field(..., alias="changePercent") circuit_breaker: CircuitBreaker day_range: DayRange = Field(..., alias="dayRange") year_range: YearRange = Field(..., alias="yearRange") trading_stats: TradingStats = Field(..., alias="tradingStats") one_year_change: Optional[float] = Field(None, alias="oneYearChange") ytd_change: Optional[float] = Field(None, alias="ytdChange") class FinancialResult(BaseModel): date: str title: str document_link: Optional[str] = Field(None, alias="documentLink") pdf_link: Optional[str] = Field(None, alias="pdfLink") class FinancialEntry(BaseModel): period: str sales: Optional[float] = None profit_after_tax: Optional[float] = Field(None, alias="profitAfterTax") eps: Optional[float] = None class Financials(BaseModel): annual: List[FinancialEntry] quarterly: List[FinancialEntry] class RatioEntry(BaseModel): period: str gross_profit_margin: Optional[float] = Field(None, alias="grossProfitMargin") net_profit_margin: Optional[float] = Field(None, alias="netProfitMargin") eps_growth: Optional[float] = Field(None, alias="epsGrowth") peg: Optional[float] = None class CompanyProfile(BaseModel): business_description: str = Field(..., alias="businessDescription") key_people: List[Dict[str, str]] = Field(..., alias="keyPeople") address: str website: str registrar: str auditor: str fiscal_year_end: str = Field(..., alias="fiscalYearEnd") class EquityProfile(BaseModel): market_cap: float = Field(..., alias="marketCap") shares: int free_float_units: int = Field(..., alias="freeFloatUnits") free_float_percent: float = Field(..., alias="freeFloatPercent") class CompanyData(BaseModel): # quote: QuoteData # profile: CompanyProfile # equity: EquityProfile announcements: List[FinancialResult] financials: Financials ratios: List[RatioEntry] timestamp: datetime = Field(default_factory=datetime.now) class CircuitBreakerRow(BaseModel): symbol: str ldcp: float open: float high: float low: float current: float change: float change_percent: float volume: int @field_validator( "ldcp", "open", "high", "low", "current", "change", "change_percent", mode="before" ) @classmethod def parse_float(cls, v): return float(v.replace(",", "").replace("%", "")) @field_validator("volume", mode="before") @classmethod def parse_int(cls, v): return int(v.replace(",", "")) ## Currency Model from typing import Optional from pydantic import BaseModel class CountryName(BaseModel): field_1inch: str = Field(..., alias='1inch') aave: str ada: str aed: str afn: str agix: str akt: str algo: str all: str amd: str amp: str ang: str aoa: str ape: str apt: str ar: str arb: str ars: str atom: str aud: str avax: str awg: str axs: str azn: str bake: str bam: str bat: str bbd: str bch: str bdt: str bgn: str bhd: str bif: str bmd: str bnb: str bnd: str bob: str brl: str bsd: str bsv: str bsw: str btc: str btg: str btn: str btt: str busd: str bwp: str byn: str byr: str bzd: str cad: str cake: str cdf: str celo: str cfx: str chf: str chz: str clp: str cnh: str cny: str comp: str cop: str crc: str cro: str crv: str cspr: str cuc: str cup: str cve: str cvx: str czk: str dai: str dash: str dcr: str dfi: str djf: str dkk: str doge: str dop: str dot: str dydx: str dzd: str egld: str egp: str enj: str eos: str ern: str etb: str etc: str eth: str eur: str fei: str fil: str fjd: str fkp: str flow: str flr: str frax: str ftt: str gala: str gbp: str gel: str ggp: str ghs: str gip: str gmd: str gmx: str gnf: str gno: str grt: str gt: str gtq: str gusd: str gyd: str hbar: str hkd: str hnl: str hnt: str hot: str hrk: str ht: str htg: str huf: str icp: str idr: str ils: str imp: str imx: str inj: str inr: str iqd: str irr: str isk: str jep: str jmd: str jod: str jpy: str kas: str kava: str kcs: str kda: str kes: str kgs: str khr: str kmf: str knc: str kpw: str krw: str ksm: str kwd: str kyd: str kzt: str lak: str lbp: str ldo: str leo: str link: str lkr: str lrc: str lrd: str lsl: str ltc: str ltl: str luna: str lunc: str lvl: str lyd: str mad: str mana: str mbx: str mdl: str mga: str mina: str mkd: str mkr: str mmk: str mnt: str mop: str mru: str mur: str mvr: str mwk: str mxn: str myr: str mzn: str nad: str near: str neo: str nexo: str nft: str ngn: str nio: str nok: str npr: str nzd: str okb: str omr: str one: str op: str ordi: str pab: str paxg: str pen: str pepe: str pgk: str php: str pi: str pkr: str pln: str pol: str pyg: str qar: str qnt: str qtum: str ron: str rpl: str rsd: str rub: str rune: str rvn: str rwf: str sand: str sar: str sbd: str scr: str sdg: str sek: str sgd: str shib: str shp: str sle: str sll: str snx: str sol: str sos: str srd: str std: str stn: str stx: str sui: str svc: str syp: str szl: str thb: str theta: str tjs: str tmt: str tnd: str ton: str top: str trx: str try_: str = Field(..., alias='try') ttd: str tusd: str twd: str twt: str tzs: str uah: str ugx: str uni: str usd: str usdc: str usdd: str usdp: str usdt: str uyu: str uzs: str ves: str vet: str vnd: str vuv: str waves: str wemix: str woo: str wst: str xaf: str xag: str xau: str xaut: str xcd: str xcg: str xch: str xdc: str xdr: str xec: str xem: str xlm: str xmr: str xof: str xpf: str xrp: str xtz: str yer: str zar: str zec: str zil: str zmk: str zmw: str zwl: str class PkrRates(BaseModel): """Model for PKR exchange rates against various currencies""" inch: float = Field(..., alias='1inch') aave: Optional[float] = 0.000027870604 ada: Optional[float] = 0.01212527 aed: Optional[float] = 0.013141508 afn: Optional[float] = 0.22735161 agix: Optional[float] = 0.046521451 akt: Optional[float] = 0.010385581 algo: Optional[float] = 0.036216193 all: Optional[float] = 0.29080989 amd: Optional[float] = 1.36284581 amp: Optional[float] = 2.24984732 ang: Optional[float] = 0.0064189272 aoa: Optional[float] = 3.27135551 ape: Optional[float] = 0.026637767 apt: Optional[float] = 0.0036678014 ar: Optional[float] = 0.0017025592 arb: Optional[float] = 0.02994547 ars: Optional[float] = 4.99480145 atom: Optional[float] = 0.0016563239 ats: Optional[float] = 0.041480256 aud: Optional[float] = 0.0050590778 avax: Optional[float] = 0.00037492198 awg: Optional[float] = 0.0064052552 axs: Optional[float] = 0.0024467576 azm: Optional[float] = 30.44265554 azn: Optional[float] = 0.0060885311 bake: Optional[float] = 1.34151212 bam: Optional[float] = 0.0058958256 bat: Optional[float] = 0.026497622 bbd: Optional[float] = 0.0071567097 bch: Optional[float] = 0.000006389789 bdt: Optional[float] = 0.43772915 bef: Optional[float] = 0.12160414 bgn: Optional[float] = 0.0058958256 bhd: Optional[float] = 0.0013454614 bif: Optional[float] = 10.57869332 bmd: Optional[float] = 0.0035783548 bnb: Optional[float] = 0.0000056818118 bnd: Optional[float] = 0.0045205631 bob: Optional[float] = 0.024734743 brl: Optional[float] = 0.018678264 bsd: Optional[float] = 0.0035783548 bsv: Optional[float] = 0.00020956946 bsw: Optional[float] = 1.81327133 btc: Optional[float] = 0.000000051457291 # 5.1457291e-8 btg: Optional[float] = 0.0041817238 btn: Optional[float] = 0.32404079 btt: Optional[float] = 10075.74928564 busd: Optional[float] = 0.0035764397 bwp: Optional[float] = 0.046911298 byn: Optional[float] = 0.010237608 byr: Optional[float] = 102.37607704 bzd: Optional[float] = 0.0071995125 cad: Optional[float] = 0.0048731761 cake: Optional[float] = 0.0026684964 cdf: Optional[float] = 8.1224622 celo: Optional[float] = 0.039886713 cfx: Optional[float] = 0.062977778 chf: Optional[float] = 0.0027485132 chz: Optional[float] = 0.084007786 clp: Optional[float] = 3.08238532 cnh: Optional[float] = 0.024695302 cny: Optional[float] = 0.024721696 comp: Optional[float] = 0.00017687447 cop: Optional[float] = 13.09720649 crc: Optional[float] = 1.72893021 cro: Optional[float] = 0.043457367 crv: Optional[float] = 0.013495293 cspr: Optional[float] = 0.99753074 cuc: Optional[float] = 0.0035783548 cup: Optional[float] = 0.085787938 cve: Optional[float] = 0.33240757 cvx: Optional[float] = 0.001812335 cyp: Optional[float] = 0.0017643013 czk: Optional[float] = 0.073152658 dai: Optional[float] = 0.0035784301 dash: Optional[float] = 0.000088593379 dcr: Optional[float] = 0.00014578477 dem: Optional[float] = 0.0058958256 dfi: Optional[float] = 5.35164713 djf: Optional[float] = 0.63819024 dkk: Optional[float] = 0.022531693 doge: Optional[float] = 0.03161875 dop: Optional[float] = 0.2223377 dot: Optional[float] = 0.0025389979 dydx: Optional[float] = 0.031888397 dzd: Optional[float] = 0.46388719 eek: Optional[float] = 0.047166605 egld: Optional[float] = 0.00068601026 egp: Optional[float] = 0.16730156 enj: Optional[float] = 0.15902853 eos: Optional[float] = 0.040239152 ern: Optional[float] = 0.053675323 esp: Optional[float] = 0.50156856 etb: Optional[float] = 0.55621057 etc: Optional[float] = 0.0003995226 eth: Optional[float] = 0.0000017365799 eur: Optional[float] = 0.0030144878 eurc: Optional[float] = 0.0030166921 fei: Optional[float] = 0.0035090934 fil: Optional[float] = 0.0035277925 fim: Optional[float] = 0.01792333 fjd: Optional[float] = 0.0078727543 fkp: Optional[float] = 0.0026213082 flow: Optional[float] = 0.07995228 flr: Optional[float] = 0.36052625 frax: Optional[float] = 0.0036090592 frf: Optional[float] = 0.019773744 ftt: Optional[float] = 0.010051534 gala: Optional[float] = 0.83330051 gbp: Optional[float] = 0.0026213082 gel: Optional[float] = 0.009591452 ggp: Optional[float] = 0.0026213082 ghc: Optional[float] = 393.42404137 ghs: Optional[float] = 0.039342404 gip: Optional[float] = 0.0026213082 gmd: Optional[float] = 0.26411095 gmx: Optional[float] = 0.00054220394 gnf: Optional[float] = 31.40305737 gno: Optional[float] = 0.000027069202 grd: Optional[float] = 1.02718671 grt: Optional[float] = 0.12436019 gt: Optional[float] = 0.0004932477 gtq: Optional[float] = 0.027422428 gusd: Optional[float] = 0.0035820834 gyd: Optional[float] = 0.74824559 hbar: Optional[float] = 0.03468262 hkd: Optional[float] = 0.02797238 hnl: Optional[float] = 0.094857481 hnt: Optional[float] = 0.0031545799 hot: Optional[float] = 8.77272144 hrk: Optional[float] = 0.022712658 ht: Optional[float] = 0.014406174 htg: Optional[float] = 0.46996889 huf: Optional[float] = 1.14312086 icp: Optional[float] = 0.0014210805 idr: Optional[float] = 60.2210084 iep: Optional[float] = 0.002374102 ils: Optional[float] = 0.011043883 imp: Optional[float] = 0.0026213082 imx: Optional[float] = 0.020578292 inj: Optional[float] = 0.0010994197 inr: Optional[float] = 0.32404079 iqd: Optional[float] = 4.68801963 irr: Optional[float] = 4575.15188598 isk: Optional[float] = 0.43718127 itl: Optional[float] = 5.83686224 jep: Optional[float] = 0.0026213082 jmd: Optional[float] = 0.55854612 jod: Optional[float] = 0.0025370536 jpy: Optional[float] = 0.5464799 kas: Optional[float] = 0.10824109 kava: Optional[float] = 0.061803407 kcs: Optional[float] = 0.00041413697 kda: Optional[float] = 0.44424418 kes: Optional[float] = 0.46130149 kgs: Optional[float] = 0.31295651 khr: Optional[float] = 14.37682204 klay: Optional[float] = 0.05966859 kmf: Optional[float] = 1.48303077 knc: Optional[float] = 0.023756734 kpw: Optional[float] = 3.22057115 krw: Optional[float] = 5.15615217 ksm: Optional[float] = 0.00074242121 kwd: Optional[float] = 0.0010966712 kyd: Optional[float] = 0.0029556765 kzt: Optional[float] = 1.77225517 lak: Optional[float] = 76.63134176 lbp: Optional[float] = 321.24646567 ldo: Optional[float] = 0.010060335 leo: Optional[float] = 0.00040689885 link: Optional[float] = 0.00039577489 lkr: Optional[float] = 1.10636398 lrc: Optional[float] = 0.10452585 lrd: Optional[float] = 0.6665422 lsl: Optional[float] = 0.057056562 ltc: Optional[float] = 0.000064180737 ltl: Optional[float] = 0.010408423 luf: Optional[float] = 0.12160414 luna: Optional[float] = 0.055650373 lunc: Optional[float] = 103.17056374 lvl: Optional[float] = 0.002118582 lyd: Optional[float] = 0.022530779 mad: Optional[float] = 0.032674995 mana: Optional[float] = 0.033309473 mbx: Optional[float] = 0.067994222 mdl: Optional[float] = 0.060616726 mga: Optional[float] = 15.70701508 mgf: Optional[float] = 78.53507542 mina: Optional[float] = 0.052000424 mkd: Optional[float] = 0.18573365 mkr: Optional[float] = 0.0000021884969 mmk: Optional[float] = 7.5133109 mnt: Optional[float] = 12.76193802 mop: Optional[float] = 0.028811551 mro: Optional[float] = 1.42969127 mru: Optional[float] = 0.14296913 mtl: Optional[float] = 0.0012941196 mur: Optional[float] = 0.16422284 mvr: Optional[float] = 0.05529167 mwk: Optional[float] = 6.20471537 mxn: Optional[float] = 0.061423027 mxv: Optional[float] = 0.0070874814 myr: Optional[float] = 0.013980479 mzm: Optional[float] = 228.55055252 mzn: Optional[float] = 0.22855055 nad: Optional[float] = 0.057056562 near: Optional[float] = 0.0033478921 neo: Optional[float] = 0.0012221448 nexo: Optional[float] = 0.0041653116 nft: Optional[float] = 10324.6074446 ngn: Optional[float] = 4.85024477 nio: Optional[float] = 0.13151867 nlg: Optional[float] = 0.0066430568 nok: Optional[float] = 0.034016339 npr: Optional[float] = 0.51870829 nzd: Optional[float] = 0.0059255473 okb: Optional[float] = 0.000044555727 omr: Optional[float] = 0.0013744249 one: Optional[float] = 1.34065259 op: Optional[float] = 0.018308592 ordi: Optional[float] = 0.0012187735 pab: Optional[float] = 0.0035783548 paxg: Optional[float] = 0.0000007115336 # 7.115336e-7 pen: Optional[float] = 0.011999961 pepe: Optional[float] = 737.8067472 pgk: Optional[float] = 0.015333169 php: Optional[float] = 0.20716718 pi: Optional[float] = 0.018629944 pkr: Optional[float] = 1.0 pln: Optional[float] = 0.012697271 pol: Optional[float] = 0.033052428 pte: Optional[float] = 0.60435054 pyg: Optional[float] = 23.44895477 qar: Optional[float] = 0.013025212 qnt: Optional[float] = 0.000048647043 qtum: Optional[float] = 0.0034882245 rol: Optional[float] = 153.53159924 ron: Optional[float] = 0.01535316 rpl: Optional[float] = 0.0020615425 rsd: Optional[float] = 0.35404644 rub: Optional[float] = 0.27456613 rune: Optional[float] = 0.0085832862 rvn: Optional[float] = 0.56276866 rwf: Optional[float] = 5.21546965 sand: Optional[float] = 0.038975081 sar: Optional[float] = 0.013418831 sbd: Optional[float] = 0.028782375 scr: Optional[float] = 0.052206617 sdd: Optional[float] = 214.75529922 sdg: Optional[float] = 2.14755299 sek: Optional[float] = 0.031929605 sgd: Optional[float] = 0.0045205631 shib: Optional[float] = 518.99655842 shp: Optional[float] = 0.0026213082 sit: Optional[float] = 0.72239185 skk: Optional[float] = 0.090814459 sle: Optional[float] = 0.081765145 sll: Optional[float] = 81.76514481 snx: Optional[float] = 0.011623316 sol: Optional[float] = 0.000040638459 sos: Optional[float] = 2.04303502 spl: Optional[float] = 0.00059639247 srd: Optional[float] = 0.13559105 srg: Optional[float] = 135.59105178 ssp: Optional[float] = 16.29194282 std: Optional[float] = 74.1291884 stn: Optional[float] = 0.074129188 stx: Optional[float] = 0.012988158 sui: Optional[float] = 0.0034980047 svc: Optional[float] = 0.031310605 syp: Optional[float] = 0.3957423 szl: Optional[float] = 0.057056562 thb: Optional[float] = 0.11116065 theta: Optional[float] = 0.016388406 tjs: Optional[float] = 0.033782985 tmm: Optional[float] = 62.54995053 tmt: Optional[float] = 0.01250999 tnd: Optional[float] = 0.010272105 ton: Optional[float] = 0.0024115185 top: Optional[float] = 0.0084204575 trl: Optional[float] = 156077.25045115 trx: Optional[float] = 0.012694543 try_: float = Field(..., alias='try') ttd: Optional[float] = 0.024142566 tusd: Optional[float] = 0.0035839966 tvd: Optional[float] = 0.0050590778 twd: Optional[float] = 0.11230099 twt: Optional[float] = 0.0068069886 tzs: Optional[float] = 9.23521055 uah: Optional[float] = 0.15408012 ugx: Optional[float] = 12.66715156 uni: Optional[float] = 0.00098728734 usd: Optional[float] = 0.0035783548 usdc: Optional[float] = 0.0035786866 usdd: Optional[float] = 0.0035802976 usdp: Optional[float] = 0.0035803197 usdt: Optional[float] = 0.003579871 uyu: Optional[float] = 0.13856147 uzs: Optional[float] = 43.73539013 val: Optional[float] = 5.83686224 veb: Optional[float] = 140480603.3195581 ved: Optional[float] = 1.40480603 vef: Optional[float] = 140480.60331956 ves: Optional[float] = 1.40480603 vet: Optional[float] = 0.40967996 vnd: Optional[float] = 92.87837846 vuv: Optional[float] = 0.42560658 waves: Optional[float] = 0.0063235068 wemix: Optional[float] = 0.011294285 woo: Optional[float] = 0.19966932 wst: Optional[float] = 0.0097052715 xaf: Optional[float] = 1.97737435 xag: Optional[float] = 0.000046224216 xau: Optional[float] = 0.00000070955592 # 7.0955592e-7 xaut: Optional[float] = 0.0000007159874 # 7.159874e-7 xbt: Optional[float] = 0.000000051485012 # 5.1485012e-8 xcd: Optional[float] = 0.0096659557 xcg: Optional[float] = 0.0064189272 xch: Optional[float] = 0.0011740879 xdc: Optional[float] = 0.095836852 xdr: Optional[float] = 0.0026022409 xec: Optional[float] = 417.58644553 xem: Optional[float] = 4.50114505 xlm: Optional[float] = 0.020355646 xmr: Optional[float] = 0.000010185332 xof: Optional[float] = 1.97737435 xpd: Optional[float] = 0.0000020938589 xpf: Optional[float] = 0.35972408 xpt: Optional[float] = 0.0000017299438 xrp: Optional[float] = 0.0023407297 xtz: Optional[float] = 0.0085248659 yer: Optional[float] = 0.85292226 zar: Optional[float] = 0.057056562 zec: Optional[float] = 0.000010949103 zil: Optional[float] = 0.79280654 zmk: Optional[float] = 65.25187985 zmw: Optional[float] = 0.06525188 zwd: Optional[float] = 1.29500661 zwg: Optional[float] = 0.091476953 zwl: Optional[float] = 228.57567566 class ExchangeRateResponse(BaseModel): """Main model for exchange rate data""" date: datetime pkr: PkrRates class CurrencyResponse(BaseModel): country: str currency: float class CurrencyCountryResponse(BaseModel): response: List[CurrencyResponse]