403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/cvetdv.ru/bitrix/modules/htmls.1c77exchange/classes/general/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/cvetdv.ru/bitrix/modules/htmls.1c77exchange/classes/general/processing.php
<?
/*******************************************************************************
* Module:   1Cv77Exchange                                                      *
* Version:  3.8.6                                                              *
* Author:   Alexey Andreev, HTMLStudio (www.htmls.ru, www.bx77.ru)             *
* License:  Shareware                                                          *
* Date:     2023-11-08                                                         *
* e-mail:   aav@htmls.ru                                                       *
*******************************************************************************/

//define("LOG_FILENAME", $_SERVER["DOCUMENT_ROOT"]."/bitrix/tmp/htmls.1c77exchange/log.txt"); - include.php
IncludeModuleLangFile(__FILE__);
CModule::IncludeModule("currency");
class CV7ExchangeProcessing extends CV7Exchange{
    
	function __construct(){
		$this->IP_LIST = explode(',', COption::GetOptionString("htmls.1c77exchange", "V77EXCHANGE_IP_LIST"));
		$this->CGI = COption::GetOptionString("htmls.1c77exchange", "V77EXCHANGE_PHPLikeCGI");
		$this->CHECK_IP = COption::GetOptionString("htmls.1c77exchange", "V77EXCHANGE_CHECK_IP");
		$this->TMP_FOLDER = $_SERVER['DOCUMENT_ROOT'] . "/bitrix/tmp/htmls.1c77exchange/";
		$this->USE_ZIP = COption::GetOptionString("catalog", "1C_USE_ZIP", "Y");
		$this->IMG_FOLDER = COption::GetOptionString("htmls.1c77exchange", "V77EXCHANGE_IMG_IMPORT_FOLDER");
        $this->IMG_SUBFOLDER = COption::GetOptionString("htmls.1c77exchange", "V77EXCHANGE_IMG_IMPORT_SUBFOLDER", '');
        $this->IMG_MULTI = COption::GetOptionString("htmls.1c77exchange", "V77EXCHANGE_IMG_IMPORT_MULTI", "N");
		$this->IMG_TYPE = explode(',', COption::GetOptionString("htmls.1c77exchange", "V77EXCHANGE_IMG_IMPORT_TYPES", "jpg,jpeg,png,gif"));
		$this->IMG_LOG = COption::GetOptionString("htmls.1c77exchange", "V77EXCHANGE_IMG_IMPORT_LOG");
		$this->KEEP_STR = COption::GetOptionString("htmls.1c77exchange", "V77EXCHANGE_KEEP_LOCAL_CATALOG_STRUCTURE", "N");
		$this->UPD_NAME = COption::GetOptionString("htmls.1c77exchange", "V77EXCHANGE_CATALOG_UPDATE_NAME", "Y");
		$this->IMG_DEL = COption::GetOptionString("htmls.1c77exchange", "V77EXCHANGE_IMG_IMPORT_DELETE");
        $this->NEGATIVE_AMOUNT_TRACE = COption::GetOptionString("catalog", "allow_negative_amount", "N");
        $this->CAN_BUY_ZERO = COption::GetOptionString("catalog", "default_can_buy_zero", "N");
        $this->FINAL_ORDERS = COption::GetOptionString("sale", '1C_EXPORT_FINAL_ORDERS', 'N');

        //$this->__AddMessage2Log(__LINE__, $this->TMP_FOLDER);
        //$this->__AddMessage2Log(__LINE__, $this->USE_ZIP);
		//f(defined('BUSINESS_EDITION') && 'Y' == BUSINESS_EDITION){
		if (!CBXFeatures::IsFeatureEnabled('CatMultiStore')){
			$this->BASE_EDITION = true;
		}
		else{
			$this->BASE_EDITION = false;
		}
        $this->USE_STORE = COption::GetOptionString("htmls.1c77exchange", "V77EXCHANGE_USE_STORE", "N");
        $this->USE_SKU = COption::GetOptionString("htmls.1c77exchange", "V77EXCHANGE_USE_SKU", "N");
		//$this->IMG_METHOD = COption::GetOptionString("htmls.1c77exchange", "V77EXCHANGE_IMG_IMPORT_METHOD");
        $this->Base64 = COption::GetOptionString("htmls.1c77exchange", "V77EXCHANGE_CATALOG_USE_BASE64", "N");

		if(!is_dir($_SERVER['DOCUMENT_ROOT'] . "/bitrix/tmp/"))
			mkdir($_SERVER['DOCUMENT_ROOT'] . "/bitrix/tmp/");

		if(!is_dir($_SERVER['DOCUMENT_ROOT'] . "/bitrix/tmp/htmls.1c77exchange/"))
			mkdir($_SERVER['DOCUMENT_ROOT'] . "/bitrix/tmp/htmls.1c77exchange/");

		if(file_exists($this->TMP_FOLDER . 'cache.txt')){
			$fname = $this->TMP_FOLDER . 'cache.txt';
			$handle = fopen($fname, "rb");
			$arStr = fread($handle, filesize($fname));
			$this->CACHE = unserialize($arStr);
		}

		/*if(file_exists($this->TMP_FOLDER . 'noimg.csv')){
			$fname = $this->TMP_FOLDER . 'noimg.csv';
			$handle = fopen($fname, "rb");
			$arStr = fread($handle, filesize($fname));
			$this->NO_IMGS = unserialize($arStr);      avm36.pro
	}*/
	}

	function Upload(){
		$headers = $this->emu_getallheaders();
		$res = $this->Check($headers);

    	$r = $res[0];
		if(!$r) die('Access Denied! - ' . $res[1]);
		// get zip for import
		$data = file_get_contents("php://input");
		if ( empty($data) ){ die('error getting file');}

		if(file_exists($this->TMP_FOLDER . 'cache.txt')){
			@unlink($this->TMP_FOLDER . 'cache.txt');
		}
		if(file_exists($this->TMP_FOLDER . 'noimg.csv')){
			@unlink($this->TMP_FOLDER . 'noimg.csv');
		}

		$name = $_REQUEST['filename'];
    	if(file_put_contents($this->TMP_FOLDER . $name, $data) > 0){
		    if(strpos($name, '.jpg') > 0){
		      $folder = $_SERVER["DOCUMENT_ROOT"] . $this->IMG_FOLDER;
              if(copy($this->TMP_FOLDER . $name, $folder . $name)){
                @unlink($this->TMP_FOLDER . $name);
                echo "success";
              }
              else
                echo "failure";
		    }
			else{
			  if($this->USE_ZIP == 'Y'){
    				$zip = zip_open($this->TMP_FOLDER . $name);
    				if ($zip) {
    					while ($zip_entry = zip_read($zip)) {
    						if (zip_entry_open($zip, $zip_entry, "r")) {
    							$buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
    							file_put_contents($this->TMP_FOLDER . zip_entry_name($zip_entry), $buf);
    		    					zip_entry_close($zip_entry);
    						}
    					}
    					zip_close($zip);
    				}
    				@unlink($this->TMP_FOLDER . $name);
    		  }
    		  echo "success";
            }
		}
		else
			echo "File " . $name . " not uploaded";
	}

	function Import(){
		global $USER;
		$headers = $this->emu_getallheaders();
		$res = $this->Check($headers);
		$r = $res[0];
		if(!$r) die('Access Denied! - ' . $res[1]);

		$file = $_REQUEST['filename'];
		if($file == 'md_catalog.csv') $this->ImportMD($file);
		if($file == 'ib_iblocks.csv') $this->ImportIB($file);
		if(substr($file, 0, 8) == 'sections') $this->ImportSEC($file, $headers['cnt']);
		if(substr($file, 0, 7) == 'catalog') $this->ImportCatalog($file, $headers['cnt']);
		if(substr($file, 0, 6) == 'offers') $this->ImportOffers($file, $headers['cnt']);
        if(substr($file, 0, 12) == 'store_offers') $this->ImportStoreOffers($file, $headers['cnt']);
		if($file == 'del.csv') $this->DeleteElemSec($headers['cnt']);
        if($file == 'fin.csv') $this->fin($headers['cnt']);
	}

	function ImportOffLine(){
		global $USER;
		$headers = $this->emu_getallheaders();
		$res = $this->Check($headers);
		$r = $res[0];
		if(!$r) die('Access Denied! - ' . $res[1]);
		//$file = $_REQUEST['filename'];
        if(file_exists($this->TMP_FOLDER . 'md_properties.csv')){
        	$file = 'md_catalog.csv';
        	$this->ImportMD($file);
        	//return;
        }
        if(file_exists($this->TMP_FOLDER . 'ib_iblocks.csv')){
        	$file = 'ib_iblocks.csv';
        	$this->ImportIB($file);
        	//return;
        }
        for($s=0;$s<1000;$s++){
        	if(file_exists($this->TMP_FOLDER . 'sections'.$s.'.csv')){
        		$file = 'sections'.$s.'.csv';
        		$this->ImportSEC($file, $headers['cnt']);
        		//return;
        	}

       }
        for($c=0;$c<5000;$c++){
        	if(file_exists($this->TMP_FOLDER . 'catalog'.$c.'.csv')){
        		$file = 'catalog'.$c.'.csv';
        		$this->ImportCatalog($file, $headers['cnt']);
        		//return;
        	}
        }

       for($o=0;$o<10000;$o++){
        	if(file_exists($this->TMP_FOLDER . 'offers'.$o.'.csv')){
        		$file = 'offers'.$o.'.csv';
        		$this->ImportOffers($file, $headers['cnt']);
        		//return;
        	}
        }

		$this->DeleteElemSec();
	}

	//import metadata - start
	function ImportCatalogID($file = 'md_catalog.csv'){
		$ar = $this->ParseCSV($file);
		$arResult['CATALOG_ID'] = $ar[0]['CATALOG_ID'];
		$arResult['CATALOG_NAME'] = $ar[0]['CATALOG_NAME'];
		return $arResult;
	}

    function getMeasureList(){
        $arMeasure = array();
        $res = CCatalogMeasure::getList();
        while ($arItem = $res->Fetch()){
            $arMeasure[$arItem['CODE']] = $arItem['ID'];
        }
        return $arMeasure;
    }

