r-martins / PagSeguro-Magento-Transparente

Módulo de checkout transparente para Pagseguro - com api v. 2.0
GNU General Public License v2.0
66 stars 0 forks source link

Produto voltando mais de uma vez ao estoque #260

Closed WidecommerceDev closed 5 years ago

WidecommerceDev commented 5 years ago

Olá, recentemente estamos enfrentando um problema com estoque de produtos.

Vamos supor que um produto tendo em estoque 10 unidades é vendido e ele tem seu estoque abaixado para -1 ficando com 9 unidades. Até aqui tudo bem.

Porém quando o pedido é cancelado, automaticamente a quantidade do produto vendido volta em estoque somando +1 nesse caso e voltando a ter 10 unidades o meu produto.

Porém o que está acontecendo é que esta sendo retornado mais de uma unidade ao estoque, ao invés de voltar 1 está voltando 2 ficando com quantidade total de 11.

Lembrando que esses valores são só exemplos, e a quantidade voltada ao estoque depende da quantidade comprada.

Certo, e o que isso tem haver com o método de pagamento PagSeguro?

Em alguns pedidos a solicitação de pagamento cancelado está chegando na minha plataforma de duas a mais vezes sequenciais, sem um espaço de tempo... Coisa de 2 segundos ou até menos de diferença... Com isso a primeira requisição não chega a salvar e já vem outra logo em seguida... Com isso o Magento soma as quantidades para voltar em estoque das duas requisições e salva o valor de estoque errado.

Para resolver isso creio que seja bem simples... Ao invés de utilizar Mage::getModel('sales/order'), utilizem Mage::getSingleton('sales/order'), pois como estamos utilizando o padrão singleton, ele não vai instanciar outro objeto e fazer a confusão dos estoques.

Não sei se consegui ser claro. Se tiverem dúvidas estamos a disposição para batermos um papo.

r-martins commented 5 years ago

Oi, @WidecommerceDev . Tudo bom? Obrigado pelo detalhamento no bug e na investigação.

Qual versão do módulo está usando? Pergunto isso, porque há muito tempo eu tratei essa questão dos retornos duplicados do PagSeguro, de forma que o módulo não aceita um retorno em menos de 60 segundos, como pode ser visto em \RicardoMartins_PagSeguro_NotificationController::indexAction e endereçado no #215 ).

Outra coisa que me ocorreu vendo a forma como implementei é o cache. Você está com os caches ativos? Vi que fiz essa implementação com um cache chamado _pagseguronotification. Mas se os caches estiverem desabilitados, será que essa abordagem funciona? Não pensei nisso.

Em um teste rápido local, mesmo com os caches desabilitados, funcionou.

martins@martinsmac.lan:~/www/pagseguro-exemplo$ curl -X POST http://pagseguro-exemplo.local.com.br/pseguro/notification -d "notificationCode=AAAA"
//erro grande em html.. nao vou colar aqui
martins@martinsmac.lan:~/www/pagseguro-exemplo$ curl -X POST http://pagseguro-exemplo.local.com.br/pseguro/notification -d "notificationCode=AAAA"
Notificação já enviada a menos de 1 minuto.
martins@martinsmac.lan:~/www/pagseguro-exemplo$
r-martins commented 5 years ago

@WidecommerceDev fique à vontade para reabrir o ticket com mais informações. Obrigado pela ajuda e parceria de sempre.