@things-factory/worksheet-base 4.0.24 → 4.0.28

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 (93) hide show
  1. package/dist-server/controllers/ecommerce/ecommerce-controller.js +10 -3
  2. package/dist-server/controllers/ecommerce/ecommerce-controller.js.map +1 -1
  3. package/dist-server/controllers/ecommerce/sellercraft-controller.js +5 -3
  4. package/dist-server/controllers/ecommerce/sellercraft-controller.js.map +1 -1
  5. package/dist-server/controllers/inbound/putaway-returning-worksheet-controller.js +24 -4
  6. package/dist-server/controllers/inbound/putaway-returning-worksheet-controller.js.map +1 -1
  7. package/dist-server/controllers/inbound/unloading-worksheet-controller.js +98 -140
  8. package/dist-server/controllers/inbound/unloading-worksheet-controller.js.map +1 -1
  9. package/dist-server/controllers/outbound/packing-worksheet-controller.js +2 -6
  10. package/dist-server/controllers/outbound/packing-worksheet-controller.js.map +1 -1
  11. package/dist-server/controllers/outbound/picking-worksheet-controller.js +4 -4
  12. package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
  13. package/dist-server/controllers/render-grn.js +7 -2
  14. package/dist-server/controllers/render-grn.js.map +1 -1
  15. package/dist-server/controllers/render-manual-do.js +4 -3
  16. package/dist-server/controllers/render-manual-do.js.map +1 -1
  17. package/dist-server/controllers/render-orientage-do.js +3 -3
  18. package/dist-server/controllers/render-orientage-do.js.map +1 -1
  19. package/dist-server/controllers/render-orientage-grn.js +4 -4
  20. package/dist-server/controllers/render-orientage-grn.js.map +1 -1
  21. package/dist-server/controllers/render-ro-do.js +1 -0
  22. package/dist-server/controllers/render-ro-do.js.map +1 -1
  23. package/dist-server/controllers/worksheet-controller.js +5 -5
  24. package/dist-server/controllers/worksheet-controller.js.map +1 -1
  25. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-multiple-release-good-worksheet.js +14 -0
  26. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-multiple-release-good-worksheet.js.map +1 -0
  27. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-release-good-worksheet.js.map +1 -1
  28. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/index.js +2 -1
  29. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/index.js.map +1 -1
  30. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +8 -4
  31. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
  32. package/dist-server/graphql/resolvers/worksheet/picking/activate-picking.js +6 -4
  33. package/dist-server/graphql/resolvers/worksheet/picking/activate-picking.js.map +1 -1
  34. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +4 -7
  35. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
  36. package/dist-server/graphql/resolvers/worksheet/picking/fetch-and-assign-picking-task.js +64 -54
  37. package/dist-server/graphql/resolvers/worksheet/picking/fetch-and-assign-picking-task.js.map +1 -1
  38. package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js +1 -0
  39. package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js.map +1 -1
  40. package/dist-server/graphql/resolvers/worksheet/putaway-returning-worksheet.js +5 -1
  41. package/dist-server/graphql/resolvers/worksheet/putaway-returning-worksheet.js.map +1 -1
  42. package/dist-server/graphql/resolvers/worksheet/putaway-worksheet.js +6 -2
  43. package/dist-server/graphql/resolvers/worksheet/putaway-worksheet.js.map +1 -1
  44. package/dist-server/graphql/resolvers/worksheet/return-worksheet.js +3 -1
  45. package/dist-server/graphql/resolvers/worksheet/return-worksheet.js.map +1 -1
  46. package/dist-server/graphql/resolvers/worksheet/sorting-worksheet.js +2 -1
  47. package/dist-server/graphql/resolvers/worksheet/sorting-worksheet.js.map +1 -1
  48. package/dist-server/graphql/resolvers/worksheet/unloading/index.js +4 -5
  49. package/dist-server/graphql/resolvers/worksheet/unloading/index.js.map +1 -1
  50. package/dist-server/graphql/resolvers/worksheet/unloading/undo-unloading.js +4 -4
  51. package/dist-server/graphql/resolvers/worksheet/unloading/undo-unloading.js.map +1 -1
  52. package/dist-server/graphql/resolvers/worksheet/unloading-worksheet.js +4 -2
  53. package/dist-server/graphql/resolvers/worksheet/unloading-worksheet.js.map +1 -1
  54. package/dist-server/graphql/resolvers/worksheet/worksheet.js +28 -1
  55. package/dist-server/graphql/resolvers/worksheet/worksheet.js.map +1 -1
  56. package/dist-server/graphql/types/worksheet/index.js +7 -8
  57. package/dist-server/graphql/types/worksheet/index.js.map +1 -1
  58. package/dist-server/graphql/types/worksheet/worksheet-info.js +1 -0
  59. package/dist-server/graphql/types/worksheet/worksheet-info.js.map +1 -1
  60. package/package.json +16 -16
  61. package/server/controllers/ecommerce/ecommerce-controller.ts +18 -4
  62. package/server/controllers/ecommerce/sellercraft-controller.ts +11 -5
  63. package/server/controllers/inbound/putaway-returning-worksheet-controller.ts +28 -6
  64. package/server/controllers/inbound/unloading-worksheet-controller.ts +130 -152
  65. package/server/controllers/outbound/packing-worksheet-controller.ts +2 -7
  66. package/server/controllers/outbound/picking-worksheet-controller.ts +4 -4
  67. package/server/controllers/render-grn.ts +7 -2
  68. package/server/controllers/render-manual-do.ts +7 -4
  69. package/server/controllers/render-orientage-do.ts +7 -5
  70. package/server/controllers/render-orientage-grn.ts +9 -7
  71. package/server/controllers/render-ro-do.ts +1 -0
  72. package/server/controllers/worksheet-controller.ts +5 -5
  73. package/server/graphql/resolvers/worksheet/generate-worksheet/generate-multiple-release-good-worksheet.ts +22 -0
  74. package/server/graphql/resolvers/worksheet/generate-worksheet/generate-release-good-worksheet.ts +3 -1
  75. package/server/graphql/resolvers/worksheet/generate-worksheet/index.ts +2 -0
  76. package/server/graphql/resolvers/worksheet/packing-worksheet.ts +9 -5
  77. package/server/graphql/resolvers/worksheet/picking/activate-picking.ts +7 -4
  78. package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +4 -8
  79. package/server/graphql/resolvers/worksheet/picking/fetch-and-assign-picking-task.ts +67 -56
  80. package/server/graphql/resolvers/worksheet/picking-worksheet.ts +1 -0
  81. package/server/graphql/resolvers/worksheet/putaway-returning-worksheet.ts +9 -3
  82. package/server/graphql/resolvers/worksheet/putaway-worksheet.ts +9 -3
  83. package/server/graphql/resolvers/worksheet/return-worksheet.ts +7 -3
  84. package/server/graphql/resolvers/worksheet/sorting-worksheet.ts +5 -2
  85. package/server/graphql/resolvers/worksheet/unloading/index.ts +3 -5
  86. package/server/graphql/resolvers/worksheet/unloading/undo-unloading.ts +9 -6
  87. package/server/graphql/resolvers/worksheet/unloading-worksheet.ts +7 -3
  88. package/server/graphql/resolvers/worksheet/worksheet.ts +29 -1
  89. package/server/graphql/types/worksheet/index.ts +8 -9
  90. package/server/graphql/types/worksheet/worksheet-info.ts +1 -0
  91. package/dist-server/graphql/resolvers/worksheet/unloading/undo-product-scan-unload.js +0 -15
  92. package/dist-server/graphql/resolvers/worksheet/unloading/undo-product-scan-unload.js.map +0 -1
  93. package/server/graphql/resolvers/worksheet/unloading/undo-product-scan-unload.ts +0 -23
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@things-factory/worksheet-base",
3
- "version": "4.0.24",
3
+ "version": "4.0.28",
4
4
  "main": "dist-server/index.js",
