Списание товара со склада выбранного покупателем и с учетом опциональных свойств товара

Материал из Umicms
Перейти к:навигация, поиск

Актуально для 2.9.5.


Задача: расширить функционал списания со складов описанный в статье Списание со складов


Решение:

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

В данной статье мы постараемся учесть озвученные моменты.

1) По статье Выбор склада при покупке товара предоставим покупателю право выбора пункта выдачи заказа.
2) По статье Списание со складов реализуем списание товаров.
3) Внесем следующие изменения для метода public function storesReact($event){}:
обращаем внимание, что строка №18 в приведенном ниже листинге кода должна быть удалена.

 1 foreach($itemsArray as $item){
 2 
 3 	$catalogObject = $item->getItemElement();
 4 	$catalogObjectId = $catalogObject->id;
 5 	$itemAmount = $item->getAmount();
 6 
 7         // Получаем опции товара
 8 	$options = $item->getValue("options");
 9 	for ($i=0, $countOptions = count($options); $i < $countOptions; $i++ ) {
10 		if ($options[$i]['varchar'] == 'stores_state') {
11                         // Создаем двумерный массив с данными по каждому товару с учетом опций 
12 			$optionRel = $options[$i]['rel'];
13 			if (!isset($optionRel)) $data[$catalogObjectId][] = $itemAmount;
14 				else $data[$catalogObjectId][$optionRel] = $itemAmount;
15 		}
16 	}
17 
18 	$data[$catalogObjectId] = $itemAmount; // данную строку необходимо удалить
19 }

4) внесем изменение в метод protected function changeAllAmounts($mode='w', $data){}:
обращаем внимание, что строка №5 в приведенном ниже листинге кода должна быть удалена.

 1 foreach ($data as $id => $amountArr){
 2 	$catalogItem = $umiHierarchy->getElement($id);
 3 	$stores = $catalogItem->getValue('stores_state');
 4 
 5         $storeId = self::getStoreId($stores); // данная строка должна быть удалена
 6 
 7 	// добавленно с целью учета одного товара, но с разными опциями
 8 	foreach ($amountArr as $rel => $amountItem) 
 9 		$changed = self::changeAmount($mode, $id, $rel, $amountItem);
10 }

5) внесем изменения в метод protected function changeAmount($mode = 'w', $itemId, $storeId, $amount = 1){}:
обращаем внимание, что строки №1-2 в приведенном ниже листинге кода должны быть удалены, а также необходимо заменить цикл foreach из оригинальной статьи на указанный в листинге.

 1 if (!isset($currentValue) || !isset($key)) // данную строку необходимо удалить
 2 	return false; // данную строку необходимо удалить
 3 
 4 // добавлено значение по умолчанию в случае, если склады для товара не заведены
 5 if (!isset($currentValue)) $currentValue = 0;
 6 
 7 foreach ($stores as $store){
 8 	if (!isset($store['int'])) $store['int'] = 0;
 9 	$storesNow[] = array('int' => $store['int'], 'float' => (float) 1, 'rel' => $store['rel']);
10 }

6) метод protected function getStoreId(){} можно удалить, так как в нашем случае он не используется.

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