@things-factory/worksheet-base 4.1.40 → 4.2.1

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 (85) hide show
  1. package/dist-server/controllers/inbound/unloading-worksheet-controller.js +2 -0
  2. package/dist-server/controllers/inbound/unloading-worksheet-controller.js.map +1 -1
  3. package/dist-server/controllers/outbound/packing-worksheet-controller.js +166 -8
  4. package/dist-server/controllers/outbound/packing-worksheet-controller.js.map +1 -1
  5. package/dist-server/controllers/outbound/picking-worksheet-controller.js +22 -22
  6. package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
  7. package/dist-server/controllers/outbound/sorting-worksheet-controller.js +110 -3
  8. package/dist-server/controllers/outbound/sorting-worksheet-controller.js.map +1 -1
  9. package/dist-server/controllers/render-grn.js +2 -1
  10. package/dist-server/controllers/render-grn.js.map +1 -1
  11. package/dist-server/controllers/render-orientage-do.js +0 -31
  12. package/dist-server/controllers/render-orientage-do.js.map +1 -1
  13. package/dist-server/controllers/render-orientage-grn.js +1 -21
  14. package/dist-server/controllers/render-orientage-grn.js.map +1 -1
  15. package/dist-server/controllers/render-ro-do.js +2 -1
  16. package/dist-server/controllers/render-ro-do.js.map +1 -1
  17. package/dist-server/controllers/worksheet-controller.js +2 -1
  18. package/dist-server/controllers/worksheet-controller.js.map +1 -1
  19. package/dist-server/graphql/resolvers/worksheet/find-release-orders-by-task-no.js +30 -1
  20. package/dist-server/graphql/resolvers/worksheet/find-release-orders-by-task-no.js.map +1 -1
  21. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js +3 -0
  22. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js.map +1 -1
  23. package/dist-server/graphql/resolvers/worksheet/packing/index.js +2 -1
  24. package/dist-server/graphql/resolvers/worksheet/packing/index.js.map +1 -1
  25. package/dist-server/graphql/resolvers/worksheet/packing/packing.js +4 -4
  26. package/dist-server/graphql/resolvers/worksheet/packing/packing.js.map +1 -1
  27. package/dist-server/graphql/resolvers/worksheet/packing/scan-product-packing.js +4 -4
  28. package/dist-server/graphql/resolvers/worksheet/packing/scan-product-packing.js.map +1 -1
  29. package/dist-server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.js +15 -0
  30. package/dist-server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.js.map +1 -0
  31. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +152 -133
  32. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
  33. package/dist-server/graphql/resolvers/worksheet/picking/assign-picking-worker.js +3 -2
  34. package/dist-server/graphql/resolvers/worksheet/picking/assign-picking-worker.js.map +1 -1
  35. package/dist-server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.js +3 -3
  36. package/dist-server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.js.map +1 -1
  37. package/dist-server/graphql/resolvers/worksheet/sorting/scan-product-sorting.js +4 -4
  38. package/dist-server/graphql/resolvers/worksheet/sorting/scan-product-sorting.js.map +1 -1
  39. package/dist-server/graphql/resolvers/worksheet/sorting/sorting-product.js +4 -4
  40. package/dist-server/graphql/resolvers/worksheet/sorting/sorting-product.js.map +1 -1
  41. package/dist-server/graphql/resolvers/worksheet/sorting-worksheet.js +6 -0
  42. package/dist-server/graphql/resolvers/worksheet/sorting-worksheet.js.map +1 -1
  43. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js +4 -5
  44. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js.map +1 -1
  45. package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js +4 -2
  46. package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js.map +1 -1
  47. package/dist-server/graphql/types/worksheet/find-release-orders-by-task-no.js +11 -0
  48. package/dist-server/graphql/types/worksheet/find-release-orders-by-task-no.js.map +1 -0
  49. package/dist-server/graphql/types/worksheet/index.js +13 -2
  50. package/dist-server/graphql/types/worksheet/index.js.map +1 -1
  51. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js +2 -0
  52. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js.map +1 -1
  53. package/dist-server/graphql/types/worksheet-detail/index.js +0 -2
  54. package/dist-server/graphql/types/worksheet-detail/index.js.map +1 -1
  55. package/dist-server/utils/inventory-util.js +14 -25
  56. package/dist-server/utils/inventory-util.js.map +1 -1
  57. package/package.json +9 -9
  58. package/server/controllers/inbound/unloading-worksheet-controller.ts +2 -0
  59. package/server/controllers/outbound/packing-worksheet-controller.ts +217 -11
  60. package/server/controllers/outbound/picking-worksheet-controller.ts +23 -24
  61. package/server/controllers/outbound/sorting-worksheet-controller.ts +149 -4
  62. package/server/controllers/render-grn.ts +5 -5
  63. package/server/controllers/render-orientage-do.ts +12 -61
  64. package/server/controllers/render-orientage-grn.ts +13 -44
  65. package/server/controllers/render-ro-do.ts +34 -33
  66. package/server/controllers/worksheet-controller.ts +2 -1
  67. package/server/graphql/resolvers/worksheet/find-release-orders-by-task-no.ts +35 -2
  68. package/server/graphql/resolvers/worksheet/inventories-by-pallet.ts +2 -0
  69. package/server/graphql/resolvers/worksheet/packing/index.ts +3 -1
  70. package/server/graphql/resolvers/worksheet/packing/packing.ts +5 -4
  71. package/server/graphql/resolvers/worksheet/packing/scan-product-packing.ts +9 -4
  72. package/server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.ts +24 -0
  73. package/server/graphql/resolvers/worksheet/packing-worksheet.ts +166 -144
  74. package/server/graphql/resolvers/worksheet/picking/assign-picking-worker.ts +3 -2
  75. package/server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.ts +4 -4
  76. package/server/graphql/resolvers/worksheet/sorting/scan-product-sorting.ts +5 -4
  77. package/server/graphql/resolvers/worksheet/sorting/sorting-product.ts +5 -4
  78. package/server/graphql/resolvers/worksheet/sorting-worksheet.ts +6 -0
  79. package/server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.ts +10 -12
  80. package/server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.ts +4 -2
  81. package/server/graphql/types/worksheet/find-release-orders-by-task-no.ts +8 -0
  82. package/server/graphql/types/worksheet/index.ts +13 -2
  83. package/server/graphql/types/worksheet/worksheet-detail-info.ts +2 -0
  84. package/server/graphql/types/worksheet-detail/index.ts +0 -2
  85. package/server/utils/inventory-util.ts +15 -23
