@things-factory/sales-base 3.6.46 → 3.6.50

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 (94) hide show
  1. package/dist-server/entities/index.js +28 -22
  2. package/dist-server/entities/index.js.map +1 -1
  3. package/dist-server/entities/order-reverse-kitting.js +156 -0
  4. package/dist-server/entities/order-reverse-kitting.js.map +1 -0
  5. package/dist-server/entities/reverse-kitting-order.js +82 -0
  6. package/dist-server/entities/reverse-kitting-order.js.map +1 -0
  7. package/dist-server/graphql/resolvers/index.js +14 -11
  8. package/dist-server/graphql/resolvers/index.js.map +1 -1
  9. package/dist-server/graphql/resolvers/order-reverse-kitting/index.js +8 -0
  10. package/dist-server/graphql/resolvers/order-reverse-kitting/index.js.map +1 -0
  11. package/dist-server/graphql/resolvers/order-reverse-kitting/order-reverse-kitting.js +18 -0
  12. package/dist-server/graphql/resolvers/order-reverse-kitting/order-reverse-kitting.js.map +1 -0
  13. package/dist-server/graphql/resolvers/order-reverse-kitting/order-reverse-kittings.js +14 -0
  14. package/dist-server/graphql/resolvers/order-reverse-kitting/order-reverse-kittings.js.map +1 -0
  15. package/dist-server/graphql/resolvers/reverse-kitting-order/activate-reverse-kitting-order.js +31 -0
  16. package/dist-server/graphql/resolvers/reverse-kitting-order/activate-reverse-kitting-order.js.map +1 -0
  17. package/dist-server/graphql/resolvers/reverse-kitting-order/cancel-reverse-kitting-order.js +31 -0
  18. package/dist-server/graphql/resolvers/reverse-kitting-order/cancel-reverse-kitting-order.js.map +1 -0
  19. package/dist-server/graphql/resolvers/reverse-kitting-order/complete-reverse-kitting-order.js +34 -0
  20. package/dist-server/graphql/resolvers/reverse-kitting-order/complete-reverse-kitting-order.js.map +1 -0
  21. package/dist-server/graphql/resolvers/reverse-kitting-order/confirm-reverse-kitting-order.js +31 -0
  22. package/dist-server/graphql/resolvers/reverse-kitting-order/confirm-reverse-kitting-order.js.map +1 -0
  23. package/dist-server/graphql/resolvers/reverse-kitting-order/delete-reverse-kitting-order.js +30 -0
  24. package/dist-server/graphql/resolvers/reverse-kitting-order/delete-reverse-kitting-order.js.map +1 -0
  25. package/dist-server/graphql/resolvers/reverse-kitting-order/execute-reverse-kitting.js +94 -0
  26. package/dist-server/graphql/resolvers/reverse-kitting-order/execute-reverse-kitting.js.map +1 -0
  27. package/dist-server/graphql/resolvers/reverse-kitting-order/executing-reverse-kitting-order.js +37 -0
  28. package/dist-server/graphql/resolvers/reverse-kitting-order/executing-reverse-kitting-order.js.map +1 -0
  29. package/dist-server/graphql/resolvers/reverse-kitting-order/generate-reverse-kitting-order.js +34 -0
  30. package/dist-server/graphql/resolvers/reverse-kitting-order/generate-reverse-kitting-order.js.map +1 -0
  31. package/dist-server/graphql/resolvers/reverse-kitting-order/index.js +17 -0
  32. package/dist-server/graphql/resolvers/reverse-kitting-order/index.js.map +1 -0
  33. package/dist-server/graphql/resolvers/reverse-kitting-order/reverse-kitting-inventories.js +35 -0
  34. package/dist-server/graphql/resolvers/reverse-kitting-order/reverse-kitting-inventories.js.map +1 -0
  35. package/dist-server/graphql/resolvers/reverse-kitting-order/reverse-kitting-order.js +32 -0
  36. package/dist-server/graphql/resolvers/reverse-kitting-order/reverse-kitting-order.js.map +1 -0
  37. package/dist-server/graphql/resolvers/reverse-kitting-order/reverse-kitting-orders.js +25 -0
  38. package/dist-server/graphql/resolvers/reverse-kitting-order/reverse-kitting-orders.js.map +1 -0
  39. package/dist-server/graphql/types/index.js +22 -14
  40. package/dist-server/graphql/types/index.js.map +1 -1
  41. package/dist-server/graphql/types/order-reverse-kitting/index.js +14 -0
  42. package/dist-server/graphql/types/order-reverse-kitting/index.js.map +1 -0
  43. package/dist-server/graphql/types/order-reverse-kitting/new-order-reverse-kitting.js +31 -0
  44. package/dist-server/graphql/types/order-reverse-kitting/new-order-reverse-kitting.js.map +1 -0
  45. package/dist-server/graphql/types/order-reverse-kitting/order-reverse-kitting-list.js +14 -0
  46. package/dist-server/graphql/types/order-reverse-kitting/order-reverse-kitting-list.js.map +1 -0
  47. package/dist-server/graphql/types/order-reverse-kitting/order-reverse-kitting-patch.js +32 -0
  48. package/dist-server/graphql/types/order-reverse-kitting/order-reverse-kitting-patch.js.map +1 -0
  49. package/dist-server/graphql/types/order-reverse-kitting/order-reverse-kitting.js +37 -0
  50. package/dist-server/graphql/types/order-reverse-kitting/order-reverse-kitting.js.map +1 -0
  51. package/dist-server/graphql/types/reverse-kitting-order/index.js +47 -0
  52. package/dist-server/graphql/types/reverse-kitting-order/index.js.map +1 -0
  53. package/dist-server/graphql/types/reverse-kitting-order/new-reverse-kitting-order.js +17 -0
  54. package/dist-server/graphql/types/reverse-kitting-order/new-reverse-kitting-order.js.map +1 -0
  55. package/dist-server/graphql/types/reverse-kitting-order/reverse-kitting-order-list.js +14 -0
  56. package/dist-server/graphql/types/reverse-kitting-order/reverse-kitting-order-list.js.map +1 -0
  57. package/dist-server/graphql/types/reverse-kitting-order/reverse-kitting-order-patch.js +17 -0
  58. package/dist-server/graphql/types/reverse-kitting-order/reverse-kitting-order-patch.js.map +1 -0
  59. package/dist-server/graphql/types/reverse-kitting-order/reverse-kitting-order.js +24 -0
  60. package/dist-server/graphql/types/reverse-kitting-order/reverse-kitting-order.js.map +1 -0
  61. package/dist-server/utils/inventory-util.js +145 -1
  62. package/dist-server/utils/inventory-util.js.map +1 -1
  63. package/package.json +11 -11
  64. package/server/entities/index.ts +33 -27
  65. package/server/entities/order-reverse-kitting.ts +116 -0
  66. package/server/entities/reverse-kitting-order.ts +68 -0
  67. package/server/graphql/resolvers/index.ts +14 -11
  68. package/server/graphql/resolvers/order-reverse-kitting/index.ts +9 -0
  69. package/server/graphql/resolvers/order-reverse-kitting/order-reverse-kitting.ts +19 -0
  70. package/server/graphql/resolvers/order-reverse-kitting/order-reverse-kittings.ts +16 -0
  71. package/server/graphql/resolvers/reverse-kitting-order/activate-reverse-kitting-order.ts +47 -0
  72. package/server/graphql/resolvers/reverse-kitting-order/cancel-reverse-kitting-order.ts +47 -0
  73. package/server/graphql/resolvers/reverse-kitting-order/complete-reverse-kitting-order.ts +59 -0
  74. package/server/graphql/resolvers/reverse-kitting-order/confirm-reverse-kitting-order.ts +47 -0
  75. package/server/graphql/resolvers/reverse-kitting-order/delete-reverse-kitting-order.ts +41 -0
  76. package/server/graphql/resolvers/reverse-kitting-order/execute-reverse-kitting.ts +125 -0
  77. package/server/graphql/resolvers/reverse-kitting-order/executing-reverse-kitting-order.ts +40 -0
  78. package/server/graphql/resolvers/reverse-kitting-order/generate-reverse-kitting-order.ts +60 -0
  79. package/server/graphql/resolvers/reverse-kitting-order/index.ts +28 -0
  80. package/server/graphql/resolvers/reverse-kitting-order/reverse-kitting-inventories.ts +37 -0
  81. package/server/graphql/resolvers/reverse-kitting-order/reverse-kitting-order.ts +34 -0
  82. package/server/graphql/resolvers/reverse-kitting-order/reverse-kitting-orders.ts +30 -0
  83. package/server/graphql/types/index.ts +22 -14
  84. package/server/graphql/types/order-reverse-kitting/index.ts +13 -0
  85. package/server/graphql/types/order-reverse-kitting/new-order-reverse-kitting.ts +25 -0
  86. package/server/graphql/types/order-reverse-kitting/order-reverse-kitting-list.ts +8 -0
  87. package/server/graphql/types/order-reverse-kitting/order-reverse-kitting-patch.ts +26 -0
  88. package/server/graphql/types/order-reverse-kitting/order-reverse-kitting.ts +31 -0
  89. package/server/graphql/types/reverse-kitting-order/index.ts +46 -0
  90. package/server/graphql/types/reverse-kitting-order/new-reverse-kitting-order.ts +11 -0
  91. package/server/graphql/types/reverse-kitting-order/reverse-kitting-order-list.ts +8 -0
  92. package/server/graphql/types/reverse-kitting-order/reverse-kitting-order-patch.ts +11 -0
  93. package/server/graphql/types/reverse-kitting-order/reverse-kitting-order.ts +18 -0
  94. package/server/utils/inventory-util.ts +227 -3
