@things-factory/worksheet-base 4.3.75 → 4.3.78

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 (40) hide show
  1. package/dist-server/controllers/outbound/packing-worksheet-controller.js +14 -2
  2. package/dist-server/controllers/outbound/packing-worksheet-controller.js.map +1 -1
  3. package/dist-server/controllers/outbound/picking-worksheet-controller.js +6 -9
  4. package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
  5. package/dist-server/controllers/worksheet-controller.js +14 -1
  6. package/dist-server/controllers/worksheet-controller.js.map +1 -1
  7. package/dist-server/graphql/resolvers/worksheet/confirm-cancellation-release-order.js +12 -0
  8. package/dist-server/graphql/resolvers/worksheet/confirm-cancellation-release-order.js.map +1 -1
  9. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-multiple-release-good-worksheet.js +3 -3
  10. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-multiple-release-good-worksheet.js.map +1 -1
  11. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-release-good-worksheet.js +4 -4
  12. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-release-good-worksheet.js.map +1 -1
  13. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +54 -11
  14. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
  15. package/dist-server/graphql/resolvers/worksheet/pending-cancellation-release-order.js +87 -79
  16. package/dist-server/graphql/resolvers/worksheet/pending-cancellation-release-order.js.map +1 -1
  17. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +4 -22
  18. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
  19. package/dist-server/graphql/resolvers/worksheet/reject-cancellation-release-order.js +92 -150
  20. package/dist-server/graphql/resolvers/worksheet/reject-cancellation-release-order.js.map +1 -1
  21. package/dist-server/graphql/types/worksheet/index.js +5 -2
  22. package/dist-server/graphql/types/worksheet/index.js.map +1 -1
  23. package/dist-server/graphql/types/worksheet/multiple-release-good-worksheet.js +11 -0
  24. package/dist-server/graphql/types/worksheet/multiple-release-good-worksheet.js.map +1 -0
  25. package/dist-server/utils/worksheet-util.js +3 -1
  26. package/dist-server/utils/worksheet-util.js.map +1 -1
  27. package/package.json +17 -17
  28. package/server/controllers/outbound/packing-worksheet-controller.ts +21 -2
  29. package/server/controllers/outbound/picking-worksheet-controller.ts +7 -11
  30. package/server/controllers/worksheet-controller.ts +25 -2
  31. package/server/graphql/resolvers/worksheet/confirm-cancellation-release-order.ts +13 -0
  32. package/server/graphql/resolvers/worksheet/generate-worksheet/generate-multiple-release-good-worksheet.ts +3 -7
  33. package/server/graphql/resolvers/worksheet/generate-worksheet/generate-release-good-worksheet.ts +5 -4
  34. package/server/graphql/resolvers/worksheet/packing-worksheet.ts +62 -12
  35. package/server/graphql/resolvers/worksheet/pending-cancellation-release-order.ts +99 -94
  36. package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +1 -20
  37. package/server/graphql/resolvers/worksheet/reject-cancellation-release-order.ts +98 -213
  38. package/server/graphql/types/worksheet/index.ts +5 -2
  39. package/server/graphql/types/worksheet/multiple-release-good-worksheet.ts +8 -0
  40. package/server/utils/worksheet-util.ts +3 -1
@@ -1,21 +1,17 @@
1
1
  import { EntityManager, getManager } from 'typeorm'
2
2
 
3
3
  import { User } from '@things-factory/auth-base'
4
- import { OrderInventory } from '@things-factory/sales-base'
5
4
  import { Domain } from '@things-factory/shell'
6
5
 
7
- import { PickingWorksheetController } from '../../../../controllers/'
8
- import { Worksheet, WorksheetDetail } from '../../../../entities'
9
-
10
6
  import { generatePickingWorksheet } from './generate-release-good-worksheet'
11
7
 
