@things-factory/worksheet-base 4.3.211 → 4.3.213

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 (37) hide show
  1. package/dist-server/controllers/inbound/putaway-worksheet-controller.js +11 -9
  2. package/dist-server/controllers/inbound/putaway-worksheet-controller.js.map +1 -1
  3. package/dist-server/controllers/inbound/unloading-worksheet-controller.js +77 -98
  4. package/dist-server/controllers/inbound/unloading-worksheet-controller.js.map +1 -1
  5. package/dist-server/controllers/worksheet-controller.js +28 -8
  6. package/dist-server/controllers/worksheet-controller.js.map +1 -1
  7. package/dist-server/graphql/resolvers/worksheet/putaway/complete-putaway.js +4 -2
  8. package/dist-server/graphql/resolvers/worksheet/putaway/complete-putaway.js.map +1 -1
  9. package/dist-server/graphql/resolvers/worksheet/putaway/putaway.js +3 -1
  10. package/dist-server/graphql/resolvers/worksheet/putaway/putaway.js.map +1 -1
  11. package/dist-server/graphql/resolvers/worksheet/putaway-worksheet.js +86 -49
  12. package/dist-server/graphql/resolvers/worksheet/putaway-worksheet.js.map +1 -1
  13. package/dist-server/graphql/resolvers/worksheet/unloading/unload.js +5 -3
  14. package/dist-server/graphql/resolvers/worksheet/unloading/unload.js.map +1 -1
  15. package/dist-server/graphql/resolvers/worksheet/unloading-worksheet.js +84 -74
  16. package/dist-server/graphql/resolvers/worksheet/unloading-worksheet.js.map +1 -1
  17. package/dist-server/graphql/resolvers/worksheet/worksheet.js +116 -0
  18. package/dist-server/graphql/resolvers/worksheet/worksheet.js.map +1 -1
  19. package/dist-server/graphql/types/worksheet/index.js +10 -4
  20. package/dist-server/graphql/types/worksheet/index.js.map +1 -1
  21. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js +4 -0
  22. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js.map +1 -1
  23. package/dist-server/utils/lmd-util.js +24 -8
  24. package/dist-server/utils/lmd-util.js.map +1 -1
  25. package/package.json +8 -8
  26. package/server/controllers/inbound/putaway-worksheet-controller.ts +12 -9
  27. package/server/controllers/inbound/unloading-worksheet-controller.ts +150 -130
  28. package/server/controllers/worksheet-controller.ts +28 -8
  29. package/server/graphql/resolvers/worksheet/putaway/complete-putaway.ts +6 -2
  30. package/server/graphql/resolvers/worksheet/putaway/putaway.ts +5 -1
  31. package/server/graphql/resolvers/worksheet/putaway-worksheet.ts +92 -46
  32. package/server/graphql/resolvers/worksheet/unloading/unload.ts +8 -4
  33. package/server/graphql/resolvers/worksheet/unloading-worksheet.ts +100 -82
  34. package/server/graphql/resolvers/worksheet/worksheet.ts +134 -0
  35. package/server/graphql/types/worksheet/index.ts +11 -5
  36. package/server/graphql/types/worksheet/worksheet-detail-info.ts +4 -0
  37. package/server/utils/lmd-util.ts +38 -26
@@ -1,52 +1,115 @@
1
- import { getRepository } from 'typeorm'
1
+ import { getRepository, EntityManager } from 'typeorm'
2
+
3
+ import { logger } from '@things-factory/env'
2
4
 
3
5
  import { Bizplace } from '@things-factory/biz-base'
4
6
  import { ArrivalNotice, OrderInventory } from '@things-factory/sales-base'
7
+ import { Inventory, Location, Pallet } from '@things-factory/warehouse-base'
8
+ import { Product } from '@things-factory/product-base'
5
9
  import { Domain } from '@things-factory/shell'
6
- import { Inventory } from '@things-factory/warehouse-base'
7
10
 
8
11
  import { WORKSHEET_TYPE } from '../../../constants'
9
12
  import { Worksheet, WorksheetDetail } from '../../../entities'
10
13
  import { fetchExecutingWorksheet } from '../../../utils'
11
14
 
