ALTER TABLE TBPDV_ADQUIRENTE      ADD OPERACAO_TAXA      NUMERIC(15,2);
ALTER TABLE TBNFS_PARCELAMENTO    ADD VALOR_TAXA         NUMERIC(15,2);
ALTER TABLE TBNFS_PARCELAMENTO    ADD PERCENTUAL_TAXA    NUMERIC(15,2);
ALTER TABLE TBNFS_FORMA_PAGAMENTO ADD VALOR_TAXA         NUMERIC(15,2);
ALTER TABLE TBNFS_FORMA_PAGAMENTO ADD PERCENTUAL_TAXA    NUMERIC(15,2);

ALTER TABLE TBCONCILIACAO_CARTAO
ADD MERCHANT_ID VARCHAR(50) CHARACTER SET UTF8 
COLLATE UTF8;

ALTER TABLE TBCONCILIACAO_CARTAO_DEBITOS
ADD MERCHANT_ID VARCHAR(50) CHARACTER SET UTF8 
COLLATE UTF8;

ALTER TABLE TBCONCILIACAO_CARTAO_PARCELAS
ADD MERCHANT_ID VARCHAR(50) CHARACTER SET UTF8 
COLLATE UTF8;

ALTER TABLE TBCONCILIACAO_CARTAO_RECEBER
ADD MERCHANT_ID VARCHAR(50) CHARACTER SET UTF8 
COLLATE UTF8;

ALTER TABLE TBNFS_FORMA_PAGAMENTO
ADD MERCHANT_ID VARCHAR(50) CHARACTER SET UTF8 
COLLATE UTF8;

UPDATE TBCONCILIACAO_CARTAO 		  SET MERCHANT_ID = ESTABELECIMENTO_REDE;

UPDATE TBCONCILIACAO_CARTAO_RECEBER   SET MERCHANT_ID = ESTABELECIMENTO_REDE;

UPDATE TBCONCILIACAO_CARTAO_DEBITOS   SET MERCHANT_ID = ESTABELECIMENTO_REDE;

UPDATE TBCONCILIACAO_CARTAO_PARCELAS  SET MERCHANT_ID = ESTABELECIMENTO_REDE;

ALTER TABLE TBCAIXABANCO_LANCAMENTO_REG
ADD TARIFA_ADQUIRENTE VARCHAR(1) CHARACTER SET UTF8 
DEFAULT 0 
COLLATE UTF8;

ALTER TABLE TBNFS_PARCELAMENTO
ADD SEQUENCIA INTEGER;

CREATE OR ALTER TRIGGER TTBNFS_B10D FOR TBNFS
ACTIVE BEFORE DELETE POSITION 5
AS
BEGIN
   IF (OLD.GC_WEB = 1) THEN
       BEGIN
            EXECUTE PROCEDURE SPD_NF(OLD.CONTROLE, 'NFS', OLD.ESTABELECIMENTO_CODIGO);
            /*APAGAR AGRUPAMENTOS DE FORMAS DE PAGAMENTO*/

            DELETE FROM TBNFS_FORMA_PAGAMENTO WHERE DOCUMENTO_ID = OLD.CONTROLE AND DOCUMENTO_TIPO = 'NFS';
       END 

END;

CREATE OR ALTER TRIGGER TTBPDV_CFE_B01D FOR TBPDV_CFE
ACTIVE BEFORE DELETE POSITION 1
AS

DECLARE VARIABLE CAIXA_ID INTEGER;
BEGIN
    IF(OLD.SITUACAO <> 1) THEN
    BEGIN
        IF(OLD.SITUACAO = 2) THEN EXCEPTION "..."'CUPOM FISCAL AUTORIZADO. EXCLUSAO CANCELADA';

        IF(OLD.SITUACAO = 3) THEN EXCEPTION "..."'CUPOM FISCAL CANCELADO. EXCLUSAO CANCELADA';

    END ELSE
    BEGIN

        SELECT T.PDV_CAIXA_ID FROM TBPDV_MOVIMENTO_CAIXA T WHERE T.ID = OLD.PDV_MOVIMENTO_CAIXA_ID INTO CAIXA_ID;

        EXECUTE PROCEDURE SP_CFE_PARCELAMENTO (OLD.ID, OLD.ESTABELECIMENTO_ID, OLD.REPRESENTANTE_ID,
            OLD.REPRESENTANTE_COMISSAO, OLD.VENDEDOR_ID, OLD.VENDEDOR_COMISSAO, OLD.CLIENTE_ID,
            :CAIXA_ID,  OLD.NUMERO_CFE, OLD.SERIE, OLD.DATA_EMISSAO, 2);

        EXECUTE PROCEDURE SP_CFE_PEDIDO(OLD.ID, 2);

        EXECUTE PROCEDURE SP_CFE_ESTOQUE(OLD.ID, OLD.ESTABELECIMENTO_ID, OLD.CLIENTE_ID, :CAIXA_ID,
            OLD.NUMERO_CFE, OLD.SERIE, OLD.DATA_EMISSAO, 2);

        EXECUTE PROCEDURE SPD_MOVCONTABIL(OLD.ID, 'CFI');
      
        /*APAGAR AGRUPAMENTOS DE FORMAS DE PAGAMENTO*/

        DELETE FROM TBNFS_FORMA_PAGAMENTO WHERE DOCUMENTO_ID = OLD.ID AND DOCUMENTO_TIPO = 'CFE';
    END
END;

