@things-factory/worksheet-base 4.3.144 → 4.3.146

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 (34) hide show
  1. package/dist-server/controllers/ecommerce/ecommerce-controller.js +48 -0
  2. package/dist-server/controllers/ecommerce/ecommerce-controller.js.map +1 -1
  3. package/dist-server/controllers/ecommerce/sellercraft-controller.js +82 -31
  4. package/dist-server/controllers/ecommerce/sellercraft-controller.js.map +1 -1
  5. package/dist-server/controllers/outbound/packing-worksheet-controller.js +265 -189
  6. package/dist-server/controllers/outbound/packing-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/packing/packing.js +6 -7
  10. package/dist-server/graphql/resolvers/worksheet/packing/packing.js.map +1 -1
  11. package/dist-server/graphql/resolvers/worksheet/packing/scan-product-packing.js +4 -4
  12. package/dist-server/graphql/resolvers/worksheet/packing/scan-product-packing.js.map +1 -1
  13. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +84 -38
  14. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
  15. package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js +44 -9
  16. package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js.map +1 -1
  17. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +41 -11
  18. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
  19. package/dist-server/graphql/types/worksheet/index.js +6 -5
  20. package/dist-server/graphql/types/worksheet/index.js.map +1 -1
  21. package/dist-server/graphql/types/worksheet/worksheet-info.js +2 -0
  22. package/dist-server/graphql/types/worksheet/worksheet-info.js.map +1 -1
  23. package/package.json +18 -18
  24. package/server/controllers/ecommerce/ecommerce-controller.ts +52 -1
  25. package/server/controllers/ecommerce/sellercraft-controller.ts +119 -46
  26. package/server/controllers/outbound/packing-worksheet-controller.ts +314 -211
  27. package/server/graphql/resolvers/worksheet/packing/complete-packing.ts +5 -4
  28. package/server/graphql/resolvers/worksheet/packing/packing.ts +6 -8
  29. package/server/graphql/resolvers/worksheet/packing/scan-product-packing.ts +6 -9
  30. package/server/graphql/resolvers/worksheet/packing-worksheet.ts +124 -42
  31. package/server/graphql/resolvers/worksheet/picking/complete-batch-picking.ts +59 -11
  32. package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +47 -12
  33. package/server/graphql/types/worksheet/index.ts +6 -5
  34. package/server/graphql/types/worksheet/worksheet-info.ts +2 -0
@@ -6,12 +6,11 @@ import { ReleaseGood } from '@things-factory/sales-base'
6
6
  import { Domain } from '@things-factory/shell'
7
7
 
8
8
  import { PackingWorksheetController, SellercraftController } from '../../../../controllers'
9
- import { Worksheet } from '../../../../entities'
10
9
 
