@things-factory/worksheet-base 4.3.236 → 4.3.238

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 (41) hide show
  1. package/dist-server/controllers/ecommerce/index.js +1 -0
  2. package/dist-server/controllers/ecommerce/index.js.map +1 -1
  3. package/dist-server/controllers/ecommerce/powrup-controller.js +201 -0
  4. package/dist-server/controllers/ecommerce/powrup-controller.js.map +1 -0
  5. package/dist-server/controllers/outbound/packing-worksheet-controller.js +23 -0
  6. package/dist-server/controllers/outbound/packing-worksheet-controller.js.map +1 -1
  7. package/dist-server/controllers/outbound/picking-worksheet-controller.js +35 -0
  8. package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
  9. package/dist-server/controllers/worksheet-controller.js +3 -2
  10. package/dist-server/controllers/worksheet-controller.js.map +1 -1
  11. package/dist-server/graphql/resolvers/worksheet/packing/complete-packing.js +10 -8
  12. package/dist-server/graphql/resolvers/worksheet/packing/complete-packing.js.map +1 -1
  13. package/dist-server/graphql/resolvers/worksheet/packing/packing.js +9 -0
  14. package/dist-server/graphql/resolvers/worksheet/packing/packing.js.map +1 -1
  15. package/dist-server/graphql/resolvers/worksheet/packing/scan-product-packing.js +3 -2
  16. package/dist-server/graphql/resolvers/worksheet/packing/scan-product-packing.js.map +1 -1
  17. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +43 -1
  18. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
  19. package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js +23 -0
  20. package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js.map +1 -1
  21. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +27 -0
  22. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
  23. package/dist-server/graphql/resolvers/worksheet/putaway/complete-putaway.js +13 -1
  24. package/dist-server/graphql/resolvers/worksheet/putaway/complete-putaway.js.map +1 -1
  25. package/dist-server/graphql/resolvers/worksheet/putaway-return/complete-putaway-return.js +11 -1
  26. package/dist-server/graphql/resolvers/worksheet/putaway-return/complete-putaway-return.js.map +1 -1
  27. package/package.json +20 -19
  28. package/server/controllers/ecommerce/index.ts +1 -0
  29. package/server/controllers/ecommerce/powrup-controller.ts +272 -0
  30. package/server/controllers/outbound/packing-worksheet-controller.ts +29 -1
  31. package/server/controllers/outbound/picking-worksheet-controller.ts +65 -44
  32. package/server/controllers/worksheet-controller.ts +4 -3
  33. package/server/graphql/resolvers/worksheet/packing/complete-packing.ts +10 -9
  34. package/server/graphql/resolvers/worksheet/packing/packing.ts +12 -1
  35. package/server/graphql/resolvers/worksheet/packing/scan-product-packing.ts +3 -2
  36. package/server/graphql/resolvers/worksheet/packing-worksheet.ts +46 -2
  37. package/server/graphql/resolvers/worksheet/picking/complete-batch-picking.ts +30 -1
  38. package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +33 -1
  39. package/server/graphql/resolvers/worksheet/putaway/complete-putaway.ts +19 -2
  40. package/server/graphql/resolvers/worksheet/putaway-return/complete-putaway-return.ts +17 -2
  41. package/translations/ja.json +8 -0