@@ -0,0 +1,37 @@
1
+ import { getRepository } from 'typeorm'
2
+
3
+ import { Bizplace } from '@things-factory/biz-base'
4
+ import { Domain } from '@things-factory/shell'
5
+ import { Inventory, INVENTORY_STATUS } from '@things-factory/warehouse-base'
6
+
7
+ import { ORDER_VAS_STATUS } from '../../../constants'
8
+ import { OrderReverseKitting, ReverseKittingOrder } from '../../../entities'
9
+
10
+ export const reverseKittingInventoriesResolver = {
11
+ async reverseKittingInventories(_: any, { orderReverseKittingName }, context: any) {
12
+ const { domain }: { domain: Domain } = context.state
13
+ const foundOrderReverseKitting: OrderReverseKitting = await getRepository(OrderReverseKitting).findOne({
14
+ where: {
15
+ domain,
16
+ name: orderReverseKittingName,
17
+ status: ORDER_VAS_STATUS.PROCESSING
18
+ },
19
+ relations: ['bizplace', 'reverseKittingOrder', 'inventory']
20
+ })
21
+
22
+ if (!foundOrderReverseKitting) return
23
+
24
+ const reverseKittingOrder: ReverseKittingOrder = foundOrderReverseKitting.reverseKittingOrder
25
+ const customerBizplace: Bizplace = foundOrderReverseKitting.bizplace
26
+ return await getRepository(Inventory).find({
27
+ where: {
28
+ domain,
29
+ bizplace: customerBizplace,
30
+ refOrderId: reverseKittingOrder.id,
31
+ orderVasId: foundOrderReverseKitting.id,
32
+ status: INVENTORY_STATUS.STORED
33
+ },
34
+ relations: ['product', 'bizplace']
35
+ })
36
+ }
37
+ }
@@ -0,0 +1,34 @@
1
+ import { getRepository, In } from 'typeorm'
2
+
3
+ import { User } from '@things-factory/auth-base'
4
+ import { getPermittedBizplaceIds } from '@things-factory/biz-base'
5
+ import { Domain } from '@things-factory/shell'
6
+
7
+ import { ReverseKittingOrder } from '../../../entities'
8
+
9
+ export const reverseKittingOrderResolver = {
10
+ async reverseKittingOrder(_: any, { name }, context: any) {
11
+ const { domain, user }: { domain: Domain; user: User } = context.state
12
+
13
+ return await getRepository(ReverseKittingOrder).findOne({
14
+ where: {
15
+ domain,
16
+ name,
17
+ bizplace: In(await getPermittedBizplaceIds(domain, user))
18
+ },
19
+ relations: [
20
+ 'domain',
21
+ 'bizplace',
22
+ 'orderReverseKittings',
23
+ 'orderReverseKittings.vas',
24
+ 'orderReverseKittings.inventory',
25
+ 'orderReverseKittings.inventory.product',
26
+ 'orderReverseKittings.inventory.location',
27
+ 'orderReverseKittings.inventory.warehouse',
28
+ 'orderReverseKittings.targetProduct',
29
+ 'creator',
30
+ 'updater'
31
+ ]
32
+ })
33
+ }
34
+ }
@@ -0,0 +1,30 @@
1
+ import { getRepository, In } from 'typeorm'
2
+
3
+ import { User } from '@things-factory/auth-base'
4
+ import { getPermittedBizplaceIds } from '@things-factory/biz-base'
5
+ import { convertListParams, Domain, ListParam } from '@things-factory/shell'
6
+
7
+ import { ReverseKittingOrder } from '../../../entities'
8
+
9
+ export const reverseKittingOrdersResolver = {
10
+ async reverseKittingOrders(_: any, params: ListParam, context: any) {
11
+ const { domain, user }: { domain: Domain; user: User } = context.state
12
+
13
+ const convertedParams = convertListParams(params)
14
+ convertedParams.where.bizplace = In(await getPermittedBizplaceIds(domain, user))
15
+
16
+ const [items, total] = await getRepository(ReverseKittingOrder).findAndCount({
17
+ ...convertedParams,
18
+ relations: [
19
+ 'domain',
20
+ 'bizplace',
21
+ 'orderReverseKittings',
22
+ 'orderReverseKittings.inventory',
23
+ 'orderReverseKittings.inventory.product',
24
+ 'creator',
25
+ 'updater'
26
+ ]
27
+ })
28
+ return { items, total }
29
+ }
30
+ }
@@ -1,26 +1,28 @@
1
- import * as RetailReplenishmentOrder from './retail-replenishment-order'
2
- import * as TransferOrder from './transfer-order'
3
1
  import * as ArrivalNotice from './arrival-notice'
