Jump to content
Sign in to follow this  
indaled

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

Recommended Posts

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

 

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

 

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

 

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

 

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

 

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

Edited by indaled

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
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>

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

Share this post


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
You are posting as a guest. If you have an account, please sign in.
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.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.