@things-factory/worksheet-base 4.3.523 → 4.3.524

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.
@@ -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 &&
@@ -20,13 +20,18 @@ import {
20
20
  refreshAccessTokenNinjavan,
21
21
  getAccessTokenCityLink
22
22
  } from '@things-factory/integration-lmd'
23
- import { createReleaseGoodLog, OrderPackage, ReleaseGood } from '@things-factory/sales-base'
23
+ import { createReleaseGoodLog, OrderPackage, ReleaseGood, OrderConsignment } 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'
28
29
 
29
30
  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', {})
30
35
  import i18next from 'i18next'
31
36
 
32
37
  // import { SellercraftController } from '../controllers'
@@ -40,6 +45,8 @@ const LMD_BOARDS = {
40
45
  export async function createLmdParcel(releaseGoods, tx, domain, user, marketplaceOrder) {
41
46
  try {
42
47
  let parcelsRequest = []
48
+ let parcelsRequestV2 = []
49
+
43
50
  for (let index = 0; index < releaseGoods.length; index++) {
44
51
  let releaseGood = releaseGoods[index]
45
52
  try {
@@ -54,27 +61,18 @@ export async function createLmdParcel(releaseGoods, tx, domain, user, marketplac
54
61
 
55
62
  try {
56
63
  let lmd: LastMileDelivery = releaseGood.lastMileDelivery
57
- let bizplace: Bizplace
64
+ let version = lmd?.version ? lmd.version : 'v1'
58
65
  let lmdBizplace: LastMileDeliveryBizplace = await tx.getRepository(LastMileDeliveryBizplace).findOne({
59
66
  where: { lastMileDelivery: lmd.id, bizplace: releaseGood.bizplace },
60
67
  relations: ['lastMileDelivery', 'bizplace']
61
68
  })
62
69
 
70
+ let bizplace: Bizplace = await assignBizplaceAddress(lmdBizplace, releaseGood, tx)
71
+ let [latitude, longitude] = bizplace?.latlng?.split(',')
72
+
63
73
  let validLmd: Boolean = await validateLmd(tx, releaseGood, lmd.id)
64
74
  if (!validLmd) throw new Error(`Last mile delivery account is not valid. Please contact support team.`)
65
75
 
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
-
78
76
  const senderGeoArea: GeoArea = await tx
79
77
  .getRepository(GeoArea)
80
78
  .findOne({ where: { postalCode: bizplace.postalCode } })
@@ -99,37 +97,13 @@ export async function createLmdParcel(releaseGoods, tx, domain, user, marketplac
99
97
  return releaseGood
100
98
  }
101
99
 
102
- const currentDate = new Date()
103
- const currentTimestamp = Math.floor(Date.now() / 1000)
104
-
105
100
  switch (lmd?.platform) {
106
101
  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
- }
115
102
  releaseGood = fnSplitAddress(releaseGood)
116
- break
117
-
118
103
  case 'NINJA_VAN':
119
104
  case 'EMS':
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
- }
105
+ lmd = await refreshLmdAccessToken(lmd, tx)
131
106
  break
132
-
133
107
  case 'DHL_EXPRESS':
134
108
  releaseGood = fnSplitAddress(releaseGood)
135
109
  break
@@ -138,8 +112,6 @@ export async function createLmdParcel(releaseGoods, tx, domain, user, marketplac
138
112
  break
139
113
  }
140
114
 
141
- let [latitude, longitude] = bizplace?.latlng?.split(',')
142
-
143
115
  let data = {
144
116
  courier: lmd.platform,
145
117
  clientId: lmd?.clientId,
@@ -154,6 +126,7 @@ export async function createLmdParcel(releaseGoods, tx, domain, user, marketplac
154
126
  remark: releaseGood?.remark,
155
127
  prefix: lmd?.prefix,
156
128
  scope: lmd?.scope,
129
+ mps: lmd.mps,
157
130
 
158
131
  //pass releaseGoodId for rg logs
159
132
  releaseGoodId: releaseGood?.id,
@@ -163,6 +136,7 @@ export async function createLmdParcel(releaseGoods, tx, domain, user, marketplac
163
136
  custRef: releaseGood?.refNo2,
164
137
  cod: releaseGood?.codOption,
165
138
  paidAmount: releaseGood?.paidAmount?.toString(),
139
+ source: releaseGood?.source,
166
140
 
167
141
  recipient: releaseGood.attentionTo,
168
142
  phone: releaseGood?.phone1 ? releaseGood.phone1 : releaseGood?.phone2 ? releaseGood.phone2 : '',
@@ -197,46 +171,34 @@ export async function createLmdParcel(releaseGoods, tx, domain, user, marketplac
197
171
  handoverMethod: 1
198
172
  }
199
173
 
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
- }
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
233
196
  }
234
- return items
235
197
  })
236
- }
237
- })
198
+ )
238
199
 
239
- parcelsRequest.push(...packagesData)
200
+ parcelsRequest.push(...packagesData)
201
+ }
240
202
  } catch (e) {
241
203
  createReleaseGoodLog('create-lmd-parcel', e.message, releaseGood.id, {
242
204
  state: { domain: null }
@@ -245,14 +207,23 @@ export async function createLmdParcel(releaseGoods, tx, domain, user, marketplac
245
207
  }
246
208
  }
247
209
 
210
+ if (parcelsRequestV2 && parcelsRequestV2.length > 0) {
211
+ await lmdIntegrationV2(parcelsRequestV2, releaseGoods, tx, domain, user, marketplaceOrder)
212
+ }
213
+
248
214
  if (parcelsRequest && parcelsRequest.length > 0) {
249
215
  let orderPackages: OrderPackage[]
216
+ let res
250
217
 
251
218
  try {
252
- let res = await LastMileAPI.createParcel(
253
- { ...releaseGoods[0].lastMileDelivery, platform: 'lmdMiddleware' },
219
+ res = await LastMileAPI.createParcel(
220
+ {
221
+ ...releaseGoods[0].lastMileDelivery,
222
+ platform: lmdConfig.version.v1
223
+ },
254
224
  parcelsRequest
255
225
  )
226
+
256
227
  for (let parcel of res) {
257
228
  let courier = parcel.transporter
258
229
  let transporter = courier.replace(/_/g, ' ')
@@ -304,19 +275,100 @@ export async function createLmdParcel(releaseGoods, tx, domain, user, marketplac
304
275
  }
305
276
  }
306
277
 
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
+
307
350
  export async function processAwbAndTrackingNo(orderPackages, tx, domain, user, marketplaceOrder) {
308
351
  const ecommerceCtrl: EcommerceController = new EcommerceController(tx, domain, user)
309
352
  let releaseOrders: ReleaseGood = []
310
353
 
311
354
  for (let orderPackage of orderPackages) {
312
- // await getConnection().transaction(async tx => {
313
355
  try {
356
+ let awbRes
314
357
  let releaseGood = orderPackage.releaseGood
315
- let awbRes = await LastMileAPI.getAwb(
316
- { ...orderPackage.releaseGood.lastMileDelivery, platform: 'lmdMiddleware' },
317
- { parcelId: orderPackage.parcelId, staging: orderPackage.releaseGood.lastMileDelivery?.staging }
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
+ }
318
370
  )
319
- // console.log(`[processAwbAndTrackingNo]Origin AWB URL : ${awbRes?.content}`)
371
+
320
372
  let awbCustomize: Boolean = orderPackage.releaseGood.lastMileDelivery?.awbCustomize
321
373
 
322
374
  if (awbRes) {
@@ -458,39 +510,32 @@ export async function processAwbAndTrackingNo(orderPackages, tx, domain, user, m
458
510
  })
459
511
  }
460
512
  }
461
- // })
462
513
  }
463
514
 
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
- //
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
+ }
494
539
 
495
540
  async function processCallback(packageInfo) {
496
541
  try {
@@ -520,22 +565,6 @@ async function processCallback(packageInfo) {
520
565
  }
521
566
  }
522
567
 
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
-
539
568
  async function constructAwb(orderPackage, awbRes) {
540
569
  const releaseOrder = orderPackage.releaseGood
541
570
  let {
@@ -676,13 +705,117 @@ async function uploadInvoiceToS3(result, orderPackage) {
676
705
  return invoice
677
706
  }
678
707
 
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}`
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
+ }
686
819
  }
687
820
 
688
821
  export async function validateLmd(tx, releaseGood, lmdId) {