taTaxEngine

SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
ALTER PROCEDURE [dbo].[taTaxEngine]
    @I_vMSTRTAXSLID CHAR(15) = '',
    @I_vMASKTAXSLID CHAR(15) = '',
    @I_vFREITAXDSLID CHAR(15) = '',
    @I_vMISCAMTTAXSLID CHAR(15) = '',
    @I_vDETAILTYPE INT = 0,
    @I_vTRXSOURCE CHAR(5) = '',
    @I_vDOCTYPE SMALLINT = 0,
    @I_vDOCNUMBE CHAR(30) = '',
    @I_vCUSTNMBR CHAR(15) = '',
    @I_vLINENUMBR NUMERIC(19, 5) = 0,
    @I_vCOST NUMERIC(19, 5) = 0,
    @I_vSALES NUMERIC(19, 5) = 0 OUTPUT,
    @I_vTRADE NUMERIC(19, 9) = 0,
    @I_vTRADEPCT NUMERIC(19, 5) = 0,
    @I_vFRTAMT NUMERIC(19, 5) = 0,
    @I_vMISCAMTAMT NUMERIC(19, 5) = 0,
    @I_vNUMUNITS NUMERIC(19, 5) = 0,
    @I_vINVOICETOTAL NUMERIC(19, 5) = 0,
    @I_vINVOICETOTTAXABLE NUMERIC(19, 5) = 0,
    @I_vDAVSALES NUMERIC(19, 5) = 0,
    @I_vDAFRTAMT NUMERIC(19, 5) = 0,
    @I_vDAMISCAMT NUMERIC(19, 5) = 0,
    @I_vITEMNMBR CHAR(30) = '',
    @I_vSLAMDUNK INT = 0,
    @I_vVATENABLED INT = 0,
    @I_vDECIMALPLACES INT = 2,
    @I_vRTCLCMTD SMALLINT = -1,
    @I_vXCHGRATE NUMERIC(19, 7) = 0,
    @I_vBACKOSALES NUMERIC(19, 5) = 0 OUTPUT,
    @I_vBACKOFREHT NUMERIC(19, 5) = 0 OUTPUT,
    @I_vBACKOMISC NUMERIC(19, 5) = 0 OUTPUT,
    @I_vBackoutTradeDisc NUMERIC(19, 5) = 0 OUTPUT,
    @I_vRECALC INT = 0 OUTPUT,
    @I_vTAXAMNT NUMERIC(19, 5) = 0 OUTPUT,
    @I_vFUTOTAMT NUMERIC(19, 5) = 0 OUTPUT,
    @I_vFRTTXAMT NUMERIC(19, 5) = 0 OUTPUT,
    @I_vMSCTXAMT NUMERIC(19, 5) = 0 OUTPUT,
    @O_iErrorState INT = NULL OUTPUT,
    @oErrString VARCHAR(255) OUTPUT
AS
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET NOCOUNT ON;
DECLARE @TAXSUM NUMERIC(19, 5),
        @TAXAMNT NUMERIC(19, 7),
        @SALES NUMERIC(19, 7),
        @iStatus INT,
        @oErrorDesc CHAR(255),
        @O_oErrorState INT,
        @TAXDTLID CHAR(15),
        @ACTINDX INT,
        @TXDTLBSE SMALLINT,
        @TXDTLPCT NUMERIC(19, 5),
        @TXDTLAMT NUMERIC(19, 7),
        @TDTLRNDG SMALLINT,
        @TXDBODTL CHAR(15),
        @TDTABMIN NUMERIC(21, 7),
        @TDTABMAX NUMERIC(21, 7),
        @TDTAXMIN NUMERIC(21, 7),
        @TDTAXMAX NUMERIC(21, 7),
        @TDRNGTYP SMALLINT,
        @TXDTQUAL SMALLINT,
        @TDTAXTAX TINYINT,
        @TDTABPCT NUMERIC(19, 5),
        @TradeTax NUMERIC(19, 7),
        @TaxableTotal NUMERIC(19, 7),
        @BKTSLSAM NUMERIC(19, 7),
        @rnd NUMERIC(19, 6),
        @pow SMALLINT,
        @dec SMALLINT,
        @fun TINYINT,
        @TaxableBase NUMERIC(19, 7),
        @TaxableBaseTemp NUMERIC(19, 7),
        @FINDBOTAX NUMERIC(19, 7),
        @TXDTOTTX NUMERIC(19, 7),
        @unitAmt NUMERIC(19, 5),
        @TaxableSum NUMERIC(19, 7),
        @COST NUMERIC(19, 7),
        @TaxableBaseNeg NUMERIC(19, 7),
        @TaxableBaseTempBO NUMERIC(19, 7),
        @unitAmtTotal NUMERIC(19, 7);
SELECT @TAXSUM = 0,
       @TAXAMNT = 0,
       @SALES = 0,
       @iStatus = 0,
       @O_oErrorState = 0,
       @TAXDTLID = '',
       @ACTINDX = 0,
       @TXDTLBSE = 0,
       @TXDTLPCT = 0,
       @TXDTLAMT = 0,
       @TDTLRNDG = 0,
       @TXDBODTL = '',
       @TDTABMIN = 0,
       @TDTABMAX = 0,
       @TDTAXMIN = 0,
       @TDTAXMAX = 0,
       @TDRNGTYP = 0,
       @TXDTQUAL = 0,
       @TDTAXTAX = 0,
       @TDTABPCT = 0,
       @TradeTax = 0,
       @TaxableTotal = 0,
       @BKTSLSAM = 0,
       @rnd = 0,
       @pow = 0,
       @dec = 0,
       @fun = 0,
       @TaxableBase = 0,
       @TaxableBaseTemp = 0,
       @FINDBOTAX = 0,
       @TXDTOTTX = 0,
       @unitAmt = 0,
       @TaxableSum = 0,
       @COST = 0,
       @TaxableBaseNeg = 0,
       @TaxableBaseTempBO = 0,
       @unitAmtTotal = 0;
IF (@oErrString IS NULL)
BEGIN
    SELECT @oErrString = '';
END;
IF (
       @I_vMSTRTAXSLID IS NULL
       OR @I_vMASKTAXSLID IS NULL
       OR @I_vFREITAXDSLID IS NULL
       OR @I_vMISCAMTTAXSLID IS NULL
       OR @I_vDETAILTYPE IS NULL
       OR @I_vTRXSOURCE IS NULL
       OR @I_vDOCTYPE IS NULL
       OR @I_vDOCNUMBE IS NULL
       OR @I_vCUSTNMBR IS NULL
       OR @I_vLINENUMBR IS NULL
       OR @I_vRECALC IS NULL
       OR @I_vCOST IS NULL
       OR @I_vSALES IS NULL
       OR @I_vTRADE IS NULL
       OR @I_vTRADEPCT IS NULL
       OR @I_vFRTAMT IS NULL
       OR @I_vMISCAMTAMT IS NULL
       OR @I_vTAXAMNT IS NULL
       OR @I_vFUTOTAMT IS NULL
       OR @I_vNUMUNITS IS NULL
       OR @I_vINVOICETOTAL IS NULL
       OR @I_vINVOICETOTTAXABLE IS NULL
       OR @I_vBACKOSALES IS NULL
       OR @I_vBACKOFREHT IS NULL
       OR @I_vBACKOMISC IS NULL
       OR @I_vBackoutTradeDisc IS NULL
       OR @I_vDAVSALES IS NULL
       OR @I_vDAFRTAMT IS NULL
       OR @I_vDAMISCAMT IS NULL
       OR @I_vITEMNMBR IS NULL
       OR @I_vDECIMALPLACES IS NULL
       OR @I_vVATENABLED IS NULL
       OR @I_vSLAMDUNK IS NULL
   )
BEGIN
    SELECT @O_iErrorState = 800;
    EXEC @iStatus = taUpdateString @O_iErrorState,
                                   @oErrString,
                                   @oErrString OUTPUT,
                                   @O_oErrorState OUTPUT;
    RETURN (@O_iErrorState);
END;
IF (
       @I_vMSTRTAXSLID = ''
       AND @I_vMASKTAXSLID = ''
       AND @I_vFREITAXDSLID = ''
       AND @I_vMISCAMTTAXSLID = ''
   )
BEGIN
    RETURN (@O_iErrorState);
END;
IF (@oErrorDesc IS NULL)
    SELECT @oErrorDesc = '';
SELECT @I_vDOCNUMBE = UPPER(@I_vDOCNUMBE),
       @I_vCUSTNMBR = UPPER(@I_vCUSTNMBR),
       @I_vMSTRTAXSLID = UPPER(@I_vMSTRTAXSLID),
       @I_vMASKTAXSLID = UPPER(@I_vMASKTAXSLID),
       @I_vFREITAXDSLID = UPPER(@I_vFREITAXDSLID),
       @I_vMISCAMTTAXSLID = UPPER(@I_vMISCAMTTAXSLID),
       @I_vITEMNMBR = UPPER(@I_vITEMNMBR);
