@things-factory/worksheet-base 5.0.0-alpha.3 → 5.0.0-alpha.30

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 (131) hide show
  1. package/dist-server/controllers/inbound/unloading-worksheet-controller.js +301 -2
  2. package/dist-server/controllers/inbound/unloading-worksheet-controller.js.map +1 -1
  3. package/dist-server/controllers/outbound/loading-worksheet-controller.js +10 -0
  4. package/dist-server/controllers/outbound/loading-worksheet-controller.js.map +1 -1
  5. package/dist-server/controllers/outbound/packing-worksheet-controller.js +172 -7
  6. package/dist-server/controllers/outbound/packing-worksheet-controller.js.map +1 -1
  7. package/dist-server/controllers/outbound/picking-worksheet-controller.js +352 -11
  8. package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
  9. package/dist-server/controllers/outbound/returning-worksheet-controller.js +11 -1
  10. package/dist-server/controllers/outbound/returning-worksheet-controller.js.map +1 -1
  11. package/dist-server/controllers/outbound/sorting-worksheet-controller.js +110 -3
  12. package/dist-server/controllers/outbound/sorting-worksheet-controller.js.map +1 -1
  13. package/dist-server/controllers/render-grn.js +27 -3
  14. package/dist-server/controllers/render-grn.js.map +1 -1
  15. package/dist-server/controllers/render-invoices.js +103 -65
  16. package/dist-server/controllers/render-invoices.js.map +1 -1
  17. package/dist-server/controllers/render-orientage-do.js.map +1 -1
  18. package/dist-server/controllers/render-orientage-grn.js +1 -0
  19. package/dist-server/controllers/render-orientage-grn.js.map +1 -1
  20. package/dist-server/controllers/render-ro-do.js +65 -1
  21. package/dist-server/controllers/render-ro-do.js.map +1 -1
  22. package/dist-server/controllers/worksheet-controller.js +15 -0
  23. package/dist-server/controllers/worksheet-controller.js.map +1 -1
  24. package/dist-server/graphql/resolvers/worksheet/find-release-orders-by-task-no.js +30 -1
  25. package/dist-server/graphql/resolvers/worksheet/find-release-orders-by-task-no.js.map +1 -1
  26. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-arrival-notice-worksheet.js +27 -23
  27. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-arrival-notice-worksheet.js.map +1 -1
  28. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js +3 -0
  29. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js.map +1 -1
  30. package/dist-server/graphql/resolvers/worksheet/loading/complete-loading.js +16 -2
  31. package/dist-server/graphql/resolvers/worksheet/loading/complete-loading.js.map +1 -1
  32. package/dist-server/graphql/resolvers/worksheet/packing/index.js +2 -1
  33. package/dist-server/graphql/resolvers/worksheet/packing/index.js.map +1 -1
  34. package/dist-server/graphql/resolvers/worksheet/packing/packing.js +4 -4
  35. package/dist-server/graphql/resolvers/worksheet/packing/packing.js.map +1 -1
  36. package/dist-server/graphql/resolvers/worksheet/packing/scan-product-packing.js +4 -4
  37. package/dist-server/graphql/resolvers/worksheet/packing/scan-product-packing.js.map +1 -1
  38. package/dist-server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.js +15 -0
  39. package/dist-server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.js.map +1 -0
  40. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +152 -132
  41. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
  42. package/dist-server/graphql/resolvers/worksheet/picking/assign-picking-worker.js +13 -10
  43. package/dist-server/graphql/resolvers/worksheet/picking/assign-picking-worker.js.map +1 -1
  44. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +0 -17
  45. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
  46. package/dist-server/graphql/resolvers/worksheet/picking/index.js +2 -1
  47. package/dist-server/graphql/resolvers/worksheet/picking/index.js.map +1 -1
  48. package/dist-server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.js +4 -7
  49. package/dist-server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.js.map +1 -1
  50. package/dist-server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.js +15 -0
  51. package/dist-server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.js.map +1 -0
  52. package/dist-server/graphql/resolvers/worksheet/sorting/scan-product-sorting.js +4 -4
  53. package/dist-server/graphql/resolvers/worksheet/sorting/scan-product-sorting.js.map +1 -1
  54. package/dist-server/graphql/resolvers/worksheet/sorting/sorting-product.js +4 -4
  55. package/dist-server/graphql/resolvers/worksheet/sorting/sorting-product.js.map +1 -1
  56. package/dist-server/graphql/resolvers/worksheet/sorting-worksheet.js +6 -0
  57. package/dist-server/graphql/resolvers/worksheet/sorting-worksheet.js.map +1 -1
  58. package/dist-server/graphql/resolvers/worksheet/unloaded-inventories.js +3 -2
  59. package/dist-server/graphql/resolvers/worksheet/unloaded-inventories.js.map +1 -1
  60. package/dist-server/graphql/resolvers/worksheet/unloading/index.js +3 -1
  61. package/dist-server/graphql/resolvers/worksheet/unloading/index.js.map +1 -1
  62. package/dist-server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.js +15 -0
  63. package/dist-server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.js.map +1 -0
  64. package/dist-server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.js +15 -0
  65. package/dist-server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.js.map +1 -0
  66. package/dist-server/graphql/resolvers/worksheet/unloading/unload.js.map +1 -1
  67. package/dist-server/graphql/resolvers/worksheet/unloading-worksheet.js +3 -1
  68. package/dist-server/graphql/resolvers/worksheet/unloading-worksheet.js.map +1 -1
  69. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js +4 -5
  70. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js.map +1 -1
  71. package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js +4 -2
  72. package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js.map +1 -1
  73. package/dist-server/graphql/types/worksheet/find-release-orders-by-task-no.js +11 -0
  74. package/dist-server/graphql/types/worksheet/find-release-orders-by-task-no.js.map +1 -0
  75. package/dist-server/graphql/types/worksheet/index.js +30 -4
  76. package/dist-server/graphql/types/worksheet/index.js.map +1 -1
  77. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js +3 -0
  78. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js.map +1 -1
  79. package/dist-server/graphql/types/worksheet/worksheet-info.js +1 -0
  80. package/dist-server/graphql/types/worksheet/worksheet-info.js.map +1 -1
  81. package/dist-server/graphql/types/worksheet-detail/index.js +0 -2
  82. package/dist-server/graphql/types/worksheet-detail/index.js.map +1 -1
  83. package/dist-server/index.js +4 -0
  84. package/dist-server/index.js.map +1 -1
  85. package/dist-server/utils/inventory-util.js +14 -25
  86. package/dist-server/utils/inventory-util.js.map +1 -1
  87. package/package.json +17 -17
  88. package/server/controllers/inbound/unloading-worksheet-controller.ts +363 -6
  89. package/server/controllers/outbound/loading-worksheet-controller.ts +13 -0
  90. package/server/controllers/outbound/packing-worksheet-controller.ts +224 -9
  91. package/server/controllers/outbound/picking-worksheet-controller.ts +465 -16
  92. package/server/controllers/outbound/returning-worksheet-controller.ts +12 -1
  93. package/server/controllers/outbound/sorting-worksheet-controller.ts +149 -4
  94. package/server/controllers/render-grn.ts +39 -5
  95. package/server/controllers/render-invoices.ts +119 -72
  96. package/server/controllers/render-orientage-do.ts +11 -11
  97. package/server/controllers/render-orientage-grn.ts +12 -11
  98. package/server/controllers/render-ro-do.ts +93 -8
  99. package/server/controllers/worksheet-controller.ts +18 -2
  100. package/server/graphql/resolvers/worksheet/find-release-orders-by-task-no.ts +35 -2
  101. package/server/graphql/resolvers/worksheet/generate-worksheet/generate-arrival-notice-worksheet.ts +35 -25
  102. package/server/graphql/resolvers/worksheet/inventories-by-pallet.ts +2 -0
  103. package/server/graphql/resolvers/worksheet/loading/complete-loading.ts +25 -6
  104. package/server/graphql/resolvers/worksheet/packing/index.ts +3 -1
  105. package/server/graphql/resolvers/worksheet/packing/packing.ts +5 -4
  106. package/server/graphql/resolvers/worksheet/packing/scan-product-packing.ts +9 -4
  107. package/server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.ts +24 -0
  108. package/server/graphql/resolvers/worksheet/packing-worksheet.ts +167 -145
  109. package/server/graphql/resolvers/worksheet/picking/assign-picking-worker.ts +15 -11
  110. package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +0 -18
  111. package/server/graphql/resolvers/worksheet/picking/index.ts +3 -1
  112. package/server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.ts +5 -7
  113. package/server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.ts +24 -0
  114. package/server/graphql/resolvers/worksheet/sorting/scan-product-sorting.ts +5 -4
  115. package/server/graphql/resolvers/worksheet/sorting/sorting-product.ts +5 -4
  116. package/server/graphql/resolvers/worksheet/sorting-worksheet.ts +6 -0
  117. package/server/graphql/resolvers/worksheet/unloaded-inventories.ts +6 -2
  118. package/server/graphql/resolvers/worksheet/unloading/index.ts +4 -0
  119. package/server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.ts +26 -0
  120. package/server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.ts +24 -0
  121. package/server/graphql/resolvers/worksheet/unloading/unload.ts +3 -1
  122. package/server/graphql/resolvers/worksheet/unloading-worksheet.ts +3 -1
  123. package/server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.ts +10 -12
  124. package/server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.ts +4 -2
  125. package/server/graphql/types/worksheet/find-release-orders-by-task-no.ts +8 -0
  126. package/server/graphql/types/worksheet/index.ts +30 -4
  127. package/server/graphql/types/worksheet/worksheet-detail-info.ts +3 -0
  128. package/server/graphql/types/worksheet/worksheet-info.ts +1 -0
  129. package/server/graphql/types/worksheet-detail/index.ts +0 -2
  130. package/server/index.ts +4 -0
  131. package/server/utils/inventory-util.ts +15 -23