@@ -0,0 +1,272 @@
1
+ import { getRepository } from 'typeorm'
2
+
3
+ import { Bizplace } from '@things-factory/biz-base'
4
+ import { logger } from '@things-factory/env'
5
+ import { Powrup, PowrupAPI } from '@things-factory/integration-powrup'
6
+ import { Product, ProductDetail } from '@things-factory/product-base'
7
+ import {
8
+ ORDER_STATUS,
9
+ OrderNoGenerator,
10
+ OrderPackage,
11
+ OrderPackageItem,
12
+ OrderProduct,
13
+ ReleaseGood
14
+ } from '@things-factory/sales-base'
15
+ import { Inventory, INVENTORY_STATUS, LOCATION_TYPE } from '@things-factory/warehouse-base'
16
+
17
+ import { DateTimeDifference } from '../../utils/datetime-util'
18
+ import { WorksheetController } from '../worksheet-controller'
19
+
20
+ export class PowrupController extends WorksheetController {
21
+ async packOrder(powrup: Powrup, releaseGood: ReleaseGood): Promise<ReleaseGood> {
22
+ try {
23
+ const orderProducts: OrderProduct[] = releaseGood.orderProducts
24
+ const orderInformation: any = {
25
+ orderId: releaseGood.refOrderId
26
+ }
27
+
28
+ if (
29
+ releaseGood?.lastMarketPackCall &&
30
+ DateTimeDifference.timeDifferenceInSeconds(releaseGood.lastMarketPackCall, new Date()) <= 5
31
+ ) {
32
+ return false
33
+ }
34
+
35
+ await getRepository(ReleaseGood).update(
36
+ { id: releaseGood.id },
37
+ {
38
+ lastMarketPackCall: new Date()
39
+ }
40
+ )
41
+
42
+ const orderPack: any = await PowrupAPI.packOrder(powrup, {
43
+ ...orderInformation,
44
+ context: { state: { domain: this?.domain, user: this?.user } }
45
+ })
46
+
47
+ if (orderPack?.packages) {
48
+ const packages: any[] = orderPack.packages
49
+
50
+ await Promise.all(
51
+ packages.map(async pkg => {
52
+ const items = pkg.items
53
+ const orderPackage: OrderPackage = {
54
+ name: OrderNoGenerator.orderPackage(),
55
+ packageId: pkg.packageId,
56
+ status: ORDER_STATUS.PROCESSING,
57
+ releaseGood,
58
+ domain: releaseGood.domain,
59
+ bizplace: releaseGood.bizplace,
60
+ creator: releaseGood.creator,
61
+ updater: releaseGood.updater
62
+ }
63
+
64
+ let savedOrderPackage: OrderPackage = await this.trxMgr.getRepository(OrderPackage).save(orderPackage)
65
+
66
+ const orderPackageItems: OrderPackageItem[] = items.map(itm => {
67
+ const { refCode, qty } = itm
68
+ const matchedOrderProduct: OrderProduct = orderProducts.find(op => op.productDetail.refCode == refCode)
69
+
70
+ return {
71
+ name: OrderNoGenerator.orderPackageItem(),
72
+ orderProduct: matchedOrderProduct,
73
+ status: ORDER_STATUS.PROCESSING,
74
+ releaseQty: qty,
75
+ orderPackage: savedOrderPackage,
76
+ domain: releaseGood.domain,
77
+ bizplace: releaseGood.bizplace,
78
+ creator: releaseGood.creator,
79
+ updater: releaseGood.updater
80
+ }
81
+ })
82
+
83
+ await this.trxMgr.getRepository(OrderPackageItem).save(orderPackageItems)
84
+ })
85
+ )
86
+
87
+ await this.trxMgr.getRepository(ReleaseGood).update(
88
+ { id: releaseGood.id },
89
+ {
90
+ packageId: packages[0].packageId,
91
+ marketPackCallSuccess: new Date(),
92
+ lastMarketPackCall: new Date(),
93
+ updatedAt: new Date()
94
+ }
95
+ )
96
+ }
97
+ } catch (error) {
98
+ logger.error(`powrup-controller[packOrder]: ${error}`)
99
+ throw error
100
+ }
101
+
102
+ return releaseGood
103
+ }
104
+
105
+ async updateStock(powrup: Powrup, inventory: Inventory): Promise<void> {
106
+ const bizplace: Bizplace = await this.trxMgr.getRepository(Bizplace).findOne({ domain: powrup.domain })
107
+ let product: Product = inventory.product
108
+ const productDetail: ProductDetail = inventory.productDetail
109
+ let qb = await this.trxMgr.getRepository(Inventory).createQueryBuilder('inv')
110
+ qb.leftJoinAndSelect('inv.location', 'loc')
111
+ .andWhere('"inv"."domain_id" = :domainId')
112
+ .andWhere('"inv"."bizplace_id" = :bizplaceId')
113
+ .andWhere('"inv"."product_id" = :productId')
114
+ .andWhere('"inv"."product_detail_id" = :productDetailId')
115
+ .andWhere('"inv"."status" = :status')
116
+ .andWhere('"loc"."type" NOT IN (:...locationTypes)')
117
+ .setParameters({
118
+ domainId: this.domain.id,
119
+ bizplaceId: bizplace.id,
120
+ productId: product.id,
121
+ productDetailId: productDetail.id,
122
+ status: INVENTORY_STATUS.STORED,
123
+ locationTypes: [LOCATION_TYPE.QUARANTINE]
124
+ })
125
+
126
+ const warehouseDomainId = this.domain.id
127
+ let inventories: Inventory[] = await qb.getMany()
128
+ let inventoryTotalQty: number = 0
129
+ let inventoryTotalLockedQty: number = 0
130
+ let inventoryBufferQty: number = 0
131
+
132
+ inventories.forEach((inventory: Inventory) => {
133
+ const { qty, lockedQty } = inventory
134
+ inventoryTotalQty += qty
135
+ inventoryTotalLockedQty += lockedQty
136
+ if (inventory.location.type === LOCATION_TYPE.RESERVE) {
137
+ inventoryBufferQty += qty
138
+ }
139
+ })
140
+
141
+ const powrupInvs: any[] = [
142
+ {
143
+ refCode: productDetail.refCode,
144
+ stock: {
145
+ quantityTotal: inventoryTotalQty - inventoryTotalLockedQty - inventoryBufferQty,
146
+ quantityReserved: inventoryTotalLockedQty - inventoryBufferQty,
147
+ quantityBuffer: inventoryBufferQty
148
+ }
149
+ }
150
+ ]
151
+
152
+ await PowrupAPI.updateStock(powrup, {
153
+ context: { state: { domain: this?.domain, user: this?.user } },
154
+ warehouseDomainId,
155
+ powrupInvs
156
+ })
157
+ }
158
+
159
+ async initiateShipment(powrup: Powrup, releaseGood: ReleaseGood): Promise<void> {
160
+ try {
161
+ let orderPackages: OrderPackage[] = await this.trxMgr
162
+ .getRepository(OrderPackage)
163
+ .find({ where: { releaseGood, bizplace: releaseGood.bizplace } })
164
+
165
+ if (orderPackages?.length) {
166
+ await Promise.all(
167
+ orderPackages
168
+ .filter(op => op?.marketRtsCallSuccess == undefined)
169
+ .map(async op => {
170
+ if (!op?.packageId) throw new Error('Order package id is not found')
171
+ if (releaseGood.lmdOption && !op?.parcelId) return
172
+
173
+ let orderInformation: any = {
174
+ orderId: releaseGood.refOrderId,
175
+ packageId: op.packageId
176
+ }
177
+ if (releaseGood.lmdOption) {
178
+ let releaseGoodQuery: ReleaseGood = await getRepository(ReleaseGood).findOne({
179
+ where: { id: releaseGood.id },
180
+ relations: ['lastMileDelivery']
181
+ })
182
+ orderInformation = {
183
+ ...orderInformation,
184
+ awb: op.airwayBill,
185
+ trackingNo: op.trackingNo,
186
+ lmdOption: releaseGood.lmdOption,
187
+ shipperName: releaseGoodQuery.lastMileDelivery.platform
188
+ }
189
+ }
190
+
191
+ try {
192
+ await PowrupAPI.initiateShipment(powrup, {
193
+ ...orderInformation,
194
+ context: { state: { domain: this?.domain, user: this?.user } }
195
+ })
196
+ await getRepository(OrderPackage).update({ id: op.id }, { marketRtsCallSuccess: new Date() })
197
+ } catch (error) {
198
+ logger.error(
199
+ `powrup-controller[initiateShipment]: ${JSON.stringify({
200
+ ...orderInformation,
201
+ context: { state: { domain: this?.domain, user: this?.user } },
202
+ error: error
203
+ })}`
204
+ )
205
+ }
206
+ })
207
+ )
208
+ }
209
+ } catch (error) {
210
+ throw error
211
+ }
212
+ }
213
+
214
+ async fetchDocument(powrup: Powrup, releaseGood: ReleaseGood): Promise<ReleaseGood> {
215
+ if (releaseGood?.ownTransport && releaseGood?.lmdOption) {
216
+ return
217
+ }
218
+ try {
219
+ let orderPackages: OrderPackage[] = await this.trxMgr
220
+ .getRepository(OrderPackage)
221
+ .find({ where: { releaseGood, bizplace: releaseGood.bizplace } })
222
+
223
+ if (orderPackages?.length) {
224
+ await Promise.all(
225
+ orderPackages.map(async op => {
226
+ if (!op?.packageId) throw new Error('Order package id is not found')
227
+
228
+ const orderInformation: any = {
229
+ orderId: releaseGood.refOrderId,
230
+ packageId: op.packageId
231
+ }
232
+
233
+ const {
234
+ documents,
235
+ trackingNo,
236
+ transporter
237
+ }: { documents: any[]; trackingNo: string; transporter: string } = await PowrupAPI.fetchDocument(powrup, {
238
+ ...orderInformation,
239
+ context: { state: { domain: this?.domain, user: this?.user } }
240
+ })
241
+
242
+ let updateInfo: any
243
+ if (documents?.length) {
244
+ documents.map(document => {
245
+ if (document.type === 'invoice') {
246
+ updateInfo = { ...updateInfo, invoice: document.download_url }
247
+ } else if (document.type === 'airway_bill') {
248
+ updateInfo = { ...updateInfo, airwayBill: document.download_url }
249
+ }
250
+ })
251
+
252
+ updateInfo = {
253
+ ...updateInfo,
254
+ trackingNo: trackingNo,
255
+ transporter: transporter,
256
+ updater: this.user
257
+ }
258
+
259
+ await this.trxMgr.getRepository(OrderPackage).update({ id: op.id }, { ...updateInfo })
260
+ }
261
+ })
262
+ )
263
+
264
+ releaseGood = await this.trxMgr.getRepository(ReleaseGood).findOne({ id: releaseGood.id })
265
+ }
266
+
267
+ return releaseGood
268
+ } catch (error) {
269
+ throw error
270
+ }
271
+ }
272
+ }
@@ -2,6 +2,7 @@ import { Equal, Not } from 'typeorm'
2
2
 
