PRCUST_SET_JSON_INVOICE_DATA: Komplette Überarbeitung durch copilot

This commit is contained in:
2026-02-26 11:45:14 +01:00
parent b5166e6783
commit 2802cc20b0

View File

@@ -1,49 +1,95 @@
CREATE OR ALTER PROCEDURE PRCUST_SET_JSON_INVOICE_DATA SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- [PRCUST_SET_JSON_INVOICE_DATA]
-- =================================================================
-- Imports invoice JSON payload into relational tables and returns
-- normalized JSON response for all imported documents.
--
-- Returns: RESULTSET; success/message/data
-- =================================================================
-- Copyright (c) 2026 by Digital Data GmbH
--
-- Digital Data GmbH • Ludwig-Rinn-Strasse 16 • D-35452 Heuchelheim
-- Tel.: 0641/202360 • E-Mail: info-flow@digitaldata.works
-- =================================================================
-- Creation Date / Author: 26.02.2026 / MK
-- Version Date / Editor: 26.02.2026 / MK
-- Version Number: 1.0.0.0
-- =================================================================
-- History:
-- 26.02.2026 / MK - Initial version based on JSON invoice import
-- 26.02.2026 / MK - Style harmonized to PRDEX convention
CREATE OR ALTER PROCEDURE [dbo].[PRCUST_SET_JSON_INVOICE_DATA](
@json NVARCHAR(MAX) @json NVARCHAR(MAX)
)
AS AS
BEGIN BEGIN TRY
SET NOCOUNT ON; SET NOCOUNT ON;
SET XACT_ABORT ON;
PRINT 'Starte Verarbeitung von JSON-Daten...'; -- declare runtime vars
DECLARE @MY_PROCEDURE_NAME NVARCHAR(128) = OBJECT_NAME(@@PROCID),
@RETURN_STATUS INT = 0,
@RETURN_STATUS_TEXT NVARCHAR(MAX) = CONCAT('START PROCEDURE [',OBJECT_NAME(@@PROCID),'] @ ',CONVERT(VARCHAR(50),GETDATE(),120)),
@RETURN_ERROR_TEXT NVARCHAR(MAX) = N'';
DECLARE @doc NVARCHAR(MAX),
@line NVARCHAR(MAX),
@DocumentID INT,
@LineID INT,
@output NVARCHAR(MAX);
DECLARE @docs TABLE (doc NVARCHAR(MAX));
DECLARE @lines TABLE (line NVARCHAR(MAX));
DECLARE @InsertedDocuments TABLE (DocumentID INT PRIMARY KEY);
PRINT '====================================================================================================';
PRINT @RETURN_STATUS_TEXT;
PRINT '';
--==============================================-- Validate JSON payload --==============================================--
IF dbo.FN_VALIDATE_JSON_INVOICE_DATA(@json) = 0 BEGIN
SET @RETURN_STATUS = 40001;
SET @RETURN_STATUS_TEXT = N'JSON validation failed.';
SET @RETURN_ERROR_TEXT = N'Ungültige JSON-Struktur.';
PRINT 'ERROR: ' + @RETURN_ERROR_TEXT;
---------------------------------------------------------
-- JSON VALIDIEREN
---------------------------------------------------------
IF dbo.FN_VALIDATE_JSON_INVOICE_DATA(@json) = 0
BEGIN
PRINT 'JSON-Validierung fehlgeschlagen.';
SELECT SELECT
success = 0 success = 0
, message = 'Ungültige JSON-Struktur.' , message = @RETURN_ERROR_TEXT
, data = NULL; , data = NULL;
RETURN; RETURN;
END END;
-----------------------------------------------------------------------------------------------------------------------------------
PRINT 'JSON-Validierung erfolgreich.'; PRINT 'INFO: JSON-Validierung erfolgreich.';
BEGIN TRY BEGIN TRANSACTION;
DECLARE @docs TABLE (doc NVARCHAR(MAX));
DECLARE @doc NVARCHAR(MAX);
DECLARE @DocumentID INT;
PRINT 'Extrahiere purchaseDocuments...';
--===========================================-- Extract purchaseDocuments array --===========================================--
INSERT INTO @docs(doc) INSERT INTO @docs(doc)
SELECT value SELECT [value]
FROM OPENJSON(@json, '$.purchaseDocuments'); FROM OPENJSON(@json, '$.purchaseDocuments');
-----------------------------------------------------------------------------------------------------------------------------------
DECLARE doc_cursor CURSOR FOR SELECT doc FROM @docs; DECLARE doc_cursor CURSOR LOCAL FAST_FORWARD FOR SELECT doc FROM @docs;
OPEN doc_cursor; OPEN doc_cursor;
FETCH NEXT FROM doc_cursor INTO @doc; FETCH NEXT FROM doc_cursor INTO @doc;
WHILE @@FETCH_STATUS = 0 WHILE @@FETCH_STATUS = 0 BEGIN
BEGIN
PRINT 'Füge PurchaseDocument ein...';
--------------------------------------------------------- PRINT 'INFO: Füge PurchaseDocument ein...';
-- PurchaseDocument einfügen (zeilenweise)
--------------------------------------------------------- --=============================================-- Insert PurchaseDocument row --=============================================--
INSERT INTO PurchaseDocument ( INSERT INTO dbo.PurchaseDocument (
DocumentType DocumentType
, No_ , No_
, NoSeries , NoSeries
@@ -134,33 +180,29 @@ BEGIN
, PhrRMAmountLessDiscount DECIMAL(18,2) , PhrRMAmountLessDiscount DECIMAL(18,2)
, purchaseLines NVARCHAR(MAX) AS JSON , purchaseLines NVARCHAR(MAX) AS JSON
); );
-----------------------------------------------------------------------------------------------------------------------------------
SET @DocumentID = SCOPE_IDENTITY(); SET @DocumentID = SCOPE_IDENTITY();
INSERT INTO @InsertedDocuments (DocumentID) VALUES (@DocumentID);
PRINT 'PurchaseDocument eingefügt. DocumentID = ' + CAST(@DocumentID AS NVARCHAR(20)); PRINT 'INFO: PurchaseDocument eingefügt. DocumentID = ' + CAST(@DocumentID AS NVARCHAR(20));
--------------------------------------------------------- --=============================================-- Extract purchaseLines array --==============================================--
-- purchaseLines extrahieren DELETE FROM @lines;
---------------------------------------------------------
PRINT 'Extrahiere purchaseLines...';
DECLARE @lines TABLE (line NVARCHAR(MAX));
INSERT INTO @lines(line) INSERT INTO @lines(line)
SELECT value SELECT [value]
FROM OPENJSON(@doc, '$.purchaseLines'); FROM OPENJSON(@doc, '$.purchaseLines');
-----------------------------------------------------------------------------------------------------------------------------------
DECLARE @line NVARCHAR(MAX); DECLARE line_cursor CURSOR LOCAL FAST_FORWARD FOR SELECT line FROM @lines;
DECLARE @LineID INT;
DECLARE line_cursor CURSOR FOR SELECT line FROM @lines;
OPEN line_cursor; OPEN line_cursor;
FETCH NEXT FROM line_cursor INTO @line; FETCH NEXT FROM line_cursor INTO @line;
WHILE @@FETCH_STATUS = 0 WHILE @@FETCH_STATUS = 0 BEGIN
BEGIN
PRINT 'Füge PurchaseLine ein...';
INSERT INTO PurchaseLine ( PRINT 'INFO: Füge PurchaseLine ein...';
INSERT INTO dbo.PurchaseLine (
DocumentID DocumentID
, AttachedToLineNo , AttachedToLineNo
, Type , Type
@@ -247,35 +289,20 @@ BEGIN
); );
SET @LineID = SCOPE_IDENTITY(); SET @LineID = SCOPE_IDENTITY();
PRINT 'INFO: PurchaseLine eingefügt. LineID = ' + CAST(@LineID AS NVARCHAR(20));
PRINT 'PurchaseLine eingefügt. LineID = ' + CAST(@LineID AS NVARCHAR(20)); --===============================================-- Insert dimSetEntries --===============================================--
INSERT INTO dbo.DimSetEntry (LineID, DimensionCode, DimensionValueCode)
--------------------------------------------------------- SELECT @LineID, DimensionCode, DimensionValueCode
-- dimSetEntries
---------------------------------------------------------
PRINT 'Füge dimSetEntries ein...';
INSERT INTO DimSetEntry (
LineID
, DimensionCode
, DimensionValueCode
)
SELECT
@LineID
, DimensionCode
, DimensionValueCode
FROM OPENJSON(@line, '$.dimSetEntries') FROM OPENJSON(@line, '$.dimSetEntries')
WITH ( WITH (
DimensionCode NVARCHAR(50) DimensionCode NVARCHAR(50)
, DimensionValueCode NVARCHAR(50) , DimensionValueCode NVARCHAR(50)
); );
-----------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------- --=========================================-- Insert itemChargeAssignmentLines --==========================================--
-- itemChargeAssignmentLines INSERT INTO dbo.ItemChargeAssignment (
---------------------------------------------------------
PRINT 'Füge itemChargeAssignmentLines ein...';
INSERT INTO ItemChargeAssignment (
LineID LineID
, ItemChargeNo , ItemChargeNo
, UnitCost , UnitCost
@@ -316,81 +343,175 @@ BEGIN
, AmountToAssign DECIMAL(18,4) , AmountToAssign DECIMAL(18,4)
, AppliesToDocLineAmount DECIMAL(18,4) , AppliesToDocLineAmount DECIMAL(18,4)
); );
-----------------------------------------------------------------------------------------------------------------------------------
FETCH NEXT FROM line_cursor INTO @line; FETCH NEXT FROM line_cursor INTO @line;
END END;
CLOSE line_cursor; CLOSE line_cursor;
DEALLOCATE line_cursor; DEALLOCATE line_cursor;
FETCH NEXT FROM doc_cursor INTO @doc; FETCH NEXT FROM doc_cursor INTO @doc;
END END;
CLOSE doc_cursor; CLOSE doc_cursor;
DEALLOCATE doc_cursor; DEALLOCATE doc_cursor;
PRINT 'Erzeuge JSON-Ausgabe...'; PRINT 'INFO: Erzeuge JSON-Ausgabe...';
---------------------------------------------------------
-- JSON-Ausgabe exakt wie Upload-Datei
---------------------------------------------------------
DECLARE @output NVARCHAR(MAX);
--===============================================-- Build output JSON result --===============================================--
SELECT @output = SELECT @output =
( (
SELECT SELECT
JSON_QUERY(
COALESCE(
( (
SELECT SELECT
pd.DocumentType
, [No] = pd.No_
, pd.NoSeries
, pd.ProcessIDTransfer
, pd.BuyFromVendorNo
, pd.PayToVendorNo
, pd.PostingDate
, pd.PaymentTermsCode
, pd.PaymentTermsCodeIR
, pd.DueDate
, pd.PmtDiscountDate
, pd.PaymentDiscount
, pd.CurrencyCode
, pd.InvoiceDiscCode
, pd.PostingDescription
, pd.PaymentMethodCode
, pd.VendorInvoiceNo
, pd.VendorCrMemoNo
, pd.PhrVendorBankAccountCode
, pd.PhrBankBranchNo
, pd.PhrBankAccountNo
, pd.PhrIBAN
, pd.PhrSWIFTCode
, pd.PhrBankName
, pd.PhrBankAccountEntryPriority
, pd.PhrRMCashDiscountReceived
, pd.PhrRMAmountIncludingVAT
, pd.PhrRMAmountLessDiscount
, purchaseLines = JSON_QUERY(
COALESCE(
( (
SELECT SELECT
pd.* pl.AttachedToLineNo
, ( , pl.Type
, [No] = pl.No_
, pl.Description
, pl.Description2
, pl.LocationCode
, pl.VariantCode
, pl.Quantity
, pl.UnitOfMeasureCode
, pl.DirectUnitCost
, pl.LineDiscount
, pl.AbleToDiscount
, pl.DiscountCalculated
, pl.WorkOrderNo
, pl.GenBusPostingGroup
, pl.GenProdPostingGroup
, pl.VatBusPostingGroup
, pl.VatProdPostingGroup
, pl.ApplToItemEntry
, pl.PostingWithoutApply
, pl.AnticipatedPayment
, pl.ReceiptNo
, pl.ReceiptLineNo
, pl.IrOrderNo
, pl.IrOrderLineNo
, dimSetEntries = JSON_QUERY(
COALESCE(
(
SELECT SELECT
pl.* d.DimensionCode
, ( , d.DimensionValueCode
SELECT * FROM dbo.DimSetEntry d
FROM DimSetEntry d
WHERE d.LineID = pl.LineID WHERE d.LineID = pl.LineID
FOR JSON PATH FOR JSON PATH
) AS dimSetEntries )
, ( , '[]'
SELECT * )
FROM ItemChargeAssignment ia )
, itemChargeAssignmentLines = JSON_QUERY(
COALESCE(
(
SELECT
ia.ItemChargeNo
, ia.UnitCost
, ia.AppliesToDocType
, ia.AppliesToDocNo
, ia.AppliesToDocLineNo
, ia.ItemNo
, ia.Description
, ia.QtyToAssign
, ia.QtyAssigned
, ia.AmountToAssign
, ia.AppliesToDocLineAmount
FROM dbo.ItemChargeAssignment ia
WHERE ia.LineID = pl.LineID WHERE ia.LineID = pl.LineID
FOR JSON PATH FOR JSON PATH
) AS itemChargeAssignmentLines )
FROM PurchaseLine pl , '[]'
)
)
FROM dbo.PurchaseLine pl
WHERE pl.DocumentID = pd.DocumentID WHERE pl.DocumentID = pd.DocumentID
FOR JSON PATH FOR JSON PATH
) AS purchaseLines )
FROM PurchaseDocument pd , '[]'
WHERE pd.DocumentID = @DocumentID )
FOR JSON PATH )
) AS purchaseDocuments FROM dbo.PurchaseDocument pd
INNER JOIN @InsertedDocuments id ON id.DocumentID = pd.DocumentID
ORDER BY pd.DocumentID
FOR JSON PATH FOR JSON PATH
) )
, '[]'
)
) AS purchaseDocuments
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
); );
-----------------------------------------------------------------------------------------------------------------------------------
PRINT 'JSON-Ausgabe erstellt.'; COMMIT TRANSACTION;
SET @RETURN_STATUS = 0;
SET @RETURN_STATUS_TEXT = CONCAT('END PROCEDURE [',@MY_PROCEDURE_NAME,'] @ ',CONVERT(NVARCHAR(50),GETDATE(),120));
PRINT '';
PRINT @RETURN_STATUS_TEXT;
PRINT '====================================================================================================';
---------------------------------------------------------
-- Erfolgsmeldung + strukturierte JSON-Ausgabe
---------------------------------------------------------
SELECT SELECT
success = 1 success = 1
, message = 'Daten erfolgreich verarbeitet.' , message = N'Daten erfolgreich verarbeitet.'
, data = @output; , data = @output;
PRINT 'Verarbeitung erfolgreich abgeschlossen.'; END TRY BEGIN CATCH
END TRY --====================================================-- exception / error --====================================================--
BEGIN CATCH IF (@@TRANCOUNT > 0) BEGIN
PRINT 'FEHLER: ' + ERROR_MESSAGE(); ROLLBACK TRANSACTION;
END;
SET @RETURN_STATUS = 50000;
SET @RETURN_STATUS_TEXT = CONCAT('END PROCEDURE [',OBJECT_NAME(@@PROCID),'] @ ',CONVERT(NVARCHAR(50),GETDATE(),120));
SET @RETURN_ERROR_TEXT = CONCAT('ERROR MESSAGE: ',CONVERT(NVARCHAR(500),ERROR_MESSAGE()));
PRINT 'ERROR IN PROCEDURE: [' + OBJECT_NAME(@@PROCID) + ']' + CHAR(13) + @RETURN_ERROR_TEXT;
PRINT @RETURN_STATUS_TEXT;
PRINT '====================================================================================================';
-----------------------------------------------------------------------------------------------------------------------------------
SELECT SELECT
success = 0 success = 0
, message = ERROR_MESSAGE() , message = ERROR_MESSAGE()
, data = NULL; , data = NULL;
END CATCH
END END CATCH;
GO GO