@@ -1,3 +1,4 @@
1
+ import _ from 'lodash'
1
2
  import FormData from 'form-data'
2
3
  import fetch from 'node-fetch'
3
4
  import { Equal, getRepository, In } from 'typeorm'
@@ -10,9 +11,10 @@ import { ProductDetail } from '@things-factory/product-base'
10
11
  import { DeliveryOrder, ORDER_STATUS, OrderInventory, ReleaseGood } from '@things-factory/sales-base'
11
12
  import { Domain } from '@things-factory/shell'
12
13
  import { Inventory, Pallet } from '@things-factory/warehouse-base'
13
-
14
+ import { InventoryItem } from '@things-factory/warehouse-base'
14
15
  import { TEMPLATE_TYPE, WORKSHEET_STATUS, WORKSHEET_TYPE } from '../constants'
15
16
  import { Worksheet, WorksheetDetail } from '../entities'
17
+ import { DateTimeConverter } from '../utils/datetime-util'
16
18
 
17
19
  const REPORT_API_URL = config.get('reportApiUrl', 'http://localhost:8888/rest/report/show_html')
18
20
 
@@ -48,6 +50,10 @@ export async function renderRODO({ doNo }, context: any) {
48
50
  const partnerBiz: Bizplace = foundDO.bizplace //customer bizplace
49
51
  const ownRefNo = foundRO.refNo
50
52
 
53
+ let foundInventoryItem: InventoryItem[] = await getRepository(InventoryItem).query(
54
+ `select row_number() over (partition by p.sku) as "seq",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`
55
+ )
56
+
51
57
  const partnerDomain: Partner = await getRepository(Partner).findOne({
52
58
  where: { partnerDomain: partnerBiz.domain, domain },
53
59
  relations: ['domain']
@@ -70,6 +76,11 @@ export async function renderRODO({ doNo }, context: any) {
70
76
  relations: ['updater']
71
77
  })
72
78
 
79
+ const foundLoadingWS: Worksheet = await getRepository(Worksheet).findOne({
80
+ where: { domain, releaseGood: foundRO, type: WORKSHEET_TYPE.LOADING },
81
+ relations: ['updater']
82
+ })
83
+
73
84
  //find reusable pallet
74
85
  const foundRP: Pallet[] = await getRepository(Pallet).find({
75
86
  where: { domain, refOrderNo: foundRO.name }
@@ -211,6 +222,68 @@ export async function renderRODO({ doNo }, context: any) {
211
222
  }
212
223
  }, [])
213
224
 
225
+
226
+
227
+ let tempFoundInventoryItem: any = []
228
+
229
+ const sepProductList = productList.flatMap(p => Array.from({ length: p.product_qty }, () => ({ ...p })))
230
+
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)
240
+
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) {
247
+ tempFoundInventoryItem.push(res)
248
+ }
249
+ }
250
+
251
+ tempFoundInventoryItem = _.uniqWith(tempFoundInventoryItem, _.isEqual)
252
+ })
253
+ } else {
254
+ tempFoundInventoryItem.push(Object.assign({}, ...temp))
255
+ }
256
+ })
257
+
258
+ foundInventoryItem = tempFoundInventoryItem;
259
+
260
+ const filterInventoryItem = _.groupBy(foundInventoryItem, i => i.sku)
261
+
262
+ const tempIndexArr = []
263
+
264
+ const tempTotalQuantity = []
265
+
266
+ Object.keys(filterInventoryItem).forEach(k => {
267
+ const tempIndex = foundInventoryItem.findIndex(i => {
268
+ return i.sku == k
269
+ })
270
+
271
+ tempIndexArr.push(tempIndex)
272
+ })
273
+
274
+ Object.values(filterInventoryItem).forEach(k => {
275
+ const tempQuantity = k.length
276
+
277
+ tempTotalQuantity.push(tempQuantity)
278
+ })
279
+
280
+ tempIndexArr.forEach((t, index) => {
281
+ if (t >= 0)
282
+ foundInventoryItem[t].totalQuantity = tempTotalQuantity[index]
283
+ })
284
+
285
+ foundInventoryItem[0].ref_no = ownRefNo || ""
286
+
214
287
  const data = {
215
288
  logo_url: logo,
216
289
  customer_biz: partnerBiz.name,
@@ -231,9 +304,16 @@ export async function renderRODO({ doNo }, context: any) {
231
304
  customer_name: foundCP ? foundCP.name : null,
232
305
  customer_delivery_address: foundCP ? foundCP.address : null,
233
306
  customer_billing_address: foundCP ? foundCP.billingAddress : null,
307
+ new_billing_address: foundRO?.billingAddress || null,
234
308
  new_delivery_address: foundRO?.deliveryAddress1 || null,
235
309
  new_delivery_address2: foundRO?.deliveryAddress2 || null,
236
- new_billing_address: foundRO?.billingAddress || null,
310
+ new_delivery_address3: foundRO?.deliveryAddress3 || null,
311
+ new_delivery_address4: foundRO?.deliveryAddress4 || null,
312
+ new_delivery_address5: foundRO?.deliveryAddress5 || null,
313
+ new_delivery_city: foundRO?.city || null,
314
+ new_delivery_state: foundRO?.state || null,
315
+ new_delivery_postal_code: foundRO?.postalCode || null,
316
+ new_delivery_country: foundRO?.country || null,
237
317
  new_attention_to: foundRO?.attentionTo || null,
238
318
  new_attention_company: foundRO?.attentionCompany || null,
239
319
  new_phone_no: foundRO?.phone1 || null,
@@ -251,6 +331,8 @@ export async function renderRODO({ doNo }, context: any) {
251
331
  ref_no3: foundRO.refNo3 ? `${foundRO.refNo3}` : '',
252
332
  order_no: foundDO.name,
253
333
  delivery_date: foundDO.deliveryDate || '',
334
+ complete_loading_date: DateTimeConverter.date(foundLoadingWS.endedAt),
335
+ ro_created_date: DateTimeConverter.date(foundRO.createdAt),
254
336
  truck_no: foundDO.truckNo,
255
337
  driver_name: foundDriver || '',
256
338
  pallet_qty: foundDO.palletQty,
@@ -266,15 +348,18 @@ export async function renderRODO({ doNo }, context: any) {
266
348
  remark: prod?.remark
267
349
  ? prod.remark
268
350
  : prod.cross_docking
269
- ? prod.pallet === ''
270
- ? `${prod.palletQty} PALLET(S) [C/D]`
271
- : `${prod.palletQty} PALLET(S) (${prod.pallet}) [C/D]`
272
- : prod.pallet === ''
273
- ? `${prod.palletQty} PALLET(S)`
274
- : `${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})`,
275
357
  inventory_remark: prod?.inventory_remark ? prod.inventory_remark : '',
276
358
  batch_id_ref: prod.product_batch_ref
277
359
  }
360
+ }),
361
+ serialNumber: foundInventoryItem.map((item: any, idx) => {
362
+ return { ...item, delivery_to: foundDO.to }
278
363
  })
279
364
  } //.. make data from do
