@things-factory/worksheet-base 5.0.0-alpha.50 → 5.0.0-alpha.53

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 (142) hide show
  1. package/dist-server/controllers/ecommerce/sellercraft-controller.js +15 -7
  2. package/dist-server/controllers/ecommerce/sellercraft-controller.js.map +1 -1
  3. package/dist-server/controllers/inbound/putaway-worksheet-controller.js +22 -13
  4. package/dist-server/controllers/inbound/putaway-worksheet-controller.js.map +1 -1
  5. package/dist-server/controllers/inbound/unloading-worksheet-controller.js +1 -1
  6. package/dist-server/controllers/inbound/unloading-worksheet-controller.js.map +1 -1
  7. package/dist-server/controllers/outbound/loading-worksheet-controller.js +47 -10
  8. package/dist-server/controllers/outbound/loading-worksheet-controller.js.map +1 -1
  9. package/dist-server/controllers/outbound/picking-worksheet-controller.js +148 -7
  10. package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
  11. package/dist-server/controllers/outbound/sorting-worksheet-controller.js +116 -20
  12. package/dist-server/controllers/outbound/sorting-worksheet-controller.js.map +1 -1
  13. package/dist-server/controllers/render-grn.js +35 -27
  14. package/dist-server/controllers/render-grn.js.map +1 -1
  15. package/dist-server/controllers/render-manifest.js +12 -5
  16. package/dist-server/controllers/render-manifest.js.map +1 -1
  17. package/dist-server/controllers/worksheet-controller.js +8 -1
  18. package/dist-server/controllers/worksheet-controller.js.map +1 -1
  19. package/dist-server/entities/index.js +2 -1
  20. package/dist-server/entities/index.js.map +1 -1
  21. package/dist-server/entities/warehouse-bizplace-onhand-inventory.js +174 -0
  22. package/dist-server/entities/warehouse-bizplace-onhand-inventory.js.map +1 -0
  23. package/dist-server/graphql/resolvers/worksheet/batch-picking-worksheet.js +14 -1
  24. package/dist-server/graphql/resolvers/worksheet/batch-picking-worksheet.js.map +1 -1
  25. package/dist-server/graphql/resolvers/worksheet/cancel-draft-release-order.js +17 -0
  26. package/dist-server/graphql/resolvers/worksheet/cancel-draft-release-order.js.map +1 -0
  27. package/dist-server/graphql/resolvers/worksheet/cycle-count-adjustment.js +2 -1
  28. package/dist-server/graphql/resolvers/worksheet/cycle-count-adjustment.js.map +1 -1
  29. package/dist-server/graphql/resolvers/worksheet/index.js +2 -1
  30. package/dist-server/graphql/resolvers/worksheet/index.js.map +1 -1
  31. package/dist-server/graphql/resolvers/worksheet/loading/complete-loading.js +40 -18
  32. package/dist-server/graphql/resolvers/worksheet/loading/complete-loading.js.map +1 -1
  33. package/dist-server/graphql/resolvers/worksheet/loading/loading.js +3 -10
  34. package/dist-server/graphql/resolvers/worksheet/loading/loading.js.map +1 -1
  35. package/dist-server/graphql/resolvers/worksheet/loading-worksheet.js +55 -21
  36. package/dist-server/graphql/resolvers/worksheet/loading-worksheet.js.map +1 -1
  37. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +1 -0
  38. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
  39. package/dist-server/graphql/resolvers/worksheet/palletizing-pallets.js +2 -5
  40. package/dist-server/graphql/resolvers/worksheet/palletizing-pallets.js.map +1 -1
  41. package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js +1 -1
  42. package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js.map +1 -1
  43. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +8 -6
  44. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
  45. package/dist-server/graphql/resolvers/worksheet/picking/index.js +2 -1
  46. package/dist-server/graphql/resolvers/worksheet/picking/index.js.map +1 -1
  47. package/dist-server/graphql/resolvers/worksheet/picking/picking.js +4 -4
  48. package/dist-server/graphql/resolvers/worksheet/picking/picking.js.map +1 -1
  49. package/dist-server/graphql/resolvers/worksheet/picking/scan-product-picking.js +4 -4
  50. package/dist-server/graphql/resolvers/worksheet/picking/scan-product-picking.js.map +1 -1
  51. package/dist-server/graphql/resolvers/worksheet/picking/seal-tote.js +15 -0
  52. package/dist-server/graphql/resolvers/worksheet/picking/seal-tote.js.map +1 -0
  53. package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js +10 -1
  54. package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js.map +1 -1
  55. package/dist-server/graphql/resolvers/worksheet/putaway/complete-putaway.js +36 -0
  56. package/dist-server/graphql/resolvers/worksheet/putaway/complete-putaway.js.map +1 -1
  57. package/dist-server/graphql/resolvers/worksheet/sorting/complete-order-sorting.js +11 -6
  58. package/dist-server/graphql/resolvers/worksheet/sorting/complete-order-sorting.js.map +1 -1
  59. package/dist-server/graphql/resolvers/worksheet/sorting/scan-product-sorting.js +4 -4
  60. package/dist-server/graphql/resolvers/worksheet/sorting/scan-product-sorting.js.map +1 -1
  61. package/dist-server/graphql/resolvers/worksheet/sorting/sorting-product.js +4 -4
  62. package/dist-server/graphql/resolvers/worksheet/sorting/sorting-product.js.map +1 -1
  63. package/dist-server/graphql/resolvers/worksheet/unloading/complete-unloading.js +0 -21
  64. package/dist-server/graphql/resolvers/worksheet/unloading/complete-unloading.js.map +1 -1
  65. package/dist-server/graphql/resolvers/worksheet/worksheet.js +2 -0
  66. package/dist-server/graphql/resolvers/worksheet/worksheet.js.map +1 -1
  67. package/dist-server/graphql/resolvers/worksheet/worksheets.js +19 -4
  68. package/dist-server/graphql/resolvers/worksheet/worksheets.js.map +1 -1
  69. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js +9 -3
  70. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js.map +1 -1
  71. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details.js +19 -4
  72. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details.js.map +1 -1
  73. package/dist-server/graphql/resolvers/worksheet-detail/generate-pallet-id.js +24 -34
  74. package/dist-server/graphql/resolvers/worksheet-detail/generate-pallet-id.js.map +1 -1
  75. package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js +8 -1
  76. package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js.map +1 -1
  77. package/dist-server/graphql/resolvers/worksheet-detail/generate-release-good-worksheet-details.js +10 -2
  78. package/dist-server/graphql/resolvers/worksheet-detail/generate-release-good-worksheet-details.js.map +1 -1
  79. package/dist-server/graphql/resolvers/worksheet-movement/create-worksheet-movement.js +2 -5
  80. package/dist-server/graphql/resolvers/worksheet-movement/create-worksheet-movement.js.map +1 -1
  81. package/dist-server/graphql/types/worksheet/index.js +14 -0
  82. package/dist-server/graphql/types/worksheet/index.js.map +1 -1
  83. package/dist-server/graphql/types/worksheet/loaded-worksheet-detail.js +1 -0
  84. package/dist-server/graphql/types/worksheet/loaded-worksheet-detail.js.map +1 -1
  85. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js +2 -0
  86. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js.map +1 -1
  87. package/dist-server/graphql/types/worksheet/worksheet-info.js +2 -0
  88. package/dist-server/graphql/types/worksheet/worksheet-info.js.map +1 -1
  89. package/dist-server/graphql/types/worksheet/worksheet.js +1 -0
  90. package/dist-server/graphql/types/worksheet/worksheet.js.map +1 -1
  91. package/dist-server/graphql/types/worksheet-detail/inventory-detail.js +3 -0
  92. package/dist-server/graphql/types/worksheet-detail/inventory-detail.js.map +1 -1
  93. package/dist-server/utils/worksheet-no-generator.js +25 -28
  94. package/dist-server/utils/worksheet-no-generator.js.map +1 -1
  95. package/package.json +17 -17
  96. package/server/controllers/ecommerce/sellercraft-controller.ts +28 -7
  97. package/server/controllers/inbound/putaway-worksheet-controller.ts +27 -13
  98. package/server/controllers/inbound/unloading-worksheet-controller.ts +1 -1
  99. package/server/controllers/outbound/loading-worksheet-controller.ts +83 -17
  100. package/server/controllers/outbound/picking-worksheet-controller.ts +189 -9
  101. package/server/controllers/outbound/sorting-worksheet-controller.ts +167 -27
  102. package/server/controllers/render-grn.ts +46 -37
  103. package/server/controllers/render-manifest.ts +12 -5
  104. package/server/controllers/worksheet-controller.ts +14 -1
  105. package/server/entities/index.ts +2 -1
  106. package/server/entities/warehouse-bizplace-onhand-inventory.ts +147 -0
  107. package/server/graphql/resolvers/worksheet/batch-picking-worksheet.ts +14 -0
  108. package/server/graphql/resolvers/worksheet/cancel-draft-release-order.ts +27 -0
  109. package/server/graphql/resolvers/worksheet/cycle-count-adjustment.ts +2 -1
  110. package/server/graphql/resolvers/worksheet/index.ts +3 -1
  111. package/server/graphql/resolvers/worksheet/loading/complete-loading.ts +44 -18
  112. package/server/graphql/resolvers/worksheet/loading/loading.ts +5 -12
  113. package/server/graphql/resolvers/worksheet/loading-worksheet.ts +66 -13
  114. package/server/graphql/resolvers/worksheet/packing-worksheet.ts +1 -1
  115. package/server/graphql/resolvers/worksheet/palletizing-pallets.ts +2 -2
  116. package/server/graphql/resolvers/worksheet/picking/complete-batch-picking.ts +1 -1
  117. package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +13 -11
  118. package/server/graphql/resolvers/worksheet/picking/index.ts +3 -1
  119. package/server/graphql/resolvers/worksheet/picking/picking.ts +30 -4
  120. package/server/graphql/resolvers/worksheet/picking/scan-product-picking.ts +7 -4
  121. package/server/graphql/resolvers/worksheet/picking/seal-tote.ts +25 -0
  122. package/server/graphql/resolvers/worksheet/picking-worksheet.ts +13 -2
  123. package/server/graphql/resolvers/worksheet/putaway/complete-putaway.ts +45 -2
  124. package/server/graphql/resolvers/worksheet/sorting/complete-order-sorting.ts +13 -9
  125. package/server/graphql/resolvers/worksheet/sorting/scan-product-sorting.ts +5 -4
  126. package/server/graphql/resolvers/worksheet/sorting/sorting-product.ts +5 -4
  127. package/server/graphql/resolvers/worksheet/unloading/complete-unloading.ts +0 -25
  128. package/server/graphql/resolvers/worksheet/worksheet.ts +2 -0
  129. package/server/graphql/resolvers/worksheet/worksheets.ts +28 -4
  130. package/server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.ts +21 -3
  131. package/server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details.ts +39 -11
  132. package/server/graphql/resolvers/worksheet-detail/generate-pallet-id.ts +46 -49
  133. package/server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.ts +11 -1
  134. package/server/graphql/resolvers/worksheet-detail/generate-release-good-worksheet-details.ts +18 -1
  135. package/server/graphql/resolvers/worksheet-movement/create-worksheet-movement.ts +2 -2
  136. package/server/graphql/types/worksheet/index.ts +14 -0
  137. package/server/graphql/types/worksheet/loaded-worksheet-detail.ts +1 -0
  138. package/server/graphql/types/worksheet/worksheet-detail-info.ts +2 -0
  139. package/server/graphql/types/worksheet/worksheet-info.ts +2 -0
  140. package/server/graphql/types/worksheet/worksheet.ts +1 -0
  141. package/server/graphql/types/worksheet-detail/inventory-detail.ts +3 -0
  142. package/server/utils/worksheet-no-generator.ts +25 -25
