PRCUST_SET_JSON_INVOICE_DATA: Work in progress

This commit is contained in:
2026-02-26 13:57:46 +01:00
parent 2802cc20b0
commit 2868286356

View File

@@ -17,11 +17,20 @@ GO
-- ================================================================= -- =================================================================
-- Creation Date / Author: 26.02.2026 / MK -- Creation Date / Author: 26.02.2026 / MK
-- Version Date / Editor: 26.02.2026 / MK -- Version Date / Editor: 26.02.2026 / MK
-- Version Number: 1.0.0.0 -- Version Number: 1.2.0.0
-- ================================================================= -- =================================================================
-- History: -- History:
-- 26.02.2026 / MK - Initial version based on JSON invoice import -- 26.02.2026 / MK - Initial version based on JSON invoice import
-- 26.02.2026 / MK - Style harmonized to PRDEX convention -- 26.02.2026 / MK - Style harmonized to PRDEX convention
-- 26.02.2026 / MK - #3 CAST(NULL AS NVARCHAR(MAX)) for consistent data type
-- 26.02.2026 / MK - #4 RETURN @RETURN_STATUS for proper return codes
-- 26.02.2026 / MK - #5 Defensive cursor cleanup in CATCH block
-- 26.02.2026 / MK - #7 Reject empty purchaseDocuments array
-- 26.02.2026 / MK - #12 Extended error diagnostics in CATCH
-- 26.02.2026 / MK - #16 success column as BIT
-- 26.02.2026 / MK - PaymentDiscountIR-Feld hinzugefügt (Request-Abgleich)
-- 26.02.2026 / MK - JSON-Ausgabe: alle Feldnamen auf camelCase umgestellt
-- 26.02.2026 / MK - OPENJSON WITH: explizite camelCase JSON-Pfade für Input-Parsing
CREATE OR ALTER PROCEDURE [dbo].[PRCUST_SET_JSON_INVOICE_DATA]( CREATE OR ALTER PROCEDURE [dbo].[PRCUST_SET_JSON_INVOICE_DATA](
@json NVARCHAR(MAX) @json NVARCHAR(MAX)
@@ -62,11 +71,11 @@ BEGIN TRY
PRINT 'ERROR: ' + @RETURN_ERROR_TEXT; PRINT 'ERROR: ' + @RETURN_ERROR_TEXT;
SELECT SELECT
success = 0 success = CAST(0 AS BIT)
, message = @RETURN_ERROR_TEXT , message = @RETURN_ERROR_TEXT
, data = NULL; , data = CAST(NULL AS NVARCHAR(MAX));
RETURN; RETURN @RETURN_STATUS;
END; END;
----------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------
@@ -80,6 +89,26 @@ BEGIN TRY
FROM OPENJSON(@json, '$.purchaseDocuments'); FROM OPENJSON(@json, '$.purchaseDocuments');
----------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------
--=========================================-- Reject empty purchaseDocuments array --==========================================--
IF NOT EXISTS (SELECT 1 FROM @docs) BEGIN
ROLLBACK TRANSACTION;
SET @RETURN_STATUS = 40002;
SET @RETURN_STATUS_TEXT = N'Empty purchaseDocuments array.';
SET @RETURN_ERROR_TEXT = N'purchaseDocuments-Array ist leer. Mindestens ein Dokument erforderlich.';
PRINT 'ERROR: ' + @RETURN_ERROR_TEXT;
SELECT
success = CAST(0 AS BIT)
, message = @RETURN_ERROR_TEXT
, data = CAST(NULL AS NVARCHAR(MAX));
RETURN @RETURN_STATUS;
END;
-----------------------------------------------------------------------------------------------------------------------------------
DECLARE doc_cursor CURSOR LOCAL FAST_FORWARD 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;
@@ -102,6 +131,7 @@ BEGIN TRY
, DueDate , DueDate
, PmtDiscountDate , PmtDiscountDate
, PaymentDiscount , PaymentDiscount
, PaymentDiscountIR
, CurrencyCode , CurrencyCode
, InvoiceDiscCode , InvoiceDiscCode
, PostingDescription , PostingDescription
@@ -132,6 +162,7 @@ BEGIN TRY
, DueDate , DueDate
, PmtDiscountDate , PmtDiscountDate
, PaymentDiscount , PaymentDiscount
, PaymentDiscountIR
, CurrencyCode , CurrencyCode
, InvoiceDiscCode , InvoiceDiscCode
, PostingDescription , PostingDescription
@@ -150,34 +181,35 @@ BEGIN TRY
, PhrRMAmountLessDiscount , PhrRMAmountLessDiscount
FROM OPENJSON(@doc) FROM OPENJSON(@doc)
WITH ( WITH (
DocumentType INT DocumentType INT '$.documentType'
, No NVARCHAR(50) , No NVARCHAR(50) '$.no'
, NoSeries NVARCHAR(50) , NoSeries NVARCHAR(50) '$.noSeries'
, ProcessIDTransfer NVARCHAR(50) , ProcessIDTransfer NVARCHAR(50) '$.processIDTransfer'
, BuyFromVendorNo NVARCHAR(50) , BuyFromVendorNo NVARCHAR(50) '$.buyFromVendorNo'
, PayToVendorNo NVARCHAR(50) , PayToVendorNo NVARCHAR(50) '$.payToVendorNo'
, PostingDate DATE , PostingDate DATE '$.postingDate'
, PaymentTermsCode NVARCHAR(20) , PaymentTermsCode NVARCHAR(20) '$.paymentTermsCode'
, PaymentTermsCodeIR NVARCHAR(20) , PaymentTermsCodeIR NVARCHAR(20) '$.paymentTermsCodeIR'
, DueDate DATE , DueDate DATE '$.dueDate'
, PmtDiscountDate DATE , PmtDiscountDate DATE '$.pmtDiscountDate'
, PaymentDiscount DECIMAL(10,2) , PaymentDiscount DECIMAL(10,2) '$.paymentDiscount'
, CurrencyCode NVARCHAR(10) , PaymentDiscountIR DECIMAL(10,2) '$.paymentDiscountIR'
, InvoiceDiscCode NVARCHAR(50) , CurrencyCode NVARCHAR(10) '$.currencyCode'
, PostingDescription NVARCHAR(250) , InvoiceDiscCode NVARCHAR(50) '$.invoiceDiscCode'
, PaymentMethodCode NVARCHAR(20) , PostingDescription NVARCHAR(250) '$.postingDescription'
, VendorInvoiceNo NVARCHAR(50) , PaymentMethodCode NVARCHAR(20) '$.paymentMethodCode'
, VendorCrMemoNo NVARCHAR(50) , VendorInvoiceNo NVARCHAR(50) '$.vendorInvoiceNo'
, PhrVendorBankAccountCode NVARCHAR(50) , VendorCrMemoNo NVARCHAR(50) '$.vendorCrMemoNo'
, PhrBankBranchNo NVARCHAR(50) , PhrVendorBankAccountCode NVARCHAR(50) '$.phrVendorBankAccountCode'
, PhrBankAccountNo NVARCHAR(50) , PhrBankBranchNo NVARCHAR(50) '$.phrBankBranchNo'
, PhrIBAN NVARCHAR(50) , PhrBankAccountNo NVARCHAR(50) '$.phrBankAccountNo'
, PhrSWIFTCode NVARCHAR(50) , PhrIBAN NVARCHAR(50) '$.phrIBAN'
, PhrBankName NVARCHAR(100) , PhrSWIFTCode NVARCHAR(50) '$.phrSWIFTCode'
, PhrBankAccountEntryPriority BIT , PhrBankName NVARCHAR(100) '$.phrBankName'
, PhrRMCashDiscountReceived BIT , PhrBankAccountEntryPriority BIT '$.phrBankAccountEntryPriority'
, PhrRMAmountIncludingVAT DECIMAL(18,2) , PhrRMCashDiscountReceived BIT '$.phrRMCashDiscountReceived'
, PhrRMAmountLessDiscount DECIMAL(18,2) , PhrRMAmountIncludingVAT DECIMAL(18,2) '$.phrRMAmountIncludingVAT'
, PhrRMAmountLessDiscount DECIMAL(18,2) '$.phrRMAmountLessDiscount'
, purchaseLines NVARCHAR(MAX) AS JSON , purchaseLines NVARCHAR(MAX) AS JSON
); );
----------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------
@@ -259,31 +291,31 @@ BEGIN TRY
, IrOrderLineNo , IrOrderLineNo
FROM OPENJSON(@line) FROM OPENJSON(@line)
WITH ( WITH (
AttachedToLineNo INT AttachedToLineNo INT '$.attachedToLineNo'
, Type INT , Type INT '$.type'
, No NVARCHAR(50) , No NVARCHAR(50) '$.no'
, Description NVARCHAR(250) , Description NVARCHAR(250) '$.description'
, Description2 NVARCHAR(250) , Description2 NVARCHAR(250) '$.description2'
, LocationCode NVARCHAR(50) , LocationCode NVARCHAR(50) '$.locationCode'
, VariantCode NVARCHAR(50) , VariantCode NVARCHAR(50) '$.variantCode'
, Quantity DECIMAL(18,4) , Quantity DECIMAL(18,4) '$.quantity'
, UnitOfMeasureCode NVARCHAR(20) , UnitOfMeasureCode NVARCHAR(20) '$.unitOfMeasureCode'
, DirectUnitCost DECIMAL(18,4) , DirectUnitCost DECIMAL(18,4) '$.directUnitCost'
, LineDiscount DECIMAL(18,4) , LineDiscount DECIMAL(18,4) '$.lineDiscount'
, AbleToDiscount BIT , AbleToDiscount BIT '$.ableToDiscount'
, DiscountCalculated BIT , DiscountCalculated BIT '$.discountCalculated'
, WorkOrderNo NVARCHAR(50) , WorkOrderNo NVARCHAR(50) '$.workOrderNo'
, GenBusPostingGroup NVARCHAR(20) , GenBusPostingGroup NVARCHAR(20) '$.genBusPostingGroup'
, GenProdPostingGroup NVARCHAR(20) , GenProdPostingGroup NVARCHAR(20) '$.genProdPostingGroup'
, VatBusPostingGroup NVARCHAR(20) , VatBusPostingGroup NVARCHAR(20) '$.vatBusPostingGroup'
, VatProdPostingGroup NVARCHAR(20) , VatProdPostingGroup NVARCHAR(20) '$.vatProdPostingGroup'
, ApplToItemEntry INT , ApplToItemEntry INT '$.applToItemEntry'
, PostingWithoutApply BIT , PostingWithoutApply BIT '$.postingWithoutApply'
, AnticipatedPayment DECIMAL(18,2) , AnticipatedPayment DECIMAL(18,2) '$.anticipatedPayment'
, ReceiptNo NVARCHAR(50) , ReceiptNo NVARCHAR(50) '$.receiptNo'
, ReceiptLineNo INT , ReceiptLineNo INT '$.receiptLineNo'
, IrOrderNo NVARCHAR(50) , IrOrderNo NVARCHAR(50) '$.irOrderNo'
, IrOrderLineNo INT , IrOrderLineNo INT '$.irOrderLineNo'
, dimSetEntries NVARCHAR(MAX) AS JSON , dimSetEntries NVARCHAR(MAX) AS JSON
, itemChargeAssignmentLines NVARCHAR(MAX) AS JSON , itemChargeAssignmentLines NVARCHAR(MAX) AS JSON
); );
@@ -296,8 +328,8 @@ BEGIN TRY
SELECT @LineID, DimensionCode, DimensionValueCode SELECT @LineID, DimensionCode, DimensionValueCode
FROM OPENJSON(@line, '$.dimSetEntries') FROM OPENJSON(@line, '$.dimSetEntries')
WITH ( WITH (
DimensionCode NVARCHAR(50) DimensionCode NVARCHAR(50) '$.dimensionCode'
, DimensionValueCode NVARCHAR(50) , DimensionValueCode NVARCHAR(50) '$.dimensionValueCode'
); );
----------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------
@@ -331,17 +363,17 @@ BEGIN TRY
, AppliesToDocLineAmount , AppliesToDocLineAmount
FROM OPENJSON(@line, '$.itemChargeAssignmentLines') FROM OPENJSON(@line, '$.itemChargeAssignmentLines')
WITH ( WITH (
ItemChargeNo NVARCHAR(50) ItemChargeNo NVARCHAR(50) '$.itemChargeNo'
, UnitCost DECIMAL(18,4) , UnitCost DECIMAL(18,4) '$.unitCost'
, AppliesToDocType INT , AppliesToDocType INT '$.appliesToDocType'
, AppliesToDocNo NVARCHAR(50) , AppliesToDocNo NVARCHAR(50) '$.appliesToDocNo'
, AppliesToDocLineNo INT , AppliesToDocLineNo INT '$.appliesToDocLineNo'
, ItemNo NVARCHAR(50) , ItemNo NVARCHAR(50) '$.itemNo'
, Description NVARCHAR(250) , Description NVARCHAR(250) '$.description'
, QtyToAssign DECIMAL(18,4) , QtyToAssign DECIMAL(18,4) '$.qtyToAssign'
, QtyAssigned DECIMAL(18,4) , QtyAssigned DECIMAL(18,4) '$.qtyAssigned'
, AmountToAssign DECIMAL(18,4) , AmountToAssign DECIMAL(18,4) '$.amountToAssign'
, AppliesToDocLineAmount DECIMAL(18,4) , AppliesToDocLineAmount DECIMAL(18,4) '$.appliesToDocLineAmount'
); );
----------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------
@@ -367,69 +399,70 @@ BEGIN TRY
COALESCE( COALESCE(
( (
SELECT SELECT
pd.DocumentType [documentType] = pd.DocumentType
, [No] = pd.No_ , [no] = pd.No_
, pd.NoSeries , [noSeries] = pd.NoSeries
, pd.ProcessIDTransfer , [processIDTransfer] = pd.ProcessIDTransfer
, pd.BuyFromVendorNo , [buyFromVendorNo] = pd.BuyFromVendorNo
, pd.PayToVendorNo , [payToVendorNo] = pd.PayToVendorNo
, pd.PostingDate , [postingDate] = pd.PostingDate
, pd.PaymentTermsCode , [paymentTermsCode] = pd.PaymentTermsCode
, pd.PaymentTermsCodeIR , [paymentTermsCodeIR] = pd.PaymentTermsCodeIR
, pd.DueDate , [dueDate] = pd.DueDate
, pd.PmtDiscountDate , [pmtDiscountDate] = pd.PmtDiscountDate
, pd.PaymentDiscount , [paymentDiscount] = pd.PaymentDiscount
, pd.CurrencyCode , [paymentDiscountIR] = pd.PaymentDiscountIR
, pd.InvoiceDiscCode , [currencyCode] = pd.CurrencyCode
, pd.PostingDescription , [invoiceDiscCode] = pd.InvoiceDiscCode
, pd.PaymentMethodCode , [postingDescription] = pd.PostingDescription
, pd.VendorInvoiceNo , [paymentMethodCode] = pd.PaymentMethodCode
, pd.VendorCrMemoNo , [vendorInvoiceNo] = pd.VendorInvoiceNo
, pd.PhrVendorBankAccountCode , [vendorCrMemoNo] = pd.VendorCrMemoNo
, pd.PhrBankBranchNo , [phrVendorBankAccountCode] = pd.PhrVendorBankAccountCode
, pd.PhrBankAccountNo , [phrBankBranchNo] = pd.PhrBankBranchNo
, pd.PhrIBAN , [phrBankAccountNo] = pd.PhrBankAccountNo
, pd.PhrSWIFTCode , [phrIBAN] = pd.PhrIBAN
, pd.PhrBankName , [phrSWIFTCode] = pd.PhrSWIFTCode
, pd.PhrBankAccountEntryPriority , [phrBankName] = pd.PhrBankName
, pd.PhrRMCashDiscountReceived , [phrBankAccountEntryPriority] = pd.PhrBankAccountEntryPriority
, pd.PhrRMAmountIncludingVAT , [phrRMCashDiscountReceived] = pd.PhrRMCashDiscountReceived
, pd.PhrRMAmountLessDiscount , [phrRMAmountIncludingVAT] = pd.PhrRMAmountIncludingVAT
, [phrRMAmountLessDiscount] = pd.PhrRMAmountLessDiscount
, purchaseLines = JSON_QUERY( , purchaseLines = JSON_QUERY(
COALESCE( COALESCE(
( (
SELECT SELECT
pl.AttachedToLineNo [attachedToLineNo] = pl.AttachedToLineNo
, pl.Type , [type] = pl.Type
, [No] = pl.No_ , [no] = pl.No_
, pl.Description , [description] = pl.Description
, pl.Description2 , [description2] = pl.Description2
, pl.LocationCode , [locationCode] = pl.LocationCode
, pl.VariantCode , [variantCode] = pl.VariantCode
, pl.Quantity , [quantity] = pl.Quantity
, pl.UnitOfMeasureCode , [unitOfMeasureCode] = pl.UnitOfMeasureCode
, pl.DirectUnitCost , [directUnitCost] = pl.DirectUnitCost
, pl.LineDiscount , [lineDiscount] = pl.LineDiscount
, pl.AbleToDiscount , [ableToDiscount] = pl.AbleToDiscount
, pl.DiscountCalculated , [discountCalculated] = pl.DiscountCalculated
, pl.WorkOrderNo , [workOrderNo] = pl.WorkOrderNo
, pl.GenBusPostingGroup , [genBusPostingGroup] = pl.GenBusPostingGroup
, pl.GenProdPostingGroup , [genProdPostingGroup] = pl.GenProdPostingGroup
, pl.VatBusPostingGroup , [vatBusPostingGroup] = pl.VatBusPostingGroup
, pl.VatProdPostingGroup , [vatProdPostingGroup] = pl.VatProdPostingGroup
, pl.ApplToItemEntry , [applToItemEntry] = pl.ApplToItemEntry
, pl.PostingWithoutApply , [postingWithoutApply] = pl.PostingWithoutApply
, pl.AnticipatedPayment , [anticipatedPayment] = pl.AnticipatedPayment
, pl.ReceiptNo , [receiptNo] = pl.ReceiptNo
, pl.ReceiptLineNo , [receiptLineNo] = pl.ReceiptLineNo
, pl.IrOrderNo , [irOrderNo] = pl.IrOrderNo
, pl.IrOrderLineNo , [irOrderLineNo] = pl.IrOrderLineNo
, dimSetEntries = JSON_QUERY( , dimSetEntries = JSON_QUERY(
COALESCE( COALESCE(
( (
SELECT SELECT
d.DimensionCode [dimensionCode] = d.DimensionCode
, d.DimensionValueCode , [dimensionValueCode] = d.DimensionValueCode
FROM dbo.DimSetEntry d FROM dbo.DimSetEntry d
WHERE d.LineID = pl.LineID WHERE d.LineID = pl.LineID
FOR JSON PATH FOR JSON PATH
@@ -441,17 +474,17 @@ BEGIN TRY
COALESCE( COALESCE(
( (
SELECT SELECT
ia.ItemChargeNo [itemChargeNo] = ia.ItemChargeNo
, ia.UnitCost , [unitCost] = ia.UnitCost
, ia.AppliesToDocType , [appliesToDocType] = ia.AppliesToDocType
, ia.AppliesToDocNo , [appliesToDocNo] = ia.AppliesToDocNo
, ia.AppliesToDocLineNo , [appliesToDocLineNo] = ia.AppliesToDocLineNo
, ia.ItemNo , [itemNo] = ia.ItemNo
, ia.Description , [description] = ia.Description
, ia.QtyToAssign , [qtyToAssign] = ia.QtyToAssign
, ia.QtyAssigned , [qtyAssigned] = ia.QtyAssigned
, ia.AmountToAssign , [amountToAssign] = ia.AmountToAssign
, ia.AppliesToDocLineAmount , [appliesToDocLineAmount] = ia.AppliesToDocLineAmount
FROM dbo.ItemChargeAssignment ia FROM dbo.ItemChargeAssignment ia
WHERE ia.LineID = pl.LineID WHERE ia.LineID = pl.LineID
FOR JSON PATH FOR JSON PATH
@@ -488,20 +521,35 @@ BEGIN TRY
PRINT '===================================================================================================='; PRINT '====================================================================================================';
SELECT SELECT
success = 1 success = CAST(1 AS BIT)
, message = N'Daten erfolgreich verarbeitet.' , message = N'Daten erfolgreich verarbeitet.'
, data = @output; , data = @output;
RETURN @RETURN_STATUS;
END TRY BEGIN CATCH END TRY BEGIN CATCH
--====================================================-- exception / error --====================================================-- --====================================================-- exception / error --====================================================--
-- defensive cursor cleanup
IF CURSOR_STATUS('local','line_cursor') >= -1 BEGIN
IF CURSOR_STATUS('local','line_cursor') >= 0
CLOSE line_cursor;
DEALLOCATE line_cursor;
END;
IF CURSOR_STATUS('local','doc_cursor') >= -1 BEGIN
IF CURSOR_STATUS('local','doc_cursor') >= 0
CLOSE doc_cursor;
DEALLOCATE doc_cursor;
END;
IF (@@TRANCOUNT > 0) BEGIN IF (@@TRANCOUNT > 0) BEGIN
ROLLBACK TRANSACTION; ROLLBACK TRANSACTION;
END; END;
SET @RETURN_STATUS = 50000; SET @RETURN_STATUS = 50000;
SET @RETURN_STATUS_TEXT = CONCAT('END PROCEDURE [',OBJECT_NAME(@@PROCID),'] @ ',CONVERT(NVARCHAR(50),GETDATE(),120)); 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())); SET @RETURN_ERROR_TEXT = CONCAT('ERR ',ERROR_NUMBER(),' SEV ',ERROR_SEVERITY(),' STATE ',ERROR_STATE(),' LINE ',ERROR_LINE(),': ',ERROR_MESSAGE());
PRINT 'ERROR IN PROCEDURE: [' + OBJECT_NAME(@@PROCID) + ']' + CHAR(13) + @RETURN_ERROR_TEXT; PRINT 'ERROR IN PROCEDURE: [' + OBJECT_NAME(@@PROCID) + ']' + CHAR(13) + @RETURN_ERROR_TEXT;
PRINT @RETURN_STATUS_TEXT; PRINT @RETURN_STATUS_TEXT;
@@ -509,9 +557,11 @@ END TRY BEGIN CATCH
----------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------
SELECT SELECT
success = 0 success = CAST(0 AS BIT)
, message = ERROR_MESSAGE() , message = ERROR_MESSAGE()
, data = NULL; , data = CAST(NULL AS NVARCHAR(MAX));
RETURN @RETURN_STATUS;
END CATCH; END CATCH;
GO GO