	function ImportMD($file){
		global $DB, $USER, $MESS;
		$ar = $this->ParseCSV($file);
		$arResult['CATALOG_ID'] = $ar[0]['CATALOG_ID'];
		$arResult['CATALOG_NAME'] = $ar[0]['CATALOG_NAME'];
        $cache = $this->CACHE;
        if(!is_array($cache)){
            $cache = array();
        }
		$ar = $this->ParseCSV("md_properties.csv");
        $arCAT = array();
        $arSKU = array();
        //AddMessage2Log(print_r($ar, 1), "htmls.1c77exchange");
		foreach($ar as $k => $prop){

			if($prop['TYPE'] == 'L'){
				$list = $this->ParseCSV("md_" . strtolower($prop['CODE']) . ".csv");
                if ($list){
                    $arList = array();
                    foreach($list as $val)
                        $arList[$val['XML_ID']] = $val['VALUE'];
                    $ar[$k]['LIST'] = $arList;
                    @unlink($this->TMP_FOLDER . "md_" . strtolower($prop['CODE']) . ".csv");
                }
			}
            if($prop['TYPE'] == 'LC'){
				//$list = $this->ParseCSV("md_" . strtolower($prop['CODE']) . ".csv");
                //if ($list){
                    $arList = array();
                    //foreach($list as $val)
                        $arList[$ar[$k]['CODE']] = 1;
                    $ar[$k]['LIST'] = $arList;

                    @unlink($this->TMP_FOLDER . "md_" . strtolower($prop['CODE']) . ".csv");
                //}
			}
            if($prop['ibTYPE'] == 'SKU'){
                $arSKU[$k] = $ar[$k];
            }
            else{
                $arCAT[$k] = $ar[$k];
            }
		}

        if($this->IMG_MULTI == 'Y'){
            $arCAT[] = array('TYPE' => 'F', 'CODE' => 'MORE_PHOTO', 'NAME' => 'MORE_PHOTO', 'MULTIPLE' => 'Y');
        }
		$arResult['PROPERTIES'] = $arCAT;
		//check iblock
		$IBLOCK_TYPE = COption::GetOptionString("catalog", "1C_IBLOCK_TYPE", "-");
		if($IBLOCK_TYPE == '-'){
		    $strSql = "SELECT ID FROM  b_iblock_type WHERE ID='catalog1c77'";
            $w = $DB->Query($strSql, false);
			//check iblock type
			$res = CIBlockType::GetByID('catalog1c77');
			$arIBT = $res->Fetch();
			if(!$arIBT || !$w->Fetch()){
				$arFields = Array(
					'ID'=>'catalog1c77', 'SECTIONS'=>'Y', 'IN_RSS'=>'N', 'SORT'=>100,
					'LANG'=>Array('en'=>Array('NAME'=>'Catalog1C77', 'SECTION_NAME'=>'Sections', 'ELEMENT_NAME'=>'Products')));

				$obBlocktype = new CIBlockType;
				$DB->StartTransaction();
				$res = $obBlocktype->Add($arFields);
				if(!$res){
					$DB->Rollback();
					AddMessage2Log('010->Error: '.$obBlocktype->LAST_ERROR, "htmls.1c77exchange");
					die('010->Error: '.$obBlocktype->LAST_ERROR);
				}
				else
					$DB->Commit();
			}
			$IBLOCK_TYPE = 'catalog1c77';
		}
		//get site list
		$SITE_LIST = array(COption::GetOptionString("catalog", "1C_SITE_LIST", "-"));
		if($SITE_LIST[0] == '-'){
			$rsSites = CSite::GetList($by="sort", $order="desc");
			$SITE_LIST = array();
			while ($arSite = $rsSites->Fetch()){
				$SITE_LIST[] = $arSite['LID'];
			}
		}
		//if iblock not find by xml_id, create new iblock
        //AddMessage2Log($arResult['CATALOG_ID'], __LINE__);
		$res = \CIBlock::GetList(Array(), Array('XML_ID' => $arResult['CATALOG_ID'], "CHECK_PERMISSIONS" => "N"), true);
        //AddMessage2Log(print_r($res, true), __LINE__);
		if($ar_res = $res->Fetch()){
			$IBLOCK_ID = $ar_res['ID'];
		}
		else{
			$arFields = array('CODE' => 'Catalog1C', 'XML_ID' => $arResult['CATALOG_ID'], 'IBLOCK_TYPE_ID' => $IBLOCK_TYPE, 'NAME' => $arResult['CATALOG_NAME'], 'ACTIVE' => 'Y', "SITE_ID" => $SITE_LIST);
			$ib = new CIBlock;
            $arFields["GROUP_ID"] = array(2=>"R");
            //AddMessage2Log(print_r($arFields, true), __LINE__);
			$IBLOCK_ID = $ib->Add($arFields);
            //AddMessage2Log(print_r($IBLOCK_ID, true), __LINE__);
			if(!$IBLOCK_ID){
				AddMessage2Log('020->Error: '.$ib->LAST_ERROR, "htmls.1c77exchange");
				AddMessage2Log('021->Error: '.print_r($arFields, true), "htmls.1c77exchange");
				AddMessage2Log('022->Error: '.print_r($arResult, true), "htmls.1c77exchange");
				die('02->Error (ImportMD): '.$ib->LAST_ERROR);
			}
			$arFields = array("IBLOCK_ID" => $IBLOCK_ID, "YANDEX_EXPORT" => 'N', "SUBSCRIPTION" => 'N');
            AddMessage2Log(print_r($arFields, true), __LINE__);
			CCatalog::Add($arFields);
		}
        //AddMessage2Log($IBLOCK_ID, __LINE__);
		//add/update iblock properties
        //AddMessage2Log(print_r($arResult['PROPERTIES'], true), __LINE__);
        foreach($arResult['PROPERTIES'] as $prop){
		    if($prop['CODE'] == 'SORT' ||
                $prop['CODE'] == 'LENGTH' ||
                $prop['CODE'] == 'WIDTH' ||
                $prop['CODE'] == 'HEIGHT') continue;
            elseif($prop['CODE'] == 'MEASURE'){
              $arMeasure = $this->getMeasureList();
              foreach($prop['LIST'] as $id => $val){
                $code = intval($id);
                if(!$arMeasure[$code]){
                  $arFields = array('CODE'=>$code, 'MEASURE_TITLE'=>$val);
                  CCatalogMeasure::add($arFields);
                }
    		  }

            }
            else{
    			$properties = \CIBlockProperty::GetList(Array("sort"=>"asc", "name"=>"asc"), Array("ACTIVE"=>"Y", "IBLOCK_ID"=>$IBLOCK_ID, "CODE" => $prop['CODE']));
                //AddMessage2Log($properties, __LINE__);
    			$id = 1;
    			$ibp = new \CIBlockProperty;
                //AddMessage2Log($properties->SelectedRowsCount(), __LINE__);
                //AddMessage2Log($prop, __LINE__);
    			if($properties->SelectedRowsCount() == 0){
    				//no properties
    				$arFields = Array("NAME" => $prop['NAME'],
    				"ACTIVE" => "Y", "SORT" => 100*$id,
    				"CODE" => $prop['CODE'], "PROPERTY_TYPE" => $prop['TYPE'],
    				"IBLOCK_ID" => $IBLOCK_ID);
    				//add new property
                    if($prop['TYPE'] == 'E'){
                        //AddMessage2Log(print_r($prop, true), __LINE__);
                        /*if($prop['IBLOCK_CODE']){
                            $res = CIBlock::GetList(Array(),Array('TYPE'=>$IBLOCK_TYPE,"CODE"=>$prop['IBLOCK_CODE']), true);
                        }
                        else{*/
                            $res = CIBlock::GetList(Array(),Array('TYPE'=>$IBLOCK_TYPE,"CODE"=>$prop['CODE']), true);
                        //}
                        //AddMessage2Log(print_r($res, 1), __LINE__);
                        while($ar_res = $res->Fetch())
                        {
                        	$arFields['LINK_IBLOCK_ID'] = $ar_res['ID'];
                        }

                        //AddMessage2Log(print_r($arFields, true), __LINE__);
                    }
                    elseif($prop['TYPE'] == 'LC'){
                        $arFields['PROPERTY_TYPE'] = 'L';
                        $arFields['LIST_TYPE'] = 'C';
                    }
                    elseif($prop['TYPE'] == 'F'){
                        $arFields['MULTIPLE'] = 'Y';
                        //$arFields['LIST_TYPE'] = 'C';
                    }
                    //AddMessage2Log(print_r($arFields, true), __LINE__);
    				$PropID = $ibp->Add($arFields);
                    //AddMessage2Log(print_r($PropID, true), __LINE__);
    				if(!$PropID){
    					AddMessage2Log('030->Error: '.$ibp->LAST_ERROR, "htmls.1c77exchange");
    				}
                    else{
        				if($prop['TYPE'] == 'L' || $prop['TYPE'] == 'LC'){
        					//property type = list
        					$ibpenum = new CIBlockPropertyEnum;
        					foreach($prop['LIST'] as $id => $val){
        						$enumID = $ibpenum->Add(Array('PROPERTY_ID'=>$PropID, 'VALUE'=>$val, 'XML_ID' => $id));
        						if(!$enumID){
        							AddMessage2Log('040->Error: '.$ibpenum->LAST_ERROR, "htmls.1c77exchange");
        						}
        						$props[$id] = $enumID;
        					}
        					$cache[$prop['CODE']] = $props;
        				}
                   }
    			}
    			else{
    				$prop_fields = $properties->GetNext();
    				$PropID = $prop_fields['ID'];
                    //AddMessage2Log(print_r($prop, 1), __LINE__);
                    //AddMessage2Log(print_r($prop_fields, 1), __LINE__);
                    //AddMessage2Log(print_r($IBLOCK_TYPE, 1), __LINE__);

                    if($prop['TYPE'] == 'E'){
                        if($prop_fields['LINK_IBLOCK_ID'] == 0){
                            /*if($prop['IBLOCK_CODE']){
                                $res = CIBlock::GetList(Array(),Array('TYPE'=>$IBLOCK_TYPE,"CODE"=>$prop['IBLOCK_CODE']), true);
                            }
                            else{*/
                                $res = CIBlock::GetList(Array(),Array('TYPE'=>$IBLOCK_TYPE,"CODE"=>$prop['CODE']), true);
                            //}
                            //AddMessage2Log(print_r($res, 1), __LINE__);
                            if($res->SelectedRowsCount() > 0){
                                while($ar_res = $res->Fetch())
                                {
                              	    $arFields['LINK_IBLOCK_ID'] = $ar_res['ID'];
                                }
                                //AddMessage2Log($PropID, __LINE__);
                                //AddMessage2Log(print_r($arFields, 1), __LINE__);
                                $ibp->Update($PropID, $arFields);
                            }
                        }
                    }
                    //AddMessage2Log($prop, __LINE__);
    				if($prop['TYPE'] == 'L' || $prop['TYPE'] == 'LC'){
    					$ibpenum = new CIBlockPropertyEnum;
                        //
    					$props = $this->GetEnumList($IBLOCK_ID, $prop);
                        if(is_array($props)){
        					foreach($prop['LIST'] as $id => $val){
        						if(!array_key_exists($id, $props)){
        							$enumID = $ibpenum->Add(Array('PROPERTY_ID'=>$PropID, 'VALUE'=>$val, 'XML_ID' => $id));
        							if(!$enumID){
        								AddMessage2Log('050->Error: '.$ibpenum->LAST_ERROR, "htmls.1c77exchange");
        							}
        							$props[$id] = $enumID;
        						}
        					}
                        }
    					$cache[$prop['CODE']] = $props;
    				}
    			}
    			$id++;
            }
		}

        //sku - start
        if($this->USE_SKU == 'Y'){
            $res = CIBlock::GetList(Array(), Array('XML_ID'=>$arResult['CATALOG_ID'] . '#', "CHECK_PERMISSIONS" => "N"), true);
            $addCatalog = false;
    		if($ar_res = $res->Fetch()){
    			$IBLOCK_SKU_ID = $ar_res['ID'];
    		}
    		else{
    			$arFields = array('CODE' => 'Catalog1COffer', 'XML_ID' => $arResult['CATALOG_ID'] . '#', 'IBLOCK_TYPE_ID' => $IBLOCK_TYPE, 'NAME' => $arResult['CATALOG_NAME'] . GetMessage('SKU'), 'ACTIVE' => 'Y', "SITE_ID" => $SITE_LIST);
    			$ib = new CIBlock;
                $arFields["GROUP_ID"] = array(2=>"R");
    			$IBLOCK_SKU_ID = $ib->Add($arFields);
    			if(!$IBLOCK_SKU_ID){
    				AddMessage2Log('020->Error: '.$ib->LAST_ERROR, "htmls.1c77exchange");
    				AddMessage2Log('021->Error: '.print_r($arFields, true), "htmls.1c77exchange");
    				AddMessage2Log('022->Error: '.print_r($arResult, true), "htmls.1c77exchange");
    				die('02->Error (ImportMD): '.$ib->LAST_ERROR);
    			}
                $addCatalog = true;
    			$arCatalog = array("IBLOCK_ID" => $IBLOCK_SKU_ID,
                    "YANDEX_EXPORT" => 'N',
                    "SUBSCRIPTION" => 'N',
                    'PRODUCT_IBLOCK_ID' => $IBLOCK_ID);
    			//CCatalog::Add($arCatalog);
    		}

            //add/update sku-iblock properties
            $arSKU['CML2_LINK'] = array('NAME' => 'CML2_LINK', 'CODE' => 'CML2_LINK', 'TYPE' => 'E:SKU');
    		foreach($arSKU as $prop){
    			$properties = CIBlockProperty::GetList(Array("sort"=>"asc", "name"=>"asc"), Array("ACTIVE"=>"Y", "IBLOCK_ID"=>$IBLOCK_SKU_ID, "CODE" => $prop['CODE']));
    			$id = 1;
    			$ibp = new CIBlockProperty;
                if($prop['CODE'] == 'SORT') continue;
    			if($properties->SelectedRowsCount() == 0){
    				//no properties
    				$arFields = Array("NAME" => $prop['NAME'],
    				"ACTIVE" => "Y", "SORT" => 100*$id,
    				"CODE" => $prop['CODE'], "PROPERTY_TYPE" => $prop['TYPE'],
    				"IBLOCK_ID" => $IBLOCK_SKU_ID);
    				//add new property
                    if($prop['TYPE'] == 'E'){
                        $res = CIBlock::GetList(Array(),Array('TYPE'=>'catalog1c77',"CODE"=>$prop['CODE']), true);
                        while($ar_res = $res->Fetch())
                        {
                        	$arFields['LINK_IBLOCK_ID'] = $ar_res['ID'];
                        }

                        //AddMessage2Log(print_r($arFields, true), "htmls.1c77exchange");
                    }
                    if($prop['TYPE'] == 'E:SKU'){
                        $arFields['LINK_IBLOCK_ID'] = $IBLOCK_ID;
                        $arFields['PROPERTY_TYPE'] = 'E';
                        $arFields['USER_TYPE'] = 'SKU';
                    }
                    elseif($prop['TYPE'] == 'LC'){
                      $arFields['PROPERTY_TYPE'] = 'L';
                      $arFields['LIST_TYPE'] = 'C';
                    }
                    elseif($prop['TYPE'] == 'F'){
                      $arFields['MULTIPLE'] = 'Y';
                      //$arFields['LIST_TYPE'] = 'C';
                    }

    				$PropID = $ibp->Add($arFields);
    				if(!$PropID){
    					AddMessage2Log('030->Error: '.$ibp->LAST_ERROR, "htmls.1c77exchange");
    				}
                    else{
        				if($prop['TYPE'] == 'L' || $prop['TYPE'] == 'LC'){
        					//property type = list
        					$ibpenum = new CIBlockPropertyEnum;
        					foreach($prop['LIST'] as $id => $val){
        						$enumID = $ibpenum->Add(Array('PROPERTY_ID'=>$PropID, 'VALUE'=>$val, 'XML_ID' => $id));
        						if(!$enumID){
        							AddMessage2Log('040->Error: '.$ibpenum->LAST_ERROR, "htmls.1c77exchange");
        						}
        						$props[$id] = $enumID;
        					}
        					$cache[$prop['CODE']] = $props;
        				}
                        elseif($prop['TYPE'] == 'E:SKU'){
                          $pSKU = $PropID;
                        }
                   }
    			}
    			else{
    				$prop_fields = $properties->GetNext();
    				$PropID = $prop_fields['ID'];
                    if($prop['TYPE'] == 'E'){
                        if($prop_fields['LINK_IBLOCK_ID'] == 0){
                            $res = CIBlock::GetList(Array(),Array('TYPE'=>'catalog1c77',"CODE"=>$prop['CODE']), true);
                            while($ar_res = $res->Fetch())
                            {
                          	    $arFields['LINK_IBLOCK_ID'] = $ar_res['ID'];
                            }
                            if(is_array($arFields)){
                                $ibp->Update($PropID, $arFields);
                            }
                        }
                    }
    				if($prop['TYPE'] == 'L' || $prop['TYPE'] == 'LC'){
    					$ibpenum = new CIBlockPropertyEnum;
                        //AddMessage2Log($prop, "htmls.1c77exchange");
    					$props = $this->GetEnumList($IBLOCK_SKU_ID, $prop);

    					foreach($prop['LIST'] as $id => $val){
    						if(!array_key_exists($id, $props)){
    							$enumID = $ibpenum->Add(Array('PROPERTY_ID'=>$PropID, 'VALUE'=>$val, 'XML_ID' => $id));
    							if(!$enumID){
    								AddMessage2Log('050->Error: '.$ibpenum->LAST_ERROR, "htmls.1c77exchange");
    							}
    							$props[$id] = $enumID;
    						}
    					}
    					$cache[$prop['CODE']] = $props;
    				}
    			}
    			$id++;
    		}

            if($addCatalog){
                $arCatalog['SKU_PROPERTY_ID'] = $pSKU;
    			CCatalog::Add($arCatalog);
            }
        }
        //SKU - end
		//set cache file
		$cache['CATALOG_ID'] = $IBLOCK_ID;
        $cache['SKU_ID'] = $IBLOCK_SKU_ID;
		$cache['IBLOCK_TYPE'] = $IBLOCK_TYPE;
		$cache['SITE_LIST'] = $SITE_LIST;
        if($this->USE_STORE == 'Y'){
            if(CModule::IncludeModuleEx("htmls.1c77plus") < 3){
                if(IsModuleInstalled("htmls.1c77plus")){
                    $arStore = $this->ParseCSV('store.csv');
                    $V7Plus = new CV7Plus();
                    $cache['STORE'] = $V7Plus->Store($arStore);
                }
            }
        }
		$handle = fopen($this->TMP_FOLDER . 'cache.txt', "w");
		fwrite($handle, serialize($cache));
		$filename = $this->TMP_FOLDER . 'md_properties.csv';
		@unlink($filename);
		echo "Import MetaData - success.";
	}//ImportMD()

