Fórum OpenCart Brasil

Por um e-commerce livre, confiável e profissional

Suporte geral sobre problemas técnicos para OpenCart v1.x.
#54136
Fiz um teste de compra em sua loja, realmente o problema na pasta "tmp" persisti, acredite, não estou lhe mentido sobre a questão do problema ser com sua hospedagem e o fato da pasta tmp ser compartilhada e o OpenCart não aceitar que seja compartilhada, pois eles necessita apagar as sessões geradas por ele por segurança da própria loja, infelizmente esse é só o primeiro de muitos problemas que você vai ter nesta hospedagem caso não resolvam esta questão da pasta tmp.

O seu layout está muito ruim de visualizar, é só uma dica. :)

Espero ter ajudado. :D
#55370
Olá.
Passei a ultima semana sofrendo com esse problema do estoque.
Passei por inúmeras páginas e nenhuma tinha uma resposta concreta.
Depois de tanta incerteza resolvi mergulhar no código e procurar ligar os pontos e consegui chegar a uma solução.

Antes de mais nada, gostaria de deixar claro que, essa solução, encaixou-se nas minhas necessidades e pode acontecer que ela não sirva para você, mas, talvez, dê alguma luz no fim do túnel.

Bem, vamos lá.
Eu comecei procurando os arquivos principais relacionados ao checkout, e estes são: catalog/controller/checkout/checkout.php, catalog/controller/checkout/confirm.php e catalog/model/checkout/order.php.
Os dois controllers serviram para ajudar a entender a lógica do sistema, mas a solução mesmo acontece no model Order.
Dentro desse arquivo, procure, primeiramente, o seguinte código:
Código: Selecionar todos
$order_product_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "order_product WHERE order_id = '" . (int)$order_id . "'");

			foreach ($order_product_query->rows as $order_product) {
				$this->db->query("UPDATE " . DB_PREFIX . "product SET quantity = (quantity - " . (int)$order_product['quantity'] . ") WHERE product_id = '" . (int)$order_product['product_id'] . "' AND subtract = '1'");
				$order_option_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "order_option WHERE order_id = '" . (int)$order_id . "' AND order_product_id = '" . (int)$order_product['order_product_id'] . "'");
				foreach ($order_option_query->rows as $option) {
					$this->db->query("UPDATE " . DB_PREFIX . "product_option_value SET quantity = (quantity - " . (int)$order_product['quantity'] . ") WHERE product_option_value_id = '" . (int)$option['product_option_value_id'] . "' AND subtract = '1'");
				}
			}
Esse código é o responsável por decrementar o estoque. Por algum motivo, no momento que você instala o PagSeguro no sistema (E mesmo se você desinstalar depois, o problema vai persistir), o sistema passa a ignorar esse código, ou, talvez, até mesmo ignorar toda a função relacionada a ele (function Confirm) e dessa forma o controle de estoque para de funcionar.

Porém, há mais algumas funções dentro desse model, dentre elas a addOrder e está continua funcionando perfeitamente.
A função addOrder é responsável por 'iniciar' o pedido e ela acontece no momento que você finaliza o pedido no final do checkout.
Dentre as diversas funções que essa função faz, está o registro dos produtos (e suas opções) do pedido.
Para as necessidades da loja atual, e acredito que para de qualquer loja, subtrair o estoque, no momento que o cliente fecha o pedido, independente de já ter pago ou não, é importante, pois, assim, aquele produto está assegurado ao cliente e não corre o risco de ele ficar sem se, por exemplo, a operadora do cartão dele, demorar para aprovar a compra.

Com isso em mente, realizei as seguintes alterações:
Primeiramente, comente o trecho de código da função Confirm citado anteriormente (você pode remover se quiser, mas aconselho a comentar, por segurança).

Feito isso, procure a seguinte linha:
Código: Selecionar todos
$this->db->query("INSERT INTO " . DB_PREFIX . "order_product SET order_id = '" . (int)$order_id . "', product_id = '" . (int)$product['product_id'] . "', name = '" . $this->db->escape($product['name']) . "', model = '" . $this->db->escape($product['model']) . "', quantity = '" . (int)$product['quantity'] . "', price = '" . (float)$product['price'] . "', total = '" . (float)$product['total'] . "', tax = '" . (float)$product['tax'] . "', reward = '" . (int)$product['reward'] . "'");
E abaixo dela insira esse código:
Código: Selecionar todos
$this->db->query("UPDATE " . DB_PREFIX . "product SET quantity = (quantity - " . (int)$product['quantity'] . ") WHERE product_id = '" . (int)$product['product_id'] . "' AND subtract = '1'");
Em seguida procure a linha:
Código: Selecionar todos
$this->db->query("INSERT INTO " . DB_PREFIX . "order_option SET order_id = '" . (int)$order_id . "', order_product_id = '" . (int)$order_product_id . "', product_option_id = '" . (int)$option['product_option_id'] . "', product_option_value_id = '" . (int)$option['product_option_value_id'] . "', name = '" . $this->db->escape($option['name']) . "', `value` = '" . $this->db->escape($option['value']) . "', `type` = '" . $this->db->escape($option['type']) . "'");
E insira esse código após ela:
Código: Selecionar todos
$this->db->query("UPDATE " . DB_PREFIX . "product_option_value SET quantity = (quantity - " . (int)$product['quantity'] . ") WHERE product_option_value_id = '" . (int)$option['product_option_value_id'] . "' AND subtract = '1'");
Feito isso basta salvar e testar.
A menos que tenha algum outro problema, como o da pasta tmp, citado aqui:
Manoel Vidal escreveu:Essa mensagem de erro informa que sua hospedagem não permite que o opencart manipule a pasta "tmp" que é onde ficam as sessões do PHP, é necessário que sua hospedagem permita que o OpenCart manipule as sessões PHP, pois ele as cria e as apaga por segurança.

Entre em contato com o suporte de sua hospedagem e solicite que eles criem uma pasta tmp única para sua hospedagem.

Espero ter ajudado. :D
O sistema de controle de estoque voltará a funcionar perfeitamente.

Espero ter ajudado a todos que estão com esse problema e caíram nesse post e aos que podem vir a enfrentar esse infortuno problema.

~HLK