@things-factory/worksheet-base 4.3.155 → 4.3.156

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 (37) hide show
  1. package/dist-server/controllers/ecommerce/sellercraft-controller.js +5 -3
  2. package/dist-server/controllers/ecommerce/sellercraft-controller.js.map +1 -1
  3. package/dist-server/controllers/inbound/putaway-returning-worksheet-controller.js +3 -1
  4. package/dist-server/controllers/inbound/putaway-returning-worksheet-controller.js.map +1 -1
  5. package/dist-server/controllers/inbound/putaway-worksheet-controller.js +3 -1
  6. package/dist-server/controllers/inbound/putaway-worksheet-controller.js.map +1 -1
  7. package/dist-server/controllers/outbound/picking-worksheet-controller.js +16 -13
  8. package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
  9. package/dist-server/controllers/worksheet-controller.js +9 -17
  10. package/dist-server/controllers/worksheet-controller.js.map +1 -1
  11. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js +4 -0
  12. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js.map +1 -1
  13. package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js +146 -118
  14. package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js.map +1 -1
  15. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +245 -216
  16. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
  17. package/dist-server/graphql/resolvers/worksheet/putaway-return/complete-putaway-return.js +22 -0
  18. package/dist-server/graphql/resolvers/worksheet/putaway-return/complete-putaway-return.js.map +1 -1
  19. package/dist-server/graphql/resolvers/worksheet/unloading-return/complete-unload-returning.js +0 -10
  20. package/dist-server/graphql/resolvers/worksheet/unloading-return/complete-unload-returning.js.map +1 -1
  21. package/dist-server/graphql/resolvers/worksheet-detail/regenerate-release-good-worksheet-details.js +12 -4
  22. package/dist-server/graphql/resolvers/worksheet-detail/regenerate-release-good-worksheet-details.js.map +1 -1
  23. package/dist-server/utils/inventory-util.js +29 -1
  24. package/dist-server/utils/inventory-util.js.map +1 -1
  25. package/package.json +18 -18
  26. package/server/controllers/ecommerce/sellercraft-controller.ts +33 -27
  27. package/server/controllers/inbound/putaway-returning-worksheet-controller.ts +3 -1
  28. package/server/controllers/inbound/putaway-worksheet-controller.ts +3 -1
  29. package/server/controllers/outbound/picking-worksheet-controller.ts +23 -15
  30. package/server/controllers/worksheet-controller.ts +13 -17
  31. package/server/graphql/resolvers/worksheet/inventories-by-pallet.ts +7 -0
  32. package/server/graphql/resolvers/worksheet/picking/complete-batch-picking.ts +168 -131
  33. package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +272 -237
  34. package/server/graphql/resolvers/worksheet/putaway-return/complete-putaway-return.ts +35 -4
  35. package/server/graphql/resolvers/worksheet/unloading-return/complete-unload-returning.ts +0 -12
  36. package/server/graphql/resolvers/worksheet-detail/regenerate-release-good-worksheet-details.ts +17 -7
  37. package/server/utils/inventory-util.ts +36 -0
@@ -1,4 +1,4 @@
1
- import { EntityManager, getManager } from 'typeorm'
1
+ import { EntityManager, getManager, In } from 'typeorm'
2
2
 
3
3
  import { ApplicationType, User } from '@things-factory/auth-base'
4
4
  import { Bizplace, getMyBizplace } from '@things-factory/biz-base'
@@ -14,9 +14,10 @@ import {
14
14
  ReleaseGood,
15
15
  OrderProduct
16
16
  } from '@things-factory/sales-base'
17
+ import { Inventory } from '@things-factory/warehouse-base'
17
18
  import { Setting } from '@things-factory/setting-base'
18
19
  import { Domain } from '@things-factory/shell'
