Your IP : 216.73.216.86


Current Path : /var/www/homesaver/www/bitrix/modules/ipol.sdek/classes/general/
Upload File :
Current File : /var/www/homesaver/www/bitrix/modules/ipol.sdek/classes/general/_sdekoption.php.back

<?
	IncludeModuleLangFile(__FILE__);

	class sdekOption extends sdekHelper{
		
		/*()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
													���������
		== auth ==  == logoff ==  == authConsolidation ==  == callAccounts ==  == newAccount ==  == checkAuth ==  == optionDeleteAccount ==  == deleteAccount ==  == optionMakeAccDefault ==  == makeAccDefault ==
		()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()*/

		static function auth($params){
			if(!$params['login'] || !$params['password'])
				die('No auth data');
			if(!class_exists('CDeliverySDEK'))
				die('No main class founded');
			sdekdriver::$MODULE_ID;
			if(!function_exists('curl_init'))
				die(GetMessage("IPOLSDEK_AUTH_NOCURL"));

			$resAuth = self::checkAuth($params['login'],$params['password']);
			if($resAuth['success']){
				sqlSdekLogs::Add(array('ACCOUNT' => $params['login'],'SECURE' => $params['password']));
				$lastCheck = sqlSdekLogs::Check($params['login']);
				\Ipolh\SDEK\option::set('logged',$lastCheck);
				if($lastCheck){
					$isPVZ = (\Ipolh\SDEK\option::get('noPVZnoOrder') == 'Y');
					Ipolh\SDEK\subscribeHandler::register($isPVZ);

					CAgent::AddAgent("sdekOption::agentUpdateList();", self::$MODULE_ID);//���������� ������
					CAgent::AddAgent("sdekOption::agentOrderStates();",self::$MODULE_ID,"N",1800);//���������� �������� �������

					$path = COption::GetOptionString('sale','delivery_handles_custom_path','/bitrix/php_interface/include/sale_delivery/');
				if(!file_exists($_SERVER["DOCUMENT_ROOT"].$path."delivery_sdek.php"))
					CopyDirFiles($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/".self::$MODULE_ID."/install/delivery/", $_SERVER["DOCUMENT_ROOT"].$path, true, true);

					echo "G".GetMessage('IPOLSDEK_AUTH_YES');
				}else
					echo GetMessage('IPOLSDEK_AUTH_NO')." ".GetMessage('IPOLSDEK_AUTH_NO_BD');
			}
			else{
				$retStr=GetMessage('IPOLSDEK_AUTH_NO');
				foreach($resAuth as $erCode => $erText)
					$retStr.=self::zaDEjsonit($erText." (".$erCode."). ");

				echo $retStr;
			}
		}

		static function logoff(){
		    \Ipolh\SDEK\option::set('logged',false);
			sqlSdekLogs::clear();
			CAgent::RemoveModuleAgents(self::$MODULE_ID);
			Ipolh\SDEK\subscribeHandler::unRegister();
		}

		static function authConsolidation(){
			if(!\Ipolh\SDEK\option::get('logged'))
				return;
			sqlSdekLogs::Add(array('ACCOUNT'=>COption::GetOptionString(self::$MODULE_ID,'logSDEK',false),'SECURE'=>COption::GetOptionString(self::$MODULE_ID,'pasSDEK',false)));
			$id = sqlSdekLogs::Check(COption::GetOptionString(self::$MODULE_ID,'logSDEK',false));
            \Ipolh\SDEK\option::set('logged',$id);
		}

		static function callAccounts(){
			$acList = sqlSdekLogs::getAccountsList(true);
			$default = \Ipolh\SDEK\option::get('logged');
			foreach($acList as $id => $account){
				$acList[$id] = array(
					'account' => $account,
					'default' => ($id == $default)
				);
			}
			echo json_encode(self::zajsonit($acList));
		}

		static function newAccount($params){
			$resAuth = self::checkAuth($params['ACCOUNT'],$params['PASSWORD']);
			if($resAuth['success']){
				$arRequest = array('ACCOUNT' => $params['ACCOUNT'],'SECURE' => $params['PASSWORD'],'ACTIVE'=>'Y','LABEL'=>self::zaDEjsonit($params['LABEL']));
				$arReturn = array('result' => 'ok');
				$id = sqlSdekLogs::Check($params['ACCOUNT']);
				if($id){
					sqlSdekLogs::Update($id,$arRequest);
					$arReturn['text'] = GetMessage('IPOLSDEK_AUTH_UPDATE');
				}else
					sqlSdekLogs::Add($arRequest);
			}else{
				$retStr = GetMessage('IPOLSDEK_AUTH_NO');
				foreach($resAuth as $erCode => $erText)
					$retStr.=self::zaDEjsonit($erText." (".$erCode."). ");
				$arReturn = array(
					'result' => 'error',
					'text'	 => $retStr
				);
			}

			echo json_encode(self::zajsonit($arReturn));
		}

		static function checkAuth($account,$password){
			CDeliverySDEK::$sdekCity   = 44;
			CDeliverySDEK::$sdekSender = 44;
			CDeliverySDEK::setOrder(array('GABS'=>array(
			   "D_L" => 20,
			   "D_W" => 30,
			   "D_H" => 20,
			   "W"   => min(\Ipolh\SDEK\option::get('weightD') / 1000,1)
			)));

			CDeliverySDEK::setAuth($account,$password);
			$resAuth = CDeliverySDEK::calculateDost('pickup');
			if(!$resAuth['success'])
				$resAuth = CDeliverySDEK::calculateDost('courier');

			return $resAuth;
		}

		static function optionDeleteAccount($params){
			echo json_encode(self::zajsonit(self::deleteAccount($params['ID'])));
		}

		static function deleteAccount($id){
			$arReturn = array('result' => 'error', 'text' => '');
			if(!sqlSdekLogs::getById($id))
				$arReturn['text'] = GetMessage('IPOLSDEK_AUTH_NO_EXIST');
			else{
				sqlSdekLogs::setActive($id,'N');
				$curAccs = sqlSdekLogs::getAccountsList();
				if(count($curAccs)){
					if($id == \Ipolh\SDEK\option::get('logged')){
						reset($curAccs);
                        \Ipolh\SDEK\option::set('logged',key($curAccs));
						$arReturn['result'] = 'collapse';
					}else
						$arReturn['result'] = 'ok';
				}else{
                    \Ipolh\SDEK\option::set('logged',false);
					$arReturn['result'] = 'collapse';
				}
			}
			return $arReturn;
		}

		static function optionMakeAccDefault($params){
			echo json_encode(self::zajsonit(self::makeAccDefault($params['ID'])));
		}

		static function makeAccDefault($id=false){
			$arReturn = array('result' => 'error', 'text' => '');
			if(!sqlSdekLogs::getById($id))
				$arReturn['text'] = GetMessage('IPOLSDEK_AUTH_NO_EXIST');
			else{
				$arReturn['result'] = 'collapse';
                \Ipolh\SDEK\option::set('logged',$id);
			}
			return $arReturn;
		}

		/*()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
														����������� ����� � �����
			== tableHandler ==
		()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()*/


		static function tableHandler($params){
			cmodule::includeModule('sale');
			$arSelect[0]=($params['by'])?$params['by']:'ID';
			$arSelect[1]=($params['sort'])?$params['sort']:'DESC';

			$arNavStartParams['iNumPage']=($params['page'])?$params['page']:1;
			$arNavStartParams['nPageSize']=($params['pgCnt']!==false)?$params['pgCnt']:1;

			foreach($params as $code => $val)
				if(strpos($code,'F')===0)
					$arFilter[substr($code,1)]=$val;

			$requests   = self::select($arSelect,$arFilter,$arNavStartParams);
			$adServises = sdekdriver::getExtraOptions();
			$strHtml='';
			$tarifs = self::getExtraTarifs();
			$accounts   = sqlSdekLogs::getAccountsList(true);
			$accFullCnt = sqlSdekLogs::getAccountsList(false,true);
			$accountBase = self::getBasicAuth(true);

			$arRules = array(
				'noLabel' => array('courierTimeBeg','courierTimeEnd','packs','currency'),
				'header'  => array(
					'courierDate' => GetMessage('IPOLSDEK_STT_SENDER'),
					'street'      => GetMessage('IPOLSDEK_STT_ADDRESS'),
					'line'        => GetMessage('IPOLSDEK_STT_ADDRESS'),
					'PVZ'         => GetMessage('IPOLSDEK_STT_ADDRESS'),
					'packs'		  => GetMessage('IPOLSDEK_STT_PACKS'),
				),
			);

			$isConverted = self::isConverted();
			if($isConverted)
				\Bitrix\Main\Loader::includeModule('sale');
			while($request=$requests->Fetch()){
				$reqParams=unserialize($request['PARAMS']);
				$paramsSrt='';
				foreach($reqParams as $parCode => $parVal){
					if(array_key_exists($parCode,$arRules['header']))
						$paramsSrt .= "<strong>".$arRules['header'][$parCode]."</strong><br>";
					if(!in_array($parCode,$arRules['noLabel']))
						$paramsSrt.=GetMessage("IPOLSDEK_JS_SOD_$parCode").": ";

					switch($parCode){
						case 'currency': break;
						case "AS"      : foreach($parVal as $code => $noThing)
											 if(array_key_exists($code,$adServises))
												 $paramsSrt.= $adServises[$code]['NAME']." (".$code."), ";
										 $paramsSrt = substr($paramsSrt,0,strlen($paramsSrt)-2)."<br>";
										 break;
						case "GABS"    : $paramsSrt.= $parVal['D_L']."x".$parVal['D_W']."x".$parVal['D_H']." ".GetMessage("IPOLSDEK_cm")." ".$parVal['W']." ".GetMessage('IPOLSDEK_kg')."<br>";break;
						case "service" : $paramsSrt.=$tarifs[$parVal]['NAME']."<br>"; break;
						case "courierTimeBeg": $paramsSrt.= GetMessage("IPOLSDEK_JS_SOD_courierTime").": ".$parVal." - ".$reqParams["courierTimeEnd"]."<br>"; break;
						case "courierTimeEnd": break;
						case "packs"   : 
										$orderGoods = ($request['SOURCE'] == 1) ? sdekdriver::getGoodsArray(self::oIdByShipment($request['ORDER_ID']),$request['ORDER_ID']) : sdekdriver::getGoodsArray($request['ORDER_ID']);
										foreach($parVal as $place => $params){
											$paramsSrt.="<span style='font-style:italic'>".GetMessage('IPOLSDEK_JS_SOD_Pack')." ".$place."</span><br>";
											$paramsSrt.=GetMessage('IPOLSDEK_dims').": ".$params['gabs']." (".GetMessage('IPOLSDEK_cm').")<br>";
											$paramsSrt.=GetMessage('IPOLSDEK_weight').": ".$params['weight']." ".GetMessage('IPOLSDEK_kg')."<br>";
											$paramsSrt.=GetMessage('IPOLSDEK_goods').": ";
											foreach($params['goods'] as $gId => $cnt )
												if(array_key_exists($gId,$orderGoods))
													$paramsSrt.=$orderGoods[$gId]['NAME']." ({$orderGoods[$gId]['PRODUCT_ID']}): $cnt, ";
											$paramsSrt = substr($paramsSrt,0,strlen($paramsSrt)-2)."<br>";
										 };
										 break;
						case 'toPay'   :
						case 'deliveryP' : $paramsSrt .= sdekExport::formatCurrency(array('TO'=>$reqParams['currency'],'SUM'=>$parVal,'FORMAT'=>true))."<br>"; break;
						case 'NDSDelivery' :
						case 'NDSGoods'	   : $paramsSrt.= GetMessage('IPOLSDEK_NDS_'.$parVal)."<br>"; break;
						case 'departure':
						case 'location' : $city = sqlSdekCity::getBySId($parVal);
											$paramsSrt.= $city['NAME']." (".$city['REGION'].")<br>";
						break;
						default        : $paramsSrt.=$parVal."<br>"; break;
					}
				}

				$message=unserialize($request['MESSAGE']);
				if($message && count($message))
					$message=implode('<br>',$message);
				else
					$message='';

				$addClass='';
				if($request['STATUS']=='OK')
					$addClass='IPOLSDEK_TblStOk';
				if($request['STATUS']=='ERROR')
					$addClass='IPOLSDEK_TblStErr';
				if($request['STATUS']=='TRANZT')
					$addClass='IPOLSDEK_TblStTzt';
				if($request['STATUS']=='DELETE')
					$addClass='IPOLSDEK_TblStDel';
				if($request['STATUS']=='STORE')
					$addClass='IPOLSDEK_TblStStr';
				if($request['STATUS']=='CORIER')
					$addClass='IPOLSDEK_TblStCor';
				if($request['STATUS']=='PVZ')
					$addClass='IPOLSDEK_TblStPVZ';
				if($request['STATUS']=='OTKAZ')
					$addClass='IPOLSDEK_TblStOtk';
				if($request['STATUS']=='DELIVD')
					$addClass='IPOLSDEK_TblStDvd';

				if($isConverted){
					if($request['SOURCE'] == 1){
						$oId = self::oIdByShipment($request['ORDER_ID']);
						$arActions = array(
							'link'    => '/bitrix/admin/sale_order_shipment_edit.php?order_id='.$oId.'&shipment_id='.$request['ORDER_ID'].'&lang=ru',
							'delete'  => 'IPOLSDEK_setups.table.delReq('.$request['ORDER_ID'].',\\\'shipment\\\');',
							'print'   => 'IPOLSDEK_setups.table.print('.$request['ORDER_ID'].',\\\'shipment\\\')',
							'shtrih'  => 'IPOLSDEK_setups.table.shtrih('.$request['ORDER_ID'].',\\\'shipment\\\')',
							'destroy' => 'IPOLSDEK_setups.table.killReq('.$request['ORDER_ID'].',\\\'shipment\\\')',
						);
					}else
						$arActions = array(
							'link'    => '/bitrix/admin/sale_order_view.php?ID='.$request['ORDER_ID'].'&lang=ru',
							'delete'  => 'IPOLSDEK_setups.table.delReq('.$request['ORDER_ID'].',\\\'order\\\');',
							'print'   => 'IPOLSDEK_setups.table.print('.$request['ORDER_ID'].',\\\'order\\\')',
							'shtrih'  => 'IPOLSDEK_setups.table.shtrih('.$request['ORDER_ID'].',\\\'order\\\')',
							'destroy' => 'IPOLSDEK_setups.table.killReq('.$request['ORDER_ID'].',\\\'order\\\')',
						);
				}else
					$arActions = array(
						'link'    => 'sale_order_detail.php?ID='.$request['ORDER_ID'].'&lang=ru',
						'delete'  => 'IPOLSDEK_setups.table.delReq('.$request['ORDER_ID'].',\\\'order\\\');',
						'print'   => 'IPOLSDEK_setups.table.print('.$request['ORDER_ID'].',\\\'order\\\')',
						'shtrih'  => 'IPOLSDEK_setups.table.shtrih('.$request['ORDER_ID'].',\\\'order\\\')',
						'destroy' => 'IPOLSDEK_setups.table.killReq('.$request['ORDER_ID'].',\\\'order\\\')',
					);

				$contMenu='<td class="adm-list-table-cell adm-list-table-popup-block" onclick="BX.adminList.ShowMenu(this.firstChild,[{\'DEFAULT\':true,\'GLOBAL_ICON\':\'adm-menu-edit\',\'DEFAULT\':true,\'TEXT\':\''.GetMessage('IPOLSDEK_STT_TOORDR').'\',\'ONCLICK\':\'BX.adminPanel.Redirect([],\\\''.$arActions['link'].'\\\', event);\'}';
				if($request['STATUS']=='ERROR' || $request['STATUS']=='NEW' || $request['STATUS']=='DELETE')
					$contMenu.=',{\'GLOBAL_ICON\':\'adm-menu-delete\',\'TEXT\':\''.GetMessage('IPOLSDEK_JSC_SOD_DELETE').'\',\'ONCLICK\':\''.$arActions['delete'].'\'}';
				else
					$contMenu.=',{\'GLOBAL_ICON\':\'adm-menu-view\',\'TEXT\':\''.GetMessage('IPOLSDEK_JSC_SOD_FOLLOW').'\',\'ONCLICK\':\'IPOLSDEK_setups.table.follow('.$request['SDEK_ID'].');\'}';
				if(!in_array($request['STATUS'],array('NEW','ERROR','DELETE','DELIVD','OTKAZ')))
					$contMenu.=',{\'GLOBAL_ICON\':\'adm-menu-move\',\'TEXT\':\''.GetMessage('IPOLSDEK_JSC_SOD_CHECK').'\',\'ONCLICK\':\'IPOLSDEK_setups.table.checkState('.$request['SDEK_ID'].');\'}';
				if($request['STATUS']=='OK'){
					$contMenu.=',{\'TEXT\':\''.GetMessage('IPOLSDEK_JSC_SOD_PRNTSH').'\',\'ONCLICK\':\''.$arActions['print'].'\'}';
					$contMenu.=',{\'TEXT\':\''.GetMessage('IPOLSDEK_JSC_SOD_SHTRIH').'\',\'ONCLICK\':\''.$arActions['shtrih'].'\'}';
					$contMenu.=',{\'GLOBAL_ICON\':\'adm-menu-delete\',\'TEXT\':\''.GetMessage('IPOLSDEK_JSC_SOD_DESTROY').'\',\'ONCLICK\':\''.$arActions['destroy'].'\'}';
				}
				$contMenu.='])"><div class="adm-list-table-popup"></div></td>';
				$strHtml.='<tr class="adm-list-table-row '.$addClass.'">
								'.$contMenu.'
								<td class="adm-list-table-cell"><div>'.$request['ID'].'</div></td>
								<td class="adm-list-table-cell"><div>'.$request['MESS_ID'].'</div></td>
								<td class="adm-list-table-cell"><div><a href="'.$arActions['link'].'" target="_blank">'.$request['ORDER_ID'].'</a></div></td>
								<td class="adm-list-table-cell"><div>'.$request['STATUS'].'</div></td>
								<td class="adm-list-table-cell"><div>'.$request['SDEK_ID'].'</div></td>';
				if($isConverted)
					$strHtml.='<td class="adm-list-table-cell"><div>'.(($request['SOURCE'] == 1)?GetMessage('IPOLSDEK_STT_shipment'):GetMessage('IPOLSDEK_STT_order')).'</div></td>';
				$strHtml.='<td class="adm-list-table-cell"><div><a href="javascript:void(0)" onclick="IPOLSDEK_setups.table.shwPrms($(this).siblings(\'div\'))">'.GetMessage('IPOLSDEK_STT_SHOW').'</a><div style="height:0px; overflow:hidden">'.$paramsSrt.'</div></div></td>
								<td class="adm-list-table-cell"><div>'.$message.'</div></td>
								<td class="adm-list-table-cell"><div>'.date("d.m.y H:i",$request['UPTIME']).'</div></td>';
				if(count($accFullCnt)>1){
					$acc = ($request['ACCOUNT']) ? $request['ACCOUNT'] : $accountBase;
					$strHtml.='<td class="adm-list-table-cell IPOLSDEK_account" title="'.((array_key_exists($acc,$accounts)) ? (($accounts[$acc]['LABEL']) ? $accounts[$acc]['LABEL'] : $accounts[$acc]['ACCOUNT']) : GetMessage("IPOLSDEK_TABLE_ACCINACTIVE")).'">'.$acc.'</td>';
				}
				$strHtml.='</tr>';
			}

			echo json_encode(
				self::zajsonit(
					array(
						'ttl'  => $requests->NavRecordCount,
						'mP'   => $requests->NavPageCount,
						'pC'   => $requests->NavPageSize,
						'cP'   => $requests->NavPageNomer,
						'sA'   => $requests->NavShowAll,
						'html' => $strHtml
					)
				)
			);
		}


		/*()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
														������ �� �����
			== getOrderInvoice ==  == getOrderShtrih ==  == getOrderPrint ==  == killOldInvoices == == displayActPrint ==  == OnBeforePrologHandler ==
		()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()*/
		
		static function getOrderInvoice($orders){
			if(!is_array($orders))
				$orders = array('order' => $orders);
			
			return self::getOrderPrint($orders,'invoice');
		}
		
		static function getOrderShtrih($orders){
			if(!is_array($orders))
				$orders = array('order' => $orders);
			
			return self::getOrderPrint($orders,'shtrih');
		}

		static function getOrderPrint($orders,$type='invoice'){ // ������� ������� �� �����
			self::killOldInvoices(); //������ ����� ��������
			if(!$orders){
				return array(
					'result' => 'error',
					'error'  => 'No order id'
				);
			}
	
			if(!in_array($type,array('shtrih','invoice'))){
				return array(
					'result' => 'error',
					'error'  => 'Unknown print format: '.$type
				);
			}

			$arAccPrints = array();
			$defAccount = self::getBasicAuth(true);
			$arMade = array();
			foreach($orders as $mode => $IDs){
				if(!is_array($IDs)){
					$orders[$mode] = array($IDs);
				}
				$requests = sqlSdekOrders::select(array(),array("ORDER_ID"=>$IDs,"SOURCE"=>($mode == 'order')?0:1));
				while($request=$requests->Fetch()){
					if($request['SDEK_ID']){
						$accId = ($request['ACCOUNT']) ? $request['ACCOUNT'] : $defAccount;
						if(!array_key_exists($accId,$arAccPrints))
							$arAccPrints[$accId] = array('XML' => '', 'cnt' => 0);
						$arAccPrints[$accId]['XML'] .= '<Order DispatchNumber="'.$request['SDEK_ID'].'"/>';
						$arAccPrints[$accId]['cnt']++;
						$arMade[$mode][]=$request['ORDER_ID'];
					}
				}
			}
			if(!count($arMade)){
				return array(
					'result' => 'error',
					'error'  => 'No orders founded'
				);
			}
			
			$copies = ($type == 'shtrih') ? (int)\Ipolh\SDEK\option::get("numberOfStrihs") : (int)\Ipolh\SDEK\option::get("numberOfPrints");
			if(!$copies) $copies = 1;
			
			$format = ($type == 'shtrih') ? 'PrintFormat="'.\Ipolh\SDEK\option::get("formatOfStrihs").'"' : "";
			
			$method = ($type == 'shtrih') ? 'ordersPackagesPrint' : 'orders_print';
			
			$container = ($type == 'shtrih') ? 'OrdersPackagesPrint ' : 'OrdersPrint';

			$arReturn = array(
				'result' => '',
				'error'  => '',
				'files'  => array()
			);

			foreach($arAccPrints as $accId => $data) {
                $headers = self::getXMLHeaders($accId);
                $request = '<?xml version="1.0" encoding="UTF-8" ?>
	<' . $container . ' Date="' . $headers['date'] . '" Account="' . $headers['account'] . '" Secure="' . $headers['secure'] . '"  OrderCount="' . $data['cnt'] . '" CopyCount="' . $copies . '" ' . $format . '>' . $data['XML'] . "</" . $container . ">";

                $result = self::sendToSDEK($request, $method);

                if (strpos($result['result'], '<') === 0) {
                    $answer = simplexml_load_string($result['result']);
                    $errAnswer = '';
                    foreach ($answer->$container as $print)
                        $errAnswer .= $print['Msg'] . ". ";
                    foreach ($answer->Order as $print)
                        $errAnswer .= $print['Msg'] . ". ";

                    $arReturn['error'] .= $errAnswer;
                } elseif (strpos($result['result'], '{') === 0){
                    $answer = json_decode($result['result'],true);
                    $errAnswer = '';
                    if(!empty($answer) && array_key_exists('alerts',$answer) && is_array($answer['alerts'])){
                        foreach ($answer['alerts'] as $arError){
                            $errAnswer .= $arError['msg'].". ";
                        }
                    }

                    $arReturn['error'] .= $errAnswer;
                } else {
					if(!file_exists($_SERVER['DOCUMENT_ROOT']."/upload/".self::$MODULE_ID))
						mkdir($_SERVER['DOCUMENT_ROOT']."/upload/".self::$MODULE_ID);
					$fileName = mktime()."_".$accId;
					file_put_contents($_SERVER['DOCUMENT_ROOT']."/upload/".self::$MODULE_ID."/".$fileName.".pdf",$result['result']);

					$arReturn['files'][] = $fileName.".pdf";
				}
			}

			if(count($arReturn['files'])){
				$arReturn['result'] = 'ok';

				$ordersNotFound = '';
				foreach($arMade as $mode => $ids){
					$diff = array_diff($orders[$mode],$ids);
					if(count($diff))
						$ordersNotFound .= implode(', ',$diff).", ";
				}

				if($ordersNotFound){
					if($arReturn['errors'])
						$arReturn['errors'] .= "; ";
					$arReturn['errors'] .= substr($arReturn['errors'],0,strlen($arReturn['errors'])-2);
				}

				if(!$arReturn['errors'])
					unset($arReturn['errors']);
			}else{
				$arReturn['result'] = 'error';
				unset($arReturn['files']);
			}
			return $arReturn;
		}

		static function killOldInvoices(){ // ������ ����� ���� � ���������
			$dirPath = $_SERVER['DOCUMENT_ROOT']."/upload/".self::$MODULE_ID."/";
			if(file_exists($dirPath)){
				$dirContain = scandir($dirPath);
				foreach($dirContain as $contain){
					if(strpos($contain,'.pdf')!==false && (mktime() - (int)filemtime($dirPath.$contain)) > 1300)
						unlink($dirPath.$contain);
				}
			}
		}

		static function displayActPrint(&$list){ // �������� �� ����� �����
			if (!empty($list->arActions)){
				CJSCore::Init(array('ipolSDEK_printOrderActs'));
				CJSCore::Init(array('ipolSDEK_printOrderShtrihs'));
			}
			if($GLOBALS['APPLICATION']->GetCurPage() == "/bitrix/admin/sale_order.php"){
				$list->arActions['ipolSDEK_printOrderActs']    = GetMessage("IPOLSDEK_SIGN_PRNTSDEK");
				$list->arActions['ipolSDEK_printOrderShtrihs'] = GetMessage("IPOLSDEK_SIGN_SHTRIHSDEK");
			}
		}

		static function OnBeforePrologHandler(){ // ������� �� ���� �����
			if(
				!array_key_exists('action', $_REQUEST) || 
				!array_key_exists('ID', $_REQUEST) || 
				!in_array($_REQUEST['action'],array('ipolSDEK_printOrderActs','ipolSDEK_printOrderShtrihs'))
			)
				return;
				
			$mode = ($_REQUEST['action'] == 'ipolSDEK_printOrderActs') ? 'acts' : 'shtrihs';
				
			$ifActs = ( $mode=='acts' && \Ipolh\SDEK\option::get('prntActOrdr') == 'A')?true:false; // ������ ������ ����� ����������, ���� true, ������� ����� ���

			$unFounded  = array(); // �� �������� (�� ���������) �����
			$arRequests = array(); // ��� ����� ���� ��� => ������ id-������
			$requests = sqlSdekOrders::select(array(),array("ORDER_ID"=>$_REQUEST["ID"],'SOURCE'=>0));
				while($request=$requests->Fetch()){
					if(!$request['SDEK_ID'])
						$unFounded[$request['ORDER_ID']] = true;
					else
						$arRequests['order'][] = $request['ORDER_ID'];
				}
			foreach($_REQUEST["ID"] as $orderId)
				if(!in_array($orderId,$arRequests['order']))
					$unFounded[$orderId] = true;

			if(count($unFounded) && self::isConverted()){
				\Bitrix\Main\Loader::includeModule('sale');
				$arShipments = array();
				foreach(array_keys($unFounded) as $id){
					$shipments = Bitrix\Sale\Shipment::getList(array('filter'=>array('ORDER_ID' => $id)));
					while($shipment=$shipments->Fetch())
						$arShipments[$shipment['ID']] = $shipment['ORDER_ID'];
				}
				$requests = sqlSdekOrders::select(array(),array("ORDER_ID"=>array_keys($arShipments),'SOURCE'=>1));
				while($request=$requests->Fetch()){
					if($request['SDEK_ID']){
						$arRequests['shipment'][] = $request['ORDER_ID'];
						unset($unFounded[$arShipments[$request['ORDER_ID']]]);
					}
				}
			}
			$badOrders = (count($unFounded)) ? implode(',',array_keys($unFounded)) : false;
			if(!$ifActs){
				$shtrihs   = ($mode == 'shtrihs') ? self::getOrderShtrih($arRequests) : self::getOrderInvoice($arRequests);
				$badOrders .= ($shtrihs['errors']) ? '\n'.$shtrihs['errors'] : ''; // errors - ���������, error - ���� �������
			}
			?>
			<script type="text/javascript">
				<?if(count($arRequests) && !$shtrihs['error']){
					if($mode == 'acts'){
						if(self::canShipment()){?>
							window.open('/bitrix/js/<?=self::$MODULE_ID?>/printActs.php?orders=<?=implode(":",$arRequests['order'])?>&shipments=<?=implode(":",$arRequests['shipment'])?>','_blank');
						<?}else{?>
							window.open('/bitrix/js/<?=self::$MODULE_ID?>/printActs.php?ORDER_ID=<?=implode(":",$arRequests['order'])?>','_blank');
						<?}
					}
					if(!$ifActs && $shtrihs['files']){
						foreach($shtrihs['files'] as $file){?>
							window.open('/upload/<?=self::$MODULE_ID?>/<?=$file?>','_blank');
						<?}
					}
					if($badOrders){?>
						alert('<?=GetMessage("IPOLSDEK_PRINTERR_BADORDERS").$badOrders?>');
					<?}?>
				<?}else{?>
					alert('<?=GetMessage("IPOLSDEK_PRINTERR_TOTALERROR").'\n'.$shtrihs['error']?> ');
				<?}?>
			</script>
		<?}

		static function formActArray(){
			if(!cmodule::includeModule('sale')) return;
			if(self::canShipment())
				$arIds = array('order'=>explode(":",$_REQUEST['orders']),'shipment'=>explode(":",$_REQUEST['shipments']));
			else
				$arIds = array('order'=>explode(":",$_REQUEST['ORDER_ID']));
			$arOrders = array();
			$ttlPay = 0;
			$dWeight = \Ipolh\SDEK\option::get('weightD');
			foreach($arIds as $mode => $arId)
				if(count($arId))
					foreach($arId as $id){
						$req=sqlSdekOrders::select(array(),array('ORDER_ID'=>$id,'SOURCE'=>($mode == 'shipment') ? 1 : 0))->Fetch();
						if(!$req)
							continue;
						$params = unserialize($req['PARAMS']);
						$baze  = ($mode == 'shipment') ? self::getShipmentById($id) : CSaleOrder::GetById($id);
						$price = array_key_exists('toPay',$params) ? $params['toPay'] : ((float)($baze['PRICE'] - $baze['PRICE_DELIVERY']));
						$toPay = (array_key_exists('toPay',$params) && array_key_exists('deliveryP',$params)) ? ($params['toPay'] + $params['deliveryP']) : (($params['isBeznal']=='Y') ? 0 : (float)$baze['PRICE']);
						$arOrders[] = array(
							'ID'     => ($baze['ACCOUNT_NUMBER']) ? $baze['ACCOUNT_NUMBER'] : $id,
							'SDEKID' => $req['SDEK_ID'],
							'WEIGHT' => ($params['GABS']['W'])?$params['GABS']['W']:($dWeight)/1000,
							'PRICE'  => $price,
							'TOPAY'  => $toPay
						);
						$ttlPay+=$price;
					}
			return array('arOrders' => $arOrders, 'ttlPay' => $ttlPay);
		}


	/*()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
												����������� ����
	== placeFAQ ==  == placeHint ==  == getSDEKCity ==  == printSender ==  == placeStatuses ==  == makeSelect ==
	()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()*/


		static function placeFAQ($code){?>
				<a class="ipol_header" onclick="$(this).next().toggle(); return false;"><?=GetMessage('IPOLSDEK_FAQ_'.$code.'_TITLE')?></a>
				<div class="ipol_inst"><?=GetMessage('IPOLSDEK_FAQ_'.$code.'_DESCR')?></div>
		<?}

		static function placeHint($code){?>
			<div id="pop-<?=$code?>" class="b-popup" style="display: none; ">
				<div class="pop-text"><?=GetMessage("IPOLSDEK_HELPER_".$code)?></div>
				<div class="close" onclick="$(this).closest('.b-popup').hide();"></div>
			</div>
		<?}

		static function getSDEKCity($city){
			$cityId = self::getNormalCity($city);
			$SDEKcity = self::getSQLCityBI($cityId);
			return $SDEKcity;
		}

		static function printSender($city){
			$SDEKcity = self::getSDEKCity($city);
			if(!$SDEKcity)
				echo "<tr><td colspan='2'>".GetMessage('IPOLSDEK_LABEL_NOSDEKCITY')."</td><tr>";
			else{
			    \Ipolh\SDEK\option::set('departure',$SDEKcity['BITRIX_ID']);
				echo "<tr><td>".GetMessage('IPOLSDEK_OPT_departure')."</td><td>".($SDEKcity['NAME'])."</td><tr>";
			}
		}

		static function placeStatuses($option){
			if(self::canShipment()){
				$arStatuses = array();
				$arStShipment = array();
				foreach($option as $key => $val)
					if(strpos($val[0],'status') !== false){
						unset($option[$key]);
						$arStatuses[] = $val;
					}elseif(strpos($val[0],'stShipment') !== false){
						unset($option[$key]);
						$arStShipment[] = $val;
					}
				ShowParamsHTMLByArray($option);
			?><tr><td></td><td><div class='IPOLSDEK_sepTable'><?=GetMessage('IPOLSDEK_STT_order')?></div><div class='IPOLSDEK_sepTable'><?=GetMessage('IPOLSDEK_STT_shipment')?></div></td></tr><?
			foreach($arStatuses as $key => $description){?>
				<tr>
					<td><?=$description[1]?></td>
					<td>
						<div class='IPOLSDEK_sepTable'>
							<?self::makeSelect($description[0],$description[4],\Ipolh\SDEK\option::get($description[0]));?>
						</div>
						<div class='IPOLSDEK_sepTable'>
							<?
							$name = str_replace('status','stShipment',$description[0]);
							self::makeSelect($name,$arStShipment[$key][4],\Ipolh\SDEK\option::get($name));?>
						</div>
					</td>
				</tr>
			<?}
			}else{
				foreach($option as $key => $descr)
					if(strpos($descr[0],'stShipment') === 0)
						unset($option[$key]);
				ShowParamsHTMLByArray($option);
			}
		}

		static function makeSelect($id,$vals,$def=false,$atrs=''){?>
			<select <?if($id){?>name='<?=$id?>' id='<?=$id?>'<?}?> <?=$atrs?>>
			<?foreach($vals as $val => $sign){?>
				<option value='<?=$val?>' <?=($def == $val)?'selected':''?>><?=$sign?></option>
			<?}?>
			</select>
		<?}

		static function getCountryHeaderCities($params = array('country' => 'rus')){
			$allCities = sqlSdekCity::getCitiesByCountry($params['country'],true);
			echo "<table>";
			if(!$allCities->nSelectedCount)
				echo "<tr><td>".GetMessage("IPOLSDEK_NO_CITIES_FOUND")."</td></tr>";
			else{
				$arErrCities = sdekHelper::getErrCities($params['country']);
				echo '<tr class="IPOLSDEK_city_header"><td class="IPOLSDEK_city_header" onclick="IPOLSDEK_setups.cities.callCities(\'success\')">'.GetMessage("IPOLSDEK_HDR_success").' ('.$allCities->nSelectedCount.')</td></tr><tr><td id="IPOLSDEK_city_success"></td></tr>';

				foreach(array('many','notFound') as $type)
					if(count($arErrCities[$type]) > 0)
						echo '<tr class="IPOLSDEK_city_header"><td class="IPOLSDEK_city_header" onclick="IPOLSDEK_setups.cities.callCities(\''.$type.'\')">'.GetMessage("IPOLSDEK_HDR_$type").' ('.count($arErrCities[$type]).')</td></tr><tr><td id="IPOLSDEK_city_'.$type.'"></td></tr>';
			}
			echo "</table>";
		}

		static function getCountryDetailCities($params){
			echo "%".$params['country']."%";
			switch($params['mode']){
				case  'success':
					echo '<table class="adm-list-table">
						<thead>
								<tr class="adm-list-table-header">
									<td class="adm-list-table-cell" style="width: 80px;">'.GetMessage("IPOLSDEK_HDR_BITRIXID").'</td>
									<td class="adm-list-table-cell" style="width: 80px;">'.GetMessage("IPOLSDEK_HDR_SDEKID").'</td>
									<td class="adm-list-table-cell">'.GetMessage("IPOLSDEK_HDR_REGION").'</td>
									<td class="adm-list-table-cell">'.GetMessage("IPOLSDEK_HDR_CITY").'</td>
								</tr>
						</thead>
						<tbody>';
					$allCities = sqlSdekCity::getCitiesByCountry($params['country']);
					while($element=$allCities->Fetch())
						echo '<tr class="adm-list-table-row">
								<td class="adm-list-table-cell">'.$element['BITRIX_ID'].'</td>
								<td class="adm-list-table-cell">'.$element['SDEK_ID'].'</td>
								<td class="adm-list-table-cell">'.$element['REGION'].'</td>
								<td class="adm-list-table-cell">'.$element['NAME'].'</td>
							</tr>';

					echo '</tbody></table>';
				break;
				case 'many':
					$arErrCities = sdekHelper::getErrCities($params['country']);
					if(count($arErrCities['many']) > 0){
						echo '<table class="adm-list-table">
							<thead>
									<tr class="adm-list-table-header">
										<td class="adm-list-table-cell">'.GetMessage("IPOLSDEK_HDR_BITRIXNM").'</td>
										<td class="adm-list-table-cell">'.GetMessage("IPOLSDEK_HDR_SDEKNM").'</td>
										<td class="adm-list-table-cell">'.GetMessage("IPOLSDEK_HDR_VARIANTS").'</td>
									</tr>
							</thead>
							<tbody>';

						foreach($arErrCities['many'] as $bitrixId => $arCities){
							$bitrix = false;
							if(self::isLocation20()){
								$city   = sdekCityGetter::getCityChain($bitrixId);
								if($city)
									$bitrix = array('REGION_NAME' => $city['REGION'],'CITY_NAME' => $city['CITY']);
							} else {
								$bitrix = CSaleLocation::GetList(array(),array("ID"=>$bitrixId,"REGION_LID"=>LANGUAGE_ID,"CITY_LID"=>LANGUAGE_ID))->Fetch();
							}
							if(!$bitrix)
								$bitrix = CSaleLocation::GetList(array(),array("ID"=>$bitrixId))->Fetch();
							
							$location = $bitrix['REGION_NAME'].", ".$bitrix['CITY_NAME']." (".$bitrixId.")";

							echo '<tr class="adm-list-table-row"><td class="adm-list-table-cell">'.$location.'</td><td class="adm-list-table-cell">'.$arCities['takenLbl'].'</td><td class="adm-list-table-cell">';

							foreach($arCities['sdekCity'] as $sdekId => $descr)
								echo $descr['region'].", ".$descr['name']."<br>";

							echo '</td></tr>';
						}

						echo '</tbody></table>';
					}
				break;
				case 'notFound':
					$arErrCities = sdekHelper::getErrCities($params['country']);
					if(count($arErrCities['notFound']) > 0){
						echo '<table class="adm-list-table">
								<thead>
										<tr class="adm-list-table-header">
											<td class="adm-list-table-cell">'.GetMessage("IPOLSDEK_HDR_SDEKID").'</td>
											<td class="adm-list-table-cell">'.GetMessage("IPOLSDEK_HDR_REGION").'</td>
											<td class="adm-list-table-cell">'.GetMessage("IPOLSDEK_HDR_CITY").'</td>
										</tr>
								</thead>
								<tbody>';

						foreach($arErrCities['notFound'] as $arCity)
							echo '<tr class="adm-list-table-row">
									<td class="adm-list-table-cell">'.$arCity['sdekId'].'</td>
									<td class="adm-list-table-cell">'.$arCity['region'].'</td>
									<td class="adm-list-table-cell">'.$arCity['name'].'</td>
								</tr>';

						echo '</tbody></table>';
					}
				break;
			}
		}

	/*()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
												������ �� ����
	== killSchet ==  == killUpdt ==  == clearCache ==  == printOrderInvoice ==  == killReqOD ==  == delReqOD ==  == callOrderStates ==  == callUpdateList ==  == goSlaughterCities ==  == senders ==
	()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()*/


		static function killSchet(){ // ��������� ����� ����� � ���
			if(!self::isAdmin()) return false;
			\Ipolh\SDEK\option::set('schet',0);
			return true;
		}

		static function killUpdt($wat){ // ������� �������� �� ����������
			if(unlink($_SERVER["DOCUMENT_ROOT"]."/bitrix/js/".self::$MODULE_ID."/hint.txt"))
				echo 'done';
			else
				echo 'fail';
		}

		static function clearCache($noFdb=false){//������ ��
			$obCache = new CPHPCache();
			$obCache->CleanDir('/IPOLSDEK/');
			if(!$noFdb)
				echo "Y";
		}

		static function printOrderInvoice($params){ // ���� ������
			if(!array_key_exists('mode',$params))
				$params['mode'] = 'order';
			$resPrint = self::getOrderInvoice(array($params['mode'] => $params['oId']));
			echo json_encode(self::zajsonit($resPrint));
		}

		static function printOrderShtrih($params){ // ���� ��������
			if(!array_key_exists('mode',$params))
				$params['mode'] = 'order';
			$resPrint = self::getOrderShtrih(array($params['mode'] => $params['oId']));
			echo json_encode(self::zajsonit($resPrint));
		}

		static function killReqOD($params,$mode=false){// �������� ����� �� �����
			if(!self::isAdmin()) return false;
			$oid = (is_array($params)) ? $params['oid'] : $params;
			if(!$mode)
				$mode = (array_key_exists('mode',$params)) ? $params['mode'] : 'order';
			if(sdekdriver::deleteRequest($oid,$mode)){
				if($mode == 'order')
					self::killAutoReq($oid);
				echo "GD:".GetMessage("IPOLSDEK_DRQ_DELETED");
			}else
				echo self::getAnswer();
		}

		static function delReqOD($params,$mode=false){// �������� ����� �� ��
			if(!self::isAdmin()) return false;
			$oid = (is_array($params)) ? $params['oid'] : $params;
			if(!$mode)
				$mode = (array_key_exists('mode',$params)) ? $params['mode'] : 'order';
			if(self::CheckRecord($oid,$mode)){
				sqlSdekOrders::Delete($oid,$mode);
				if($mode == 'order')
					self::killAutoReq($oid);
			}
			echo GetMessage("IPOLSDEK_DRQ_DELETED");
		}

		static function callOrderStates(){ // ������ �������� ������� �� ����
			self::getOrderStates();
			$err = self::getErrors();
			echo ($err)?($err):date("d.m.Y H:i:s",\Ipolh\SDEK\option::get('statCync'));
		}

		static function callUpdateList($params){ // ������ �� ���������� �� ����
			$arReturn = false;
			if(array_key_exists('full',$params) && $params['full'] && !array_key_exists('listDone',$params))
				if(!self::updateList())
					$arReturn = array(
						'result' => 'error',
						'text'   => GetMessage('IPOLSDEK_UPDT_ERR'),
					);

			if(!$arReturn){
				$us=self::cityUpdater();
				$arReturn = array('result' => $us['result']);
				switch($us['result']){
					case 'error'   : $arReturn['text'] = GetMessage("IPOLSDEK_SYNCTY_ERR_HAPPENING")." ".$us['error']; break;
					case 'end'     : $arReturn['text'] = (array_key_exists('full',$params) && $params['full']) ? GetMessage('IPOLSDEK_UPDT_DONE').date("d.m.Y H:i:s",filemtime($_SERVER["DOCUMENT_ROOT"]."/bitrix/js/".self::$MODULE_ID."/list.json")) : GetMessage('IPOLSDEK_SYNCTY_LBL_SCOD'); break;
					case 'country' : $arReturn['text'] = GetMessage('IPOLSDEK_SYNCTY_CNTRCTDONE').GetMessage('IPOLSDEK_SYNCTY_'.$us['country']); break;
					default        : $arReturn['text'] = GetMessage('IPOLSDEK_SYNCTY_LBL_PROCESS')." ".$us['done']."/".$us['total']; break;
				}
			}

			echo json_encode(self::zajsonit($arReturn));
		}

		static function goSlaughterCities($params){ // ��������������� �������
			if(!self::isAdmin()) return false;
			$result = self::slaughterCities();
			if($result == 'done'){
				$tmpExportFile = $_SERVER['DOCUMENT_ROOT']."/bitrix/js/".self::$MODULE_ID."/tmpExport.txt";
				if(file_exists($tmpExportFile)){
					unlink($tmpExportFile);
				}
				$us=self::cityUpdater();
				if($us['result']!='error')
					$arResult = array(
						'text' => ($us['result'] == 'done') ? GetMessage("IPOLSDEK_SYNCTY_LBL_SCOD") : '',
						'status' => $us['result']
					);
				else
					$arResult = array(
						'text' => GetMessage("IPOLSDEK_ERRLOG_ERRSUNCCITY")." ".$us['error'],
						'status' => 'error'
					);
			}else
				$arResult = array(
					'text'   => GetMessage("IPOLSDEK_DELCITYERROR")." ".$result,
					'status' => 'error'
				);

			if($params['mode'] == 'json')
				echo json_encode(self::zajsonit($arResult));
			else
				return $arResult;
		}

		static function senders($params = false){
			if(!self::isAdmin('R')) return false;
			$path = $_SERVER['DOCUMENT_ROOT'].'/bitrix/tools/'.self::$MODULE_ID.'/senders.txt';
			if($params){
				$dir = $_SERVER['DOCUMENT_ROOT'].'/bitrix/tools/'.self::$MODULE_ID;
				if(!file_exists($dir))
					mkdir($dir);
				return file_put_contents($path,serialize($params));
			}
			elseif(file_exists($path))
				return unserialize(file_get_contents($path));
			else
				return false;
		}

		static function getAccountSelect($params){
			$accounts = array(0=>GetMessage('IPOLSDEK_TC_DEFAULT')) + sqlSdekLogs::getAccountsList();
			$soloAccount = (count($accounts) <= 2);
			if($soloAccount)
				echo $params['country'].'<-%->'.GetMessage('IPOLSDEK_TC_DEFAULT');
			else{
				echo $params['country'].'<-%->';
				sdekOption::makeSelect('countries['.$params['country'].'][acc]',$accounts,$params['default']);
			}
		}

		static function ressurect(){
		    \Ipolh\SDEK\option::set('sdekDeadServer',false);
		}

	/*()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
												������ �� �������
	== agentUpdateList ==  == agentOrderStates ==
	()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()*/


		static function agentUpdateList(){ // ���� ��������� ������ �������, ���������� � �����
			if(!self::updateList())
				self::errorLog(GetMessage('IPOLSDEK_UPDT_ERR'));
			self::cityUpdater();
			return 'sdekOption::agentUpdateList();';
		}

		static function agentOrderStates(){ // ���� ��������� �������� �������
			self::getOrderStates();
			self::killOldInvoices(); // ������ ������ ����� ����� � �������
			return 'sdekOption::agentOrderStates();';
		}


	/*()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
													�����������
		== getOrderStates ==  == updateList == == cityUpdater == == requestCityFile ==  == slaughterCities ==  == getOrderState ==
	()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()*/

		static function getOrderStates(){//������ �������� �������
			if(!cmodule::includemodule('sale')){self::errorLog(GetMessage("IPOLSDEK_ERRLOG_NOSALEOOS"));return false;}//��� ����� sale ����� �����
			
			$bdOrders = sqlSdekOrders::select();

			if($bdOrders->Fetch()){
				$dateFirst = date("Y-m-d",\Ipolh\SDEK\option::get('statCync'));

				$accounts = sqlSdekLogs::getAccountsList();

				foreach($accounts as $id => $acc){
					$headers = self::getXMLHeaders($id);

					$XML = '<?xml version="1.0" encoding="UTF-8" ?>
		<StatusReport Date="'.$headers['date'].'" Account="'.$headers['account'].'" Secure="'.$headers['secure'].'">
			<ChangePeriod DateFirst="'.$dateFirst.'" DateLast="'.date('Y-m-d').'"/>
		</StatusReport>
	';

					$result = self::sendToSDEK($XML,'status_report_h');
					\Ipolh\SDEK\Bitrix\Admin\Logger::statusCheck(array('Request' => $XML, 'Response'=> $result['result']));

                    $arOrders = array();

					if($result['code'] != 200)
						self::errorLog(GetMessage("IPOLSDEK_GOS_UNBLSND").GetMessage("IPOLSDEK_ERRORLOG_BADRESPOND").$result['code']);
					else{
						$xml = simplexml_load_string($result['result']);

						foreach($xml->Order as $orderMess){
							$arOrders[]=array(
								'DispatchNumber' => (string)$orderMess['DispatchNumber'],
								'State'			 => (int)$orderMess->Status['Code'],
								'Number'		 => (int)$orderMess['Number'],
								'Description'    => (string)$orderMess->Status['Description']
							);
						}
					}

					if(count($arOrders))
						self::setOrderStates($arOrders);
				}
			}

			if(!self::$ERROR_REF){
                \Ipolh\SDEK\option::set('statCync',mktime());
            }
		}

		static function getOrderState($params){
			$arOrder = false;

			if(is_array($params)){
				if(array_key_exists('DispatchNumber',$params))
					$dNumber = $params['DispatchNumber'];
				else{
					$arOrder = sqlSdekOrders::select(array(),array('ID' => $params['ID']))->Fetch();
					$dNumber = $arOrder['DispatchNumber'];
				}
			}else
				$dNumber = $params;

			if(!cmodule::includemodule('sale')){self::errorLog(GetMessage("IPOLSDEK_ERRLOG_NOSALEOOS"));return false;}//��� ����� sale ����� �����

			if(!$arOrder)
				$arOrder = sqlSdekOrders::select(array(),array('SDEK_ID' => $dNumber))->Fetch();

			$headers = self::getXMLHeaders(array('ID' => self::getOrderAcc($arOrder)));
			$return = false;

			$XML = '<?xml version="1.0" encoding="UTF-8" ?>
			<StatusReport Date="'.$headers['date'].'" Account="'.$headers['account'].'" Secure="'.$headers['secure'].'">
				<Order DispatchNumber="'.$dNumber.'"/>
			</StatusReport>
			';

			$result = self::sendToSDEK($XML,'status_report_h');
			\Ipolh\SDEK\Bitrix\Admin\Logger::statusCheck(array('Request' => $XML, 'Response'=> $result['result']));

			if($result['code'] != 200)
				self::errorLog(GetMessage("IPOLSDEK_GOS_UNBLSND").GetMessage("IPOLSDEK_ERRORLOG_BADRESPOND").$result['code']);
			else{
				$xml = simplexml_load_string($result['result']);
				$arOrder=array(array(
					'DispatchNumber' => (string)$xml->Order['DispatchNumber'],
					'State'			 => (int)$xml->Order->Status['Code'],
					'Number'		 => (int)$xml->Order['Number'],
					'Description'    => (string)$xml->Order->Status['Description']
				));
				self::setOrderStates($arOrder);
			}
		}

		private static function setOrderStates($arOrders){
			$arStateCorr = array(
				 1 => "OK",
				 2 => "DELETE",
				 3 => "STORE",
				 4 => "DELIVD",
				 5 => "OTKAZ",
				 6 => "TRANZT",
				 7 => "TRANZT",
				 8 => "TRANZT",
				 9 => "TRANZT",
				10 => "TRANZT",
				11 => "CORIER",
				12 => "PVZ",
				13 => "TRANZT",
				16 => "TRANZT",
				17 => "TRANZT",
				18 => "TRANZT",
				19 => "TRANZT",
				20 => "TRANZT",
				21 => "TRANZT",
				22 => "TRANZT"
			);

			global $USER;
			if(!is_object($USER))
				$USER = new CUser();

			foreach($arOrders as $orderMess){
				if(array_key_exists($orderMess['State'],$arStateCorr)){// ������ �� ������
					$curState = $arStateCorr[$orderMess['State']];
					$arOrder = sqlSdekOrders::select(array(),array('SDEK_ID' => $orderMess['DispatchNumber']))->Fetch();
					if(!$arOrder) // not from API
						continue;
					$mode = ($arOrder['SOURCE'] == 1 ) ? 'shipment' : 'order';
					if($curState == 'DELETE')
						sqlSdekOrders::Delete($arOrder['ORDER_ID'],$mode);
					if($arOrder['OK']){
						if(!sqlSdekOrders::updateStatus(array(
							"ORDER_ID" => $arOrder['ORDER_ID'],
							"STATUS"   => $curState,
							"SOURCE"   => $arOrder['SOURCE']
						)))
							self::errorLog(GetMessage('IPOLSDEK_GOS_HASERROR').GetMessage('IPOLSDEK_GOS_CANTUPDATEREQ').$arOrder['ORDER_ID'].". ".GetMessage('IPOLSDEK_GOS_STATUS').$curState.".");
						elseif($curState !== $arOrder['STATUS']){
							// update statuses in Bitrix only if got new status
							$newStat = \Ipolh\SDEK\option::get((($arOrder['SOURCE'] == 1)?"stShipment":"status").$curState);
							if($newStat && strlen($newStat) < 3){
								if($arOrder['SOURCE'] == 1){ // �����������
									$shipment = self::getShipmentById($arOrder['ORDER_ID']);
									if($shipment['STATUS_ID'] != $newStat)
										if(!self::setShipmentField($arOrder['ORDER_ID'],'STATUS_ID',$newStat))
											self::errorLog(GetMessage('IPOLSDEK_GOS_HASERROR').GetMessage('IPOLSDEK_GOS_CANTUPDATESHP').$arOrder['ORDER_ID'].". ".GetMessage('IPOLSDEK_GOS_STATUS').$curState.".");
								}else{ // �����
									$order = CSaleOrder::GetByID($arOrder['ORDER_ID']);
									if($order['STATUS_ID'] != $newStat){
										if(!CSaleOrder::StatusOrder($arOrder['ORDER_ID'],$newStat))
											self::errorLog(GetMessage('IPOLSDEK_GOS_HASERROR').GetMessage('IPOLSDEK_GOS_CANTUPDATEORD').$arOrder['ORDER_ID'].". ".GetMessage('IPOLSDEK_GOS_STATUS').$curState.".");
									}
								}
							}

                            foreach(GetModuleEvents(self::$MODULE_ID, "onNewStatus", true) as $arEvent)
                                ExecuteModuleEventEx($arEvent,Array($arOrder['ORDER_ID'],$curState,$arOrder['SOURCE']));
							
							// ����������
							if(
								$orderMess['State'] == 4 && 
								\Ipolh\SDEK\option::get("markPayed") == 'Y' &&
								$arOrder['SOURCE'] != 1
							){
								$order = CSaleOrder::GetByID($arOrder['ORDER_ID']);
								if($order && $order['PAYED'] != 'Y'){
									if(self::isConverted()){
										$order = \Bitrix\Sale\Order::load($arOrder['ORDER_ID']); 
										if($order && is_object($order)){
											$paymentCollection = $order->getPaymentCollection(); 
											foreach($paymentCollection as $payment)
											if(!$payment->isPaid()){ 
												$payment->setPaid("Y"); 
												$order->save();   
											}
										} else {
											self::errorLog(GetMessage('IPOLSDEK_GOS_HASERROR').GetMessage('IPOLSDEK_GOS_CANTMARKPAYED').$arOrder['ORDER_ID'].". ");
										}
									}elseif(!CSaleOrder::PayOrder($arOrder['ORDER_ID'],"Y"))
										self::errorLog(GetMessage('IPOLSDEK_GOS_HASERROR').GetMessage('IPOLSDEK_GOS_CANTMARKPAYED').$arOrder['ORDER_ID'].". ");
								}
							}
						}
					}else // ������ ������� ��������������� �����
						self::errorLog(GetMessage('IPOLSDEK_GOS_HASERROR').GetMessage('IPOLSDEK_GOS_BADREQTOUPDT'.$mode).$arOrder['ORDER_ID'].". ".GetMessage('IPOLSDEK_GOS_STATUS').$curState.".");
				}else
					self::errorLog(GetMessage("IPOLSDEK_GOS_HASERROR").GetMessage("IPOLSDEK_GOS_UNKNOWNSTAT").($orderMess['Number'])." : ".$orderMess['State']." (".$orderMess['Description']."). ".GetMessage("IPOLSDEK_GOS_NOTUPDATED"));
			}
		}

		static function updateList(){ // ���������� ������ ������� ���������
			self::ordersNum();
			$syncResult = \Ipolh\SDEK\Bitrix\Controller\pvzController::updateList();

			if(!$syncResult['SUCCESS'] && \Ipolh\SDEK\option::get('logged')){
                $file=fopen($_SERVER["DOCUMENT_ROOT"]."/bitrix/js/".self::$MODULE_ID."/hint.txt","a");
                fwrite($file,"<br><br><strong>".date('d.m.Y H:i:s')."</strong><br>".$syncResult['ERROR']);
                fclose($file);
            }

            return $syncResult['SUCCESS'];
		}

		static function cityUpdater($params=false){
			if(!$params)
				$params = array('timeout'=>false,'mode'=>false);
			cmodule::includeModule('sale');
			$countries = self::getCountryOptions();

			$exportClass = false;
			if(file_exists($_SERVER['DOCUMENT_ROOT']."/bitrix/js/".self::$MODULE_ID."/tmpExport.txt"))
				$exportClass = unserialize(file_get_contents($_SERVER['DOCUMENT_ROOT']."/bitrix/js/".self::$MODULE_ID."/tmpExport.txt"));
			else{
				foreach($countries as $country => $val)
					if($val['act'] == 'Y'){
						$exportClass = new cityExport($country,$params['timeout']);
						break;
					}
			}
			if($exportClass){
				$exportClass->start();
				$result = $exportClass->result;
				if($result['result'] == 'error')
					self::errorLog(GetMessage("IPOLSDEK_ERRLOG_ERRSUNCCITY")." ".$exportClass->result['error']);
				elseif($result['result'] == 'end'){
					$result['country'] = $exportClass->countryMode;
					$nxtCntry = false; // f*ck internal pointer, this crap doesn't work
					foreach($countries as $country => $params)
						if($params['act'] == 'Y'){
							if($nxtCntry){
								$nxtCntry = $country;
								break;
							}
							if($country == $exportClass->countryMode)
								$nxtCntry = true;
						}

					if($nxtCntry && $nxtCntry !== true){
						$exportClass = new cityExport($nxtCntry,$params['timeout']);
						$exportClass->quickSave();
						$result['result']  = 'country';
					}
				}
			}else
				$result = array(
					'result' => 'error',
					'error'  => GetMessage("IPOLSDEK_ERRLOG_ERRNOCOUNTRIES")
				);

			if($params['mode'] == 'json')
				echo json_encode(self::zajsonit($result));
			else
				return $result;
		}


		static function slaughterCities(){
			if(!self::isAdmin()) return false;
			global $DB;
			if($DB->Query("SELECT 'x' FROM ipol_sdekcities", true)){
				$errors = $DB->RunSQLBatch($_SERVER['DOCUMENT_ROOT']."/bitrix/modules/".self::$MODULE_ID."/install/db/mysql/unInstallCities.sql");
				if($errors !== false)
					return "error.".implode("", $errors);
				$errors = $DB->RunSQLBatch($_SERVER['DOCUMENT_ROOT']."/bitrix/modules/".self::$MODULE_ID."/install/db/mysql/installCities.sql");
				if($errors !== false)
					return "error.".implode("", $errors);
				return 'done';
			}
		}

		static function getCountries($makeArrays=false){ // ������ ����� �� �����������
			$arCountries = array('rus'=>false,'blr'=>false,'kaz'=>false);
			if($makeArrays){
				foreach($arCountries as $country => $nothing)
					$arCountries[$country] = self::getCountryDescr($country);
			}else
				$arCountries = array_keys($arCountries);
			return $arCountries;
		}

		static function getCountryDescr($cntry=false){
			$descr = false;
			
			switch($cntry){
				case false :
				case 'rus' : $descr = array(
									'FILE'  => 'city.csv',
									'NAME'  => array('Russia','Russian Federation',GetMessage('IPOLSDEK_SYNCTY_rus'),GetMessage('IPOLSDEK_SYNCTY_rus2'),GetMessage('IPOLSDEK_SYNCTY_rus3')),
									'LABEL' => GetMessage('IPOLSDEK_SYNCTY_rus')
								);
							break;
				case 'kaz' : $descr = array(
									'FILE' => 'kaz_city.csv',
									'NAME' => array('Kazakhstan',GetMessage('IPOLSDEK_SYNCTY_kaz')),
									'LABEL' => GetMessage('IPOLSDEK_SYNCTY_kaz')
								);
							break;
				case 'blr' : $descr = array(
									'FILE' => 'bel_city.csv',
									'NAME' => array('Belarus','Belorussia',GetMessage('IPOLSDEK_SYNCTY_blr'),GetMessage('IPOLSDEK_SYNCTY_BELORUSSIA')),
									'LABEL' => GetMessage('IPOLSDEK_SYNCTY_blr')
								);
							break;
			}
			return $descr;
		}

		static function requestCityFile($cntr=false){
			$cntrDescr = self::getCountryDescr($cntr);
			if(!$cntrDescr)
				return false;
			$request = self::nativeReq($cntrDescr['FILE']);
			if($request['code'] != '200'){
				self::errorLog(GetMessage('IPOLSDEK_FILEIPL_UNBLUPDT').$request['code']);
				return false;
			}
			file_put_contents($_SERVER['DOCUMENT_ROOT']."/bitrix/js/".self::$MODULE_ID."/".$cntrDescr['FILE'],$request['result']);
			return true;
		}

		protected static function ordersNum(){
			cmodule::includeModule('sale');
			// ���������� ���� �� ����� ����������, ������ ����� ������� ����� �����
			$lastId = \Ipolh\SDEK\option::get('lastSuncId');
			$arOrders = array();
			$bdReqs = sqlSdekOrders::select(array("ID","ASC"),array(">ID"=>$lastId,"OK"=>true));
			while($arReq=$bdReqs->Fetch()){
				$year  = date("Y",$arReq['UPTIME']);
				if(!array_key_exists($year,$arOrders))
					$arOrders[$year] = array();

				$month = date("m",$arReq['UPTIME']);
				if(array_key_exists($month,$arOrders[$year]))
					$arOrders[$year][$month]['vis'] += 1;
				else
					$arOrders[$year][$month]['vis'] = 1;
				$arOrders[$year][$month]['id'][] = $arReq['ORDER_ID'];
				if($lastId < $arReq['ID'])
					$lastId = $arReq['ID'];
			}

			foreach($arOrders as $year => $arYear)
				foreach($arYear as $month => $arMonth){
					$ttlPrice = 0;
					$orders = CSaleOrder::GetList(array(),array('ID'=>$arMonth['id']),false,false,array('ID','PRICE'));
					while($order=$orders->Fetch())
						$ttlPrice += $order['PRICE'];
					$arOrders[$year][$month]['prc'] = round($ttlPrice);
					unset($arOrders[$year][$month]['id']);
				}

			if(count($arOrders)){
				$auth = self::getBasicAuth();
				$request = self::nativeReq('sdekStat.php',array(
					'req' => json_encode(self::zajsonit(array(
						'reqs' => $arOrders,
						'acc'  => $auth['ACCOUNT'],
						'host' => $_SERVER['SERVER_NAME'],
						'cms'  => 'bitrix'
					)))
				));
				if(
					$request['code']=='200' &&
					strpos($request['result'],'good') !== false
				){
				    \Ipolh\SDEK\option::set('lastSuncId',$lastId);
                }
			}
		}

		public static function restorePVZ()
        {
            $result = \Ipolh\SDEK\Bitrix\Controller\pvzController::updateList('backup');
            echo json_encode($result);
        }

		
		/*()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
														������ �������
			== setImport ==  == handleImport ==  == getCityTypeId ==
		()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()*/


		static function setImport($mode = 'N'){
			if(is_array($mode))
				$mode = (array_key_exists('mode',$mode)) ? $mode['mode'] : 'N';
			\Ipolh\SDEK\option::set('importMode',$mode);
		}

		static function handleImport($params){
			if(!self::isAdmin()) return false;
			cmodule::includeModule('sale');
			$fname = ($params['fileName']) ? $params['fileName'] : 'tmpImport.txt';
			switch($params['mode']){
				case 'setSync': $sync = self::cityUpdater($_REQUEST['timeOut']);
					if($sync['result'] == 'pause' || $sync['result'] == 'country')
						 $arReturn = array(
							'text' => GetMessage('IPOLSDEK_IMPORT_PROCESS_SYNC').$sync['done'].GetMessage("IPOLSDEK_IMPORT_PROCESS_FROM").$sync['total'],
							'step' => 'contSync',
							'result' => $sync
						 );
					else
						$arReturn = array(
							'text' => GetMessage('IPOLSDEK_IMPORT_STATUS_SDONE')."<br><br>",
							'step' => 'startImport',
							'result' => $sync
						 );
				break;
				case 'setImport': 
					$importClass = new cityExport('rus',$params['timeOut'],$fname);
					$importClass->pauseImport();
					if($importClass->error)
						$arReturn = array(
							'text'   => GetMessage('IPOLSDEK_IMPORT_ERROR_lbl').$importClass->error,
							'step' 	 => false,
							'result' => 'error',
						);
					else
						$arReturn = array(
							'text'   => GetMessage('IPOLSDEK_IMPORT_STATUS_MDONE'),
							'step'   => 'init',
							'result' => $importClass->result,
						);
				break;
				case 'process' :
					if(!file_exists($_SERVER['DOCUMENT_ROOT']."/bitrix/js/".self::$MODULE_ID."/{$fname}"))
						$arReturn = array(
							'text'   => GetMessage('IPOLSDEK_IMPORT_ERROR_NOFILES'),
							'step' 	 => false,
							'result' => 'error',
						);
					else{
						$importClass = unserialize(file_get_contents($_SERVER['DOCUMENT_ROOT']."/bitrix/js/".self::$MODULE_ID."/{$fname}"));
						$importClass->loadCities();
						$errors = ($importClass->error) ? GetMessage('IPOLSDEK_IMPORT_ERROR_WHILEIMPORT')."<div class='IPOLSDEK_import_errors'>".$importClass->error."</div>" : '';
						if($importClass->result['result'] == 'end'){
							$arReturn = array(
								'text'   => GetMessage('IPOLSDEK_IMPORT_STATUS_IDONE').$importClass->result['added'].".".$errors ,
								'step' 	 => 'endImport',
								'result' => $importClass->result
							);
							self::setImport('N');
						}else
							$arReturn = array(
								'text'   => "> ".GetMessage('IPOLSDEK_IMPORT_PROCESS_'.$importClass->result['mode'])." ".GetMessage('IPOLSDEK_IMPORT_PROCESS_WORKING').($importClass->result['done']).GetMessage('IPOLSDEK_IMPORT_PROCESS_FROM').$importClass->result['total']." ".$errors,
								'step' 	 => 'process',
								'result' => 'process',
							);
					}
				break;
			}
			if($params['noJson'])
				return $arReturn;
			else
				echo json_encode(sdekdriver::zajsonit($arReturn));
		}

		static function getCityTypeId(){
			if(!sdekdriver::isLocation20()) return;
			$tmp = \Bitrix\Sale\Location\TypeTable::getList(array('select'=>array('*'),'filter'=>array('CODE'=>'CITY')))->Fetch();
			return (is_array($tmp) && array_key_exists('ID',$tmp)) ? $tmp['ID'] : false;
		}

		
		/*()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
														�����������
			== setAutoloads ==  == autoLoadsHandler ==
		()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()*/
		

		static function setAutoloads($mode = 'Y'){
			if(is_array($mode))
				$mode = (array_key_exists('mode',$mode)) ? $mode['mode'] : 'Y';
			\Ipolh\SDEK\option::set('autoloads',$mode);
		}

		static function autoLoadsHandler($params){
			sdekdriver::$MODULE_ID;
			cmodule::includeModule('sale');
			$arSelect[($params['by'])?$params['by']:'ORDER_ID']=($params['sort'])?$params['sort']:'DESC';

			$arNavStartParams['iNumPage']=($params['page'])?$params['page']:1;
			$arNavStartParams['nPageSize']=($params['pgCnt']!==false)?$params['pgCnt']:1;

			$arFilter = array('CODE'=>'IPOLSDEK_AUTOSEND');
			foreach($params as $code => $val)
				if(strpos($code,'F')===0 && $code != 'FSTATUS')
					$arFilter[substr($code,1)]=$val;
				elseif($code == 'FSTATUS' && $val == 'Y')
					$arFilter['!VALUE']=GetMessage('IPOLSDEK_AUTOLOAD_RESPOND_1');
			$requests = CSaleOrderPropsValue::GetList($arSelect,$arFilter,false,$arNavStartParams);
			$strHtml='';
			$action = (self::isConverted()) ? '/bitrix/admin/sale_order_view.php?ID=' : '/bitrix/admin/sale_order_detail.php?ID=';
			while($request=$requests->Fetch()){
				$addClass = ($request['VALUE'] == GetMessage('IPOLSDEK_AUTOLOAD_RESPOND_1')) ? 'IPOLSDEK_TblStOk' : 'IPOLSDEK_TblStErr';

				$SDEKState = '';
				if($addClass == 'IPOLSDEK_TblStOk'){
					$SDEKState = sqlSdekOrders::GetByOI($request['ORDER_ID']);
					if(!$SDEKState['OK'])
						$addClass = 'IPOLSDEK_TblStErr';
					$SDEKState = $SDEKState['STATUS'];
				}
	
				$strHtml.='<tr class="adm-list-table-row '.$addClass.'">
					<td class="adm-list-table-cell"><div><a href="'.$action.$request['ORDER_ID'].'" target="_blank">'.$request['ORDER_ID'].'</a></div></td>
					<td class="adm-list-table-cell"><div>'.$request['MESS_ID'].'</div></td>
					
					<td class="adm-list-table-cell"><div>'.$request['VALUE'].'</div></td>
					<td class="adm-list-table-cell"><div>'.$SDEKState.'</div></td>';
			}

			echo json_encode(
				self::zajsonit(
					array(
						'ttl' =>$requests->NavRecordCount,
						'mP'  =>$requests->NavPageCount,
						'pC'  =>$requests->NavPageSize,
						'cP'  =>$requests->NavPageNomer,
						'sA'  =>$requests->NavShowAll,
						'html'=>$strHtml
					)
				)
			);
		}

		static function killAutoReq($orderId=false){
			if(!$orderId || !self::isAdmin())
				return;
			cmodule::includeModule('sale');
			$val = CSaleOrderPropsValue::GetList(array(),array('CODE'=>'IPOLSDEK_AUTOSEND','ORDER_ID'=>$orderId))->Fetch();
			if($val)
				CSaleOrderPropsValue::Delete($val['ID']);
		}


		/*()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
														����� � ����
			== select ==  == CheckRecord ==  == nativeReq ==
		()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()*/


		public static function select($arOrder=array("ID","DESC"),$arFilter=array(),$arNavStartParams=array()){ // ������
			if(!self::isAdmin('R')) 
				return false; 
			return sqlSdekOrders::select($arOrder,$arFilter,$arNavStartParams);
		}
		public static function CheckRecord($orderId,$mode='order'){// �������� ����� ����� �� ������ / ��������
			if(!self::isAdmin('R')) 
				return false;
			return sqlSdekOrders::CheckRecord($orderId,$mode);
		}

		public static function nativeReq($where,$what=false){
			if(!$where) return false;
			$ch = curl_init();
			curl_setopt($ch,CURLOPT_URL,'https://ipolh.com/webService/sdek/'.$where);
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
			if($what){
				curl_setopt($ch, CURLOPT_POST, TRUE);
				curl_setopt($ch, CURLOPT_POSTFIELDS, $what);
			}
			$result = curl_exec($ch);
			$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
			curl_close($ch);
			return array(
				'result' => $result,
				'code'   => $code
			);
		}

		// LEGACY
		static function updateCities($params=array()){
			$exportClass = false;
			cmodule::includeModule('sale');
			if(file_exists($_SERVER['DOCUMENT_ROOT']."/bitrix/js/".self::$MODULE_ID."/tmpExport.txt"))
				$exportClass = unserialize(file_get_contents($_SERVER['DOCUMENT_ROOT']."/bitrix/js/".self::$MODULE_ID."/tmpExport.txt"));
			else
				$exportClass = new cityExport('rus',$params['timeout']);

			$exportClass->start();

			if($exportClass->result['result'] == 'error')
				self::errorLog(GetMessage("IPOLSDEK_ERRLOG_ERRSUNCCITY")." ".$exportClass->result['error']);

			if($params['mode'] == 'json')
				echo json_encode($exportClass->result);
			else
				return $exportClass->result;
		}
	}
?>