Цена с учетом опционных свойств при выгрузке заказов

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


Задача: По умолчанию при выгрузке заказов в 1С, цена за единицу товара указывается без учета цен выбранных опционных свойств. Реализуем выгрузку заказов с товарами, у которых цены за единицу будут указаны с учетом выбранных опционных свойств, то есть сумма цены товара и цен выбранных опций c учетом скидок.

Реализация: Единственное, что нужно сделать - это переопределить шаблон трансформации в формат CommerceML2.0 товара в заказе.
Файл \xsl\export\custom\ordersCommerceML.xsl должен выглядеть следующим образом:

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.0"
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:php="http://php.net/xsl"
	xmlns:udt="http://umi-cms.ru/2007/UData/templates"
	extension-element-prefixes="php"
	exclude-result-prefixes="xsl php udt">

    <xsl:template match="object" mode="order-item">
        <xsl:param name="good-id" select="properties/group/property[@name='item_link']/value/page/@id" />
        <xsl:param name="good" select="document(concat('upage://', $good-id))/udata/page" />
        <xsl:param name="item_price" select="properties/group/property[@name='item_price']/value" />
        <xsl:param name="item_amount" select="properties/group/property[@name='item_amount']/value" />
        <xsl:param name="item_total_price" select="properties/group/property[@name='item_total_price']/value" />
        <Товар>
            <xsl:choose>
                <xsl:when test="not($good)">
                    <Ид>
                        <xsl:value-of select="@id" />
                    </Ид>
                </xsl:when>
                <xsl:when test="$good//property[@name = '1c_product_id']/value">
                    <Ид>
                        <xsl:value-of select="$good//property[@name = '1c_product_id']/value" />
                    </Ид>
                </xsl:when>
                <xsl:otherwise>
                    <Ид>
                        <xsl:value-of select="$good-id" />
                    </Ид>
                </xsl:otherwise>
            </xsl:choose>
            <xsl:if test="$good//property[@name = '1c_catalog_id']/value">
                <ИдКаталога>
                    <xsl:value-of select="$good//property[@name = '1c_catalog_id']/value" />
                </ИдКаталога>
            </xsl:if>

            <Наименование>
                <xsl:value-of select="$good/name | @name" />
            </Наименование>
            <БазоваяЕдиница Код="796" НаименованиеПолное="Штука" МеждународноеСокращение="PCE">шт</БазоваяЕдиница>

            <ЦенаЗаЕдиницу>
                <xsl:variable name="sum_optioned" select="sum(properties//property[@type='optioned']/value/option/@float)"/>
                <xsl:variable name="origin_price" select="$sum_optioned + $item_price"/>
                <xsl:variable name="discount_procent">
                    <xsl:choose>
                        <xsl:when test="properties//property/value/item[@type-guid='emarket-discount']">
                            <xsl:apply-templates select="properties//property/value/item[@type-guid='emarket-discount']" mode="disc"/>
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:text>0</xsl:text>
                        </xsl:otherwise>
                    </xsl:choose>
                </xsl:variable>
                <xsl:value-of select="format-number($origin_price * ( (100 - number($discount_procent)) * 0.01 ), '#.##')"/>
            </ЦенаЗаЕдиницу>
            <Сумма>
                <xsl:value-of select="$item_total_price" />
            </Сумма>
            <Количество>
                <xsl:value-of select="$item_amount" />
            </Количество>
            <Единица>шт</Единица>
            <Коэффициент>1</Коэффициент>

            <ЗначенияРеквизитов>
                <ЗначениеРеквизита>
                    <Наименование>ВидНоменклатуры</Наименование>
                    <Значение>Товар</Значение>
                </ЗначениеРеквизита>
                <ЗначениеРеквизита>
                    <Наименование>ТипНоменклатуры</Наименование>
                    <Значение>Товар</Значение>
                </ЗначениеРеквизита>
            </ЗначенияРеквизитов>
        </Товар>
    </xsl:template>
    
    <xsl:template match="item" mode="disc">
        <xsl:variable name="discount_obj" select="document(concat('uobject://', @id))/udata"/>
        <xsl:variable name="discount_mod_id" select="$discount_obj//property[@name='discount_modificator_id']/value/item/@id"/>
        <xsl:variable name="discount_mod" select="document(concat('uobject://', $discount_mod_id))/udata"/>
        <xsl:variable name="discount_mod_proc" select="number($discount_mod//property[@type='float']/value)"/>
        <xsl:value-of select="$discount_mod_proc"/>
    </xsl:template>
    
</xsl:stylesheet>

Изменения коснулись узла <ЦенаЗаЕдиницу> и был добавлен шаблон для получения процента скидки <xsl:template match="item" mode="disc">