19
-
20
+ import { WORKSHEET_STATUS } from '../../../../constants'
20
21
  import {
21
22
  PackingWorksheetController,
22
23
  PickingWorksheetController,
@@ -25,7 +26,7 @@ import {
25
26
  } from '../../../../controllers/'
26
27
  import { EcommerceController } from '../../../../controllers/ecommerce'
27
28
  import { WorksheetController } from '../../../../controllers/worksheet-controller'
28
- import { WorksheetDetail } from '../../../../entities'
29
+ import { Worksheet, WorksheetDetail } from '../../../../entities'
29
30
 
30
31
  export const completeBatchPickingResolver = {
31
32
  async completeBatchPicking(_: any, { taskNo }, context: any) {
@@ -49,7 +50,7 @@ export async function completeBatchPicking(
49
50
  domain: Domain,
50
51
  user: User,
51
52
  taskNo: string
52
- ): Promise<void> {
53
+ ): Promise<any> {
53
54
  const pickingWSCtrl: PickingWorksheetController = new PickingWorksheetController(tx, domain, user)
54
55
  const worksheet = await pickingWSCtrl.completeBatchPicking(taskNo)
55
56
 
@@ -61,151 +62,187 @@ export async function completeBatchPicking(
61
62
  const releaseGoods: ReleaseGood[] = worksheetDetails.map(
62
63
  worksheetDetail => worksheetDetail.targetInventory && worksheetDetail.targetInventory.releaseGood
63
64
  )
64
- const uniqueReleaseGoods: ReleaseGood[] = []
65
- const map = new Map()
66
- for (const releaseGood of releaseGoods) {
67
- if (!map.has(releaseGood.id)) {
68
- map.set(releaseGood.id, true)
69
- uniqueReleaseGoods.push({ ...releaseGood })
65
+
66
+ if (worksheet?.type) {
67
+ const uniqueReleaseGoods: ReleaseGood[] = []
68
+ const map = new Map()
69
+ for (const releaseGood of releaseGoods) {
70
+ if (!map.has(releaseGood.id)) {
71
+ map.set(releaseGood.id, true)
72
+ uniqueReleaseGoods.push({ ...releaseGood })
73
+ }
70
74
  }
71
- }
72
75
 
73
- for (let i = 0; i < uniqueReleaseGoods.length; i++) {
74
- let foundReleaseGood: ReleaseGood = await tx.getRepository(ReleaseGood).findOne({
75
- where: { id: uniqueReleaseGoods[i].id },
76
- relations: [
77
- 'domain',
78
- 'creator',
79
- 'updater',
80
- 'orderPackages',
81
- 'orderProducts',
82
- 'orderProducts.product',
83
- 'bizplace',
84
- 'bizplace.company',
85
- 'bizplace.company.domain'
86
- ]
87
- })
88
- const orderSource: string = foundReleaseGood.source
89
- switch (orderSource) {
90
- case ApplicationType.SELLERCRAFT:
91
- const sellercraft: Sellercraft = await tx
92
- .getRepository(Sellercraft)
93
- .findOne({ domain: worksheet.bizplace.domain, status: SellercraftStatus.ACTIVE })
94
-
95
- if (sellercraft) {
96
- const initSCOrderShipment = async (sellercraft: Sellercraft, foundReleaseGood: ReleaseGood) => {
97
- await getManager().transaction(async txMgr => {
98
- const sellercraftCtrl: SellercraftController = new SellercraftController(txMgr, domain, user)
99
-
100
- if (!foundReleaseGood?.orderPackages?.length && !foundReleaseGood?.marketPackCallSuccess) {
101
- await sellercraftCtrl.packOrder(sellercraft, foundReleaseGood)
102
- }
103
-
104
- const rtsTriggerLevel: Setting = await tx.getRepository(Setting).findOne({
105
- where: { domain, category: 'id-rule', name: 'rts-trigger-level' }
76
+ for (let i = 0; i < uniqueReleaseGoods.length; i++) {
77
+ let foundReleaseGood: ReleaseGood = await tx.getRepository(ReleaseGood).findOne({
78
+ where: { id: uniqueReleaseGoods[i].id },
79
+ relations: [
80
+ 'domain',
81
+ 'creator',
82
+ 'updater',
83
+ 'orderPackages',
84
+ 'orderProducts',
85
+ 'orderProducts.product',
86
+ 'bizplace',
87
+ 'bizplace.company',
88
+ 'bizplace.company.domain'
89
+ ]
90
+ })
91
+ const orderSource: string = foundReleaseGood.source
92
+ switch (orderSource) {
93
+ case ApplicationType.SELLERCRAFT:
94
+ const sellercraft: Sellercraft = await tx
95
+ .getRepository(Sellercraft)
96
+ .findOne({ domain: worksheet.bizplace.domain, status: SellercraftStatus.ACTIVE })
97
+
98
+ if (sellercraft) {
99
+ const initSCOrderShipment = async (sellercraft: Sellercraft, foundReleaseGood: ReleaseGood) => {
100
+ await getManager().transaction(async txMgr => {
101
+ const sellercraftCtrl: SellercraftController = new SellercraftController(txMgr, domain, user)
102
+
103
+ if (!foundReleaseGood?.orderPackages?.length && !foundReleaseGood?.marketPackCallSuccess) {
104
+ await sellercraftCtrl.packOrder(sellercraft, foundReleaseGood)
105
+ }
106
+
107
+ const rtsTriggerLevel: Setting = await tx.getRepository(Setting).findOne({
108
+ where: { domain, category: 'id-rule', name: 'rts-trigger-level' }
109
+ })
110
+
111
+ if (rtsTriggerLevel && parseInt(rtsTriggerLevel?.value || 0) == 1) {
112
+ await sellercraftCtrl.initiateOrderShipment(sellercraft, foundReleaseGood)
113
+ }
106
114
  })
115
+ }
107
116
 
108
- if (rtsTriggerLevel && parseInt(rtsTriggerLevel?.value || 0) == 1) {
109
- await sellercraftCtrl.initiateOrderShipment(sellercraft, foundReleaseGood)
110
- }
111
- })
117
+ // asynchronouly call to initiate sellercraft order shipment/ RTS
118
+ initSCOrderShipment(sellercraft, foundReleaseGood)
112
119
  }
113
-
114
- // asynchronouly call to initiate sellercraft order shipment/ RTS
115
- initSCOrderShipment(sellercraft, foundReleaseGood)
116
- }
117
- break
118
-
119
- case ApplicationType.MMS:
120
- const companyDomain: Domain = foundReleaseGood.bizplace.company.domain
121
- const marketplaceOrder: MarketplaceOrder = await tx.getRepository(MarketplaceOrder).findOne({
122
- where: { orderNo: foundReleaseGood.refNo, domain: companyDomain },
123
- relations: [
124
- 'marketplaceOrderItems',
125
- 'marketplaceOrderItems.marketplaceOrderShippingItems',
126
- 'marketplaceOrderItems.marketplaceOrderShippingItems.marketplaceOrderShipping',
127
- 'marketplaceStore',
128
- 'marketplaceStore.marketplaceDistributors'
129
- ]
130
- })
131
- const marketplaceStore: MarketplaceStore = marketplaceOrder.marketplaceStore
132
-
133
- const ecommerceCtrl: EcommerceController = new EcommerceController(tx, domain, user)
134
- if (marketplaceStore?.isAutoUpdateShipment) {
135
- await ecommerceCtrl.createOrderShip(foundReleaseGood, marketplaceStore, marketplaceOrder, companyDomain)
136
- }
137
- await ecommerceCtrl.createOrderPackage(tx, marketplaceOrder, companyDomain, marketplaceStore, foundReleaseGood)
138
- break
139
-
140
- default:
141
- const orderPackage: OrderPackage = {
142
- name: OrderNoGenerator.orderPackage(),
143
- packageId: null,
144
- trackingNo: null,
145
- transporter: null,
146
- airwayBill: null,
147
- status: ORDER_STATUS.PROCESSING,
148
- releaseGood: foundReleaseGood,
149
- domain: foundReleaseGood.domain,
150
- bizplace: foundReleaseGood.bizplace,
151
- creator: foundReleaseGood.creator,
152
- updater: foundReleaseGood.updater
153
- }
154
-
155
- let savedOrderPackage: OrderPackage = await tx.getRepository(OrderPackage).save(orderPackage)
156
- const orderPackageItems: OrderPackageItem[] = foundReleaseGood.orderProducts.map(op => {
157
- return {
158
- name: OrderNoGenerator.orderPackageItem(),
159
- orderProduct: op,
120
+ break
121
+
122
+ case ApplicationType.MMS:
123
+ const companyDomain: Domain = foundReleaseGood.bizplace.company.domain
124
+ const marketplaceOrder: MarketplaceOrder = await tx.getRepository(MarketplaceOrder).findOne({
125
+ where: { orderNo: foundReleaseGood.refNo, domain: companyDomain },
126
+ relations: [
127
+ 'marketplaceOrderItems',
128
+ 'marketplaceOrderItems.marketplaceOrderShippingItems',
129
+ 'marketplaceOrderItems.marketplaceOrderShippingItems.marketplaceOrderShipping',
130
+ 'marketplaceStore',
131
+ 'marketplaceStore.marketplaceDistributors'
132
+ ]
133
+ })
134
+ const marketplaceStore: MarketplaceStore = marketplaceOrder.marketplaceStore
135
+
136
+ const ecommerceCtrl: EcommerceController = new EcommerceController(tx, domain, user)
137
+ if (marketplaceStore?.isAutoUpdateShipment) {
138
+ await ecommerceCtrl.createOrderShip(foundReleaseGood, marketplaceStore, marketplaceOrder, companyDomain)
139
+ }
140
+ await ecommerceCtrl.createOrderPackage(
141
+ tx,
142
+ marketplaceOrder,
143
+ companyDomain,
144
+ marketplaceStore,
145
+ foundReleaseGood
146
+ )
147
+ break
148
+
149
+ default:
150
+ const orderPackage: OrderPackage = {
151
+ name: OrderNoGenerator.orderPackage(),
152
+ packageId: null,
153
+ trackingNo: null,
154
+ transporter: null,
155
+ airwayBill: null,
160
156
  status: ORDER_STATUS.PROCESSING,
161
- releaseQty: op.releaseQty,
162
- orderPackage: savedOrderPackage,
157
+ releaseGood: foundReleaseGood,
163
158
  domain: foundReleaseGood.domain,
164
159
  bizplace: foundReleaseGood.bizplace,
165
160
  creator: foundReleaseGood.creator,
166
161
  updater: foundReleaseGood.updater
167
162
  }
168
- })
169
163
 
170
- await tx.getRepository(OrderPackageItem).save(orderPackageItems)
171
- break
164
+ let savedOrderPackage: OrderPackage = await tx.getRepository(OrderPackage).save(orderPackage)
165
+ const orderPackageItems: OrderPackageItem[] = foundReleaseGood.orderProducts.map(op => {
166
+ return {
167
+ name: OrderNoGenerator.orderPackageItem(),
168
+ orderProduct: op,
169
+ status: ORDER_STATUS.PROCESSING,
170
+ releaseQty: op.releaseQty,
171
+ orderPackage: savedOrderPackage,
172
+ domain: foundReleaseGood.domain,
173
+ bizplace: foundReleaseGood.bizplace,
174
+ creator: foundReleaseGood.creator,
175
+ updater: foundReleaseGood.updater
176
+ }
177
+ })
178
+
179
+ await tx.getRepository(OrderPackageItem).save(orderPackageItems)
180
+ break
181
+ }
172
182
  }
173
- }
174
183
 
175
- const pickPackTargetInventories: OrderInventory[] = targetInventories
176
- .filter(targetInventory => targetInventory.releaseGood.packingOption)
177
- .map((pickPackTargetInventory: OrderInventory) => {
178
- return pickPackTargetInventory
179
- })
184
+ const pickPackTargetInventories: OrderInventory[] = targetInventories
185
+ .filter(targetInventory => targetInventory.releaseGood.packingOption)
186
+ .map((pickPackTargetInventory: OrderInventory) => {
187
+ return pickPackTargetInventory
188
+ })
189
+
190
+ const pickSortTargetInventories: OrderInventory[] = targetInventories
191
+ .filter(targetInventory => !targetInventory.releaseGood.packingOption)
192
+ .map((pickSortTargetInventory: OrderInventory) => {
193
+ return pickSortTargetInventory
194
+ })
195
+
196
+ if (pickPackTargetInventories?.length) {
197
+ // pull out all unique RO
198
+ const roNoList: string[] = pickPackTargetInventories.map((oi: OrderInventory) => oi.releaseGood.name)
199
+ let uniqueRoNo: string[] = []
200
+ roNoList.forEach(roNo => {
201
+ if (!uniqueRoNo.includes(roNo)) {
202
+ uniqueRoNo.push(roNo)
203
+ }
204
+ })
180
205
 
181
- const pickSortTargetInventories: OrderInventory[] = targetInventories
182
- .filter(targetInventory => !targetInventory.releaseGood.packingOption)
183
- .map((pickSortTargetInventory: OrderInventory) => {
184
- return pickSortTargetInventory
185
- })
206
+ // loop to generate packing worksheet
207
+ for (let i: number = 0; i < uniqueRoNo.length; i++) {
208
+ const releaseGoodNo: string = uniqueRoNo[i]
186
209
 
187
- if (pickPackTargetInventories?.length) {
188
- // pull out all unique RO
189
- const roNoList: string[] = pickPackTargetInventories.map((oi: OrderInventory) => oi.releaseGood.name)
190
- let uniqueRoNo: string[] = []
191
- roNoList.forEach(roNo => {
192
- if (!uniqueRoNo.includes(roNo)) {
193
- uniqueRoNo.push(roNo)
210
+ const packingWSCtrl: PackingWorksheetController = new PackingWorksheetController(tx, domain, user)
211
+ await packingWSCtrl.generatePackingWorksheet(releaseGoodNo)
194
212
  }
195
- })
196
-
197
- // loop to generate packing worksheet
198
- for (let i: number = 0; i < uniqueRoNo.length; i++) {
199
- const releaseGoodNo: string = uniqueRoNo[i]
200
-
201
- const packingWSCtrl: PackingWorksheetController = new PackingWorksheetController(tx, domain, user)
202
- await packingWSCtrl.generatePackingWorksheet(releaseGoodNo)
203
213
  }
204
- }
205
214
 
206
- // loop to generate sorting worksheet
207
- if (pickSortTargetInventories?.length) {
208
- const sortingWSCtrl: SortingWorksheetController = new SortingWorksheetController(tx, domain, user)
209
- await sortingWSCtrl.generateSortingWorksheet(worksheet, pickSortTargetInventories)
215
+ // loop to generate sorting worksheet
216
+ if (pickSortTargetInventories?.length) {
217
+ const sortingWSCtrl: SortingWorksheetController = new SortingWorksheetController(tx, domain, user)
218
+ await sortingWSCtrl.generateSortingWorksheet(worksheet, pickSortTargetInventories)
219
+ }
220
+ } else {
221
+ let foundObsoleteInventories: any = worksheet
222
+ await tx.getRepository(Inventory).update({ id: In(foundObsoleteInventories) }, { obsolete: true })
223
+
224
+ foundObsoleteInventories = foundObsoleteInventories
225
+ .map(inv => {
226
+ return "'" + inv.trim() + "'"
227
+ })
228
+ .join(',')
229
+
230
+ //update any orders that is assigned with obsolete inventories
231
+ await tx.getRepository(ReleaseGood).query(`
232
+ update release_goods rg set status = 'OBSOLETE'
233
+ from order_inventories oi
234
+ where oi.release_good_id = rg.id
235
+ and oi.inventory_id in (${foundObsoleteInventories})
236
+ and rg.status in ('PICKING', 'PENDING_WORKSHEET', 'READY_TO_PICK')`)
237
+
238
+ await tx.getRepository(Worksheet).query(`
239
+ update worksheets w set status = 'DEACTIVATED', updater_id = '${user.id}', assignee_id = null
240
+ from worksheet_details wd
241
+ inner join order_inventories oi on oi.id = wd.target_inventory_id
242
+ where wd.worksheet_id = w.id
243
+ and oi.inventory_id in (${foundObsoleteInventories})
244
+ `)
245
+
246
+ return false
210
247
  }
211
248
  }