Jump to content

Косяк при смене статуса заказа.


Recommended Posts

В 2.0 и 2.1 есть такой косяк. Допустим появился новый заказ (статус "Новый"), и тут вы удаляете совсем из каталога один из продуктов, фигурирующий в этом заказе. При попытке изменить статус заказа на "Принят", выдает ошибку "error closing" и статус не меняет ... все вроде зашибись НО при этом все-равно уменьшается остаток на складе, как будто бы заказ все-таки получил статус "Принят", и если еще раз попробовать изменить статус на "Принят", то спишется еще раз и т.д.

Так что те, у кого собраны магазины на 2.0 имейте в виду, что тот остаток, который у вас показывается на сайте может ой как не соответствовать действительности.

А товар может кончиться очень быстро (особенно если клиент например тормозит с оплатой несколько дней, а политика магазина позволяет резервирование товара только ПОСЛЕ оплаты) и если не планируется потом этот товар закупать, то соответственно нет смысла его постоянно держать в базе.

Link to post
Share on other sites

А зачем его совсем удалять? Его же просто скрыть можно.

А если клиент захочет посмотреть, что он заказал, описание почитать... и не сможет что-ли?
Я просто меняю статус заказа на "Принят" и количество товара уменьшается - кнопка "Купить" убирается.

То, что вы описываете - это не косяк. Это я даже не знаю, как назвать. С точки зрения БД и её целостности - крайне некошерно.
Вообще, косяк тут в другом - по-хорошему, товар вообще удаляться не должен, если он фигурирует в заказе. Надо на это проверку добавить.

"Если политика магазина позволяет резервирование товара только ПОСЛЕ оплаты" - это не политика, это хрень какая-то. По-вашему, клиент сходил в банк, отстоял очередь - оплатил, а ему говорят - извините, товар кончился?
Приведите, пожалуйста, пример, когда такие меры оправданы. Что-то ничего в голову не приходит...

Link to post
Share on other sites

Спасибо за найденый баг.
В файле api/Orders.php примерно на 276 строке нужно заменить


if(!$order->closed)
{
$purchases = $this->get_purchases($order->id);
foreach($purchases as $purchase)
{
$variant = $this->variants->get_variant($purchase->variant_id);
if(empty($variant) || ($variant->stock<$purchase->amount))
return false;

if(!$variant->infinity)
{
$new_stock = $variant->stock-$purchase->amount;
$this->variants->update_variant($variant->id, array('stock'=>$new_stock));
}
}
$query = $this->db->placehold("UPDATE __orders SET closed=1, modified=NOW() WHERE id=? LIMIT 1", $order->id);
$this->db->query($query);
}

на


if(!$order->closed)
{
$purchases = $this->get_purchases($order->id);
foreach($purchases as $purchase)
{
$variant = $this->variants->get_variant($purchase->variant_id);
if(empty($variant) || ($variant->stock<$purchase->amount))
return false;
}
foreach($purchases as $purchase)
{
if(!$variant->infinity)
{
$new_stock = $variant->stock-$purchase->amount;
$this->variants->update_variant($variant->id, array('stock'=>$new_stock));
}
}
$query = $this->db->placehold("UPDATE __orders SET closed=1, modified=NOW() WHERE id=? LIMIT 1", $order->id);
$this->db->query($query);
}

Link to post
Share on other sites

2 admin, если поставить такой код и попробовать менять статус "Новый" на "Принят" несколько раз туда-обратно - то остатки начинают меняться совсем непредсказуемо.

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...