Как автоматически отключать выгрузку определенных заказов

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

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

Задача

Как известно, любой оформленный заказа сразу получает галочку "Выгружать заказ в 1С при следующем сеансе связи". Если Вы хотите, чтобы заказы с определенным типом оплаты или доставки, а также заказы с определенным статусом на выгружались, то необходимо производить кастомизации.

Решение

Есть два способа повлиять на выгрузку заказов - использовать событийную модель или кастомизировать xslt шаблон выгрузки. Далее будет рассмотрено по примеру каждого способа.

Пример через обработчик события

Допустим, Вы хотите, чтобы после того, как Ваш менеджер проставил заказу статус "отклонен" или "Отменен", у заказа автоматически отключалась галочка "Выгружать заказ в 1С при следующем сеансе связи" и в 1С он не попадал.

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

Сначала дадим возможность управлять "выгружаемостью" заказов по статусам заказа.

Для этого зайдем в тип данных "Статус заказа" и добавим новое поле:

Add status field.png

Потом зайдем в тип данных "Статус заказа", как в справочник, и проставим галочки:

Use checkbox.png

Теперь перейдем к коду, добавим в файл /classes/modules/emarket/custom_events.php следующее:

new umiEventListener('systemModifyObject', 'emarket', 'checkStatusOnChange');

А в файл /classes/modules/emarket/__custom_adm.php добавим код кастомного обработчика:

public function checkStatusOnChange(iUmiEventPoint $eventPoint){	
	if ($eventPoint->getMode() == 'after') {
		$object = $eventPoint->getRef('object');
		
		if ($object->getTypeGUID() == 'emarket-order') {
			$object_id = $object->getId();
			$c_enabled_object = $object->getValue('need_export');
			$order = order::get($object_id);
			$objects_coll = umiObjectsCollection::getInstance();
			$status = $objects_coll->getObject($order->getOrderStatus());
			$c_enabled_status = $status->getValue('1c_enabled');
			
			if($c_enabled_status == null && $c_enabled_object == 1){
				$object->setValue('need_export', null);
				$object->commit();
			}else{
				return;
			}
		}else{
			return;
		}
	}else{
		return;
	}
}

После этого, если статус заказа будет измене через административную панель на "Отклонен" или "Отменен", то у заказа автоматически будет убрана галочка "Выгружать заказ в 1С при следующем сеансе связи".

Пример через кастомизацию шаблона

Допустим, Вы хотите, чтобы заказы, оплаченные платежной квитанцией вообще не попадали в 1С. Для этого, добавим в файл /xsl/export/custom/ordersCommerceML.xsl следующее:

