SET TERM ^ ;

CREATE OR ALTER function FN_CONTABILIZAR (
    I_ESTABELECIMENTO_CODIGO integer,
    I_OPERACAO_CODIGO varchar(3),
    I_VALOR_ITEM numeric(15,2),
    I_VALOR_ICMS numeric(15,2),
    I_VALOR_IPI numeric(15,2),
    I_VALOR_PIS numeric(15,2),
    I_VALOR_COFINS numeric(15,2),
    I_VALOR_ICMS_ST numeric(15,2),
    I_VALOR_ACRESCIMOS numeric(15,2),
    I_VALOR_DESCONTOS numeric(15,2),
    I_VALOR_II numeric(15,2),
    I_VALOR_IOF numeric(15,2),
    I_VALOR_PEDAGIO_ILPUB numeric(15,2),
    I_RETENCAO_PIS numeric(15,2),
    I_RETENCAO_COFINS numeric(15,2),
    I_RETENCAO_CSLL numeric(15,2),
    I_RETENCAO_INSS numeric(15,2),
    I_RETENCAO_IRRF numeric(15,2),
    I_RETENCAO_ISSQN numeric(15,2),
    I_VALOR_FRETE numeric(15,2),
    I_VALOR_SEGURO numeric(15,2),
    CODORIGEM varchar(10),
    ID_DOCUMENTO integer,
    DESCRICAO varchar(80),
    I_DATA date = current_date,
    I_TIPOLANC varchar(2) = 'N',
    IDHISTORICO integer = 0)
