taCalcDueDateRM

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);

RealWorldCode gives developers practical, real‑world solutions with clean, working code — no fluff, no theory, just answers.
Links
Home
Knowledge Areas
Sitemap
Contact
Et cetera
Privacy Policy
Terms and Conditions
Cookie Preferences