Finanzen: Rechnungen schreiben und verwalten, Buchungen zuordnen

Block 6 (Rechnungen: Filter, Altersgruppen, Aktionen, Dialog "Rechnung schreiben")
und Block 7 (Buchungen mit Paging, Zuordnen-Dialog, bei Rechnungen zweistufig).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Sonnet 5.5 committed 2026-10-01 15:12:18 +00:00
1 parent 18bc3012e0
commit 1feeb18c08
12 files changed
+2436 -8

No files matched your search

+36
View File
@@ -0,0 +1,36 @@
import { useEffect, useState } from 'react'
import { getInvoices } from '../lib/financeApi'
const FALLBACK_ERROR = 'Die offenen Rechnungen konnten nicht geladen werden.'
/**
* Offene und überfällige Rechnungen für den Zuordnen-Dialog. Lädt jedes Mal frisch, wenn `active` true wird
* (damit der Dialog nie auf einem alten Stand arbeitet), und leert die Liste, wenn es wieder false ist.
* Scheitert Stripe, bleibt `invoices` leer und `error` nennt den Grund (Kategorien lassen sich trotzdem wählen).
*/
export function useOpenInvoices(active) {
const [state, setState] = useState({ invoices: [], loading: false, error: '' })
useEffect(() => {
if (!active) {
setState({ invoices: [], loading: false, error: '' })
return undefined
}
let cancelled = false
setState({ invoices: [], loading: true, error: '' })
Promise.all([getInvoices({ status: 'offen' }), getInvoices({ status: 'ueberfaellig' })])
.then(([open, overdue]) => {
if (cancelled) return
const all = [...(open?.rechnungen || []), ...(overdue?.rechnungen || [])]
setState({ invoices: all, loading: false, error: '' })
})
.catch((err) => {
if (!cancelled) setState({ invoices: [], loading: false, error: err?.message || FALLBACK_ERROR })
})
return () => {
cancelled = true
}
}, [active])
return state
}