@things-factory/worksheet-base 5.0.0-alpha.4 → 5.0.0-alpha.42

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 (160) hide show
  1. package/dist-server/constants/template.js +1 -0
  2. package/dist-server/constants/template.js.map +1 -1
  3. package/dist-server/controllers/ecommerce/sellercraft-controller.js +9 -3
  4. package/dist-server/controllers/ecommerce/sellercraft-controller.js.map +1 -1
  5. package/dist-server/controllers/inbound/unloading-worksheet-controller.js +309 -4
  6. package/dist-server/controllers/inbound/unloading-worksheet-controller.js.map +1 -1
  7. package/dist-server/controllers/index.js +2 -0
  8. package/dist-server/controllers/index.js.map +1 -1
  9. package/dist-server/controllers/outbound/loading-worksheet-controller.js +10 -0
  10. package/dist-server/controllers/outbound/loading-worksheet-controller.js.map +1 -1
  11. package/dist-server/controllers/outbound/packing-worksheet-controller.js +172 -7
  12. package/dist-server/controllers/outbound/packing-worksheet-controller.js.map +1 -1
  13. package/dist-server/controllers/outbound/picking-worksheet-controller.js +352 -11
  14. package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
  15. package/dist-server/controllers/outbound/returning-worksheet-controller.js +11 -1
  16. package/dist-server/controllers/outbound/returning-worksheet-controller.js.map +1 -1
  17. package/dist-server/controllers/outbound/sorting-worksheet-controller.js +110 -3
  18. package/dist-server/controllers/outbound/sorting-worksheet-controller.js.map +1 -1
  19. package/dist-server/controllers/render-fm-grn.js +229 -0
  20. package/dist-server/controllers/render-fm-grn.js.map +1 -0
  21. package/dist-server/controllers/render-grn.js +45 -21
  22. package/dist-server/controllers/render-grn.js.map +1 -1
  23. package/dist-server/controllers/render-invoices.js +103 -65
  24. package/dist-server/controllers/render-invoices.js.map +1 -1
  25. package/dist-server/controllers/render-orientage-do.js.map +1 -1
  26. package/dist-server/controllers/render-orientage-grn.js +1 -0
  27. package/dist-server/controllers/render-orientage-grn.js.map +1 -1
  28. package/dist-server/controllers/render-po.js +147 -0
  29. package/dist-server/controllers/render-po.js.map +1 -0
  30. package/dist-server/controllers/render-ro-do.js +65 -1
  31. package/dist-server/controllers/render-ro-do.js.map +1 -1
  32. package/dist-server/controllers/worksheet-controller.js +15 -0
  33. package/dist-server/controllers/worksheet-controller.js.map +1 -1
  34. package/dist-server/graphql/resolvers/worksheet/cycle-count-adjustment.js +10 -3
  35. package/dist-server/graphql/resolvers/worksheet/cycle-count-adjustment.js.map +1 -1
  36. package/dist-server/graphql/resolvers/worksheet/find-release-orders-by-task-no.js +30 -1
  37. package/dist-server/graphql/resolvers/worksheet/find-release-orders-by-task-no.js.map +1 -1
  38. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-arrival-notice-worksheet.js +27 -23
  39. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-arrival-notice-worksheet.js.map +1 -1
  40. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js +3 -0
  41. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js.map +1 -1
  42. package/dist-server/graphql/resolvers/worksheet/loading/complete-loading.js +26 -2
  43. package/dist-server/graphql/resolvers/worksheet/loading/complete-loading.js.map +1 -1
  44. package/dist-server/graphql/resolvers/worksheet/packing/index.js +2 -1
  45. package/dist-server/graphql/resolvers/worksheet/packing/index.js.map +1 -1
  46. package/dist-server/graphql/resolvers/worksheet/packing/packing.js +4 -4
  47. package/dist-server/graphql/resolvers/worksheet/packing/packing.js.map +1 -1
  48. package/dist-server/graphql/resolvers/worksheet/packing/scan-product-packing.js +4 -4
  49. package/dist-server/graphql/resolvers/worksheet/packing/scan-product-packing.js.map +1 -1
  50. package/dist-server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.js +15 -0
  51. package/dist-server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.js.map +1 -0
  52. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +152 -132
  53. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
  54. package/dist-server/graphql/resolvers/worksheet/picking/assign-picking-worker.js +13 -10
  55. package/dist-server/graphql/resolvers/worksheet/picking/assign-picking-worker.js.map +1 -1
  56. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +6 -19
  57. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
  58. package/dist-server/graphql/resolvers/worksheet/picking/index.js +2 -1
  59. package/dist-server/graphql/resolvers/worksheet/picking/index.js.map +1 -1
  60. package/dist-server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.js +49 -58
  61. package/dist-server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.js.map +1 -1
  62. package/dist-server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.js +15 -0
  63. package/dist-server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.js.map +1 -0
  64. package/dist-server/graphql/resolvers/worksheet/sorting/scan-product-sorting.js +4 -4
  65. package/dist-server/graphql/resolvers/worksheet/sorting/scan-product-sorting.js.map +1 -1
  66. package/dist-server/graphql/resolvers/worksheet/sorting/sorting-product.js +4 -4
  67. package/dist-server/graphql/resolvers/worksheet/sorting/sorting-product.js.map +1 -1
  68. package/dist-server/graphql/resolvers/worksheet/sorting-worksheet.js +6 -0
  69. package/dist-server/graphql/resolvers/worksheet/sorting-worksheet.js.map +1 -1
  70. package/dist-server/graphql/resolvers/worksheet/unloaded-inventories.js +3 -2
  71. package/dist-server/graphql/resolvers/worksheet/unloaded-inventories.js.map +1 -1
  72. package/dist-server/graphql/resolvers/worksheet/unloading/index.js +3 -1
  73. package/dist-server/graphql/resolvers/worksheet/unloading/index.js.map +1 -1
  74. package/dist-server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.js +15 -0
  75. package/dist-server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.js.map +1 -0
  76. package/dist-server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.js +15 -0
  77. package/dist-server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.js.map +1 -0
  78. package/dist-server/graphql/resolvers/worksheet/unloading/unload.js.map +1 -1
  79. package/dist-server/graphql/resolvers/worksheet/unloading-worksheet.js +3 -1
  80. package/dist-server/graphql/resolvers/worksheet/unloading-worksheet.js.map +1 -1
  81. package/dist-server/graphql/resolvers/worksheet/worksheets.js +26 -1
  82. package/dist-server/graphql/resolvers/worksheet/worksheets.js.map +1 -1
  83. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js +4 -5
  84. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js.map +1 -1
  85. package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js +4 -2
  86. package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js.map +1 -1
  87. package/dist-server/graphql/types/worksheet/find-release-orders-by-task-no.js +11 -0
  88. package/dist-server/graphql/types/worksheet/find-release-orders-by-task-no.js.map +1 -0
  89. package/dist-server/graphql/types/worksheet/index.js +33 -6
  90. package/dist-server/graphql/types/worksheet/index.js.map +1 -1
  91. package/dist-server/graphql/types/worksheet/picking-assignment-status.js +2 -2
  92. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js +3 -0
  93. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js.map +1 -1
  94. package/dist-server/graphql/types/worksheet/worksheet-info.js +1 -0
  95. package/dist-server/graphql/types/worksheet/worksheet-info.js.map +1 -1
  96. package/dist-server/graphql/types/worksheet/worksheet-patch.js +1 -0
  97. package/dist-server/graphql/types/worksheet/worksheet-patch.js.map +1 -1
  98. package/dist-server/graphql/types/worksheet-detail/index.js +0 -2
  99. package/dist-server/graphql/types/worksheet-detail/index.js.map +1 -1
  100. package/dist-server/index.js +5 -0
  101. package/dist-server/index.js.map +1 -1
  102. package/dist-server/routes.js +12 -0
  103. package/dist-server/routes.js.map +1 -1
  104. package/dist-server/utils/inventory-util.js +14 -25
  105. package/dist-server/utils/inventory-util.js.map +1 -1
  106. package/package.json +17 -17
  107. package/server/constants/template.ts +1 -0
  108. package/server/controllers/ecommerce/sellercraft-controller.ts +10 -3
  109. package/server/controllers/inbound/unloading-worksheet-controller.ts +376 -8
  110. package/server/controllers/index.ts +3 -0
  111. package/server/controllers/outbound/loading-worksheet-controller.ts +13 -0
  112. package/server/controllers/outbound/packing-worksheet-controller.ts +224 -9
  113. package/server/controllers/outbound/picking-worksheet-controller.ts +465 -16
  114. package/server/controllers/outbound/returning-worksheet-controller.ts +12 -1
  115. package/server/controllers/outbound/sorting-worksheet-controller.ts +149 -4
  116. package/server/controllers/render-fm-grn.ts +266 -0
  117. package/server/controllers/render-grn.ts +57 -23
  118. package/server/controllers/render-invoices.ts +119 -72
  119. package/server/controllers/render-orientage-do.ts +11 -11
  120. package/server/controllers/render-orientage-grn.ts +12 -11
  121. package/server/controllers/render-po.ts +170 -0
  122. package/server/controllers/render-ro-do.ts +93 -8
  123. package/server/controllers/worksheet-controller.ts +18 -2
  124. package/server/graphql/resolvers/worksheet/cycle-count-adjustment.ts +13 -4
  125. package/server/graphql/resolvers/worksheet/find-release-orders-by-task-no.ts +35 -2
  126. package/server/graphql/resolvers/worksheet/generate-worksheet/generate-arrival-notice-worksheet.ts +35 -25
  127. package/server/graphql/resolvers/worksheet/inventories-by-pallet.ts +2 -0
  128. package/server/graphql/resolvers/worksheet/loading/complete-loading.ts +41 -8
  129. package/server/graphql/resolvers/worksheet/packing/index.ts +3 -1
  130. package/server/graphql/resolvers/worksheet/packing/packing.ts +5 -4
  131. package/server/graphql/resolvers/worksheet/packing/scan-product-packing.ts +9 -4
  132. package/server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.ts +24 -0
  133. package/server/graphql/resolvers/worksheet/packing-worksheet.ts +167 -145
  134. package/server/graphql/resolvers/worksheet/picking/assign-picking-worker.ts +15 -11
  135. package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +5 -20
  136. package/server/graphql/resolvers/worksheet/picking/index.ts +3 -1
  137. package/server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.ts +62 -61
  138. package/server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.ts +24 -0
  139. package/server/graphql/resolvers/worksheet/sorting/scan-product-sorting.ts +5 -4
  140. package/server/graphql/resolvers/worksheet/sorting/sorting-product.ts +5 -4
  141. package/server/graphql/resolvers/worksheet/sorting-worksheet.ts +6 -0
  142. package/server/graphql/resolvers/worksheet/unloaded-inventories.ts +6 -2
  143. package/server/graphql/resolvers/worksheet/unloading/index.ts +4 -0
  144. package/server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.ts +26 -0
  145. package/server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.ts +24 -0
  146. package/server/graphql/resolvers/worksheet/unloading/unload.ts +3 -1
  147. package/server/graphql/resolvers/worksheet/unloading-worksheet.ts +3 -1
  148. package/server/graphql/resolvers/worksheet/worksheets.ts +36 -1
  149. package/server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.ts +10 -12
  150. package/server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.ts +4 -2
  151. package/server/graphql/types/worksheet/find-release-orders-by-task-no.ts +8 -0
  152. package/server/graphql/types/worksheet/index.ts +33 -6
  153. package/server/graphql/types/worksheet/picking-assignment-status.ts +2 -2
  154. package/server/graphql/types/worksheet/worksheet-detail-info.ts +3 -0
  155. package/server/graphql/types/worksheet/worksheet-info.ts +1 -0
  156. package/server/graphql/types/worksheet/worksheet-patch.ts +1 -0
  157. package/server/graphql/types/worksheet-detail/index.ts +0 -2
  158. package/server/index.ts +5 -0
  159. package/server/routes.ts +17 -0
  160. 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.
