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:
1 parent
79f230ea2c
commit
4b184f744f
4 files changed
+88
-12
No files matched your search
@@ -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: [] })
|
||||
})
|
||||
Reference in new issue
Block a user