feat(accounting): Skontobedingungen auf Belegen und automatische Skonto-Vorschläge
Ausgangs- und Eingangsbelege erhalten Skontosatz und Frist, mit Vorgaben bei Kunden und Lieferanten. Das PDF ergänzt automatisch einen Skontohinweis (oder nutzt neue Textvorlagen-Variablen); bei Schlussrechnungen gilt der Skonto für die Restforderung. Skontobedingungen werden aus E-Rechnungen (#SKONTO# und ZUGFeRD) sowie von der KI-Vorbereitung übernommen. Die Bankzuordnung erkennt Zahlungen abzüglich Skonto innerhalb der Frist und bietet sie in der Vorschlagsübersicht direkt an. BWA-Erlöse und -Aufwand berücksichtigen gebuchten Skonto im Zeitraum der Zahlung. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -36,7 +36,7 @@ import { withImages } from "../result"
|
||||
import { renderOutgoingDocumentPdf } from "../../modules/outgoing-document-pdf.service"
|
||||
import { renderPdfPagesAsPng } from "../../utils/pdfPreview"
|
||||
import { outgoingStatusTools } from "./outgoingStatus"
|
||||
import { prepareCashDiscountAllocation } from "../../modules/cash-discount"
|
||||
import { normalizeCashDiscountDays, normalizeCashDiscountPercent, prepareCashDiscountAllocation } from "../../modules/cash-discount"
|
||||
|
||||
export { prepareStatementAllocationInput } from "../statementAllocations"
|
||||
|
||||
@@ -247,6 +247,8 @@ const buildOutgoingDocumentPayload = (
|
||||
for (const field of ["paymentDays"] as const) {
|
||||
if (args[field] !== undefined) payload[field] = numberArg(args, field)
|
||||
}
|
||||
if (args.cashDiscountPercent !== undefined) payload.cashDiscountPercent = normalizeCashDiscountPercent(args.cashDiscountPercent)
|
||||
if (args.cashDiscountDays !== undefined) payload.cashDiscountDays = normalizeCashDiscountDays(args.cashDiscountDays)
|
||||
|
||||
if (args.type !== undefined) payload.type = documentTypeArg(args)
|
||||
if (args.address !== undefined) payload.address = optionalObjectArg(args, "address")
|
||||
@@ -432,6 +434,8 @@ const buildIncomingInvoicePayload = (
|
||||
for (const field of ["state", "reference", "date", "dueDate", "description", "paymentType"] as const) {
|
||||
if (args[field] !== undefined) payload[field] = stringArg(args, field)
|
||||
}
|
||||
if (args.cashDiscountPercent !== undefined) payload.cashDiscountPercent = normalizeCashDiscountPercent(args.cashDiscountPercent)
|
||||
if (args.cashDiscountDueDate !== undefined) payload.cashDiscountDueDate = stringArg(args, "cashDiscountDueDate")
|
||||
if (args.vendor !== undefined) payload.vendor = numberArg(args, "vendor")
|
||||
if (args.document !== undefined) payload.document = numberArg(args, "document")
|
||||
if (args.expense !== undefined) payload.expense = args.expense === true
|
||||
@@ -635,6 +639,8 @@ export const accountingTools: McpTool[] = [
|
||||
deliveryDateEnd: { type: "string" },
|
||||
deliveryDateType: { type: "string" },
|
||||
paymentDays: { type: "number" },
|
||||
cashDiscountPercent: { type: ["number", "null"], description: "Skontosatz in Prozent (0 bis 10). Wird im PDF als Skontohinweis ausgegeben." },
|
||||
cashDiscountDays: { type: ["number", "null"], description: "Skontofrist in Tagen ab Belegdatum." },
|
||||
payment_type: { type: "string" },
|
||||
taxType: {
|
||||
type: "string",
|
||||
@@ -692,6 +698,8 @@ export const accountingTools: McpTool[] = [
|
||||
deliveryDateEnd: { type: "string" },
|
||||
deliveryDateType: { type: "string" },
|
||||
paymentDays: { type: "number" },
|
||||
cashDiscountPercent: { type: ["number", "null"], description: "Skontosatz in Prozent (0 bis 10). Wird im PDF als Skontohinweis ausgegeben." },
|
||||
cashDiscountDays: { type: ["number", "null"], description: "Skontofrist in Tagen ab Belegdatum." },
|
||||
payment_type: { type: "string" },
|
||||
taxType: {
|
||||
type: "string",
|
||||
@@ -882,6 +890,8 @@ export const accountingTools: McpTool[] = [
|
||||
deliveryDate: { type: "string" },
|
||||
deliveryDateEnd: { type: "string" },
|
||||
paymentDays: { type: "number" },
|
||||
cashDiscountPercent: { type: ["number", "null"], description: "Skontosatz in Prozent (0 bis 10). Wird im PDF als Skontohinweis ausgegeben." },
|
||||
cashDiscountDays: { type: ["number", "null"], description: "Skontofrist in Tagen ab Belegdatum." },
|
||||
payment_type: { type: "string" },
|
||||
taxType: {
|
||||
type: "string",
|
||||
@@ -1201,6 +1211,8 @@ export const accountingTools: McpTool[] = [
|
||||
reference: { type: "string" },
|
||||
date: { type: "string" },
|
||||
dueDate: { type: "string" },
|
||||
cashDiscountPercent: { type: ["number", "null"] },
|
||||
cashDiscountDueDate: { type: ["string", "null"] },
|
||||
document: { type: "number" },
|
||||
description: { type: "string" },
|
||||
paymentType: { type: "string" },
|
||||
@@ -1318,6 +1330,8 @@ export const accountingTools: McpTool[] = [
|
||||
reference: { type: "string" },
|
||||
date: { type: "string" },
|
||||
dueDate: { type: "string" },
|
||||
cashDiscountPercent: { type: ["number", "null"], description: "Skontosatz in Prozent laut Rechnung." },
|
||||
cashDiscountDueDate: { type: ["string", "null"], description: "Letzter Tag der Skontofrist (YYYY-MM-DD)." },
|
||||
document: { type: "number" },
|
||||
description: { type: "string" },
|
||||
paymentType: { type: "string" },
|
||||
@@ -1351,6 +1365,8 @@ export const accountingTools: McpTool[] = [
|
||||
reference: { type: "string" },
|
||||
date: { type: "string" },
|
||||
dueDate: { type: "string" },
|
||||
cashDiscountPercent: { type: ["number", "null"], description: "Skontosatz in Prozent laut Rechnung." },
|
||||
cashDiscountDueDate: { type: ["string", "null"], description: "Letzter Tag der Skontofrist (YYYY-MM-DD)." },
|
||||
document: { type: "number" },
|
||||
description: { type: "string" },
|
||||
paymentType: { type: "string" },
|
||||
|
||||
@@ -46,14 +46,14 @@ export const masterdataWriteConfigs: Config[] = [
|
||||
makeConfig({
|
||||
resource: "customers", namespace: "customers", label: "Kunde", resultKey: "customer", table: tables.customers,
|
||||
required: ["name"], numberField: "customerNumber",
|
||||
fieldNames: "name customerNumber infoData active notes type isCompany profiles customPaymentDays firstname lastname customSurchargePercentage salutation title nameAddition availableInPortal customPaymentType customTaxType memberrelation",
|
||||
fieldNames: "name customerNumber infoData active notes type isCompany profiles customPaymentDays firstname lastname customSurchargePercentage salutation title nameAddition availableInPortal customPaymentType customTaxType memberrelation customCashDiscountPercent customCashDiscountDays",
|
||||
overrides: { customerNumber: textField(true), infoData: infoDataField, profiles: profilesField, memberrelation: idField },
|
||||
references: [commonProfiles, bankAccounts, { field: "memberrelation", table: tables.memberrelations }],
|
||||
}),
|
||||
makeConfig({
|
||||
resource: "vendors", namespace: "vendors", label: "Lieferant", resultKey: "vendor", table: tables.vendors,
|
||||
required: ["name"], numberField: "vendorNumber",
|
||||
fieldNames: "name vendorNumber infoData notes hasSEPA profiles defaultPaymentMethod",
|
||||
fieldNames: "name vendorNumber infoData notes hasSEPA profiles defaultPaymentMethod cashDiscountPercent cashDiscountDays",
|
||||
overrides: { vendorNumber: textField(true), infoData: infoDataField, profiles: profilesField },
|
||||
references: [commonProfiles, bankAccounts],
|
||||
}),
|
||||
|
||||
Reference in New Issue
Block a user