@@ -1,4 +1,3 @@
1
- import _ from 'lodash'
2
1
  import FormData from 'form-data'
3
2
  import fetch from 'node-fetch'
4
3
  import { Equal, getRepository, In } from 'typeorm'
@@ -11,7 +10,7 @@ import { ProductDetail } from '@things-factory/product-base'
11
10
  import { DeliveryOrder, ORDER_STATUS, OrderInventory, ReleaseGood } from '@things-factory/sales-base'
12
11
  import { Domain } from '@things-factory/shell'
13
12
  import { Inventory, Pallet } from '@things-factory/warehouse-base'
14
- import { InventoryItem } from '@things-factory/warehouse-base'
13
+
15
14
  import { TEMPLATE_TYPE, WORKSHEET_STATUS, WORKSHEET_TYPE } from '../constants'
16
15
  import { Worksheet, WorksheetDetail } from '../entities'
17
16
 
@@ -36,10 +35,6 @@ export async function renderOrientageDO({ doNo }, context: any) {
36
35
  ]
37
36
  }) // .. find do from deliveryOrderId
38
37
 
39
- let foundInventoryItem: InventoryItem[] = await getRepository(InventoryItem).query(
40
- `select row_number() over (partition by p.sku),p.sku,p.brand_sku, ii.serial_number from inventory_items ii left join products p on ii.product_id = p.id where outbound_order_id = '${foundDO.releaseGood.id}' group by p.sku,ii.serial_number,p.brand_sku`
41
- )
42
-
43
38
  const ownTransportFlag: Boolean = foundDO.ownCollection