CREATE OR ALTER TRIGGER TTBNFS_PARCELAMENTO_B11U FOR TBNFS_PARCELAMENTO
ACTIVE BEFORE UPDATE POSITION 8
AS
declare variable OPERACAO           numeric(18,2);
declare variable TIPO_LANC          varchar(3);
declare variable conta_credito      varchar(50);
declare variable conta_debito       varchar(50);
declare variable desc_conta_credito varchar(200);
declare variable desc_conta_debito  varchar(200);
declare variable HISTORICO_CONTABIL varchar(250);
declare variable VALOR_SALDO        numeric(15,8);
declare variable MOVCONTMESTRE_ID   INTEGER;
declare variable MOVCONTABIL_ID     INTEGER;
declare variable CONTROLE           INTEGER;
begin
  IF(NEW.CONTA_RECEBER_BANCO <> OLD.CONTA_RECEBER_BANCO or NEW.CONTA_RECEBER_OPERACAO <> OLD.CONTA_RECEBER_OPERACAO) THEN
  BEGIN
     UPDATE TBCAIXABANCO_LANCAMENTO_REG
        SET OPERACAO_CODIGO             = NEW.CONTA_RECEBER_OPERACAO,
            CAIXABANCO_CODIGO           = NEW.CONTA_RECEBER_BANCO
        WHERE ESTABELECIMENTO_CODIGO    = OLD.ESTABELECIMENTO_CODIGO
          AND EMPRESA_CODIGO            = OLD.EMPRESA_CODIGO
          AND DOCUMENTO_NUMERO          = OLD.NUMERO_NOTAFISCAL
          AND NFS_PARCELAMENTO_CONTROLE = OLD.CONTROLE
          AND NFS_CONTROLE              = OLD.NFS_CONTROLE
          AND OPERACAO_CODIGO           = OLD.CONTA_RECEBER_OPERACAO
          AND CAIXABANCO_CODIGO         = OLD.CONTA_RECEBER_BANCO
          and REGISTRO_MESTRE           = 1 ;
  END

  IF((OLD.PERCENTUAL_TAXA <> NEW.PERCENTUAL_TAXA OR OLD.PERCENTUAL_TAXA IS NULL AND NEW.PERCENTUAL_TAXA > 0)) THEN
  BEGIN
     MOVCONTABIL_ID      = 0;
     MOVCONTMESTRE_ID    = 0;
     CONTROLE            = 0;
     OPERACAO            = 0;
     DESC_CONTA_CREDITO  = '';
     DESC_CONTA_DEBITO   = '';

     /* CONSULTAR OPERAÇÃO CADASTRADA PARA O ADQUIRENTE */
     IF(NEW.PDV_CFE_FORMA_PAGAMENTO_ID > 0)THEN
     BEGIN

        FOR
         
            SELECT
             X.OPERACAO_TAXA,
             X.HISTORICO_CONTABIL,
             X.CONTA_CREDITO,
             X.CONTA_DEBITO,
             COALESCE(Z.DESCRICAO,'') AS DESC_CONTA_CREDITO,
             COALESCE(Y.DESCRICAO,'') AS DESC_CONTA_DEBITO
             FROM
            (SELECT FIRST 1
                E.OPERACAO_TAXA,
                f.HISTORICO_CONTABIL,
                case
                when f.tipo_credito = 'A' AND F.CONTA_CREDITO = 0 THEN (SELECT FIRST 1 X.CONTA_CONTABIL  FROM TBEMPRESA X WHERE X.CODIGO = B.EMPRESA_CODIGO)
                when f.tipo_credito = 'P' AND F.CONTA_CREDITO = 0 THEN (SELECT FIRST 1 X.CONTA_CONTABIL2 FROM TBEMPRESA X WHERE X.CODIGO = B.EMPRESA_CODIGO)
                ELSE F.CONTA_CREDITO
                END AS CONTA_CREDITO,
                case
                when f.tipo_debito = 'A'  AND F.CONTA_DEBITO  = 0 THEN (SELECT FIRST 1 X.CONTA_CONTABIL  FROM TBEMPRESA X WHERE X.CODIGO = B.EMPRESA_CODIGO)
                when f.tipo_debito = 'P'  AND F.CONTA_DEBITO  = 0 THEN (SELECT FIRST 1 X.CONTA_CONTABIL2 FROM TBEMPRESA X WHERE X.CODIGO = B.EMPRESA_CODIGO)
                ELSE F.CONTA_DEBITO
                END AS CONTA_DEBITO
                FROM TBPDV_CFE_FORMA_PAGAMENTO A
                    INNER JOIN TBNFS_PARCELAMENTO       B ON B.PDV_CFE_FORMA_PAGAMENTO_ID = A.ID
                    INNER JOIN TBPAGAMENTO_FORMA        C ON C.CODIGO                     = A.PAGAMENTO_FORMA_ID AND (C.NFE_TIPPAG = '03' OR C.NFE_TIPPAG = '04')
                    INNER JOIN TBCARTAO_BANDEIRA        D ON D.DESCRICAO                  = A.BANDEIRA_CARTAO
                    INNER JOIN TBPDV_ADQUIRENTE         E ON E.ADQUIRENTE_ID              = A.ADQUIRENTE_ID
                    left  join TBCONTA_RECEBER_OPERACAO F ON F.CODIGO                     = E.OPERACAO_TAXA
                WHERE A.CODIGO_AUTORIZACAO IS NOT NULL
                AND A.ID         = NEW.PDV_CFE_FORMA_PAGAMENTO_ID
                AND B.CONTROLE   = NEW.CONTROLE) X

                LEFT JOIN TBCONTACONTABIL Z ON Z.CONTA = X.CONTA_CREDITO
                LEFT JOIN TBCONTACONTABIL Y ON Y.CONTA = X.CONTA_DEBITO

                INTO :OPERACAO, :HISTORICO_CONTABIL, :CONTA_CREDITO, :CONTA_DEBITO, :DESC_CONTA_CREDITO, :DESC_CONTA_DEBITO DO
                BEGIN

                    IF(:DESC_CONTA_CREDITO = '' AND :CONTA_CREDITO <> '0' AND :CONTA_CREDITO <> '1' and CHAR_LENGTH(TRIM(:CONTA_CREDITO)) > 0)THEN
                    BEGIN
                        EXCEPTION "..." 'C.CONTÁBIL: '||FN_MASK(:CONTA_CREDITO,'CONTA')||' NÃO ENCONTRADA, OPERACAO CANCELADA!';
                    END

                    IF(:DESC_CONTA_DEBITO = '' AND :CONTA_DEBITO <> '0' AND :CONTA_DEBITO <> '1' and CHAR_LENGTH(TRIM(:CONTA_DEBITO)) > 0)THEN
                    BEGIN
                        EXCEPTION "..." 'C.CONTÁBIL: '||FN_MASK(:CONTA_DEBITO,'CONTA')||' NÃO ENCONTRADA, OPERACAO CANCELADA!';
                    END

                   FOR
                     SELECT FIRST 1 coalesce(A.MOVCONTABIL_ID,0), coalesce(A.MOVCONTMESTRE_ID,0), A.CONTROLE
                        FROM TBCAIXABANCO_LANCAMENTO_REG A
                        WHERE A.ESTABELECIMENTO_CODIGO    = OLD.ESTABELECIMENTO_CODIGO
                          AND A.EMPRESA_CODIGO            = OLD.EMPRESA_CODIGO
                          AND A.DOCUMENTO_NUMERO          = OLD.NUMERO_NOTAFISCAL
                          AND A.NFS_PARCELAMENTO_CONTROLE = OLD.CONTROLE
                          AND A.NFS_CONTROLE              = OLD.NFS_CONTROLE
                          and A.REGISTRO_MESTRE           = 1
                          and A.TARIFA_ADQUIRENTE         = 1
                          INTO :MOVCONTABIL_ID, :MOVCONTMESTRE_ID, :CONTROLE DO
                          BEGIN
                          --exception "..."' mov.cont: '||:MOVCONTABIL_ID||', mov.mestre: '||:MOVCONTMESTRE_ID||' bco.id:'||:CONTROLE;
                          END
                     
                END

     END
     ELSE
     BEGIN
        FOR SELECT
                 X.OPERACAO_TAXA,
                 X.HISTORICO_CONTABIL,
                 X.CONTA_CREDITO,
                 X.CONTA_DEBITO,
                 COALESCE(Z.DESCRICAO,'') AS DESC_CONTA_CREDITO,
                 COALESCE(Y.DESCRICAO,'') AS DESC_CONTA_DEBITO
                 FROM
                (SELECT FIRST 1
                    E.OPERACAO_TAXA,
                    f.HISTORICO_CONTABIL,
                    case
                    when f.tipo_credito = 'A' AND F.CONTA_CREDITO = 0 THEN (SELECT FIRST 1 X.CONTA_CONTABIL  FROM TBEMPRESA X WHERE X.CODIGO = A.EMPRESA_CODIGO)
                    when f.tipo_credito = 'P' AND F.CONTA_CREDITO = 0 THEN (SELECT FIRST 1 X.CONTA_CONTABIL2 FROM TBEMPRESA X WHERE X.CODIGO = A.EMPRESA_CODIGO)
                    ELSE F.CONTA_CREDITO
                    END AS CONTA_CREDITO,
                    case
                    when f.tipo_debito = 'A'  AND F.CONTA_DEBITO  = 0 THEN (SELECT FIRST 1 X.CONTA_CONTABIL  FROM TBEMPRESA X WHERE X.CODIGO = A.EMPRESA_CODIGO)
                    when f.tipo_debito = 'P'  AND F.CONTA_DEBITO  = 0 THEN (SELECT FIRST 1 X.CONTA_CONTABIL2 FROM TBEMPRESA X WHERE X.CODIGO = A.EMPRESA_CODIGO)
                    ELSE F.CONTA_DEBITO
                    END AS CONTA_DEBITO
                    
                    FROM TBNFS_PARCELAMENTO A
                    INNER JOIN TBPAGAMENTO_FORMA        B ON B.CODIGO     = A.PAGAMENTO_FORMA AND (B.NFE_TIPPAG = '03' or B.NFE_TIPPAG = '04')
                    inner join TBCONTA_RECEBER_COBRANCA C on c.CODIGO     = a.CONTA_RECEBER_COBRANCA
                    inner join TBCARTAO_BANDEIRA        D ON D.NFE_TBAND  = C.NFE_TBAND
                    inner join TBPDV_ADQUIRENTE         E ON E.EMPRESA_ID = B.EMPRESA_ID
                    left  join TBCONTA_RECEBER_OPERACAO F ON F.CODIGO     = E.OPERACAO_TAXA
                    WHERE A.CODIGO_AUTORIZACAO IS NOT NULL AND A.AVULSO = NEW.AVULSO
                    AND (A.NFS_CONTROLE = NEW.NFS_CONTROLE)
                    AND A.CONTROLE      = NEW.CONTROLE) X
                    LEFT JOIN TBCONTACONTABIL Z ON Z.CONTA = X.CONTA_CREDITO
                    LEFT JOIN TBCONTACONTABIL Y ON Y.CONTA = X.CONTA_DEBITO
                INTO :OPERACAO, :HISTORICO_CONTABIL, :CONTA_CREDITO, :CONTA_DEBITO, :DESC_CONTA_CREDITO, :DESC_CONTA_DEBITO DO
                BEGIN
                
                    IF(:DESC_CONTA_CREDITO = '' AND :CONTA_CREDITO <> '0' AND :CONTA_CREDITO <> '1' and CHAR_LENGTH(TRIM(:CONTA_CREDITO)) > 0)THEN
                    BEGIN
                        EXCEPTION "..." 'C.CONTÁBIL: '||FN_MASK(:CONTA_CREDITO,'CONTA')||' NÃO ENCONTRADA, OPERACAO CANCELADA!';
                    END

                    IF(:DESC_CONTA_DEBITO = '' AND :CONTA_DEBITO <> '0' AND :CONTA_DEBITO <> '1' and CHAR_LENGTH(TRIM(:CONTA_DEBITO)) > 0)THEN
                    BEGIN
                        EXCEPTION "..." 'C.CONTÁBIL: '||FN_MASK(:CONTA_DEBITO,'CONTA')||' NÃO ENCONTRADA, OPERACAO CANCELADA!';
                    END
                     
                   FOR
                     SELECT FIRST 1 coalesce(A.MOVCONTABIL_ID,0), coalesce(A.MOVCONTMESTRE_ID,0), A.CONTROLE
                        FROM TBCAIXABANCO_LANCAMENTO_REG A
                        WHERE A.ESTABELECIMENTO_CODIGO    = OLD.ESTABELECIMENTO_CODIGO
                          AND A.EMPRESA_CODIGO            = OLD.EMPRESA_CODIGO
                          AND A.DOCUMENTO_NUMERO          = OLD.NUMERO_NOTAFISCAL
                          AND A.NFS_PARCELAMENTO_CONTROLE = OLD.CONTROLE
                          AND A.NFS_CONTROLE              = OLD.NFS_CONTROLE
                          and A.REGISTRO_MESTRE           = 1
                          and A.TARIFA_ADQUIRENTE         = 1
                          INTO :MOVCONTABIL_ID, :MOVCONTMESTRE_ID, :CONTROLE DO
                          BEGIN
                          --exception "..."' mov.cont: '||:MOVCONTABIL_ID||', mov.mestre: '||:MOVCONTMESTRE_ID||' bco.id:'||:CONTROLE;
                          END
                     
                END
     END

    IF(:OPERACAO = 0)THEN
    BEGIN
        EXCEPTION "..." 'OPERAÇÃO DE TAXA DO ADQUIRENTE NÃO ENCONTRADA!, OPERAÇÃO CANCELADA.';
    END

    IF(CHAR_LENGTH(TRIM(:HISTORICO_CONTABIL)) > 0)THEN
    BEGIN
      :HISTORICO_CONTABIL = REPLACE(:HISTORICO_CONTABIL,'#NUMERO_NOTAFISCAL#', FN_LPAD(NEW.NUMERO_NOTAFISCAL,7,0));
    END

    IF(CHAR_LENGTH(TRIM(:CONTA_CREDITO)) > 3 AND CHAR_LENGTH(TRIM(:CONTA_DEBITO)) > 3 and :MOVCONTMESTRE_ID = 0)THEN
    BEGIN
        MOVCONTMESTRE_ID = GEN_ID(GTBMOVCONTMESTRE,1);

        INSERT INTO TBMOVCONTMESTRE(ID, CODESTABELECIMENTO, DATA)
          VALUES (:MOVCONTMESTRE_ID, NEW.ESTABELECIMENTO_CODIGO, NEW.DATA_EMISSAO);

        MOVCONTABIL_ID     = GEN_ID(TBMOVCONT_ID_GEN,1);
        INSERT INTO TBMOVCONTABIL(ID, CODESTABELECIMENTO, IDCONTMOV, NATUREZA, CONTA, DATA, IDDOCUMENTO,
            DESCRICAO, CODORIGEM, VALOR, IDHISTORICO, HISTORICO)
          VALUES (:MOVCONTABIL_ID, NEW.ESTABELECIMENTO_CODIGO, :MOVCONTMESTRE_ID, 'C', :CONTA_CREDITO, NEW.DATA_EMISSAO,
            0, FN_LPAD(NEW.NUMERO_NOTAFISCAL,7,0), 'CRE', NEW.VALOR_TAXA, 0, '');
            
        INSERT INTO TBMOVCONTABIL(ID, CODESTABELECIMENTO, IDCONTMOV, NATUREZA, CONTA, DATA, IDDOCUMENTO,
            DESCRICAO, CODORIGEM, VALOR, IDHISTORICO, HISTORICO)
          VALUES (GEN_ID(TBMOVCONT_ID_GEN,1), NEW.ESTABELECIMENTO_CODIGO, :MOVCONTMESTRE_ID, 'D', :CONTA_DEBITO, NEW.DATA_EMISSAO,
            0, FN_LPAD(NEW.NUMERO_NOTAFISCAL,7,0), 'CRE', NEW.VALOR_TAXA, 0, '');
    END

    IF(CHAR_LENGTH(TRIM(:CONTA_CREDITO)) > 3 AND CHAR_LENGTH(TRIM(:CONTA_DEBITO)) > 3 and :MOVCONTMESTRE_ID > 0)THEN
    BEGIN
        UPDATE TBMOVCONTMESTRE
          SET CODESTABELECIMENTO = NEW.ESTABELECIMENTO_CODIGO,
              DATA = NEW.DATA_EMISSAO
          WHERE ID = :MOVCONTMESTRE_ID;

        UPDATE TBMOVCONTABIL
           SET CODESTABELECIMENTO = NEW.ESTABELECIMENTO_CODIGO,
               CONTA     =  :CONTA_CREDITO,
               DATA      = NEW.DATA_EMISSAO,
               DESCRICAO = FN_LPAD(NEW.NUMERO_NOTAFISCAL,7,0),
               VALOR     = NEW.VALOR_TAXA,
               HISTORICO = :HISTORICO_CONTABIL
           WHERE ID = :MOVCONTABIL_ID AND IDCONTMOV = :MOVCONTMESTRE_ID;

         UPDATE TBMOVCONTABIL
           SET CODESTABELECIMENTO = NEW.ESTABELECIMENTO_CODIGO,
               CONTA     = :CONTA_DEBITO,
               DATA      = NEW.DATA_EMISSAO,
               DESCRICAO = FN_LPAD(NEW.NUMERO_NOTAFISCAL,7,0),
               VALOR     = NEW.VALOR_TAXA,
               HISTORICO = :HISTORICO_CONTABIL
           WHERE ID <> :MOVCONTABIL_ID AND IDCONTMOV = :MOVCONTMESTRE_ID;
    END

    IF(CHAR_LENGTH(TRIM(:CONTA_CREDITO)) < 3 AND CHAR_LENGTH(TRIM(:CONTA_DEBITO)) < 3 and :MOVCONTMESTRE_ID > 0)THEN
    BEGIN
        DELETE FROM TBMOVCONTMESTRE WHERE ID        = :MOVCONTMESTRE_ID;
        DELETE FROM TBMOVCONTABIL   WHERE IDCONTMOV = :MOVCONTMESTRE_ID;
    END

    /* AO ATUALIZAR O CAMPO DO PERCENTUAL DA TAXA DO ADQUIRENTE GERAR LANÇAMENTO DE JUROS */
    IF(CONTROLE = 0) THEN
    BEGIN
       CONTROLE  = GEN_ID(GTBCAIXABANCO_REGISTRO,1);
    END

    IF(NEW.AVULSO = 1)THEN
    BEGIN
       TIPO_LANC = 'AVU';
    END
    ELSE
    BEGIN
       IF(NEW.PDV_CFE_FORMA_PAGAMENTO_ID > 0)THEN
       BEGIN
          TIPO_LANC = 'CFE';
       END
       ELSE
       BEGIN
          TIPO_LANC = 'NFS';
       END
    END

    UPDATE OR INSERT INTO TBCAIXABANCO_LANCAMENTO_REG (
        CONTROLE, 
        ESTABELECIMENTO_CODIGO,
        EMPRESA_CODIGO,
        NFS_PARCELAMENTO_CONTROLE,
        OPERACAO_CODIGO,
        DOCUMENTO_NUMERO,
        PARCELA,
        REGISTRO_MESTRE,
        DATA,
        VALOR,
        VALOR_SALDO,
        VALOR_TOTAL,
        TIPO,
        SERIE,
        NFE_CONTROLE,
        NFS_CONTROLE,
        CODORIGEM,
        CONTA_DEBITO,
        CONTA_CREDITO,
        MOVCONTABIL_ID,
        MOVCONTMESTRE_ID,
        TARIFA_ADQUIRENTE
        )
        VALUES
        (
        :CONTROLE,
        new.ESTABELECIMENTO_CODIGO,
        new.EMPRESA_CODIGO,
        new.CONTROLE,
        :OPERACAO,
        new.NUMERO_NOTAFISCAL,
        new.PARCELA,
        '1',
        new.DATA_EMISSAO,
        new.VALOR_TAXA,
        new.VALOR_SALDO,
        new.VALOR_TAXA,
        'C',
        NEW.SERIE,
        0,
        NEW.NFS_CONTROLE,
        :TIPO_LANC,
        :CONTA_DEBITO,
        :CONTA_CREDITO,
        :MOVCONTABIL_ID,
        :MOVCONTMESTRE_ID,
        1
        )
        MATCHING(CONTROLE,TARIFA_ADQUIRENTE);


        EXECUTE PROCEDURE SPU_CONTA_RECEBER_SALDO2(NEW.NFS_CONTROLE,new.CONTROLE);


        UPDATE TBNFS_PARCELAMENTO A SET A.VALOR_SALDO = COALESCE((SELECT SUM(CASE WHEN B.TIPO = 'C'
            THEN B.VALOR_TOTAL*-1  ELSE B.VALOR_TOTAL END) SALDO FROM TBCAIXABANCO_LANCAMENTO_REG B
            WHERE B.NFS_CONTROLE = A.NFS_CONTROLE
            AND B.TIPO IN ('D','C')
            AND B.NFS_PARCELAMENTO_CONTROLE = A.CONTROLE),0)
            WHERE A.NFS_CONTROLE = NEW.NFS_CONTROLE
            AND A.CONTROLE = new.CONTROLE;

        FOR SELECT FIRST 1 CAST(COALESCE(A.VALOR_SALDO,0) AS NUMERIC(15,2)) VALOR_SALDO
            FROM TBNFS_PARCELAMENTO A
            WHERE A.NFS_CONTROLE = NEW.NFS_CONTROLE
            AND A.CONTROLE = new.CONTROLE INTO :VALOR_SALDO DO
            BEGIN
                IF(:VALOR_SALDO < 0) THEN
                BEGIN
                     EXCEPTION "..." 'ATENÇÃO SALDO DA PARCELA NÃO PODE FICAR NEGATIVO, OPERACAO CANCELADA!';
                END
            END
  END
