Kontrolle: AB ohne Projekt im Rechnungsdialog für Anzahlung und Schluss wählbar

Der Server (rechnungsbau.js, baueAbRechnung) nimmt Anzahlung und Schlussrechnung ohne
Projekt an. Unter 'Ohne Projekt' lädt der Dialog die ABs des Kunden ohne Projekt und
ihre Rechnungen; frei bleibt die Vorgabe.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Sonnet 5.5 committed 2026-10-07 15:19:35 +00:00
1 parent 79f230ea2c
commit 4b184f744f
4 files changed
+88 -12

No files matched your search

+28 -2
View File
@@ -9,7 +9,7 @@ const {
artOptionen, standardArt, standardAuftrag, anzahlungStandard,
ausgewaehlteIds, blaetterSumme, blattAusAppwrite, ticketOptionen, zahlungszielVorschlag,
STEUERNUMMER_RECHNUNG_HINWEIS, steuernummerHinweis,
STRIPE_UNBEKANNT, abSummenText,
STRIPE_UNBEKANNT, abSummenText, ohneProjektAbDaten,
} = await loadModule('src/lib/rechnungDialogView.js')
const ab = (over = {}) => ({
@@ -128,7 +128,7 @@ test('artOptionen: ein offener Entwurf zur AB sperrt die Schlussrechnung, nicht
test('artOptionen: ohne Wahl keine Arten, ohne Projekt nur die freie Rechnung', () => {
assert.deepEqual(artOptionen({ projektId: null, auftraege: [ab()], rechnungen: [], auftraegeAktiv: true }), [])
const frei = artOptionen({ projektId: '', auftraege: [ab()], rechnungen: [], auftraegeAktiv: true })
const frei = artOptionen({ projektId: '', auftraege: [ab({ projektId: 'p1' })], rechnungen: [], auftraegeAktiv: true })
assert.deepEqual(zustand(frei), [['frei', true]])
})
@@ -272,3 +272,29 @@ test('standardArt: bei Stripe-Ausfall wird keine Art vorgeschlagen (Beträge unb
const frei = artOptionen({ projektId: '', auftraege: [], rechnungen: [], auftraegeAktiv: true })
assert.equal(standardArt(frei, { ...lage, stripeOk: false }), 'frei')
})
test('artOptionen ohne Projekt: eine gültige AB ohne Projekt macht Anzahlung und Schlussrechnung wählbar', () => {
const ohne = (args = {}) => artOptionen({ projektId: '', auftraege: [ab()], rechnungen: [], auftraegeAktiv: true, ...args })
assert.deepEqual(zustand(ohne()), [['frei', true], ['anzahlung', true], ['schluss', true]])
assert.deepEqual(ohne().map((x) => x.label), ['Freie Positionen', 'Anzahlung', 'Schlussrechnung'])
// eine AB mit Projekt, ein Entwurf, ein falscher Status oder der ausgeschaltete Schalter: wie bisher nur frei bzw. gesperrt
assert.deepEqual(zustand(ohne({ auftraege: [ab({ projektId: 'p1' })] })), [['frei', true]])
assert.deepEqual(zustand(ohne({ auftraege: [ab({ status: 'entwurf' })] })), [['frei', true]])
assert.deepEqual(zustand(ohne({ auftraegeAktiv: false })), [['frei', true]])
const entwurf = ohne({ rechnungen: [rk({ status: 'entwurf' })] })
assert.deepEqual(zustand(entwurf), [['frei', true], ['anzahlung', true], ['schluss', false]])
assert.equal(entwurf[2].hint, ENTWURF_HINWEIS)
// Vorgabe bleibt die freie Rechnung
assert.equal(standardArt(ohne(), { auftraege: [ab()], rechnungen: [], offeneMinuten: 0 }), 'frei')
})
test('ohneProjektAbDaten: nur ABs ohne Projekt und deren Rechnungen aus Auftrags- und Rechnungsliste', () => {
const daten = ohneProjektAbDaten(
{ auftraege: [ab({ id: 'a1', projektId: '' }), ab({ id: 'a2', projektId: 'p1' }), ab({ id: 'a3' })] },
{ rechnungen: [rk({ auftragId: 'a1' }), rk({ id: 'in_2', auftragId: 'a2' }), rk({ id: 'in_3', auftragId: '' }), rk({ id: 'in_4', auftragId: 'a3', status: 'entwurf' })] }
)
assert.deepEqual(daten.auftraege.map((a) => a.id), ['a1', 'a3'])
assert.deepEqual(daten.rechnungen.map((r) => r.id), ['in_1', 'in_4'])
assert.deepEqual(ohneProjektAbDaten(undefined, null), { auftraege: [], rechnungen: [] })
assert.deepEqual(ohneProjektAbDaten({ auftraege: 'x' }, { rechnungen: {} }), { auftraege: [], rechnungen: [] })
})