Finanzen: Offen zeigt auch Ueberfaellige, Rechnungsliste laedt nach Zuordnen neu

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 1feeb18c08
commit 24a3cc41ef
6 files changed
+149 -29

No files matched your search

+11 -9
View File
@@ -1,31 +1,33 @@
import { useEffect, useState } from 'react'
import { getInvoices } from '../lib/financeApi'
import { invoiceFilterStatuses, mergeInvoiceLists } from '../lib/financeView'
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).
* `loaded` ist true, sobald die Liste dieser Öffnung frisch und ohne Fehler da ist (erst dann darf der Dialog eine
* Rechnung als „nicht mehr offen“ erkennen). 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: '' })
const [state, setState] = useState({ invoices: [], loading: false, error: '', loaded: false })
useEffect(() => {
if (!active) {
setState({ invoices: [], loading: false, error: '' })
setState({ invoices: [], loading: false, error: '', loaded: false })
return undefined
}
let cancelled = false
setState({ invoices: [], loading: true, error: '' })
Promise.all([getInvoices({ status: 'offen' }), getInvoices({ status: 'ueberfaellig' })])
.then(([open, overdue]) => {
setState({ invoices: [], loading: true, error: '', loaded: false })
Promise.all(invoiceFilterStatuses('offen').map((status) => getInvoices({ status })))
.then((results) => {
if (cancelled) return
const all = [...(open?.rechnungen || []), ...(overdue?.rechnungen || [])]
setState({ invoices: all, loading: false, error: '' })
setState({ invoices: mergeInvoiceLists(results.map((r) => r?.rechnungen)), loading: false, error: '', loaded: true })
})
.catch((err) => {
if (!cancelled) setState({ invoices: [], loading: false, error: err?.message || FALLBACK_ERROR })
if (!cancelled) setState({ invoices: [], loading: false, error: err?.message || FALLBACK_ERROR, loaded: false })
})
return () => {
cancelled = true