ALTER TABLE TBPDV_CFE
    ADD OBSERVACAO_BRINDE VARCHAR(100);
	
CREATE OR ALTER procedure SP_CFE_PARCELAMENTO (
    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)
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 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 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);
BEGIN

    /* REGISTRAR PARCELAS NO CAIXA BANCO */
    IF(:ACAO = 1) THEN
    BEGIN
        :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;

        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,
                COALESCE(PF.REGISTRAR_RECEBIMENTO_NFS, 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
            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
            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
            DO BEGIN

                   :PARCELA_X = 1;

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

                   :VALOR_TEMP = ROUND(:VALOR_REAL / :PARCELAS, 2);
    
                   :SEQUENCIA = 1;

                   WHILE (:PARCELA_X <= :PARCELAS) DO
                    BEGIN

                        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);

                        END ELSE
                        BEGIN
                            :DATA_CREDITO = :DATA_EMISSAO;
                        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)
                        VALUES (:CAIXA_ID, 0, :COUNT_PARCELA, :VALOR_TEMP, IIF(:PARCELAS > 1, DATEADD(MONTH, :PARCELA_X,:DATA_CREDITO), :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);

                        /* 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(: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
            FROM TBNFS_PARCELAMENTO T
            WHERE T.TIPO = 2
            AND T.CAIXA_ID = :CAIXA_ID
            AND T.SERIE = :SERIE_CFE
            AND T.NUMERO_NOTAFISCAL = :NUMERO_CFE
            AND T.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_ID
          INTO
             :PARCELAMENTO_ID
          DO BEGIN
            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;