@things-factory/warehouse-base 5.0.14 → 6.0.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/dist-server/controllers/ecommerce/ecommerce-controller.js +1 -1
  2. package/dist-server/controllers/ecommerce/ecommerce-controller.js.map +1 -1
  3. package/dist-server/controllers/ecommerce/sellercraft-controller.js +64 -60
  4. package/dist-server/controllers/ecommerce/sellercraft-controller.js.map +1 -1
  5. package/dist-server/controllers/warehouse-controller.js +7 -5
  6. package/dist-server/controllers/warehouse-controller.js.map +1 -1
  7. package/dist-server/service/inventory/inventory-mutation.js +6 -6
  8. package/dist-server/service/inventory/inventory-mutation.js.map +1 -1
  9. package/dist-server/service/inventory/inventory-query.js +217 -195
  10. package/dist-server/service/inventory/inventory-query.js.map +1 -1
  11. package/dist-server/service/inventory/inventory-types.js +14 -15
  12. package/dist-server/service/inventory/inventory-types.js.map +1 -1
  13. package/dist-server/service/inventory/inventory.js +62 -42
  14. package/dist-server/service/inventory/inventory.js.map +1 -1
  15. package/dist-server/service/inventory-change/inventory-change-mutation.js +252 -216
  16. package/dist-server/service/inventory-change/inventory-change-mutation.js.map +1 -1
  17. package/dist-server/service/inventory-change/inventory-change-query.js +6 -7
  18. package/dist-server/service/inventory-change/inventory-change-query.js.map +1 -1
  19. package/dist-server/service/inventory-change/inventory-change.js +7 -7
  20. package/dist-server/service/inventory-change/inventory-change.js.map +1 -1
  21. package/dist-server/service/inventory-history/inventory-history-mutation.js +1 -1
  22. package/dist-server/service/inventory-history/inventory-history-mutation.js.map +1 -1
  23. package/dist-server/service/inventory-history/inventory-history-query.js +89 -99
  24. package/dist-server/service/inventory-history/inventory-history-query.js.map +1 -1
  25. package/dist-server/service/inventory-history/inventory-history-types.js +3 -3
  26. package/dist-server/service/inventory-history/inventory-history-types.js.map +1 -1
  27. package/dist-server/service/inventory-history/inventory-history.js +7 -7
  28. package/dist-server/service/inventory-history/inventory-history.js.map +1 -1
  29. package/dist-server/service/inventory-item/inventory-item-mutation.js +10 -10
  30. package/dist-server/service/inventory-item/inventory-item-mutation.js.map +1 -1
  31. package/dist-server/service/inventory-item/inventory-item-query.js +18 -17
  32. package/dist-server/service/inventory-item/inventory-item-query.js.map +1 -1
  33. package/dist-server/service/inventory-item/inventory-item-type.js +4 -5
  34. package/dist-server/service/inventory-item/inventory-item-type.js.map +1 -1
  35. package/dist-server/service/inventory-item/inventory-item.js +5 -5
  36. package/dist-server/service/inventory-item/inventory-item.js.map +1 -1
  37. package/dist-server/service/inventory-item-change/inventory-item-change-mutation.js +4 -4
  38. package/dist-server/service/inventory-item-change/inventory-item-change-mutation.js.map +1 -1
  39. package/dist-server/service/inventory-item-change/inventory-item-change-query.js +7 -9
  40. package/dist-server/service/inventory-item-change/inventory-item-change-query.js.map +1 -1
  41. package/dist-server/service/inventory-item-change/inventory-item-change-type.js +6 -7
  42. package/dist-server/service/inventory-item-change/inventory-item-change-type.js.map +1 -1
  43. package/dist-server/service/inventory-item-change/inventory-item-change.js +3 -4
  44. package/dist-server/service/inventory-item-change/inventory-item-change.js.map +1 -1
  45. package/dist-server/service/inventory-product/inventory-product-mutation.js +4 -4
  46. package/dist-server/service/inventory-product/inventory-product-mutation.js.map +1 -1
  47. package/dist-server/service/inventory-product/inventory-product-query.js +7 -9
  48. package/dist-server/service/inventory-product/inventory-product-query.js.map +1 -1
  49. package/dist-server/service/inventory-product/inventory-product-type.js +1 -2
  50. package/dist-server/service/inventory-product/inventory-product-type.js.map +1 -1
  51. package/dist-server/service/inventory-product/inventory-product.js +5 -5
  52. package/dist-server/service/inventory-product/inventory-product.js.map +1 -1
  53. package/dist-server/service/location/location-mutation.js +5 -5
  54. package/dist-server/service/location/location-mutation.js.map +1 -1
  55. package/dist-server/service/location/location-query.js +17 -19
  56. package/dist-server/service/location/location-query.js.map +1 -1
  57. package/dist-server/service/location/location-types.js +3 -3
  58. package/dist-server/service/location/location-types.js.map +1 -1
  59. package/dist-server/service/location/location.js +14 -14
  60. package/dist-server/service/location/location.js.map +1 -1
  61. package/dist-server/service/movement/movement-mutation.js +6 -5
  62. package/dist-server/service/movement/movement-mutation.js.map +1 -1
  63. package/dist-server/service/movement/movement-query.js +15 -15
  64. package/dist-server/service/movement/movement-query.js.map +1 -1
  65. package/dist-server/service/movement/movement-types.js +4 -5
  66. package/dist-server/service/movement/movement-types.js.map +1 -1
  67. package/dist-server/service/movement/movement.js +5 -5
  68. package/dist-server/service/movement/movement.js.map +1 -1
  69. package/dist-server/service/pallet/pallet-mutation.js +5 -5
  70. package/dist-server/service/pallet/pallet-mutation.js.map +1 -1
  71. package/dist-server/service/pallet/pallet-query.js +9 -11
  72. package/dist-server/service/pallet/pallet-query.js.map +1 -1
  73. package/dist-server/service/pallet/pallet-types.js +5 -6
  74. package/dist-server/service/pallet/pallet-types.js.map +1 -1
  75. package/dist-server/service/pallet/pallet.js +6 -6
  76. package/dist-server/service/pallet/pallet.js.map +1 -1
  77. package/dist-server/service/pallet-count/pallet-count-mutation.js +1 -1
  78. package/dist-server/service/pallet-count/pallet-count-mutation.js.map +1 -1
  79. package/dist-server/service/pallet-count/pallet-count-query.js +6 -8
  80. package/dist-server/service/pallet-count/pallet-count-query.js.map +1 -1
  81. package/dist-server/service/pallet-count/pallet-count.js +3 -4
  82. package/dist-server/service/pallet-count/pallet-count.js.map +1 -1
  83. package/dist-server/service/pallet-history/pallet-history-mutation.js +1 -1
  84. package/dist-server/service/pallet-history/pallet-history-mutation.js.map +1 -1
  85. package/dist-server/service/pallet-history/pallet-history-query.js +6 -8
  86. package/dist-server/service/pallet-history/pallet-history-query.js.map +1 -1
  87. package/dist-server/service/pallet-history/pallet-history.js +6 -6
  88. package/dist-server/service/pallet-history/pallet-history.js.map +1 -1
  89. package/dist-server/service/reduced-inventory-history/reduced-inventory-history.js +1 -1
  90. package/dist-server/service/reduced-inventory-history/reduced-inventory-history.js.map +1 -1
  91. package/dist-server/service/tote/tote-mutation.js +4 -4
  92. package/dist-server/service/tote/tote-mutation.js.map +1 -1
  93. package/dist-server/service/tote/tote-query.js +12 -13
  94. package/dist-server/service/tote/tote-query.js.map +1 -1
  95. package/dist-server/service/tote/tote-types.js +2 -3
  96. package/dist-server/service/tote/tote-types.js.map +1 -1
  97. package/dist-server/service/tote/tote.js +5 -5
  98. package/dist-server/service/tote/tote.js.map +1 -1
  99. package/dist-server/service/warehouse/warehouse-mutation.js +1 -1
  100. package/dist-server/service/warehouse/warehouse-mutation.js.map +1 -1
  101. package/dist-server/service/warehouse/warehouse-query.js +9 -10
  102. package/dist-server/service/warehouse/warehouse-query.js.map +1 -1
  103. package/dist-server/service/warehouse/warehouse.js +12 -12
  104. package/dist-server/service/warehouse/warehouse.js.map +1 -1
  105. package/dist-server/tsconfig.tsbuildinfo +1 -1
  106. package/dist-server/utils/inventory-util.js +16 -16
  107. package/dist-server/utils/inventory-util.js.map +1 -1
  108. package/package.json +8 -8
  109. package/server/controllers/ecommerce/ecommerce-controller.ts +1 -1
  110. package/server/controllers/ecommerce/sellercraft-controller.ts +75 -65
  111. package/server/controllers/warehouse-controller.ts +9 -4
  112. package/server/service/inventory/inventory-mutation.ts +28 -24
  113. package/server/service/inventory/inventory-query.ts +269 -304
  114. package/server/service/inventory/inventory.ts +50 -35
  115. package/server/service/inventory-change/inventory-change-mutation.ts +305 -256
  116. package/server/service/inventory-change/inventory-change-query.ts +9 -9
  117. package/server/service/inventory-history/inventory-history-mutation.ts +12 -15
  118. package/server/service/inventory-history/inventory-history-query.ts +158 -133
  119. package/server/service/inventory-item/inventory-item-mutation.ts +20 -17
  120. package/server/service/inventory-item/inventory-item-query.ts +28 -18
  121. package/server/service/inventory-item-change/inventory-item-change-mutation.ts +12 -9
  122. package/server/service/inventory-item-change/inventory-item-change-query.ts +10 -8
  123. package/server/service/inventory-product/inventory-product-mutation.ts +16 -12
  124. package/server/service/inventory-product/inventory-product-query.ts +7 -8
  125. package/server/service/location/location-mutation.ts +24 -24
  126. package/server/service/location/location-query.ts +27 -23
  127. package/server/service/location/location.ts +11 -10
  128. package/server/service/movement/movement-mutation.ts +7 -8
  129. package/server/service/movement/movement-query.ts +18 -16
  130. package/server/service/pallet/pallet-mutation.ts +18 -20
  131. package/server/service/pallet/pallet-query.ts +13 -14
  132. package/server/service/pallet-count/pallet-count-mutation.ts +20 -17
  133. package/server/service/pallet-count/pallet-count-query.ts +6 -7
  134. package/server/service/pallet-history/pallet-history-mutation.ts +15 -15
  135. package/server/service/pallet-history/pallet-history-query.ts +7 -8
  136. package/server/service/reduced-inventory-history/reduced-inventory-history.ts +1 -1
  137. package/server/service/tote/tote-mutation.ts +23 -22
  138. package/server/service/tote/tote-query.ts +18 -14
  139. package/server/service/warehouse/warehouse-mutation.ts +21 -18
  140. package/server/service/warehouse/warehouse-query.ts +11 -11
  141. package/server/service/warehouse/warehouse.ts +7 -7
  142. package/server/utils/inventory-util.ts +10 -10
