feat(accounting): edit finalized document cost centres

This commit is contained in:
2026-09-09 14:37:22 +02:00
parent 2ec162c0e7
commit ebbd1e0cd0
5 changed files with 301 additions and 2 deletions

View File

@@ -18,6 +18,7 @@ import { useNextNumberRangeNumber } from "../../utils/functions"
import { saveFile } from "../../utils/files"
import { insertHistoryItem } from "../../utils/history"
import { executeManualGeneration, finishManualGeneration } from "../../modules/serialexecution.service"
import { updateOutgoingDocumentCostCentres } from "../../modules/outgoing-document-cost-centres.service"
import {
prepareStatementAllocationInput,
statementAllocationUuidArg,
@@ -633,6 +634,72 @@ export const accountingTools: McpTool[] = [
return { document: updated }
},
},
{
name: "accounting.outgoing_documents.cost_centres.update",
title: "Kostenstellen eines Ausgangsbelegs ändern",
description: "Ändert ausschließlich die Beleg- und Positionskostenstellen eines bereits fertiggestellten Ausgangsbelegs.",
requiredPermissions: ["accounting.outgoing_documents.write"],
inputSchema: {
type: "object",
required: ["id"],
anyOf: [
{ required: ["costcentre"] },
{ required: ["rowCostCentres"] },
],
properties: {
id: { type: "number" },
costcentre: { type: ["string", "null"], description: "UUID der Beleg-Kostenstelle oder null." },
rowCostCentres: {
type: "array",
items: {
type: "object",
required: ["rowId", "costcentre"],
properties: {
rowId: { type: "string", description: "ID der Belegposition." },
costcentre: { type: ["string", "null"], description: "UUID der Positionskostenstelle oder null." },
},
},
},
},
},
async handler(context, args) {
const id = numberArg(args, "id")
if (!id) throw new Error("id ist erforderlich")
const input: {
costcentre?: string | null
rowCostCentres?: Array<{ rowId: string, costcentre: string | null }>
} = {}
if (Object.prototype.hasOwnProperty.call(args, "costcentre")) {
const costcentre = args.costcentre
if (costcentre !== null && (typeof costcentre !== "string" || !UUID_PATTERN.test(costcentre))) {
throw new Error("costcentre muss eine gültige UUID oder null sein")
}
input.costcentre = costcentre as string | null
}
if (args.rowCostCentres !== undefined) {
if (!Array.isArray(args.rowCostCentres)) throw new Error("rowCostCentres muss ein Array sein")
input.rowCostCentres = args.rowCostCentres.map((assignment: any) => {
const rowId = typeof assignment?.rowId === "string" ? assignment.rowId.trim() : ""
const costcentre = assignment?.costcentre
if (!rowId) throw new Error("Jede Positionszuordnung benötigt eine rowId")
if (costcentre !== null && (typeof costcentre !== "string" || !UUID_PATTERN.test(costcentre))) {
throw new Error(`Ungültige Kostenstelle für Position ${rowId}`)
}
return { rowId, costcentre }
})
}
const document = await updateOutgoingDocumentCostCentres(
context.server,
context.tenantId,
context.userId,
id,
input,
)
return { document }
},
},
{
name: "accounting.outgoing_documents.finalize",
title: "Ausgangsbeleg finalisieren",