From 828b9fb51e3e754ae5eab1f124c07c163d0fb3c1 Mon Sep 17 00:00:00 2001 From: Hafiq Date: Tue, 1 Oct 2019 15:59:46 +0800 Subject: [PATCH] Fix Dex Courier --- Library/ApiRequest.php | 11 ++- example/index.php | 4 +- src/Contract/BaseParcelTrack.php | 4 ++ src/Tracker/BaseTracker.php | 24 ++++++- src/Tracker/Gdex.php | 113 +++++++++++++++++++++---------- tests/GDexTest.php | 6 +- 6 files changed, 115 insertions(+), 47 deletions(-) diff --git a/Library/ApiRequest.php b/Library/ApiRequest.php index c52802e..0feb1d8 100644 --- a/Library/ApiRequest.php +++ b/Library/ApiRequest.php @@ -129,12 +129,11 @@ function fetch($requestUrl = null, $requestBody = [], $method = null, $header = 'form_params' => $this->requestBody, 'headers' => $this->header ]; - break; - case PARCEL_METHOD_PATCH: - $param = []; - break; - case PARCEL_METHOD_DELETE: - $param = []; + $queryParam = $this->requestBody['parameter'] ?? null; + if ($queryParam) { + $param['query'] = $queryParam; + unset($this->requestBody['parameter']); + } break; default: $param = null; diff --git a/example/index.php b/example/index.php index c6d402d..7d5102e 100644 --- a/example/index.php +++ b/example/index.php @@ -8,8 +8,8 @@ require_once __DIR__ .'/../vendor/autoload.php'; -//$response = parcel_track()->gdExpress()->setTrackingNumber("4941410530")->fetch(); -$response = parcel_track()->skynet()->setTrackingNumber("238216506684")->fetch(); +$response = parcel_track()->gdExpress()->setTrackingNumber("MY82067332685")->fetch(); +//$response = parcel_track()->skynet()->setTrackingNumber("238216506684")->fetch(); //$response = parcel_track()->abxExpress()->setTrackingNumber("EZP843055940197")->fetch(); //$response = parcel_track()->dhlExpress()->setTrackingNumber("5176011131")->fetch(); //$response = parcel_track()->cityLink()->setTrackingNumber("960307804711915")->fetch(); diff --git a/src/Contract/BaseParcelTrack.php b/src/Contract/BaseParcelTrack.php index 1018574..4c4b17c 100644 --- a/src/Contract/BaseParcelTrack.php +++ b/src/Contract/BaseParcelTrack.php @@ -105,6 +105,10 @@ protected function getWhichCourier() $courier_matched[] = (new Abx())->getSourceName(); } + if (preg_match('/^MY.*\d$/', $this->trackingCode)) { + $courier_matched[] = (new Gdex())->getSourceName(); + } + if (preg_match('/MYM.\d*/', $this->trackingCode)) { $courier_matched[] = (new LELExpress())->getSourceName(); } diff --git a/src/Tracker/BaseTracker.php b/src/Tracker/BaseTracker.php index 81d51e6..98056e8 100644 --- a/src/Tracker/BaseTracker.php +++ b/src/Tracker/BaseTracker.php @@ -89,6 +89,26 @@ protected function distinguishProcess($process, $isFirstPosition = false) $process = strtolower($process); + if ($process == 'd') { + $process = 'delivery'; + } + + if ($process == 'p') { + $process = 'packing'; + } + + if ($process == 'r' || $process == 'h') { + $process = 'inbound'; + } + + if ($process == 'i') { + $process = 'collected'; + } + + if ($process == 'm' || $process == 'warehouse') { + $process = 'depart'; + } + if (preg_match('(counter|outbound|transhipment|collection|collected|picked up)', $process)) { return "item_received"; } @@ -105,7 +125,7 @@ protected function distinguishProcess($process, $isFirstPosition = false) return "facility_process"; } - if (preg_match('(unsuccessful|failed)', $process)) { + if (preg_match('(unsuccessful|failed|i_pod|undl|m_undl)', $process)) { return "delivery_failed"; } @@ -113,7 +133,7 @@ protected function distinguishProcess($process, $isFirstPosition = false) return "out_for_delivery"; } - if (preg_match('(delivered)', $process)) { + if (preg_match('(delivered|m_pod|pod)', $process)) { return "delivered"; } diff --git a/src/Tracker/Gdex.php b/src/Tracker/Gdex.php index bcc598e..3bc5db9 100644 --- a/src/Tracker/Gdex.php +++ b/src/Tracker/Gdex.php @@ -13,7 +13,7 @@ class Gdex extends BaseTracker { - protected $url = "http://web2.gdexpress.com/official/iframe/etracking_v2.php"; + protected $url = "https://esvr3.gdexpress.com/SOTS_Integrated/api/services/app/eTracker/GetListByCnNumber"; protected $source = "GD Express Sdn Bhd"; protected $code = "gdex"; protected $method = PARCEL_METHOD_POST; @@ -22,51 +22,96 @@ public function setTrackingNumber($refNum) { parent::setTrackingNumber($refNum); return [ - 'capture' => $refNum, - 'redoc_gdex' => 'cnGdex', - 'Submit' => 'Track', + 'parameter' => [ + 'input' => $refNum + ], ]; } + public function rawOutput() + { + return false; + } + public function startCrawl($result) { if (isset($result['body'])) { - $crawler = new Crawler($result['body']); + $main = []; + if ($result['body']['success']) { + if (count($result['body']['result']) > 0) { + $route = $result['body']['result'][0]; + if ($route['listPodData']) { + foreach ($route['listPodData'] as $item) { + $date = explode(' ', $item['dtScan']); + $date = Carbon::parse($date[0] . " " . $date[1]); + $data = []; + $data['date'] = $date->toDateTimeString(); + $data['timestamp'] = $date->timestamp; + switch ($item['type']) { + case 'pod': + case 'm_pod': + $data['process'] = 'Delivered'; + break; + case 'i_pod': + $data['process'] = 'Under Claim'; + break; + case 'undl': + case 'm_undl': + $data['process'] = "Undelivered due to " . $item['problem_code']; + break; + case 'rts': + case 'm_rts': + $data['process'] = "Returned to shipper"; + break; + case 'I': + $data['process'] = "Picked up by courier"; + break; + case 'Warehouse': + $data['process'] = "Outbound to HUB"; + break; + case 'M': + $data['process'] = "Outbound from " . $item['origin'] . " station"; + break; + case 'H': + $data['process'] = "In transit"; + break; + case 'R': + $data['process'] = "Inbound to " . $item['origin'] . " station"; + break; + case 'P': + $data['process'] = "In Packing"; + break; + case 'D': + $data['process'] = "Out for delivery"; + break; + default: + $data['process'] = null; + break; + } - $crawlerResult = $crawler->filter('#products tr:not(:first-child)')->each(function (Crawler $node, $i) { - if (strtolower($node->text()) != 'invalid cn') { - $result = $node->filter('td:not(:first-child)')->each(function (Crawler $node, $i) { - return trim_spaces($node->text()); - }); + $data['type'] = $this->distinguishProcess($item['type']); - $data = []; - foreach ($result as $key => $item) { - if ($key == 0) { - $parcel = Carbon::createFromFormat("d/m/Y H:i:s", $item); - $data['date'] = $parcel->toDateTimeString(); - $data['timestamp'] = $parcel->timestamp; - } - if ($key == 1) { - $data['process'] = $item; - $data['type'] = $this->distinguishProcess($item); - } - if ($key == 2) { - $data['event'] = $item; + switch ($item['origin']) { + case "HUB": + $data['event'] = 'Petaling Jaya'; + break; + case "HBN": + $data['event'] = 'Butterworth'; + break; + case "Warehouse": + $data['event'] = 'Warehouse'; + break; + default: + $data['event'] = ucwords($item['origin_defi']); + break; + } + + $main[] = $data; } + return $this->buildResponse($result, $main); } - - return $data; - } else { - return null; } - }); - - //reset if not found. weird dom output - if ($crawlerResult[0] == []) { - $crawlerResult = []; } - - return $this->buildResponse($result, $crawlerResult); } return $this->buildResponse($result, []); diff --git a/tests/GDexTest.php b/tests/GDexTest.php index 9630294..925b76b 100644 --- a/tests/GDexTest.php +++ b/tests/GDexTest.php @@ -14,7 +14,7 @@ class GDexTest extends TestCase { function testGDexSuccess() { - $result = parcel_track()->gdExpress()->setTrackingNumber("4941410530")->fetch(); + $result = parcel_track()->gdExpress()->setTrackingNumber("MY82067332685")->fetch(); $this->assertTrue(true); $this->assertEquals(200, $result['code']); @@ -30,14 +30,14 @@ function testGDexEmptySuccess() function testGDexFailed() { - $result = parcel_track()->setTrackingNumber("4941410530")->fetch(); + $result = parcel_track()->setTrackingNumber("MY82067332685")->fetch(); $this->assertTrue($result['error']); $this->assertEquals(400, $result['code']); } function testGDexCheckCarrier() { - $result = parcel_track()->setTrackingNumber("4941410530")->checkCourier(); + $result = parcel_track()->setTrackingNumber("MY82067332685")->checkCourier(); $this->assertFalse($result['error']); $this->assertTrue(in_array((new Gdex())->getSourceName(), $result['possible_courier'])); }