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);
DECLARE VARIABLE PDV_CFE_FORMA_PAGAMENTO_ID INTEGER;
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.ID AS PDV_CFE_FORMA_PAGAMENTO_ID,
                 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,
                        SUM(B.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')
                        LEFT  JOIN TBCARTAO_BANDEIRA   D ON D.ID                         = a.CARTAO_BANDEIRA_ID
                        INNER JOIN TBPDV_ADQUIRENTE    E ON E.ADQUIRENTE_ID              = A.ADQUIRENTE_ID
                    WHERE c.EMPRESA_ID > 0 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 :PDV_CFE_FORMA_PAGAMENTO_ID, :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,
                        PDV_CFE_FORMA_PAGAMENTO_ID
                    )
                    VALUES
                    (
                        :DOCUMENTO_TIPO,
                        :DOCUMENTO,
                        :PAGAMENTO_FORMA_ID,
                        :PARCELA,
                        :VALOR,
                        :VALOR_LIQUIDO,
                        :NSU,
                        :ADQUIRENTE_ID,
                        :BANDEIRA_CARTAO,
                        :CODIGO_AUTORIZACAO,
                        :CONCILIACAO,
                        :TARIFA_PERCENTUAL,
                        :TARIFA_VALOR,
                        :PDV_CFE_FORMA_PAGAMENTO_ID
                    )
                    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, ((cast(:tarifa as numeric(10,5))/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
----                              WHERE CONTROLE      = :PARCELA_CONTROLE;
--                        END
                        :ULTIMA_SEQUENCIA = :SEQUENCIA;
                        :SEQUENCIA = :SEQUENCIA+1;
                    END
                    :OLD_DOCUMENTO_CONTROLE = :DOCUMENTO_CONTROLE;

                    /*
                            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.VALOR - ((X.TARIFA/100) * X.VALOR)) AS VALOR_LIQUIDO,
                  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')
                                left  join TBCONTA_RECEBER_COBRANCA C on c.CODIGO     = a.CONTA_RECEBER_COBRANCA
                                left  join TBCARTAO_BANDEIRA        D ON D.NFE_TBAND  = C.NFE_TBAND
                                inner join TBPDV_ADQUIRENTE         E ON E.EMPRESA_ID = B.EMPRESA_ID
                            
                            WHERE b.EMPRESA_ID > 0
                            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')
                    left  join TBCONTA_RECEBER_COBRANCA C on c.CODIGO       = a.CONTA_RECEBER_COBRANCA
                    left  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 COALESCE(F.BANDEIRA_CARTAO,'')    = COALESCE(D.ID,'')
                    AND COALESCE(A.CODIGO_AUTORIZACAO,'') = COALESCE(F.CODIGO_AUTORIZACAO,'')
                
                WHERE B.EMPRESA_ID > 0
                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,  ((cast(:tarifa as numeric(10,5))/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')
                    left  join TBCONTA_RECEBER_COBRANCA C on c.CODIGO     = a.CONTA_RECEBER_COBRANCA
                    left  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 COALESCE(F.BANDEIRA_CARTAO,'')    = COALESCE(D.ID,'')
                    AND COALESCE(A.CODIGO_AUTORIZACAO,'') = COALESCE(F.CODIGO_AUTORIZACAO,'')

                    WHERE B.EMPRESA_ID > 0
                    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,
                                  NFS_FORMA_PAGAMENTO_ID = :FORMA_PAGAMENTO_ID,
                                  PERCENTUAL_TAXA        = :TARIFA,
                                  VALOR_TAXA             = :PARCELA_TARIFA_VALOR
                              WHERE CONTROLE             = :PARCELA_CONTROLE;
                        END
                        ELSE
                        BEGIN
                            UPDATE TBNFS_PARCELAMENTO
                              SET SEQUENCIA              = :SEQUENCIA,
                                  NFS_FORMA_PAGAMENTO_ID = :FORMA_PAGAMENTO_ID
                              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.VALOR - ((X.TARIFA/100) * X.VALOR)) AS VALOR_LIQUIDO,
                  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')
                                left  join TBCONTA_RECEBER_COBRANCA C on c.CODIGO     = a.CONTA_RECEBER_COBRANCA
                                left  join TBCARTAO_BANDEIRA        D ON D.NFE_TBAND  = C.NFE_TBAND
                                inner join TBPDV_ADQUIRENTE         E ON E.EMPRESA_ID = B.EMPRESA_ID
                            
                            WHERE b.EMPRESA_ID > 0
                            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')
                    left  join TBCONTA_RECEBER_COBRANCA C on c.CODIGO     = a.CONTA_RECEBER_COBRANCA
                    left  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 COALESCE(F.BANDEIRA_CARTAO,'')    = COALESCE(D.ID,'')
                    AND COALESCE(A.CODIGO_AUTORIZACAO,'') = COALESCE(F.CODIGO_AUTORIZACAO,'')

                WHERE B.EMPRESA_ID > 0
                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,  ((cast(:tarifa as numeric(10,5))/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')
                    left  join TBCONTA_RECEBER_COBRANCA C on c.CODIGO     = a.CONTA_RECEBER_COBRANCA
                    left  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 COALESCE(F.BANDEIRA_CARTAO,'')    = COALESCE(D.ID,'')
                    AND COALESCE(A.CODIGO_AUTORIZACAO,'') = COALESCE(F.CODIGO_AUTORIZACAO,'')
                    WHERE B.EMPRESA_ID > 0
                    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,
                                  NFS_FORMA_PAGAMENTO_ID = :FORMA_PAGAMENTO_ID,
                                  PERCENTUAL_TAXA        = :TARIFA,
                                  VALOR_TAXA             = :PARCELA_TARIFA_VALOR
                              WHERE CONTROLE             = :PARCELA_CONTROLE;
                        END
                        ELSE
                        BEGIN
                            UPDATE TBNFS_PARCELAMENTO
                              SET SEQUENCIA              = :SEQUENCIA,
                                  NFS_FORMA_PAGAMENTO_ID = :FORMA_PAGAMENTO_ID
                              WHERE CONTROLE             = :PARCELA_CONTROLE;
                        END
                        :ULTIMA_SEQUENCIA = :SEQUENCIA;
                        :SEQUENCIA = :SEQUENCIA+1;
                    END
                    :OLD_DOCUMENTO_CONTROLE = :DOCUMENTO_CONTROLE;
                END
            END

       END

    END

END;