ALTER TABLE TBPDV_CFE_PARCELAS
    ADD PDV_TIPO INTEGER DEFAULT 0 NOT NULL;


SET TERM ^ ;

CREATE OR ALTER procedure SP_CFE_PARCELAS (
    PDV_CFE_ID integer,
    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 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);
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,
                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,
                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
            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, :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
            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


                        INSERT INTO TBPDV_CFE_PARCELAS (PDV_CFE_ID, PARCELA, DATA_VENCIMENTO, VALOR, TIPO_PAG, PDV_TIPO)
                        VALUES (:PDV_CFE_ID, :COUNT_PARCELA, :DATA_CREDITO, :VALOR_TEMP, :TIPO_PAG, :PDV_TIPO);


                        :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
        DELETE FROM TBPDV_CFE_PARCELAS T WHERE T.PDV_CFE_ID = :PDV_CFE_ID;

     END
END
^

SET TERM ; ^


CREATE INDEX ITBPDV_CFE_PARCELAS_03
ON TBPDV_CFE_PARCELAS (PDV_TIPO);

