@things-factory/worksheet-base 4.3.524 → 4.3.526

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.
Files changed (24) hide show
  1. package/dist-server/controllers/outbound/index.js +1 -7
  2. package/dist-server/controllers/outbound/index.js.map +1 -1
  3. package/dist-server/controllers/outbound/packing-worksheet-controller.js +2 -2
  4. package/dist-server/controllers/outbound/packing-worksheet-controller.js.map +1 -1
  5. package/dist-server/controllers/outbound/picking-worksheet-controller.js +96 -441
  6. package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
  7. package/dist-server/graphql/resolvers/worksheet/packing/complete-packing.js +4 -4
  8. package/dist-server/graphql/resolvers/worksheet/packing/complete-packing.js.map +1 -1
  9. package/dist-server/graphql/resolvers/worksheet/picking/activate-picking.js.map +1 -1
  10. package/dist-server/graphql/types/worksheet/index.js +2 -0
  11. package/dist-server/graphql/types/worksheet/index.js.map +1 -1
  12. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js +1 -0
  13. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js.map +1 -1
  14. package/dist-server/utils/lmd-util.js +123 -214
  15. package/dist-server/utils/lmd-util.js.map +1 -1
  16. package/package.json +20 -20
  17. package/server/controllers/outbound/index.ts +1 -9
  18. package/server/controllers/outbound/packing-worksheet-controller.ts +2 -2
  19. package/server/controllers/outbound/picking-worksheet-controller.ts +89 -507
  20. package/server/graphql/resolvers/worksheet/packing/complete-packing.ts +5 -4
  21. package/server/graphql/resolvers/worksheet/picking/activate-picking.ts +1 -1
  22. package/server/graphql/types/worksheet/index.ts +2 -0
  23. package/server/graphql/types/worksheet/worksheet-detail-info.ts +1 -0
  24. 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
  }
@@ -76,7 +76,7 @@ export async function activatePicking(
76
76
  break
77
77
  }
78
78
 
79
- if (
79
+ if (
80
80
  releaseGood?.orderPackages?.length &&
81
81
  releaseGood.lmdOption &&
82
82
  releaseGood.lastMileDelivery &&
@@ -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 (
@@ -75,5 +75,6 @@ export const WorksheetDetailInfo = gql`
75
75
  expirationPeriod: Int
76
76
  productDetail: ProductDetail
77
77
  originLocation: Location
78
+ grossWeight: Float
78
79
  }
79
80
  `
@@ -20,18 +20,13 @@ import {
20
20
  refreshAccessTokenNinjavan,
21
21
  getAccessTokenCityLink
22
22
  } from '@things-factory/integration-lmd'
23
- import { createReleaseGoodLog, OrderPackage, ReleaseGood, OrderConsignment } from '@things-factory/sales-base'
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 version = lmd?.version ? lmd.version : 'v1'
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
- lmd = await refreshLmdAccessToken(lmd, tx)
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
- if (version == 'v2') {
175
- let unprocessedConsignments: OrderConsignment = releaseGood?.orderConsignments
176
- .map(oc => ({
177
- ...oc,
178
- orderPackages: oc.orderPackages.filter(op => !op.parcelId)
179
- }))
180
- .filter(oc => oc.orderPackages.length > 0)
181
- let consignmentData = await processOrderConsignments(unprocessedConsignments, data, lmd.platform)
182
- parcelsRequestV2.push(...consignmentData)
183
- } else {
184
- // for version1 lmd endpoint
185
- let unprocessedOrderPackages: OrderPackage[] = releaseGood.orderPackages.filter(op => !op.parcelId)
186
-
187
- let packagesData = await Promise.all(
188
- unprocessedOrderPackages.map(async op => {
189
- const items = await Promise.all(
190
- op.orderPackageItems.map(opi => processOrderPackageItems(opi, lmd.platform))
191
- )
192
- return {
193
- ...data,
194
- refNo: op.name,
195
- items: items
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
- parcelsRequest.push(...packagesData)
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 lmdVersion = releaseGood.lastMileDelivery.version
359
-
360
- const platform = lmdConfig.version[lmdVersion === 'v2' ? 'v2' : 'v1']
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
- function dateTime() {
516
- const currentDate = new Date()
517
- const timezoneGMT = 8 * 60 // 8 hours ahead in minutes
518
- currentDate.setMinutes(currentDate.getMinutes() + timezoneGMT)
519
-
520
- const yy = currentDate.getFullYear()
521
- const mm = String(currentDate.getMonth() + 1).padStart(2, '0')
522
- const dd = String(currentDate.getDate()).padStart(2, '0')
523
- const hrs = String(currentDate.getHours()).padStart(2, '0')
524
- const mins = String(currentDate.getMinutes()).padStart(2, '0')
525
- const secs = String(currentDate.getSeconds()).padStart(2, '0')
526
- const dateTime = `${yy}-${mm}-${dd}T${hrs}:${mins}:${secs}GMT+08:00`
527
-
528
- return dateTime
529
- }
530
-
531
- function formatDate(isoDateString) {
532
- const date = new Date(isoDateString)
533
- const day = date.getDate()
534
- const monthNames = ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC']
535
- const month = monthNames[date.getMonth()]
536
- const year = date.getFullYear()
537
- return `${day} ${month} ${year}`
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
- export async function assignBizplaceAddress(lmdBizplace, releaseGood, tx) {
709
- let bizplace: Bizplace
710
-
711
- if (lmdBizplace?.customAddress == true) {
712
- bizplace = await tx.getRepository(Bizplace).findOne({
713
- where: { id: lmdBizplace.bizplace.id },
714
- relations: ['domain']
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) {