Przeglądaj źródła

try fix terminal agent

alexlcdee 7 lat temu
rodzic
commit
db74bef2c9

+ 157 - 168
src/lib/Agents.php

@@ -1,4 +1,5 @@
 <?php
+
 namespace Ipol\DPD;
 
 use \Ipol\DPD\API\User\User as API;
@@ -10,172 +11,160 @@ use \Ipol\DPD\Config\ConfigInterface;
  */
 class Agents
 {
-	/**
-	 * Обновляет статусы заказов
-	 * 
-	 * Обновление статусов происходит в 2 этапа.
-	 * На первом этапе обрабатываются заказы, которые создались в статусе "Ожидают проверки менеджером DPD"
-	 * На втором этапе обрабатываются остальные заказы. Для получения изменений по статусам используется 
-	 * метод getStatesByClient
-	 * 
-	 * @param \Ipol\DPD\Config\ConfigInterface $config
-	 * 
-	 * @return void
-	 */
-	public static function checkOrderStatus(ConfigInterface $config)
-	{
-		self::checkPindingOrderStatus($config);
-		self::checkTrakingOrderStatus($config);
-	}
-
-	/**
-	 * Проверяет статусы заказов ожидающих проверки
-	 * 
-	 * @return void
-	 */
-	protected static function checkPindingOrderStatus(ConfigInterface $config)
-	{
-		$table  = \Ipol\DPD\DB\Connection::getInstance($config)->getTable('order');
-		$orders = $table->find([
-			'where' => 'ORDER_STATUS = :order_status',
-			'order' => 'ORDER_DATE_STATUS ASC, ORDER_DATE_CREATE ASC',
-			'limit' => '0,2',
-			'bind'  => [
-				':order_status' => \Ipol\DPD\Order::STATUS_PENDING
-			]
-		])->fetchAll(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, $table->getModelClass(), $table);
-		
-		foreach ($orders as $order) {
-			$order->dpd()->checkStatus();
-		}
-	}
-
-	/**
-	 * Проверяет статусы заказов прошедшие проверку
-	 * 
-	 * @return void
-	 */
-	protected static function checkTrakingOrderStatus(ConfigInterface $config)
-	{
-		if (!$config->get('STATUS_ORDER_CHECK')) {
-			return;
-		}
-
-		do {
-			$ret = API::getInstanceByConfig($config)->getService('tracking')->getStatesByClient();
-			if (!$ret) {
-				return;
-			}
-
-			$states = (array) $ret['STATES'];
-			$states = array_key_exists('DPD_ORDER_NR', $states) ? array($states) : $states;
-
-			// сортируем статусы по их времени наступления
-			uasort($states, function($a, $b) {
-				if ($a['CLIENT_ORDER_NR'] == $b['CLIENT_ORDER_NR']) {
-					$time1 = strtotime($a['TRANSITION_TIME']);
-					$time2 = strtotime($b['TRANSITION_TIME']);
-
-					return $time1 - $time2;
-				}
-
-				return $a['CLIENT_ORDER_NR'] - $b['CLIENT_ORDER_NR'];
-			});
-
-			foreach ($states as $state) {
-				$order = \Ipol\DPD\DB\Connection::getInstance($config)->getTable('order')->getByOrderId($state['CLIENT_ORDER_NR']);
-				if (!$order) {
-					continue;
-				}
-
-				$status = $state['NEW_STATE'];
-				
-				if ($order->isSelfDelivery()
-					&& $status == \Ipol\DPD\Order::STATUS_TRANSIT_TERMINAL
-					&& $order->receiverTerminalCode == $state['TERMINAL_CODE']
-				) {
-					$status = \Ipol\DPD\Order::STATUS_ARRIVE;
-				}
-
-				$order->setOrderStatus($status, $statusTime);
-				$order->orderNum = $state['DPD_ORDER_NR'] ?: $order->orderNum;
-				$order->save();
-			}
-
-			if ($ret['DOC_ID'] > 0) {
-				API::getInstanceByConfig($config)->getService('tracking')->confirm($ret['DOC_ID']);
-			}
-		} while($ret['RESULT_COMPLETE'] != 1);
-	}
-
-	/**
-	 * Загружает в локальную БД данные о местоположениях и терминалах
-	 * 
-	 * @param \Ipol\DPD\Config\ConfigInterface $config
-	 * 
-	 * @return string
-	 */
-	public static function loadExternalData(ConfigInterface $config)
-	{
-		$api = API::getInstanceByConfig($config);
-
-		$locationTable  = \Ipol\DPD\DB\Connection::getInstance($config)->getTable('location');
-		$terminalTable  = \Ipol\DPD\DB\Connection::getInstance($config)->getTable('terminal');
-
-		$locationLoader = new \Ipol\DPD\DB\Location\Agent($api, $locationTable);
-		$terminalLoader = new \Ipol\DPD\DB\Terminal\Agent($api, $terminalTable);
-
-		$currStep = $config->get('LOAD_EXTERNAL_DATA_STEP');
-		$position = $config->get('LOAD_EXTERNAL_DATA_POSITION');
-
-		switch ($currStep) {
-			case 'LOAD_LOCATION_ALL':
-				$ret      = $locationLoader->loadAll($position);
-				$currStep = 'LOAD_LOCATION_ALL';
-				$nextStep = 'LOAD_LOCATION_CASH_PAY';
-
-				if ($ret !== true) {
-					break;
-				}
-
-			case 'LOAD_LOCATION_CASH_PAY':
-				$ret      = $locationLoader->loadCashPay($position);
-				$currStep = 'LOAD_LOCATION_CASH_PAY';
-				$nextStep = 'LOAD_TERMINAL_UNLIMITED';
-
-				if ($ret !== true) {
-					break;
-				}
-
-			case 'LOAD_TERMINAL_UNLIMITED':
-				$ret      = $terminalLoader->loadUnlimited($position);
-				$currStep = 'LOAD_TERMINAL_UNLIMITED';
-				$nextStep = 'LOAD_TERMINAL_LIMITED';
-
-				if ($ret !== true) {
-					break;
-				}
-
-			case 'LOAD_TERMINAL_LIMITED':
-				$ret      = $terminalLoader->loadLimited($position);
-				$currStep = 'LOAD_TERMINAL_LIMITED';
-				$nextStep = 'LOAD_FINISH';
-
-				if ($ret !== true) {
-					break;
-				}
-			
-			default:
-				$ret      = true;
-				$currStep = 'LOAD_FINISH';
-				$nextStep = 'LOAD_LOCATION_ALL';
-			break;
-		}
-
-		$nextStep = is_bool($ret) ? $nextStep : $currStep;
-		$position = is_bool($ret) ? ''        : $ret;
-
-		$config->set('LOAD_EXTERNAL_DATA_STEP', $nextStep);
-		$config->set('LOAD_EXTERNAL_DATA_POSITION', $position);
-	}
+    /**
+     * Обновляет статусы заказов
+     *
+     * Обновление статусов происходит в 2 этапа.
+     * На первом этапе обрабатываются заказы, которые создались в статусе "Ожидают проверки менеджером DPD"
+     * На втором этапе обрабатываются остальные заказы. Для получения изменений по статусам используется
+     * метод getStatesByClient
+     *
+     * @param \Ipol\DPD\Config\ConfigInterface $config
+     *
+     * @return void
+     */
+    public static function checkOrderStatus(ConfigInterface $config)
+    {
+        self::checkPindingOrderStatus($config);
+        self::checkTrakingOrderStatus($config);
+    }
+
+    /**
+     * Проверяет статусы заказов ожидающих проверки
+     *
+     * @return void
+     */
+    protected static function checkPindingOrderStatus(ConfigInterface $config)
+    {
+        $table = \Ipol\DPD\DB\Connection::getInstance($config)->getTable('order');
+        $orders = $table->find([
+            'where' => 'ORDER_STATUS = :order_status',
+            'order' => 'ORDER_DATE_STATUS ASC, ORDER_DATE_CREATE ASC',
+            'limit' => '0,2',
+            'bind'  => [
+                ':order_status' => \Ipol\DPD\Order::STATUS_PENDING,
+            ],
+        ])->fetchAll(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, $table->getModelClass(), $table);
+
+        foreach ($orders as $order) {
+            $order->dpd()->checkStatus();
+        }
+    }
+
+    /**
+     * Проверяет статусы заказов прошедшие проверку
+     *
+     * @return void
+     */
+    protected static function checkTrakingOrderStatus(ConfigInterface $config)
+    {
+        if (!$config->get('STATUS_ORDER_CHECK')) {
+            return;
+        }
+
+        do {
+            $ret = API::getInstanceByConfig($config)->getService('tracking')->getStatesByClient();
+            if (!$ret) {
+                return;
+            }
+
+            $states = (array)$ret['STATES'];
+            $states = array_key_exists('DPD_ORDER_NR', $states) ? array($states) : $states;
+
+            // сортируем статусы по их времени наступления
+            uasort($states, function ($a, $b) {
+                if ($a['CLIENT_ORDER_NR'] == $b['CLIENT_ORDER_NR']) {
+                    $time1 = strtotime($a['TRANSITION_TIME']);
+                    $time2 = strtotime($b['TRANSITION_TIME']);
+
+                    return $time1 - $time2;
+                }
+
+                return $a['CLIENT_ORDER_NR'] - $b['CLIENT_ORDER_NR'];
+            });
+
+            foreach ($states as $state) {
+                $order = \Ipol\DPD\DB\Connection::getInstance($config)->getTable('order')->getByOrderId($state['CLIENT_ORDER_NR']);
+                if (!$order) {
+                    continue;
+                }
+
+                $status = $state['NEW_STATE'];
+
+                if ($order->isSelfDelivery()
+                    && $status == \Ipol\DPD\Order::STATUS_TRANSIT_TERMINAL
+                    && $order->receiverTerminalCode == $state['TERMINAL_CODE']
+                ) {
+                    $status = \Ipol\DPD\Order::STATUS_ARRIVE;
+                }
+
+                $order->setOrderStatus($status, $statusTime);
+                $order->orderNum = $state['DPD_ORDER_NR'] ?: $order->orderNum;
+                $order->save();
+            }
+
+            if ($ret['DOC_ID'] > 0) {
+                API::getInstanceByConfig($config)->getService('tracking')->confirm($ret['DOC_ID']);
+            }
+        } while ($ret['RESULT_COMPLETE'] != 1);
+    }
+
+    /**
+     * Загружает в локальную БД данные о местоположениях и терминалах
+     *
+     * @param \Ipol\DPD\Config\ConfigInterface $config
+     *
+     * @return string
+     */
+    public static function loadExternalData(ConfigInterface $config)
+    {
+        $api = API::getInstanceByConfig($config);
+
+        $locationTable = \Ipol\DPD\DB\Connection::getInstance($config)->getTable('location');
+        $terminalTable = \Ipol\DPD\DB\Connection::getInstance($config)->getTable('terminal');
+
+        $locationLoader = new \Ipol\DPD\DB\Location\Agent($api, $locationTable);
+        $terminalLoader = new \Ipol\DPD\DB\Terminal\Agent($api, $terminalTable);
+
+        $currStep = $config->get('LOAD_EXTERNAL_DATA_STEP');
+        $position = $config->get('LOAD_EXTERNAL_DATA_POSITION');
+
+        switch ($currStep) {
+            case 'LOAD_LOCATION_ALL':
+                $ret = $locationLoader->loadAll($position);
+                $currStep = 'LOAD_LOCATION_ALL';
+                $nextStep = 'LOAD_LOCATION_CASH_PAY';
+                break;
+
+            case 'LOAD_LOCATION_CASH_PAY':
+                $ret = $locationLoader->loadCashPay($position);
+                $currStep = 'LOAD_LOCATION_CASH_PAY';
+                $nextStep = 'LOAD_TERMINAL_UNLIMITED';
+                break;
+
+            case 'LOAD_TERMINAL_UNLIMITED':
+                $ret = $terminalLoader->loadUnlimited($position);
+                $currStep = 'LOAD_TERMINAL_UNLIMITED';
+                $nextStep = 'LOAD_TERMINAL_LIMITED';
+                break;
+
+            case 'LOAD_TERMINAL_LIMITED':
+                $ret = $terminalLoader->loadLimited($position);
+                $currStep = 'LOAD_TERMINAL_LIMITED';
+                $nextStep = 'LOAD_FINISH';
+                break;
+
+            default:
+                $ret = true;
+                $currStep = 'LOAD_FINISH';
+                $nextStep = 'LOAD_LOCATION_ALL';
+                break;
+        }
+
+        $nextStep = is_bool($ret) ? $nextStep : $currStep;
+        $position = is_bool($ret) ? '' : $ret;
+
+        $config->set('LOAD_EXTERNAL_DATA_STEP', $nextStep);
+        $config->set('LOAD_EXTERNAL_DATA_POSITION', $position);
+    }
 }

