Ausgaben: Kategorien backend-konform (kleingeschrieben, sechs Werte)

Backend-Whitelist: tierarzt, futter, zubehoer, versicherung, sitter, sonstiges.
Bisher schickte ich großgeschriebene Display-Strings, daher HTTP 400
'Ungültige Kategorie: Futter'. Jetzt: interner Key kleingeschrieben für die
API, label() für die Anzeige in der Liste und im Picker.
This commit is contained in:
rene 2026-05-30 12:28:04 +02:00
parent f054b2a07f
commit c03f018c0c

View file

@ -93,7 +93,7 @@ private struct ExpenseRow: View {
.foregroundStyle(Color.accentColor)
.frame(width: 28)
VStack(alignment: .leading, spacing: 2) {
Text(expense.kategorie).font(.subheadline.bold())
Text(label(for: expense.kategorie)).font(.subheadline.bold())
HStack(spacing: 6) {
Text(dateLabel)
if let dog = expense.dogName {
@ -115,23 +115,33 @@ private struct ExpenseRow: View {
private func icon(for kategorie: String) -> String {
switch kategorie.lowercased() {
case "futter", "essen": return "fork.knife"
case "futter": return "fork.knife"
case "tierarzt": return "stethoscope"
case "zubehoer": return "bag.fill"
case "versicherung": return "shield.lefthalf.filled"
case "spielzeug": return "tennisball.fill"
case "pflege", "fellpflege": return "scissors"
case "training", "hundeschule": return "graduationcap.fill"
case "leckerli", "snacks": return "carrot.fill"
case "sitter": return "person.fill"
default: return "eurosign.circle"
}
}
private func label(for kategorie: String) -> String {
switch kategorie.lowercased() {
case "futter": return "Futter"
case "tierarzt": return "Tierarzt"
case "zubehoer": return "Zubehör"
case "versicherung": return "Versicherung"
case "sitter": return "Sitter"
case "sonstiges": return "Sonstiges"
default: return kategorie.capitalized
}
}
}
private struct AddExpenseSheet: View {
@Environment(\.dismiss) private var dismiss
let onSaved: () -> Void
@State private var kategorie = "Futter"
@State private var kategorie = "futter"
@State private var betrag = ""
@State private var date = Date()
@State private var notiz = ""
@ -140,14 +150,24 @@ private struct AddExpenseSheet: View {
@State private var isSaving = false
@State private var errorMessage: String?
private let kategorien = ["Futter", "Tierarzt", "Versicherung", "Spielzeug", "Pflege", "Training", "Leckerli", "Sonstiges"]
/// Backend-Whitelist: tierarzt, futter, zubehoer, versicherung, sitter, sonstiges
private let kategorien: [(key: String, label: String)] = [
("futter", "Futter"),
("tierarzt", "Tierarzt"),
("zubehoer", "Zubehör"),
("versicherung", "Versicherung"),
("sitter", "Sitter"),
("sonstiges", "Sonstiges")
]
var body: some View {
NavigationStack {
Form {
Section("Kategorie") {
Picker("Kategorie", selection: $kategorie) {
ForEach(kategorien, id: \.self) { Text($0) }
ForEach(kategorien, id: \.key) { entry in
Text(entry.label).tag(entry.key)
}
}
}
Section("Betrag") {