@things-factory/warehouse-base 4.3.81 → 4.3.82

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 (71) hide show
  1. package/dist-server/controllers/warehouse-controller.js.map +1 -1
  2. package/dist-server/service/inventory/inventory-mutation.js.map +1 -1
  3. package/dist-server/service/inventory/inventory-query.js +10 -4
  4. package/dist-server/service/inventory/inventory-query.js.map +1 -1
  5. package/dist-server/service/inventory/inventory-types.js.map +1 -1
  6. package/dist-server/service/inventory/inventory.js +6 -1
  7. package/dist-server/service/inventory/inventory.js.map +1 -1
  8. package/dist-server/service/inventory-change/inventory-change-mutation.js +16 -5
  9. package/dist-server/service/inventory-change/inventory-change-mutation.js.map +1 -1
  10. package/dist-server/service/inventory-change/inventory-change-query.js.map +1 -1
  11. package/dist-server/service/inventory-change/inventory-change-types.js.map +1 -1
  12. package/dist-server/service/inventory-change/inventory-change.js.map +1 -1
  13. package/dist-server/service/inventory-history/inventory-history-mutation.js.map +1 -1
  14. package/dist-server/service/inventory-history/inventory-history-query.js +1 -1
  15. package/dist-server/service/inventory-history/inventory-history-query.js.map +1 -1
  16. package/dist-server/service/inventory-history/inventory-history-types.js.map +1 -1
  17. package/dist-server/service/inventory-history/inventory-history.js.map +1 -1
  18. package/dist-server/service/inventory-item/inventory-item-mutation.js.map +1 -1
  19. package/dist-server/service/inventory-item/inventory-item-query.js.map +1 -1
  20. package/dist-server/service/inventory-item/inventory-item-type.js.map +1 -1
  21. package/dist-server/service/inventory-item/inventory-item.js +8 -3
  22. package/dist-server/service/inventory-item/inventory-item.js.map +1 -1
  23. package/dist-server/service/inventory-item-change/inventory-item-change-mutation.js.map +1 -1
  24. package/dist-server/service/inventory-item-change/inventory-item-change-query.js.map +1 -1
  25. package/dist-server/service/inventory-item-change/inventory-item-change-type.js.map +1 -1
  26. package/dist-server/service/inventory-item-change/inventory-item-change.js.map +1 -1
  27. package/dist-server/service/inventory-product/inventory-product-mutation.js.map +1 -1
  28. package/dist-server/service/inventory-product/inventory-product-query.js.map +1 -1
  29. package/dist-server/service/inventory-product/inventory-product-type.js.map +1 -1
  30. package/dist-server/service/inventory-product/inventory-product.js +8 -3
  31. package/dist-server/service/inventory-product/inventory-product.js.map +1 -1
  32. package/dist-server/service/location/location-mutation.js.map +1 -1
  33. package/dist-server/service/location/location-query.js.map +1 -1
  34. package/dist-server/service/location/location-types.js.map +1 -1
  35. package/dist-server/service/location/location.js.map +1 -1
  36. package/dist-server/service/movement/movement-mutation.js.map +1 -1
  37. package/dist-server/service/movement/movement-query.js.map +1 -1
  38. package/dist-server/service/movement/movement-types.js.map +1 -1
  39. package/dist-server/service/movement/movement.js.map +1 -1
  40. package/dist-server/service/pallet/pallet-mutation.js.map +1 -1
  41. package/dist-server/service/pallet/pallet-query.js.map +1 -1
  42. package/dist-server/service/pallet/pallet-types.js.map +1 -1
  43. package/dist-server/service/pallet/pallet.js.map +1 -1
  44. package/dist-server/service/pallet-count/pallet-count-mutation.js.map +1 -1
  45. package/dist-server/service/pallet-count/pallet-count-query.js.map +1 -1
  46. package/dist-server/service/pallet-count/pallet-count-types.js.map +1 -1
  47. package/dist-server/service/pallet-count/pallet-count.js.map +1 -1
  48. package/dist-server/service/pallet-history/pallet-history-mutation.js.map +1 -1
  49. package/dist-server/service/pallet-history/pallet-history-query.js.map +1 -1
  50. package/dist-server/service/pallet-history/pallet-history-types.js.map +1 -1
  51. package/dist-server/service/pallet-history/pallet-history.js.map +1 -1
  52. package/dist-server/service/reduced-inventory-history/reduced-inventory-history.js.map +1 -1
  53. package/dist-server/service/tote/tote-mutation.js.map +1 -1
  54. package/dist-server/service/tote/tote-query.js.map +1 -1
  55. package/dist-server/service/tote/tote-types.js.map +1 -1
  56. package/dist-server/service/tote/tote.js.map +1 -1
  57. package/dist-server/service/warehouse/warehouse-mutation.js.map +1 -1
  58. package/dist-server/service/warehouse/warehouse-query.js.map +1 -1
  59. package/dist-server/service/warehouse/warehouse-types.js.map +1 -1
  60. package/dist-server/service/warehouse/warehouse.js.map +1 -1
  61. package/dist-server/utils/inventory-util.js +83 -24
  62. package/dist-server/utils/inventory-util.js.map +1 -1
  63. package/package.json +8 -8
  64. package/server/controllers/warehouse-controller.ts +0 -1
  65. package/server/service/inventory/inventory-query.ts +25 -12
  66. package/server/service/inventory/inventory.ts +3 -0
  67. package/server/service/inventory-change/inventory-change-mutation.ts +18 -11
  68. package/server/service/inventory-history/inventory-history-query.ts +1 -1
  69. package/server/service/inventory-item/inventory-item.ts +9 -2
  70. package/server/service/inventory-product/inventory-product.ts +5 -1
  71. package/server/utils/inventory-util.ts +117 -51
