Автоматический расчет цены комплекта в Битрикс

671
Алексей,
Автоматический расчет цены комплекта в Битрикс

Готовый скрипт для расчета цены комплекта по его составу, работает на cron.

Готовый скрипт для расчета цены комплекта по его составу, работает на cron.

$_SERVER['DOCUMENT_ROOT'] = __DIR__.'/../..';
error_reporting(0);
ini_set("display_errors", false);
ini_set("display_startup_errors", false);
ini_set('max_execution_time', 360);
define("NO_KEEP_STATISTIC", true);
define("PUBLIC_AJAX_MODE", true);
define("STOP_STATISTICS", true);
define("NO_AGENT_STATISTIC", true);
define("NO_AGENT_CHECK", true);
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");

\Bitrix\Main\Loader::includeModule('iblock');
\Bitrix\Main\Loader::includeModule('catalog');

// Проставляет цену комплектов по сумме цен товаров в составе

//echo '<pre>';
$productsIds = [];
$arSets = [];
$dbSets = CCatalogProductSet::getList( // получаем комплекты
	[],
	['TYPE' => CCatalogProductSet::TYPE_SET],
	false,
	false,
	['ID', 'OWNER_ID']
);
while ($arSet = $dbSets->GetNext()) {
	$arSetItems = CCatalogProductSet::getSetByID($arSet['ID']);
	if ($arSetItems['ITEMS']) {
		$arSets[$arSet['ID']] = $arSetItems;
		foreach ($arSetItems['ITEMS'] as $arItem) {
			$productsIds[] = $arItem['ITEM_ID'];
		}
	}
}
$productsIds = array_unique($productsIds);

$dbPrices = \Bitrix\Catalog\Model\Price::getList([ // цена товаров
	'filter' => [
		'PRODUCT_ID' => $productsIds
	],
	'select' => [
		'PRODUCT_ID',
		'CATALOG_GROUP_ID',
		'PRICE'
	]
]);
while ($arPrice = $dbPrices->fetch()) {
	$arPrices[$arPrice['PRODUCT_ID']][$arPrice['CATALOG_GROUP_ID']] = $arPrice;
}

foreach ($arSets as $arSet) {
	$arSetPrices = [];
	foreach ($arSet["ITEMS"] as $arItem) { // считаем цену комплекта
		if ($arPrices[$arItem["ITEM_ID"]]) {
			foreach ($arPrices[$arItem["ITEM_ID"]] as $priceId => $arPrice) {
				$arSetPrices[$priceId] += $arItem["QUANTITY"]*$arPrice["PRICE"];
			}
		}
	}

	foreach ($arSetPrices as $priceId => $priceValue) {
		if ($arPrice = \Bitrix\Catalog\Model\Price::getList([ // текущая цена комплекта
			'filter' => [
				'PRODUCT_ID' => $arSet["OWNER_ID"],
				'CATALOG_GROUP_ID' => $priceId
			]
		])->fetch()) {
			\Bitrix\Catalog\Model\Price::update($arPrice['ID'], [ // обновляем цену
				'PRODUCT_ID' => $arSet["OWNER_ID"],
				'CATALOG_GROUP_ID' => $priceId,
				'PRICE' => $priceValue,
				'CURRENCY' => 'RUB' // todo: сделать проброс валюты из запроса цена товаров
			]);
		} else {
			\Bitrix\Catalog\Model\Price::add([ // добавляем
					'PRODUCT_ID' => $arSet["OWNER_ID"],
					'CATALOG_GROUP_ID' => $priceId,
					'PRICE' => $priceValue,
					'CURRENCY' => 'RUB' // todo: сделать проброс валюты из запроса цена товаров
			]);
		}
	}
}

echo 'done;';
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_after.php");

Создаёте файл /local/cron/sets-price.php и добавляете задачу в крон (раз в 4 часа):

0 */4 * * * php -f /path/to/site/local/cron/sets-price.php

Есть вопросы или нашли ошибку? Напишите комментарий (можно без регистрации), отвечать стараюсь быстро.

Опубликовано 14 ноября 2023 | Обновлено 24 января 2024
комплекты, готовый код, cron, цены, интернет-магазин
Поделиться
Комментарии
❮…❯
Авторизуйтесь чтобы получать уведомления об ответе
Готовый скрипт для расчета цены комплекта по его составу, работает на cron.