15
+ import { WORKSHEET_STATUS } from '../../../constants'
16
+
12
17
  export const putawayWorksheetResolver = {
13
18
  async putawayWorksheet(_: any, { arrivalNoticeNo }, context: any) {
14
- const { domain }: { domain: Domain } = context.state
15
- const arrivalNotice: ArrivalNotice = await getRepository(ArrivalNotice).findOne({
16
- // Because of partial unloading current status of arrivalNotice can be PUTTING_AWAY or PROCESSING
17
- // PUTTING_AWAY means unloading is completely finished.
18
- // PROCESSING means some products are still being unloaded.
19
- where: {
20
- domain,
21
- name: arrivalNoticeNo
22
- /*status: In([ORDER_STATUS.PUTTING_AWAY, ORDER_STATUS.PROCESSING])*/
23
- },
24
- relations: ['bizplace', 'bizplace.domain', 'bizplace.company', 'bizplace.company.domain']
25
- })
19
+ return await findPutawayWorksheetByArrivalNoticeNo(arrivalNoticeNo, context)
20
+ }
21
+ }
22
+
23
+ export async function findPutawayWorksheetByArrivalNoticeNo(arrivalNoticeNo, context: any) {
24
+ const { domain, tx }: { domain: Domain, tx: EntityManager } = context.state
26
25
 
27
- if (!arrivalNotice) throw new Error(`Arrival notice dosen't exist.`)
26
+ const arrivalNotice: ArrivalNotice = await tx.getRepository(ArrivalNotice).findOne({
27
+ // Because of partial unloading current status of arrivalNotice can be PUTTING_AWAY or PROCESSING
28
+ // PUTTING_AWAY means unloading is completely finished.
29
+ // PROCESSING means some products are still being unloaded.
30
+ where: {
31
+ domain,
32
+ name: arrivalNoticeNo
33
+ /*status: In([ORDER_STATUS.PUTTING_AWAY, ORDER_STATUS.PROCESSING])*/
34
+ },
35
+ relations: ['bizplace', 'bizplace.domain', 'bizplace.company', 'bizplace.company.domain']
36
+ })
28
37
 
38
+ if (!arrivalNotice) throw new Error(`Arrival notice dosen't exist.`)
39
+
40
+ try {
29
41
  const customerBizplace: Bizplace = arrivalNotice.bizplace
30
42
  const customerCompanyDomain: Domain = arrivalNotice.bizplace?.company.domain
31
- const worksheet: Worksheet = await fetchExecutingWorksheet(
43
+
44
+ // Splitted worksheet details to another query to reduce time required for typeorm mapping
45
+ let worksheet: Worksheet = await fetchExecutingWorksheet(
32
46
  domain,
33
47
  arrivalNotice.bizplace,
34
48
  [
35
49
  'bizplace',
36
50
  'arrivalNotice',
37
- 'bufferLocation',
38
- 'worksheetDetails',
39
- 'worksheetDetails.targetInventory',
40
- 'worksheetDetails.targetInventory.inventory',
41
- 'worksheetDetails.targetInventory.inventory.location',
42
- 'worksheetDetails.targetInventory.inventory.product',
43
- 'worksheetDetails.targetInventory.inventory.reusablePallet',
44
- 'worksheetDetails.toLocation'
51
+ 'bufferLocation'
45
52
  ],
46
53
  WORKSHEET_TYPE.PUTAWAY,
47
- arrivalNotice
54
+ arrivalNotice,
55
+ tx
48
56
  )
49
57
 
58
+ const toCamelCase = str => str.toLowerCase().replace(/[^a-zA-Z0-9]+(.)/g, (m, chr) => chr.toUpperCase());;
59
+
60
+ let convertSnakeToCamelOnStartingKeyword = (startingKeyword: string, object: object) => {
61
+ let regex = new RegExp(`^${startingKeyword}_`)
62
+ let result = {}
63
+ Object.keys(object).filter(obj => regex.test(obj)).forEach(itm => {
64
+ result[toCamelCase(itm.replace(`${startingKeyword}_`, ''))] = object[itm]
65
+ })
66
+ return result
67
+ }
68
+
69
+ let wdQb = await tx.getRepository(WorksheetDetail).createQueryBuilder('wd')
70
+ wdQb.leftJoinAndSelect('wd.targetInventory', 'oi')
71
+ .leftJoinAndSelect('oi.inventory', 'inv')
72
+ .leftJoinAndSelect('inv.location', 'loc')
73
+ .leftJoinAndSelect('inv.product', 'prd')
74
+ .leftJoinAndSelect('inv.reusablePallet', 'rp')
75
+ .where('wd.worksheet_id = :worksheetId')
76
+ .orderBy('wd.status', 'DESC')
77
+ .addOrderBy('inv.cartonId')
78
+ .addOrderBy('inv.palletId')
79
+ .setParameters({
80
+ worksheetId: worksheet.id,
81
+ })
82
+
83
+ let worksheetDetails = (await wdQb.getRawMany()).map(wd => {
84
+ let product: Product = convertSnakeToCamelOnStartingKeyword('prd', wd)
85
+ let location: Location = convertSnakeToCamelOnStartingKeyword('loc', wd)
86
+ let reusablePallet: Pallet = convertSnakeToCamelOnStartingKeyword('rp', wd)
87
+
88
+ let data = {
89
+ name: wd.wd_name,
90
+ status: wd.wd_status,
91
+ targetName: wd.oi_name,
92
+ description: wd.wd_description,
93
+ palletId: wd.inv_pallet_id,
94
+ cartonId: wd.inv_carton_id,
95
+ batchId: wd.inv_batch_id,
96
+ expirationDate: wd.inv_expiration_date,
97
+ batchIdRef: wd.inv_batch_id_ref,
98
+ qty: wd.inv_qty,
99
+ packingType: wd.inv_packing_type,
100
+ packingSize: wd.inv_packing_size,
101
+ product: product?.id ? product : null,
102
+ location: location?.id ? location : null,
103
+ reusablePallet: reusablePallet?.id ? reusablePallet : null,
104
+ completed: wd.wd_status === WORKSHEET_STATUS.DONE,
105
+ packingTypeSize: `${wd.inv_packing_type}(${wd.inv_packing_size})`,
106
+ reusablePalletName: reusablePallet?.id ? reusablePallet.name : '',
107
+ sku: product.sku,
108
+ expirationPeriod: product.expirationPeriod
109
+ }
110
+ return data
111
+ })
112
+
50
113
  return {
51
114
  worksheetInfo: {
52
115
  bizplaceName: customerBizplace.name,
@@ -58,27 +121,10 @@ export const putawayWorksheetResolver = {
58
121
  refNo3: arrivalNotice.refNo3,
59
122
  startedAt: worksheet.startedAt
60
123
  },
61
- worksheetDetailInfos: worksheet.worksheetDetails.map(async (putawayWSD: WorksheetDetail) => {
62
- const targetInventory: OrderInventory = putawayWSD.targetInventory
63
- const inventory: Inventory = targetInventory.inventory
64
- return {
65
- name: putawayWSD.name,
66
- palletId: inventory.palletId,
67
- cartonId: inventory.cartonId,
68
- batchId: inventory.batchId,
69
- expirationDate: inventory.expirationDate,
70
- batchIdRef: inventory.batchIdRef,
71
- product: inventory.product,
72
- qty: inventory.qty,
73
- status: putawayWSD.status,
74
- description: putawayWSD.description,
75
- targetName: targetInventory.name,
76
- packingType: inventory.packingType,
77
- packingSize: inventory.packingSize,
78
- location: inventory.location,
79
- reusablePallet: inventory.reusablePallet
80
- }
81
- })
124
+ worksheetDetailInfos: worksheetDetails
82
125
  }
126
+ } catch (error) {
127
+ logger.error(`[putawayWorksheet - ${domain.name} - ${arrivalNoticeNo}]${error}`)
128
+ throw 'Something went wrong.'
83
129
  }
84
130
  }
@@ -5,11 +5,15 @@ import { Domain } from '@things-factory/shell'
5
5
  import { Inventory } from '@things-factory/warehouse-base'
6
6
 
7
7
  import { UnloadingWorksheetController } from '../../../../controllers'
8
+ import { unloadingWorksheetResolver } from '../unloading-worksheet'
9
+ import { findUnloadingWorksheetByArrivalNoticeNo } from '../unloading-worksheet'
8
10
 
9
11
  export const unloadResolver = {
10
- async unload(_: any, { worksheetDetailName, inventory, productBarcode }, context: any) {
12
+ async unload(_: any, { worksheetDetailName, inventory, productBarcode, orderType }, context: any) {
11
13
  const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
12
- await unload(tx, domain, user, worksheetDetailName, inventory, productBarcode)
14
+ const arrivalNoticeNo = await unload(tx, domain, user, worksheetDetailName, inventory, productBarcode)
15
+
16
+ return await findUnloadingWorksheetByArrivalNoticeNo(arrivalNoticeNo, context)
13
17
  }
14
18
  }
15
19
 
@@ -20,7 +24,7 @@ async function unload(
20
24
  worksheetDetailName: string,
21
25
  inventory: Partial<Inventory>,
22
26
  productBarcode: string
23
- ): Promise<void> {
27
+ ): Promise<string> {
24
28
  const worksheetController: UnloadingWorksheetController = new UnloadingWorksheetController(tx, domain, user)
25
- await worksheetController.unload(worksheetDetailName, inventory, productBarcode)
29
+ return await worksheetController.unload(worksheetDetailName, inventory, productBarcode)
26
30
  }
@@ -1,8 +1,9 @@
1
- import { getRepository } from 'typeorm'
1
+ import { EntityManager, SelectQueryBuilder, getRepository } from 'typeorm'
2
2
 
3
3
  import { Bizplace } from '@things-factory/biz-base'
4
4
  import { ArrivalNotice, OrderProduct } from '@things-factory/sales-base'
5
5
  import { Domain } from '@things-factory/shell'
6
+ import { Product } from '@things-factory/product-base'
6
7
 
7
8
  import { WORKSHEET_TYPE } from '../../../constants'
8
9
  import { Worksheet, WorksheetDetail } from '../../../entities'
@@ -10,91 +11,108 @@ import { fetchExecutingWorksheet } from '../../../utils'
10
11
 
11
12
  export const unloadingWorksheetResolver = {
12
13
  async unloadingWorksheet(_: any, { arrivalNoticeNo }, context: any) {
13
- const { domain }: { domain: Domain } = context.state
14
- const arrivalNotice: ArrivalNotice = await getRepository(ArrivalNotice).findOne({
15
- where: { domain, name: arrivalNoticeNo /*status: ORDER_STATUS.PROCESSING*/ },
16
- relations: ['bizplace', 'bizplace.domain', 'bizplace.company', 'bizplace.company.domain']
17
- })
18
- if (!arrivalNotice) throw new Error(`Arrival notice doesn't exist.`)
14
+ return await findUnloadingWorksheetByArrivalNoticeNo(arrivalNoticeNo, context)
15
+ }
16
+ }
19
17
 
20
- const customerBizplace: Bizplace = arrivalNotice.bizplace
21
- const customerCompanyDomain: Domain = arrivalNotice.bizplace?.company.domain
22
- const worksheet: Worksheet = await fetchExecutingWorksheet(
23
- domain,
24
- customerBizplace,
25
- [
26
- 'bizplace',
27
- 'bufferLocation',
28
- 'bufferLocation.warehouse',
29
- 'arrivalNotice',
30
- 'worksheetDetails',
31
- 'worksheetDetails.targetProduct',
32
- 'worksheetDetails.targetProduct.product',
33
- 'creator',
34
- 'updater'
35
- ],
36
- WORKSHEET_TYPE.UNLOADING,
37
- arrivalNotice
38
- )
18
+ export async function findUnloadingWorksheetByArrivalNoticeNo(arrivalNoticeNo, context: any) {
19
+ const { domain, tx }: { domain: Domain; tx: EntityManager } = context.state
20
+ const arrivalNotice: ArrivalNotice = await tx.getRepository(ArrivalNotice).findOne({
21
+ where: { domain, name: arrivalNoticeNo /*status: ORDER_STATUS.PROCESSING*/ },
22
+ relations: ['bizplace', 'bizplace.domain', 'bizplace.company', 'bizplace.company.domain']
23
+ })
24
+ if (!arrivalNotice) throw new Error(`Arrival notice doesn't exist.`)
39
25
 
40
- const vasWorksheet: Worksheet = await getRepository(Worksheet).findOne({
41
- where: {
42
- domain,
43
- arrivalNotice,
44
- type: WORKSHEET_TYPE.VAS
45
- },
46
- relations: [
47
- 'bizplace',
48
- 'bizplace.domain',
49
- 'bufferLocation',
50
- 'bufferLocation.warehouse',
51
- 'arrivalNotice',
52
- 'worksheetDetails',
53
- 'worksheetDetails.targetVas',
54
- 'worksheetDetails.targetVas.vas',
55
- 'creator',
56
- 'updater'
57
- ]
58
- })
26
+ const customerBizplace: Bizplace = arrivalNotice.bizplace
27
+ const customerCompanyDomain: Domain = arrivalNotice.bizplace?.company.domain
28
+
29
+ let worksheet: Worksheet = await fetchExecutingWorksheet(
30
+ domain,
31
+ customerBizplace,
32
+ ['bizplace', 'bufferLocation'],
33
+ WORKSHEET_TYPE.UNLOADING,
34
+ arrivalNotice,
35
+ tx
36
+ )
37
+
38
+ const qb: SelectQueryBuilder<WorksheetDetail> = tx.getRepository(WorksheetDetail).createQueryBuilder('wd')
59
39
 
60
- return {
61
- worksheetInfo: {
62
- arrivalNotice,
63
- bizplaceName: customerBizplace.name,
64
- partnerDomainId: customerBizplace?.domain.id,
65
- customerCompanyDomainId: customerCompanyDomain.id,
66
- containerNo: arrivalNotice.containerNo,
67
- bufferLocation: worksheet.bufferLocation.name,
68
- startedAt: worksheet.startedAt,
69
- refNo: arrivalNotice.refNo,
70
- refNo2: arrivalNotice?.refNo2,
71
- refNo3: arrivalNotice?.refNo3,
72
- looseItem: arrivalNotice.looseItem,
73
- orderVas: vasWorksheet ? vasWorksheet.worksheetDetails : null
74
- },
75
- worksheetDetailInfos: worksheet.worksheetDetails.map(async (productWSD: WorksheetDetail) => {
76
- const targetProduct: OrderProduct = productWSD.targetProduct
40
+ qb.leftJoinAndSelect('wd.targetProduct', 'op')
41
+ .leftJoinAndSelect('op.product', 'prd')
42
+ .where('wd.worksheet_id = :worksheetId', { worksheetId: worksheet.id })
77
43
 
78
- return {
79
- id: productWSD.id,
80
- name: productWSD.name,
81
- batchId: targetProduct.batchId,
82
- batchIdRef: targetProduct.batchIdRef,
83
- product: targetProduct.product,
84
- description: productWSD.description,
85
- targetName: targetProduct.name,
86
- packingType: targetProduct.packingType,
87
- packingSize: targetProduct.packingSize,
88
- palletQty: targetProduct.palletQty,
89
- actualPalletQty: targetProduct.actualPalletQty,
90
- packQty: targetProduct.packQty,
91
- actualPackQty: targetProduct.actualPackQty,
92
- remark: targetProduct.remark,
93
- issue: productWSD.issue,
94
- status: productWSD.status,
95
- manufactureDate: targetProduct.manufactureDate ? new Date(targetProduct.manufactureDate) : null
96
- }
44
+ const vasWorksheet: Worksheet = await tx.getRepository(Worksheet).findOne({
45
+ where: {
46
+ domain,
47
+ arrivalNotice,
48
+ type: WORKSHEET_TYPE.VAS
49
+ },
50
+ relations: [
51
+ 'bizplace',
52
+ 'bizplace.domain',
53
+ 'bufferLocation',
54
+ 'bufferLocation.warehouse',
55
+ 'arrivalNotice',
56
+ 'worksheetDetails',
57
+ 'worksheetDetails.targetVas',
58
+ 'worksheetDetails.targetVas.vas',
59
+ 'creator',
60
+ 'updater'
61
+ ]
62
+ })
63
+
64
+ const toCamelCase = str => str.toLowerCase().replace(/[^a-zA-Z0-9]+(.)/g, (m, chr) => chr.toUpperCase())
65
+
66
+ let convertSnakeToCamelOnStartingKeyword = (startingKeyword: string, object: object) => {
67
+ let regex = new RegExp(`^${startingKeyword}_`)
68
+ let result = {}
69
+ Object.keys(object)
70
+ .filter(obj => regex.test(obj))
71
+ .forEach(itm => {
72
+ result[toCamelCase(itm.replace(`${startingKeyword}_`, ''))] = object[itm]
97
73
  })
98
- }
74
+ return result
75
+ }
76
+
77
+ return {
78
+ worksheetInfo: {
79
+ arrivalNotice,
80
+ bizplaceName: customerBizplace.name,
81
+ partnerDomainId: customerBizplace?.domain.id,
82
+ customerCompanyDomainId: customerCompanyDomain.id,
83
+ containerNo: arrivalNotice.containerNo,
84
+ bufferLocation: worksheet.bufferLocation.name,
85
+ startedAt: worksheet.startedAt,
86
+ refNo: arrivalNotice.refNo,
87
+ refNo2: arrivalNotice?.refNo2,
88
+ refNo3: arrivalNotice?.refNo3,
89
+ looseItem: arrivalNotice.looseItem,
90
+ orderVas: vasWorksheet ? vasWorksheet.worksheetDetails : null
91
+ },
92
+ worksheetDetailInfos: (await qb.getRawMany()).map(async (productWSD: WorksheetDetail) => {
93
+ let product: Product = convertSnakeToCamelOnStartingKeyword('prd', productWSD)
94
+ let targetProduct: OrderProduct = convertSnakeToCamelOnStartingKeyword('op', productWSD)
95
+ let worksheetDetail: any = convertSnakeToCamelOnStartingKeyword('wd', productWSD)
96
+
97
+ return {
98
+ id: worksheetDetail.id,
99
+ name: worksheetDetail.name,
100
+ batchId: targetProduct.batchId,
101
+ batchIdRef: targetProduct.batchIdRef,
102
+ product: product?.id ? product : null,
103
+ description: worksheetDetail.description,
104
+ targetName: targetProduct.name,
105
+ packingType: targetProduct.packingType,
106
+ packingSize: targetProduct.packingSize,
107
+ palletQty: targetProduct.palletQty,
108
+ actualPalletQty: targetProduct.actualPalletQty,
109
+ packQty: targetProduct.packQty,
110
+ actualPackQty: targetProduct.actualPackQty,
111
+ remark: targetProduct.remark,
112
+ issue: worksheetDetail.issue,
113
+ status: worksheetDetail.status,
114
+ manufactureDate: targetProduct.manufactureDate ? new Date(targetProduct.manufactureDate) : null
115
+ }
116
+ })
99
117
  }
100
118
  }
@@ -307,6 +307,140 @@ export const worksheetResolver = {
307
307
  })
308
308
  }
309
309
 
310
+ return worksheet
311
+ },
312
+
313
+
314
+ async inboundWorksheetDetails(_: any, { name }, context: any) {
315
+ const { domain }: { domain: Domain } = context.state
316
+
317
+ let qbWorksheet = getRepository(Worksheet)
318
+ .createQueryBuilder('w')
319
+ .select('w')
320
+ .addSelect('bizplace.id')
321
+ .addSelect('bizplace.name')
322
+ .addSelect('bizplaceDomain.id')
323
+ .addSelect('bizplaceDomain.name')
324
+ .addSelect('bufferLocation.name')
325
+ .addSelect('bufferLocationWarehouse.name')
326
+ .leftJoinAndSelect('w.domain', 'domain')
327
+ .leftJoin('w.bizplace', 'bizplace')
328
+ .leftJoin('bizplace.domain', 'bizplaceDomain')
329
+ .leftJoin('w.bufferLocation', 'bufferLocation')
330
+ .leftJoin('bufferLocation.warehouse', 'bufferLocationWarehouse')
331
+ .leftJoinAndSelect('w.arrivalNotice', 'arrivalNotice')
332
+ .leftJoinAndSelect('w.vasOrder', 'vasOrder')
333
+ .where('w.domain_id = :domain', { domain: domain.id })
334
+ .andWhere('w.name = :name', { name: name })
335
+
336
+ let foundWorksheet: Worksheet = await qbWorksheet.getOne()
337
+
338
+ let qbWorksheetDetails = getRepository(WorksheetDetail).createQueryBuilder('worksheetDetails')
339
+
340
+ let worksheetDetails: WorksheetDetail[] = []
341
+ if (foundWorksheet.type === 'UNLOADING') {
342
+ qbWorksheetDetails.select('worksheetDetails')
343
+ .leftJoinAndSelect('worksheetDetails.targetProduct', 'targetProduct')
344
+ .leftJoinAndSelect('targetProduct.product', 'product')
345
+ .where('worksheetDetails.worksheet_id =:worksheetId', { worksheetId: foundWorksheet.id })
346
+ worksheetDetails = await qbWorksheetDetails.getMany()
347
+ }
348
+
349
+ if (foundWorksheet.type === 'PUTAWAY') {
350
+ qbWorksheetDetails
351
+ .select('worksheetDetails')
352
+ .addSelect('location.name')
353
+ .addSelect('location.description')
354
+ .addSelect('location.type')
355
+ .leftJoinAndSelect('worksheetDetails.targetInventory', 'targetInventory')
356
+ .leftJoinAndSelect('targetInventory.inventory', 'inventory')
357
+ .leftJoinAndSelect('inventory.product', 'product')
358
+ .leftJoin('inventory.location', 'location')
359
+ .where('worksheetDetails.worksheet_id =:worksheetId', { worksheetId: foundWorksheet.id })
360
+ worksheetDetails = await qbWorksheetDetails.getMany()
361
+ }
362
+
363
+ let orderInventories: OrderInventory[] = worksheetDetails.filter(wd => { if (wd.targetInventory) { return wd.targetInventory } })
364
+
365
+ let orderProducts: OrderProduct[] = worksheetDetails.filter(wd => { if (wd.targetProduct) { return wd.targetProduct } })
366
+
367
+ let orderVas: OrderVas[] = worksheetDetails.filter(wd => { if (wd.targetVas) { return wd.targetVas } })
368
+
369
+ // console.time('map')
370
+ let worksheet: WorksheetInterface = {
371
+ ...foundWorksheet,
372
+ worksheetDetails: worksheetDetails,
373
+ orderInventories: orderInventories,
374
+ orderProducts: orderProducts,
375
+ orderVass: orderVas,
376
+ marketplaceOrder: {}
377
+ }
378
+
379
+ if (!worksheet) {
380
+ worksheet = (await getRepository(Worksheet).findOne({
381
+ where: {
382
+ domain,
383
+ arrivalNotice: name
384
+ },
385
+ relations: [
386
+ 'domain',
387
+ 'bizplace',
388
+ 'bizplace.domain',
389
+ 'worksheetDetails',
390
+ 'worksheetDetails.targetProduct',
391
+ 'worksheetDetails.targetProduct.product',
392
+ 'worksheetDetails.targetInventory',
393
+ 'worksheetDetails.targetInventory.releaseGood',
394
+ 'worksheetDetails.targetInventory.product',
395
+ 'worksheetDetails.targetInventory.inventory',
396
+ 'worksheetDetails.targetInventory.inventory.product',
397
+ 'worksheetDetails.targetInventory.inventory.warehouse',
398
+ 'worksheetDetails.targetInventory.inventory.location',
399
+ 'worksheetDetails.targetInventory.inspectedLocation',
400
+ 'creator',
401
+ 'updater'
402
+ ]
403
+ })) as WorksheetInterface
404
+ }
405
+ if (worksheet?.arrivalNotice?.id) {
406
+ worksheet.orderProducts = await getRepository(OrderProduct).find({
407
+ where: {
408
+ domain,
409
+ bizplace: worksheet.bizplace,
410
+ arrivalNotice: worksheet.arrivalNotice
411
+ }
412
+ })
413
+
414
+ worksheet.orderVass = await getRepository(OrderVas).find({
415
+ where: {
416
+ domain,
417
+ bizplace: worksheet.bizplace,
418
+ arrivalNotice: worksheet.arrivalNotice
419
+ },
420
+ relations: ['targetProduct']
421
+ })
422
+ }
423
+
424
+ if (worksheet?.orderInventories?.length > 0) {
425
+ worksheet.worksheetDetails.sort(function (a, b) {
426
+ return (
427
+ worksheet.orderInventories.map(oi => oi.id).indexOf(a.targetInventory.id) -
428
+ worksheet.orderInventories.map(oi => oi.id).indexOf(b.targetInventory.id)
429
+ )
430
+ })
431
+ }
432
+
433
+ if (worksheet?.vasOrder?.id) {
434
+ worksheet.orderVass = await getRepository(OrderVas).find({
435
+ where: {
436
+ domain,
437
+ bizplace: worksheet.bizplace,
438
+ vasOrder: worksheet.vasOrder
439
+ },
440
+ relations: ['targetProduct']
441
+ })
442
+ }
443
+
310
444
  return worksheet
311
445
  }
312
446
  }
@@ -200,7 +200,8 @@ export const Mutation = /* GraphQL */ `
200
200
  worksheetDetailName: String!
201
201
  inventory: InventoryPatch!
202
202
  productBarcode: String
203
- ): Boolean @privilege(category: "worksheet_execute", privilege: "mutation") @transaction
203
+ orderType: String
204
+ ): ExecutingWorksheet @privilege(category: "worksheet_execute", privilege: "mutation") @transaction
204
205
 
205
206
  completeProductScanUnload (
206
207
  worksheetDetailName: String!
@@ -260,11 +261,12 @@ export const Mutation = /* GraphQL */ `
260
261
  ): Worksheet @privilege(category: "worksheet_execute", privilege: "mutation") @transaction
