@things-factory/worksheet-base 4.3.137 → 4.3.139

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 (70) hide show
  1. package/dist-server/controllers/inbound/unloading-worksheet-controller.js +59 -73
  2. package/dist-server/controllers/inbound/unloading-worksheet-controller.js.map +1 -1
  3. package/dist-server/controllers/inspect/cycle-count-worksheet-controller.js +2 -4
  4. package/dist-server/controllers/inspect/cycle-count-worksheet-controller.js.map +1 -1
  5. package/dist-server/controllers/outbound/loading-worksheet-controller.js +5 -4
  6. package/dist-server/controllers/outbound/loading-worksheet-controller.js.map +1 -1
  7. package/dist-server/controllers/outbound/packing-worksheet-controller.js +23 -23
  8. package/dist-server/controllers/outbound/packing-worksheet-controller.js.map +1 -1
  9. package/dist-server/controllers/outbound/picking-worksheet-controller.js +157 -120
  10. package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
  11. package/dist-server/controllers/outbound/sorting-worksheet-controller.js +14 -14
  12. package/dist-server/controllers/outbound/sorting-worksheet-controller.js.map +1 -1
  13. package/dist-server/controllers/vas/vas-worksheet-controller.js +1 -2
  14. package/dist-server/controllers/vas/vas-worksheet-controller.js.map +1 -1
  15. package/dist-server/controllers/worksheet-controller.js +7 -7
  16. package/dist-server/controllers/worksheet-controller.js.map +1 -1
  17. package/dist-server/entities/index.js +3 -2
  18. package/dist-server/entities/index.js.map +1 -1
  19. package/dist-server/entities/warehouse-bizplace-onhand-inventory.js +29 -62
  20. package/dist-server/entities/warehouse-bizplace-onhand-inventory.js.map +1 -1
  21. package/dist-server/graphql/resolvers/worksheet/batch-picking-worksheet.js +6 -0
  22. package/dist-server/graphql/resolvers/worksheet/batch-picking-worksheet.js.map +1 -1
  23. package/dist-server/graphql/resolvers/worksheet/confirm-cancellation-release-order.js +1 -2
  24. package/dist-server/graphql/resolvers/worksheet/confirm-cancellation-release-order.js.map +1 -1
  25. package/dist-server/graphql/resolvers/worksheet/cycle-count-adjustment.js +6 -6
  26. package/dist-server/graphql/resolvers/worksheet/cycle-count-adjustment.js.map +1 -1
  27. package/dist-server/graphql/resolvers/worksheet/find-sorting-release-orders-by-task-no.js +2 -2
  28. package/dist-server/graphql/resolvers/worksheet/find-sorting-release-orders-by-task-no.js.map +1 -1
  29. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js +2 -1
  30. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js.map +1 -1
  31. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +4 -1
  32. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
  33. package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js +3 -2
  34. package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js.map +1 -1
  35. package/dist-server/graphql/resolvers/worksheet/transfer.js +9 -9
  36. package/dist-server/graphql/resolvers/worksheet/transfer.js.map +1 -1
  37. package/dist-server/graphql/resolvers/worksheet/unloaded-inventories.js +1 -1
  38. package/dist-server/graphql/resolvers/worksheet/unloaded-inventories.js.map +1 -1
  39. package/dist-server/graphql/resolvers/worksheet/vas-transactions/common-utils.js +17 -17
  40. package/dist-server/graphql/resolvers/worksheet/vas-transactions/common-utils.js.map +1 -1
  41. package/dist-server/graphql/resolvers/worksheet-detail/regenerate-release-good-worksheet-details.js +4 -4
  42. package/dist-server/graphql/resolvers/worksheet-detail/regenerate-release-good-worksheet-details.js.map +1 -1
  43. package/dist-server/graphql/types/worksheet-detail/index.js +1 -0
  44. package/dist-server/graphql/types/worksheet-detail/index.js.map +1 -1
  45. package/dist-server/utils/inventory-util.js +1 -98
  46. package/dist-server/utils/inventory-util.js.map +1 -1
  47. package/package.json +16 -16
  48. package/server/controllers/inbound/unloading-worksheet-controller.ts +74 -86
  49. package/server/controllers/inspect/cycle-count-worksheet-controller.ts +2 -4
  50. package/server/controllers/outbound/loading-worksheet-controller.ts +13 -3
  51. package/server/controllers/outbound/packing-worksheet-controller.ts +32 -37
  52. package/server/controllers/outbound/picking-worksheet-controller.ts +186 -150
  53. package/server/controllers/outbound/sorting-worksheet-controller.ts +14 -21
  54. package/server/controllers/vas/vas-worksheet-controller.ts +2 -2
  55. package/server/controllers/worksheet-controller.ts +15 -10
  56. package/server/entities/index.ts +2 -2
  57. package/server/entities/warehouse-bizplace-onhand-inventory.ts +29 -63
  58. package/server/graphql/resolvers/worksheet/batch-picking-worksheet.ts +6 -0
  59. package/server/graphql/resolvers/worksheet/confirm-cancellation-release-order.ts +1 -2
  60. package/server/graphql/resolvers/worksheet/cycle-count-adjustment.ts +2 -2
  61. package/server/graphql/resolvers/worksheet/find-sorting-release-orders-by-task-no.ts +2 -2
  62. package/server/graphql/resolvers/worksheet/inventories-by-pallet.ts +3 -1
  63. package/server/graphql/resolvers/worksheet/packing-worksheet.ts +4 -2
  64. package/server/graphql/resolvers/worksheet/picking-worksheet.ts +3 -2
  65. package/server/graphql/resolvers/worksheet/transfer.ts +18 -16
  66. package/server/graphql/resolvers/worksheet/unloaded-inventories.ts +1 -1
  67. package/server/graphql/resolvers/worksheet/vas-transactions/common-utils.ts +3 -2
  68. package/server/graphql/resolvers/worksheet-detail/regenerate-release-good-worksheet-details.ts +4 -1
  69. package/server/graphql/types/worksheet-detail/index.ts +1 -0
  70. package/server/utils/inventory-util.ts +1 -126