end;


CREATE OR ALTER PROCEDURE SP_FORMA_PAGAMENTO_CARTAO (
    ORIGEM VARCHAR(3),
    DOCUMENTO_ID INTEGER = NULL,
    REGISTRAR_TABELA INTEGER = NULL,
    GERAR_SEQ_TAXA INTEGER = 1,
    CONCILIACAO_CARTAO_ID INTEGER = 0)
RETURNS (
    DOCUMENTO_TIPO VARCHAR(3),
    DOCUMENTO INTEGER,
    PAGAMENTO_FORMA_ID INTEGER,
    PARCELA INTEGER,
    VALOR NUMERIC(15,2),
    TARIFA NUMERIC(15,2),
    VALOR_LIQUIDO NUMERIC(15,2),
    NSU VARCHAR(50),
    ADQUIRENTE_ID INTEGER,
    BANDEIRA_CARTAO VARCHAR(100),
    CODIGO_AUTORIZACAO VARCHAR(50),
    CONCILIACAO VARCHAR(1))
AS
DECLARE VARIABLE PARCELA_CONTROLE       INTEGER;
DECLARE VARIABLE FORMA_PAGAMENTO_ID     INTEGER;
DECLARE VARIABLE DOCUMENTO_CONTROLE     INTEGER;
DECLARE VARIABLE TIMES                  INTEGER;
DECLARE VARIABLE ULTIMA_SEQUENCIA       INTEGER;
DECLARE VARIABLE SEQUENCIA              INTEGER;
DECLARE VARIABLE PDV_CFE_ID             INTEGER;
DECLARE VARIABLE OLD_DOCUMENTO_CONTROLE INTEGER;
DECLARE VARIABLE TARIFA_PERCENTUAL      NUMERIC(15,4);
DECLARE VARIABLE TARIFA_VALOR           NUMERIC(15,4);
DECLARE VARIABLE PARCELA_TARIFA_VALOR   NUMERIC(15,4);
DECLARE VARIABLE VALOR_SALDO            NUMERIC(10,5);
BEGIN
  IF(:REGISTRAR_TABELA IS NULL) THEN
  BEGIN
    
       IF(:ORIGEM = 'CFE')THEN
       BEGIN
         FOR
           SELECT
                'CFE' AS DOCUMENTO_TIPO,
                A.PDV_CFE_ID AS DOCUMENTO,
                A.PAGAMENTO_FORMA_ID,
                B.PARCELA,
                A.VALOR,
                0 TARIFA,
                A.VALOR_LIQUIDO,
                A.NSU,
                A.ADQUIRENTE_ID,
                D.ID AS BANDEIRA_CARTAO,
                A.CODIGO_AUTORIZACAO,
                0 AS CONCILIACAO
                
                FROM TBPDV_CFE_FORMA_PAGAMENTO A
                INNER JOIN TBNFS_PARCELAMENTO B ON B.PDV_CFE_FORMA_PAGAMENTO_ID = A.ID
                INNER JOIN TBPAGAMENTO_FORMA  C ON C.CODIGO = A.PAGAMENTO_FORMA_ID AND (C.NFE_TIPPAG = '03' or C.NFE_TIPPAG = '04')
                INNER JOIN TBCARTAO_BANDEIRA  D ON D.DESCRICAO = A.BANDEIRA_CARTAO
            WHERE A.CODIGO_AUTORIZACAO IS NOT NULL AND B.AVULSO = 0
            AND (:DOCUMENTO_ID IS NULL or A.PDV_CFE_ID = :DOCUMENTO_ID)
            INTO :DOCUMENTO_TIPO, :DOCUMENTO, :PAGAMENTO_FORMA_ID, :PARCELA, :VALOR, :TARIFA, :VALOR_LIQUIDO,
                 :NSU, :ADQUIRENTE_ID, :BANDEIRA_CARTAO, :CODIGO_AUTORIZACAO, :CONCILIACAO
            DO BEGIN
               SUSPEND;
            END
       END
    
       IF(:ORIGEM = 'NFS')THEN
       BEGIN
          FOR
            SELECT
                'NFS' AS DOCUMENTO_TIPO,
                A.NFS_CONTROLE AS DOCUMENTO,
                A.PAGAMENTO_FORMA AS PAGAMENTO_FORMA_ID,
                A.PARCELA,
                A.VALOR,
                0 AS TARIFA,
                (A.VALOR) - (A.VALOR_DESCONTO) AS VALOR_LIQUIDO,
                A.NSU,
                E.ADQUIRENTE_ID,
                D.ID AS BANDEIRA_CARTAO,
                A.CODIGO_AUTORIZACAO,
                0 AS CONCILIACAO
                
                FROM TBNFS_PARCELAMENTO A
                INNER JOIN TBPAGAMENTO_FORMA        B ON B.CODIGO     = A.PAGAMENTO_FORMA AND (B.NFE_TIPPAG = '03' or B.NFE_TIPPAG = '04')
                inner join TBCONTA_RECEBER_COBRANCA C on c.CODIGO     = a.CONTA_RECEBER_COBRANCA
                inner join TBCARTAO_BANDEIRA        D ON D.NFE_TBAND  = C.NFE_TBAND
                inner join TBPDV_ADQUIRENTE         E ON E.EMPRESA_ID = B.EMPRESA_ID

            WHERE A.CODIGO_AUTORIZACAO IS NOT NULL
            AND (A.PDV_CFE_FORMA_PAGAMENTO_ID IS NULL or A.PDV_CFE_FORMA_PAGAMENTO_ID = 0)
            AND A.AVULSO = 0
            AND (:DOCUMENTO_ID IS NULL or A.NFS_CONTROLE = :DOCUMENTO_ID)
            INTO :DOCUMENTO_TIPO, :DOCUMENTO, :PAGAMENTO_FORMA_ID, :PARCELA, :VALOR, :TARIFA, :VALOR_LIQUIDO,
                 :NSU, :ADQUIRENTE_ID, :BANDEIRA_CARTAO, :CODIGO_AUTORIZACAO, :CONCILIACAO
         DO BEGIN
            SUSPEND;
         END
       END
    
       IF(:ORIGEM = 'AVU')THEN
       BEGIN
           FOR
            SELECT
                'AVU' AS DOCUMENTO_TIPO,
                A.NFS_CONTROLE AS DOCUMENTO,
                A.PAGAMENTO_FORMA AS PAGAMENTO_FORMA_ID,
                A.PARCELA,
                A.VALOR,
                0 AS TARIFA,
                (A.VALOR) - (A.VALOR_DESCONTO) AS VALOR_LIQUIDO,
                A.NSU,
                E.ADQUIRENTE_ID,
                A.BANDEIRA_ID AS BANDEIRA_CARTAO,
                A.CODIGO_AUTORIZACAO,
                0 AS CONCILIACAO
            
                FROM TBNFS_PARCELAMENTO A
                INNER JOIN TBPAGAMENTO_FORMA        B ON B.CODIGO     = A.PAGAMENTO_FORMA AND (B.NFE_TIPPAG = '03' or B.NFE_TIPPAG = '04')
                inner join TBCONTA_RECEBER_COBRANCA C on c.CODIGO     = a.CONTA_RECEBER_COBRANCA
                inner join TBCARTAO_BANDEIRA        D ON D.NFE_TBAND  = C.NFE_TBAND
                inner join TBPDV_ADQUIRENTE         E ON E.EMPRESA_ID = B.EMPRESA_ID
            WHERE A.CODIGO_AUTORIZACAO IS NOT NULL
            AND (A.PDV_CFE_FORMA_PAGAMENTO_ID IS NULL or A.PDV_CFE_FORMA_PAGAMENTO_ID = 0)
            AND A.AVULSO = 1
            AND (:DOCUMENTO_ID IS NULL or A.NFS_CONTROLE = :DOCUMENTO_ID)
            INTO :DOCUMENTO_TIPO, :DOCUMENTO, :PAGAMENTO_FORMA_ID, :PARCELA, :VALOR, :TARIFA, :VALOR_LIQUIDO,
                 :NSU, :ADQUIRENTE_ID, :BANDEIRA_CARTAO, :CODIGO_AUTORIZACAO, :CONCILIACAO
            DO BEGIN
                SUSPEND;
            END
       END
    
    END

    IF(:REGISTRAR_TABELA > 0) THEN
    BEGIN
    
       IF(:ORIGEM = 'CFE')THEN
       BEGIN

         DELETE FROM TBNFS_FORMA_PAGAMENTO WHERE DOCUMENTO_ID = :DOCUMENTO_ID AND DOCUMENTO_TIPO = :ORIGEM;

         FOR
             SELECT
                 X.DOCUMENTO_TIPO,
                 X.DOCUMENTO,
                 X.PAGAMENTO_FORMA_ID,
                 X.NSU,
                 X.PARCELAS,
                 X.VALOR,
                 IIF(:CONCILIACAO_CARTAO_ID = 0,COALESCE((SELECT FIRST 1 (Z.TAXA)
                          FROM TBPDV_ADQUIRENTE_TAXA Z
                          WHERE Z.PARCELAS    = X.PARCELAS
                          AND Z.ADQUIRENTE_ID = X.ADQUIRENTE_CONSULTA
                          AND Z.BANDEIRA_ID   = X.BANDEIRA_CARTAO
                          AND Z.TIPO          = X.TIPO
                          AND (CAST(X.DATA_EMISSAO AS DATE) BETWEEN Z.DATA_INICIAL AND Z.DATA_FINAL)
                     ),0),
                     COALESCE((SELECT FIRST 1 ((((ZX.DESCONTO1 + ZX.DESCONTO2)/ZX.VALOR)*100)) AS TAXA
                          FROM TBCONCILIACAO_CARTAO ZX
                          WHERE ZX.ID = :CONCILIACAO_CARTAO_ID)
                     ,0)) AS TARIFA,
                 X.VALOR_LIQUIDO,
                 X.ADQUIRENTE_ID,
                 X.BANDEIRA_CARTAO,
                 X.CODIGO_AUTORIZACAO,
                 X.CONCILIACAO,
                 X.SEQUENCIA
               FROM(
                    SELECT
                        A.ID,
                        'CFE' AS DOCUMENTO_TIPO,
                        A.PDV_CFE_ID AS DOCUMENTO,
                        A.PAGAMENTO_FORMA_ID,
                        A.NSU,
                        COUNT(B.CONTROLE) AS PARCELAS,
                        MAX(A.VALOR) AS VALOR,
                        MAX(B.DATA_EMISSAO)    AS DATA_EMISSAO,
                        MAX(A.VALOR_LIQUIDO)   AS VALOR_LIQUIDO,
                        SUM(B.PERCENTUAL_TAXA) AS VALOR_TAXA,
                        CASE
                        WHEN MAX(C.NFE_TIPPAG) = '03' THEN 'C'
                        WHEN MAX(C.NFE_TIPPAG) = '04' THEN 'D'
                        ELSE ''
                        END AS TIPO,
                        A.ADQUIRENTE_ID,
                        E.ID AS ADQUIRENTE_CONSULTA,
                        D.ID AS BANDEIRA_CARTAO,
                        A.CODIGO_AUTORIZACAO,
                        0 AS CONCILIACAO,
                        ROW_NUMBER() OVER (ORDER BY A.ID) AS SEQUENCIA
                        
                        FROM TBPDV_CFE_FORMA_PAGAMENTO A
                        INNER JOIN TBNFS_PARCELAMENTO  B ON B.PDV_CFE_FORMA_PAGAMENTO_ID = A.ID
                        INNER JOIN TBPAGAMENTO_FORMA   C ON C.CODIGO = A.PAGAMENTO_FORMA_ID AND (C.NFE_TIPPAG = '03' OR C.NFE_TIPPAG = '04')
                        INNER JOIN TBCARTAO_BANDEIRA   D ON D.DESCRICAO = A.BANDEIRA_CARTAO
                        INNER JOIN TBPDV_ADQUIRENTE    E ON E.ADQUIRENTE_ID = A.ADQUIRENTE_ID
                    WHERE A.CODIGO_AUTORIZACAO IS NOT NULL AND B.AVULSO = 0
                    AND (:DOCUMENTO_ID IS NULL OR A.PDV_CFE_ID = :DOCUMENTO_ID)
                    GROUP BY A.ID, A.PDV_CFE_ID, A.PAGAMENTO_FORMA_ID, A.NSU, A.CODIGO_AUTORIZACAO, A.ADQUIRENTE_ID, E.ID, D.ID
                ) X
            INTO :DOCUMENTO_TIPO, :DOCUMENTO, :PAGAMENTO_FORMA_ID, :NSU, :PARCELA, :VALOR, :TARIFA, :VALOR_LIQUIDO,
                :ADQUIRENTE_ID, :BANDEIRA_CARTAO, :CODIGO_AUTORIZACAO, :CONCILIACAO, :SEQUENCIA
            DO BEGIN
                 TARIFA_PERCENTUAL = (TARIFA);
                 TARIFA_VALOR      = ((TARIFA_PERCENTUAL/100) * VALOR);
                 UPDATE OR INSERT INTO
                      TBNFS_FORMA_PAGAMENTO
                    (
                        DOCUMENTO_TIPO,
                        DOCUMENTO_ID,
                        PAGAMENTO_FORMA_ID,
                        PARCELAS,
                        VALOR,
                        VALOR_LIQUIDO,
                        NSU,
                        ADQUIRENTE_ID,
                        BANDEIRA_CARTAO,
                        CODIGO_AUTORIZACAO,
                        CONCILIACAO,
                        PERCENTUAL_TAXA,
                        VALOR_TAXA
                    )
                    VALUES
                    (
                        :DOCUMENTO_TIPO,
                        :DOCUMENTO,
                        :PAGAMENTO_FORMA_ID,
                        :PARCELA,
                        :VALOR,
                        :VALOR_LIQUIDO,
                        :NSU,
                        :ADQUIRENTE_ID,
                        :BANDEIRA_CARTAO,
                        :CODIGO_AUTORIZACAO,
                        :CONCILIACAO,
                        :TARIFA_PERCENTUAL,
                        :TARIFA_VALOR
                    )
                    MATCHING(DOCUMENTO_TIPO, DOCUMENTO_ID, PAGAMENTO_FORMA_ID, NSU, ADQUIRENTE_ID, BANDEIRA_CARTAO, CODIGO_AUTORIZACAO);
            END

            /*GERAR SEQUENCIA DAS PARCELAS DO DOCUMENTO*/
             :OLD_DOCUMENTO_CONTROLE = 0;
             :times = 0;
             IF(:GERAR_SEQ_TAXA = 1)THEN
             BEGIN
             FOR SELECT
                    A.PDV_CFE_ID,
                    A.ID,
                    COUNT(B.CONTROLE) AS PARCELAS
                    
                    FROM TBPDV_CFE_FORMA_PAGAMENTO A
                    INNER JOIN TBNFS_PARCELAMENTO B ON B.PDV_CFE_FORMA_PAGAMENTO_ID = A.ID
                    WHERE (:DOCUMENTO_ID IS NULL or A.PDV_CFE_ID = :DOCUMENTO_ID)
                    GROUP BY A.PDV_CFE_ID,A.ID, A.PAGAMENTO_FORMA_ID
                    INTO :PDV_CFE_ID,:DOCUMENTO_CONTROLE,:PARCELA DO
                    BEGIN
                         :SEQUENCIA = 0;
                         IF(:OLD_DOCUMENTO_CONTROLE <> :PDV_CFE_ID AND :OLD_DOCUMENTO_CONTROLE > 0)THEN
                         BEGIN
                           :ULTIMA_SEQUENCIA = 0;
                           :times            = 0;
                         END
                         :times     = :times+1;
                         FOR
                         SELECT A.CONTROLE, ((:TARIFA/100)*A.VALOR), A.VALOR_SALDO
                            FROM TBNFS_PARCELAMENTO A
                            WHERE A.PDV_CFE_FORMA_PAGAMENTO_ID = :DOCUMENTO_CONTROLE
                            ORDER BY A.PARCELA
                            INTO :PARCELA_CONTROLE, :PARCELA_TARIFA_VALOR, :VALOR_SALDO DO
                            BEGIN

                                
                            IF(:PARCELA > 1 AND :PARCELA > :SEQUENCIA and :times > 1)THEN
                            BEGIN
                              :SEQUENCIA = :PARCELA+1;
                              IF(:ULTIMA_SEQUENCIA < :SEQUENCIA)THEN
                              BEGIN
                              :SEQUENCIA = :ULTIMA_SEQUENCIA+1;
                              END
                            END

                            IF(:SEQUENCIA = 0)THEN
                            BEGIN
                               :SEQUENCIA = 1;
                            END

