Закупочная цена из 1с в Bitrix
По умолчанию, при обмене 1с с сайтом, нет технической возможности установить «Закупочную цену» в специальное поле, отсюда приходится переносить её самому.
Данный класс охватывает события изменения цены, и цену с определённым id указывает в качестве закупочной данному товару.
namespace SiteEvent\Catalog;
use Bitrix\Catalog\Model\Product;
use Bitrix\Catalog\PriceTable;
use Bitrix\Main\Event;
use Bitrix\Main\EventManager;
class PriceMovePurchasing
{
const module = 'catalog';
static $priceId = null;
/**
* Инициализация событий
*
* @param $priceId
* @return bool
*/
public static function initEvents($priceId)
{
if (!is_numeric($priceId)) {
return false;
}
self::$priceId = $priceId;
$event = EventManager::getInstance();
$event->addEventHandler(
self::module,
'Bitrix\Catalog\Model\Price::OnBeforeUpdate',
[__CLASS__, 'OnBeforeUpdate']
);
$event->addEventHandler(
self::module,
'Bitrix\Catalog\Model\Price::OnBeforeAdd',
[__CLASS__, 'OnBeforeAdd']
);
$event->addEventHandler(
self::module,
'Bitrix\Catalog\Model\Price::OnBeforeDelete',
[__CLASS__, 'OnBeforeDelete']
);
// удаление через административный интерфейс
$event->addEventHandler(
self::module,
'OnBeforeProductPriceDelete',
[__CLASS__, 'OnBeforeDeleteAdmin']
);
return true;
}
/**
* @param Event $event
* id
* fields
* external_fields
* actions
*/
public static function OnBeforeUpdate(Event $event)
{
$arParams = $event->getParameters();
self::movePrice($arParams['fields']);
}
/**
* Добавление закупочной цены для товара
*
* @param $arFields
*/
protected static function movePrice($arFields)
{
if ($arFields['CATALOG_GROUP_ID'] == self::$priceId) {
$arData = [
'PURCHASING_PRICE' => $arFields['PRICE'],
'PURCHASING_CURRENCY' => $arFields['CURRENCY']
];
Product::update($arFields['PRODUCT_ID'], $arData);
}
}
/**
* @param Event $event
* data
*/
public static function OnBeforeAdd(Event $event)
{
$arParams = $event->getParameters();
self::movePrice($arParams['fields']);
}
/**
* @param Event $event
* id
*/
public static function OnBeforeDelete(Event $event)
{
$arParams = $event->getParameters();
$arPrice = PriceTable::getById($arParams['id'])->fetch();
self::deletePrice($arPrice);
}
/**
* Удаление закупочной цены у товара
*
* @param $arFields
*/
protected static function deletePrice($arFields)
{
if ($arFields['CATALOG_GROUP_ID'] == self::$priceId) {
$arData = [
'PURCHASING_PRICE' => '',
'PURCHASING_CURRENCY' => $arFields['CURRENCY']
];
Product::update($arFields['PRODUCT_ID'], $arData);
}
}
/**
* @param $ProductID
* @param $arExceptionIDs
*/
public static function OnBeforeDeleteAdmin($ProductID, $arExceptionIDs)
{
try {
$dbPrice = PriceTable::getList(
[
'filter' => [
'PRODUCT_ID' => $ProductID,
'!ID' => $arExceptionIDs
]
]
);
while ($arPrice = $dbPrice->fetch()) {
self::deletePrice($arPrice);
}
} catch (\Exception $e) {
}
}
}
Вызывается он в init.php, где $id — id цены, в которой находятся закупочные цены
\SiteEvent\Catalog\PriceMovePurchasing::initEvents($id);