5
5
  "browser": "client/index.js",
6
6
  "things-factory": true,
@@ -24,20 +24,20 @@
24
24
  "migration:create": "node ../../node_modules/typeorm/cli.js migration:create -d ./server/migrations"
25
25
  },
26
26
  "dependencies": {
27
- "@things-factory/auth-base": "^4.0.24",
28
- "@things-factory/biz-base": "^4.0.24",
29
- "@things-factory/document-template-base": "^4.0.24",
30
- "@things-factory/id-rule-base": "^4.0.24",
31
- "@things-factory/integration-lmd": "^4.0.24",
32
- "@things-factory/integration-marketplace": "^4.0.24",
33
- "@things-factory/integration-sellercraft": "^4.0.24",
34
- "@things-factory/marketplace-base": "^4.0.24",
35
- "@things-factory/notification": "^4.0.24",
36
- "@things-factory/sales-base": "^4.0.24",
37
- "@things-factory/setting-base": "^4.0.24",
38
- "@things-factory/shell": "^4.0.24",
39
- "@things-factory/transport-base": "^4.0.24",
40
- "@things-factory/warehouse-base": "^4.0.24"
27
+ "@things-factory/auth-base": "^4.0.28",
28
+ "@things-factory/biz-base": "^4.0.28",
29
+ "@things-factory/document-template-base": "^4.0.28",
30
+ "@things-factory/id-rule-base": "^4.0.28",
31
+ "@things-factory/integration-lmd": "^4.0.28",
32
+ "@things-factory/integration-marketplace": "^4.0.28",
33
+ "@things-factory/integration-sellercraft": "^4.0.28",
34
+ "@things-factory/marketplace-base": "^4.0.28",
35
+ "@things-factory/notification": "^4.0.28",
36
+ "@things-factory/sales-base": "^4.0.28",
37
+ "@things-factory/setting-base": "^4.0.28",
38
+ "@things-factory/shell": "^4.0.28",
39
+ "@things-factory/transport-base": "^4.0.28",
40
+ "@things-factory/warehouse-base": "^4.0.28"
41
41
  },
42
- "gitHead": "ba94f3effd113a235e78a34391dbcd259ed410b0"
42
+ "gitHead": "fc526e27ae290a6fa3f001ce7ee75a2904b1d363"
43
43
  }
@@ -1,3 +1,5 @@
1
+ import { Equal, Not } from 'typeorm'
2
+
1
3
  import { MarketplaceSetting, MarketplaceStore, StoreAPI } from '@things-factory/integration-marketplace'
