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;
declare variable coo integer;
declare variable valor Numeric(10,5);
begin

end;

CREATE OR ALTER trigger ttbmfe_parcelamento_item_b01ui for tbmfe_parcelamento_item
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;
declare variable PAGAMENTO_ID integer;
declare variable I integer;
declare variable VALOR numeric(15,2);
declare variable VALOR2 numeric(15,2);
declare variable controle integer;
declare variable coo integer;
begin

end;

CREATE OR ALTER function fn_parcelamento_nota (
    estabelecimento integer,
    i_numero_nota integer,
    i_serie integer)
returns integer
as
declare variable valor_total_nf numeric(18,5);
declare variable controle integer;
declare variable data_emissao date;
declare variable numero_notafiscal integer;
declare variable serie varchar(3);
declare variable parcelamento_id integer;
begin

end;

ALTER TABLE TBNFS_PARCELAMENTO ADD OLD_PERFIL VARCHAR(10) DEFAULT '';
update TBNFS_PARCELAMENTO set OLD_PERFIL = CLASSIFICACAO;
ALTER TABLE TBNFS_PARCELAMENTO DROP CLASSIFICACAO;
ALTER TABLE TBNFS_PARCELAMENTO ADD CLASSIFICACAO VARCHAR(10) DEFAULT '';
update TBNFS_PARCELAMENTO set CLASSIFICACAO = OLD_PERFIL;
ALTER TABLE TBNFS_PARCELAMENTO DROP OLD_PERFIL;

CREATE OR ALTER function fn_parcelamento_nota (
    estabelecimento integer,
    i_numero_nota integer,
    i_serie integer)
returns integer
as
declare variable valor_total_nf numeric(18,5);
declare variable controle integer;
declare variable data_emissao date;
declare variable numero_notafiscal integer;
declare variable serie varchar(3);
declare variable parcelamento_id integer;
begin


  for
    select
    
      t.valor_total_nf,
      p.controle,
      p.data_emissao,
      p.NUMERO_NOTAFISCAL,
      p.SERIE,
      gen_id(GTBNFS_PARCELAMENTO,1) as parcelamento_id
      --1 as parcelamento_id

    from tbnfs p, tbnfs_totais t
    
    where p.estabelecimento_codigo = :ESTABELECIMENTO
    and p.numero_notafiscal = :I_NUMERO_NOTA
    and p.serie = :I_SERIE
    and p.situacao = 2
    and t.nfs_controle = p.controle

  into
    VALOR_TOTAL_NF,
    CONTROLE,
    DATA_EMISSAO,
    NUMERO_NOTAFISCAL,
    SERIE,
    PARCELAMENTO_ID
  do begin

     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 (
                1,
                :controle,
                1,
                :valor_total_nf,
                :DATA_EMISSAO,
                NULL,
                3,
                0,
                0,
                0,
                0,
                'S',
                :ESTABELECIMENTO,
                :NUMERO_NOTAFISCAL,
                :DATA_EMISSAO,
                10550,
                1,
                :PARCELAMENTO_ID,
                0,
                :valor_total_nf,
                NULL,
                NULL,
                '',
                NULL,
                :SERIE,
                0,
                '0',
                '',
                '',
                '',
                ''||:NUMERO_NOTAFISCAL||'-'|| lpad(:serie,2,'0')||'',
                0,
                '0',
                0,
                0,
                0,
                0,
                0,
                '',
                current_timestamp,
                1);

          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,
                0,
                :DATA_EMISSAO,
                10550,
                0,
                :PARCELAMENTO_ID,
                0,
                3,
                :NUMERO_NOTAFISCAL,
                1,
                :valor_total_nf,
                0,
                0,
                0,
                0,
                0,
                0,
                '1',
                NULL,
                'VR.RECEB.REF.',
                :valor_total_nf,
                current_timestamp,
                'D',
                :SERIE,
                'NFS',
                '',
                '',
                0,
                :controle,
                :valor_total_nf,
                NULL,
                '',
                0);

  end

  return PARCELAMENTO_ID;
end;