44
39
 
45
40
  let foundCP: ContactPoint = null
@@ -155,20 +150,20 @@ export async function renderOrientageDO({ doNo }, context: any) {
155
150
  pack_size: matchedProductDetail
156
151
  ? matchedProductDetail.uomValue
157
152
  ? matchedProductDetail.uomValue +
158
- ' ' +
159
- matchedProductDetail.uom +
160
- (inventory.product.volumeSize
161
- ? ' x ' + (parseFloat(inventory.product.volumeSize) / 100).toFixed(2) + ' L'
162
- : '')
153
+ ' ' +
154
+ matchedProductDetail.uom +
155
+ (inventory.product.volumeSize
156
+ ? ' x ' + (parseFloat(inventory.product.volumeSize) / 100).toFixed(2) + ' L'
157
+ : '')
163
158
  : null
164
159
  : inventory.product.primaryValue
165
- ? inventory.product.primaryValue +
160
+ ? inventory.product.primaryValue +
166
161
  ' ' +
167
162
  inventory.product.primaryUnit +
168
163
  (inventory.product.volumeSize
169
164
  ? ' x ' + (parseFloat(inventory.product.volumeSize) / 100).toFixed(2) + ' L'
170
165
  : '')
171
- : null,
166
+ : null,
172
167
  aux_value_3: matchedProductDetail ? matchedProductDetail.auxValue3 : inventory.product.auxValue3,
173
168
  product_qty: targetInventory.inventory.warehouse !== 'DAMAGE ZONE' ? targetInventory.releaseQty : 0,
174
169
  product_qty_damage: targetInventory.inventory.warehouse === 'DAMAGE ZONE' ? targetInventory.releaseQty : 0,
@@ -181,15 +176,15 @@ export async function renderOrientageDO({ doNo }, context: any) {
181
176
  ? matchedProductDetail.volume
182
177
  : 0
183
178
  : inventory?.product?.volume
184
- ? inventory.product.volume
185
- : 0,
179
+ ? inventory.product.volume
180
+ : 0,
186
181
  total_volume: matchedProductDetail
187
182
  ? matchedProductDetail.volume
188
183
  ? Number((matchedProductDetail.volume * targetInventory.releaseQty).toFixed(4))
189
184
  : 0
190
185
  : inventory?.product?.volume
191
- ? Number((inventory.product.volume * targetInventory.releaseQty).toFixed(4))
192
- : 0,
186
+ ? Number((inventory.product.volume * targetInventory.releaseQty).toFixed(4))
187
+ : 0,
193
188
  remark: targetInventory.remark,
194
189
  inventory_remark: inventory.remark,
195
190
  cross_docking: targetInventory.crossDocking,
@@ -268,47 +263,6 @@ export async function renderOrientageDO({ doNo }, context: any) {
268
263
  })
269
264
  }
270
265
  }, [])
271
-
272
- let tempFoundInventoryItem:any = []
273
-
274
- productList.forEach((product) => {
275
-
276
- tempFoundInventoryItem = foundInventoryItem.filter((item) =>{
277
- return item.sku == product.product_sku
278
- })
279
-
280
- tempFoundInventoryItem.concat(tempFoundInventoryItem);
281
- })
282
-
283
- foundInventoryItem = tempFoundInventoryItem;
284
-
285
- const filterInventoryItem = _.groupBy(foundInventoryItem, i => i.sku)
286
-
287
- const tempIndexArr = []
288
-
289
- const tempTotalQuantity = []
290
-
291
- Object.keys(filterInventoryItem).forEach(k => {
292
- const tempIndex = foundInventoryItem.findIndex(i => {
293
- return i.sku == k
294
- })
295
-
296
- tempIndexArr.push(tempIndex)
297
- })
298
-
299
- Object.values(filterInventoryItem).forEach(k => {
300
- const tempQuantity = k.length
301
-
302
- tempTotalQuantity.push(tempQuantity)
303
- })
304
-
305
- tempIndexArr.forEach((t, index) => {
306
- foundInventoryItem[t].totalQuantity = tempTotalQuantity[index]
307
- })
308
-
309
- foundInventoryItem[0].ref_no = ownRefNo
310
-
311
-
312
266
 