261
262
 
262
263
  putaway (
264
+ arrivalNoticeNo: String!
263
265
  worksheetDetailName: [String]!
264
266
  palletId: String
265
267
  cartonId: String
266
268
  toLocation: String!
267
- ): Boolean @privilege(category: "worksheet_execute", privilege: "mutation") @transaction
269
+ ): ExecutingWorksheet @privilege(category: "worksheet_execute", privilege: "mutation") @transaction
268
270
 
269
271
  replenishmentPutaway (
270
272
  worksheetDetailName: [String]!
@@ -623,9 +625,13 @@ export const Query = /* GraphQL */ `
623
625
  name: String!
624
626
  ): Worksheet @privilege(category: "worksheet", privilege: "query")
625
627
 
628
+ inboundWorksheetDetails (
629
+ name: String!
630
+ ): Worksheet @privilege(category: "worksheet", privilege: "query")
631
+
626
632
  unloadingWorksheet (
627
633
  arrivalNoticeNo: String!
628
- ): ExecutingWorksheet @privilege(category: "worksheet", privilege: "query")
634
+ ): ExecutingWorksheet @privilege(category: "worksheet", privilege: "query") @transaction
629
635
 
630
636
  unloadingReturnWorksheet (
631
637
  returnOrderNo: String!
@@ -650,7 +656,7 @@ export const Query = /* GraphQL */ `
650
656
 
651
657
  putawayWorksheet (
652
658
  arrivalNoticeNo: String!
653
- ): ExecutingWorksheet @privilege(category: "worksheet", privilege: "query")
659
+ ): ExecutingWorksheet @privilege(category: "worksheet", privilege: "query") @transaction
654
660
 
655
661
  putawayReplenishmentWorksheet (
656
662
  replenishmentNo: String!
@@ -762,7 +768,7 @@ export const Query = /* GraphQL */ `
762
768
  findReleaseOrdersByTaskNo(taskNo: String!): FindReleaseOrdersByTaskNo @privilege(category: "worksheet", privilege: "query") @transaction
763
769
  `
764
770
 
765
- export const Types = /* GraphQL */ [
771
+ export const Types = /* GraphQL */[
766
772
  Worksheet,
767
773
  SellercraftDocument,
768
774
  NewWorksheet,
@@ -65,5 +65,9 @@ export const WorksheetDetailInfo = gql`
65
65
  isRequireSerialNumberScanningOutbound: Boolean
66
66
  hasMissingInventoryChanges: Boolean
67
67
  toteName: String
68
+ completed: Boolean
69
+ packingTypeSize: String
70
+ reusablePalletName: String
71
+ expirationPeriod: Int
68
72
  }
69
73
  `