2
4
  import {
3
5
  MarketplaceOrder,
@@ -6,7 +8,7 @@ import {
6
8
  } from '@things-factory/marketplace-base'
7
9
  import { ReleaseGood } from '@things-factory/sales-base'
8
10
  import { Domain } from '@things-factory/shell'
9
- import { getProductBundleInventory, Inventory } from '@things-factory/warehouse-base'
11
+ import { getProductBundleInventory, Inventory, INVENTORY_STATUS, LOCATION_TYPE } from '@things-factory/warehouse-base'
10
12
 
11
13
  import { WorksheetController } from '../worksheet-controller'
12
14
 
@@ -19,10 +21,20 @@ export class EcommerceController extends WorksheetController {
19
21
  let inventoryProducts: any[] = await Promise.all(
20
22
  orderProducts.map(async orderProduct => {
21
23
  const product = orderProduct.product
22
- const inventories: Inventory[] = await this.trxMgr.getRepository(Inventory).find({
23
- where: { domain: this.domain, product: orderProduct.product }
24
+ let inventories: Inventory[] = await this.trxMgr.getRepository(Inventory).find({
25
+ where: {
26
+ domain: this.domain,
27
+ product: orderProduct.product,
28
+ status: Not(Equal(INVENTORY_STATUS.TERMINATED))
29
+ },
30
+ relations: ['location']
24
31
  })
25
32
 
33
+ inventories = inventories.filter(
34
+ inventory =>
35
+ inventory?.location.type !== LOCATION_TYPE.QUARANTINE || inventory?.location.type !== LOCATION_TYPE.RESERVE
36
+ )
37
+
26
38
  const inventoryQty: number = inventories.reduce((total, currentValue) => {
27
39
  total += currentValue.qty
28
40
  return total
@@ -74,7 +86,9 @@ export class EcommerceController extends WorksheetController {
74
86
  }
75
87
 
76
88
  let productVariationLocationId = marketplaceProductVariation?.locationId
77
- let adjustQty: number = Math.floor(inventoryProduct.qty * (percentageValue / 100))
89
+ let adjustQty: number = Math.floor(
90
+ (inventoryProduct.qty - marketplaceProductVariation.reserveQty) * (percentageValue / 100)
91
+ )
78
92
 
79
93
  if (marketplaceStore.platform === 'shopify') {
80
94
  let locationIds: any[] = JSON.parse(productVariationLocationId)
@@ -10,7 +10,7 @@ import {
10
10
  ReleaseGood,
11
11
  ReturnOrder
12
12
  } from '@things-factory/sales-base'
13
- import { Inventory, INVENTORY_STATUS } from '@things-factory/warehouse-base'
13
+ import { Inventory, INVENTORY_STATUS, LOCATION_TYPE } from '@things-factory/warehouse-base'
14
14
 
15
15
  import { WorksheetController } from '../worksheet-controller'
16
16
 
@@ -113,10 +113,16 @@ export class SellercraftController extends WorksheetController {
113
113
  async updateSellercraftStock(sellercraft: Sellercraft, inventory: Inventory): Promise<void> {
114
114
  let product: Product = inventory.product
115
115
  const productDetails: ProductDetail[] = product.productDetails
116
- const inventories: Inventory[] = await this.trxMgr.getRepository(Inventory).find({
117
- where: { domain: this.domain, product, status: Not(Equal(INVENTORY_STATUS.TERMINATED)) }
116
+ let inventories: Inventory[] = await this.trxMgr.getRepository(Inventory).find({
117
+ where: { domain: this.domain, product, status: Not(Equal(INVENTORY_STATUS.TERMINATED)) },
118
+ relations: ['location']
118
119
  })
119
120
 
121
+ inventories = inventories.filter(
122
+ inventory =>
123
+ inventory?.location.type !== LOCATION_TYPE.QUARANTINE || inventory?.location.type !== LOCATION_TYPE.RESERVE
124
+ )
125
+
120
126
  let defaultProductDetail: ProductDetail
121
127
  const sellercraftInvs: any[] = await Promise.all(
122
128
  inventories.map(async (inventory: Inventory) => {
@@ -158,7 +164,7 @@ export class SellercraftController extends WorksheetController {
158
164
  await SellercraftAPI.updateProduct(sellercraft, { sellercraftInv })
159
165
  }
160
166
 
161
- async initiateOrderShipment(sellercraft: Sellercraft, releaseGood: ReleaseGood): Promise<void> {
167
+ async initiateOrderShipment(sellercraft: Sellercraft, releaseGood: ReleaseGood): Promise<ReleaseGood> {
162
168
  const orderInformation: any = {
163
169
  accountId: sellercraft.accountId,
164
170
  orderId: releaseGood.refNo2,
@@ -179,7 +185,7 @@ export class SellercraftController extends WorksheetController {
179
185
  }
180
186
  if (dropoffAddress) releaseGood.dropoffAddress = dropoffAddress
181
187
  releaseGood.updater = this.user
182
- await this.trxMgr.getRepository(ReleaseGood).save(releaseGood)
188
+ return await this.trxMgr.getRepository(ReleaseGood).save(releaseGood)
183
189
  }
184
190
 
185
191
  async initiateOrderDocument(sellercraft: Sellercraft, releaseGood: ReleaseGood): Promise<void> {
@@ -1,11 +1,13 @@
1
+ import { Equal, In, Not } from 'typeorm'
2
+
1
3
  import { Bizplace } from '@things-factory/biz-base'
2
4
  import {
3
- OrderInventory,
4
- OrderNoGenerator,
5
5
  ORDER_INVENTORY_STATUS,
6
6
  ORDER_PRODUCT_STATUS,
7
7
  ORDER_STATUS,
8
8
  ORDER_TYPES,
9
+ OrderInventory,
10
+ OrderNoGenerator,
9
11
  ReturnOrder
10
12
  } from '@things-factory/sales-base'
11
13
  import {
@@ -17,7 +19,7 @@ import {
17
19
  Pallet,
18
20
  Warehouse
19
21
  } from '@things-factory/warehouse-base'
20
- import { Equal, In, Not } from 'typeorm'
22
+
21
23
  import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../constants'
22
24
  import { Worksheet, WorksheetDetail } from '../../entities'
23
25
  import { switchLocationStatus } from '../../utils'
@@ -207,7 +209,13 @@ export class PutawayReturningWorksheetController extends VasWorksheetController
207
209
  where: {
208
210
  domain: this.domain,
209
211
  name: locationName,
210
- type: In([LOCATION_TYPE.SHELF, LOCATION_TYPE.BUFFER, LOCATION_TYPE.FLOOR])
212
+ type: In([
213
+ LOCATION_TYPE.SHELF,
214
+ LOCATION_TYPE.BUFFER,
215
+ LOCATION_TYPE.FLOOR,
216
+ LOCATION_TYPE.QUARANTINE,
217
+ LOCATION_TYPE.RESERVED
218
+ ])
211
219
  },
212
220
  relations: ['warehouse']
213
221
  })
@@ -253,7 +261,14 @@ export class PutawayReturningWorksheetController extends VasWorksheetController
253
261
  where: {
254
262
  domain: this.domain,
255
263
  name: locationName,
256
- type: In([LOCATION_TYPE.SHELF, LOCATION_TYPE.BUFFER, LOCATION_TYPE.FLOOR, LOCATION_TYPE.BIN])
264
+ type: In([
265
+ LOCATION_TYPE.SHELF,
266
+ LOCATION_TYPE.BUFFER,
267
+ LOCATION_TYPE.FLOOR,
268
+ LOCATION_TYPE.BIN,
269
+ LOCATION_TYPE.QUARANTINE,
270
+ LOCATION_TYPE.RESERVED
271
+ ])
257
272
  },
258
273
  relations: ['warehouse']
259
274
  })
@@ -298,7 +313,14 @@ export class PutawayReturningWorksheetController extends VasWorksheetController
298
313
  where: {
299
314
  domain: this.domain,
300
315
  name: locationName,
301
- type: In([LOCATION_TYPE.SHELF, LOCATION_TYPE.FLOOR, LOCATION_TYPE.BIN, LOCATION_TYPE.BUFFER])
316
+ type: In([
317
+ LOCATION_TYPE.SHELF,
318
+ LOCATION_TYPE.FLOOR,
319
+ LOCATION_TYPE.BIN,
320
+ LOCATION_TYPE.BUFFER,
321
+ LOCATION_TYPE.QUARANTINE,
322
+ LOCATION_TYPE.RESERVED
323
+ ])
302
324
  },
303
325
  relations: ['warehouse']
304
326
  })
@@ -508,170 +508,148 @@ export class UnloadingWorksheetController extends VasWorksheetController {
508
508
  )
509
509
  }
510
510
 
511
- async undoUnload(worksheetDetailName: string, palletId: string): Promise<void> {
512
- const worksheetDetail: WorksheetDetail = await this.findWorksheetDetailByName(worksheetDetailName, [
513
- 'targetProduct',
514
- 'targetInventory',
515
- 'worksheet',
516
- 'worksheet.arrivalNotice',
517
- 'worksheet.returnOrder'
518
- ])
519
- this.checkRecordValidity(worksheetDetail, {
520
- status: (status: string) => {
521
- const availableStatus: string[] = [WORKSHEET_STATUS.EXECUTING, WORKSHEET_STATUS.PARTIALLY_UNLOADED]
522
- if (availableStatus.indexOf(status) < 0) {
523
- throw new Error(
524
- this.ERROR_MSG.VALIDITY.UNEXPECTED_FIELD_VALUE('status', 'Executing or Partially Unloaded', status)
525
- )
526
- }
527
- return true
528
- }
529
- })
530
-
531
- const worksheet: Worksheet = worksheetDetail.worksheet
532
-
533
- let arrivalNotice: ArrivalNotice
534
- let returnOrder: ReturnOrder
535
- if (worksheet?.arrivalNotice) arrivalNotice = worksheet.arrivalNotice
536
- else if (worksheet?.returnOrder) returnOrder = worksheet.returnOrder
537
-
538
- let inventory: Inventory = await this.trxMgr.getRepository(Inventory).findOne({
539
- where: { domain: this.domain, status: INVENTORY_STATUS.UNLOADED, palletId },
540
- relations: ['location']
541
- })
542
-
543
- const qty: number = inventory.qty
544
-
545
- if (arrivalNotice) {
546
- let targetProduct: OrderProduct = worksheetDetail.targetProduct
547
- targetProduct.actualPackQty -= qty
548
- targetProduct.actualPalletQty--
549
- targetProduct.remark = null
550
- targetProduct.issue = null
551
- targetProduct.status = ORDER_PRODUCT_STATUS.UNLOADING
552
- targetProduct.updater = this.user
553
- await this.updateOrderTargets([targetProduct])
554
- } else if (returnOrder) {
555
- let targetInventory: OrderInventory = worksheetDetail.targetInventory
556
- targetInventory.actualPackQty -= qty
557
- targetInventory.actualPalletQty--
558
- targetInventory.status = ORDER_PRODUCT_STATUS.UNLOADING
559
- targetInventory.updater = this.user
560
- await this.updateOrderTargets([targetInventory])
561
- }
562
-
563
- worksheetDetail.issue = null
564
- worksheetDetail.status = WORKSHEET_STATUS.EXECUTING
565
- worksheetDetail.updater = this.user
566
- await this.trxMgr.getRepository(WorksheetDetail).save(worksheetDetail)
567
-
568
- inventory.lastSeq++
569
- inventory.status = INVENTORY_STATUS.DELETED
570
- inventory = await this.transactionInventory(
571
- inventory,
572
- Boolean(arrivalNotice) ? arrivalNotice : returnOrder,
573
- -inventory.qty,
574
- -inventory.uomValue,
575
- INVENTORY_TRANSACTION_TYPE.UNDO_UNLOADING
576
- )
577
- inventory.qty = 0
578
- inventory.uomValue = 0
579
- inventory.updater = this.user
580
-
581
- await this.trxMgr.getRepository(InventoryHistory).update({ inventory }, { inventory: null })
582
-
583
- await this.trxMgr.getRepository(Inventory).delete({ id: inventory.id })
584
- }
511
+ async undoUnload(orderType: string, orderNo: string, inventoryIds: [string]): Promise<void> {
512
+ for (var i = 0; i < inventoryIds.length; i++) {
513
+ const inventoryId: string = inventoryIds[i]
514
+ let inventory: Inventory = await this.trxMgr.getRepository(Inventory).findOne({
515
+ where: { domain: this.domain, id: inventoryId },
516
+ relations: ['location', 'product']
517
+ })
585
518
 
586
- async undoProductScanUnload(worksheetDetailName: string, palletId: string, cartonId: string): Promise<void> {
587
- const worksheetDetail: WorksheetDetail = await this.findWorksheetDetailByName(worksheetDetailName, [
588
- 'targetProduct',
589
- 'targetInventory',
590
- 'bizplace',
591
- 'targetProduct.product',
592
- 'targetInventory.product',
593
- 'worksheet',
594
- 'worksheet.arrivalNotice',
595
- 'worksheet.returnOrder'
596
- ])
597
- this.checkRecordValidity(worksheetDetail, {
598
- status: (status: string) => {
599
- const availableStatus: string[] = [WORKSHEET_STATUS.EXECUTING, WORKSHEET_STATUS.PARTIALLY_UNLOADED]
600
- if (availableStatus.indexOf(status) < 0) {
601
- throw new Error(
602
- this.ERROR_MSG.VALIDITY.UNEXPECTED_FIELD_VALUE('status', 'Executing or Partially Unloaded', status)
603
- )
519
+ this.checkRecordValidity(inventory, {
520
+ status: (status: string) => {
521
+ const availableStatus: string[] = [INVENTORY_STATUS.UNLOADED, INVENTORY_STATUS.CHECKED]
522
+ if (availableStatus.indexOf(status) < 0) {
523
+ throw new Error(
524
+ this.ERROR_MSG.VALIDITY.UNEXPECTED_FIELD_VALUE(
525
+ 'status',
526
+ 'Inventory current status unable to undo',
527
+ status
528
+ )
529
+ )
530
+ }
531
+ return true
604
532
  }
605
- return true
606
- }
607
- })
533
+ })
608
534
 
609
- let targetProduct: OrderProduct = worksheetDetail.targetProduct
610
- let targetInventory: OrderInventory = worksheetDetail.targetInventory
611
- const bizplace: Bizplace = worksheetDetail.bizplace
612
- const arrivalNotice: ArrivalNotice = worksheetDetail.worksheet.arrivalNotice
613
- const returnOrder: ReturnOrder = worksheetDetail.worksheet.returnOrder
614
- const product: Product = Boolean(arrivalNotice) ? targetProduct.product : targetInventory.product
615
- const packingType: string = Boolean(arrivalNotice) ? targetProduct.packingType : targetInventory.packingType
616
- const packingSize: number = Boolean(arrivalNotice) ? targetProduct.packingSize : targetInventory.packingSize
617
- const batchId: string = Boolean(arrivalNotice) ? targetProduct.batchId : targetInventory.batchId
535
+ const qty: number = inventory.qty
536
+
537
+ let targetProduct: OrderProduct
538
+ let targetInventory: OrderInventory
539
+ let arrivalNotice: ArrivalNotice
540
+ let returnOrder: ReturnOrder
541
+ let worksheetDetail: WorksheetDetail
542
+
543
+ if (orderType === ORDER_TYPES.ARRIVAL_NOTICE) {
544
+ arrivalNotice = await this.trxMgr.getRepository(ArrivalNotice).findOne({
545
+ where: { domain: this.domain, name: orderNo },
546
+ relations: ['orderProducts', 'orderProducts.product']
547
+ })
548
+
549
+ targetProduct = arrivalNotice.orderProducts.find(
550
+ op =>
551
+ op.batchId == inventory.batchId &&
552
+ op.packingType == inventory.packingType &&
553
+ op.product.id === inventory.product.id
554
+ )
618
555
 
619
- const invQb: SelectQueryBuilder<Inventory> = await this.trxMgr
620
- .getRepository(Inventory)
621
- .createQueryBuilder('INV')
622
- .where('INV.domain_id = :domainId', { domainId: this.domain.id })
623
- .andWhere('INV.bizplace_id = :bizplaceId', { bizplaceId: bizplace.id })
624
- .andWhere('INV.product_id = :productId', { productId: product.id })
625
- .andWhere('INV.batch_id = :batchId', { batchId: batchId })
626
- .andWhere('INV.packing_type = :packingType', { packingType: packingType })
627
- .andWhere('INV.packing_size = :packingSize', { packingSize: packingSize })
556
+ if (inventory.status == INVENTORY_STATUS.UNLOADED) {
557
+ targetProduct.actualPackQty -= qty
558
+ targetProduct.actualPalletQty--
559
+ targetProduct.remark = null
560
+ targetProduct.issue = null
561
+ targetProduct.status = ORDER_PRODUCT_STATUS.UNLOADING
562
+ } else {
563
+ targetProduct.actualPackQty--
564
+ }
565
+ targetProduct.updater = this.user
566
+ await this.updateOrderTargets([targetProduct])
628
567
 
629
- if (arrivalNotice) invQb.andWhere('INV.ref_order_id = :arrivalNoticeId', { arrivalNoticeId: arrivalNotice.id })
630
- else if (returnOrder) invQb.andWhere('INV.ref_order_id = :returnOrderId', { returnOrderId: returnOrder.id })
568
+ worksheetDetail = await this.trxMgr
569
+ .getRepository(WorksheetDetail)
570
+ .findOne({ where: { domain: this.domain, targetProduct } })
571
+ } else {
572
+ returnOrder = await this.trxMgr.getRepository(ReturnOrder).findOne({
573
+ where: { domain: this.domain, name: orderNo },
574
+ relations: ['orderInventories', 'orderInventories.inventory', 'orderInventories.product']
575
+ })
576
+
577
+ targetInventory = returnOrder.orderInventories.find(
578
+ oi =>
579
+ oi.batchId == inventory.batchId &&
580
+ oi.packingType == inventory.packingType &&
581
+ oi.product.id == inventory.product.id &&
582
+ oi.inventory.id == inventory.id
583
+ )
584
+ if (inventory.status == INVENTORY_STATUS.UNLOADED) {
585
+ targetInventory.actualPackQty -= qty
586
+ targetInventory.actualPalletQty--
587
+ targetInventory.status = ORDER_PRODUCT_STATUS.UNLOADING
588
+ } else {
589
+ targetInventory.actualPackQty--
590
+ }
591
+ targetInventory.updater = this.user
592
+ await this.updateOrderTargets([targetInventory])
631
593
 
632
- if (cartonId) invQb.andWhere('INV.carton_id = :cartonId', { cartonId: cartonId })
633
- else invQb.andWhere('INV.pallet_id = :palletId', { palletId: palletId })
594
+ worksheetDetail = await this.trxMgr
595
+ .getRepository(WorksheetDetail)
596
+ .findOne({ where: { domain: this.domain, targetInventory } })
597
+ }
634
598
 
635
- let foundInventory: Inventory = await invQb.getOne()
636
- if (!foundInventory) throw new Error(this.ERROR_MSG.FIND.NO_RESULT(foundInventory.palletId))
599
+ if (inventory.status == INVENTORY_STATUS.CHECKED) {
600
+ inventory.qty--
601
+ inventory.uomValue =
602
+ Math.round(
603
+ inventory.qty *
604
+ (Boolean(orderType === ORDER_TYPES.ARRIVAL_NOTICE)
605
+ ? targetProduct.uomValue
606
+ : targetInventory.returnUomValue) *
607
+ 100
608
+ ) / 100
609
+ inventory.updater = this.user
610
+ await this.trxMgr.getRepository(Inventory).save(inventory)
611
+
612
+ if (inventory == 0) {
613
+ inventory.lastSeq++
614
+ inventory.status = INVENTORY_STATUS.DELETED
615
+ inventory = await this.transactionInventory(
616
+ inventory,
617
+ Boolean(orderType === ORDER_TYPES.ARRIVAL_NOTICE) ? arrivalNotice : returnOrder,
618
+ -inventory.qty,
619
+ -inventory.uomValue,
620
+ INVENTORY_TRANSACTION_TYPE.UNDO_UNLOADING
621
+ )
622
+ inventory.qty = 0
623
+ inventory.uomValue = 0
624
+ inventory.updater = this.user
637
625
 
638
- if (arrivalNotice) {
639
- targetProduct.actualPackQty--
640
- targetProduct.status = ORDER_PRODUCT_STATUS.UNLOADING
641
- targetProduct.updater = this.user
642
- } else if (returnOrder) {
643
- targetInventory.actualPackQty--
644
- targetInventory.status = ORDER_PRODUCT_STATUS.UNLOADING
645
- targetInventory.updater = this.user
646
- }
626
+ await this.trxMgr.getRepository(InventoryHistory).update({ inventory }, { inventory: null })
647
627
 
648
- foundInventory.qty--
649
- foundInventory.uomValue =
650
- Math.round(
651
- foundInventory.qty * (Boolean(arrivalNotice) ? targetProduct.uomValue : targetInventory.returnUomValue) * 100
652
- ) / 100
653
- foundInventory.updater = this.user
628
+ await this.trxMgr.getRepository(Inventory).delete({ id: inventory.id })
629
+ }
630
+ } else {
631
+ inventory.lastSeq++
632
+ inventory.status = INVENTORY_STATUS.DELETED
633
+ inventory = await this.transactionInventory(
634
+ inventory,
635
+ Boolean(orderType === ORDER_TYPES.ARRIVAL_NOTICE) ? arrivalNotice : returnOrder,
636
+ -inventory.qty,
637
+ -inventory.uomValue,
638
+ INVENTORY_TRANSACTION_TYPE.UNDO_UNLOADING
639
+ )
640
+ inventory.qty = 0
641
+ inventory.uomValue = 0
642
+ inventory.updater = this.user
654
643
 
655
- worksheetDetail.issue = foundInventory.qty == 0 && worksheetDetail.issue ? null : worksheetDetail.issue
656
- worksheetDetail.status = WORKSHEET_STATUS.EXECUTING
657
- worksheetDetail.updater = this.user
658
- await this.trxMgr.getRepository(WorksheetDetail).save(worksheetDetail)
644
+ await this.trxMgr.getRepository(InventoryHistory).update({ inventory }, { inventory: null })
659
645
 
660
- if (foundInventory.qty == 0) {
661
- if (arrivalNotice) {
662
- targetProduct.actualPalletQty--
663
- targetProduct.issue = null
664
- targetProduct.remark = null
665
- await this.updateOrderTargets([targetProduct])
666
- } else if (returnOrder) {
667
- targetInventory.actualPalletQty--
668
- await this.updateOrderTargets([targetInventory])
646
+ await this.trxMgr.getRepository(Inventory).delete({ id: inventory.id })
669
647
  }
670
- await this.trxMgr.getRepository(Inventory).delete({ id: foundInventory.id })
671
- } else {
672
- if (arrivalNotice) await this.updateOrderTargets([targetProduct])
673
- else if (returnOrder) await this.updateOrderTargets([targetInventory])
674
- await this.trxMgr.getRepository(Inventory).save(foundInventory)
648
+
649
+ worksheetDetail.issue = inventory.qty == 0 && worksheetDetail?.issue ? null : worksheetDetail.issue
650
+ worksheetDetail.status = WORKSHEET_STATUS.EXECUTING
651
+ worksheetDetail.updater = this.user
652
+ await this.trxMgr.getRepository(WorksheetDetail).save(worksheetDetail)
675
653
  }
676
654
  }
677
655
 
@@ -12,12 +12,11 @@ export class PackingWorksheetController extends VasWorksheetController {
12
12
  ReleaseGood,
13
13
  {
14
14
  domain: this.domain,
15
- name: releaseGoodNo,
16
- status: ORDER_STATUS.READY_TO_PACK
15
+ name: releaseGoodNo
17
16
  },
18
17
  ['orderInventories', 'orderInventories.inventory']
19
18
  )
20
- const orderInventories: OrderInventory[] = releaseGood.orderInventories
19
+ let orderInventories: OrderInventory[] = releaseGood.orderInventories
21
20
 
22
21
  const existingPackingWorksheet: Worksheet = await this.trxMgr.getRepository(Worksheet).findOne({
23
22
  where: { domain: this.domain, releaseGood, type: WORKSHEET_TYPE.PACKING, status: WORKSHEET_STATUS.DEACTIVATED }
@@ -40,10 +39,6 @@ export class PackingWorksheetController extends VasWorksheetController {
40
39
  })
41
40
  await this.updateOrderTargets(orderInventories)
42
41
 
43
- releaseGood.status = ORDER_STATUS.READY_TO_PACK
44
- releaseGood.updater = this.user
45
- await this.updateRefOrder(releaseGood)
46
-
47
42
  return worksheet
48
43
  }
49
44
 
@@ -823,16 +823,16 @@ export class PickingWorksheetController extends VasWorksheetController {
823
823
  status: ORDER_STATUS.PICKING
824
824
  })
825
825
 
826
- const worksheet: Worksheet = await this.findWorksheetByRefOrder(releaseGood, WORKSHEET_TYPE.PICKING, [
826
+ let worksheet: Worksheet = await this.findWorksheetByRefOrder(releaseGood, WORKSHEET_TYPE.PICKING, [
827
827
  'worksheetDetails',
828
828
  'worksheetDetails.targetInventory'
829
829
  ])
830
- this.checkRecordValidity(worksheet, { status: WORKSHEET_STATUS.EXECUTING })
830
+ await this.checkRecordValidity(worksheet, { status: WORKSHEET_STATUS.EXECUTING })
831
831
 
832
832
  let orderStatus: string
833
833
  if (releaseGood?.packingOption) {
834
834
  orderStatus = ORDER_STATUS.READY_TO_PACK
835
- } else if (!releaseGood?.courierOption && !releaseGood?.packingOption) {
835
+ } else {
836
836
  orderStatus = ORDER_STATUS.LOADING
837
837
  }
838
838
 
@@ -933,7 +933,7 @@ export class PickingWorksheetController extends VasWorksheetController {
933
933
  name: 'enable-bin-picking'
934
934
  }
935
935
  })
936
- if (binPickingSetting?.value && binPickingSetting.value.toLowerCase() === 'true') {
936
+ if (binPickingSetting != undefined && binPickingSetting.value.toLowerCase() == 'true') {
937
937
  if (binLocation) {
938
938
  const foundBinLocation: Location = await this.trxMgr.getRepository(Location).findOne({
939
939
  where: { domain: this.domain, name: binLocation, type: LOCATION_TYPE.BIN }
@@ -166,9 +166,12 @@ export async function renderGRN({ grnNo, timezoneOffSet }, context: any) {
166
166
  gan_accepted_at: foundGAN.acceptedAt ? DateTimeConverter.datetime(foundGAN.acceptedAt, timezoneOffSet) : '',
167
167
  unload_date: DateTimeConverter.date(foundWS.endedAt),
168
168
  ref_no: ownRefNo ? `${foundGAN.name} / ${foundGAN.refNo}` : `${foundGAN.name}`,
169
+ ref_no1: foundGAN.refNo2 ? `${foundGAN.refNo2}` : '',
170
+ ref_no2: foundGAN.refNo3 ? `${foundGAN.refNo3}` : '',
169
171
  received_date: DateTimeConverter.date(foundWS.endedAt),
170
172
  truck_no: foundGAN.truckNo || '',
171
173
  container_no: foundGAN.containerNo || '',
174
+ container_size: foundGAN.containerSize || '',
172
175
  delivery_order_no: foundGAN.deliveryOrderNo ? foundGAN.deliveryOrderNo : '',
173
176
  account_no: foundPartnerCP ? foundPartnerCP.accountNo : '',
174
177
  unloaded_by: foundWS ? foundWS.updater.name : '',
@@ -198,8 +201,10 @@ export async function renderGRN({ grnNo, timezoneOffSet }, context: any) {
198
201
  Math.round((unloadInvHistory.uomValue || item.uomValue * item.actualPackQty) * 100) / 100
199
202
  }`,
200
203
  product_uom: `${unloadInvHistory.uom || item.uom}`,
201
- expiry_date: unloadInvHistory.expiryDate || ``,
202
- reusable_pallet_id: unloadInvHistory.reusablePalletId || ``,
204
+ product_gross_weight: item.product.grossWeight || null,
205
+ unit_price: item.unitPrice || null,
206
+ expiry_date: unloadInvHistory.expiryDate || '',
207
+ reusable_pallet_id: unloadInvHistory.reusablePalletId || '',
203
208
  remark: (item.remark ? item.remark : '') + (item.issue ? ' [Issue]: ' + item.issue : '')
204
209
  }
205
210
  })
@@ -1,13 +1,15 @@
1
+ import FormData from 'form-data'
2
+ import fetch from 'node-fetch'
3
+ import { getRepository } from 'typeorm'
4
+
1
5
  import { Attachment, STORAGE } from '@things-factory/attachment-base'
2
6
  import { Partner } from '@things-factory/auth-base'
3
7
  import { Bizplace, ContactPoint } from '@things-factory/biz-base'
4
8
  import { config } from '@things-factory/env'
9
+ import { Product } from '@things-factory/product-base'
5
10
  import { DeliveryOrder, OrderInventory } from '@things-factory/sales-base'
6
11
  import { Domain } from '@things-factory/shell'
7
- import { Product } from '@things-factory/product-base'
8
- import FormData from 'form-data'
9
- import fetch from 'node-fetch'
10
- import { getRepository } from 'typeorm'
12
+
11
13
  import { TEMPLATE_TYPE } from '../constants'
12
14
 
13
15
  const REPORT_API_URL = config.get('reportApiUrl', 'http://localhost:8888/rest/report/show_html')
@@ -107,6 +109,7 @@ export async function renderManualDO({ doNo }, context: any) {
107
109
  product_batch: `${oi.batchId}`,
108
110
  product_qty: `${oi.releaseQty}`,
109
111
  product_weight: `${oi.releaseWeight}`,
112
+ product_gross_weight: product.grossWeight,
110
113
  product_uom_value: `${oi.releaseUomValue}`,
111
114
  product_uom: `${product.primaryUnit || ''}`,
112
115
  remark: `${oi.remark}`,
@@ -1,14 +1,16 @@
1
+ import FormData from 'form-data'
2
+ import fetch from 'node-fetch'
3
+ import { Equal, getRepository, In } from 'typeorm'
4
+
1
5
  import { Attachment, STORAGE } from '@things-factory/attachment-base'
2
6
  import { Partner } from '@things-factory/auth-base'
3
7
  import { Bizplace, ContactPoint } from '@things-factory/biz-base'
4
8
  import { config } from '@things-factory/env'
5
- import { DeliveryOrder, OrderInventory, ORDER_STATUS, ReleaseGood } from '@things-factory/sales-base'
9
+ import { ProductDetail } from '@things-factory/product-base'
10
+ import { DeliveryOrder, ORDER_STATUS, OrderInventory, ReleaseGood } from '@things-factory/sales-base'
6
11
  import { Domain } from '@things-factory/shell'
7
- import { Product, ProductDetail } from '@things-factory/product-base'
8
12
  import { Inventory, Pallet } from '@things-factory/warehouse-base'
9
- import FormData from 'form-data'
10
- import fetch from 'node-fetch'
11
- import { Equal, getRepository, In } from 'typeorm'
13
+
12
14
  import { TEMPLATE_TYPE, WORKSHEET_STATUS, WORKSHEET_TYPE } from '../constants'
13
15
  import { Worksheet, WorksheetDetail } from '../entities'
14
16