Files
Stadtwerke_Eschwege/SWESQL/SQL-Server/Prozeduren/[PRCUST_SET_JSON_INVOICE_DATA].sql

518 lines
15 KiB
Transact-SQL

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)
)
AS
BEGIN TRY
SET NOCOUNT ON;
SET XACT_ABORT ON;
-- 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;
SELECT
success = 0
, message = @RETURN_ERROR_TEXT
, data = NULL;
RETURN;
END;
-----------------------------------------------------------------------------------------------------------------------------------
PRINT 'INFO: JSON-Validierung erfolgreich.';
BEGIN TRANSACTION;
--===========================================-- Extract purchaseDocuments array --===========================================--
INSERT INTO @docs(doc)
SELECT [value]
FROM OPENJSON(@json, '$.purchaseDocuments');
-----------------------------------------------------------------------------------------------------------------------------------
DECLARE doc_cursor CURSOR LOCAL FAST_FORWARD FOR SELECT doc FROM @docs;
OPEN doc_cursor;
FETCH NEXT FROM doc_cursor INTO @doc;
WHILE @@FETCH_STATUS = 0 BEGIN
PRINT 'INFO: Füge PurchaseDocument ein...';
--=============================================-- Insert PurchaseDocument row --=============================================--
INSERT INTO dbo.PurchaseDocument (
DocumentType
, No_
, NoSeries
, ProcessIDTransfer
, BuyFromVendorNo
, PayToVendorNo
, PostingDate
, PaymentTermsCode
, PaymentTermsCodeIR
, DueDate
, PmtDiscountDate
, PaymentDiscount
, CurrencyCode
, InvoiceDiscCode
, PostingDescription
, PaymentMethodCode
, VendorInvoiceNo
, VendorCrMemoNo
, PhrVendorBankAccountCode
, PhrBankBranchNo
, PhrBankAccountNo
, PhrIBAN
, PhrSWIFTCode
, PhrBankName
, PhrBankAccountEntryPriority
, PhrRMCashDiscountReceived
, PhrRMAmountIncludingVAT
, PhrRMAmountLessDiscount
)
SELECT
DocumentType
, No
, NoSeries
, ProcessIDTransfer
, BuyFromVendorNo
, PayToVendorNo
, PostingDate
, PaymentTermsCode
, PaymentTermsCodeIR
, DueDate
, PmtDiscountDate
, PaymentDiscount
, CurrencyCode
, InvoiceDiscCode
, PostingDescription
, PaymentMethodCode
, VendorInvoiceNo
, VendorCrMemoNo
, PhrVendorBankAccountCode
, PhrBankBranchNo
, PhrBankAccountNo
, PhrIBAN
, PhrSWIFTCode
, PhrBankName
, PhrBankAccountEntryPriority
, PhrRMCashDiscountReceived
, PhrRMAmountIncludingVAT
, 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)
, purchaseLines NVARCHAR(MAX) AS JSON
);
-----------------------------------------------------------------------------------------------------------------------------------
SET @DocumentID = SCOPE_IDENTITY();
INSERT INTO @InsertedDocuments (DocumentID) VALUES (@DocumentID);
PRINT 'INFO: PurchaseDocument eingefügt. DocumentID = ' + CAST(@DocumentID AS NVARCHAR(20));
--=============================================-- Extract purchaseLines array --==============================================--
DELETE FROM @lines;
INSERT INTO @lines(line)
SELECT [value]
FROM OPENJSON(@doc, '$.purchaseLines');
-----------------------------------------------------------------------------------------------------------------------------------
DECLARE line_cursor CURSOR LOCAL FAST_FORWARD FOR SELECT line FROM @lines;
OPEN line_cursor;
FETCH NEXT FROM line_cursor INTO @line;
WHILE @@FETCH_STATUS = 0 BEGIN
PRINT 'INFO: Füge PurchaseLine ein...';
INSERT INTO dbo.PurchaseLine (
DocumentID
, AttachedToLineNo
, Type
, No_
, Description
, Description2
, LocationCode
, VariantCode
, Quantity
, UnitOfMeasureCode
, DirectUnitCost
, LineDiscount
, AbleToDiscount
, DiscountCalculated
, WorkOrderNo
, GenBusPostingGroup
, GenProdPostingGroup
, VatBusPostingGroup
, VatProdPostingGroup
, ApplToItemEntry
, PostingWithoutApply
, AnticipatedPayment
, ReceiptNo
, ReceiptLineNo
, IrOrderNo
, IrOrderLineNo
)
SELECT
@DocumentID
, AttachedToLineNo
, Type
, No
, Description
, Description2
, LocationCode
, VariantCode
, Quantity
, UnitOfMeasureCode
, DirectUnitCost
, LineDiscount
, AbleToDiscount
, DiscountCalculated
, WorkOrderNo
, GenBusPostingGroup
, GenProdPostingGroup
, VatBusPostingGroup
, VatProdPostingGroup
, ApplToItemEntry
, PostingWithoutApply
, AnticipatedPayment
, ReceiptNo
, ReceiptLineNo
, IrOrderNo
, 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
, dimSetEntries NVARCHAR(MAX) AS JSON
, itemChargeAssignmentLines NVARCHAR(MAX) AS JSON
);
SET @LineID = SCOPE_IDENTITY();
PRINT 'INFO: PurchaseLine eingefügt. LineID = ' + CAST(@LineID AS NVARCHAR(20));
--===============================================-- Insert dimSetEntries --===============================================--
INSERT INTO dbo.DimSetEntry (LineID, DimensionCode, DimensionValueCode)
SELECT @LineID, DimensionCode, DimensionValueCode
FROM OPENJSON(@line, '$.dimSetEntries')
WITH (
DimensionCode NVARCHAR(50)
, DimensionValueCode NVARCHAR(50)
);
-----------------------------------------------------------------------------------------------------------------------------------
--=========================================-- Insert itemChargeAssignmentLines --==========================================--
INSERT INTO dbo.ItemChargeAssignment (
LineID
, ItemChargeNo
, UnitCost
, AppliesToDocType
, AppliesToDocNo
, AppliesToDocLineNo
, ItemNo
, Description
, QtyToAssign
, QtyAssigned
, AmountToAssign
, AppliesToDocLineAmount
)
SELECT
@LineID
, ItemChargeNo
, UnitCost
, AppliesToDocType
, AppliesToDocNo
, AppliesToDocLineNo
, ItemNo
, Description
, QtyToAssign
, QtyAssigned
, AmountToAssign
, 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)
);
-----------------------------------------------------------------------------------------------------------------------------------
FETCH NEXT FROM line_cursor INTO @line;
END;
CLOSE line_cursor;
DEALLOCATE line_cursor;
FETCH NEXT FROM doc_cursor INTO @doc;
END;
CLOSE doc_cursor;
DEALLOCATE doc_cursor;
PRINT 'INFO: Erzeuge JSON-Ausgabe...';
--===============================================-- Build output JSON result --===============================================--
SELECT @output =
(
SELECT
JSON_QUERY(
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
, 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
, dimSetEntries = JSON_QUERY(
COALESCE(
(
SELECT
d.DimensionCode
, d.DimensionValueCode
FROM dbo.DimSetEntry d
WHERE d.LineID = pl.LineID
FOR JSON PATH
)
, '[]'
)
)
, 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
FOR JSON PATH
)
, '[]'
)
)
FROM dbo.PurchaseLine pl
WHERE pl.DocumentID = pd.DocumentID
FOR JSON PATH
)
, '[]'
)
)
FROM dbo.PurchaseDocument pd
INNER JOIN @InsertedDocuments id ON id.DocumentID = pd.DocumentID
ORDER BY pd.DocumentID
FOR JSON PATH
)
, '[]'
)
) AS purchaseDocuments
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
);
-----------------------------------------------------------------------------------------------------------------------------------
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 '====================================================================================================';
SELECT
success = 1
, message = N'Daten erfolgreich verarbeitet.'
, data = @output;
END TRY BEGIN CATCH
--====================================================-- exception / error --====================================================--
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()));
PRINT 'ERROR IN PROCEDURE: [' + OBJECT_NAME(@@PROCID) + ']' + CHAR(13) + @RETURN_ERROR_TEXT;
PRINT @RETURN_STATUS_TEXT;
PRINT '====================================================================================================';
-----------------------------------------------------------------------------------------------------------------------------------
SELECT
success = 0
, message = ERROR_MESSAGE()
, data = NULL;
END CATCH;
GO