USE [NGB01];
GO
/****** Object: StoredProcedure [dbo].[taCalcDueDateRM] Script Date: 12/12/2025 10:23:29 AM ******/
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
ALTER PROCEDURE [dbo].[taCalcDueDateRM]
@I_vCUSTNMBR CHAR(15),
@I_vPYMTRMID CHAR(20),
@I_vDOCDATE DATETIME,
@O_dDISCDATE DATETIME OUTPUT,
@O_dDUEDATE DATETIME OUTPUT,
@O_iErrorState INT OUTPUT,
@oErrString VARCHAR(255) OUTPUT
AS
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET NOCOUNT ON;
DECLARE @iStatement INT,
@iStatus INT,
@iAddCodeErrState INT,
@sBALNCTYP SMALLINT,
@sDISCTYPE SMALLINT,
@sDISCDTDS SMALLINT,
@sDUETYPE SMALLINT,
@sDUEDTDS SMALLINT,
@dDocDateEOM DATETIME,
@dDiscDateEOM DATETIME,
@dDocDatePlus1MonthEOM DATETIME,
@dDiscDatePlus1MonthEOM DATETIME,
@dDocDatePlus1MonthFOM DATETIME,
@dDiscDatePlus1MonthFOM DATETIME,
@sDUEGRPER SMALLINT,
@sDISGRPER SMALLINT,
@tUSEGRPER TINYINT;
SELECT @O_dDISCDATE = '',
@O_dDUEDATE = '',
@iStatement = 0,
@O_iErrorState = 0,
@oErrString = ISNULL(@oErrString, '');
WHILE (@iStatement = 0)
BEGIN
IF (@I_vCUSTNMBR IS NULL OR @I_vPYMTRMID IS NULL OR @I_vDOCDATE IS NULL)
BEGIN
SELECT @O_iErrorState = 222;
EXEC @iStatus = taUpdateString @O_iErrorState,
@oErrString,
@oErrString OUTPUT,
@iAddCodeErrState OUTPUT;
END;
SELECT @I_vCUSTNMBR = UPPER(@I_vCUSTNMBR);
IF (@I_vCUSTNMBR = '')
BEGIN
SELECT @O_iErrorState = 219;
EXEC @iStatus = taUpdateString @O_iErrorState,
@oErrString,
@oErrString OUTPUT,
@iAddCodeErrState OUTPUT;
END;
IF (NOT EXISTS
(
SELECT 1
FROM RM00101 (NOLOCK)
WHERE CUSTNMBR = @I_vCUSTNMBR
)
)
BEGIN
SELECT @O_iErrorState = 221;
EXEC @iStatus = taUpdateString @O_iErrorState,
@oErrString,
@oErrString OUTPUT,
@iAddCodeErrState OUTPUT;
END;
IF (
(@I_vPYMTRMID <> '')
AND (NOT EXISTS
(
SELECT 1
FROM SY03300 (NOLOCK)
WHERE PYMTRMID = @I_vPYMTRMID
)
)
)
BEGIN
SELECT @O_iErrorState = 223;
EXEC @iStatus = taUpdateString @O_iErrorState,
@oErrString,
@oErrString OUTPUT,
@iAddCodeErrState OUTPUT;
END;
IF (@O_iErrorState <> 0)
BEGIN
BREAK;
END;
SELECT @sBALNCTYP = BALNCTYP,
@sDUEGRPER = DUEGRPER,
@sDISGRPER = DISGRPER
FROM RM00101 (NOLOCK)
WHERE CUSTNMBR = @I_vCUSTNMBR;
IF (@I_vPYMTRMID = '')
BEGIN
SELECT @O_dDISCDATE = '';
SELECT @O_dDUEDATE = '';
RETURN (@O_iErrorState);
END;
IF (@sBALNCTYP = 0)
BEGIN
SELECT @sDISCTYPE = DISCTYPE,
@sDISCDTDS = DISCDTDS,
@sDUETYPE = DUETYPE,
@sDUEDTDS = DUEDTDS,
@tUSEGRPER = USEGRPER
FROM SY03300 (NOLOCK)
WHERE PYMTRMID = @I_vPYMTRMID;
IF (@tUSEGRPER = 0)
BEGIN
SELECT @sDUEGRPER = 0,
@sDISGRPER = 0;
END;
IF (@I_vDOCDATE = '')
BEGIN
SELECT @O_dDISCDATE = '';
END;
ELSE
BEGIN
SELECT @dDocDateEOM = (DATEADD(MONTH, 1, @I_vDOCDATE)) - DATEPART(DAY, (DATEADD(MONTH, 1, @I_vDOCDATE)));
SELECT @dDocDatePlus1MonthFOM = DATEADD(DAY, 1, @dDocDateEOM);
SELECT @dDocDatePlus1MonthEOM
= (DATEADD(MONTH, 1, @dDocDatePlus1MonthFOM))
- DATEPART(DAY, (DATEADD(MONTH, 1, @dDocDatePlus1MonthFOM)));
SELECT @O_dDISCDATE
= CASE
WHEN @sDISCTYPE = 1
AND @sDISCDTDS > 0 THEN
DATEADD(DAY, @sDISCDTDS, @I_vDOCDATE)
WHEN @sDISCTYPE = 1
AND @sDISCDTDS = 0 THEN
@I_vDOCDATE
WHEN @sDISCTYPE = 2 THEN
CASE
WHEN (@dDocDateEOM - DATEPART(DAY, @dDocDateEOM) + @sDISCDTDS > @dDocDateEOM) THEN
@dDocDateEOM
ELSE
@dDocDateEOM - DATEPART(DAY, @dDocDateEOM) + @sDISCDTDS
END
WHEN @sDISCTYPE = 3 THEN
@dDocDateEOM
WHEN @sDISCTYPE = 4 THEN
@I_vDOCDATE
ELSE
@I_vDOCDATE
END;
IF (@sDISCTYPE = 2)
BEGIN
WHILE (DATEADD(DAY, @sDISGRPER, @I_vDOCDATE) >= @O_dDISCDATE)
BEGIN
SELECT @O_dDISCDATE = DATEADD(MONTH, 1, @O_dDISCDATE);
END;
END;
IF (@sDISCTYPE = 3)
BEGIN
WHILE (DATEADD(DAY, @sDISGRPER, @I_vDOCDATE) >= @O_dDISCDATE)
BEGIN
SELECT @O_dDISCDATE = DATEADD(MONTH, 1, @O_dDISCDATE);
SELECT @O_dDISCDATE
= (DATEADD(MONTH, 1, @O_dDISCDATE)) - DATEPART(DAY, (DATEADD(MONTH, 1, @O_dDISCDATE)));
END;
END;
END;
IF (@I_vDOCDATE = '')
BEGIN
SELECT @O_dDUEDATE = '';
END;
ELSE
BEGIN
SELECT @dDiscDateEOM = (DATEADD(MONTH, 1, @O_dDISCDATE)) - DATEPART(DAY, (DATEADD(MONTH, 1, @O_dDISCDATE)));
IF (@sDUETYPE = 5 AND @sDUEDTDS = 0)
BEGIN
SELECT @sDUEDTDS = DATEPART(DAY, (DATEADD(MONTH, 1, @I_vDOCDATE)));
END;
SELECT @O_dDUEDATE
= CASE @sDUETYPE
WHEN 1 THEN
CASE
WHEN (@sDISCTYPE = 1) THEN
DATEADD(DAY, @sDUEDTDS, @I_vDOCDATE)
ELSE
DATEADD(DAY, @sDUEDTDS, @O_dDISCDATE)
END
WHEN 2 THEN
CASE
WHEN (@dDiscDateEOM - DATEPART(DAY, @dDiscDateEOM) + @sDUEDTDS > @dDiscDateEOM) THEN
@dDiscDateEOM
ELSE
@dDiscDateEOM - DATEPART(DAY, @dDiscDateEOM) + @sDUEDTDS
END
WHEN 3 THEN
@dDiscDateEOM + @sDUEDTDS
WHEN 4 THEN
@I_vDOCDATE
WHEN 5 THEN
CASE
WHEN (@dDocDatePlus1MonthEOM - DATEPART(DAY, @dDocDatePlus1MonthEOM) + @sDUEDTDS > @dDocDatePlus1MonthEOM) THEN
@dDocDatePlus1MonthEOM
ELSE
@dDocDatePlus1MonthEOM - DATEPART(DAY, @dDocDatePlus1MonthEOM) + @sDUEDTDS
END
ELSE
@I_vDOCDATE
END;
IF (@sDUETYPE = 2)
BEGIN
WHILE (DATEADD(DAY, @sDUEGRPER, @O_dDISCDATE) >= @O_dDUEDATE)
BEGIN
SELECT @O_dDUEDATE = DATEADD(MONTH, 1, @O_dDUEDATE);
END;
END;
IF (@sDUETYPE = 3)
BEGIN
WHILE (DATEADD(DAY, @sDUEGRPER, @O_dDISCDATE) >= @O_dDUEDATE)
BEGIN
SELECT @O_dDUEDATE = DATEADD(MONTH, 1, @O_dDUEDATE);
SELECT @O_dDUEDATE
= (DATEADD(MONTH, 1, @O_dDUEDATE)) - DATEPART(DAY, (DATEADD(MONTH, 1, @O_dDUEDATE)));
END;
END;
IF (@sDUETYPE = 5)
BEGIN
IF (@O_dDUEDATE <= @O_dDISCDATE)
BEGIN
SELECT @O_dDUEDATE = DATEADD(MONTH, 1, @O_dDUEDATE);
END;
END;
END;
END;
ELSE
BEGIN
SELECT @O_dDISCDATE = '';
SELECT @O_dDUEDATE = @I_vDOCDATE;
END;
BREAK;
END;
RETURN (@O_iErrorState);