66 lines
2.7 KiB
C#
66 lines
2.7 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text.Json.Serialization;
|
|
|
|
namespace FinlyticCore.Dtos.Fundamentals;
|
|
|
|
/// <summary>
|
|
/// Haupt-DTO für die aggregierte Anzeige der Stammdaten, Fundamentaldaten und Events eines Assets.
|
|
/// </summary>
|
|
[Serializable]
|
|
public record AssetFundamentalsDto
|
|
{
|
|
/// <summary>
|
|
/// Grundlegende Unternehmens- und Stammdaten (Aus AssetDataEntity).
|
|
/// </summary>
|
|
[JsonPropertyName("asset")]
|
|
public AssetHeaderDto Asset { get; init; } = new();
|
|
|
|
/// <summary>
|
|
/// Aktuellste Finanzeckdaten und Kennzahlen (Aus FundamentalDataEntity).
|
|
/// </summary>
|
|
[JsonPropertyName("fundamentals")]
|
|
public FundamentalDataDto? Fundamentals { get; init; }
|
|
|
|
/// <summary>
|
|
/// Liste der Führungskräfte/Vorstände (Aus KeyExecutiveEntity).
|
|
/// </summary>
|
|
[JsonPropertyName("executives")]
|
|
public List<KeyExecutiveDto> Executives { get; init; } = [];
|
|
|
|
/// <summary>
|
|
/// Bevorstehende oder vergangene Termine wie Earnings oder Dividenden (Aus AssetEventEntity).
|
|
/// </summary>
|
|
[JsonPropertyName("events")]
|
|
public List<CorporateEventDto> Events { get; init; } = [];
|
|
|
|
/// <summary>
|
|
/// Zeitstempel der letzten Gesamt-Aktualisierung.
|
|
/// </summary>
|
|
[JsonPropertyName("lastUpdatedAt")]
|
|
public DateTime LastUpdatedAt { get; init; } = DateTime.UtcNow;
|
|
|
|
/// <summary>
|
|
/// Berechnete Tage bis zum nächsten Quartalszahlen-Termin (Earnings Lockout Check).
|
|
/// </summary>
|
|
[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();
|
|
|
|
/// <summary>
|
|
/// 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).
|
|
/// </summary>
|
|
[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();
|
|
} |