<xsl:template match="object" mode="order">
	<xsl:param name="order_num" select="properties/group/property[@name='number']/value" />
	<xsl:param name="status_change_date" select="string(properties/group/property[@name='status_change_date']/value/@unix-timestamp)" />
	<xsl:param name="order_date" select="string(properties/group/property[@name='order_date']/value/@unix-timestamp)" />
	<xsl:param name="total_price" select="properties/group/property[@name='total_price']/value" />
	<xsl:param name="customer_id" select="properties/group/property[@name='customer_id']/value/item/@id" />
	<xsl:param name="customer_comments" select="properties/group/property[@name='comments']/value" />

	<xsl:param name="order_status_id" select="number(properties/group/property[@name='status_id']/value/item/@id)" />
	<xsl:param name="order_status" select="document(concat('uobject://', $order_status_id))/udata/object" />
	<xsl:param name="order_status_codename" select="string($order_status//property[@name='codename']/value)" />

	<xsl:param name="payment_date" select="string(properties/group/property[@name='payment_date']/value/@unix-timestamp)" />
	<xsl:param name="payment_document_num" select="string(properties/group/property[@name='payment_document_num']/value)" />
	<xsl:param name="payment_type" select="string(properties/group/property[@name='payment_id']/value)" />
	<xsl:param name="payment_status_id" select="number(properties/group/property[@name='payment_status_id']/value/item/@id)" />
	<xsl:param name="payment_status_codename" select="string(document(concat('uobject://', $payment_status_id))//property[@name='codename']/value)" />
	<xsl:param name="delivery_allow_date" select="string(properties/group/property[@name='delivery_allow_date']/value/@unix-timestamp)" />
	
	<xsl:param name="payment_type_name" select="string(properties/group/property[@name='payment_id']/value/item/@name)" />
	
	<xsl:if test="$payment_type_name != 'Платежная квитанция'">
		<Документ>
			<Ид><xsl:value-of select="@id" /></Ид>
			<Номер><xsl:value-of select="@id" /></Номер>
			<Дата>
				<xsl:if test="string-length($order_date)">
					<xsl:value-of select="php:function('date', 'Y-m-d', $order_date)" />
				</xsl:if>
			</Дата>
			<ХозОперация>Заказ товара</ХозОперация>
			<Роль>Продавец</Роль>
			<Валюта>руб</Валюта>
			<Курс>1</Курс>
			<Сумма><xsl:value-of select="$total_price" /></Сумма>
			<xsl:if test="string-length($order_date)">
				<Время><xsl:value-of select="php:function('date', 'H:i:s', $order_date)" /></Время>
			</xsl:if>
			<Комментарий>Заказ №<xsl:value-of select="$order_num" /></Комментарий>
			<xsl:if test="$customer_id">
				<Контрагенты>
					<xsl:apply-templates select="document(concat('uobject://', $customer_id))/udata/object" mode="customer" />
				</Контрагенты>
			</xsl:if>

			<Товары>
				<xsl:apply-templates select="properties/group/property[@name='delivery_price']/value" mode="delivery"/>
				<xsl:apply-templates select="properties/group/property[@name='order_items']/value/item" mode="order-item" />
			</Товары>

			<ЗначенияРеквизитов>
				<xsl:if test="string-length($payment_date)">
					<ЗначениеРеквизита>
						<Наименование>Дата оплаты</Наименование>
						<Значение><xsl:value-of select="php:function('date', 'Y-m-d', $payment_date)" /></Значение>
					</ЗначениеРеквизита>
				</xsl:if>

				<xsl:if test="string-length($payment_document_num)">
					<ЗначениеРеквизита>
						<Наименование>Номер платежного документа</Наименование>
						<Значение><xsl:value-of select="$payment_document_num" /></Значение>
					</ЗначениеРеквизита>
				</xsl:if>

				<xsl:if test="string-length($payment_type)">
					<ЗначениеРеквизита>
						<Наименование>Метод оплаты</Наименование>
						<Значение><xsl:value-of select="$payment_type_name" /></Значение>
					</ЗначениеРеквизита>
				</xsl:if>

				<xsl:if test="string-length($delivery_allow_date)">
					<ЗначениеРеквизита>
						<Наименование>Дата разрешения доставки</Наименование>
						<Значение><xsl:value-of select="php:function('date', 'Y-m-d', $delivery_allow_date)" /></Значение>
					</ЗначениеРеквизита>
					<ЗначениеРеквизита>
						<Наименование>Доставка разрешена</Наименование>
						<Значение>true</Значение>
					</ЗначениеРеквизита>
				</xsl:if>

				<ЗначениеРеквизита>
					<Наименование>Заказ оплачен</Наименование>
					<Значение>
						<xsl:choose>
							<xsl:when test="$payment_status_codename = 'accepted'">true</xsl:when>
							<xsl:otherwise>false</xsl:otherwise>
						</xsl:choose>
					</Значение>
				</ЗначениеРеквизита>

				<ЗначениеРеквизита>
					<Наименование>Отменен</Наименование>
					<Значение>
						<xsl:choose>
							<xsl:when test="$order_status_codename = 'canceled'">true</xsl:when>
							<xsl:otherwise>false</xsl:otherwise>
						</xsl:choose>
					</Значение>
				</ЗначениеРеквизита>

				<ЗначениеРеквизита>
					<Наименование>Финальный статус</Наименование>
					<Значение>
						<xsl:choose>
							<xsl:when test="$order_status_codename = 'ready'">true</xsl:when>
							<xsl:otherwise>false</xsl:otherwise>
						</xsl:choose>
					</Значение>
				</ЗначениеРеквизита>

				<ЗначениеРеквизита>
					<Наименование>Статус заказа</Наименование>
					<Значение><xsl:value-of select="$order_status/@name" /></Значение>
				</ЗначениеРеквизита>

				<xsl:if test="string-length($status_change_date)">
					<ЗначениеРеквизита>
						<Наименование>Дата изменения статуса</Наименование>
						<Значение><xsl:value-of select="php:function('date', 'Y-m-d H:i', $status_change_date)" /></Значение>
					</ЗначениеРеквизита>
				</xsl:if>
			</ЗначенияРеквизитов>
		</Документ>
	</xsl:if>
</xsl:template>

После этого в 1С заказы, у которых тип оплаты "Платежная квитанция", не попадут.