	//$p['CODE'] - property code
	function GetEnumList($IBLOCK_ID, $p){
		global $USER;
        $props = [];
		$property_enums = CIBlockPropertyEnum::GetList(Array("DEF"=>"DESC", "SORT"=>"ASC"), Array("IBLOCK_ID"=>$IBLOCK_ID, "CODE"=>$p['CODE']));
		while($enum_fields = $property_enums->GetNext()){
			$props[$enum_fields["XML_ID"]] = $enum_fields["ID"];
		}
		return $props;
	}//GetEnumList($IBLOCK_ID, $p)
	//import metadata - end

	//import iblock elements - start
	function ImportIB($file){
		global $USER;
		$arIB = $this->ParseCSV($file);
		$arIB = $this->AddElements($arIB);
		$arResult = $this->ImportCatalogID();
		$arResult['IBlocks'] = $arIB;
		if(is_array($this->CACHE)){
			$IBLOCK_TYPE = $this->CACHE['IBLOCK_TYPE'];
			$SITE_LIST = $this->CACHE['SITE_LIST'];
		}
		else{
			$IBLOCK_TYPE = COption::GetOptionString("catalog", "1C_IBLOCK_TYPE", "-");
			if($IBLOCK_TYPE == '-'){
				$IBLOCK_TYPE = 'catalog1c77';
			}
			$SITE_LIST = array(COption::GetOptionString("catalog", "1C_SITE_LIST", "-"));
			if($SITE_LIST[0] == '-'){
				$rsSites = CSite::GetList($by="sort", $order="desc");
				$SITE_LIST = array();
				while ($arSite = $rsSites->Fetch()){
				  $SITE_LIST[] = $arSite['LID'];
				}
			}
		}
		$ib = new CIBlock;
		foreach($arResult['IBlocks'] as $IBlock){
			//check iblock
			$res = CIBlock::GetList(Array(), Array('XML_ID'=>$IBlock['XML_ID']), true);
			if($ar_res = $res->Fetch()){
				$IBLOCK_ID = $ar_res['ID'];
			}
			else{//if iblock not exists, create them
				$arFields = array('CODE' => $IBlock['CODE'], 'XML_ID' => $IBlock['XML_ID'], 'IBLOCK_TYPE_ID' => $IBLOCK_TYPE, 'NAME' => html_entity_decode($IBlock['NAME']), 'ACTIVE' => 'Y', "SITE_ID" => $SITE_LIST);
				$IBLOCK_ID = $ib->Add($arFields);
				if(!$IBLOCK_ID){
					AddMessage2Log('060->Error: '.$ib->LAST_ERROR, "htmls.1c77exchange");
					die('060->Error: '.$ib->LAST_ERROR);
				}
			}
			//add new elements for this iblock
			$elems[$IBLOCK_ID] = $this->UploadIBlockElements($IBlock['LIST'], $IBLOCK_ID);
		}
		//update cache
		$cache = $this->CACHE;
        if(!is_array($cache)){
            $cache = array();
        }
		$cache['IBlocks'] = $elems;
        $handle = fopen($this->TMP_FOLDER . 'cache.txt', "w");
		fwrite($handle, serialize($cache));
		$filename = $this->TMP_FOLDER . $file;
		@unlink($filename);
		$filename = $this->TMP_FOLDER . "ib_elements.csv";
		@unlink($filename);
        //die();
		echo "Import IBlocks - success.";
	}//ImportIB()

