SET TERM ^ ;

CREATE OR ALTER procedure SPC_ITEM_CUSTO (
    NFE_ITEM_ID integer)
returns (
    VALOR_CUSTO 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_IPI 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_IPI_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 OUTROS_CUSTOS numeric(15,2);
declare variable VALOR_FRETE_RATEADO numeric(15,2);
declare variable CUSTO_FRETE_RATEADO numeric(15,2);
declare variable QUANTIDADE numeric(10,5);
declare variable FORMULA_CUSTO_UNITARIO varchar(7000);
declare variable VALOR_CUSTO_RET numeric(10,5);
declare variable VALOR_CUSTO_UNITARIO_REF numeric(10,5);
BEGIN
    FOR SELECT
        T.CONTROLE,
        T.VALOR_UNITARIO,
        COALESCE(T.PERCENTUAL_PIS, 0),
        COALESCE(T.PERCENTUAL_COFINS, 0),
        COALESCE(T.PERCENTUAL_IPI, 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),
        COALESCE(T.OUTROS_CUSTOS, 0),
        COALESCE(T.VALOR_FRETE_RATEADO, 0),
        coalesce(T.CUSTO_FRETE_RATEADO,0),
        T.QUANTIDADE,
        COALESCE((SELECT FIRST 1 SUM(COALESCE(K.VALOR_CUSTO_UNITARIO, 0)) FROM TBNFE_ITEM_CUS_UNIT K WHERE K.NFE_DESTINO_ITEM_ID = T.CONTROLE), 0) AS CUSTO_UNIT_REF

    FROM TBNFE_ITEM T
    WHERE T.CONTROLE = :NFE_ITEM_ID
    INTO :CONTROLE, :VALOR_UNITARIO, :PERCENTUAL_PIS, :PERCENTUAL_COFINS, :PERCENTUAL_IPI,
    :PERCENTUAL_ICMS, :PERCENTUAL_BASECALCULO_ICMS, :REDUCAO_ICMS_ST, :ALIQUOTA_ICMS_ST,
    :VALOR_ACRESCIMO, :VALOR_SEGURO, :VALOR_FRETE, :VALOR_DESCONTO, :OUTROS_CUSTOS, :VALOR_FRETE_RATEADO, :CUSTO_FRETE_RATEADO, :QUANTIDADE,
    :VALOR_CUSTO_UNITARIO_REF
    DO BEGIN

        :VALOR_PIS_UNITARIO         = :VALOR_UNITARIO * (:PERCENTUAL_PIS / 100);
        :VALOR_COFINS_UNITARIO      = :VALOR_UNITARIO * (:PERCENTUAL_COFINS / 100);
        :VALOR_IPI_UNITARIO         = :VALOR_UNITARIO * (:PERCENTUAL_IPI / 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_IPI_UNIT', :VALOR_IPI_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, 'OUTROS_CUSTOS', :OUTROS_CUSTOS);
        :FORMULA_CUSTO_UNITARIO     = REPLACE(:FORMULA_CUSTO_UNITARIO, 'VALOR_FRETE_RATEADO', :VALOR_FRETE_RATEADO);
        :FORMULA_CUSTO_UNITARIO     = REPLACE(:FORMULA_CUSTO_UNITARIO, 'CUSTO_FRETE_RATEADO', :CUSTO_FRETE_RATEADO);
        :FORMULA_CUSTO_UNITARIO     = REPLACE(:FORMULA_CUSTO_UNITARIO, 'QTD', :QUANTIDADE);

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

        :VALOR_CUSTO                = :VALOR_CUSTO + COALESCE(:VALOR_CUSTO_UNITARIO_REF, 0);

        SUSPEND;
    END

END
^

SET TERM ; ^

CREATE INDEX ITBNFE_ITEM_CUS_UNIT_02
ON TBNFE_ITEM_CUS_UNIT (NFE_DESTINO_ID);

CREATE INDEX ITBNFE_ITEM_CUS_UNIT_03
ON TBNFE_ITEM_CUS_UNIT (NFE_DESTINO_ITEM_ID);



