Skip to content

Commit

Permalink
Merge pull request #4 from afiqiqmal/courier/dex
Browse files Browse the repository at this point in the history
Fix Dex Courier
  • Loading branch information
afiqiqmal committed Oct 1, 2019
2 parents 7fecd00 + 828b9fb commit bcaed62
Show file tree
Hide file tree
Showing 6 changed files with 115 additions and 47 deletions.
11 changes: 5 additions & 6 deletions Library/ApiRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
4 changes: 2 additions & 2 deletions example/index.php
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
4 changes: 4 additions & 0 deletions src/Contract/BaseParcelTrack.php
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
Expand Down
24 changes: 22 additions & 2 deletions src/Tracker/BaseTracker.php
Original file line number Diff line number Diff line change
Expand Up @@ -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";
}
Expand All @@ -105,15 +125,15 @@ 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";
}

if (preg_match('(delivery|with courier)', $process)) {
return "out_for_delivery";
}

if (preg_match('(delivered)', $process)) {
if (preg_match('(delivered|m_pod|pod)', $process)) {
return "delivered";
}

Expand Down
113 changes: 79 additions & 34 deletions src/Tracker/Gdex.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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, []);
Expand Down
6 changes: 3 additions & 3 deletions tests/GDexTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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']);
Expand All @@ -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']));
}
Expand Down

0 comments on commit bcaed62

Please sign in to comment.