	//return array(xml_id => id)
	function UploadIBlockElements($arElements, $IBLOCK_ID){
		global $USER;
        $elem = [];
		$el = new CIBlockElement;
		foreach($arElements as $xid => $name){
			$arFilter = array('IBLOCK_ID' => $IBLOCK_ID, 'XML_ID' => $xid);
			$res = CIBlockElement::GetList(Array(), $arFilter, false, false, array('ID', 'NAME'));
			if($res->SelectedRowsCount() == 0){
				//add new element
				$arLoadProductArray = Array("IBLOCK_ID" => $IBLOCK_ID, "NAME" => html_entity_decode($name), "ACTIVE" => "Y", "XML_ID" => $xid);
				if($PRODUCT_ID = $el->Add($arLoadProductArray))
					$elem[$xid] = $PRODUCT_ID;
				else
					AddMessage2Log('070->Error: '.$el->LAST_ERROR, "htmls.1c77exchange");
			}
			else{
				//add value to cache
				while($ob = $res->GetNextElement()){
					$ar = $ob->GetFields();
					$elem[$xid] = $ar['ID'];
					if($ar['NAME'] <> $name){
						$arLoadProductArray = Array("NAME" => html_entity_decode($name));
						$el->Update($ar['ID'], $arLoadProductArray);
					}
				}
			}
		}
		return $elem;
	}//UploadIBlockElements($arElements, $IBLOCK_ID)
	//import iblock elements - end

	//import sections - start
	function ImportSEC($file, $cnt){
		global $USER, $MESS;
		$arResult = $this->ImportCatalogID();
		$arResult['SECTION'] = $this->ParseCSV($file);
        $cache = $this->CACHE;
		if(is_array($this->CACHE)){
			$IBLOCK_ID = $this->CACHE['CATALOG_ID'];
		}
		else{
			$res = CIBlock::GetList(Array(), Array('XML_ID'=>$arResult['CATALOG_ID']), true);
			$ar_res = $res->Fetch();
			$IBLOCK_ID = $ar_res['ID'];
		}
        $dw = COption::GetOptionString("catalog", "1C_DETAIL_WIDTH", 300);
        $dh = COption::GetOptionString("catalog", "1C_DETAIL_HEIGHT", 300);
        $pw = COption::GetOptionString("catalog", "1C_PREVIEW_WIDTH", 100);
        $ph = COption::GetOptionString("catalog", "1C_PREVIEW_HEIGHT", 100);
        //AddMessage2Log($this->KEEP_STR, "htmls.1c77exchange");
        //AddMessage2Log($cache['NEW_SECTION'], "htmls.1c77exchange");

        $bs = new CIBlockSection;
        if($this->KEEP_STR == 'Y'){
            if(!$cache['NEW_SECTION']){
                $sort = array('sort' => 'asc');
		        $filter = array('IBLOCK_ID' => $IBLOCK_ID, 'NAME' => GetMessage('NEW_SECTION'));
                //AddMessage2Log(print_r($filter, true), "htmls.1c77exchange");
		        $srch = CIBlockSection::GetList($sort, $filter);
                //AddMessage2Log($srch->SelectedRowsCount(), "htmls.1c77exchange");
        		if($srch->SelectedRowsCount() == 0 ){
        			$newFields['IBLOCK_SECTION_ID'] = false;
        			$newFields['ACTIVE'] = 'N';
        			$newFields['NAME'] = GetMessage('NEW_SECTION');
        			$newFields['IBLOCK_ID'] = $IBLOCK_ID;
        			if($newID = $bs->Add($newFields))
        			    $cache['NEW_SECTION'] = $newID;
                    else{
                        AddMessage2Log($bs->LAST_ERROR, "htmls.1c77exchange");
                    }
        		}
                else{
                    $fetch = $srch->fetch();
        		    $cache['NEW_SECTION'] = $fetch['ID'];
                }
    		}
            //AddMessage2Log($cache['NEW_SECTION'], "htmls.1c77exchange");
		}
        $cnt = 0;

        foreach($arResult['SECTION'] as $arFields){
			$arFields['ACTIVE'] = 'Y';
            if($arFields['PICTURE'] == 0){
                unset($arFields['PICTURE']);
            }
            else{
                $Picture = $arFields['PICTURE'];
                $aPicture = explode('.', $Picture);
                $arProps['PICTURE'] = $aPicture[0];//str_replace('.jpg', '', $Picture);
                //$arProps['PICTURE'] = str_replace('.png', '', $Picture);
				$arFields["DETAIL_PICTURE"] = false;
				$arFields["PICTURE"] = false;
				$arFileD = false;
				$arFileP = false;
				foreach($this->IMG_TYPE as $type){
					$folder = $_SERVER["DOCUMENT_ROOT"] . $this->IMG_FOLDER;
                    if(strlen($this->IMG_SUBFOLDER) > 0){
                        $folder .= $arProps[$this->IMG_SUBFOLDER] . '/';
                    }
					if(file_exists($folder . $arProps['PICTURE'] . "." . $type)){
						$sourceFile = $folder . $arProps['PICTURE'] . "." . $type;
						$destinationFile = $folder . $arProps['PICTURE'] . "r." . $type;
						$destinationFileP = $folder . $arProps['PICTURE'] . "p." . $type;
						CFile::ResizeImageFile($sourceFile, $destinationFile, array("width" => $dw, "height" => $dh));
						$arFileD = CFile::MakeFileArray($destinationFile);
						$destinationFileP = $folder . $arProps['PICTURE'] . "p." . $type;
						CFile::ResizeImageFile($destinationFile, $destinationFileP, array("width" => $pw, "height" => $ph));
						$arFileP = CFile::MakeFileArray($destinationFileP);
						break;
					}
					if(file_exists($folder . $arProps['PICTURE'] . "." . strtoupper($type))){
						$sourceFile = $folder . $arProps['PICTURE'] . "." . strtoupper($type);
						$destinationFile = $folder . $arProps['PICTURE'] . "r." . $type;
						$destinationFileP = $folder . $arProps['PICTURE'] . "p." . $type;
						CFile::ResizeImageFile($sourceFile, $destinationFile, array("width" => $dw, "height" => $dh));
						$arFileD = CFile::MakeFileArray($destinationFile);
						$destinationFileP = $folder . $arProps['PICTURE'] . "p." . $type;
						CFile::ResizeImageFile($destinationFile, $destinationFileP, array("width" => $pw, "height" => $ph));
						$arFileP = CFile::MakeFileArray($destinationFileP);
						break;
					}
                    //hack for cp1251 filename
                    $sOriginalPicture = $arProps['PICTURE'];
					$arProps['PICTURE'] = iconv('UTF-8', 'CP1251', $sOriginalPicture);
					if(file_exists($folder . $arProps['PICTURE'] . "." . $type)){
						$sourceFile = $folder . $arProps['PICTURE'] . "." . $type;
						$destinationFile = $folder . $arProps['PICTURE'] . "r." . $type;
    					$destinationFileP = $folder . $arProps['PICTURE'] . "p." . $type;
						CFile::ResizeImageFile($sourceFile, $destinationFile, array("width" => $dw, "height" => $dh));
						$arFileD = CFile::MakeFileArray($destinationFile);
						$destinationFileP = $folder . $arProps['PICTURE'] . "p." . $type;
						CFile::ResizeImageFile($destinationFile, $destinationFileP, array("width" => $pw, "height" => $ph));
						$arFileP = CFile::MakeFileArray($destinationFileP);
						break;
					}
					if(file_exists($folder . $arProps['PICTURE'] . "." . strtoupper($type))){
						$sourceFile = $folder . $arProps['PICTURE'] . "." . strtoupper($type);
						$destinationFile = $folder . $arProps['PICTURE'] . "r." . $type;
						$destinationFileP = $folder . $arProps['PICTURE'] . "p." . $type;
						CFile::ResizeImageFile($sourceFile, $destinationFile, array("width" => $dw, "height" => $dh));
						$arFileD = CFile::MakeFileArray($destinationFile);
						$destinationFileP = $folder . $arProps['PICTURE'] . "p." . $type;
						CFile::ResizeImageFile($destinationFile, $destinationFileP, array("width" => $pw, "height" => $ph));
						$arFileP = CFile::MakeFileArray($destinationFileP);
						break;
					}
					$arProps['PICTURE'] = $sOriginalPicture;
				}
				$arFields["DETAIL_PICTURE"] = $arFileD;
				$arFields["PICTURE"] = $arFileP;

				if($this->IMG_LOG == 'Y' && !$arFileD){
					//$arNoImg = $this->NO_IMGS;
					$str = $arFields['XML_ID'].";".$arFields['SORT'].";".$arFields['NAME']."\n";
					$handle = fopen($this->TMP_FOLDER . 'noimg.csv', "a+");
					fwrite($handle, $str);
					fclose($handle);
				}
           }

           /*
			if($this->KEEP_STR == 'Y'){
				$arFields['ACTIVE'] = 'N';
			}*/

			//else{

				if(!empty($arFields['SECTION_XML_ID'])){
					if($cache['SECTIONS'][$arFields['XML_ID']]) $arFields['IBLOCK_SECTION_ID'] = $cache['SECTIONS'][$arFields['XML_ID']];
					else $arFields['IBLOCK_SECTION_ID'] = $this->GetSection($arFields['SECTION_XML_ID'], $IBLOCK_ID);
				}
				else{
                    if($this->KEEP_STR == 'Y'){
                        $arFields['IBLOCK_SECTION_ID'] = $cache['NEW_SECTION'];
                    }
                    else{
					    $arFields['IBLOCK_SECTION_ID'] = false;
                    }
                    //AddMessage2Log(print_r($arFields, true), "htmls.1c77exchange");
                }
			//}
            $arFields['CODE'] = strtolower($arFields['CODE']);
			$IsSec = $this->GetSection($arFields['XML_ID'], $IBLOCK_ID);

			$arFields['IBLOCK_ID'] = $IBLOCK_ID;
            if($IsSec == null){
				/*if(is_array($this->CACHE)){
					if(!$arFields['IBLOCK_SECTION_ID']){
						if(!$cache['NEW_SECTION']){
							$newFields['IBLOCK_SECTION_ID'] = false;
							$newFields['ACTIVE'] = 'N';
							$newFields['NAME'] = $MESS['NEW_SECTION'];
							$newFields['IBLOCK_ID'] = $IBLOCK_ID;
							$newID = $bs->Add($newFields);
							$cache['NEW_SECTION'] = $newID;
						}
						else{
							$arFields['IBLOCK_SECTION_ID'] = $cache['NEW_SECTION'];
						}
					}
				}*/
    			$ID = $bs->Add($arFields);
                //AddMessage2Log(print_r($arFields, true), "htmls.1c77exchange");
				if(!$ID)
    				AddMessage2Log('080->Error: '.$bs->LAST_ERROR, "htmls.1c77exchange");
			else
					$cache['SECTIONS'][$arFields['XML_ID']] = $ID;
			}
			else{
				if($this->UPD_NAME != "Y"){
	            	unset($arFields['NAME']);
	            }
                if($this->KEEP_STR == 'Y'){
                  //on update, probably, will be lost current hierarchy and group will be remove to "new goods"
    				unset($arFields['IBLOCK_SECTION_ID']);
                    //unset($arFields['ACTIVE']);
    			}
                //unset($arFields['ACTIVE']);
				$res = $bs->Update($IsSec, $arFields);
				if(!$res)
					AddMessage2Log('090->Error: '.$bs->LAST_ERROR, "htmls.1c77exchange");
				$cache['SECTIONS'][$arFields['XML_ID']] = $IsSec;
			}
			$cnt++;
		}
		//update cache
		$handle = fopen($this->TMP_FOLDER . 'cache.txt', "w");
		fwrite($handle, serialize($cache));
		$filename = $this->TMP_FOLDER . $file;
		@unlink($filename);

		echo "progress@" . $cnt;//. '@DoNext'.$filename;
	}//ImportSEC()