313
267
  const data = {
314
268
  // logo_url: logo,
@@ -351,9 +305,6 @@ export async function renderOrientageDO({ doNo }, context: any) {
351
305
  batch_id_ref: prod.product_batch_ref,
352
306
  batch_id: prod.product_batch
353
307
  }
354
- }),
355
- serialNumber: foundInventoryItem.map((item: any, idx) => {
356
- return { ...item, delivery_to: foundDO.to }
357
308
  })
358
309
  } //.. make data from do
359
310
  const formData = new FormData()
@@ -1,7 +1,7 @@
1
- import _ from 'lodash'
2
1
  import FormData from 'form-data'
3
2
  import fetch from 'node-fetch'
4
3
  import { getRepository, IsNull, Not } from 'typeorm'
4
+
5
5
  import { Attachment, STORAGE } from '@things-factory/attachment-base'
6
6
  import { Partner } from '@things-factory/auth-base'
7
7
  import { Bizplace, ContactPoint } from '@things-factory/biz-base'
@@ -14,7 +14,6 @@ import {
14
14
  ORDER_STATUS,
15
15
  OrderProduct
16
16
  } from '@things-factory/sales-base'
17
- import { InventoryItem } from '@things-factory/warehouse-base'
18
17
  import { Domain } from '@things-factory/shell'
19
18
 
20
19
  import { TEMPLATE_TYPE } from '../constants'
@@ -41,10 +40,6 @@ export async function renderOrientageGRN({ grnNo }, context: any) {
41
40
  const ownRefNo2 = foundGAN.refNo2
42
41
  const ownRefNo3 = foundGAN.refNo3
43
42
 
44
- const foundInventoryItem: InventoryItem[] = await getRepository(InventoryItem).query(
45
- `select row_number() over (partition by p.sku),p.sku,p.brand_sku, ii.serial_number from inventory_items ii left join products p on ii.product_id = p.id where inbound_order_id = '${foundGAN.id}' group by p.sku,ii.serial_number,p.brand_sku`
46
- )
47
-
48
43
  // 4. find customer bizplace
49
44
  const partnerBiz: Bizplace = foundGRN.bizplace
50
45
 
@@ -95,31 +90,6 @@ export async function renderOrientageGRN({ grnNo }, context: any) {
95
90
  logo = 'data:' + foundLogo.mimetype + ';base64,' + (await STORAGE.readFile(foundLogo.path, 'base64'))
96
91
  }
97
92
 
98
- const filterInventoryItem = _.groupBy(foundInventoryItem, i => i.sku)
99
-
100
- const tempIndexArr = []
101
-
102
- const tempTotalQuantity = []
103
-
104
- Object.keys(filterInventoryItem).forEach(k => {
105
- const tempIndex = foundInventoryItem.findIndex(i => {
106
- return i.sku == k
107
- })
108
-
109
- tempIndexArr.push(tempIndex)
110
- })
111
-
112
- Object.values(filterInventoryItem).forEach(k => {
113
- const tempQuantity = k.length
114
-
115
- tempTotalQuantity.push(tempQuantity)
116
- })
117
-
118
- tempIndexArr.forEach((t, index) => {
119
- foundInventoryItem[t].totalQuantity = tempTotalQuantity[index]
120
- })
121
-
122
-
123
93
  const data = {
124
94
  logo_url: logo,
125
95
  customer_biz: partnerBiz.name,
@@ -153,16 +123,16 @@ export async function renderOrientageGRN({ grnNo }, context: any) {
153
123
  pack_size: matchedProductDetail
154
124
  ? matchedProductDetail.uomValue
155
125
  ? matchedProductDetail.uomValue +
156
- ' ' +
157
- matchedProductDetail.uom +
158
- (item.product.volumeSize ? ' x ' + (parseFloat(item.product.volumeSize) / 100).toFixed(2) + ' L' : '')
126
+ ' ' +
127
+ matchedProductDetail.uom +
128
+ (item.product.volumeSize ? ' x ' + (parseFloat(item.product.volumeSize) / 100).toFixed(2) + ' L' : '')
159
129
  : null
160
130
  : item.product.primaryValue
161
- ? item.product.primaryValue +
131
+ ? item.product.primaryValue +
162
132
  ' ' +
163
133
  item.product.primaryUnit +
164
134
  (item.product.volumeSize ? ' x ' + (parseFloat(item.product.volumeSize) / 100).toFixed(2) + ' L' : '')
165
- : null,
135
+ : null,
166
136
  pack_qty: item.packQty ? item.packQty : 0,
167
137
  actual_pack_qty: item.actualPackQty ? item.actualPackQty : 0,
168
138
  container_no: foundGAN.containerNo ? foundGAN.containerNo : '',
@@ -172,15 +142,15 @@ export async function renderOrientageGRN({ grnNo }, context: any) {
172
142
  ? matchedProductDetail.volume
173
143
  : 0
174
144
  : item?.product?.volume
175
- ? item.product.volume
176
- : 0,
145
+ ? item.product.volume
146
+ : 0,
177
147
  total_volume: matchedProductDetail
178
148
  ? matchedProductDetail.volume
179
149
  ? Number((matchedProductDetail.volume * item.actualPackQty).toFixed(4))
180
150
  : 0
181
151
  : item?.product?.volume
182
- ? Number((item.product.volume * item.actualPackQty).toFixed(4))
183
- : 0,
152
+ ? Number((item.product.volume * item.actualPackQty).toFixed(4))
153
+ : 0,
184
154
  manufacture_year: item.manufactureDate ? new Date(item.manufactureDate).getFullYear() : null,
185
155
  manufacture_date: item.manufactureDate ? item.manufactureDate : null,
186
156
  literage: matchedProductDetail
@@ -188,12 +158,11 @@ export async function renderOrientageGRN({ grnNo }, context: any) {
188
158
  ? parseFloat(matchedProductDetail.packingSize) * parseFloat(item.product.volumeSize)
189
159
  : 0
190
160
  : item.packingSize
191
- ? parseFloat(item.packingSize) * parseFloat(item.product.volumeSize)
192
- : 0,
161
+ ? parseFloat(item.packingSize) * parseFloat(item.product.volumeSize)
162
+ : 0,
193
163
  remark: item.remark || ''
194
164
  }
195
- }),
196
- serialNumber: foundInventoryItem
165
+ })
197
166
  }
