Dashboard-Berechnungslogik (Use Cases & Tests) #29

Closed
opened 2026-05-13 23:25:13 +00:00 by jreinemann-euris · 1 comment
jreinemann-euris commented 2026-05-13 23:25:13 +00:00 (Migrated from github.com)

Feature: Dashboard-Berechnungslogik

Part of: #7
Depends on: #5 (Block 2), #6 (Block 3)

Ziel

Reine Berechnungslogik für alle Dashboard-Features: Kategorieübersicht, Gesamtwert, Reichweitenrechner und Warnungen. Vollständig unit-testbar ohne UI-Abhängigkeiten.

Scope

  • Kategorie-Zusammenfassung: Artikelanzahl + Gesamtwert pro Kategorie
  • Gesamtwert-Berechnung: Summe aller (quantity × unitPrice)
  • Reichweitenrechner: Gesamtkcal aus Items berechnen, durch (Personen × kcal/Tag) teilen → Tage Reichweite. Default-Werte: 2 Personen, 2000 kcal/Tag (Einstellungen → Block 5)
  • Ablaufdaten-Warnungen: Items die in 6 bzw. 12 Monaten ablaufen, gruppiert nach Dringlichkeit
  • Mindestbestand-Warnungen: Items wo quantity < minStock

Technische Hinweise

  • Bestehende Entities: ItemEntity (unitPrice, kcalPer100g, expiryDate, minStock), CategoryEntity
  • Bestehende Repositories: ItemRepository.getAll(), CategoryRepository.getAll(), SettingsRepository
  • Berechnungen als eigenständige Funktionen/Klassen im domain-Layer (oder als Extension Functions)
  • SettingsRepository für Personen/kcal-Defaults nutzen (Keys z.B. household_size, daily_kcal_per_person)

Akzeptanzkriterien

  • Gesamtwert wird korrekt aus quantity × unitPrice berechnet
  • Kategorieübersicht zeigt Artikelanzahl + Wert pro Kategorie
  • Reichweite wird korrekt berechnet: Gesamtkcal / (Personen × kcal/Tag)
  • Ablaufdaten-Warnung liefert Items die in ≤6 Monaten und ≤12 Monaten ablaufen (2 Listen)
  • Mindestbestand-Warnung liefert Items wo quantity < minStock
  • Tests: Unit-Tests für jede Berechnungsfunktion mit Edge Cases (leere Liste, fehlende kcal-Werte, kein Ablaufdatum)
## Feature: Dashboard-Berechnungslogik Part of: #7 Depends on: #5 (Block 2), #6 (Block 3) ### Ziel Reine Berechnungslogik für alle Dashboard-Features: Kategorieübersicht, Gesamtwert, Reichweitenrechner und Warnungen. Vollständig unit-testbar ohne UI-Abhängigkeiten. ### Scope - Kategorie-Zusammenfassung: Artikelanzahl + Gesamtwert pro Kategorie - Gesamtwert-Berechnung: Summe aller (quantity × unitPrice) - Reichweitenrechner: Gesamtkcal aus Items berechnen, durch (Personen × kcal/Tag) teilen → Tage Reichweite. Default-Werte: 2 Personen, 2000 kcal/Tag (Einstellungen → Block 5) - Ablaufdaten-Warnungen: Items die in 6 bzw. 12 Monaten ablaufen, gruppiert nach Dringlichkeit - Mindestbestand-Warnungen: Items wo quantity < minStock ### Technische Hinweise - Bestehende Entities: `ItemEntity` (unitPrice, kcalPer100g, expiryDate, minStock), `CategoryEntity` - Bestehende Repositories: `ItemRepository.getAll()`, `CategoryRepository.getAll()`, `SettingsRepository` - Berechnungen als eigenständige Funktionen/Klassen im domain-Layer (oder als Extension Functions) - SettingsRepository für Personen/kcal-Defaults nutzen (Keys z.B. `household_size`, `daily_kcal_per_person`) ### Akzeptanzkriterien - [ ] Gesamtwert wird korrekt aus quantity × unitPrice berechnet - [ ] Kategorieübersicht zeigt Artikelanzahl + Wert pro Kategorie - [ ] Reichweite wird korrekt berechnet: Gesamtkcal / (Personen × kcal/Tag) - [ ] Ablaufdaten-Warnung liefert Items die in ≤6 Monaten und ≤12 Monaten ablaufen (2 Listen) - [ ] Mindestbestand-Warnung liefert Items wo quantity < minStock - [ ] Tests: Unit-Tests für jede Berechnungsfunktion mit Edge Cases (leere Liste, fehlende kcal-Werte, kein Ablaufdatum)
jreinemann-euris commented 2026-05-13 23:39:01 +00:00 (Migrated from github.com)

Abgeschlossen (2026-05-14)

Zyklen: 1 (1 Korrektur: !! → mapNotNull)
Tests: 39 Tests, 0 Fehler

Implementierte Artefakte

  • CategorySummary (domain/model): Artikelanzahl + Gesamtwert pro Kategorie
  • ExpiryWarning + ExpiryUrgency (domain/model): Ablaufdaten-Warnungen (urgent ≤6 Monate, warning ≤12 Monate)
  • MinStockWarning (domain/model): Mindestbestand-Warnungen mit Defizit
  • CalculateTotalValueUseCase: Σ(quantity × unitPrice)
  • CalculateCategorySummaryUseCase: Pro-Kategorie-Übersicht
  • CalculateSupplyRangeUseCase: Kcal-basierte Reichweite (g/kg/mg; Default 2 Pers. × 2000 kcal/Tag)
  • GetExpiryWarningsUseCase: Items ≤6/≤12 Monate vor Ablauf
  • GetMinStockWarningsUseCase: Items unter Mindestbestand

Abweichungen

  • Reichweitenberechnung nur für gewichtsbasierte Einheiten (g, kg, mg). Items mit Stück/Liter/etc. werden bei der Kcal-Berechnung übersprungen.
## Abgeschlossen (2026-05-14) **Zyklen:** 1 (1 Korrektur: !! → mapNotNull) **Tests:** ✅ 39 Tests, 0 Fehler ### Implementierte Artefakte - ✅ **CategorySummary** (domain/model): Artikelanzahl + Gesamtwert pro Kategorie - ✅ **ExpiryWarning + ExpiryUrgency** (domain/model): Ablaufdaten-Warnungen (urgent ≤6 Monate, warning ≤12 Monate) - ✅ **MinStockWarning** (domain/model): Mindestbestand-Warnungen mit Defizit - ✅ **CalculateTotalValueUseCase**: Σ(quantity × unitPrice) - ✅ **CalculateCategorySummaryUseCase**: Pro-Kategorie-Übersicht - ✅ **CalculateSupplyRangeUseCase**: Kcal-basierte Reichweite (g/kg/mg; Default 2 Pers. × 2000 kcal/Tag) - ✅ **GetExpiryWarningsUseCase**: Items ≤6/≤12 Monate vor Ablauf - ✅ **GetMinStockWarningsUseCase**: Items unter Mindestbestand ### Abweichungen - Reichweitenberechnung nur für gewichtsbasierte Einheiten (g, kg, mg). Items mit Stück/Liter/etc. werden bei der Kcal-Berechnung übersprungen.
Sign in to join this conversation.
No description provided.