--                        if(:PARCELA_TARIFA_VALOR > 0)then
--                        begin
--                          exception "..." 'R$ '||:PARCELA_TARIFA_VALOR||' CONTROLE '||:PARCELA_CONTROLE;
--                        end
                                IF(:VALOR_SALDO > :PARCELA_TARIFA_VALOR)THEN
                                BEGIN
                                    UPDATE TBNFS_PARCELAMENTO
                                     SET --SEQUENCIA       = :SEQUENCIA,
                                         PERCENTUAL_TAXA = :TARIFA,
                                         VALOR_TAXA      = :PARCELA_TARIFA_VALOR
                                     WHERE CONTROLE      = :PARCELA_CONTROLE;
                                END
                                ELSE
                                BEGIN
--                                  UPDATE TBNFS_PARCELAMENTO
--                                     SET SEQUENCIA       = :SEQUENCIA,
--                                         --PERCENTUAL_TAXA = :TARIFA,
--                                         --VALOR_TAXA      = :PARCELA_TARIFA_VALOR
--                                     WHERE CONTROLE      = :PARCELA_CONTROLE;
                                END

                                :ULTIMA_SEQUENCIA = :SEQUENCIA;
                                :SEQUENCIA = :SEQUENCIA+1;
                            END
    
                       :OLD_DOCUMENTO_CONTROLE = :PDV_CFE_ID;
                    END
               END
       END
    
       IF(:ORIGEM = 'NFS')THEN
       BEGIN
          DELETE FROM TBNFS_FORMA_PAGAMENTO WHERE DOCUMENTO_ID = :DOCUMENTO_ID AND DOCUMENTO_TIPO = :ORIGEM;

          FOR
           SELECT X.DOCUMENTO_TIPO,
                  X.DOCUMENTO,
                  X.PAGAMENTO_FORMA_ID,
                  X.NSU,
                  X.PARCELAS,
                  X.VALOR,
                  X.TARIFA,
                  ((X.TARIFA/100) * X.VALOR) AS valor_liqudido,
                  X.ADQUIRENTE_ID,
                  X.BANDEIRA_CARTAO,
                  X.CODIGO_AUTORIZACAO,
                  X.CONCILIACAO
    
                FROM(
                     SELECT
                         X.DOCUMENTO_TIPO,
                         X.DOCUMENTO,
                         X.PAGAMENTO_FORMA_ID,
                         X.NSU,
                         X.PARCELAS,
                         X.VALOR,
                         IIF(:CONCILIACAO_CARTAO_ID = 0,COALESCE((SELECT FIRST 1 (Z.TAXA)
                              FROM TBPDV_ADQUIRENTE_TAXA Z
                              WHERE Z.PARCELAS    = X.PARCELAS
                              AND Z.ADQUIRENTE_ID = X.ADQUIRENTE_CONSULTA
                              AND Z.BANDEIRA_ID   = X.BANDEIRA_CARTAO
                              AND Z.TIPO          = X.TIPO
                              AND (CAST(X.DATA_EMISSAO AS DATE) BETWEEN Z.DATA_INICIAL AND Z.DATA_FINAL)
                         ),0),
                         COALESCE((SELECT FIRST 1 CAST((((ZX.DESCONTO1 + ZX.DESCONTO2)/ZX.VALOR)*100) AS NUMERIC(15,2)) AS TAXA
                              FROM TBCONCILIACAO_CARTAO ZX
                              WHERE ZX.ID = :CONCILIACAO_CARTAO_ID)
                         ,0)) AS TARIFA,
                         X.ADQUIRENTE_ID,
                         X.BANDEIRA_CARTAO,
                         X.CODIGO_AUTORIZACAO,
                         X.CONCILIACAO
                       FROM(
                            SELECT
                                'NFS' AS DOCUMENTO_TIPO,
                                A.NFS_CONTROLE AS DOCUMENTO,
                                A.PAGAMENTO_FORMA AS PAGAMENTO_FORMA_ID,
                                A.NSU,
                                count(A.PARCELA) PARCELAS,
                                sum(A.VALOR) AS VALOR,
                                MAX(A.DATA_EMISSAO) AS DATA_EMISSAO,
                                E.ADQUIRENTE_ID,
                                D.ID AS BANDEIRA_CARTAO,
                                E.ID AS ADQUIRENTE_CONSULTA,
                                CASE
                                WHEN MAX(B.NFE_TIPPAG) = '03' THEN 'C'
                                WHEN MAX(B.NFE_TIPPAG) = '04' THEN 'D'
                                ELSE ''
                                END AS TIPO,
                                A.CODIGO_AUTORIZACAO,
                                0 AS CONCILIACAO
                                
                                FROM TBNFS_PARCELAMENTO A
                                INNER JOIN TBPAGAMENTO_FORMA        B ON B.CODIGO     = A.PAGAMENTO_FORMA AND (B.NFE_TIPPAG = '03' or B.NFE_TIPPAG = '04')
                                inner join TBCONTA_RECEBER_COBRANCA C on c.CODIGO     = a.CONTA_RECEBER_COBRANCA
                                inner join TBCARTAO_BANDEIRA        D ON D.NFE_TBAND  = C.NFE_TBAND
                                inner join TBPDV_ADQUIRENTE         E ON E.EMPRESA_ID = B.EMPRESA_ID
                            
                            WHERE A.CODIGO_AUTORIZACAO IS NOT NULL
                            AND (A.PDV_CFE_FORMA_PAGAMENTO_ID IS NULL or A.PDV_CFE_FORMA_PAGAMENTO_ID = 0)
                            AND A.AVULSO = 0
                            AND (:DOCUMENTO_ID IS NULL or A.NFS_CONTROLE = :DOCUMENTO_ID)
                            
                            GROUP BY A.NFS_CONTROLE, A.PAGAMENTO_FORMA, A.NSU, E.ADQUIRENTE_ID, D.ID, E.ID, A.CODIGO_AUTORIZACAO
                          ) X
                     ) X
                INTO :DOCUMENTO_TIPO, :DOCUMENTO, :PAGAMENTO_FORMA_ID, :NSU, :PARCELA, :VALOR, :TARIFA, :VALOR_LIQUIDO,
                     :ADQUIRENTE_ID, :BANDEIRA_CARTAO, :CODIGO_AUTORIZACAO, :CONCILIACAO
         DO BEGIN

                 TARIFA_PERCENTUAL = (TARIFA);
                 TARIFA_VALOR      = ((TARIFA_PERCENTUAL/100) * VALOR);
                 
                 UPDATE or INSERT INTO
                      TBNFS_FORMA_PAGAMENTO
                    (
                        DOCUMENTO_TIPO,
                        DOCUMENTO_ID,
                        PAGAMENTO_FORMA_ID,
                        PARCELAS,
                        VALOR,
                        VALOR_LIQUIDO,
                        NSU,
                        ADQUIRENTE_ID,
                        BANDEIRA_CARTAO,
                        CODIGO_AUTORIZACAO,
                        CONCILIACAO,
                        PERCENTUAL_TAXA,
                        VALOR_TAXA
                    )
                    VALUES
                    (
                        :DOCUMENTO_TIPO,
                        :DOCUMENTO,
                        :PAGAMENTO_FORMA_ID,
                        :PARCELA,
                        :VALOR,
                        :VALOR_LIQUIDO,
                        :NSU,
                        :ADQUIRENTE_ID,
                        :BANDEIRA_CARTAO,
                        :CODIGO_AUTORIZACAO,
                        :CONCILIACAO,
                        :TARIFA_PERCENTUAL,
                        :TARIFA_VALOR
                    )
                    MATCHING(DOCUMENTO_TIPO, DOCUMENTO_ID, PAGAMENTO_FORMA_ID, NSU, ADQUIRENTE_ID, BANDEIRA_CARTAO, CODIGO_AUTORIZACAO);

             END
            
            /*GERAR SEQUENCIA DAS PARCELAS DO DOCUMENTO*/
             :OLD_DOCUMENTO_CONTROLE = 0;
             :times = 0;
             IF(:GERAR_SEQ_TAXA = 1)THEN
             BEGIN
             FOR
                SELECT
                    A.NFS_CONTROLE AS DOCUMENTO,
                    count(A.PARCELA) AS PARCELAS,
                    F.ID
                    
                    FROM TBNFS_PARCELAMENTO A
                    INNER JOIN TBPAGAMENTO_FORMA        B ON B.CODIGO     = A.PAGAMENTO_FORMA AND (B.NFE_TIPPAG = '03' or B.NFE_TIPPAG = '04')
                    inner join TBCONTA_RECEBER_COBRANCA C on c.CODIGO     = a.CONTA_RECEBER_COBRANCA
                    inner join TBCARTAO_BANDEIRA        D ON D.NFE_TBAND  = C.NFE_TBAND
                    inner join TBPDV_ADQUIRENTE         E ON E.EMPRESA_ID = B.EMPRESA_ID
                    inner join TBNFS_FORMA_PAGAMENTO    F ON F.DOCUMENTO_ID = A.NFS_CONTROLE
                    AND F.PAGAMENTO_FORMA_ID = A.PAGAMENTO_FORMA
                    AND COALESCE(F.NSU,'')   = COALESCE(A.NSU,'')
                    AND F.ADQUIRENTE_ID      = E.ADQUIRENTE_ID
                    AND F.BANDEIRA_CARTAO    = D.ID
                    AND A.CODIGO_AUTORIZACAO = F.CODIGO_AUTORIZACAO
                
                WHERE A.CODIGO_AUTORIZACAO IS NOT NULL
                AND (A.PDV_CFE_FORMA_PAGAMENTO_ID IS NULL or A.PDV_CFE_FORMA_PAGAMENTO_ID = 0)
                AND A.AVULSO = 0
                AND (:DOCUMENTO_ID IS NULL or A.NFS_CONTROLE = :DOCUMENTO_ID)
                
                GROUP BY A.NFS_CONTROLE, A.PAGAMENTO_FORMA, A.NSU, E.ADQUIRENTE_ID, D.ID, A.CODIGO_AUTORIZACAO, f.id
                INTO :DOCUMENTO_CONTROLE, :PARCELA, :FORMA_PAGAMENTO_ID DO
                BEGIN
                 :SEQUENCIA        = 1;
                 IF(:OLD_DOCUMENTO_CONTROLE <> :DOCUMENTO_CONTROLE AND :OLD_DOCUMENTO_CONTROLE > 0)THEN
                 BEGIN
                   :ULTIMA_SEQUENCIA = 0;
                   :times            = 0;
                 END
                 :times            = :times+1;

                 FOR
                 SELECT A.CONTROLE, ((:TARIFA/100)*A.VALOR), A.VALOR_SALDO
                    FROM TBNFS_PARCELAMENTO A
                    INNER JOIN TBPAGAMENTO_FORMA        B ON B.CODIGO     = A.PAGAMENTO_FORMA AND (B.NFE_TIPPAG = '03' or B.NFE_TIPPAG = '04')
                    inner join TBCONTA_RECEBER_COBRANCA C on c.CODIGO     = a.CONTA_RECEBER_COBRANCA
                    inner join TBCARTAO_BANDEIRA        D ON D.NFE_TBAND  = C.NFE_TBAND
                    inner join TBPDV_ADQUIRENTE         E ON E.EMPRESA_ID = B.EMPRESA_ID
                    inner join TBNFS_FORMA_PAGAMENTO    F ON F.DOCUMENTO_ID = A.NFS_CONTROLE
                    AND F.PAGAMENTO_FORMA_ID = A.PAGAMENTO_FORMA
                    AND COALESCE(F.NSU,'')   = COALESCE(A.NSU,'')
                    AND F.ADQUIRENTE_ID      = E.ADQUIRENTE_ID
                    AND F.BANDEIRA_CARTAO    = D.ID
                    AND A.CODIGO_AUTORIZACAO = F.CODIGO_AUTORIZACAO
                    WHERE A.CODIGO_AUTORIZACAO IS NOT NULL
                    AND (A.PDV_CFE_FORMA_PAGAMENTO_ID IS NULL or A.PDV_CFE_FORMA_PAGAMENTO_ID = 0)
                    AND A.AVULSO = 0
                    AND (A.NFS_CONTROLE = :DOCUMENTO_CONTROLE)
                    AND F.ID = :FORMA_PAGAMENTO_ID
                    ORDER BY A.PARCELA
                    INTO :PARCELA_CONTROLE, :PARCELA_TARIFA_VALOR, :VALOR_SALDO DO
                    BEGIN

                        IF(:PARCELA > 1 AND :PARCELA > :SEQUENCIA and :times > 1)THEN
                        BEGIN
                          :SEQUENCIA = :PARCELA+1;
                          IF(:ULTIMA_SEQUENCIA < :SEQUENCIA)THEN
                          BEGIN
                          :SEQUENCIA = :ULTIMA_SEQUENCIA+1;
                          END
                        END

                        IF(:SEQUENCIA = 0)THEN
                        BEGIN
                           :SEQUENCIA = 1;
                        END