280
365
  const formData = new FormData()
@@ -3,7 +3,7 @@ import { EntityManager, EntitySchema, Equal, FindOneOptions, In, Not } from 'typ
3
3
  import { Role, User } from '@things-factory/auth-base'
4
4
  import { Bizplace, getDomainUsers } from '@things-factory/biz-base'
5
5
  import { sendNotification } from '@things-factory/notification'
6
- import { ProductDetail } from '@things-factory/product-base'
6
+ import { Product, ProductDetail } from '@things-factory/product-base'
7
7
  import {
8
8
  ArrivalNotice,
9
9
  DeliveryOrder,
@@ -19,7 +19,7 @@ import {
19
19
  VasOrder
20
20
  } from '@things-factory/sales-base'
21
21
  import { Domain } from '@things-factory/shell'
22
- import { Inventory, INVENTORY_STATUS, Pallet } from '@things-factory/warehouse-base'
22
+ import { Inventory, INVENTORY_STATUS, InventoryItem, Pallet } from '@things-factory/warehouse-base'
23
23
 
24
24
  import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../constants'
25
25
  import { Worksheet, WorksheetDetail } from '../entities'
@@ -941,6 +941,22 @@ export class WorksheetController {
941
941
  if (duplicatedCartonCnt) throw new Error(this.ERROR_MSG.VALIDITY.DUPLICATED('Carton ID', cartonId))
942
942
  }
943
943
 
944
+ /**
945
+ * @summary Check whether passed serial number is existing already
946
+ * @description It will try to count inventories which has same domain and same serial number and and not terminated one
947
+ * If there's positive result it will throw an error cause serial number is duplicated
948
+ */
949
+ async checkSerialNumberDuplication(serialNumber: string, product: Product): Promise<void> {
950
+ const duplicatedSerialNumberCnt: number = await this.trxMgr.getRepository(InventoryItem).count({
951
+ domain: this.domain,
952
+ product,
953
+ serialNumber,
954
+ status: Not(Equal(INVENTORY_STATUS.DELETED))
955
+ })
956
+
957
+ if (duplicatedSerialNumberCnt) throw new Error(this.ERROR_MSG.VALIDITY.DUPLICATED('Serial Number', serialNumber))
958
+ }
959
+
944
960
  /**
945
961
  * @summary Check for product child qty at any scanned level
946
962
  * @description It will check every level of product detail by comparing scanned level and GAN registered level.
@@ -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
  }
@@ -8,34 +8,44 @@ import { Worksheet } from '../../../../entities'
8
8
  export const generateArrivalNoticeWorksheetResolver = {
9
9
  async generateArrivalNoticeWorksheet(_: any, { arrivalNoticeNo, bufferLocation }, context: any) {
10
10
  const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
11
- let unloadingWorksheet = await generateUnloadingWorksheet(tx, domain, user, arrivalNoticeNo, bufferLocation)
12
-
13
- if (!unloadingWorksheet.arrivalNotice?.id) {
14
- unloadingWorksheet = await tx.getRepository(Worksheet).findOne({
15
- where: unloadingWorksheet,
16
- relations: ['arrivalNotice']
17
- })
18
- }
19
-
20
- let arrivalNotice: ArrivalNotice = unloadingWorksheet.arrivalNotice
21
- const crossDocking: boolean = unloadingWorksheet.arrivalNotice.crossDocking
22
-
23
- if (crossDocking) {
24
- arrivalNotice = await tx
25
- .getRepository(ArrivalNotice)
26
- .findOne({ where: { domain: domain, name: arrivalNoticeNo }, relations: ['releaseGood'] })
27
-
28
- const releaseGoodNo: string = arrivalNotice.releaseGood.name
29
- const pickingWSCtrl: PickingWorksheetController = new PickingWorksheetController(tx, domain, user)
30
- await pickingWSCtrl.generatePickingWorksheet(releaseGoodNo)
31
- }
32
-
33
- const vasWorksheet: Worksheet = await tx.getRepository(Worksheet).findOne({
34
- where: { domain: domain, arrivalNotice }
11
+ return await generateArrivalNoticeWorksheet(tx, domain, user, arrivalNoticeNo, bufferLocation)
12
+ }
13
+ }
14
+
15
+ export async function generateArrivalNoticeWorksheet(
16
+ tx: EntityManager,
17
+ domain: Domain,
18
+ user: User,
19
+ arrivalNoticeNo: string,
20
+ bufferLocation: { id: string }
21
+ ) {
22
+ let unloadingWorksheet = await generateUnloadingWorksheet(tx, domain, user, arrivalNoticeNo, bufferLocation)
23
+
24
+ if (!unloadingWorksheet.arrivalNotice?.id) {
25
+ unloadingWorksheet = await tx.getRepository(Worksheet).findOne({
26
+ where: unloadingWorksheet,
27
+ relations: ['arrivalNotice']
35
28
  })
29
+ }
30
+
31
+ let arrivalNotice: ArrivalNotice = unloadingWorksheet.arrivalNotice
32
+ const crossDocking: boolean = unloadingWorksheet.arrivalNotice.crossDocking
36
33
 
37
- return { unloadingWorksheet, vasWorksheet }
34
+ if (crossDocking) {
35
+ arrivalNotice = await tx
36
+ .getRepository(ArrivalNotice)
37
+ .findOne({ where: { domain: domain, name: arrivalNoticeNo }, relations: ['releaseGood'] })
38
+
39
+ const releaseGoodNo: string = arrivalNotice.releaseGood.name
40
+ const pickingWSCtrl: PickingWorksheetController = new PickingWorksheetController(tx, domain, user)
41
+ await pickingWSCtrl.generatePickingWorksheet(releaseGoodNo)
38
42
  }
43
+
44
+ const vasWorksheet: Worksheet = await tx.getRepository(Worksheet).findOne({
45
+ where: { domain: domain, arrivalNotice }
46
+ })
47
+
48
+ return { unloadingWorksheet, vasWorksheet }
39
49
  }
40
50
 
41
51
  async function generateUnloadingWorksheet(
@@ -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) {
@@ -5,6 +5,7 @@ import { EntityManager } from 'typeorm'
5
5
  import { WORKSHEET_TYPE } from '../../../../constants'
6
6
  import { LoadingWorksheetController, ReturningWorksheetController } from '../../../../controllers'
7
7
  import { Worksheet, WorksheetDetail } from '../../../../entities'
8
+ import { Sftp, SftpAPI } from '@things-factory/integration-sftp'
8
9
 
9
10
  export const completeLoadingResolver = {
10
11
  async completeLoading(_: any, { releaseGoodNo }, context: any) {
@@ -20,14 +21,19 @@ export async function completeLoading(
20
21
  releaseGoodNo: string
21
22
  ): Promise<void> {
22
23
  const worksheetController: LoadingWorksheetController = new LoadingWorksheetController(tx, domain, user)
23
- const releaseGood: ReleaseGood = await worksheetController.findRefOrder(ReleaseGood, {
24
- domain,
25
- name: releaseGoodNo,
26
- status: ORDER_STATUS.LOADING
27
- })
24
+ const releaseGood: ReleaseGood = await worksheetController.findRefOrder(
25
+ ReleaseGood,
26
+ {
27
+ domain,
28
+ name: releaseGoodNo,
29
+ status: ORDER_STATUS.LOADING
30
+ },
31
+ ['bizplace', 'bizplace.domain']
32
+ )
28
33
  const worksheet: Worksheet = await worksheetController.findWorksheetByRefOrder(releaseGood, WORKSHEET_TYPE.LOADING, [
29
34
  'worksheetDetails',
30
- 'worksheetDetails.targetInventory'
35
+ 'worksheetDetails.targetInventory',
36
+ 'worksheetDetails.targetInventory.product'
31
37
  ])
32
38
  const worksheetDetails: WorksheetDetail[] = worksheet.worksheetDetails
33
39
  const targetInventories: OrderInventory[] = worksheetDetails.map((wsd: WorksheetDetail) => wsd.targetInventory)
@@ -35,6 +41,19 @@ export async function completeLoading(
35
41
  (targetInventory: OrderInventory) => targetInventory.status === ORDER_INVENTORY_STATUS.LOADING
36
42
  )
37
43
 
44
+ const customerDomain: Domain = releaseGood.bizplace.domain
45
+ let customerAvailableSftp: Sftp = await tx.getRepository(Sftp).findOne({
46
+ where: { domain: customerDomain }
47
+ })
48
+ if (customerAvailableSftp) {
49
+ let result: Sftp = await SftpAPI.createShipment(customerAvailableSftp, {
50
+ releaseGood,
51
+ orderInventories: targetInventories,
52
+ sftp: customerAvailableSftp
53
+ })
54
+ customerAvailableSftp = await tx.getRepository(Sftp).save(result)
55
+ }
56
+
38
57
  await worksheetController.completeLoading(releaseGoodNo)
39
58
 
40
59
  if (remainInventories.length) {
@@ -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
+ }