2
+ import * as Claim from './claim'
3
+ import * as ClaimDetail from './claim-detail'
4
+ import * as ClaimOrder from './claim-order'
4
5
  import * as CollectionOrder from './collection-order'
5
6
  import * as DeliveryOrder from './delivery-order'
7
+ import * as GoodsReceivalNote from './goods-receival-note'
8
+ import * as InventoryCheck from './inventory-check'
6
9
  import * as Invoice from './invoice'
10
+ import * as JobSheet from './job-sheet'
11
+ import * as OrderInventory from './order-inventory'
7
12
  import * as OrderProduct from './order-product'
13
+ import * as OrderReverseKitting from './order-reverse-kitting'
8
14
  import * as OrderVas from './order-vas'
9
- import * as OrderInventory from './order-inventory'
10
- import * as InventoryCheck from './inventory-check'
11
- import * as JobSheet from './job-sheet'
15
+ import * as Others from './others'
12
16
  import * as PurchaseOrder from './purchase-order'
13
17
  import * as PurchaseOrderOtherCharge from './purchase-order-other-charge'
14
- import * as ShippingOrder from './shipping-order'
15
18
  import * as ReleaseGood from './release-good'
19
+ import * as RetailReplenishmentOrder from './retail-replenishment-order'
16
20
  import * as ReturnOrder from './return-order'
