Списание со складов — различия между версиями

Материал из Umicms
Перейти к:навигация, поиск
(Новая страница: «В системе UMI.CMS склады введены в основном для наглядности и для удобства менеджерам, обраба…»)
 
Строка 1: Строка 1:
В системе UMI.CMS склады введены в основном для наглядности и для удобства менеджерам, обрабатывающим заказ. Остатки по складам не несут в себе функциональной нагрузки. Попробуем добавить данным параметрам функциональности и организуем списание со складов.
+
В системе UMI.CMS склады введены в основном для наглядности и для удобства менеджерам, обрабатывающим заказ. Попробуем добавить данным параметрам функциональности и организуем списание со складов.
  
 
За основу возмём оригинальный метод order_edit, который выполняется при редактировании заказа. Поместим его в файл __custom_adm.php модуля emarket и переименуем, например в order_edit_custom.
 
За основу возмём оригинальный метод order_edit, который выполняется при редактировании заказа. Поместим его в файл __custom_adm.php модуля emarket и переименуем, например в order_edit_custom.

Версия 04:57, 2 мая 2012

В системе 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>

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

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