using System; using System.Collections.Generic; using System.Text.Json.Serialization; namespace FinlyticCore.Dtos.Fundamentals; /// /// Data transfer object representing the complete fundamental analysis dataset of an asset. /// public record AssetFundamentalsDto { [JsonPropertyName("isin")] public string Isin { get; init; } = string.Empty; [JsonPropertyName("primaryTicker")] public string PrimaryTicker { get; init; } = string.Empty; [JsonPropertyName("ticker")] public string Ticker { get; init; } = string.Empty; [JsonPropertyName("companyName")] public string CompanyName { get; init; } = string.Empty; [JsonPropertyName("exchange")] public string? Exchange { get; init; } [JsonPropertyName("tradingCurrency")] public string? TradingCurrency { get; init; } [JsonPropertyName("businessSummary")] public string? BusinessSummary { get; init; } [JsonPropertyName("sector")] public string? Sector { get; init; } [JsonPropertyName("industry")] public string? Industry { get; init; } [JsonPropertyName("country")] public string? Country { get; init; } [JsonPropertyName("employees")] public int? Employees { get; init; } // Valuation Metrics (derived from Primary Ticker) [JsonPropertyName("currentPrice")] public decimal CurrentPrice { get; init; } [JsonPropertyName("dayChangeAbsolute")] public decimal DayChangeAbsolute { get; init; } [JsonPropertyName("dayChangePercent")] public decimal DayChangePercent { get; init; } [JsonPropertyName("fiftyTwoWeekHigh")] public decimal FiftyTwoWeekHigh { get; init; } [JsonPropertyName("fiftyTwoWeekLow")] public decimal FiftyTwoWeekLow { get; init; } [JsonPropertyName("marketCapitalization")] public decimal MarketCapitalization { get; init; } [JsonPropertyName("enterpriseValue")] public decimal EnterpriseValue { get; init; } [JsonPropertyName("peRatioTrailing")] public decimal? PeRatioTrailing { get; init; } [JsonPropertyName("peRatioForward")] public decimal? PeRatioForward { get; init; } [JsonPropertyName("pegRatio")] public decimal? PegRatio { get; init; } [JsonPropertyName("pbRatio")] public decimal? PbRatio { get; init; } [JsonPropertyName("psRatio")] public decimal? PsRatio { get; init; } [JsonPropertyName("evToEbitda")] public decimal? EvToEbitda { get; init; } [JsonPropertyName("evToRevenue")] public decimal? EvToRevenue { get; init; } // Financial Health & Leverage [JsonPropertyName("grossMargin")] public decimal? GrossMargin { get; init; } [JsonPropertyName("operatingMargin")] public decimal? OperatingMargin { get; init; } [JsonPropertyName("netProfitMargin")] public decimal? NetProfitMargin { get; init; } [JsonPropertyName("returnOnEquity")] public decimal? ReturnOnEquity { get; init; } [JsonPropertyName("returnOnAssets")] public decimal? ReturnOnAssets { get; init; } [JsonPropertyName("returnOnInvestedCapital")] public decimal? ReturnOnInvestedCapital { get; init; } [JsonPropertyName("debtToEquity")] public decimal? DebtToEquity { get; init; } [JsonPropertyName("currentRatio")] public decimal? CurrentRatio { get; init; } [JsonPropertyName("quickRatio")] public decimal? QuickRatio { get; init; } [JsonPropertyName("interestCoverage")] public decimal? InterestCoverage { get; init; } // Dividends & Ownership [JsonPropertyName("dividendYield")] public decimal? DividendYield { get; init; } [JsonPropertyName("payoutRatio")] public decimal? PayoutRatio { get; init; } [JsonPropertyName("exDividendDate")] public DateTime? ExDividendDate { get; init; } [JsonPropertyName("nextEarningsDate")] public DateTime? NextEarningsDate { get; init; } [JsonPropertyName("percentHeldByInstitutions")] public decimal? PercentHeldByInstitutions { get; init; } [JsonPropertyName("percentHeldByInsiders")] public decimal? PercentHeldByInsiders { get; init; } [JsonPropertyName("shortRatio")] public decimal? ShortRatio { get; init; } [JsonPropertyName("shortPercentOfFloat")] public decimal? ShortPercentOfFloat { get; init; } // Forecasts [JsonPropertyName("consensusRating")] public string? ConsensusRating { get; init; } [JsonPropertyName("priceTargetLow")] public decimal? PriceTargetLow { get; init; } [JsonPropertyName("priceTargetHigh")] public decimal? PriceTargetHigh { get; init; } [JsonPropertyName("priceTargetMedian")] public decimal? PriceTargetMedian { get; init; } [JsonPropertyName("priceTargetMean")] public decimal? PriceTargetMean { get; init; } // Timestamps [JsonPropertyName("lastUpdatedAt")] public DateTime LastUpdatedAt { get; init; } // Relational Collections [JsonPropertyName("executives")] public List Executives { get; init; } = []; [JsonPropertyName("financialStatements")] public List FinancialStatements { get; init; } = []; [JsonPropertyName("estimates")] public List Estimates { get; init; } = []; [JsonPropertyName("availableTickers")] public List AvailableTickers { get; init; } = []; } public record CompanyExecutiveDto { [JsonPropertyName("name")] public string Name { get; init; } = string.Empty; [JsonPropertyName("title")] public string Title { get; init; } = string.Empty; [JsonPropertyName("age")] public int? Age { get; init; } [JsonPropertyName("compensation")] public decimal? Compensation { get; init; } } public record FinancialStatementDto { [JsonPropertyName("periodType")] public string PeriodType { get; init; } = string.Empty; // "Annual" or "Quarterly" [JsonPropertyName("endDate")] public DateTime EndDate { get; init; } // Income Statement [JsonPropertyName("totalRevenue")] public decimal? TotalRevenue { get; init; } [JsonPropertyName("costOfRevenue")] public decimal? CostOfRevenue { get; init; } [JsonPropertyName("grossProfit")] public decimal? GrossProfit { get; init; } [JsonPropertyName("operatingExpenses")] public decimal? OperatingExpenses { get; init; } [JsonPropertyName("operatingIncome")] public decimal? OperatingIncome { get; init; } [JsonPropertyName("ebitda")] public decimal? Ebitda { get; init; } [JsonPropertyName("netIncome")] public decimal? NetIncome { get; init; } [JsonPropertyName("epsBasic")] public decimal? EpsBasic { get; init; } [JsonPropertyName("epsDiluted")] public decimal? EpsDiluted { get; init; } // Balance Sheet [JsonPropertyName("cashAndCashEquivalents")] public decimal? CashAndCashEquivalents { get; init; } [JsonPropertyName("accountsReceivable")] public decimal? AccountsReceivable { get; init; } [JsonPropertyName("inventory")] public decimal? Inventory { get; init; } [JsonPropertyName("totalCurrentAssets")] public decimal? TotalCurrentAssets { get; init; } [JsonPropertyName("totalNonCurrentAssets")] public decimal? TotalNonCurrentAssets { get; init; } [JsonPropertyName("currentLiabilities")] public decimal? CurrentLiabilities { get; init; } [JsonPropertyName("longTermDebt")] public decimal? LongTermDebt { get; init; } [JsonPropertyName("totalLiabilities")] public decimal? TotalLiabilities { get; init; } [JsonPropertyName("totalStockholdersEquity")] public decimal? TotalStockholdersEquity { get; init; } // Cash Flow Statement [JsonPropertyName("operatingCashFlow")] public decimal? OperatingCashFlow { get; init; } [JsonPropertyName("investingCashFlow")] public decimal? InvestingCashFlow { get; init; } [JsonPropertyName("capitalExpenditures")] public decimal? CapitalExpenditures { get; init; } [JsonPropertyName("financingCashFlow")] public decimal? FinancingCashFlow { get; init; } [JsonPropertyName("freeCashFlow")] public decimal? FreeCashFlow { get; init; } // OperatingCashFlow - CapEx } public record ForwardEstimateDto { [JsonPropertyName("period")] public string Period { get; init; } = string.Empty; // "CurrentQuarter", "NextQuarter", "CurrentYear", "NextYear" [JsonPropertyName("expectedRevenue")] public decimal? ExpectedRevenue { get; init; } [JsonPropertyName("expectedEps")] public decimal? ExpectedEps { get; init; } [JsonPropertyName("expectedGrowthRate")] public decimal? ExpectedGrowthRate { get; init; } } public record TickerDto { [JsonPropertyName("ticker")] public string Ticker { get; init; } = string.Empty; [JsonPropertyName("exchange")] public string? Exchange { get; init; } [JsonPropertyName("tradingCurrency")] public string? TradingCurrency { get; init; } [JsonPropertyName("currentPrice")] public decimal CurrentPrice { get; init; } [JsonPropertyName("dayChangeAbsolute")] public decimal DayChangeAbsolute { get; init; } [JsonPropertyName("dayChangePercent")] public decimal DayChangePercent { get; init; } [JsonPropertyName("fiftyTwoWeekHigh")] public decimal FiftyTwoWeekHigh { get; init; } [JsonPropertyName("fiftyTwoWeekLow")] public decimal FiftyTwoWeekLow { get; init; } [JsonPropertyName("marketCapitalization")] public decimal MarketCapitalization { get; init; } [JsonPropertyName("enterpriseValue")] public decimal EnterpriseValue { get; init; } [JsonPropertyName("peRatioTrailing")] public decimal? PeRatioTrailing { get; init; } [JsonPropertyName("peRatioForward")] public decimal? PeRatioForward { get; init; } [JsonPropertyName("pegRatio")] public decimal? PegRatio { get; init; } [JsonPropertyName("pbRatio")] public decimal? PbRatio { get; init; } [JsonPropertyName("psRatio")] public decimal? PsRatio { get; init; } [JsonPropertyName("evToEbitda")] public decimal? EvToEbitda { get; init; } [JsonPropertyName("evToRevenue")] public decimal? EvToRevenue { get; init; } [JsonPropertyName("grossMargin")] public decimal? GrossMargin { get; init; } [JsonPropertyName("operatingMargin")] public decimal? OperatingMargin { get; init; } [JsonPropertyName("netProfitMargin")] public decimal? NetProfitMargin { get; init; } [JsonPropertyName("returnOnEquity")] public decimal? ReturnOnEquity { get; init; } [JsonPropertyName("returnOnAssets")] public decimal? ReturnOnAssets { get; init; } [JsonPropertyName("returnOnInvestedCapital")] public decimal? ReturnOnInvestedCapital { get; init; } [JsonPropertyName("debtToEquity")] public decimal? DebtToEquity { get; init; } [JsonPropertyName("currentRatio")] public decimal? CurrentRatio { get; init; } [JsonPropertyName("quickRatio")] public decimal? QuickRatio { get; init; } [JsonPropertyName("interestCoverage")] public decimal? InterestCoverage { get; init; } [JsonPropertyName("dividendYield")] public decimal? DividendYield { get; init; } [JsonPropertyName("payoutRatio")] public decimal? PayoutRatio { get; init; } [JsonPropertyName("exDividendDate")] public DateTime? ExDividendDate { get; init; } }