Перейти к содержанию
indaled

Ситуация когда 2 человека делают заказ в одно время

Рекомендуемые сообщения

Добрый день! Вопрос на форуме поднимался пару раз но ответа так никто и не дал.

 

Ситуация: 2 человека примерно в одно время добавляют товар с наличием 1шт в корзину. Даже если в настройках запрещено продавать товар с нулевым остатком они могут это сделать. Соответственно далее на этапе оформления заказа они опять таки оба (а их может быть и больше) могут купить этот товар. В итоге мы получаем наличие "-1 шт" и недостаток товаров на складе.

 

Происходит (насколько я понимаю) это потому что проверка наличия идет на этапе добавления в корзину, а списывание товара со склада только на этапе оформления заказа, соот-но все кто добавил товар в корзину до момента когда последняя единица товара была списана могут так же оформить свой заказ и вывести наличие в минус.

 

Решение вижу в том чтобы при отправке заказа так же проверять весь список товаров на текущее наличие на складе.

 

Вопрос простой: как быть!?

 

Версия движка любая (ранее вопрос поднимался и про OS 1.5 и про 2.0, в моем случае 2.3)

Изменено пользователем indaled

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присвоить статус одинаковый и для заказа "в процессе" и для "завершённого" ?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да при ограниченном количестве есть проблема
В таком случае надо вводить систему резервирования
как только кто-то положил товар в корзину, сразу списывать , но в случае удаления из корзины, и дальнейших операций с заказом, создание, добавление, удалять из резерва, а товар-то все равно списан.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
20 часов назад, Tom сказал:

Присвоить статус одинаковый и для заказа "в процессе" и для "завершённого" ?

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

Вы не совсем поняли суть вопроса. Проблема в том что на последнем этапе оформления заказа (кнопка #button-confirm) не проводится верификация на наличие товаров находящихся в корзине к реальному наличию, соот-но если кто то оформлял заказ с вами параллельно, то вы можете заказать единицу которой в наличии реально нет.

Проблему решил следующим образом (вдруг кому пригодится).

1. Добавляем в контроллер используемого payment (по дефолту cod.php, но может быть и другой если настраивали оплату) в функцию confirm валидацию корзины условием выполнения. Соответственно должно получиться как то так:

public function confirm() {
	    if ((!$this->cart->hasProducts() && empty($this->session->data['vouchers'])) || (!$this->cart->hasStock() && !$this->config->get('config_stock_checkout'))) {
			$redirect = $this->url->link('checkout/cart');
			$json['redirect'] = $redirect;
			$this->response->addHeader('Content-Type: application/json');
		    $this->response->setOutput(json_encode($json));
		}
        else {
    		if ($this->session->data['payment_method']['code'] == 'cod') {
    			$this->load->model('checkout/order');
    
    			$this->model_checkout_order->addOrderHistory($this->session->data['order_id'], $this->config->get('cod_order_status_id'));
    		}
        }
	}

2. В tpl файле того же метода оплаты (в данному случае дефолтный cod.tpl) меняем ajax запрос с учетом проверки json на предмет наличия там условия редиректа в корзину:

<div class="buttons">
  <div class="pull-right">
    <input type="button" value="<?php echo $button_confirm; ?>" id="button-confirm" class="btn btn-primary" data-loading-text="<?php echo $text_loading; ?>" />
  </div>
</div>
<script type="text/javascript"><!--
$('#button-confirm').on('click', function() {
	$.ajax({
		type: 'get',
		url: 'index.php?route=extension/payment/cod/confirm',
		cache: false,
		beforeSend: function() {
			$('#button-confirm').button('loading');
		},
		complete: function() {
			$('#button-confirm').button('reset');
		},
		success: function(json) {
		    if(json['redirect']) {
				location = json['redirect'];
			}
			else {
			    location = '<?php echo $continue; ?>';
			}
		}
	});
});
//--></script>

Теперь при нажатии кнопки "подтверждение заказа" проходит еще одна валидация, которая не допустит проблемы с минусовым наличием.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.