@things-factory/worksheet-base 4.3.524 → 4.3.525
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-server/controllers/outbound/index.js +1 -7
- package/dist-server/controllers/outbound/index.js.map +1 -1
- package/dist-server/controllers/outbound/packing-worksheet-controller.js +2 -2
- package/dist-server/controllers/outbound/packing-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/picking-worksheet-controller.js +96 -441
- package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/packing/complete-packing.js +4 -4
- package/dist-server/graphql/resolvers/worksheet/packing/complete-packing.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/activate-picking.js.map +1 -1
- package/dist-server/graphql/types/worksheet/index.js +2 -0
- package/dist-server/graphql/types/worksheet/index.js.map +1 -1
- package/dist-server/graphql/types/worksheet/worksheet-detail-info.js +1 -0
- package/dist-server/graphql/types/worksheet/worksheet-detail-info.js.map +1 -1
- package/dist-server/utils/lmd-util.js +123 -214
- package/dist-server/utils/lmd-util.js.map +1 -1
- package/package.json +18 -18
- package/server/controllers/outbound/index.ts +1 -9
- package/server/controllers/outbound/packing-worksheet-controller.ts +2 -2
- package/server/controllers/outbound/picking-worksheet-controller.ts +89 -507
- package/server/graphql/resolvers/worksheet/packing/complete-packing.ts +5 -4
- package/server/graphql/resolvers/worksheet/picking/activate-picking.ts +1 -1
- package/server/graphql/types/worksheet/index.ts +2 -0
- package/server/graphql/types/worksheet/worksheet-detail-info.ts +1 -0
- package/server/utils/lmd-util.ts +139 -272
|
@@ -12,9 +12,9 @@ import { XilnexController } from '../../../../controllers/pos'
|
|
|
12
12
|
import { WorksheetController } from '../../../../controllers/worksheet-controller'
|
|
13
13
|
|
|
14
14
|
export const completePackingResolver = {
|
|
15
|
-
async completePacking(_: any, { releaseGoodNo, orderPackageId }, context: any) {
|
|
15
|
+
async completePacking(_: any, { releaseGoodNo, orderPackageId, grossWeight }, context: any) {
|
|
16
16
|
const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
|
|
17
|
-
await completePacking(tx, domain, user, releaseGoodNo, orderPackageId)
|
|
17
|
+
await completePacking(tx, domain, user, releaseGoodNo, orderPackageId, grossWeight)
|
|
18
18
|
|
|
19
19
|
const releaseGood: ReleaseGood = await tx.getRepository(ReleaseGood).findOne({
|
|
20
20
|
where: { name: releaseGoodNo, domain },
|
|
@@ -56,8 +56,9 @@ export async function completePacking(
|
|
|
56
56
|
domain: Domain,
|
|
57
57
|
user: User,
|
|
58
58
|
releaseGoodNo: string,
|
|
59
|
-
orderPackageId: string
|
|
59
|
+
orderPackageId: string,
|
|
60
|
+
grossWeight?: number
|
|
60
61
|
): Promise<void> {
|
|
61
62
|
const packingWSCtrl: PackingWorksheetController = new PackingWorksheetController(tx, domain, user)
|
|
62
|
-
await packingWSCtrl.completePacking(releaseGoodNo, orderPackageId)
|
|
63
|
+
await packingWSCtrl.completePacking(releaseGoodNo, orderPackageId, grossWeight)
|
|
63
64
|
}
|
|
@@ -434,6 +434,7 @@ export const Mutation = /* GraphQL */ `
|
|
|
434
434
|
orderPackageItemId: String!
|
|
435
435
|
productBarcode: String!
|
|
436
436
|
serialNumber: String
|
|
437
|
+
grossWeight: Float
|
|
437
438
|
): ExecutingWorksheet @privilege(category: "worksheet_execute", privilege: "mutation") @transaction
|
|
438
439
|
|
|
439
440
|
batchPicking (
|
|
@@ -553,6 +554,7 @@ export const Mutation = /* GraphQL */ `
|
|
|
553
554
|
completePacking (
|
|
554
555
|
releaseGoodNo: String!
|
|
555
556
|
orderPackageId: String!
|
|
557
|
+
grossWeight: Float
|
|
556
558
|
): Boolean @privilege(category: "worksheet_execute", privilege: "mutation") @transaction
|
|
557
559
|
|
|
558
560
|
completeBatchPicking (
|
package/server/utils/lmd-util.ts
CHANGED
|
@@ -20,18 +20,13 @@ import {
|
|
|
20
20
|
refreshAccessTokenNinjavan,
|
|
21
21
|
getAccessTokenCityLink
|
|
22
22
|
} from '@things-factory/integration-lmd'
|
|
23
|
-
import { createReleaseGoodLog, OrderPackage, ReleaseGood
|
|
23
|
+
import { createReleaseGoodLog, OrderPackage, ReleaseGood } from '@things-factory/sales-base'
|
|
24
24
|
import { MarketplaceOrder, MarketplaceStore } from '@things-factory/marketplace-base'
|
|
25
25
|
import { Lambda } from './lambda/lambda-const'
|
|
26
26
|
|
|
27
27
|
import { EcommerceController } from '../index'
|
|
28
|
-
import { config } from '@things-factory/env'
|
|
29
28
|
|
|
30
29
|
const debug = require('debug')('things-factory:worksheet-base:lmd-util')
|
|
31
|
-
const ninjavanConfig = config.get('lmdIntegrationNinjavan', {})
|
|
32
|
-
const citylinkConfig = config.get('lmdIntegrationCitylink', {})
|
|
33
|
-
const emsConfig = config.get('lmdIntegrationEms', {})
|
|
34
|
-
const lmdConfig = config.get('lmdIntegrationConfig', {})
|
|
35
30
|
import i18next from 'i18next'
|
|
36
31
|
|
|
37
32
|
// import { SellercraftController } from '../controllers'
|
|
@@ -45,8 +40,6 @@ const LMD_BOARDS = {
|
|
|
45
40
|
export async function createLmdParcel(releaseGoods, tx, domain, user, marketplaceOrder) {
|
|
46
41
|
try {
|
|
47
42
|
let parcelsRequest = []
|
|
48
|
-
let parcelsRequestV2 = []
|
|
49
|
-
|
|
50
43
|
for (let index = 0; index < releaseGoods.length; index++) {
|
|
51
44
|
let releaseGood = releaseGoods[index]
|
|
52
45
|
try {
|
|
@@ -61,18 +54,27 @@ export async function createLmdParcel(releaseGoods, tx, domain, user, marketplac
|
|
|
61
54
|
|
|
62
55
|
try {
|
|
63
56
|
let lmd: LastMileDelivery = releaseGood.lastMileDelivery
|
|
64
|
-
let
|
|
57
|
+
let bizplace: Bizplace
|
|
65
58
|
let lmdBizplace: LastMileDeliveryBizplace = await tx.getRepository(LastMileDeliveryBizplace).findOne({
|
|
66
59
|
where: { lastMileDelivery: lmd.id, bizplace: releaseGood.bizplace },
|
|
67
60
|
relations: ['lastMileDelivery', 'bizplace']
|
|
68
61
|
})
|
|
69
62
|
|
|
70
|
-
let bizplace: Bizplace = await assignBizplaceAddress(lmdBizplace, releaseGood, tx)
|
|
71
|
-
let [latitude, longitude] = bizplace?.latlng?.split(',')
|
|
72
|
-
|
|
73
63
|
let validLmd: Boolean = await validateLmd(tx, releaseGood, lmd.id)
|
|
74
64
|
if (!validLmd) throw new Error(`Last mile delivery account is not valid. Please contact support team.`)
|
|
75
65
|
|
|
66
|
+
if (lmdBizplace?.customAddress == true) {
|
|
67
|
+
bizplace = await tx.getRepository(Bizplace).findOne({
|
|
68
|
+
where: { id: lmdBizplace.bizplace.id },
|
|
69
|
+
relations: ['domain']
|
|
70
|
+
})
|
|
71
|
+
} else {
|
|
72
|
+
bizplace = await tx.getRepository(Bizplace).findOne({
|
|
73
|
+
where: { domain: releaseGood.domain },
|
|
74
|
+
relations: ['domain']
|
|
75
|
+
})
|
|
76
|
+
}
|
|
77
|
+
|
|
76
78
|
const senderGeoArea: GeoArea = await tx
|
|
77
79
|
.getRepository(GeoArea)
|
|
78
80
|
.findOne({ where: { postalCode: bizplace.postalCode } })
|
|
@@ -97,13 +99,37 @@ export async function createLmdParcel(releaseGoods, tx, domain, user, marketplac
|
|
|
97
99
|
return releaseGood
|
|
98
100
|
}
|
|
99
101
|
|
|
102
|
+
const currentDate = new Date()
|
|
103
|
+
const currentTimestamp = Math.floor(Date.now() / 1000)
|
|
104
|
+
|
|
100
105
|
switch (lmd?.platform) {
|
|
101
106
|
case 'CITYLINK':
|
|
107
|
+
const expiredDateCitylink = new Date(lmd?.expiresIn)
|
|
108
|
+
// Calculate the renewal date as 2 days before the expiry date
|
|
109
|
+
const renewalDateCitylink = new Date(expiredDateCitylink.getTime() - 2 * 24 * 60 * 60 * 1000)
|
|
110
|
+
|
|
111
|
+
if (currentDate >= renewalDateCitylink) {
|
|
112
|
+
const lastMileDeliveryCitylink = await getAccessTokenCityLink(lmd?.id, { state: { tx } })
|
|
113
|
+
lmd.accessToken = lastMileDeliveryCitylink.accessToken
|
|
114
|
+
}
|
|
102
115
|
releaseGood = fnSplitAddress(releaseGood)
|
|
116
|
+
break
|
|
117
|
+
|
|
103
118
|
case 'NINJA_VAN':
|
|
104
119
|
case 'EMS':
|
|
105
|
-
|
|
120
|
+
const renewalTimestamp = lmd?.expiresIn - 12 * 60 * 60 // Renew 12 hr before expiry
|
|
121
|
+
|
|
122
|
+
if (currentTimestamp >= renewalTimestamp) {
|
|
123
|
+
let lastMileDelivery
|
|
124
|
+
if (lmd?.platform === 'NINJA_VAN') {
|
|
125
|
+
lastMileDelivery = await refreshAccessTokenNinjavan(lmd?.id, { state: { tx } })
|
|
126
|
+
} else if (lmd?.platform === 'EMS') {
|
|
127
|
+
lastMileDelivery = await getAccessTokenEfmx(lmd?.id, lmd?.clientId, lmd?.secretKey, { state: { tx } })
|
|
128
|
+
}
|
|
129
|
+
lmd.accessToken = lastMileDelivery.accessToken
|
|
130
|
+
}
|
|
106
131
|
break
|
|
132
|
+
|
|
107
133
|
case 'DHL_EXPRESS':
|
|
108
134
|
releaseGood = fnSplitAddress(releaseGood)
|
|
109
135
|
break
|
|
@@ -112,6 +138,8 @@ export async function createLmdParcel(releaseGoods, tx, domain, user, marketplac
|
|
|
112
138
|
break
|
|
113
139
|
}
|
|
114
140
|
|
|
141
|
+
let [latitude, longitude] = bizplace?.latlng?.split(',')
|
|
142
|
+
|
|
115
143
|
let data = {
|
|
116
144
|
courier: lmd.platform,
|
|
117
145
|
clientId: lmd?.clientId,
|
|
@@ -126,7 +154,6 @@ export async function createLmdParcel(releaseGoods, tx, domain, user, marketplac
|
|
|
126
154
|
remark: releaseGood?.remark,
|
|
127
155
|
prefix: lmd?.prefix,
|
|
128
156
|
scope: lmd?.scope,
|
|
129
|
-
mps: lmd.mps,
|
|
130
157
|
|
|
131
158
|
//pass releaseGoodId for rg logs
|
|
132
159
|
releaseGoodId: releaseGood?.id,
|
|
@@ -136,7 +163,6 @@ export async function createLmdParcel(releaseGoods, tx, domain, user, marketplac
|
|
|
136
163
|
custRef: releaseGood?.refNo2,
|
|
137
164
|
cod: releaseGood?.codOption,
|
|
138
165
|
paidAmount: releaseGood?.paidAmount?.toString(),
|
|
139
|
-
source: releaseGood?.source,
|
|
140
166
|
|
|
141
167
|
recipient: releaseGood.attentionTo,
|
|
142
168
|
phone: releaseGood?.phone1 ? releaseGood.phone1 : releaseGood?.phone2 ? releaseGood.phone2 : '',
|
|
@@ -171,34 +197,46 @@ export async function createLmdParcel(releaseGoods, tx, domain, user, marketplac
|
|
|
171
197
|
handoverMethod: 1
|
|
172
198
|
}
|
|
173
199
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
.
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
200
|
+
let unprocessedOrderPackages: OrderPackage[] = releaseGood.orderPackages.filter(op => !op.parcelId)
|
|
201
|
+
|
|
202
|
+
let packagesData = unprocessedOrderPackages.map(op => {
|
|
203
|
+
return {
|
|
204
|
+
...data,
|
|
205
|
+
refNo: op.name,
|
|
206
|
+
items: op.orderPackageItems.map(opi => {
|
|
207
|
+
let lengthUnit = opi?.orderProduct?.productDetail?.lengthUnit?.toString()?.toLowerCase() || ''
|
|
208
|
+
|
|
209
|
+
let items = {
|
|
210
|
+
quantity: opi?.releaseQty?.toString() || ' ',
|
|
211
|
+
item: opi?.orderProduct?.product.name.slice(0, 49).trim() || ' ',
|
|
212
|
+
sku: opi?.orderProduct?.product.sku || ' ',
|
|
213
|
+
price:
|
|
214
|
+
opi?.orderProduct?.paidAmount?.toString() ||
|
|
215
|
+
(opi?.releaseQty * opi?.orderProduct?.productDetail?.costPrice || 0)?.toString() ||
|
|
216
|
+
' ',
|
|
217
|
+
weight: opi?.orderProduct?.productDetail?.grossWeight?.toString() || ' ',
|
|
218
|
+
width: opi?.orderProduct?.productDetail?.width || ' ',
|
|
219
|
+
length: opi?.orderProduct?.productDetail?.depth || ' ',
|
|
220
|
+
height: opi?.orderProduct?.productDetail?.height || ' '
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
if (lmd.platform == 'SAPX' || lmd.platform == 'VIETTEL_POST') {
|
|
224
|
+
if (lengthUnit == 'mm' || lengthUnit == 'm') {
|
|
225
|
+
;(items.width = (items.width / 10)?.toString()),
|
|
226
|
+
(items.length = (items.length / 10)?.toString()),
|
|
227
|
+
(items.height = (items.height / 10)?.toString())
|
|
228
|
+
} else {
|
|
229
|
+
;(items.width = items.width?.toString()),
|
|
230
|
+
(items.length = items.length?.toString()),
|
|
231
|
+
(items.height = items.height?.toString())
|
|
232
|
+
}
|
|
196
233
|
}
|
|
234
|
+
return items
|
|
197
235
|
})
|
|
198
|
-
|
|
236
|
+
}
|
|
237
|
+
})
|
|
199
238
|
|
|
200
|
-
|
|
201
|
-
}
|
|
239
|
+
parcelsRequest.push(...packagesData)
|
|
202
240
|
} catch (e) {
|
|
203
241
|
createReleaseGoodLog('create-lmd-parcel', e.message, releaseGood.id, {
|
|
204
242
|
state: { domain: null }
|
|
@@ -207,23 +245,14 @@ export async function createLmdParcel(releaseGoods, tx, domain, user, marketplac
|
|
|
207
245
|
}
|
|
208
246
|
}
|
|
209
247
|
|
|
210
|
-
if (parcelsRequestV2 && parcelsRequestV2.length > 0) {
|
|
211
|
-
await lmdIntegrationV2(parcelsRequestV2, releaseGoods, tx, domain, user, marketplaceOrder)
|
|
212
|
-
}
|
|
213
|
-
|
|
214
248
|
if (parcelsRequest && parcelsRequest.length > 0) {
|
|
215
249
|
let orderPackages: OrderPackage[]
|
|
216
|
-
let res
|
|
217
250
|
|
|
218
251
|
try {
|
|
219
|
-
res = await LastMileAPI.createParcel(
|
|
220
|
-
{
|
|
221
|
-
...releaseGoods[0].lastMileDelivery,
|
|
222
|
-
platform: lmdConfig.version.v1
|
|
223
|
-
},
|
|
252
|
+
let res = await LastMileAPI.createParcel(
|
|
253
|
+
{ ...releaseGoods[0].lastMileDelivery, platform: 'lmdMiddleware' },
|
|
224
254
|
parcelsRequest
|
|
225
255
|
)
|
|
226
|
-
|
|
227
256
|
for (let parcel of res) {
|
|
228
257
|
let courier = parcel.transporter
|
|
229
258
|
let transporter = courier.replace(/_/g, ' ')
|
|
@@ -275,100 +304,19 @@ export async function createLmdParcel(releaseGoods, tx, domain, user, marketplac
|
|
|
275
304
|
}
|
|
276
305
|
}
|
|
277
306
|
|
|
278
|
-
async function lmdIntegrationV2(parcelsRequestV2, releaseGoods, tx, domain, user, marketplaceOrder) {
|
|
279
|
-
let orderPackages: OrderPackage[]
|
|
280
|
-
let responses
|
|
281
|
-
let packages
|
|
282
|
-
|
|
283
|
-
try {
|
|
284
|
-
responses = await LastMileAPI.createParcelV2(
|
|
285
|
-
{
|
|
286
|
-
...releaseGoods[0].lastMileDelivery,
|
|
287
|
-
platform: lmdConfig.version.v2
|
|
288
|
-
},
|
|
289
|
-
parcelsRequestV2
|
|
290
|
-
)
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
// diff way return data
|
|
294
|
-
for (let response of responses) {
|
|
295
|
-
let courier = response.transporter
|
|
296
|
-
let transporter = courier.replace(/_/g, ' ')
|
|
297
|
-
packages = response.packages
|
|
298
|
-
|
|
299
|
-
//update consignmentNumber @orderConsignmentNo in orderConsignment
|
|
300
|
-
await tx
|
|
301
|
-
.getRepository(OrderConsignment)
|
|
302
|
-
.update({ name: response.refNo }, { consignmentNumber: response.shipmentID })
|
|
303
|
-
|
|
304
|
-
for (let op of packages) {
|
|
305
|
-
await tx
|
|
306
|
-
.getRepository(OrderPackage)
|
|
307
|
-
.update({ name: op.refNo }, { parcelId: op.parcelId, transporter: transporter })
|
|
308
|
-
|
|
309
|
-
parcelsRequestV2.map(rg => {
|
|
310
|
-
createReleaseGoodLog(
|
|
311
|
-
'lmd-create-parcel',
|
|
312
|
-
JSON.stringify({ parcelId: op.parcelId, parcelMessage: response.message }),
|
|
313
|
-
rg.releaseGoodId,
|
|
314
|
-
{
|
|
315
|
-
state: { domain: null }
|
|
316
|
-
}
|
|
317
|
-
)
|
|
318
|
-
})
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
const qb: SelectQueryBuilder<OrderPackage> = tx
|
|
323
|
-
.getRepository(OrderPackage)
|
|
324
|
-
.createQueryBuilder('op')
|
|
325
|
-
.innerJoinAndSelect('op.releaseGood', 'rg')
|
|
326
|
-
.innerJoinAndSelect('rg.domain', 'd')
|
|
327
|
-
.innerJoinAndSelect('rg.bizplace', 'b')
|
|
328
|
-
.innerJoinAndSelect('b.company', 'c')
|
|
329
|
-
.innerJoinAndSelect('c.domain', 'companyDomain')
|
|
330
|
-
.innerJoinAndSelect('b.domain', 'd2')
|
|
331
|
-
.leftJoinAndSelect('rg.lastMileDelivery', 'lmd')
|
|
332
|
-
.where('op.name IN (:...orderPackageIds)', {
|
|
333
|
-
orderPackageIds: packages.map(op => {
|
|
334
|
-
return op.refNo
|
|
335
|
-
})
|
|
336
|
-
})
|
|
337
|
-
|
|
338
|
-
orderPackages = await qb.getMany()
|
|
339
|
-
|
|
340
|
-
await processAwbAndTrackingNo(orderPackages, tx, domain, user, marketplaceOrder)
|
|
341
|
-
} catch (error) {
|
|
342
|
-
parcelsRequestV2.map(rg => {
|
|
343
|
-
createReleaseGoodLog('error-lmd-create-parcel', error.message, rg.releaseGoodId, {
|
|
344
|
-
state: { domain: null }
|
|
345
|
-
})
|
|
346
|
-
})
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
|
|
350
307
|
export async function processAwbAndTrackingNo(orderPackages, tx, domain, user, marketplaceOrder) {
|
|
351
308
|
const ecommerceCtrl: EcommerceController = new EcommerceController(tx, domain, user)
|
|
352
309
|
let releaseOrders: ReleaseGood = []
|
|
353
310
|
|
|
354
311
|
for (let orderPackage of orderPackages) {
|
|
312
|
+
// await getConnection().transaction(async tx => {
|
|
355
313
|
try {
|
|
356
|
-
let awbRes
|
|
357
314
|
let releaseGood = orderPackage.releaseGood
|
|
358
|
-
let
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
awbRes = await LastMileAPI[lmdVersion === 'v2' ? 'getAwbV2' : 'getAwb'](
|
|
362
|
-
{
|
|
363
|
-
...orderPackage.releaseGood.lastMileDelivery,
|
|
364
|
-
platform
|
|
365
|
-
},
|
|
366
|
-
{
|
|
367
|
-
parcelId: orderPackage.parcelId,
|
|
368
|
-
staging: orderPackage.releaseGood.lastMileDelivery?.staging
|
|
369
|
-
}
|
|
315
|
+
let awbRes = await LastMileAPI.getAwb(
|
|
316
|
+
{ ...orderPackage.releaseGood.lastMileDelivery, platform: 'lmdMiddleware' },
|
|
317
|
+
{ parcelId: orderPackage.parcelId, staging: orderPackage.releaseGood.lastMileDelivery?.staging }
|
|
370
318
|
)
|
|
371
|
-
|
|
319
|
+
// console.log(`[processAwbAndTrackingNo]Origin AWB URL : ${awbRes?.content}`)
|
|
372
320
|
let awbCustomize: Boolean = orderPackage.releaseGood.lastMileDelivery?.awbCustomize
|
|
373
321
|
|
|
374
322
|
if (awbRes) {
|
|
@@ -510,32 +458,39 @@ export async function processAwbAndTrackingNo(orderPackages, tx, domain, user, m
|
|
|
510
458
|
})
|
|
511
459
|
}
|
|
512
460
|
}
|
|
461
|
+
// })
|
|
513
462
|
}
|
|
514
463
|
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
}
|
|
464
|
+
// trigger RTS
|
|
465
|
+
// try {
|
|
466
|
+
// let uniqueReleaseOrders: ReleaseGood = [...new Map(releaseOrders.map(item => [item['id'], item])).values()]
|
|
467
|
+
|
|
468
|
+
// for (let releaseOrder of uniqueReleaseOrders) {
|
|
469
|
+
// const orderSource: string = releaseOrder.source
|
|
470
|
+
|
|
471
|
+
// if (orderSource == ApplicationType.SELLERCRAFT) {
|
|
472
|
+
// const sellercraft: Sellercraft = await getRepository(Sellercraft).findOne({
|
|
473
|
+
// domain: releaseOrder.bizplace.domain,
|
|
474
|
+
// status: SellercraftStatus.ACTIVE
|
|
475
|
+
// })
|
|
476
|
+
// if (sellercraft) {
|
|
477
|
+
// await getConnection().transaction(async tx => {
|
|
478
|
+
// const sellercraftCtrl: SellercraftController = new SellercraftController(tx, null, null)
|
|
479
|
+
// const rtsTriggerLevel: Setting = await tx.getRepository(Setting).findOne({
|
|
480
|
+
// where: { domain: releaseOrder.domain, category: 'id-rule', name: 'rts-trigger-level' }
|
|
481
|
+
// })
|
|
482
|
+
|
|
483
|
+
// if (rtsTriggerLevel && parseInt(rtsTriggerLevel?.value || 0) == 1) {
|
|
484
|
+
// await sellercraftCtrl.initiateOrderShipment(sellercraft, releaseOrder)
|
|
485
|
+
// }
|
|
486
|
+
// })
|
|
487
|
+
// }
|
|
488
|
+
// }
|
|
489
|
+
// }
|
|
490
|
+
// } catch (e) {
|
|
491
|
+
// logger.error(`[get-lmd-awb-sof-trigger]: ${e}`)
|
|
492
|
+
// }
|
|
493
|
+
//
|
|
539
494
|
|
|
540
495
|
async function processCallback(packageInfo) {
|
|
541
496
|
try {
|
|
@@ -565,6 +520,22 @@ async function processCallback(packageInfo) {
|
|
|
565
520
|
}
|
|
566
521
|
}
|
|
567
522
|
|
|
523
|
+
function dateTime() {
|
|
524
|
+
const currentDate = new Date()
|
|
525
|
+
const timezoneGMT = 8 * 60 // 8 hours ahead in minutes
|
|
526
|
+
currentDate.setMinutes(currentDate.getMinutes() + timezoneGMT)
|
|
527
|
+
|
|
528
|
+
const yy = currentDate.getFullYear()
|
|
529
|
+
const mm = String(currentDate.getMonth() + 1).padStart(2, '0')
|
|
530
|
+
const dd = String(currentDate.getDate()).padStart(2, '0')
|
|
531
|
+
const hrs = String(currentDate.getHours()).padStart(2, '0')
|
|
532
|
+
const mins = String(currentDate.getMinutes()).padStart(2, '0')
|
|
533
|
+
const secs = String(currentDate.getSeconds()).padStart(2, '0')
|
|
534
|
+
const dateTime = `${yy}-${mm}-${dd}T${hrs}:${mins}:${secs}GMT+08:00`
|
|
535
|
+
|
|
536
|
+
return dateTime
|
|
537
|
+
}
|
|
538
|
+
|
|
568
539
|
async function constructAwb(orderPackage, awbRes) {
|
|
569
540
|
const releaseOrder = orderPackage.releaseGood
|
|
570
541
|
let {
|
|
@@ -705,117 +676,13 @@ async function uploadInvoiceToS3(result, orderPackage) {
|
|
|
705
676
|
return invoice
|
|
706
677
|
}
|
|
707
678
|
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
})
|
|
716
|
-
} else {
|
|
717
|
-
bizplace = await tx.getRepository(Bizplace).findOne({
|
|
718
|
-
where: { domain: releaseGood.domain },
|
|
719
|
-
relations: ['domain']
|
|
720
|
-
})
|
|
721
|
-
}
|
|
722
|
-
|
|
723
|
-
return bizplace
|
|
724
|
-
}
|
|
725
|
-
|
|
726
|
-
export async function refreshLmdAccessToken(lmd, tx) {
|
|
727
|
-
const platform = lmd.platform
|
|
728
|
-
const currentDate = new Date()
|
|
729
|
-
const currentTimestamp = Math.floor(Date.now() / 1000)
|
|
730
|
-
|
|
731
|
-
switch (platform) {
|
|
732
|
-
case 'CITYLINK':
|
|
733
|
-
const expiredDateCitylink = new Date(lmd?.expiresIn)
|
|
734
|
-
// Calculate the renewal date as 2 days before the expiry date
|
|
735
|
-
const renewalDateCitylink = new Date(expiredDateCitylink.getTime() - 2 * 24 * 60 * 60 * 1000)
|
|
736
|
-
|
|
737
|
-
if (currentDate >= renewalDateCitylink) {
|
|
738
|
-
const lastMileDeliveryCitylink = await getAccessTokenCityLink(lmd?.id, { state: { tx } })
|
|
739
|
-
lmd.accessToken = lastMileDeliveryCitylink.accessToken
|
|
740
|
-
}
|
|
741
|
-
break
|
|
742
|
-
|
|
743
|
-
case 'NINJA_VAN':
|
|
744
|
-
case 'EMS':
|
|
745
|
-
const renewalTimestamp = lmd?.expiresIn - 12 * 60 * 60 // Renew 12 hr before expiry
|
|
746
|
-
|
|
747
|
-
if (currentTimestamp >= renewalTimestamp) {
|
|
748
|
-
let lastMileDelivery
|
|
749
|
-
if (platform === 'NINJA_VAN') {
|
|
750
|
-
lastMileDelivery = await refreshAccessTokenNinjavan(lmd?.id, { state: { tx } })
|
|
751
|
-
} else if (platform === 'EMS') {
|
|
752
|
-
lastMileDelivery = await getAccessTokenEfmx(lmd?.id, lmd?.clientId, lmd?.secretKey, { state: { tx } })
|
|
753
|
-
}
|
|
754
|
-
lmd.accessToken = lastMileDelivery.accessToken
|
|
755
|
-
}
|
|
756
|
-
break
|
|
757
|
-
|
|
758
|
-
default:
|
|
759
|
-
break
|
|
760
|
-
}
|
|
761
|
-
|
|
762
|
-
return lmd
|
|
763
|
-
}
|
|
764
|
-
|
|
765
|
-
export async function processOrderConsignments(orderConsignments, data, platform) {
|
|
766
|
-
return Promise.all(
|
|
767
|
-
orderConsignments.map(async oc => {
|
|
768
|
-
const packages = await Promise.all(oc.orderPackages.map(op => processOrderPackage(op, platform)))
|
|
769
|
-
return {
|
|
770
|
-
...data,
|
|
771
|
-
refNo: oc.name,
|
|
772
|
-
packages
|
|
773
|
-
}
|
|
774
|
-
})
|
|
775
|
-
)
|
|
776
|
-
}
|
|
777
|
-
|
|
778
|
-
export async function processOrderPackage(orderPackage, platform) {
|
|
779
|
-
const items = await Promise.all(orderPackage.orderPackageItems.map(opi => processOrderPackageItems(opi, platform)))
|
|
780
|
-
return {
|
|
781
|
-
refNo: orderPackage.name,
|
|
782
|
-
items
|
|
783
|
-
}
|
|
784
|
-
}
|
|
785
|
-
|
|
786
|
-
export async function processOrderPackageItems(opi, platform) {
|
|
787
|
-
try {
|
|
788
|
-
let lengthUnit = opi?.orderProduct?.productDetail?.lengthUnit?.toString()?.toLowerCase() || ''
|
|
789
|
-
|
|
790
|
-
let items = {
|
|
791
|
-
quantity: opi?.releaseQty?.toString() || ' ',
|
|
792
|
-
item: opi?.orderProduct?.product.name.slice(0, 49).trim() || ' ',
|
|
793
|
-
sku: opi?.orderProduct?.product.sku || ' ',
|
|
794
|
-
price:
|
|
795
|
-
opi?.orderProduct?.paidAmount?.toString() ||
|
|
796
|
-
(opi?.releaseQty * opi?.orderProduct?.productDetail?.costPrice || 0)?.toString() ||
|
|
797
|
-
' ',
|
|
798
|
-
weight: opi?.orderProduct?.productDetail?.grossWeight?.toString() || ' ',
|
|
799
|
-
width: opi?.orderProduct?.productDetail?.width || ' ',
|
|
800
|
-
length: opi?.orderProduct?.productDetail?.depth || ' ',
|
|
801
|
-
height: opi?.orderProduct?.productDetail?.height || ' '
|
|
802
|
-
}
|
|
803
|
-
|
|
804
|
-
if (platform == 'SAPX' || platform == 'VIETTEL_POST') {
|
|
805
|
-
if (lengthUnit == 'mm' || lengthUnit == 'm') {
|
|
806
|
-
;(items.width = (items.width / 10)?.toString()),
|
|
807
|
-
(items.length = (items.length / 10)?.toString()),
|
|
808
|
-
(items.height = (items.height / 10)?.toString())
|
|
809
|
-
} else {
|
|
810
|
-
;(items.width = items.width?.toString()),
|
|
811
|
-
(items.length = items.length?.toString()),
|
|
812
|
-
(items.height = items.height?.toString())
|
|
813
|
-
}
|
|
814
|
-
}
|
|
815
|
-
return items
|
|
816
|
-
} catch (e) {
|
|
817
|
-
logger.error(`[process-order-package-items]: ${e}`)
|
|
818
|
-
}
|
|
679
|
+
function formatDate(isoDateString) {
|
|
680
|
+
const date = new Date(isoDateString)
|
|
681
|
+
const day = date.getDate()
|
|
682
|
+
const monthNames = ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC']
|
|
683
|
+
const month = monthNames[date.getMonth()]
|
|
684
|
+
const year = date.getFullYear()
|
|
685
|
+
return `${day} ${month} ${year}`
|
|
819
686
|
}
|
|
820
687
|
|
|
821
688
|
export async function validateLmd(tx, releaseGood, lmdId) {
|