Your IP : 216.73.216.86


Current Path : /var/www/homesaver/www/bitrix/modules/webdebug.excel/admin/
Upload File :
Current File : /var/www/homesaver/www/bitrix/modules/webdebug.excel/admin/wd_excel2_do.php

<?
define("NO_KEEP_STATISTIC", true); 
define("NOT_CHECK_PERMISSIONS", true);
define("PUBLIC_AJAX_MODE", true); 
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_before.php");
CModule::IncludeModule('webdebug.excel');
IncludeModuleLangFile(__FILE__);
ignore_user_abort(false);

if (COption::GetOptionString('webdebug.excel','use_version')==1) {
	CWebdebugExcel2::ShowError(GetMessage('WEBDEBUG_EXCEL_ERROR_VERSION'));
	die();
}

define('WD_EXCEL2_NEXT', '<input type="hidden" name="wd_excel2_next" />');

$IsFirstStep = false;
if ($_POST['begin']=='Y') {
	$IsFirstStep = true;
}

// Check fields valid (and save data to session) on FIRST step
if ($IsFirstStep) {
	$IsProfileValid = false;
	$IsFileValid = false;
	$IsFileSiteValid = false;
	$IsFileCompValid = false;
	$ProfileID = false;
	$LoadType = false;
	// Check profile
	if (is_numeric($_POST['profile']) && $_POST['profile']>0) {
		$IsProfileValid = true;
		$ProfileID = $_POST['profile'];
	}
	$FileName = false;
	$LocalFileName = false;
	// Check file from site
	if ($_POST['wd_excel2_file_site']!='' && is_file($_SERVER['DOCUMENT_ROOT'].$_POST['wd_excel2_file_site']) && filesize($_SERVER['DOCUMENT_ROOT'].$_POST['wd_excel2_file_site'])>0) {
		$FileName = ToLower($_POST['wd_excel2_file_site']);
		// ToDo: CWebdebugExcel2::IsFileValid($FileName);
		if (substr($FileName,-4)=='.xls' || substr($FileName,-5)=='.xlsx' || substr($FileName,-7)=='.tar.gz') {
			$IsFileSiteValid = true;
		}
	}
	// Check file from computer
	if (is_array($_FILES['wd_excel2_file_comp']) && $_FILES['wd_excel2_file_comp']['error']==0 && $_FILES['wd_excel2_file_comp']['size']>0 && is_file($_FILES['wd_excel2_file_comp']['tmp_name'])) {
		$FileName = ToLower($_FILES['wd_excel2_file_comp']['name']);
		// ToDo: CWebdebugExcel2::IsFileValid($FileName);
		if (substr($FileName,-4)=='.xls' || substr($FileName,-5)=='.xlsx' || substr($FileName,-7)=='.tar.gz') {
			$IsFileCompValid = true;
		}
	}
	// General params
	$UploadDir = COption::GetOptionString('main','upload_dir','/upload/');
	$DataFileExt = COption::GetOptionString('webdebug.excel','data_file_ext');
	$Date = date('Y-m-d');
	$Uniq = ToLower(RandString(32));
	$FilePath = '/'.$UploadDir.'/webdebug.excel/'.$Date.'/';
	if (!is_dir($_SERVER['DOCUMENT_ROOT'].$FilePath)) {
		mkdir($_SERVER['DOCUMENT_ROOT'].$FilePath, BX_DIR_PERMISSIONS, true);
	}
	// Check which file will be used
	if ($IsFileCompValid) {
		$UploadedFileName = ToLower($_FILES['wd_excel2_file_comp']['name']);
		if (substr($UploadedFileName,-7)=='.tar.gz') {
			require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/classes/general/tar_gz.php');
			$Archiver = new CArchiver($_FILES['wd_excel2_file_comp']['tmp_name']);
			$Archiver->extractFiles($_SERVER['DOCUMENT_ROOT'].$FilePath);
			$FileName = $FilePath.substr($UploadedFileName,0,-7).'.'.$DataFileExt;
			#die($FileName);
			$LoadType = 'EXCEL';
		} else {
			$FileExt = '';
			if (substr($UploadedFileName,-4)=='.xls') {
				$FileExt = '.xls';
			} elseif (substr($UploadedFileName,-5)=='.xlsx') {
				$FileExt = '.xlsx';
			}
			$FileName = $FilePath.$Uniq.$FileExt;
			if (!move_uploaded_file($_FILES['wd_excel2_file_comp']['tmp_name'], $_SERVER['DOCUMENT_ROOT'].$FileName)) {
				die('Error');
			}
			$LoadType = 'EXCEL';
		}
		$IsFileValid = true;
	} elseif ($IsFileSiteValid) {
		$FileName = $_POST['wd_excel2_file_site'];
		$IsFileValid = true;
		$LoadType = 'EXCEL';
	}
	/*
	elseif (CWebdebugExcel2::IsFileValid($_POST['wd_excel2_file_site'],$LocalFileName,false)) {
		$FileName = $LocalFileName;
		$IsFileValid = true;
		$LoadType = 'EXCEL';
	}
	*/
	if ($FileName==false && !is_file($_SERVER['DOCUMENT_ROOT'].$FileName) || filesize($_SERVER['DOCUMENT_ROOT'].$FileName)==0) {
		print sprintf(GetMessage('WEBDEBUG_EXCEL_OPEN_FILE_ERROR'),$FileName);
		die();
	}
	$arFile = CFile::MakeFileArray($_SERVER['DOCUMENT_ROOT'].$FileName);
	$_SESSION['WEBDEBUG_EXCEL']['STATUS'][$ProfileID] = array(
		'ID' => ToUpper($Uniq),
		'LOAD_TYPE' => $LoadType,
		'FILE_NAME' => $FileName,
		'FILE_SIZE' => CFile::FormatSize($arFile['size']),
		'FILE_PATH' => $FilePath,
		'FILE_EXT' => $DataFileExt,
		'TIME_START' => CWebdebugExcel2::GetMicroTime(),
		'DATE' => $Date,
		'STEP' => $LoadType=='EXCEL' ? 'EXCEL' : 'ARRAY',
		'EXPORT' => $_POST['export']=='Y' ? true : false,
		'ERRORS_COUNT' => '0',
		'COUNT' => false,
	);
	print GetMessage('WEBDEBUG_EXCEL_FILE_LOADED').'<br/><br/>';
	print GetMessage('WEBDEBUG_EXCEL_FILE_SIZE').' <b>'.$_SESSION['WEBDEBUG_EXCEL']['STATUS'][$ProfileID]['FILE_SIZE'].'</b><br/>';
	print WD_EXCEL2_NEXT;
	die();
} else {
	CWebdebugExcel2::StartTimeCounter();
	$ProfileID = $_POST['profile'];
	if (is_numeric($ProfileID) && $ProfileID>0) {
		$resProfile = CWebdebugExcel2Profile::GetByID($ProfileID);
		if ($arFields = $resProfile->GetNext()) {
			$arFields['PARAMS'] = trim($arFields['~PARAMS'])!='' ? unserialize($arFields['~PARAMS']) : array();
			$arFields['MATCHES'] = trim($arFields['~MATCHES'])!='' ? unserialize($arFields['~MATCHES']) : array();
		}
		$arStatus = &$_SESSION['WEBDEBUG_EXCEL']['STATUS'][$ProfileID];
		$bJustArray = ToLower(CWebdebugExcel2::substr($arStatus['FILE_NAME'],-7))=='.tar.gz' && $arStatus['STEP']=='EXCEL';
		$bJustData = ToLower(CWebdebugExcel2::substr($arStatus['FILE_NAME'],-4))=='.dat' && $arStatus['STEP']=='EXCEL';
		switch($arStatus['STEP']) {
			// Step of transform Excel -> tar.gz
			case 'EXCEL':
				if ($bJustArray) {
					$arStepResult['FILE'] = CWebdebugExcel2::ExtractTagGz($arStatus['FILE_NAME']);
					$arStepResult['STATUS'] = 'DONE';
				} elseif ($bJustData) {
					$arStepResult['FILE'] = $arStatus['FILE_NAME'];
					$arStepResult['STATUS'] = 'DONE';
				} else {
					$arStepResult = CWebdebugExcel2::NextStep_Excel($arStatus, $arFields['STEPTIME']);
				}
				if ($arStepResult['STATUS']=='DONE') {
					$arStatus['STEP'] = 'ARRAY';
					$arStatus['ARRAY_FILE'] = $arStepResult['FILE'];
					if ($_POST['export']=='Y') {
						// exporting:
						$RelPath = CWebdebugExcel2::LoadingFilesRelPath($arStatus['DATE']);
						$ArcFileName = $RelPath.$arStatus['ID'].'.tar';
						$UseCompression = true;
						if(!extension_loaded('zlib') || !function_exists('gzcompress')) $UseCompression = false;
						if ($UseCompression) $ArcFileName .= '.gz';
						require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/classes/general/tar_gz.php');
						$Archiver = new CArchiver($_SERVER['DOCUMENT_ROOT'].$ArcFileName, $UseCompression);
						$Archiver->Add('"'.$_SERVER['DOCUMENT_ROOT'].$arStepResult['FILE'].'"', false, $_SERVER['DOCUMENT_ROOT'].$RelPath);
						$arStatus['DOWNLOAD_ARC_FILE'] = $ArcFileName;
						$arStatus['CURR_SHEET'] = false;
						$arStatus['LAST_ROW'] = false;
						print GetMessage('WEBDEBUG_EXCEL_TRANSFORM_COMPLETE');
						print '<div class="download_excel_to_tar_gz"><a href="'.$ArcFileName.'" target="_blank">'.GetMessage('WEBDEBUG_EXCEL_DOWNLOAD_TAR_GZ').' ('.CFile::FormatSize(filesize($_SERVER['DOCUMENT_ROOT'].$ArcFileName)).')</a></div>';
						if ($_POST['colors']=='Y') {
							$arFileData = unserialize(file_get_contents($_SERVER['DOCUMENT_ROOT'].$arStepResult['FILE']));
							if (is_array($arFileData) && is_array($arFileData['SHEETS'])) {
								foreach($arFileData['SHEETS'] as $SheetIndex => $arSheet) {
									if (is_array($arSheet['COLORS'])) {
										if (count($arSheet['COLORS'])==1 && $arSheet['COLORS']['000000']==='000000') unset($arSheet['COLORS']['000000']);
										if (!empty($arSheet['COLORS'])) {
											print('<div class="sheet_colors_title">'.GetMessage('WEBDEBUG_EXCEL_SHEET_COLORS_TITLE').' #'.$SheetIndex.' ('.$arSheet['NAME'].'):</div>');
											foreach($arSheet['COLORS'] as $ColorKey => $strColor) {
												if (in_array($strColor,array('FFFFFF','000000'))) {
													unset($arSheet['COLORS'][$ColorKey]);
												}
											}
											if (!empty($arSheet['COLORS'])) {
												print '<ul class="sheet_colors">';
												foreach($arSheet['COLORS'] as $strColor) {
													print '<li>#<code>'.$strColor.'</code><span style="background:#'.$strColor.'; font-size:0; line-height:18px; vertical-align:middle;"> </span></li>';
												}
												print '</ul> <br/>';
											}
										}
									}
								}
							}
						}
						@unlink($_SERVER['DOCUMENT_ROOT'].$arStepResult['FILE']);
						unset($arStepResult['FILE']);
					} else {
						print GetMessage('WEBDEBUG_EXCEL_FILE_TRANSFORMED');
						CWebdebugExcel2::ShowProgress($arStatus['COUNT']);
						$arStatus['COUNT'] = false;
						print WD_EXCEL2_NEXT;
					}
					foreach(GetModuleEvents("webdebug.excel", "OnEndFileTransformationStep", true) as $arEvent) {
						if (ExecuteModuleEventEx($arEvent, array(&$arFields, &$arStatus))===false) $Cancel = true;
					}
				} else {
					print GetMessage('WEBDEBUG_EXCEL_STEP1_CONTINUE');
					CWebdebugExcel2::ShowProgress($arStatus['COUNT']);
					print WD_EXCEL2_NEXT;
				}
				die();
				break;
			// Step of load items from transformed files
			case 'ARRAY':
				$arModesList = CWebdebugExcel2::GetModesList();
				if (is_array($arModesList[$arFields['MODE']]) && trim($arModesList[$arFields['MODE']]['PATH'])!='' && is_file($_SERVER['DOCUMENT_ROOT'].$arModesList[$arFields['MODE']]['PATH'])) {
					$Action = 'next_step';
					$Next = false;
					$File = $arStatus['ARRAY_FILE'];
					$File = file_get_contents($_SERVER['DOCUMENT_ROOT'].$File);
					$File = unserialize($File);
					// Подсчет кол-ва
					if (!is_array($arStatus['COUNT']) || empty($arStatus['COUNT'])) {
						foreach($File['SHEETS'] as $SheetIndex => $arSheet) {
							$arStatus['COUNT'][$SheetIndex] = array(
								'NAME' => $arSheet['NAME'],
								'ROWS' => count($arSheet['ITEMS']),
								'CURR' => 0,
								'DONE' => false,
							);
						}
					}
					// Create IBlock session property
					$SheetIndex = 0;
					while (isset($arFields['MATCHES']['SHEET_'.$SheetIndex.'_ACTIVE'])) {
						if ($arFields['MATCHES']['SHEET_'.$SheetIndex.'_ACTIVE']=='Y') {
							$IBlockID = IntVal($arFields['MATCHES']['IBLOCK_ID_FOR_SHEET_'.$SheetIndex]);
							if ($IBlockID>0) {
								CWebdebugExcel2::CreateImportIdProperty($IBlockID);
							}
						}
						$SheetIndex++;
					}
					//
					$ShowPropertyType = COption::GetOptionString('webdebug.excel','show_property_type')=='Y';
					// Connect mode handler
					require_once($_SERVER['DOCUMENT_ROOT'].$arModesList[$arFields['MODE']]['PATH']);
					if ($Next) {
						print GetMessage('WEBDEBUG_EXCEL_STEP2_CONTINUE');
						CWebdebugExcel2::ShowProgress($arStatus['COUNT']);
					} else {
						print GetMessage('WEBDEBUG_EXCEL_ACTIVATING');
						$arStatus['STEP'] = 'ACTIVATE';
						foreach(GetModuleEvents("webdebug.excel", "OnEndFileLoadingStep", true) as $arEvent) {
							if (ExecuteModuleEventEx($arEvent, array(&$arFields, &$arStatus))===false) $Cancel = true;
						}
					}
					print WD_EXCEL2_NEXT;
				} else {
					print GetMessage('WEBDEBUG_EXCEL_ERROR_MODE_FILE_NOT_FOUND');
				}
				die();
				break;
			// Step of activate products
			case 'ACTIVATE':
				CWebdebugExcel2::StartTimeCounter();
				if (CModule::IncludeModule('iblock')) {
					// Определяем соответствие инфоблоков и разделов листам в Excel
					$SheetIndex = 0;
					while (isset($arFields['MATCHES']['SHEET_'.$SheetIndex.'_ACTIVE'])) {
						if ($arFields['MATCHES']['SHEET_'.$SheetIndex.'_ACTIVE']=='Y') {
							$intIBlockID = IntVal($arFields['MATCHES']['IBLOCK_ID_FOR_SHEET_'.$SheetIndex]);
							if ($intIBlockID>0) {
								$intSectionID = IntVal($arFields['MATCHES']['SECTION_ID_FOR_SHEET_'.$SheetIndex]);
								// Устанавливаем флаг активности товаров
								if ($arFields['PARAMS']['ACTIVATE_LOADED_ELEMENTS']=='Y') {
									$arSort = array('TIMESTAMP_X'=>'ASC');
									$arFilter = array(
										'IBLOCK_ID' => $intIBlockID,
										'PROPERTY_'.CWebdebugExcel2::ImportIDPropCode => $arStatus['ID'],
										'ACTIVE' => 'N',
									);
									if ($intSectionID>0) {
										$arFilter['SECTION_ID'] = $intSectionID;
										$arFilter['INCLUDE_SUBSECTIONS'] = 'Y';
									}
									$resItems = CIBlockElement::GetList($arSort,$arFilter,false,false,array('ID'));
									$IBlockElement = new CIBlockElement;
									while ($arItem = $resItems->GetNext(false,false)) {
										$IBlockElement->Update($arItem['ID'], array('ACTIVE'=>'Y'));
										if (CWebdebugExcel2::CheckTimeIsOver($arFields['STEPTIME'])) {
											print GetMessage('WEBDEBUG_EXCEL_ACTIVATING');
											print WD_EXCEL2_NEXT;
											die();
										}
									}
								}
								// Устанавливаем флаг активности торговых предложений
								if ($arFields['PARAMS']['ACTIVATE_LOADED_ELEMENTS']=='Y') {
									$intOffersIBlockID = IntVal(CWebdebugExcel2::GetOffersIBlockID($intIBlockID));
									if ($intOffersIBlockID>0) {
										$arSort = array('TIMESTAMP_X'=>'ASC');
										$arFilter = array(
											'IBLOCK_ID' => $intOffersIBlockID,
											'PROPERTY_'.CWebdebugExcel2::ImportIDPropCode => $arStatus['ID'],
											'ACTIVE' => 'N',
										);
										$resItems = CIBlockElement::GetList($arSort,$arFilter,false,false,array('ID'));
										while ($arItem = $resItems->GetNext(false,false)) {
											$IBlockElement->Update($arItem['ID'], array('ACTIVE'=>'Y'));
											if (CWebdebugExcel2::CheckTimeIsOver($arFields['STEPTIME'])) {
												print GetMessage('WEBDEBUG_EXCEL_ACTIVATING');
												print WD_EXCEL2_NEXT;
												die();
											}
										}
									}
								}
								// Устанавливаем флаг активности разделов
								if ($arFields['PARAMS']['ACTIVATE_LOADED_SECTIONS']=='Y') {
									$arSort = array('TIMESTAMP_X'=>'ASC');
									$arFilter = array(
										'IBLOCK_ID' => $intIBlockID,
										'UF_'.CWebdebugExcel2::ImportIDPropCode => $arStatus['ID'],
										'ACTIVE' => 'N',
									);
									$resSections = CIBlockSection::GetList($arSort,$arFilter,false,array('ID'));
									$IBlockSection = new CIBlockSection;
									while ($arSection = $resSections->GetNext(false,false)) {
										$IBlockSection->Update($arSection['ID'], array('ACTIVE'=>'Y'));
										if (CWebdebugExcel2::CheckTimeIsOver($arFields['STEPTIME'])) {
											print GetMessage('WEBDEBUG_EXCEL_ACTIVATING');
											print WD_EXCEL2_NEXT;
											die();
										}
									}
								}
							}
						}
						$SheetIndex++;
					}
				}
				print GetMessage('WEBDEBUG_EXCEL_DEACTIVATING');
				$arStatus['STEP'] = 'DEACTIVATE';
				print WD_EXCEL2_NEXT;
				foreach(GetModuleEvents("webdebug.excel", "OnEndActivateStep", true) as $arEvent) {
					if (ExecuteModuleEventEx($arEvent, array(&$arFields, &$arStatus))===false) $Cancel = true;
				}
				die();
				break;
			// Step of deactivate products
			case 'DEACTIVATE':
				CWebdebugExcel2::StartTimeCounter();
				if (CModule::IncludeModule('iblock')) {
					// Определяем соответствие инфоблоков и разделов листам в Excel
					$SheetIndex = 0;
					while (isset($arFields['MATCHES']['SHEET_'.$SheetIndex.'_ACTIVE'])) {
						if ($arFields['MATCHES']['SHEET_'.$SheetIndex.'_ACTIVE']=='Y') {
							$intIBlockID = IntVal($arFields['MATCHES']['IBLOCK_ID_FOR_SHEET_'.$SheetIndex]);
							if ($intIBlockID>0) {
								$intSectionID = IntVal($arFields['MATCHES']['SECTION_ID_FOR_SHEET_'.$SheetIndex]);
								// Снимаем флаг активности товаров
								if ($arFields['PARAMS']['DEACTIVATE_MISSING_ELEMENTS']=='Y') {
									$arSort = array('TIMESTAMP_X'=>'ASC');
									$arFilter = array(
										'IBLOCK_ID' => $intIBlockID,
										'!PROPERTY_'.CWebdebugExcel2::ImportIDPropCode => $arStatus['ID'],
										'ACTIVE' => 'Y',
									);
									if ($intSectionID>0) {
										$arFilter['SECTION_ID'] = $intSectionID;
										$arFilter['INCLUDE_SUBSECTIONS'] = 'Y';
									}
									$resItems = CIBlockElement::GetList($arSort,$arFilter,false,false,array('ID'));
									$IBlockElement = new CIBlockElement;
									while ($arItem = $resItems->GetNext(false,false)) {
										$IBlockElement->Update($arItem['ID'], array('ACTIVE'=>'N'));
										if (CWebdebugExcel2::CheckTimeIsOver($arFields['STEPTIME'])) {
											print GetMessage('WEBDEBUG_EXCEL_DEACTIVATING');
											print WD_EXCEL2_NEXT;
											die();
										}
									}
								}
								// Снимаем флаг активности торговых предложений
								if ($arFields['PARAMS']['DEACTIVATE_MISSING_ELEMENTS']=='Y') {
									$intOffersIBlockID = IntVal(CWebdebugExcel2::GetOffersIBlockID($intIBlockID));
									if ($intOffersIBlockID>0) {
										$arSort = array('TIMESTAMP_X'=>'ASC');
										$arFilter = array(
											'IBLOCK_ID' => $intOffersIBlockID,
											'!PROPERTY_'.CWebdebugExcel2::ImportIDPropCode => $arStatus['ID'],
											'ACTIVE' => 'Y',
										);
										$resItems = CIBlockElement::GetList($arSort,$arFilter,false,false,array('ID'));
										while ($arItem = $resItems->GetNext(false,false)) {
											$IBlockElement->Update($arItem['ID'], array('ACTIVE'=>'N'));
											if (CWebdebugExcel2::CheckTimeIsOver($arFields['STEPTIME'])) {
												print GetMessage('WEBDEBUG_EXCEL_DEACTIVATING');
												print WD_EXCEL2_NEXT;
												die();
											}
										}
									}
								}
								// Снимаем флаг активности разделов
								if ($arFields['PARAMS']['DEACTIVATE_MISSING_SECTIONS']=='Y') {
									$arSort = array('TIMESTAMP_X'=>'ASC');
									$arFilter = array(
										'IBLOCK_ID'=>$intIBlockID,
										'ACTIVE'=>'Y',
										array( // Bitrix bug
											'LOGIC' => 'OR',
											array('!UF_'.CWebdebugExcel2::ImportIDPropCode=>$arStatus['ID']),
											array('UF_'.CWebdebugExcel2::ImportIDPropCode=>false),
										)
									);
									$resSections = CIBlockSection::GetList($arSort,$arFilter,false,array('ID','NAME','UF_'.CWebdebugExcel2::ImportIDPropCode));
									$IBlockSection = new CIBlockSection;
									while ($arSection = $resSections->GetNext(false,false)) {
										$IBlockSection->Update($arSection['ID'], array('ACTIVE'=>'N'));
										if (CWebdebugExcel2::CheckTimeIsOver($arFields['STEPTIME'])) {
											print GetMessage('WEBDEBUG_EXCEL_DEACTIVATING');
											print WD_EXCEL2_NEXT;
											die();
										}
									}
								}
							}
						}
						$SheetIndex++;
					}
				}
				$arStatus['STEP'] = 'STORES';
				print GetMessage('WEBDEBUG_EXCEL_STORESPROCESS');
				print WD_EXCEL2_NEXT;
				foreach(GetModuleEvents("webdebug.excel", "OnEndDeactivateStep", true) as $arEvent) {
					if (ExecuteModuleEventEx($arEvent, array(&$arFields, &$arStatus))===false) $Cancel = true;
				}
				die();
				break;
			// Step of process stores settings
			case 'STORES':
				CWebdebugExcel2::StartTimeCounter();
				if ($arFields['PARAMS']['LINK_TO_STORE']=='Y' && $arFields['PARAMS']['CATALOG_STORE']>0) {
					if (CModule::IncludeModule('iblock')) {
						// Определяем соответствие инфоблоков и разделов листам в Excel
						$SheetIndex = 0;
						while (isset($arFields['MATCHES']['SHEET_'.$SheetIndex.'_ACTIVE'])) {
							if ($arFields['MATCHES']['SHEET_'.$SheetIndex.'_ACTIVE']=='Y') {
								$intIBlockID = IntVal($arFields['MATCHES']['IBLOCK_ID_FOR_SHEET_'.$SheetIndex]);
								if ($intIBlockID>0) {
									// Создаем служебное свойство
									
									$resEnum = CIBlockPropertyEnum::GetList(array(),array('IBLOCK_ID'=>$intIBlockID,'PROPERTY_ID'=>$arProp['ID'],'XML_ID'=>'Y'));
									if ($arEnum = $resEnum->GetNext(false,false)) {
										$PropEnumID = $arEnum['ID'];
									}
									
									if ($PropEnumID>0) {
										$PropCode = CWebdebugExcel2::StoresProcessedPropCode;
										// Выбираем нужный раздел
										$intSectionID = IntVal($arFields['MATCHES']['SECTION_ID_FOR_SHEET_'.$SheetIndex]);
										// Обработка складов для товаров
										$arSort = array('ID'=>'ASC');
										$arFilter = array(
											'IBLOCK_ID' => $intIBlockID,
											'!PROPERTY_'.CWebdebugExcel2::ImportIDPropCode => $arStatus['ID'],
											'PROPERTY_'.$PropCode => false,
											'>ID' => IntVal($arStatus['STORES_LAST_ID']),
										);
										if ($intSectionID>0) {
											$arFilter['SECTION_ID'] = $intSectionID;
											$arFilter['INCLUDE_SUBSECTIONS'] = 'Y';
										}
										$resItems = CIBlockElement::GetList($arSort,$arFilter,false,false,array('ID'));
										$IBlockElement = new CIBlockElement;
										while ($arItem = $resItems->GetNext(false,false)) {
											CWebdebugExcel2::Log('Item: '.$arItem['ID'].' - '.$arItem['IBLOCK_ID']);
											if (CWebdebugExcel2::SetProductStoreQuantity($arItem['ID'],$arFields['PARAMS']['CATALOG_STORE'],0)) {
												CIBlockElement::SetPropertyValuesEx($arItem['ID'], $intIBlockID, array($PropCode=>$PropEnumID));
												// Calculate whole qunatity
												if ($arFields['PARAMS']['CALCULATE_QUANTITY']=='Y') {
													CWebdebugExcel2::ProductRecalculateQuantity($arItem['ID']);
												}
											}
											$arStatus['STORES_LAST_ID'] = $arItem['ID'];
											if (CWebdebugExcel2::CheckTimeIsOver($arFields['STEPTIME'])) {
												print GetMessage('WEBDEBUG_EXCEL_STORESPROCESS');
												print WD_EXCEL2_NEXT;
												die();
											}
										}
										// Обработка складов для торговых предложений
										$intOffersIBlockID = IntVal(CWebdebugExcel2::GetOffersIBlockID($intIBlockID));
										if ($intOffersIBlockID>0) {
											$arSort = array('TIMESTAMP_X'=>'ASC');
											$arFilter = array(
												'IBLOCK_ID' => $intOffersIBlockID,
												'!PROPERTY_'.CWebdebugExcel2::ImportIDPropCode => $arStatus['ID'],
												'PROPERTY_'.$PropCode => false,
												'>ID' => IntVal($arStatus['STORES_OFFERS_LAST_ID']),
											);
											$resItems = CIBlockElement::GetList($arSort,$arFilter,false,false,array('ID'));
											while ($arItem = $resItems->GetNext(false,false)) {
												if (CWebdebugExcel2::SetProductStoreQuantity($arItem['ID'],$arFields['PARAMS']['CATALOG_STORE'],0)) {
													CIBlockElement::SetPropertyValuesEx($arItem['ID'], $intOffersIBlockID, array($PropCode=>$PropEnumID));
													// Calculate whole qunatity
													if ($arFields['PARAMS']['CALCULATE_QUANTITY']=='Y') {
														CWebdebugExcel2::ProductRecalculateQuantity($arItem['ID']);
													}
												}
												$arStatus['STORES_OFFERS_LAST_ID'] = $arItem['ID'];
												if (CWebdebugExcel2::CheckTimeIsOver($arFields['STEPTIME'])) {
													print GetMessage('WEBDEBUG_EXCEL_STORESPROCESS');
													print WD_EXCEL2_NEXT;
													die();
												}
											}
										}
									}
								}
							}
							$SheetIndex++;
						}
						foreach(GetModuleEvents("webdebug.excel", "OnEndStoresStep", true) as $arEvent) {
							if (ExecuteModuleEventEx($arEvent, array(&$arFields, &$arStatus))===false) $Cancel = true;
						}
					}
				}
				print GetMessage('WEBDEBUG_EXCEL_CLEARQUANTITY');
				$arStatus['STEP'] = 'CLEARQUANTITY';
				print WD_EXCEL2_NEXT;
				die();
				break;
			// Step of clear quantity
			case 'CLEARQUANTITY':
				CWebdebugExcel2::StartTimeCounter();
				if ($arFields['PARAMS']['CLEAR_QUANTITY_MISSING']=='Y' && CModule::IncludeModule('iblock') && CModule::IncludeModule('catalog')) {
					// Определяем соответствие инфоблоков и разделов листам в Excel
					$SheetIndex = 0;
					while (isset($arFields['MATCHES']['SHEET_'.$SheetIndex.'_ACTIVE'])) {
						if ($arFields['MATCHES']['SHEET_'.$SheetIndex.'_ACTIVE']=='Y') {
							$intIBlockID = IntVal($arFields['MATCHES']['IBLOCK_ID_FOR_SHEET_'.$SheetIndex]);
							if ($intIBlockID>0) {
								$intSectionID = IntVal($arFields['MATCHES']['SECTION_ID_FOR_SHEET_'.$SheetIndex]);
								// Обнуляем остаток для товаров
								$arSort = array('TIMESTAMP_X'=>'ASC');
								$arFilter = array(
									'IBLOCK_ID' => $intIBlockID,
									'!PROPERTY_'.CWebdebugExcel2::ImportIDPropCode => $arStatus['ID'],
								);
								if ($intSectionID>0) {
									$arFilter['SECTION_ID'] = $intSectionID;
									$arFilter['INCLUDE_SUBSECTIONS'] = 'Y';
								}
								$resItems = CIBlockElement::GetList($arSort,$arFilter,false,false,array('ID'));
								while ($arItem = $resItems->GetNext(false,false)) {
									CCatalogProduct::Update($arItem['ID'],array('QUANTITY'=>'0'));
									if (CWebdebugExcel2::CheckTimeIsOver($arFields['STEPTIME'])) {
										print GetMessage('WEBDEBUG_EXCEL_CLEARQUANTITY');
										print WD_EXCEL2_NEXT;
										die();
									}
								}
								// Обнуляем остаток для торговых предложений
								$intOffersIBlockID = IntVal(CWebdebugExcel2::GetOffersIBlockID($intIBlockID));
								if ($intOffersIBlockID>0) {
									$arSort = array('TIMESTAMP_X'=>'ASC');
									$arFilter = array(
										'IBLOCK_ID' => $intOffersIBlockID,
										'!PROPERTY_'.CWebdebugExcel2::ImportIDPropCode => $arStatus['ID'],
									);
									$resItems = CIBlockElement::GetList($arSort,$arFilter,false,false,array('ID'));
									while ($arItem = $resItems->GetNext(false,false)) {
										CCatalogProduct::Update($arItem['ID'],array('QUANTITY'=>'0'));
										if (CWebdebugExcel2::CheckTimeIsOver($arFields['STEPTIME'])) {
											print GetMessage('WEBDEBUG_EXCEL_CLEARQUANTITY');
											print WD_EXCEL2_NEXT;
											die();
										}
									}
								}
							}
						}
						$SheetIndex++;
					}
				}
				print GetMessage('WEBDEBUG_EXCEL_COMPLETING');
				$arStatus['STEP'] = 'DONE';
				print WD_EXCEL2_NEXT;
				die();
				break;
			case 'DONE':
				unset($_SESSION['WEBDEBUG_EXCEL']['STATUS'][$ProfileID]); // ???
				print GetMessage('WEBDEBUG_EXCEL_COMPLETE');
				print sprintf(GetMessage('WEBDEBUG_EXCEL_ERRORS_COUNT'),IntVal($arStatus['ERRORS_COUNT']));
				$WebdebugExcel2Profile = new CWebdebugExcel2Profile;
				$WebdebugExcel2Profile->Update($ProfileID, array('DATE_SUCCESS'=>date(CDatabase::DateFormatToPHP(FORMAT_DATETIME))));
				foreach(GetModuleEvents('webdebug.excel', 'OnImportDone', true) as $arEvent) {
					ExecuteModuleEventEx($arEvent, array($arFields));
				}
				die();
				break;
		}
	}
}

?>