CREATE OR ALTER trigger ttbmfe_parcelamento_item_b01ui for tbmfe_parcelamento_item
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;
declare variable PAGAMENTO_ID integer;
declare variable I integer;
declare variable VALOR numeric(15,2);
declare variable VALOR2 numeric(15,2);
declare variable controle integer;
declare variable coo integer;
begin

  for_pag = 0;

  PAGAMENTO_ID = coalesce((select h.forma_pagamento from tbmfe_parcelamento h where h.id = new.pagamento_id),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 = :PAGAMENTO_ID
  into for_pag, :pagamento_forma_id, :CONTA_RECEBER_BANCO, :CONTA_RECEBER_MODALIDADE, :CONTA_RECEBER_POSICAO, :CONTA_RECEBER_COBRANCA, :CONTA_RECEBER_OPERACAO;

  if(for_pag = 3 and new.pagamento_id > 0)then
  begin

      status_cf = 'C';

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

      :valor2 = new.valorpagamento;

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

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

        I = 1;

        new.parcelas = iif( coalesce(new.parcelas,0) > 0, new.parcelas, 1);

        :VALOR = :VALOR2 / new.parcelas;

        WHILE (I <= new.parcelas) DO
        BEGIN

            if(I = new.parcelas)then
            begin
                :VALOR = :VALOR2 - (:VALOR * (new.parcelas - 1));
            end

            if(new.parcelas = 1)then
            begin
                :VALOR = :VALOR2;
            end

            ---:VALOR = :VALOR2;
            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,
                    :I,
                    :VALOR,
                    dateadd(month, :I,:dt_emissao),
                    NULL,
                    :CONTA_RECEBER_OPERACAO,
                    :CONTA_RECEBER_BANCO,
                    :CONTA_RECEBER_MODALIDADE,
                    :CONTA_RECEBER_POSICAO,
                    :CONTA_RECEBER_COBRANCA,
                    'S',
                    :estabelecimento_id,
                    :coo,
                    :dt_emissao,
                    fn_parametro('SISTEMA.CLIENTE_QUIOSQUE'),
                    1,
                    :PARCELAMENTO_ID,
                    0,
                    :VALOR,
                    NULL,
                    NULL,
                    '',
                    NULL,
                    new.cfe_serie,
                    :pagamento_forma_id,
                    '0',
                    '',
                    '',
                    '',
                    'CUPOM: ' || :coo ||'-'|| lpad(new.cfe_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,
                    :coo,
                    :I,
                    :VALOR,
                    0,
                    0,
                    0,
                    0,
                    0,
                    0,
                    '1',
                    NULL,
                    'VR.RECEB.REF. Doc.Nr.'||:coo||'-'||new.cfe_serie,
                    :VALOR,
                    current_timestamp,
                    :tipo_operacao,
                    new.cfe_serie,
                    'CF1',
                    '',
                    '',
                    0,
                    0,
                    :VALOR,
                    NULL,
                    '',
                    0);

                    I = I + 1;
          END

     end else
     begin
        --se for canselado e tiver parcelamentos
        if(status_cf = 'C' and new.parcelamento_id > 0)then
        begin
          for
            select t.controle
            from TBNFS_PARCELAMENTO t,tbmfe e
            where t.tipo = 2
            and t.caixa_id = new.caixa_id
            and t.serie = new.cfe_serie
            and t.numero_notafiscal = e.coo
            and e.numero = new.cfe_numero
            and e.serie = new.cfe_serie
            and e.caixa_id = new.caixa_id
          into
             :controle
          do begin
            delete from TBNFS_PARCELAMENTO t where t.controle = :controle;
            delete from TBCAIXABANCO_LANCAMENTO_REG s where s.nfs_parcelamento_controle = :controle;
          end
        end
     end
  end

end;


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;
declare variable coo integer;
declare variable valor Numeric(10,5);
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,e.coo, e.VL_TOTAL_NF 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, :coo, :valor;

     --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,
                :valor,
                :dt_emissao,
                NULL,
                :CONTA_RECEBER_OPERACAO,
                :CONTA_RECEBER_BANCO,
                :CONTA_RECEBER_MODALIDADE,
                :CONTA_RECEBER_POSICAO,
                :CONTA_RECEBER_COBRANCA,
                'S',
                :estabelecimento_id,
                :coo,
                :dt_emissao,
                fn_parametro('SISTEMA.CLIENTE_QUIOSQUE'),
                1,
                :PARCELAMENTO_ID,
                0,
                :valor,
                NULL,
                NULL,
                '',
                NULL,
                new.serie,
                :pagamento_forma_id,
                '0',
                '',
                '',
                '',
                'CUPOM: ' || :coo ||'-'|| 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,
                :coo,
                1,
                :valor,
                0,
                0,
                0,
                0,
                0,
                0,
                '1',
                NULL,
                'VR.RECEB.REF. Doc.Nr.'||:coo||'-'||new.serie ,
                :valor,
                current_timestamp,
                :tipo_operacao,
                new.serie,
                'CF1',
                '',
                '',
                0,
                0,
                :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;