@@ -17,13 +17,13 @@ import { logger } from '@things-factory/env'
17
17
  export class InventoryQuery {
18
18
  /**
19
19
  * Combined single query resolver to perform extraction of data with or without pagination
20
- * @param context
21
- * @param filters
22
- * @param pagination
23
- * @param sortings
24
- * @param locationSortingRules
25
- * @param exportItem
26
- * @returns
20
+ * @param context
21
+ * @param filters
22
+ * @param pagination
23
+ * @param sortings
24
+ * @param locationSortingRules
25
+ * @param exportItem
26
+ * @returns
27
27
  */
28
28
  @Directive('@privilege(category: "inventory", privilege: "query")')
29
29
  @Directive('@transaction')
@@ -45,7 +45,7 @@ export class InventoryQuery {
45
45
  const remainOnlyParam = filters.find((filter: any) => filter.name == 'remainOnly')
46
46
  const bizplace = filters.find((filter: any) => filter.name === 'bizplace')
47
47
 
48
- filters = filters.filter(x => (['productInfo', 'remainOnly']).indexOf(x.name) < 0)
48
+ filters = filters.filter(x => ['productInfo', 'remainOnly'].indexOf(x.name) < 0)
49
49
 
50
50
  const params = { filters, pagination }
51
51
 
@@ -66,7 +66,12 @@ export class InventoryQuery {
66
66
 
67
67
  qb.leftJoinAndSelect('inventory.bizplace', 'bizplace')
68
68
  .leftJoinAndSelect('inventory.product', 'product')
69
- .leftJoinAndSelect('product.productDetails', 'productDetail', 'productDetail.id = inventory.product_detail_id')
69
+ .leftJoinAndSelect('inventory.productDetail', 'productDetail')
70
+ .leftJoinAndSelect(
71
+ 'product.productDetails',
72
+ 'productDetails',
73
+ 'productDetails.id = inventory.product_detail_id'
74
+ )
70
75
  .leftJoinAndSelect('inventory.warehouse', 'warehouse')
71
76
  .leftJoinAndSelect('inventory.location', 'location')
72
77
  .leftJoinAndSelect('inventory.creator', 'creator')
@@ -77,7 +82,10 @@ export class InventoryQuery {
77
82
  subQuery => {
78
83
  return subQuery
79
84
  .select('inventoryItems.inventory_id', 'inventory_item_inventory_id')
80
- .addSelect(`SUM(case when "inventoryItems"."status" = 'STORED' then 1 else 0 end)`, 'inventory_item_count')
85
+ .addSelect(
86
+ `SUM(case when "inventoryItems"."status" = 'STORED' then 1 else 0 end)`,
87
+ 'inventory_item_count'
88
+ )
81
89
  .addSelect(`string_agg(inventoryItems.serial_number, ', ')`, 'serial_numbers')
82
90
  .from('inventory_items', 'inventoryItems')
83
91
  .where(`inventoryItems.domain_id = :domainId`, { domainId: domain.id })
@@ -133,7 +141,9 @@ export class InventoryQuery {
133
141
  }
134
142
 
135
143
  if (locationSortingRules?.length > 0) {
136
- locationSortingRules.forEach((rule) => { qb.addOrderBy(`location.${rule.name}`, rule.desc ? 'DESC' : 'ASC') })
144
+ locationSortingRules.forEach(rule => {
145
+ qb.addOrderBy(`location.${rule.name}`, rule.desc ? 'DESC' : 'ASC')
146
+ })
137
147
  }
138
148
 
139
149
  // Fetch all row for exporting
@@ -645,7 +655,7 @@ export class InventoryQuery {
645
655
 
646
656
  const productBundleSettings: ProductBundleSetting[] = await getRepository(ProductBundleSetting).find({
647
657
  where: { productBundle: productBundleId },
648
- relations: ['product', 'productBundle']
658
+ relations: ['product', 'productDetail', 'productBundle']
649
659
  })
650
660
 
651
661
  if (!productBundleSettings.length) {
@@ -656,6 +666,7 @@ export class InventoryQuery {
656
666
  buildQuery(qb, params, context)
657
667
 
658
668
  qb.select('iv.product_id', 'productId')
669
+ .addSelect('iv.product_detail_id', 'productDetailId')
659
670
  .addSelect('iv.batch_id', 'batchId')
660
671
  .addSelect('iv.batch_id_ref', 'batchIdRef')
661
672
  .addSelect('iv.packing_type', 'packingType')
@@ -684,6 +695,7 @@ export class InventoryQuery {
684
695
  productIds: productBundleSettings.map(productBundle => productBundle.product.id)
685
696
  })
686
697
  .groupBy('iv.product_id')
698
+ .addGroupBy('iv.product_detail_id')
687
699
  .addGroupBy('iv.batch_id')
688
700
  .addGroupBy('iv.batch_id_ref')
689
701
  .addGroupBy('iv.packing_type')
@@ -712,6 +724,7 @@ export class InventoryQuery {
712
724
  return {
713
725
  id: pbs.id,
714
726
  productId: pbs.product.id,
727
+ productDetailId: pbs.productDetail.id,
715
728
  bundleId: pbs.productBundle.id,
716
729
  bundleQty: pbs.bundleQty,
717
730
  releaseQty: bundleReleaseQty * pbs.bundleQty,
@@ -210,6 +210,9 @@ export class Inventory {
210
210
  @Field({ nullable: true })
211
211
  productId: string
212
212
 
213
+ @Field({ nullable: true })
214
+ productDetailId: string
215
+
213
216
  @Field({ nullable: true })
214
217
  productName: string
215
218
 
@@ -6,8 +6,7 @@ import { Bizplace } from '@things-factory/biz-base'
6
6
  import { generateId } from '@things-factory/id-rule-base'
7
7
  import { MarketplaceStore } from '@things-factory/integration-marketplace'
8
8
  import { Sellercraft, SellercraftStatus } from '@things-factory/integration-sellercraft'
9
- import { sendNotification } from '@things-factory/notification'
10
- import { Product } from '@things-factory/product-base'
9
+ import { Product, ProductDetail } from '@things-factory/product-base'
11
10
  import { PartnerSetting, Setting } from '@things-factory/setting-base'
12
11
  import { Domain } from '@things-factory/shell'
13
12
 
@@ -138,14 +137,18 @@ export class InventoryChangeMutation {
138
137
  ) {
139
138
  const { domain, user, tx }: { domain: Domain; user: User; tx: EntityManager } = context.state
140
139
  try {
141
-
142
140
  const _createRecords = []
143
141
  const _updateRecords = []
144
142
 
145
143
  for (let i = 0; i < patches.length; i++) {
146
- let foundExistingPallet = await tx.getRepository(Inventory).createQueryBuilder('iv')
144
+ let foundExistingPallet = await tx
145
+ .getRepository(Inventory)
146
+ .createQueryBuilder('iv')
147
147
  .where('iv.domain_id = :domain_id', { domain_id: domain.id })
148
- .andWhere('(iv.pallet_id = :pallet_id or iv.id = :id)', { pallet_id: patches[i]?.palletId, id: patches[i]?.id })
148
+ .andWhere('(iv.pallet_id = :pallet_id or iv.id = :id)', {
149
+ pallet_id: patches[i]?.palletId,
150
+ id: patches[i]?.id
151
+ })
149
152
  .getOne()
150
153
 
151
154
  //remove any unchanged records
@@ -193,7 +196,9 @@ export class InventoryChangeMutation {
193
196
  newRecord.bizplace = await tx.getRepository(Bizplace).findOne(newRecord.bizplace.id)
194
197
 
195
198
  var product: Product = await tx.getRepository(Product).findOne(newRecord.product.id)
199
+ var productDetail: ProductDetail = await tx.getRepository(ProductDetail).findOne(newRecord.productDetailId)
196
200
  newRecord.product = product
201
+ newRecord.productDetail = productDetail
197
202
 
198
203
  newRecord.status = 'PENDING'
199
204
  newRecord.transactionType = 'NEW'
@@ -355,7 +360,9 @@ export class InventoryChangeMutation {
355
360
  newInventoryItemChange.status = updatedInventoryChange.status
356
361
  newInventoryItemChange.inventory = updatedInventoryChange.inventory
357
362
  newInventoryItemChange.inventoryItem =
358
- newInventoryItemChange?.type == INVENTORY_ITEM_CHANGE_TYPE.NEW ? null : inventoryItemChange.inventoryItem
363
+ newInventoryItemChange?.type == INVENTORY_ITEM_CHANGE_TYPE.NEW
364
+ ? null
365
+ : inventoryItemChange.inventoryItem
359
366
  newInventoryItemChange.inventoryChange = updatedInventoryChange
360
367
  newInventoryItemChange.domain = domain
361
368
  newInventoryItemChange.creator = user
@@ -417,11 +424,9 @@ export class InventoryChangeMutation {
417
424
  // }
418
425
 
419
426
  return true
420
-
421
427
  } catch (error) {
422
428
  throw error
423
429
  }
424
-
425
430
  }
426
431
 
427
432
  @Directive('@privilege(category: "inventory_adjustment_approval", privilege: "mutation")')
@@ -520,6 +525,7 @@ async function upsertInventoryItems(context, inventoryChange, approvalStatus, tx
520
525
  inventoryItem.serialNumber = inventoryItemChange.serialNumber
521
526
  inventoryItem.status = INVENTORY_STATUS.STORED
522
527
  inventoryItem.product = inventoryChange.inventory.product
528
+ inventoryItem.productDetail = inventoryChange.inventory.productDetail
523
529
  inventoryItem.domain = inventoryItemChange.domain
524
530
  inventoryItem.inventory = inventoryChange.inventory
525
531
  inventoryItem.source = INVENTORY_ITEM_SOURCE.ADJUSTMENT
@@ -539,7 +545,8 @@ async function upsertInventoryItems(context, inventoryChange, approvalStatus, tx
539
545
  inventoryItem = {
540
546
  ...existingInventoryItem,
541
547
  serialNumber: inventoryItemChange.serialNumber,
542
- product: inventoryItemChange.inventory.product
548
+ product: inventoryItemChange.inventory.product,
549
+ productDetail: inventoryItemChange.inventory.productDetail
543
550
  }
544
551
  } else if (changeType == INVENTORY_ITEM_CHANGE_TYPE.REMOVED) {
545
552
  inventoryItem = {
@@ -576,6 +583,7 @@ export async function approveInventoryChanges(patches: any, context: any) {
576
583
  'bizplace.company',
577
584
  'bizplace.company.domain',
578
585
  'product',
586
+ 'productDetail',
579
587
  'product.productDetails',
580
588
  'product.productDetails.childProductDetail',
581
589
  'location'
@@ -611,6 +619,7 @@ export async function approveInventoryChanges(patches: any, context: any) {
611
619
  'bizplace.company',
612
620
  'bizplace.company.domain',
613
621
  'product',
622
+ 'productDetail',
614
623
  'product.productDetails',
615
624
  'product.productDetails.childProductDetail',
616
625
  'warehouse',
@@ -620,8 +629,6 @@ export async function approveInventoryChanges(patches: any, context: any) {
620
629
  ]
621
630
  })
622
631
 
623
- const customerDomain: Domain = inventory.bizplace.domain
624
-
625
632
  // Check for locked inventory, and stop from udpating inventory
626
633
  if (inventory.qty < inventory.lockedQty) {
627
634
  arrLockedInventory.push(_inventoryChanges[i])
@@ -1425,7 +1425,7 @@ export class InventoryHistoryQuery {
1425
1425
  rih.bizplace_id as bizplace_id,
1426
1426
  cast(rih.created_at + (interval '8 hour') as DATE) as "tempDate"
1427
1427
  from reduced_inventory_histories rih
1428
- left join product_details pd on pd.product_id = rih.product_id and pd.packing_type = rih.packing_type
1428
+ left join product_details pd on pd.id = rih.product_detail_id
1429
1429
  where rih.status not like 'TERMINATED' and rih.bizplace_id = $1
1430
1430
  group by CAST(rih.created_at + (interval '8 hour') as DATE), rih.bizplace_id
1431
1431
  )
@@ -11,7 +11,7 @@ import {
11
11
  } from 'typeorm'
12
12
 
13
13
  import { User } from '@things-factory/auth-base'
14
- import { Product } from '@things-factory/product-base'
14
+ import { Product, ProductDetail} from '@things-factory/product-base'
15
15
  import { Domain } from '@things-factory/shell'
16
16
 
17
17
  import { Inventory } from '../inventory/inventory'
@@ -32,7 +32,8 @@ export class InventoryItem {
32
32
 
33
33
  @RelationId((inventoryItem: InventoryItem) => inventoryItem.domain)
34
34
  domainId?: string
35
-
35
+
36
+
36
37
  @Column()
37
38
  @Field()
38
39
  name: string
@@ -57,13 +58,19 @@ export class InventoryItem {
57
58
  @Field({ nullable: true })
58
59
  outboundOrderId: string
59
60
 
61
+
60
62
  @ManyToOne(type => Product)
61
63
  @Field(type => Product, { nullable: true })
62
64
  product?: Product
63
65
 
66
+
64
67
  @RelationId((inventoryItem: InventoryItem) => inventoryItem.product)
65
68
  productId?: string
66
69
 
70
+ @ManyToOne(type => ProductDetail, { nullable: true })
71
+ @Field({ nullable: true })
72
+ productDetail: ProductDetail
73
+
67
74
  @ManyToOne(type => Inventory)
68
75
  @Field(type => Inventory)
69
76
  inventory?: Inventory
@@ -11,7 +11,7 @@ import {
11
11
  } from 'typeorm'
12
12
 
13
13
  import { User } from '@things-factory/auth-base'
14
- import { Product } from '@things-factory/product-base'
14
+ import { Product, ProductDetail } from '@things-factory/product-base'
15
15
  import { Domain } from '@things-factory/shell'
16
16
 
17
17
  @Entity()
@@ -60,6 +60,10 @@ export class InventoryProduct {
60
60
  @RelationId((inventoryProduct: InventoryProduct) => inventoryProduct.product)
61
61
  productId?: string
62
62
 
63
+ @ManyToOne(type => ProductDetail, { nullable: true })
64
+ @Field({ nullable: true })
65
+ productDetail: ProductDetail
66
+
63
67
  @CreateDateColumn()
64
68
  @Field({ nullable: true })
65
69
  createdAt?: Date
@@ -147,68 +147,134 @@ export async function generateInventoryHistory(
147
147
  }
148
148
  })
149
149
 
150
- let seq: number = 0
151
- let openingQty: number = 0
152
- let openingUomValue: number = 0
153
-
154
- if (lastInvHistory) {
155
- openingQty = lastInvHistory.openingQty + lastInvHistory.qty
156
- openingUomValue = lastInvHistory.openingUomValue + lastInvHistory.uomValue
157
- seq = lastInvHistory.seq + 1
158
- }
159
-
160
- let remainQty = (openingQty || 0) + (qty || 0)
161
-
162
- let inventoryHistory: any = new InventoryHistory()
163
-
164
- inventoryHistory = {
165
- ...inventory,
166
- name: InventoryNoGenerator.inventoryHistoryName(),
167
- inventory,
168
- seq: seq,
169
- status: remainQty == 0 ? INVENTORY_STATUS.TERMINATED : inventory.status,
170
- transactionType,
150
+ let lastSeq: number
151
+ let res: any
152
+ let inventoryHistoryFields: any = {
171
153
  refOrderId: refOrder?.id || null,
172
154
  orderNo: refOrder?.name || null,
173
155
  orderRefNo: refOrder?.refNo || null,
174
- qty,
175
- openingQty,
176
- uomValue,
177
- openingUomValue: openingUomValue,
156
+ uom: inventory?.uom,
157
+
178
158
  creator: user,
179
- updater: user
159
+ updater: user,
160
+ domain: inventory?.domain,
161
+ bizplace: inventory?.bizplace,
162
+ reusablePallet: inventory?.reusablePallet,
163
+ inventory: inventory,
164
+ product: inventory?.product,
165
+ warehouse: inventory?.warehouse,
166
+ location: inventory?.location,
167
+
168
+ palletId: inventory?.palletId,
169
+ batchId: inventory?.batchId,
170
+ zone: inventory?.zone,
171
+ packingType: inventory?.packingType,
172
+ description: inventory?.description,
173
+ expirationDate: inventory?.expirationDate,
174
+ unitCost: inventory?.unitCost,
175
+ batchIdRef: inventory?.batchIdRef,
176
+ cartonId: inventory?.cartonId,
177
+ manufactureYear: inventory?.manufactureYear,
178
+ packingSize: inventory?.packingSize,
179
+ manufactureDate: inventory?.manufactureDate
180
180
  }
181
181
 
182
- delete inventoryHistory.updatedAt
183
- delete inventoryHistory.createdAt
184
- delete inventoryHistory.id
185
-
186
- let newInventoryHistory = await invHistoryRepo.save(inventoryHistory)
187
-
188
- if (remainQty == 0) {
189
- seq = seq + 1
190
- let terminatedHistory = {
191
- ...newInventoryHistory,
192
- name: InventoryNoGenerator.inventoryHistoryName(),
193
- seq: seq,
194
- status: INVENTORY_STATUS.TERMINATED,
195
- transactionType: INVENTORY_TRANSACTION_TYPE.TERMINATED,
196
- uom: inventory.uom,
197
- qty: 0,
198
- openingQty: 0,
199
- uomValue: 0,
200
- openingUomValue: 0
182
+ if (!lastInvHistory) {
183
+ res = await invHistoryRepo
184
+ .createQueryBuilder()
185
+ .insert()
186
+ .into(InventoryHistory)
187
+ .values([
188
+ {
189
+ ...inventoryHistoryFields,
190
+ name: InventoryNoGenerator.inventoryHistoryName(),
191
+ status: inventory.status,
192
+ transactionType,
193
+ qty,
194
+ openingQty: 0,
195
+ uomValue,
196
+ openingUomValue: 0,
197
+ seq: 0
198
+ }
199
+ ])
200
+ .returning('*')
201
+ .execute()
202
+ }
203
+ else {
204
+ if (transactionType == 'PICKING' || transactionType == 'UNLOADING') {
205
+ const findSameOrderHistory: InventoryHistory[] = await invHistoryRepo.find({
206
+ domain: inventory.domain,
207
+ palletId: inventory.palletId,
208
+ refOrderId: refOrder.id
209
+ })
210
+
211
+ if (findSameOrderHistory.length > 0) {
212
+ let prevTotalQty = 0
213
+ let prevTotalUomValue = 0
214
+ for (let oh of findSameOrderHistory) {
215
+ prevTotalQty += oh.qty
216
+ prevTotalUomValue += oh.uomValue
217
+ }
218
+ qty -= prevTotalQty
219
+ uomValue -= prevTotalUomValue
220
+ }
201
221
  }
222
+
223
+ res = await invHistoryRepo
224
+ .createQueryBuilder()
225
+ .insert()
226
+ .into(InventoryHistory)
227
+ .values([
228
+ {
229
+ ...inventoryHistoryFields,
230
+ name: InventoryNoGenerator.inventoryHistoryName(),
231
+ status: () =>
232
+ `(select case when opening_qty + ${qty} = 0 then 'TERMINATED' else 'STORED' end as status from inventory_histories where inventory_id = '${inventory.id}' order by seq desc limit 1)`,
233
+ transactionType,
234
+ qty,
235
+ openingQty: () =>
236
+ `(select opening_qty from inventory_histories where inventory_id = '${inventory.id}' order by seq desc limit 1) + ${qty}`,
237
+ uomValue,
238
+ openingUomValue: () =>
239
+ `(select opening_uom_value from inventory_histories where inventory_id = '${inventory.id}' order by seq desc limit 1) + ${uomValue}`,
240
+ seq: () =>
241
+ `(select seq from inventory_histories where inventory_id = '${inventory.id}' order by seq desc limit 1) + 1`
242
+ }
243
+ ])
244
+ .returning('*')
245
+ .execute()
246
+ }
202
247
 
203
- delete terminatedHistory.id
204
-
205
- newInventoryHistory = await invHistoryRepo.save(terminatedHistory)
248
+ let newInventoryHistory: InventoryHistory = res.generatedMaps[0]
249
+ lastSeq = newInventoryHistory.seq
250
+
251
+ if (newInventoryHistory.openingQty == 0) {
252
+ let terminatedRes = await invHistoryRepo
253
+ .createQueryBuilder()
254
+ .insert()
255
+ .into(InventoryHistory)
256
+ .values([
257
+ {
258
+ ...inventoryHistoryFields,
259
+ name: InventoryNoGenerator.inventoryHistoryName(),
260
+ status: INVENTORY_STATUS.TERMINATED,
261
+ transactionType: INVENTORY_TRANSACTION_TYPE.TERMINATED,
262
+ qty: 0,
263
+ openingQty: 0,
264
+ uomValue: 0,
265
+ openingUomValue: 0,
266
+ seq: () =>
267
+ `(select seq from inventory_histories where inventory_id = '${inventory.id}' order by seq desc limit 1) + 1`
268
+ }
269
+ ])
270
+ .returning('seq')
271
+ .execute()
272
+
273
+ lastSeq = terminatedRes.generatedMaps[0].seq
206
274
  inventory.status = INVENTORY_STATUS.TERMINATED
207
275
  }
208
276
 
209
- if (inventory.lastSeq !== seq) {
210
- await invRepo.update(inventory.id, { lastSeq: newInventoryHistory.seq, updater: user })
211
- }
277
+ await invRepo.update(inventory.id, { lastSeq, updater: user })
212
278
 
213
279
  await switchLocationStatus(domain, location, user, trxMgr)
214
280
  return newInventoryHistory