	//return section_id if section find, null - not find
	function GetSection($XID, $IBLOCK_ID){
		global $USER;

		$sort = array('sort' => 'asc');
		$filter = array('IBLOCK_ID' => $IBLOCK_ID, 'XML_ID' => $XID);
		$srch = CIBlockSection::GetList($sort, $filter);
		if($srch->selectedRowsCount() == 0 ){
			return null;
		}
		$fetch = $srch->fetch();
		$parent_id = $fetch['ID'];
		return $parent_id;
	}//GetSection($XID, $IBLOCK_ID)
	//import sections - end

	function ImportCatalog($file, $cnt){
		global $USER;
		$arResult = $this->ImportCatalogID();
		$ar = $this->ParseCSV($file);
   		$arResult['CATALOG'] = $this->PrepareCatalog($ar);

		$OnAfterIBlockElementAdd = COption::GetOptionString("htmls.1c77exchange", "V77EXCHANGE_USER_FUNCTION_AFTER_ADD");
		$OnAfterIBlockElementUpdate = COption::GetOptionString("htmls.1c77exchange", "V77EXCHANGE_USER_FUNCTION_AFTER_UPDATE");
        //$arMeasure = $this->getMeasureList();
		$cache = $this->CACHE;
		if(is_array($this->CACHE)){
			$IBLOCK_ID = $this->CACHE['CATALOG_ID'];
		}
		else{
			$res = CIBlock::GetList(Array(), Array('XML_ID'=>$arResult['CATALOG_ID']), true);
			$ar_res = $res->Fetch();
			$IBLOCK_ID = $ar_res['ID'];
		}

		$IBFields = CIBlock::GetFields($IBLOCK_ID);
		$dw = COption::GetOptionString("catalog", "1C_DETAIL_WIDTH", 300);
        $dh = COption::GetOptionString("catalog", "1C_DETAIL_HEIGHT", 300);
        $pw = COption::GetOptionString("catalog", "1C_PREVIEW_WIDTH", 100);
        $ph = COption::GetOptionString("catalog", "1C_PREVIEW_HEIGHT", 100);
		if($IBFields['PREVIEW_PICTURE']['DEFAULT_VALUE']['WIDTH']){
			$pw = $IBFields['PREVIEW_PICTURE']['DEFAULT_VALUE']['WIDTH'];
		}
		if($IBFields['PREVIEW_PICTURE']['DEFAULT_VALUE']['HEIGHT']){
			$ph = $IBFields['PREVIEW_PICTURE']['DEFAULT_VALUE']['HEIGHT'];
		}
		if($IBFields['DETAIL_PICTURE']['DEFAULT_VALUE']['WIDTH']){
			$dw = $IBFields['DETAIL_PICTURE']['DEFAULT_VALUE']['WIDTH'];
		}
		if($IBFields['DETAIL_PICTURE']['DEFAULT_VALUE']['HEIGHT']){
			$dh = $IBFields['DETAIL_PICTURE']['DEFAULT_VALUE']['HEIGHT'];
		}

		if(!$cache['arLinkIblock']){
			$properties = CIBlockProperty::GetList(Array("sort"=>"asc", "name"=>"asc"), Array("ACTIVE"=>"Y", "IBLOCK_ID"=>$IBLOCK_ID));
			while ($prop_fields = $properties->GetNext()){
				if($prop_fields['PROPERTY_TYPE'] == 'E'){
					$arLinkIblock[$prop_fields['CODE']] = $prop_fields['LINK_IBLOCK_ID'];
				}
			}
		}
		else
			$arLinkIblock = $cache['arLinkIblock'];
		$el = new CIBlockElement;
		$cnt = 0;
		foreach($arResult['CATALOG'] as $arCat){
			$arFields = $arCat['arFields'];
			$arFields['ACTIVE'] = 'Y';
            //AddMessage2Log(print_r($arCat,1));
			//if($this->KEEP_STR == 'Y'){

		//	$arFields['IBLOCK_SECTION_ID'] = false;
			//}
			//else{
				if($arFields['SECTION_XML_ID'])
					$arFields['IBLOCK_SECTION_ID'] = $cache['SECTIONS'][$arFields['SECTION_XML_ID']];
				else
					$arFields['IBLOCK_SECTION_ID'] = false;
			//}

			$arProps = $arCat['arProps'];
			foreach($arProps as $k => $v){
				//property enum
				if($cache[$k]){
					$arProps[$k] = $cache[$k][$v];
				}
				else{
					//property link iblock
					if($arLinkIblock[$k] > 0){
						//if set ttype iblock link or set by cache
						$arProps[$k] = $cache['IBlocks'][$arLinkIblock[$k]][$v];
					}
					else{
						if($arLinkIblock[$k]){
							//set iblock type for iblock link
							foreach($cache['IBlocks'] as $id => $list){
								if(is_array($list)){
									if(array_key_exists($v, $list)){
										$arProps[$k] = $list[$v];
										if($arLinkIblock[$k])
											$arLinkIblock[$k] = $id;
									}
								}
							}
						}
					}
				}
			}
			$arFilter = Array("XML_ID" => $arFields['XML_ID'], "IBLOCK_ID" => $IBLOCK_ID);
			$list = CIBlockElement::GetList($sort, $arFilter, false, false, array('ID'));
			//check element by xml_id
			if($arFields['DETAIL_TEXT']){
			    if($this->Base64 == 'Y'){
                    $arFields['DETAIL_TEXT'] = $this->win2utf(html_entity_decode(base64_decode($arFields['DETAIL_TEXT'])));
			    }
                else{
				    $arFields['DETAIL_TEXT'] = html_entity_decode($arFields['DETAIL_TEXT']);
                }
				$arFields['DETAIL_TEXT_TYPE'] = 'html';
			}
			if($arFields['PREVIEW_TEXT']){
			    if($this->Base64 == 'Y'){
                    $arFields['PREVIEW_TEXT'] = $this->win2utf(html_entity_decode(base64_decode($arFields['PREVIEW_TEXT'])));
			    }
                else{
				    $arFields['PREVIEW_TEXT'] = html_entity_decode($arFields['PREVIEW_TEXT']);
                }
				$arFields['PREVIEW_TEXT_TYPE'] = 'html';
			}

			$arFields["DETAIL_PICTURE"] = false;
			$arFields["PREVIEW_PICTURE"] = false;
            /*
            if($measID = $arMeasure[$arFields['MEASURE']]){
              $arFields['MEASURE'] = $measID;
            }
            */
			if($arProps['PICTURE']){
			    if($this->IMG_MULTI == 'N'){
                    $arProps['PICTURE'] = explode(',', $arProps['PICTURE']);
                    $Picture = array_shift($arProps['PICTURE']);
                    $oPicture  = $arProps['PICTURE'];
			    }
                else{
                    $name = 1;
                    $next = true;
                    $folder = $arProps['PICTURE'];
                    $path = $_SERVER["DOCUMENT_ROOT"] . $this->IMG_FOLDER . $arProps['PICTURE'] . '/';
                    $Picture = '';
                    $oPicture = array();
                    while($next){
                        $next = false;
                        foreach($this->IMG_TYPE as $type){
                            $pname = $path . $name . "." . $type;
                            if(file_exists($pname)){
                                if($name == 1){
                                    $Picture = $folder . '/' . $name;
                                }
                                else{
                                    $oPicture[] = $folder . '/' . $name . "." . $type;
                                }
                                $next = true;
                                $name++;
                                break;
                            }
                        }
                    }
                }

                //$Picture = explode('.', $Picture);
                $aPicture = explode('.', $Picture);
                $arProps['PICTURE'] = $aPicture[0];//str_replace('.jpg', '', $Picture);
                //$arProps['PICTURE'] = str_replace('.png', '', $Picture);
				$arFields["DETAIL_PICTURE"] = false;
				$arFields["PREVIEW_PICTURE"] = false;
				$arFileD = false;
				$arFileP = false;
				foreach($this->IMG_TYPE as $type){
					$folder = $_SERVER["DOCUMENT_ROOT"] . $this->IMG_FOLDER;
                    if(strlen($this->IMG_SUBFOLDER) > 0){
                        $folder .= $arProps[$this->IMG_SUBFOLDER] . '/';
                    }
					if(file_exists($folder . $arProps['PICTURE'] . "." . $type)){
						$sourceFile = $folder . $arProps['PICTURE'] . "." . $type;
						$destinationFile = $folder . $arProps['PICTURE'] . "r." . $type;
						$destinationFileP = $folder . $arProps['PICTURE'] . "p." . $type;
						CFile::ResizeImageFile($sourceFile, $destinationFile, array("width" => $dw, "height" => $dh));
						$arFileD = CFile::MakeFileArray($destinationFile);
						$destinationFileP = $folder . $arProps['PICTURE'] . "p." . $type;
						CFile::ResizeImageFile($destinationFile, $destinationFileP, array("width" => $pw, "height" => $ph));
						$arFileP = CFile::MakeFileArray($destinationFileP);
						break;
					}
					if(file_exists($folder . $arProps['PICTURE'] . "." . strtoupper($type))){
						$sourceFile = $folder . $arProps['PICTURE'] . "." . strtoupper($type);
						$destinationFile = $folder . $arProps['PICTURE'] . "r." . $type;
						$destinationFileP = $folder . $arProps['PICTURE'] . "p." . $type;
						CFile::ResizeImageFile($sourceFile, $destinationFile, array("width" => $dw, "height" => $dh));
						$arFileD = CFile::MakeFileArray($destinationFile);
						$destinationFileP = $folder . $arProps['PICTURE'] . "p." . $type;
						CFile::ResizeImageFile($destinationFile, $destinationFileP, array("width" => $pw, "height" => $ph));
						$arFileP = CFile::MakeFileArray($destinationFileP);
						break;
					}
                    //hack for cp1251 filename
                    $sOriginalPicture = $arProps['PICTURE'];
					$arProps['PICTURE'] = iconv('UTF-8', 'CP1251', $sOriginalPicture);
					if(file_exists($folder . $arProps['PICTURE'] . "." . $type)){
						$sourceFile = $folder . $arProps['PICTURE'] . "." . $type;
						$destinationFile = $folder . $arProps['PICTURE'] . "r." . $type;
						$destinationFileP = $folder . $arProps['PICTURE'] . "p." . $type;
						CFile::ResizeImageFile($sourceFile, $destinationFile, array("width" => $dw, "height" => $dh));
						$arFileD = CFile::MakeFileArray($destinationFile);
						$destinationFileP = $folder . $arProps['PICTURE'] . "p." . $type;
						CFile::ResizeImageFile($destinationFile, $destinationFileP, array("width" => $pw, "height" => $ph));
						$arFileP = CFile::MakeFileArray($destinationFileP);
						break;
					}
					if(file_exists($folder . $arProps['PICTURE'] . "." . strtoupper($type))){
						$sourceFile = $folder . $arProps['PICTURE'] . "." . strtoupper($type);
						$destinationFile = $folder . $arProps['PICTURE'] . "r." . $type;
						$destinationFileP = $folder . $arProps['PICTURE'] . "p." . $type;
						CFile::ResizeImageFile($sourceFile, $destinationFile, array("width" => $dw, "height" => $dh));
						$arFileD = CFile::MakeFileArray($destinationFile);
						$destinationFileP = $folder . $arProps['PICTURE'] . "p." . $type;
						CFile::ResizeImageFile($destinationFile, $destinationFileP, array("width" => $pw, "height" => $ph));
						$arFileP = CFile::MakeFileArray($destinationFileP);
						break;
					}
					$arProps['PICTURE'] = $sOriginalPicture;
				}
				$arFields["DETAIL_PICTURE"] = $arFileD;
				$arFields["PREVIEW_PICTURE"] = $arFileP;

				if($this->IMG_LOG == 'Y' && !$arFileD){
					//$arNoImg = $this->NO_IMGS;
					$str = $arFields['XML_ID'].";".$arFields['SORT'].";".$arFields['NAME']."\n";
					$handle = fopen($this->TMP_FOLDER . 'noimg.csv', "a+");
					fwrite($handle, $str);
					fclose($handle);
				}
                if(count($oPicture) > 0){
                    $n=0;
                    foreach($oPicture as $pict){
                        $arProps['MORE_PHOTO']['n'.$n] = CFile::MakeFileArray($folder . $pict);
                        $n++;
                    }
                }
			}
            if($arProps['SORT']){
                $arFields['SORT'] = $arProps['SORT'];
                unset($arProps['SORT']);
            }
            if($arProps['ACTIVE']){
                $arFields['ACTIVE'] = $arProps['ACTIVE'];
                unset($arProps['ACTIVE']);
            }
            if($arProps['MEASURE']){
                //$arFields['ACTIVE'] = $arProps['ACTIVE'];
                unset($arProps['MEASURE']);
            }


            //$arFields['CODE'] = strtolower($arFields['CODE']);
            //AddMessage2Log(print_r($arFields, true), "htmls.1c77exchange");
            //AddMessage2Log(print_r($arProps, true), "htmls.1c77exchange");
			if($list->selectedRowsCount() == 0){
				//create element
				$arFields['IBLOCK_ID'] = $IBLOCK_ID;
				$arFields['PROPERTY_VALUES'] = $arProps;

				if($ID = $el->add($arFields)){
					$cache['CATALOG'][$arFields['XML_ID']] = $ID;
					if (function_exists($OnAfterIBlockElementAdd)){
						$OnAfterIBlockElementAdd($arFields);
					}
				}
				else{
					AddMessage2Log('100->Error: '.$el->LAST_ERROR . ' (ADD => ' . $arFields['SORT'] . ')', "htmls.1c77exchange");
				}
			}
			else{
				if($this->UPD_NAME != "Y"){
	            	unset($arFields['NAME']);
	            }
                if($this->KEEP_STR == 'Y'){
    				unset($arFields['IBLOCK_SECTION_ID']);
    			}
				//update element
				while($ob = $list->GetNextElement()){
					$ar = $ob->GetFields();
					$ID = $ar['ID'];
					if(!$el->update($ID, $arFields))
						AddMessage2Log('110->Error: '.$el->LAST_ERROR . ' (UPDATE => ' . $arFields['SORT'] . ')', "htmls.1c77exchange");
                        //AddMessage2Log('(UPDATE => ' . print_r($arProps, true) . ')', "htmls.1c77exchange");

					CIBlockElement::SetPropertyValuesEx($ID, false, $arProps);
					if (function_exists($OnAfterIBlockElementUpdate)){
						$arFields['IBLOCK_ID'] = $IBLOCK_ID;
						$arFields['PROPERTY_VALUES'] = $arProps;
						$arFields['ID'] = $ID;
						$OnAfterIBlockElementUpdate($arFields);
					}
					$cache['CATALOG'][$arFields['XML_ID']] = $ID;

                    if($this->USE_STORE == 'Y'){
                      $oRes = CCatalogStoreProduct::GetList(array(), array('PRODUCT_ID' => $ID));
                      while($aOffer = $oRes->Fetch()){
                        $cache['StoreOffer'][$ID.'#'.$aOffer['STORE_ID']] = $aOffer['ID'];
                     }
                    }
				}
			}

            if($arProps['BARCODE']){
                $__res = CCatalogStoreBarCode::getList(array(), array('PRODUCT_ID' => $ID));
                //AddMessage2Log($__res->selectedRowsCount(), "htmls.1c77exchange");
                if($__res->selectedRowsCount() == 0){
                    CCatalogStoreBarCode::add(array('PRODUCT_ID' => $ID, 'BARCODE' => $arProps['BARCODE']));
                }
                else{
                    $bc = $__res->Fetch();
                    //$__ar = $bc->GetFields();
				    $__ID = $bc['ID'];
                    CCatalogStoreBarCode::Update($__ID, array('BARCODE' => $arProps['BARCODE']));
                }
                //unset($arProps['BARCODE']);
            }

			if($this->IMG_DEL == 'Y'){
				@unlink($sourceFile);
			}
			@unlink($destinationFile);
			@unlink($destinationFileP);

			$cnt++;
		}
		//update cache
		$cache['arLinkIblock'] = $arLinkIblock;
		$handle = fopen($this->TMP_FOLDER . 'cache.txt', "w");
		fwrite($handle, serialize($cache));
		fclose($handle);
		$filename = $this->TMP_FOLDER . $file;
		@unlink($filename);
		/*if($this->IMG_LOG == 'Y'){
			$handle = fopen($this->TMP_FOLDER . 'noimg.csv', "w");
			fwrite($handle, serialize($this->NO_IMGS));
		}*/

		echo "progress@" . $cnt;//. '@DoNext'.$filename;
	}//ImportCatalog($file)

