2017-09-04 11:36:04 +03:00
|
|
|
<?php
|
|
|
|
IncludeModuleLangFile(__FILE__);
|
2024-04-29 11:44:31 +03:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @category RetailCRM
|
|
|
|
* @package RetailCRM\Inventories
|
|
|
|
* @author RetailCRM <integration@retailcrm.ru>
|
|
|
|
* @license MIT
|
|
|
|
* @link http://retailcrm.ru
|
|
|
|
* @see http://retailcrm.ru/docs
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Class RetailCrmInventories
|
|
|
|
*
|
|
|
|
* @category RetailCRM
|
|
|
|
* @package RetailCRM\Inventories
|
|
|
|
*/
|
2017-09-04 11:36:04 +03:00
|
|
|
class RetailCrmInventories
|
|
|
|
{
|
|
|
|
public static $pageSize = 500;
|
|
|
|
|
|
|
|
public static function inventoriesUpload()
|
|
|
|
{
|
|
|
|
if (!CModule::IncludeModule('iblock')) {
|
|
|
|
RCrmActions::eventLog('RetailCrmHistory::orderHistory', 'iblock', 'module not found');
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (!CModule::IncludeModule('sale')) {
|
|
|
|
RCrmActions::eventLog('RetailCrmHistory::orderHistory', 'sale', 'module not found');
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (!CModule::IncludeModule('catalog')) {
|
|
|
|
RCrmActions::eventLog('RetailCrmHistory::orderHistory', 'catalog', 'module not found');
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2020-04-24 13:18:18 +03:00
|
|
|
$api = new RetailCrm\ApiClient(RetailcrmConfigProvider::getApiUrl(), RetailcrmConfigProvider::getApiKey());
|
|
|
|
$infoBlocks = RetailcrmConfigProvider::getInfoblocksInventories();
|
|
|
|
$stores = RetailcrmConfigProvider::getStores();
|
|
|
|
$shops = RetailcrmConfigProvider::getShops();
|
2017-09-04 11:36:04 +03:00
|
|
|
|
|
|
|
try {
|
|
|
|
$inventoriesList = $api->storesList()->stores;
|
|
|
|
} catch (\RetailCrm\Exception\CurlException $e) {
|
|
|
|
RCrmActions::eventLog(
|
|
|
|
'RetailCrmInventories::inventoriesUpload()', 'RetailCrm\ApiClient::storesList::CurlException',
|
|
|
|
$e->getCode() . ': ' . $e->getMessage()
|
|
|
|
);
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
$inventoriesType = array();
|
|
|
|
if (count($inventoriesList) > 0) {
|
|
|
|
foreach ($inventoriesList as $inventory) {
|
|
|
|
$inventoriesType[$inventory['code']] = $inventory['inventoryType'];
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
RCrmActions::eventLog('RetailCrmInventories::inventoriesUpload()', '$inventoriesList', 'Stores in crm not found');
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (count($shops) == 0) {
|
|
|
|
RCrmActions::eventLog('RetailCrmInventories::inventoriesUpload()', '$shops', 'No stores selected for download');
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (count($infoBlocks) > 0) {
|
|
|
|
foreach ($infoBlocks as $id) {
|
|
|
|
$iblockOffer = CCatalogSKU::GetInfoByProductIBlock($id);
|
|
|
|
|
|
|
|
$arNavStatParams = array(
|
|
|
|
'iNumPage' => 1,
|
|
|
|
'nPageSize' => self::$pageSize,
|
|
|
|
);
|
|
|
|
|
|
|
|
do {
|
|
|
|
$dbResProductsIds = CIBlockElement::GetList(array('ID'), array('IBLOCK_ID' => $id), false, $arNavStatParams, array('ID'));
|
|
|
|
$products = array();
|
|
|
|
while ($product = $dbResProductsIds->fetch()) {
|
|
|
|
$products[$product['ID']] = $product;
|
|
|
|
$products[$product['ID']]['offers'] = array();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!empty($iblockOffer['IBLOCK_ID'])) {
|
|
|
|
$arFilterOffer = array(
|
|
|
|
'IBLOCK_ID' => $iblockOffer['IBLOCK_ID'],
|
|
|
|
'PROPERTY_' . $iblockOffer['SKU_PROPERTY_ID'] => array_keys($products),
|
|
|
|
);
|
|
|
|
|
|
|
|
$dbResOffers = CIBlockElement::GetList(array('ID'), $arFilterOffer, false, false, array('ID', 'PROPERTY_' . $iblockOffer['SKU_PROPERTY_ID']));
|
|
|
|
while ($offer = $dbResOffers->fetch()) {
|
|
|
|
$products[$offer['PROPERTY_' . $iblockOffer['SKU_PROPERTY_ID'] . '_VALUE']]['offers'][] = $offer['ID'];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$elems = array();
|
2021-08-14 12:18:03 +03:00
|
|
|
$storesChunks = array_chunk($stores, 50, true);
|
|
|
|
foreach ($storesChunks as $storesChunk) {
|
2018-09-21 12:22:49 +03:00
|
|
|
foreach ($products as $product) {
|
|
|
|
if (count($product['offers']) > 0) {
|
|
|
|
$elems = array_merge($elems, $product['offers']);
|
|
|
|
} else {
|
|
|
|
$elems[] = $product['ID'];
|
|
|
|
}
|
2017-09-04 11:36:04 +03:00
|
|
|
}
|
2018-09-21 12:22:49 +03:00
|
|
|
|
|
|
|
$invUpload = array();
|
|
|
|
$dbStoreProduct = CCatalogStoreProduct::GetList(
|
|
|
|
array(),
|
2021-08-14 12:18:03 +03:00
|
|
|
array('PRODUCT_ID' => $elems, 'STORE_ID' => array_keys($storesChunk)),
|
2018-09-21 12:22:49 +03:00
|
|
|
false,
|
|
|
|
false,
|
|
|
|
array('PRODUCT_ID', 'STORE_ID', 'AMOUNT')
|
2017-09-04 11:36:04 +03:00
|
|
|
);
|
2018-09-21 12:22:49 +03:00
|
|
|
while ($arStoreProduct = $dbStoreProduct->Fetch()) {
|
|
|
|
if (!isset($invUpload[$arStoreProduct['PRODUCT_ID']])) {
|
|
|
|
$invUpload[$arStoreProduct['PRODUCT_ID']] = array(
|
|
|
|
'externalId' => $arStoreProduct['PRODUCT_ID']
|
|
|
|
);
|
|
|
|
}
|
|
|
|
$invUpload[$arStoreProduct['PRODUCT_ID']]['stores'][] = array(
|
2021-08-14 12:18:03 +03:00
|
|
|
'code' => $storesChunk[$arStoreProduct['STORE_ID']],
|
|
|
|
'available' => self::switchCount($arStoreProduct['AMOUNT'], $inventoriesType[$storesChunk[$arStoreProduct['STORE_ID']]]),
|
2018-09-21 12:22:49 +03:00
|
|
|
);
|
|
|
|
}
|
|
|
|
//for log
|
|
|
|
$splitedItems = array_chunk($invUpload, 200);
|
|
|
|
foreach ($splitedItems as $chunk) {
|
2020-04-24 13:18:18 +03:00
|
|
|
Logger::getInstance()->write($chunk, 'inventoriesUpload');
|
2018-09-21 12:22:49 +03:00
|
|
|
|
|
|
|
foreach ($shops as $shop) {
|
|
|
|
RCrmActions::apiMethod($api, 'storeInventoriesUpload', __METHOD__, $chunk, $shop);
|
|
|
|
time_nanosleep(0, 250000000);
|
|
|
|
}
|
2017-09-04 11:36:04 +03:00
|
|
|
}
|
|
|
|
|
2018-09-21 12:22:49 +03:00
|
|
|
$arNavStatParams['iNumPage'] = $dbResProductsIds->NavPageNomer + 1;
|
|
|
|
}
|
2017-09-04 11:36:04 +03:00
|
|
|
} while($dbResProductsIds->NavPageNomer < $dbResProductsIds->NavPageCount);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
RCrmActions::eventLog('RetailCrmInventories::inventoriesUpload()', '$infoBlocks', 'No iblocks selected');
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 'RetailCrmInventories::inventoriesUpload();';
|
|
|
|
}
|
|
|
|
|
|
|
|
public static function switchCount($val, $type)
|
|
|
|
{
|
|
|
|
if ($val < 0) {
|
|
|
|
$val = 0;
|
|
|
|
} elseif ($val > 999999) {
|
|
|
|
$val = 999999;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($type == 'available' && $val > 0) {
|
|
|
|
$val = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return $val;
|
|
|
|
}
|
2024-04-29 11:44:31 +03:00
|
|
|
}
|