Skip to content

Commit 1ce4015

Browse files
committed
* add Canada Post
1 parent 4f74314 commit 1ce4015

File tree

7 files changed

+116
-3
lines changed

7 files changed

+116
-3
lines changed

README.md

+2
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ eParcel | @egg- | https://eparcel.kr/
3434
LBC | @egg- | https://www.lbcexpress.com/
3535
J&T (PH) | @egg- | https://www.jtexpress.ph/
3636
DHL | @carstenschwede | https://www.dhl.com/
37+
Canada Post | @egg- | https://www.canadapost-postescanada.ca/
3738

3839
## Installation
3940

@@ -127,6 +128,7 @@ EPARCEL | eparcel | eParcel
127128
LBC | lbc | LBC
128129
JNT | jnt | J&T
129130
DHL | dhl | DHL
131+
CANADAPOST | canadapost | Canada Post
130132

131133
### STATUS
132134

bin/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ var tracker = require('../')
55

66
program
77
.arguments('<tracecode>')
8-
.option('-c, --courier <courier>', 'Courier Namespace', /^(KOREAPOST|ECARGO|FEDEX|PANTOS|RINCOS|AUSPOST|ROYALMAIL|USPS|CJKOREAEXPRESS|POSLAJU|YELLOEXPRESS|EFS|AIRBRIDGE|UPS|TNT|CESCO|XPOST|KERRYTHAI|SICEPAT|XIOEXPRESS|EPARCEL|LBC|JNT|DHL)$/i)
8+
.option('-c, --courier <courier>', 'Courier Namespace', /^(KOREAPOST|ECARGO|FEDEX|PANTOS|RINCOS|AUSPOST|ROYALMAIL|USPS|CJKOREAEXPRESS|POSLAJU|YELLOEXPRESS|EFS|AIRBRIDGE|UPS|TNT|CESCO|XPOST|KERRYTHAI|SICEPAT|XIOEXPRESS|EPARCEL|LBC|JNT|DHL|CANADAPOST)$/i)
99
.option('-k, --apikey <apikey>', 'API KEY')
1010
.action(function (tracecode) {
1111
if (!tracker.COURIER[program.courier]) {

lib/courier/canadapost.js

+73
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
'use strict'
2+
3+
var request = require('request')
4+
var moment = require('moment')
5+
6+
var tracker = require('../')
7+
8+
var trackingInfo = function (number) {
9+
return {
10+
method: 'GET',
11+
url: 'https://www.canadapost-postescanada.ca/track-reperage/rs/track/json/package/' + number + '/detail'
12+
}
13+
}
14+
15+
var parser = {
16+
trace: function (data) {
17+
var courier = {
18+
code: tracker.COURIER.CANADAPOST.CODE,
19+
name: tracker.COURIER.CANADAPOST.NAME
20+
}
21+
var result = {
22+
courier: courier,
23+
number: data.pin,
24+
status: tracker.STATUS.PENDING
25+
}
26+
27+
var checkpoints = []
28+
for (var i = 0; i < data.events.length; i++) {
29+
var item = data.events[i]
30+
var checkpoint = {
31+
courier: courier,
32+
location: item.locationAddr.countryNmEn ? item.locationAddr.countryNmEn + ' ' + item.locationAddr.city : '',
33+
message: item.descEn,
34+
status: tracker.STATUS.IN_TRANSIT,
35+
time: moment(item.datetime.date + ' ' + item.datetime.time + 'T' + item.datetime.zoneOffset, 'YYYY-MM-DD HH:mm:ssZ').utc().format('YYYY-MM-DDTHH:mmZ')
36+
}
37+
38+
if (item.type === 'Delivered') {
39+
checkpoint.status = tracker.STATUS.DELIVERED
40+
} else if (item.type === 'Induction') {
41+
checkpoint.status = tracker.STATUS.INFO_RECEIVED
42+
}
43+
checkpoints.push(checkpoint)
44+
}
45+
46+
result.checkpoints = checkpoints
47+
result.status = tracker.normalizeStatus(result.checkpoints)
48+
49+
return result
50+
}
51+
}
52+
53+
module.exports = function () {
54+
return {
55+
trackingInfo: trackingInfo,
56+
trace: function (number, cb) {
57+
var tracking = trackingInfo(number)
58+
59+
request(tracking, function (err, res, body) {
60+
if (err) {
61+
return cb(err)
62+
}
63+
64+
try {
65+
var result = parser.trace(JSON.parse(body))
66+
cb(result ? null : tracker.error(tracker.ERROR.INVALID_NUMBER), result)
67+
} catch (e) {
68+
cb(tracker.error(e.message))
69+
}
70+
})
71+
}
72+
}
73+
}

lib/index.js

+4
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,10 @@ var COURIER = {
105105
DHL: {
106106
CODE: 'dhl',
107107
NAME: 'DHL'
108+
},
109+
CANADAPOST: {
110+
CODE: 'canadapost',
111+
NAME: 'Canada Post'
108112
}
109113
}
110114

package.json

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "delivery-tracker",
3-
"version": "2.6.1",
3+
"version": "2.7.0",
44
"author": {
55
"name": "egg",
66
"email": "[email protected]"
@@ -52,7 +52,8 @@
5252
"lbc",
5353
"j&t",
5454
"jnt",
55-
"dhl"
55+
"dhl",
56+
"canada post"
5657
],
5758
"license": "MIT",
5859
"bugs": {

test/canadapost.js

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/* globals before it describe */
2+
3+
'use strict'
4+
5+
var assert = require('assert')
6+
7+
var prepare = require('./fixtures/prepare')
8+
var tracker = require('../')
9+
10+
var courier = tracker.courier(tracker.COURIER.CANADAPOST.CODE)
11+
12+
describe(tracker.COURIER.CANADAPOST.NAME, function () {
13+
var deliveredNumber = 'DELIVERED'
14+
15+
before(function () {
16+
// @TODO add nock
17+
prepare(courier, deliveredNumber)
18+
})
19+
20+
it('delivered number', function (done) {
21+
courier.trace(deliveredNumber, function (err, result) {
22+
assert.equal(err, null)
23+
24+
assert.equal(deliveredNumber, result.number)
25+
assert.equal(tracker.COURIER.CANADAPOST.CODE, result.courier.code)
26+
assert.equal(tracker.STATUS.DELIVERED, result.status)
27+
28+
done()
29+
})
30+
})
31+
})

test/fixtures/canadapost-DELIVERED

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
2+
{"pin":"DELIVERED","productNmEn":"Expedited Parcels","productNmFr":"Colis accélérés","productNbr":"000000000000000967","refNbr1":"LETIAN6608054","refNbr2":"LETIAN6608054","finalEvent":true,"delivered":true,"status":"Delivered","shippedDateTime":{"date":"2021-06-05","time":"03:37:45","zoneOffset":"-04:00"},"expectedDlvryDateTime":{"revisedDate":"2021-06-21","revisionReasonEn":"Item was received by Canada Post after cut-off time.","revisionReasonFr":"Postes Canada a reçu l'article après l'heure limite.","dlvryDate":"2021-06-23"},"attemptedDlvryDate":"2021-06-21","actualDlvryDate":"2021-06-21","shipFromAddr":{"addrLn1":"","addrLn2":"","countryCd":"","city":"","regionCd":"","postCd":"c5bbb7dae495231783e1517cdbda4aa9"},"shipToAddr":{"addrLn1":"","addrLn2":"","countryCd":"","city":"","regionCd":"","postCd":"c30d284f296849d54d30e5a56690e685"},"events":[{"cd":"1441","webCd":"CODE-820","datetime":{"date":"2021-06-21","time":"11:38:02","zoneOffset":"-04:00"},"locationAddr":{"countryCd":"CA","countryNmEn":"Canada","countryNmFr":"Canada","city":"WATERFORD","regionCd":"ON","postCd":"c30d284f296849d54d30e5a56690e685"},"descEn":"Delivered to your community mailbox, parcel locker or apt./condo mailbox","descFr":"Livré à votre boîte postale, armoire à colis ou boîte aux lettres de l'app/condo","type":"Delivered"},{"cd":"0174","webCd":"CODE-514","datetime":{"date":"2021-06-21","time":"09:42:22","zoneOffset":"-04:00"},"locationAddr":{"countryCd":"CA","countryNmEn":"Canada","countryNmFr":"Canada","city":"WATERFORD","regionCd":"ON","postCd":"c30d284f296849d54d30e5a56690e685"},"descEn":"Item out for delivery","descFr":"Article sorti pour livraison","type":"Out"},{"cd":"0170","webCd":"CODE-446","datetime":{"date":"2021-06-21","time":"08:16:37","zoneOffset":"-04:00"},"locationAddr":{"countryCd":"CA","countryNmEn":"Canada","countryNmFr":"Canada","city":"WATERFORD","regionCd":"ON","postCd":"c30d284f296849d54d30e5a56690e685"},"descEn":"Item processed","descFr":"Article traité","type":"Info"},{"cd":"0175","webCd":"CODE-850","datetime":{"date":"2021-06-18","time":"15:10:59","zoneOffset":"-04:00"},"locationAddr":{"countryCd":"CA","countryNmEn":"Canada","countryNmFr":"Canada","city":"STONEY CREEK","regionCd":"ON","postCd":"c35553737e24e6aa58cbfa712315a5da"},"descEn":"Item in transit","descFr":"Article en transit","type":"Info"},{"cd":"0104","webCd":"CODE-446","datetime":{"date":"2021-06-18","time":"12:14:03","zoneOffset":"-04:00"},"locationAddr":{"countryCd":"CA","countryNmEn":"Canada","countryNmFr":"Canada","city":"STONEY CREEK","regionCd":"ON","postCd":"c35553737e24e6aa58cbfa712315a5da"},"descEn":"Item processed","descFr":"Article traité","type":"Info"},{"cd":"0410","webCd":"CODE-868","datetime":{"date":"2021-06-18","time":"02:06:22","zoneOffset":"-04:00"},"locationAddr":{"countryCd":"CA","countryNmEn":"Canada","countryNmFr":"Canada","city":"MISSISSAUGA","regionCd":"ON","postCd":"4f1e8ef1c47ed0049dd012f06feb0efa"},"descEn":"Item departed","descFr":"L'article est parti","type":"VehicleInfo"},{"cd":"0100","webCd":"CODE-446","datetime":{"date":"2021-06-18","time":"01:22:37","zoneOffset":"-04:00"},"locationAddr":{"countryCd":"CA","countryNmEn":"Canada","countryNmFr":"Canada","city":"MISSISSAUGA","regionCd":"ON","postCd":"4f1e8ef1c47ed0049dd012f06feb0efa"},"descEn":"Item processed","descFr":"Article traité","type":"Info"},{"cd":"0910","webCd":"CODE-852","datetime":{"date":"2021-06-14","time":"11:03:00","zoneOffset":"-03:00"},"locationAddr":{"countryCd":"CA","countryNmEn":"Canada","countryNmFr":"Canada","city":"VANCOUVER","regionCd":"BC","postCd":"880c19ecdefa906129372b317ea426f1"},"descEn":"Item was released by Customs and is now with Canada Post for processing","descFr":"Dédouanement complété. Article fut expédié au centre du traitement de courrier.","type":"FromCust"},{"cd":"3000","webCd":"CODE-020A","datetime":{"date":"2021-06-05","time":"03:37:45","zoneOffset":"-04:00"},"locationAddr":{"countryCd":"","city":"","regionCd":"","postCd":""},"descEn":"Electronic information submitted by shipper","descFr":"Les renseignements électroniques ont été soumis par l'expéditeur","type":"Induction"}],"custNm":"LETIAN PARCEL","addtnlOrigInfo":"MISSISSAUGA, ON","addtnlDestInfo":"WATERFORD, ON","suppressSignature":false,"lagTime":false,"returnPinIndicator":false,"refundAllowed":false,"dtcBarcode":false,"canadianDest":true,"dlvryInstruction":"","correctedPostalCode":"","sigReqByAmtDue":false,"shipperPostalCode":"L3R6B6","recipientNm":"*****","deliveryCertificateOption":"NO_AUTHORIZATION"}

0 commit comments

Comments
 (0)