@things-factory/worksheet-base 4.3.393 → 4.3.395

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 (28) hide show
  1. package/dist-server/controllers/outbound/index.js +3 -0
  2. package/dist-server/controllers/outbound/index.js.map +1 -1
  3. package/dist-server/controllers/outbound/picking-worksheet-controller.js +160 -14
  4. package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
  5. package/dist-server/graphql/resolvers/worksheet/picking/activate-batch-picking.js +71 -1
  6. package/dist-server/graphql/resolvers/worksheet/picking/activate-batch-picking.js.map +1 -1
  7. package/dist-server/graphql/resolvers/worksheet/picking/activate-picking.js +21 -28
  8. package/dist-server/graphql/resolvers/worksheet/picking/activate-picking.js.map +1 -1
  9. package/dist-server/graphql/resolvers/worksheet/picking/bulk-activate-picking.js +21 -4
  10. package/dist-server/graphql/resolvers/worksheet/picking/bulk-activate-picking.js.map +1 -1
  11. package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js +96 -130
  12. package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js.map +1 -1
  13. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +22 -56
  14. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
  15. package/dist-server/index.js +3 -0
  16. package/dist-server/index.js.map +1 -1
  17. package/dist-server/utils/lmd-util.js +193 -162
  18. package/dist-server/utils/lmd-util.js.map +1 -1
  19. package/package.json +9 -9
  20. package/server/controllers/outbound/index.ts +2 -0
  21. package/server/controllers/outbound/picking-worksheet-controller.ts +172 -19
  22. package/server/graphql/resolvers/worksheet/picking/activate-batch-picking.ts +107 -6
  23. package/server/graphql/resolvers/worksheet/picking/activate-picking.ts +73 -65
  24. package/server/graphql/resolvers/worksheet/picking/bulk-activate-picking.ts +30 -5
  25. package/server/graphql/resolvers/worksheet/picking/complete-batch-picking.ts +34 -56
  26. package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +4 -36
  27. package/server/index.ts +2 -0
  28. package/server/utils/lmd-util.ts +180 -144
@@ -12,6 +12,7 @@ import {
12
12
  uploadAwb,
13
13
  uploadInvoice
14
14
  } from '@things-factory/attachment-base'
15
+ import { User } from '@things-factory/auth-base'
15
16
  import { Bizplace } from '@things-factory/biz-base'
