@things-factory/warehouse-base 8.0.0-beta.0 → 8.0.0-beta.2

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 (87) hide show
  1. package/package.json +8 -8
  2. package/server/constants/index.ts +0 -5
  3. package/server/constants/inventory.ts +0 -67
  4. package/server/constants/location.ts +0 -14
  5. package/server/constants/pallet.ts +0 -10
  6. package/server/constants/rule-type.ts +0 -5
  7. package/server/constants/tote.ts +0 -5
  8. package/server/controllers/ecommerce/ecommerce-controller.ts +0 -108
  9. package/server/controllers/ecommerce/index.ts +0 -2
  10. package/server/controllers/ecommerce/sellercraft-controller.ts +0 -100
  11. package/server/controllers/index.ts +0 -2
  12. package/server/controllers/warehouse-controller.ts +0 -181
  13. package/server/index.ts +0 -9
  14. package/server/middlewares/index.ts +0 -0
  15. package/server/migrations/index.ts +0 -9
  16. package/server/service/index.ts +0 -80
  17. package/server/service/inventory/index.ts +0 -6
  18. package/server/service/inventory/inventory-mutation.ts +0 -486
  19. package/server/service/inventory/inventory-query.ts +0 -1259
  20. package/server/service/inventory/inventory-types.ts +0 -355
  21. package/server/service/inventory/inventory.ts +0 -398
  22. package/server/service/inventory-change/index.ts +0 -6
  23. package/server/service/inventory-change/inventory-change-mutation.ts +0 -969
  24. package/server/service/inventory-change/inventory-change-query.ts +0 -93
  25. package/server/service/inventory-change/inventory-change-types.ts +0 -36
  26. package/server/service/inventory-change/inventory-change.ts +0 -164
  27. package/server/service/inventory-history/index.ts +0 -6
  28. package/server/service/inventory-history/inventory-history-mutation.ts +0 -116
  29. package/server/service/inventory-history/inventory-history-query.ts +0 -1845
  30. package/server/service/inventory-history/inventory-history-types.ts +0 -444
  31. package/server/service/inventory-history/inventory-history.ts +0 -203
  32. package/server/service/inventory-item/index.ts +0 -6
  33. package/server/service/inventory-item/inventory-item-mutation.ts +0 -217
  34. package/server/service/inventory-item/inventory-item-query.ts +0 -226
  35. package/server/service/inventory-item/inventory-item-type.ts +0 -74
  36. package/server/service/inventory-item/inventory-item.ts +0 -105
  37. package/server/service/inventory-item-change/index.ts +0 -6
  38. package/server/service/inventory-item-change/inventory-item-change-mutation.ts +0 -119
  39. package/server/service/inventory-item-change/inventory-item-change-query.ts +0 -47
  40. package/server/service/inventory-item-change/inventory-item-change-type.ts +0 -68
  41. package/server/service/inventory-item-change/inventory-item-change.ts +0 -92
  42. package/server/service/inventory-product/index.ts +0 -6
  43. package/server/service/inventory-product/inventory-product-mutation.ts +0 -116
  44. package/server/service/inventory-product/inventory-product-query.ts +0 -47
  45. package/server/service/inventory-product/inventory-product-type.ts +0 -59
  46. package/server/service/inventory-product/inventory-product.ts +0 -88
  47. package/server/service/location/index.ts +0 -6
  48. package/server/service/location/location-mutation.ts +0 -134
  49. package/server/service/location/location-query.ts +0 -244
  50. package/server/service/location/location-types.ts +0 -173
  51. package/server/service/location/location.ts +0 -121
  52. package/server/service/movement/index.ts +0 -6
  53. package/server/service/movement/movement-mutation.ts +0 -60
  54. package/server/service/movement/movement-query.ts +0 -263
  55. package/server/service/movement/movement-types.ts +0 -74
  56. package/server/service/movement/movement.ts +0 -81
  57. package/server/service/pallet/index.ts +0 -6
  58. package/server/service/pallet/pallet-mutation.ts +0 -242
  59. package/server/service/pallet/pallet-query.ts +0 -106
  60. package/server/service/pallet/pallet-types.ts +0 -80
  61. package/server/service/pallet/pallet.ts +0 -92
  62. package/server/service/pallet-count/index.ts +0 -6
  63. package/server/service/pallet-count/pallet-count-mutation.ts +0 -151
  64. package/server/service/pallet-count/pallet-count-query.ts +0 -45
  65. package/server/service/pallet-count/pallet-count-types.ts +0 -36
  66. package/server/service/pallet-count/pallet-count.ts +0 -70
  67. package/server/service/pallet-history/index.ts +0 -6
  68. package/server/service/pallet-history/pallet-history-mutation.ts +0 -114
  69. package/server/service/pallet-history/pallet-history-query.ts +0 -48
  70. package/server/service/pallet-history/pallet-history-types.ts +0 -36
  71. package/server/service/pallet-history/pallet-history.ts +0 -89
  72. package/server/service/reduced-inventory-history/index.ts +0 -3
  73. package/server/service/reduced-inventory-history/reduced-inventory-history.ts +0 -92
  74. package/server/service/tote/index.ts +0 -6
  75. package/server/service/tote/tote-mutation.ts +0 -201
  76. package/server/service/tote/tote-query.ts +0 -106
  77. package/server/service/tote/tote-types.ts +0 -44
  78. package/server/service/tote/tote.ts +0 -77
  79. package/server/service/warehouse/index.ts +0 -6
  80. package/server/service/warehouse/warehouse-mutation.ts +0 -117
  81. package/server/service/warehouse/warehouse-query.ts +0 -58
  82. package/server/service/warehouse/warehouse-types.ts +0 -50
  83. package/server/service/warehouse/warehouse.ts +0 -95
  84. package/server/utils/datetime-util.ts +0 -54
  85. package/server/utils/index.ts +0 -3
  86. package/server/utils/inventory-no-generator.ts +0 -15
  87. package/server/utils/inventory-util.ts +0 -490
