CREATE TABLE TBLEITURA_DOC_BARRA (
    ID INTEGER,
    DESCRICAO VARCHAR(100),
    DADOS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    STATUS INTEGER);

CREATE SEQUENCE GTBLEITURA_DOC_BARRA;

create trigger ttbleitura_doc_barra_b01i for tbleitura_doc_barra
active before insert position 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbleitura_doc_barra,1);
end;

CREATE INDEX ITBLEITURA_DOC_BARRA_01
ON TBLEITURA_DOC_BARRA (ID);

ALTER TABLE TBMFE
    ADD CONTABILIZACAO_ID INTEGER,
    ADD OLD_CONTABILIZACAO_ID INTEGER;

ALTER TABLE TBQUIOSQUE
    ADD CONTABILIZAR INTEGER;

COMMENT ON COLUMN TBQUIOSQUE.CONTABILIZAR IS
'1 - sim
0 - nao';

CREATE OR ALTER trigger ttbmfe_b01ui for tbmfe
active before insert or update position 5
AS
declare variable total_itens numeric(18,4);
declare variable total_cupom numeric(18,4);
declare variable estabelecimento integer;
declare variable operacao varchar(10);
declare variable conta_credito varchar(20);
declare variable conta_debito varchar(20);
declare variable I numeric(18,4);
declare variable contabilizar integer;
declare variable flag integer;
begin

   contabilizar = 0;

   if(inserting and new.situacao = 'E')then
   begin
      --se inserte e nao cancelado
      contabilizar = 1;
   end else
   begin

      --se mudar para cancelado e estiver contabilizado
      if(new.situacao = 'C' and old.situacao = 'E' and new.contabilizacao_id > 0)then
      begin
        contabilizar = 2;
      end

      --se o cancelado foi desfeito e não estiver contabilizado
      if(new.situacao = 'E' and old.situacao = 'C' and new.contabilizacao_id = 0)then
      begin
         contabilizar = 1;
      end

   end

   if(contabilizar = 1)then
   begin
        :flag = 0;

        select first 1
            q.estabelecimento_id,
            q.operacao_saida,
            q.contabilizar
        from tbquiosque q where q.id = new.caixa_id
        into
            :estabelecimento,
            :operacao,
            :flag;

        --se quiosque esta configurado para contabilizar
        if((:flag = 1) and (:estabelecimento > 0) and (:operacao <> '') and (:operacao <> null))then
        begin
                --contabilizar    
                new.contabilizacao_id = FN_CONTABILIZAR(
                                        :estabelecimento,
                                        :operacao,
                                        new.vl_produtos,
                                        new.vl_icms,
                                        0,
                                        new.vl_pis,
                                        new.vl_cofins,
                                        0,
                                        0,
                                        new.vl_desconto,
                                        0,
                                        0,
                                        0,
                                        0,
                                        0,
                                        0,
                                        0,
                                        0,
                                        0,
                                        0,
                                        0,
                                        'CFI',
                                        new.numero,
                                        lpad(new.sat_numero_cfe,10,'0'),
                                       new.dt_emissao);

                new.contabilizacao_id = new.old_contabilizacao_id;
        end else
        begin
           new.contabilizacao_id = 0;
           new.old_contabilizacao_id = 0;
        end
   end

   if(contabilizar = 2)then
   begin

       --excluir contabilizacao
       DELETE FROM TBMOVCONTMESTRE M WHERE M.ID = NEW.CONTABILIZACAO_ID;
       DELETE FROM TBMOVCONTABIL WHERE IDCONTMOV = NEW.CONTABILIZACAO_ID;
       new.contabilizacao_id = 0;

   end

end;

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(TBMOVCONT_ID_GEN,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        );

        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,
                :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,
                :CONTA_CREDITO,
                :VALOR,
                :I_TIPOLANC
            );


    end
    
    return ID_MESTRE;
end;


CREATE OR ALTER function fn_calc_contabilizar (
    operacao varchar(10),
    valor1 numeric(15,2),
    valor2 numeric(15,2))
returns numeric(15,2)
as
declare variable ret numeric(15,2);
begin

  if(OPERACAO = '+')then
  begin
    RET = VALOR1 + VALOR2;
  end

  if(OPERACAO = '-')then
  begin
    RET = VALOR1 - VALOR2;
  end

  if(OPERACAO = '*')then
  begin
    RET = VALOR1 * VALOR2;
  end

  if(trim(coalesce(OPERACAO,'')) = '')then
  begin
    RET = VALOR1;
  end

  return RET;
end;

