SET TERM ^ ;

CREATE OR ALTER PROCEDURE SP_CFE_PARCELAMENTO (
    PDV_CFE_ID INTEGER,
    ACAO INTEGER,
    PDV_CFE_FORMA_PAGAMENTO_ID INTEGER = 0)
AS
DECLARE VARIABLE PARCELAMENTO_ID INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE PAGAMENTO_FORMA_ID INTEGER;
DECLARE VARIABLE VALOR_TEMP NUMERIC(15,2);
DECLARE VARIABLE VALOR_SALDO NUMERIC(15,2);
DECLARE VARIABLE VALOR_TOTAL NUMERIC(15,2);
DECLARE VARIABLE TROCO NUMERIC(15,2);
DECLARE VARIABLE VALOR_LIQUIDO NUMERIC(15,2);
DECLARE VARIABLE VALOR_REAL NUMERIC(15,2);
DECLARE VARIABLE VALOR_CHEQUE_TEMP NUMERIC(15,2);
DECLARE VARIABLE PARCELA_X INTEGER;
DECLARE VARIABLE PARCELAS INTEGER;
DECLARE VARIABLE ID_PAGAMENTO INTEGER;
DECLARE VARIABLE TIPO_PAG CHAR(2);
DECLARE VARIABLE CONTA_RECEBER_BANCO INTEGER;
DECLARE VARIABLE CONTA_RECEBER_MODALIDADE INTEGER;
DECLARE VARIABLE CONTA_RECEBER_POSICAO INTEGER;
DECLARE VARIABLE CONTA_RECEBER_COBRANCA INTEGER;
DECLARE VARIABLE CONTA_RECEBER_OPERACAO INTEGER;
DECLARE VARIABLE NATUREZA CHAR(1);
DECLARE VARIABLE OBSERVACAO VARCHAR(100);
DECLARE VARIABLE FORMA_COMISSAO CHAR(1);
DECLARE VARIABLE COUNT_PARCELA INTEGER;
DECLARE VARIABLE SEQUENCIA INTEGER;
DECLARE VARIABLE CODIGO_AUTORIZACAO VARCHAR(50);
DECLARE VARIABLE NSU VARCHAR(50);
DECLARE VARIABLE PERMITE_GERAR_BAIXA VARCHAR(1);
DECLARE VARIABLE CAIXABANCO_CONTROLE INTEGER;
DECLARE VARIABLE CONTA_RECEBER_BAIXA_ID INTEGER;
DECLARE VARIABLE CAIXABANCO_CONTA VARCHAR(12);
DECLARE VARIABLE CAIXABANCO_LANC_INCLUIDO INTEGER;
DECLARE VARIABLE CONTA_RECEBER_BAIXA_CC VARCHAR(10);
DECLARE VARIABLE CAIXABANCO_ID INTEGER;
DECLARE VARIABLE CONTA_RECEBER_BAIXA_CLASS VARCHAR(10);
DECLARE VARIABLE CONTA_RECEBER_BAIXA_HIST VARCHAR(100);
DECLARE VARIABLE CONTA_RECEBER_BAIXA_TP_CONTA VARCHAR(11);
DECLARE VARIABLE CONTA_RECEBER_BAIXA_CONTA VARCHAR(11);
DECLARE VARIABLE CONTA_CONTABIL_EMPRESA1 VARCHAR(11);
DECLARE VARIABLE CONTA_CONTABIL_EMPRESA2 VARCHAR(11);
DECLARE VARIABLE LIST_PRAZO VARCHAR(500);
DECLARE VARIABLE LIST_QUOTA VARCHAR(500);
DECLARE VARIABLE CONTA_RECEBER_REG_CONTROLE INTEGER;
DECLARE VARIABLE CONTABILIZACAO_BANCO_ID INTEGER;
DECLARE VARIABLE CONTABILIZACAO_MESTRE_ID INTEGER;
DECLARE VARIABLE CONTABILIZACAO_REG_ID INTEGER;
DECLARE VARIABLE DATA_CREDITO DATE;
DECLARE VARIABLE PDV_TIPO INTEGER;
DECLARE VARIABLE QTD_PARCELAS INTEGER;
DECLARE VARIABLE DIA_CREDITO INTEGER;
DECLARE VARIABLE PARCELAS_SEM_SALDO INTEGER;
DECLARE VARIABLE OBSERVACAO_BRINDE VARCHAR(100);
DECLARE VARIABLE CHEQUE_ID INTEGER;
DECLARE VARIABLE CHEQUE_ITEM_ID INTEGER;
DECLARE VARIABLE COLABORADOR_ID INTEGER;
DECLARE VARIABLE DIA_EMISSAO INTEGER;
DECLARE VARIABLE MES_ADICIONAR INTEGER;
DECLARE VARIABLE PDV_ID INTEGER;
DECLARE VARIABLE OFFLINE_ID INTEGER;
DECLARE VARIABLE CHEQUE_ID_ONLINE INTEGER;
DECLARE VARIABLE CHECK_ITEM INTEGER;
DECLARE VARIABLE CONDICAO_PAGAMENTO_ID INTEGER;
DECLARE VARIABLE ESTABELECIMENTO_ID INTEGER;
DECLARE VARIABLE REPRESENTANTE_ID INTEGER;
DECLARE VARIABLE REPRESENTANTE_COMISSAO NUMERIC(15,2);
DECLARE VARIABLE VENDEDOR_ID INTEGER;
DECLARE VARIABLE VENDEDOR_COMISSAO NUMERIC(15,2);
DECLARE VARIABLE CLIENTE_ID INTEGER;
DECLARE VARIABLE CAIXA_ID INTEGER;
DECLARE VARIABLE NUMERO_CFE INTEGER;
DECLARE VARIABLE SERIE_CFE VARCHAR(3);
DECLARE VARIABLE DATA_EMISSAO DATE;
DECLARE VARIABLE VENCIMENTOS VARCHAR(500);
DECLARE VARIABLE VALORES_PAGAMENTO VARCHAR(500);
DECLARE VARIABLE CLASSIFICACAO_FINANCEIRA VARCHAR(10);
BEGIN
    
    :CAIXA_ID = COALESCE((SELECT FIRST 1 K.PDV_CAIXA_ID FROM TBPDV_CFE U, TBPDV_MOVIMENTO_CAIXA K WHERE U.ID = :PDV_CFE_ID AND K.ID = U.PDV_MOVIMENTO_CAIXA_ID), 0);

    /* REGISTRAR PARCELAS NO CAIXA BANCO */
    IF(:ACAO = 1) THEN
    BEGIN
        :CHECK_ITEM = 0;
        :COUNT_PARCELA = 1;

        FOR SELECT
                T.ID,
                T.PAGAMENTO_FORMA_ID,
                T.VALOR,
                T.TROCO,
                T.VALOR_LIQUIDO,
                T.PARCELAS,
                T.PAGAMENTO_ID AS ID_PAGAMENTO,
                PF.NFE_TIPPAG AS TIPO_PAG,
                PF.BANCO_ID,
                PF.MODALIDADE_ID,
                PF.POSICAO_ID,
                PF.COBRANCA_ID,
                PF.OPERACAO_ID,
                OP.TIPO,
                T.CODIGO_AUTORIZACAO,
                T.NSU,
                IIF(PF.CONTA_RECEBER_BAIXA_ID > 0, '1', '0') AS PERMITE_GERAR_BAIXA,
                COALESCE((SELECT FIRST 1 C.CODIGO FROM TBCONTA_RECEBER_OPERACAO C WHERE C.CODIGO = PF.CONTA_RECEBER_BAIXA_ID
                          AND CHAR_LENGTH(TRIM(COALESCE(C.CLASSIFICACAO_FINANCEIRA,''))) > 3), 0) AS CONTA_RECEBER_BAIXA_ID,
                COALESCE(PF.PDV_TIPO, 0) AS PDV_TIPO,
                COALESCE(PF.QTD_PARCELAS, 1) AS QTD_PARCELAS,
                COALESCE(PF.DIA_CREDITO, 1) AS DIA_CREDITO,
                COALESCE(PF.PARCELAS_SEM_SALDO, 0) AS PARCELAS_SEM_SALDO,
                COALESCE(C.OBSERVACAO_BRINDE, '') AS OBSERVACAO_BRINDE,
                COALESCE(T.CHEQUE_ID, 0) AS CHEQUE_ID,
                COALESCE(C.COLABORADOR_ID, 0) AS COLABORADOR_ID,
                COALESCE(C.PDV_ID, 0) AS PDV_ID ,
                COALESCE(C.OFFLINE_ID, 0) AS OFFLINE_ID,
                T.CONDICAO_PAGAMENTO_ID,
                C.ESTABELECIMENTO_ID,
                C.REPRESENTANTE_ID,
                C.REPRESENTANTE_COMISSAO,
                C.VENDEDOR_ID,
                C.VENDEDOR_COMISSAO,
                C.CLIENTE_ID,
                COALESCE((SELECT FIRST 1 T.FORMA_COMISSAO FROM TBREPRESENTANTE T WHERE T.CODIGO = C.REPRESENTANTE_ID), 'F'),
                C.NUMERO_CFE,
                C.SERIE,
                C.DATA_EMISSAO,
                T.VENCIMENTOS,
                T.VALORES_PAGAMENTO,
                OP.CLASSIFICACAO_FINANCEIRA
            FROM TBPDV_CFE_FORMA_PAGAMENTO T
            INNER JOIN TBPDV_CFE C ON C.ID = T.PDV_CFE_ID
            INNER JOIN TBPAGAMENTO_FORMA PF ON PF.CODIGO = T.PAGAMENTO_FORMA_ID
            INNER JOIN TBCONTA_RECEBER_OPERACAO OP ON OP.CODIGO = PF.OPERACAO_ID
            WHERE T.PDV_CFE_ID = :PDV_CFE_ID
            AND (:PDV_CFE_FORMA_PAGAMENTO_ID = 0 OR T.ID = :PDV_CFE_FORMA_PAGAMENTO_ID)
            INTO
            :ID, :PAGAMENTO_FORMA_ID, :VALOR_TOTAL,
            :TROCO, :VALOR_LIQUIDO, :PARCELAS,
            :ID_PAGAMENTO, :TIPO_PAG, :CONTA_RECEBER_BANCO,
            :CONTA_RECEBER_MODALIDADE, :CONTA_RECEBER_POSICAO, :CONTA_RECEBER_COBRANCA,
            :CONTA_RECEBER_OPERACAO, :NATUREZA, :CODIGO_AUTORIZACAO, :NSU, :PERMITE_GERAR_BAIXA, :CONTA_RECEBER_BAIXA_ID,
            :PDV_TIPO, :QTD_PARCELAS, :DIA_CREDITO, :PARCELAS_SEM_SALDO, :OBSERVACAO_BRINDE, :CHEQUE_ID, :COLABORADOR_ID, :PDV_ID, :OFFLINE_ID,
            :CONDICAO_PAGAMENTO_ID, :ESTABELECIMENTO_ID, :REPRESENTANTE_ID, :REPRESENTANTE_COMISSAO, :VENDEDOR_ID, :VENDEDOR_COMISSAO, :CLIENTE_ID,
            :FORMA_COMISSAO, :NUMERO_CFE, :SERIE_CFE, :DATA_EMISSAO, :VENCIMENTOS, :VALORES_PAGAMENTO, :CLASSIFICACAO_FINANCEIRA
            DO BEGIN

                    IF(COALESCE(:FORMA_COMISSAO, '') = '') THEN
                    BEGIN
                        :FORMA_COMISSAO = 'F';
                    END

                   :PARCELA_X = 1;

                   :VALOR_REAL = ROUND(:VALOR_LIQUIDO - :TROCO, 2);

                   :VALOR_TEMP = ROUND(:VALOR_REAL / :PARCELAS, 2);
    
                   :SEQUENCIA = 1;
                   
                   :DIA_EMISSAO    = EXTRACT(DAY FROM :DATA_EMISSAO);

                   :MES_ADICIONAR  = COALESCE((SELECT FIRST 1 K.MES_ADICIONAR FROM TBPAGAMENTO_FORMA_VENC_COLAB K WHERE K.PAGAMENTO_FORMA_ID = :PAGAMENTO_FORMA_ID AND :DIA_EMISSAO BETWEEN K.DIA_INICIAL AND K.DIA_FINAL), 1);

                   IF(:CONDICAO_PAGAMENTO_ID > 0 AND COALESCE(:VALORES_PAGAMENTO, '') = '') THEN
                   BEGIN
                        :PARCELAS = COALESCE((SELECT COUNT(K.PRAZO) FROM TBPAGAMENTO_CONDICAO_PRAZO K WHERE K.CONDICAOPAGAMENTO_CODIGO = :CONDICAO_PAGAMENTO_ID), 1);

                        :LIST_PRAZO = COALESCE((SELECT LIST(P.PRAZO, '|') FROM TBPAGAMENTO_CONDICAO_PRAZO P WHERE P.CONDICAOPAGAMENTO_CODIGO = :CONDICAO_PAGAMENTO_ID),'');

                        :LIST_QUOTA = COALESCE((SELECT LIST(P.QUOTA, '|') FROM TBPAGAMENTO_CONDICAO_PRAZO P WHERE P.CONDICAOPAGAMENTO_CODIGO = :CONDICAO_PAGAMENTO_ID),'');
                   END

                   WHILE (:PARCELA_X <= :PARCELAS) DO
                    BEGIN

                        IF(:CONDICAO_PAGAMENTO_ID > 0 AND COALESCE(:VALORES_PAGAMENTO, '') = '') THEN
                        BEGIN
                            :VALOR_TEMP = FN_CALC_PRECISION_V2(FN_CALC_PRECISION_V2(CAST(FN_ARRAY(:LIST_QUOTA, :PARCELA_X, '|') AS NUMERIC(15,2)), 100, '/', 2), :VALOR_REAL, '*', 2);
                        END

                        IF(:PARCELA_X = :PARCELAS) THEN
                        BEGIN
                            :VALOR_TEMP = :VALOR_REAL - (:VALOR_TEMP * (:PARCELAS - 1));
                        END
            
                        IF(:PARCELAS = 1) THEN
                        BEGIN
                            :VALOR_TEMP = :VALOR_REAL;
                        END

                        IF(COALESCE(:VALORES_PAGAMENTO, '') <> '') THEN
                        BEGIN
                            :VALOR_TEMP = CAST(FN_ARRAY(:VALORES_PAGAMENTO, :PARCELA_X, '|') AS NUMERIC(15,2));
                        END
    
                        :PARCELAMENTO_ID = GEN_ID(GTBNFS_PARCELAMENTO, 1);

                        :OBSERVACAO = 'CUPOM: ' || :NUMERO_CFE ||'-'|| LPAD(:SERIE_CFE,2,'0')||' CAIXA:'|| :CAIXA_ID;

                        IF(:PDV_TIPO = 7 AND :OBSERVACAO_BRINDE <> '') THEN
                        BEGIN
                            :OBSERVACAO = :OBSERVACAO_BRINDE;
                        END


    
                        /* INSERT REGISTRO TBNFS_PARCELAMENTO */
                        IF(:PDV_TIPO = 6) THEN
                        BEGIN
                            
                            IF(COALESCE(:VENCIMENTOS, '') <> '') THEN
                            BEGIN
                                :DATA_CREDITO = FN_ARRAY(:VENCIMENTOS, :PARCELA_X, '|');
                            END ELSE
                            BEGIN
                                :DATA_CREDITO   = CAST(:DIA_CREDITO||'.'||EXTRACT(MONTH FROM :DATA_EMISSAO)||'.'||EXTRACT(YEAR FROM :DATA_EMISSAO) AS DATE);
                                :DATA_CREDITO   = DATEADD(MONTH, :MES_ADICIONAR, :DATA_CREDITO);
                                
                                :MES_ADICIONAR      = :MES_ADICIONAR + 1;
                            END
                            
                        END ELSE
                        BEGIN
                            :DATA_CREDITO = :DATA_EMISSAO;

                            IF((:TIPO_PAG = '03' OR :TIPO_PAG = '15') AND :CONDICAO_PAGAMENTO_ID = 0 AND COALESCE(:VENCIMENTOS, '') = '') THEN
                            BEGIN
                                :DATA_CREDITO = DATEADD(MONTH, :PARCELA_X, :DATA_CREDITO);
                            END

                            IF(:CONDICAO_PAGAMENTO_ID > 0 AND COALESCE(:VENCIMENTOS, '') = '') THEN
                            BEGIN
                                :DATA_CREDITO = DATEADD(DAY, FN_ARRAY(:LIST_PRAZO, :PARCELA_X, '|'), :DATA_CREDITO);
                            END

                            IF(COALESCE(:VENCIMENTOS, '') <> '') THEN
                            BEGIN
                                :DATA_CREDITO = FN_ARRAY(:VENCIMENTOS, :PARCELA_X, '|');
                            END
                        END


                        :VALOR_SALDO = :VALOR_TEMP;
                        IF(:PARCELAS_SEM_SALDO = 1) THEN
                        BEGIN
                            :VALOR_SALDO = 0;
                        END

                        INSERT INTO TBNFS_PARCELAMENTO (CAIXA_ID, NFS_CONTROLE, PARCELA, VALOR, DATA_VENCIMENTO,
                            DATA_FLUXO, CONTA_RECEBER_OPERACAO, CONTA_RECEBER_BANCO, CONTA_RECEBER_MODALIDADE,
                            CONTA_RECEBER_POSICAO, CONTA_RECEBER_COBRANCA, ACEITE, ESTABELECIMENTO_CODIGO,
                            NUMERO_NOTAFISCAL, DATA_EMISSAO, EMPRESA_CODIGO, SITUACAO, CONTROLE, VALOR_DESCONTO,
                            VALOR_SALDO, REMESSA_ARQUIVO, REMESSA_DATA, REMESSA_NUMERO_BANCO, VIA_DUPLICATA, SERIE,
                            PAGAMENTO_FORMA, AVULSO, CLASSIFICACAO_CONTABIL, CCUSTO, CLASSIFICACAO, OBSERVACAO, FLAG,
                            SALESFORCE, NOTIFICADO_VENCIMENTO, REPRESENTANTE_COMISSAO, REPRESENTANTE_ID, VENDEDOR_ID,
                            VENDEDOR_COMISSAO, FORMA_COMISSAO, DATAHORA,TIPO, PDV_CFE_FORMA_PAGAMENTO_ID, SEQUENCIA, CODIGO_AUTORIZACAO, NSU, COLABORADOR_ID)
                        VALUES (:CAIXA_ID, 0, :COUNT_PARCELA, :VALOR_TEMP, :DATA_CREDITO, NULL,
                            :CONTA_RECEBER_OPERACAO, :CONTA_RECEBER_BANCO, :CONTA_RECEBER_MODALIDADE, :CONTA_RECEBER_POSICAO,
                            :CONTA_RECEBER_COBRANCA, 'S', :ESTABELECIMENTO_ID, :NUMERO_CFE, :DATA_EMISSAO, :CLIENTE_ID,
                            1, :PARCELAMENTO_ID, 0, :VALOR_SALDO, NULL, NULL, '', NULL, :SERIE_CFE, :PAGAMENTO_FORMA_ID,
                            '0', :CLASSIFICACAO_FINANCEIRA, '', '', :OBSERVACAO, 0, '0', 0, :REPRESENTANTE_COMISSAO, :REPRESENTANTE_ID, :VENDEDOR_ID,
                            :VENDEDOR_COMISSAO, :FORMA_COMISSAO, CURRENT_TIMESTAMP, 2, :ID, :SEQUENCIA, :CODIGO_AUTORIZACAO, :NSU, :COLABORADOR_ID);

                        /* INSERT REGISTRO CAIXABANCO */

                        INSERT INTO TBCAIXABANCO_LANCAMENTO_REG (CONTROLE, ESTABELECIMENTO_CODIGO, CAIXABANCO_CONTROLE,
                            DATA, EMPRESA_CODIGO, NFE_PARCELAMENTO_CONTROLE, NFS_PARCELAMENTO_CONTROLE, CAIXABANCO_CODIGO,
                            OPERACAO_CODIGO, DOCUMENTO_NUMERO, PARCELA, VALOR, VALOR_DESCONTO, VALOR_JUROS, VALOR_MULTA,
                            VALOR_DESPESA_DIVERSA, VALOR_DESPESA_COBRANCA, VALOR_DESPESA_CARTORIO, REGISTRO_MESTRE,
                            OCORRENCIA_CONTROLE, VALOR_SALDO, DATA_REGISTRO, TIPO, SERIE, CODORIGEM, CONTA_DEBITO,
                            CONTA_CREDITO, NFE_CONTROLE, NFS_CONTROLE, VALOR_TOTAL, ARQUIVO, CCUSTO, LANCAMENTO_CLASS_ID)
                        VALUES (GEN_ID(GTBCAIXABANCO_REGISTRO, 1), :ESTABELECIMENTO_ID, 0, :DATA_EMISSAO,
                            :CLIENTE_ID, 0, :PARCELAMENTO_ID, :CONTA_RECEBER_BANCO,
                            :CONTA_RECEBER_OPERACAO, :NUMERO_CFE, :COUNT_PARCELA, :VALOR_TEMP, 0, 0, 0, 0, 0, 0,
                            '1', NULL, :VALOR_SALDO, CURRENT_TIMESTAMP, :NATUREZA, :SERIE_CFE,
                            'CF1', '', '', 0, 0, :VALOR_TEMP, NULL, '', 0);

                        IF(:CHEQUE_ID > 0) THEN
                        BEGIN

                            FOR SELECT
                                K.ID,
                                K.VALOR
                            FROM TBCHEQUE K
                            WHERE K.CHEQUE_PDV_ID = :CHEQUE_ID
                            AND K.PDV_ID = :PDV_ID
                            AND IIF(:OFFLINE_ID > 0, K.FLAG_ONLINE = 0, K.FLAG_ONLINE = 1)
                            INTO :CHEQUE_ID_ONLINE, :VALOR_CHEQUE_TEMP
                            DO BEGIN
                                :CHEQUE_ITEM_ID = GEN_ID(GTBCHEQUE_ITEM, 1);

                                INSERT INTO TBCHEQUE_ITEM (ID, CHEQUE_ID, EMPRESA_ID, TIPO_DOCUMENTO, DOCUMENTO_ID, VALOR, PDV_CFE_ID)
                                VALUES (:CHEQUE_ITEM_ID, :CHEQUE_ID_ONLINE, :CLIENTE_ID, '2', :PARCELAMENTO_ID, :VALOR_CHEQUE_TEMP, :PDV_CFE_ID);
                            END


                        END
    
                        IF(:PERMITE_GERAR_BAIXA = '1' AND :CONTA_RECEBER_BAIXA_ID > 0) THEN
                        BEGIN
                            CAIXABANCO_LANC_INCLUIDO = 0;

                            FOR
                            SELECT
                              FIRST 1
                                 A.CODIGO AS CAIXABANCO_ID,
                                 A.CONTA_CONTABIL,

                                 COALESCE((SELECT FIRST 1 B.CONTROLE FROM TBCAIXABANCO_LANCAMENTO B WHERE B.BAIXA_CUPOM = '1'
                                           AND B.DATA_LANCAMENTO = :DATA_EMISSAO AND B.CAIXABANCO_CODIGO = A.CODIGO),0) AS CAIXABANCO_CONTROLE,

                                 COALESCE((SELECT FIRST 1 B.MOVCONTMESTRE_ID FROM TBCAIXABANCO_LANCAMENTO B WHERE B.BAIXA_CUPOM = '1'
                                           AND B.DATA_LANCAMENTO = :DATA_EMISSAO AND B.CAIXABANCO_CODIGO = A.CODIGO),0) AS CONTABILIZACAO_MESTRE_ID,

                                 COALESCE((SELECT FIRST 1 B.MOVCONTABIL_ID FROM TBCAIXABANCO_LANCAMENTO B WHERE B.BAIXA_CUPOM = '1'
                                           AND B.DATA_LANCAMENTO = :DATA_EMISSAO AND B.CAIXABANCO_CODIGO = A.CODIGO),0) AS CONTABILIZACAO_BANCO_ID,

                                 COALESCE((SELECT FIRST 1 DD.CODIGO FROM TBCONTA_RECEBER_OPERACAO C, TBCENTRO_DE_CUSTO DD
                                               WHERE C.CODIGO = :CONTA_RECEBER_BAIXA_ID AND DD.CODIGO = C.CCUSTO
                                               AND CHAR_LENGTH(TRIM(COALESCE(C.CLASSIFICACAO_FINANCEIRA,''))) > 3), '') AS CONTA_RECEBER_BAIXA_CC,
                                 COALESCE((SELECT FIRST 1 DE.CODIGO FROM TBCONTA_RECEBER_OPERACAO C, TBCLASSIFICACAO_CONTABIL DE
                                               WHERE C.CODIGO = :CONTA_RECEBER_BAIXA_ID AND DE.CODIGO = C.CLASSIFICACAO_FINANCEIRA
                                               AND CHAR_LENGTH(TRIM(COALESCE(C.CLASSIFICACAO_FINANCEIRA,''))) > 3), '') AS CONTA_RECEBER_BAIXA_CLASS,
                                 COALESCE((SELECT FIRST 1 C.HISTORICO_CONTABIL FROM TBCONTA_RECEBER_OPERACAO C, TBCLASSIFICACAO_CONTABIL DE
                                               WHERE C.CODIGO = :CONTA_RECEBER_BAIXA_ID AND DE.CODIGO = C.CLASSIFICACAO_FINANCEIRA
                                               AND CHAR_LENGTH(TRIM(COALESCE(C.CLASSIFICACAO_FINANCEIRA,''))) > 3), '') AS CONTA_RECEBER_BAIXA_HIST,
                                 COALESCE((SELECT FIRST 1 C.TIPO_CREDITO FROM TBCONTA_RECEBER_OPERACAO C, TBCLASSIFICACAO_CONTABIL DE
                                               WHERE C.CODIGO = :CONTA_RECEBER_BAIXA_ID AND DE.CODIGO = C.CLASSIFICACAO_FINANCEIRA
                                               AND CHAR_LENGTH(TRIM(COALESCE(C.CLASSIFICACAO_FINANCEIRA,''))) > 3), '') AS CONTA_RECEBER_BAIXA_TP_CONTA,
                                 COALESCE((SELECT FIRST 1 C.CONTA_CREDITO FROM TBCONTA_RECEBER_OPERACAO C, TBCLASSIFICACAO_CONTABIL DE
                                               WHERE C.CODIGO = :CONTA_RECEBER_BAIXA_ID AND DE.CODIGO = C.CLASSIFICACAO_FINANCEIRA
                                               AND CHAR_LENGTH(TRIM(COALESCE(C.CLASSIFICACAO_FINANCEIRA,''))) > 3), '') AS CONTA_RECEBER_BAIXA_CONTA,

                                 COALESCE((SELECT FIRST 1 N.CONTA_CONTABIL FROM TBEMPRESA N WHERE N.CODIGO = :CLIENTE_ID),'') AS CONTA_CONTABIL_EMPRESA1,
                                 COALESCE((SELECT FIRST 1 N.CONTA_CONTABIL2 FROM TBEMPRESA N WHERE N.CODIGO = :CLIENTE_ID),'') AS CONTA_CONTABIL_EMPRESA2

    

                             FROM TBCAIXABANCO A
                             WHERE A.CODIGO = (SELECT FIRST 1 X.CAIXABANCO_ID FROM TBPDV_CAIXA X WHERE X.ID = :CAIXA_ID)
                             INTO CAIXABANCO_ID, CAIXABANCO_CONTA, CAIXABANCO_CONTROLE, CONTABILIZACAO_MESTRE_ID, CONTABILIZACAO_BANCO_ID, CONTA_RECEBER_BAIXA_CC,
                                  CONTA_RECEBER_BAIXA_CLASS, CONTA_RECEBER_BAIXA_HIST, CONTA_RECEBER_BAIXA_TP_CONTA, CONTA_RECEBER_BAIXA_CONTA, CONTA_CONTABIL_EMPRESA1,
                                  CONTA_CONTABIL_EMPRESA2 DO
                                  BEGIN
                                     IF(:CAIXABANCO_ID IS NOT NULL AND :CONTA_RECEBER_BAIXA_CLASS <> '')THEN
                                     BEGIN
                                         IF(:CONTA_RECEBER_BAIXA_CONTA = '0' AND :CONTA_RECEBER_BAIXA_TP_CONTA = 'A')THEN
                                         BEGIN
                                            IF(CHAR_LENGTH(TRIM(:CONTA_CONTABIL_EMPRESA1)) > 3)THEN
                                            BEGIN
                                              :CONTA_RECEBER_BAIXA_CONTA = :CONTA_CONTABIL_EMPRESA1;
                                            END
                                         END
                                         IF(:CONTA_RECEBER_BAIXA_CONTA = '0' AND :CONTA_RECEBER_BAIXA_TP_CONTA = 'P')THEN
                                         BEGIN
                                            IF(CHAR_LENGTH(TRIM(:CONTA_CONTABIL_EMPRESA2)) > 3)THEN
                                            BEGIN
                                              :CONTA_RECEBER_BAIXA_CONTA = :CONTA_CONTABIL_EMPRESA2;
                                            END
                                         END

                                         IF(:CAIXABANCO_CONTROLE = 0)THEN
                                         BEGIN
                                            /* GERAR LAN??AMENTO DE BAIXA GERADO NO CAIXA/BANCO SE NAO EXISTIR*/
                                             :CAIXABANCO_LANC_INCLUIDO = 1;
                                             :CAIXABANCO_CONTROLE = GEN_ID(GTBCAIXABANCO_LANCAMENTO,1);
                                             
                                             IF(FN_PARAMETRO('SISTEMA.INTEGRACAO_CONTABIL') = '1' AND :CONTABILIZACAO_MESTRE_ID = 0
                                                AND CHAR_LENGTH(TRIM(:CAIXABANCO_CONTA)) > 3 AND CHAR_LENGTH(TRIM(:CONTA_RECEBER_BAIXA_CONTA)) > 3)THEN
                                                BEGIN
                                                    CONTABILIZACAO_MESTRE_ID = GEN_ID(GTBMOVCONTMESTRE,1);
                                                    CONTABILIZACAO_BANCO_ID  = GEN_ID(TBMOVCONT_ID_GEN,1);
    
                                                    INSERT INTO TBMOVCONTMESTRE(ID, CODESTABELECIMENTO, DATA)
                                                         VALUES (:CONTABILIZACAO_MESTRE_ID, :ESTABELECIMENTO_ID, :DATA_EMISSAO);
    
                                                    INSERT INTO TBMOVCONTABIL(ID, CODESTABELECIMENTO, IDCONTMOV, NATUREZA, CONTA,
                                                            DATA, IDDOCUMENTO, DESCRICAO, CODORIGEM, VALOR,    IDHISTORICO, HISTORICO)
                                                        VALUES (:CONTABILIZACAO_BANCO_ID, :ESTABELECIMENTO_ID, :CONTABILIZACAO_MESTRE_ID, 'D', :CAIXABANCO_CONTA, :DATA_EMISSAO,
                                                            :CAIXABANCO_CONTROLE, FN_LPAD(:NUMERO_CFE,7,0), 'RDP', :VALOR_TEMP, 0, ' VENDAS CF-E CAIXA:'|| :CAIXA_ID);
                                                END
                
                                                INSERT INTO TBCAIXABANCO_LANCAMENTO (ESTABELECIMENTO_CODIGO, CAIXABANCO_CODIGO, DATA_LANCAMENTO,
                                                    NUMERO_CHEQUE, CONTA_CONTABIL, HISTORICO, VALOR_TOTAL, OBSERVACAO, CONTROLE, TIPO, NATUREZA,
                                                    USUARIO_CODIGO, DATA, MOVCONTABIL_ID, MOVCONTMESTRE_ID, DATA_COMPETENCIA,BAIXA_CUPOM)
                                                   VALUES (:ESTABELECIMENTO_ID, :CAIXABANCO_ID, :DATA_EMISSAO, :NUMERO_CFE, :CAIXABANCO_CONTA,
                                                    ' VENDAS CF-E CAIXA:'|| :CAIXA_ID, :VALOR_TEMP, '', :CAIXABANCO_CONTROLE, 'R', 'D', FN_CURRENT_USER_ID(),
                                                    CURRENT_DATE, :CONTABILIZACAO_BANCO_ID, :CONTABILIZACAO_MESTRE_ID, :DATA_EMISSAO, '1');
                                         END
    
                                        /* GERAR REGISTRO DE BAIXA E SUA CLASSIFICACAO NO LANCAMENTO DO CAIXA/BANCO */
                                         CONTA_RECEBER_REG_CONTROLE = GEN_ID(GTBCAIXABANCO_REGISTRO, 1);
                                         CONTABILIZACAO_REG_ID      = 0;

                                         IF(FN_PARAMETRO('SISTEMA.INTEGRACAO_CONTABIL') = '1' AND :CONTABILIZACAO_MESTRE_ID > 0
                                            AND CHAR_LENGTH(TRIM(:CAIXABANCO_CONTA)) > 3 AND CHAR_LENGTH(TRIM(:CONTA_RECEBER_BAIXA_CONTA)) > 3)THEN
                                            BEGIN
                                               CONTABILIZACAO_REG_ID = GEN_ID(TBMOVCONT_ID_GEN,1);

                                               INSERT INTO TBMOVCONTABIL(ID, CODESTABELECIMENTO, IDCONTMOV, NATUREZA, CONTA,
                                                    DATA, IDDOCUMENTO, DESCRICAO, CODORIGEM, VALOR, IDHISTORICO, HISTORICO)
                                                VALUES (:CONTABILIZACAO_REG_ID, :ESTABELECIMENTO_ID, :CONTABILIZACAO_MESTRE_ID,
                                                    'C', :CONTA_RECEBER_BAIXA_CONTA, :DATA_EMISSAO, :CAIXABANCO_CONTROLE,
                                                    FN_LPAD(:NUMERO_CFE,7,0), 'RDP', :VALOR_TEMP, 0,
                                                    :CONTA_RECEBER_BAIXA_HIST||' CF. '||FN_LPAD(:NUMERO_CFE,6,0));
                                            END

                                             INSERT INTO TBCAIXABANCO_LANCAMENTO_REG (CONTROLE, ESTABELECIMENTO_CODIGO, CAIXABANCO_CONTROLE,
                                                    DATA, EMPRESA_CODIGO, NFE_PARCELAMENTO_CONTROLE, NFS_PARCELAMENTO_CONTROLE, CAIXABANCO_CODIGO,
                                                    OPERACAO_CODIGO, DOCUMENTO_NUMERO, PARCELA, VALOR, VALOR_DESCONTO, VALOR_JUROS, VALOR_MULTA,
                                                    VALOR_DESPESA_DIVERSA, VALOR_DESPESA_COBRANCA, VALOR_DESPESA_CARTORIO, REGISTRO_MESTRE,
                                                    OCORRENCIA_CONTROLE, VALOR_SALDO, DATA_REGISTRO, TIPO, SERIE, CODORIGEM, CONTA_DEBITO,
                                                    CONTA_CREDITO, NFE_CONTROLE, NFS_CONTROLE, VALOR_TOTAL, ARQUIVO, CCUSTO, LANCAMENTO_CLASS_ID,
                                                    HISTORICO, MOVCONTABIL_ID, MOVCONTMESTRE_ID)
                                                 VALUES (:CONTA_RECEBER_REG_CONTROLE, :ESTABELECIMENTO_ID, :CAIXABANCO_CONTROLE, :DATA_EMISSAO,
                                                    :CLIENTE_ID, 0, :PARCELAMENTO_ID, :CONTA_RECEBER_BANCO, :CONTA_RECEBER_BAIXA_ID, :NUMERO_CFE,
                                                    :COUNT_PARCELA, :VALOR_TEMP, 0, 0, 0, 0, 0, 0, '1', NULL, :VALOR_TEMP, CURRENT_TIMESTAMP, 'C',
                                                    :SERIE_CFE, 'RDP', :CAIXABANCO_CONTA, :CONTA_RECEBER_BAIXA_CONTA, 0, 0, :VALOR_TEMP, NULL, '', 0,
                                                    :CONTA_RECEBER_BAIXA_HIST||' CF. '||FN_LPAD(:NUMERO_CFE,6,0), :CONTABILIZACAO_REG_ID, :CONTABILIZACAO_MESTRE_ID);
        
                                             INSERT INTO TBCAIXABANCO_LANCAMENTO_CLASS (ESTABELECIMENTO_CODIGO, CONTROLE, CAIXABANCO_CONTROLE,
                                                    CONTA_PAGAR_CONTROLE, CONTA_RECEBER_CONTROLE, CLASSIFICACAO_CONTABIL, CCUSTO,
                                                    HISTORICO_CONTABIL, CONTA_CONTABIL, TIPO, DATA, VALOR)
                                                VALUES (:ESTABELECIMENTO_ID, GEN_ID(GTBCAIXABANCO_LANCAMENTO, 1), :CAIXABANCO_CONTROLE, 0,
                                                    :CONTA_RECEBER_REG_CONTROLE, :CONTA_RECEBER_BAIXA_CLASS, :CONTA_RECEBER_BAIXA_CC, :CONTA_RECEBER_BAIXA_HIST||' CF. '||FN_LPAD(:NUMERO_CFE,6,0),
                                                    '', 'C', :DATA_EMISSAO, :VALOR_TEMP);
            
                                            EXECUTE PROCEDURE SPU_CONTA_RECEBER_SALDO2(0, :PARCELAMENTO_ID);
                
                                            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 = 0
                                                AND A.CONTROLE = :PARCELAMENTO_ID;
    
                                        /* ATUALIZAR VALOR DO LAN??AMENTO DE BAIXA GERADO NO CAIXA/BANCO SE JA EXISTIR*/
                                        IF(:CAIXABANCO_LANC_INCLUIDO = 0) THEN
                                        BEGIN

                                           UPDATE TBCAIXABANCO_LANCAMENTO
                                             SET VALOR_TOTAL = COALESCE((SELECT SUM(F.VALOR_TOTAL) FROM TBCAIXABANCO_LANCAMENTO_REG F WHERE F.CAIXABANCO_CONTROLE = :CAIXABANCO_CONTROLE AND F.TIPO = 'C'),0)
                                             WHERE CONTROLE = :CAIXABANCO_CONTROLE
                                             AND BAIXA_CUPOM = '1'
                                             AND DATA_LANCAMENTO = :DATA_EMISSAO;

                                            IF(:CONTABILIZACAO_BANCO_ID > 0)THEN
                                            BEGIN
                                               UPDATE TBMOVCONTABIL
                                                 SET VALOR = COALESCE((SELECT SUM(F.VALOR_TOTAL) FROM TBCAIXABANCO_LANCAMENTO_REG F WHERE F.CAIXABANCO_CONTROLE = :CAIXABANCO_CONTROLE AND F.TIPO = 'C'),0)
                                                 WHERE ID = :CONTABILIZACAO_BANCO_ID;
                                            END

                                        END
                                     END
                                 END
                        END
    
                        :PARCELA_X      = :PARCELA_X + 1;
                        :COUNT_PARCELA  = :COUNT_PARCELA + 1;

                        IF(:PARCELAS > :SEQUENCIA) THEN
                        BEGIN
                            :SEQUENCIA = :SEQUENCIA + 1;

                        END ELSE
                        BEGIN
                           :SEQUENCIA = 1;

                        END

                     END
            END
     END
     /* DELETAR PARCELAS DO CAIXA BANCO */

     ELSE IF(:ACAO = 2) THEN
     BEGIN

         FOR
            SELECT
                T.CONTROLE,
                COALESCE(CFP.CHEQUE_ID, 0),
                U.PDV_ID
            FROM TBNFS_PARCELAMENTO T, TBPDV_CFE_FORMA_PAGAMENTO CFP, TBPDV_CFE U
            WHERE T.PDV_CFE_FORMA_PAGAMENTO_ID = CFP.ID
            AND U.ID = CFP.PDV_CFE_ID
            AND (:PDV_CFE_FORMA_PAGAMENTO_ID = 0 OR CFP.ID = :PDV_CFE_FORMA_PAGAMENTO_ID)
            AND CFP.PDV_CFE_ID = :PDV_CFE_ID
          INTO
             :PARCELAMENTO_ID, :CHEQUE_ID, :PDV_ID
          DO BEGIN


            DELETE FROM TBCHEQUE T WHERE T.CHEQUE_PDV_ID = :CHEQUE_ID AND T.PDV_ID = :PDV_ID;
            DELETE FROM TBCAIXABANCO_LANCAMENTO_REG S WHERE S.NFS_PARCELAMENTO_CONTROLE = :PARCELAMENTO_ID AND S.TIPO = 'C';
            DELETE FROM TBCAIXABANCO_LANCAMENTO_REG S WHERE S.NFS_PARCELAMENTO_CONTROLE = :PARCELAMENTO_ID AND S.TIPO = 'D';
            DELETE FROM TBCAIXABANCO_LANCAMENTO_REG S WHERE S.NFS_PARCELAMENTO_CONTROLE = :PARCELAMENTO_ID AND S.TIPO NOT IN ('C', 'D');
            DELETE FROM TBNFS_PARCELAMENTO T WHERE T.CONTROLE = :PARCELAMENTO_ID;
          END 
          /* ATUALIZAR LAN??AMENTO DE BAIXA GERADO NO CAIXA/BANCO */
          FOR
          SELECT
             FIRST 1
             COALESCE((SELECT FIRST 1 B.CONTROLE FROM TBCAIXABANCO_LANCAMENTO B
                        WHERE B.BAIXA_CUPOM = '1' AND B.DATA_LANCAMENTO = :DATA_EMISSAO AND B.CAIXABANCO_CODIGO = A.CODIGO
                        AND COALESCE((SELECT SUM(C.VALOR) FROM TBCAIXABANCO_LANCAMENTO_REG C WHERE C.CAIXABANCO_CONTROLE = B.CONTROLE AND C.TIPO = 'C'),0) > 0),0) AS CAIXABANCO_CONTROLE,
                        
             COALESCE((SELECT FIRST 1 B.MOVCONTABIL_ID FROM TBCAIXABANCO_LANCAMENTO B
                        WHERE B.BAIXA_CUPOM = '1' AND B.DATA_LANCAMENTO = :DATA_EMISSAO AND B.CAIXABANCO_CODIGO = A.CODIGO
                        AND COALESCE((SELECT SUM(C.VALOR) FROM TBCAIXABANCO_LANCAMENTO_REG C WHERE C.CAIXABANCO_CONTROLE = B.CONTROLE AND C.TIPO = 'C'),0) > 0),0) AS CONTABILIZACAO_BANCO_ID
             FROM TBCAIXABANCO A
             WHERE A.CODIGO = (SELECT FIRST 1 X.CAIXABANCO_ID FROM TBPDV_CAIXA X WHERE X.ID = :CAIXA_ID)
             INTO CAIXABANCO_CONTROLE, CONTABILIZACAO_BANCO_ID DO
             BEGIN
               IF(:CAIXABANCO_CONTROLE > 0) THEN
               BEGIN
                    UPDATE TBCAIXABANCO_LANCAMENTO
                     SET VALOR_TOTAL = COALESCE((SELECT SUM(F.VALOR_TOTAL) FROM TBCAIXABANCO_LANCAMENTO_REG F WHERE F.CAIXABANCO_CONTROLE = :CAIXABANCO_CONTROLE AND F.TIPO = 'C'),0)
                     WHERE CONTROLE = :CAIXABANCO_CONTROLE
                     AND BAIXA_CUPOM = '1'
                     AND DATA_LANCAMENTO = :DATA_EMISSAO;

                    IF(:CONTABILIZACAO_BANCO_ID > 0)THEN
                    BEGIN
                       UPDATE TBMOVCONTABIL
                         SET VALOR = COALESCE((SELECT SUM(F.VALOR_TOTAL) FROM TBCAIXABANCO_LANCAMENTO_REG F WHERE F.CAIXABANCO_CONTROLE = :CAIXABANCO_CONTROLE AND F.TIPO = 'C'),0)
                         WHERE ID = :CONTABILIZACAO_BANCO_ID;
                    END
               END
             END
          /* EXCLUIR LAN??AMENTO DE BAIXA GERADO NO CAIXA/BANCO */
          FOR
          SELECT
             FIRST 1
             COALESCE((SELECT FIRST 1 B.CONTROLE FROM TBCAIXABANCO_LANCAMENTO B
                        WHERE B.BAIXA_CUPOM = '1' AND B.DATA_LANCAMENTO = :DATA_EMISSAO AND B.CAIXABANCO_CODIGO = A.CODIGO
                        AND COALESCE((SELECT SUM(C.VALOR) FROM TBCAIXABANCO_LANCAMENTO_REG C WHERE C.CAIXABANCO_CONTROLE = B.CONTROLE AND C.TIPO = 'C'),0) = 0),0) AS CAIXABANCO_CONTROLE
             FROM TBCAIXABANCO A
             WHERE A.CODIGO = (SELECT FIRST 1 X.CAIXABANCO_ID FROM TBPDV_CAIXA X WHERE X.ID = :CAIXA_ID)
             INTO CAIXABANCO_CONTROLE DO
             BEGIN
               IF(:CAIXABANCO_CONTROLE > 0) THEN
               BEGIN
                   DELETE FROM TBCAIXABANCO_LANCAMENTO WHERE BAIXA_CUPOM = '1' AND CONTROLE = :CAIXABANCO_CONTROLE;
               END
             END
     END