198
167
 
199
168
  const formData = new FormData()
@@ -223,39 +223,39 @@ export async function renderRODO({ doNo }, context: any) {
223
223
  }, [])
224
224
 
225
225
 
226
-
227
- let tempFoundInventoryItem:any = []
228
226
 
229
- const sepProductList = productList.flatMap(p=>Array.from({length:p.product_qty},()=>({...p})))
227
+ let tempFoundInventoryItem: any = []
230
228
 
231
- sepProductList.forEach((product) => {
229
+ const sepProductList = productList.flatMap(p => Array.from({ length: p.product_qty }, () => ({ ...p })))
232
230
 
233
- let temp = foundInventoryItem.filter((item) =>{
234
- return item.sku == product.product_sku
235
- })
231
+ sepProductList.forEach((product) => {
232
+
233
+ let temp = foundInventoryItem.filter((item) => {
234
+ return item.sku == product.product_sku
235
+ })
236
+
237
+ if (temp.length > 1) {
238
+ temp.forEach(res => {
239
+ console.log(res)
236
240
 
237
- if(temp.length>1){
238
- temp.forEach(res=>{
239
- console.log(res)
240
-
241
- if(tempFoundInventoryItem.length==0){
241
+ if (tempFoundInventoryItem.length == 0) {
242
+ tempFoundInventoryItem.push(res)
243
+ } else {
244
+ const index = tempFoundInventoryItem.findIndex(res => res.serial_number == res.serial_number)
245
+
246
+ if (!index) {
242
247
  tempFoundInventoryItem.push(res)
243
- }else{
244
- const index = tempFoundInventoryItem.findIndex(res=>res.serial_number == res.serial_number)
245
-
246
- if(!index){
247
- tempFoundInventoryItem.push(res)
248
- }
249
248
  }
250
-
251
- tempFoundInventoryItem = _.uniqWith(tempFoundInventoryItem,_.isEqual)
252
- })
253
- }else{
254
- tempFoundInventoryItem.push(Object.assign({}, ...temp))
255
- }
256
- })
249
+ }
250
+
251
+ tempFoundInventoryItem = _.uniqWith(tempFoundInventoryItem, _.isEqual)
252
+ })
253
+ } else {
254
+ tempFoundInventoryItem.push(Object.assign({}, ...temp))
255
+ }
256
+ })
257
257
 
258
- foundInventoryItem = tempFoundInventoryItem;
258
+ foundInventoryItem = tempFoundInventoryItem;
259
259
 
260
260
  const filterInventoryItem = _.groupBy(foundInventoryItem, i => i.sku)
261
261
 
@@ -278,7 +278,8 @@ export async function renderRODO({ doNo }, context: any) {
278
278
  })
