CREATE OR ALTER procedure spu_tratar_mfe 
returns (
    cont integer)
as
declare variable tag_id integer;
declare variable caixa_id integer;
begin

    UPDATE TBMFE e set e.flag_atualizacao = e.flag_atualizacao + 1 where e.contabilizacao_id = 0 and e.situacao = 'E';

    CONT = 0;

    for
        select
            p.tag_id,
            p.caixa_id
        from TBMFE_PARCELAMENTO p, tbmfe e, tbforma_pagamento_sat s
        where p.serie = e.serie
        and p.numero = e.numero
        and p.caixa_id = e.caixa_id
        and p.forma_pagamento = s.id
        and s.id_sat = 1
        and p.parcelamento_id = 0
        and e.situacao = 'E'
    into
      :tag_id,
      :caixa_id
    do begin
      UPDATE TBMFE_PARCELAMENTO t  set t.flag_atualizacao = t.flag_atualizacao + 1 where t.tag_id = :tag_id and t.caixa_id = :caixa_id;
      CONT = CONT + 1;
    end

    for
        select
            p.tag_id,
            p.caixa_id
        from tbmfe_parcelamento_item p, tbmfe e
        where p.cfe_serie = e.serie
        and p.cfe_numero = e.numero
        and p.caixa_id = e.caixa_id
        and p.parcelamento_id = 0
        and e.situacao = 'E'
        and p.pagamento_id > 0
    into
      :tag_id,
      :caixa_id
    do begin
      UPDATE tbmfe_parcelamento_item t  set t.flag_atualizacao = t.flag_atualizacao + 1 where t.tag_id = :tag_id and t.caixa_id = :caixa_id;
      CONT = CONT + 1;
    end
end;

ALTER TABLE TBMFE_PARCELAMENTO
    ADD GERAR_PARCELAMENTO INTEGER DEFAULT 1;

COMMENT ON COLUMN TBMFE_PARCELAMENTO.GERAR_PARCELAMENTO IS
'1 - sim
0 - nao';

CREATE OR ALTER trigger ttbmfe_parcelamento_b02i for tbmfe_parcelamento
active before insert or update position 1
AS
declare variable status_cf varchar(5);
declare variable desc_operacao varchar(5);
declare variable tipo_operacao varchar(5);
declare variable for_pag integer;
declare variable estabelecimento_id integer;
declare variable pagamento_forma_id integer;
declare variable dt_emissao date;
declare variable CONTA_RECEBER_BANCO integer;
declare variable CONTA_RECEBER_MODALIDADE integer;
declare variable CONTA_RECEBER_POSICAO integer;
declare variable CONTA_RECEBER_COBRANCA integer;
declare variable CONTA_RECEBER_OPERACAO integer;
declare variable PARCELAMENTO_ID integer;
begin

  for_pag = 0;

  select first 1 s.tipo, s.pagamento_forma_id,CONTA_RECEBER_BANCO,CONTA_RECEBER_MODALIDADE,CONTA_RECEBER_POSICAO,CONTA_RECEBER_COBRANCA, CONTA_RECEBER_OPERACAO from tbforma_pagamento_sat s where s.id = new.forma_pagamento
  into for_pag, :pagamento_forma_id, :CONTA_RECEBER_BANCO, :CONTA_RECEBER_MODALIDADE, :CONTA_RECEBER_POSICAO, :CONTA_RECEBER_COBRANCA, :CONTA_RECEBER_OPERACAO;

  if( for_pag = 1)then
  begin

      status_cf = 'C';

      select first 1 e.situacao, e.dt_emissao from tbmfe e where e.serie = new.serie AND E.numero = new.numero and e.caixa_id = new.caixa_id
      into :status_cf, :dt_emissao;

     --se nao cancelado e nao tive parcelamento
     if(status_cf = 'E' and new.parcelamento_id = 0 and old.parcelamento_id = 0 and new.gerar_parcelamento = 1)then
     begin

        select first 1 q.estabelecimento_id from tbquiosque q where q.id = new.caixa_id
        into :estabelecimento_id;

        PARCELAMENTO_ID = gen_id(GTBNFS_PARCELAMENTO,1);

        new.parcelamento_id = PARCELAMENTO_ID;

        INSERT INTO TBNFS_PARCELAMENTO (CAIXA_ID,NFS_CONTROLE, PARCELA, VALOR, DATA_VENCIMENTO, DATA_FLUXO, CONTA_RECEBER_OPERACAO, CONTA_RECEBER_BANCO, CONTA_RECEBER_MODALIDADE, CONTA_RECEBER_POSICAO, CONTA_RECEBER_COBRANCA, ACEITE, ESTABELECIMENTO_CODIGO, NUMERO_NOTAFISCAL, DATA_EMISSAO, EMPRESA_CODIGO, SITUACAO, CONTROLE, VALOR_DESCONTO, VALOR_SALDO, REMESSA_ARQUIVO, REMESSA_DATA, REMESSA_NUMERO_BANCO, VIA_DUPLICATA, SERIE, PAGAMENTO_FORMA, AVULSO, CLASSIFICACAO_CONTABIL, CCUSTO, CLASSIFICACAO, OBSERVACAO, FLAG, SALESFORCE, NOTIFICADO_VENCIMENTO, REPRESENTANTE_COMISSAO, REPRESENTANTE_ID, VENDEDOR_ID, VENDEDOR_COMISSAO, FORMA_COMISSAO, DATAHORA,TIPO)
            VALUES (
                new.caixa_id,
                0,
                1,
                new.valor,
                :dt_emissao,
                NULL,
                :CONTA_RECEBER_OPERACAO,
                :CONTA_RECEBER_BANCO,
                :CONTA_RECEBER_MODALIDADE,
                :CONTA_RECEBER_POSICAO,
                :CONTA_RECEBER_COBRANCA,
                'S',
                :estabelecimento_id,
                new.numero,
                :dt_emissao,
                fn_parametro('SISTEMA.CLIENTE_QUIOSQUE'),
                1,
                :PARCELAMENTO_ID,
                0,
                new.valor,
                NULL,
                NULL,
                '',
                NULL,
                new.serie,
                :pagamento_forma_id,
                '0',
                '',
                '',
                '',
                'CUPOM: ' || new.numero ||'-'|| lpad(new.serie,2,'0')||' CAIXA:'|| new.caixa_id,
                0,
                '0',
                0,
                0,
                0,
                0,
                0,
                '',
                current_timestamp,
                2);

          select h.tipo, h.descricao_reduzida from TBCONTA_RECEBER_OPERACAO h where h.codigo = :CONTA_RECEBER_OPERACAO
          into  tipo_operacao, desc_operacao;

          INSERT INTO TBCAIXABANCO_LANCAMENTO_REG (CONTROLE, ESTABELECIMENTO_CODIGO, CAIXABANCO_CONTROLE, DATA, EMPRESA_CODIGO, NFE_PARCELAMENTO_CONTROLE, NFS_PARCELAMENTO_CONTROLE, CAIXABANCO_CODIGO, OPERACAO_CODIGO, DOCUMENTO_NUMERO, PARCELA, VALOR, VALOR_DESCONTO, VALOR_JUROS, VALOR_MULTA, VALOR_DESPESA_DIVERSA, VALOR_DESPESA_COBRANCA, VALOR_DESPESA_CARTORIO, REGISTRO_MESTRE, OCORRENCIA_CONTROLE, HISTORICO, VALOR_SALDO, DATA_REGISTRO, TIPO, SERIE, CODORIGEM, CONTA_DEBITO, CONTA_CREDITO, NFE_CONTROLE, NFS_CONTROLE, VALOR_TOTAL, ARQUIVO, CCUSTO, LANCAMENTO_CLASS_ID)
                VALUES (
                gen_id(GTBCAIXABANCO_REGISTRO,1),
                :estabelecimento_id,
                0,
                :dt_emissao,
                fn_parametro('SISTEMA.CLIENTE_QUIOSQUE'),
                0,
                :PARCELAMENTO_ID,
                :CONTA_RECEBER_BANCO,
                :CONTA_RECEBER_OPERACAO,
                new.numero,
                1,
                new.valor,
                0,
                0,
                0,
                0,
                0,
                0,
                '1',
                NULL,
                'VR.RECEB.REF.',
                new.valor,
                current_timestamp,
                :tipo_operacao,
                new.serie,
                'CF1',
                '',
                '',
                0,
                0,
                new.valor,
                NULL,
                '',
                0);

     end else
     begin
        --se for canselado e tiver parcelamentos
        if(status_cf = 'C' and new.parcelamento_id > 0 and new.gerar_parcelamento = 1)then
        begin
          delete from TBNFS_PARCELAMENTO t where t.controle = new.parcelamento_id;
          delete from TBCAIXABANCO_LANCAMENTO_REG s where s.nfs_parcelamento_controle = new.parcelamento_id;
        end
     end
  end