@@ -56,7 +56,9 @@ export async function cycleCountAdjustment(
56
56
  'targetInventory.inventory.product.productDetails',
57
57
  'targetInventory.inventory.product.productDetails.childProductDetail',
58
58
  'targetInventory.inventory.bizplace',
59
+ 'targetInventory.inventory.domain',
59
60
  'targetInventory.inventory.bizplace.domain',
61
+ 'targetInventory.inventory.warehouse',
60
62
  'targetInventory.inventory.location',
61
63
  'targetInventory.inspectedLocation',
62
64
  'targetInventory.inspectedLocation.warehouse'
@@ -67,8 +69,8 @@ export async function cycleCountAdjustment(
67
69
  const targetInventory: OrderInventory = worksheetDetail.targetInventory
68
70
  let inventory: Inventory = targetInventory.inventory
69
71
 
70
- const transactQty: number = targetInventory.inspectedQty - inventory.qty
71
- const transactUomValue: number = targetInventory.inspectedUomValue - inventory.uomValue
72
+ let transactQty: number = targetInventory.inspectedQty - inventory.qty
73
+ let transactUomValue: number = targetInventory.inspectedUomValue - inventory.uomValue
72
74
 
73
75
  const sellercraft: Sellercraft = await tx.getRepository(Sellercraft).findOne({
74
76
  where: { domain: inventory.bizplace.domain, status: SellercraftStatus.ACTIVE }
@@ -137,16 +139,23 @@ export async function cycleCountAdjustment(
137
139
 
138
140
  if (targetInventory.inspectedBatchNo !== inventory.batchId) {
139
141
  // generate TERMINATED, ADJUSTMENT history
142
+ const { qty, uomValue }: { qty: number; uomValue: number } = inventory
140
143
  inventory.status = INVENTORY_STATUS.TERMINATED
144
+ inventory.qty = 0
145
+ inventory.uomValue = 0
146
+
141
147
  await generateInventoryHistory(
142
148
  inventory,
143
149
  cycleCount,
144
150
  INVENTORY_TRANSACTION_TYPE.CC_ADJUSTMENT,
145
- -transactQty,
146
- -transactUomValue,
151
+ -qty,
152
+ -uomValue,
147
153
  user,
148
154
  tx
149
155
  )
156
+
157
+ transactQty = targetInventory.inspectedQty
158
+ transactUomValue = targetInventory.inspectedUomValue
150
159
  }
151
160
 
152
161
  inventory.batchId = targetInventory.inspectedBatchNo
@@ -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) {
@@ -1,7 +1,11 @@
1
+ import { EntityManager } from 'typeorm'
2
+
1
3
  import { User } from '@things-factory/auth-base'
2
- import { OrderInventory, ORDER_INVENTORY_STATUS, ORDER_STATUS, ReleaseGood } from '@things-factory/sales-base'
4
+ import { Sftp, SftpAPI } from '@things-factory/integration-sftp'
5
+ import { ORDER_INVENTORY_STATUS, ORDER_STATUS, OrderInventory, ReleaseGood } from '@things-factory/sales-base'
3
6
  import { Domain } from '@things-factory/shell'
4
- import { EntityManager } from 'typeorm'
7
+ import { InventoryItem } from '@things-factory/warehouse-base'
8
+
5
9
  import { WORKSHEET_TYPE } from '../../../../constants'
6
10
  import { LoadingWorksheetController, ReturningWorksheetController } from '../../../../controllers'
7
11
  import { Worksheet, WorksheetDetail } from '../../../../entities'
@@ -20,14 +24,19 @@ export async function completeLoading(
20
24
  releaseGoodNo: string
21
25
  ): Promise<void> {
22
26
  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
- })
27
+ const releaseGood: ReleaseGood = await worksheetController.findRefOrder(
28
+ ReleaseGood,
29
+ {
30
+ domain,
31
+ name: releaseGoodNo,
32
+ status: ORDER_STATUS.LOADING
33
+ },
34
+ ['bizplace', 'bizplace.domain']
35
+ )
28
36
  const worksheet: Worksheet = await worksheetController.findWorksheetByRefOrder(releaseGood, WORKSHEET_TYPE.LOADING, [
29
37
  'worksheetDetails',
30
- 'worksheetDetails.targetInventory'
38
+ 'worksheetDetails.targetInventory',
39
+ 'worksheetDetails.targetInventory.product'
31
40
  ])
32
41
  const worksheetDetails: WorksheetDetail[] = worksheet.worksheetDetails
33
42
  const targetInventories: OrderInventory[] = worksheetDetails.map((wsd: WorksheetDetail) => wsd.targetInventory)
@@ -35,6 +44,30 @@ export async function completeLoading(
35
44
  (targetInventory: OrderInventory) => targetInventory.status === ORDER_INVENTORY_STATUS.LOADING
36
45
  )
37
46
 
47
+ const customerDomain: Domain = releaseGood.bizplace.domain
48
+ let customerAvailableSftp: Sftp = await tx.getRepository(Sftp).findOne({
49
+ where: { domain: customerDomain }
50
+ })
51
+ if (customerAvailableSftp) {
52
+ let inventoryItems: InventoryItem[] = await tx.getRepository(InventoryItem).find({
53
+ where: { domain, outboundOrderId: releaseGood.id }
54
+ })
55
+
56
+ let shipmentResult: Sftp = await SftpAPI.createShipment(customerAvailableSftp, {
57
+ releaseGood,
58
+ orderInventories: targetInventories,
59
+ sftp: customerAvailableSftp
60
+ })
61
+ customerAvailableSftp = await tx.getRepository(Sftp).save(shipmentResult)
62
+
63
+ let snResult: Sftp = await SftpAPI.createSerialNumber(customerAvailableSftp, {
64
+ releaseGood,
65
+ inventoryItems,
66
+ sftp: customerAvailableSftp
67
+ })
68
+ customerAvailableSftp = await tx.getRepository(Sftp).save(snResult)
69
+ }
70
+
38
71
  await worksheetController.completeLoading(releaseGoodNo)
39
72
 
40
73
  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
+ }