16
17
  import {
17
18
  Board,
@@ -34,7 +35,9 @@ import { MarketplaceStore } from '@things-factory/integration-marketplace'
34
35
  import { MarketplaceOrder } from '@things-factory/marketplace-base'
35
36
  import {
36
37
  OrderPackage,
37
- ReleaseGood
38
+ ReleaseGood,
39
+ ReleaseGoodLogs,
40
+ createReleaseGoodLog
38
41
  } from '@things-factory/sales-base'
39
42
  import { Domain } from '@things-factory/shell'
40
43
 
@@ -53,67 +56,71 @@ export async function createLmdParcel(releaseGoods, tx, domain, user, marketplac
53
56
  try {
54
57
  let parcelsRequest = []
55
58
  for (let releaseGood of releaseGoods) {
56
- let lmd: LastMileDelivery = releaseGood.lastMileDelivery
59
+ try {
60
+ let lmd: LastMileDelivery = releaseGood.lastMileDelivery
57
61
 
58
- const bizplace: Bizplace = await tx.getRepository(Bizplace).findOne({
59
- where: { domain: releaseGood.domain },
60
- relations: ['domain']
61
- })
62
+ const bizplace: Bizplace = await tx.getRepository(Bizplace).findOne({
63
+ where: { domain: releaseGood.domain },
64
+ relations: ['domain']
65
+ })
62
66
 
63
- const senderGeoArea: GeoArea = await tx
64
- .getRepository(GeoArea)
65
- .findOne({ where: { postalCode: bizplace.postalCode } })
67
+ const senderGeoArea: GeoArea = await tx
68
+ .getRepository(GeoArea)
69
+ .findOne({ where: { postalCode: bizplace.postalCode } })
66
70
 
67
- const recipientGeoArea: GeoArea = await tx
68
- .getRepository(GeoArea)
69
- .findOne({ where: { postalCode: releaseGood.postalCode } })
71
+ const recipientGeoArea: GeoArea = await tx
72
+ .getRepository(GeoArea)
73
+ .findOne({ where: { postalCode: releaseGood.postalCode } })
70
74
 
71
- const currentTimestamp: number = Math.floor(Date.now() / 1000)
72
- if (lmd?.platform == 'NINJA_VAN') {
73
75
  const currentTimestamp: number = Math.floor(Date.now() / 1000)
74
- if (currentTimestamp >= lmd?.expiresIn) {
75
- const lastMileDelivery = await refreshAccessTokenNinjavan(lmd?.id, { state: { tx } })
76
- lmd.accessToken = lastMileDelivery.accessToken
76
+ if (lmd?.platform == 'NINJA_VAN') {
77
+ const currentTimestamp: number = Math.floor(Date.now() / 1000)
78
+ if (currentTimestamp >= lmd?.expiresIn) {
79
+ const lastMileDelivery = await refreshAccessTokenNinjavan(lmd?.id, { state: { tx } })
80
+ lmd.accessToken = lastMileDelivery.accessToken
81
+ }
77
82
  }
78
- }
79
83
 
80
- if (lmd?.platform == 'EMS') {
81
- if (currentTimestamp >= lmd?.expiresIn || lmd?.expiresIn == null) {
82
- let lastMileDelivery = await getAccessTokenEfmx(lmd?.id, lmd?.clientId, lmd?.secretKey, { state: { tx } })
83
- lmd.accessToken = lastMileDelivery.accessToken
84
+ if (lmd?.platform == 'EMS') {
85
+ if (currentTimestamp >= lmd?.expiresIn || lmd?.expiresIn == null) {
86
+ let lastMileDelivery = await getAccessTokenEfmx(lmd?.id, lmd?.clientId, lmd?.secretKey, { state: { tx } })
87
+ lmd.accessToken = lastMileDelivery.accessToken
88
+ }
84
89
  }
85
- }
86
- if (lmd?.platform == 'DHL_EXPRESS') {
87
- if (
88
- (releaseGood?.deliveryAddress2 != undefined && releaseGood?.deliveryAddress3 != undefined) ||
89
- (releaseGood?.deliveryAddress2 == '-' && releaseGood?.deliveryAddress3 == '-') ||
90
- (releaseGood?.deliveryAddress2 == null && releaseGood?.deliveryAddress3 == null)
91
- ) {
92
- let addArray = releaseGood.deliveryAddress1?.split(',')
93
- releaseGood.deliveryAddress1 = addArray[0]?.trim() + ','
94
- releaseGood.deliveryAddress2 = addArray[1]?.trim() + ','
95
- releaseGood.deliveryAddress3 = addArray?.slice(2).join(', ').trim()
90
+ if (lmd?.platform == 'DHL_EXPRESS') {
91
+ if (
92
+ (releaseGood?.deliveryAddress2 != undefined && releaseGood?.deliveryAddress3 != undefined) ||
93
+ (releaseGood?.deliveryAddress2 == '-' && releaseGood?.deliveryAddress3 == '-') ||
94
+ (releaseGood?.deliveryAddress2 == null && releaseGood?.deliveryAddress3 == null)
95
+ ) {
96
+ let addArray = releaseGood.deliveryAddress1?.split(',')
97
+ releaseGood.deliveryAddress1 = addArray[0]?.trim() + ','
98
+ releaseGood.deliveryAddress2 = addArray[1]?.trim() + ','
99
+ releaseGood.deliveryAddress3 = addArray?.slice(2).join(', ').trim()
100
+ }
96
101
  }
97
- }
98
- let [latitude, longitude] = bizplace?.latlng?.split(',')
99
-
100
- let data = {
101
- courier: lmd.platform,
102
- clientId: lmd?.clientId,
103
- clientPass: lmd?.secretKey,
104
- pickupAccountId: lmd?.pickupAccountId,
105
- soldToAccountId: lmd?.soldToAccountId,
106
- token: lmd?.accessToken,
107
- staging: lmd?.staging,
108
- accountNumber: lmd?.accountNumber,
109
- accountName: lmd?.name,
110
- orderDate: lmd.platform == 'DHL_EXPRESS' ? dateTime() : new Date().toISOString(),
111
- remark: releaseGood?.remark,
112
- prefix: lmd?.prefix,
113
-
114
- orderNo: releaseGood?.refNo,
115
- cod: releaseGood?.codOption,
116
- paidAmount: releaseGood?.paidAmount?.toString(),
102
+ let [latitude, longitude] = bizplace?.latlng?.split(',')
103
+
104
+ let data = {
105
+ courier: lmd.platform,
106
+ clientId: lmd?.clientId,
107
+ clientPass: lmd?.secretKey,
108
+ pickupAccountId: lmd?.pickupAccountId,
109
+ soldToAccountId: lmd?.soldToAccountId,
110
+ token: lmd?.accessToken,
111
+ staging: lmd?.staging,
112
+ accountNumber: lmd?.accountNumber,
113
+ accountName: lmd?.name,
114
+ orderDate: lmd.platform == 'DHL_EXPRESS' ? dateTime() : new Date().toISOString(),
115
+ remark: releaseGood?.remark,
116
+ prefix: lmd?.prefix,
117
+
118
+ //pass releaseGoodId for rg logs
119
+ releaseGoodId: releaseGood?.id,
120
+
121
+ orderNo: releaseGood?.refNo,
122
+ cod: releaseGood?.codOption,
123
+ paidAmount: releaseGood?.paidAmount?.toString(),
117
124
 
118
125
  recipient: releaseGood.attentionTo,
119
126
  phone: releaseGood.phone1,
@@ -131,24 +138,24 @@ export async function createLmdParcel(releaseGoods, tx, domain, user, marketplac
131
138
  releaseGood.city?.toUpperCase(),
132
139
  country: releaseGood.country,
133
140
 
134
- pSender: bizplace.name,
135
- pAddress: bizplace.address,
136
- pAddress2: bizplace.address2,
137
- pPhone: bizplace?.phone,
138
- pEmail: bizplace.email,
139
- pWard: bizplace?.ward, // only for viettel lmd
140
- pCity: bizplace.city || senderGeoArea.cityName,
141
- pPostcode: bizplace.postalCode || senderGeoArea.postalCode,
142
- pDistrict: bizplace?.district || bizplace.city,
143
- pState: bizplace.state || senderGeoArea.stateName,
144
- pCountry: bizplace.countryCode || senderGeoArea.countryCode,
145
- pLatitude: latitude,
146
- pLongitude: longitude,
147
-
148
- handoverMethod: 1
149
- }
141
+ pSender: bizplace.name,
142
+ pAddress: bizplace.address,
143
+ pAddress2: bizplace.address2,
144
+ pPhone: bizplace?.phone,
145
+ pEmail: bizplace.email,
146
+ pWard: bizplace?.ward, // only for viettel lmd
147
+ pCity: bizplace.city || senderGeoArea.cityName,
148
+ pPostcode: bizplace.postalCode || senderGeoArea.postalCode,
149
+ pDistrict: bizplace?.district || bizplace.city,
150
+ pState: bizplace.state || senderGeoArea.stateName,
151
+ pCountry: bizplace.countryCode || senderGeoArea.countryCode,
152
+ pLatitude: latitude,
153
+ pLongitude: longitude,
154
+
155
+ handoverMethod: 1
156
+ }
150
157
 
151
- let unprocessedOrderPackages: OrderPackage[] = releaseGood.orderPackages.filter(op => !op.parcelId)
158
+ let unprocessedOrderPackages: OrderPackage[] = releaseGood.orderPackages.filter(op => !op.parcelId)
152
159
 
153
160
  let packagesData = unprocessedOrderPackages.map(op => {
154
161
  return {
@@ -171,56 +178,80 @@ export async function createLmdParcel(releaseGoods, tx, domain, user, marketplac
171
178
  height: opi?.orderProduct?.productDetail?.height || ' '
172
179
  }
173
180
 
174
- if (lmd.platform == 'SAPX' || lmd.platform == 'VIETTEL_POST') {
175
- if (lengthUnit == 'mm' || lengthUnit == 'm') {
176
- ;(items.width = (items.width / 10)?.toString()),
177
- (items.length = (items.length / 10)?.toString()),
178
- (items.height = (items.height / 10)?.toString())
179
- } else {
180
- ;(items.width = items.width?.toString()),
181
- (items.length = items.length?.toString()),
182
- (items.height = items.height?.toString())
181
+ if (lmd.platform == 'SAPX' || lmd.platform == 'VIETTEL_POST') {
182
+ if (lengthUnit == 'mm' || lengthUnit == 'm') {
183
+ ;(items.width = (items.width / 10)?.toString()),
184
+ (items.length = (items.length / 10)?.toString()),
185
+ (items.height = (items.height / 10)?.toString())
186
+ } else {
187
+ ;(items.width = items.width?.toString()),
188
+ (items.length = items.length?.toString()),
189
+ (items.height = items.height?.toString())
190
+ }
183
191
  }
184
- }
185
- return items
186
- })
187
- }
188
- })
192
+ return items
193
+ })
194
+ }
195
+ })
189
196
 
190
- parcelsRequest.push(...packagesData)
197
+ parcelsRequest.push(...packagesData)
198
+ } catch (e) {
199
+ let errorResponse = JSON.stringify(e.message)
200
+ createReleaseGoodLog('create-lmd-parcel', errorResponse, releaseGood.id, {
201
+ state: { domain: null }
202
+ })
203
+ }
191
204
  }
192
205
 
193
206
  if (parcelsRequest && parcelsRequest.length > 0) {
194
- let res = await LastMileAPI.createParcel(
195
- { ...releaseGoods[0].lastMileDelivery, platform: 'lmdMiddleware' },
196
- parcelsRequest
197
- )
198
- for (let parcel of res) {
199
- let courier = parcel.transporter
200
- let transporter = courier.replace(/_/g, ' ')
201
- await tx
207
+ let orderPackages: OrderPackage[]
208
+
209
+ try {
210
+ let res = await LastMileAPI.createParcel(
211
+ { ...releaseGoods[0].lastMileDelivery, platform: 'lmdMiddleware' },
212
+ parcelsRequest
213
+ )
214
+ for (let parcel of res) {
215
+ let courier = parcel.transporter
216
+ let transporter = courier.replace(/_/g, ' ')
217
+ await tx
218
+ .getRepository(OrderPackage)
219
+ .update({ name: parcel.refNo }, { parcelId: parcel.parcelId, transporter: transporter })
220
+
221
+ parcelsRequest.map(rg => {
222
+ createReleaseGoodLog('lmd-create-parcel', parcel.message, rg.releaseGoodId, {
223
+ state: { domain: null }
224
+ })
225
+ })
226
+ }
227
+
228
+ const qb: SelectQueryBuilder<OrderPackage> = tx
202
229
  .getRepository(OrderPackage)
203
- .update({ name: parcel.refNo }, { parcelId: parcel.parcelId, transporter: transporter })
204
- }
230
+ .createQueryBuilder('op')
231
+ .innerJoinAndSelect('op.releaseGood', 'rg')
232
+ .innerJoinAndSelect('rg.domain', 'd')
233
+ .innerJoinAndSelect('rg.bizplace', 'b')
234
+ .innerJoinAndSelect('b.company', 'c')
235
+ .innerJoinAndSelect('c.domain', 'companyDomain')
236
+ .innerJoinAndSelect('b.domain', 'd2')
237
+ .leftJoinAndSelect('rg.lastMileDelivery', 'lmd')
238
+ .where('op.name IN (:...orderPackageIds)', {
239
+ orderPackageIds: res.map(parcel => {
240
+ return parcel.refNo
241
+ })
242
+ })
243
+
244
+ orderPackages = await qb.getMany()
205
245
 
206
- const qb: SelectQueryBuilder<OrderPackage> = tx
207
- .getRepository(OrderPackage)
208
- .createQueryBuilder('op')
209
- .innerJoinAndSelect('op.releaseGood', 'rg')
210
- .innerJoinAndSelect('rg.domain', 'd')
211
- .innerJoinAndSelect('rg.bizplace', 'b')
212
- .innerJoinAndSelect('b.company', 'c')
213
- .innerJoinAndSelect('c.domain', 'companyDomain')
214
- .innerJoinAndSelect('b.domain', 'd2')
215
- .leftJoinAndSelect('rg.lastMileDelivery', 'lmd')
216
- .where('op.name IN (:...orderPackageIds)', {
217
- orderPackageIds: res.map(parcel => {
218
- return parcel.refNo
246
+ await processAwbAndTrackingNo(orderPackages, tx, domain, user, marketplaceOrder)
247
+ } catch (error) {
248
+ let errorResponse = error.message
249
+ parcelsRequest.map(rg => {
250
+ createReleaseGoodLog('error-lmd-create-parcel', errorResponse, rg.releaseGoodId, {
251
+ state: { domain: null }
219
252
  })
220
253
  })
221
-
222
- const orderPackages: OrderPackage[] = await qb.getMany()
223
- await processAwbAndTrackingNo(orderPackages, tx, domain, user, marketplaceOrder)
254
+ }
224
255
  }
225
256
  } catch (e) {
226
257
  logger.error(`[lmd-create-parcel]: ${e}`)
@@ -239,7 +270,7 @@ export async function processAwbAndTrackingNo(orderPackages, tx, domain, user, m
239
270
  { ...orderPackage.releaseGood.lastMileDelivery, platform: 'lmdMiddleware' },
240
271
  { parcelId: orderPackage.parcelId, staging: orderPackage.releaseGood.lastMileDelivery?.staging }
241
272
  )
242
-
273
+
243
274
  if (awbRes) {
244
275
  let awbContent: any
245
276
  let invoiceContent: any
@@ -343,43 +374,48 @@ export async function processAwbAndTrackingNo(orderPackages, tx, domain, user, m
343
374
  }
344
375
  }
345
376
  } catch (e) {
377
+ let releaseGoodId = orderPackage.releaseGood.id
346
378
  logger.error(e)
379
+ let errorResponse = e.message
380
+ createReleaseGoodLog('error-process-awb-and-tracking-no', errorResponse, releaseGoodId, {
381
+ state: { domain: null }
382
+ })
347
383
  }
348
- // })
349
384
  }
350
-
351
- // trigger RTS
352
- // try {
353
- // let uniqueReleaseOrders: ReleaseGood = [...new Map(releaseOrders.map(item => [item['id'], item])).values()]
354
-
355
- // for (let releaseOrder of uniqueReleaseOrders) {
356
- // const orderSource: string = releaseOrder.source
357
-
358
- // if (orderSource == ApplicationType.SELLERCRAFT) {
359
- // const sellercraft: Sellercraft = await getRepository(Sellercraft).findOne({
360
- // domain: releaseOrder.bizplace.domain,
361
- // status: SellercraftStatus.ACTIVE
362
- // })
363
- // if (sellercraft) {
364
- // await getConnection().transaction(async tx => {
365
- // const sellercraftCtrl: SellercraftController = new SellercraftController(tx, null, null)
366
- // const rtsTriggerLevel: Setting = await tx.getRepository(Setting).findOne({
367
- // where: { domain: releaseOrder.domain, category: 'id-rule', name: 'rts-trigger-level' }
368
- // })
369
-
370
- // if (rtsTriggerLevel && parseInt(rtsTriggerLevel?.value || 0) == 1) {
371
- // await sellercraftCtrl.initiateOrderShipment(sellercraft, releaseOrder)
372
- // }
373
- // })
374
- // }
375
- // }
376
- // }
377
- // } catch (e) {
378
- // logger.error(`[get-lmd-awb-sof-trigger]: ${e}`)
379
- // }
380
- //
385
+ // })
381
386
  }
382
387
 
388
+ // trigger RTS
389
+ // try {
390
+ // let uniqueReleaseOrders: ReleaseGood = [...new Map(releaseOrders.map(item => [item['id'], item])).values()]
391
+
392
+ // for (let releaseOrder of uniqueReleaseOrders) {
393
+ // const orderSource: string = releaseOrder.source
394
+
395
+ // if (orderSource == ApplicationType.SELLERCRAFT) {
396
+ // const sellercraft: Sellercraft = await getRepository(Sellercraft).findOne({
397
+ // domain: releaseOrder.bizplace.domain,
398
+ // status: SellercraftStatus.ACTIVE
399
+ // })
400
+ // if (sellercraft) {
401
+ // await getConnection().transaction(async tx => {
402
+ // const sellercraftCtrl: SellercraftController = new SellercraftController(tx, null, null)
403
+ // const rtsTriggerLevel: Setting = await tx.getRepository(Setting).findOne({
404
+ // where: { domain: releaseOrder.domain, category: 'id-rule', name: 'rts-trigger-level' }
405
+ // })
406
+
407
+ // if (rtsTriggerLevel && parseInt(rtsTriggerLevel?.value || 0) == 1) {
408
+ // await sellercraftCtrl.initiateOrderShipment(sellercraft, releaseOrder)
409
+ // }
410
+ // })
411
+ // }
412
+ // }
413
+ // }
414
+ // } catch (e) {
415
+ // logger.error(`[get-lmd-awb-sof-trigger]: ${e}`)
416
+ // }
417
+ //
418
+
383
419
  async function processCallback(packageInfo) {
384
420
  try {
385
421
  let response = await fetch(`${packageInfo.integration.urlCallback}`, {