end;

CREATE OR ALTER procedure spu_tratar_mfe 
returns (
    tag_id integer,
    caixa_id integer,
    tabela varchar(100))
as
begin

    for
        select
            e.tag_id,
            e.caixa_id
        from  TBMFE e where e.contabilizacao_id = 0 and e.situacao = 'E'
    into
      :tag_id,
      :caixa_id
    do begin
        UPDATE TBMFE e set e.flag_atualizacao = e.flag_atualizacao + 1 where e.tag_id = :tag_id and e.caixa_id = :caixa_id;
        TABELA = 'TBMFE';
        suspend;
    end

    for
        select
            p.tag_id,
            p.caixa_id
        from TBMFE_PARCELAMENTO p, tbmfe e, tbforma_pagamento_sat s
        where p.serie = e.serie
        and p.numero = e.numero
        and p.caixa_id = e.caixa_id
        and p.forma_pagamento = s.id
        and s.id_sat = 1
        and p.parcelamento_id = 0
        and e.situacao = 'E'
    into
      :tag_id,
      :caixa_id
    do begin
      UPDATE TBMFE_PARCELAMENTO t  set t.flag_atualizacao = t.flag_atualizacao + 1 where t.tag_id = :tag_id and t.caixa_id = :caixa_id;
      TABELA = 'TBMFE_PARCELAMENTO';
      suspend;
    end

    for
        select
            p.tag_id,
            p.caixa_id
        from tbmfe_parcelamento_item p, tbmfe e
        where p.cfe_serie = e.serie
        and p.cfe_numero = e.numero
        and p.caixa_id = e.caixa_id
        and p.parcelamento_id = 0
        and e.situacao = 'E'
        --and p.pagamento_id > 0
    into
      :tag_id,
      :caixa_id
    do begin
      UPDATE tbmfe_parcelamento_item t  set t.flag_atualizacao = t.flag_atualizacao + 1 where t.tag_id = :tag_id and t.caixa_id = :caixa_id;
      TABELA = 'TBMFE_PARCELAMENTO_ITEM';
      suspend;
    end


end;

