feat(Core): update DTOs and shared models

This commit is contained in:
2026-08-09 21:01:38 +02:00
parent 6337e63a77
commit 5475c3ac51
58 changed files with 3418 additions and 30 deletions
@@ -0,0 +1,281 @@
using System;
using System.Collections.Generic;
using System.Text.Json.Serialization;
namespace FinlyticCore.Dtos.Fundamentals;
/// <summary>
/// Data transfer object representing the complete fundamental analysis dataset of an asset.
/// </summary>
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<CompanyExecutiveDto> Executives { get; init; } = [];
[JsonPropertyName("financialStatements")]
public List<FinancialStatementDto> FinancialStatements { get; init; } = [];
[JsonPropertyName("estimates")]
public List<ForwardEstimateDto> Estimates { get; init; } = [];
[JsonPropertyName("availableTickers")]
public List<TickerDto> 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; }
}
@@ -0,0 +1,25 @@
using System;
using System.Text.Json.Serialization;
namespace FinlyticCore.Dtos.Fundamentals;
/// <summary>
/// DTO representing a scheduled corporate event (e.g. Earnings, Ex-Dividend, Dividend Payout).
/// </summary>
public record CorporateEventDto
{
[JsonPropertyName("isin")]
public string Isin { get; init; } = string.Empty;
[JsonPropertyName("ticker")]
public string Ticker { get; init; } = string.Empty;
[JsonPropertyName("companyName")]
public string CompanyName { get; init; } = string.Empty;
[JsonPropertyName("eventType")]
public string EventType { get; init; } = string.Empty; // "Quartalsergebnis", "Ex-Dividendentag", "Dividenden-Zahltag"
[JsonPropertyName("date")]
public DateTime Date { get; init; }
}