• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/location/import/import.php
  • Класс: BitrixSaleLocationImportis
  • Вызов: is::importFile
static function importFile(&$descriptior)
{
	$timeLimit = ini_get('max_execution_time');
	if ($timeLimit < $descriptior['TIME_LIMIT']) set_time_limit($descriptior['TIME_LIMIT'] + 5);

	$endTime = time() + $descriptior['TIME_LIMIT'];

	if($descriptior['STEP'] == 'rebalance')
	{
		LocationLocationTable::resort();
		$descriptior['STEP'] = 'done';
	}

	if($descriptior['STEP'] == 'import')
	{
		if(!isset($descriptior['DO_SYNC']))
		{
			$res = BitrixSaleLocationLocationTable::getList(array('select' => array('CNT')))->fetch();
			$descriptior['DO_SYNC'] = intval($res['CNT'] > 0);
		}

		if(!isset($descriptior['TYPES']))
		{
			$descriptior['TYPES'] = static::getExistedTypes();
			$descriptior['SERVICES'] = static::getExistedServices();

			$descriptior['TYPE_MAP'] = static::getTypeMap($descriptior['TYPE_FILE']);
			$descriptior['SERVICE_MAP'] = static::getServiceMap($descriptior['SERVICE_FILE']);
		}

		$csvReader = new CSVReader();
		$csvReader->LoadFile($descriptior['FILE']);

		while(time() < $endTime)
		{
			$block = $csvReader->ReadBlockLowLevel($descriptior['POS']/*changed inside*/, 100);

			if(!count($block))
				break;

			foreach($block as $item)
			{
				if(!isset($descriptior['TYPES'][$item['TYPE_CODE']]))
					$descriptior['TYPES'][$item['TYPE_CODE']] = static::createType($descriptior['TYPE_MAP'][$item['TYPE_CODE']]);

				if($descriptior['DO_SYNC'])
				{
					$id = static::checkLocationCodeExists($item['CODE']);
					if($id)
					{
						$descriptior['CODES'][$item['CODE']] = $id;
						continue;
					}
				}

				// type
				$item['TYPE_ID'] = $descriptior['TYPES'][$item['TYPE_CODE']];
				unset($item['TYPE_CODE']);

				// parent id
				if(strlen($item['PARENT_CODE']))
				{
					if(!isset($descriptior['CODES'][$item['PARENT_CODE']]))
						$descriptior['CODES'][$item['PARENT_CODE']] = static::checkLocationCodeExists($item['PARENT_CODE']);

					$item['PARENT_ID'] = $descriptior['CODES'][$item['PARENT_CODE']];
				}
				unset($item['PARENT_CODE']);

				// ext
				if(is_array($item['EXT']))
				{
					foreach($item['EXT'] as $code => $values)
					{
						if(is_array($values) && !empty($values))
						{
							if(!isset($descriptior['SERVICES'][$code]))
							{
								$descriptior['SERVICES'][$code] = static::createService(array(
									'CODE' => $code
								));
							}

							foreach($values as $value)
							{
								if(!strlen($value))
									continue;

								$item['EXTERNAL'][] = array(
									'SERVICE_ID' => $descriptior['SERVICES'][$code],
									'XML_ID' => $value
								);
							}
						}
					}
				}
				unset($item['EXT']);

				$res = LocationLocationTable::add($item, array('REBALANCE' => false));
				if(!$res->isSuccess())
					throw new MainSystemException('Cannot create location');

				$descriptior['CODES'][$item['CODE']] = $res->getId();
			}
		}

		if(!count($block))
		{
			unset($descriptior['CODES']);
			$descriptior['STEP'] = 'rebalance';
		}
	}

	return $descriptior['STEP'] == 'done';
}