diff --git a/SWESQL/SQL-Server/Prozeduren/[PRCUST_SET_JSON_INVOICE_DATA].sql b/SWESQL/SQL-Server/Prozeduren/[PRCUST_SET_JSON_INVOICE_DATA].sql index d569c27..1114e11 100644 --- a/SWESQL/SQL-Server/Prozeduren/[PRCUST_SET_JSON_INVOICE_DATA].sql +++ b/SWESQL/SQL-Server/Prozeduren/[PRCUST_SET_JSON_INVOICE_DATA].sql @@ -17,11 +17,20 @@ GO -- ================================================================= -- Creation Date / Author: 26.02.2026 / MK -- Version Date / Editor: 26.02.2026 / MK --- Version Number: 1.0.0.0 +-- Version Number: 1.2.0.0 -- ================================================================= -- History: -- 26.02.2026 / MK - Initial version based on JSON invoice import -- 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]( @json NVARCHAR(MAX) @@ -62,11 +71,11 @@ BEGIN TRY PRINT 'ERROR: ' + @RETURN_ERROR_TEXT; SELECT - success = 0 + success = CAST(0 AS BIT) , message = @RETURN_ERROR_TEXT - , data = NULL; + , data = CAST(NULL AS NVARCHAR(MAX)); - RETURN; + RETURN @RETURN_STATUS; END; ----------------------------------------------------------------------------------------------------------------------------------- @@ -80,6 +89,26 @@ BEGIN TRY 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; OPEN doc_cursor; FETCH NEXT FROM doc_cursor INTO @doc; @@ -102,6 +131,7 @@ BEGIN TRY , DueDate , PmtDiscountDate , PaymentDiscount + , PaymentDiscountIR , CurrencyCode , InvoiceDiscCode , PostingDescription @@ -132,6 +162,7 @@ BEGIN TRY , DueDate , PmtDiscountDate , PaymentDiscount + , PaymentDiscountIR , CurrencyCode , InvoiceDiscCode , PostingDescription @@ -150,34 +181,35 @@ BEGIN TRY , PhrRMAmountLessDiscount FROM OPENJSON(@doc) WITH ( - DocumentType INT - , No NVARCHAR(50) - , NoSeries NVARCHAR(50) - , ProcessIDTransfer NVARCHAR(50) - , BuyFromVendorNo NVARCHAR(50) - , PayToVendorNo NVARCHAR(50) - , PostingDate DATE - , PaymentTermsCode NVARCHAR(20) - , PaymentTermsCodeIR NVARCHAR(20) - , DueDate DATE - , PmtDiscountDate DATE - , PaymentDiscount DECIMAL(10,2) - , CurrencyCode NVARCHAR(10) - , InvoiceDiscCode NVARCHAR(50) - , PostingDescription NVARCHAR(250) - , PaymentMethodCode NVARCHAR(20) - , VendorInvoiceNo NVARCHAR(50) - , VendorCrMemoNo NVARCHAR(50) - , PhrVendorBankAccountCode NVARCHAR(50) - , PhrBankBranchNo NVARCHAR(50) - , PhrBankAccountNo NVARCHAR(50) - , PhrIBAN NVARCHAR(50) - , PhrSWIFTCode NVARCHAR(50) - , PhrBankName NVARCHAR(100) - , PhrBankAccountEntryPriority BIT - , PhrRMCashDiscountReceived BIT - , PhrRMAmountIncludingVAT DECIMAL(18,2) - , PhrRMAmountLessDiscount DECIMAL(18,2) + DocumentType INT '$.documentType' + , No NVARCHAR(50) '$.no' + , NoSeries NVARCHAR(50) '$.noSeries' + , ProcessIDTransfer NVARCHAR(50) '$.processIDTransfer' + , BuyFromVendorNo NVARCHAR(50) '$.buyFromVendorNo' + , PayToVendorNo NVARCHAR(50) '$.payToVendorNo' + , PostingDate DATE '$.postingDate' + , PaymentTermsCode NVARCHAR(20) '$.paymentTermsCode' + , PaymentTermsCodeIR NVARCHAR(20) '$.paymentTermsCodeIR' + , DueDate DATE '$.dueDate' + , PmtDiscountDate DATE '$.pmtDiscountDate' + , PaymentDiscount DECIMAL(10,2) '$.paymentDiscount' + , PaymentDiscountIR DECIMAL(10,2) '$.paymentDiscountIR' + , CurrencyCode NVARCHAR(10) '$.currencyCode' + , InvoiceDiscCode NVARCHAR(50) '$.invoiceDiscCode' + , PostingDescription NVARCHAR(250) '$.postingDescription' + , PaymentMethodCode NVARCHAR(20) '$.paymentMethodCode' + , VendorInvoiceNo NVARCHAR(50) '$.vendorInvoiceNo' + , VendorCrMemoNo NVARCHAR(50) '$.vendorCrMemoNo' + , PhrVendorBankAccountCode NVARCHAR(50) '$.phrVendorBankAccountCode' + , PhrBankBranchNo NVARCHAR(50) '$.phrBankBranchNo' + , PhrBankAccountNo NVARCHAR(50) '$.phrBankAccountNo' + , PhrIBAN NVARCHAR(50) '$.phrIBAN' + , PhrSWIFTCode NVARCHAR(50) '$.phrSWIFTCode' + , PhrBankName NVARCHAR(100) '$.phrBankName' + , PhrBankAccountEntryPriority BIT '$.phrBankAccountEntryPriority' + , PhrRMCashDiscountReceived BIT '$.phrRMCashDiscountReceived' + , PhrRMAmountIncludingVAT DECIMAL(18,2) '$.phrRMAmountIncludingVAT' + , PhrRMAmountLessDiscount DECIMAL(18,2) '$.phrRMAmountLessDiscount' , purchaseLines NVARCHAR(MAX) AS JSON ); ----------------------------------------------------------------------------------------------------------------------------------- @@ -259,31 +291,31 @@ BEGIN TRY , IrOrderLineNo FROM OPENJSON(@line) WITH ( - AttachedToLineNo INT - , Type INT - , No NVARCHAR(50) - , Description NVARCHAR(250) - , Description2 NVARCHAR(250) - , LocationCode NVARCHAR(50) - , VariantCode NVARCHAR(50) - , Quantity DECIMAL(18,4) - , UnitOfMeasureCode NVARCHAR(20) - , DirectUnitCost DECIMAL(18,4) - , LineDiscount DECIMAL(18,4) - , AbleToDiscount BIT - , DiscountCalculated BIT - , WorkOrderNo NVARCHAR(50) - , GenBusPostingGroup NVARCHAR(20) - , GenProdPostingGroup NVARCHAR(20) - , VatBusPostingGroup NVARCHAR(20) - , VatProdPostingGroup NVARCHAR(20) - , ApplToItemEntry INT - , PostingWithoutApply BIT - , AnticipatedPayment DECIMAL(18,2) - , ReceiptNo NVARCHAR(50) - , ReceiptLineNo INT - , IrOrderNo NVARCHAR(50) - , IrOrderLineNo INT + AttachedToLineNo INT '$.attachedToLineNo' + , Type INT '$.type' + , No NVARCHAR(50) '$.no' + , Description NVARCHAR(250) '$.description' + , Description2 NVARCHAR(250) '$.description2' + , LocationCode NVARCHAR(50) '$.locationCode' + , VariantCode NVARCHAR(50) '$.variantCode' + , Quantity DECIMAL(18,4) '$.quantity' + , UnitOfMeasureCode NVARCHAR(20) '$.unitOfMeasureCode' + , DirectUnitCost DECIMAL(18,4) '$.directUnitCost' + , LineDiscount DECIMAL(18,4) '$.lineDiscount' + , AbleToDiscount BIT '$.ableToDiscount' + , DiscountCalculated BIT '$.discountCalculated' + , WorkOrderNo NVARCHAR(50) '$.workOrderNo' + , GenBusPostingGroup NVARCHAR(20) '$.genBusPostingGroup' + , GenProdPostingGroup NVARCHAR(20) '$.genProdPostingGroup' + , VatBusPostingGroup NVARCHAR(20) '$.vatBusPostingGroup' + , VatProdPostingGroup NVARCHAR(20) '$.vatProdPostingGroup' + , ApplToItemEntry INT '$.applToItemEntry' + , PostingWithoutApply BIT '$.postingWithoutApply' + , AnticipatedPayment DECIMAL(18,2) '$.anticipatedPayment' + , ReceiptNo NVARCHAR(50) '$.receiptNo' + , ReceiptLineNo INT '$.receiptLineNo' + , IrOrderNo NVARCHAR(50) '$.irOrderNo' + , IrOrderLineNo INT '$.irOrderLineNo' , dimSetEntries NVARCHAR(MAX) AS JSON , itemChargeAssignmentLines NVARCHAR(MAX) AS JSON ); @@ -296,8 +328,8 @@ BEGIN TRY SELECT @LineID, DimensionCode, DimensionValueCode FROM OPENJSON(@line, '$.dimSetEntries') WITH ( - DimensionCode NVARCHAR(50) - , DimensionValueCode NVARCHAR(50) + DimensionCode NVARCHAR(50) '$.dimensionCode' + , DimensionValueCode NVARCHAR(50) '$.dimensionValueCode' ); ----------------------------------------------------------------------------------------------------------------------------------- @@ -331,17 +363,17 @@ BEGIN TRY , AppliesToDocLineAmount FROM OPENJSON(@line, '$.itemChargeAssignmentLines') WITH ( - ItemChargeNo NVARCHAR(50) - , UnitCost DECIMAL(18,4) - , AppliesToDocType INT - , AppliesToDocNo NVARCHAR(50) - , AppliesToDocLineNo INT - , ItemNo NVARCHAR(50) - , Description NVARCHAR(250) - , QtyToAssign DECIMAL(18,4) - , QtyAssigned DECIMAL(18,4) - , AmountToAssign DECIMAL(18,4) - , AppliesToDocLineAmount DECIMAL(18,4) + ItemChargeNo NVARCHAR(50) '$.itemChargeNo' + , UnitCost DECIMAL(18,4) '$.unitCost' + , AppliesToDocType INT '$.appliesToDocType' + , AppliesToDocNo NVARCHAR(50) '$.appliesToDocNo' + , AppliesToDocLineNo INT '$.appliesToDocLineNo' + , ItemNo NVARCHAR(50) '$.itemNo' + , Description NVARCHAR(250) '$.description' + , QtyToAssign DECIMAL(18,4) '$.qtyToAssign' + , QtyAssigned DECIMAL(18,4) '$.qtyAssigned' + , AmountToAssign DECIMAL(18,4) '$.amountToAssign' + , AppliesToDocLineAmount DECIMAL(18,4) '$.appliesToDocLineAmount' ); ----------------------------------------------------------------------------------------------------------------------------------- @@ -367,69 +399,70 @@ BEGIN TRY COALESCE( ( 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 + [documentType] = pd.DocumentType + , [no] = pd.No_ + , [noSeries] = pd.NoSeries + , [processIDTransfer] = pd.ProcessIDTransfer + , [buyFromVendorNo] = pd.BuyFromVendorNo + , [payToVendorNo] = pd.PayToVendorNo + , [postingDate] = pd.PostingDate + , [paymentTermsCode] = pd.PaymentTermsCode + , [paymentTermsCodeIR] = pd.PaymentTermsCodeIR + , [dueDate] = pd.DueDate + , [pmtDiscountDate] = pd.PmtDiscountDate + , [paymentDiscount] = pd.PaymentDiscount + , [paymentDiscountIR] = pd.PaymentDiscountIR + , [currencyCode] = pd.CurrencyCode + , [invoiceDiscCode] = pd.InvoiceDiscCode + , [postingDescription] = pd.PostingDescription + , [paymentMethodCode] = pd.PaymentMethodCode + , [vendorInvoiceNo] = pd.VendorInvoiceNo + , [vendorCrMemoNo] = pd.VendorCrMemoNo + , [phrVendorBankAccountCode] = pd.PhrVendorBankAccountCode + , [phrBankBranchNo] = pd.PhrBankBranchNo + , [phrBankAccountNo] = pd.PhrBankAccountNo + , [phrIBAN] = pd.PhrIBAN + , [phrSWIFTCode] = pd.PhrSWIFTCode + , [phrBankName] = pd.PhrBankName + , [phrBankAccountEntryPriority] = pd.PhrBankAccountEntryPriority + , [phrRMCashDiscountReceived] = pd.PhrRMCashDiscountReceived + , [phrRMAmountIncludingVAT] = pd.PhrRMAmountIncludingVAT + , [phrRMAmountLessDiscount] = pd.PhrRMAmountLessDiscount , purchaseLines = JSON_QUERY( COALESCE( ( SELECT - 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 + [attachedToLineNo] = pl.AttachedToLineNo + , [type] = pl.Type + , [no] = pl.No_ + , [description] = pl.Description + , [description2] = pl.Description2 + , [locationCode] = pl.LocationCode + , [variantCode] = pl.VariantCode + , [quantity] = pl.Quantity + , [unitOfMeasureCode] = pl.UnitOfMeasureCode + , [directUnitCost] = pl.DirectUnitCost + , [lineDiscount] = pl.LineDiscount + , [ableToDiscount] = pl.AbleToDiscount + , [discountCalculated] = pl.DiscountCalculated + , [workOrderNo] = pl.WorkOrderNo + , [genBusPostingGroup] = pl.GenBusPostingGroup + , [genProdPostingGroup] = pl.GenProdPostingGroup + , [vatBusPostingGroup] = pl.VatBusPostingGroup + , [vatProdPostingGroup] = pl.VatProdPostingGroup + , [applToItemEntry] = pl.ApplToItemEntry + , [postingWithoutApply] = pl.PostingWithoutApply + , [anticipatedPayment] = pl.AnticipatedPayment + , [receiptNo] = pl.ReceiptNo + , [receiptLineNo] = pl.ReceiptLineNo + , [irOrderNo] = pl.IrOrderNo + , [irOrderLineNo] = pl.IrOrderLineNo , dimSetEntries = JSON_QUERY( COALESCE( ( SELECT - d.DimensionCode - , d.DimensionValueCode + [dimensionCode] = d.DimensionCode + , [dimensionValueCode] = d.DimensionValueCode FROM dbo.DimSetEntry d WHERE d.LineID = pl.LineID FOR JSON PATH @@ -441,17 +474,17 @@ BEGIN TRY COALESCE( ( SELECT - ia.ItemChargeNo - , ia.UnitCost - , ia.AppliesToDocType - , ia.AppliesToDocNo - , ia.AppliesToDocLineNo - , ia.ItemNo - , ia.Description - , ia.QtyToAssign - , ia.QtyAssigned - , ia.AmountToAssign - , ia.AppliesToDocLineAmount + [itemChargeNo] = ia.ItemChargeNo + , [unitCost] = ia.UnitCost + , [appliesToDocType] = ia.AppliesToDocType + , [appliesToDocNo] = ia.AppliesToDocNo + , [appliesToDocLineNo] = ia.AppliesToDocLineNo + , [itemNo] = ia.ItemNo + , [description] = ia.Description + , [qtyToAssign] = ia.QtyToAssign + , [qtyAssigned] = ia.QtyAssigned + , [amountToAssign] = ia.AmountToAssign + , [appliesToDocLineAmount] = ia.AppliesToDocLineAmount FROM dbo.ItemChargeAssignment ia WHERE ia.LineID = pl.LineID FOR JSON PATH @@ -488,20 +521,35 @@ BEGIN TRY PRINT '===================================================================================================='; SELECT - success = 1 + success = CAST(1 AS BIT) , message = N'Daten erfolgreich verarbeitet.' , data = @output; + RETURN @RETURN_STATUS; + END TRY BEGIN CATCH --====================================================-- 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 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())); + 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 @RETURN_STATUS_TEXT; @@ -509,9 +557,11 @@ END TRY BEGIN CATCH ----------------------------------------------------------------------------------------------------------------------------------- SELECT - success = 0 + success = CAST(0 AS BIT) , message = ERROR_MESSAGE() - , data = NULL; + , data = CAST(NULL AS NVARCHAR(MAX)); + + RETURN @RETURN_STATUS; END CATCH; GO