SET TERM ^ ;

CREATE OR ALTER procedure SPU_CFE_ITEM_TRIBUTACAO
as
declare variable PDV_CFE_ITEM_ID integer;
declare variable ESTABELECIMENTO_ID integer;
declare variable CFOP_CODIGO varchar(5);
declare variable OPERACAO_CODIGO varchar(3);
declare variable CLIENTE_UF varchar(2);
declare variable TRIBUTACAO_ICMS integer;
declare variable ALIQUOTA_ICMS numeric(15,2);
declare variable BASE_CALCULO_ICMS numeric(15,2);
declare variable TRIBUTACAO_PIS char(2);
declare variable TRIBUTACAO_COFINS char(2);
declare variable ALIQUOTA_PIS numeric(15,2);
declare variable ALIQUOTA_PIS_DIFER numeric(15,2);
declare variable ALIQUOTA_COFINS numeric(15,2);
declare variable ALIQUOTA_COFINS_DIFER numeric(15,2);
declare variable REDUCAO_BASE_PISCOF char(1);
declare variable MODALIDADE_ICMS integer;
declare variable MODALIDADE_ICMS_ST char(1);
declare variable ALIQUOTA_ICMS_ST numeric(15,2);
declare variable OPERACAO_TIPO_DESCONTO varchar(1);
declare variable VALOR_TOTAL_ITEM numeric(15,2);
declare variable VALOR_ACRESCIMO_ITEM numeric(15,2);
declare variable VALOR_FRETE_ITEM numeric(15,2);
declare variable VALOR_SUFRAMA_ITEM numeric(15,2);
declare variable VALOR_DESCONTO_ITEM numeric(15,2);
declare variable VALOR_IPI_ITEM numeric(15,2);
declare variable TIPO integer;
declare variable FAMILIA_ID integer;
declare variable REDUCAO_ICMS_ST numeric(15,2);
declare variable MARGEM_ICMS_ST numeric(15,2);
declare variable BASECALCULO_ICMS_ST numeric(15,2);
declare variable PERCENTUAL_ICMS_ST numeric(15,2);
declare variable VALOR_ICMS_ST numeric(15,2);
declare variable PERCENTUAL_BASECALCULO_ICMS numeric(15,2);
declare variable BASECALCULO_ICMS numeric(15,2);
declare variable VALOR_ICMS numeric(15,2);
declare variable PERCENTUAL_ICMS numeric(15,2);
declare variable VALOR_DESCONTO_INCON numeric(15,2);
declare variable VALOR_REDUTOR_BASEPISCOF numeric(15,2);
declare variable BASECALCULO_PIS numeric(15,2);
declare variable VALOR_PIS numeric(15,2);
declare variable PERCENTUAL_PIS numeric(15,2);
declare variable BASECALCULO_COFINS numeric(15,2);
declare variable VALOR_COFINS numeric(15,2);
declare variable PERCENTUAL_COFINS numeric(15,2);
declare variable VALOR_CONTABIL numeric(15,2);
declare variable FISCAL_OUTRAS_ICMS numeric(15,2);
BEGIN

    FOR SELECT
        A.ID,
        B.ESTABELECIMENTO_ID,
        A.CFOP_CODIGO,
        A.OPERACAO_CODIGO,
        B.CLIENTE_UF,
        COALESCE(A.VALOR_TOTAL, 0),
        COALESCE(A.VALOR_ACRESCIMO, 0),
        COALESCE(A.VALOR_FRETE, 0),
        COALESCE(A.VALOR_SUFRAMA, 0),
        COALESCE(A.VALOR_DESCONTO, 0),
        COALESCE(A.VALOR_IPI, 0),
        COALESCE(B.TIPO, 0),
        IIF(COALESCE(A.FAMILIA_ID, 0) = 0, COALESCE((SELECT FIRST 1 K.FAMILIA_INVENTARIO FROM TBPRODUTO K WHERE K.CODIGO = A.PRODUTO_ID), 0), COALESCE(A.FAMILIA_ID, 0)) AS FAMILIA_ID

    FROM TBPDV_CFE B, TBPDV_CFE_ITEM A, TBESTABELECIMENTO E
    WHERE B.ID = A.PDV_CFE_ID
      AND E.CODIGO = B.ESTABELECIMENTO_ID
      AND A.TRIBUTACAO_ICMS = 0
      AND A.VALOR_ICMS = 0
      AND (B.TIPO IS NULL OR B.TIPO <> 3)
      AND A.VALOR_UNITARIO > 0
      AND 1 = 2
    INTO :PDV_CFE_ITEM_ID, :ESTABELECIMENTO_ID, :CFOP_CODIGO, :OPERACAO_CODIGO, :CLIENTE_UF,
    :VALOR_TOTAL_ITEM, :VALOR_ACRESCIMO_ITEM, :VALOR_FRETE_ITEM, :VALOR_SUFRAMA_ITEM, :VALOR_DESCONTO_ITEM,
    :VALOR_IPI_ITEM, :TIPO, :FAMILIA_ID
    DO BEGIN
            
        IF(:TIPO = 1) THEN
        BEGIN

            FOR SELECT FIRST 1
                    T.TRIBUTACAO_ICMS,
                    CAST(T.ICMS  AS NUMERIC(15,2)) AS ALIQUOTA_ICMS,
                    CAST(I.BASECALCULO AS NUMERIC(15,2)) AS BASE_CALCULO_ICMS,
                    T.TRIBUTACAO_PIS,
                    T.TRIBUTACAO_COFINS,
                    CAST(REPLACE(REPLACE(FN_PARAMETRO('TBESTABELECIMENTO.PIS_ALIQUOTA_BASICA', T.ESTABELECIMENTO_CODIGO), '.', ''), ',', '.') AS NUMERIC(15,2)) AS PERCENTUAL_PIS,
                    CAST(REPLACE(REPLACE(FN_PARAMETRO('TBESTABELECIMENTO.PIS_ALIQUOTA_DIFERENCIADA', T.ESTABELECIMENTO_CODIGO), '.', ''), ',', '.') AS NUMERIC(15,2)) AS PERCENTUAL_PIS_DIFER,
                    CAST(REPLACE(REPLACE(FN_PARAMETRO('TBESTABELECIMENTO.COFINS_ALIQUOTA_BASICA', T.ESTABELECIMENTO_CODIGO), '.', ''), ',', '.') AS NUMERIC(15,2)) AS PERCENTUAL_COFINS,
                    CAST(REPLACE(REPLACE(FN_PARAMETRO('TBESTABELECIMENTO.COFINS_ALIQUOTA_DIFERENCIADA', T.ESTABELECIMENTO_CODIGO), '.', ''), ',', '.') AS NUMERIC(15,2)) AS PERCENTUAL_COFINS_DIFER,
                    TRIM(COALESCE(C.REDUCAO_BASE_PISCOF, '0')) REDUCAO_BASE_PISCOF,
                    COALESCE(T.MODALIDADE_ICMS, 0),
                    COALESCE(T.MODALIDADE_ST, ''),
                    COALESCE(T.ALIQUOTA_ST, 0) ALIQUOTA_ICMS_ST,
                    COALESCE(A.TIPO_DESCONTO, 'C')
                
                FROM TBOPERACAO_VINCULO_CFOP T,
                TBCFOP C,
                TBOPERACAO A,
                TBTRIBUTACAO_ICMS I,
                TBTRIBUTACAO_PIS PIS,
                TBTRIBUTACAO_COFINS COFINS
                
                WHERE T.OPERACAO_CODIGO         = A.CODIGO
                AND C.CODIGO                    = T.CFOP_CODIGO
                AND I.CODIGO                    = T.TRIBUTACAO_ICMS
                AND PIS.CODIGO                  = T.TRIBUTACAO_PIS
                AND COFINS.CODIGO               = T.TRIBUTACAO_COFINS
                AND T.CFOP_CODIGO               = :CFOP_CODIGO
                AND T.OPERACAO_CODIGO           = :OPERACAO_CODIGO
                AND (T.UF = :CLIENTE_UF OR T.UF = 'XX')
                AND A.NOTAFISCAL                = '1'
                AND A.STATUS                    = '1'
                AND A.TIPO                      = 'S'
                AND T.ESTABELECIMENTO_CODIGO    = :ESTABELECIMENTO_ID
                ORDER BY T.UF ASC
            INTO :TRIBUTACAO_ICMS, :ALIQUOTA_ICMS, :BASE_CALCULO_ICMS, :TRIBUTACAO_PIS, :TRIBUTACAO_COFINS,
            :ALIQUOTA_PIS, :ALIQUOTA_PIS_DIFER, :ALIQUOTA_COFINS, :ALIQUOTA_COFINS_DIFER, :REDUCAO_BASE_PISCOF,
            :MODALIDADE_ICMS, :MODALIDADE_ICMS_ST, :ALIQUOTA_ICMS_ST, :OPERACAO_TIPO_DESCONTO
            DO BEGIN
    
                /* DEFININDO CRITERIO DO DESCONTO PARA CONDICIONAL/INCONDICINAL ABATER DAS BASES DE CALCULOS */
                :VALOR_DESCONTO_INCON = 0;
    
                IF(:OPERACAO_TIPO_DESCONTO = 'I') THEN
                BEGIN
                    :VALOR_DESCONTO_INCON = :VALOR_DESCONTO_ITEM;
                END
    
                /* CALCULANDO ICMS ST */
    
                :REDUCAO_ICMS_ST        = 0;
                :MARGEM_ICMS_ST         = 0;
                :BASECALCULO_ICMS_ST    = 0;
                :PERCENTUAL_ICMS_ST     = 0;
                :VALOR_ICMS_ST          = 0;
    
                IF(:ALIQUOTA_ICMS_ST > 0) THEN
                BEGIN
    
                    :BASECALCULO_ICMS_ST = :VALOR_TOTAL_ITEM - :VALOR_DESCONTO_INCON;
                    :BASECALCULO_ICMS_ST = CAST(:BASECALCULO_ICMS_ST AS NUMERIC(15,2));
                    :PERCENTUAL_ICMS_ST  = :ALIQUOTA_ICMS_ST;
                    :VALOR_ICMS_ST       = :BASECALCULO_ICMS_ST * (:ALIQUOTA_ICMS_ST / 100);
                    :VALOR_ICMS_ST       = CAST(:VALOR_ICMS_ST AS NUMERIC(15,2));
    
                END
    
                /* CALCULANDO ICMS */
    
                :PERCENTUAL_BASECALCULO_ICMS = 0;
                :BASECALCULO_ICMS = 0;
                :VALOR_ICMS = 0;
                :PERCENTUAL_ICMS = 0;
    
                IF(:TRIBUTACAO_ICMS = 0 OR :TRIBUTACAO_ICMS = 10 OR :TRIBUTACAO_ICMS = 101 OR :TRIBUTACAO_ICMS = 201 OR :TRIBUTACAO_ICMS = 20 OR :TRIBUTACAO_ICMS = 70) THEN
                BEGIN
    
                    :PERCENTUAL_BASECALCULO_ICMS = :BASE_CALCULO_ICMS;
    
                    :BASECALCULO_ICMS            = (:VALOR_TOTAL_ITEM + :VALOR_ACRESCIMO_ITEM + :VALOR_FRETE_ITEM - :VALOR_DESCONTO_INCON) * (:PERCENTUAL_BASECALCULO_ICMS / 100);
                    :BASECALCULO_ICMS            = CAST(:BASECALCULO_ICMS AS NUMERIC(15,2));
    
                    :PERCENTUAL_ICMS             = :ALIQUOTA_ICMS;
    
                    :VALOR_ICMS                  = :BASECALCULO_ICMS * (:ALIQUOTA_ICMS / 100);
                    :VALOR_ICMS                  = CAST(:VALOR_ICMS AS NUMERIC(15,2));
    
                END
    
                /* DEFININDO REDUCAO DA BASE DE CALCULO NO PIS/COFINS */
                :VALOR_REDUTOR_BASEPISCOF = 0;
    
                IF(:REDUCAO_BASE_PISCOF = '1') THEN
                BEGIN
                    :VALOR_REDUTOR_BASEPISCOF = :VALOR_ICMS;
                END
    
                /* CALCULANDO PIS */
    
                :BASECALCULO_PIS      = 0;
                :VALOR_PIS            = 0;
                :PERCENTUAL_PIS       = 0;
    
                IF(:TRIBUTACAO_PIS = '01' 
                    OR :TRIBUTACAO_PIS = '02'
                    OR :TRIBUTACAO_PIS = '50'
                    OR :TRIBUTACAO_PIS = '51'
                    OR :TRIBUTACAO_PIS = '52'
                    OR :TRIBUTACAO_PIS = '53'
                    OR :TRIBUTACAO_PIS = '54'
                    OR :TRIBUTACAO_PIS = '55'
                    OR :TRIBUTACAO_PIS = '56'
                    OR :TRIBUTACAO_PIS = '60'
                    OR :TRIBUTACAO_PIS = '61'
                    OR :TRIBUTACAO_PIS = '62'
                    OR :TRIBUTACAO_PIS = '63'
                    OR :TRIBUTACAO_PIS = '64'
                    OR :TRIBUTACAO_PIS = '65'
                    OR :TRIBUTACAO_PIS = '66') THEN
                BEGIN
                    :BASECALCULO_PIS            = (:VALOR_TOTAL_ITEM + :VALOR_ACRESCIMO_ITEM + :VALOR_FRETE_ITEM - :VALOR_DESCONTO_INCON - :VALOR_REDUTOR_BASEPISCOF);
    
                    :PERCENTUAL_PIS             = :ALIQUOTA_PIS;
    
                    IF(:TRIBUTACAO_PIS = '02') THEN
                    BEGIN
                        :PERCENTUAL_PIS             = :ALIQUOTA_PIS_DIFER;
                    END
    
                    :VALOR_PIS                  = :BASECALCULO_PIS * (:PERCENTUAL_PIS / 100);
                    :VALOR_PIS                  = CAST(:VALOR_PIS AS NUMERIC(15,2));
    
                END
    
                /* CALCULANDO COFINS */
    
                :BASECALCULO_COFINS      = 0;
                :VALOR_COFINS            = 0;
                :PERCENTUAL_COFINS       = 0;
    
                IF(:TRIBUTACAO_COFINS = '01'
                    OR :TRIBUTACAO_COFINS = '02'
                    OR :TRIBUTACAO_COFINS = '50'
                    OR :TRIBUTACAO_COFINS = '51'
                    OR :TRIBUTACAO_COFINS = '52'
                    OR :TRIBUTACAO_COFINS = '53'
                    OR :TRIBUTACAO_COFINS = '54'
                    OR :TRIBUTACAO_COFINS = '55'
                    OR :TRIBUTACAO_COFINS = '56'
                    OR :TRIBUTACAO_COFINS = '60'
                    OR :TRIBUTACAO_COFINS = '61'
                    OR :TRIBUTACAO_COFINS = '62'
                    OR :TRIBUTACAO_COFINS = '63'
                    OR :TRIBUTACAO_COFINS = '64'
                    OR :TRIBUTACAO_COFINS = '65'
                    OR :TRIBUTACAO_COFINS = '66') THEN
                BEGIN
                    :BASECALCULO_COFINS            = (:VALOR_TOTAL_ITEM + :VALOR_ACRESCIMO_ITEM + :VALOR_FRETE_ITEM - :VALOR_DESCONTO_INCON - :VALOR_REDUTOR_BASEPISCOF);
    
                    :PERCENTUAL_COFINS             = :ALIQUOTA_COFINS;
    
                    IF(:TRIBUTACAO_COFINS = '02') THEN
                    BEGIN
                        :PERCENTUAL_COFINS             = :ALIQUOTA_COFINS_DIFER;
                    END
    
                    :VALOR_COFINS                  = :BASECALCULO_COFINS * (:PERCENTUAL_COFINS / 100);
                    :VALOR_COFINS                  = CAST(:VALOR_COFINS AS NUMERIC(15,2));
    
                END
    
    
                /* CALCULANDO VALOR CONTABIL */
    
                :VALOR_CONTABIL     = :VALOR_TOTAL_ITEM + :VALOR_IPI_ITEM + :VALOR_ACRESCIMO_ITEM + :VALOR_FRETE_ITEM + :VALOR_ICMS_ST - :VALOR_DESCONTO_INCON;
                :VALOR_CONTABIL     = CAST(:VALOR_CONTABIL AS NUMERIC(15,2));
    
                :FISCAL_OUTRAS_ICMS = :VALOR_CONTABIL - :BASECALCULO_ICMS;
    
                IF(:FISCAL_OUTRAS_ICMS < 0) THEN
                BEGIN
                    :FISCAL_OUTRAS_ICMS = 0;
                END
    
                UPDATE TBPDV_CFE_ITEM T SET T.TRIBUTACAO_ICMS = :TRIBUTACAO_ICMS, T.PERCENTUAL_BASECALCULO_ICMS = :PERCENTUAL_BASECALCULO_ICMS,
                T.BASECALCULO_ICMS = :BASECALCULO_ICMS, T.VALOR_ICMS = :VALOR_ICMS, T.ALIQUOTA_ICMS = :PERCENTUAL_ICMS, T.TRIBUTACAO_PIS = :TRIBUTACAO_PIS,
                T.BASECALCULO_PIS = :BASECALCULO_PIS, T.ALIQUOTA_PIS = :PERCENTUAL_PIS, T.VALOR_PIS = :VALOR_PIS, T.TRIBUTACAO_COFINS = :TRIBUTACAO_COFINS,
                T.BASECALCULO_COFINS = :BASECALCULO_COFINS, T.ALIQUOTA_COFINS = :PERCENTUAL_COFINS, T.VALOR_COFINS = :VALOR_COFINS, T.REDUCAO_ICMS_ST = :REDUCAO_ICMS_ST,
                T.MARGEM_ICMS_ST = :MARGEM_ICMS_ST, T.BASECALCULO_ICMS_ST = :BASECALCULO_ICMS_ST, T.MODALIDADE_ICMS = :MODALIDADE_ICMS, T.MODALIDADE_ICMS_ST = :MODALIDADE_ICMS_ST,
                T.ALIQUOTA_ICMS_ST = :PERCENTUAL_ICMS_ST, T.VALOR_ICMS_ST = :VALOR_ICMS_ST, T.VALOR_CONTABIL = :VALOR_CONTABIL, T.FISCAL_OUTRAS_ICMS = :FISCAL_OUTRAS_ICMS,
                T.ALTERACAO_TRIBUTACAO = 1
                WHERE T.ID = :PDV_CFE_ITEM_ID;
    
    
            END
        END
        /* PUXAR INFORMACOES DA FAMILIA DO PRODUTO */
        ELSE IF(:TIPO = 0 OR :TIPO = 2) THEN
        BEGIN

            FOR SELECT
                CAST(COALESCE(FF.CST, 0) AS INTEGER),
                FF.TAXA_ICMS,
                IIF(FF.CST IS NOT NULL AND FF.CST <> '', (SELECT FIRST 1 I.BASECALCULO FROM TBTRIBUTACAO_ICMS I WHERE I.CODIGO = CAST(FF.CST AS INTEGER)), 0) AS PERCENTUAL_BASECALCULO_ICMS,
                TRIM(COALESCE(FF.CST_PISCOF, '')) AS CST_PIS,
                TRIM(COALESCE(FF.CST_PISCOF, '')) AS CST_COFINS,
                FF.taxa_pis,
                FF.taxa_pis,
                FF.taxa_cofins,
                FF.taxa_cofins,
                TRIM(COALESCE(C.REDUCAO_BASE_PISCOF, '0')) REDUCAO_BASE_PISCOF,
                0 AS MODALIDADE_ICMS,
                '' AS MODALIDADE_ICMS_ST,
                0 ALIQUOTA_ICMS_ST,
                COALESCE(O.TIPO_DESCONTO, 'C')

            FROM TBFAMILIA_FICHA FF
            INNER JOIN TBCFOP C ON C.CODIGO = FF.CFOP_CODIGO
            INNER JOIN TBOPERACAO O ON O.CODIGO = FF.OPERACAO_PDV
            WHERE FF.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_ID
            AND FF.FAMILIA_CODIGO = :FAMILIA_ID
            INTO :TRIBUTACAO_ICMS, :ALIQUOTA_ICMS, :BASE_CALCULO_ICMS, :TRIBUTACAO_PIS, :TRIBUTACAO_COFINS,
            :ALIQUOTA_PIS, :ALIQUOTA_PIS_DIFER, :ALIQUOTA_COFINS, :ALIQUOTA_COFINS_DIFER, :REDUCAO_BASE_PISCOF,
            :MODALIDADE_ICMS, :MODALIDADE_ICMS_ST, :ALIQUOTA_ICMS_ST, :OPERACAO_TIPO_DESCONTO
            DO BEGIN

                /* DEFININDO CRITERIO DO DESCONTO PARA CONDICIONAL/INCONDICINAL ABATER DAS BASES DE CALCULOS */
                :VALOR_DESCONTO_INCON = 0;
    
                IF(:OPERACAO_TIPO_DESCONTO = 'I') THEN
                BEGIN
                    :VALOR_DESCONTO_INCON = :VALOR_DESCONTO_ITEM;
                END
    
                /* CALCULANDO ICMS ST */
    
                :REDUCAO_ICMS_ST        = 0;
                :MARGEM_ICMS_ST         = 0;
                :BASECALCULO_ICMS_ST    = 0;
                :PERCENTUAL_ICMS_ST     = 0;
                :VALOR_ICMS_ST          = 0;
    
                IF(:ALIQUOTA_ICMS_ST > 0) THEN
                BEGIN
    
                    :BASECALCULO_ICMS_ST = :VALOR_TOTAL_ITEM - :VALOR_DESCONTO_INCON;
                    :BASECALCULO_ICMS_ST = CAST(:BASECALCULO_ICMS_ST AS NUMERIC(15,2));
                    :PERCENTUAL_ICMS_ST  = :ALIQUOTA_ICMS_ST;
                    :VALOR_ICMS_ST       = :BASECALCULO_ICMS_ST * (:ALIQUOTA_ICMS_ST / 100);
                    :VALOR_ICMS_ST       = CAST(:VALOR_ICMS_ST AS NUMERIC(15,2));
    
                END
    
                /* CALCULANDO ICMS */
    
                :PERCENTUAL_BASECALCULO_ICMS = 0;
                :BASECALCULO_ICMS = 0;
                :VALOR_ICMS = 0;
                :PERCENTUAL_ICMS = 0;
    
                IF(:TRIBUTACAO_ICMS = 0 OR :TRIBUTACAO_ICMS = 10 OR :TRIBUTACAO_ICMS = 101 OR :TRIBUTACAO_ICMS = 201 OR :TRIBUTACAO_ICMS = 20 OR :TRIBUTACAO_ICMS = 70) THEN
                BEGIN
    
                    :PERCENTUAL_BASECALCULO_ICMS = :BASE_CALCULO_ICMS;
    
                    :BASECALCULO_ICMS            = (:VALOR_TOTAL_ITEM + :VALOR_ACRESCIMO_ITEM + :VALOR_FRETE_ITEM - :VALOR_DESCONTO_INCON) * (:PERCENTUAL_BASECALCULO_ICMS / 100);
                    :BASECALCULO_ICMS            = CAST(:BASECALCULO_ICMS AS NUMERIC(15,2));
    
                    :PERCENTUAL_ICMS             = :ALIQUOTA_ICMS;
    
                    :VALOR_ICMS                  = :BASECALCULO_ICMS * (:ALIQUOTA_ICMS / 100);
                    :VALOR_ICMS                  = CAST(:VALOR_ICMS AS NUMERIC(15,2));
    
                END
    
                /* DEFININDO REDUCAO DA BASE DE CALCULO NO PIS/COFINS */
                :VALOR_REDUTOR_BASEPISCOF = 0;
    
                IF(:REDUCAO_BASE_PISCOF = '1') THEN
                BEGIN
                    :VALOR_REDUTOR_BASEPISCOF = :VALOR_ICMS;
                END
    
                /* CALCULANDO PIS */
    
                :BASECALCULO_PIS      = 0;
                :VALOR_PIS            = 0;
                :PERCENTUAL_PIS       = 0;
    
                IF(:TRIBUTACAO_PIS = '01' 
                    OR :TRIBUTACAO_PIS = '02'
                    OR :TRIBUTACAO_PIS = '50'
                    OR :TRIBUTACAO_PIS = '51'
                    OR :TRIBUTACAO_PIS = '52'
                    OR :TRIBUTACAO_PIS = '53'
                    OR :TRIBUTACAO_PIS = '54'
                    OR :TRIBUTACAO_PIS = '55'
                    OR :TRIBUTACAO_PIS = '56'
                    OR :TRIBUTACAO_PIS = '60'
                    OR :TRIBUTACAO_PIS = '61'
                    OR :TRIBUTACAO_PIS = '62'
                    OR :TRIBUTACAO_PIS = '63'
                    OR :TRIBUTACAO_PIS = '64'
                    OR :TRIBUTACAO_PIS = '65'
                    OR :TRIBUTACAO_PIS = '66') THEN
                BEGIN
                    :BASECALCULO_PIS            = (:VALOR_TOTAL_ITEM + :VALOR_ACRESCIMO_ITEM + :VALOR_FRETE_ITEM - :VALOR_DESCONTO_INCON - :VALOR_REDUTOR_BASEPISCOF);
    
                    :PERCENTUAL_PIS             = :ALIQUOTA_PIS;
    
                    IF(:TRIBUTACAO_PIS = '02') THEN
                    BEGIN
                        :PERCENTUAL_PIS             = :ALIQUOTA_PIS_DIFER;
                    END
    
                    :VALOR_PIS                  = :BASECALCULO_PIS * (:PERCENTUAL_PIS / 100);
                    :VALOR_PIS                  = CAST(:VALOR_PIS AS NUMERIC(15,2));
    
                END
    
                /* CALCULANDO COFINS */
    
                :BASECALCULO_COFINS      = 0;
                :VALOR_COFINS            = 0;
                :PERCENTUAL_COFINS       = 0;
    
                IF(:TRIBUTACAO_COFINS = '01'
                    OR :TRIBUTACAO_COFINS = '02'
                    OR :TRIBUTACAO_COFINS = '50'
                    OR :TRIBUTACAO_COFINS = '51'
                    OR :TRIBUTACAO_COFINS = '52'
                    OR :TRIBUTACAO_COFINS = '53'
                    OR :TRIBUTACAO_COFINS = '54'
                    OR :TRIBUTACAO_COFINS = '55'
                    OR :TRIBUTACAO_COFINS = '56'
                    OR :TRIBUTACAO_COFINS = '60'
                    OR :TRIBUTACAO_COFINS = '61'
                    OR :TRIBUTACAO_COFINS = '62'
                    OR :TRIBUTACAO_COFINS = '63'
                    OR :TRIBUTACAO_COFINS = '64'
                    OR :TRIBUTACAO_COFINS = '65'
                    OR :TRIBUTACAO_COFINS = '66') THEN
                BEGIN
                    :BASECALCULO_COFINS            = (:VALOR_TOTAL_ITEM + :VALOR_ACRESCIMO_ITEM + :VALOR_FRETE_ITEM - :VALOR_DESCONTO_INCON - :VALOR_REDUTOR_BASEPISCOF);
    
                    :PERCENTUAL_COFINS             = :ALIQUOTA_COFINS;
    
                    IF(:TRIBUTACAO_COFINS = '02') THEN
                    BEGIN
                        :PERCENTUAL_COFINS             = :ALIQUOTA_COFINS_DIFER;
                    END
    
                    :VALOR_COFINS                  = :BASECALCULO_COFINS * (:PERCENTUAL_COFINS / 100);
                    :VALOR_COFINS                  = CAST(:VALOR_COFINS AS NUMERIC(15,2));
    
                END
    
    
                /* CALCULANDO VALOR CONTABIL */
    
                :VALOR_CONTABIL     = :VALOR_TOTAL_ITEM + :VALOR_IPI_ITEM + :VALOR_ACRESCIMO_ITEM + :VALOR_FRETE_ITEM + :VALOR_ICMS_ST - :VALOR_DESCONTO_INCON;
                :VALOR_CONTABIL     = CAST(:VALOR_CONTABIL AS NUMERIC(15,2));
    
                :FISCAL_OUTRAS_ICMS = :VALOR_CONTABIL - :BASECALCULO_ICMS;
    
                IF(:FISCAL_OUTRAS_ICMS < 0) THEN
                BEGIN
                    :FISCAL_OUTRAS_ICMS = 0;
                END
    
                UPDATE TBPDV_CFE_ITEM T SET T.TRIBUTACAO_ICMS = :TRIBUTACAO_ICMS, T.PERCENTUAL_BASECALCULO_ICMS = :PERCENTUAL_BASECALCULO_ICMS,
                T.BASECALCULO_ICMS = :BASECALCULO_ICMS, T.VALOR_ICMS = :VALOR_ICMS, T.ALIQUOTA_ICMS = :PERCENTUAL_ICMS, T.TRIBUTACAO_PIS = :TRIBUTACAO_PIS,
                T.BASECALCULO_PIS = :BASECALCULO_PIS, T.ALIQUOTA_PIS = :PERCENTUAL_PIS, T.VALOR_PIS = :VALOR_PIS, T.TRIBUTACAO_COFINS = :TRIBUTACAO_COFINS,
                T.BASECALCULO_COFINS = :BASECALCULO_COFINS, T.ALIQUOTA_COFINS = :PERCENTUAL_COFINS, T.VALOR_COFINS = :VALOR_COFINS, T.REDUCAO_ICMS_ST = :REDUCAO_ICMS_ST,
                T.MARGEM_ICMS_ST = :MARGEM_ICMS_ST, T.BASECALCULO_ICMS_ST = :BASECALCULO_ICMS_ST, T.MODALIDADE_ICMS = :MODALIDADE_ICMS, T.MODALIDADE_ICMS_ST = :MODALIDADE_ICMS_ST,
                T.ALIQUOTA_ICMS_ST = :PERCENTUAL_ICMS_ST, T.VALOR_ICMS_ST = :VALOR_ICMS_ST, T.VALOR_CONTABIL = :VALOR_CONTABIL, T.FISCAL_OUTRAS_ICMS = :FISCAL_OUTRAS_ICMS,
                T.ALTERACAO_TRIBUTACAO = 1
                WHERE T.ID = :PDV_CFE_ITEM_ID;

            END

        END


    END
    
END
^

SET TERM ; ^

