CREATE OR ALTER procedure SPU_NFE_ITEM_CUSTO
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 PARAM_PIS_COFINS integer;
declare variable VALOR_CUSTO numeric(10,5);
BEGIN
    FOR SELECT
        T.CONTROLE,
        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

    FROM TBNFE_ITEM T
    INTO :CONTROLE, :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
    DO BEGIN

        :VALOR_PIS_UNITARIO     = 0;
        :VALOR_COFINS_UNITARIO  = 0;
        :VALOR_ICMS_UNITARIO    = CAST(:VALOR_UNITARIO * CAST(((:PERCENTUAL_BASECALCULO_ICMS / 100) * (:PERCENTUAL_ICMS / 100)) AS NUMERIC(18,8)) AS NUMERIC(18,8));
        :VALOR_ICMS_ST_UNITARIO = CAST(:VALOR_UNITARIO * CAST(((:REDUCAO_ICMS_ST / 100) * (:ALIQUOTA_ICMS_ST / 100)) AS NUMERIC(18,8)) AS NUMERIC(18,8));
    
        :PARAM_PIS_COFINS       = CAST(FN_PARAMETRO('SISTEMA.CUSTO_PIS_COFINS') AS INTEGER);
    
        IF(:PARAM_PIS_COFINS = 1) THEN
        BEGIN
            :VALOR_PIS_UNITARIO         = :VALOR_UNITARIO * (:PERCENTUAL_PIS / 100);
            :VALOR_COFINS_UNITARIO      = :VALOR_UNITARIO * (:PERCENTUAL_COFINS / 100);
        END

        :VALOR_CUSTO = :VALOR_UNITARIO - (:VALOR_PIS_UNITARIO + :VALOR_COFINS_UNITARIO + :VALOR_ICMS_UNITARIO + :VALOR_ICMS_ST_UNITARIO)
            + ((:VALOR_ACRESCIMO + :VALOR_SEGURO + :VALOR_FRETE - :VALOR_DESCONTO) / :QUANTIDADE);

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

        IF(:VALOR_CUSTO > 0) THEN
        BEGIN
            UPDATE TBNFE_ITEM V SET V.VALOR_CUSTO = :VALOR_CUSTO WHERE V.CONTROLE = :CONTROLE;
        END

    END

END