@@ -1,486 +0,0 @@
1
- import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'
2
- import { In, MoreThan, SelectQueryBuilder } from 'typeorm'
3
-
4
- import { Bizplace } from '@things-factory/biz-base'
5
- import { generateId } from '@things-factory/id-rule-base'
6
- import { Sellercraft, SellercraftStatus } from '@things-factory/integration-sellercraft'
7
- import { Product } from '@things-factory/product-base'
8
-
9
- import { INVENTORY_STATUS, INVENTORY_TRANSACTION_TYPE, LOCATION_STATUS, RULE_TYPE } from '../../constants'
10
- import { SellercraftController } from '../../controllers'
11
- import { DateGenerator, InventoryNoGenerator, InventoryUtil } from '../../utils'
12
- import { InventoryHistory } from '../inventory-history/inventory-history'
13
- import { Location } from '../location/location'
14
- import { Inventory } from './inventory'
15
- import { InventoryPatch, NewInventory } from './inventory-types'
16
-
17
- @Resolver(Inventory)
18
- export class InventoryMutation {
19
- @Directive('@privilege(category: "inventory", privilege: "mutation")')
20
- @Directive('@transaction')
21
- @Mutation(returns => Inventory)
22
- async createInventory(@Arg('inventory') inventory: NewInventory, @Ctx() context: ResolverContext): Promise<Inventory> {
23
- const { tx } = context.state
24
-
25
- return await tx.getRepository(Inventory).save({
26
- domain: context.state.domain,
27
- creator: context.state.user,
28
- updater: context.state.user,
29
- ...inventory
30
- })
31
- }
32
-
33
- @Directive('@privilege(category: "inventory", privilege: "mutation")')
34
- @Directive('@transaction')
35
- @Mutation(returns => Inventory)
36
- async updateInventory(@Arg('patch') patch: InventoryPatch, @Ctx() context: ResolverContext): Promise<Inventory> {
37
- const { domain, user, tx } = context.state
38
-
39
- const invQb: SelectQueryBuilder<Inventory> = await tx
40
- .getRepository(Inventory)
41
- .createQueryBuilder('INV')
42
- .where('INV.domain_id = :domainId', { domainId: domain.id })
43
- .andWhere('INV.bizplace_id = :bizplaceId', { bizplaceId: patch.bizplace.id })
44
- .andWhere('INV.batch_id = :batchId', { batchId: patch.batchId })
45
- .andWhere('INV.product_id = :productId', { productId: patch.product.id })
46
- .andWhere('INV.packing_type = :packingType', { packingType: patch.packingType })
47
- .andWhere('INV.packing_size = :packingSize', { packingSize: patch.packingSize })
48
-
49
- if (patch?.cartonId) invQb.andWhere('INV.carton_id = :cartonId', { cartonId: patch.cartonId })
50
- else invQb.andWhere('INV.pallet_id = :palletId', { palletId: patch.palletId })
51
-
52
- const inventory = await invQb.getOne()
53
-
54
- return await tx.getRepository(Inventory).save({
55
- ...inventory,
56
- ...patch,
57
- updater: user
58
- })
59
- }
60
-
61
- @Directive('@privilege(category: "inventory", privilege: "mutation")')
62
- @Directive('@transaction')
63
- @Mutation(returns => Inventory)
64
- async updateInventoryRemark(@Arg('id') id: string, @Arg('remark') remark: string, @Ctx() context: ResolverContext): Promise<Inventory> {
65
- const { domain, user, tx } = context.state
66
-
67
- const repository = tx.getRepository(Inventory)
68
- const inventory = await repository.findOne({ where: { domain: { id: domain.id }, id } })
69
-
70
- return await repository.save({
71
- ...inventory,
72
- remark,
73
- updater: user
74
- })
75
- }
76
-
77
- @Directive('@privilege(category: "inventory", privilege: "mutation")')
78
- @Directive('@transaction')
79
- @Mutation(returns => Boolean)
80
- async deleteInventory(@Arg('name') name: string, @Ctx() context: ResolverContext): Promise<Boolean> {
81
- const { tx } = context.state
82
-
83
- await tx.getRepository(Inventory).delete({ domain: { id: context.state.domain.id }, name })
84
- return true
85
- }
86
-
87
- @Directive('@privilege(category: "inventory", privilege: "mutation")')
88
- @Directive('@transaction')
89
- @Mutation(returns => [Inventory])
90
- async updateMultipleInventory(@Arg('patches', type => [InventoryPatch]) patches: InventoryPatch[], @Ctx() context: ResolverContext): Promise<Inventory[]> {
91
- return await updateMultipleInventory(patches, context)
92
- }
93
-
94
- @Directive('@privilege(category: "inventory", privilege: "mutation")')
95
- @Directive('@transaction')
96
- @Mutation(returns => Boolean)
97
- async deleteInventories(@Arg('ids', type => [String]) ids: string[], @Ctx() context: ResolverContext): Promise<Boolean> {
98
- const { tx } = context.state
99
-
100
- await tx.getRepository(Inventory).delete({
101
- id: In(ids)
102
- })
103
-
104
- return true
105
- }
106
-
107
- @Directive('@privilege(category: "inventory", privilege: "mutation")')
108
- @Directive('@transaction')
109
- @Mutation(returns => Boolean)
110
- async inventoryTransfer(
111
- @Arg('originPalletId') originPalletId: string,
112
- @Arg('palletId', { nullable: true }) palletId: string,
113
- @Arg('cartonId', { nullable: true }) cartonId: string,
114
- @Arg('fromLocationName') fromLocationName: string,
115
- @Arg('toLocationName') toLocationName: string,
116
- @Arg('qty') qty: number,
117
- @Arg('reason', { nullable: true }) reason: string,
118
- @Ctx() context: ResolverContext
119
- ): Promise<Boolean> {
120
- const { domain, user, tx } = context.state
121
-
122
- const fromLocation: Location = await tx.getRepository(Location).findOne({
123
- where: { domain: { id: domain.id }, name: fromLocationName },
124
- relations: ['domain', 'warehouse']
125
- })
126
- // 1. check toLocation exist
127
- const toLocation: Location = await tx.getRepository(Location).findOne({
128
- where: { domain: { id: domain.id }, name: toLocationName },
129
- relations: ['domain', 'warehouse']
130
- })
131
- if (!toLocation) throw new Error(context.t(`error.To_location_does_not_exists`))
132
-
133
- if (qty < 0) throw new Error(`Invalid quantity`)
134
-
135
- // 2. search for related inventory
136
- const invQb: SelectQueryBuilder<Inventory> = await tx
137
- .getRepository(Inventory)
138
- .createQueryBuilder('INV')
139
- .innerJoinAndSelect('INV.location', 'loc')
140
- .innerJoinAndSelect('INV.product', 'product')
141
- .innerJoinAndSelect('INV.bizplace', 'bizplace')
142
- .leftJoinAndSelect('INV.refInventory', 'refInventory')
143
- .leftJoinAndSelect('INV.reusablePallet', 'reusablePallet')
144
- .leftJoinAndSelect('INV.productDetail', 'productDetail')
145
- .leftJoinAndSelect('bizplace.domain', 'domain')
146
- .leftJoinAndSelect('product.productDetails', 'productDetails')
147
- .leftJoinAndSelect('INV.originInventory', 'originInventory')
148
- .where('INV.domain_id = :domainId', { domainId: domain.id })
149
- .andWhere('INV.pallet_id = :palletId', { palletId: originPalletId })
150
-
151
- let inventory: Inventory = await invQb.getOne()
152
- if (!inventory) throw new Error('Inventory not found')
153
-
154
- if (qty > inventory.qty - (inventory?.lockedQty > 0 ? inventory.lockedQty : 0)) throw new Error('Transfer quantity exceeded inventory quantity')
155
-
156
- if (toLocation.name == inventory.location.name) throw new Error('Inventory is in current location')
157
-
158
- let transactionInventory = new InventoryUtil(tx, domain, user)
159
-
160
- const sellercraft: Sellercraft = await tx.getRepository(Sellercraft).findOne({
161
- where: { domain: { id: inventory.bizplace.domain.id }, status: SellercraftStatus.ACTIVE },
162
- relations: ['domain']
163
- })
164
-
165
- const partialTransferFunc = async function (inventory, qty, fromLocation, toLocation, cartonId, palletId, context) {
166
- const { user, tx } = context.state
167
-
168
- if (qty < inventory.qty - (inventory?.lockedQty > 0 ? inventory.lockedQty : 0)) {
169
- if (!palletId || palletId.trim() == '') throw new Error('Require new lot id for partial transfer')
170
-
171
- let transferQty = qty
172
- let transferUomValue = (inventory.uomValue / inventory.qty) * qty
173
- let newInventory = {
174
- ...inventory,
175
- palletId,
176
- location: toLocation,
177
- warehouse: toLocation.warehouse,
178
- zone: toLocation.zone,
179
- creator: user,
180
- updater: user
181
- }
182
-
183
- delete newInventory.id
184
- delete newInventory.updatedAt
185
-
186
- newInventory.cartonId = cartonId
187
- newInventory.qty = transferQty
188
- newInventory.lockedQty = 0
189
- newInventory.uomValue = transferUomValue
190
- newInventory.lockedUomValue = 0
191
- if (inventory.originInventory?.id) {
192
- newInventory.originInventory = { id: inventory.originInventory.id }
193
- } else {
194
- newInventory.originInventory = { id: inventory.id }
195
- }
196
-
197
- await transactionInventory.transactionInventory(
198
- { ...inventory, qty: inventory.qty - transferQty, uomValue: inventory.uomValue - transferUomValue },
199
- null,
200
- -transferQty,
201
- -transferUomValue,
202
- INVENTORY_TRANSACTION_TYPE.RELOCATE,
203
- reason || null
204
- )
205
-
206
- await transactionInventory.transactionInventory(newInventory, null, transferQty, transferUomValue, INVENTORY_TRANSACTION_TYPE.RELOCATE, reason || null)
207
-
208
- if (sellercraft) {
209
- const sellercraftCtrl: SellercraftController = new SellercraftController(tx, domain, user)
210
- await sellercraftCtrl.updateSellercraftStock(sellercraft, inventory)
211
- await sellercraftCtrl.updateSellercraftStock(sellercraft, newInventory)
212
- }
213
- } else {
214
- inventory.warehouse = toLocation.warehouse
215
- inventory.location = toLocation
216
- inventory.zone = toLocation.zone
217
- inventory.updater = user
218
- inventory.cartonId = cartonId
219
-
220
- let isEmptyLocation = await tx.getRepository(Inventory).find({
221
- where: { location: { id: fromLocation.id } }
222
- })
223
-
224
- if ((isEmptyLocation.length = 1)) {
225
- await tx.getRepository(Location).save({
226
- ...fromLocation,
227
- status: LOCATION_STATUS.EMPTY
228
- })
229
- }
230
-
231
- await transactionInventory.transactionInventory(inventory, null, 0, 0, INVENTORY_TRANSACTION_TYPE.RELOCATE, reason || null)
232
-
233
- if (sellercraft) {
234
- const sellercraftCtrl: SellercraftController = new SellercraftController(tx, domain, user)
235
- await sellercraftCtrl.updateSellercraftStock(sellercraft, inventory)
236
- }
237
- }
238
- }
239
-
240
- if (inventory.cartonId && inventory.cartonId != '') {
241
- if (!cartonId) throw new Error('Require carton id')
242
-
243
- if (qty < inventory.qty - (inventory?.lockedQty > 0 ? inventory.lockedQty : 0)) {
244
- palletId = await generateId({
245
- domain: domain,
246
- type: RULE_TYPE.LOT_NUMBER_ID,
247
- seed: { date: DateGenerator.generateDate() }
248
- })
249
- }
250
-
251
- await partialTransferFunc(inventory, qty, fromLocation, toLocation, cartonId, palletId, context)
252
- } else {
253
- if (!palletId) {
254
- palletId = await generateId({
255
- domain: domain,
256
- type: RULE_TYPE.LOT_NUMBER_ID,
257
- seed: { date: DateGenerator.generateDate() }
258
- })
259
- }
260
- await partialTransferFunc(inventory, qty, fromLocation, toLocation, null, palletId, context)
261
- }
262
-
263
- return true
264
- }
265
- }
266
-
267
- export async function updateMultipleInventory(patches: InventoryPatch[], context: ResolverContext): Promise<Inventory[]> {
268
- const { domain, user, tx } = context.state
269
-
270
- let results = []
271
- const _createRecords = patches.filter((patch: any) => !patch.id)
272
- const _updateRecords = patches.filter((patch: any) => patch.id)
273
-
274
- const inventoryRepo = tx.getRepository(Inventory)
275
- if (_createRecords.length > 0) {
276
- let today = new Date()
277
- let year = today.getFullYear()
278
- let month = today.getMonth()
279
- let date = today.getDate()
280
-
281
- for (let i = 0; i < _createRecords.length; i++) {
282
- const total = await tx.getRepository(Inventory).countBy({
283
- createdAt: MoreThan(new Date(year, month, date))
284
- })
285
-
286
- const newRecord = _createRecords[i]
287
-
288
- if (newRecord.location && newRecord.location.id) {
289
- var location = await tx.getRepository(Location).findOne({
290
- where: { id: newRecord.location.id },
291
- relations: ['warehouse']
292
- })
293
- newRecord.location = location
294
- newRecord.zone = location.zone
295
- newRecord.warehouse = location.warehouse
296
- }
297
-
298
- if (newRecord.bizplace && newRecord.bizplace.id) {
299
- newRecord.bizplace = (await tx.getRepository(Bizplace).findOneBy({ id: newRecord.bizplace.id })) as any
300
- }
301
-
302
- if (newRecord.product && newRecord.product.id) {
303
- var product = (await tx.getRepository(Product).findOneBy({ id: newRecord.product.id })) as any
304
- newRecord.product = product
305
- }
306
-
307
- let palletId =
308
- 'P' +
309
- year.toString().substr(year.toString().length - 2) +
310
- ('0' + (month + 1).toString()).substr(('0' + (month + 1).toString()).toString().length - 2) +
311
- ('0' + date.toString()).substr(('0' + date.toString()).length - 2) +
312
- ('0000' + (total + 1).toString()).substr(('0000' + (total + 1).toString()).length - 4)
313
-
314
- newRecord.name = palletId
315
- newRecord.status = newRecord.qty < 1 ? 'TERMINATED' : 'STORED'
316
- newRecord.palletId = palletId
317
-
318
- const result = await inventoryRepo.save({
319
- domain: domain,
320
- creator: user,
321
- updater: user,
322
- lastSeq: 0,
323
- ...newRecord
324
- } as any)
325
-
326
- await tx.getRepository(InventoryHistory).save({
327
- ...newRecord,
328
- domain: domain,
329
- creator: user,
330
- updater: user,
331
- name: InventoryNoGenerator.inventoryHistoryName(),
332
- seq: 0,
333
- transactionType: 'NEW',
334
- productId: newRecord.product.id,
335
- warehouseId: newRecord.warehouse.id,
336
- locationId: newRecord.location.id
337
- })
338
-
339
- results.push({ ...result, cuFlag: '+' })
340
- }
341
- }
342
-
343
- if (_updateRecords.length > 0) {
344
- for (let i = 0; i < _updateRecords.length; i++) {
345
- const newRecord = _updateRecords[i]
346
- const newHistoryRecord = JSON.parse(JSON.stringify(_updateRecords[i]))
347
- let transactionType = ''
348
-
349
- let inventory = await inventoryRepo.findOne({
350
- where: { id: newRecord.id },
351
- relations: ['warehouse', 'location', 'product', 'bizplace']
352
- })
353
- newHistoryRecord.openingQty = inventory.qty
354
- newHistoryRecord.openingUomValue = inventory.uomValue
355
-
356
- // Get last sequence from InventoryHistory
357
- let latestEntry = await tx.getRepository(InventoryHistory).find({
358
- where: { palletId: inventory.palletId },
359
- order: { seq: 'DESC' },
360
- take: 1
361
- })
362
- let lastSeq = latestEntry[0].seq
363
-
364
- // Condition 1: Change location (RELOCATE)
365
- if (newRecord.location && newRecord.location.id) {
366
- var location = await tx.getRepository(Location).findOne({
367
- where: { id: newRecord.location.id },
368
- relations: ['warehouse']
369
- })
370
- newRecord.location = location
371
- newRecord.zone = location.zone
372
- newRecord.warehouse = location.warehouse
373
-
374
- newHistoryRecord.location = location
375
- newHistoryRecord.zone = location.zone
376
- newHistoryRecord.warehouse = location.warehouse
377
-
378
- transactionType = 'RELOCATE'
379
- }
380
-
381
- // Condition 2: Change of qty or uomValue.
382
- // Set qty movement for inventory history
383
- if (typeof newRecord.qty != 'undefined') {
384
- transactionType = 'ADJUSTMENT'
385
- newHistoryRecord.qty = newRecord.qty - inventory.qty
386
- if (newRecord.qty < 1) {
387
- newRecord.status = 'TERMINATED'
388
- newRecord.qty = 0
389
- newRecord.uomValue = 0
390
- }
391
- } else {
392
- newHistoryRecord.qty = 0
393
- }
394
- // Set uomValue movement for inventory history
395
- if (typeof newRecord.uomValue != 'undefined') {
396
- transactionType = 'ADJUSTMENT'
397
- newHistoryRecord.uomValue = newRecord.uomValue - inventory.uomValue
398
- if (newRecord.uomValue < 1) {
399
- newRecord.uomValue = 0
400
- }
401
- } else {
402
- newHistoryRecord.uomValue = 0
403
- }
404
-
405
- // Condition 3: Change of bizplace or product or batch id or packing type
406
- if (newRecord.bizplace && newRecord.bizplace.id) {
407
- newRecord.bizplace = (await tx.getRepository(Bizplace).findOneBy({ id: newRecord.bizplace.id })) as any
408
- }
409
-
410
- if (newRecord.product && newRecord.product.id) {
411
- newRecord.product = (await tx.getRepository(Product).findOneBy({ id: newRecord.product.id })) as any
412
- }
413
-
414
- if ((newRecord.product && newRecord.product.id) || (newRecord.bizplace && newRecord.bizplace.id) || newRecord.batchId || newRecord.packingType) {
415
- if (
416
- inventory.bizplace.id !== (newRecord.bizplace ? newRecord.bizplace.id : '') ||
417
- inventory.product.id !== (newRecord.product ? newRecord.product.id : '') ||
418
- inventory.batchId !== newRecord.batchId ||
419
- inventory.packingType !== newRecord.packingType
420
- ) {
421
- transactionType = 'ADJUSTMENT'
422
- lastSeq = lastSeq + 1
423
- let inventoryHistory: any = {
424
- ...inventory,
425
- domain: domain,
426
- bizplace: inventory.bizplace.id,
427
- openingQty: inventory.qty,
428
- openingUomValue: inventory.uomValue,
429
- qty: -inventory.qty || 0,
430
- uomValue: -inventory.uomValue || 0,
431
- name: InventoryNoGenerator.inventoryHistoryName(),
432
- seq: lastSeq,
433
- inventory,
434
- transactionType: transactionType,
435
- status: INVENTORY_STATUS.TERMINATED,
436
- productId: inventory.product.id,
437
- warehouseId: inventory.warehouse.id,
438
- locationId: inventory.location.id,
439
- creator: user,
440
- updater: user
441
- }
442
-
443
- delete inventoryHistory.id
444
- await tx.getRepository(InventoryHistory).save(inventoryHistory as any)
445
-
446
- newHistoryRecord.qty = newRecord.qty || inventory.qty
447
- newHistoryRecord.uomValue = newRecord.uomValue || inventory.uomValue || 0
448
- newHistoryRecord.openingQty = 0
449
- newHistoryRecord.openingUomValue = 0
450
- newHistoryRecord.batchId = newRecord.batchId || inventory.batchId || '-'
451
- }
452
- }
453
-
454
- //Transaction type will be RELOCATE if there is only location change. Any other changes will be considered Adjustment.
455
- lastSeq = lastSeq + 1
456
- let inventoryHistory = {
457
- ...inventory,
458
- ...newHistoryRecord,
459
- domain: domain,
460
- creator: user,
461
- updater: user,
462
- name: InventoryNoGenerator.inventoryHistoryName(),
463
- seq: lastSeq,
464
- inventory,
465
- transactionType: transactionType == '' ? 'ADJUSTMENT' : transactionType,
466
- productId: newHistoryRecord.product ? newHistoryRecord.product.id : inventory.product.id,
467
- warehouseId: newHistoryRecord.warehouse ? newHistoryRecord.warehouse.id : inventory.warehouse.id,
468
- locationId: newHistoryRecord.location ? newHistoryRecord.location.id : inventory.location.id
469
- }
470
-
471
- delete inventoryHistory.id
472
- await tx.getRepository(InventoryHistory).save(inventoryHistory)
473
-
474
- const result = await inventoryRepo.save({
475
- ...inventory,
476
- ...newRecord,
477
- updater: user,
478
- lastSeq: lastSeq
479
- })
480
-
481
- results.push({ ...result, cuFlag: 'M' })
482
- }
483
- }
484
-
485
- return results
486
- }