    function ImportOffers2Iblock($arOffers){

        global $USER;
        //AddMessage2Log(print_r($arOffers, true), "htmls.1c77exchange");
		$cache = $this->CACHE;
        //AddMessage2Log(print_r($cache, true), "htmls.1c77exchange");
		if(is_array($this->CACHE)){
			$IBLOCK_ID = $this->CACHE['SKU_ID'];
            $ownerID = $this->CACHE['CATALOG_ID'];
		}
		else{
			$res = CIBlock::GetList(Array(), Array('XML_ID'=>$arResult['CATALOG_ID'] . '#'), true);
			$ar_res = $res->Fetch();
			$IBLOCK_ID = $ar_res['ID'];

            $res = CIBlock::GetList(Array(), Array('XML_ID'=>$arResult['CATALOG_ID']), true);
			$ar_res = $res->Fetch();
			$ownerID = $ar_res['ID'];
		}

		$IBFields = CIBlock::GetFields($IBLOCK_ID);

        $arLinkIblock = $cache['arLinkIblock'];
		//if(!$cache['arLinkIblock']){
			$properties = CIBlockProperty::GetList(Array("sort"=>"asc", "name"=>"asc"), Array("ACTIVE"=>"Y", "IBLOCK_ID"=>$IBLOCK_ID));
			while ($prop_fields = $properties->GetNext()){
				if($prop_fields['PROPERTY_TYPE'] == 'E'){
					$arLinkIblock[$prop_fields['CODE']] = $prop_fields['LINK_IBLOCK_ID'];
				}
			}
		//}
		//else

		$el = new CIBlockElement;
		$cnt = 0;
		foreach($arOffers as $arElement){
            $xml_id = $arElement['CATALOG']['CML2_LINK'];
            //get owner
            $arFilter = Array("XML_ID" => $xml_id, "IBLOCK_ID" => $ownerID);
			$list = CIBlockElement::GetList($sort, $arFilter, false, false, array('ID', 'NAME'));
            //AddMessage2Log(print_r($arFilter, true), "htmls.1c77exchange");
            //AddMessage2Log($list->selectedRowsCount(), "htmls.1c77exchange");
            if($list->selectedRowsCount() == 0){

                continue;
            }
            else{
                while($ob = $list->GetNextElement()){
					$ar = $ob->GetFields();
					$oID = $ar['ID'];
                    $oName = $ar['NAME'];
				}
            }

			$arFields = array();//$arCat['arFields'];
            $arFields['NAME'] = $arElement['CATALOG']['NAME'];//$oName;
			$arFields['ACTIVE'] = 'Y';
            $arFields['XML_ID'] = $arElement['PRODUCT']['XML_ID'];
    		$arFields['IBLOCK_SECTION_ID'] = false;

			$arProps = $arElement['CATALOG'];
            foreach($arProps as $k => $v){
				//property enum
				if($cache[$k]){
					$arProps[$k] = $cache[$k][$v];
				}
				else{
					//property link iblock
					if($arLinkIblock[$k] > 0){
						//if set ttype iblock link or set by cache
						$arProps[$k] = $cache['IBlocks'][$arLinkIblock[$k]][$v];
					}
					else{
						if($arLinkIblock[$k]){
							//set iblock type for iblock link
							foreach($cache['IBlocks'] as $id => $list){
								if(is_array($list)){
									if(array_key_exists($v, $list)){
										$arProps[$k] = $list[$v];
										if($arLinkIblock[$k])
											$arLinkIblock[$k] = $id;
									}
								}
							}
						}
					}
				}
            }
            $arProps['CML2_LINK'] = $oID;

			$arFilter = Array("XML_ID" => $arFields['XML_ID'], "IBLOCK_ID" => $IBLOCK_ID);
			$list = CIBlockElement::GetList($sort, $arFilter, false, false, array('ID'));
			//check element by xml_id

            if($arProps['SORT']){
                $arFields['SORT'] = $arProps['SORT'];
                unset($arProps['SORT']);
            }
            if($arProps['ACTIVE']){
                $arFields['ACTIVE'] = $arProps['ACTIVE'];
                unset($arProps['ACTIVE']);
            }
			if($list->selectedRowsCount() == 0){
				//create element
				$arFields['IBLOCK_ID'] = $IBLOCK_ID;
				$arFields['PROPERTY_VALUES'] = $arProps;
				if($ID = $el->add($arFields)){
					$cache['CATALOG'][$arFields['XML_ID']] = $ID;
				}
				else{
					AddMessage2Log('100->Error: '.$el->LAST_ERROR . ' (ADD => ' . $arFields['SORT'] . ')', "htmls.1c77exchange");
				}
			}
			else{
				if($this->UPD_NAME != "Y"){
	            	unset($arFields['NAME']);
	            }
                if($this->KEEP_STR == 'Y'){
    				unset($arFields['IBLOCK_SECTION_ID']);
    			}
				//update element
				while($ob = $list->GetNextElement()){
					$ar = $ob->GetFields();
    				$ID = $ar['ID'];
					if(!$el->update($ID, $arFields))
						AddMessage2Log('110->Error: '.$el->LAST_ERROR . ' (UPDATE => ' . $arFields['SORT'] . ')', "htmls.1c77exchange");
					CIBlockElement::SetPropertyValuesEx($ID, false, $arProps);

					$cache['CATALOG'][$arFields['XML_ID']] = $ID;

                    if($this->USE_STORE == 'Y'){
                      $oRes = CCatalogStoreProduct::GetList(array(), array('PRODUCT_ID' => $ID));
                      while($aOffer = $oRes->Fetch()){
                        $cache['StoreOffer'][$ID.'#'.$aOffer['STORE_ID']] = $aOffer['ID'];
                      }
                    }
				}
			}

			$cnt++;
		}
		//update cache
		$cache['arLinkIblock'] = $arLinkIblock;
		$handle = fopen($this->TMP_FOLDER . 'cache.txt', "w");
		fwrite($handle, serialize($cache));
		fclose($handle);
    }