21
+ import * as ReverseKittingOrder from './reverse-kitting-order'
22
+ import * as ShippingOrder from './shipping-order'
23
+ import * as TransferOrder from './transfer-order'
17
24
  import * as Vas from './vas'
18
- import * as Claim from './claim'
19
- import * as ClaimDetail from './claim-detail'
20
- import * as ClaimOrder from './claim-order'
21
25
  import * as VasOrder from './vas-order'
22
- import * as GoodsReceivalNote from './goods-receival-note'
23
- import * as Others from './others'
24
26
 
25
27
  export const queries = [
26
28
  RetailReplenishmentOrder.Query,
@@ -45,7 +47,9 @@ export const queries = [
45
47
  OrderInventory.Query,
46
48
  VasOrder.Query,
47
49
  GoodsReceivalNote.Query,
48
- Others.Query
50
+ Others.Query,
51
+ OrderReverseKitting.Query,
52
+ ReverseKittingOrder.Query
49
53
  ]
50
54
 
51
55
  export const mutations = [
@@ -70,7 +74,9 @@ export const mutations = [
70
74
  ClaimOrder.Mutation,
71
75
  OrderInventory.Mutation,
72
76
  VasOrder.Mutation,
73
- GoodsReceivalNote.Mutation
77
+ GoodsReceivalNote.Mutation,
78
+ ReverseKittingOrder.Mutation,
79
+ OrderReverseKitting.Mutation
74
80
  ]
75
81
 
76
82
  export const types = [
@@ -96,5 +102,7 @@ export const types = [
96
102
  ...OrderInventory.Types,
97
103
  ...VasOrder.Types,
98
104
  ...GoodsReceivalNote.Types,
99
- ...Others.Types
105
+ ...Others.Types,
106
+ ...ReverseKittingOrder.Types,
107
+ ...OrderReverseKitting.Types
100
108
  ]
@@ -0,0 +1,13 @@
1
+ import { NewOrderReverseKitting } from './new-order-reverse-kitting'
2
+ import { OrderReverseKitting } from './order-reverse-kitting'
3
+ import { OrderReverseKittingList } from './order-reverse-kitting-list'
4
+ import { OrderReverseKittingPatch } from './order-reverse-kitting-patch'
5
+
6
+ export const Mutation = ``
7
+
8
+ export const Query = `
9
+ orderReverseKittings(filters: [Filter], pagination: Pagination, sortings: [Sorting]): OrderReverseKittingList
10
+ orderReverseKitting(reverseKitting: ObjectRef!, name: String!): OrderReverseKitting
11
+ `
12
+
13
+ export const Types = [OrderReverseKitting, NewOrderReverseKitting, OrderReverseKittingPatch, OrderReverseKittingList]
@@ -0,0 +1,25 @@
1
+ import gql from 'graphql-tag'
2
+
3
+ export const NewOrderReverseKitting = gql`
4
+ input NewOrderReverseKitting {
5
+ name: String
6
+ set: Int
7
+ targetType: String
8
+ targetBatchId: String
9
+ targetProduct: ObjectRef
10
+ otherTarget: String
11
+ qty: Int
12
+ uomValue: Float
13
+ batchId: String
14
+ productName: String
15
+ packingType: String
16
+ reverseKittingOrder: ObjectRef
17
+ inventory: ObjectRef
18
+ vas: ObjectRef
19
+ type: String
20
+ operationGuide: String
21
+ remark: String
22
+ description: String
23
+ status: String
24
+ }
25
+ `
@@ -0,0 +1,8 @@
1
+ import gql from 'graphql-tag'
2
+
3
+ export const OrderReverseKittingList = gql`
4
+ type OrderReverseKittingList {
5
+ items: [OrderReverseKitting]
6
+ total: Int
7
+ }
8
+ `
@@ -0,0 +1,26 @@
1
+ import gql from 'graphql-tag'
2
+
3
+ export const OrderReverseKittingPatch = gql`
4
+ input OrderReverseKittingPatch {
5
+ id: String
6
+ name: String
7
+ set: Int
8
+ targetType: String
9
+ targetBatchId: String
10
+ targetProduct: ObjectRef
11
+ otherTarget: String
12
+ qty: Int
13
+ uomValue: Float
14
+ batchId: String
15
+ productName: String
16
+ packingType: String
17
+ reverseKittingOrder: ObjectRef
18
+ inventory: ObjectRef
19
+ vas: ObjectRef
20
+ operationGuide: String
21
+ remark: String
22
+ description: String
23
+ status: String
24
+ cuFlag: String
25
+ }
26
+ `
@@ -0,0 +1,31 @@
1
+ import gql from 'graphql-tag'
2
+
3
+ export const OrderReverseKitting = gql`
4
+ type OrderReverseKitting {
5
+ id: String
6
+ domain: Domain
7
+ bizplace: Bizplace
8
+ name: String
9
+ set: Int
10
+ targetType: String
11
+ targetBatchId: String
12
+ targetProduct: Product
13
+ otherTarget: String
14
+ qty: Int
15
+ uomValue: Float
16
+ batchId: String
17
+ productName: String
18
+ packingType: String
19
+ reverseKittingOrder: ReverseKittingOrder
20
+ inventory: Inventory
21
+ vas: Vas
22
+ operationGuide: String
23
+ remark: String
24
+ description: String
25
+ status: String
26
+ createdAt: String
27
+ updatedAt: String
28
+ creator: User
29
+ updater: User
30
+ }
31
+ `
@@ -0,0 +1,46 @@
1
+ import { NewReverseKittingOrder } from './new-reverse-kitting-order'
2
+ import { ReverseKittingOrder } from './reverse-kitting-order'
3
+ import { ReverseKittingOrderList } from './reverse-kitting-order-list'
4
+ import { ReverseKittingOrderPatch } from './reverse-kitting-order-patch'
5
+
6
+ export const Mutation = `
7
+ deleteReverseKittingOrder (
8
+ name: String!
9
+ ): Boolean @transaction
10
+
11
+ generateReverseKittingOrder (
12
+ reverseKittingOrder: NewReverseKittingOrder!
13
+ ): ReverseKittingOrder @transaction
14
+
15
+ confirmReverseKittingOrder (
16
+ name: String!
17
+ ): ReverseKittingOrder @transaction
18
+
19
+ activateReverseKittingOrder (
20
+ name: String!
21
+ ): ReverseKittingOrder @transaction
22
+
23
+ cancelReverseKittingOrder (
24
+ name: String!
25
+ ): ReverseKittingOrder @transaction
26
+
27
+ executeReverseKitting (
28
+ name: String!
29
+ inventory: InventoryPatch!
30
+ ): Boolean @privilege(category: "worksheet_execute", privilege: "mutation") @transaction
31
+
32
+ completeReverseKittingOrder (
33
+ name: String!
34
+ ): Boolean @privilege(category: "worksheet_execute", privilege: "mutation") @transaction
35
+ `
36
+
37
+ export const Query = `
38
+ reverseKittingOrders(filters: [Filter], pagination: Pagination, sortings: [Sorting]): ReverseKittingOrderList
39
+ reverseKittingOrder(name: String!): ReverseKittingOrder
40
+ executingReverseKittingOrder(name: String!): ReverseKittingOrder
41
+ reverseKittingInventories (
42
+ orderReverseKittingName: String!
43
+ ): [Inventory]
44
+ `
45
+
46
+ export const Types = [ReverseKittingOrder, NewReverseKittingOrder, ReverseKittingOrderPatch, ReverseKittingOrderList]
@@ -0,0 +1,11 @@
1
+ import gql from 'graphql-tag'
2
+
3
+ export const NewReverseKittingOrder = gql`
4
+ input NewReverseKittingOrder {
5
+ name: String
6
+ customerBizplaceId: String
7
+ description: String
8
+ orderReverseKittings: [NewOrderReverseKitting]
9
+ status: String
10
+ }
11
+ `
@@ -0,0 +1,8 @@
1
+ import gql from 'graphql-tag'
2
+
3
+ export const ReverseKittingOrderList = gql`
4
+ type ReverseKittingOrderList {
5
+ items: [ReverseKittingOrder]
6
+ total: Int
7
+ }
8
+ `
@@ -0,0 +1,11 @@
1
+ import gql from 'graphql-tag'
2
+
3
+ export const ReverseKittingOrderPatch = gql`
4
+ input ReverseKittingOrderPatch {
5
+ name: String
6
+ description: String
7
+ orderReverseKittings: [ObjectRef]
8
+ status: String
9
+ remark: String
10
+ }
11
+ `
@@ -0,0 +1,18 @@
1
+ import gql from 'graphql-tag'
2
+
3
+ export const ReverseKittingOrder = gql`
4
+ type ReverseKittingOrder {
5
+ id: String
6
+ name: String
7
+ domain: Domain
8
+ bizplace: Bizplace
9
+ description: String
10
+ orderReverseKittings: [OrderReverseKitting]
11
+ status: String
12
+ remark: String
13
+ updater: User
14
+ creator: User
15
+ updatedAt: String
16
+ createdAt: String
17
+ }
18
+ `
@@ -1,13 +1,40 @@
1
- import { EntityManager, In, Raw } from 'typeorm'
1
+ import { EntityManager, Equal, getRepository, In, Not, Raw, Repository } from 'typeorm'
2
2
 
3
+ import { User } from '@things-factory/auth-base'
3
4
  import { Bizplace } from '@things-factory/biz-base'
4
5
  import { Product, ProductBundle } from '@things-factory/product-base'
5
6
  import { Domain, ListParam } from '@things-factory/shell'
6
- import { Inventory } from '@things-factory/warehouse-base'
7
+ import {
8
+ Inventory,
9
+ INVENTORY_STATUS,
10
+ InventoryHistory,
11
+ InventoryNoGenerator,
12
+ Location,
13
+ LOCATION_STATUS,
14
+ Pallet
15
+ } from '@things-factory/warehouse-base'
7
16
 
8
- import { OrderInventory } from '../entities'
17
+ import {
18
+ ArrivalNotice,
19
+ DeliveryOrder,
20
+ InventoryCheck,
21
+ OrderInventory,
22
+ ReleaseGood,
23
+ ReturnOrder,
24
+ ReverseKittingOrder,
25
+ VasOrder
26
+ } from '../entities'
9
27
  import { ValidationError } from '../errors'
10
28
 
29
+ export type ReferenceOrderType =
30
+ | ArrivalNotice
31
+ | ReleaseGood
32
+ | VasOrder
33
+ | InventoryCheck
34
+ | DeliveryOrder
35
+ | ReturnOrder
36
+ | ReverseKittingOrder
37
+
11
38
  export const InventoryUtil = {
12
39
  /**
13
40
  * Get all available product belonging to list of bizplaces
@@ -211,6 +238,50 @@ export const InventoryUtil = {
211
238
  })
212
239
  }
213
240
  })
241
+ },
242
+
243
+ async checkPalletDuplication(palletId: string, warehouseDomain: Domain, trxMgr: EntityManager): Promise<void> {
244
+ const duplicatedPalletCnt: number = await trxMgr.getRepository(Inventory).count({
245
+ domain: warehouseDomain,
246
+ palletId,
247
+ status: Not(Equal(INVENTORY_STATUS.TERMINATED))
248
+ })
249
+
250
+ if (duplicatedPalletCnt) throw new Error(palletId + ` exists`)
251
+
252
+ const duplicatedReusablePalletCnt: number = await trxMgr.getRepository(Pallet).count({
253
+ where: {
254
+ domain: warehouseDomain,
255
+ name: palletId
256
+ }
257
+ })
258
+
259
+ if (duplicatedReusablePalletCnt) throw new Error(palletId + ` exists`)
260
+ },
261
+
262
+ /**
263
+ * @summary Do transaction on inventory record
264
+ * @description It will update inventory after set a temp (domain, updater)
265
+ * and then generate inventory history based on current changes
266
+ */
267
+ async transactionInventory(
268
+ inventory: Partial<Inventory>,
269
+ referenceOrder: ReferenceOrderType,
270
+ changedQty: number,
271
+ changedWeight: number,
272
+ transactionType: string,
273
+ user: User,
274
+ trxMgr: EntityManager
275
+ ): Promise<Inventory> {
276
+ if (inventory.id) {
277
+ inventory = await updateInventory(inventory, trxMgr)
278
+ } else {
279
+ inventory = await createInventory(inventory, trxMgr)
280
+ }
281
+
282
+ await generateInventoryHistory(inventory, referenceOrder, transactionType, changedQty, changedWeight, user, trxMgr)
283
+
284
+ return inventory
214
285
  }
215
286
  }
216
287
 
@@ -372,3 +443,156 @@ async function getConditions(
372
443
 
373
444
  return { bizplaceIds, productWhereClause, bundleWhereClause, whereClause, batchBundle }
374
445
  }
446
+
447
+ async function createInventory(
448
+ inventory: Partial<Inventory> | Partial<Inventory>[],
449
+ trxMgr: EntityManager
450
+ ): Promise<Inventory | Inventory[]> {
451
+ return await trxMgr.getRepository(Inventory).save(inventory)
452
+ }
453
+
454
+ /**
455
+ * @summary Update inventory record
456
+ * @description It will update inventory after set a stamp (domain, updater)
457
+ * The special point of this function is that this changes won't generate inventory history
458
+ * If you want to generate inventory history automatically you would better to use transactionInventory function
459
+ */
460
+ async function updateInventory(
461
+ inventory: Partial<Inventory> | Partial<Inventory>[],
462
+ trxMgr: EntityManager
463
+ ): Promise<Inventory | Inventory[]> {
464
+ if (!inventory.id) throw new Error(`Target doesn't have ID`)
465
+ return await trxMgr.getRepository(Inventory).save(inventory)
466
+ }
467
+
468
+ async function generateInventoryHistory(
469
+ inventory: Inventory,
470
+ refOrder: any,
471
+ transactionType: string,
472
+ qty: number,
473
+ uomValue: number,
474
+ user: User,
475
+ trxMgr?: EntityManager
476
+ ): Promise<InventoryHistory> {
477
+ const invHistoryRepo: Repository<InventoryHistory> =
478
+ trxMgr?.getRepository(InventoryHistory) || getRepository(InventoryHistory)
479
+ const invRepo: Repository<Inventory> = trxMgr?.getRepository(Inventory) || getRepository(Inventory)
480
+
481
+ if (!inventory?.id) throw new Error(`Can't find out ID of inventory.`)
482
+ if (!refOrder?.id || !refOrder.name) throw new Error(`Can't find out ID or Name of Reference Order`)
483
+ if (
484
+ !inventory?.domain ||
485
+ !inventory?.bizplace ||
486
+ !inventory?.product?.id ||
487
+ !inventory?.warehouse?.id ||
488
+ !inventory?.location?.id
489
+ ) {
490
+ inventory = await invRepo.findOne({
491
+ where: { id: inventory.id },
492
+ relations: ['domain', 'bizplace', 'product', 'warehouse', 'location']
493
+ })
494
+ }
495
+
496
+ const domain: Domain = inventory.domain
497
+ const location: Location = inventory.location
498
+
499
+ const seq: number = await invHistoryRepo.count({ domain: inventory.domain, palletId: inventory.palletId })
500
+ let openingQty: number = 0
501
+ let openingUomValue: number = 0
502
+
503
+ if (seq) {
504
+ const lastInvHistory: InventoryHistory = await invHistoryRepo.findOne({
505
+ domain: inventory.domain,
506
+ palletId: inventory.palletId,
507
+ seq: seq - 1
508
+ })
509
+ openingQty = lastInvHistory.openingQty + lastInvHistory.qty
510
+ openingUomValue = lastInvHistory.openingUomValue + lastInvHistory.uomValue
511
+ }
512
+
513
+ let inventoryHistory: InventoryHistory = new InventoryHistory()
514
+ inventoryHistory.name = InventoryNoGenerator.inventoryHistoryName()
515
+ inventoryHistory.description = inventory.description
516
+ inventoryHistory.seq = seq
517
+ inventoryHistory.palletId = inventory.palletId
518
+ inventoryHistory.cartonId = inventory.cartonId
519
+ inventoryHistory.batchId = inventory.batchId
520
+ inventoryHistory.batchIdRef = inventory.batchIdRef
521
+ inventoryHistory.status = inventory.status
522
+ inventoryHistory.transactionType = transactionType
523
+ inventoryHistory.refOrderId = refOrder?.id || null
524
+ inventoryHistory.orderNo = refOrder?.name || null
525
+ inventoryHistory.orderRefNo = refOrder?.refNo || null
526
+ inventoryHistory.inventory = inventory
527
+ inventoryHistory.product = inventory.product
528
+ inventoryHistory.reusablePallet = inventory.reusablePallet
529
+ inventoryHistory.zone = inventory.zone
530
+ inventoryHistory.warehouse = inventory.warehouse
531
+ inventoryHistory.location = inventory.location
532
+ inventoryHistory.expirationDate = inventory.expirationDate
533
+ inventoryHistory.packingType = inventory.packingType
534
+ inventoryHistory.packingSize = inventory.packingSize
535
+ inventoryHistory.uom = inventory.uom
536
+ inventoryHistory.qty = qty
537
+ inventoryHistory.openingQty = openingQty
538
+ inventoryHistory.weight = 0
539
+ inventoryHistory.openingWeight = 0
540
+ inventoryHistory.uomValue = uomValue
541
+ inventoryHistory.openingUomValue = openingUomValue
542
+ inventoryHistory.unitCost = inventory.unitCost
543
+ inventoryHistory.domain = inventory.domain
544
+ inventoryHistory.bizplace = inventory.bizplace
545
+ inventoryHistory.creator = user
546
+ inventoryHistory.updater = user
547
+
548
+ inventoryHistory = await invHistoryRepo.save(inventoryHistory)
549
+
550
+ if (inventory.lastSeq !== seq) {
551
+ await invRepo.save({
552
+ ...inventory,
553
+ lastSeq: inventoryHistory.seq,
554
+ updater: user
555
+ })
556
+ }
557
+
558
+ await switchLocationStatus(domain, location, user, trxMgr)
559
+ return inventoryHistory
560
+ }
561
+
562
+ /**
563
+ * @description: Check location emptiness and update status of location
564
+ * @param domain
565
+ * @param location
566
+ * @param updater
567
+ * @param trxMgr
568
+ */
569
+ export async function switchLocationStatus(
570
+ domain: Domain,
571
+ location: Location,
572
+ updater: User,
573
+ trxMgr?: EntityManager
574
+ ): Promise<Location> {
575
+ const invRepo: Repository<Inventory> = trxMgr?.getRepository(Inventory) || getRepository(Inventory)
576
+ const locationRepo: Repository<Location> = trxMgr?.getRepository(Location) || getRepository(Location)
577
+ const allocatedItemsCnt: number = await invRepo.count({
578
+ domain,
579
+ status: INVENTORY_STATUS.STORED,
580
+ location
581
+ })
582
+
583
+ if (!allocatedItemsCnt && location.status !== LOCATION_STATUS.EMPTY) {
584
+ location = await locationRepo.save({
585
+ ...location,
586
+ status: LOCATION_STATUS.EMPTY,
587
+ updater
588
+ })
589
+ } else if (allocatedItemsCnt && location.status === LOCATION_STATUS.EMPTY) {
590
+ location = await locationRepo.save({
591
+ ...location,
592
+ status: LOCATION_STATUS.OCCUPIED,
593
+ updater
594
+ })
595
+ }
596
+
597
+ return location
598
+ }