12
8
  export const generateMultipleReleaseGoodWorksheetResolver = {
13
- async generateMultipleReleaseGoodWorksheet(_: any, { releaseGoodNos }, context: any) {
9
+ async generateMultipleReleaseGoodWorksheet(_: any, { releaseGoods }, context: any) {
14
10
  const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
15
11
 
16
- for (let idx = 0; idx < releaseGoodNos.length; idx++) {
12
+ for (let idx = 0; idx < releaseGoods.length; idx++) {
17
13
  await getManager().transaction(async txMgr => {
18
- await generatePickingWorksheet(txMgr, domain, user, releaseGoodNos[idx])
14
+ await generatePickingWorksheet(txMgr, domain, user, releaseGoods[idx].name, releaseGoods[idx].status)
19
15
  });
20
16
  }
21
17
 
@@ -11,9 +11,9 @@ import { Worksheet, WorksheetDetail } from '../../../../entities'
11
11
  import { Inventory, InventoryUtil, INVENTORY_TRANSACTION_TYPE } from '@things-factory/warehouse-base'
12
12
 
13
13
  export const generateReleaseGoodWorksheetResolver = {
14
- async generateReleaseGoodWorksheet(_: any, { releaseGoodNo }, context: any) {
14
+ async generateReleaseGoodWorksheet(_: any, { releaseGoodNo, currentStatus = null }, context: any) {
15
15
  const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
16
- return await generatePickingWorksheet(tx, domain, user, releaseGoodNo)
16
+ return await generatePickingWorksheet(tx, domain, user, releaseGoodNo, currentStatus)
17
17
  }
18
18
  }
19
19
 
@@ -21,7 +21,8 @@ export async function generatePickingWorksheet(
21
21
  tx: EntityManager,
22
22
  domain: Domain,
23
23
  user: User,
24
- releaseGoodNo: string
24
+ releaseGoodNo: string,
25
+ currentStatus: string = null
25
26
  ): Promise<Worksheet> {
26
27
  try {
27
28
  const worksheetController: PickingWorksheetController = new PickingWorksheetController(tx, domain, user)
@@ -78,7 +79,7 @@ export async function generatePickingWorksheet(
78
79
 
79
80
  await tx.getRepository(ReleaseGood).update({ id: releaseGood.id }, { status: ORDER_STATUS.DONE })
80
81
  } else {
81
- worksheet = await worksheetController.generatePickingWorksheet(releaseGoodNo)
82
+ worksheet = await worksheetController.generatePickingWorksheet(releaseGoodNo, currentStatus)
82
83
  }
83
84
 
84
85
  return worksheet
@@ -14,9 +14,10 @@ import { Domain } from '@things-factory/shell'
14
14
  import { Inventory, Location } from '@things-factory/warehouse-base'
15
15
 
16
16
  import { WORKSHEET_TYPE } from '../../../constants'
17
- import { SellercraftController } from '../../../controllers'
17
+ import { PackingWorksheetController, SellercraftController } from '../../../controllers'
18
18
  import { Worksheet, WorksheetDetail } from '../../../entities'
19
19
  import { fetchExecutingWorksheet } from '../../../utils'
20
+ import { PartnerSetting, Setting } from '@things-factory/setting-base'
20
21
 
21
22
  export const packingWorksheetResolver = {
22
23
  async packingWorksheet(_: any, { releaseGoodNo }, context: any) {
@@ -47,7 +48,7 @@ export const packingWorksheetResolver = {
47
48
  .innerJoinAndSelect(
48
49
  'worksheets',
49
50
  'ws',
50
- `orderInventory.release_good_id = ws.release_good_id AND ws.type = 'PACKING' AND ws.status = 'EXECUTING'`
51
+ `orderInventory.release_good_id = ws.release_good_id AND ws.type = 'PACKING' AND (ws.status = 'EXECUTING' OR ws.status = 'DEACTIVATED')`
51
52
  )
52
53
  .where('orderInventory.domain_id = :domainId', { domainId: domain.id })
53
54
  .andWhere('orderInventory.status IN (:...orderInventoryStatus)', {
@@ -61,11 +62,22 @@ export const packingWorksheetResolver = {
61
62
  .andWhere('releaseGood.status IN (:...status)', {
62
63
  status: [ORDER_STATUS.READY_TO_PACK, ORDER_STATUS.PACKING]
63
64
  })
65
+ .orderBy(`case when orderInventory.status = '${ORDER_INVENTORY_STATUS.PACKED}' then 1 end`)
66
+ .addOrderBy('ws.created_at', 'ASC')
64
67
 
65
- const orderInventoryByBin = await qb.getOne()
66
- if (orderInventoryByBin?.releaseGood) {
67
- releaseGoodNo = orderInventoryByBin.releaseGood.name
68
- releaseGood = orderInventoryByBin.releaseGood
68
+ const [orderInventoriesByBin, totalInventoriesByBin] = await qb.getManyAndCount()
69
+ // @oscarchuaweiwen-fsd @chrislim I suggest using getMany() instead since the total is redundant here
70
+
71
+ // remove duplicated count of release good
72
+ const filteredRO = orderInventoriesByBin.map(oiBin => {
73
+ return oiBin.releaseGood.name
74
+ })
75
+
76
+ if (orderInventoriesByBin.length > 0) {
77
+ releaseGoodNo = orderInventoriesByBin[0].releaseGood.name
78
+ releaseGood = orderInventoriesByBin[0].releaseGood
79
+ releaseGood.totalInventoriesByBin = [...new Set(filteredRO)].length
80
+ releaseGood.isOrderInventoryBin = true
69
81
  } else {
70
82
  throw new Error(`Bin do not have any existing order.`)
71
83
  }
@@ -95,7 +107,39 @@ export const packingWorksheetResolver = {
95
107
  releaseGood
96
108
  )
97
109
 
98
- let marketplaceOrder: MarketplaceOrder
110
+ if (worksheet.status === 'DEACTIVATED') {
111
+ const packingWSCtrl: PackingWorksheetController = new PackingWorksheetController(tx, domain, user)
112
+
113
+ const directActivatePackingWorksheet: Setting = await tx.getRepository(Setting).findOne({
114
+ where: { domain: domain, category: 'id-rule', name: 'enable-direct-activate-packing-worksheet' }
115
+ })
116
+
117
+ const partnerDirectActivatePackingWorksheetSetting: PartnerSetting = await tx
118
+ .getRepository(PartnerSetting)
119
+ .findOne({
120
+ where: {
121
+ setting: directActivatePackingWorksheet,
122
+ domain: domain,
123
+ partnerDomain: releaseGood.bizplace?.domain
124
+ }
125
+ })
126
+
127
+ if (
128
+ directActivatePackingWorksheet != undefined &&
129
+ directActivatePackingWorksheet.value.toLowerCase() == 'true'
130
+ ) {
131
+ if (partnerDirectActivatePackingWorksheetSetting != undefined) {
132
+ if (partnerDirectActivatePackingWorksheetSetting.value.toLowerCase() == 'true')
133
+ await packingWSCtrl.activatePacking(worksheet.name)
134
+ } else {
135
+ await packingWSCtrl.activatePacking(worksheet.name)
136
+ }
137
+ } else {
138
+ throw new Error('Kindly go to packing worksheet page to activate the packing worksheet')
139
+ }
140
+ }
141
+
142
+ let marketplaceOrder: MarketplaceOrder = {}
99
143
  let marketplaceOrderItems: MarketplaceOrderItem[] = []
100
144
  let marketplaceStore
101
145
  let trackingNo: string
@@ -103,7 +147,6 @@ export const packingWorksheetResolver = {
103
147
  let marketplaceStatus: string
104
148
 
105
149
  if (releaseGood.type === 'b2c') {
106
-
107
150
  const sellercraft: Sellercraft = await tx.getRepository(Sellercraft).findOne({
108
151
  domain: worksheet.bizplace.domain,
109
152
  status: SellercraftStatus.ACTIVE
@@ -165,8 +208,8 @@ export const packingWorksheetResolver = {
165
208
  airwayBill: releaseGood?.airwayBill,
166
209
  checkedRemarkBy: releaseGood?.checkedRemarkBy,
167
210
  invoice: releaseGood?.invoice,
168
- platform: marketplaceOrder ? marketplaceOrder.marketplaceStore.platform : 'operato',
169
- marketplaceStoreId: marketplaceOrder ? marketplaceOrder.marketplaceStore.id : '',
211
+ platform: Object.keys(marketplaceOrder).length > 0 ? marketplaceOrder.marketplaceStore?.platform : 'operato',
212
+ marketplaceStoreId: Object.keys(marketplaceOrder).length > 0 ? marketplaceOrder.marketplaceStore?.id : '',
170
213
  marketplaceStatus: marketplaceStatus ? marketplaceStatus : '',
171
214
  marketplaceOrder: marketplaceOrder ? marketplaceOrder : ''
172
215
  },
@@ -265,7 +308,14 @@ async function getSellercraftDocument(sellercraft: Sellercraft, releaseGood: Rel
265
308
  }
266
309
  }
267
310
  } catch (error) {
268
- logger.error(`packing-worksheet[getSellercraftDocument]:(data:${JSON.stringify({ sellercraft, releaseGood, domain, user })}) ${error} `)
311
+ logger.error(
312
+ `packing-worksheet[getSellercraftDocument]:(data:${JSON.stringify({
313
+ sellercraft,
314
+ releaseGood,
315
+ domain,
316
+ user
317
+ })}) ${error} `
318
+ )
269
319
  }
270
320
  })
271
- }
321
+ }
@@ -24,6 +24,7 @@ export const pendingCancellationReleaseOrder = {
24
24
  relations: ['bizplace', 'orderInventories', 'orderVass']
25
25
  })
26
26
 
27
+ if (foundRO.status === "DONE") throw new Error('Release good has been completed!')
27
28
  if (!foundRO) throw new Error(`Release good order doesn't exists.`)
28
29
  let targetOIs: OrderInventory[] = foundRO.orderInventories
29
30
  let foundOVs: OrderVas[] = foundRO.orderVass
@@ -94,77 +95,81 @@ export const pendingCancellationReleaseOrder = {
94
95
  await tx.getRepository(OrderVas).save(foundOVs)
95
96
  }
96
97
 
97
- if (pickedOIs && pickedOIs.length) {
98
- let pickedWSD: WorksheetDetail[] = await tx.getRepository(WorksheetDetail).find({
99
- where: {
100
- domain,
101
- targetInventory: In(pickedOIs.map(oi => oi.id)),
102
- status: ORDER_INVENTORY_STATUS.DONE
103
- }
104
- })
98
+ // find worksheet and update status to PENDING_CANCEL
99
+ let foundWS: Worksheet = await tx.getRepository(Worksheet).findOne({
100
+ where: {
101
+ domain,
102
+ releaseGood: foundRO
103
+ },
104
+ order: { 'createdAt': 'DESC' }
105
+ })
105
106
 
106
- pickedWSD = pickedWSD.map((wsd: WorksheetDetail) => {
107
- return {
108
- ...wsd,
109
- status: ORDER_INVENTORY_STATUS.PENDING_CANCEL,
110
- updater: user
111
- }
112
- })
113
- await tx.getRepository(WorksheetDetail).save(pickedWSD)
114
-
115
- let replacedWSD: WorksheetDetail[] = await tx.getRepository(WorksheetDetail).find({
116
- where: {
117
- domain,
118
- targetInventory: In(pickedOIs.map(oi => oi.id)),
119
- status: ORDER_INVENTORY_STATUS.REPLACED
120
- },
121
- relations: ['targetInventory']
107
+ if (foundWS) {
108
+ await tx.getRepository(Worksheet).update({ id: foundWS.id }, {
109
+ status: ORDER_INVENTORY_STATUS.PENDING_CANCEL,
110
+ updater: user
122
111
  })
123
112
 
124
- if (replacedWSD && replacedWSD.length) {
125
- let replacedOI: OrderInventory[] = replacedWSD.map((wsd: WorksheetDetail) => wsd.targetInventory)
126
- replacedOI = replacedOI.map((oi: OrderInventory) => {
113
+ if (pickedOIs && pickedOIs.length) {
114
+ let pickedWSD: WorksheetDetail[] = await tx.getRepository(WorksheetDetail).find({
115
+ where: {
116
+ domain,
117
+ targetInventory: In(pickedOIs.map(oi => oi.id)),
118
+ status: ORDER_INVENTORY_STATUS.DONE,
119
+ worksheet: foundWS
120
+ }
121
+ })
122
+
123
+ pickedWSD = pickedWSD.map((wsd: WorksheetDetail) => {
127
124
  return {
128
- ...oi,
129
- status: ORDER_INVENTORY_STATUS.REPLACED,
125
+ ...wsd,
126
+ status: ORDER_INVENTORY_STATUS.PENDING_CANCEL,
130
127
  updater: user
131
128
  }
132
129
  })
133
- await tx.getRepository(OrderInventory).save(replacedOI)
134
- }
135
- }
130
+ await tx.getRepository(WorksheetDetail).save(pickedWSD)
136
131
 
137
- if (pickingOIs && pickingOIs.length) {
138
- let pickingWSD: WorksheetDetail[] = await tx.getRepository(WorksheetDetail).find({
139
- where: { domain, targetInventory: In(pickingOIs.map(oi => oi.id)) }
140
- })
132
+ let replacedWSD: WorksheetDetail[] = await tx.getRepository(WorksheetDetail).find({
133
+ where: {
134
+ domain,
135
+ targetInventory: In(pickedOIs.map(oi => oi.id)),
136
+ status: ORDER_INVENTORY_STATUS.REPLACED,
137
+ worksheet: foundWS
138
+ },
139
+ relations: ['targetInventory']
140
+ })
141
141
 
142
- pickingWSD = pickingWSD.map((wsd: WorksheetDetail) => {
143
- return {
144
- ...wsd,
145
- status: ORDER_INVENTORY_STATUS.PENDING_CANCEL,
146
- updater: user
142
+ if (replacedWSD && replacedWSD.length) {
143
+ let replacedOI: OrderInventory[] = replacedWSD.map((wsd: WorksheetDetail) => wsd.targetInventory)
144
+ replacedOI = replacedOI.map((oi: OrderInventory) => {
145
+ return {
146
+ ...oi,
147
+ status: ORDER_INVENTORY_STATUS.REPLACED,
148
+ updater: user
149
+ }
150
+ })
151
+ await tx.getRepository(OrderInventory).save(replacedOI)
147
152
  }
148
- })
149
- await tx.getRepository(WorksheetDetail).save(pickingWSD)
150
- }
151
-
152
- // find worksheet and update status to PENDING_CANCEL
153
- let foundWS: Worksheet[] = await tx.getRepository(Worksheet).find({
154
- where: {
155
- domain,
156
- releaseGood: foundRO
157
153
  }
158
- })
159
154
 
160
- foundWS = foundWS.map((ws: Worksheet) => {
161
- return {
162
- ...ws,
163
- status: ORDER_INVENTORY_STATUS.PENDING_CANCEL,
164
- updater: user
155
+ if (pickingOIs && pickingOIs.length) {
156
+ let pickingWSD: WorksheetDetail[] = await tx.getRepository(WorksheetDetail).find({
157
+ where: {
158
+ domain, targetInventory: In(pickingOIs.map(oi => oi.id)),
159
+ worksheet: foundWS
160
+ }
161
+ })
162
+
163
+ pickingWSD = pickingWSD.map((wsd: WorksheetDetail) => {
164
+ return {
165
+ ...wsd,
166
+ status: ORDER_INVENTORY_STATUS.PENDING_CANCEL,
167
+ updater: user
168
+ }
169
+ })
170
+ await tx.getRepository(WorksheetDetail).save(pickingWSD)
165
171
  }
166
- })
167
- await tx.getRepository(Worksheet).save(foundWS)
172
+ }
168
173
 
169
174
  // find DO and change status to pending cancel
170
175
  let foundDO: DeliveryOrder[] = await tx.getRepository(DeliveryOrder).find({
@@ -186,43 +191,43 @@ export const pendingCancellationReleaseOrder = {
186
191
  updater: user
187
192
  })
188
193
 
189
- // notification logics
190
- // get Office Admin Users
191
- const users: any[] = await tx
192
- .getRepository('users_roles')
193
- .createQueryBuilder('ur')
194
- .select('ur.users_id', 'id')
195
- .where(qb => {
196
- const subQuery = qb
197
- .subQuery()
198
- .select('role.id')
199
- .from(Role, 'role')
200
- .where("role.name = 'Office Admin'")
201
- .andWhere('role.domain_id = :domain', { domain: domain.id })
202
- .getQuery()
203
- return 'ur.roles_id IN ' + subQuery
204
- })
205
- .getRawMany()
206
-
207
- // send notification to Office Admin Users
208
- if (users?.length && context.header?.referer) {
209
- const receivers: any[] = users.map(user => user.id)
210
- const msg = {
211
- title: `${foundRO.name} cancellation`,
212
- body: `${customerBizplace.name} is requesting to cancel order`,
213
- url: context.header.referer,
214
- data: { url: context.header.referer }
215
- }
216
-
217
- /**
218
- * @notes Temporary off sendNotification due to suspect of causing wms down
219
- */
220
194
 
221
- // await sendNotification({
222
- // receivers,
223
- // message: { ...msg }
224
- // })
225
- }
195
+ /**
196
+ * @notes Temporary off sendNotification due to suspect of causing wms down
197
+ */
198
+ // // notification logics
199
+ // // get Office Admin Users
200
+ // const users: any[] = await tx
201
+ // .getRepository('users_roles')
202
+ // .createQueryBuilder('ur')
203
+ // .select('ur.users_id', 'id')
204
+ // .where(qb => {
205
+ // const subQuery = qb
206
+ // .subQuery()
207
+ // .select('role.id')
208
+ // .from(Role, 'role')
209
+ // .where("role.name = 'Office Admin'")
210
+ // .andWhere('role.domain_id = :domain', { domain: domain.id })
211
+ // .getQuery()
212
+ // return 'ur.roles_id IN ' + subQuery
213
+ // })
214
+ // .getRawMany()
215
+
216
+ // // send notification to Office Admin Users
217
+ // if (users?.length && context.header?.referer) {
218
+ // const receivers: any[] = users.map(user => user.id)
219
+ // const msg = {
220
+ // title: `${foundRO.name} cancellation`,
221
+ // body: `${customerBizplace.name} is requesting to cancel order`,
222
+ // url: context.header.referer,
223
+ // data: { url: context.header.referer }
224
+ // }
225
+
226
+ // await sendNotification({
227
+ // receivers,
228
+ // message: { ...msg }
229
+ // })
230
+ // }
226
231
 
227
232
  return
228
233
  }
@@ -226,26 +226,7 @@ export async function completePicking(
226
226
 
227
227
  if (releaseGood.packingOption) {
228
228
  const packingWSCtrl: PackingWorksheetController = new PackingWorksheetController(tx, domain, user)
229
-
230
- const directActivatePackingWorksheet: Setting = await tx.getRepository(Setting).findOne({
231
- where: { domain: domain, category: 'id-rule', name: 'enable-direct-activate-packing-worksheet' }
232
- })
233
- const partnerDirectActivatePackingWorksheetSetting: PartnerSetting = await tx
234
- .getRepository(PartnerSetting)
235
- .findOne({
236
- where: { setting: directActivatePackingWorksheet, domain: domain, partnerDomain: releaseGood.bizplace?.domain }
237
- })
238
-
239
- let packingWorksheet: Worksheet = await packingWSCtrl.generatePackingWorksheet(releaseGoodNo)
240
-
241
- if (directActivatePackingWorksheet != undefined && directActivatePackingWorksheet.value.toLowerCase() == 'true') {
242
- if (partnerDirectActivatePackingWorksheetSetting != undefined) {
243
- if (partnerDirectActivatePackingWorksheetSetting.value.toLowerCase() == 'true')
244
- await packingWSCtrl.activatePacking(packingWorksheet.name)
245
- } else {
246
- await packingWSCtrl.activatePacking(packingWorksheet.name)
247
- }
248
- }
229
+ await packingWSCtrl.generatePackingWorksheet(releaseGoodNo)
249
230
  } else {
250
231
  // Find Existing Loading Worksheet if any
251
232
  let existLoadingWorksheet: Worksheet = await tx.getRepository(Worksheet).findOne({