Files
Stadtwerke_Eschwege/SWESQL/SQL-Server/Tabellenwertfunktionen/[FNCUST_GET_EDMI_ITEM_VALUE].sql
2026-03-31 10:55:23 +02:00

192 lines
6.2 KiB
Transact-SQL

USE [DD_ECM]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- [FNCUST_GET_EDMI_ITEM_VALUE]
-- =================================================================
-- Returns item values from [TBEDMI_ITEM_VALUE] with optional filters,
-- fallback handling and EB normalization for INVOICE_REFERENCE specs.
--
-- Returns: Table (max. 10.000 rows)
-- =================================================================
CREATE OR ALTER FUNCTION [dbo].[FNCUST_GET_EDMI_ITEM_VALUE] (
@REFERENCE_GUID NVARCHAR(250) = NULL,
@SPEC_NAME NVARCHAR(100) = NULL
)
RETURNS TABLE
AS
RETURN (
--====================================-- SPEC fallback configuration --====================================--
-- FALLBACK_ITEM_VALUE: value used when EB is invalid/missing
-- ALLOW_FALLBACK: 1 = use fallback, 0 = keep original ITEM_VALUE
WITH [CFG_INVOICE_REFERENCE_SPEC] AS (
SELECT N'INVOICE_REFERENCE' AS [SPEC_NAME], CAST(N'EB9999999' AS NVARCHAR(100)) AS [FALLBACK_ITEM_VALUE], CAST(1 AS BIT) AS [ALLOW_FALLBACK]
UNION ALL SELECT N'INVOICE_REFERENCE2', CAST(NULL AS NVARCHAR(100)), CAST(0 AS BIT)
UNION ALL SELECT N'INVOICE_REFERENCE3', N'', CAST(0 AS BIT)
),
--=======================================-- Source data (filtered) --=======================================--
[SRC_FILTERED_DATA] AS (
SELECT
[GUID],
[REFERENCE_GUID],
[ITEM_DESCRIPTION],
[ITEM_VALUE],
[CREATEDWHEN],
[CREATEDWHO],
[CHANGEDWHEN],
[GROUP_COUNTER],
[SPEC_NAME],
[IS_REQUIRED],
[CHANGEDWHO],
[COMMENT]
FROM [dbo].[TBEDMI_ITEM_VALUE]
WHERE (@REFERENCE_GUID IS NULL OR [REFERENCE_GUID] = @REFERENCE_GUID)
AND (@SPEC_NAME IS NULL OR [SPEC_NAME] = @SPEC_NAME)
)
--========================================-- Final output resultset --========================================--
SELECT TOP (10000)
[GUID],
[REFERENCE_GUID],
[ITEM_DESCRIPTION],
CASE
-- Normalize ITEM_VALUE for configured INVOICE_REFERENCE specs only
WHEN [CHK_SPEC].[IS_INVOICE_REFERENCE_SPEC] = 1
THEN [NORM_EB].[NORMALIZED_EB_VALUE]
ELSE [OUT_RESULT_DATA].[ITEM_VALUE]
END AS [ITEM_VALUE],
[OUT_RESULT_DATA].[CREATEDWHEN],
[OUT_RESULT_DATA].[CREATEDWHO],
[OUT_RESULT_DATA].[CHANGEDWHEN],
[OUT_RESULT_DATA].[GROUP_COUNTER],
[OUT_RESULT_DATA].[SPEC_NAME],
[OUT_RESULT_DATA].[IS_REQUIRED],
[OUT_RESULT_DATA].[CHANGEDWHO],
[OUT_RESULT_DATA].[COMMENT],
[OUT_RESULT_DATA].[IS_FALLBACK],
CASE
-- Flag rows where configured EB fallback was actually applied
WHEN [CHK_SPEC].[IS_INVOICE_REFERENCE_SPEC] = 1
AND
[CHK_SPEC].[ALLOW_FALLBACK] = 1
AND
(
([CHK_SPEC].[CONFIGURED_FALLBACK_ITEM_VALUE] IS NULL AND [NORM_EB].[NORMALIZED_EB_VALUE] IS NULL)
OR [NORM_EB].[NORMALIZED_EB_VALUE] = [CHK_SPEC].[CONFIGURED_FALLBACK_ITEM_VALUE]
)
THEN CAST(1 AS BIT)
ELSE CAST(0 AS BIT)
END AS [IS_EB_FALLBACK]
FROM (
-- Real rows from source table
SELECT
[GUID],
[REFERENCE_GUID],
[ITEM_DESCRIPTION],
[ITEM_VALUE],
[CREATEDWHEN],
[CREATEDWHO],
[CHANGEDWHEN],
[GROUP_COUNTER],
[SPEC_NAME],
[IS_REQUIRED],
[CHANGEDWHO],
[COMMENT],
CAST(0 AS BIT) AS [IS_FALLBACK]
FROM [SRC_FILTERED_DATA]
UNION ALL
-- Failsafe row if source query returns no row
SELECT
CAST(0 AS BIGINT) AS [GUID],
ISNULL(@REFERENCE_GUID, N'FAILSAFE') AS [REFERENCE_GUID],
N'NO_DATA_FOUND' AS [ITEM_DESCRIPTION],
N'' AS [ITEM_VALUE],
GETDATE() AS [CREATEDWHEN],
N'SYSTEM' AS [CREATEDWHO],
NULL AS [CHANGEDWHEN],
CAST(0 AS INT) AS [GROUP_COUNTER],
ISNULL(@SPEC_NAME, N'FAILSAFE') AS [SPEC_NAME],
CAST(0 AS BIT) AS [IS_REQUIRED],
'SYSTEM' AS [CHANGEDWHO],
'FAILSAFE_ROW_RETURNED' AS [COMMENT],
CAST(1 AS BIT) AS [IS_FALLBACK]
WHERE NOT EXISTS (SELECT 1 FROM [SRC_FILTERED_DATA])
) AS [OUT_RESULT_DATA]
--===================================-- Resolve spec configuration --===================================--
OUTER APPLY (
SELECT TOP (1)
v.[SPEC_NAME] AS [MATCHED_SPEC_NAME],
v.[FALLBACK_ITEM_VALUE] AS [CONFIGURED_FALLBACK_ITEM_VALUE],
v.[ALLOW_FALLBACK] AS [ALLOW_FALLBACK]
FROM [CFG_INVOICE_REFERENCE_SPEC] v
WHERE v.[SPEC_NAME] = UPPER(CONVERT(NVARCHAR(200), ISNULL([OUT_RESULT_DATA].[SPEC_NAME], N'')))
) AS [CFG_SPEC]
--=============================-- Derived check flags and fallback value --=============================--
CROSS APPLY (
SELECT
CASE
WHEN [CFG_SPEC].[MATCHED_SPEC_NAME] IS NULL THEN CAST(0 AS BIT)
ELSE CAST(1 AS BIT)
END AS [IS_INVOICE_REFERENCE_SPEC],
[CFG_SPEC].[CONFIGURED_FALLBACK_ITEM_VALUE] AS [CONFIGURED_FALLBACK_ITEM_VALUE],
ISNULL([CFG_SPEC].[ALLOW_FALLBACK], CAST(0 AS BIT)) AS [ALLOW_FALLBACK]
) AS [CHK_SPEC]
--=============================-- Preprocessing for EB pattern matching --=============================--
CROSS APPLY (
SELECT LTRIM(RTRIM(ISNULL([OUT_RESULT_DATA].[ITEM_VALUE], N''))) AS [CLEAN_ITEM_VALUE]
) AS [VAL_CLEAN]
CROSS APPLY (
SELECT N' ' + [VAL_CLEAN].[CLEAN_ITEM_VALUE] + N' ' AS [PADDED_ITEM_VALUE]
) AS [VAL_PADDED]
CROSS APPLY (
-- Match EB + 8 digits with non-digit boundaries left and right
SELECT PATINDEX(
N'%[^0-9]EB[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][^0-9]%',
[VAL_PADDED].[PADDED_ITEM_VALUE]
) AS [EB_PATTERN_POS]
) AS [PAT_EB]
--====================================-- Normalize EB output value --====================================--
CROSS APPLY (
SELECT
CASE
-- Exact EB value
WHEN [VAL_CLEAN].[CLEAN_ITEM_VALUE] LIKE N'EB[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
THEN [VAL_CLEAN].[CLEAN_ITEM_VALUE]
-- Extract EB value from a longer free-text string
WHEN [PAT_EB].[EB_PATTERN_POS] > 0
THEN SUBSTRING([VAL_PADDED].[PADDED_ITEM_VALUE], [PAT_EB].[EB_PATTERN_POS] + 1, 10)
-- No valid EB found: fallback if allowed, otherwise keep original value
ELSE CASE
WHEN [CHK_SPEC].[ALLOW_FALLBACK] = 1 THEN [CHK_SPEC].[CONFIGURED_FALLBACK_ITEM_VALUE]
ELSE [OUT_RESULT_DATA].[ITEM_VALUE]
END
END AS [NORMALIZED_EB_VALUE]
) AS [NORM_EB]
--=========================================-- Default result ordering --=========================================--
ORDER BY [GROUP_COUNTER] ASC
);
/***
-- Test
SELECT * from dbo.[FNCUST_GET_EDMI_ITEM_VALUE] ('ERw202602090942454286171lfelsburg','INVOICE_TAXPOS_RATE')
***/