@@ -0,0 +1,27 @@
1
+ import { EntityManager } from 'typeorm'
2
+
3
+ import { User } from '@things-factory/auth-base'
4
+ import {
5
+ ORDER_STATUS,
6
+ DraftReleaseGood
7
+ } from '@things-factory/sales-base'
8
+ import { Domain } from '@things-factory/shell'
9
+
10
+ export const cancelDraftReleaseOrder = {
11
+ async cancelDraftReleaseOrder(_: any, { name }, context: any) {
12
+ const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
13
+
14
+ const foundDRO: DraftReleaseGood = await tx.getRepository(DraftReleaseGood).findOne({
15
+ where: { domain, name }
16
+ })
17
+
18
+ if (foundDRO) {
19
+ await tx.getRepository(DraftReleaseGood).save({
20
+ ...foundDRO,
21
+ status: ORDER_STATUS.CANCELLED,
22
+ updater: user
23
+ })
24
+ }
25
+ return
26
+ }
27
+ }
@@ -73,7 +73,8 @@ export async function cycleCountAdjustment(
73
73
  let transactUomValue: number = targetInventory.inspectedUomValue - inventory.uomValue
74
74
 
75
75
  const sellercraft: Sellercraft = await tx.getRepository(Sellercraft).findOne({
76
- where: { domain: inventory.bizplace.domain, status: SellercraftStatus.ACTIVE }
76
+ where: { domain: inventory.bizplace.domain, status: SellercraftStatus.ACTIVE },
77
+ relations: ['domain']
77
78
  })
78
79
 
79
80
  if (targetInventory.status === ORDER_INVENTORY_STATUS.MISSING) {
@@ -22,6 +22,7 @@ import { Mutations as PackingMutations } from './packing'
22
22
  import { packingWorksheetResolver } from './packing-worksheet'
23
23
  import { palletizingPallets } from './palletizing-pallets'
24
24
  import { pendingCancellationReleaseOrder } from './pending-cancellation-release-order'
25
+ import { cancelDraftReleaseOrder } from './cancel-draft-release-order'
25
26
  import { Mutations as PickingMutations } from './picking'
26
27
  import { pickingWorksheetResolver } from './picking-worksheet'
27
28
  import { myPickingAssignmentStatusResolver } from './picking/my-picking-assignment-status'
@@ -132,5 +133,6 @@ export const Mutation = {
132
133
  ...crossDockPickingResolver,
133
134
  ...unpackingResolver,
134
135
  ...palletizingPallets,
135
- ...fetchSellercraftAirwayBillResolver
136
+ ...fetchSellercraftAirwayBillResolver,
137
+ ...cancelDraftReleaseOrder
136
138
  }
@@ -1,6 +1,8 @@
1
1
  import { EntityManager } from 'typeorm'
2
2
 
3
3
  import { User } from '@things-factory/auth-base'
4
+ import { Bizplace, Company } from '@things-factory/biz-base'
5
+ import { FulfillmentCenter } from '@things-factory/integration-fulfillment'
4
6
  import { Sftp, SftpAPI } from '@things-factory/integration-sftp'
5
7
  import { ORDER_INVENTORY_STATUS, ORDER_STATUS, OrderInventory, ReleaseGood } from '@things-factory/sales-base'
6
8
  import { Domain } from '@things-factory/shell'
@@ -44,28 +46,52 @@ export async function completeLoading(
44
46
  (targetInventory: OrderInventory) => targetInventory.status === ORDER_INVENTORY_STATUS.LOADING
45
47
  )
46
48
 
49
+ // Search Warehouse Company Domain
50
+ const warehouseCompanyBizplace: Bizplace = await tx
51
+ .getRepository(Bizplace)
52
+ .findOne({ where: { domain }, relations: ['company'] })
53
+
54
+ const warehouseCompany: Company = warehouseCompanyBizplace.company
55
+ const warehouseBizplaces: Bizplace[] = await tx
56
+ .getRepository(Bizplace)
57
+ .find({ where: { company: warehouseCompany }, relations: ['domain'] })
58
+ const warehouseCompanyBizplaces: Bizplace[] = warehouseBizplaces.filter(biz => biz.domain.extType == 'company')
59
+ const warehouseCompanyDomain: Domain = warehouseCompanyBizplaces[0].domain
60
+
47
61
  const customerDomain: Domain = releaseGood.bizplace.domain
48
- let customerAvailableSftp: Sftp = await tx.getRepository(Sftp).findOne({
49
- where: { domain: customerDomain }
50
- })
51
- if (customerAvailableSftp) {
52
- let inventoryItems: InventoryItem[] = await tx.getRepository(InventoryItem).find({
53
- where: { domain, outboundOrderId: releaseGood.id }
54
- })
62
+ const fulfillmentCenter: FulfillmentCenter = await tx
63
+ .getRepository(FulfillmentCenter)
64
+ .findOne({ domain: warehouseCompanyDomain, centerId: domain.subdomain, status: 'active' })
55
65
 
56
- let shipmentResult: Sftp = await SftpAPI.createShipment(customerAvailableSftp, {
57
- releaseGood,
58
- orderInventories: targetInventories,
59
- sftp: customerAvailableSftp
66
+ if (fulfillmentCenter) {
67
+ let customerAvailableSftp: Sftp = await tx.getRepository(Sftp).findOne({
68
+ where: { domain: customerDomain, status: 'ACTIVE', fulfillmentCenter }
60
69
  })
61
- customerAvailableSftp = await tx.getRepository(Sftp).save(shipmentResult)
70
+ if (customerAvailableSftp) {
71
+ const responseFileTypes: any = JSON.parse(customerAvailableSftp.responseFileTypes)
62
72
 
63
- let snResult: Sftp = await SftpAPI.createSerialNumber(customerAvailableSftp, {
64
- releaseGood,
65
- inventoryItems,
66
- sftp: customerAvailableSftp
67
- })
68
- customerAvailableSftp = await tx.getRepository(Sftp).save(snResult)
73
+ let inventoryItems: InventoryItem[] = await tx.getRepository(InventoryItem).find({
74
+ where: { domain, outboundOrderId: releaseGood.id }
75
+ })
76
+
77
+ if (responseFileTypes.enableShipment) {
78
+ let shipmentResult: Sftp = await SftpAPI.createShipment(customerAvailableSftp, {
79
+ releaseGood,
80
+ orderInventories: targetInventories,
81
+ sftp: customerAvailableSftp
82
+ })
83
+ customerAvailableSftp = await tx.getRepository(Sftp).save(shipmentResult)
84
+ }
85
+
86
+ if (responseFileTypes.enableSerialNumber) {
87
+ let snResult: Sftp = await SftpAPI.createSerialNumber(customerAvailableSftp, {
88
+ releaseGood,
89
+ inventoryItems,
90
+ sftp: customerAvailableSftp
91
+ })
92
+ customerAvailableSftp = await tx.getRepository(Sftp).save(snResult)
93
+ }
94
+ }
69
95
  }
70
96
 
71
97
  await worksheetController.completeLoading(releaseGoodNo)
@@ -9,7 +9,7 @@ import { WorksheetDetail } from '../../../../entities'
9
9
  export const loadingResolver = {
10
10
  async loading(_: any, { loadedWorksheetDetails, releaseGoodNo, orderInfo }, context: any) {
11
11
  const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
12
- await loading(tx, domain, user, loadedWorksheetDetails, releaseGoodNo)
12
+ const worksheetDetails = await loading(tx, domain, user, loadedWorksheetDetails, releaseGoodNo)
13
13
  const worksheetController: WorksheetController = new WorksheetController(tx, domain, user)
14
14
  const releaseGood: ReleaseGood = await worksheetController.findRefOrder(
15
15
  ReleaseGood,
@@ -18,14 +18,7 @@ export const loadingResolver = {
18
18
  )
19
19
 
20
20
  const loadingWorksheetController: LoadingWorksheetController = new LoadingWorksheetController(tx, domain, user)
21
- let targetInventories: OrderInventory[] = []
22
- for (let worksheetDetail of loadedWorksheetDetails) {
23
- worksheetDetail = await loadingWorksheetController.findWorksheetDetailByName(worksheetDetail.name, [
24
- 'targetInventory'
25
- ])
26
- const targetInventory = worksheetDetail.targetInventory
27
- targetInventories.push(targetInventory)
28
- }
21
+ let targetInventories: OrderInventory[] = worksheetDetails.map(itm => itm.targetInventory)
29
22
 
30
23
  const bizplace: Bizplace = releaseGood.bizplace
31
24
  orderInfo = {
@@ -41,9 +34,9 @@ export async function loading(
41
34
  tx: EntityManager,
42
35
  domain: Domain,
43
36
  user: User,
44
- worksheetDetails: Partial<WorksheetDetail & { loadedQty: number }>[],
37
+ worksheetDetails: Partial<WorksheetDetail & { loadedQty: number } & { toteName: string }>[],
45
38
  releaseGoodNo: string
46
- ): Promise<void> {
39
+ ): Promise<any> {
47
40
  const worksheetController: LoadingWorksheetController = new LoadingWorksheetController(tx, domain, user)
48
- await worksheetController.loading(releaseGoodNo, worksheetDetails)
41
+ return await worksheetController.loading(releaseGoodNo, worksheetDetails)
49
42
  }
@@ -1,6 +1,13 @@
1
1
  import { Equal, getRepository, In, Not, SelectQueryBuilder } from 'typeorm'
2
2
 
3
- import { ORDER_STATUS, ORDER_INVENTORY_STATUS, OrderInventory, ReleaseGood } from '@things-factory/sales-base'
3
+ import {
4
+ ORDER_STATUS,
5
+ ORDER_INVENTORY_STATUS,
6
+ OrderInventory,
7
+ ReleaseGood,
8
+ OrderTote,
9
+ OrderToteItem
10
+ } from '@things-factory/sales-base'
4
11
  import { Domain } from '@things-factory/shell'
5
12
  import { Inventory, Location } from '@things-factory/warehouse-base'
6
13
 
@@ -27,7 +34,9 @@ export const loadingWorksheetResolver = {
27
34
  .innerJoinAndSelect('releaseGood.bizplace', 'bizplace')
28
35
  .innerJoinAndSelect('bizplace.domain', 'domain')
29
36
  .where('orderInventory.domain_id = :domainId', { domainId: domain.id })
30
- .andWhere('orderInventory.status IN (:...orderInventoryStatus)', { orderInventoryStatus: [ORDER_INVENTORY_STATUS.LOADING, ORDER_INVENTORY_STATUS.LOADED] })
37
+ .andWhere('orderInventory.status IN (:...orderInventoryStatus)', {
38
+ orderInventoryStatus: [ORDER_INVENTORY_STATUS.LOADING, ORDER_INVENTORY_STATUS.LOADED]
39
+ })
31
40
  .andWhere('orderInventory.bin_location_id = :locationId', { locationId: binLocation.id })
32
41
  .andWhere('releaseGood.status = :status', { status: ORDER_STATUS.LOADING })
33
42
 
@@ -41,6 +50,10 @@ export const loadingWorksheetResolver = {
41
50
 
42
51
  if (!releaseGood) throw new Error(`Release good doesn't exists.`)
43
52
 
53
+ let [orderTotes, orderTotesTotal]: OrderTote = await getRepository(OrderTote).findAndCount({
54
+ where: { releaseGood: releaseGood.id }
55
+ })
56
+
44
57
  const foundWorksheet: Worksheet = await fetchExecutingWorksheet(
45
58
  domain,
46
59
  releaseGood.bizplace,
@@ -48,7 +61,7 @@ export const loadingWorksheetResolver = {
48
61
  WORKSHEET_TYPE.LOADING,
49
62
  releaseGood
50
63
  )
51
- const foundWSD: WorksheetDetail[] = await getRepository(WorksheetDetail).find({
64
+ let foundWSD: any[] = await getRepository(WorksheetDetail).find({
52
65
  where: {
53
66
  domain,
54
67
  worksheet: foundWorksheet,
@@ -57,21 +70,50 @@ export const loadingWorksheetResolver = {
57
70
  },
58
71
  relations: [
59
72
  'targetInventory',
73
+ 'targetInventory.orderProduct',
60
74
  'targetInventory.inventory',
61
75
  'targetInventory.inventory.location',
62
76
  'targetInventory.inventory.product'
63
77
  ]
64
78
  })
65
79
 
66
- return {
67
- worksheetInfo: {
68
- releaseGood,
69
- bizplaceName: releaseGood.bizplace.name,
70
- startedAt: foundWorksheet.startedAt,
71
- refNo: releaseGood.refNo,
72
- ownCollection: releaseGood.ownTransport
73
- },
74
- worksheetDetailInfos: foundWSD.map(async (loadingWSD: WorksheetDetail) => {
80
+ if (orderTotesTotal > 0) {
81
+ let [toteItems, toteItemsTotal]: OrderToteItem = await getRepository(OrderToteItem).findAndCount({
82
+ where: { orderTote: In(orderTotes.map(itm => itm.id)) },
83
+ relations: ['orderTote', 'orderInventory']
84
+ })
85
+
86
+ let toteWsd = []
87
+
88
+ for (let i = 0; i < toteItemsTotal; i++) {
89
+ let wsdIndex = foundWSD.findIndex(
90
+ itm => !itm?.toteName && itm.targetInventory.id == toteItems[i].orderInventory.id
91
+ )
92
+
93
+ if (wsdIndex >= 0) {
94
+ let filterWSD: any = JSON.parse(JSON.stringify(foundWSD[wsdIndex]))
95
+ let uomValue =
96
+ Math.round((filterWSD.targetInventory.releaseUomValue / filterWSD.targetInventory.releaseQty) * 100) / 100
97
+
98
+ foundWSD[wsdIndex].targetInventory.releaseQty -= toteItems[i].qty
99
+ foundWSD[wsdIndex].targetInventory.pickedQty -= toteItems[i].qty
100
+ foundWSD[wsdIndex].targetInventory.releaseUomValue = foundWSD[wsdIndex].targetInventory.releaseQty * uomValue
101
+
102
+ filterWSD.targetInventory.releaseQty = toteItems[i].qty
103
+ filterWSD.targetInventory.pickedQty = toteItems[i].qty
104
+ filterWSD.targetInventory.releaseUomValue = toteItems[i].qty * uomValue
105
+ filterWSD.toteName = toteItems[i].orderTote.name
106
+ toteWsd.push(filterWSD)
107
+ }
108
+ }
109
+
110
+ foundWSD = foundWSD.concat(toteWsd)
111
+ foundWSD.sort((a, b) => (a.toteName > b.toteName ? 1 : -1))
112
+ }
113
+
114
+ let worksheetDetailInfos = foundWSD
115
+ .filter(itm => itm.targetInventory.releaseQty > 0)
116
+ .map((loadingWSD: any) => {
75
117
  const targetInventory: OrderInventory = loadingWSD.targetInventory
76
118
  const inventory: Inventory = targetInventory.inventory
77
119
  return {
@@ -87,9 +129,20 @@ export const loadingWorksheetResolver = {
87
129
  targetName: targetInventory.name,
88
130
  packingType: inventory.packingType,
89
131
  packingSize: inventory.packingSize,
90
- inventory: targetInventory.inventory
132
+ inventory: targetInventory.inventory,
133
+ toteName: loadingWSD.toteName
91
134
  }
92
135
  })
136
+
137
+ return {
138
+ worksheetInfo: {
139
+ releaseGood,
140
+ bizplaceName: releaseGood.bizplace.name,
141
+ startedAt: foundWorksheet.startedAt,
142
+ refNo: releaseGood.refNo,
143
+ ownCollection: releaseGood.ownTransport
144
+ },
145
+ worksheetDetailInfos
93
146
  }
94
147
  }
95
148
  }
@@ -11,7 +11,6 @@ import {
11
11
  import { ORDER_INVENTORY_STATUS, ORDER_STATUS, OrderInventory, ReleaseGood } from '@things-factory/sales-base'
12
12
  import { Domain } from '@things-factory/shell'
13
13
  import { Inventory, Location } from '@things-factory/warehouse-base'
14
- import { ProductDetail } from '@things-factory/product-base'
15
14
 
16
15
  import { WORKSHEET_TYPE } from '../../../constants'
17
16
  import { SellercraftController } from '../../../controllers'
@@ -167,6 +166,7 @@ export const packingWorksheetResolver = {
167
166
  shippingProvider: shippingProvider ? shippingProvider : '',
168
167
  trackingNo: trackingNo ? trackingNo : '',
169
168
  airwayBill: releaseGood?.airwayBill,
169
+ checkedRemarkBy: releaseGood?.checkedRemarkBy,
170
170
  invoice: releaseGood?.invoice,
171
171
  platform: marketplaceOrder ? marketplaceOrder.marketplaceStore.platform : 'operato',
172
172
  marketplaceStoreId: marketplaceOrder ? marketplaceOrder.marketplaceStore.id : '',
@@ -1,7 +1,7 @@
1
1
  import { User } from '@things-factory/auth-base'
2
2
  import { Domain } from '@things-factory/shell'
3
3
  import { ArrivalNotice, OrderVas, Vas, ORDER_STATUS, ORDER_VAS_STATUS, ORDER_TYPES } from '@things-factory/sales-base'
4
- import uuid from 'uuid/v4'
4
+ import { v4 as uuidv4 } from 'uuid'
5
5
  import { Equal, Not, EntityManager } from 'typeorm'
6
6
  import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../../constants'
7
7
  import { Worksheet, WorksheetDetail } from '../../../entities'
@@ -74,7 +74,7 @@ export const palletizingPallets = {
74
74
  }
75
75
  } else {
76
76
  orderVass = {
77
- name: uuid(),
77
+ name: uuidv4(),
78
78
  set: patch.set,
79
79
  vas: palletizingVAS,
80
80
  qty: patch.qty,
@@ -42,7 +42,7 @@ export async function completeBatchPicking(
42
42
  const worksheet = await pickingWSCtrl.completeBatchPicking(taskNo)
43
43
 
44
44
  const worksheetDetails: WorksheetDetail[] = worksheet.worksheetDetails
45
- const targetInventories: OrderInventory[] = worksheetDetails.map((wsd: WorksheetDetail) => wsd.targetInventory)
45
+ const targetInventories: OrderInventory[] = worksheetDetails.filter(wsd=>wsd.status != 'MISSING').map((wsd: WorksheetDetail) => wsd.targetInventory)
46
46
 
47
47
  const sellercraft: Sellercraft = await tx
48
48
  .getRepository(Sellercraft)
@@ -248,18 +248,20 @@ export async function completePicking(
248
248
  })
249
249
 
250
250
  if (!existLoadingWorksheet && !releaseGood.courierOption && !releaseGood.packingOption) {
251
- const loadingWSCtrl: LoadingWorksheetController = new LoadingWorksheetController(tx, domain, user)
252
- let loadingWorksheet: Worksheet = await loadingWSCtrl.generateLoadingWorksheet(
253
- releaseGoodNo,
254
- pickedTargetInventories
255
- )
256
-
257
- if (!loadingWorksheet.worksheetDetails?.length) {
258
- loadingWorksheet = await pickingWSCtrl.findWorksheetById(loadingWorksheet.id)
251
+ if(pickedTargetInventories.length>0){
252
+ const loadingWSCtrl: LoadingWorksheetController = new LoadingWorksheetController(tx, domain, user)
253
+ let loadingWorksheet: Worksheet = await loadingWSCtrl.generateLoadingWorksheet(
254
+ releaseGoodNo,
255
+ pickedTargetInventories
256
+ )
257
+
258
+ if (!loadingWorksheet.worksheetDetails?.length) {
259
+ loadingWorksheet = await pickingWSCtrl.findWorksheetById(loadingWorksheet.id)
260
+ }
261
+
262
+ const loadingWorksheetDetails: WorksheetDetail[] = loadingWorksheet.worksheetDetails
263
+ await loadingWSCtrl.activateLoading(loadingWorksheet.name, loadingWorksheetDetails)
259
264
  }
260
-
261
- const loadingWorksheetDetails: WorksheetDetail[] = loadingWorksheet.worksheetDetails
262
- await loadingWSCtrl.activateLoading(loadingWorksheet.name, loadingWorksheetDetails)
263
265
  } else {
264
266
  const loadingWSCtrl: LoadingWorksheetController = new LoadingWorksheetController(tx, domain, user)
265
267
  let loadingWorksheet: Worksheet = await loadingWSCtrl.updateLoadingWorksheet(
@@ -11,6 +11,7 @@ import { scanProductPickingResolver } from './scan-product-picking'
11
11
  import { scanProductBatchPickingResolver } from './scan-product-batch-picking'
12
12
  import { undoPickingAssigmentResolver } from './undo-picking-assignment'
13
13
  import { undoSerialNumberPickingResolver } from './undo-serial-number-picking'
14
+ import { sealToteResolver } from './seal-tote'
14
15
 
15
16
  export const Mutations = {
16
17
  ...assignPickingInventoriesResolver,
@@ -25,5 +26,6 @@ export const Mutations = {
25
26
  ...completeBatchPickingResolver,
26
27
  ...assignPickingWorkerResolver,
27
28
  ...fetchAndAssignPickingTaskResolver,
28
- ...undoSerialNumberPickingResolver
29
+ ...undoSerialNumberPickingResolver,
30
+ ...sealToteResolver
29
31
  }
@@ -4,9 +4,25 @@ import { EntityManager } from 'typeorm'
4
4
  import { PickingWorksheetController } from '../../../../controllers'
5
5
 
6
6
  export const pickingResolver = {
7
- async picking(_: any, { worksheetDetailName, worksheetType, palletId, locationName, releaseQty, binLocation, serialNumber }, context: any) {
7
+ async picking(
8
+ _: any,
9
+ { worksheetDetailName, worksheetType, palletId, locationName, releaseQty, binLocation, serialNumber, toteNo },
10
+ context: any
11
+ ) {
8
12
  const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
9
- await picking(tx, domain, user, worksheetDetailName, worksheetType, palletId, locationName, releaseQty, binLocation, serialNumber)
13
+ await picking(
14
+ tx,
15
+ domain,
16
+ user,
17
+ worksheetDetailName,
18
+ worksheetType,
19
+ palletId,
20
+ locationName,
21
+ releaseQty,
22
+ binLocation,
23
+ serialNumber,
24
+ toteNo
25
+ )
10
26
  }
11
27
  }
12
28
 
@@ -20,8 +36,18 @@ export async function picking(
20
36
  locationName: string,
21
37
  releaseQty: number,
22
38
  binLocation?: string,
23
- serialNumber?: string
39
+ serialNumber?: string,
40
+ toteNo?: string
24
41
  ) {
25
42
  const worksheetController: PickingWorksheetController = new PickingWorksheetController(tx, domain, user)
26
- await worksheetController.picking(worksheetDetailName, worksheetType, palletId, locationName, releaseQty, binLocation, serialNumber)
43
+ await worksheetController.picking(
44
+ worksheetDetailName,
45
+ worksheetType,
46
+ palletId,
47
+ locationName,
48
+ releaseQty,
49
+ binLocation,
50
+ serialNumber,
51
+ toteNo
52
+ )
27
53
  }
@@ -6,7 +6,7 @@ import { PickingWorksheetController } from '../../../../controllers'
6
6
  export const scanProductPickingResolver = {
7
7
  async scanProductPicking(
8
8
  _: any,
9
- { worksheetDetailName, worksheetType, productBarcode, cartonId, binLocation, serialNumber },
9
+ { worksheetDetailName, worksheetType, productBarcode, cartonId, binLocation, serialNumber, toteNo },
10
10
  context: any
11
11
  ) {
12
12
  const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
@@ -19,7 +19,8 @@ export const scanProductPickingResolver = {
19
19
  productBarcode,
20
20
  cartonId,
21
21
  binLocation,
22
- serialNumber
22
+ serialNumber,
23
+ toteNo
23
24
  )
24
25
  }
25
26
  }
@@ -33,7 +34,8 @@ export async function scanProductPicking(
33
34
  productBarcode: string,
34
35
  cartonId: string,
35
36
  binLocation?: string,
36
- serialNumber?: string
37
+ serialNumber?: string,
38
+ toteNo?: string
37
39
  ) {
38
40
  const worksheetController: PickingWorksheetController = new PickingWorksheetController(tx, domain, user)
39
41
  await worksheetController.scanProductPicking(
@@ -42,6 +44,7 @@ export async function scanProductPicking(
42
44
  productBarcode,
43
45
  cartonId,
44
46
  binLocation,
45
- serialNumber
47
+ serialNumber,
48
+ toteNo
46
49
  )
47
50
  }
@@ -0,0 +1,25 @@
1
+ import { EntityManager } from 'typeorm'
2
+
3
+ import { User } from '@things-factory/auth-base'
4
+ import { Domain } from '@things-factory/shell'
5
+
6
+ import { PickingWorksheetController } from '../../../../controllers'
7
+
8
+ export const sealToteResolver = {
9
+ async sealTote(_: any, { sealNo, toteNo, orderNo }, context: any) {
10
+ const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
11
+ await sealTote(tx, domain, user, sealNo, toteNo, orderNo)
12
+ }
13
+ }
14
+
15
+ async function sealTote(
16
+ tx: EntityManager,
17
+ domain: Domain,
18
+ user: User,
19
+ sealNo: string,
20
+ toteNo: string,
21
+ orderNo: string
22
+ ): Promise<void> {
23
+ const worksheetController: PickingWorksheetController = new PickingWorksheetController(tx, domain, user)
24
+ await worksheetController.sealTote(sealNo, toteNo, orderNo)
25
+ }
@@ -2,7 +2,7 @@ import { EntityManager, In, SelectQueryBuilder } from 'typeorm'
2
2
 
3
3
  import { ORDER_INVENTORY_STATUS, OrderInventory, ReleaseGood, ShippingOrder } from '@things-factory/sales-base'
4
4
  import { Domain } from '@things-factory/shell'
5
- import { Inventory, Location } from '@things-factory/warehouse-base'
5
+ import { Inventory, Location, InventoryChange } from '@things-factory/warehouse-base'
6
6
 
7
7
  import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../../constants'
8
8
  import { WorksheetDetail } from '../../../entities'
@@ -109,6 +109,16 @@ export async function pickingWorksheet(
109
109
  worksheetDetailInfos: worksheetDetails.map(async (pickingWSD: WorksheetDetail) => {
110
110
  const targetInventory: OrderInventory = pickingWSD.targetInventory
111
111
  const inventory: Inventory = targetInventory.inventory
112
+
113
+ const inventoryChangesCount: number = await tx.getRepository(InventoryChange).count({
114
+ where: {
115
+ inventory: inventory.id,
116
+ status:"PENDING",
117
+ transactionType:"MISSING"
118
+ },
119
+ relations:['inventory','product']
120
+ })
121
+
112
122
  return {
113
123
  name: pickingWSD.name,
114
124
  palletId: inventory?.palletId,
@@ -127,7 +137,8 @@ export async function pickingWorksheet(
127
137
  packingSize: inventory?.packingSize,
128
138
  expirationDate: inventory?.expirationDate,
129
139
  location: inventory?.location,
130
- relatedOrderInv: targetInventory
140
+ relatedOrderInv: targetInventory,
141
+ hasMissingInventoryChanges:inventoryChangesCount > 0 ? true:false
131
142
  }
132
143
  })
133
144
  }
@@ -1,13 +1,56 @@
1
+ import { EntityManager } from 'typeorm'
2
+
1
3
  import { User } from '@things-factory/auth-base'
4
+ import { MarketplaceStore } from '@things-factory/integration-marketplace'
5
+ import { Sellercraft, SellercraftStatus } from '@things-factory/integration-sellercraft'
6
+ import { ArrivalNotice } from '@things-factory/sales-base'
2
7
  import { Domain } from '@things-factory/shell'
3
- import { EntityManager } from 'typeorm'
8
+
4
9
  import { PutawayWorksheetController } from '../../../../controllers'
10
+ import { EcommerceController, SellercraftController } from '../../../../controllers/ecommerce'
5
11
  import { Worksheet } from '../../../../entities'
6
12
 
7
13
  export const completePutawayResolver = {
8
14
  async completePutaway(_: any, { arrivalNoticeNo }, context: any) {
9
15
  const { tx, user, domain }: { tx: EntityManager; user: User; domain: Domain } = context.state
10
16
  await completePutaway(tx, domain, user, arrivalNoticeNo)
17
+
18
+ const arrivalNotice: ArrivalNotice = await tx.getRepository(ArrivalNotice).findOne({
19
+ where: { domain, name: arrivalNoticeNo },
20
+ relations: [
21
+ 'purchaseOrder',
22
+ 'bizplace',
23
+ 'bizplace.domain',
24
+ 'bizplace.company',
25
+ 'bizplace.company.domain',
26
+ 'orderProducts',
27
+ 'orderProducts.product',
28
+ 'orderProducts.product.productDetails',
29
+ 'orderProducts.product.productDetails.childProductDetail'
30
+ ]
31
+ })
32
+
33
+ // search for any active marketplace connection
34
+ const companyDomain: Domain = arrivalNotice.bizplace.company.domain
35
+ const customerDomain: Domain = arrivalNotice.bizplace.domain
36
+ const marketplaceStores: MarketplaceStore[] = await tx.getRepository(MarketplaceStore).find({
37
+ where: { domain: companyDomain, status: 'ACTIVE', isAutoUpdateStockQty: true },
38
+ relations: ['marketplaceDistributors']
39
+ })
40
+
41
+ const sellercraft: Sellercraft = await tx
42
+ .getRepository(Sellercraft)
43
+ .findOne({ domain: customerDomain, status: SellercraftStatus.ACTIVE })
44
+
45
+ if (sellercraft) {
46
+ const sellercraftCtrl: SellercraftController = new SellercraftController(tx, domain, user)
47
+ await sellercraftCtrl.registerProductInbound(sellercraft, arrivalNotice)
48
+ }
49
+
50
+ if (marketplaceStores?.length && marketplaceStores.some(store => store.isAutoUpdateStockQty)) {
51
+ const ecommerceCtrl: EcommerceController = new EcommerceController(tx, domain, user)
52
+ await ecommerceCtrl.updateProductVariationStock(marketplaceStores, arrivalNotice.orderProducts, companyDomain)
53
+ }
11
54
  }
12
55
  }
13
56
 
@@ -28,4 +71,4 @@ export async function completePutaway(
28
71
  relations: ['bizplace', 'arrivalNotice']
29
72
  })
30
73
  }
31
- }
74
+ }
@@ -19,16 +19,20 @@ export async function completeOrderSorting(
19
19
  user: User,
20
20
  releaseGoodNo: string
21
21
  ): Promise<void> {
22
- const sortingWSCtrl: SortingWorksheetController = new SortingWorksheetController(tx, domain, user)
23
- const releaseGood = await sortingWSCtrl.completeOrderSorting(releaseGoodNo)
22
+ try {
23
+ const sortingWSCtrl: SortingWorksheetController = new SortingWorksheetController(tx, domain, user)
24
+ const releaseGood = await sortingWSCtrl.completeOrderSorting(releaseGoodNo)
24
25
 
25
- const loadingWSCtrl: LoadingWorksheetController = new LoadingWorksheetController(tx, domain, user)
26
- let loadingWorksheet: Worksheet = await loadingWSCtrl.generateLoadingWorksheet(
27
- releaseGood.name,
28
- releaseGood.orderInventories.filter(itm => itm.status != ORDER_INVENTORY_STATUS.COMPLETE_SPLIT)
29
- )
26
+ const loadingWSCtrl: LoadingWorksheetController = new LoadingWorksheetController(tx, domain, user)
27
+ let loadingWorksheet: Worksheet = await loadingWSCtrl.generateLoadingWorksheet(
28
+ releaseGood.name,
29
+ releaseGood.orderInventories.filter(itm => itm.status != ORDER_INVENTORY_STATUS.COMPLETE_SPLIT)
30
+ )
30
31
 
31
- if (loadingWorksheet.status === WORKSHEET_STATUS.DEACTIVATED) {
32
- await loadingWSCtrl.activateLoading(loadingWorksheet.name, loadingWorksheet.worksheetDetails)
32
+ if (loadingWorksheet.status === WORKSHEET_STATUS.DEACTIVATED) {
33
+ await loadingWSCtrl.activateLoading(loadingWorksheet.name, loadingWorksheet.worksheetDetails)
34
+ }
35
+ } catch (e) {
36
+ throw e
33
37
  }
34
38
  }