	function ImportOffers($file, $cnt){
		global $USER, $APPLICATION;
        if (empty($cnt)) $cnt = 0;
        /*
        if($cnt == 0){
          foreach(GetModuleEvents("catalog", "OnSuccessCatalogImport1C", true) as $arEvent)
                ExecuteModuleEventEx($arEvent);
        }
        */
        $arMeasure = $this->getMeasureList();
		$arResult = $this->ImportCatalogID();
        $arOffID = $this->ParseCSV('offers_id.csv');

		foreach($arOffID as $arData){
			$pr[$arData['OFFER_ID']] = $arData['NAME'];
			//if($this->BASE_EDITION) break;//get first price
		}
		$arResult['CATALOG_GROUP'] = $pr;
		$ar = $this->ParseCSV($file);
		$arResult['OFFERS'] = $this->PrepareOffers($ar, $pr);
        //AddMessage2Log($this->USE_SKU, "htmls.1c77exchange");
        //AddMessage2Log(print_r($arResult['OFFERS'], true), "htmls.1c77exchange");
        if($this->USE_SKU == 'Y'){
          $this->ImportOffers2Iblock($arResult['OFFERS']);
        }
		$cache = $this->CACHE;
		if(is_array($this->CACHE) && isset($this->CACHE['SKU_ID']) && (intval($this->CACHE['SKU_ID']) > 0)){
			$IBLOCK_ID = $this->CACHE['SKU_ID'];
		}
		else{
			$res = CIBlock::GetList(Array(), Array('XML_ID'=>$arResult['CATALOG_ID'] . '#'), true);
			$ar_res = $res->Fetch();
			$IBLOCK_ID = $ar_res['ID'];
		}

		if(!$cache['arCatalogGroup']){
			foreach($arResult['CATALOG_GROUP'] as $xid => $name){
			  //try to get by xml_id
			  $dbPriceType = CCatalogGroup::GetList(array("SORT" => "ASC"), array("XML_ID" => $xid));
              $arPriceType = $dbPriceType->Fetch();
              if($arPriceType){
			    $arCatalogGroup[$xid] = $arPriceType["ID"];
			  }
              else{
                //try to get be name
				$dbPriceType = CCatalogGroup::GetList(array("SORT" => "ASC"), array("NAME" => $name));
				$arPriceType = $dbPriceType->Fetch();
				if($arPriceType){
				    $arCatalogGroup[$xid] = $arPriceType["ID"];
                    $arFields = array('XML_ID' => $xid);
                    $CatGroup = new CCatalogGroup;
					if(!$CatGroup->Update($arPriceType["ID"], $arFields)){
						$arCatalogGroup[$xid] = $ID;
					}
				}
				else{
					$arFields = array("NAME" => $name, 'XML_ID' => $xid,
                    "SORT" => 100, "USER_GROUP" => array(2), "USER_GROUP_BUY" => array(2),                                  // &#242;&#238;&#235;&#252;&#234;&#238; &#247;&#235;&#229;&#237;&#251; &#227;&#240;&#243;&#239;&#239;&#251; 2
					   "USER_LANG" => array(
					      "ru" => $name,
					      "en" => $name));
                    $CatGroup = new CCatalogGroup;
					if($ID = $CatGroup->Add($arFields)){
						$arCatalogGroup[$xid] = $ID;
					}
					else{
						AddMessage2Log('120->Error: '.$CatGroup->LAST_ERROR . ' (ADD => ' . print_r($arFields, true) . ')', "htmls.1c77exchange");
					}
				}
              }
			}
			$cache['arCatalogGroup'] = $arCatalogGroup;
		}
		else
			$arCatalogGroup = $cache['arCatalogGroup'];
        //AddMessage2Log(print_r($arResult['OFFERS'], true), "htmls.1c77exchange");
		$prod = new CCatalogProduct;
		foreach($arResult['OFFERS'] as $ar){
			$arPropd = $ar['PRODUCT'];
            //if update only offers
			if(!$cache['CATALOG'][$arPropd['XML_ID']]){
				$arFilter = Array("XML_ID" => $arPropd['XML_ID'], "IBLOCK_ID" => $IBLOCK_ID);
				$list = CIBlockElement::GetList($sort, $arFilter, false, false, array('ID'));
				while($ob = $list->GetNextElement()){
					$ar1 = $ob->GetFields();
					$cache['CATALOG'][$arPropd['XML_ID']] = $ar1['ID'];
				}
			}
            //AddMessage2Log(print_r($arPropd, true), "htmls.1c77exchange");
			$arFields = array('QUANTITY' => $arPropd['QUANTITY'],
                              'QUANTITY_TRACE' => $arPropd['QUANTITY_TRACE'],
                              'CAN_BUY_ZERO' => $arPropd['CAN_BUY_ZERO'],
                              'NEGATIVE_AMOUNT_TRACE' => $arPropd['NEGATIVE_AMOUNT_TRACE'],
                              "VAT_INCLUDED" => "Y",
                              "WEIGHT" => $arPropd['WEIGHT'],
                              "LENGTH" => $arPropd['LENGTH'],
                              "WIDTH" => $arPropd['WIDTH'],
                              "HEIGHT" => $arPropd['HEIGHT']
                              );
            if($measID = $arMeasure[$arPropd['MEASURE']]){
              $arFields['MEASURE'] = $measID;
            }

			if($arPropd['VAT'] == 18) $arFields['VAT_ID'] = 2;
			elseif($arPropd['VAT'] == 10) $arFields['VAT_ID'] = 3;
			else $arFields['VAT_ID'] = 1;
			$arFields['ID'] = $cache['CATALOG'][$arPropd['XML_ID']];
			if(intval($arFields['ID']) == 0) continue;
            //AddMessage2Log(print_r($arFields, true), "htmls.1c77exchange");
            if(!$arFields['CAN_BUY_ZERO'])
                $arFields['CAN_BUY_ZERO'] = $this->CAN_BUY_ZERO;
            if(!$arFields['NEGATIVE_AMOUNT_TRACE'])
                $arFields['NEGATIVE_AMOUNT_TRACE'] = $this->NEGATIVE_AMOUNT_TRACE;
			if($prod->add($arFields)){}
            else{
                AddMessage2Log(print_r($arFields, true), "htmls.1c77exchange");
                AddMessage2Log($prod->LAST_ERROR, "htmls.1c77exchange");
            }

            $arFields = Array("PRODUCT_ID" => $cache['CATALOG'][$arPropd['XML_ID']], "CURRENCY" => "RUB");
			$pr = new CPrice;
			$arPr = $ar['OFFERS'];
			$arCur = $ar['CATALOG'];
            foreach($arPr as $arOffer){
				$arFields['CATALOG_GROUP_ID'] = $arCatalogGroup[$arOffer['ID']];
				$arFields['PRICE'] = $arOffer['VALUE'];
                $cur = $arCur['CUR'.$arOffer['ID']];
                if($ar_usd_cur = CCurrency::GetByID($cur)) $arFields['CURRENCY'] = $cur;
                //AddMessage2Log(print_r($arFields, true), "htmls.1c77exchange");
				if($this->BASE_EDITION){
					CPrice::SetBasePrice($cache['CATALOG'][$arPropd['XML_ID']],
						$arOffer['VALUE'], $cur);
				}
				else{
					$cnt++;
					$res = CPrice::GetList(array(), array("PRODUCT_ID" => $cache['CATALOG'][$arPropd['XML_ID']], "CATALOG_GROUP_ID" => $arCatalogGroup[$arOffer['ID']]));
					if ($arr = $res->Fetch()){
					  //AddMessage2Log(print_r($arFields, true), "htmls.1c77exchange.update");
						if($id = \CPrice::Update($arr["ID"], $arFields)){
							$id=true;
						}
						else{
							AddMessage2Log('130->Error: '.$APPLICATION->GetException() . ' (UPDATE => ' . print_r($arFields, true) . ')', "htmls.1c77exchange");
						}
					}
					else{
					  //AddMessage2Log(print_r($arFields, true), "htmls.1c77exchange.add");
						if($id = \CPrice::Add($arFields)){
							$id=true;
						}
						else{
							AddMessage2Log('140->Error: '.$APPLICATION->GetException() . ' (ADD => ' . print_r($arFields, true) . ')', "htmls.1c77exchange");
						}
					}
				}
			}
		}

		//update cache
		$handle = fopen($this->TMP_FOLDER . 'cache.txt', "w");
		fwrite($handle, serialize($cache));
		fclose($handle);
		$filename = $this->TMP_FOLDER . $file;
		@unlink($filename);

    	echo "progress@" . $cnt;//. '@DoNext'.$filename;
	}//ImportOffers($file)

    function ImportStoreOffers($file, $cnt){
        if($this->USE_STORE == 'Y'){
            if(CModule::IncludeModuleEx("htmls.1c77plus") < 3){
                if(IsModuleInstalled("htmls.1c77plus")){
                    $arStoreOffers = $this->ParseCSV($file);
                    $V7Plus = new CV7Plus();
                    //$cache['STORE'] =
                    $cache = $this->CACHE;
                    $res = $V7Plus->StoreOffers($arStoreOffers, $cnt, $cache);
                    $cnt = $res['cnt'];
                    $cache = $res['cache'];
                    //update cache
            	    $handle = fopen($this->TMP_FOLDER . 'cache.txt', "w");
            	    fwrite($handle, serialize($cache));
            	    fclose($handle);
                    echo "progress@" . $cnt;
                }
            }
        }
        else{
            echo "progress@0";
        }
    }

