SET TERM ^ ;

CREATE OR ALTER procedure SP_CFE_PARCELAMENTO_IMPORTACAO (
    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 varchar(200);
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(200);
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(200);
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);
declare variable DATA_LANCAMENTO date;
declare variable APLICAR_DESCONTO_ITEM integer;
declare variable ORDENACAO integer;
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
                X.*
            FROM (
                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') AS FORMA_COMISSAO,
                    C.NUMERO_CFE,
                    C.SERIE,
                    C.DATA_EMISSAO,
                    T.VENCIMENTOS,
                    T.VALORES_PAGAMENTO,
                    OP.CLASSIFICACAO_FINANCEIRA,
                    COALESCE(PDV.APLICAR_DESCONTO_ITEM, 0) AS APLICAR_DESCONTO_ITEM,
                    IIF(PF.PDV_TIPO = 4 OR PF.PDV_TIPO = 7 OR PF.PDV_TIPO = 10 OR PF.PDV_TIPO = 11 OR PF.PDV_TIPO = 12, 9, 1) AS ORDENACAO
                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 TBPDV PDV ON PDV.ID = C.PDV_ID
                LEFT JOIN TBCONTA_RECEBER_OPERACAO OP ON OP.CODIGO = PF.OPERACAO_ID
                WHERE T.PDV_CFE_ID = :PDV_CFE_ID
            ) X
            ORDER BY X.ORDENACAO ASC
            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, :APLICAR_DESCONTO_ITEM, :ORDENACAO
            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;

               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 */
                    :DATA_CREDITO       = DATEADD(DAY, 1, :DATA_EMISSAO);

                    :VALOR_SALDO = :VALOR_TEMP;
                    IF(:PARCELAS_SEM_SALDO = 1 OR :PDV_TIPO = 11 OR :PDV_TIPO = 12) 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, PDV_CFE_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, :PDV_CFE_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);


                    :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 DE IMPORTACAO */

     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 

     END
END
^

SET TERM ; ^

