KI-AGENT: MCP-Belegpositionen für Angebote normalisieren

This commit is contained in:
2026-05-15 17:11:31 +02:00
parent cb939f2197
commit 683d073b6e
2 changed files with 85 additions and 9 deletions

View File

@@ -1,4 +1,5 @@
import { and, desc, eq, ilike, or } from "drizzle-orm"
import { randomUUID } from "node:crypto"
import {
accounts,
bankstatements,
@@ -102,7 +103,7 @@ const applyOutgoingDocumentTaxType = (
const rows = Array.isArray(payload.rows)
? payload.rows
: Array.isArray(existingRows)
? existingRows
? normalizeOutgoingDocumentRows(existingRows)
: null
if (!rows) return
@@ -124,6 +125,44 @@ const optionalArrayArg = (args: Record<string, unknown>, key: string) => {
return Array.isArray(value) ? value : null
}
const normalizeOutgoingDocumentRow = (row: unknown, index: number) => {
let normalizedRow = row
if (typeof normalizedRow === "string") {
try {
normalizedRow = JSON.parse(normalizedRow)
} catch {
throw new Error(`Position ${index + 1} ist kein gültiges JSON-Objekt`)
}
}
if (!normalizedRow || typeof normalizedRow !== "object" || Array.isArray(normalizedRow)) {
throw new Error(`Position ${index + 1} muss ein Objekt sein`)
}
const rowPayload = { ...(normalizedRow as Record<string, any>) }
rowPayload.id = rowPayload.id || randomUUID()
rowPayload.pos = rowPayload.pos || String(index + 1)
rowPayload.mode = rowPayload.mode || "free"
rowPayload.inputPrice = hasValidNumber(rowPayload.inputPrice)
? Number(rowPayload.inputPrice)
: hasValidNumber(rowPayload.price)
? Number(rowPayload.price)
: 0
rowPayload.price = hasValidNumber(rowPayload.price) ? Number(rowPayload.price) : rowPayload.inputPrice
rowPayload.quantity = hasValidNumber(rowPayload.quantity) ? Number(rowPayload.quantity) : 1
rowPayload.discountPercent = hasValidNumber(rowPayload.discountPercent) ? Number(rowPayload.discountPercent) : 0
rowPayload.linkedEntitys = Array.isArray(rowPayload.linkedEntitys) ? rowPayload.linkedEntitys : []
return rowPayload
}
const normalizeOutgoingDocumentRows = (rows: unknown) => {
if (!Array.isArray(rows)) return []
return rows.map((row, index) => normalizeOutgoingDocumentRow(row, index))
}
const buildOutgoingDocumentPayload = (
args: Record<string, unknown>,
userId: string,
@@ -142,7 +181,7 @@ const buildOutgoingDocumentPayload = (
payload.archived = false
payload.state = stringArg(args, "state") || "Entwurf"
payload.type = documentTypeArg(args)
payload.rows = optionalArrayArg(args, "rows") || []
payload.rows = normalizeOutgoingDocumentRows(optionalArrayArg(args, "rows") || [])
}
const stringFields = [
@@ -176,7 +215,7 @@ const buildOutgoingDocumentPayload = (
if (args.agriculture !== undefined) payload.agriculture = optionalObjectArg(args, "agriculture")
if (args.report !== undefined) payload.report = optionalObjectArg(args, "report") || {}
if (args.serialConfig !== undefined) payload.serialConfig = optionalObjectArg(args, "serialConfig") || {}
if (args.rows !== undefined) payload.rows = optionalArrayArg(args, "rows") || []
if (args.rows !== undefined) payload.rows = normalizeOutgoingDocumentRows(optionalArrayArg(args, "rows") || [])
if (args.usedAdvanceInvoices !== undefined) payload.usedAdvanceInvoices = optionalArrayArg(args, "usedAdvanceInvoices") || []
if (typeof args.availableInPortal === "boolean") payload.availableInPortal = args.availableInPortal
if (typeof args.advanceInvoiceResolved === "boolean") payload.advanceInvoiceResolved = args.advanceInvoiceResolved