import { useRef, useState } from 'react' import { Button, Card, EmptyState } from '../ui' import AddressWarning from '../finance/AddressWarning' import InvoiceTable from '../finance/InvoiceTable' import ProjektkontoListe from './ProjektkontoListe' import RechnungDialog from './RechnungDialog' import AuftragListe from './AuftragListe' import AuftragDialog from './AuftragDialog' import { useFinanceResource } from '../../hooks/useFinanceResource' import { useScrollIntoView } from '../../hooks/useScrollIntoView' import { getProjektkonten, listAuftraege } from '../../lib/financeApi' import { customerInvoicesGate } from '../../lib/financeView' import { noticeProps } from '../../lib/financeUi' import { KONTEN_FEHLER, ladeAuftraegeAnsicht, ansichtsZustand, kundeMitKundenart, erstelltMeldung, auftragMeldung, } from '../../lib/auftraegeAnsicht' /** * Reiter „Aufträge und Rechnungen“ am Kunden (ersetzt CustomerInvoices). Kann für den Kunden keine Rechnung geschrieben * werden (noch Lead, abgesagt, keine E-Mail), steht der Grund da, mit „Daten erfassen“; es werden keine Abrufe gestartet. * Sonst von oben nach unten: Adresswarnung, Rückmeldung, Hinweis zum Neuladen, Projekte (Projektkonten), Aufträge (nur * mit eingeschaltetem Schalter AUFTRAEGE_ENABLED) und die Rechnungsliste. Die Rechnungsliste und die Adresswarnung hängen * nie vom Laden der Projekte oder Aufträge ab: fällt eines davon aus, bleibt „Rechnung schreiben“ bedienbar. * Die Dialoge stehen als Geschwister hinter den Abschnitten (nie in InvoiceTable oder .fin-body). */ export default function AuftraegeUndRechnungen({ customer, onShowOverview }) { const gate = customerInvoicesGate(customer) if (!gate.ok) { return ( Daten erfassen : null} /> ) } return } function AuftraegeInhalt({ customer, onShowOverview }) { const res = useFinanceResource(() => ladeAuftraegeAnsicht(customer.$id, { getProjektkonten, listAuftraege }), KONTEN_FEHLER) const ansicht = ansichtsZustand(res) const reload = res.reload const [meldung, setMeldung] = useState(null) // { tone, text } oder null const [rechnungsDialog, setRechnungsDialog] = useState(null) // { projektId } oder null const [auftragsDialog, setAuftragsDialog] = useState(null) // { projektId, auftrag } oder null const [listeToken, setListeToken] = useState(0) const meldungRef = useRef(null) useScrollIntoView(meldungRef, meldung) // Die Dialoge bekommen die frische Kundenart des Portals (die Kundenseite hält ggf. noch den alten Datensatz) const kunde = kundeMitKundenart(customer, ansicht.kunde) function openRechnung(projektId) { setMeldung(null) setRechnungsDialog({ projektId }) } function openAuftrag(projektId, auftrag = null) { setMeldung(null) setAuftragsDialog({ projektId, auftrag }) } function handleCreated(rechnung, info) { setRechnungsDialog(null) setMeldung(erstelltMeldung(rechnung, info)) setListeToken((n) => n + 1) reload() } function handleSaved(auftrag) { setAuftragsDialog(null) setMeldung(auftragMeldung(auftrag)) reload() } return ( <> {meldung && (

{meldung.text}

)} {ansicht.projekteStatus === 'bereit' && ansicht.nachladeFehler && (

Die Übersicht konnte nicht neu geladen werden: {ansicht.nachladeFehler}{' '}

)} {ansicht.projekteStatus === 'laden' && (
Projekte werden geladen …
)} {ansicht.projekteStatus === 'fehler' && (

{ansicht.fehler}

)} {ansicht.projekteStatus === 'bereit' && ( openAuftrag(projektId)} /> )} {ansicht.auftraegeStatus === 'bereit' && ( openAuftrag(auftrag.projektId || null, auftrag)} onShowOverview={onShowOverview} /> )} {ansicht.auftraegeStatus === 'fehler' && (

{ansicht.auftraegeFehler}

)} {rechnungsDialog && ( setRechnungsDialog(null)} onCreated={handleCreated} kunde={kunde} projektId={rechnungsDialog.projektId} auftraegeAktiv={ansicht.auftraegeAktiv} onShowOverview={onShowOverview} /> )} {auftragsDialog && ( setAuftragsDialog(null)} onSaved={handleSaved} kunde={kunde} projektId={auftragsDialog.projektId} auftrag={auftragsDialog.auftrag} konten={ansicht.konten} onShowOverview={onShowOverview} /> )} ) }