SET TERM ^ ;

CREATE OR ALTER procedure SPC_NFE_ITEM_CUSTO
returns (
    NFE_ID integer,
    DATA_ENTRADA DATE,
    NFE_ITEM_ID integer,
    SEQUENCIA integer,
    VALOR_CUSTO_RET numeric(15,4),
    VALOR_CUSTO_ATUAL numeric(15,4),
    DIFERENCA numeric(15,4))
as
declare variable CONTROLE integer;
declare variable VALOR_UNITARIO numeric(18,8);
declare variable PERCENTUAL_PIS numeric(10,5);
declare variable PERCENTUAL_COFINS numeric(10,5);
declare variable PERCENTUAL_ICMS numeric(10,5);
declare variable PERCENTUAL_BASECALCULO_ICMS numeric(10,5);
declare variable REDUCAO_ICMS_ST numeric(15,4);
declare variable ALIQUOTA_ICMS_ST numeric(15,4);
declare variable VALOR_PIS_UNITARIO numeric(18,8);
declare variable VALOR_COFINS_UNITARIO numeric(18,8);
declare variable VALOR_ICMS_UNITARIO numeric(18,8);
declare variable VALOR_ICMS_ST_UNITARIO numeric(18,8);
declare variable VALOR_ACRESCIMO numeric(10,2);
declare variable VALOR_SEGURO numeric(10,2);
declare variable VALOR_FRETE numeric(10,2);
declare variable VALOR_DESCONTO numeric(10,2);
declare variable QUANTIDADE numeric(10,5);
declare variable FORMULA_CUSTO_UNITARIO varchar(7000);
declare variable VALOR_CUSTO numeric(10,5);
declare variable NFE_CONTROLE integer;
declare variable SEQUENCIA_ITEM integer;
declare variable VALOR_CUSTO_ITEM numeric(10,5);
BEGIN
    FOR SELECT
        T.NFE_CONTROLE,
        E.DATA_ENTRADA,
        T.CONTROLE,
        T.SEQUENCIA,
        T.VALOR_UNITARIO,
        COALESCE(T.PERCENTUAL_PIS, 0),
        COALESCE(T.PERCENTUAL_COFINS, 0),
        COALESCE(T.PERCENTUAL_ICMS, 0),
        COALESCE(T.BASECALCULO_ICMS, 0) AS PERCENTUAL_BASECALCULO_ICMS,
        IIF(COALESCE(T.REDUCAO_ICMS_ST, 0) = 0, 100, COALESCE(T.REDUCAO_ICMS_ST, 0)),
        COALESCE(T.ALIQUOTA_ICMS_ST, 0),
        COALESCE(T.VALOR_ACRESCIMO, 0),
        COALESCE(T.VALOR_SEGURO, 0),
        COALESCE(T.VALOR_FRETE, 0),
        COALESCE(T.VALOR_DESCONTO, 0),
        T.QUANTIDADE,
        T.VALOR_CUSTO

    FROM TBNFE_ITEM T
    INNER JOIN TBNFE E ON E.CONTROLE = T.NFE_CONTROLE
    WHERE T.DATA_ENTRADA >= '01.01.2022'
    AND  T.VALOR_CUSTO > 0
    AND T.CFOP_CODIGO NOT IN ('1.124', '2.124', '1.352', '2.352', '2.949', '1.949')
    ORDER BY T.DATA_ENTRADA DESC
    INTO :NFE_CONTROLE, :DATA_ENTRADA, :CONTROLE, :SEQUENCIA_ITEM, :VALOR_UNITARIO, :PERCENTUAL_PIS, :PERCENTUAL_COFINS,
    :PERCENTUAL_ICMS, :PERCENTUAL_BASECALCULO_ICMS, :REDUCAO_ICMS_ST, :ALIQUOTA_ICMS_ST,
    :VALOR_ACRESCIMO, :VALOR_SEGURO, :VALOR_FRETE, :VALOR_DESCONTO, :QUANTIDADE, :VALOR_CUSTO_ITEM
    DO BEGIN

        :VALOR_PIS_UNITARIO         = :VALOR_UNITARIO * (:PERCENTUAL_PIS / 100);
        :VALOR_COFINS_UNITARIO      = :VALOR_UNITARIO * (:PERCENTUAL_COFINS / 100);
        :VALOR_ICMS_UNITARIO        = CAST(:VALOR_UNITARIO * CAST(((:PERCENTUAL_BASECALCULO_ICMS / 100) * (:PERCENTUAL_ICMS / 100)) AS NUMERIC(15,4)) AS NUMERIC(18,8));
        :VALOR_ICMS_ST_UNITARIO     = CAST(:VALOR_UNITARIO * CAST(((:REDUCAO_ICMS_ST / 100) * (:ALIQUOTA_ICMS_ST / 100)) AS NUMERIC(15,4)) AS NUMERIC(18,8));
    
        :FORMULA_CUSTO_UNITARIO     = CAST(FN_PARAMETRO('SISTEMA.FORMULA_CUSTO_UNITARIO') AS VARCHAR(7000));

        :FORMULA_CUSTO_UNITARIO     = REPLACE(:FORMULA_CUSTO_UNITARIO, 'VR_UNIT', :VALOR_UNITARIO);
        :FORMULA_CUSTO_UNITARIO     = REPLACE(:FORMULA_CUSTO_UNITARIO, 'VR_PIS_UNIT', :VALOR_PIS_UNITARIO);
        :FORMULA_CUSTO_UNITARIO     = REPLACE(:FORMULA_CUSTO_UNITARIO, 'VR_COFINS_UNIT', :VALOR_COFINS_UNITARIO);
        :FORMULA_CUSTO_UNITARIO     = REPLACE(:FORMULA_CUSTO_UNITARIO, 'VR_ICMS_UNIT', :VALOR_ICMS_UNITARIO);
        :FORMULA_CUSTO_UNITARIO     = REPLACE(:FORMULA_CUSTO_UNITARIO, 'VR_ICMS_ST_UNIT', :VALOR_ICMS_ST_UNITARIO);
        :FORMULA_CUSTO_UNITARIO     = REPLACE(:FORMULA_CUSTO_UNITARIO, 'VR_ACRES', :VALOR_ACRESCIMO);
        :FORMULA_CUSTO_UNITARIO     = REPLACE(:FORMULA_CUSTO_UNITARIO, 'VR_SEG', :VALOR_SEGURO);
        :FORMULA_CUSTO_UNITARIO     = REPLACE(:FORMULA_CUSTO_UNITARIO, 'VR_FRETE', :VALOR_FRETE);
        :FORMULA_CUSTO_UNITARIO     = REPLACE(:FORMULA_CUSTO_UNITARIO, 'VR_DESCONTO', :VALOR_DESCONTO);
        :FORMULA_CUSTO_UNITARIO     = REPLACE(:FORMULA_CUSTO_UNITARIO, 'QTD', :QUANTIDADE);

        :VALOR_CUSTO = CAST(FN_EXECUTE_CALC_V3(:FORMULA_CUSTO_UNITARIO) AS NUMERIC(15,4));


    
        IF(:VALOR_CUSTO <> :VALOR_CUSTO_ITEM) THEN
        BEGIN
            :NFE_ID = :NFE_CONTROLE;
            :NFE_ITEM_ID = :CONTROLE;
            :SEQUENCIA = :SEQUENCIA_ITEM;
            :VALOR_CUSTO_RET = :VALOR_CUSTO;
            :VALOR_CUSTO_ATUAL = :VALOR_CUSTO_ITEM;
            :DIFERENCA = ABS(:VALOR_CUSTO_RET - :VALOR_CUSTO_ATUAL);
            SUSPEND;
        END

    END

END
^

SET TERM ; ^

