using System; using System.Collections.Generic; using System.Text.Json.Serialization; namespace FinlyticCore.Dtos.Fundamentals; /// /// Haupt-DTO für die aggregierte Anzeige der Stammdaten, Fundamentaldaten und Events eines Assets. /// [Serializable] public record AssetFundamentalsDto { /// /// Grundlegende Unternehmens- und Stammdaten (Aus AssetDataEntity). /// [JsonPropertyName("asset")] public AssetHeaderDto Asset { get; init; } = new(); /// /// Aktuellste Finanzeckdaten und Kennzahlen (Aus FundamentalDataEntity). /// [JsonPropertyName("fundamentals")] public FundamentalDataDto? Fundamentals { get; init; } /// /// Liste der Führungskräfte/Vorstände (Aus KeyExecutiveEntity). /// [JsonPropertyName("executives")] public List Executives { get; init; } = []; /// /// Bevorstehende oder vergangene Termine wie Earnings oder Dividenden (Aus AssetEventEntity). /// [JsonPropertyName("events")] public List Events { get; init; } = []; /// /// Zeitstempel der letzten Gesamt-Aktualisierung. /// [JsonPropertyName("lastUpdatedAt")] public DateTime LastUpdatedAt { get; init; } = DateTime.UtcNow; /// /// Berechnete Tage bis zum nächsten Quartalszahlen-Termin (Earnings Lockout Check). /// [JsonPropertyName("daysToNextEarnings")] public int? DaysToNextEarnings => Events? .Where(e => (e.Type.Equals("Earnings", StringComparison.OrdinalIgnoreCase) || e.EventType.Equals("Earnings", StringComparison.OrdinalIgnoreCase)) && e.Date >= DateTime.UtcNow.Date) .OrderBy(e => e.Date) .Select(e => (int?)(e.Date.Date - DateTime.UtcNow.Date).TotalDays) .FirstOrDefault(); /// /// Berechnete Tage bis zum nächsten Ex-Dividenden-Tag (Dividend Gate Check). Nur Events mit dem /// kanonischen Type "Dividend" zählen - dieser wird ausschließlich aus Trade Republics strukturierten /// Dividend-Feldern (ExpectedDividend/Dividends, echtes ExDate) befüllt, nicht aus dem generischen /// Events/PastEvents-Feed, dessen freie Type/Title-Strings nicht zuverlässig auf "Dividende" gemappt werden /// können (Rules.md §4: kein Raten anhand unsicherer Freitext-Strings). /// [JsonPropertyName("daysToNextExDividend")] public int? DaysToNextExDividend => Events? .Where(e => e.Type.Equals("Dividend", StringComparison.OrdinalIgnoreCase) && e.Date >= DateTime.UtcNow.Date) .OrderBy(e => e.Date) .Select(e => (int?)(e.Date.Date - DateTime.UtcNow.Date).TotalDays) .FirstOrDefault(); }