-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
116 lines (105 loc) · 3.8 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
const moment = require ('moment')
const soap = require ('soap')
const { parseString: parse_string } = require ('xml2js')
const endpoint = 'https://ws.colissimo.fr/sls-ws/SlsServiceWS?wsdl'
const Colissimo = function ({ contract_number, password }) {
if (!contract_number || !password) {
throw new Error ('You must define contract_number and password.')
}
this.contract_number = contract_number
this.password = password
}
const get_product_code = ({ signature, is_return }) => {
let code = 'DOM'
if (is_return) {
code = 'CORE'
}
else if (signature) {
code = 'DOS'
}
return code
}
Colissimo.prototype.generate_label = function ({ sender = { }, receiver = { }, product = { }, format = { }, signature, is_return }) {
return new Promise ((resolve, reject) => {
const data = {
generateLabelRequest: {
attributes: {
xmlns: ''
},
contractNumber: this.contract_number,
password: this.password,
outputFormat: {
outputPrintingType: format.output_format || 'PDF_A4_300dpi'
},
letter: {
service: {
productCode: get_product_code ({ signature, is_return }),
depositDate: /[0-9]{4}\-[0-9]{2}-[0-9]/.test (product.deposit_date) || moment ().add (1, 'day').format ('YYYY-MM-DD'),
commercialName: format.commercial_name || undefined
},
parcel: {
insuranceValue: `${product.insurance_value * 100}`,
weight: product.weight || 1
},
sender: {
address: {
companyName: sender.company_name && `${product.identifier && `${product.identifier} `}${sender.company_name}` || undefined,
lastName: sender.last_name || undefined,
firstName: sender.first_name || undefined,
line2: sender.address || undefined,
line3: sender.to_know || undefined,
countryCode: 'FR',
city: sender.city || undefined,
zipCode: sender.zip_code || undefined,
phoneNumber: receiver.phone || undefined,
mobileNumber: sender.phone_number || undefined,
email: sender.mail || undefined,
language: 'FR'
}
},
addressee: {
address: {
companyName: receiver.company_name && `${product.identifier && `${product.identifier} `}${receiver.company_name}` || undefined,
lastName: receiver.last_name || undefined,
firstName: receiver.first_name || undefined,
line2: receiver.address || undefined,
line3: receiver.to_know || undefined,
countryCode: 'FR',
city: receiver.city || undefined,
zipCode: receiver.zip_code || undefined,
phoneNumber: receiver.phone || undefined,
mobileNumber: receiver.phone_number || undefined,
email: receiver.mail || undefined,
language: 'FR'
}
}
}
}
}
return soap.createClient (endpoint, (error, client) => {
if (error) { return reject (error) }
client.addBodyAttribute ({ xmlns: 'http://sls.ws.coliposte.fr' })
client.generateLabel (data, (error, result, body) => {
if (error) { return reject (error) }
return parse_string (body, (error, result) => {
if (error) { return reject (error) }
result = result['soap:Envelope']['soap:Body'][0]['ns2:generateLabelResponse'][0].return [0]
if (!result.labelResponse) { return reject (result.messages[0].messageContent[0]) }
return resolve ({
tracking_number: result.labelResponse[0].parcelNumber[0],
label: result.labelResponse[0].pdfUrl[0]
})
})
})
})
})
}
Colissimo.prototype.label = function ({ sender, receiver, product, signature }) {
return this.generate_label ({ sender, receiver, product, signature, is_return: false })
}
Colissimo.prototype.return = function ({ sender, receiver, product, signature }) {
return this.generate_label ({ sender, receiver, product, signature, is_return: true })
}
module.exports = function (options) {
return new Colissimo (options)
}