11
10
  export const packingResolver = {
12
- async packing(_: any, { worksheetDetailName, releaseQty, serialNumber }, context: any) {
11
+ async packing(_: any, { orderPackageItemId, releaseQty, serialNumber }, context: any) {
13
12
  const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
14
- await packing(tx, domain, user, worksheetDetailName, releaseQty, serialNumber)
13
+ await packing(tx, domain, user, orderPackageItemId, releaseQty, serialNumber)
15
14
  }
16
15
  }
17
16
 
@@ -19,22 +18,21 @@ export async function packing(
19
18
  tx: EntityManager,
20
19
  domain: Domain,
21
20
  user: User,
22
- worksheetDetailName: string,
21
+ orderPackageItemId: string,
23
22
  releaseQty: number,
24
23
  serialNumber: string
25
24
  ) {
26
25
  const worksheetController: PackingWorksheetController = new PackingWorksheetController(tx, domain, user)
27
- const worksheetDetail = await worksheetController.packing(worksheetDetailName, releaseQty, serialNumber)
26
+ const worksheetDetail = await worksheetController.packing(orderPackageItemId, releaseQty, serialNumber)
28
27
 
29
- let releaseGood: ReleaseGood = worksheetDetail.targetInventory.releaseGood
30
- const worksheet: Worksheet = worksheetDetail.worksheet
28
+ let releaseGood: ReleaseGood = worksheetDetail.releaseGood
31
29
 
32
30
  const orderSource: string = releaseGood.source
33
31
  switch (orderSource) {
34
32
  case ApplicationType.SELLERCRAFT:
35
33
  const sellercraft: Sellercraft = await tx
36
34
  .getRepository(Sellercraft)
37
- .findOne({ domain: worksheet.bizplace.domain, status: SellercraftStatus.ACTIVE })
35
+ .findOne({ domain: worksheetDetail.bizplace.domain, status: SellercraftStatus.ACTIVE })
38
36
 
39
37
  if (sellercraft) {
40
38
  const sellercraftCtrl: SellercraftController = new SellercraftController(tx, domain, user)
@@ -1,17 +1,14 @@
1
1
  import { EntityManager } from 'typeorm'
2
2
 
3
- import { ApplicationType, User } from '@things-factory/auth-base'
4
- import { Sellercraft, SellercraftStatus } from '@things-factory/integration-sellercraft'
5
- import { ReleaseGood } from '@things-factory/sales-base'
3
+ import { User } from '@things-factory/auth-base'
6
4
  import { Domain } from '@things-factory/shell'
7
5
 
8
- import { PackingWorksheetController, SellercraftController } from '../../../../controllers'
9
- import { Worksheet } from '../../../../entities'
6
+ import { PackingWorksheetController } from '../../../../controllers'
10
7
 
11
8
  export const scanProductPackingResolver = {
12
- async scanProductPacking(_: any, { worksheetDetailName, productBarcode, serialNumber }, context: any) {
9
+ async scanProductPacking(_: any, { orderPackageItemId, productBarcode, serialNumber }, context: any) {
13
10
  const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
14
- return await scanProductPacking(tx, domain, user, worksheetDetailName, productBarcode, serialNumber)
11
+ return await scanProductPacking(tx, domain, user, orderPackageItemId, productBarcode, serialNumber)
15
12
  }
16
13
  }
17
14
 
@@ -19,7 +16,7 @@ export async function scanProductPacking(
19
16
  tx: EntityManager,
20
17
  domain: Domain,
21
18
  user: User,
22
- worksheetDetailName: string,
19
+ orderPackageItemId: string,
23
20
  productBarcode: string,
24
21
  serialNumber?: string
25
22
  ) {
@@ -27,7 +24,7 @@ export async function scanProductPacking(
27
24
  console.time('execution time to scan for packing')
28
25
  const worksheetController: PackingWorksheetController = new PackingWorksheetController(tx, domain, user)
29
26
  const inventoryItems = await worksheetController.scanProductPacking(
30
- worksheetDetailName,
27
+ orderPackageItemId,
31
28
  productBarcode,
32
29
  serialNumber
33
30
  )
@@ -1,22 +1,48 @@
1
- import { EntityManager, getManager, SelectQueryBuilder } from 'typeorm'
1
+ import {
2
+ EntityManager,
3
+ getManager,
4
+ SelectQueryBuilder
5
+ } from 'typeorm'
2
6
 
3
- import { ApplicationType, User } from '@things-factory/auth-base'
7
+ import {
8
+ ApplicationType,
9
+ User
10
+ } from '@things-factory/auth-base'
4
11
  import { logger } from '@things-factory/env'
5
- import { Sellercraft, SellercraftStatus } from '@things-factory/integration-sellercraft'
12
+ import {
13
+ Sellercraft,
14
+ SellercraftStatus
15
+ } from '@things-factory/integration-sellercraft'
6
16
  import {
7
17
  MarketplaceOrder,
8
18
  MarketplaceOrderItem,
9
19
  MarketplaceOrderShipping,
10
20
  MarketplaceOrderShippingItem
11
21
  } from '@things-factory/marketplace-base'
12
- import { ORDER_INVENTORY_STATUS, ORDER_STATUS, OrderInventory, ReleaseGood } from '@things-factory/sales-base'
13
- import { PartnerSetting, Setting } from '@things-factory/setting-base'
22
+ import {
23
+ ORDER_INVENTORY_STATUS,
24
+ ORDER_STATUS,
25
+ OrderInventory,
26
+ OrderPackage,
27
+ OrderProduct,
28
+ ReleaseGood
29
+ } from '@things-factory/sales-base'
30
+ import {
31
+ PartnerSetting,
32
+ Setting
33
+ } from '@things-factory/setting-base'
14
34
  import { Domain } from '@things-factory/shell'
15
- import { Inventory, Location } from '@things-factory/warehouse-base'
35
+ import { Location } from '@things-factory/warehouse-base'
16
36
 
17
- import { WORKSHEET_TYPE, WORKSHEET_STATUS } from '../../../constants'
18
- import { PackingWorksheetController, SellercraftController } from '../../../controllers'
19
- import { Worksheet, WorksheetDetail } from '../../../entities'
37
+ import {
38
+ WORKSHEET_STATUS,
39
+ WORKSHEET_TYPE
40
+ } from '../../../constants'
41
+ import {
42
+ PackingWorksheetController,
43
+ SellercraftController
44
+ } from '../../../controllers'
45
+ import { Worksheet } from '../../../entities'
20
46
 
21
47
  export const packingWorksheetResolver = {
22
48
  async packingWorksheet(_: any, { releaseGoodNo }, context: any) {
@@ -30,9 +56,12 @@ export const packingWorksheetResolver = {
30
56
  relations: ['bizplace', 'bizplace.domain']
31
57
  })
32
58
 
59
+ let binLocation: Location = null
60
+ let isBatchPicking: boolean = false
61
+
33
62
  // Find Release Order based on Bin
34
63
  if (!releaseGood) {
35
- const binLocation: Location = await tx.getRepository(Location).findOne({
64
+ binLocation = await tx.getRepository(Location).findOne({
36
65
  where: { domain, name: releaseGoodNo }
37
66
  })
38
67
 
@@ -68,14 +97,42 @@ export const packingWorksheetResolver = {
68
97
  // @oscarchuaweiwen-fsd @chrislim I suggest using getMany() instead since the total is redundant here
69
98
 
70
99
  // remove duplicated count of release good
71
- const filteredRO = orderInventoriesByBin.map(oiBin => {
72
- return oiBin.releaseGood.name
73
- })
100
+ const filteredRO = [
101
+ ...new Set(
102
+ orderInventoriesByBin.map(oiBin => {
103
+ return oiBin.releaseGood.id
104
+ })
105
+ )
106
+ ]
74
107
 
75
108
  if (orderInventoriesByBin.length > 0) {
76
- releaseGoodNo = orderInventoriesByBin[0].releaseGood.name
77
- releaseGood = orderInventoriesByBin[0].releaseGood
78
- releaseGood.totalInventoriesByBin = [...new Set(filteredRO)].length
109
+ if (filteredRO?.length > 1) {
110
+ await Promise.all(
111
+ filteredRO.map(async roId => {
112
+ let orderPackages: OrderPackage[] = await tx
113
+ .getRepository(OrderPackage)
114
+ .createQueryBuilder('opk')
115
+ .innerJoinAndSelect('opk.releaseGood', 'rg')
116
+ .innerJoinAndSelect('rg.bizplace', 'bizplace')
117
+ .innerJoinAndSelect('bizplace.domain', 'domain')
118
+ .innerJoinAndSelect('rg.orderInventories', 'oi')
119
+ .where('rg.id = :releaseGoodId', { releaseGoodId: roId })
120
+ .getMany()
121
+
122
+ if (orderPackages?.length) {
123
+ releaseGood = orderPackages[0].releaseGood
124
+ }
125
+ })
126
+ )
127
+ releaseGoodNo = releaseGood?.name
128
+ isBatchPicking = releaseGood?.orderInventories[0]?.refWorksheetId ? true : false
129
+ } else {
130
+ releaseGoodNo = orderInventoriesByBin[0].releaseGood.name
131
+ releaseGood = orderInventoriesByBin[0].releaseGood
132
+ isBatchPicking = orderInventoriesByBin[0]?.refWorksheetId ? true : false
133
+ }
134
+
135
+ releaseGood.totalInventoriesByBin = filteredRO.length
79
136
  releaseGood.isOrderInventoryBin = true
80
137
  } else {
81
138
  throw new Error(`Bin do not have any existing order.`)
@@ -85,6 +142,8 @@ export const packingWorksheetResolver = {
85
142
 
86
143
  if (!releaseGood) throw new Error(`Release good do not exist.`)
87
144
 
145
+ const orderSource: string = releaseGood.source
146
+
88
147
  const worksheet: Worksheet = await tx
89
148
  .getRepository(Worksheet)
90
149
  .createQueryBuilder('w')
@@ -104,9 +163,28 @@ export const packingWorksheetResolver = {
104
163
 
105
164
  if (!worksheet) throw new Error('Worksheet does not exist')
106
165
 
166
+ const orderPackages: OrderPackage[] = await tx.getRepository(OrderPackage).find({
167
+ where: { releaseGood, domain, bizplace: releaseGood.bizplace },
168
+ order: { updatedAt: 'DESC' },
169
+ relations: [
170
+ 'orderPackageItems',
171
+ 'orderPackageItems.orderProduct',
172
+ 'orderPackageItems.orderProduct.product',
173
+ 'orderPackageItems.orderProduct.product.productDetails'
174
+ ]
175
+ })
176
+
107
177
  if (worksheet.status === WORKSHEET_STATUS.DONE) {
108
178
  throw new Error(`Worksheet is completed already`)
179
+ } else if (worksheet.status === WORKSHEET_STATUS.EXECUTING) {
180
+ if (orderPackages?.length == 0 && orderSource == ApplicationType.SELLERCRAFT) {
181
+ throw new Error('Waiting for packages from marketplace. Please retry in while.')
182
+ }
109
183
  } else if (worksheet.status === WORKSHEET_STATUS.DEACTIVATED) {
184
+ if (orderPackages?.length == 0 && orderSource == ApplicationType.SELLERCRAFT) {
185
+ throw new Error('Waiting for packages from marketplace. Please retry in while.')
186
+ }
187
+
110
188
  const packingWSCtrl: PackingWorksheetController = new PackingWorksheetController(tx, domain, user)
111
189
 
112
190
  const directActivatePackingWorksheet: Setting = await tx.getRepository(Setting).findOne({
@@ -145,7 +223,6 @@ export const packingWorksheetResolver = {
145
223
  let shippingProvider: string
146
224
  let marketplaceStatus: string
147
225
 
148
- const orderSource: string = releaseGood.source
149
226
  switch (orderSource) {
150
227
  case ApplicationType.SELLERCRAFT:
151
228
  const sellercraft: Sellercraft = await tx.getRepository(Sellercraft).findOne({
@@ -201,6 +278,9 @@ export const packingWorksheetResolver = {
201
278
  break
202
279
  }
203
280
 
281
+ let processingOrderPackage: OrderPackage[] =
282
+ orderPackages.filter(opk => opk.status == ORDER_STATUS.PROCESSING) || []
283
+
204
284
  return {
205
285
  worksheetInfo: {
206
286
  releaseGood,
@@ -212,37 +292,39 @@ export const packingWorksheetResolver = {
212
292
  startedAt: worksheet.startedAt,
213
293
  shippingProvider: shippingProvider ? shippingProvider : '',
214
294
  trackingNo: trackingNo ? trackingNo : '',
215
- airwayBill: releaseGood?.airwayBill,
295
+ airwayBill: processingOrderPackage[0]?.airwayBill,
216
296
  checkedRemarkBy: releaseGood?.checkedRemarkBy,
217
- invoice: releaseGood?.invoice,
297
+ invoice: processingOrderPackage[0]?.invoice,
218
298
  platform: Object.keys(marketplaceOrder).length > 0 ? marketplaceOrder.marketplaceStore?.platform : 'operato',
219
299
  marketplaceStoreId: Object.keys(marketplaceOrder).length > 0 ? marketplaceOrder.marketplaceStore?.id : '',
220
300
  marketplaceStatus: marketplaceStatus ? marketplaceStatus : '',
221
- marketplaceOrder: marketplaceOrder ? marketplaceOrder : ''
301
+ marketplaceOrder: marketplaceOrder ? marketplaceOrder : '',
302
+ orderPackage: processingOrderPackage[0],
303
+ orderPackages
222
304
  },
223
- worksheetDetailInfos: worksheet.worksheetDetails
224
- .map((packingWSD: WorksheetDetail) => {
225
- const targetInventory: OrderInventory = packingWSD.targetInventory
226
- const inventory: Inventory = targetInventory.inventory
305
+ worksheetDetailInfos: processingOrderPackage[0].orderPackageItems
306
+ .map(opi => {
307
+ const orderProduct: OrderProduct = opi.orderProduct
227
308
  return {
228
- id: packingWSD.id,
229
- name: packingWSD.name,
230
- palletId: inventory.palletId,
231
- cartonId: inventory.cartonId,
232
- batchId: inventory.batchId,
233
- batchIdRef: inventory.batchIdRef,
234
- product: inventory.product,
235
- sku: inventory.product.sku,
236
- releaseQty: targetInventory.releaseQty,
237
- packedQty: targetInventory.packedQty,
238
- status: packingWSD.status,
239
- description: packingWSD.description,
240
- targetName: targetInventory.name,
241
- packingType: inventory.packingType,
242
- packingSize: inventory.packingSize,
243
- binLocation: targetInventory?.binLocation,
244
- location: inventory.location,
245
- relatedOrderInv: targetInventory
309
+ id: opi.id,
310
+ name: opi.name,
311
+ // palletId: inventory.palletId,
312
+ // cartonId: inventory.cartonId,
313
+ batchId: orderProduct.batchId,
314
+ // batchIdRef: inventory.batchIdRef,
315
+ product: orderProduct.product,
316
+ sku: orderProduct.product.sku,
317
+ releaseQty: opi.releaseQty,
318
+ packedQty: opi?.packedQty || 0,
319
+ status: opi.status,
320
+ // description: packingWSD.description,
321
+ // targetName: targetInventory.name,
322
+ // packingType: inventory.packingType,
323
+ // packingSize: inventory.packingSize,
324
+ binLocation: binLocation,
325
+ isBatchPicking
326
+ // location: inventory.location,
327
+ // relatedOrderInv: targetInventory
246
328
  }
247
329
  })
248
330
  .sort((a, b) => {
@@ -5,7 +5,14 @@ import { Bizplace, getMyBizplace } from '@things-factory/biz-base'
5
5
  import { MarketplaceStore } from '@things-factory/integration-marketplace'
6
6
  import { Sellercraft, SellercraftStatus } from '@things-factory/integration-sellercraft'
7
7
  import { MarketplaceOrder } from '@things-factory/marketplace-base'
8
- import { OrderInventory, ReleaseGood } from '@things-factory/sales-base'
8
+ import {
9
+ ORDER_STATUS,
10
+ OrderInventory,
11
+ OrderNoGenerator,
12
+ OrderPackage,
13
+ OrderPackageItem,
14
+ ReleaseGood
15
+ } from '@things-factory/sales-base'
9
16
  import { Setting } from '@things-factory/setting-base'
10
17
  import { Domain } from '@things-factory/shell'
11
18
 
@@ -66,7 +73,17 @@ export async function completeBatchPicking(
66
73
  uniqueReleaseGoods.map(async releaseGood => {
67
74
  let foundReleaseGood: ReleaseGood = await tx.getRepository(ReleaseGood).findOne({
68
75
  where: { id: releaseGood.id },
69
- relations: ['orderProducts', 'orderProducts.product', 'bizplace', 'bizplace.company', 'bizplace.company.domain']
76
+ relations: [
77
+ 'domain',
78
+ 'creator',
79
+ 'updater',
80
+ 'orderPackages',
81
+ 'orderProducts',
82
+ 'orderProducts.product',
83
+ 'bizplace',
84
+ 'bizplace.company',
85
+ 'bizplace.company.domain'
86
+ ]
70
87
  })
71
88
  const orderSource: string = foundReleaseGood.source
72
89
  switch (orderSource) {
@@ -80,14 +97,8 @@ export async function completeBatchPicking(
80
97
  await getManager().transaction(async txMgr => {
81
98
  const sellercraftCtrl: SellercraftController = new SellercraftController(txMgr, domain, user)
82
99
 
83
- if (!releaseGood?.packageId) {
84
- releaseGood = await sellercraftCtrl.packOrder(sellercraft, foundReleaseGood)
85
-
86
- if (releaseGood?.packageId) {
87
- await txMgr
88
- .getRepository(ReleaseGood)
89
- .update({ id: releaseGood.id }, { packageId: releaseGood.packageId, updater: releaseGood.updater })
90
- }
100
+ if (!releaseGood?.orderPackages?.length) {
101
+ await sellercraftCtrl.packOrder(sellercraft, foundReleaseGood)
91
102
  }
92
103
 
93
104
  const rtsTriggerLevel: Setting = await tx.getRepository(Setting).findOne({
@@ -119,13 +130,50 @@ export async function completeBatchPicking(
119
130
  })
120
131
  const marketplaceStore: MarketplaceStore = marketplaceOrder.marketplaceStore
121
132
 
133
+ const ecommerceCtrl: EcommerceController = new EcommerceController(tx, domain, user)
122
134
  if (marketplaceStore?.isAutoUpdateShipment) {
123
- const ecommerceCtrl: EcommerceController = new EcommerceController(tx, domain, user)
124
135
  await ecommerceCtrl.createOrderShip(foundReleaseGood, marketplaceStore, marketplaceOrder, companyDomain)
125
136
  }
137
+ await ecommerceCtrl.createOrderPackage(
138
+ tx,
139
+ marketplaceOrder,
140
+ companyDomain,
141
+ marketplaceStore,
142
+ foundReleaseGood
143
+ )
126
144
  break
127
145
 
128
146
  default:
147
+ const orderPackage: OrderPackage = {
148
+ name: OrderNoGenerator.orderPackage(),
149
+ packageId: null,
150
+ trackingNo: null,
151
+ transporter: null,
152
+ airwayBill: null,
153
+ status: ORDER_STATUS.PROCESSING,
154
+ releaseGood,
155
+ domain: releaseGood.domain,
156
+ bizplace: releaseGood.bizplace,
157
+ creator: releaseGood.creator,
158
+ updater: releaseGood.updater
159
+ }
160
+
161
+ let savedOrderPackage: OrderPackage = await tx.getRepository(OrderPackage).save(orderPackage)
162
+ const orderPackageItems: OrderPackageItem[] = releaseGood.orderProducts.map(op => {
163
+ return {
164
+ name: OrderNoGenerator.orderPackageItem(),
165
+ orderProduct: op,
166
+ status: ORDER_STATUS.PROCESSING,
167
+ releaseQty: op.releaseQty,
168
+ orderPackage: savedOrderPackage,
169
+ domain: releaseGood.domain,
170
+ bizplace: releaseGood.bizplace,
171
+ creator: releaseGood.creator,
172
+ updater: releaseGood.updater
173
+ }
174
+ })
175
+
176
+ await tx.getRepository(OrderPackageItem).save(orderPackageItems)
129
177
  break
130
178
  }
131
179
  })
@@ -7,7 +7,6 @@ import { Account, AccountingAPI } from '@things-factory/integration-accounting'
7
7
  import { LastMileAPI, LastMileDelivery } from '@things-factory/integration-lmd'
8
8
  import { MarketplaceStore, MarketplaceTransporter } from '@things-factory/integration-marketplace'
9
9
  import { Sellercraft, SellercraftStatus } from '@things-factory/integration-sellercraft'
10
- import { Setting } from '@things-factory/setting-base'
11
10
  import {
12
11
  MarketplaceOrder,
13
12
  MarketplaceOrderItem,
@@ -18,9 +17,13 @@ import {
18
17
  ORDER_INVENTORY_STATUS,
19
18
  ORDER_STATUS,
20
19
  OrderInventory,
20
+ OrderNoGenerator,
21
+ OrderPackage,
22
+ OrderPackageItem,
21
23
  OrderProduct,
22
24
  ReleaseGood
23
25
  } from '@things-factory/sales-base'
26
+ import { Setting } from '@things-factory/setting-base'
24
27
  import { Domain } from '@things-factory/shell'
25
28
 
26
29
  import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../../../constants'
@@ -61,13 +64,17 @@ export async function completePicking(
61
64
  let releaseGood: ReleaseGood = await tx.getRepository(ReleaseGood).findOne({
62
65
  where: { domain, name: releaseGoodNo },
63
66
  relations: [
67
+ 'domain',
64
68
  'bizplace',
65
69
  'bizplace.domain',
66
70
  'bizplace.company',
67
71
  'bizplace.company.domain',
72
+ 'orderPackages',
68
73
  'orderProducts',
69
74
  'orderProducts.product',
70
- 'orderProducts.productDetail'
75
+ 'orderProducts.productDetail',
76
+ 'creator',
77
+ 'updater'
71
78
  ]
72
79
  })
73
80
 
@@ -103,18 +110,12 @@ export async function completePicking(
103
110
  await getManager().transaction(async txMgr => {
104
111
  const sellercraftCtrl: SellercraftController = new SellercraftController(txMgr, domain, user)
105
112
 
106
- if (!releaseGood?.packageId) {
113
+ if (!releaseGood?.orderPackages?.length) {
107
114
  const orderProducts: OrderProduct[] = await tx.getRepository(OrderProduct).find({
108
115
  where: { releaseGood },
109
116
  relations: ['product', 'product.productDetails']
110
117
  })
111
- releaseGood = await sellercraftCtrl.packOrder(sellercraft, { ...releaseGood, orderProducts })
112
-
113
- if (releaseGood?.packageId) {
114
- await txMgr
115
- .getRepository(ReleaseGood)
116
- .update({ id: releaseGood.id }, { packageId: releaseGood.packageId, updater: releaseGood.updater })
117
- }
118
+ await sellercraftCtrl.packOrder(sellercraft, { ...releaseGood, orderProducts })
118
119
  }
119
120
 
120
121
  const rtsTriggerLevel: Setting = await tx.getRepository(Setting).findOne({
@@ -145,18 +146,20 @@ export async function completePicking(
145
146
  })
146
147
 
147
148
  if (marketplaceOrder) {
149
+ const ecommerceCtrl: EcommerceController = new EcommerceController(tx, domain, user)
148
150
  const marketplaceStore: MarketplaceStore = marketplaceOrder.marketplaceStore
149
151
  let eTraxOption: boolean
150
152
 
151
153
  if (marketplaceStore?.isAutoUpdateShipment) {
152
- const ecommerceCtrl: EcommerceController = new EcommerceController(tx, domain, user)
153
154
  await ecommerceCtrl.createOrderComment(marketplaceStore, marketplaceOrder, ORDER_STATUS.PACKING)
154
155
 
155
156
  await ecommerceCtrl.createOrderShip(releaseGood, marketplaceStore, marketplaceOrder, companyDomain)
156
157
  }
157
158
 
158
- if (!marketplaceOrder)
159
+ if (!marketplaceOrder) {
159
160
  throw new Error('Failed to find ecommerce order, kindly contact our support team regarding this issue')
161
+ }
162
+
160
163
  eTraxOption = marketplaceOrder?.marketplaceStore.eTrax
161
164
 
162
165
  // if eTrax option is true
@@ -248,10 +251,42 @@ export async function completePicking(
248
251
  else throw resp
249
252
  }
250
253
  }
254
+
255
+ await ecommerceCtrl.createOrderPackage(tx, marketplaceOrder, companyDomain, marketplaceStore, releaseGood)
251
256
  }
252
257
  break
253
258
 
254
259
  default:
260
+ const orderPackage: OrderPackage = {
261
+ name: OrderNoGenerator.orderPackage(),
262
+ packageId: null,
263
+ trackingNo: null,
264
+ transporter: null,
265
+ airwayBill: null,
266
+ status: ORDER_STATUS.PROCESSING,
267
+ releaseGood,
268
+ domain: releaseGood.domain,
269
+ bizplace: releaseGood.bizplace,
270
+ creator: releaseGood.creator,
271
+ updater: releaseGood.updater
272
+ }
273
+
274
+ let savedOrderPackage: OrderPackage = await tx.getRepository(OrderPackage).save(orderPackage)
275
+ const orderPackageItems: OrderPackageItem[] = releaseGood.orderProducts.map(op => {
276
+ return {
277
+ name: OrderNoGenerator.orderPackageItem(),
278
+ orderProduct: op,
279
+ status: ORDER_STATUS.PROCESSING,
280
+ releaseQty: op.releaseQty,
281
+ orderPackage: savedOrderPackage,
282
+ domain: releaseGood.domain,
283
+ bizplace: releaseGood.bizplace,
284
+ creator: releaseGood.creator,
285
+ updater: releaseGood.updater
286
+ }
287
+ })
288
+
289
+ await tx.getRepository(OrderPackageItem).save(orderPackageItems)
255
290
  break
256
291
  }
257
292
 
@@ -1,5 +1,5 @@
1
- import { SellercraftDocument } from './sellercraft-document'
2
1
  import { ArrivalNoticeWorksheet } from './arrival-notice-worksheet'
2
+ import { GenerateBatchPickInfo } from './batch-pick-worksheet-info'
3
3
  import { ContactPointInfo } from './contact-point-info'
4
4
  import { CycleCountWorksheet } from './cycle-count-worksheet'
5
5
  import { DeliveryInfo } from './delivery-info'
@@ -11,12 +11,14 @@ import { FindReleaseOrdersByTaskNo } from './find-release-orders-by-task-no'
11
11
  import { GoodsDeliveryNote } from './goods-delivery-note'
12
12
  import { InventoryCheckWorksheet } from './inventory-check-worksheet'
13
13
  import { LoadedWorksheetDetail } from './loaded-worksheet-detail'
14
+ import { MultipleReleaseGoodWorksheet } from './multiple-release-good-worksheet'
14
15
  import { MyPickingAssignmentStatus } from './my-picking-assignment-status'
15
16
  import { NewWorksheet } from './new-worksheet'
16
17
  import { PickingAssignmentStatus } from './picking-assignment-status'
17
18
  import { ProductApproval } from './product-approval'
18
19
  import { ReleaseGoodWorksheet } from './release-good-worksheet'
19
20
  import { ReturnOrderWorksheet } from './return-order-worksheet'
21
+ import { SellercraftDocument } from './sellercraft-document'
20
22
  import { VasOrderWorksheet } from './vas-order-worksheet'
21
23
  import { Worksheet } from './worksheet'
22
24
  import { WorksheetDetailInfo } from './worksheet-detail-info'
@@ -24,8 +26,6 @@ import { WorksheetInfo } from './worksheet-info'
24
26
  import { WorksheetList } from './worksheet-list'
25
27
  import { WorksheetPatch } from './worksheet-patch'
26
28
  import { WorksheetWithPagination } from './worksheet-with-pagination'
27
- import { GenerateBatchPickInfo } from './batch-pick-worksheet-info'
28
- import { MultipleReleaseGoodWorksheet } from './multiple-release-good-worksheet'
29
29
 
30
30
  export const Mutation = /* GraphQL */ `
31
31
  createWorksheet (
@@ -355,13 +355,13 @@ export const Mutation = /* GraphQL */ `
355
355
  ): Boolean @privilege(category: "worksheet_execute", privilege: "mutation") @transaction
356
356
 
357
357
  packing (
358
- worksheetDetailName: String!
358
+ orderPackageItemId: String!
359
359
  releaseQty: Int!
360
360
  serialNumber: String
361
361
  ): Boolean @privilege(category: "worksheet_execute", privilege: "mutation") @transaction
362
362
 
363
363
  scanProductPacking (
364
- worksheetDetailName: String!
364
+ orderPackageItemId: String!
365
365
  productBarcode: String!
366
366
  serialNumber: String
367
367
  ): ExecutingWorksheet @privilege(category: "worksheet_execute", privilege: "mutation") @transaction
@@ -438,6 +438,7 @@ export const Mutation = /* GraphQL */ `
438
438
 
439
439
  completePacking (
440
440
  releaseGoodNo: String!
441
+ orderPackageId: String!
441
442
  ): Boolean @privilege(category: "worksheet_execute", privilege: "mutation") @transaction
442
443
 
443
444
  completeBatchPicking (
@@ -29,5 +29,7 @@ export const WorksheetInfo = gql`
29
29
  refNo3: String
30
30
  looseItem: String
31
31
  orderVas: [WorksheetDetail]
32
+ orderPackage: OrderPackage
33
+ orderPackages: [OrderPackage]
32
34
  }
33
35
  `