END^

CREATE OR ALTER PROCEDURE SP_CFE_PARCELAMENTO2 (
    PDV_CFE_ID INTEGER,
    ESTABELECIMENTO_ID INTEGER,
    REPRESENTANTE_ID INTEGER,
    REPRESENTANTE_COMISSAO NUMERIC(15,2),
    VENDEDOR_ID INTEGER,
    VENDEDOR_COMISSAO NUMERIC(15,2),
    CLIENTE_ID INTEGER,
    CAIXA_ID INTEGER,
    NUMERO_CFE INTEGER,
    SERIE_CFE VARCHAR(3),
    DATA_EMISSAO DATE,
    ACAO INTEGER,
    PDV_CFE_FORMA_PAGAMENTO_ID INTEGER = 0)
AS
DECLARE VARIABLE PARCELAMENTO_ID INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE PAGAMENTO_FORMA_ID INTEGER;
DECLARE VARIABLE VALOR_TEMP NUMERIC(15,2);
DECLARE VARIABLE VALOR_SALDO NUMERIC(15,2);
DECLARE VARIABLE VALOR_TOTAL NUMERIC(15,2);
DECLARE VARIABLE TROCO NUMERIC(15,2);
DECLARE VARIABLE VALOR_LIQUIDO NUMERIC(15,2);
DECLARE VARIABLE VALOR_REAL NUMERIC(15,2);
DECLARE VARIABLE VALOR_CHEQUE_TEMP NUMERIC(15,2);
DECLARE VARIABLE PARCELA_X INTEGER;
DECLARE VARIABLE PARCELAS INTEGER;
DECLARE VARIABLE ID_PAGAMENTO INTEGER;
DECLARE VARIABLE TIPO_PAG CHAR(2);
DECLARE VARIABLE CONTA_RECEBER_BANCO INTEGER;
DECLARE VARIABLE CONTA_RECEBER_MODALIDADE INTEGER;
DECLARE VARIABLE CONTA_RECEBER_POSICAO INTEGER;
DECLARE VARIABLE CONTA_RECEBER_COBRANCA INTEGER;
DECLARE VARIABLE CONTA_RECEBER_OPERACAO INTEGER;
DECLARE VARIABLE NATUREZA CHAR(1);
DECLARE VARIABLE OBSERVACAO VARCHAR(100);
DECLARE VARIABLE FORMA_COMISSAO CHAR(1);
DECLARE VARIABLE COUNT_PARCELA INTEGER;
DECLARE VARIABLE SEQUENCIA INTEGER;
DECLARE VARIABLE CODIGO_AUTORIZACAO VARCHAR(50);
DECLARE VARIABLE NSU VARCHAR(50);
DECLARE VARIABLE PERMITE_GERAR_BAIXA VARCHAR(1);
DECLARE VARIABLE CAIXABANCO_CONTROLE INTEGER;
DECLARE VARIABLE CONTA_RECEBER_BAIXA_ID INTEGER;
DECLARE VARIABLE CAIXABANCO_CONTA VARCHAR(12);
DECLARE VARIABLE CAIXABANCO_LANC_INCLUIDO INTEGER;
DECLARE VARIABLE CONTA_RECEBER_BAIXA_CC VARCHAR(10);
DECLARE VARIABLE CAIXABANCO_ID INTEGER;
DECLARE VARIABLE CONTA_RECEBER_BAIXA_CLASS VARCHAR(10);
DECLARE VARIABLE CONTA_RECEBER_BAIXA_HIST VARCHAR(100);
DECLARE VARIABLE CONTA_RECEBER_BAIXA_TP_CONTA VARCHAR(11);
DECLARE VARIABLE CONTA_RECEBER_BAIXA_CONTA VARCHAR(11);
DECLARE VARIABLE CONTA_CONTABIL_EMPRESA1 VARCHAR(11);
DECLARE VARIABLE CONTA_CONTABIL_EMPRESA2 VARCHAR(11);
DECLARE VARIABLE LIST_PRAZO VARCHAR(500);
DECLARE VARIABLE LIST_QUOTA VARCHAR(500);
DECLARE VARIABLE CONTA_RECEBER_REG_CONTROLE INTEGER;
DECLARE VARIABLE CONTABILIZACAO_BANCO_ID INTEGER;
DECLARE VARIABLE CONTABILIZACAO_MESTRE_ID INTEGER;
DECLARE VARIABLE CONTABILIZACAO_REG_ID INTEGER;
DECLARE VARIABLE DATA_CREDITO DATE;
DECLARE VARIABLE PDV_TIPO INTEGER;
DECLARE VARIABLE QTD_PARCELAS INTEGER;
DECLARE VARIABLE DIA_CREDITO INTEGER;
DECLARE VARIABLE PARCELAS_SEM_SALDO INTEGER;
DECLARE VARIABLE OBSERVACAO_BRINDE VARCHAR(100);
DECLARE VARIABLE CHEQUE_ID INTEGER;
DECLARE VARIABLE CHEQUE_ITEM_ID INTEGER;
DECLARE VARIABLE COLABORADOR_ID INTEGER;
DECLARE VARIABLE DIA_EMISSAO INTEGER;
DECLARE VARIABLE MES_ADICIONAR INTEGER;
DECLARE VARIABLE PDV_ID INTEGER;
DECLARE VARIABLE OFFLINE_ID INTEGER;
DECLARE VARIABLE CHEQUE_ID_ONLINE INTEGER;
DECLARE VARIABLE CHECK_ITEM INTEGER;
DECLARE VARIABLE CONDICAO_PAGAMENTO_ID INTEGER;
BEGIN

    /* REGISTRAR PARCELAS NO CAIXA BANCO */
    IF(:ACAO = 1) THEN
    BEGIN
        :CHECK_ITEM = 0;
        :COUNT_PARCELA = 1;

        IF(COALESCE(:CLIENTE_ID, 0) = 0) THEN :CLIENTE_ID = FN_PARAMETRO('SISTEMA.CLIENTE_QUIOSQUE');

        SELECT T.FORMA_COMISSAO FROM TBREPRESENTANTE T WHERE T.CODIGO = :REPRESENTANTE_ID INTO :FORMA_COMISSAO;

        IF(COALESCE(:FORMA_COMISSAO, '') = '') THEN
        BEGIN
            :FORMA_COMISSAO = 'F';
        END

        FOR SELECT
                T.ID,
                T.PAGAMENTO_FORMA_ID,
                T.VALOR,
                T.TROCO,
                T.VALOR_LIQUIDO,
                T.PARCELAS,
                T.PAGAMENTO_ID AS ID_PAGAMENTO,
                PF.NFE_TIPPAG AS TIPO_PAG,
                PF.BANCO_ID,
                PF.MODALIDADE_ID,
                PF.POSICAO_ID,
                PF.COBRANCA_ID,
                PF.OPERACAO_ID,
                OP.TIPO,
                T.CODIGO_AUTORIZACAO,
                T.NSU,
                IIF(PF.CONTA_RECEBER_BAIXA_ID > 0, '1', '0') AS PERMITE_GERAR_BAIXA,
                COALESCE((SELECT FIRST 1 C.CODIGO FROM TBCONTA_RECEBER_OPERACAO C WHERE C.CODIGO = PF.CONTA_RECEBER_BAIXA_ID
                          AND CHAR_LENGTH(TRIM(COALESCE(C.CLASSIFICACAO_FINANCEIRA,''))) > 3), 0) AS CONTA_RECEBER_BAIXA_ID,
                COALESCE(PF.PDV_TIPO, 0) AS PDV_TIPO,
                COALESCE(PF.QTD_PARCELAS, 1) AS QTD_PARCELAS,
                COALESCE(PF.DIA_CREDITO, 1) AS DIA_CREDITO,
                COALESCE(PF.PARCELAS_SEM_SALDO, 0) AS PARCELAS_SEM_SALDO,
                COALESCE(C.OBSERVACAO_BRINDE, '') AS OBSERVACAO_BRINDE,
                COALESCE(T.CHEQUE_ID, 0) AS CHEQUE_ID,
                COALESCE(C.COLABORADOR_ID, 0) AS COLABORADOR_ID,
                COALESCE(C.PDV_ID, 0) AS PDV_ID ,
                COALESCE(C.OFFLINE_ID, 0) AS OFFLINE_ID,
                T.CONDICAO_PAGAMENTO_ID
            FROM TBPDV_CFE_FORMA_PAGAMENTO T
            INNER JOIN TBPDV_CFE C ON C.ID = T.PDV_CFE_ID
            INNER JOIN TBPAGAMENTO_FORMA PF ON PF.CODIGO = T.PAGAMENTO_FORMA_ID
            INNER JOIN TBCONTA_RECEBER_OPERACAO OP ON OP.CODIGO = PF.OPERACAO_ID
            WHERE T.PDV_CFE_ID = :PDV_CFE_ID
            AND (:PDV_CFE_FORMA_PAGAMENTO_ID = 0 OR T.ID = :PDV_CFE_FORMA_PAGAMENTO_ID)
            INTO
            :ID, :PAGAMENTO_FORMA_ID, :VALOR_TOTAL,
            :TROCO, :VALOR_LIQUIDO, :PARCELAS,
            :ID_PAGAMENTO, :TIPO_PAG, :CONTA_RECEBER_BANCO,
            :CONTA_RECEBER_MODALIDADE, :CONTA_RECEBER_POSICAO, :CONTA_RECEBER_COBRANCA,
            :CONTA_RECEBER_OPERACAO, :NATUREZA, :CODIGO_AUTORIZACAO, :NSU, :PERMITE_GERAR_BAIXA, :CONTA_RECEBER_BAIXA_ID,
            :PDV_TIPO, :QTD_PARCELAS, :DIA_CREDITO, :PARCELAS_SEM_SALDO, :OBSERVACAO_BRINDE, :CHEQUE_ID, :COLABORADOR_ID, :PDV_ID, :OFFLINE_ID,
            :CONDICAO_PAGAMENTO_ID
            DO BEGIN
                   :PARCELA_X = 1;

                   :VALOR_REAL = ROUND(:VALOR_LIQUIDO - :TROCO, 2);

                   :VALOR_TEMP = ROUND(:VALOR_REAL / :PARCELAS, 2);
    
                   :SEQUENCIA = 1;
                   
                   :DIA_EMISSAO    = EXTRACT(DAY FROM :DATA_EMISSAO);

                   :MES_ADICIONAR  = COALESCE((SELECT FIRST 1 K.MES_ADICIONAR FROM TBPAGAMENTO_FORMA_VENC_COLAB K WHERE K.PAGAMENTO_FORMA_ID = :PAGAMENTO_FORMA_ID AND :DIA_EMISSAO BETWEEN K.DIA_INICIAL AND K.DIA_FINAL), 1);

                   IF(:CONDICAO_PAGAMENTO_ID > 0) THEN
                   BEGIN
                        :PARCELAS = COALESCE((SELECT COUNT(K.PRAZO) FROM TBPAGAMENTO_CONDICAO_PRAZO K WHERE K.CONDICAOPAGAMENTO_CODIGO = :CONDICAO_PAGAMENTO_ID), 1);

                        :LIST_PRAZO = COALESCE((SELECT LIST(P.PRAZO, '|') FROM TBPAGAMENTO_CONDICAO_PRAZO P WHERE P.CONDICAOPAGAMENTO_CODIGO = :CONDICAO_PAGAMENTO_ID),'');

                        :LIST_QUOTA = COALESCE((SELECT LIST(P.QUOTA, '|') FROM TBPAGAMENTO_CONDICAO_PRAZO P WHERE P.CONDICAOPAGAMENTO_CODIGO = :CONDICAO_PAGAMENTO_ID),'');
                   END

                   WHILE (:PARCELA_X <= :PARCELAS) DO
                    BEGIN

                        IF(:CONDICAO_PAGAMENTO_ID > 0) THEN
                        BEGIN
                            :VALOR_TEMP = FN_CALC_PRECISION_V2(FN_CALC_PRECISION_V2(CAST(FN_ARRAY(:LIST_QUOTA, :PARCELA_X, '|') AS NUMERIC(15,2)), 100, '/', 2), :VALOR_REAL, '*', 2);
                        END

                        IF(:PARCELA_X = :PARCELAS) THEN
                        BEGIN
                            :VALOR_TEMP = :VALOR_REAL - (:VALOR_TEMP * (:PARCELAS - 1));
                        END
            
                        IF(:PARCELAS = 1) THEN
                        BEGIN
                            :VALOR_TEMP = :VALOR_REAL;
                        END
    
                        :PARCELAMENTO_ID = GEN_ID(GTBNFS_PARCELAMENTO, 1);

                        :OBSERVACAO = 'CUPOM: ' || :NUMERO_CFE ||'-'|| LPAD(:SERIE_CFE,2,'0')||' CAIXA:'|| :CAIXA_ID;

                        IF(:PDV_TIPO = 7 AND :OBSERVACAO_BRINDE <> '') THEN
                        BEGIN
                            :OBSERVACAO = :OBSERVACAO_BRINDE;
                        END


    
                        /* INSERT REGISTRO TBNFS_PARCELAMENTO */
                        IF(:PDV_TIPO = 6) THEN
                        BEGIN
                            :DATA_CREDITO   = CAST(:DIA_CREDITO||'.'||EXTRACT(MONTH FROM :DATA_EMISSAO)||'.'||EXTRACT(YEAR FROM :DATA_EMISSAO) AS DATE);
                            :DATA_CREDITO   = DATEADD(MONTH, :MES_ADICIONAR, :DATA_CREDITO);
                            
                            :MES_ADICIONAR      = :MES_ADICIONAR + 1;
                            
                            
                        END ELSE
                        BEGIN
                            :DATA_CREDITO = :DATA_EMISSAO;

                            IF((:TIPO_PAG = '03' OR :TIPO_PAG = '15') AND :CONDICAO_PAGAMENTO_ID = 0) THEN
                            BEGIN
                                :DATA_CREDITO = DATEADD(MONTH, :PARCELA_X, :DATA_CREDITO);
                            END

                            IF(:CONDICAO_PAGAMENTO_ID > 0) THEN
                            BEGIN
                                :DATA_CREDITO = DATEADD(DAY, FN_ARRAY(:LIST_PRAZO, :PARCELA_X, '|'), :DATA_CREDITO);
                            END
                        END


                        :VALOR_SALDO = :VALOR_TEMP;
                        IF(:PARCELAS_SEM_SALDO = 1) THEN
                        BEGIN
                            :VALOR_SALDO = 0;
                        END

                        INSERT INTO TBNFS_PARCELAMENTO (CAIXA_ID, NFS_CONTROLE, PARCELA, VALOR, DATA_VENCIMENTO,
                            DATA_FLUXO, CONTA_RECEBER_OPERACAO, CONTA_RECEBER_BANCO, CONTA_RECEBER_MODALIDADE,
                            CONTA_RECEBER_POSICAO, CONTA_RECEBER_COBRANCA, ACEITE, ESTABELECIMENTO_CODIGO,
                            NUMERO_NOTAFISCAL, DATA_EMISSAO, EMPRESA_CODIGO, SITUACAO, CONTROLE, VALOR_DESCONTO,
                            VALOR_SALDO, REMESSA_ARQUIVO, REMESSA_DATA, REMESSA_NUMERO_BANCO, VIA_DUPLICATA, SERIE,
                            PAGAMENTO_FORMA, AVULSO, CLASSIFICACAO_CONTABIL, CCUSTO, CLASSIFICACAO, OBSERVACAO, FLAG,
                            SALESFORCE, NOTIFICADO_VENCIMENTO, REPRESENTANTE_COMISSAO, REPRESENTANTE_ID, VENDEDOR_ID,
                            VENDEDOR_COMISSAO, FORMA_COMISSAO, DATAHORA,TIPO, PDV_CFE_FORMA_PAGAMENTO_ID, SEQUENCIA, CODIGO_AUTORIZACAO, NSU, COLABORADOR_ID)
                        VALUES (:CAIXA_ID, 0, :COUNT_PARCELA, :VALOR_TEMP, :DATA_CREDITO, NULL,
                            :CONTA_RECEBER_OPERACAO, :CONTA_RECEBER_BANCO, :CONTA_RECEBER_MODALIDADE, :CONTA_RECEBER_POSICAO,
                            :CONTA_RECEBER_COBRANCA, 'S', :ESTABELECIMENTO_ID, :NUMERO_CFE, :DATA_EMISSAO, :CLIENTE_ID,
                            1, :PARCELAMENTO_ID, 0, :VALOR_SALDO, NULL, NULL, '', NULL, :SERIE_CFE, :PAGAMENTO_FORMA_ID,
                            '0', '', '', '', :OBSERVACAO, 0, '0', 0, :REPRESENTANTE_COMISSAO, :REPRESENTANTE_ID, :VENDEDOR_ID, :VENDEDOR_COMISSAO, :FORMA_COMISSAO, CURRENT_TIMESTAMP, 2, :ID, :SEQUENCIA, :CODIGO_AUTORIZACAO, :NSU, :COLABORADOR_ID);

                        /* INSERT REGISTRO CAIXABANCO */

                        INSERT INTO TBCAIXABANCO_LANCAMENTO_REG (CONTROLE, ESTABELECIMENTO_CODIGO, CAIXABANCO_CONTROLE,
                            DATA, EMPRESA_CODIGO, NFE_PARCELAMENTO_CONTROLE, NFS_PARCELAMENTO_CONTROLE, CAIXABANCO_CODIGO,
                            OPERACAO_CODIGO, DOCUMENTO_NUMERO, PARCELA, VALOR, VALOR_DESCONTO, VALOR_JUROS, VALOR_MULTA,
                            VALOR_DESPESA_DIVERSA, VALOR_DESPESA_COBRANCA, VALOR_DESPESA_CARTORIO, REGISTRO_MESTRE,
                            OCORRENCIA_CONTROLE, VALOR_SALDO, DATA_REGISTRO, TIPO, SERIE, CODORIGEM, CONTA_DEBITO,
                            CONTA_CREDITO, NFE_CONTROLE, NFS_CONTROLE, VALOR_TOTAL, ARQUIVO, CCUSTO, LANCAMENTO_CLASS_ID)
                        VALUES (GEN_ID(GTBCAIXABANCO_REGISTRO, 1), :ESTABELECIMENTO_ID, 0, :DATA_EMISSAO,
                            :CLIENTE_ID, 0, :PARCELAMENTO_ID, :CONTA_RECEBER_BANCO,
                            :CONTA_RECEBER_OPERACAO, :NUMERO_CFE, :COUNT_PARCELA, :VALOR_TEMP, 0, 0, 0, 0, 0, 0,
                            '1', NULL, :VALOR_SALDO, CURRENT_TIMESTAMP, :NATUREZA, :SERIE_CFE,
                            'CF1', '', '', 0, 0, :VALOR_TEMP, NULL, '', 0);

                        IF(:CHEQUE_ID > 0) THEN
                        BEGIN

                            FOR SELECT
                                K.ID,
                                K.VALOR
                            FROM TBCHEQUE K
                            WHERE K.CHEQUE_PDV_ID = :CHEQUE_ID
                            AND K.PDV_ID = :PDV_ID
                            AND IIF(:OFFLINE_ID = 1, K.FLAG_ONLINE = 0, K.FLAG_ONLINE = 1)
                            INTO :CHEQUE_ID_ONLINE, :VALOR_CHEQUE_TEMP
                            DO BEGIN
                                :CHEQUE_ITEM_ID = GEN_ID(GTBCHEQUE_ITEM, 1);

                                INSERT INTO TBCHEQUE_ITEM (ID, CHEQUE_ID, EMPRESA_ID, TIPO_DOCUMENTO, DOCUMENTO_ID, VALOR, PDV_CFE_ID)
                                VALUES (:CHEQUE_ITEM_ID, :CHEQUE_ID_ONLINE, :CLIENTE_ID, '2', :PARCELAMENTO_ID, :VALOR_CHEQUE_TEMP, :PDV_CFE_ID);
                            END


                        END
    
                        IF(:PERMITE_GERAR_BAIXA = '1' AND :CONTA_RECEBER_BAIXA_ID > 0) THEN
                        BEGIN
                            CAIXABANCO_LANC_INCLUIDO = 0;

                            FOR
                            SELECT
                              FIRST 1
                                 A.CODIGO AS CAIXABANCO_ID,
                                 A.CONTA_CONTABIL,

                                 COALESCE((SELECT FIRST 1 B.CONTROLE FROM TBCAIXABANCO_LANCAMENTO B WHERE B.BAIXA_CUPOM = '1'
                                           AND B.DATA_LANCAMENTO = :DATA_EMISSAO AND B.CAIXABANCO_CODIGO = A.CODIGO),0) AS CAIXABANCO_CONTROLE,

                                 COALESCE((SELECT FIRST 1 B.MOVCONTMESTRE_ID FROM TBCAIXABANCO_LANCAMENTO B WHERE B.BAIXA_CUPOM = '1'
                                           AND B.DATA_LANCAMENTO = :DATA_EMISSAO AND B.CAIXABANCO_CODIGO = A.CODIGO),0) AS CONTABILIZACAO_MESTRE_ID,

                                 COALESCE((SELECT FIRST 1 B.MOVCONTABIL_ID FROM TBCAIXABANCO_LANCAMENTO B WHERE B.BAIXA_CUPOM = '1'
                                           AND B.DATA_LANCAMENTO = :DATA_EMISSAO AND B.CAIXABANCO_CODIGO = A.CODIGO),0) AS CONTABILIZACAO_BANCO_ID,

                                 COALESCE((SELECT FIRST 1 DD.CODIGO FROM TBCONTA_RECEBER_OPERACAO C, TBCENTRO_DE_CUSTO DD
                                               WHERE C.CODIGO = :CONTA_RECEBER_BAIXA_ID AND DD.CODIGO = C.CCUSTO
                                               AND CHAR_LENGTH(TRIM(COALESCE(C.CLASSIFICACAO_FINANCEIRA,''))) > 3), '') AS CONTA_RECEBER_BAIXA_CC,
                                 COALESCE((SELECT FIRST 1 DE.CODIGO FROM TBCONTA_RECEBER_OPERACAO C, TBCLASSIFICACAO_CONTABIL DE
                                               WHERE C.CODIGO = :CONTA_RECEBER_BAIXA_ID AND DE.CODIGO = C.CLASSIFICACAO_FINANCEIRA
                                               AND CHAR_LENGTH(TRIM(COALESCE(C.CLASSIFICACAO_FINANCEIRA,''))) > 3), '') AS CONTA_RECEBER_BAIXA_CLASS,
                                 COALESCE((SELECT FIRST 1 C.HISTORICO_CONTABIL FROM TBCONTA_RECEBER_OPERACAO C, TBCLASSIFICACAO_CONTABIL DE
                                               WHERE C.CODIGO = :CONTA_RECEBER_BAIXA_ID AND DE.CODIGO = C.CLASSIFICACAO_FINANCEIRA
                                               AND CHAR_LENGTH(TRIM(COALESCE(C.CLASSIFICACAO_FINANCEIRA,''))) > 3), '') AS CONTA_RECEBER_BAIXA_HIST,
                                 COALESCE((SELECT FIRST 1 C.TIPO_CREDITO FROM TBCONTA_RECEBER_OPERACAO C, TBCLASSIFICACAO_CONTABIL DE
                                               WHERE C.CODIGO = :CONTA_RECEBER_BAIXA_ID AND DE.CODIGO = C.CLASSIFICACAO_FINANCEIRA
                                               AND CHAR_LENGTH(TRIM(COALESCE(C.CLASSIFICACAO_FINANCEIRA,''))) > 3), '') AS CONTA_RECEBER_BAIXA_TP_CONTA,
                                 COALESCE((SELECT FIRST 1 C.CONTA_CREDITO FROM TBCONTA_RECEBER_OPERACAO C, TBCLASSIFICACAO_CONTABIL DE
                                               WHERE C.CODIGO = :CONTA_RECEBER_BAIXA_ID AND DE.CODIGO = C.CLASSIFICACAO_FINANCEIRA
                                               AND CHAR_LENGTH(TRIM(COALESCE(C.CLASSIFICACAO_FINANCEIRA,''))) > 3), '') AS CONTA_RECEBER_BAIXA_CONTA,

                                 COALESCE((SELECT FIRST 1 N.CONTA_CONTABIL FROM TBEMPRESA N WHERE N.CODIGO = :CLIENTE_ID),'') AS CONTA_CONTABIL_EMPRESA1,
                                 COALESCE((SELECT FIRST 1 N.CONTA_CONTABIL2 FROM TBEMPRESA N WHERE N.CODIGO = :CLIENTE_ID),'') AS CONTA_CONTABIL_EMPRESA2

    

                             FROM TBCAIXABANCO A
                             WHERE A.CODIGO = (SELECT FIRST 1 X.CAIXABANCO_ID FROM TBPDV_CAIXA X WHERE X.ID = :CAIXA_ID)
                             INTO CAIXABANCO_ID, CAIXABANCO_CONTA, CAIXABANCO_CONTROLE, CONTABILIZACAO_MESTRE_ID, CONTABILIZACAO_BANCO_ID, CONTA_RECEBER_BAIXA_CC,
                                  CONTA_RECEBER_BAIXA_CLASS, CONTA_RECEBER_BAIXA_HIST, CONTA_RECEBER_BAIXA_TP_CONTA, CONTA_RECEBER_BAIXA_CONTA, CONTA_CONTABIL_EMPRESA1,
                                  CONTA_CONTABIL_EMPRESA2 DO
                                  BEGIN
                                     IF(:CAIXABANCO_ID IS NOT NULL AND :CONTA_RECEBER_BAIXA_CLASS <> '')THEN
                                     BEGIN
                                         IF(:CONTA_RECEBER_BAIXA_CONTA = '0' AND :CONTA_RECEBER_BAIXA_TP_CONTA = 'A')THEN
                                         BEGIN
                                            IF(CHAR_LENGTH(TRIM(:CONTA_CONTABIL_EMPRESA1)) > 3)THEN
                                            BEGIN
                                              :CONTA_RECEBER_BAIXA_CONTA = :CONTA_CONTABIL_EMPRESA1;
                                            END
                                         END
                                         IF(:CONTA_RECEBER_BAIXA_CONTA = '0' AND :CONTA_RECEBER_BAIXA_TP_CONTA = 'P')THEN
                                         BEGIN
                                            IF(CHAR_LENGTH(TRIM(:CONTA_CONTABIL_EMPRESA2)) > 3)THEN
                                            BEGIN
                                              :CONTA_RECEBER_BAIXA_CONTA = :CONTA_CONTABIL_EMPRESA2;
                                            END
                                         END

                                         IF(:CAIXABANCO_CONTROLE = 0)THEN
                                         BEGIN
                                            /* GERAR LAN??AMENTO DE BAIXA GERADO NO CAIXA/BANCO SE NAO EXISTIR*/
                                             :CAIXABANCO_LANC_INCLUIDO = 1;
                                             :CAIXABANCO_CONTROLE = GEN_ID(GTBCAIXABANCO_LANCAMENTO,1);
                                             
                                             IF(FN_PARAMETRO('SISTEMA.INTEGRACAO_CONTABIL') = '1' AND :CONTABILIZACAO_MESTRE_ID = 0
                                                AND CHAR_LENGTH(TRIM(:CAIXABANCO_CONTA)) > 3 AND CHAR_LENGTH(TRIM(:CONTA_RECEBER_BAIXA_CONTA)) > 3)THEN
                                                BEGIN
                                                    CONTABILIZACAO_MESTRE_ID = GEN_ID(GTBMOVCONTMESTRE,1);
                                                    CONTABILIZACAO_BANCO_ID  = GEN_ID(TBMOVCONT_ID_GEN,1);
    
                                                    INSERT INTO TBMOVCONTMESTRE(ID, CODESTABELECIMENTO, DATA)
                                                         VALUES (:CONTABILIZACAO_MESTRE_ID, :ESTABELECIMENTO_ID, :DATA_EMISSAO);
    
                                                    INSERT INTO TBMOVCONTABIL(ID, CODESTABELECIMENTO, IDCONTMOV, NATUREZA, CONTA,
                                                            DATA, IDDOCUMENTO, DESCRICAO, CODORIGEM, VALOR,    IDHISTORICO, HISTORICO)
                                                        VALUES (:CONTABILIZACAO_BANCO_ID, :ESTABELECIMENTO_ID, :CONTABILIZACAO_MESTRE_ID, 'D', :CAIXABANCO_CONTA, :DATA_EMISSAO,
                                                            :CAIXABANCO_CONTROLE, FN_LPAD(:NUMERO_CFE,7,0), 'RDP', :VALOR_TEMP, 0, ' VENDAS CF-E CAIXA:'|| :CAIXA_ID);
                                                END
                
                                                INSERT INTO TBCAIXABANCO_LANCAMENTO (ESTABELECIMENTO_CODIGO, CAIXABANCO_CODIGO, DATA_LANCAMENTO,
                                                    NUMERO_CHEQUE, CONTA_CONTABIL, HISTORICO, VALOR_TOTAL, OBSERVACAO, CONTROLE, TIPO, NATUREZA,
                                                    USUARIO_CODIGO, DATA, MOVCONTABIL_ID, MOVCONTMESTRE_ID, DATA_COMPETENCIA,BAIXA_CUPOM)
                                                   VALUES (:ESTABELECIMENTO_ID, :CAIXABANCO_ID, :DATA_EMISSAO, :NUMERO_CFE, :CAIXABANCO_CONTA,
                                                    ' VENDAS CF-E CAIXA:'|| :CAIXA_ID, :VALOR_TEMP, '', :CAIXABANCO_CONTROLE, 'R', 'D', FN_CURRENT_USER_ID(),
                                                    CURRENT_DATE, :CONTABILIZACAO_BANCO_ID, :CONTABILIZACAO_MESTRE_ID, :DATA_EMISSAO, '1');
                                         END
    
                                        /* GERAR REGISTRO DE BAIXA E SUA CLASSIFICACAO NO LANCAMENTO DO CAIXA/BANCO */
                                         CONTA_RECEBER_REG_CONTROLE = GEN_ID(GTBCAIXABANCO_REGISTRO, 1);
                                         CONTABILIZACAO_REG_ID      = 0;

                                         IF(FN_PARAMETRO('SISTEMA.INTEGRACAO_CONTABIL') = '1' AND :CONTABILIZACAO_MESTRE_ID > 0
                                            AND CHAR_LENGTH(TRIM(:CAIXABANCO_CONTA)) > 3 AND CHAR_LENGTH(TRIM(:CONTA_RECEBER_BAIXA_CONTA)) > 3)THEN
                                            BEGIN
                                               CONTABILIZACAO_REG_ID = GEN_ID(TBMOVCONT_ID_GEN,1);

                                               INSERT INTO TBMOVCONTABIL(ID, CODESTABELECIMENTO, IDCONTMOV, NATUREZA, CONTA,
                                                    DATA, IDDOCUMENTO, DESCRICAO, CODORIGEM, VALOR, IDHISTORICO, HISTORICO)
                                                VALUES (:CONTABILIZACAO_REG_ID, :ESTABELECIMENTO_ID, :CONTABILIZACAO_MESTRE_ID,
                                                    'C', :CONTA_RECEBER_BAIXA_CONTA, :DATA_EMISSAO, :CAIXABANCO_CONTROLE,
                                                    FN_LPAD(:NUMERO_CFE,7,0), 'RDP', :VALOR_TEMP, 0,
                                                    :CONTA_RECEBER_BAIXA_HIST||' CF. '||FN_LPAD(:NUMERO_CFE,6,0));
                                            END

                                             INSERT INTO TBCAIXABANCO_LANCAMENTO_REG (CONTROLE, ESTABELECIMENTO_CODIGO, CAIXABANCO_CONTROLE,
                                                    DATA, EMPRESA_CODIGO, NFE_PARCELAMENTO_CONTROLE, NFS_PARCELAMENTO_CONTROLE, CAIXABANCO_CODIGO,
                                                    OPERACAO_CODIGO, DOCUMENTO_NUMERO, PARCELA, VALOR, VALOR_DESCONTO, VALOR_JUROS, VALOR_MULTA,
                                                    VALOR_DESPESA_DIVERSA, VALOR_DESPESA_COBRANCA, VALOR_DESPESA_CARTORIO, REGISTRO_MESTRE,
                                                    OCORRENCIA_CONTROLE, VALOR_SALDO, DATA_REGISTRO, TIPO, SERIE, CODORIGEM, CONTA_DEBITO,
                                                    CONTA_CREDITO, NFE_CONTROLE, NFS_CONTROLE, VALOR_TOTAL, ARQUIVO, CCUSTO, LANCAMENTO_CLASS_ID,
                                                    HISTORICO, MOVCONTABIL_ID, MOVCONTMESTRE_ID)
                                                 VALUES (:CONTA_RECEBER_REG_CONTROLE, :ESTABELECIMENTO_ID, :CAIXABANCO_CONTROLE, :DATA_EMISSAO,
                                                    :CLIENTE_ID, 0, :PARCELAMENTO_ID, :CONTA_RECEBER_BANCO, :CONTA_RECEBER_BAIXA_ID, :NUMERO_CFE,
                                                    :COUNT_PARCELA, :VALOR_TEMP, 0, 0, 0, 0, 0, 0, '1', NULL, :VALOR_TEMP, CURRENT_TIMESTAMP, 'C',
                                                    :SERIE_CFE, 'RDP', :CAIXABANCO_CONTA, :CONTA_RECEBER_BAIXA_CONTA, 0, 0, :VALOR_TEMP, NULL, '', 0,
                                                    :CONTA_RECEBER_BAIXA_HIST||' CF. '||FN_LPAD(:NUMERO_CFE,6,0), :CONTABILIZACAO_REG_ID, :CONTABILIZACAO_MESTRE_ID);
        
                                             INSERT INTO TBCAIXABANCO_LANCAMENTO_CLASS (ESTABELECIMENTO_CODIGO, CONTROLE, CAIXABANCO_CONTROLE,
                                                    CONTA_PAGAR_CONTROLE, CONTA_RECEBER_CONTROLE, CLASSIFICACAO_CONTABIL, CCUSTO,
                                                    HISTORICO_CONTABIL, CONTA_CONTABIL, TIPO, DATA, VALOR)
                                                VALUES (:ESTABELECIMENTO_ID, GEN_ID(GTBCAIXABANCO_LANCAMENTO, 1), :CAIXABANCO_CONTROLE, 0,
                                                    :CONTA_RECEBER_REG_CONTROLE, :CONTA_RECEBER_BAIXA_CLASS, :CONTA_RECEBER_BAIXA_CC, :CONTA_RECEBER_BAIXA_HIST||' CF. '||FN_LPAD(:NUMERO_CFE,6,0),
                                                    '', 'C', :DATA_EMISSAO, :VALOR_TEMP);
            
                                            EXECUTE PROCEDURE SPU_CONTA_RECEBER_SALDO2(0, :PARCELAMENTO_ID);
                
                                            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 = 0
                                                AND A.CONTROLE = :PARCELAMENTO_ID;
    
                                        /* ATUALIZAR VALOR DO LAN??AMENTO DE BAIXA GERADO NO CAIXA/BANCO SE JA EXISTIR*/
                                        IF(:CAIXABANCO_LANC_INCLUIDO = 0) THEN
                                        BEGIN

                                           UPDATE TBCAIXABANCO_LANCAMENTO
                                             SET VALOR_TOTAL = COALESCE((SELECT SUM(F.VALOR_TOTAL) FROM TBCAIXABANCO_LANCAMENTO_REG F WHERE F.CAIXABANCO_CONTROLE = :CAIXABANCO_CONTROLE AND F.TIPO = 'C'),0)
                                             WHERE CONTROLE = :CAIXABANCO_CONTROLE
                                             AND BAIXA_CUPOM = '1'
                                             AND DATA_LANCAMENTO = :DATA_EMISSAO;

                                            IF(:CONTABILIZACAO_BANCO_ID > 0)THEN
                                            BEGIN
                                               UPDATE TBMOVCONTABIL
                                                 SET VALOR = COALESCE((SELECT SUM(F.VALOR_TOTAL) FROM TBCAIXABANCO_LANCAMENTO_REG F WHERE F.CAIXABANCO_CONTROLE = :CAIXABANCO_CONTROLE AND F.TIPO = 'C'),0)
                                                 WHERE ID = :CONTABILIZACAO_BANCO_ID;
                                            END

                                        END
                                     END
                                 END
                        END
    
                        :PARCELA_X      = :PARCELA_X + 1;
                        :COUNT_PARCELA  = :COUNT_PARCELA + 1;

                        IF(:PARCELAS > :SEQUENCIA) THEN
                        BEGIN
                            :SEQUENCIA = :SEQUENCIA + 1;

                        END ELSE
                        BEGIN
                           :SEQUENCIA = 1;

                        END

                     END
            END
     END
     /* DELETAR PARCELAS DO CAIXA BANCO */

     ELSE IF(:ACAO = 2) THEN
     BEGIN

         FOR
            SELECT
                T.CONTROLE,
                COALESCE(CFP.CHEQUE_ID, 0),
                U.PDV_ID
            FROM TBNFS_PARCELAMENTO T, TBPDV_CFE_FORMA_PAGAMENTO CFP, TBPDV_CFE U
            WHERE T.PDV_CFE_FORMA_PAGAMENTO_ID = CFP.ID
            AND U.ID = CFP.PDV_CFE_ID
            AND CFP.PDV_CFE_ID = :PDV_CFE_ID
            AND (:PDV_CFE_FORMA_PAGAMENTO_ID = 0 OR CFP.ID = :PDV_CFE_FORMA_PAGAMENTO_ID)
          INTO
             :PARCELAMENTO_ID, :CHEQUE_ID, :PDV_ID
          DO BEGIN


            DELETE FROM TBCHEQUE T WHERE T.CHEQUE_PDV_ID = :CHEQUE_ID AND T.PDV_ID = :PDV_ID;
            DELETE FROM TBCAIXABANCO_LANCAMENTO_REG S WHERE S.NFS_PARCELAMENTO_CONTROLE = :PARCELAMENTO_ID AND S.TIPO = 'C';
            DELETE FROM TBCAIXABANCO_LANCAMENTO_REG S WHERE S.NFS_PARCELAMENTO_CONTROLE = :PARCELAMENTO_ID AND S.TIPO = 'D';
            DELETE FROM TBCAIXABANCO_LANCAMENTO_REG S WHERE S.NFS_PARCELAMENTO_CONTROLE = :PARCELAMENTO_ID AND S.TIPO NOT IN ('C', 'D');
            DELETE FROM TBNFS_PARCELAMENTO T WHERE T.CONTROLE = :PARCELAMENTO_ID;
          END 
          /* ATUALIZAR LAN??AMENTO DE BAIXA GERADO NO CAIXA/BANCO */
          FOR
          SELECT
             FIRST 1
             COALESCE((SELECT FIRST 1 B.CONTROLE FROM TBCAIXABANCO_LANCAMENTO B
                        WHERE B.BAIXA_CUPOM = '1' AND B.DATA_LANCAMENTO = :DATA_EMISSAO AND B.CAIXABANCO_CODIGO = A.CODIGO
                        AND COALESCE((SELECT SUM(C.VALOR) FROM TBCAIXABANCO_LANCAMENTO_REG C WHERE C.CAIXABANCO_CONTROLE = B.CONTROLE AND C.TIPO = 'C'),0) > 0),0) AS CAIXABANCO_CONTROLE,
                        
             COALESCE((SELECT FIRST 1 B.MOVCONTABIL_ID FROM TBCAIXABANCO_LANCAMENTO B
                        WHERE B.BAIXA_CUPOM = '1' AND B.DATA_LANCAMENTO = :DATA_EMISSAO AND B.CAIXABANCO_CODIGO = A.CODIGO
                        AND COALESCE((SELECT SUM(C.VALOR) FROM TBCAIXABANCO_LANCAMENTO_REG C WHERE C.CAIXABANCO_CONTROLE = B.CONTROLE AND C.TIPO = 'C'),0) > 0),0) AS CONTABILIZACAO_BANCO_ID
             FROM TBCAIXABANCO A
             WHERE A.CODIGO = (SELECT FIRST 1 X.CAIXABANCO_ID FROM TBPDV_CAIXA X WHERE X.ID = :CAIXA_ID)
             INTO CAIXABANCO_CONTROLE, CONTABILIZACAO_BANCO_ID DO
             BEGIN
               IF(:CAIXABANCO_CONTROLE > 0) THEN
               BEGIN
                    UPDATE TBCAIXABANCO_LANCAMENTO
                     SET VALOR_TOTAL = COALESCE((SELECT SUM(F.VALOR_TOTAL) FROM TBCAIXABANCO_LANCAMENTO_REG F WHERE F.CAIXABANCO_CONTROLE = :CAIXABANCO_CONTROLE AND F.TIPO = 'C'),0)
                     WHERE CONTROLE = :CAIXABANCO_CONTROLE
                     AND BAIXA_CUPOM = '1'
                     AND DATA_LANCAMENTO = :DATA_EMISSAO;

                    IF(:CONTABILIZACAO_BANCO_ID > 0)THEN
                    BEGIN
                       UPDATE TBMOVCONTABIL
                         SET VALOR = COALESCE((SELECT SUM(F.VALOR_TOTAL) FROM TBCAIXABANCO_LANCAMENTO_REG F WHERE F.CAIXABANCO_CONTROLE = :CAIXABANCO_CONTROLE AND F.TIPO = 'C'),0)
                         WHERE ID = :CONTABILIZACAO_BANCO_ID;
                    END
               END
             END
          /* EXCLUIR LAN??AMENTO DE BAIXA GERADO NO CAIXA/BANCO */
          FOR
          SELECT
             FIRST 1
             COALESCE((SELECT FIRST 1 B.CONTROLE FROM TBCAIXABANCO_LANCAMENTO B
                        WHERE B.BAIXA_CUPOM = '1' AND B.DATA_LANCAMENTO = :DATA_EMISSAO AND B.CAIXABANCO_CODIGO = A.CODIGO
                        AND COALESCE((SELECT SUM(C.VALOR) FROM TBCAIXABANCO_LANCAMENTO_REG C WHERE C.CAIXABANCO_CONTROLE = B.CONTROLE AND C.TIPO = 'C'),0) = 0),0) AS CAIXABANCO_CONTROLE
             FROM TBCAIXABANCO A
             WHERE A.CODIGO = (SELECT FIRST 1 X.CAIXABANCO_ID FROM TBPDV_CAIXA X WHERE X.ID = :CAIXA_ID)
             INTO CAIXABANCO_CONTROLE DO
             BEGIN
               IF(:CAIXABANCO_CONTROLE > 0) THEN
               BEGIN
                   DELETE FROM TBCAIXABANCO_LANCAMENTO WHERE BAIXA_CUPOM = '1' AND CONTROLE = :CAIXABANCO_CONTROLE;
               END
             END
     END
END^

SET TERM ; ^