@@ -1,6 +1,6 @@
1
1
  import { In, IsNull } from 'typeorm'
2
2
 
3
- import { Product, ProductDetail } from '@things-factory/product-base'
3
+ import { Product, ProductDetail, ProductBarcode } from '@things-factory/product-base'
4
4
  import {
5
5
  ORDER_INVENTORY_STATUS,
6
6
  ORDER_STATUS,
@@ -85,9 +85,8 @@ export class SortingWorksheetController extends VasWorksheetController {
85
85
  .innerJoinAndSelect('worksheet.worksheetDetails', 'worksheetDetails')
86
86
  .innerJoinAndSelect('worksheetDetails.targetInventory', 'targetInventory')
87
87
  .innerJoinAndSelect('targetInventory.product', 'product')
88
- .innerJoinAndSelect('product.productDetails', 'productDetails')
89
- .leftJoinAndSelect('productDetails.childProductDetail', 'childProductDetail')
90
88
  .leftJoinAndSelect('targetInventory.orderProduct', 'orderProduct')
89
+ .leftJoinAndSelect('targetInventory.productDetail', 'productDetail')
91
90
  .leftJoinAndSelect('targetInventory.bizplace', 'bizplace')
92
91
  .leftJoinAndSelect('targetInventory.inventory', 'inventory')
93
92
  .leftJoinAndSelect('targetInventory.releaseGood', 'releaseGood')
@@ -96,7 +95,6 @@ export class SortingWorksheetController extends VasWorksheetController {
96
95
  .andWhere('worksheet.type = :type', { type: WORKSHEET_TYPE.SORTING })
97
96
  .andWhere('worksheet.status = :status', { status: WORKSHEET_STATUS.EXECUTING })
98
97
  .andWhere('releaseGood.name = :rg', { rg: releaseGoodNo })
99
- .andWhere('productDetails.gtin = :gtin', { gtin: productBarcode })
100
98
  .getOne()
101
99
 
102
100
  if (!worksheet) {
@@ -105,17 +103,15 @@ export class SortingWorksheetController extends VasWorksheetController {
105
103
 
106
104
  const worksheetDetails = worksheet.worksheetDetails
107
105
  const orderInventories: OrderInventory[] = worksheetDetails.map((wsd: WorksheetDetail) => wsd.targetInventory)
108
- const productDetails: ProductDetail[] = orderInventories[0].product.productDetails
109
- const scannedProductDetail: ProductDetail = productDetails.find(itm => itm.gtin == productBarcode)
106
+ const scanProductBarcode: ProductBarcode = await this.trxMgr.getRepository(ProductBarcode).findOne({
107
+ where: { gtin: productBarcode },
108
+ relations: ['productDetail', 'productDetail.childProductDetail']
109
+ })
110
+ const scannedProductDetail: ProductDetail = scanProductBarcode.productDetail
110
111
  const scannedChildProductDetail: ProductDetail = scannedProductDetail.childProductDetail
111
112
 
112
113
  //find matching order inventories based on scanned product detail
113
- let matchingOIs = orderInventories.filter(
114
- oi =>
115
- oi.packingType == scannedProductDetail.packingType &&
116
- oi.packingSize == scannedProductDetail.packingSize &&
117
- oi.uom == scannedProductDetail.uom
118
- )
114
+ let matchingOIs = orderInventories.filter(oi => oi.productDetail.id == scannedProductDetail.id)
119
115
 
120
116
  let productDetail = scannedProductDetail
121
117
 
@@ -125,12 +121,7 @@ export class SortingWorksheetController extends VasWorksheetController {
125
121
  if (!scannedChildProductDetail) {
126
122
  throw new Error(this.ERROR_MSG.FIND.NO_RESULT(productBarcode))
127
123
  }
128
- matchingOIs = orderInventories.filter(
129
- oi =>
130
- oi.packingType == scannedChildProductDetail.packingType &&
131
- oi.packingSize == scannedChildProductDetail.packingSize &&
132
- oi.uom == scannedChildProductDetail.uom
133
- )
124
+ matchingOIs = orderInventories.filter(oi => oi.productDetail.id == scannedChildProductDetail.id)
134
125
 
135
126
  productDetail = scannedChildProductDetail
136
127
 
@@ -295,7 +286,8 @@ export class SortingWorksheetController extends VasWorksheetController {
295
286
  'worksheetDetails.targetInventory.inventory.product',
296
287
  'worksheetDetails.targetInventory.inventory.product.productDetails',
297
288
  'worksheetDetails.targetInventory.inventory.product.productDetails.product',
298
- 'worksheetDetails.targetInventory.releaseGood'
289
+ 'worksheetDetails.targetInventory.releaseGood',
290
+ 'worksheetDetails.targetInventory.productDetail'
299
291
  ]
300
292
  })
301
293
 
@@ -315,6 +307,7 @@ export class SortingWorksheetController extends VasWorksheetController {
315
307
  const inventory: Inventory = matchingOI.inventory
316
308
  const releaseGood: ReleaseGood = matchingOI.releaseGood
317
309
  const product: Product = matchingOI.inventory.product
310
+ const productDetail: ProductDetail = matchingOI.productDetail
318
311
  const packingType: string = matchingOI.packingType
319
312
  const packingSize: number = matchingOI.packingSize
320
313
 
@@ -324,8 +317,7 @@ export class SortingWorksheetController extends VasWorksheetController {
324
317
  }
325
318
 
326
319
  let foundSerialNumber: InventoryItem = await this.trxMgr.getRepository(InventoryItem).findOne({
327
- where: { domain: this.domain, serialNumber: serialNumber, product },
328
- relations: ['product', 'inventory']
320
+ where: { domain: this.domain, serialNumber: serialNumber, productDetail }
329
321
  })
330
322
 
331
323
  if (foundSerialNumber) {
@@ -349,6 +341,7 @@ export class SortingWorksheetController extends VasWorksheetController {
349
341
  inventoryItem.source = INVENTORY_ITEM_SOURCE.OUTBOUND
350
342
  inventoryItem.outboundOrderId = releaseGood.id
351
343
  inventoryItem.product = product
344
+ inventoryItem.productDetail = productDetail
352
345
  inventoryItem.inventory = inventory
353
346
  inventoryItem.domain = this.domain
354
347
 
@@ -22,7 +22,8 @@ import {
22
22
  InventoryNoGenerator,
23
23
  Location,
24
24
  LOCATION_TYPE,
25
- Warehouse
25
+ Warehouse,
26
+ generateInventoryHistory
26
27
  } from '@things-factory/warehouse-base'
27
28
 
28
29
  import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../constants'
@@ -36,7 +37,6 @@ import {
36
37
  RefOrderType
37
38
  } from '../../graphql/resolvers/worksheet/vas-transactions'
38
39
  import { PackingUnits } from '../../graphql/resolvers/worksheet/vas-transactions/interfaces/repackaging'
39
- import { generateInventoryHistory } from '../../utils'
40
40
  import { ReferenceOrderType, WorksheetController } from '../worksheet-controller'
41
41
 
42
42
  type CompleteTransactionType = (trxMgr: EntityManager, orderVas: OrderVas, user: User) => Promise<void>
@@ -19,11 +19,17 @@ import {
19
19
  VasOrder
20
20
  } from '@things-factory/sales-base'
21
21
  import { Domain } from '@things-factory/shell'
22
- import { Inventory, INVENTORY_STATUS, InventoryItem, Pallet } from '@things-factory/warehouse-base'
22
+ import {
23
+ Inventory,
24
+ INVENTORY_STATUS,
25
+ InventoryItem,
26
+ Pallet,
27
+ generateInventoryHistory
28
+ } from '@things-factory/warehouse-base'
23
29
 
24
30
  import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../constants'
25
31
  import { Worksheet, WorksheetDetail } from '../entities'
26
- import { generateInventoryHistory, WorksheetNoGenerator } from '../utils'
32
+ import { WorksheetNoGenerator } from '../utils'
27
33
 
28
34
  export type ReferenceOrderType = ArrivalNotice | ReleaseGood | VasOrder | InventoryCheck | DeliveryOrder | ReturnOrder
29
35
  export type OrderTargetTypes = OrderProduct | OrderInventory | OrderVas
@@ -590,8 +596,7 @@ export class WorksheetController {
590
596
  return worksheet
591
597
  }
592
598
 
593
- // @chernhaoee I think the naming of this function is not proper. Seems like it should be something like "updateLoadingWorksheet" since the logic targets only Loading Order Target
594
- async updateWorksheet(
599
+ async updateLoadWorksheet(
595
600
  worksheetType: string,
596
601
  refOrder: ReferenceOrderType,
597
602
  worksheet: Worksheet,
@@ -1006,11 +1011,9 @@ export class WorksheetController {
1006
1011
  async getChildQty(
1007
1012
  productDetails: ProductDetail[],
1008
1013
  productBarcode: string,
1009
- orderProductDetail: ProductDetail
1014
+ orderProductDetail: ProductDetail,
1015
+ scannedProductDetail: ProductDetail
1010
1016
  ): Promise<number> {
1011
- const scannedProductDetail: ProductDetail = productDetails.find(
1012
- (productDetail: ProductDetail) => productDetail.gtin === productBarcode
1013
- )
1014
1017
  let hasChildRelation: boolean = Boolean(scannedProductDetail?.childProductDetail)
1015
1018
  let hasMatchingChild: boolean
1016
1019
  let childQty: number
@@ -1061,16 +1064,18 @@ export class WorksheetController {
1061
1064
  WITH RECURSIVE cte as (
1062
1065
  select * from (
1063
1066
  select pd2.product_id as "productId", pd2.id, pd2.packing_size as "packingSize",
1064
- pd2.packing_type as "packingType", pd2.uom as "uom", (pd2.uom_value * $2::float) as "uomValue", $2::float as "qty", pd2.gtin
1067
+ pd2.packing_type as "packingType", pd2.uom as "uom", (pd2.uom_value * $2::float) as "uomValue", $2::float as "qty", pb.gtin
1065
1068
  from product_details pd
1066
1069
  inner join product_details pd2 on pd.product_id = pd2.product_id and pd.packing_type = pd2.packing_type and pd.packing_size = pd2.packing_size and pd.uom = pd2.uom
1070
+ inner join product_barcodes pb on pb.product_detail_id = pd2.id
1067
1071
  where pd.id = $1
1068
1072
  ) as dt
1069
1073
  union all
1070
1074
  select pd.product_id as "productId", pd.id, pd.packing_size as "packingSize",
1071
1075
  pd.packing_type as "packingType", pd.uom,
1072
- dt1.qty * pd.packing_size * pd.uom_value as "uomValue", dt1.qty * pd.packing_size as "qty", pd.gtin
1076
+ dt1.qty * pd.packing_size * pd.uom_value as "uomValue", dt1.qty * pd.packing_size as "qty", pb.gtin
1073
1077
  from product_details pd
1078
+ inner join product_barcodes pb on pb.product_detail_id = pd.id
1074
1079
  inner join cte dt1 on dt1.id = pd.child_product_detail_id
1075
1080
  where pd.deleted_at is null
1076
1081
  )
@@ -1,8 +1,8 @@
1
+ import { WarehouseBizplaceOnhandInventory } from './warehouse-bizplace-onhand-inventory'
1
2
  import { Worksheet } from './worksheet'
2
3
  import { WorksheetDetail } from './worksheet-detail'
3
4
  import { WorksheetMovement } from './worksheet-movement'
4
- import { WarehouseBizplaceOnhandInventory } from './warehouse-bizplace-onhand-inventory'
5
5
 
6
6
  export const entities = [Worksheet, WorksheetDetail, WorksheetMovement, WarehouseBizplaceOnhandInventory]
7
7
 
8
- export { Worksheet, WorksheetDetail, WorksheetMovement }
8
+ export { WarehouseBizplaceOnhandInventory, Worksheet, WorksheetDetail, WorksheetMovement }
@@ -2,55 +2,23 @@ import { ViewColumn, ViewEntity } from 'typeorm'
2
2
 
3
3
  @ViewEntity({
4
4
  expression: `
5
- select d.name as "domainName", b.name as "bizplaceName", src.* from (
6
- WITH oi as (
7
- select
8
- oi.domain_id,
9
- oi.bizplace_id,
10
- SUM(oi.release_qty) AS release_qty,
11
- SUM(oi.release_uom_value) AS release_uom_value,
12
- oi.batch_id,
13
- oi.batch_id_ref,
14
- oi.product_id,
15
- oi.packing_type,
16
- oi.packing_size,
17
- oi.uom
18
- FROM
19
- order_inventories oi
20
- WHERE
21
- (oi.status = 'PENDING' or oi.status = 'PENDING_RECEIVE' or oi.status = 'PENDING_WORKSHEET' or oi.status = 'PENDING_SPLIT')
22
- AND oi.batch_id NOTNULL
23
- AND oi.product_id NOTNULL
24
- AND oi.packing_type NOTNULL
25
- AND oi.packing_size NOTNULL
26
- AND oi.inventory_id IS NULL
27
- GROUP BY
28
- oi.domain_id,
29
- oi.bizplace_id,
30
- oi.batch_id,
31
- oi.batch_id_ref,
32
- oi.product_id,
33
- oi.packing_type,
34
- oi.packing_size,
35
- oi.uom
36
- )
5
+ select d.name as "domain_name", b.name as "bizplace_name", src.* from (
37
6
  -- SINGLE ITEM INVENTORY QUERY
38
7
  select
39
- i.domain_id as "domainId",
40
- i.bizplace_id as "bizplaceId",
41
- i.packing_type as "packingType",
42
- i.packing_size as "packingSize",
8
+ i.domain_id as "domain_id",
9
+ i.bizplace_id as "bizplace_id",
10
+ i.packing_type as "packing_type",
11
+ i.packing_size as "packing_size",
43
12
  i.uom,
44
- i.product_id as "productId",
45
- null as "productBundleId",
46
- COALESCE(SUM(COALESCE(i.qty, 0)) - SUM(COALESCE(i.locked_qty, 0)) - MAX(COALESCE(oi.release_qty, 0))) AS "remainQty",
47
- COALESCE(SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)), 0) AS "remainUomValue",
13
+ i.product_id as "product_id",
14
+ null as "product_bundle_id",
15
+ COALESCE(SUM(COALESCE(i.qty, 0)) - SUM(COALESCE(i.locked_qty, 0))) AS "remain_qty",
16
+ COALESCE(SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0))) AS "remain_uom_value",
48
17
  COALESCE(sum(COALESCE(i.qty, 0::double precision))) AS "qty",
49
- COALESCE(sum(COALESCE(i.uom_value, 0::double precision))) AS "uomValue",
50
- 'SINGLE' AS "groupType"
18
+ COALESCE(sum(COALESCE(i.uom_value, 0::double precision))) AS "uom_value",
19
+ 'SINGLE' AS "group_type"
51
20
  FROM inventories i
52
21
  INNER JOIN locations l2 ON i.location_id = l2.id AND i.domain_id = l2.domain_id AND l2.type NOT IN ('QUARANTINE', 'RESERVE')
53
- LEFT JOIN oi ON i.batch_id = oi.batch_id AND i.product_id = oi.product_id AND i.packing_type = oi.packing_type AND i.packing_size = oi.packing_size AND i.uom = oi.uom
54
22
  WHERE i.status = 'STORED'
55
23
  GROUP by
56
24
  i.domain_id,
@@ -62,29 +30,28 @@ import { ViewColumn, ViewEntity } from 'typeorm'
62
30
  union all
63
31
  -- BUNDLE ITEM INVENTORY QUERY
64
32
  SELECT
65
- pbs.domain_id as "domainId",
66
- pbs.bizplace_id as "bizplaceId",
67
- pb.packing_type as "packingType",
68
- pb.packing_size as "packingSize",
33
+ pbs.domain_id as "domain_id",
34
+ pbs.bizplace_id as "bizplace_id",
35
+ pb.packing_type as "packing_type",
36
+ pb.packing_size as "packing_size",
69
37
  'UNIT' AS "uom",
70
- null as "productId",
71
- pb.id AS "productBundleId",
72
- COALESCE(MIN(FLOOR(pbs."availableQty")),0) AS "remainQty",
73
- COALESCE(MIN(FLOOR(pbs."availableUomValue")),0) AS "remainUomValue",
38
+ null as "product_id",
39
+ pb.id AS "product_bundle_id",
40
+ COALESCE(MIN(FLOOR(pbs."available_qty")),0) AS "remain_qty",
41
+ COALESCE(MIN(FLOOR(pbs."available_uom_value")),0) AS "remain_uom_value",
74
42
  COALESCE(MIN(FLOOR(pbs."qty")), 0::double precision) AS "qty",
75
- COALESCE(MIN(FLOOR(pbs."uomValue")), 0::double precision) AS "uomValue",
76
- 'BUNDLE' AS "groupType"
43
+ COALESCE(MIN(FLOOR(pbs."uom_value")), 0::double precision) AS "uom_value",
44
+ 'BUNDLE' AS "group_type"
77
45
  FROM product_bundles pb
78
46
  INNER JOIN (
79
47
  SELECT i.domain_id, i.bizplace_id, pbs.product_id, pbs.product_bundle_id, min(pbs.bundle_qty),
80
- (SUM(COALESCE(i.qty, 0)) - SUM(COALESCE(i.locked_qty, 0)) - MAX(COALESCE(oi.release_qty, 0))) / min(pbs.bundle_qty) AS "availableQty",
81
- (SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0))) / min(pbs.bundle_qty) AS "availableUomValue",
48
+ (SUM(COALESCE(i.qty, 0)) - SUM(COALESCE(i.locked_qty, 0))) / min(pbs.bundle_qty) AS "available_qty",
49
+ (SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0))) / min(pbs.bundle_qty) AS "available_uom_value",
82
50
  (sum(COALESCE(i.qty, 0::double precision))) / min(pbs.bundle_qty)::double precision AS "qty",
83
- (sum(COALESCE(i.uom_value, 0::double precision))) / min(pbs.bundle_qty)::double precision AS "uomValue"
51
+ (sum(COALESCE(i.uom_value, 0::double precision))) / min(pbs.bundle_qty)::double precision AS "uom_value"
84
52
  FROM product_bundle_settings pbs
85
53
  LEFT JOIN inventories i ON i.product_id = pbs.product_id AND i.status = 'STORED'
86
- INNER JOIN locations l ON i.location_id = l.id AND i.domain_id = l.domain_id AND l.type NOT IN ('QUARANTINE', 'RESERVE')
87
- LEFT JOIN oi ON oi.product_id = i.product_id
54
+ INNER JOIN locations l ON i.location_id = l.id AND i.domain_id = l.domain_id AND l.type NOT IN ('QUARANTINE', 'RESERVE')
88
55
  GROUP by
89
56
  i.domain_id,
90
57
  i.bizplace_id,
@@ -101,14 +68,13 @@ import { ViewColumn, ViewEntity } from 'typeorm'
101
68
  pb.id
102
69
  )
103
70
  AS src
104
- inner join domains d on d.id = src."domainId"
105
- inner join bizplaces b on b.id = src."bizplaceId"
106
- where src."remainQty" >= 0
71
+ inner join domains d on d.id = src."domain_id"
72
+ inner join bizplaces b on b.id = src."bizplace_id"
73
+ where src."remain_qty" >= 0
107
74
  and src."qty" > 0
108
- order by src."domainId"
75
+ order by src."domain_id"
109
76
  `
110
77
  })
111
-
112
78
  export class WarehouseBizplaceOnhandInventory {
113
79
  @ViewColumn()
114
80
  domainName: string
@@ -32,6 +32,7 @@ export const batchPickingWorksheetResolver = {
32
32
  .addSelect('"PROD".name', 'productName')
33
33
  .addSelect('"PROD".sku', 'productSku')
34
34
  .addSelect('"PROD".description', 'productDescription')
35
+ .addSelect('"PROD_DET".id', 'productDetailId')
35
36
  .addSelect('"INV".qty', 'qty')
36
37
  .addSelect('"INV".packing_type', 'packingType')
37
38
  .addSelect('"INV".packing_size', 'packingSize')
@@ -47,6 +48,7 @@ export const batchPickingWorksheetResolver = {
47
48
  .leftJoin('WSD.targetInventory', 'T_INV')
48
49
  .leftJoin('T_INV.inventory', 'INV')
49
50
  .leftJoin('T_INV.product', 'PROD')
51
+ .leftJoin('T_INV.productDetail', 'PROD_DET')
50
52
  .leftJoin('T_INV.binLocation', 'BIN_LOC')
51
53
  .leftJoin('INV.location', 'LOC')
52
54
  .where('"WSD"."worksheet_id" = :worksheetId', { worksheetId: worksheet.id })
@@ -64,6 +66,7 @@ export const batchPickingWorksheetResolver = {
64
66
  .addGroupBy('"PROD".name')
65
67
  .addGroupBy('"PROD".sku')
66
68
  .addGroupBy('"PROD".description')
69
+ .addGroupBy('"PROD_DET".id')
67
70
  .addGroupBy('"T_INV".batch_id')
68
71
  .addGroupBy('"T_INV".packing_type')
69
72
  .addGroupBy('BIN_LOC.name')
@@ -126,6 +129,9 @@ export const batchPickingWorksheetResolver = {
126
129
  name: item?.productName,
127
130
  description: item?.productDescription,
128
131
  sku: item?.productSku
132
+ },
133
+ productDetail: {
134
+ id: item?.productDetailId
129
135
  }
130
136
  }
131
137
  }
@@ -13,10 +13,9 @@ import {
13
13
  ReleaseGood
14
14
  } from '@things-factory/sales-base'
15
15
  import { Domain } from '@things-factory/shell'
16
- import { Inventory, INVENTORY_STATUS, INVENTORY_TRANSACTION_TYPE, Location } from '@things-factory/warehouse-base'
16
+ import { Inventory, INVENTORY_STATUS, INVENTORY_TRANSACTION_TYPE, Location, generateInventoryHistory } from '@things-factory/warehouse-base'
17
17
 
18
18
  import { Worksheet, WorksheetDetail } from '../../../entities'
19
- import { generateInventoryHistory } from '../../../utils'
20
19
 
21
20
  export const confirmCancellationReleaseOrder = {
22
21
  async confirmCancellationReleaseOrder(_: any, { name }, context: any) {
@@ -4,12 +4,12 @@ import { User } from '@things-factory/auth-base'
4
4
  import { Sellercraft, SellercraftStatus } from '@things-factory/integration-sellercraft'
5
5
  import { InventoryCheck, ORDER_INVENTORY_STATUS, ORDER_STATUS, OrderInventory } from '@things-factory/sales-base'
6
6
  import { Domain } from '@things-factory/shell'
7
- import { Inventory, INVENTORY_STATUS, INVENTORY_TRANSACTION_TYPE, Location } from '@things-factory/warehouse-base'
7
+ import { Inventory, INVENTORY_STATUS, INVENTORY_TRANSACTION_TYPE, Location, generateInventoryHistory } from '@things-factory/warehouse-base'
8
8
 
9
9
  import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../../constants'
10
10
  import { SellercraftController } from '../../../controllers'
11
11
  import { Worksheet, WorksheetDetail } from '../../../entities'
12
- import { generateInventoryHistory, switchLocationStatus } from '../../../utils'
12
+ import { switchLocationStatus } from '../../../utils'
13
13
 
14
14
  export const cycleCountAdjustmentResolver = {
15
15
  async cycleCountAdjustment(_: any, { cycleCountNo }, context: any) {
@@ -19,7 +19,7 @@ export const findSortingReleaseOrdersByTaskNoResolver = {
19
19
  async findSortingReleaseOrdersByTaskNo(_: any, { taskNo }, context: any) {
20
20
  const { domain, tx, user }: { domain: Domain; tx: EntityManager; user: User } = context.state
21
21
  let task = await tx.getRepository(WorksheetEntity).findOne({
22
- where: { taskNo, type: WORKSHEET_TYPE.SORTING },
22
+ where: { taskNo, type: WORKSHEET_TYPE.SORTING, domain },
23
23
  relations: ['bizplace', 'bizplace.domain', 'worksheetDetails']
24
24
  })
25
25
 
@@ -51,7 +51,7 @@ export const findSortingReleaseOrdersByTaskNoResolver = {
51
51
  if (orderInventoryByBin?.releaseGood_id) {
52
52
  taskNo = orderInventoryByBin.ws_task_no
53
53
  task = await tx.getRepository(WorksheetEntity).findOne({
54
- where: { taskNo, status: WORKSHEET_STATUS.DEACTIVATED, type: WORKSHEET_TYPE.SORTING }
54
+ where: { taskNo, status: WORKSHEET_STATUS.DEACTIVATED, type: WORKSHEET_TYPE.SORTING, domain }
55
55
  })
56
56
  } else {
57
57
  throw new Error(`Bin do not have any batch picking order.`)
@@ -40,6 +40,7 @@ export const inventoriesByPalletResolver = {
40
40
  qb.leftJoinAndSelect('iv.domain', 'domain')
41
41
  .leftJoinAndSelect('iv.bizplace', 'bizplace')
42
42
  .leftJoinAndSelect('iv.product', 'product')
43
+ .leftJoinAndSelect('iv.productDetail', 'productDetail')
43
44
  .leftJoinAndSelect('iv.warehouse', 'warehouse')
44
45
  .leftJoinAndSelect('iv.location', 'location')
45
46
  .leftJoinAndSelect('iv.creator', 'creator')
@@ -134,7 +135,8 @@ export const inventoriesByPalletResolver = {
134
135
  productName: item.product.name,
135
136
  productSKU: item.product.sku,
136
137
  productBrand: item.product.brand,
137
- productId: item.product.id
138
+ productId: item.product.id,
139
+ productDetailId: item.productDetail.id
138
140
  }
139
141
  })
140
142
  )
@@ -14,7 +14,7 @@ import { PartnerSetting, Setting } from '@things-factory/setting-base'
14
14
  import { Domain } from '@things-factory/shell'
15
15
  import { Inventory, Location } from '@things-factory/warehouse-base'
16
16
 
17
- import { WORKSHEET_TYPE } from '../../../constants'
17
+ import { WORKSHEET_TYPE, WORKSHEET_STATUS } from '../../../constants'
18
18
  import { PackingWorksheetController, SellercraftController } from '../../../controllers'
19
19
  import { Worksheet, WorksheetDetail } from '../../../entities'
20
20
 
@@ -104,7 +104,9 @@ export const packingWorksheetResolver = {
104
104
 
105
105
  if (!worksheet) throw new Error('Worksheet does not exist')
106
106
 
107
- if (worksheet.status === 'DEACTIVATED') {
107
+ if (worksheet.status === WORKSHEET_STATUS.DONE) {
108
+ throw new Error(`Worksheet is completed already`)
109
+ } else if (worksheet.status === WORKSHEET_STATUS.DEACTIVATED) {
108
110
  const packingWSCtrl: PackingWorksheetController = new PackingWorksheetController(tx, domain, user)
109
111
 
110
112
  const directActivatePackingWorksheet: Setting = await tx.getRepository(Setting).findOne({
@@ -76,6 +76,7 @@ export async function pickingWorksheet(
76
76
  .leftJoinAndSelect('T_INV.binLocation', 'BIN_LOC')
77
77
  .leftJoinAndSelect('T_INV.inventory', 'INV')
78
78
  .leftJoinAndSelect('T_INV.product', 'PROD')
79
+ .leftJoinAndSelect('T_INV.productDetail', 'PROD_DET')
79
80
  .leftJoinAndSelect('INV.location', 'LOC')
80
81
 
81
82
  if (locationSortingRules?.length > 0) {
@@ -114,8 +115,8 @@ export async function pickingWorksheet(
114
115
  const inventoryChangesCount: number = await tx.getRepository(InventoryChange).count({
115
116
  where: {
116
117
  inventory: inventory.id,
117
- status: "PENDING",
118
- transactionType: "MISSING"
118
+ status: 'PENDING',
119
+ transactionType: 'MISSING'
119
120
  },
120
121
  relations: ['inventory', 'product']
121
122
  })
@@ -1,38 +1,36 @@
1
+ import { EntityManager } from 'typeorm'
2
+
1
3
  import { User } from '@things-factory/auth-base'
2
4
  import { Bizplace } from '@things-factory/biz-base'
5
+ import { ORDER_PRODUCT_STATUS, OrderInventory } from '@things-factory/sales-base'
3
6
  import { Domain } from '@things-factory/shell'
4
- import { OrderInventory, ORDER_PRODUCT_STATUS } from '@things-factory/sales-base'
5
7
  import {
6
8
  Inventory,
7
- InventoryHistory,
8
- InventoryNoGenerator,
9
9
  INVENTORY_STATUS,
10
- INVENTORY_TRANSACTION_TYPE
10
+ INVENTORY_TRANSACTION_TYPE,
11
+ InventoryHistory,
12
+ InventoryNoGenerator
11
13
  } from '@things-factory/warehouse-base'
12
- import { EntityManager } from 'typeorm'
14
+
13
15
  import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../../constants'
14
16
  import { Worksheet, WorksheetDetail } from '../../../entities'
15
17
 
16
18
  export const transfer = {
17
19
  async transfer(_: any, { palletId, toPalletId, qty }, context: any) {
18
- const {
19
- tx,
20
- domain,
21
- bizplace,
22
- user
23
- }: { tx: EntityManager; domain: Domain; bizplace: Bizplace; user: User } = context.state
20
+ const { tx, domain, bizplace, user }: { tx: EntityManager; domain: Domain; bizplace: Bizplace; user: User } =
21
+ context.state
24
22
 
25
23
  // 1. get to inventory
26
24
  let toInventory: Inventory = await tx.getRepository(Inventory).findOne({
27
25
  where: { domain: domain, palletId: toPalletId },
28
- relations: ['bizplace', 'product', 'warehouse', 'location']
26
+ relations: ['bizplace', 'product', 'productDetail', 'warehouse', 'location']
29
27
  })
30
28
  if (!toInventory) throw new Error(`to pallet doesn't exists`)
31
29
 
32
30
  // 2. get from inventory
33
31
  let fromInventory: Inventory = await tx.getRepository(Inventory).findOne({
34
32
  where: { domain: domain, palletId },
35
- relations: ['bizplace', 'product', 'warehouse', 'location']
33
+ relations: ['bizplace', 'product', 'productDetail', 'warehouse', 'location']
36
34
  })
37
35
  if (!fromInventory) throw new Error(`from pallet doesn't exists`)
38
36
  if (toInventory.batchId !== fromInventory.batchId) throw new Error(`Can't transfer to different batch`)
@@ -74,6 +72,7 @@ export const transfer = {
74
72
  domain: domain,
75
73
  name: InventoryNoGenerator.inventoryHistoryName(),
76
74
  product: toInventory.product,
75
+ productDetail: toInventory.productDetail,
77
76
  warehouse: toInventory.warehouse,
78
77
  location: toInventory.location,
79
78
  seq: toInventory.lastSeq,
@@ -97,7 +96,7 @@ export const transfer = {
97
96
 
98
97
  fromInventory = await tx.getRepository(Inventory).findOne({
99
98
  where: { id: fromInventory.id },
100
- relations: ['bizplace', 'product', 'warehouse', 'location']
99
+ relations: ['bizplace', 'product', 'productDetail', 'warehouse', 'location']
101
100
  })
102
101
 
103
102
  // - add inventory history
@@ -105,6 +104,7 @@ export const transfer = {
105
104
  ...fromInventory,
106
105
  name: InventoryNoGenerator.inventoryHistoryName(),
107
106
  product: fromInventory.product,
107
+ productDetail: fromInventory.productDetail,
108
108
  warehouse: fromInventory.warehouse,
109
109
  location: fromInventory.location,
110
110
  seq: fromInventory.lastSeq,
@@ -131,7 +131,7 @@ export const transfer = {
131
131
 
132
132
  toInventory = await tx.getRepository(Inventory).findOne({
133
133
  where: { id: toInventory.id },
134
- relations: ['bizplace', 'product', 'warehouse', 'location']
134
+ relations: ['bizplace', 'product', 'productDetail', 'warehouse', 'location']
135
135
  })
136
136
  // - add inventory history
137
137
  delete toInventory.id
@@ -140,6 +140,7 @@ export const transfer = {
140
140
  domain,
141
141
  name: InventoryNoGenerator.inventoryHistoryName(),
142
142
  product: toInventory.product,
143
+ productDetail: toInventory.productDetail,
143
144
  warehouse: toInventory.warehouse,
144
145
  location: toInventory.location,
145
146
  seq: toInventory.lastSeq,
@@ -157,7 +158,7 @@ export const transfer = {
157
158
 
158
159
  fromInventory = await tx.getRepository(Inventory).findOne({
159
160
  where: { id: fromInventory.id },
160
- relations: ['bizplace', 'product', 'warehouse', 'location']
161
+ relations: ['bizplace', 'product', 'productDetail', 'warehouse', 'location']
161
162
  })
162
163
 
163
164
  // - add inventory history
@@ -165,6 +166,7 @@ export const transfer = {
165
166
  ...fromInventory,
166
167
  name: InventoryNoGenerator.inventoryHistoryName(),
167
168
  product: fromInventory.product,
169
+ productDetail: fromInventory.productDetail,
168
170
  warehouse: fromInventory.warehouse,
169
171
  location: fromInventory.location,
170
172
  seq: fromInventory.lastSeq,
@@ -44,7 +44,7 @@ export const unloadedInventories = {
44
44
  orderProductId: In(foundWorksheetDetails.map(wsd => wsd.targetProduct.id)),
45
45
  status: In([INVENTORY_STATUS.UNLOADED, INVENTORY_STATUS.CHECKED])
46
46
  },
47
- relations: ['reusablePallet', 'product', 'bizplace']
47
+ relations: ['reusablePallet', 'product', 'bizplace', 'inventoryItems']
48
48
  })
49
49
  const items = foundInv.map((inv: Inventory) => {
50
50
  const expirationDate: Date = inv.expirationDate ? new Date(inv.expirationDate) : null
@@ -19,12 +19,13 @@ import {
19
19
  InventoryNoGenerator,
20
20
  Location,
21
21
  Pallet,
22
- Warehouse
22
+ Warehouse,
23
+ generateInventoryHistory
23
24
  } from '@things-factory/warehouse-base'
24
25
 
25
26
  import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../../../constants'
26
27
  import { Worksheet, WorksheetDetail } from '../../../../entities'
27
- import { generateInventoryHistory, WorksheetNoGenerator } from '../../../../utils'
28
+ import { WorksheetNoGenerator } from '../../../../utils'
28
29
  import {
29
30
  OperationGuideInterface,
30
31
  PackingUnits,
@@ -19,7 +19,7 @@ import { WorksheetNoGenerator } from '../../../utils'
19
19
  export const regenerateReleaseGoodWorksheetDetailsResolver = {
20
20
  async regenerateReleaseGoodWorksheetDetails(
21
21
  _: any,
22
- { worksheetNo, batchId, productId, packingType, packingSize, orderProductId, worksheetDetails },
22
+ { worksheetNo, batchId, productId, productDetailId, packingType, packingSize, orderProductId, worksheetDetails },
23
23
  context: any
24
24
  ): Promise<void> {
25
25
  const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
@@ -30,6 +30,7 @@ export const regenerateReleaseGoodWorksheetDetailsResolver = {
30
30
  worksheetNo,
31
31
  batchId,
32
32
  productId,
33
+ productDetailId,
33
34
  packingType,
34
35
  packingSize,
35
36
  orderProductId,
@@ -45,6 +46,7 @@ export async function regenerateReleaseGoodWorksheetDetails(
45
46
  worksheetNo: string,
46
47
  batchId: string,
47
48
  productId: string,
49
+ productDetailId: string,
48
50
  packingType: string,
49
51
  packingSize: number,
50
52
  orderProductId: string,
@@ -115,6 +117,7 @@ export async function regenerateReleaseGoodWorksheetDetails(
115
117
  batchIdRef: inventory.batchIdRef,
116
118
  status: ORDER_INVENTORY_STATUS.READY_TO_PICK,
117
119
  product: await tx.getRepository(Product).findOne(productId),
120
+ productDetail: productDetailId,
118
121
  packingType,
119
122
  packingSize,
120
123
  orderProduct: targetProduct,
@@ -32,6 +32,7 @@ export const Mutation = /* GraphQL */ `
32
32
  worksheetNo: String!
33
33
  batchId: String!
34
34
  productId: String!
35
+ productDetailId: String!
35
36
  packingType: String!
36
37
  packingSize: Float!
37
38
  orderProductId: String!