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_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;
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
            FROM TBPDV_CFE_FORMA_PAGAMENTO T
            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
            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;
    
                        /* INSERT REGISTRO TBNFS_PARCELAMENTO */

                        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)
                        VALUES (:CAIXA_ID, 0, :COUNT_PARCELA, :VALOR_TEMP, IIF(:TIPO_PAG = '03', DATEADD(MONTH, :PARCELA_X,:DATA_EMISSAO), :DATA_EMISSAO), 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_TEMP, 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);

                        /* 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_TEMP, CURRENT_TIMESTAMP, :NATUREZA, :SERIE_CFE,
                            'CF1', '', '', 0, 0, :VALOR_TEMP, NULL, '', 0);
    
    
                        :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
          INTO
             :PARCELAMENTO_ID
          DO BEGIN
            DELETE FROM TBCAIXABANCO_LANCAMENTO_REG S WHERE S.NFS_PARCELAMENTO_CONTROLE = :PARCELAMENTO_ID;
            DELETE FROM TBNFS_PARCELAMENTO T WHERE T.CONTROLE = :PARCELAMENTO_ID;
          END

     END
END;