Your IP : 216.73.216.86


Current Path : /var/www/homesaver/www/bitrix/modules/ipol.sdek/classes/mysql/
Upload File :
Current File : /var/www/homesaver/www/bitrix/modules/ipol.sdek/classes/mysql/sqlSdekOrders.php

<?php
class sqlSdekOrders
{
	public function toLog($wat,$sign){sdekHelper::toLog($wat,$sign);}
	private static $tableName = "ipol_sdek";
	public static function Add($Data)
    {
        // = $Data = format:
		// PARAMS - ALL INFO
		// ORDER_ID - corresponding order
		// STATUS - response from iml
		// MESSAGE - info from server
		// OK - 0 / 1 - was confirmed
		// UPTIME - order add time
		
		global $DB;
        
		if(!$Data['STATUS'])
			$Data['STATUS']='NEW';
		if($Data['STATUS']=='NEW')
			$Data['MESSAGE']='';
		if(is_array($Data['PARAMS'])) {
			$Data['PARAMS'] = serialize($Data['PARAMS']);
		}
		
		$Data['UPTIME']= time();
			
		$rec = self::CheckRecord($Data['ORDER_ID'],$Data['SOURCE']);
		if($rec)
		{
			$err_mess = "";
			$strUpdate = $DB->PrepareUpdate(self::$tableName, $Data);
			$strSql = "UPDATE ".self::$tableName." SET ".$strUpdate." WHERE ID=".$rec['ID'];
			$DB->Query($strSql, false, $err_mess.__LINE__);
		}
		else
		{
			$arInsert = $DB->PrepareInsert(self::$tableName, $Data);
			$strSql =
				"INSERT INTO ".self::$tableName."(".$arInsert[0].") ".
				"VALUES(".$arInsert[1].")";
			$DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__);
		}
		return self::CheckRecord($Data['ORDER_ID'],$Data['SOURCE']); 
    }

    public static function select($arOrder = array("ID", "DESC"), $arFilter = array(), $arNavStartParams = array())
    {
        global $DB;

        if (!$arFilter) {
            $arFilter = array();
        }
        $possFields = self::getPossFilterFields();
        $_arFilter = $arFilter;
        $arFilter = array();
        foreach ($_arFilter as $key => $val) {
            $field = self::checkFilterField($key, $possFields);
            if ($field) {
                $skip = false;
                switch ($possFields[$field]) {
                    case 'int'    :
                        if (!is_array($val)) {
                            $val = (int)$val;
                        } else {
                            foreach ($val as $vKey => $vData) {
                                $val[$vKey] = (int)$vData;
                            }
                        }
                        break;
                    case 'string' :
                        if (!is_array($val)) {
                            $val = (string)$val;
                            if (strpos($val, '(') !== false) {
                                $skip = true;
                            }
                        } else {
                            foreach ($val as $vKey => $vData) {
                                $val[$vKey] = (string)$vData;
                                if (strpos($val[$vKey], '(') !== false) {
                                    unset($val[$vKey]);
                                }
                            }
                            if (!count($val)) {
                                $skip = true;
                            }
                        }
                        break;
                }
                if (!$skip) {
                    $arFilter[$key] = $val;
                }
            }
        }

        $strSql = '';

        $where = '';
        if (!empty($arFilter['>=UPTIME']) && strpos($arFilter['>=UPTIME'], ".") !== false)
            $arFilter['>=UPTIME'] = strtotime($arFilter['>=UPTIME']);
        if (!empty($arFilter['<=UPTIME']) && strpos($arFilter['<=UPTIME'], ".") !== false)
            $arFilter['<=UPTIME'] = strtotime($arFilter['<=UPTIME']);

        if (is_array($arFilter) && count($arFilter) > 0)
            foreach ($arFilter as $field => $value) {
                if ($field == 'SOURCE' && $value == 0)
                    $where .= ' and ' . $DB->ForSql(self::getSource('order'));
                else {
                    if (strpos($field, '!') !== false)
                        $where .= ' and ' . $DB->ForSql(substr($field, 1)) . ' != "' . $DB->ForSql($value) . '"';
                    elseif (strpos($field, '<=') !== false)
                        $where .= ' and ' . $DB->ForSql(substr($field, 2)) . ' <= "' . $DB->ForSql($value) . '"';
                    elseif (strpos($field, '>=') !== false)
                        $where .= ' and ' . $DB->ForSql(substr($field, 2)) . ' >= "' . $DB->ForSql($value) . '"';
                    elseif (strpos($field, '>') !== false)
                        $where .= ' and ' . $DB->ForSql(substr($field, 1)) . ' > "' . $DB->ForSql($value) . '"';
                    elseif (strpos($field, '<') !== false)
                        $where .= ' and ' . $DB->ForSql(substr($field, 1)) . ' < "' . $DB->ForSql($value) . '"';
                    else {
                        if (is_array($value)) {
                            $where .= ' and (';
                            foreach ($value as $val)
                                $where .= $DB->ForSql($field) . ' = "' . $DB->ForSql($val) . '" or ';
                            $where = substr($where, 0, strlen($where) - 4) . ")";
                        } else
                            $where .= ' and ' . $DB->ForSql($field) . ' = "' . $DB->ForSql($value) . '"';
                    }
                }
            }
        if ($where)
            $strSql .= "
			WHERE " . substr($where, 4);

        if (!empty($arOrder) && in_array($arOrder[0], array('ID', 'ORDER_ID', 'STATUS', 'UPTIME')) && ($arOrder[1] == 'ASC' || $arOrder[1] == 'DESC'))
            $strSql .= "
			ORDER BY " . $arOrder[0] . " " . $arOrder[1];

        $err_mess = "";
        $cnt = $DB->Query("SELECT COUNT(*) as C FROM " . self::$tableName . " " . $strSql, false, $err_mess . __LINE__)->Fetch();

        if (!array_key_exists('nPageSize', $arNavStartParams) && $arNavStartParams['nPageSize'] == 0)
            $arNavStartParams['nPageSize'] = $cnt['C'];

        $strSql = "SELECT * FROM " . self::$tableName . " " . $strSql;

        $res = new CDBResult();
        $res->NavQuery($strSql, $cnt['C'], $arNavStartParams);

        return $res;
    }
		
	public static function Delete($orderId,$mode='order'){
		global $DB;
		$orderId = $DB->ForSql($orderId);
		$strSql =
            "DELETE FROM ".self::$tableName." 
            WHERE ORDER_ID='".$orderId."' && ".self::getSource($mode);
		$DB->Query($strSql, true);
        
        return true; 
    }
	
	public static function GetByOI($orderId){
		global $DB;
		$orderId=$DB->ForSql($orderId);
		$strSql =
            "SELECT PARAMS, STATUS, SDEK_ID, MESSAGE, OK, MESS_ID, ORDER_ID, ACCOUNT, SDEK_UID ".
            "FROM ".self::$tableName." ".
			"WHERE ORDER_ID = '".$orderId."'  && ".self::getSource('order');
		$res = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__);
		if($arr = $res->Fetch())
			return $arr;
		else return false;
	}

	public static function GetBySI($shipmentId){
		global $DB;
		$shipmentId=$DB->ForSql($shipmentId);
		$strSql =
            "SELECT PARAMS, STATUS, SDEK_ID, MESSAGE, OK, MESS_ID, ORDER_ID, ACCOUNT, SDEK_UID ".
            "FROM ".self::$tableName." ".
			"WHERE ORDER_ID = '".$shipmentId."'  && ".self::getSource('shipment');
		$res = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__);
		if($arr = $res->Fetch())
			return $arr;
		else return false;
	}

    public static function GetByUId($uid){
        global $DB;
        $strSql =
            "SELECT PARAMS, STATUS, SDEK_ID, MESSAGE, OK, MESS_ID, ORDER_ID, ACCOUNT, SDEK_UID, SOURCE ".
            "FROM ".self::$tableName." ".
            "WHERE SDEK_UID = '".$uid."'";
        $res = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__);
        if($arr = $res->Fetch())
            return $arr;
        else return false;
    }
	
	public static function CheckRecord($orderId,$mode=0){
		global $DB;

		$source = (is_numeric($mode)) ? "SOURCE = '".$mode."'" : self::getSource($mode);
		
		$orderId = $DB->ForSql($orderId);
        $strSql =
            "SELECT ID, STATUS ".
            "FROM ".self::$tableName." ".
			"WHERE ORDER_ID = '".$orderId."' && ".$source;
		$res = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__);
		if($res && $arr = $res->Fetch())
			return $arr;
		return false;
	}

	public static function updateStatus($arParams){
		global $DB;
		foreach($arParams as $key => $val)
			$arParams[$key] = $DB->ForSql($val);

		$okStat='';
		if($arParams["STATUS"]=='OK')
			$okStat=" OK='1',";
		elseif($arParams["STATUS"]=='DELETE')
			$okStat=" OK='',";

		$setStr = "STATUS ='".$arParams["STATUS"]."', MESSAGE = '".$arParams["MESSAGE"]."',";
		if (isset($arParams["SDEK_ID"]) && $arParams["SDEK_ID"])
			$setStr.="SDEK_ID = '".$arParams["SDEK_ID"]."',";
        if (isset($arParams["SDEK_UID"]) && $arParams["SDEK_UID"])
            $setStr.="SDEK_UID = '".$arParams["SDEK_UID"]."',";
		if (isset($arParams["MESS_ID"]) && $arParams["MESS_ID"])
			$setStr.="MESS_ID = '".$arParams["MESS_ID"]."',";
		if (isset($arParams["ACCOUNT"]) && $arParams["ACCOUNT"])
			$setStr.="ACCOUNT = '".$arParams["ACCOUNT"]."',";

		$setStr.=$okStat." UPTIME= '". time() ."'";

		if(array_key_exists('SOURCE',$arParams) && $arParams['SOURCE'])
			$source = "SOURCE = '".$arParams['SOURCE']."'";
		elseif(array_key_exists('SOURCE',$arParams) && $arParams['SOURCE'] === '')
			$source = "SOURCE <=> NULL";
		elseif(array_key_exists('mode',$arParams))
			$source = self::getSource($arParams['mode']);
		else
			$source = "SOURCE = 0";

		$strSql =
            "UPDATE ".self::$tableName." 
			SET ".$setStr."
			WHERE ORDER_ID = '".$arParams["ORDER_ID"]."' && $source";

		if($DB->Query($strSql, true))
			return true;
		else 
			return false;
	}

    /**
     * Return number of rows with some data
     * @return int
     */
    public static function getDataCount()
    {
        global $DB;
        $count = 0;

        $dbResult = $DB->Query("SELECT COUNT(*) as COUNT FROM ".self::$tableName, true);
        if ($dbResult && ($tmp = $dbResult->fetch())) {
            $count = $tmp['COUNT'];
        }

        return $count;
    }

	private static function getSource($mode='order'){
		return ($mode == 'order' || $mode == '') ? '(SOURCE <=> NULL || SOURCE = 0)' : "SOURCE = '1'";
	}

	protected static function getPossFilterFields()
    {
        return array("ID" => 'int',"MESS_ID" => 'int',"PARAMS" => 'text',"ORDER_ID"=>'int',"SOURCE"=>'int',"SDEK_ID"=>'string',"STATUS"=>'string',"MESSAGE"=> 'text',"ACCOUNT"=>'int',"OK"=>'string',"UPTIME"=>'string','SDEK_UID'=>'string');
    }

    protected static function checkFilterField($field,$filterFields)
    {
        $arKeys = array_keys($filterFields);
        foreach($arKeys as $_field){
            if(strpos($field,$_field) !== false){
                return $_field;
            }
        }
        return false;
    }
}
?>