3
3
  import { ApplicationType } from '@things-factory/auth-base'
4
4
  import { logger } from '@things-factory/env'
5
+ import { Powrup } from '@things-factory/integration-powrup'
5
6
  import { Sellercraft, SellercraftStatus } from '@things-factory/integration-sellercraft'
6
7
  import { Product, ProductBarcode, ProductDetail } from '@things-factory/product-base'
7
8
  import {
@@ -24,7 +25,7 @@ import {
24
25
 
25
26
  import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../constants'
26
27
  import { Worksheet, WorksheetDetail } from '../../entities'
27
- import { SellercraftController } from '../index'
28
+ import { SellercraftController, PowrupController } from '../index'
28
29
  import { VasWorksheetController } from '../vas/vas-worksheet-controller'
29
30
 
30
31
  export class PackingWorksheetController extends VasWorksheetController {
@@ -124,6 +125,33 @@ export class PackingWorksheetController extends VasWorksheetController {
124
125
  }
125
126
  break
126
127
 
128
+ case ApplicationType.POWRUP:
129
+ const powrup: Powrup = await this.trxMgr.getRepository(Powrup).findOne({ active: true })
130
+
131
+ if (powrup) {
132
+ const powrupCtrl: PowrupController = new PowrupController(this.trxMgr, this.domain, this.user)
133
+
134
+ let rtsOrderDoc = async (powrup: any, releaseGood: any, domain: any, user: any) => {
135
+ try {
136
+ // trigger RTS
137
+ await powrupCtrl.initiateShipment(powrup, releaseGood)
138
+ } catch (error) {
139
+ logger.error(
140
+ `packing-worksheet-controller[activatePacking]:(data:${JSON.stringify({
141
+ powrup,
142
+ releaseGood,
143
+ domain,
144
+ user
145
+ })}) ${error} `
146
+ )
147
+ }
148
+ }
149
+
150
+ // asynchronously trigger RTS
151
+ rtsOrderDoc(powrup, releaseGood, this.domain, this.user)
152
+ }
153
+ break
154
+
127
155
  default:
128
156
  break
129
157
  }
@@ -1,26 +1,12 @@
1
- import {
2
- EntityManager,
3
- Equal,
4
- getConnection,
5
- getManager,
6
- In,
7
- IsNull,
8
- Not
9
- } from 'typeorm'
1
+ import { EntityManager, Equal, getConnection, getManager, In, IsNull, Not } from 'typeorm'
10
2
 
11
3
  import { ApplicationType } from '@things-factory/auth-base'
12
4
  import { Bizplace } from '@things-factory/biz-base'
13
5
  import { logger } from '@things-factory/env'
14
6
  import { generateId } from '@things-factory/id-rule-base'
15
- import {
16
- Sellercraft,
17
- SellercraftStatus
18
- } from '@things-factory/integration-sellercraft'
19
- import {
20
- Product,
21
- ProductBarcode,
22
- ProductDetail
23
- } from '@things-factory/product-base'
7
+ import { Powrup } from '@things-factory/integration-powrup'
8
+ import { Sellercraft, SellercraftStatus } from '@things-factory/integration-sellercraft'
9
+ import { Product, ProductBarcode, ProductDetail } from '@things-factory/product-base'
24
10
  import {
25
11
  GenerateBatchPickInfo,
26
12
  ORDER_INVENTORY_STATUS,
@@ -50,21 +36,10 @@ import {
50
36
  TOTE_STATUS
51
37
  } from '@things-factory/warehouse-base'
52
38
 
53
- import {
54
- TASK_NUMBER_RULE_TYPE,
55
- TASK_NUMBER_SETTING_KEY,
56
- WORKSHEET_STATUS,
57
- WORKSHEET_TYPE
58
- } from '../../constants'
59
- import { SellercraftController } from '../../controllers'
60
- import {
61
- Worksheet,
62
- WorksheetDetail
63
- } from '../../entities'
64
- import {
65
- isInventoryObsolete,
66
- WorksheetNoGenerator
67
- } from '../../utils'
39
+ import { TASK_NUMBER_RULE_TYPE, TASK_NUMBER_SETTING_KEY, WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../constants'
40
+ import { SellercraftController, PowrupController } from '../../controllers'
41
+ import { Worksheet, WorksheetDetail } from '../../entities'
42
+ import { isInventoryObsolete, WorksheetNoGenerator } from '../../utils'
68
43
  import { VasWorksheetController } from '../vas/vas-worksheet-controller'
69
44
 
70
45
  export class PickingWorksheetController extends VasWorksheetController {
@@ -292,6 +267,30 @@ export class PickingWorksheetController extends VasWorksheetController {
292
267
  })
293
268
  break
294
269
 
270
+ case ApplicationType.POWRUP:
271
+ getManager().transaction(async txMgr => {
272
+ const powrup: Powrup = await txMgr.getRepository(Powrup).findOne({ active: true })
273
+
274
+ if (powrup) {
275
+ const powrupCtrl: PowrupController = new PowrupController(txMgr, this.domain, this.user)
276
+
277
+ if (!releaseGood?.orderPackages?.length) {
278
+ const orderProducts: OrderProduct[] = await txMgr.getRepository(OrderProduct).find({
279
+ where: { releaseGood },
280
+ relations: ['product', 'productDetail']
281
+ })
282
+
283
+ // asynchronously pack order
284
+ await powrupCtrl.packOrder(powrup, {
285
+ ...releaseGood,
286
+ orderProducts,
287
+ domain: worksheet.domain
288
+ })
289
+ }
290
+ }
291
+ })
292
+ break
293
+
295
294
  default:
296
295
  break
297
296
  }
@@ -331,16 +330,16 @@ export class PickingWorksheetController extends VasWorksheetController {
331
330
  const pickingOrderInventory: OrderInventory[] = await this.trxMgr.getRepository(OrderInventory).find({
332
331
  where: { domain: this.domain, refWorksheetId: worksheet.id, status: ORDER_STATUS.PICKING },
333
332
  relations: [
334
- 'releaseGood',
335
- 'releaseGood.domain',
336
- 'releaseGood.lastMileDelivery',
337
- 'releaseGood.bizplace',
338
- 'releaseGood.bizplace.domain',
339
- 'releaseGood.orderPackages',
340
- 'releaseGood.orderPackages.orderPackageItems',
341
- 'releaseGood.orderPackages.orderPackageItems.orderProduct',
342
- 'releaseGood.orderPackages.orderPackageItems.orderProduct.product'
343
- ]
333
+ 'releaseGood',
334
+ 'releaseGood.domain',
335
+ 'releaseGood.lastMileDelivery',
336
+ 'releaseGood.bizplace',
337
+ 'releaseGood.bizplace.domain',
338
+ 'releaseGood.orderPackages',
339
+ 'releaseGood.orderPackages.orderPackageItems',
340
+ 'releaseGood.orderPackages.orderPackageItems.orderProduct',
341
+ 'releaseGood.orderPackages.orderPackageItems.orderProduct.product'
342
+ ]
344
343
  })
345
344
 
346
345
  let releaseGoods: ReleaseGood[] = pickingOrderInventory.reduce((data, oi: OrderInventory) => {
@@ -383,6 +382,26 @@ export class PickingWorksheetController extends VasWorksheetController {
383
382
  })
384
383
  break
385
384
 
385
+ case ApplicationType.POWRUP:
386
+ getManager().transaction(async txMgr => {
387
+ const powrup: Powrup = await txMgr.getRepository(Powrup).findOne({ active: true })
388
+
389
+ if (powrup) {
390
+ const powrupCtrl: PowrupController = new PowrupController(txMgr, this.domain, this.user)
391
+
392
+ if (!releaseGood?.orderPackages?.length) {
393
+ const orderProducts: OrderProduct[] = await txMgr.getRepository(OrderProduct).find({
394
+ where: { releaseGood },
395
+ relations: ['product', 'productDetail']
396
+ })
397
+
398
+ // asynchronously pack order
399
+ await powrupCtrl.packOrder(powrup, { ...releaseGood, orderProducts })
400
+ }
401
+ }
402
+ })
403
+ break
404
+
386
405
  default:
387
406
  break
388
407
  }
@@ -1354,7 +1373,9 @@ export class PickingWorksheetController extends VasWorksheetController {
1354
1373
  worksheet.endedAt = new Date()
1355
1374
  worksheet.updater = this.user
1356
1375
 
1357
- const worksheetDetails: any = worksheet.worksheetDetails.filter(wsD => wsD.status != 'MISSING' && wsD.status != 'CANCELLED')
1376
+ const worksheetDetails: any = worksheet.worksheetDetails.filter(
1377
+ wsD => wsD.status != 'MISSING' && wsD.status != 'CANCELLED'
1378
+ )
1358
1379
  worksheetDetails.forEach((wsd: WorksheetDetail) => {
1359
1380
  wsd.status = WORKSHEET_STATUS.DONE
1360
1381
  wsd.updater = this.user
@@ -416,7 +416,7 @@ export class WorksheetController {
416
416
  let existingWorksheet: Worksheet
417
417
  try {
418
418
  existingWorksheet = await this.findWorksheetByRefOrder(refOrder, type)
419
- } catch (e) {}
419
+ } catch (e) { }
420
420
 
421
421
  if (existingWorksheet)
422
422
  throw new Error(
@@ -1128,8 +1128,8 @@ export class WorksheetController {
1128
1128
  }
1129
1129
 
1130
1130
  public async getDirectQty(productDetail: ProductDetail, productBarcode: string, qty: number): Promise<any> {
1131
+ console.time(`getDirectQty ${productDetail.id} - ${productBarcode}`)
1131
1132
  try {
1132
- console.time('getDirectQty')
1133
1133
  let results = await this.trxMgr.query(
1134
1134
  `
1135
1135
  WITH RECURSIVE cte as (
@@ -1157,9 +1157,10 @@ export class WorksheetController {
1157
1157
 
1158
1158
  if (results.length <= 0) throw new Error(this.ERROR_MSG.FIND.NO_RESULT(productBarcode))
1159
1159
 
1160
- console.timeEnd('getDirectQty')
1160
+ console.timeEnd(`getDirectQty ${productDetail.id} - ${productBarcode}`)
1161
1161
  return results[0]
1162
1162
  } catch (error) {
1163
+ console.timeEnd(`getDirectQty ${productDetail.id} - ${productBarcode}`)
1163
1164
  throw error
1164
1165
  }
1165
1166
  }
@@ -37,16 +37,17 @@ export const completePackingResolver = {
37
37
  logger.error(`worksheet-base[completePacking]: ${error}`)
38
38
  }
39
39
  }
40
+ } else {
41
+ const bizplace: Bizplace = await getMyBizplace(domain, user)
42
+ const worksheetController: WorksheetController = new WorksheetController(tx, domain, user)
43
+
44
+ await worksheetController.notifyToCustomer(bizplace, {
45
+ title: `Packing has been completed (${bizplace.name}, ${releaseGoodNo})`,
46
+ body: `Items now are ready to be shipped/delivery`,
47
+ url: context.header.referer,
48
+ data: { url: context.header.referer }
49
+ })
40
50
  }
41
-
42
- const bizplace: Bizplace = await getMyBizplace(domain, user)
43
- const worksheetController: WorksheetController = new WorksheetController(tx, domain, user)
44
- await worksheetController.notifyToCustomer(bizplace, {
45
- title: `Packing has been completed (${bizplace.name}, ${releaseGoodNo})`,
46
- body: `Items now are ready to be shipped/delivery`,
47
- url: context.header.referer,
48
- data: { url: context.header.referer }
49
- })
50
51
  }
51
52
  }
52
53
 
@@ -1,11 +1,13 @@
1
1
  import { EntityManager } from 'typeorm'
2
2
 
3
3
  import { ApplicationType, User } from '@things-factory/auth-base'
4
+ import { Powrup } from '@things-factory/integration-powrup'
4
5
  import { Sellercraft, SellercraftStatus } from '@things-factory/integration-sellercraft'
5
6
  import { ReleaseGood } from '@things-factory/sales-base'
6
7
  import { Domain } from '@things-factory/shell'
8
+ // import { PowrupController } from '@things-factory/warehouse-base'
7
9
 
8
- import { PackingWorksheetController, SellercraftController } from '../../../../controllers'
10
+ import { PackingWorksheetController, SellercraftController, PowrupController } from '../../../../controllers'
9
11
 
10
12
  export const packingResolver = {
11
13
  async packing(_: any, { orderPackageItemId, releaseQty, serialNumber }, context: any) {
@@ -40,6 +42,15 @@ export async function packing(
40
42
  }
41
43
  break
42
44
 
45
+ case ApplicationType.POWRUP:
46
+ const powrup: Powrup = await tx.getRepository(Powrup).findOne({ active: true })
47
+
48
+ if (powrup) {
49
+ const powrupCtrl: PowrupController = new PowrupController(tx, domain, user)
50
+ await powrupCtrl.fetchDocument(powrup, releaseGood)
51
+ }
52
+ break
53
+
43
54
  default:
44
55
  break
45
56
  }
@@ -20,8 +20,8 @@ export async function scanProductPacking(
20
20
  productBarcode: string,
21
21
  serialNumber?: string
22
22
  ) {
23
+ console.time(`execution time to scan for packing ${orderPackageItemId} - ${productBarcode}`)
23
24
  try {
24
- console.time('execution time to scan for packing')
25
25
  const worksheetController: PackingWorksheetController = new PackingWorksheetController(tx, domain, user)
26
26
  const inventoryItems = await worksheetController.scanProductPacking(
27
27
  orderPackageItemId,
@@ -29,7 +29,7 @@ export async function scanProductPacking(
29
29
  serialNumber
30
30
  )
31
31
 
32
- console.timeEnd('execution time to scan for packing')
32
+ console.timeEnd(`execution time to scan for packing ${orderPackageItemId} - ${productBarcode}`)
33
33
  return inventoryItems
34
34
 
35
35
  // if (releaseGood.type === 'b2c' && !releaseGood?.airwayBill) {
@@ -43,6 +43,7 @@ export async function scanProductPacking(
43
43
  // }
44
44
  // }
45
45
  } catch (error) {
46
+ console.timeEnd(`execution time to scan for packing ${orderPackageItemId} - ${productBarcode}`)
46
47
  throw error
47
48
  }
48
49
  }
@@ -2,6 +2,7 @@ import { EntityManager, getManager, SelectQueryBuilder } from 'typeorm'
2
2
 
3
3
  import { ApplicationType, User } from '@things-factory/auth-base'
4
4
  import { logger } from '@things-factory/env'
5
+ import { Powrup } from '@things-factory/integration-powrup'
5
6
  import { Sellercraft, SellercraftStatus } from '@things-factory/integration-sellercraft'
6
7
  import {
7
8
  MarketplaceOrder,
@@ -22,7 +23,7 @@ import { Domain } from '@things-factory/shell'
22
23
  import { Location } from '@things-factory/warehouse-base'
23
24
 
24
25
  import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../../constants'
25
- import { PackingWorksheetController, SellercraftController } from '../../../controllers'
26
+ import { PackingWorksheetController, SellercraftController, PowrupController } from '../../../controllers'
26
27
  import { Worksheet } from '../../../entities'
27
28
 
28
29
  export const packingWorksheetResolver = {
@@ -210,6 +211,15 @@ export const packingWorksheetResolver = {
210
211
  }
211
212
  break
212
213
 
214
+ case ApplicationType.POWRUP:
215
+ const powrup: Powrup = await tx.getRepository(Powrup).findOne({ active: true })
216
+
217
+ if (powrup) {
218
+ // asynchronously get document from powrup
219
+ getPowrupDocument(powrup, releaseGood, domain, user)
220
+ }
221
+ break
222
+
213
223
  case ApplicationType.MMS:
214
224
  marketplaceOrder = await tx.getRepository(MarketplaceOrder).findOne({
215
225
  where: { orderNo: releaseGood.refNo },
@@ -297,7 +307,9 @@ export const packingWorksheetResolver = {
297
307
  // packingType: inventory.packingType,
298
308
  // packingSize: inventory.packingSize,
299
309
  // this is the problem
300
- binLocation: binLocation ? releaseGood.orderInventories.find(oi => oi.orderProductId == opi.orderProduct.id)?.binLocation : binLocation ,
310
+ binLocation: binLocation
311
+ ? releaseGood.orderInventories.find(oi => oi.orderProductId == opi.orderProduct.id)?.binLocation
312
+ : binLocation,
301
313
  isBatchPicking
302
314
  // location: inventory.location,
303
315
  // relatedOrderInv: targetInventory
@@ -397,3 +409,35 @@ async function getSellercraftDocument(sellercraft: Sellercraft, releaseGood: Rel
397
409
  }
398
410
  })
399
411
  }
412
+
413
+ //trigger RTS, init document, and fetch powrup document in separated transaction
414
+ async function getPowrupDocument(powrup: Powrup, releaseGood: ReleaseGood, domain: Domain, user: User) {
415
+ await getManager().transaction(async txMgr => {
416
+ const powrupCtrl: PowrupController = new PowrupController(txMgr, domain, user)
417
+ try {
418
+ if (!releaseGood?.airwayBill) {
419
+ try {
420
+ // try fetch order document / AWB
421
+ releaseGood = await powrupCtrl.fetchDocument(powrup, releaseGood)
422
+ } catch (error) {
423
+ try {
424
+ // retry initiate order shipment / RTS
425
+ await powrupCtrl.initiateShipment(powrup, releaseGood)
426
+ } catch (error) {
427
+ throw new Error(`initiateOrderShipment: ${error}`)
428
+ }
429
+ throw new Error(`fetchOrderDocument: ${error}`)
430
+ }
431
+ }
432
+ } catch (error) {
433
+ logger.error(
434
+ `packing-worksheet[getPowrupDocument]:(data:${JSON.stringify({
435
+ powrup,
436
+ releaseGood,
437
+ domain,
438
+ user
439
+ })}) ${error} `
440
+ )
441
+ }
442
+ })
443
+ }