279
279
 
280
280
  tempIndexArr.forEach((t, index) => {
281
- foundInventoryItem[t].totalQuantity = tempTotalQuantity[index]
281
+ if (t >= 0)
282
+ foundInventoryItem[t].totalQuantity = tempTotalQuantity[index]
282
283
  })
283
284
 
284
285
  foundInventoryItem[0].ref_no = ownRefNo || ""
@@ -347,12 +348,12 @@ export async function renderRODO({ doNo }, context: any) {
347
348
  remark: prod?.remark
348
349
  ? prod.remark
349
350
  : prod.cross_docking
350
- ? prod.pallet === ''
351
- ? `${prod.palletQty} PALLET(S) [C/D]`
352
- : `${prod.palletQty} PALLET(S) (${prod.pallet}) [C/D]`
353
- : prod.pallet === ''
354
- ? `${prod.palletQty} PALLET(S)`
355
- : `${prod.palletQty} PALLET(S) (${prod.pallet})`,
351
+ ? prod.pallet === ''
352
+ ? `${prod.palletQty} PALLET(S) [C/D]`
353
+ : `${prod.palletQty} PALLET(S) (${prod.pallet}) [C/D]`
354
+ : prod.pallet === ''
355
+ ? `${prod.palletQty} PALLET(S)`
356
+ : `${prod.palletQty} PALLET(S) (${prod.pallet})`,
356
357
  inventory_remark: prod?.inventory_remark ? prod.inventory_remark : '',
357
358
  batch_id_ref: prod.product_batch_ref
358
359
  }
