Skonto wird an der Bankzuordnung gespeichert und gleicht den Beleg zusammen mit der Zahlung aus. Der Betrag wird anteilig nach Steuersätzen auf die Skontokonten verteilt (Standard SKR03, je Mandant einstellbar), im DATEV-Export als eigene Buchung je Steuersatz ausgegeben und in der USt-Auswertung im Zeitraum der Zahlung berücksichtigt. Schlussrechnungen verteilen den Skonto auf die Restforderung nach Abzug der Abschläge. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
46 lines
2.1 KiB
TypeScript
46 lines
2.1 KiB
TypeScript
import { getCashDiscountTaxBreakdown } from "./cashDiscount"
|
|
|
|
export const BANK_ALLOCATION_TAX_ITEMS = [
|
|
{ value: "9", label: "19 % Vorsteuer", rate: 19, kind: "input" },
|
|
{ value: "8", label: "7 % Vorsteuer", rate: 7, kind: "input" },
|
|
{ value: "3", label: "19 % Umsatzsteuer", rate: 19, kind: "output" },
|
|
{ value: "2", label: "7 % Umsatzsteuer", rate: 7, kind: "output" },
|
|
{ value: "40", label: "Ohne Umsatzsteuer", rate: 0, kind: "none" },
|
|
]
|
|
|
|
export const isDirectBankAllocation = (allocation: any) => Boolean(
|
|
allocation?.bankstatement && (allocation.account || allocation.ownaccount)
|
|
&& !allocation.createddocument && !allocation.incominginvoice
|
|
&& !allocation.customer && !allocation.vendor && !allocation.archived
|
|
)
|
|
|
|
// The signed bank amount always remains gross. Refunds retain their sign.
|
|
export function getBankAllocationAmounts(allocation: any) {
|
|
const amountGross = Number(allocation?.amount || 0)
|
|
const tax = isDirectBankAllocation(allocation)
|
|
? BANK_ALLOCATION_TAX_ITEMS.find(item => item.value === String(allocation.datevTaxKey))
|
|
: undefined
|
|
const rate = tax?.rate || 0
|
|
const amountNet = Number((amountGross / (1 + rate / 100)).toFixed(2))
|
|
const amountTax = Number((amountGross - amountNet).toFixed(2))
|
|
return { amountGross, amountNet, amountTax, rate, kind: tax?.kind || "none" }
|
|
}
|
|
|
|
export function getBankAllocationTaxBreakdown(allocation: any) {
|
|
// Skonto auf zugeordnete Belege korrigiert die Steuer im Zeitraum der Zahlung.
|
|
const { output, input } = getCashDiscountTaxBreakdown(allocation)
|
|
if (!isDirectBankAllocation(allocation)) return { output, input }
|
|
const { amountNet, amountTax, rate, kind } = getBankAllocationAmounts(allocation)
|
|
if (kind === "none") return { output, input }
|
|
const target = kind === "input" ? input : output
|
|
const sign = kind === "input" ? -1 : 1
|
|
if (rate === 19) {
|
|
target.net19 += amountNet * sign
|
|
target.tax19 += amountTax * sign
|
|
} else if (rate === 7) {
|
|
target.net7 += amountNet * sign
|
|
target.tax7 += amountTax * sign
|
|
}
|
|
return { output, input }
|
|
}
|