feat(core): add shared DTOs, MqttTopics constants, DatabaseBootstrapper, and ManagedMqttClient extensions

This commit is contained in:
2026-08-24 21:35:24 +02:00
parent 6ab84fe1de
commit 44b161d509
39 changed files with 2545 additions and 709 deletions
@@ -39,4 +39,28 @@ public record AssetFundamentalsDto
/// </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();
}