From f4edcc2d44da49ccaa4f821d3f3ada7dea1aa9d0 Mon Sep 17 00:00:00 2001 From: florianfederspiel Date: Thu, 23 Apr 2026 21:49:45 +0200 Subject: [PATCH] =?UTF-8?q?Rechnungsentw=C3=BCrfe=20optional=20wie=20Rechn?= =?UTF-8?q?ungen=20verwenden?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/pages/accounting/liquidity.vue | 43 +++++++++++++++++++++---- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/frontend/pages/accounting/liquidity.vue b/frontend/pages/accounting/liquidity.vue index 02e94c6..7af30e0 100644 --- a/frontend/pages/accounting/liquidity.vue +++ b/frontend/pages/accounting/liquidity.vue @@ -17,6 +17,16 @@ const dismissedRecurringKeys = computed(() => { return tempStore.settings?.liquidityForecast?.dismissedRecurringKeys || [] }) +const includeDraftsAsInvoices = computed({ + get: () => Boolean(tempStore.settings?.liquidityForecast?.includeDraftsAsInvoices), + set: (value) => { + tempStore.modifySettings("liquidityForecast", { + ...(tempStore.settings?.liquidityForecast || {}), + includeDraftsAsInvoices: Boolean(value) + }) + } +}) + const storeDismissedRecurringKeys = (keys) => { tempStore.modifySettings("liquidityForecast", { ...(tempStore.settings?.liquidityForecast || {}), @@ -60,13 +70,16 @@ const readForecastCache = () => { } } -const applyDismissedRecurring = (value) => { +const applyForecastAdjustments = (value) => { if (!value) return null const dismissed = new Set(dismissedRecurringKeys.value) - const events = (value.events || []).filter((event) => { + const baseEvents = (value.events || []).filter((event) => { return event.source !== "recurring_bankstatement" || !event.recurringKey || !dismissed.has(event.recurringKey) }) + const events = includeDraftsAsInvoices.value + ? [...baseEvents, ...(value.draftEvents || [])] + : baseEvents const recurring = (value.recurring || []).filter((item) => !item.key || !dismissed.has(item.key)) const eventsByDate = new Map() @@ -109,7 +122,7 @@ const applyDismissedRecurring = (value) => { const setRawForecast = (value) => { rawForecast.value = value - forecast.value = applyDismissedRecurring(value) + forecast.value = applyForecastAdjustments(value) } const loadForecastFromCache = () => { @@ -170,7 +183,7 @@ const dismissRecurringKey = async (key) => { if (!key) return storeDismissedRecurringKeys([...dismissedRecurringKeys.value, key]) - forecast.value = applyDismissedRecurring(rawForecast.value) + forecast.value = applyForecastAdjustments(rawForecast.value) toast.add({ title: "Bankbewegung abgeschlossen", description: "Das erkannte Muster wird aus der Liquiditätsprognose entfernt.", @@ -180,7 +193,7 @@ const dismissRecurringKey = async (key) => { const restoreDismissedRecurring = () => { storeDismissedRecurringKeys([]) - forecast.value = applyDismissedRecurring(rawForecast.value) + forecast.value = applyForecastAdjustments(rawForecast.value) toast.add({ title: "Bankbewegungen wiederhergestellt", description: "Ausgeblendete Muster werden wieder in der Prognose berücksichtigt.", @@ -248,6 +261,7 @@ const groupedEventSummary = computed(() => { open_createddocument: { label: sourceLabels.open_createddocument, amount: 0, count: 0 }, open_incominginvoice: { label: sourceLabels.open_incominginvoice, amount: 0, count: 0 }, recurring_bankstatement: { label: sourceLabels.recurring_bankstatement, amount: 0, count: 0 }, + draft_createddocument: { label: "Rechnungsentwürfe als Rechnungen", amount: 0, count: 0 }, tax_settlement: { label: sourceLabels.tax_settlement, amount: 0, count: 0 } } @@ -275,6 +289,8 @@ const topExpenseDrivers = computed(() => { }) const draftIncomeDrivers = computed(() => { + if (includeDraftsAsInvoices.value) return [] + return [...(forecast.value?.draftEvents || [])] .sort((a, b) => Number(b.amount || 0) - Number(a.amount || 0)) .slice(0, 12) @@ -323,7 +339,11 @@ const riskTone = computed(() => { }) watch(dismissedRecurringKeys, () => { - forecast.value = applyDismissedRecurring(rawForecast.value) + forecast.value = applyForecastAdjustments(rawForecast.value) +}) + +watch(includeDraftsAsInvoices, () => { + forecast.value = applyForecastAdjustments(rawForecast.value) }) onMounted(() => { @@ -342,6 +362,11 @@ onMounted(() => {
+
+ + Entwürfe wie Rechnungen verwenden +
+ { Geplante Einzahlungen + {{ useCurrency(forecast.totalIncome) }}
-
+
+ Davon aus Entwürfen + + {{ useCurrency(rawForecast?.draftIncome || 0) }} +
+
Rechnungsentwürfe optional (+ {{ useCurrency(forecast.draftIncome) }})