Дисконтные карты выдаются (либо генерируются автоматически) клиенту (необходим модуль CRM:Клиенты), в зависимости от уровня дисконтной карты клиенту могут предоставляются соответствующие скидки при оформлении заказа, также на дисконтной карте накапливаются бонусы.
Для управления дисконтными картами и уровнями дисконтной программы в основном меню выберите Контент → Интернет-магазины → выбрать магазин → Скидки → Дисконтные карты

При сохранении карты, если ее номер не указан, то генерируется в соответствии с шаблоном, указанным в атрибутах магазина. Уровень и сумму явно указывать нет необходимости, они автоматически рассчитаются по истории заказов выбранного клиента.

Бонусы начисляются на дисконтную карту клиента, при начислении можно указать период действия, а также тип зачисления:

Здесь же вы можете списать у клиента бонусы, поле списания содержит подсказку с суммой доступных бонусов.
Уровни дисконтных карт задают процент скидки и порядок следования уровней в иерархии дисконтной программы.

При добавлении уровня дисконтной карты задаются опции:

| Поле | Описание |
|---|---|
| Применять максимальную скидку | Вычисляем сумму скидок по скидкам от суммы заказа и по уровню дисконтной карты, применяется наибольшее из рассчитанных скидок |
| Округлять | Округлять примененную скидку до целых |
Для ускорения загрузки данных о картах реализован импорт и экспорт списка дисконтных карт.
Список карт экспортируется в CSV-файл в формате
"Номер карты";"Дата выдачи";"Логин клиента";"Накопленная сумма";"Уровень";"Скидка, %"
Внесите в поле импорта дисконтные карты в формате
номер карты;логин клиента;телефон клиента;идентификатор уровня;сумма
и нажмите Применить.
На дисконтную карту начисляются бонусы клиентов в соответствии с правилами начислений, заданных у бонуса. Максимальный размер списания бонусов указывается в атрибутах магазина.
Для настройки списания доступных бонусов клиента при заказе необходимо внести некоторые изменения в XSL-шаблон корзины и типовую динамическую страницу корзины.
Рассмотрим пример добавления, как на http://demoshop.hostcms.ru/
<form>, после поля добавления купона, добавляем блок:
<xsl:if test="siteuser_id > 0">
<xsl:variable name="available_bonuses">
<xsl:choose>
<xsl:when test="apply_bonuses/node()">
<xsl:value-of select="apply_bonuses" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="available_bonuses" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="apply_bonuses">
<xsl:choose>
<xsl:when test="apply_bonuses/node()">
<xsl:value-of select="apply_bonuses" />
</xsl:when>
<xsl:otherwise>
0
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<div class="col-6 col-sm-3">
<!-- Бонусы -->
<div class="shop-coupon">
<div>Бонусы, доступно <span class="bold"><xsl:value-of select="floor(available_bonuses - $apply_bonuses)"/></span></div>
<input class="form-control" name="bonuses" value="{floor($available_bonuses)}" type="text" />
</div>
</div>
</xsl:if>
// Запоминаем количество списываемых бонусов
if (!is_null(Core_Array::getRequest('bonuses')))
{
Core_Session::start();
$_SESSION['hostcmsOrder']['bonuses'] = trim(strval(Core_Array::getRequest('bonuses')));
}
$_SESSION['last_order_id'] = 0; добавляем строку $_SESSION['hostcmsOrder']['bonuses'] = trim(strval(Core_Array::getRequest('bonuses')));В личном кабинете клиента есть возможность вывести показ бонусов на 60 дней от текущей даты.

Рассмотрим пример добавления, как на http://demoshop.hostcms.ru/
ДисконтныеКарты. В темплейте <xsl:template match="shop_discountcard"> добавляем блок:
<xsl:if test="bonuses/node() and bonuses/@max">
<div class="row">
<div class="col-12">
<div class="bonuses-wrapper">
<xsl:for-each select="bonuses/day">
<xsl:variable name="bonus_value" select="."/>
<xsl:variable name="height" select="round($bonus_value * 100 div ../@max)"/>
<div class="bonuses-container">
<div class="bonuses-bar series-none" style="flex-basis: {100 - $height}%"></div>
<div class="bonuses-bar series-bonuses" style="flex-basis: {$height}%">
<xsl:if test="$bonus_value > 0">
<div class="bonuses-value"><xsl:value-of select="$bonus_value" /></div>
</xsl:if>
</div>
<div class="date"><xsl:value-of select="@date" /></div>
</div>
</xsl:for-each>
</div>
</div>
</div>
</xsl:if>
.bonuses-wrapper {
display: flex;
height: 50vh;
align-items: stretch;
max-width: 1000px;
overflow-x: scroll;
margin-top: 50px;
}
.bonuses-container {
flex: 1;
display: flex;
flex-direction: column;
align-items: stretch;
justify-content: flex-end;
margin-right: 2px;
}
.series-none { background: #ccc; }
.series-bonuses { background: #e91e63; text-align: center; }
.bonuses-container .date {
font-size: 9px;
margin-top: -15px;
color: #fff;
padding: 2px;
}
.bonuses-value {
font-size: 10px;
color: #fff;
margin-top: 5px;
}