@@ -1,12 +1,10 @@
1
1
  import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'
2
- import { EntityManager, In, MoreThan, Not } from 'typeorm'
2
+ import { In, MoreThan, Not } from 'typeorm'
3
3
 
4
- import { Privilege, User } from '@things-factory/auth-base'
5
4
  import { Bizplace } from '@things-factory/biz-base'
6
5
  import { generateId } from '@things-factory/id-rule-base'
7
6
  import { MarketplaceStore } from '@things-factory/integration-marketplace'
8
7
  import { Sellercraft, SellercraftStatus } from '@things-factory/integration-sellercraft'
9
- import { sendNotification } from '@things-factory/notification'
10
8
  import { Product } from '@things-factory/product-base'
11
9
  import { PartnerSetting, Setting } from '@things-factory/setting-base'
12
10
  import { Domain } from '@things-factory/shell'
@@ -30,9 +28,9 @@ export class InventoryChangeMutation {
30
28
  @Mutation(returns => InventoryChange)
31
29
  async createInventoryChange(
32
30
  @Arg('inventoryChange') inventoryChange: NewInventoryChange,
33
- @Ctx() context: any
31
+ @Ctx() context: ResolverContext
34
32
  ): Promise<InventoryChange> {
35
- const { domain, user, tx }: { domain: Domain; user: User; tx: EntityManager } = context.state
33
+ const { domain, user, tx } = context.state
36
34
 
37
35
  return await tx.getRepository(InventoryChange).save({
38
36
  ...inventoryChange,
@@ -47,9 +45,9 @@ export class InventoryChangeMutation {
47
45
  async updateInventoryChange(
48
46
  @Arg('name') name: string,
49
47
  @Arg('patch') patch: InventoryChangePatch,
50
- @Ctx() context: any
48
+ @Ctx() context: ResolverContext
51
49
  ): Promise<InventoryChange> {
52
- const { domain, user, tx }: { domain: Domain; user: User; tx: EntityManager } = context.state
50
+ const { domain, user, tx } = context.state
53
51
 
54
52
  const repository = tx.getRepository(InventoryChange)
55
53
  const inventoryChange = await repository.findOne({
@@ -67,9 +65,9 @@ export class InventoryChangeMutation {
67
65
  @Mutation(returns => [InventoryChange])
68
66
  async updateMultipleInventoryChange(
69
67
  @Arg('patches', type => [InventoryChangePatch]) patches: InventoryChangePatch[],
70
- @Ctx() context: any
68
+ @Ctx() context: ResolverContext
71
69
  ): Promise<InventoryChange[]> {
72
- const { domain, user, tx }: { domain: Domain; user: User; tx: EntityManager } = context.state
70
+ const { domain, user, tx } = context.state
73
71
  let results = []
74
72
  const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')
75
73
  const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')
@@ -93,7 +91,7 @@ export class InventoryChangeMutation {
93
91
  if (_updateRecords.length > 0) {
94
92
  for (let i = 0; i < _updateRecords.length; i++) {
95
93
  const newRecord = _updateRecords[i]
96
- const inventoryChange = await inventoryChangeRepo.findOne(newRecord.id)
94
+ const inventoryChange = await inventoryChangeRepo.findOneBy({ id: newRecord.id })
97
95
 
98
96
  const result = await inventoryChangeRepo.save({
99
97
  ...inventoryChange,
@@ -110,8 +108,8 @@ export class InventoryChangeMutation {
110
108
 
111
109
  @Directive('@transaction')
112
110
  @Mutation(returns => Boolean)
113
- async deleteInventoryChange(@Arg('name') name: string, @Ctx() context: any): Promise<Boolean> {
114
- const { domain, tx }: { domain: Domain; tx: EntityManager } = context.state
111
+ async deleteInventoryChange(@Arg('name') name: string, @Ctx() context: ResolverContext): Promise<Boolean> {
112
+ const { domain, tx } = context.state
115
113
 
116
114
  await tx.getRepository(InventoryChange).delete({ domain: domain, name })
117
115
  return true
@@ -119,8 +117,11 @@ export class InventoryChangeMutation {
119
117
 
120
118
  @Directive('@transaction')
121
119
  @Mutation(returns => Boolean)
122
- async deleteInventoryChanges(@Arg('names', type => [String]) names: string[], @Ctx() context: any): Promise<Boolean> {
123
- const { domain, tx }: { domain: Domain; tx: EntityManager } = context.state
120
+ async deleteInventoryChanges(
121
+ @Arg('names', type => [String]) names: string[],
122
+ @Ctx() context: ResolverContext
123
+ ): Promise<Boolean> {
124
+ const { domain, tx } = context.state
124
125
 
125
126
  await tx.getRepository(InventoryChange).delete({
126
127
  domain: domain,
@@ -134,273 +135,298 @@ export class InventoryChangeMutation {
134
135
  @Mutation(returns => Boolean)
135
136
  async submitInventoryChanges(
136
137
  @Arg('patches', type => [InventoryPatch]) patches: InventoryPatch[],
137
- @Ctx() context: any
138
+ @Ctx() context: ResolverContext
138
139
  ) {
139
- const { domain, user, tx }: { domain: Domain; user: User; tx: EntityManager } = context.state
140
+ const { domain, user, tx } = context.state
141
+ try {
142
+ const _createRecords = []
143
+ const _updateRecords = []
144
+
145
+ for (let i = 0; i < patches.length; i++) {
146
+ let foundExistingPallet = await tx
147
+ .getRepository(Inventory)
148
+ .createQueryBuilder('iv')
149
+ .where('iv.domain_id = :domain_id', { domain_id: domain.id })
150
+ .andWhere('(iv.pallet_id = :pallet_id or iv.id = :id)', {
151
+ pallet_id: patches[i]?.palletId,
152
+ id: patches[i]?.id
153
+ })
154
+ .getOne()
140
155
 
141
- const _createRecords = []
142
- const _updateRecords = []
156
+ //remove any unchanged records
157
+ for (const [key, value] of Object.entries(patches[i])) {
158
+ if (foundExistingPallet && key != 'id' && key != 'cuFlag' && value == foundExistingPallet[key]) {
159
+ delete patches[i][key]
160
+ }
161
+ }
143
162
 
144
- for (let i = 0; i < patches.length; i++) {
145
- let foundExistingPallet = await tx.getRepository(Inventory).findOne({
146
- where: { domain, palletId: patches[i]?.palletId }
147
- })
163
+ // skip process when no processable data found
164
+ if (Object.keys(patches[i]).filter(x => x != 'id' && x != 'cuFlag').length == 0) {
165
+ continue
166
+ }
148
167
 
149
- if (!foundExistingPallet) {
150
- foundExistingPallet = await tx.getRepository(Inventory).findOne({
151
- where: { id: patches[i]?.id }
152
- })
153
- }
168
+ const invLockedQty: number = foundExistingPallet?.lockedQty == null ? 0 : foundExistingPallet?.lockedQty
154
169
 
155
- const invLockedQty: number = foundExistingPallet?.lockedQty == null ? 0 : foundExistingPallet?.lockedQty
170
+ if (patches[i]?.qty < invLockedQty) {
171
+ throw new Error(
172
+ 'Adjusted qty value should not be lower than released qty, kindly contact our support for assistance'
173
+ )
174
+ }
156
175
 
157
- if (patches[i]?.qty < invLockedQty) {
158
- throw new Error(
159
- 'Adjusted qty value should not be lower than released qty, kindly contact our support if you have difficulties'
160
- )
176
+ if (foundExistingPallet) {
177
+ delete patches[i].serialNumbers
178
+ _updateRecords.push(patches[i])
179
+ } else {
180
+ _createRecords.push(patches[i])
181
+ }
161
182
  }
162
183
 
163
- if (foundExistingPallet) {
164
- delete patches[i].serialNumbers
165
- _updateRecords.push(patches[i])
166
- } else {
167
- _createRecords.push(patches[i])
168
- }
169
- }
184
+ const inventoryChangeRepo = tx.getRepository(InventoryChange)
185
+ const inventoryItemChangeRepo = tx.getRepository(InventoryItemChange)
186
+ if (_createRecords.length > 0) {
187
+ for (let i = 0; i < _createRecords.length; i++) {
188
+ const newRecord = _createRecords[i]
170
189
 
171
- const inventoryChangeRepo = tx.getRepository(InventoryChange)
172
- const inventoryItemChangeRepo = tx.getRepository(InventoryItemChange)
173
- if (_createRecords.length > 0) {
174
- for (let i = 0; i < _createRecords.length; i++) {
175
- const newRecord = _createRecords[i]
190
+ var location = await tx.getRepository(Location).findOne({
191
+ where: { id: newRecord.location.id },
192
+ relations: ['warehouse']
193
+ })
194
+ newRecord.location = location
195
+ newRecord.zone = location.zone
196
+ newRecord.warehouse = location.warehouse
176
197
 
177
- var location = await tx.getRepository(Location).findOne({
178
- where: { id: newRecord.location.id },
179
- relations: ['warehouse']
180
- })
181
- newRecord.location = location
182
- newRecord.zone = location.zone
183
- newRecord.warehouse = location.warehouse
198
+ newRecord.bizplace = await tx.getRepository(Bizplace).findOneBy({ id: newRecord.bizplace.id })
184
199
 
185
- newRecord.bizplace = await tx.getRepository(Bizplace).findOne(newRecord.bizplace.id)
200
+ var product: Product = await tx.getRepository(Product).findOne(newRecord.product.id)
201
+ newRecord.product = product
186
202
 
187
- var product: Product = await tx.getRepository(Product).findOne(newRecord.product.id)
188
- newRecord.product = product
203
+ newRecord.status = 'PENDING'
204
+ newRecord.transactionType = 'NEW'
189
205
 
190
- newRecord.status = 'PENDING'
191
- newRecord.transactionType = 'NEW'
206
+ newRecord.expirationDate =
207
+ ((newRecord?.expirationDate && new Date(newRecord.expirationDate).getFullYear()) || 0) < 2000
208
+ ? null
209
+ : newRecord.expirationDate
192
210
 
193
- newRecord.expirationDate =
194
- ((newRecord?.expirationDate && new Date(newRecord.expirationDate).getFullYear()) || 0) < 2000
195
- ? null
196
- : newRecord.expirationDate
211
+ const newInventoryChange: InventoryChange = await inventoryChangeRepo.save({
212
+ ...newRecord,
213
+ id: undefined,
214
+ name: InventoryNoGenerator.inventoryName(),
215
+ domain: domain,
216
+ creator: user,
217
+ updater: user
218
+ })
197
219
 
198
- const newInventoryChange: InventoryChange = await inventoryChangeRepo.save({
199
- ...newRecord,
200
- id: undefined,
201
- name: InventoryNoGenerator.inventoryName(),
202
- domain: domain,
203
- creator: user,
204
- updater: user
205
- })
220
+ if (newRecord?.serialNumbers) {
221
+ let serialNumbers: string = newRecord.serialNumbers
222
+ let newSerialNumbers: any = serialNumbers.split(',')
223
+ let inventoryItemChanges: InventoryItemChange[] = []
206
224
 
207
- if (newRecord?.serialNumbers) {
208
- let serialNumbers: string = newRecord.serialNumbers
209
- let newSerialNumbers: any = serialNumbers.split(',')
210
- let inventoryItemChanges: InventoryItemChange[] = []
225
+ for (let i = 0; i < newSerialNumbers.length; i++) {
226
+ let newSerialNumber: string = newSerialNumbers[i]
227
+ let inventoryItemChange: any = {
228
+ serialNumber: newSerialNumber,
229
+ type: INVENTORY_ITEM_CHANGE_TYPE.NEW
230
+ }
211
231
 
212
- for (let i = 0; i < newSerialNumbers.length; i++) {
213
- let newSerialNumber: string = newSerialNumbers[i]
214
- let inventoryItemChange: any = {
215
- serialNumber: newSerialNumber,
216
- type: INVENTORY_ITEM_CHANGE_TYPE.NEW
232
+ inventoryItemChanges.push(inventoryItemChange)
217
233
  }
218
234
 
219
- inventoryItemChanges.push(inventoryItemChange)
235
+ newRecord.inventoryItemChangesJson = JSON.stringify(inventoryItemChanges)
220
236
  }
221
237
 
222
- newRecord.inventoryItemChangesJson = JSON.stringify(inventoryItemChanges)
223
- }
224
-
225
- // create new inventory items
226
- if (newRecord?.inventoryItemChangesJson) {
227
- const inventoryItemChanges: InventoryItemChange[] = JSON.parse(newRecord.inventoryItemChangesJson)
228
- if (product?.isRequireSerialNumberScanningInbound) {
229
- if (inventoryItemChanges?.length != newRecord?.qty) {
230
- throw new Error('Serial Numbers not tally with quantity')
238
+ // create new inventory items
239
+ if (newRecord?.inventoryItemChangesJson) {
240
+ const inventoryItemChanges: InventoryItemChange[] = JSON.parse(newRecord.inventoryItemChangesJson)
241
+ if (product?.isRequireSerialNumberScanningInbound) {
242
+ if (inventoryItemChanges?.length != newRecord?.qty) {
243
+ throw new Error('Serial Numbers not tally with quantity')
244
+ }
231
245
  }
232
- }
233
246
 
234
- let newInventoryItemChanges: InventoryItemChange[] = []
235
-
236
- inventoryItemChanges.map(inventoryItemChange => {
237
- let newInventoryItemChange: InventoryItemChange = new InventoryItemChange()
238
- newInventoryItemChange.name = InventoryNoGenerator.inventoryName()
239
- newInventoryItemChange.serialNumber = inventoryItemChange.serialNumber
240
- newInventoryItemChange.type = inventoryItemChange.type
241
- newInventoryItemChange.status = newInventoryChange.status
242
- newInventoryItemChange.inventoryItem =
243
- newInventoryItemChange?.type == INVENTORY_ITEM_CHANGE_TYPE.NEW
244
- ? null
245
- : newInventoryItemChange.inventoryItem
246
- newInventoryItemChange.inventoryChange = newInventoryChange
247
- newInventoryItemChange.domain = domain
248
- newInventoryItemChange.creator = user
249
- newInventoryItemChange.updater = user
250
-
251
- newInventoryItemChanges.push(newInventoryItemChange)
252
- })
247
+ let newInventoryItemChanges: InventoryItemChange[] = []
248
+
249
+ inventoryItemChanges.map(inventoryItemChange => {
250
+ let newInventoryItemChange: InventoryItemChange = new InventoryItemChange()
251
+ newInventoryItemChange.name = InventoryNoGenerator.inventoryName()
252
+ newInventoryItemChange.serialNumber = inventoryItemChange.serialNumber
253
+ newInventoryItemChange.type = inventoryItemChange.type
254
+ newInventoryItemChange.status = newInventoryChange.status
255
+ newInventoryItemChange.inventoryItem =
256
+ newInventoryItemChange?.type == INVENTORY_ITEM_CHANGE_TYPE.NEW
257
+ ? null
258
+ : newInventoryItemChange.inventoryItem
259
+ newInventoryItemChange.inventoryChange = newInventoryChange
260
+ newInventoryItemChange.domain = domain
261
+ newInventoryItemChange.creator = user
262
+ newInventoryItemChange.updater = user
263
+
264
+ newInventoryItemChanges.push(newInventoryItemChange)
265
+ })
253
266
 
254
- await inventoryItemChangeRepo.save(newInventoryItemChanges)
267
+ await inventoryItemChangeRepo.save(newInventoryItemChanges)
268
+ }
255
269
  }
256
270
  }
257
- }
258
-
259
- if (_updateRecords.length > 0) {
260
- for (let i = 0; i < _updateRecords.length; i++) {
261
- const updateRecord = _updateRecords[i]
262
271
 
263
- let existingRecord = await tx.getRepository(Inventory).findOne({
264
- where: { domain, palletId: updateRecord?.palletId },
265
- relations: ['location', 'warehouse', 'product', 'bizplace']
266
- })
272
+ if (_updateRecords.length > 0) {
273
+ for (let i = 0; i < _updateRecords.length; i++) {
274
+ const updateRecord = _updateRecords[i]
267
275
 
268
- if (!existingRecord) {
269
- existingRecord = await tx.getRepository(Inventory).findOne({
270
- where: { domain, id: updateRecord?.id },
276
+ let existingRecord = await tx.getRepository(Inventory).findOne({
277
+ where: { domain, palletId: updateRecord?.palletId },
271
278
  relations: ['location', 'warehouse', 'product', 'bizplace']
272
279
  })
273
- }
274
280
 
275
- if (!!updateRecord?.location?.id) {
276
- var location = await tx.getRepository(Location).findOne({
277
- where: { id: updateRecord.location.id },
278
- relations: ['warehouse']
279
- })
280
- updateRecord.location = location
281
- updateRecord.zone = location.zone
282
- updateRecord.warehouse = location.warehouse
283
- }
281
+ if (!existingRecord) {
282
+ existingRecord = await tx.getRepository(Inventory).findOne({
283
+ where: { domain, id: updateRecord?.id },
284
+ relations: ['location', 'warehouse', 'product', 'bizplace']
285
+ })
286
+ }
284
287
 
285
- if (!!updateRecord?.bizplace?.id)
286
- updateRecord.bizplace = await tx.getRepository(Bizplace).findOne(updateRecord.bizplace.id)
288
+ if (!!updateRecord?.location?.id) {
289
+ var location = await tx.getRepository(Location).findOne({
290
+ where: { id: updateRecord.location.id },
291
+ relations: ['warehouse']
292
+ })
293
+ updateRecord.location = location
294
+ updateRecord.zone = location.zone
295
+ updateRecord.warehouse = location.warehouse
296
+ }
287
297
 
288
- let product: Product
298
+ if (!!updateRecord?.bizplace?.id)
299
+ updateRecord.bizplace = await tx.getRepository(Bizplace).findOne(updateRecord.bizplace.id)
289
300
 
290
- if (!!updateRecord?.product?.id) {
291
- product = await tx.getRepository(Product).findOne(updateRecord.product.id)
292
- updateRecord.product = product
293
- } else {
294
- product = existingRecord.product
295
- }
301
+ let product: Product
296
302
 
297
- updateRecord.transactionType == 'MISSING'
298
- ? (updateRecord.transactionType = 'MISSING')
299
- : (updateRecord.transactionType = 'CHANGES')
303
+ if (!!updateRecord?.product?.id) {
304
+ product = await tx.getRepository(Product).findOne(updateRecord.product.id)
305
+ updateRecord.product = product
306
+ } else {
307
+ product = existingRecord.product
308
+ }
300
309
 
301
- updateRecord.status = 'PENDING'
310
+ updateRecord.transactionType == 'MISSING'
311
+ ? (updateRecord.transactionType = 'MISSING')
312
+ : (updateRecord.transactionType = 'CHANGES')
302
313
 
303
- updateRecord.expirationDate =
304
- ((updateRecord?.expirationDate && new Date(updateRecord.expirationDate).getFullYear()) || 0) < 2000
305
- ? null
306
- : updateRecord.expirationDate
307
-
308
- const updatedInventoryChange: InventoryChange = await inventoryChangeRepo.save({
309
- palletId: existingRecord.palletId,
310
- ...updateRecord,
311
- id: undefined,
312
- name: InventoryNoGenerator.inventoryName(),
313
- inventory: existingRecord,
314
- domain: domain,
315
- creator: user,
316
- updater: user
317
- })
314
+ updateRecord.status = 'PENDING'
315
+
316
+ updateRecord.expirationDate =
317
+ ((updateRecord?.expirationDate && new Date(updateRecord.expirationDate).getFullYear()) || 0) < 2000
318
+ ? null
319
+ : updateRecord.expirationDate
318
320
 
319
- // create new inventory items
320
- if (updateRecord?.inventoryItemChangesJson) {
321
- const originalInventoryItems: InventoryItem[] = await tx.getRepository(InventoryItem).find({
322
- where: { domain, inventory: existingRecord }
321
+ const updatedInventoryChange: InventoryChange = await inventoryChangeRepo.save({
322
+ palletId: existingRecord.palletId,
323
+ ...updateRecord,
324
+ id: undefined,
325
+ name: InventoryNoGenerator.inventoryName(),
326
+ inventory: existingRecord,
327
+ domain: domain,
328
+ creator: user,
329
+ updater: user
323
330
  })
324
- const inventoryItemChanges: InventoryItemChange[] = JSON.parse(updateRecord.inventoryItemChangesJson)
325
- if (product?.isRequireSerialNumberScanningInbound) {
326
- const combinedInventoryItems: any[] = [...originalInventoryItems, ...inventoryItemChanges]
327
- let qty: number = updateRecord?.qty ? updateRecord.qty : existingRecord.qty
328
- if (combinedInventoryItems?.length != qty) {
329
- throw new Error('Serial Numbers not tally with quantity')
331
+
332
+ // create new inventory items
333
+ if (updateRecord?.inventoryItemChangesJson) {
334
+ const originalInventoryItems: InventoryItem[] = await tx.getRepository(InventoryItem).find({
335
+ where: { domain: { id: domain.id }, inventory: { id: existingRecord.id }, status: Not('DELETED') }
336
+ })
337
+ const inventoryItemChanges: InventoryItemChange[] = JSON.parse(updateRecord.inventoryItemChangesJson)
338
+ if (product?.isRequireSerialNumberScanningInbound) {
339
+ // const combinedInventoryItems: any[] = [...originalInventoryItems, ...inventoryItemChanges]
340
+ let qty: number = updateRecord?.qty ? updateRecord.qty : existingRecord.qty
341
+
342
+ if (originalInventoryItems.length == 0) {
343
+ if (inventoryItemChanges.length !== qty) {
344
+ throw new Error('Serial Numbers not tally with quantity')
345
+ }
346
+ } else {
347
+ if (originalInventoryItems?.length - inventoryItemChanges.length !== qty) {
348
+ throw new Error('Serial Numbers not tally with quantity')
349
+ }
350
+ }
330
351
  }
331
- }
332
352
 
333
- let newInventoryItemChanges: InventoryItemChange[] = []
334
-
335
- inventoryItemChanges.map(inventoryItemChange => {
336
- let newInventoryItemChange: InventoryItemChange = new InventoryItemChange()
337
- newInventoryItemChange.name = InventoryNoGenerator.inventoryName()
338
- newInventoryItemChange.serialNumber = inventoryItemChange.serialNumber
339
- newInventoryItemChange.type = inventoryItemChange.type
340
- newInventoryItemChange.status = updatedInventoryChange.status
341
- newInventoryItemChange.inventory = updatedInventoryChange.inventory
342
- newInventoryItemChange.inventoryItem =
343
- newInventoryItemChange?.type == INVENTORY_ITEM_CHANGE_TYPE.NEW
344
- ? null
345
- : newInventoryItemChange.inventoryItem
346
- newInventoryItemChange.inventoryChange = updatedInventoryChange
347
- newInventoryItemChange.domain = domain
348
- newInventoryItemChange.creator = user
349
- newInventoryItemChange.updater = user
350
-
351
- newInventoryItemChanges.push(newInventoryItemChange)
352
- })
353
+ let newInventoryItemChanges: InventoryItemChange[] = []
354
+
355
+ inventoryItemChanges.map(inventoryItemChange => {
356
+ let newInventoryItemChange: InventoryItemChange = new InventoryItemChange()
357
+ newInventoryItemChange.name = InventoryNoGenerator.inventoryName()
358
+ newInventoryItemChange.serialNumber = inventoryItemChange.serialNumber
359
+ newInventoryItemChange.type = inventoryItemChange.type
360
+ newInventoryItemChange.status = updatedInventoryChange.status
361
+ newInventoryItemChange.inventory = updatedInventoryChange.inventory
362
+ newInventoryItemChange.inventoryItem =
363
+ newInventoryItemChange?.type == INVENTORY_ITEM_CHANGE_TYPE.NEW
364
+ ? null
365
+ : inventoryItemChange.inventoryItem
366
+ newInventoryItemChange.inventoryChange = updatedInventoryChange
367
+ newInventoryItemChange.domain = domain
368
+ newInventoryItemChange.creator = user
369
+ newInventoryItemChange.updater = user
370
+
371
+ newInventoryItemChanges.push(newInventoryItemChange)
372
+ })
353
373
 
354
- await inventoryItemChangeRepo.save(newInventoryItemChanges)
374
+ await inventoryItemChangeRepo.save(newInventoryItemChanges)
375
+ }
355
376
  }
356
377
  }
357
- }
358
378
 
359
- const notificationApprover: any = await tx
360
- .getRepository(Privilege)
361
- .createQueryBuilder('p')
362
- .select('u.*')
363
- .addSelect('r.*')
364
- .innerJoin('p.roles', 'r')
365
- .innerJoin('r.users', 'u')
366
- .where('p.name = :name', { name: 'mutation' })
367
- .andWhere('p.category = :category', { category: 'inventory' })
368
- .andWhere('r.domain_id = :domainId', { domainId: domain.id })
369
- .groupBy('u.id')
370
- .addGroupBy('r.id')
371
- .getRawMany()
372
-
373
- if (_updateRecords.some(res => res.transactionType == 'MISSING')) {
374
- if (notificationApprover?.length && context.header?.referer) {
375
- const receivers: any[] = notificationApprover.map(user => user.id)
376
- const msg = {
377
- title: `Missing stock identified. Review this transaction in Inventory Adjustment Approval.`,
378
- body: ``,
379
- url: context.header.referer,
380
- data: { url: context.header.referer }
381
- }
382
- await sendNotification({
383
- receivers,
384
- message: { ...msg }
385
- })
386
- }
387
- } else {
388
- if (notificationApprover?.length && context.header?.referer) {
389
- const receivers: any[] = notificationApprover.map(user => user.id)
390
- const msg = {
391
- title: `There is an inventory adjustment pending for approval, kindly review within 1 hour to avoid any operation conflict.`,
392
- body: ``,
393
- url: context.header.referer,
394
- data: { url: context.header.referer }
395
- }
396
- await sendNotification({
397
- receivers,
398
- message: { ...msg }
399
- })
400
- }
379
+ /**
380
+ * @notes Temporary off sendNotification due to suspect of causing wms down
381
+ */
382
+ // const notificationApprover: any = await tx
383
+ // .getRepository(Privilege)
384
+ // .createQueryBuilder('p')
385
+ // .select('u.*')
386
+ // .addSelect('r.*')
387
+ // .innerJoin('p.roles', 'r')
388
+ // .innerJoin('r.users', 'u')
389
+ // .where('p.name = :name', { name: 'mutation' })
390
+ // .andWhere('p.category = :category', { category: 'inventory' })
391
+ // .andWhere('r.domain_id = :domainId', { domainId: domain.id })
392
+ // .groupBy('u.id')
393
+ // .addGroupBy('r.id')
394
+ // .getRawMany()
395
+
396
+ // if (_updateRecords.some(res => res.transactionType == 'MISSING')) {
397
+ // if (notificationApprover?.length && context.header?.referer) {
398
+ // const receivers: any[] = notificationApprover.map(user => user.id)
399
+ // const msg = {
400
+ // title: `Missing stock identified. Review this transaction in Inventory Adjustment Approval.`,
401
+ // body: ``,
402
+ // url: context.header.referer,
403
+ // data: { url: context.header.referer }
404
+ // }
405
+ // await sendNotification({
406
+ // receivers,
407
+ // message: { ...msg }
408
+ // })
409
+ // }
410
+ // } else {
411
+ // if (notificationApprover?.length && context.header?.referer) {
412
+ // const receivers: any[] = notificationApprover.map(user => user.id)
413
+ // const msg = {
414
+ // title: `There is an inventory adjustment pending for approval, kindly review within 1 hour to avoid any operation conflict.`,
415
+ // body: ``,
416
+ // url: context.header.referer,
417
+ // data: { url: context.header.referer }
418
+ // }
419
+ // await sendNotification({
420
+ // receivers,
421
+ // message: { ...msg }
422
+ // })
423
+ // }
424
+ // }
425
+
426
+ return true
427
+ } catch (error) {
428
+ throw error
401
429
  }
402
-
403
- return true
404
430
  }
405
431
 
406
432
  @Directive('@privilege(category: "inventory_adjustment_approval", privilege: "mutation")')
@@ -408,7 +434,7 @@ export class InventoryChangeMutation {
408
434
  @Mutation(returns => InventoryChangeList)
409
435
  async approveInventoryChanges(
410
436
  @Arg('patches', type => [InventoryChangePatch]) patches: InventoryChangePatch[],
411
- @Ctx() context: any
437
+ @Ctx() context: ResolverContext
412
438
  ): Promise<InventoryChangeList> {
413
439
  const inventoryChangeList = await approveInventoryChanges(patches, context)
414
440
 
@@ -420,9 +446,9 @@ export class InventoryChangeMutation {
420
446
  @Mutation(returns => Boolean)
421
447
  async rejectInventoryChanges(
422
448
  @Arg('patches', type => [InventoryChangePatch]) patches: InventoryChangePatch[],
423
- @Ctx() context: any
449
+ @Ctx() context: ResolverContext
424
450
  ): Promise<Boolean> {
425
- const { domain, user, tx }: { domain: Domain; user: User; tx: EntityManager } = context.state
451
+ const { domain, user, tx } = context.state
426
452
 
427
453
  const _inventoryChanges = await tx.getRepository(InventoryChange).find({
428
454
  where: { id: In(patches.map(item => item.id)) },
@@ -472,10 +498,10 @@ function clean(obj) {
472
498
  }
473
499
 
474
500
  async function upsertInventoryItems(context, inventoryChange, approvalStatus, tx) {
475
- const { domain, user }: { domain: Domain; user: User } = context.state
501
+ const { domain, user } = context.state
476
502
 
477
503
  let inventoryItemChanges: InventoryItemChange[] = await tx.getRepository(InventoryItemChange).find({
478
- where: { domain, inventoryChange: inventoryChange, status: 'PENDING' },
504
+ where: { domain: { id: domain.id }, inventoryChange: inventoryChange, status: 'PENDING' },
479
505
  relations: ['domain', 'inventoryItem', 'inventory', 'inventory.product', 'inventoryChange']
480
506
  })
481
507
  await Promise.all(
@@ -537,8 +563,8 @@ async function upsertInventoryItems(context, inventoryChange, approvalStatus, tx
537
563
  )
538
564
  }
539
565
 
540
- export async function approveInventoryChanges(patches: any, context: any) {
541
- const { domain, user, tx }: { domain: Domain; user: User; tx: EntityManager } = context.state
566
+ export async function approveInventoryChanges(patches: any, context: ResolverContext) {
567
+ const { domain, user, tx } = context.state
542
568
 
543
569
  // Get Selected Inventory Change Data
544
570
  const _inventoryChanges = await tx.getRepository(InventoryChange).find({
@@ -634,7 +660,7 @@ export async function approveInventoryChanges(patches: any, context: any) {
634
660
 
635
661
  // Check and set current location status
636
662
  let currentLocationInventoryCount = await tx.getRepository(Inventory).count({
637
- where: { location: inventory.location, status: 'STORED', id: Not(inventory.id) }
663
+ where: { location: { id: inventory.location.id }, status: 'STORED', id: Not(inventory.id) }
638
664
  })
639
665
 
640
666
  if (currentLocationInventoryCount == 0) {
@@ -781,7 +807,7 @@ export async function approveInventoryChanges(patches: any, context: any) {
781
807
  } else {
782
808
  let latestLocationInventoryCount = await tx.getRepository(Inventory).count({
783
809
  where: {
784
- location: newRecord.location ? newRecord.location.id : inventory.location.id,
810
+ location: { id: newRecord.location ? newRecord.location.id : inventory.location.id },
785
811
  status: 'STORED',
786
812
  id: Not(inventory.id)
787
813
  }
@@ -801,18 +827,41 @@ export async function approveInventoryChanges(patches: any, context: any) {
801
827
 
802
828
  const companyDomain: Domain = inventory.bizplace?.company.domain
803
829
 
804
- const sellercraft: Sellercraft = await tx
805
- .getRepository(Sellercraft)
806
- .findOne({ where: { domain: customerDomain, status: SellercraftStatus.ACTIVE }, relations: ['domain'] })
830
+ const sellercraftCtrl: SellercraftController = new SellercraftController(tx, domain, user)
831
+ if (newRecord?.bizplace?.id && inventory.bizplace.id != newRecord?.bizplace?.id) {
832
+ const prevBizSC: Sellercraft = await tx.getRepository(Sellercraft).findOne({
833
+ where: {
834
+ domain: { id: inventory.bizplace?.domain.id },
835
+ status: SellercraftStatus.ACTIVE
836
+ },
837
+ relations: ['domain']
838
+ })
839
+ if (prevBizSC) {
840
+ await sellercraftCtrl.updateSellercraftStock(prevBizSC, { ...inventory, bizplace: inventory.bizplace })
841
+ }
842
+ }
807
843
 
808
- if (sellercraft) {
809
- const sellercraftCtrl: SellercraftController = new SellercraftController(tx, domain, user)
810
- await sellercraftCtrl.updateSellercraftStock(sellercraft, inventory)
811
- if (newRecord?.product || newRecord?.bizplace) {
812
- if (!newRecord?.product) newRecord.product = inventory.product
844
+ const currentBizSC: Sellercraft = await tx.getRepository(Sellercraft).findOne({
845
+ where: {
846
+ domain: newRecord?.bizplace?.domain || inventory?.bizplace?.domain,
847
+ status: SellercraftStatus.ACTIVE
848
+ },
849
+ relations: ['domain']
850
+ })
813
851
 
814
- await sellercraftCtrl.updateSellercraftStock(sellercraft, newRecord)
815
- }
852
+ if (currentBizSC) {
853
+ if (newRecord?.product?.id && newRecord?.product?.id != inventory?.product?.id)
854
+ await sellercraftCtrl.updateSellercraftStock(currentBizSC, {
855
+ ...inventory,
856
+ bizplace: newRecord?.bizplace || inventory?.bizplace,
857
+ product: inventory.product
858
+ })
859
+
860
+ await sellercraftCtrl.updateSellercraftStock(currentBizSC, {
861
+ ...inventory,
862
+ bizplace: newRecord?.bizplace || inventory?.bizplace,
863
+ product: newRecord?.product || inventory?.product
864
+ })
816
865
  }
817
866
 
818
867
  // check for any existing active marketplace connection, update marketplace selling qty
@@ -832,7 +881,7 @@ export async function approveInventoryChanges(patches: any, context: any) {
832
881
 
833
882
  // Adding Inventory
834
883
  else {
835
- const total = await tx.getRepository(Inventory).count({
884
+ const total = await tx.getRepository(Inventory).countBy({
836
885
  createdAt: MoreThan(new Date(year, month, date))
837
886
  })
838
887
 
@@ -869,7 +918,7 @@ export async function approveInventoryChanges(patches: any, context: any) {
869
918
  newRecord.palletId = palletId
870
919
 
871
920
  const warehouseCartonSetting: Setting = await tx.getRepository(Setting).findOne({
872
- where: { domain, category: 'id-rule', name: 'enable-carton-label' }
921
+ where: { domain: { id: domain.id }, category: 'id-rule', name: 'enable-carton-label' }
873
922
  })
874
923
 
875
924
  const partnerCartonSetting: PartnerSetting = await tx.getRepository(PartnerSetting).findOne({