returns integer
AS
declare variable estabelecimento_codigo integer;
declare variable operacao_codigo varchar(3);
declare variable id_mestre integer;
declare variable conta_credito varchar(11);
declare variable conta_debito varchar(11);
declare variable valor_item char(1);
declare variable valor_icms char(1);
declare variable valor_ipi char(1);
declare variable valor_pis char(1);
declare variable valor_cofins char(1);
declare variable valor_icms_st char(1);
declare variable valor_acrescimos char(1);
declare variable valor_descontos char(1);
declare variable valor_ii char(1);
declare variable valor_iof char(1);
declare variable valor_pedagio_ilpub char(1);
declare variable retencao_pis char(1);
declare variable retencao_cofins char(1);
declare variable retencao_csll char(1);
declare variable retencao_inss char(1);
declare variable retencao_irrf char(1);
declare variable retencao_issqn char(1);
declare variable historico_contabil varchar(100);
declare variable tipo_credito char(1);
declare variable tipo_debito char(1);
declare variable valor_frete char(1);
declare variable valor_seguro char(1);
declare variable valor numeric(15,2);
begin

    ID_MESTRE = GEN_ID(GTBMOVCONTMESTRE, 1);

    INSERT INTO TBMOVCONTMESTRE (ID, CODESTABELECIMENTO, DATA, TIPOLANC) VALUES (:ID_MESTRE, :I_ESTABELECIMENTO_CODIGO, :I_DATA , :I_TIPOLANC);

    for
      select
        ESTABELECIMENTO_CODIGO,
        OPERACAO_CODIGO,
        CONTA_CREDITO,
        CONTA_DEBITO,
        VALOR_ITEM,
        VALOR_ICMS,
        VALOR_IPI,
        VALOR_PIS,
        VALOR_COFINS,
        VALOR_ICMS_ST,
        VALOR_ACRESCIMOS,
        VALOR_DESCONTOS,
        VALOR_II,
        VALOR_IOF,
        VALOR_PEDAGIO_ILPUB,
        RETENCAO_PIS,
        RETENCAO_COFINS,
        RETENCAO_CSLL,
        RETENCAO_INSS,
        RETENCAO_IRRF,
        RETENCAO_ISSQN,
        HISTORICO_CONTABIL,
        TIPO_CREDITO,
        TIPO_DEBITO,
        VALOR_FRETE,
        VALOR_SEGURO
        from TBOPERACAO_VINCULO_CONTABIL v
        where v.operacao_codigo = :I_OPERACAO_CODIGO
        and v.estabelecimento_codigo = :I_ESTABELECIMENTO_CODIGO
    into
        :ESTABELECIMENTO_CODIGO,
        :OPERACAO_CODIGO,
        :CONTA_CREDITO,
        :CONTA_DEBITO,
        :VALOR_ITEM,
        :VALOR_ICMS,
        :VALOR_IPI,
        :VALOR_PIS,
        :VALOR_COFINS,
        :VALOR_ICMS_ST,
        :VALOR_ACRESCIMOS,
        :VALOR_DESCONTOS,
        :VALOR_II,
        :VALOR_IOF,
        :VALOR_PEDAGIO_ILPUB,
        :RETENCAO_PIS,
        :RETENCAO_COFINS,
        :RETENCAO_CSLL,
        :RETENCAO_INSS,
        :RETENCAO_IRRF,
        :RETENCAO_ISSQN,
        :HISTORICO_CONTABIL,
        :TIPO_CREDITO,
        :TIPO_DEBITO,
        :VALOR_FRETE,
        :VALOR_SEGURO
    do begin

        :VALOR = 0;
        :VALOR = FN_CALC_CONTABILIZAR(VALOR_ITEM            , :VALOR, I_VALOR_ITEM          );
        :VALOR = FN_CALC_CONTABILIZAR(VALOR_ICMS            , :VALOR, I_VALOR_ICMS          );
        :VALOR = FN_CALC_CONTABILIZAR(VALOR_IPI             , :VALOR, I_VALOR_IPI           );
        :VALOR = FN_CALC_CONTABILIZAR(VALOR_PIS             , :VALOR, I_VALOR_PIS           );
        :VALOR = FN_CALC_CONTABILIZAR(VALOR_COFINS          , :VALOR, I_VALOR_COFINS        );
        :VALOR = FN_CALC_CONTABILIZAR(VALOR_ICMS_ST         , :VALOR, I_VALOR_ICMS_ST       );
        :VALOR = FN_CALC_CONTABILIZAR(VALOR_ACRESCIMOS      , :VALOR, I_VALOR_ACRESCIMOS    );
        :VALOR = FN_CALC_CONTABILIZAR(VALOR_DESCONTOS       , :VALOR, I_VALOR_DESCONTOS     );
        :VALOR = FN_CALC_CONTABILIZAR(VALOR_II              , :VALOR, I_VALOR_II            );
        :VALOR = FN_CALC_CONTABILIZAR(VALOR_IOF             , :VALOR, I_VALOR_IOF           );
        :VALOR = FN_CALC_CONTABILIZAR(VALOR_PEDAGIO_ILPUB   , :VALOR, I_VALOR_PEDAGIO_ILPUB );
        :VALOR = FN_CALC_CONTABILIZAR(RETENCAO_PIS          , :VALOR, I_RETENCAO_PIS        );
        :VALOR = FN_CALC_CONTABILIZAR(RETENCAO_COFINS       , :VALOR, I_RETENCAO_COFINS     );
        :VALOR = FN_CALC_CONTABILIZAR(RETENCAO_CSLL         , :VALOR, I_RETENCAO_CSLL       );
        :VALOR = FN_CALC_CONTABILIZAR(RETENCAO_INSS         , :VALOR, I_RETENCAO_INSS       );
        :VALOR = FN_CALC_CONTABILIZAR(RETENCAO_IRRF         , :VALOR, I_RETENCAO_IRRF       );
        :VALOR = FN_CALC_CONTABILIZAR(RETENCAO_ISSQN        , :VALOR, I_RETENCAO_ISSQN      );
        :VALOR = FN_CALC_CONTABILIZAR(VALOR_FRETE           , :VALOR, I_VALOR_FRETE         );
        :VALOR = FN_CALC_CONTABILIZAR(VALOR_SEGURO          , :VALOR, I_VALOR_SEGURO        );

        if(:VALOR <> 0)then
        begin
            INSERT INTO TBMOVCONTABIL (
                    CODESTABELECIMENTO,
                    IDCONTMOV,
                    DATA,
                    NATUREZA,
                    IDDOCUMENTO,
                    DESCRICAO,
                    CODORIGEM,
                    IDHISTORICO,
                    HISTORICO,
                    CONTA,
                    VALOR,
                    TIPOLANC
                ) VALUES (
                    :I_ESTABELECIMENTO_CODIGO,
                    :ID_MESTRE,
                    :I_DATA,
                    'D',
                    :ID_DOCUMENTO,
                    :DESCRICAO,
                    :CODORIGEM,
                    :IDHISTORICO,
                    :HISTORICO_CONTABIL||' Doc.Nr.'||:DESCRICAO,
                    :CONTA_DEBITO,
                    :VALOR,
                    :I_TIPOLANC
                );
    
            INSERT INTO TBMOVCONTABIL (
                    CODESTABELECIMENTO,
                    IDCONTMOV,
                    DATA,
                    NATUREZA,
                    IDDOCUMENTO,
                    DESCRICAO,
                    CODORIGEM,
                    IDHISTORICO,
                    HISTORICO,
                    CONTA,
                    VALOR,
                    TIPOLANC
                ) VALUES (
                    :I_ESTABELECIMENTO_CODIGO,
                    :ID_MESTRE,
                    :I_DATA,
                    'C',
                    :ID_DOCUMENTO,
                    :DESCRICAO,
                    :CODORIGEM,
                    :IDHISTORICO,
                    :HISTORICO_CONTABIL||' Doc.Nr.'||:DESCRICAO,
                    :CONTA_CREDITO,
                    :VALOR,
                    :I_TIPOLANC
                );
         end

    end
    
    return ID_MESTRE;
end^

SET TERM ; ^