    function fin($cnt){
		global $USER;
        $cache = $this->CACHE;
        if($this->USE_STORE == 'Y'){
            //$cache = $this->CACHE;
            foreach($cache['StoreOffer'] as $id){
                CCatalogStoreProduct::Delete($id);
            }
        }
		$filename = $this->TMP_FOLDER . 'offers_id.csv';
		@unlink($filename);
		$filename = $this->TMP_FOLDER . 'md_catalog.csv';
		//@unlink($filename);

    	if(file_exists($this->TMP_FOLDER . 'cache.txt')){
    		@unlink($this->TMP_FOLDER . 'cache.txt');
    	}
        @unlink($filename);

        foreach(GetModuleEvents("catalog", "OnSuccessCatalogImport1C", true) as $arEvent)
            ExecuteModuleEventEx($arEvent);

        echo "Delete - success.";

    	$USER->Logout();
	}

	function DeleteElemSec($cnt){
		global $USER;
        $cache = $this->CACHE;
        if($this->USE_STORE == 'Y'){
            //$cache = $this->CACHE;
            foreach($cache['StoreOffer'] as $id){
                CCatalogStoreProduct::Delete($id);
            }
        }
		$ELEMENT_ACTION = COption::GetOptionString("catalog", "1C_ELEMENT_ACTION", "D");
		$SECTION_ACTION = COption::GetOptionString("catalog", "1C_SECTION_ACTION", "D");
		//$cache = $this->CACHE;
        $complete = false;
        //$cnt = 0;
		$IBLOCK_ID = $cache['CATALOG_ID'];
        if(intval($IBLOCK_ID) > 0){
    		if($ELEMENT_ACTION != 'N'){
    		    $prod = new CCatalogProduct;
    			$el = new CIBlockElement;
    			$arFilter = Array("!ID" => $cache['CATALOG'], "IBLOCK_ID" => $IBLOCK_ID);
    			$list = CIBlockElement::GetList($sort, $arFilter, false, array('nTopCount'=>100), array('ID'));
    			if($list->selectedRowsCount() > 0){
    				while($ob = $list->GetNextElement()){
       					$arFields = $ob->GetFields();
    					if($ELEMENT_ACTION == 'A'){
    						$upFields = array("ACTIVE" => 'N');
    						$el->update($arFields['ID'], $upFields);

                            $__arFields = array('QUANTITY' => 0);
                            $__arFields['ID'] = $arFields['ID'];
                			if(intval($__arFields['ID']) == 0) continue;
                            if($prod->add($__arFields)){}
                            else{
                                AddMessage2Log(print_r($__arFields, true), "htmls.1c77exchange");
                                AddMessage2Log($prod->LAST_ERROR, "htmls.1c77exchange");
                            }
    					}
    					else
    						$el->Delete($arFields['ID']);
    					    $cache['CATALOG'][] = $arFields['ID'];
    					    $cnt++;
    				}
    			}
    			else{
    				$complete = true;
    			}
    		}
    		else{
    			$complete = true;
    		}

    		if($SECTION_ACTION != 'N'){
    			$arFilter = array('IBLOCK_ID' => $IBLOCK_ID, '!ID' => $cache['SECTIONS']);
    			$list = CIBlockSection::GetList(array(), $arFilter);
    			if($list->selectedRowsCount() > 0){
    				$bs = new CIBlockSection;
    				while($ar_result = $list->GetNext()){
    					if($SECTION_ACTION == 'A'){
    						$arFields = Array("ACTIVE" => 'N');
    						$res = $bs->Update($ar_result['ID'], $arFields);
    					}
    					else
    						$bs->Delete($ar_result['ID']);
    				}
    			}
    		}
        }
        else{
            $complete = true;
        }
		$filename = $this->TMP_FOLDER . 'offers_id.csv';
		@unlink($filename);
		$filename = $this->TMP_FOLDER . 'md_catalog.csv';
		//@unlink($filename);

		if($complete){
			if(file_exists($this->TMP_FOLDER . 'cache.txt')){
				@unlink($this->TMP_FOLDER . 'cache.txt');
			}
            @unlink($filename);
			echo "Delete - success.";

            foreach(GetModuleEvents("catalog", "OnSuccessCatalogImport1C", true) as $arEvent)
                ExecuteModuleEventEx($arEvent);

			$USER->Logout();
		}
        else{
	        //update cache
			$handle = fopen($this->TMP_FOLDER . 'cache.txt', "w");
			fwrite($handle, serialize($cache));
			fclose($handle);
        	echo "Delete - progress - ".$cnt;
        }
	}

	//EXPORT ORDERS
	function GetOrders(){
		global $USER, $DB;
		$dt = COption::GetOptionString("1Cv77Exchange", "last_export_time_committed");
        $shipmentXmlId = COption::GetOptionString("htmls.1c77exchange", "V77EXCHANGE_SHIPMENT_XML_ID", '');

        //AddMessage2Log($this->FINAL_ORDERS);
		if(intval($dt) == 0) $dt = mktime() - 160 * 24 * 60 * 60;
		$start = date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL")), $dt);
        $fDate = COption::GetOptionString('htmls.1c77exchange', 'V77EXCHANGE_GET_ORDERS_BY', 'DATE_INSERT');
		$sort = array('DATE_INSERT' => 'ASC');
		$filter = array('>=' . $fDate => $start);
        if($this->FINAL_ORDERS != '' && $this->FINAL_ORDERS != 0){
            $s = $this->FINAL_ORDERS;
            $fStatus = array($s);
            $dbOrderStatus = CSaleStatus::GetList($by = "sort", $order = "asc");
            $getIt = false;
    	    while($arStatus = $dbOrderStatus -> Fetch()){
    	        if($arStatus["ID"] == $s){
    	            $getIt = true;
                    continue;
    	        }
                if($getIt){
                    $fStatus[] = $arStatus["ID"];
                }
    	    }
            $filter['@STATUS_ID'] = $fStatus;
        }
        //AddMessage2Log(print_r($filter, true));
		$orders = CSaleOrder::GetList($sort, $filter);
        //AddMessage2Log(print_r($orders, true));
        COption::SetOptionString("1Cv77Exchange", "last_export_time_committed", time());
        //COption::SetOptionString("1Cv77Exchange", "last_export_time_committed", MakeTimeStamp(date("d.m.Y H:i:s"), "DD.MM.YYYY HH:MI:SS"));
		if ( !$orders ) return array();
        if($this->USE_STORE == 'Y'){
            CModule::IncludeModule("catalog");
        }
		$arOrders = array();
		while($fe = $orders->fetch()){

			$ctype = ($fe['PERSON_TYPE_ID'] == 1) ? 'F' : 'U';

			$u = $USER->GetByID($fe['USER_ID'])->fetch();
			$name = trim($u['NAME'].' '.$u['LAST_NAME']);
			if ( empty($name) ) $name = $u['LOGIN'];
			$arUser = array('PERSON_TYPE' => $ctype, 'USER_ID' => $fe['USER_ID'], 'USER_NAME' => $this->utf2win($name));

			$sort = array('sort' => 'asc');
			$filter = array('ORDER_ID' => $fe['ID']);
			$prop = CSaleOrderPropsValue::GetList($sort, $filter);
			$arOrderProp = array();
			while ( $p = $prop->fetch() ) {
			    $arOrderProp[] = array('NAME' => $p['CODE'], 'VALUE' => $this->utf2win(($p['VALUE'])));
			}  
            $PRICE_DELIVERY = $fe['PRICE_DELIVERY'];
            $strDelivery = '';
            if($PRICE_DELIVERY > 0){
                $arDeliv = CSaleDelivery::GetByID($fe['DELIVERY_ID']);
                $strDelivery = $arDeliv["NAME"] . ' (' . $PRICE_DELIVERY . ')';
            }

			$sort = array('sort' => 'asc');
			$filter = array('ORDER_ID' => $fe['ID']);
			$fields = array('PRODUCT_ID', 'PRICE', 'QUANTITY', 'PRODUCT_XML_ID', 'NAME');
			$rows = CSaleBasket::GetList($sort, $filter, false, false, $fields);
			$arRows = array();
			while ( $row = $rows->fetch() ) {
				$arRows[] = array('PRODUCT_XML_ID' => $this->utf2win($row['PRODUCT_XML_ID']), 'QUANTITY' => $row['QUANTITY'], 'PRICE'=> $row['PRICE'], 'PRODUCT_NAME' => $this->utf2win(htmlspecialchars($row['NAME'])));
			}
            if(!(empty($shipmentXmlId)) && $PRICE_DELIVERY > 0){
                $arRows[] = array('PRODUCT_XML_ID' => $this->utf2win($shipmentXmlId), 'QUANTITY' => 1, 'PRICE'=> $PRICE_DELIVERY, 'PRODUCT_NAME' => $this->utf2win(htmlspecialchars($arDeliv["NAME"])));
            }
            $sid = 0;
            if($this->USE_STORE == 'Y'){
                $rs = CCatalogStore::GetList(array(), array('ID' => $fe['STORE_ID']));
                while ($rowS = $rs->fetch() ) {
				    $sid = $rowS['XML_ID'];
			    }
            }
			$arOrders[] = array('STATUS_ID'=>$fe['STATUS_ID'],
                                'NUMBER' => $fe['ID'],
                                'DATE' => $fe['DATE_INSERT'],
                                'USER' => $arUser,
                                'PROPERTIES' => $arOrderProp,
                                'ROWS' => $arRows,
                                'COMMENT' => $this->utf2win(($strDelivery)),
                                'STORE_ID' => $sid);
        }
		//COption::SetOptionString("1Cv77Exchange", "last_export_time_committed", MakeTimeStamp(date("d.m.Y H:i:s"), "DD.MM.YYYY HH:MI:SS"));
		return $arOrders;
	}//GetOrders()

	function Export(){
		global $USER;
		$headers = $this->emu_getallheaders();
		$res = $this->Check($headers);
		$r = $res[0];
        //mail('dev@htmls.ru', 'Export', print_r($res, true));
		if(!$r) die('Access Denied! - ' . $res[1]);

		$arOrders = $this->GetOrders();
		if(count($arOrders) > 0){
			$xml = $this->GetXml($arOrders);
			file_put_contents($this->TMP_FOLDER . 'orders.xml', $xml);
			echo "success@Get XML";
		}
		else echo "failure@No Orders";
		$USER->Logout();
	}//Export()

	function SetStatus(){
		global $USER;
		$headers = $this->emu_getallheaders();
		$res = $this->Check($headers);
		$r = $res[0];
		if(!$r) die('Access Denied! - ' . $res[1]);

		if (!CSaleOrder::StatusOrder($headers['Orderid'], $headers['Status']))
   			echo "failure";
   		else
   			echo "success";
		//$USER->Logout();
	}//SetStatus()

	function _p($ar){
		echo "<pre>"; print_r($ar); echo "</pre>";
	}
//end class CV7ExchangeProcessing
}
?>

Youez - 2016 - github.com/yon3zu
LinuXploit