IF (@I_vMASKTAXSLID <> '')
BEGIN
    DECLARE Line_Taxes INSENSITIVE CURSOR FOR
    SELECT a.TAXDTLID,
           a.ACTINDX,
           a.TXDTLBSE,
           a.TXDTLPCT,
           a.TXDTLAMT,
           a.TDTLRNDG,
           a.TXDBODTL,
           a.TDTABMIN,
           a.TDTABMAX,
           a.TDTAXMIN,
           a.TDTAXMAX,
           a.TDRNGTYP,
           a.TXDTQUAL,
           a.TDTAXTAX,
           a.TDTABPCT
    FROM TX00102 b (NOLOCK),
         TX00201 a (NOLOCK),
         TX00201 c (NOLOCK),
         TX00102 d (NOLOCK)
    WHERE b.TAXSCHID = @I_vMASKTAXSLID
          AND b.TAXDTLID = a.TAXDTLID
          AND a.TXDTLTYP = @I_vDETAILTYPE
          AND d.TAXSCHID = @I_vMSTRTAXSLID
          AND d.TAXDTLID = c.TAXDTLID
          AND a.TAXDTLID = c.TAXDTLID
    ORDER BY a.TXDTLBSE,
             a.TDTAXTAX,
             a.TAXDTLID;
    OPEN Line_Taxes;
    IF (@@cursor_rows > 0)
    BEGIN
        FETCH NEXT FROM Line_Taxes
        INTO @TAXDTLID,
             @ACTINDX,
             @TXDTLBSE,
             @TXDTLPCT,
             @TXDTLAMT,
             @TDTLRNDG,
             @TXDBODTL,
             @TDTABMIN,
             @TDTABMAX,
             @TDTAXMIN,
             @TDTAXMAX,
             @TDRNGTYP,
             @TXDTQUAL,
             @TDTAXTAX,
             @TDTABPCT;
        WHILE (@@fetch_status <> -1)
        BEGIN
            IF (@@fetch_status = -2)
            BEGIN
                SELECT @O_iErrorState = 810;
                EXEC @iStatus = taUpdateString @O_iErrorState,
                                               @oErrorDesc,
                                               @oErrorDesc OUTPUT,
                                               @O_oErrorState OUTPUT;
                BREAK;
            END;
            SELECT @rnd = CASE @TDTLRNDG
                              WHEN 1 THEN
                                  .5
                              WHEN 2 THEN
                                  0
                              WHEN 3 THEN
                                  -.5
                              WHEN 4 THEN
                                  1
                              WHEN 5 THEN
                                  1
                              WHEN 6 THEN
                                  -.000001
                              ELSE
                                  1
                          END;
            SELECT @pow = CASE @TDTLRNDG
                              WHEN 1 THEN
                                  @I_vDECIMALPLACES
                              WHEN 2 THEN
                                  @I_vDECIMALPLACES
                              WHEN 3 THEN
                                  @I_vDECIMALPLACES
                              WHEN 4 THEN
                                  0
                              WHEN 5 THEN
                                  1
                              WHEN 6 THEN
                                  0
                              ELSE
                                  0
                          END;
            SELECT @dec = CASE @TDTLRNDG
                              WHEN 1 THEN
                                  @I_vDECIMALPLACES
                              WHEN 2 THEN
                                  @I_vDECIMALPLACES
                              WHEN 3 THEN
                                  @I_vDECIMALPLACES
                              WHEN 4 THEN
                                  0
                              WHEN 5 THEN
                                  0
                              WHEN 6 THEN
                                  0
                              ELSE
                                  @I_vDECIMALPLACES
                          END;
            SELECT @fun = CASE @TDTLRNDG
                              WHEN 1 THEN
                                  0
                              WHEN 2 THEN
                                  0
                              WHEN 3 THEN
                                  0
                              WHEN 4 THEN
                                  1
                              WHEN 5 THEN
                                  0
                              WHEN 6 THEN
                                  1
                              ELSE
                                  0
                          END;
            IF ((@I_vXCHGRATE <> 0) AND (@I_vRTCLCMTD <> -1))
            BEGIN
                IF (@I_vRTCLCMTD = 1)
                BEGIN
                    SELECT @TDTABMIN = CASE
                                           WHEN @TDTABMIN > 0 THEN
                                               ROUND(@TDTABMIN * @I_vXCHGRATE, @I_vDECIMALPLACES)
                                           ELSE
                                               0
                                       END,
                           @TDTABMAX = CASE
                                           WHEN @TDTABMAX > 0 THEN
                                               ROUND(@TDTABMAX * @I_vXCHGRATE, @I_vDECIMALPLACES)
                                           ELSE
                                               0
                                       END,
                           @TDTAXMIN = CASE
                                           WHEN @TDTAXMIN > 0 THEN
                                               ROUND(@TDTAXMIN * @I_vXCHGRATE, @I_vDECIMALPLACES)
                                           ELSE
                                               0
                                       END,
                           @TDTAXMAX = CASE
                                           WHEN @TDTAXMAX > 0 THEN
                                               ROUND(@TDTAXMAX * @I_vXCHGRATE, @I_vDECIMALPLACES)
                                           ELSE
                                               0
                                       END,
                           @TXDTLAMT = CASE
                                           WHEN @TXDTLAMT > 0 THEN
                                               ROUND(@TXDTLAMT * @I_vXCHGRATE, @I_vDECIMALPLACES)
                                           ELSE
                                               0
                                       END;
                END;
                ELSE
                BEGIN
                    SELECT @TDTABMIN = CASE
                                           WHEN @TDTABMIN > 0 THEN
                                               ROUND(@TDTABMIN / @I_vXCHGRATE, @I_vDECIMALPLACES)
                                           ELSE
                                               0
                                       END,
                           @TDTABMAX = CASE
                                           WHEN @TDTABMAX > 0 THEN
                                               ROUND(@TDTABMAX / @I_vXCHGRATE, @I_vDECIMALPLACES)
                                           ELSE
                                               0
                                       END,
                           @TDTAXMIN = CASE
                                           WHEN @TDTAXMIN > 0 THEN
                                               ROUND(@TDTAXMIN / @I_vXCHGRATE, @I_vDECIMALPLACES)
                                           ELSE
                                               0
                                       END,
                           @TDTAXMAX = CASE
                                           WHEN @TDTAXMAX > 0 THEN
                                               ROUND(@TDTAXMAX / @I_vXCHGRATE, @I_vDECIMALPLACES)
                                           ELSE
                                               0
                                       END,
                           @TXDTLAMT = CASE
                                           WHEN @TXDTLAMT > 0 THEN
                                               ROUND(@TXDTLAMT / @I_vXCHGRATE, @I_vDECIMALPLACES)
                                           ELSE
                                               0
                                       END;
                END;
            END;
            SELECT @TaxableBase = 0,
                   @TaxableBaseTemp = 0,
                   @TaxableBaseNeg = 0,
                   @SALES = 0;
            IF (@TXDTLBSE = 5)
            BEGIN
                SELECT @FINDBOTAX = 0;
                SELECT @FINDBOTAX = ISNULL(ORSLSTAX, 0)
                FROM SOP10105 (NOLOCK)
                WHERE SOPTYPE = @I_vDOCTYPE
                      AND SOPNUMBE = @I_vDOCNUMBE
                      AND LNITMSEQ = @I_vLINENUMBR
                      AND TAXDTLID = @TXDBODTL;
                SELECT @TaxableBase = @FINDBOTAX;
            END;
            ELSE IF (@TXDTLBSE = 4)
            BEGIN
                SELECT @TaxableBase = ROUND(@I_vCOST * @I_vNUMUNITS, @I_vDECIMALPLACES);
            END;
            ELSE
            BEGIN
                SELECT @TaxableBase = @I_vSALES;
            END;
            IF (@TDTABPCT > 0)
            BEGIN
                SELECT @TaxableBase = ROUND(@TaxableBase * (@TDTABPCT / 100), @I_vDECIMALPLACES);
            END;
            SELECT @TaxableBaseTemp = ABS(@TaxableBase);
            SELECT @unitAmt = 0;
            SELECT @unitAmtTotal = @TaxableBaseTemp;
            IF ((@TDTABMIN > 0) OR (@TDTABMAX > 0))
            BEGIN
                IF (@TXDTQUAL = 1)
                BEGIN
                    IF (@I_vNUMUNITS <> 0)
                    BEGIN
                        SELECT @unitAmt = @TaxableBaseTemp / @I_vNUMUNITS;
                    END;
                    IF (ABS(@unitAmt) < @TDTABMIN)
                    BEGIN
                        SELECT @TaxableBaseTemp = 0;
                    END;
                    ELSE
                    BEGIN
                        IF (@TDRNGTYP = 1)
                        BEGIN
                            IF (@TDTABMAX > 0)
                               AND (ABS(@unitAmt) > @TDTABMAX)
                            BEGIN
                                SELECT @unitAmt = @TDTABMAX;
                                SELECT @TaxableBaseTemp = ROUND(@unitAmt * ABS(@I_vNUMUNITS), @I_vDECIMALPLACES);
                            END;
                        END;
                        ELSE
                        BEGIN
                            IF (@TDTABMAX > 0)
                               AND (ABS(@unitAmt) > @TDTABMAX)
                            BEGIN
                                SELECT @unitAmt = @TDTABMAX - @TDTABMIN;
                            END;
                            ELSE
                            BEGIN
                                SELECT @unitAmt = ABS(@unitAmt) - @TDTABMIN;
                            END;
                            SELECT @TaxableBaseTemp = ROUND(@unitAmt * ABS(@I_vNUMUNITS), @I_vDECIMALPLACES);
                        END;
                    END;
                END;
                ELSE
                BEGIN
                    IF (@TXDTQUAL = 2)
                    BEGIN
                        IF (@TaxableBaseTemp < @TDTABMIN)
                        BEGIN
                            IF (@TaxableBase < 0)
                            BEGIN
                                SELECT @TaxableBaseNeg = @TaxableBase;
                            END;
                            SELECT @TaxableBaseTemp = 0;
                        END;
                        ELSE
                        BEGIN
                            IF (@TDRNGTYP = 1)
                            BEGIN
                                IF ((@TDTABMAX > 0) AND (@TaxableBaseTemp > @TDTABMAX))
                                BEGIN
                                    SELECT @TaxableBaseNeg = @TaxableBase;
                                    SELECT @TaxableBaseTemp = @TDTABMAX;
                                END;
                            END;
                            ELSE
                            BEGIN
                                IF ((@TDTABMAX > 0) AND (@TaxableBaseTemp > @TDTABMAX))
                                BEGIN
                                    SELECT @TaxableBaseTemp = @TDTABMAX - @TDTABMIN;
                                END;
                                ELSE
                                BEGIN
                                    SELECT @TaxableBaseTemp = @TaxableBaseTemp - @TDTABMIN;
                                END;
                            END;
                        END;
                    END;
                    ELSE
                    BEGIN
                        IF (@TXDTQUAL = 3)
                        BEGIN
                            SELECT @TaxableSum = ISNULL(SUM(ORTXSLS), 0)
                            FROM SOP10105 (NOLOCK)
                            WHERE SOPTYPE = @I_vDOCTYPE
                                  AND SOPNUMBE = @I_vDOCNUMBE
                                  AND LNITMSEQ <> 0
                                  AND TAXDTLID = @TAXDTLID;
                            IF (ABS(@I_vINVOICETOTAL) < @TDTABMIN)
                            BEGIN
                                SELECT @TaxableBaseTemp = 0;
                            END;
                            ELSE
                            BEGIN
                                IF (@I_vINVOICETOTAL >= 0)
                                BEGIN
                                    IF (@TaxableBase < 0)
                                    BEGIN
                                        IF (@TaxableBase < 0)
                                           AND (@TDTABMAX > 0)
                                        BEGIN
                                            SELECT @TaxableBaseTemp = 0;
                                        END;
                                    END;
                                    ELSE
                                    BEGIN
                                        IF ((@TDTABMAX > 0) AND (@TaxableBase + @TaxableSum > @TDTABMAX))
                                        BEGIN
                                            IF ((@TDTABMAX - @TaxableSum) > 0)
                                                SELECT @TaxableBaseTemp = (@TDTABMAX - @TaxableSum);
                                            ELSE
                                                SELECT @TaxableBaseTemp = 0;
                                        END;
                                        IF ((@TDTABMAX > 0) AND (@I_vINVOICETOTAL < 0))
                                        BEGIN
                                            IF ((@TaxableBaseTemp + @TaxableSum) > @I_vINVOICETOTAL)
                                            BEGIN
                                                IF ((@I_vINVOICETOTAL - @TaxableSum) > 0)
                                                    SELECT @TaxableBaseTemp = (@I_vINVOICETOTAL - @TaxableSum);
                                                ELSE
                                                    SELECT @TaxableBaseTemp = 0;
                                            END;
                                        END;
                                    END;
                                END;
                                ELSE
                                BEGIN
                                    IF (@TaxableBase > 0)
                                    BEGIN
                                        IF ((@TaxableBase > 0) AND (@TDTABMAX > 0))
                                        BEGIN
                                            SELECT @TaxableBaseTemp = 0;
                                        END;
                                    END;
                                    ELSE
                                    BEGIN
                                        IF ((@TDTABMAX > 0) AND (ABS(@TaxableSum + @TaxableBase) > @TDTABMAX))
                                        BEGIN
                                            IF ((@TDTABMAX - ABS(@TaxableSum)) > 0)
                                                SELECT @TaxableBaseTemp = (@TDTABMAX - ABS(@TaxableSum));
                                            ELSE
                                                SELECT @TaxableBaseTemp = 0;
                                        END;
                                        IF ((@TDTABMAX > 0) AND (@I_vINVOICETOTAL < 0))
                                        BEGIN
                                            IF ((@TaxableBaseTemp + ABS(@TaxableSum)) > ABS(@I_vINVOICETOTAL))
                                            BEGIN
                                                IF ((ABS(@I_vINVOICETOTAL) - ABS(@TaxableSum)) > 0)
                                                    SELECT @TaxableBaseTemp
                                                        = (ABS(@I_vINVOICETOTAL) - ABS(@TaxableSum));
                                                ELSE
                                                    SELECT @TaxableBaseTemp = 0;
                                            END;
                                        END;
                                    END;
                                END;
                            END;
                        END;
                        ELSE
                        BEGIN
                            IF (@TaxableBaseTemp < @TDTABMIN)
                            BEGIN
                                IF (@TXDTLBSE = 5)
                                BEGIN
                                    SELECT @TaxableBaseTempBO = @TaxableBaseTemp;
                                END;
                                SELECT @TaxableBaseTemp = 0;
                            END;
                            ELSE
                            BEGIN
                                IF (@TDRNGTYP = 1)
                                BEGIN
                                    IF ((@TDTABMAX > 0) AND (@TaxableBaseTemp > @TDTABMAX))
                                    BEGIN
                                        SELECT @TaxableBaseTemp = @TDTABMAX;
                                    END;
                                END;
                                ELSE
                                BEGIN
                                    IF ((@TDTABMAX > 0) AND (@TaxableBaseTemp > @TDTABMAX))
                                    BEGIN
                                        SELECT @TaxableBaseTemp = @TDTABMAX - @TDTABMIN;
                                    END;
                                    ELSE
                                    BEGIN
                                        SELECT @TaxableBaseTemp = @TaxableBaseTemp - @TDTABMIN;
                                    END;
                                END;
                            END;
                        END;
                    END;
                END;
            END;
            IF (@TaxableBase < 0)
            BEGIN
                SELECT @TaxableBase = @TaxableBaseTemp * -1,
                       @TaxableBaseTempBO = @TaxableBaseTempBO * -1;
            END;
            ELSE
            BEGIN
                SELECT @TaxableBase = @TaxableBaseTemp;
            END;
            IF (@TXDTLBSE = 1)
            BEGIN
                SELECT @SALES = @TaxableBase;
                SELECT @TaxableBase = ROUND(@TaxableBase / (@TXDTLPCT * .01 + 1), 7);
                SELECT @TradeTax = (@I_vTRADE / (@TXDTLPCT * .01 + 1)) * (@TXDTLPCT * .01);
                IF (@TradeTax <> ROUND(@TradeTax, @I_vDECIMALPLACES, 1))
                BEGIN
                    SELECT @TradeTax = CASE
                                           WHEN (@TradeTax < (.5 / POWER(10, @I_vDECIMALPLACES))) THEN
                                               0
                                           ELSE
                                               ROUND(@TradeTax + (@rnd / POWER(10, @pow)), @dec, @fun)
                                       END;
                END;
                SELECT @I_vBackoutTradeDisc = ROUND(@I_vTRADE - @TradeTax, @I_vDECIMALPLACES);
                SELECT @I_vTRADE = @I_vBackoutTradeDisc;
                SELECT @TAXAMNT = (@TaxableBase * (@TXDTLPCT * .01));
                IF (@TAXAMNT <> ROUND(@TAXAMNT, @I_vDECIMALPLACES, 1))
                BEGIN
                    SELECT @TAXAMNT = ROUND(@TAXAMNT + (@rnd / POWER(10, @pow)), @dec, @fun);
                END;
                SELECT @SALES = ROUND(@SALES - @TAXAMNT, @I_vDECIMALPLACES);
                SELECT @TaxableBase = @SALES;
                SELECT @TaxableBaseTemp = @TaxableBase;
                SELECT @I_vSALES = @I_vSALES - @TAXAMNT;
            END;
            ELSE IF (@TXDTLBSE = 2)
            BEGIN
                SELECT @TAXAMNT = ROUND(@I_vNUMUNITS * @TXDTLAMT, 7);
                SELECT @SALES = @TaxableBase;
            END;
            ELSE IF (@TXDTLBSE = 3)
            BEGIN
                SELECT @TAXAMNT = ROUND(@TaxableBase * @TXDTLPCT * .01, 7);
                SELECT @SALES = @TaxableBase;
            END;
            ELSE IF (@TXDTLBSE = 4)
            BEGIN
                SELECT @TAXAMNT = ROUND(@TaxableBase * @TXDTLPCT * .01, 7);
                SELECT @SALES = @TaxableBase;
                IF (
                       @TAXAMNT <> ROUND(@TAXAMNT, 0, 1)
                       AND @TDTLRNDG IN ( 2, 4, 5, 6 )
                       OR
                       (
                           @TAXAMNT <> ROUND(@TAXAMNT, @I_vDECIMALPLACES)
                           AND @TDTLRNDG NOT IN ( 4, 5, 6 )
                       )
                   )
                BEGIN
                    IF (@TAXAMNT >= 0)
                    BEGIN
                        SELECT @TXDTOTTX = ROUND(@TAXAMNT + (@rnd / POWER(10, @pow)), @dec, @fun);
                    END;
                    ELSE
                    BEGIN
                        SELECT @TXDTOTTX = ROUND(@TAXAMNT - (@rnd / POWER(10, @pow)), @dec, @fun);
                    END;
                END;
                ELSE
                BEGIN
                    SELECT @TXDTOTTX = @TAXAMNT;
                END;
                IF (@TAXAMNT < 0)
                   AND (ABS(@TAXAMNT) <= @TDTAXMIN)
                   AND (@I_vINVOICETOTAL > 0)
                BEGIN
                    SELECT @TAXAMNT = 0;
                END;
            END;
            ELSE IF (@TXDTLBSE = 5)
            BEGIN
                SELECT @TAXAMNT = @TaxableBase * @TXDTLPCT * .01;
                IF (@TAXAMNT <> ROUND(@TAXAMNT, @I_vDECIMALPLACES, 1))
                BEGIN
                    IF (@TAXAMNT >= 0)
                    BEGIN
                        SELECT @TAXAMNT = ROUND(@TAXAMNT + (@rnd / POWER(10, @pow)), @dec, @fun);
                    END;
                    ELSE
                    BEGIN
                        SELECT @TAXAMNT = ROUND(@TAXAMNT - (@rnd / POWER(10, @pow)), @dec, @fun);
                    END;
                END;
                SELECT @SALES = @TaxableBase;
            END;
            IF (@TDTAXTAX = 1)
            BEGIN
                IF (
                       @TAXAMNT <> ROUND(@TAXAMNT, 0, 1)
                       AND @TDTLRNDG IN ( 2, 4, 5, 6 )
                       OR
                       (
                           @TAXAMNT <> ROUND(@TAXAMNT, @I_vDECIMALPLACES)
                           AND @TDTLRNDG NOT IN ( 4, 5, 6 )
                       )
                   )
                BEGIN
                    IF (@TaxableTotal >= 0)
                    BEGIN
                        SELECT @TaxableTotal = @TaxableTotal + ROUND(@TAXAMNT + (@rnd / POWER(10, @pow)), @dec, @fun);
                    END;
                    ELSE
                    BEGIN
                        SELECT @TaxableTotal = @TaxableTotal + ROUND(@TAXAMNT - (@rnd / POWER(10, @pow)), @dec, @fun);
                    END;
                END;
                ELSE
                BEGIN
                    SELECT @TaxableTotal = @TaxableTotal + @TAXAMNT;
                END;
            END;
            IF (@TXDTLBSE = 6)
            BEGIN
                IF (@TaxableBase >= 0)
                BEGIN
                    SELECT @TaxableBaseTemp = ROUND(@TaxableTotal + @TaxableBaseTemp, @I_vDECIMALPLACES);
                END;
                ELSE
                BEGIN
                    IF (@TaxableBase < 0 AND @I_vSALES < 0)
                    BEGIN
                        SELECT @TaxableBaseTemp = ROUND((@TaxableBaseTemp * -1) + @TaxableTotal, @I_vDECIMALPLACES);
                    END;
                    ELSE
                    BEGIN
                        SELECT @TaxableBaseTemp = ROUND(@TaxableBaseTemp - @TaxableTotal, @I_vDECIMALPLACES);
                    END;
                END;
                IF (@TaxableBase <> @SALES)
                   AND
                   (
                       @TDTABMAX = @TaxableBase
                       OR @TaxableBase <= @TDTABMAX - @TDTABMIN
                   )
                BEGIN
                    IF (@TaxableBase = @TDTABMAX OR (@TaxableBase + @TaxableSum) = @TDTABMAX)
                    BEGIN
                        SELECT @SALES = @TaxableBase;
                    END;
                    ELSE
                    BEGIN
                        SELECT @SALES = @TaxableBaseTemp;
                        SELECT @TaxableBase = @SALES;
                    END;
                END;
                ELSE
                BEGIN
                    IF (
                           @SALES = 0
                           AND @TaxableBase = 0
                           AND @TXDTQUAL = 3
                           AND @TDRNGTYP = 2
                           AND ((@TaxableSum + @TaxableTotal) >= @TDTABMAX)
                       )
                    BEGIN
                        SELECT @SALES = 0,
                               @TaxableBase = 0;
                    END;
                    ELSE
                    BEGIN
                        SELECT @SALES = ROUND(@TaxableTotal + @TaxableBase, 7);
                        SELECT @TaxableBase = ROUND(@TaxableTotal + @TaxableBase, @I_vDECIMALPLACES);
                    END;
                END;
                SELECT @TAXAMNT = ROUND((@SALES * @TXDTLPCT * .01), 7);
                SELECT @SALES = ROUND(@SALES, @I_vDECIMALPLACES);
            END;
            IF (@TXDTLBSE = 6)
            BEGIN
                IF (
                       (
                       (
                           @TXDTQUAL = 3
                           AND ABS(@I_vINVOICETOTAL) < @TDTABMIN
                       )
                       )
                       OR
                       (
                           (@TXDTQUAL = 2)
                           AND (ABS(@SALES) < @TDTABMIN)
                       )
                       OR
                       (
                           (
                               @TXDTQUAL = 1
                               AND @TDRNGTYP = 2
                           )
                           AND (ABS(@unitAmtTotal) < @TDTABMIN)
                       )
                       OR
                       (
                           (
                               @TXDTQUAL = 1
                               AND @TDRNGTYP = 1
                           )
                           AND (ABS(@unitAmt) < @TDTABMIN)
                       )
                   )
                BEGIN
                    SELECT @TAXAMNT = 0;
                    SELECT @TaxableBase = 0;
                END;
            END;
            IF (
                   @TAXAMNT <> ROUND(@TAXAMNT, 0, 1)
                   AND @TDTLRNDG IN ( 4, 5, 6 )
                   OR
                   (
                       @TAXAMNT <> ROUND(@TAXAMNT, @I_vDECIMALPLACES)
                       AND @TDTLRNDG NOT IN ( 4, 5, 6 )
                   )
               )
            BEGIN
                IF @TAXAMNT > 0
                BEGIN
                    SELECT @TAXAMNT = ROUND(@TAXAMNT + (@rnd / POWER(10, @pow)), @dec, @fun);
                END;
                ELSE
                BEGIN
                    SELECT @TAXAMNT = ROUND(@TAXAMNT - (@rnd / POWER(10, @pow)), @dec, @fun);
                END;
            END;
            IF (@TXDTLBSE <> 4)
            BEGIN
                SELECT @TXDTOTTX = @TAXAMNT;
            END;
            SELECT @TAXSUM = ISNULL(TAXSUM, 0)
            FROM #minmax
            WHERE TAXDTLID = @TAXDTLID;
            IF (
                   (@TDTAXMAX < (ABS(@TAXAMNT) + @TAXSUM))
                   AND (@TDTAXMAX <> 0)
                   AND (@TaxableBase <> 0)
               )
            BEGIN
                SELECT @TAXAMNT = CASE
                                      WHEN @TAXAMNT < 0 THEN
                    (@TDTAXMAX - @TAXSUM) * -1
                                      ELSE
                                          @TDTAXMAX - @TAXSUM
                                  END;
            END;
            IF (ABS(@TAXAMNT) > ABS(@TXDTOTTX))
            BEGIN
                SELECT @TAXAMNT = @TXDTOTTX;
            END;
            IF ((@TDTAXMAX > 0) OR (@TDTAXMIN > 0))
            BEGIN
                IF NOT EXISTS (SELECT TAXDTLID FROM #minmax WHERE TAXDTLID = @TAXDTLID)
                BEGIN
                    INSERT #minmax
                    SELECT @TAXDTLID,
                           @TAXAMNT,
                           @TDTAXMAX,
                           @TDTAXMIN,
                           @TAXAMNT;
                END;
                ELSE
                BEGIN
                    UPDATE #minmax
                    SET TAXSUM = TAXSUM + @TAXAMNT,
                        LINESUM = LINESUM + @TAXAMNT
                    WHERE TAXDTLID = @TAXDTLID;
                END;
            END;
            IF (@TXDTLBSE = 1)
            BEGIN
                SELECT @I_vBACKOSALES = @I_vBACKOSALES + @TAXAMNT;
            END;
            ELSE
            BEGIN
                SELECT @I_vTAXAMNT = @I_vTAXAMNT + @TAXAMNT;
            END;
            IF (@I_vTRADE > 0)
            BEGIN
                IF (@BKTSLSAM > 0)
                   AND (@I_vBackoutTradeDisc = 0)
                BEGIN
                    SELECT @I_vBackoutTradeDisc = @BKTSLSAM - @TaxableBase;
                END;
            END;
            ELSE
            BEGIN
                SELECT @BKTSLSAM = @TaxableBase;
            END;
            IF ((@TaxableBaseTemp > 0) AND (@TXDTLBSE <> 4))
            BEGIN
                IF (@TaxableBase < 0)
                BEGIN
                    SELECT @SALES = @TaxableBaseTemp * -1;
                END;
                ELSE
                BEGIN
                    SELECT @SALES = @TaxableBaseTemp;
                END;
            END;
            IF (@TaxableBaseNeg < 0)
            BEGIN
                SELECT @SALES = @TaxableBaseNeg;
            END;
            IF ((@TXDTOTTX < 0) AND (@TaxableBaseNeg = 0))
            BEGIN
                IF (@SALES > 0)
                BEGIN
                    SELECT @SALES = @SALES * -1;
                END;
            END;
            IF (((@TDTABMAX > 0) OR (@TDTABMIN > 0)) AND (@TXDTLBSE <> 5))
            BEGIN
                IF (@TXDTLBSE = 4)
                BEGIN
                    SELECT @SALES = ROUND(@I_vCOST * @I_vNUMUNITS, @I_vDECIMALPLACES);
                END;
                ELSE
                BEGIN
                    IF (@TXDTLBSE <> 6)
                    BEGIN
                        SELECT @SALES = @I_vSALES;
                    END;
                    ELSE
                    BEGIN
                        SELECT @SALES = @I_vSALES + @TaxableTotal;
                    END;
                END;
            END;
            ELSE
            BEGIN
                IF (((@TDTABMAX > 0) OR (@TDTABMIN > 0)) AND (@TXDTLBSE = 5))
                BEGIN
                    SELECT @SALES = @FINDBOTAX;
                END;
            END;
            IF (@TaxableBaseTempBO <> 0)
            BEGIN
                SELECT @SALES = @TaxableBaseTempBO;
            END;
            SELECT @TaxableBaseNeg = 0,
                   @TaxableBaseTempBO = 0;
            IF (@I_vTRXSOURCE = 'SLSTE')
            BEGIN
                IF (@ACTINDX = 0)
                BEGIN
                    SELECT @ACTINDX = ACTINDX
                    FROM SY01100 (NOLOCK)
                    WHERE SERIES = 3
                          AND SEQNUMBR = 2000;
                END;
                EXEC @iStatus = taSopLineIvcTaxInsert @I_vSOPTYPE = @I_vDOCTYPE,
                                                      @I_vTAXTYPE = 0,
                                                      @I_vSOPNUMBE = @I_vDOCNUMBE,
                                                      @I_vCUSTNMBR = @I_vCUSTNMBR,
                                                      @I_vLNITMSEQ = @I_vLINENUMBR,
                                                      @I_vSALESAMT = @SALES,
                                                      @I_vFRTTXAMT = 0,
                                                      @I_vMSCTXAMT = 0,
                                                      @I_vFREIGHT = 0,
                                                      @I_vMISCAMNT = 0,
                                                      @I_vTDTTXSLS = @TaxableBase,
                                                      @I_vTAXDTLID = @TAXDTLID,
                                                      @I_vACTINDX = @ACTINDX,
                                                      @I_vACTNUMST = '',
                                                      @I_vSTAXAMNT = @TAXAMNT,
                                                      @I_vTXDTOTTX = @TXDTOTTX,
                                                      @O_iErrorState = @O_iErrorState OUTPUT,
                                                      @oErrString = @oErrString OUTPUT;
                IF ((@@error <> 0) OR (@iStatus <> 0) OR (@O_iErrorState <> 0))
                BEGIN
                    SELECT @O_iErrorState = 820;
                    EXEC @iStatus = taUpdateString @O_iErrorState,
                                                   @oErrString,
                                                   @oErrString OUTPUT,
                                                   @O_oErrorState OUTPUT;
                    BREAK;
                END;
            END;
            IF (@I_vTRXSOURCE = 'CMRCE')
            BEGIN
                EXEC @iStatus = taCommerceTaxInsert @I_vSOPTYPE = @I_vDOCTYPE,
                                                    @I_vTAXTYPE = 0,
                                                    @I_vSOPNUMBE = @I_vDOCNUMBE,
                                                    @I_vCUSTNMBR = @I_vCUSTNMBR,
                                                    @I_vLNITMSEQ = @I_vLINENUMBR,
                                                    @I_vSALESAMT = @SALES,
                                                    @I_vFRTTXAMT = 0,
                                                    @I_vMSCTXAMT = 0,
                                                    @I_vFREIGHT = 0,
                                                    @I_vMISCAMNT = 0,
                                                    @I_vTDTTXSLS = @TaxableBase,
                                                    @I_vTAXDTLID = @TAXDTLID,
                                                    @I_vACTINDX = @ACTINDX,
                                                    @I_vACTNUMST = '',
                                                    @I_vSTAXAMNT = @TAXAMNT,
                                                    @I_vTXDTOTTX = @TXDTOTTX,
                                                    @O_iErrorState = @O_iErrorState OUTPUT,
                                                    @oErrString = @oErrString OUTPUT;
                IF ((@@error <> 0) OR (@iStatus <> 0) OR (@O_iErrorState <> 0))
                BEGIN
                    SELECT @O_iErrorState = 9382;
                    EXEC @iStatus = taUpdateString @O_iErrorState,
                                                   @oErrString,
                                                   @oErrString OUTPUT,
                                                   @O_oErrorState OUTPUT;
                    BREAK;
                END;
            END;
            FETCH NEXT FROM Line_Taxes
            INTO @TAXDTLID,
                 @ACTINDX,
                 @TXDTLBSE,
                 @TXDTLPCT,
                 @TXDTLAMT,
                 @TDTLRNDG,
                 @TXDBODTL,
                 @TDTABMIN,
                 @TDTABMAX,
                 @TDTAXMIN,
                 @TDTAXMAX,
                 @TDRNGTYP,
                 @TXDTQUAL,
                 @TDTAXTAX,
                 @TDTABPCT;
        END;
    END;
    DEALLOCATE Line_Taxes;
END;
IF (@I_vMISCAMTTAXSLID <> '')
BEGIN
    DECLARE Misc_Taxes INSENSITIVE CURSOR FOR
    SELECT a.TAXDTLID,
           a.ACTINDX,
           a.TXDTLBSE,
           a.TXDTLPCT,
           a.TXDTLAMT,
           a.TDTLRNDG,
           a.TXDBODTL,
           a.TDTABMIN,
           a.TDTABMAX,
           a.TDTAXMIN,
           a.TDTAXMAX,
           a.TDRNGTYP,
           a.TXDTQUAL,
           a.TDTAXTAX,
           a.TDTABPCT
    FROM TX00102 b (NOLOCK),
         TX00201 a (NOLOCK),
         TX00201 c (NOLOCK),
         TX00102 d (NOLOCK)
    WHERE b.TAXSCHID = @I_vMISCAMTTAXSLID
          AND b.TAXDTLID = a.TAXDTLID
          AND a.TXDTLTYP = @I_vDETAILTYPE
          AND @I_vMISCAMTTAXSLID <> ''
          AND d.TAXSCHID = @I_vMSTRTAXSLID
          AND d.TAXDTLID = c.TAXDTLID
          AND a.TAXDTLID = c.TAXDTLID
    ORDER BY a.TXDTLBSE,
             a.TDTAXTAX,
             a.TAXDTLID;
    OPEN Misc_Taxes;
    IF (@@cursor_rows > 0)
    BEGIN
        FETCH NEXT FROM Misc_Taxes
        INTO @TAXDTLID,
             @ACTINDX,
             @TXDTLBSE,
             @TXDTLPCT,
             @TXDTLAMT,
             @TDTLRNDG,
             @TXDBODTL,
             @TDTABMIN,
             @TDTABMAX,
             @TDTAXMIN,
             @TDTAXMAX,
             @TDRNGTYP,
             @TXDTQUAL,
             @TDTAXTAX,
             @TDTABPCT;
        WHILE (@@fetch_status <> -1)
        BEGIN
            IF (@@fetch_status = -2)
            BEGIN
                SELECT @O_iErrorState = 822;
                EXEC @iStatus = taUpdateString @O_iErrorState,
                                               @oErrorDesc,
                                               @oErrorDesc OUTPUT,
                                               @O_oErrorState OUTPUT;
                BREAK;
            END;
            SELECT @rnd = CASE @TDTLRNDG
                              WHEN 1 THEN
                                  .5
                              WHEN 2 THEN
                                  0
                              WHEN 3 THEN
                                  -.5
                              WHEN 4 THEN
                                  1
                              WHEN 5 THEN
                                  1
                              WHEN 6 THEN
                                  -.000001
                              ELSE
                                  1
                          END;
            SELECT @pow = CASE @TDTLRNDG
                              WHEN 1 THEN
                                  @I_vDECIMALPLACES
                              WHEN 2 THEN
                                  @I_vDECIMALPLACES
                              WHEN 3 THEN
                                  @I_vDECIMALPLACES
                              WHEN 4 THEN
                                  0
                              WHEN 5 THEN
                                  1
                              WHEN 6 THEN
                                  0
                              ELSE
                                  0
                          END;
            SELECT @dec = CASE @TDTLRNDG
                              WHEN 1 THEN
                                  @I_vDECIMALPLACES
                              WHEN 2 THEN
                                  @I_vDECIMALPLACES
                              WHEN 3 THEN
                                  @I_vDECIMALPLACES
                              WHEN 4 THEN
                                  0
                              WHEN 5 THEN
                                  0
                              WHEN 6 THEN
                                  0
                              ELSE
                                  @I_vDECIMALPLACES
                          END;
            SELECT @fun = CASE @TDTLRNDG
                              WHEN 1 THEN
                                  0
                              WHEN 2 THEN
                                  0
                              WHEN 3 THEN
                                  0
                              WHEN 4 THEN
                                  1
                              WHEN 5 THEN
                                  0
                              WHEN 6 THEN
                                  1
                              ELSE
                                  0
                          END;
            IF ((@I_vXCHGRATE <> 0) AND (@I_vRTCLCMTD <> -1))
            BEGIN
                IF (@I_vRTCLCMTD = 1)
                BEGIN
                    SELECT @TDTABMIN = CASE
                                           WHEN @TDTABMIN > 0 THEN
                                               ROUND(@TDTABMIN * @I_vXCHGRATE, @I_vDECIMALPLACES)
                                           ELSE
                                               0
                                       END,
                           @TDTABMAX = CASE
                                           WHEN @TDTABMAX > 0 THEN
                                               ROUND(@TDTABMAX * @I_vXCHGRATE, @I_vDECIMALPLACES)
                                           ELSE
                                               0
                                       END,
                           @TDTAXMIN = CASE
                                           WHEN @TDTAXMIN > 0 THEN
                                               ROUND(@TDTAXMIN * @I_vXCHGRATE, @I_vDECIMALPLACES)
                                           ELSE
                                               0
                                       END,
                           @TDTAXMAX = CASE
                                           WHEN @TDTAXMAX > 0 THEN
                                               ROUND(@TDTAXMAX * @I_vXCHGRATE, @I_vDECIMALPLACES)
                                           ELSE
                                               0
                                       END,
                           @TXDTLAMT = CASE
                                           WHEN @TXDTLAMT > 0 THEN
                                               ROUND(@TXDTLAMT * @I_vXCHGRATE, @I_vDECIMALPLACES)
                                           ELSE
                                               0
                                       END;
                END;
                ELSE
                BEGIN
                    SELECT @TDTABMIN = CASE
                                           WHEN @TDTABMIN > 0 THEN
                                               ROUND(@TDTABMIN / @I_vXCHGRATE, @I_vDECIMALPLACES)
                                           ELSE
                                               0
                                       END,
                           @TDTABMAX = CASE
                                           WHEN @TDTABMAX > 0 THEN
                                               ROUND(@TDTABMAX / @I_vXCHGRATE, @I_vDECIMALPLACES)
                                           ELSE
                                               0
                                       END,
                           @TDTAXMIN = CASE
                                           WHEN @TDTAXMIN > 0 THEN
                                               ROUND(@TDTAXMIN / @I_vXCHGRATE, @I_vDECIMALPLACES)
                                           ELSE
                                               0
                                       END,
                           @TDTAXMAX = CASE
                                           WHEN @TDTAXMAX > 0 THEN
                                               ROUND(@TDTAXMAX / @I_vXCHGRATE, @I_vDECIMALPLACES)
                                           ELSE
                                               0
                                       END,
                           @TXDTLAMT = CASE
                                           WHEN @TXDTLAMT > 0 THEN
                                               ROUND(@TXDTLAMT / @I_vXCHGRATE, @I_vDECIMALPLACES)
                                           ELSE
                                               0
                                       END;
                END;
            END;
            SELECT @TaxableBase = 0,
                   @TaxableBaseTemp = 0,
                   @SALES = 0;
            IF (@TXDTLBSE = 5)
            BEGIN
                SELECT @FINDBOTAX = 0;
                SELECT @FINDBOTAX = ISNULL(ORMSCTAX, 0)
                FROM SOP10105 (NOLOCK)
                WHERE SOPTYPE = @I_vDOCTYPE
                      AND SOPNUMBE = @I_vDOCNUMBE
                      AND LNITMSEQ = 2147483645
                      AND TAXDTLID = @TXDBODTL;
                SELECT @TaxableBase = @FINDBOTAX;
            END;
            ELSE IF (@TXDTLBSE = 4)
            BEGIN
                SELECT @TaxableBase = 0;
            END;
            ELSE
            BEGIN
                SELECT @TaxableBase = @I_vMISCAMTAMT;
            END;
            IF (@TDTABPCT > 0)
            BEGIN
                SELECT @TaxableBase = ROUND(@TaxableBase * (@TDTABPCT / 100), @I_vDECIMALPLACES);
            END;
            SELECT @TaxableBaseTemp = ABS(@TaxableBase);
            SELECT @unitAmt = 0;
            IF ((@TDTABMIN > 0) OR (@TDTABMAX > 0))
            BEGIN
                IF (@TXDTQUAL = 1)
                BEGIN
                    IF (@I_vNUMUNITS <> 0)
                    BEGIN
                        SELECT @unitAmt = @TaxableBaseTemp / @I_vNUMUNITS;
                    END;
                    IF (ABS(@unitAmt) < @TDTABMIN)
                    BEGIN
                        SELECT @TaxableBaseTemp = 0;
                    END;
                    ELSE
                    BEGIN
                        IF (@TDRNGTYP = 1)
                        BEGIN
                            IF (@TDTABMAX > 0)
                               AND (ABS(@unitAmt) > @TDTABMAX)
                            BEGIN
                                SELECT @unitAmt = @TDTABMAX;
                                SELECT @TaxableBaseTemp = ROUND(@unitAmt * ABS(@I_vNUMUNITS), @I_vDECIMALPLACES);
                            END;
                        END;
                        ELSE
                        BEGIN
                            IF (@TDTABMAX > 0)
                               AND (ABS(@unitAmt) > @TDTABMAX)
                            BEGIN
                                SELECT @unitAmt = @TDTABMAX - @TDTABMIN;
                            END;
                            ELSE
                            BEGIN
                                SELECT @unitAmt = ABS(@unitAmt) - @TDTABMIN;
                            END;
                            SELECT @TaxableBaseTemp = ROUND(@unitAmt * ABS(@I_vNUMUNITS), @I_vDECIMALPLACES);
                        END;
                    END;
                END;
                ELSE
                BEGIN
                    IF (@TXDTQUAL = 2)
                    BEGIN
                        IF (@TaxableBaseTemp < @TDTABMIN)
                        BEGIN
                            IF (@TaxableBase < 0)
                            BEGIN
                                SELECT @TaxableBaseNeg = @TaxableBase;
                            END;
                            SELECT @TaxableBaseTemp = 0;
                        END;
                        ELSE
                        BEGIN
                            IF (@TDRNGTYP = 1)
                            BEGIN
                                IF ((@TDTABMAX > 0) AND (@TaxableBaseTemp > @TDTABMAX))
                                BEGIN
                                    SELECT @TaxableBaseNeg = @TaxableBase;
                                    SELECT @TaxableBaseTemp = @TDTABMAX;
                                END;
                            END;
                            ELSE
                            BEGIN
                                IF ((@TDTABMAX > 0) AND (@TaxableBaseTemp > @TDTABMAX))
                                BEGIN
                                    SELECT @TaxableBaseTemp = @TDTABMAX - @TDTABMIN;
                                END;
                                ELSE
                                BEGIN
                                    SELECT @TaxableBaseTemp = @TaxableBaseTemp - @TDTABMIN;
                                END;
                            END;
                        END;
                    END;
                    ELSE
                    BEGIN
                        IF (@TXDTQUAL = 3)
                        BEGIN
                            SELECT @TaxableSum = ISNULL(SUM(ORTXSLS), 0)
                            FROM SOP10105 (NOLOCK)
                            WHERE SOPTYPE = @I_vDOCTYPE
                                  AND SOPNUMBE = @I_vDOCNUMBE
                                  AND LNITMSEQ <> 0
                                  AND TAXDTLID = @TAXDTLID;
                            IF (ABS(@I_vINVOICETOTAL) < @TDTABMIN)
                            BEGIN
                                SELECT @TaxableBaseTemp = 0;
                            END;
                            ELSE
                            BEGIN
                                IF (@I_vINVOICETOTAL >= 0)
                                BEGIN
                                    IF (@TaxableBase < 0)
                                    BEGIN
                                        IF (@TaxableBase < 0)
                                           AND (@TDTABMAX > 0)
                                        BEGIN
                                            SELECT @TaxableBaseTemp = 0;
                                        END;
                                    END;
                                    ELSE
                                    BEGIN
                                        IF ((@TDTABMAX > 0) AND (@TaxableBase + @TaxableSum > @TDTABMAX))
                                        BEGIN
                                            IF ((@TDTABMAX - @TaxableSum) > 0)
                                                SELECT @TaxableBaseTemp = (@TDTABMAX - @TaxableSum);
                                            ELSE
                                                SELECT @TaxableBaseTemp = 0;
                                        END;
                                        IF ((@TDTABMAX > 0) AND (@I_vINVOICETOTAL < 0))
                                        BEGIN
                                            IF ((@TaxableBaseTemp + @TaxableSum) > @I_vINVOICETOTAL)
                                            BEGIN
                                                IF ((@I_vINVOICETOTAL - @TaxableSum) > 0)
                                                    SELECT @TaxableBaseTemp = (@I_vINVOICETOTAL - @TaxableSum);
                                                ELSE
                                                    SELECT @TaxableBaseTemp = 0;
                                            END;
                                        END;
                                    END;
                                END;
                                ELSE
                                BEGIN
                                    IF (@TaxableBase > 0)
                                    BEGIN
                                        IF ((@TaxableBase > 0) AND (@TDTABMAX > 0))
                                        BEGIN
                                            SELECT @TaxableBaseTemp = 0;
                                        END;
                                    END;
                                    ELSE
                                    BEGIN
                                        IF ((@TDTABMAX > 0) AND (ABS(@TaxableSum + @TaxableBase) > @TDTABMAX))
                                        BEGIN
                                            IF ((@TDTABMAX - ABS(@TaxableSum)) > 0)
                                                SELECT @TaxableBaseTemp = (@TDTABMAX - ABS(@TaxableSum));
                                            ELSE
                                                SELECT @TaxableBaseTemp = 0;
                                        END;
                                        IF ((@TDTABMAX > 0) AND (@I_vINVOICETOTAL < 0))
                                        BEGIN
                                            IF ((@TaxableBaseTemp + ABS(@TaxableSum)) > ABS(@I_vINVOICETOTAL))
                                            BEGIN
                                                IF ((ABS(@I_vINVOICETOTAL) - ABS(@TaxableSum)) > 0)
                                                    SELECT @TaxableBaseTemp
                                                        = (ABS(@I_vINVOICETOTAL) - ABS(@TaxableSum));
                                                ELSE
                                                    SELECT @TaxableBaseTemp = 0;
                                            END;
                                        END;
                                    END;
                                END;
                            END;
                        END;
                        ELSE
                        BEGIN
                            IF (@TaxableBaseTemp < @TDTABMIN)
                            BEGIN
                                IF (@TXDTLBSE = 5)
                                BEGIN
                                    SELECT @TaxableBaseTempBO = @TaxableBaseTemp;
                                END;
                                SELECT @TaxableBaseTemp = 0;
                            END;
                            ELSE
                            BEGIN
                                IF (@TDRNGTYP = 1)
                                BEGIN
                                    IF ((@TDTABMAX > 0) AND (@TaxableBaseTemp > @TDTABMAX))
                                    BEGIN
                                        SELECT @TaxableBaseTemp = @TDTABMAX;
                                    END;
                                END;
                                ELSE
                                BEGIN
                                    IF ((@TDTABMAX > 0) AND (@TaxableBaseTemp > @TDTABMAX))
                                    BEGIN
                                        SELECT @TaxableBaseTemp = @TDTABMAX - @TDTABMIN;
                                    END;
                                    ELSE
                                    BEGIN
                                        SELECT @TaxableBaseTemp = @TaxableBaseTemp - @TDTABMIN;
                                    END;
                                END;
                            END;
                        END;
                    END;
                END;
            END;
            IF (@TaxableBase < 0)
            BEGIN
                SELECT @TaxableBase = @TaxableBaseTemp * -1,
                       @TaxableBaseTempBO = @TaxableBaseTempBO * -1;
            END;
            ELSE
            BEGIN
                SELECT @TaxableBase = @TaxableBaseTemp;
            END;
            IF (@TXDTLBSE = 1)
            BEGIN
                SELECT @SALES = @TaxableBase;
                SELECT @TaxableBase = ROUND(@TaxableBase / (@TXDTLPCT * .01 + 1), 7);
                SELECT @TAXAMNT = (@TaxableBase * (@TXDTLPCT * .01));
                IF (@TAXAMNT <> ROUND(@TAXAMNT, @I_vDECIMALPLACES, 1))
                BEGIN
                    SELECT @TAXAMNT = ROUND(@TAXAMNT + (@rnd / POWER(10, @pow)), @dec, @fun);
                END;
                SELECT @TaxableBase = ROUND(@TaxableBase, @I_vDECIMALPLACES);
                SELECT @SALES = ROUND(@SALES - @TAXAMNT, @I_vDECIMALPLACES);
                IF (@TDTAXTAX <> 1)
                BEGIN
                    SELECT @I_vMISCAMTAMT = @I_vMISCAMTAMT - @TAXAMNT;
                    SELECT @I_vBACKOMISC = @I_vMISCAMTAMT;
                END;
                SELECT @TaxableBase = @SALES;
                SELECT @TaxableBaseTemp = @TaxableBase;
            END;
            ELSE IF (@TXDTLBSE = 2)
            BEGIN
                SELECT @TAXAMNT = 0;
                SELECT @SALES = 0;
                SELECT @TaxableBase = 0,
                       @TaxableBaseTemp = 0;
            END;
            ELSE IF (@TXDTLBSE = 3)
            BEGIN
                SELECT @TAXAMNT = ROUND(@TaxableBase * @TXDTLPCT * .01, 7);
                SELECT @SALES = @TaxableBase;
            END;
            ELSE IF (@TXDTLBSE = 4)
            BEGIN
                SELECT @TAXAMNT = 0;
                SELECT @SALES = 0;
                SELECT @TaxableBase = 0;
            END;
            ELSE IF (@TXDTLBSE = 5)
            BEGIN
                SELECT @TAXAMNT = ROUND(@TaxableBase * @TXDTLPCT * .01, 7);
                SELECT @SALES = @TaxableBase;
            END;
            IF (@TDTAXTAX = 1)
            BEGIN
                IF (
                       @TAXAMNT <> ROUND(@TAXAMNT, 0, 1)
                       AND @TDTLRNDG IN ( 2, 4, 5, 6 )
                       OR
                       (
                           @TAXAMNT <> ROUND(@TAXAMNT, @I_vDECIMALPLACES)
                           AND @TDTLRNDG NOT IN ( 4, 5, 6 )
                       )
                   )
                BEGIN
                    SELECT @TaxableTotal = @TaxableTotal + ROUND(@TAXAMNT + (@rnd / POWER(10, @pow)), @dec, @fun);
                END;
                ELSE
                BEGIN
                    SELECT @TaxableTotal = @TaxableTotal + @TAXAMNT;
                END;
            END;
            IF (@TXDTLBSE = 6)
            BEGIN
                IF (@TaxableBase >= 0)
                BEGIN
                    SELECT @TaxableBaseTemp = ROUND(@TaxableTotal + @TaxableBaseTemp, @I_vDECIMALPLACES);
                END;
                ELSE
                BEGIN
                    SELECT @TaxableBaseTemp = ROUND(@TaxableBaseTemp - @TaxableTotal, @I_vDECIMALPLACES);
                END;
                IF (@TaxableBase <> @SALES)
                   AND
                   (
                       @TDTABMAX = @TaxableBase
                       OR @TaxableBase <= @TDTABMAX - @TDTABMIN
                   )
                BEGIN
                    IF (@TaxableBase > 0)
                        SELECT @SALES = @TaxableBase;
                    ELSE
                        SELECT @SALES = 0;
                END;
                ELSE
                BEGIN
                    IF (@TaxableBase > 0)
                    BEGIN
                        SELECT @SALES = ROUND(@TaxableTotal + @TaxableBase, 7);
                        SELECT @TaxableBase = ROUND(@TaxableTotal + @TaxableBase, @I_vDECIMALPLACES);
                    END;
                    ELSE
                    BEGIN
                        SELECT @SALES = 0,
                               @TaxableBase = 0;
                    END;
                END;
                SELECT @TAXAMNT = ROUND((@SALES * @TXDTLPCT * .01), 7);
                SELECT @SALES = ROUND(@SALES, @I_vDECIMALPLACES);
            END;
            IF (
                   @TAXAMNT <> ROUND(@TAXAMNT, 0, 1)
                   AND @TDTLRNDG IN ( 4, 5, 6 )
                   OR
                   (
                       @TAXAMNT <> ROUND(@TAXAMNT, @I_vDECIMALPLACES)
                       AND @TDTLRNDG NOT IN ( 4, 5, 6 )
                   )
               )
            BEGIN
                IF @TAXAMNT > 0
                BEGIN
                    SELECT @TAXAMNT = ROUND(@TAXAMNT + (@rnd / POWER(10, @pow)), @dec, @fun);
                END;
                ELSE
                BEGIN
                    SELECT @TAXAMNT = ROUND(@TAXAMNT - (@rnd / POWER(10, @pow)), @dec, @fun);
                END;
            END;
            SELECT @TXDTOTTX = @TAXAMNT;
            IF (@TXDTLBSE <> 2)
            BEGIN
                SELECT @TAXSUM = ISNULL(TAXSUM, 0)
                FROM #minmax
                WHERE TAXDTLID = @TAXDTLID;
                IF (
                       (@TDTAXMAX < (ABS(@TAXAMNT) + @TAXSUM))
                       AND (@TDTAXMAX <> 0)
                       AND (@TaxableBase <> 0)
                   )
                BEGIN
                    SELECT @TAXAMNT = CASE
                                          WHEN @TAXAMNT < 0 THEN
                        (@TDTAXMAX - @TAXSUM) * -1
                                          ELSE
                                              @TDTAXMAX - @TAXSUM
                                      END;
                END;
                IF (ABS(@TAXAMNT) > ABS(@TXDTOTTX))
                BEGIN
                    SELECT @TAXAMNT = @TXDTOTTX;
                END;
                IF ((@TDTAXMAX > 0) OR (@TDTAXMIN > 0))
                BEGIN
                    IF NOT EXISTS (SELECT TAXDTLID FROM #minmax WHERE TAXDTLID = @TAXDTLID)
                    BEGIN
                        INSERT #minmax
                        SELECT @TAXDTLID,
                               @TAXAMNT,
                               @TDTAXMAX,
                               @TDTAXMIN,
                               @TAXAMNT;
                    END;
                    ELSE
                    BEGIN
                        UPDATE #minmax
                        SET TAXSUM = TAXSUM + @TAXAMNT,
                            LINESUM = LINESUM + @TAXAMNT
                        WHERE TAXDTLID = @TAXDTLID;
                    END;
                END;
            END;
            IF (@TXDTLBSE = 1)
            BEGIN
                SELECT @I_vBACKOSALES = @I_vBACKOSALES + @TAXAMNT;
            END;
            ELSE
            BEGIN
                SELECT @I_vMSCTXAMT = @I_vMSCTXAMT + @TAXAMNT;
            END;
            IF ((@TaxableBaseTemp > 0) AND (@TXDTLBSE <> 4))
            BEGIN
                SELECT @SALES = @TaxableBaseTemp;
            END;
            IF ((@TXDTOTTX < 0) AND (@TaxableBaseNeg = 0))
            BEGIN
                IF (@SALES > 0)
                BEGIN
                    SELECT @SALES = @SALES * -1;
                END;
            END;
            IF (((@TDTABMAX > 0) OR (@TDTABMIN > 0)) AND (@TXDTLBSE <> 5))
            BEGIN
                IF ((@I_vMISCAMTAMT < @TDTABMIN) OR (@TXDTLBSE = 4))
                BEGIN
                    SELECT @SALES = 0;
                END;
                ELSE
                BEGIN
                    SELECT @SALES = @I_vMISCAMTAMT;
                END;
            END;
            IF (@TaxableBaseTempBO <> 0)
            BEGIN
                SELECT @SALES = @TaxableBaseTempBO;
            END;
            SELECT @TaxableBaseNeg = 0,
                   @TaxableBaseTempBO = 0;
            IF (@I_vTRXSOURCE = 'SLSTE')
            BEGIN
                IF (@ACTINDX = 0)
                BEGIN
                    SELECT @ACTINDX = ACTINDX
                    FROM SY01100 (NOLOCK)
                    WHERE SERIES = 3
                          AND SEQNUMBR = 2000;
                END;
                EXEC @iStatus = taSopLineIvcTaxInsert @I_vSOPTYPE = @I_vDOCTYPE,
                                                      @I_vTAXTYPE = 2,
                                                      @I_vSOPNUMBE = @I_vDOCNUMBE,
                                                      @I_vCUSTNMBR = @I_vCUSTNMBR,
                                                      @I_vLNITMSEQ = @I_vLINENUMBR,
                                                      @I_vSALESAMT = 0,
                                                      @I_vFRTTXAMT = 0,
                                                      @I_vMSCTXAMT = @TAXAMNT,
                                                      @I_vFREIGHT = 0,
                                                      @I_vMISCAMNT = @SALES,
                                                      @I_vTDTTXSLS = @TaxableBase,
                                                      @I_vTAXDTLID = @TAXDTLID,
                                                      @I_vACTINDX = @ACTINDX,
                                                      @I_vACTNUMST = '',
                                                      @I_vSTAXAMNT = 0,
                                                      @I_vTXDTOTTX = @TXDTOTTX,
                                                      @O_iErrorState = @O_iErrorState OUTPUT,
                                                      @oErrString = @oErrString OUTPUT;
                IF ((@@error <> 0) OR (@iStatus <> 0) OR (@O_iErrorState <> 0))
                BEGIN
                    SELECT @O_iErrorState = 824;
                    EXEC @iStatus = taUpdateString @O_iErrorState,
                                                   @oErrString,
                                                   @oErrString OUTPUT,
                                                   @O_oErrorState OUTPUT;
                    BREAK;
                END;
            END;
            IF (@I_vTRXSOURCE = 'CMRCE')
            BEGIN
                EXEC @iStatus = taCommerceTaxInsert @I_vSOPTYPE = @I_vDOCTYPE,
                                                    @I_vTAXTYPE = 2,
                                                    @I_vSOPNUMBE = @I_vDOCNUMBE,
                                                    @I_vCUSTNMBR = @I_vCUSTNMBR,
                                                    @I_vLNITMSEQ = @I_vLINENUMBR,
                                                    @I_vSALESAMT = 0,
                                                    @I_vFRTTXAMT = 0,
                                                    @I_vMSCTXAMT = @TAXAMNT,
                                                    @I_vFREIGHT = 0,
                                                    @I_vMISCAMNT = @SALES,
                                                    @I_vTDTTXSLS = @TaxableBase,
                                                    @I_vTAXDTLID = @TAXDTLID,
                                                    @I_vACTINDX = @ACTINDX,
                                                    @I_vACTNUMST = '',
                                                    @I_vSTAXAMNT = 0,
                                                    @I_vTXDTOTTX = @TXDTOTTX,
                                                    @O_iErrorState = @O_iErrorState OUTPUT,
                                                    @oErrString = @oErrString OUTPUT;
                IF ((@@error <> 0) OR (@iStatus <> 0) OR (@O_iErrorState <> 0))
                BEGIN
                    SELECT @O_iErrorState = 9383;
                    EXEC @iStatus = taUpdateString @O_iErrorState,
                                                   @oErrString,
                                                   @oErrString OUTPUT,
                                                   @O_oErrorState OUTPUT;
                    BREAK;
                END;
            END;
            FETCH NEXT FROM Misc_Taxes
            INTO @TAXDTLID,
                 @ACTINDX,
                 @TXDTLBSE,
                 @TXDTLPCT,
                 @TXDTLAMT,
                 @TDTLRNDG,
                 @TXDBODTL,
                 @TDTABMIN,
                 @TDTABMAX,
                 @TDTAXMIN,
                 @TDTAXMAX,
                 @TDRNGTYP,
                 @TXDTQUAL,
                 @TDTAXTAX,
                 @TDTABPCT;
        END;
    END;
    DEALLOCATE Misc_Taxes;
END;
IF (@I_vFREITAXDSLID <> '')
BEGIN
    DECLARE Frght_Taxes INSENSITIVE CURSOR FOR
    SELECT a.TAXDTLID,
           a.ACTINDX,
           a.TXDTLBSE,
           a.TXDTLPCT,
           a.TXDTLAMT,
           a.TDTLRNDG,
           a.TXDBODTL,
           a.TDTABMIN,
           a.TDTABMAX,
           a.TDTAXMIN,
           a.TDTAXMAX,
           a.TDRNGTYP,
           a.TXDTQUAL,
           a.TDTAXTAX,
           a.TDTABPCT
    FROM TX00102 b (NOLOCK),
         TX00201 a (NOLOCK),
         TX00201 c (NOLOCK),
         TX00102 d (NOLOCK)
    WHERE b.TAXSCHID = @I_vFREITAXDSLID
          AND b.TAXDTLID = a.TAXDTLID
          AND a.TXDTLTYP = @I_vDETAILTYPE
          AND @I_vFREITAXDSLID <> ''
          AND d.TAXSCHID = @I_vMSTRTAXSLID
          AND d.TAXDTLID = c.TAXDTLID
          AND a.TAXDTLID = c.TAXDTLID
    ORDER BY a.TXDTLBSE,
             a.TDTAXTAX,
             a.TAXDTLID;
    OPEN Frght_Taxes;
    IF (@@cursor_rows > 0)
    BEGIN
        FETCH NEXT FROM Frght_Taxes
        INTO @TAXDTLID,
             @ACTINDX,
             @TXDTLBSE,
             @TXDTLPCT,
             @TXDTLAMT,
             @TDTLRNDG,
             @TXDBODTL,
             @TDTABMIN,
             @TDTABMAX,
             @TDTAXMIN,
             @TDTAXMAX,
             @TDRNGTYP,
             @TXDTQUAL,
             @TDTAXTAX,
             @TDTABPCT;
        WHILE (@@fetch_status <> -1)
        BEGIN
            IF (@@fetch_status = -2)
            BEGIN
                SELECT @O_iErrorState = 826;
                EXEC @iStatus = taUpdateString @O_iErrorState,
                                               @oErrorDesc,
                                               @oErrorDesc OUTPUT,
                                               @O_oErrorState OUTPUT;
                BREAK;
            END;
            SELECT @rnd = CASE @TDTLRNDG
                              WHEN 1 THEN
                                  .5
                              WHEN 2 THEN
                                  0
                              WHEN 3 THEN
                                  -.5
                              WHEN 4 THEN
                                  1
                              WHEN 5 THEN
                                  1
                              WHEN 6 THEN
                                  -.000001
                              ELSE
                                  1
                          END;
            SELECT @pow = CASE @TDTLRNDG
                              WHEN 1 THEN
                                  @I_vDECIMALPLACES
                              WHEN 2 THEN
                                  @I_vDECIMALPLACES
                              WHEN 3 THEN
                                  @I_vDECIMALPLACES
                              WHEN 4 THEN
                                  0
                              WHEN 5 THEN
                                  1
                              WHEN 6 THEN
                                  0
                              ELSE
                                  0
                          END;
            SELECT @dec = CASE @TDTLRNDG
                              WHEN 1 THEN
                                  @I_vDECIMALPLACES
                              WHEN 2 THEN
                                  @I_vDECIMALPLACES
                              WHEN 3 THEN
                                  @I_vDECIMALPLACES
                              WHEN 4 THEN
                                  0
                              WHEN 5 THEN
                                  0
                              WHEN 6 THEN
                                  0
                              ELSE
                                  @I_vDECIMALPLACES
                          END;
            SELECT @fun = CASE @TDTLRNDG
                              WHEN 1 THEN
                                  0
                              WHEN 2 THEN
                                  0
                              WHEN 3 THEN
                                  0
                              WHEN 4 THEN
                                  1
                              WHEN 5 THEN
                                  0
                              WHEN 6 THEN
                                  1
                              ELSE
                                  0
                          END;
            IF ((@I_vXCHGRATE <> 0) AND (@I_vRTCLCMTD <> -1))
            BEGIN
                IF (@I_vRTCLCMTD = 1)
                BEGIN
                    SELECT @TDTABMIN = CASE
                                           WHEN @TDTABMIN > 0 THEN
                                               ROUND(@TDTABMIN * @I_vXCHGRATE, @I_vDECIMALPLACES)
                                           ELSE
                                               0
                                       END,
                           @TDTABMAX = CASE
                                           WHEN @TDTABMAX > 0 THEN
                                               ROUND(@TDTABMAX * @I_vXCHGRATE, @I_vDECIMALPLACES)
                                           ELSE
                                               0
                                       END,
                           @TDTAXMIN = CASE
                                           WHEN @TDTAXMIN > 0 THEN
                                               ROUND(@TDTAXMIN * @I_vXCHGRATE, @I_vDECIMALPLACES)
                                           ELSE
                                               0
                                       END,
                           @TDTAXMAX = CASE
                                           WHEN @TDTAXMAX > 0 THEN
                                               ROUND(@TDTAXMAX * @I_vXCHGRATE, @I_vDECIMALPLACES)
                                           ELSE
                                               0
                                       END,
                           @TXDTLAMT = CASE
                                           WHEN @TXDTLAMT > 0 THEN
                                               ROUND(@TXDTLAMT * @I_vXCHGRATE, @I_vDECIMALPLACES)
                                           ELSE
                                               0
                                       END;
                END;
                ELSE
                BEGIN
                    SELECT @TDTABMIN = CASE
                                           WHEN @TDTABMIN > 0 THEN
                                               ROUND(@TDTABMIN / @I_vXCHGRATE, @I_vDECIMALPLACES)
                                           ELSE
                                               0
                                       END,
                           @TDTABMAX = CASE
                                           WHEN @TDTABMAX > 0 THEN
                                               ROUND(@TDTABMAX / @I_vXCHGRATE, @I_vDECIMALPLACES)
                                           ELSE
                                               0
                                       END,
                           @TDTAXMIN = CASE
                                           WHEN @TDTAXMIN > 0 THEN
                                               ROUND(@TDTAXMIN / @I_vXCHGRATE, @I_vDECIMALPLACES)
                                           ELSE
                                               0
                                       END,
                           @TDTAXMAX = CASE
                                           WHEN @TDTAXMAX > 0 THEN
                                               ROUND(@TDTAXMAX / @I_vXCHGRATE, @I_vDECIMALPLACES)
                                           ELSE
                                               0
                                       END,
                           @TXDTLAMT = CASE
                                           WHEN @TXDTLAMT > 0 THEN
                                               ROUND(@TXDTLAMT / @I_vXCHGRATE, @I_vDECIMALPLACES)
                                           ELSE
                                               0
                                       END;
                END;
            END;
            SELECT @TaxableBase = 0,
                   @TaxableBaseTemp = 0,
                   @SALES = 0;
            IF (@TXDTLBSE = 5)
            BEGIN
                SELECT @FINDBOTAX = 0;
                SELECT @FINDBOTAX = ISNULL(FRTTXAMT, 0)
                FROM SOP10105 (NOLOCK)
                WHERE SOPTYPE = @I_vDOCTYPE
                      AND SOPNUMBE = @I_vDOCNUMBE
                      AND LNITMSEQ = 2147483646
                      AND TAXDTLID = @TXDBODTL;
                SELECT @TaxableBase = @FINDBOTAX;
            END;
            ELSE IF (@TXDTLBSE = 4)
            BEGIN
                SELECT @TaxableBase = 0;
            END;
            ELSE
            BEGIN
                SELECT @TaxableBase = @I_vFRTAMT;
            END;
            IF (@TDTABPCT > 0)
            BEGIN
                SELECT @TaxableBase = ROUND(@TaxableBase * (@TDTABPCT / 100), @I_vDECIMALPLACES);
            END;
            SELECT @TaxableBaseTemp = ABS(@TaxableBase);
            SELECT @unitAmt = 0;
            IF ((@TDTABMIN > 0) OR (@TDTABMAX > 0))
            BEGIN
                IF (@TXDTQUAL = 1)
                BEGIN
                    IF (@I_vNUMUNITS <> 0)
                    BEGIN
                        SELECT @unitAmt = @TaxableBaseTemp / @I_vNUMUNITS;
                    END;
                    IF (ABS(@unitAmt) < @TDTABMIN)
                    BEGIN
                        SELECT @TaxableBaseTemp = 0;
                    END;
                    ELSE
                    BEGIN
                        IF (@TDRNGTYP = 1)
                        BEGIN
                            IF (@TDTABMAX > 0)
                               AND (ABS(@unitAmt) > @TDTABMAX)
                            BEGIN
                                SELECT @unitAmt = @TDTABMAX;
                                SELECT @TaxableBaseTemp = ROUND(@unitAmt * ABS(@I_vNUMUNITS), @I_vDECIMALPLACES);
                            END;
                        END;
                        ELSE
                        BEGIN
                            IF (@TDTABMAX > 0)
                               AND (ABS(@unitAmt) > @TDTABMAX)
                            BEGIN
                                SELECT @unitAmt = @TDTABMAX - @TDTABMIN;
                            END;
                            ELSE
                            BEGIN
                                SELECT @unitAmt = ABS(@unitAmt) - @TDTABMIN;
                            END;
                            SELECT @TaxableBaseTemp = ROUND(@unitAmt * ABS(@I_vNUMUNITS), @I_vDECIMALPLACES);
                        END;
                    END;
                END;
                ELSE
                BEGIN
                    IF (@TXDTQUAL = 2)
                    BEGIN
                        IF (@TaxableBaseTemp < @TDTABMIN)
                        BEGIN
                            IF (@TaxableBase < 0)
                            BEGIN
                                SELECT @TaxableBaseNeg = @TaxableBase;
                            END;
                            SELECT @TaxableBaseTemp = 0;
                        END;
                        ELSE
                        BEGIN
                            IF (@TDRNGTYP = 1)
                            BEGIN
                                IF ((@TDTABMAX > 0) AND (@TaxableBaseTemp > @TDTABMAX))
                                BEGIN
                                    SELECT @TaxableBaseNeg = @TaxableBase;
                                    SELECT @TaxableBaseTemp = @TDTABMAX;
                                END;
                            END;
                            ELSE
                            BEGIN
                                IF ((@TDTABMAX > 0) AND (@TaxableBaseTemp > @TDTABMAX))
                                BEGIN
                                    SELECT @TaxableBaseTemp = @TDTABMAX - @TDTABMIN;
                                END;
                                ELSE
                                BEGIN
                                    SELECT @TaxableBaseTemp = @TaxableBaseTemp - @TDTABMIN;
                                END;
                            END;
                        END;
                    END;
                    ELSE
                    BEGIN
                        IF (@TXDTQUAL = 3)
                        BEGIN
                            SELECT @TaxableSum = ISNULL(SUM(ORTXSLS), 0)
                            FROM SOP10105 (NOLOCK)
                            WHERE SOPTYPE = @I_vDOCTYPE
                                  AND SOPNUMBE = @I_vDOCNUMBE
                                  AND LNITMSEQ <> 0
                                  AND TAXDTLID = @TAXDTLID;
                            IF (ABS(@I_vINVOICETOTAL) < @TDTABMIN)
                            BEGIN
                                SELECT @TaxableBaseTemp = 0;
                            END;
                            ELSE
                            BEGIN
                                IF (@I_vINVOICETOTAL >= 0)
                                BEGIN
                                    IF (@TaxableBase < 0)
                                    BEGIN
                                        IF (@TaxableBase < 0)
                                           AND (@TDTABMAX > 0)
                                        BEGIN
                                            SELECT @TaxableBaseTemp = 0;
                                        END;
                                    END;
                                    ELSE
                                    BEGIN
                                        IF ((@TDTABMAX > 0) AND (@TaxableBase + @TaxableSum > @TDTABMAX))
                                        BEGIN
                                            IF ((@TDTABMAX - @TaxableSum) > 0)
                                                SELECT @TaxableBaseTemp = (@TDTABMAX - @TaxableSum);
                                            ELSE
                                                SELECT @TaxableBaseTemp = 0;
                                        END;
                                        IF ((@TDTABMAX > 0) AND (@I_vINVOICETOTAL < 0))
                                        BEGIN
                                            IF ((@TaxableBaseTemp + @TaxableSum) > @I_vINVOICETOTAL)
                                            BEGIN
                                                IF ((@I_vINVOICETOTAL - @TaxableSum) > 0)
                                                    SELECT @TaxableBaseTemp = (@I_vINVOICETOTAL - @TaxableSum);
                                                ELSE
                                                    SELECT @TaxableBaseTemp = 0;
                                            END;
                                        END;
                                    END;
                                END;
                                ELSE
                                BEGIN
                                    IF (@TaxableBase > 0)
                                    BEGIN
                                        IF ((@TaxableBase > 0) AND (@TDTABMAX > 0))
                                        BEGIN
                                            SELECT @TaxableBaseTemp = 0;
                                        END;
                                    END;
                                    ELSE
                                    BEGIN
                                        IF ((@TDTABMAX > 0) AND (ABS(@TaxableSum + @TaxableBase) > @TDTABMAX))
                                        BEGIN
                                            IF ((@TDTABMAX - ABS(@TaxableSum)) > 0)
                                                SELECT @TaxableBaseTemp = (@TDTABMAX - ABS(@TaxableSum));
                                            ELSE
                                                SELECT @TaxableBaseTemp = 0;
                                        END;
                                        IF ((@TDTABMAX > 0) AND (@I_vINVOICETOTAL < 0))
                                        BEGIN
                                            IF ((@TaxableBaseTemp + ABS(@TaxableSum)) > ABS(@I_vINVOICETOTAL))
                                            BEGIN
                                                IF ((ABS(@I_vINVOICETOTAL) - ABS(@TaxableSum)) > 0)
                                                    SELECT @TaxableBaseTemp
                                                        = (ABS(@I_vINVOICETOTAL) - ABS(@TaxableSum));
                                                ELSE
                                                    SELECT @TaxableBaseTemp = 0;
                                            END;
                                        END;
                                    END;
                                END;
                            END;
                        END;
                        ELSE
                        BEGIN
                            IF (@TaxableBaseTemp < @TDTABMIN)
                            BEGIN
                                IF (@TXDTLBSE = 5)
                                BEGIN
                                    SELECT @TaxableBaseTempBO = @TaxableBaseTemp;
                                END;
                                SELECT @TaxableBaseTemp = 0;
                            END;
                            ELSE
                            BEGIN
                                IF (@TDRNGTYP = 1)
                                BEGIN
                                    IF ((@TDTABMAX > 0) AND (@TaxableBaseTemp > @TDTABMAX))
                                    BEGIN
                                        SELECT @TaxableBaseTemp = @TDTABMAX;
                                    END;
                                END;
                                ELSE
                                BEGIN
                                    IF ((@TDTABMAX > 0) AND (@TaxableBaseTemp > @TDTABMAX))
                                    BEGIN
                                        SELECT @TaxableBaseTemp = @TDTABMAX - @TDTABMIN;
                                    END;
                                    ELSE
                                    BEGIN
                                        SELECT @TaxableBaseTemp = @TaxableBaseTemp - @TDTABMIN;
                                    END;
                                END;
                            END;
                        END;
                    END;
                END;
            END;
            IF (@TaxableBase < 0)
            BEGIN
                SELECT @TaxableBase = @TaxableBaseTemp * -1,
                       @TaxableBaseTempBO = @TaxableBaseTempBO * -1;
            END;
            ELSE
            BEGIN
                SELECT @TaxableBase = @TaxableBaseTemp;
            END;
            IF (@TXDTLBSE = 1)
            BEGIN
                SELECT @SALES = @TaxableBase;
                SELECT @TaxableBase = ROUND(@TaxableBase / (@TXDTLPCT * .01 + 1), 7);
                SELECT @TAXAMNT = (@TaxableBase * (@TXDTLPCT * .01));
                IF (@TAXAMNT <> ROUND(@TAXAMNT, @I_vDECIMALPLACES, 1))
                BEGIN
                    SELECT @TAXAMNT = ROUND(@TAXAMNT + (@rnd / POWER(10, @pow)), @dec, @fun);
                END;
                SELECT @TaxableBase = ROUND(@TaxableBase, @I_vDECIMALPLACES);
                SELECT @SALES = ROUND(@SALES - @TAXAMNT, @I_vDECIMALPLACES);
                IF (@TDTAXTAX <> 1)
                BEGIN
                    SELECT @I_vFRTAMT = @I_vFRTAMT - @TAXAMNT;
                    SELECT @I_vBACKOFREHT = @I_vFRTAMT;
                END;
                SELECT @TaxableBase = @SALES;
                SELECT @TaxableBaseTemp = @TaxableBase;
            END;
            ELSE IF (@TXDTLBSE = 2)
            BEGIN
                SELECT @TAXAMNT = 0;
                SELECT @SALES = 0;
                SELECT @TaxableBase = 0,
                       @TaxableBaseTemp = 0;
            END;
            ELSE IF (@TXDTLBSE = 3)
            BEGIN
                SELECT @TAXAMNT = ROUND(@TaxableBase * @TXDTLPCT * .01, 7);
                SELECT @SALES = @TaxableBase;
            END;
            ELSE IF (@TXDTLBSE = 4)
            BEGIN
                SELECT @TAXAMNT = 0;
                SELECT @SALES = 0;
                SELECT @TaxableBase = 0;
            END;
            ELSE IF (@TXDTLBSE = 5)
            BEGIN
                SELECT @TAXAMNT = ROUND(@TaxableBase * @TXDTLPCT * .01, 7);
                SELECT @SALES = @TaxableBase;
            END;
            IF (@TDTAXTAX = 1)
            BEGIN
                IF (
                       @TAXAMNT <> ROUND(@TAXAMNT, 0, 1)
                       AND @TDTLRNDG IN ( 2, 4, 5, 6 )
                       OR
                       (
                           @TAXAMNT <> ROUND(@TAXAMNT, @I_vDECIMALPLACES)
                           AND @TDTLRNDG NOT IN ( 4, 5, 6 )
                       )
                   )
                BEGIN
                    SELECT @TaxableTotal = @TaxableTotal + ROUND(@TAXAMNT + (@rnd / POWER(10, @pow)), @dec, @fun);
                END;
                ELSE
                BEGIN
                    SELECT @TaxableTotal = @TaxableTotal + @TAXAMNT;
                END;
            END;
            IF (@TXDTLBSE = 6)
            BEGIN
                IF (@TaxableBase >= 0)
                BEGIN
                    SELECT @TaxableBaseTemp = ROUND(@TaxableTotal + @TaxableBaseTemp, @I_vDECIMALPLACES);
                END;
                ELSE
                BEGIN
                    SELECT @TaxableBaseTemp = ROUND(@TaxableBaseTemp - @TaxableTotal, @I_vDECIMALPLACES);
                END;
                IF (@TaxableBase <> @SALES)
                   AND
                   (
                       @TDTABMAX = @TaxableBase
                       OR @TaxableBase <= @TDTABMAX - @TDTABMIN
                   )
                BEGIN
                    IF (@TaxableBase > 0)
                        SELECT @SALES = @TaxableBase;
                    ELSE
                        SELECT @SALES = 0;
                END;
                ELSE
                BEGIN
                    IF (@TaxableBase > 0)
                    BEGIN
                        SELECT @SALES = ROUND(@TaxableTotal + @TaxableBase, 7);
                        SELECT @TaxableBase = ROUND(@TaxableTotal + @TaxableBase, @I_vDECIMALPLACES);
                    END;
                    ELSE
                    BEGIN
                        SELECT @SALES = 0,
                               @TaxableBase = 0;
                    END;
                END;
                SELECT @TAXAMNT = ROUND((@SALES * @TXDTLPCT * .01), 7);
                SELECT @SALES = ROUND(@SALES, @I_vDECIMALPLACES);
            END;
            IF (
                   @TAXAMNT <> ROUND(@TAXAMNT, 0, 1)
                   AND @TDTLRNDG IN ( 4, 5, 6 )
                   OR
                   (
                       @TAXAMNT <> ROUND(@TAXAMNT, @I_vDECIMALPLACES)
                       AND @TDTLRNDG NOT IN ( 4, 5, 6 )
                   )
               )
            BEGIN
                IF @TAXAMNT > 0
                BEGIN
                    SELECT @TAXAMNT = ROUND(@TAXAMNT + (@rnd / POWER(10, @pow)), @dec, @fun);
                END;
                ELSE
                BEGIN
                    SELECT @TAXAMNT = ROUND(@TAXAMNT - (@rnd / POWER(10, @pow)), @dec, @fun);
                END;
            END;
            SELECT @TXDTOTTX = @TAXAMNT;
            IF (@TXDTLBSE <> 2)
            BEGIN
                SELECT @TAXSUM = ISNULL(TAXSUM, 0)
                FROM #minmax
                WHERE TAXDTLID = @TAXDTLID;
                IF (
                       (@TDTAXMAX < (ABS(@TAXAMNT) + @TAXSUM))
                       AND (@TDTAXMAX <> 0)
                       AND (@TaxableBase <> 0)
                   )
                BEGIN
                    SELECT @TAXAMNT = CASE
                                          WHEN @TAXAMNT < 0 THEN
                        (@TDTAXMAX - @TAXSUM) * -1
                                          ELSE
                                              @TDTAXMAX - @TAXSUM
                                      END;
                END;
                IF (ABS(@TAXAMNT) > ABS(@TXDTOTTX))
                BEGIN
                    SELECT @TAXAMNT = @TXDTOTTX;
                END;
                IF ((@TDTAXMAX > 0) OR (@TDTAXMIN > 0))
                BEGIN
                    IF NOT EXISTS (SELECT TAXDTLID FROM #minmax WHERE TAXDTLID = @TAXDTLID)
                    BEGIN
                        INSERT #minmax
                        SELECT @TAXDTLID,
                               @TAXAMNT,
                               @TDTAXMAX,
                               @TDTAXMIN,
                               @TAXAMNT;
                    END;
                    ELSE
                    BEGIN
                        UPDATE #minmax
                        SET TAXSUM = TAXSUM + @TAXAMNT,
                            LINESUM = LINESUM + @TAXAMNT
                        WHERE TAXDTLID = @TAXDTLID;
                    END;
                END;
            END;
            IF (@TXDTLBSE = 1)
            BEGIN
                SELECT @I_vBACKOSALES = @I_vBACKOSALES + @TAXAMNT;
            END;
            ELSE
            BEGIN
                SELECT @I_vFRTTXAMT = @I_vFRTTXAMT + @TAXAMNT;
            END;
            IF ((@TaxableBaseTemp > 0) AND (@TXDTLBSE <> 4))
            BEGIN
                SELECT @SALES = @TaxableBaseTemp;
            END;
            IF ((@TXDTOTTX < 0) AND (@TaxableBaseNeg = 0))
            BEGIN
                IF (@SALES > 0)
                BEGIN
                    SELECT @SALES = @SALES * -1;
                END;
            END;
            IF (((@TDTABMAX > 0) OR (@TDTABMIN > 0)) AND (@TXDTLBSE <> 5))
            BEGIN
                IF ((@I_vFRTAMT < @TDTABMIN) OR (@TXDTLBSE = 4))
                BEGIN
                    SELECT @SALES = 0;
                END;
                ELSE
                BEGIN
                    SELECT @SALES = @I_vFRTAMT;
                END;
            END;
            IF (@TaxableBaseTempBO <> 0)
            BEGIN
                SELECT @SALES = @TaxableBaseTempBO;
            END;
            SELECT @TaxableBaseNeg = 0,
                   @TaxableBaseTempBO = 0;
            IF (@I_vTRXSOURCE = 'SLSTE')
            BEGIN
                IF (@ACTINDX = 0)
                BEGIN
                    SELECT @ACTINDX = ACTINDX
                    FROM SY01100 (NOLOCK)
                    WHERE SERIES = 3
                          AND SEQNUMBR = 2000;
                END;
                EXEC @iStatus = taSopLineIvcTaxInsert @I_vSOPTYPE = @I_vDOCTYPE,
                                                      @I_vTAXTYPE = 1,
                                                      @I_vSOPNUMBE = @I_vDOCNUMBE,
                                                      @I_vCUSTNMBR = @I_vCUSTNMBR,
                                                      @I_vLNITMSEQ = @I_vLINENUMBR,
                                                      @I_vSALESAMT = 0,
                                                      @I_vFRTTXAMT = @TAXAMNT,
                                                      @I_vMSCTXAMT = 0,
                                                      @I_vFREIGHT = @SALES,
                                                      @I_vMISCAMNT = 0,
                                                      @I_vTDTTXSLS = @TaxableBase,
                                                      @I_vTAXDTLID = @TAXDTLID,
                                                      @I_vACTINDX = @ACTINDX,
                                                      @I_vACTNUMST = '',
                                                      @I_vSTAXAMNT = 0,
                                                      @I_vTXDTOTTX = @TXDTOTTX,
                                                      @O_iErrorState = @O_iErrorState OUTPUT,
                                                      @oErrString = @oErrString OUTPUT;
                IF ((@@error <> 0) OR (@iStatus <> 0) OR (@O_iErrorState <> 0))
                BEGIN
                    SELECT @O_iErrorState = 828;
                    EXEC @iStatus = taUpdateString @O_iErrorState,
                                                   @oErrString,
                                                   @oErrString OUTPUT,
                                                   @O_oErrorState OUTPUT;
                    BREAK;
                END;
            END;
            IF (@I_vTRXSOURCE = 'CMRCE')
            BEGIN
                EXEC @iStatus = taCommerceTaxInsert @I_vSOPTYPE = @I_vDOCTYPE,
                                                    @I_vTAXTYPE = 1,
                                                    @I_vSOPNUMBE = @I_vDOCNUMBE,
                                                    @I_vCUSTNMBR = @I_vCUSTNMBR,
                                                    @I_vLNITMSEQ = @I_vLINENUMBR,
                                                    @I_vSALESAMT = 0,
                                                    @I_vFRTTXAMT = @TAXAMNT,
                                                    @I_vMSCTXAMT = 0,
                                                    @I_vFREIGHT = @SALES,
                                                    @I_vMISCAMNT = 0,
                                                    @I_vTDTTXSLS = @TaxableBase,
                                                    @I_vTAXDTLID = @TAXDTLID,
                                                    @I_vACTINDX = @ACTINDX,
                                                    @I_vACTNUMST = '',
                                                    @I_vSTAXAMNT = 0,
                                                    @I_vTXDTOTTX = @TXDTOTTX,
                                                    @O_iErrorState = @O_iErrorState OUTPUT,
                                                    @oErrString = @oErrString OUTPUT;
                IF ((@@error <> 0) OR (@iStatus <> 0) OR (@O_iErrorState <> 0))
                BEGIN
                    SELECT @O_iErrorState = 9384;
                    EXEC @iStatus = taUpdateString @O_iErrorState,
                                                   @oErrString,
                                                   @oErrString OUTPUT,
                                                   @O_oErrorState OUTPUT;
                    BREAK;
                END;
            END;
            FETCH NEXT FROM Frght_Taxes
            INTO @TAXDTLID,
                 @ACTINDX,
                 @TXDTLBSE,
                 @TXDTLPCT,
                 @TXDTLAMT,
                 @TDTLRNDG,
                 @TXDBODTL,
                 @TDTABMIN,
                 @TDTABMAX,
                 @TDTAXMIN,
                 @TDTAXMAX,
                 @TDRNGTYP,
                 @TXDTQUAL,
                 @TDTAXTAX,
                 @TDTABPCT;
        END;
    END;
    DEALLOCATE Frght_Taxes;
END;
SELECT @I_vFUTOTAMT = @I_vTAXAMNT;
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