Finanzen: Vorschau, Steuer und Aufgaben genauer (Fixkosten ohne ESt, verspaetete Auszahlungen, Abos nicht ladbar)

M6: fixkosten30Cents zaehlt nur Fixkosten, die ESt-Vorauszahlung bleibt sicherer Posten.
M7: verspaetete Auszahlung (Ankunftstag vorbei, noch nicht bezahlt) kommt heute.
M8: ohne Stripe sind Kleinunternehmer-Zaehler und Anteil unbekannt (null), keine Warnung daraus.
M12: Verbindungsdokument ohne Sitzung zaehlt als keine Verbindung.
M13: Buchungen privat/fixkosten gehen nicht in die Fixkosten-Vorschlaege.
M14: Vorjahresumsatz ueber 25.000 EUR ist eine hohe Aufgabe.
M15: scheitert das Laden der Abos, meldet abos.fehler statt die ganze Uebersicht zu kippen.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Sonnet 5.5 committed 2026-10-01 15:42:06 +00:00
1 parent 83ee9d5a25
commit 039fdcaf27
6 files changed
+295 -20

No files matched your search

+43 -4
View File
@@ -192,7 +192,8 @@ test('ESt-Vorauszahlung 50000: 10.12. bei Horizont 90, keine bei Horizont 30; oh
const settings = { estPrepaymentCents: 50000 }
const r90 = buildForecast({ today: TODAY, horizonDays: 90, balanceCents: BALANCE, settings })
assert.deepEqual(r90.posten, [{ date: '2026-12-10', label: 'ESt-Vorauszahlung', amountCents: -50000, sicherheit: 'sicher' }])
assert.equal(r90.fixkosten30Cents, 50000)
// die ESt-Vorauszahlung ist keine Fixkosten-Position: sie steckt schon in der Steuerruecklage (M6)
assert.equal(r90.fixkosten30Cents, 0)
assert.deepEqual(r90.minSicher, { amountCents: -39107, date: '2026-12-10' })
assert.deepEqual(buildForecast({ today: TODAY, horizonDays: 30, balanceCents: BALANCE, settings }).posten, [])
assert.deepEqual(buildForecast({ today: TODAY, horizonDays: 90, balanceCents: BALANCE, settings: { estPrepaymentCents: 0 } }).posten, [])
@@ -205,7 +206,7 @@ test('ESt-Vorauszahlung: alle vier Termine, auch über den Jahreswechsel', () =>
assert.deepEqual(dates(buildForecast({ today: '2026-12-10', horizonDays: 0, balanceCents: 0, settings: { estPrepaymentCents: 100 } })), ['2026-12-10'])
})
test('Auszahlung in_transit 1500 am 03.10.: sicher +1500; pending zählt, paid/canceled/failed und vergangene nicht', () => {
test('Auszahlung in_transit 1500 am 03.10.: sicher +1500; pending zählt, paid/canceled/failed nicht, eine verspätete (Ankunftstag vorbei) kommt heute (M7)', () => {
const payouts = [
{ id: 'po_1', amountCents: 1500, arrivalDate: '2026-10-03', status: 'in_transit' },
{ id: 'po_2', amountCents: 700, arrivalDate: '2026-10-06', status: 'pending' },
@@ -217,14 +218,52 @@ test('Auszahlung in_transit 1500 am 03.10.: sicher +1500; pending zählt, paid/c
]
const r = base({ payouts })
assert.deepEqual(r.posten, [
{ date: TODAY, label: 'Stripe-Auszahlung', amountCents: 999, sicherheit: 'sicher' },
{ date: '2026-10-03', label: 'Stripe-Auszahlung', amountCents: 1500, sicherheit: 'sicher' },
{ date: '2026-10-06', label: 'Stripe-Auszahlung', amountCents: 700, sicherheit: 'sicher' },
])
assert.equal(r.endeSicherCents, 13093)
assert.equal(r.endeErwartetCents, 13093)
assert.equal(r.endeSicherCents, 14092)
assert.equal(r.endeErwartetCents, 14092)
assert.equal(r.fixkosten30Cents, 0)
})
test('verspätete Auszahlung: Ankunftstag gestern oder vor Wochen -> heute, auch in_transit; ungültige Tage fallen weg (M7)', () => {
const r = base({
payouts: [
{ id: 'po_1', amountCents: 4000, arrivalDate: '2026-09-30', status: 'in_transit' },
{ id: 'po_2', amountCents: 500, arrivalDate: '2026-08-01', status: 'pending' },
{ id: 'po_3', amountCents: 900, arrivalDate: 'gestern', status: 'pending' },
],
})
assert.deepEqual(r.posten.map((p) => [p.date, p.amountCents]), [[TODAY, 4000], [TODAY, 500]])
assert.deepEqual(r.minSicher, { amountCents: 10893, date: TODAY })
assert.equal(r.endeSicherCents, 15393)
// ein Abfluss am selben Tag kommt weiter zuerst
const mixed = base({
payouts: [{ id: 'po_1', amountCents: 4000, arrivalDate: '2026-09-30', status: 'in_transit' }],
fixedCosts: [monthly({ nextDate: TODAY })],
})
assert.deepEqual(mixed.posten.map((p) => p.amountCents), [-449, 4000])
})
test('fixkosten30Cents zählt nur Fixkosten, nicht die ESt-Vorauszahlung; die ESt bleibt ein sicherer Posten (M6)', () => {
const r = buildForecast({
today: TODAY,
horizonDays: 90,
balanceCents: BALANCE,
settings: { estPrepaymentCents: 50000 },
fixedCosts: [monthly({ nextDate: '2026-10-10' })],
})
// 449 monatlich: 10.10., 10.11., 10.12., 10.01. liegt hinter dem Horizont (30.12.)
assert.equal(r.fixkosten30Cents, 3 * 449)
assert.deepEqual(r.posten.filter((p) => p.label === 'ESt-Vorauszahlung'), [{ date: '2026-12-10', label: 'ESt-Vorauszahlung', amountCents: -50000, sicherheit: 'sicher' }])
// die Linie rechnet die ESt weiter ein: 10893 - 3 * 449 - 50000
assert.equal(r.endeSicherCents, 10893 - 3 * 449 - 50000)
// nur ESt, keine Fixkosten: 0
assert.equal(buildForecast({ today: TODAY, horizonDays: 90, balanceCents: 0, settings: { estPrepaymentCents: 50000 } }).fixkosten30Cents, 0)
})
test('Sortierung: nach Datum, am selben Tag Abflüsse zuerst', () => {
const r = base({
payouts: [{ id: 'po_1', amountCents: 1500, arrivalDate: '2026-10-14', status: 'in_transit' }],