KI-AGENT: MCP-Belegpositionen für Angebote normalisieren
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user