Битрикс. Типы цен и наценки
24.08.2018
Теги: CMS • Web-разработка • Битрикс • ИнтернетМагазин • КаталогТоваров • Настройка • Пользователь • ПраваДоступа
Для работы интернет-магазина необходимо установить цены, с которыми он будет работать. Если позволяет редакция продукта, то в каталоге можно использовать несколько типов цен, но при этом один из типов цен является базовым. Базовая цена — это цена, относительной которой рассчитываются все остальные цены системы.
Типы цен
По умолчанию в системе уже доступна Розничная цена, она же назначена и базовой. Давайте создадим еще два типа цен: для постоянных клиентов и оптовых покупателей. Но для начала надо создать две группы пользователей, потому что типы цен привязываются к группам.
В панели управления переходим в «Настройки • Пользователи • Группы пользователей» и создаем две новые группы:
- Постоянные покупатели
- Оптовые покупатели
Управление типами цен осуществляется на странице «Магазин • Настройки • Цены • Типы цен»:
Создаем два новых типа цен:
- Постоянный покупатель, код
REGULAR_BUYER
- Оптовый покупатель, код
WHOLESALE_BUYER
Обязательно указываем группы пользователей, которые имеют право на просмотр этой цены и на покупку по этой цене:
Теперь при редактировании товара можно кроме розничной цены задать еще и цену для постоянных клиентов и для оптовых покупателей:
Наценки
Наценки — заранее установленная величина в относительном выражении, на которую уменьшается или увеличивается цена товара. Наценки применяются к базовой цене при расчете других типов цен товара (базовую цену сменить невозможно). Каждая цена будет считаться по формуле:[Цена]=[Базовая цена]+[Базовая цена]*[Наценка в процентах/100]
Наценка может быть представлена как положительной, так и отрицательной величиной.
Переходим на страницу «Магазин • Настройки • Цены • Наценки» и создаем две наценки:
- Постоянный покупатель, наценка
-10%
- Оптовый покупатель, наценка
-20%
При редактировании наценки можно отметить checkbox «Пересчитать цены»:
После этого произойдёт автоматическое изменение цены для всех товаров, у которых применена эта наценка:
Примеры кода
// получаем тип цен с идентификатором $ID, включая языкозависимые параметры $result = CCatalogGroup::GetByID($ID); if ($result['CAN_ACCESS'] == 'Y') { echo 'Вы можете видеть цены типа '.$result['NAME_LANG'].'<br/>'; } if ($result['CAN_BUY'] == 'Y') { echo 'Вы можете покупать товары по ценам типа '.$result['NAME_LANG'].'<br/>'; }
// получаем типы цен с внутренним именем RETAIL $result = CCatalogGroup::GetList( array('SORT' => 'ASC'), array('NAME' => 'RETAIL') ); while ($arPriceType = $result->Fetch()) { echo $arPriceType['NAME_LANG'].' - '.$arPriceType['CAN_ACCESS'].'<br/>'; }
// получаем цену типа $PRICE_TYPE_ID для товара с идентификатором $PRODUCT_ID $result = CPrice::GetList( array(), array( 'PRODUCT_ID' => $PRODUCT_ID, 'CATALOG_GROUP_ID' => $PRICE_TYPE_ID ) ); if ($price = $result->Fetch()) { echo CurrencyFormat($price['PRICE'], $price['CURRENCY']); } else { echo 'Цена не найдена!'; }
Пример получения цены товара, в зависимости от того, авторизован пользователь или нет. И если авторизован — какой группе он принадлежит (постоянный покупатель или оптовый покупатель):
/* * Определяемся, какую цену товара будем показывать */ $productPrice = CurrencyFormat(0.0, 'RUB'); // это идентификатор типа цен BASE (розничная цена) $PRICE_TYPE_ID = PRICE_TYPE_BASE; // если пользователь авторизован, он может принадлежать группе «Постоянные покупатели» // или «Оптовые покупатели», а для таких пользователей надо показать цену со скидкой if ($USER->IsAuthorized()) { // массив групп, к которым принадлежит авторизованный пользователь $arGroups = $USER->GetUserGroupArray(); // если пользователь принадлежит группе «Постоянные покупатели» if (in_array(CATALOG_GROUP_REGULAR_BUYER, $arGroups)) { $PRICE_TYPE_ID = PRICE_TYPE_REGULAR_BUYER; } // если пользователь принадлежит группе «Оптовые покупатели» if (in_array(CATALOG_GROUP_WHOLESALE_BUYER, $arGroups)) { $PRICE_TYPE_ID = PRICE_TYPE_WHOLESALE_BUYER; } } // получаем цену товара: розничную, для постоянного покупателя или // для оптового покупателя — в зависимости от $PRICE_TYPE_ID $result = CPrice::GetList( array(), array( 'PRODUCT_ID' => $PRODUCT_ID, // идентификатор товара 'CATALOG_GROUP_ID' => $PRICE_TYPE_ID // идентификатор типа цены ) ); if ($temp = $result->Fetch()) { $productPrice = CurrencyFormat($temp['PRICE'], $temp['CURRENCY']); }
В коде выше использованы пять констант, которые определены в файле init.php
:
<?php /* * Файл local/php_interface/init.php */ define('DEFAULT_TEMPLATE_PATH', '/local/templates/.default'); // Идентификатор группы пользователей «Постоянные покупатели» define('CATALOG_GROUP_REGULAR_BUYER', 9); // Идентификатор группы пользователей «Оптовые покупатели» define('CATALOG_GROUP_WHOLESALE_BUYER', 10); // Идентификатор типа цен «Базовый» define('PRICE_TYPE_BASE', 1); // Идентификатор типа цен «Постоянные покупатели» define('PRICE_TYPE_REGULAR_BUYER', 2); // Идентификатор группы пользователей «Оптовые покупатели» define('PRICE_TYPE_WHOLESALE_BUYER', 3); function debug($data) { echo '<pre>' . print_r($data, true) . '</pre>'; }
База данных
-- -- Структура таблицы `b_catalog_group` -- CREATE TABLE `b_catalog_group` ( `ID` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, `NAME` varchar(100) COLLATE utf8_unicode_ci NOT NULL, `BASE` char(1) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'N', `SORT` int(11) NOT NULL DEFAULT '100', `XML_ID` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `TIMESTAMP_X` datetime DEFAULT NULL, `MODIFIED_BY` int(18) DEFAULT NULL, `DATE_CREATE` datetime DEFAULT NULL, `CREATED_BY` int(18) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- -- Дамп данных таблицы `b_catalog_group` -- INSERT INTO `b_catalog_group` (`ID`, `NAME`, `BASE`, `SORT`, `XML_ID`, `TIMESTAMP_X`, `MODIFIED_BY`, `DATE_CREATE`, `CREATED_BY`) VALUES (1, 'BASE', 'Y', 100, 'BASE', '2018-08-18 09:16:48', 1, '2018-08-18 09:12:58', 1), (2, 'REGULAR_BUYER', 'N', 100, '', '2018-08-24 16:17:27', 1, '2018-08-24 15:36:32', 1), (3, 'WHOLESALE_BUYER', 'N', 100, '', '2018-08-24 16:17:43', 1, '2018-08-24 15:45:09', 1);
ID
— уникальный индентификаторNAME
— внутреннее имя ценыBASE
— указывает на то, является ли этот тип цен базовымSORT
— число для сортировкиXML_ID
— идентификатор из 1С:Предприятие
-- -- Структура таблицы `b_catalog_price` -- CREATE TABLE `b_catalog_price` ( `ID` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, `PRODUCT_ID` int(11) NOT NULL, `EXTRA_ID` int(11) DEFAULT NULL, `CATALOG_GROUP_ID` int(11) NOT NULL, `PRICE` decimal(18,2) NOT NULL, `CURRENCY` char(3) COLLATE utf8_unicode_ci NOT NULL, `TIMESTAMP_X` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `QUANTITY_FROM` int(11) DEFAULT NULL, `QUANTITY_TO` int(11) DEFAULT NULL, `TMP_ID` varchar(40) COLLATE utf8_unicode_ci DEFAULT NULL, `PRICE_SCALE` decimal(26,12) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- -- Дамп данных таблицы `b_catalog_price` -- INSERT INTO `b_catalog_price` (`ID`, `PRODUCT_ID`, `EXTRA_ID`, `CATALOG_GROUP_ID`, `PRICE`, `CURRENCY`, `TIMESTAMP_X`, `QUANTITY_FROM`, `QUANTITY_TO`, `TMP_ID`, `PRICE_SCALE`) VALUES (314, 317, NULL, 1, '1000.00', 'RUB', '2018-08-18 09:24:19', NULL, NULL, NULL, '1000.000000000000'), (315, 318, NULL, 1, '2000.00', 'RUB', '2018-08-18 09:25:24', NULL, NULL, NULL, '2000.000000000000'), (316, 319, NULL, 1, '3000.00', 'RUB', '2018-08-18 09:25:59', NULL, NULL, NULL, '3000.000000000000'), (317, 320, NULL, 1, '4000.00', 'RUB', '2018-08-18 09:26:36', NULL, NULL, NULL, '4000.000000000000'), (318, 321, NULL, 1, '5000.00', 'RUB', '2018-08-18 09:27:03', NULL, NULL, NULL, '5000.000000000000'), (319, 322, NULL, 1, '1000.00', 'RUB', '2018-08-18 09:27:37', NULL, NULL, NULL, '1000.000000000000'), (320, 323, NULL, 1, '2000.00', 'RUB', '2018-08-18 09:28:12', NULL, NULL, NULL, '2000.000000000000'), (321, 324, NULL, 1, '3000.00', 'RUB', '2018-08-18 09:28:48', NULL, NULL, NULL, '3000.000000000000'), (322, 325, NULL, 1, '4000.00', 'RUB', '2018-08-18 09:29:17', NULL, NULL, NULL, '4000.000000000000'), (323, 326, NULL, 1, '5000.00', 'RUB', '2018-08-18 09:29:44', NULL, NULL, NULL, '5000.000000000000'), (324, 327, NULL, 1, '1000.00', 'RUB', '2018-08-18 09:30:17', NULL, NULL, NULL, '1000.000000000000'), (325, 328, NULL, 1, '2000.00', 'RUB', '2018-08-18 09:30:44', NULL, NULL, NULL, '2000.000000000000'), (326, 329, NULL, 1, '3000.00', 'RUB', '2018-08-18 09:31:14', NULL, NULL, NULL, '3000.000000000000'), (327, 330, NULL, 1, '4000.00', 'RUB', '2018-08-18 09:31:42', NULL, NULL, NULL, '4000.000000000000'), (328, 331, NULL, 1, '5000.00', 'RUB', '2018-08-18 09:32:05', NULL, NULL, NULL, '5000.000000000000'), (329, 332, NULL, 1, '1000.00', 'RUB', '2018-08-18 09:45:36', NULL, NULL, NULL, '1000.000000000000'), (330, 333, NULL, 1, '2000.00', 'RUB', '2018-08-18 09:46:03', NULL, NULL, NULL, '2000.000000000000'), (331, 334, NULL, 1, '3000.00', 'RUB', '2018-08-18 09:46:29', NULL, NULL, NULL, '3000.000000000000'), (332, 335, NULL, 1, '4000.00', 'RUB', '2018-08-18 09:46:55', NULL, NULL, NULL, '4000.000000000000'), (333, 336, NULL, 1, '4000.00', 'RUB', '2018-08-18 09:47:21', NULL, NULL, NULL, '4000.000000000000'), (334, 337, NULL, 1, '1000.00', 'RUB', '2018-08-18 09:47:59', NULL, NULL, NULL, '1000.000000000000'), (335, 338, NULL, 1, '1000.00', 'RUB', '2018-08-18 09:48:25', NULL, NULL, NULL, '1000.000000000000'), (336, 339, NULL, 1, '3000.00', 'RUB', '2018-08-18 09:48:49', NULL, NULL, NULL, '3000.000000000000'), (337, 340, NULL, 1, '4000.00', 'RUB', '2018-08-18 09:49:13', NULL, NULL, NULL, '4000.000000000000'), (338, 341, NULL, 1, '5000.00', 'RUB', '2018-08-18 09:49:40', NULL, NULL, NULL, '5000.000000000000'), (339, 342, NULL, 1, '1000.00', 'RUB', '2018-08-18 09:50:13', NULL, NULL, NULL, '1000.000000000000'), (340, 343, NULL, 1, '2000.00', 'RUB', '2018-08-18 09:50:43', NULL, NULL, NULL, '2000.000000000000'), (341, 344, NULL, 1, '3000.00', 'RUB', '2018-08-18 09:51:12', NULL, NULL, NULL, '3000.000000000000'), (342, 345, NULL, 1, '4000.00', 'RUB', '2018-08-18 09:51:43', NULL, NULL, NULL, '4000.000000000000'), (343, 346, NULL, 1, '5000.00', 'RUB', '2018-08-18 09:52:13', NULL, NULL, NULL, '5000.000000000000'), (344, 331, 1, 2, '4500.00', 'RUB', '2018-08-24 13:53:00', NULL, NULL, NULL, '4500.000000000000'), (345, 331, 2, 3, '4000.00', 'RUB', '2018-08-24 13:53:00', NULL, NULL, NULL, '4000.000000000000'), (346, 330, 1, 2, '3600.00', 'RUB', '2018-08-24 13:53:14', NULL, NULL, NULL, '3600.000000000000'), (347, 330, 2, 3, '3200.00', 'RUB', '2018-08-24 13:53:14', NULL, NULL, NULL, '3200.000000000000'), (348, 329, 1, 2, '2700.00', 'RUB', '2018-08-24 13:53:29', NULL, NULL, NULL, '2700.000000000000'), (349, 329, 2, 3, '2400.00', 'RUB', '2018-08-24 13:53:29', NULL, NULL, NULL, '2400.000000000000'), (350, 328, 1, 2, '1800.00', 'RUB', '2018-08-24 13:53:50', NULL, NULL, NULL, '1800.000000000000'), (351, 328, 2, 3, '1600.00', 'RUB', '2018-08-24 13:53:50', NULL, NULL, NULL, '1600.000000000000'), (352, 327, 1, 2, '900.00', 'RUB', '2018-08-24 13:54:03', NULL, NULL, NULL, '900.000000000000'), (353, 327, 2, 3, '800.00', 'RUB', '2018-08-24 13:54:03', NULL, NULL, NULL, '800.000000000000'), (354, 321, 1, 2, '4500.00', 'RUB', '2018-08-24 13:54:20', NULL, NULL, NULL, '4500.000000000000'), (355, 321, 2, 3, '4000.00', 'RUB', '2018-08-24 13:54:20', NULL, NULL, NULL, '4000.000000000000'), (356, 320, 1, 2, '3600.00', 'RUB', '2018-08-24 13:54:34', NULL, NULL, NULL, '3600.000000000000'), (357, 320, 2, 3, '3200.00', 'RUB', '2018-08-24 13:54:34', NULL, NULL, NULL, '3200.000000000000'), (358, 319, 1, 2, '2700.00', 'RUB', '2018-08-24 13:54:47', NULL, NULL, NULL, '2700.000000000000'), (359, 319, 2, 3, '2400.00', 'RUB', '2018-08-24 13:54:47', NULL, NULL, NULL, '2400.000000000000'), (360, 318, 1, 2, '1800.00', 'RUB', '2018-08-24 13:55:00', NULL, NULL, NULL, '1800.000000000000'), (361, 318, 2, 3, '1600.00', 'RUB', '2018-08-24 13:55:00', NULL, NULL, NULL, '1600.000000000000'), (362, 317, 1, 2, '900.00', 'RUB', '2018-08-24 13:55:12', NULL, NULL, NULL, '900.000000000000'), (363, 317, 2, 3, '800.00', 'RUB', '2018-08-24 13:55:12', NULL, NULL, NULL, '800.000000000000'), (364, 326, 1, 2, '4500.00', 'RUB', '2018-08-24 13:55:38', NULL, NULL, NULL, '4500.000000000000'), (365, 326, 2, 3, '4000.00', 'RUB', '2018-08-24 13:55:38', NULL, NULL, NULL, '4000.000000000000'), (366, 325, 1, 2, '3600.00', 'RUB', '2018-08-24 13:55:48', NULL, NULL, NULL, '3600.000000000000'), (367, 325, 2, 3, '3200.00', 'RUB', '2018-08-24 13:55:48', NULL, NULL, NULL, '3200.000000000000'), (368, 324, 1, 2, '2700.00', 'RUB', '2018-08-24 13:56:01', NULL, NULL, NULL, '2700.000000000000'), (369, 324, 2, 3, '2400.00', 'RUB', '2018-08-24 13:56:01', NULL, NULL, NULL, '2400.000000000000'), (370, 323, 1, 2, '1800.00', 'RUB', '2018-08-24 13:56:17', NULL, NULL, NULL, '1800.000000000000'), (371, 323, 2, 3, '1600.00', 'RUB', '2018-08-24 13:56:17', NULL, NULL, NULL, '1600.000000000000'), (372, 322, 1, 2, '900.00', 'RUB', '2018-08-24 13:56:30', NULL, NULL, NULL, '900.000000000000'), (373, 322, 2, 3, '800.00', 'RUB', '2018-08-24 13:56:30', NULL, NULL, NULL, '800.000000000000'), (374, 336, 1, 2, '3600.00', 'RUB', '2018-08-24 13:56:49', NULL, NULL, NULL, '3600.000000000000'), (375, 336, 2, 3, '3200.00', 'RUB', '2018-08-24 13:56:49', NULL, NULL, NULL, '3200.000000000000'), (376, 335, 1, 2, '3600.00', 'RUB', '2018-08-24 13:57:00', NULL, NULL, NULL, '3600.000000000000'), (377, 335, 2, 3, '3200.00', 'RUB', '2018-08-24 13:57:00', NULL, NULL, NULL, '3200.000000000000'), (378, 334, 1, 2, '2700.00', 'RUB', '2018-08-24 13:57:13', NULL, NULL, NULL, '2700.000000000000'), (379, 334, 2, 3, '2400.00', 'RUB', '2018-08-24 13:57:13', NULL, NULL, NULL, '2400.000000000000'), (380, 333, 1, 2, '1800.00', 'RUB', '2018-08-24 13:57:25', NULL, NULL, NULL, '1800.000000000000'), (381, 333, 2, 3, '1600.00', 'RUB', '2018-08-24 13:57:25', NULL, NULL, NULL, '1600.000000000000'), (382, 332, 1, 2, '900.00', 'RUB', '2018-08-24 13:57:37', NULL, NULL, NULL, '900.000000000000'), (383, 332, 2, 3, '800.00', 'RUB', '2018-08-24 13:57:37', NULL, NULL, NULL, '800.000000000000'), (384, 341, 1, 2, '4500.00', 'RUB', '2018-08-24 13:57:56', NULL, NULL, NULL, '4500.000000000000'), (385, 341, 2, 3, '4000.00', 'RUB', '2018-08-24 13:57:56', NULL, NULL, NULL, '4000.000000000000'), (386, 340, 1, 2, '3600.00', 'RUB', '2018-08-24 13:58:09', NULL, NULL, NULL, '3600.000000000000'), (387, 340, 2, 3, '3200.00', 'RUB', '2018-08-24 13:58:09', NULL, NULL, NULL, '3200.000000000000'), (388, 339, 1, 2, '2700.00', 'RUB', '2018-08-24 13:58:23', NULL, NULL, NULL, '2700.000000000000'), (389, 339, 2, 3, '2400.00', 'RUB', '2018-08-24 13:58:23', NULL, NULL, NULL, '2400.000000000000'), (390, 338, 1, 2, '900.00', 'RUB', '2018-08-24 13:58:35', NULL, NULL, NULL, '900.000000000000'), (391, 338, 2, 3, '800.00', 'RUB', '2018-08-24 13:58:35', NULL, NULL, NULL, '800.000000000000'), (392, 337, 1, 2, '900.00', 'RUB', '2018-08-24 13:58:47', NULL, NULL, NULL, '900.000000000000'), (393, 337, 2, 3, '800.00', 'RUB', '2018-08-24 13:58:47', NULL, NULL, NULL, '800.000000000000'), (394, 346, 1, 2, '4500.00', 'RUB', '2018-08-24 13:59:02', NULL, NULL, NULL, '4500.000000000000'), (395, 346, 2, 3, '4000.00', 'RUB', '2018-08-24 13:59:02', NULL, NULL, NULL, '4000.000000000000'), (396, 345, 1, 2, '3600.00', 'RUB', '2018-08-24 13:59:14', NULL, NULL, NULL, '3600.000000000000'), (397, 345, 2, 3, '3200.00', 'RUB', '2018-08-24 13:59:14', NULL, NULL, NULL, '3200.000000000000'), (398, 344, 1, 2, '2700.00', 'RUB', '2018-08-24 13:59:27', NULL, NULL, NULL, '2700.000000000000'), (399, 344, 2, 3, '2400.00', 'RUB', '2018-08-24 13:59:27', NULL, NULL, NULL, '2400.000000000000'), (400, 343, 1, 2, '1800.00', 'RUB', '2018-08-24 13:59:40', NULL, NULL, NULL, '1800.000000000000'), (401, 343, 2, 3, '1600.00', 'RUB', '2018-08-24 13:59:40', NULL, NULL, NULL, '1600.000000000000'), (402, 342, 1, 2, '900.00', 'RUB', '2018-08-24 13:59:59', NULL, NULL, NULL, '900.000000000000'), (403, 342, 2, 3, '800.00', 'RUB', '2018-08-24 13:59:59', NULL, NULL, NULL, '800.000000000000'); -- -- Индексы таблицы `b_catalog_price` -- ALTER TABLE `b_catalog_price` ADD KEY `IXS_CAT_PRICE_PID` (`PRODUCT_ID`,`CATALOG_GROUP_ID`), ADD KEY `IXS_CAT_PRICE_GID` (`CATALOG_GROUP_ID`), ADD KEY `IXS_CAT_PRICE_SCALE` (`PRICE_SCALE`);
ID
— уникальный индентификаторPRODUCT_ID
— идентификатор товараEXTRA_ID
— идентификатор наценкиCATALOG_GROUP_ID
— идентификатор типа ценPRICE
— ценаCURRENCY
— валюта
-- -- Структура таблицы `b_catalog_extra` -- CREATE TABLE `b_catalog_extra` ( `ID` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, `NAME` varchar(50) COLLATE utf8_unicode_ci NOT NULL, `PERCENTAGE` decimal(18,2) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- -- Дамп данных таблицы `b_catalog_extra` -- INSERT INTO `b_catalog_extra` (`ID`, `NAME`, `PERCENTAGE`) VALUES (1, 'Постоянный покупатель', '-10.00'), (2, 'Оптовый покупатель', '-20.00');
- Битрикс. Что такое FUSER_ID
- Битрикс. Настройки для торговых предложений
- Битрикс. Права доступа
- Магазин на Laravel 7, часть 9. Панель управления сайтом, авторизация администратора
- Битрикс. Пользователи и группы
- Битрикс. Файл .access.php
- Магазин на Laravel 7, часть 21. Добавляем профили и используем их при оформлении заказа
Поиск: CMS • Web-разработка • Битрикс • Интернет магазин • Каталог товаров • Наценки • Пользователь • Права доступа • Типы цен • Настройка