;(function() { window.createMeasureObserver = (measureName) => { var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`; performance.mark(`${markPrefix}-start`); return { end: function() { performance.mark(`${markPrefix}-end`); performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`); performance.clearMarks(`${markPrefix}-start`); performance.clearMarks(`${markPrefix}-end`); } } }; /** * Gerenciador de eventos */ window.gevent = { stack: [], RUN_ONCE: true, on: function(name, callback, once) { this.stack.push([name, callback, !!once]); }, emit: function(name, args) { for (var i = this.stack.length, item; i--;) { item = this.stack[i]; if (item[0] === name) { item[1](args); if (item[2]) { this.stack.splice(i, 1); } } } } }; var runningSearch = false; var hadAnEvent = true; var elementsToWatch = window.elementsToWatch = new Map(); var innerHeight = window.innerHeight; // timestamp da última rodada do requestAnimationFrame // É usado para limitar a procura por elementos visíveis. var lastAnimationTS = 0; // verifica se elemento está no viewport do usuário var isElementInViewport = function(el) { var rect = el.getBoundingClientRect(); var clientHeight = window.innerHeight || document.documentElement.clientHeight; // renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content if(el.className.includes('related-content-front')) return true; // garante que usa ao mínimo 280px de margem para fazer o lazyload var margin = clientHeight + Math.max(280, clientHeight * 0.2); // se a base do componente está acima da altura da tela do usuário, está oculto if(rect.bottom < 0 && rect.bottom > margin * -1) { return false; } // se o topo do elemento está abaixo da altura da tela do usuário, está oculto if(rect.top > margin) { return false; } // se a posição do topo é negativa, verifica se a altura dele ainda // compensa o que já foi scrollado if(rect.top < 0 && rect.height + rect.top < 0) { return false; } return true; }; var asynxNextFreeTime = () => { return new Promise((resolve) => { if(window.requestIdleCallback) { window.requestIdleCallback(resolve, { timeout: 5000, }); } else { window.requestAnimationFrame(resolve); } }); }; var asyncValidateIfElIsInViewPort = function(promise, el) { return promise.then(() => { if(el) { if(isElementInViewport(el) == true) { const cb = elementsToWatch.get(el); // remove da lista para não ser disparado novamente elementsToWatch.delete(el); cb(); } } }).then(asynxNextFreeTime); }; // inicia o fluxo de procura de elementos procurados var look = function() { if(window.requestIdleCallback) { window.requestIdleCallback(findByVisibleElements, { timeout: 5000, }); } else { window.requestAnimationFrame(findByVisibleElements); } }; var findByVisibleElements = function(ts) { var elapsedSinceLast = ts - lastAnimationTS; // se não teve nenhum evento que possa alterar a página if(hadAnEvent == false) { return look(); } if(elementsToWatch.size == 0) { return look(); } if(runningSearch == true) { return look(); } // procura por elementos visíveis apenas 5x/seg if(elapsedSinceLast < 1000/5) { return look(); } // atualiza o último ts lastAnimationTS = ts; // reseta status de scroll para não entrar novamente aqui hadAnEvent = false; // indica que está rodando a procura por elementos no viewport runningSearch = true; const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve()); // obtém todos os elementos que podem ter view contabilizados //elementsToWatch.forEach(function(cb, el) { // if(isElementInViewport(el) == true) { // // remove da lista para não ser disparado novamente // elementsToWatch.delete(el); // cb(el); // } //}); done.then(function() { runningSearch = false; }); // reinicia o fluxo de procura look(); }; /** * Quando o elemento `el` entrar no viewport (-20%), cb será disparado. */ window.lazyload = function(el, cb) { if(el.nodeType != Node.ELEMENT_NODE) { throw new Error("element parameter should be a Element Node"); } if(typeof cb !== 'function') { throw new Error("callback parameter should be a Function"); } elementsToWatch.set(el, cb); } var setEvent = function() { hadAnEvent = true; }; window.addEventListener('scroll', setEvent, { capture: true, ive: true }); window.addEventListener('click', setEvent, { ive: true }); window.addEventListener('resize', setEvent, { ive: true }); window.addEventListener('load', setEvent, { once: true, ive: true }); window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true }); window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE); // inicia a validação look(); })();
  • AssineUOL
Logo Pagbenk Seu dinheiro rende mais
Topo

Clientes do Nubank reclamam de 'sumiço' de dinheiro, e banco culpa Caixa

Nubank culpou Caixa pela falha no sistema de pagamentos de boletos - Divulgação
Nubank culpou Caixa pela falha no sistema de pagamentos de boletos Imagem: Divulgação

Do UOL, em São Paulo

08/07/2020 14h44Atualizada em 08/07/2020 17h45

Alguns clientes do Nubank foram surpreendidos ontem com o sumiço de parte do saldo que tinham em conta. Nas redes sociais há várias reclamações contra o banco digital.

Uma internauta relatou que o saldo de R$ 329,59 que ela tinha em sua conta no Nubank foi zerada. "Onde está meu dinheiro? Esse é o dinheiro do meu salário", escreveu a usuária Thayla Jamus.

Hoje, a empresa também utilizou as redes sociais para tentar acalmar seus clientes e dizer que o desaparecimento do saldo foi causado por um problema com o pagamento de boletos pela Caixa Econômica Federal.

À reportagem do UOL, a Caixa informou que, "acerca de relatos de intercorrências em pagamentos e transferências do Caixa Tem para fintechs, não foram identificadas falhas nos sistemas internos do banco".

Só hoje, ainda segundo o banco, já foram realizadas mais de 1,6 milhão de transações com o cartão de débito virtual, e processados cerca de 6 milhões de boletos "sem nenhum incidente no sistema de cobrança".

'Falha sistêmica'

Segundo o Nubank, entre 15 de abril e 10 de junho, parte de seus clientes que pagou boletos por meio da Caixa recebeu em sua conta digital uma quantia superior ao valor correto. O erro, de acordo com o banco, ocorreu devido a uma falha sistêmica da Caixa.

"Assim que fomos informados pela Caixa sobre a situação, agindo de boa-fé, comunicamos nossos clientes sobre o equívoco e, seguindo as recomendações do banco, iniciamos o processo de estorno dos valores excedentes para a Caixa. As devoluções foram suspensas assim que identificamos inconsistências nos dados fornecidos pela Caixa", disse o Nubank em comunicado no seu site.

Ainda de acordo com o banco digital, devido à imprecisão dos dados fornecidos, os valores foram revertidos aos seus clientes mesmo não sendo responsáveis pela falha.

"Os valores já estão sendo devolvidos hoje [ontem] mesmo, e estamos aguardando esclarecimentos adicionais da Caixa", afirmou o Nubank.

Outra falha

Nesta semana, alguns veículos relataram uma falha no sistema de segurança do Nubank que permitia que dados pessoais de seus clientes, como nome, F e conta, ficassem visíveis em buscas na internet.

O caso foi exposto pelo pesquisador de segurança digital Heitor Gouvêa. Segundo ele, a opção "cobrar", disponível no aplicativo do banco para fazer transferências, gerava um link que era indexado às buscas do Google. Com isso, os dados da operação ficavam disponíveis na internet sem que os clientes soubessem.

Em nota, o Nubank informou que seu time de segurança avaliou o relatório e constatou que os links listados pelo Google tinham origem em outros sites indexados na internet.

"Para melhorar esse controle, foram feitas algumas modificações na aplicação e solicitado o bloqueio deste tipo de resultado a partir do Google, solucionando a questão", afirmou o banco.