@things-factory/worksheet-base 4.0.10 → 4.0.14

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 (106) hide show
  1. package/dist-server/constants/template.js +1 -0
  2. package/dist-server/constants/template.js.map +1 -1
  3. package/dist-server/controllers/ecommerce/sellercraft-controller.js +3 -3
  4. package/dist-server/controllers/ecommerce/sellercraft-controller.js.map +1 -1
  5. package/dist-server/controllers/inbound/putaway-worksheet-controller.js +24 -5
  6. package/dist-server/controllers/inbound/putaway-worksheet-controller.js.map +1 -1
  7. package/dist-server/controllers/inbound/unloading-worksheet-controller.js +67 -28
  8. package/dist-server/controllers/inbound/unloading-worksheet-controller.js.map +1 -1
  9. package/dist-server/controllers/index.js +1 -0
  10. package/dist-server/controllers/index.js.map +1 -1
  11. package/dist-server/controllers/outbound/loading-worksheet-controller.js +4 -0
  12. package/dist-server/controllers/outbound/loading-worksheet-controller.js.map +1 -1
  13. package/dist-server/controllers/outbound/packing-worksheet-controller.js +1 -3
  14. package/dist-server/controllers/outbound/packing-worksheet-controller.js.map +1 -1
  15. package/dist-server/controllers/outbound/picking-worksheet-controller.js +159 -116
  16. package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
  17. package/dist-server/controllers/render-elccl-grn.js +6 -6
  18. package/dist-server/controllers/render-elccl-grn.js.map +1 -1
  19. package/dist-server/controllers/render-manifest.js +64 -0
  20. package/dist-server/controllers/render-manifest.js.map +1 -0
  21. package/dist-server/controllers/worksheet-controller.js +28 -2
  22. package/dist-server/controllers/worksheet-controller.js.map +1 -1
  23. package/dist-server/graphql/resolvers/pallet/index.js +2 -1
  24. package/dist-server/graphql/resolvers/pallet/index.js.map +1 -1
  25. package/dist-server/graphql/resolvers/pallet/pallet-outbound.js +1 -1
  26. package/dist-server/graphql/resolvers/pallet/pallet-outbound.js.map +1 -1
  27. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js +6 -5
  28. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js.map +1 -1
  29. package/dist-server/graphql/resolvers/worksheet/loading-worksheet.js +23 -2
  30. package/dist-server/graphql/resolvers/worksheet/loading-worksheet.js.map +1 -1
  31. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +22 -0
  32. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
  33. package/dist-server/graphql/resolvers/worksheet/pending-cancellation-release-order.js +6 -3
  34. package/dist-server/graphql/resolvers/worksheet/pending-cancellation-release-order.js.map +1 -1
  35. package/dist-server/graphql/resolvers/worksheet/picking/activate-picking.js +0 -4
  36. package/dist-server/graphql/resolvers/worksheet/picking/activate-picking.js.map +1 -1
  37. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +30 -5
  38. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
  39. package/dist-server/graphql/resolvers/worksheet/picking/fetch-and-assign-picking-task.js +72 -0
  40. package/dist-server/graphql/resolvers/worksheet/picking/fetch-and-assign-picking-task.js.map +1 -0
  41. package/dist-server/graphql/resolvers/worksheet/picking/index.js +2 -1
  42. package/dist-server/graphql/resolvers/worksheet/picking/index.js.map +1 -1
  43. package/dist-server/graphql/resolvers/worksheet/picking/picking.js +4 -4
  44. package/dist-server/graphql/resolvers/worksheet/picking/picking.js.map +1 -1
  45. package/dist-server/graphql/resolvers/worksheet/picking/scan-product-picking.js +4 -4
  46. package/dist-server/graphql/resolvers/worksheet/picking/scan-product-picking.js.map +1 -1
  47. package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js +86 -57
  48. package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js.map +1 -1
  49. package/dist-server/graphql/resolvers/worksheet/recommend-putway-location.js +2 -2
  50. package/dist-server/graphql/resolvers/worksheet/recommend-putway-location.js.map +1 -1
  51. package/dist-server/graphql/resolvers/worksheet/unloaded-inventories.js +6 -1
  52. package/dist-server/graphql/resolvers/worksheet/unloaded-inventories.js.map +1 -1
  53. package/dist-server/graphql/resolvers/worksheet/unloading-return-worksheet.js +2 -2
  54. package/dist-server/graphql/resolvers/worksheet/unloading-return-worksheet.js.map +1 -1
  55. package/dist-server/graphql/resolvers/worksheet-detail/generate-release-good-worksheet-details.js +48 -44
  56. package/dist-server/graphql/resolvers/worksheet-detail/generate-release-good-worksheet-details.js.map +1 -1
  57. package/dist-server/graphql/types/index.js +9 -4
  58. package/dist-server/graphql/types/index.js.map +1 -1
  59. package/dist-server/graphql/types/pallet/index.js +6 -3
  60. package/dist-server/graphql/types/pallet/index.js.map +1 -1
  61. package/dist-server/graphql/types/pallet/pallet.js +10 -0
  62. package/dist-server/graphql/types/pallet/pallet.js.map +1 -0
  63. package/dist-server/graphql/types/worksheet/index.js +7 -1
  64. package/dist-server/graphql/types/worksheet/index.js.map +1 -1
  65. package/dist-server/index.js +1 -0
  66. package/dist-server/index.js.map +1 -1
  67. package/dist-server/routes.js +4 -0
  68. package/dist-server/routes.js.map +1 -1
  69. package/dist-server/utils/inventory-util.js +29 -4
  70. package/dist-server/utils/inventory-util.js.map +1 -1
  71. package/package.json +16 -16
  72. package/server/constants/template.ts +1 -0
  73. package/server/controllers/ecommerce/sellercraft-controller.ts +3 -3
  74. package/server/controllers/inbound/putaway-worksheet-controller.ts +29 -8
  75. package/server/controllers/inbound/unloading-worksheet-controller.ts +83 -29
  76. package/server/controllers/index.ts +1 -0
  77. package/server/controllers/outbound/loading-worksheet-controller.ts +20 -0
  78. package/server/controllers/outbound/packing-worksheet-controller.ts +3 -5
  79. package/server/controllers/outbound/picking-worksheet-controller.ts +206 -154
  80. package/server/controllers/render-elccl-grn.ts +8 -6
  81. package/server/controllers/render-manifest.ts +68 -0
  82. package/server/controllers/worksheet-controller.ts +41 -2
  83. package/server/graphql/resolvers/pallet/index.ts +2 -0
  84. package/server/graphql/resolvers/pallet/pallet-outbound.ts +1 -2
  85. package/server/graphql/resolvers/worksheet/inventories-by-pallet.ts +10 -8
  86. package/server/graphql/resolvers/worksheet/loading-worksheet.ts +30 -4
  87. package/server/graphql/resolvers/worksheet/packing-worksheet.ts +28 -3
  88. package/server/graphql/resolvers/worksheet/pending-cancellation-release-order.ts +13 -7
  89. package/server/graphql/resolvers/worksheet/picking/activate-picking.ts +1 -6
  90. package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +35 -4
  91. package/server/graphql/resolvers/worksheet/picking/fetch-and-assign-picking-task.ts +78 -0
  92. package/server/graphql/resolvers/worksheet/picking/index.ts +3 -1
  93. package/server/graphql/resolvers/worksheet/picking/picking.ts +6 -4
  94. package/server/graphql/resolvers/worksheet/picking/scan-product-picking.ts +7 -4
  95. package/server/graphql/resolvers/worksheet/picking-worksheet.ts +102 -62
  96. package/server/graphql/resolvers/worksheet/recommend-putway-location.ts +4 -2
  97. package/server/graphql/resolvers/worksheet/unloaded-inventories.ts +10 -1
  98. package/server/graphql/resolvers/worksheet/unloading-return-worksheet.ts +6 -4
  99. package/server/graphql/resolvers/worksheet-detail/generate-release-good-worksheet-details.ts +102 -76
  100. package/server/graphql/types/index.ts +9 -4
  101. package/server/graphql/types/pallet/index.ts +8 -2
  102. package/server/graphql/types/pallet/pallet.ts +7 -0
  103. package/server/graphql/types/worksheet/index.ts +8 -2
  104. package/server/index.ts +1 -0
  105. package/server/routes.ts +5 -0
  106. package/server/utils/inventory-util.ts +31 -9
