iOS: Benachrichtigungs-Kategorien laden + Ein-/Auslager-Meldung huebscher

1) In den Benachrichtigungs-Regeln liess sich keine Kategorie waehlen: der Abruf
   holte den ganzen Snapshot (Produkte + Ablauf + Kategorien) - schlug ein Teil
   fehl, kamen auch die Kategorien leer. snapshot ist jetzt widerstandsfaehig
   (Teilausfaelle egal), und die Regel-Bearbeitung holt nur noch die Kategorien.

2) Die gruene Erfolgsmeldung ist jetzt eine saubere, eingerueckte Pille mit Titel
   ("Eingelagert"/"Ausgelagert") und Detailzeile ("Neuer Bestand: 2 Packungen").
   Die Einheit steht in der Mehrzahl (Gebinde-Plural vom Server; Basiseinheiten
   wie Gramm bleiben unveraendert).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-07-29 15:04:25 +02:00
parent a0979a0780
commit 8250b5dc84
7 changed files with 68 additions and 31 deletions

View File

@@ -15,12 +15,24 @@ enum ServerFetch {
let categories: [CategoryItem]
}
static func snapshot(baseURL: URL, token: String, horizonDays: Int) async throws -> Snapshot {
static func snapshot(baseURL: URL, token: String, horizonDays: Int) async -> Snapshot {
async let expiring: [ExpiringItem] = get(
"/expiring?days=\(horizonDays)", baseURL: baseURL, token: token)
async let products: [Product] = get("/products", baseURL: baseURL, token: token)
async let categories: [CategoryItem] = get("/categories", baseURL: baseURL, token: token)
return try await Snapshot(expiring: expiring, products: products, categories: categories)
// Einzelne Ausfaelle sollen nicht alles kippen (sonst fehlten z.B. die
// Kategorien nur, weil die Produktliste langsam war).
return await Snapshot(
expiring: (try? await expiring) ?? [],
products: (try? await products) ?? [],
categories: (try? await categories) ?? []
)
}
/// Nur den Kategorie-Baum eines bestimmten Servers holen (fuer die
/// Regel-Bearbeitung in den Benachrichtigungen).
static func categories(baseURL: URL, token: String) async throws -> [CategoryItem] {
try await get("/categories", baseURL: baseURL, token: token)
}
private static func get<T: Decodable>(