@@ -950,7 +950,8 @@ export class WorksheetController {
950
950
  const duplicatedSerialNumberCnt: number = await this.trxMgr.getRepository(InventoryItem).count({
951
951
  domain: this.domain,
952
952
  product,
953
- serialNumber
953
+ serialNumber,
954
+ status: Not(Equal(INVENTORY_STATUS.DELETED))
954
955
  })
955
956
 
956
957
  if (duplicatedSerialNumberCnt) throw new Error(this.ERROR_MSG.VALIDITY.DUPLICATED('Serial Number', serialNumber))
@@ -1,11 +1,12 @@
1
1
  import { EntityManager, SelectQueryBuilder } from 'typeorm'
2
2
 
3
3
  import {
4
- ORDER_STATUS,
4
+ ORDER_STATUS, ORDER_INVENTORY_STATUS,
5
5
  OrderInventory as OrderInventoryEntity,
6
6
  ReleaseGood as ReleaseGoodEntity
7
7
  } from '@things-factory/sales-base'
8
8
  import { Domain } from '@things-factory/shell'
9
+ import { Location } from '@things-factory/warehouse-base'
9
10
 
10
11
  import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../../constants'
11
12
  import { Worksheet as WorksheetEntity, WorksheetDetail as WorksheetDetailEntity } from '../../../entities'
@@ -16,6 +17,38 @@ export const findReleaseOrdersByTaskNoResolver = {
16
17
  let task = await tx.getRepository(WorksheetEntity).findOne({
17
18
  where: { taskNo, status: WORKSHEET_STATUS.EXECUTING, type: WORKSHEET_TYPE.SORTING }
18
19
  })
20
+
21
+ // Find Task based on Bin
22
+ if (!task) {
23
+ const binLocation: Location = await tx.getRepository(Location).findOne({
24
+ where: { domain, name: taskNo }
25
+ })
26
+
27
+ const qb: SelectQueryBuilder<OrderInventoryEntity> = tx.getRepository(OrderInventoryEntity).createQueryBuilder('orderInventory')
28
+
29
+ qb.innerJoinAndSelect('orderInventory.releaseGood', 'releaseGood')
30
+ .innerJoinAndSelect('worksheets', 'ws', `orderInventory.ref_worksheet_id = ws.id AND ws.type = 'BATCH_PICKING'`)
31
+ .innerJoinAndSelect('worksheets', 'ws2', `ws2.task_no = ws.task_no AND ws2.type = 'SORTING'`)
32
+ .innerJoinAndSelect('releaseGood.bizplace', 'bizplace')
33
+ .innerJoinAndSelect('bizplace.domain', 'domain')
34
+ .where('orderInventory.domain_id = :domainId', { domainId: domain.id })
35
+ .andWhere('orderInventory.status IN (:...orderInventoryStatus)', {
36
+ orderInventoryStatus: [ORDER_INVENTORY_STATUS.SORTING]
37
+ })
38
+ .andWhere('orderInventory.bin_location_id = :locationId', { locationId: binLocation.id })
39
+ .andWhere('releaseGood.status = :status', { status: ORDER_STATUS.SORTING })
40
+
41
+ const orderInventoryByBin = await qb.getRawOne()
42
+ if (orderInventoryByBin?.releaseGood_id) {
43
+ taskNo = orderInventoryByBin.ws_task_no
44
+ task = await tx.getRepository(WorksheetEntity).findOne({
45
+ where: { taskNo, status: WORKSHEET_STATUS.EXECUTING, type: WORKSHEET_TYPE.SORTING }
46
+ })
47
+ } else {
48
+ throw new Error(`Bin do not have any batch picking order.`)
49
+ }
50
+ }
51
+
19
52
  if (!task) throw new Error('Unable to find task no.')
20
53
 
21
54
  const qb: SelectQueryBuilder<WorksheetEntity> = tx
@@ -38,6 +71,6 @@ export const findReleaseOrdersByTaskNoResolver = {
38
71
  .addGroupBy('rg.status')
39
72
 
40
73
  const releaseGoods: ReleaseGoodEntity[] = await qb.getRawMany()
41
- return releaseGoods
74
+ return { releaseGoods, taskNo }
42
75
  }
43
76
  }
@@ -78,6 +78,8 @@ export const inventoriesByPalletResolver = {
78
78
  locationSortingRules.forEach((rule: { name: string; desc: boolean }) => {
79
79
  qb.addOrderBy(`location.${rule.name}`, rule.desc ? 'DESC' : 'ASC')
80
80
  })
81
+ } else {
82
+ qb.addOrderBy('location.name', 'DESC')
81
83
  }
82
84
 
83
85
  if (productFilters && productFilters.length > 0) {
@@ -2,10 +2,12 @@ import { activatePackingResolver } from './activate-packing'
2
2
  import { completePackingResolver } from './complete-packing'
3
3
  import { packingResolver } from './packing'
4
4
  import { scanProductPackingResolver } from './scan-product-packing'
5
+ import { undoSerialNumberPackingResolver } from './undo-serial-number-packing'
5
6
 
6
7
  export const Mutations = {
7
8
  ...activatePackingResolver,
8
9
  ...completePackingResolver,
9
10
  ...packingResolver,
10
- ...scanProductPackingResolver
11
+ ...scanProductPackingResolver,
12
+ ...undoSerialNumberPackingResolver
11
13
  }
@@ -9,9 +9,9 @@ import { PackingWorksheetController, SellercraftController } from '../../../../c
9
9
  import { Worksheet } from '../../../../entities'
10
10
 
11
11
  export const packingResolver = {
12
- async packing(_: any, { worksheetDetailName, releaseQty }, context: any) {
12
+ async packing(_: any, { worksheetDetailName, releaseQty, serialNumber }, context: any) {
13
13
  const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
14
- await packing(tx, domain, user, worksheetDetailName, releaseQty)
14
+ await packing(tx, domain, user, worksheetDetailName, releaseQty, serialNumber)
15
15
  }
16
16
  }
17
17
 
@@ -20,10 +20,11 @@ export async function packing(
20
20
  domain: Domain,
21
21
  user: User,
22
22
  worksheetDetailName: string,
23
- releaseQty: number
23
+ releaseQty: number,
24
+ serialNumber: string
24
25
  ) {
25
26
  const worksheetController: PackingWorksheetController = new PackingWorksheetController(tx, domain, user)
26
- const worksheetDetail = await worksheetController.packing(worksheetDetailName, releaseQty)
27
+ const worksheetDetail = await worksheetController.packing(worksheetDetailName, releaseQty, serialNumber)
27
28
 
28
29
  let releaseGood: ReleaseGood = worksheetDetail.targetInventory.releaseGood
29
30
  const worksheet: Worksheet = worksheetDetail.worksheet
@@ -9,9 +9,9 @@ import { PackingWorksheetController, SellercraftController } from '../../../../c
9
9
  import { Worksheet } from '../../../../entities'
10
10
 
11
11
  export const scanProductPackingResolver = {
12
- async scanProductPacking(_: any, { worksheetDetailName, productBarcode }, context: any) {
12
+ async scanProductPacking(_: any, { worksheetDetailName, productBarcode, serialNumber }, context: any) {
13
13
  const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
14
- await scanProductPacking(tx, domain, user, worksheetDetailName, productBarcode)
14
+ await scanProductPacking(tx, domain, user, worksheetDetailName, productBarcode, serialNumber)
15
15
  }
16
16
  }
17
17
 
@@ -20,10 +20,15 @@ export async function scanProductPacking(
20
20
  domain: Domain,
21
21
  user: User,
22
22
  worksheetDetailName: string,
23
- productBarcode: string
23
+ productBarcode: string,
24
+ serialNumber?: string
24
25
  ) {
25
26
  const worksheetController: PackingWorksheetController = new PackingWorksheetController(tx, domain, user)
26
- const worksheetDetail = await worksheetController.scanProductPacking(worksheetDetailName, productBarcode)
27
+ const worksheetDetail = await worksheetController.scanProductPacking(
28
+ worksheetDetailName,
29
+ productBarcode,
30
+ serialNumber
31
+ )
27
32
 
28
33
  let releaseGood: ReleaseGood = worksheetDetail.targetInventory.releaseGood
29
34
  const worksheet: Worksheet = worksheetDetail.worksheet
@@ -0,0 +1,24 @@
1
+ import { EntityManager } from 'typeorm'
2
+
3
+ import { User } from '@things-factory/auth-base'
4
+ import { Domain } from '@things-factory/shell'
5
+
6
+ import { PackingWorksheetController } from '../../../../controllers'
7
+
8
+ export const undoSerialNumberPackingResolver = {
9
+ async undoSerialNumberPacking(_: any, { worksheetDetailName, inventoryItemId }, context: any) {
10
+ const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
11
+ await undoSerialNumberPacking(tx, domain, user, worksheetDetailName, inventoryItemId)
12
+ }
13
+ }
14
+
15
+ async function undoSerialNumberPacking(
16
+ tx: EntityManager,
17
+ domain: Domain,
18
+ user: User,
19
+ worksheetDetailName: string,
20
+ inventoryItemId: string
21
+ ): Promise<void> {
22
+ const worksheetController: PackingWorksheetController = new PackingWorksheetController(tx, domain, user)
23
+ await worksheetController.undoSerialNumberPacking(worksheetDetailName, inventoryItemId)
24
+ }