@things-factory/worksheet-base 4.3.159 → 4.3.161

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