--                        if(:PARCELA_TARIFA_VALOR > 0)then
--                        begin
--                          exception "..." 'R$ '||:PARCELA_TARIFA_VALOR||' CONTROLE '||:PARCELA_CONTROLE;
--                        end
                        IF(:VALOR_SALDO > :PARCELA_TARIFA_VALOR)THEN
                        BEGIN
                            UPDATE TBNFS_PARCELAMENTO
                              SET SEQUENCIA       = :SEQUENCIA,
                                  PERCENTUAL_TAXA = :TARIFA,
                                  VALOR_TAXA      = :PARCELA_TARIFA_VALOR
                              WHERE CONTROLE      = :PARCELA_CONTROLE;
                        END
                        ELSE
                        BEGIN
                            UPDATE TBNFS_PARCELAMENTO
                              SET SEQUENCIA       = :SEQUENCIA
                              WHERE CONTROLE      = :PARCELA_CONTROLE;
                        END
                        :ULTIMA_SEQUENCIA = :SEQUENCIA;
                        :SEQUENCIA = :SEQUENCIA+1;
                    END
                    :OLD_DOCUMENTO_CONTROLE = :DOCUMENTO_CONTROLE;
                END
            END

       END
    
       IF(:ORIGEM = 'AVU')THEN
       BEGIN

           DELETE FROM TBNFS_FORMA_PAGAMENTO WHERE DOCUMENTO_ID = :DOCUMENTO_ID AND DOCUMENTO_TIPO = :ORIGEM;

           FOR

           SELECT X.DOCUMENTO_TIPO,
                  X.DOCUMENTO,
                  X.PAGAMENTO_FORMA_ID,
                  X.NSU,
                  X.PARCELAS,
                  X.VALOR,
                  X.TARIFA,
                  ((X.TARIFA/100) * X.VALOR) AS valor_liqudido,
                  X.ADQUIRENTE_ID,
                  X.BANDEIRA_CARTAO,
                  X.CODIGO_AUTORIZACAO,
                  X.CONCILIACAO
    
                FROM(
                     SELECT
                         X.DOCUMENTO_TIPO,
                         X.DOCUMENTO,
                         X.PAGAMENTO_FORMA_ID,
                         X.NSU,
                         X.PARCELAS,
                         X.VALOR,
                         IIF(:CONCILIACAO_CARTAO_ID = 0,COALESCE((SELECT FIRST 1 (Z.TAXA)
                              FROM TBPDV_ADQUIRENTE_TAXA Z
                              WHERE Z.PARCELAS    = X.PARCELAS
                              AND Z.ADQUIRENTE_ID = X.ADQUIRENTE_CONSULTA
                              AND Z.BANDEIRA_ID   = X.BANDEIRA_CARTAO
                              AND Z.TIPO          = X.TIPO
                              AND (CAST(X.DATA_EMISSAO AS DATE) BETWEEN Z.DATA_INICIAL AND Z.DATA_FINAL)
                         ),0),
                         COALESCE((SELECT FIRST 1 CAST((((ZX.DESCONTO1 + ZX.DESCONTO2)/ZX.VALOR)*100) AS NUMERIC(15,2)) AS TAXA
                              FROM TBCONCILIACAO_CARTAO ZX
                              WHERE ZX.ID = :CONCILIACAO_CARTAO_ID)
                         ,0)) AS TARIFA,
                         X.ADQUIRENTE_ID,
                         X.BANDEIRA_CARTAO,
                         X.CODIGO_AUTORIZACAO,
                         X.CONCILIACAO
                       FROM(
                            SELECT
                                'AVU' AS DOCUMENTO_TIPO,
                                A.NFS_CONTROLE AS DOCUMENTO,
                                A.PAGAMENTO_FORMA AS PAGAMENTO_FORMA_ID,
                                A.NSU,
                                count(A.PARCELA) PARCELAS,
                                sum(A.VALOR) AS VALOR,
                                MAX(A.DATA_EMISSAO) AS DATA_EMISSAO,
                                E.ADQUIRENTE_ID,
                                D.ID AS BANDEIRA_CARTAO,
                                E.ID AS ADQUIRENTE_CONSULTA,
                                CASE
                                WHEN MAX(B.NFE_TIPPAG) = '03' THEN 'C'
                                WHEN MAX(B.NFE_TIPPAG) = '04' THEN 'D'
                                ELSE ''
                                END AS TIPO,
                                A.CODIGO_AUTORIZACAO,
                                0 AS CONCILIACAO
                                
                                FROM TBNFS_PARCELAMENTO A
                                INNER JOIN TBPAGAMENTO_FORMA        B ON B.CODIGO     = A.PAGAMENTO_FORMA AND (B.NFE_TIPPAG = '03' or B.NFE_TIPPAG = '04')
                                inner join TBCONTA_RECEBER_COBRANCA C on c.CODIGO     = a.CONTA_RECEBER_COBRANCA
                                inner join TBCARTAO_BANDEIRA        D ON D.NFE_TBAND  = C.NFE_TBAND
                                inner join TBPDV_ADQUIRENTE         E ON E.EMPRESA_ID = B.EMPRESA_ID
                            
                            WHERE A.CODIGO_AUTORIZACAO IS NOT NULL
                            AND (A.PDV_CFE_FORMA_PAGAMENTO_ID IS NULL or A.PDV_CFE_FORMA_PAGAMENTO_ID = 0)
                            AND A.AVULSO = 1
                            AND (:DOCUMENTO_ID IS NULL or A.NFS_CONTROLE = :DOCUMENTO_ID)
                            
                            GROUP BY A.NFS_CONTROLE, A.PAGAMENTO_FORMA, A.NSU, E.ADQUIRENTE_ID, D.ID, E.ID, A.CODIGO_AUTORIZACAO
                          ) X
                     ) X
    
             INTO :DOCUMENTO_TIPO, :DOCUMENTO, :PAGAMENTO_FORMA_ID, :NSU, :PARCELA, :VALOR, :TARIFA, :VALOR_LIQUIDO,
                  :ADQUIRENTE_ID, :BANDEIRA_CARTAO, :CODIGO_AUTORIZACAO, :CONCILIACAO
            DO BEGIN

                 TARIFA_PERCENTUAL = (TARIFA);
                 TARIFA_VALOR      = ((TARIFA_PERCENTUAL/100) * VALOR);
                 
                 UPDATE OR INSERT INTO
                      TBNFS_FORMA_PAGAMENTO
                    (
                        DOCUMENTO_TIPO,
                        DOCUMENTO_ID,
                        PAGAMENTO_FORMA_ID,
                        PARCELAS,
                        VALOR,
                        VALOR_LIQUIDO,
                        NSU,
                        ADQUIRENTE_ID,
                        BANDEIRA_CARTAO,
                        CODIGO_AUTORIZACAO,
                        CONCILIACAO,
                        PERCENTUAL_TAXA,
                        VALOR_TAXA
                    )
                    VALUES
                    (
                        :DOCUMENTO_TIPO,
                        :DOCUMENTO,
                        :PAGAMENTO_FORMA_ID,
                        :PARCELA,
                        :VALOR,
                        :VALOR_LIQUIDO,
                        :NSU,
                        :ADQUIRENTE_ID,
                        :BANDEIRA_CARTAO,
                        :CODIGO_AUTORIZACAO,
                        :CONCILIACAO,
                        :TARIFA_PERCENTUAL,
                        :TARIFA_VALOR
                    )
                    MATCHING(DOCUMENTO_TIPO, DOCUMENTO_ID, PAGAMENTO_FORMA_ID, NSU, ADQUIRENTE_ID, BANDEIRA_CARTAO, CODIGO_AUTORIZACAO);

              END
            /*GERAR SEQUENCIA DAS PARCELAS DO DOCUMENTO*/
             :OLD_DOCUMENTO_CONTROLE = 0;
             :times = 0;
             
             IF(:GERAR_SEQ_TAXA = 1)THEN
             BEGIN
             FOR
                SELECT
                    A.NFS_CONTROLE AS DOCUMENTO,
                    count(A.PARCELA) AS PARCELAS,
                    F.ID
                    
                    FROM TBNFS_PARCELAMENTO A
                    INNER JOIN TBPAGAMENTO_FORMA        B ON B.CODIGO     = A.PAGAMENTO_FORMA AND (B.NFE_TIPPAG = '03' or B.NFE_TIPPAG = '04')
                    inner join TBCONTA_RECEBER_COBRANCA C on c.CODIGO     = a.CONTA_RECEBER_COBRANCA
                    inner join TBCARTAO_BANDEIRA        D ON D.NFE_TBAND  = C.NFE_TBAND
                    inner join TBPDV_ADQUIRENTE         E ON E.EMPRESA_ID = B.EMPRESA_ID
                    inner join TBNFS_FORMA_PAGAMENTO    F ON F.DOCUMENTO_ID = A.NFS_CONTROLE
                    AND F.PAGAMENTO_FORMA_ID = A.PAGAMENTO_FORMA
                    AND COALESCE(F.NSU,'')   = COALESCE(A.NSU,'')
                    AND F.ADQUIRENTE_ID      = E.ADQUIRENTE_ID
                    AND F.BANDEIRA_CARTAO    = D.ID
                    AND A.CODIGO_AUTORIZACAO = F.CODIGO_AUTORIZACAO
                
                WHERE A.CODIGO_AUTORIZACAO IS NOT NULL
                AND (A.PDV_CFE_FORMA_PAGAMENTO_ID IS NULL or A.PDV_CFE_FORMA_PAGAMENTO_ID = 0)
                AND A.AVULSO = 1
                AND (:DOCUMENTO_ID IS NULL or A.NFS_CONTROLE = :DOCUMENTO_ID)
                
                GROUP BY A.NFS_CONTROLE, A.PAGAMENTO_FORMA, A.NSU, E.ADQUIRENTE_ID, D.ID, A.CODIGO_AUTORIZACAO, f.id
                INTO :DOCUMENTO_CONTROLE, :PARCELA, :FORMA_PAGAMENTO_ID DO
                BEGIN
                 :SEQUENCIA        = 1;
                 IF(:OLD_DOCUMENTO_CONTROLE <> :DOCUMENTO_CONTROLE AND :OLD_DOCUMENTO_CONTROLE > 0)THEN
                 BEGIN
                   :ULTIMA_SEQUENCIA = 0;
                   :times            = 0;
                 END
                 :times            = :times+1;

                 FOR
                 SELECT A.CONTROLE, ((:TARIFA/100)*A.VALOR), A.VALOR_SALDO
                    FROM TBNFS_PARCELAMENTO A
                    INNER JOIN TBPAGAMENTO_FORMA        B ON B.CODIGO     = A.PAGAMENTO_FORMA AND (B.NFE_TIPPAG = '03' or B.NFE_TIPPAG = '04')
                    inner join TBCONTA_RECEBER_COBRANCA C on c.CODIGO     = a.CONTA_RECEBER_COBRANCA
                    inner join TBCARTAO_BANDEIRA        D ON D.NFE_TBAND  = C.NFE_TBAND
                    inner join TBPDV_ADQUIRENTE         E ON E.EMPRESA_ID = B.EMPRESA_ID
                    inner join TBNFS_FORMA_PAGAMENTO    F ON F.DOCUMENTO_ID = A.NFS_CONTROLE
                    AND F.PAGAMENTO_FORMA_ID = A.PAGAMENTO_FORMA
                    AND COALESCE(F.NSU,'')   = COALESCE(A.NSU,'')
                    AND F.ADQUIRENTE_ID = E.ADQUIRENTE_ID
                    AND F.BANDEIRA_CARTAO    = D.ID AND A.CODIGO_AUTORIZACAO = F.CODIGO_AUTORIZACAO
                    WHERE A.CODIGO_AUTORIZACAO IS NOT NULL
                    AND (A.PDV_CFE_FORMA_PAGAMENTO_ID IS NULL or A.PDV_CFE_FORMA_PAGAMENTO_ID = 0)
                    AND A.AVULSO = 1
                    AND (A.NFS_CONTROLE = :DOCUMENTO_CONTROLE)
                    AND F.ID = :FORMA_PAGAMENTO_ID
                    ORDER BY A.PARCELA
                    INTO :PARCELA_CONTROLE, :PARCELA_TARIFA_VALOR, :VALOR_SALDO DO
                    BEGIN

                        IF(:PARCELA > 1 AND :PARCELA > :SEQUENCIA and :times > 1)THEN
                        BEGIN
                          :SEQUENCIA = :PARCELA+1;
                          IF(:ULTIMA_SEQUENCIA < :SEQUENCIA)THEN
                          BEGIN
                          :SEQUENCIA = :ULTIMA_SEQUENCIA+1;
                          END
                        END
                        IF(:SEQUENCIA = 0)THEN
                        BEGIN
                           :SEQUENCIA = 1;
                        END

--                        if(:PARCELA_TARIFA_VALOR > 0)then
--                        begin
--                          exception "..." 'R$ '||:PARCELA_TARIFA_VALOR||' CONTROLE '||:PARCELA_CONTROLE;
--                        end

                        IF(:VALOR_SALDO > :PARCELA_TARIFA_VALOR)THEN
                        BEGIN
                            UPDATE TBNFS_PARCELAMENTO
                              SET SEQUENCIA       = :SEQUENCIA,
                                  PERCENTUAL_TAXA = :TARIFA,
                                  VALOR_TAXA      = :PARCELA_TARIFA_VALOR
                              WHERE CONTROLE      = :PARCELA_CONTROLE;
                        END
                        ELSE
                        BEGIN
                            UPDATE TBNFS_PARCELAMENTO
                              SET SEQUENCIA       = :SEQUENCIA
                              WHERE CONTROLE      = :PARCELA_CONTROLE;
                        END
                        :ULTIMA_SEQUENCIA = :SEQUENCIA;
                        :SEQUENCIA = :SEQUENCIA+1;
                    END
                    :OLD_DOCUMENTO_CONTROLE = :DOCUMENTO_CONTROLE;
                END
            END

       END

    END

END;