+ 8 - 9
src/lib/DB/Location/Agent.php

@@ -80,7 +80,7 @@ class Agent
 
             $_tmp_region_name_array = explode(',', $row[4]);
 			$this->loadLocation(
-				$this->getNormalizer()->normilize(
+				$this->getNormalizer()->normalize(
 					$country    = $row[5],
 					$regionName = end($_tmp_region_name_array),
 					$cityName   = $row[2] .' '. $row[3]
@@ -96,13 +96,12 @@ class Agent
 		return true;
 	}
 
-	/**
-	 * Обновляет города в которых доступен НПП
-	 * 
-	 * @param string $position Стартовая позиция импорта
-	 * 
-	 * @return void
-	 */
+    /**
+     * Обновляет города в которых доступен НПП
+     *
+     * @param string $position Стартовая позиция импорта
+     * @return bool|string
+     */
 	public function loadCashPay($position = 'RU:0')
 	{
 		$position   = explode(':', $position ?: 'RU:0');
@@ -130,7 +129,7 @@ class Agent
 				}
 
 				$this->loadLocation(
-					$this->getNormalizer()->normilize(
+					$this->getNormalizer()->normalize(
 						$country = $arCity['COUNTRY_NAME'],
 						$region  = $arCity['REGION_NAME'],
 						$city    = $arCity['ABBREVIATION'] .' '. $arCity['CITY_NAME']

+ 1 - 1
src/lib/DB/Location/Normalizer.php

@@ -15,7 +15,7 @@ class Normalizer
      * 
      * @return array
      */
-    public function normilize($country, $region, $locality)
+    public function normalize($country, $region, $locality)
     {
         return array_merge(
             $country  = $this->normilizeCountry($country),

+ 4 - 4
src/lib/DB/Location/Table.php

@@ -52,12 +52,12 @@ class Table extends AbstractTable
 	/**
 	 * Возвращает запись по ID города
 	 * 
-	 * @param  int $locationId
-	 * @param  array  $select
+	 * @param  int $cityId
+	 * @param  string  $select
 	 * 
 	 * @return array|false
 	 */
-	public static function getByCityId($cityId, $select = '*')
+	public function getByCityId($cityId, $select = '*')
 	{
 		return $this->findFirst([
 			'select' => $select,
@@ -80,7 +80,7 @@ class Table extends AbstractTable
 	 */
 	public function getByAddress($country, $region, $city, $select = '*')
 	{
-		$city = $this->getNormalizer()->normilize($country, $region, $city);
+		$city = $this->getNormalizer()->normalize($country, $region, $city);
 		
 		return $this->findFirst([
 			'select' => $select,

+ 2 - 2
src/lib/DB/Terminal/Agent.php

@@ -24,7 +24,7 @@ class Agent
     }
 
     /**
-     * @return \Ipol\DPD\User\UserInterface
+     * @return \Ipol\DPD\API\User\UserInterface
      */
     public function getApi()
     {
@@ -46,7 +46,7 @@ class Agent
      *
      * @return bool|string
      */
-    public function loadUnlimited($position = 0)
+    public function loadUnlimited($position = '0')
     {
         $position = $position ?: 0;
         $index = 0;

+ 1 - 0
src/lib/Utils.php

@@ -89,6 +89,7 @@ class Utils
 	 */
 	public static function isNeedBreak($start_time)
 	{
+	    return false;
 		$max_time = (ini_get('max_execution_time') ?: 60);
 		$max_time = max(min($max_time, 60), 10);
 

+ 2 - 2
tests/DB/Location/AgentTest.php

@@ -49,8 +49,8 @@ class AgentTest extends TestCase
                 'PDO'      => null,
             ],
             'IS_TEST' => true,
-            'KLIENT_NUMBER' => '',
-            'KLIENT_KEY' => ''
+            'KLIENT_NUMBER' => '1052000804',
+            'KLIENT_KEY' => 'C720C102732A855232BB7BA8D6AFF9B781F9E2F6'
         ]);
 
         $api = API::getInstanceByConfig($config);