@@ -1,7 +1,9 @@
1
- import { OrderInventory, ReleaseGood } from '@things-factory/sales-base'
1
+ import { Equal, getRepository, In, Not, SelectQueryBuilder } from 'typeorm'
2
+
3
+ import { ORDER_STATUS, ORDER_INVENTORY_STATUS, OrderInventory, ReleaseGood } from '@things-factory/sales-base'
2
4
  import { Domain } from '@things-factory/shell'
3
- import { Inventory } from '@things-factory/warehouse-base'
4
- import { Equal, getRepository, Not } from 'typeorm'
5
+ import { Inventory, Location } from '@things-factory/warehouse-base'
6
+
5
7
  import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../../constants'
6
8
  import { Worksheet, WorksheetDetail } from '../../../entities'
7
9
  import { fetchExecutingWorksheet } from '../../../utils'
@@ -9,11 +11,34 @@ import { fetchExecutingWorksheet } from '../../../utils'
9
11
  export const loadingWorksheetResolver = {
10
12
  async loadingWorksheet(_: any, { releaseGoodNo }, context: any) {
11
13
  const { domain }: { domain: Domain } = context.state
12
- const releaseGood: ReleaseGood = await getRepository(ReleaseGood).findOne({
14
+ let releaseGood: ReleaseGood = await getRepository(ReleaseGood).findOne({
13
15
  where: { domain, name: releaseGoodNo /*status: ORDER_STATUS.LOADING*/ },
14
16
  relations: ['bizplace']
15
17
  })
16
18
 
19
+ // Find Release Order based on Bin
20
+ if (!releaseGood) {
21
+ const binLocation: Location = await getRepository(Location).findOne({
22
+ where: { domain, name: releaseGoodNo }
23
+ })
24
+
25
+ const qb: SelectQueryBuilder<OrderInventory> = getRepository(OrderInventory).createQueryBuilder('orderInventory')
26
+ qb.innerJoinAndSelect('orderInventory.releaseGood', 'releaseGood')
27
+ .innerJoinAndSelect('releaseGood.bizplace', 'bizplace')
28
+ .innerJoinAndSelect('bizplace.domain', 'domain')
29
+ .where('orderInventory.domain_id = :domainId', { domainId: domain.id })
30
+ .andWhere('orderInventory.status IN (:...orderInventoryStatus)', { orderInventoryStatus: [ORDER_INVENTORY_STATUS.LOADING, ORDER_INVENTORY_STATUS.LOADED] })
31
+ .andWhere('orderInventory.bin_location_id = :locationId', { locationId: binLocation.id })
32
+ .andWhere('releaseGood.status = :status', { status: ORDER_STATUS.LOADING })
33
+
34
+ const orderInventoryByBin = await qb.getOne()
35
+
36
+ if (orderInventoryByBin?.releaseGood) {
37
+ releaseGoodNo = orderInventoryByBin.releaseGood.name
38
+ releaseGood = orderInventoryByBin.releaseGood
39
+ }
40
+ }
41
+
17
42
  if (!releaseGood) throw new Error(`Release good doesn't exists.`)
18
43
 
19
44
  const foundWorksheet: Worksheet = await fetchExecutingWorksheet(
@@ -40,6 +65,7 @@ export const loadingWorksheetResolver = {
40
65
 
41
66
  return {
42
67
  worksheetInfo: {
68
+ releaseGood,
43
69
  bizplaceName: releaseGood.bizplace.name,
44
70
  startedAt: foundWorksheet.startedAt,
45
71
  refNo: releaseGood.refNo,
@@ -1,16 +1,17 @@
1
- import { EntityManager } from 'typeorm'
1
+ import { EntityManager, In, SelectQueryBuilder } from 'typeorm'
2
2
 
3
3
  import { User } from '@things-factory/auth-base'
4
4
  import { Sellercraft, SellercraftStatus } from '@things-factory/integration-sellercraft'
5
5
  import { MarketplaceOrder, MarketplaceOrderItem, MarketplaceOrderShipping } from '@things-factory/marketplace-base'
6
- import { OrderInventory, ReleaseGood } from '@things-factory/sales-base'
6
+ import { ORDER_INVENTORY_STATUS, OrderInventory, ReleaseGood } from '@things-factory/sales-base'
7
7
  import { Domain } from '@things-factory/shell'
8
- import { Inventory } from '@things-factory/warehouse-base'
8
+ import { Inventory, Location } from '@things-factory/warehouse-base'
9
9
 
10
10
  import { WORKSHEET_TYPE } from '../../../constants'
11
11
  import { SellercraftController } from '../../../controllers'
12
12
  import { Worksheet, WorksheetDetail } from '../../../entities'
13
13
  import { fetchExecutingWorksheet } from '../../../utils'
14
+ import { ORDER_STATUS } from '@things-factory/sales-base'
14
15
 
15
16
  export const packingWorksheetResolver = {
16
17
  async packingWorksheet(_: any, { releaseGoodNo }, context: any) {
@@ -23,7 +24,30 @@ export const packingWorksheetResolver = {
23
24
  relations: ['bizplace', 'bizplace.domain']
24
25
  })
25
26
 
27
+ // Find Release Order based on Bin
28
+ if (!releaseGood) {
29
+ const binLocation: Location = await tx.getRepository(Location).findOne({
30
+ where: { domain, name: releaseGoodNo }
31
+ })
32
+
33
+ const qb: SelectQueryBuilder<OrderInventory> = tx.getRepository(OrderInventory).createQueryBuilder('orderInventory')
34
+ qb.innerJoinAndSelect('orderInventory.releaseGood', 'releaseGood')
35
+ .innerJoinAndSelect('releaseGood.bizplace', 'bizplace')
36
+ .innerJoinAndSelect('bizplace.domain', 'domain')
37
+ .where('orderInventory.domain_id = :domainId', { domainId: domain.id })
38
+ .andWhere('orderInventory.status IN (:...orderInventoryStatus)', { orderInventoryStatus: [ORDER_INVENTORY_STATUS.PACKING, ORDER_INVENTORY_STATUS.PACKED] })
39
+ .andWhere('orderInventory.bin_location_id = :locationId', { locationId: binLocation.id })
40
+ .andWhere('releaseGood.status = :status', { status: ORDER_STATUS.PACKING })
41
+
42
+ const orderInventoryByBin = await qb.getOne()
43
+ if (orderInventoryByBin?.releaseGood) {
44
+ releaseGoodNo = orderInventoryByBin.releaseGood.name
45
+ releaseGood = orderInventoryByBin.releaseGood
46
+ }
47
+ }
48
+
26
49
  if (!releaseGood) throw new Error(`Release good dosen't exist.`)
50
+
27
51
  const worksheet: Worksheet = await fetchExecutingWorksheet(
28
52
  domain,
29
53
  releaseGood.bizplace,
@@ -110,6 +134,7 @@ export const packingWorksheetResolver = {
110
134
 
111
135
  return {
112
136
  worksheetInfo: {
137
+ releaseGood,
113
138
  bizplaceName: releaseGood.bizplace.name,
114
139
  refNo: releaseGood.refNo,
115
140
  refNo2: releaseGood.refNo2,
@@ -1,18 +1,19 @@
1
- import { Role } from '@things-factory/auth-base'
2
- import { User } from '@things-factory/auth-base'
3
- import { Domain } from '@things-factory/shell'
1
+ import { EntityManager, In } from 'typeorm'
2
+
3
+ import { Role, User } from '@things-factory/auth-base'
4
4
  import { Bizplace } from '@things-factory/biz-base'
5
5
  import { sendNotification } from '@things-factory/notification'
6
- import { EntityManager, In } from 'typeorm'
7
6
  import {
7
+ DeliveryOrder,
8
8
  ORDER_INVENTORY_STATUS,
9
9
  ORDER_STATUS,
10
10
  ORDER_VAS_STATUS,
11
11
  OrderInventory,
12
- DeliveryOrder,
13
12
  OrderVas,
14
13
  ReleaseGood
15
14
  } from '@things-factory/sales-base'
15
+ import { Domain } from '@things-factory/shell'
16
+
16
17
  import { Worksheet, WorksheetDetail } from '../../../entities'
17
18
 
18
19
  export const pendingCancellationReleaseOrder = {
@@ -46,13 +47,18 @@ export const pendingCancellationReleaseOrder = {
46
47
  }
47
48
  })
48
49
  await tx.getRepository(OrderInventory).save(pickedOIs)
49
- } else if (foundRO.status === ORDER_STATUS.PICKING || foundRO.status === ORDER_STATUS.READY_TO_PICK) {
50
+ } else if (
51
+ foundRO.status === ORDER_STATUS.PICKING ||
52
+ foundRO.status === ORDER_STATUS.READY_TO_PICK ||
53
+ foundRO.status === ORDER_STATUS.PENDING_WORKSHEET
54
+ ) {
50
55
  pickingOIs = targetOIs
51
56
  .filter(
52
57
  (oi: OrderInventory) =>
53
58
  oi.status === ORDER_INVENTORY_STATUS.PICKING ||
54
59
  oi.status === ORDER_INVENTORY_STATUS.READY_TO_PICK ||
55
- oi.status === ORDER_INVENTORY_STATUS.PENDING_SPLIT
60
+ oi.status === ORDER_INVENTORY_STATUS.PENDING_SPLIT ||
61
+ oi.status === ORDER_INVENTORY_STATUS.PENDING_WORKSHEET
56
62
  )
57
63
  .map((targetOI: OrderInventory) => {
58
64
  return {
@@ -7,7 +7,7 @@ import { MarketplaceOrder } from '@things-factory/marketplace-base'
7
7
  import { ORDER_STATUS, ReleaseGood } from '@things-factory/sales-base'
8
8
  import { Domain } from '@things-factory/shell'
9
9
 
10
- import { EcommerceController, PickingWorksheetController, SellercraftController } from '../../../../controllers'
10
+ import { EcommerceController, PickingWorksheetController } from '../../../../controllers'
11
11
  import { Worksheet } from '../../../../entities'
12
12
 
13
13
  export const activatePickingResolver = {
@@ -40,11 +40,6 @@ export async function activatePicking(
40
40
  .getRepository(Sellercraft)
41
41
  .findOne({ domain: worksheet.bizplace.domain, status: SellercraftStatus.ACTIVE })
42
42
 
43
- if (sellercraft) {
44
- const sellercraftCtrl: SellercraftController = new SellercraftController(tx, domain, user)
45
- await sellercraftCtrl.initiateOrderShipment(sellercraft, releaseGood)
46
- }
47
-
48
43
  if (marketplaceStores?.length && !sellercraft) {
49
44
  if (marketplaceStores.some(store => store.isAutoUpdateStockQty)) {
50
45
  const worksheetDetails = worksheet.worksheetDetails
@@ -7,6 +7,7 @@ import { MarketplaceStore, MarketplaceTransporter } from '@things-factory/integr
7
7
  import { Sellercraft, SellercraftStatus } from '@things-factory/integration-sellercraft'
8
8
  import { MarketplaceOrder, MarketplaceOrderItem, MarketplaceOrderShipping } from '@things-factory/marketplace-base'
9
9
  import { ORDER_INVENTORY_STATUS, ORDER_STATUS, OrderInventory, ReleaseGood } from '@things-factory/sales-base'
10
+ import { PartnerSetting, Setting } from '@things-factory/setting-base'
10
11
  import { Domain } from '@things-factory/shell'
11
12
 
12
13
  import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../../../constants'
@@ -83,6 +84,7 @@ export async function completePicking(
83
84
 
84
85
  if (sellercraft) {
85
86
  const sellercraftCtrl: SellercraftController = new SellercraftController(tx, domain, user)
87
+ await sellercraftCtrl.initiateOrderShipment(sellercraft, releaseGood)
86
88
  await sellercraftCtrl.initiateOrderDocument(sellercraft, releaseGood)
87
89
  } else {
88
90
  const companyDomain: Domain = releaseGood.bizplace.company.domain
@@ -187,10 +189,29 @@ export async function completePicking(
187
189
 
188
190
  if (releaseGood.packingOption) {
189
191
  const packingWSCtrl: PackingWorksheetController = new PackingWorksheetController(tx, domain, user)
190
- await packingWSCtrl.generatePackingWorksheet(releaseGoodNo)
192
+
193
+ const directActivatePackingWorksheet: Setting = await tx.getRepository(Setting).findOne({
194
+ where: { domain: domain, category: 'id-rule', name: 'enable-direct-activate-packing-worksheet' }
195
+ })
196
+ const partnerDirectActivatePackingWorksheetSetting: PartnerSetting = await tx
197
+ .getRepository(PartnerSetting)
198
+ .findOne({
199
+ where: { setting: directActivatePackingWorksheet, domain: domain, partnerDomain: releaseGood.bizplace?.domain }
200
+ })
201
+
202
+ let packingWorksheet: Worksheet = await packingWSCtrl.generatePackingWorksheet(releaseGoodNo)
203
+
204
+ if (directActivatePackingWorksheet != undefined && directActivatePackingWorksheet.value.toLowerCase() == 'true') {
205
+ if (partnerDirectActivatePackingWorksheetSetting != undefined) {
206
+ if (partnerDirectActivatePackingWorksheetSetting.value.toLowerCase() == 'true')
207
+ await packingWSCtrl.activatePacking(packingWorksheet.name)
208
+ } else {
209
+ await packingWSCtrl.activatePacking(packingWorksheet.name)
210
+ }
211
+ }
191
212
  } else {
192
213
  // Find Existing Loading Worksheet if any
193
- const existLoadingWorksheet: Worksheet = await tx.getRepository(Worksheet).findOne({
214
+ let existLoadingWorksheet: Worksheet = await tx.getRepository(Worksheet).findOne({
194
215
  where: {
195
216
  releaseGood,
196
217
  type: WORKSHEET_TYPE.LOADING,
@@ -212,9 +233,19 @@ export async function completePicking(
212
233
  const loadingWorksheetDetails: WorksheetDetail[] = loadingWorksheet.worksheetDetails
213
234
  await loadingWSCtrl.activateLoading(loadingWorksheet.name, loadingWorksheetDetails)
214
235
  } else {
215
- throw new Error(
216
- 'Picking completion has been triggered twice, loading worksheet has been generated. Kindly proceed to loading.'
236
+ const loadingWSCtrl: LoadingWorksheetController = new LoadingWorksheetController(tx, domain, user)
237
+ let loadingWorksheet: Worksheet = await loadingWSCtrl.updateLoadingWorksheet(
238
+ releaseGoodNo,
239
+ pickedTargetInventories,
240
+ existLoadingWorksheet
217
241
  )
242
+
243
+ if (!loadingWorksheet.worksheetDetails?.length) {
244
+ loadingWorksheet = await pickingWSCtrl.findWorksheetById(loadingWorksheet.id)
245
+ }
246
+
247
+ const loadingWorksheetDetails: WorksheetDetail[] = loadingWorksheet.worksheetDetails
248
+ await loadingWSCtrl.activateLoading(loadingWorksheet.name, loadingWorksheetDetails)
218
249
  }
219
250
  }
220
251
  }
@@ -0,0 +1,78 @@
1
+ import { EntityManager, getRepository } from 'typeorm'
2
+
3
+ import { User } from '@things-factory/auth-base'
4
+ import { Setting } from '@things-factory/setting-base'
5
+ import { Domain } from '@things-factory/shell'
6
+
7
+ import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../../../constants'
8
+ import { Worksheet } from '../../../../entities'
9
+ import { pickingWorksheet } from '../picking-worksheet'
10
+ import { activatePicking } from './activate-picking'
11
+
12
+ export const fetchAndAssignPickingTaskResolver = {
13
+ async fetchAndAssignPickingTask(_: any, {}, context: any) {
14
+ const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
15
+ const assignee: User = await tx.getRepository(User).findOne(user.id, { relations: ['domains'] })
16
+ if ((assignee?.domains || []).every((userDomain: Domain) => userDomain.id !== domain.id))
17
+ throw new Error('Target user is not belong to current domain')
18
+
19
+ if (!assignee) throw new Error('failed to find target user')
20
+
21
+ let worksheet: Worksheet
22
+ worksheet = await tx.getRepository(Worksheet).findOne({
23
+ relations: ['releaseGood'],
24
+ where: [
25
+ {
26
+ domain,
27
+ type: WORKSHEET_TYPE.PICKING,
28
+ status: WORKSHEET_STATUS.EXECUTING,
29
+ assignee: assignee
30
+ },
31
+ {
32
+ domain,
33
+ type: WORKSHEET_TYPE.PICKING,
34
+ status: WORKSHEET_STATUS.DEACTIVATED,
35
+ assignee: assignee
36
+ }
37
+ ],
38
+ order: {
39
+ name: 'ASC'
40
+ }
41
+ })
42
+
43
+ if (!worksheet) {
44
+ worksheet = await tx.getRepository(Worksheet).findOne({
45
+ relations: ['releaseGood'],
46
+ where: [
47
+ {
48
+ domain,
49
+ type: WORKSHEET_TYPE.PICKING,
50
+ status: WORKSHEET_STATUS.EXECUTING,
51
+ assignee: null
52
+ },
53
+ {
54
+ domain,
55
+ type: WORKSHEET_TYPE.PICKING,
56
+ status: WORKSHEET_STATUS.DEACTIVATED,
57
+ assignee: null
58
+ }
59
+ ]
60
+ })
61
+
62
+ await getRepository(Worksheet).update({ id: worksheet.id }, { assignee: assignee })
63
+ }
64
+
65
+ if (worksheet.status == WORKSHEET_STATUS.DEACTIVATED) await activatePicking(tx, domain, user, worksheet.name)
66
+
67
+ const locationSortingRules: Setting = await tx.getRepository(Setting).findOne({
68
+ where: { domain, name: 'rule-for-picking-product' }
69
+ })
70
+
71
+ const sortingRule = JSON.parse(locationSortingRules.value)
72
+ const locationSortingRule = Object.keys(sortingRule).map(field => {
73
+ return { name: field, desc: sortingRule[field] === 'DESC' }
74
+ })
75
+
76
+ return await pickingWorksheet(domain, worksheet.releaseGood.name, locationSortingRule, tx)
77
+ }
78
+ }
@@ -2,6 +2,7 @@ import { activateBatchPickingResolver } from './activate-batch-picking'
2
2
  import { activatePickingResolver } from './activate-picking'
3
3
  import { assignPickingInventoriesResolver } from './assign-picking-inventories'
4
4
  import { assignPickingWorkerResolver } from './assign-picking-worker'
5
+ import { fetchAndAssignPickingTaskResolver } from './fetch-and-assign-picking-task'
5
6
  import { batchPickingResolver } from './batch-picking'
6
7
  import { completeBatchPickingResolver } from './complete-batch-picking'
7
8
  import { completePickingResolver } from './complete-picking'
@@ -21,5 +22,6 @@ export const Mutations = {
21
22
  ...batchPickingResolver,
22
23
  ...completePickingResolver,
23
24
  ...completeBatchPickingResolver,
24
- ...assignPickingWorkerResolver
25
+ ...assignPickingWorkerResolver,
26
+ ...fetchAndAssignPickingTaskResolver
25
27
  }
@@ -4,9 +4,9 @@ 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 }, context: any) {
7
+ async picking(_: any, { worksheetDetailName, worksheetType, palletId, locationName, releaseQty, binLocation, serialNumber }, context: any) {
8
8
  const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
9
- await picking(tx, domain, user, worksheetDetailName, worksheetType, palletId, locationName, releaseQty)
9
+ await picking(tx, domain, user, worksheetDetailName, worksheetType, palletId, locationName, releaseQty, binLocation, serialNumber)
10
10
  }
11
11
  }
12
12
 
@@ -18,8 +18,10 @@ export async function picking(
18
18
  worksheetType: string,
19
19
  palletId: string,
20
20
  locationName: string,
21
- releaseQty: number
21
+ releaseQty: number,
22
+ binLocation?: string,
23
+ serialNumber?: string
22
24
  ) {
23
25
  const worksheetController: PickingWorksheetController = new PickingWorksheetController(tx, domain, user)
24
- await worksheetController.picking(worksheetDetailName, worksheetType, palletId, locationName, releaseQty)
26
+ await worksheetController.picking(worksheetDetailName, worksheetType, palletId, locationName, releaseQty, binLocation, serialNumber)
25
27
  }
@@ -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 },
9
+ { worksheetDetailName, worksheetType, productBarcode, cartonId, binLocation, serialNumber },
10
10
  context: any
11
11
  ) {
12
12
  const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
@@ -18,7 +18,8 @@ export const scanProductPickingResolver = {
18
18
  worksheetType,
19
19
  productBarcode,
20
20
  cartonId,
21
- binLocation
21
+ binLocation,
22
+ serialNumber
22
23
  )
23
24
  }
24
25
  }
@@ -31,7 +32,8 @@ export async function scanProductPicking(
31
32
  worksheetType: string,
32
33
  productBarcode: string,
33
34
  cartonId: string,
34
- binLocation?: string
35
+ binLocation?: string,
36
+ serialNumber?: string
35
37
  ) {
36
38
  const worksheetController: PickingWorksheetController = new PickingWorksheetController(tx, domain, user)
37
39
  await worksheetController.scanProductPicking(
@@ -39,6 +41,7 @@ export async function scanProductPicking(
39
41
  worksheetType,
40
42
  productBarcode,
41
43
  cartonId,
42
- binLocation
44
+ binLocation,
45
+ serialNumber
43
46
  )
44
47
  }
@@ -1,8 +1,8 @@
1
- import { createQueryBuilder, getRepository, SelectQueryBuilder } from 'typeorm'
1
+ import { EntityManager, In, SelectQueryBuilder } from 'typeorm'
2
2
 
3
3
  import { ORDER_INVENTORY_STATUS, OrderInventory, ReleaseGood } from '@things-factory/sales-base'
4
4
  import { Domain } from '@things-factory/shell'
5
- import { Inventory } from '@things-factory/warehouse-base'
5
+ import { Inventory, Location } from '@things-factory/warehouse-base'
6
6
 
7
7
  import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../../constants'
8
8
  import { WorksheetDetail } from '../../../entities'
@@ -10,71 +10,111 @@ import { fetchExecutingWorksheet } from '../../../utils'
10
10
 
11
11
  export const pickingWorksheetResolver = {
12
12
  async pickingWorksheet(_: any, { releaseGoodNo, locationSortingRules }, context: any) {
13
- const { domain }: { domain: Domain } = context.state
14
- const releaseGood: ReleaseGood = await getRepository(ReleaseGood).findOne({
15
- where: { domain, name: releaseGoodNo /*status: ORDER_STATUS.PICKING*/ },
16
- relations: ['bizplace', 'bizplace.domain']
17
- })
18
- if (!releaseGood) throw new Error(`Couldn't find picking worksheet by order no (${releaseGoodNo})`)
19
-
20
- const worksheet = await fetchExecutingWorksheet(
21
- domain,
22
- releaseGood.bizplace,
23
- ['bizplace'],
24
- WORKSHEET_TYPE.PICKING,
25
- releaseGood
26
- )
13
+ const { domain, tx }: { domain: Domain; tx: EntityManager } = context.state
27
14
 
28
- const qb: SelectQueryBuilder<WorksheetDetail> = createQueryBuilder(WorksheetDetail, 'WSD')
29
- qb.leftJoinAndSelect('WSD.targetInventory', 'T_INV')
30
- .leftJoinAndSelect('T_INV.inventory', 'INV')
31
- .leftJoinAndSelect('T_INV.product', 'PROD')
32
- .leftJoinAndSelect('INV.location', 'LOC')
15
+ return await pickingWorksheet(domain, releaseGoodNo, locationSortingRules, tx)
16
+ }
17
+ }
33
18
 
34
- if (locationSortingRules?.length > 0) {
35
- locationSortingRules.forEach((rule: { name: string; desc: boolean }) => {
36
- qb.addOrderBy(`LOC.${rule.name}`, rule.desc ? 'DESC' : 'ASC')
37
- })
38
- }
19
+ export async function pickingWorksheet(
20
+ domain: Domain,
21
+ releaseGoodNo: String,
22
+ locationSortingRules: any,
23
+ tx: EntityManager
24
+ ) {
25
+ let releaseGood: ReleaseGood = await tx.getRepository(ReleaseGood).findOne({
26
+ where: { domain, name: releaseGoodNo /*status: ORDER_STATUS.PICKING*/ },
27
+ relations: ['bizplace', 'bizplace.domain']
28
+ })
39
29
 
40
- const worksheetDetails: WorksheetDetail[] = await qb
41
- .where('"WSD"."worksheet_id" = :worksheetId', { worksheetId: worksheet.id })
42
- .andWhere('"WSD"."status" != :status', { status: WORKSHEET_STATUS.REPLACED })
43
- .andWhere('"T_INV"."status" != :t_invstatus', { t_invstatus: ORDER_INVENTORY_STATUS.CANCELLED })
44
- .getMany()
30
+ // Find Release Order based on Bin
31
+ if (!releaseGood) {
32
+ const binLocation: Location = await tx.getRepository(Location).findOne({
33
+ where: { domain, name: releaseGoodNo }
34
+ })
45
35
 
46
- return {
47
- worksheetInfo: {
48
- bizplaceName: releaseGood.bizplace.name,
49
- partnerDomainId: releaseGood.bizplace?.domain.id,
50
- startedAt: worksheet.startedAt,
51
- refNo: releaseGood.refNo,
52
- refNo2: releaseGood.refNo2,
53
- releaseGood
36
+ const orderInventoryByBin: OrderInventory = await tx.getRepository(OrderInventory).findOne({
37
+ where: {
38
+ domain,
39
+ binLocation,
40
+ status: In([ORDER_INVENTORY_STATUS.PICKING, ORDER_INVENTORY_STATUS.PICKED])
41
+ },
42
+ order: {
43
+ createdAt: 'ASC'
54
44
  },
55
- worksheetDetailInfos: worksheetDetails.map(async (pickingWSD: WorksheetDetail) => {
56
- const targetInventory: OrderInventory = pickingWSD.targetInventory
57
- const inventory: Inventory = targetInventory.inventory
58
- return {
59
- name: pickingWSD.name,
60
- palletId: inventory?.palletId,
61
- cartonId: inventory?.cartonId,
62
- batchId: inventory?.batchId,
63
- batchIdRef: inventory?.batchIdRef,
64
- product: inventory?.product,
65
- qty: inventory?.qty,
66
- releaseQty: targetInventory.releaseQty,
67
- pickedQty: targetInventory.pickedQty,
68
- status: pickingWSD.status,
69
- description: pickingWSD.description,
70
- targetName: targetInventory.name,
71
- packingType: inventory?.packingType,
72
- packingSize: inventory?.packingSize,
73
- expirationDate: inventory?.expirationDate,
74
- location: inventory?.location,
75
- relatedOrderInv: targetInventory
76
- }
77
- })
45
+ relations: ['releaseGood', 'releaseGood.bizplace', 'releaseGood.bizplace.domain']
46
+ })
47
+
48
+ if (orderInventoryByBin?.releaseGood) {
49
+ releaseGoodNo = orderInventoryByBin.releaseGood.name
50
+ releaseGood = orderInventoryByBin.releaseGood
78
51
  }
79
52
  }
53
+
54
+ if (!releaseGood) throw new Error(`Couldn't find picking worksheet by order no (${releaseGoodNo})`)
55
+
56
+ const worksheet = await fetchExecutingWorksheet(
57
+ domain,
58
+ releaseGood.bizplace,
59
+ ['bizplace'],
60
+ WORKSHEET_TYPE.PICKING,
61
+ releaseGood,
62
+ tx
63
+ )
64
+
65
+ const qb: SelectQueryBuilder<WorksheetDetail> = tx.createQueryBuilder(WorksheetDetail, 'WSD')
66
+ qb.leftJoinAndSelect('WSD.targetInventory', 'T_INV')
67
+ .leftJoinAndSelect('T_INV.binLocation', 'BIN_LOC')
68
+ .leftJoinAndSelect('T_INV.inventory', 'INV')
69
+ .leftJoinAndSelect('T_INV.product', 'PROD')
70
+ .leftJoinAndSelect('INV.location', 'LOC')
71
+
72
+ if (locationSortingRules?.length > 0) {
73
+ locationSortingRules.forEach((rule: { name: string; desc: boolean }) => {
74
+ qb.addOrderBy(`LOC.${rule.name}`, rule.desc ? 'DESC' : 'ASC')
75
+ })
76
+ }
77
+
78
+ qb.addOrderBy(`PROD.name`, 'ASC')
79
+
80
+ const worksheetDetails: WorksheetDetail[] = await qb
81
+ .where('"WSD"."worksheet_id" = :worksheetId', { worksheetId: worksheet.id })
82
+ .andWhere('"WSD"."status" != :status', { status: WORKSHEET_STATUS.REPLACED })
83
+ .andWhere('"T_INV"."status" != :t_invstatus', { t_invstatus: ORDER_INVENTORY_STATUS.CANCELLED })
84
+ .getMany()
85
+
86
+ return {
87
+ worksheetInfo: {
88
+ bizplaceName: releaseGood.bizplace.name,
89
+ partnerDomainId: releaseGood.bizplace?.domain.id,
90
+ startedAt: worksheet.startedAt,
91
+ refNo: releaseGood.refNo,
92
+ refNo2: releaseGood.refNo2,
93
+ releaseGood
94
+ },
95
+ worksheetDetailInfos: worksheetDetails.map(async (pickingWSD: WorksheetDetail) => {
96
+ const targetInventory: OrderInventory = pickingWSD.targetInventory
97
+ const inventory: Inventory = targetInventory.inventory
98
+ return {
99
+ name: pickingWSD.name,
100
+ palletId: inventory?.palletId,
101
+ cartonId: inventory?.cartonId,
102
+ batchId: inventory?.batchId,
103
+ batchIdRef: inventory?.batchIdRef,
104
+ product: inventory?.product,
105
+ qty: inventory?.qty,
106
+ binLocation: targetInventory?.binLocation || '',
107
+ releaseQty: targetInventory.releaseQty,
108
+ pickedQty: targetInventory.pickedQty,
109
+ status: pickingWSD.status,
110
+ description: pickingWSD.description,
111
+ targetName: targetInventory.name,
112
+ packingType: inventory?.packingType,
113
+ packingSize: inventory?.packingSize,
114
+ expirationDate: inventory?.expirationDate,
115
+ location: inventory?.location,
116
+ relatedOrderInv: targetInventory
117
+ }
118
+ })
119
+ }
80
120
  }
@@ -1,8 +1,10 @@
1
+ import { getRepository, In } from 'typeorm'
2
+
1
3
  import { ArrivalNotice, ReturnOrder } from '@things-factory/sales-base'
2
4
  import { Setting } from '@things-factory/setting-base'
3
5
  import { Domain } from '@things-factory/shell'
4
6
  import { Location, LOCATION_STATUS, LOCATION_TYPE, Warehouse } from '@things-factory/warehouse-base'
5
- import { In, getRepository, Not } from 'typeorm'
7
+
6
8
  import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../../constants'
7
9
  import { Worksheet, WorksheetDetail } from '../../../entities'
8
10
 
@@ -69,7 +71,7 @@ export async function recommendLocationLevel1(
69
71
  domain,
70
72
  warehouse,
71
73
  status: LOCATION_STATUS.EMPTY,
72
- type: Not(In([LOCATION_TYPE.BUFFER, LOCATION_TYPE.BIN]))
74
+ type: In([LOCATION_TYPE.SHELF, LOCATION_TYPE.FLOOR]) // should only recommend these types
73
75
  },
74
76
  order,
75
77
  take: optCnt
@@ -32,7 +32,7 @@ export const unloadedInventories = {
32
32
  const returnOrder: ReturnOrder = foundWorksheetDetails[0].worksheet.returnOrder
33
33
  const customerBizplace: Bizplace = foundWorksheetDetails[0].bizplace
34
34
  if (arrivalNotice) {
35
- return await getRepository(Inventory).find({
35
+ let foundInv = await getRepository(Inventory).find({
36
36
  where: {
37
37
  domain,
38
38
  bizplace: customerBizplace,
@@ -44,6 +44,15 @@ export const unloadedInventories = {
44
44
  },
45
45
  relations: ['reusablePallet', 'product', 'bizplace']
46
46
  })
47
+ const items = foundInv.map((inv: Inventory) => {
48
+ const expirationDate: Date = inv.expirationDate ? new Date(inv.expirationDate) : null
49
+ return {
50
+ ...inv,
51
+ expirationDate: expirationDate
52
+ }
53
+ })
54
+
55
+ return items
47
56
  }
48
57
 
49
58
  if (returnOrder) {