Списание со складов

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

не актуально для версии 2.9

В системе UMI.CMS склады введены в основном для наглядности и для удобства менеджерам, обрабатывающим заказ. В этой статье мы добавим данным параметрам функциональности и организуем списание со складов.

За основу возмём оригинальный метод order_edit, который выполняется при редактировании заказа. Поместим его в файл __custom_adm.php модуля emarket и переименуем, например в order_edit_custom. Добавляем свой код, который будет производить взаимодействие со складами, листинг метода будет выглядеть примерно следующим образом:

public function order_edit_custom() {
	$object = $this->expectObject("param0", true);
	$mode = (string) getRequest('param1');
	$objectId = $object->getId();
	$this->setHeaderLabel("header-users-edit-" . $this->getObjectTypeMethod($object));
	$this->checkSv($objectId);
	$inputData = Array(	"object"	=> $object,
	"allowed-element-types"	=> Array('emarket', 'order')
	);
	if($mode == "do") {
		$oldDeliveryPrice = $object->getValue('delivery_price');

//----------Наш код--------------------------------------------------------------------------
		$old_state=$object->getValue('status_id');
		$new_state=getRequest('data');
		$new_state=$new_state[$objectId]['status_id'];
		if(($new_state!=$old_state)&&(($new_state==91)||($new_state==85))){
			$items=$object->getValue('order_items');
			$items_count=count($items);
			$objectsCollection = umiObjectsCollection::getInstance();
			$hierarchy = umiHierarchy::getInstance();
			$variablja=Array();
			$var_arr=Array();
			for($i=0;$i<$items_count;$i++){
				$item=$objectsCollection ->getObject($items[$i]);
				$amo=$item->item_amount;
				$link_from_item_to_catalog=$item->getValue('item_link');
				$link_to_catalog=$link_from_item_to_catalog[0];
				$id_tovara=$link_to_catalog->id;
				$page_in_catalog = $hierarchy->getElement($id_tovara); 
				$store=$page_in_catalog->getValue('stores_state');
				$item_options=$item->getValue('options');
				$store_location='';
				$tempo=count($item_options);
				for($j=0;$j<$tempo;$j++){
					if($item_options[$j]['varchar']=="stores_state"){
						$store_location=$item_options[$j]['rel']; 
					}
				}
				for($j=0;$j<$tempo;$j++){
					if($store_location==$store[$j]['rel']){
						if($new_state==91){
							$store[$j]['int']-=$amo;
							settype($store[$j]['int'], "string");
						}else{
								$store[$j]['int']+=$amo;
							}
					}
				}
				$page_in_catalog->setValue('stores_state',$store);
				$page_in_catalog->commit();
			}
		}
//==========================================================================================
		$object = $this->saveEditedObjectData($inputData);
		
		$newDeliveryPrice = $object->getValue('delivery_price');
		
		$order = order::get($object->id);
		
		$amounts = getRequest('order-amount-item');
		$dels = getRequest('order-del-item');
		
		$isChanged = false;
		if(is_array($amounts)) foreach($amounts as $itemId => $amount) {
		$item = $order->getItem($itemId);
		if($item instanceof orderItem) {
		if($item->getAmount() != $amount) {
		$item->setAmount($amount);
		$item->commit();
		$isChanged = true;
		}
		}
		}
		
		if(is_array($dels)) foreach($dels as $itemId) {
		$item = orderItem::get($itemId);
		if($item instanceof orderItem) {
		$order->removeItem($item);
		$isChanged = true;
		}
		}
		
		if($isChanged) {
		$order->refresh();
		$order->commit();
		}
		
		if ($oldDeliveryPrice != $newDeliveryPrice && !$isChanged) {
		$originalPrice = $object->getValue('total_original_price');
		$totalPrice = $originalPrice;
		
		$discount = $order->getDiscount();
		if($discount instanceof discount) {
		$totalPrice = $discount->recalcPrice($originalPrice);
		}
		$totalPrice += $newDeliveryPrice;
		$object->setValue('total_price', $totalPrice);
		$object->commit();
		}
		
		$this->chooseRedirect();
	}
	
	$this->setDataType("form");
	$this->setActionType("modify");
	
	$data = $this->prepareData($inputData, "object");
	
	$this->setData($data);
	return $this->doData();
}

Здесь мы добавили проверку на изменение статуса заказа и в зависимости от этого условия выполянется код. В данном случае, при изменении статуса заказа на "Готов" (id статуса 91) будет происходить списание со склада, а при изменении на статус "Отменён" (id статуса 85) возврат товара на стклад. Можно поставить эти параметры на своё усмотрение. Теперь ещё один очень важный момент, этот метод должен каким то образом запускаться, для этого изменим action формы редактирования заказа. Для этого отредактируем файл ~/styles/skins/mac/data/modules/emarket/form.modify.xsl добавив в него шаблон

	<xsl:template match="data[@type = 'form' and (@action = 'modify' or @action = 'create')]">
		
		<form method="post" action="/admin/emarket/order_edit_custom/{object/@id}/do/" enctype="multipart/form-data">
			<input type="hidden" name="referer" value="{/result/@referer-uri}" id="form-referer" />
			<input type="hidden" name="domain" value="{$domain-floated}"/>

			<xsl:apply-templates mode="form-modify" />
			<xsl:apply-templates select="page" mode="permissions" />

			<xsl:if test="@action = 'modify' and count(page) = 1">
				<xsl:apply-templates select="document(concat('udata://backup/backup_panel/', page/@id))/udata" />
			</xsl:if>
		</form>
	</xsl:template>

без него форма редактирования выводится по стандартному шаблону.

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