@things-factory/worksheet-base 4.3.157 → 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 +18 -18
  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, ContactPoint, getMyBizplace } from '@things-factory/biz-base'
@@ -25,6 +25,7 @@ import {
25
25
  } from '@things-factory/sales-base'
26
26
  import { Setting } from '@things-factory/setting-base'
27
27
  import { Domain } from '@things-factory/shell'
28
+ import { Inventory } from '@things-factory/warehouse-base'
28
29
 
29
30
  import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../../../constants'
30
31
  import {
@@ -40,9 +41,11 @@ import { Worksheet, WorksheetDetail } from '../../../../entities'
40
41
  export const completePickingResolver = {
41
42
  async completePicking(_: any, { releaseGoodNo }, context: any) {
42
43
  const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
44
+ let obsolete = await completePicking(tx, domain, user, releaseGoodNo)
43
45
 
44
- await completePicking(tx, domain, user, releaseGoodNo)
45
-
46
+ if (obsolete) {
47
+ return { obsolete: true }
48
+ }
46
49
  const bizplace: Bizplace = await getMyBizplace(domain, user)
47
50
  const worksheetController: WorksheetController = new WorksheetController(tx, domain, user)
48
51
  await worksheetController.notifyToCustomer(bizplace, {
@@ -59,7 +62,7 @@ export async function completePicking(
59
62
  domain: Domain,
60
63
  user: User,
61
64
  releaseGoodNo: string
62
- ): Promise<void> {
65
+ ): Promise<any> {
63
66
  const pickingWSCtrl: PickingWorksheetController = new PickingWorksheetController(tx, domain, user)
64
67
  let releaseGood: ReleaseGood = await tx.getRepository(ReleaseGood).findOne({
65
68
  where: { domain, name: releaseGoodNo },
@@ -80,7 +83,8 @@ export async function completePicking(
80
83
 
81
84
  const worksheet: Worksheet = await pickingWSCtrl.findWorksheetByRefOrder(releaseGood, WORKSHEET_TYPE.PICKING, [
82
85
  'worksheetDetails',
83
- 'worksheetDetails.targetInventory'
86
+ 'worksheetDetails.targetInventory',
87
+ 'worksheetDetails.targetInventory.inventory'
84
88
  ])
85
89
 
86
90
  const warehouseContactPoint: ContactPoint = await tx.getRepository(ContactPoint).findOne({
@@ -92,267 +96,287 @@ export async function completePicking(
92
96
 
93
97
  const worksheetDetails: WorksheetDetail[] = worksheet.worksheetDetails
94
98
  const targetInventories: OrderInventory[] = worksheetDetails.map((wsd: WorksheetDetail) => wsd.targetInventory)
99
+ const inventories: Inventory[] = targetInventories.map((ti: OrderInventory) => ti.inventory)
95
100
  const pickedTargetInventories: OrderInventory[] = targetInventories.filter(
96
101
  targetInventory => targetInventory.status === ORDER_INVENTORY_STATUS.PICKED
97
102
  )
98
103
 
99
- await pickingWSCtrl.completePicking(releaseGoodNo)
100
-
101
- const orderSource: string = releaseGood.source
102
- switch (orderSource) {
103
- case ApplicationType.SELLERCRAFT:
104
- const sellercraft: Sellercraft = await tx
105
- .getRepository(Sellercraft)
106
- .findOne({ domain: releaseGood.bizplace.domain, status: SellercraftStatus.ACTIVE })
107
-
108
- if (sellercraft) {
109
- const initSCOrderShipment = async sellercraft => {
110
- await getManager().transaction(async txMgr => {
111
- const sellercraftCtrl: SellercraftController = new SellercraftController(txMgr, domain, user)
104
+ let foundObsoleteInventories = await pickingWSCtrl.completePicking(releaseGood, worksheet, inventories)
105
+
106
+ if (foundObsoleteInventories?.type) {
107
+ const orderSource: string = releaseGood.source
108
+ switch (orderSource) {
109
+ case ApplicationType.SELLERCRAFT:
110
+ const sellercraft: Sellercraft = await tx
111
+ .getRepository(Sellercraft)
112
+ .findOne({ domain: releaseGood.bizplace.domain, status: SellercraftStatus.ACTIVE })
113
+
114
+ if (sellercraft) {
115
+ const initSCOrderShipment = async sellercraft => {
116
+ await getManager().transaction(async txMgr => {
117
+ const sellercraftCtrl: SellercraftController = new SellercraftController(txMgr, domain, user)
118
+
119
+ if (!releaseGood?.orderPackages?.length && !releaseGood?.marketPackCallSuccess) {
120
+ const orderProducts: OrderProduct[] = await txMgr.getRepository(OrderProduct).find({
121
+ where: { releaseGood },
122
+ relations: ['product', 'product.productDetails']
123
+ })
124
+ await sellercraftCtrl.packOrder(sellercraft, { ...releaseGood, orderProducts })
125
+ }
112
126
 
113
- if (!releaseGood?.orderPackages?.length && !releaseGood?.marketPackCallSuccess) {
114
- const orderProducts: OrderProduct[] = await txMgr.getRepository(OrderProduct).find({
115
- where: { releaseGood },
116
- relations: ['product', 'product.productDetails']
127
+ const rtsTriggerLevel: Setting = await txMgr.getRepository(Setting).findOne({
128
+ where: { domain, category: 'id-rule', name: 'rts-trigger-level' }
117
129
  })
118
- await sellercraftCtrl.packOrder(sellercraft, { ...releaseGood, orderProducts })
119
- }
120
130
 
121
- const rtsTriggerLevel: Setting = await txMgr.getRepository(Setting).findOne({
122
- where: { domain, category: 'id-rule', name: 'rts-trigger-level' }
131
+ if (rtsTriggerLevel && parseInt(rtsTriggerLevel?.value || 0) == 1) {
132
+ await sellercraftCtrl.initiateOrderShipment(sellercraft, releaseGood)
133
+ }
123
134
  })
124
-
125
- if (rtsTriggerLevel && parseInt(rtsTriggerLevel?.value || 0) == 1) {
126
- await sellercraftCtrl.initiateOrderShipment(sellercraft, releaseGood)
127
- }
128
- })
135
+ }
136
+ // asynchronouly call to initiate sellercraft order shipment/ RTS
137
+ initSCOrderShipment(sellercraft)
129
138
  }
130
- // asynchronouly call to initiate sellercraft order shipment/ RTS
131
- initSCOrderShipment(sellercraft)
132
- }
133
- break
134
-
135
- case ApplicationType.MMS:
136
- const companyDomain: Domain = releaseGood.bizplace.company.domain
137
- let marketplaceOrder: MarketplaceOrder = await tx.getRepository(MarketplaceOrder).findOne({
138
- where: { orderNo: releaseGood.refNo, domain: companyDomain },
139
- relations: [
140
- 'marketplaceStore',
141
- 'marketplaceStore.marketplaceDistributors',
142
- 'marketplaceOrderItems',
143
- 'marketplaceOrderItems.marketplaceOrderShippingItems',
144
- 'marketplaceOrderItems.marketplaceOrderShippingItems.marketplaceOrderShipping'
145
- ]
146
- })
147
-
148
- if (marketplaceOrder) {
149
- const ecommerceCtrl: EcommerceController = new EcommerceController(tx, domain, user)
150
- const marketplaceStore: MarketplaceStore = marketplaceOrder.marketplaceStore
151
- let eTraxOption: boolean
139
+ break
140
+
141
+ case ApplicationType.MMS:
142
+ const companyDomain: Domain = releaseGood.bizplace.company.domain
143
+ let marketplaceOrder: MarketplaceOrder = await tx.getRepository(MarketplaceOrder).findOne({
144
+ where: { orderNo: releaseGood.refNo, domain: companyDomain },
145
+ relations: [
146
+ 'marketplaceStore',
147
+ 'marketplaceStore.marketplaceDistributors',
148
+ 'marketplaceOrderItems',
149
+ 'marketplaceOrderItems.marketplaceOrderShippingItems',
150
+ 'marketplaceOrderItems.marketplaceOrderShippingItems.marketplaceOrderShipping'
151
+ ]
152
+ })
153
+
154
+ if (marketplaceOrder) {
155
+ const ecommerceCtrl: EcommerceController = new EcommerceController(tx, domain, user)
156
+ const marketplaceStore: MarketplaceStore = marketplaceOrder.marketplaceStore
157
+ let eTraxOption: boolean
158
+
159
+ if (marketplaceStore?.isAutoUpdateShipment) {
160
+ await ecommerceCtrl.createOrderComment(marketplaceStore, marketplaceOrder, ORDER_STATUS.PACKING)
161
+
162
+ await ecommerceCtrl.createOrderShip(releaseGood, marketplaceStore, marketplaceOrder, companyDomain)
163
+ }
152
164
 
153
- if (marketplaceStore?.isAutoUpdateShipment) {
154
- await ecommerceCtrl.createOrderComment(marketplaceStore, marketplaceOrder, ORDER_STATUS.PACKING)
165
+ if (!marketplaceOrder) {
166
+ throw new Error('Failed to find ecommerce order, kindly contact our support team regarding this issue')
167
+ }
155
168
 
156
- await ecommerceCtrl.createOrderShip(releaseGood, marketplaceStore, marketplaceOrder, companyDomain)
157
- }
169
+ eTraxOption = marketplaceOrder?.marketplaceStore.eTrax
170
+
171
+ // if eTrax option is true
172
+ if (eTraxOption) {
173
+ const marketplaceOrderItems: MarketplaceOrderItem[] = marketplaceOrder.marketplaceOrderItems
174
+
175
+ // access every marketplaceOrderItems for shipping information you need
176
+ // trigger the controller from integration-lmd that trigger the API, build the parameters needed
177
+ // for etrax didn't support multi awb per order
178
+ const marketplaceOrderShippingItems: MarketplaceOrderShippingItem[] =
179
+ marketplaceOrderItems[0].marketplaceOrderShippingItems
180
+ const marketplaceOrderShipping: MarketplaceOrderShipping =
181
+ marketplaceOrderShippingItems[0].marketplaceOrderShipping
182
+ const lmd: LastMileDelivery = await tx.getRepository(LastMileDelivery).findOne({
183
+ where: {
184
+ domain,
185
+ platform: 'eTrax'
186
+ }
187
+ })
158
188
 
159
- if (!marketplaceOrder) {
160
- throw new Error('Failed to find ecommerce order, kindly contact our support team regarding this issue')
161
- }
189
+ //Get which transporter to use
190
+ const marketplaceTransporter: MarketplaceTransporter = await tx
191
+ .getRepository(MarketplaceTransporter)
192
+ .findOne({
193
+ where: { marketplaceStore: marketplaceOrder.marketplaceStore },
194
+ relations: ['pickupTransporter', 'deliveryTransporter']
195
+ })
162
196
 
163
- eTraxOption = marketplaceOrder?.marketplaceStore.eTrax
164
-
165
- // if eTrax option is true
166
- if (eTraxOption) {
167
- const marketplaceOrderItems: MarketplaceOrderItem[] = marketplaceOrder.marketplaceOrderItems
168
-
169
- // access every marketplaceOrderItems for shipping information you need
170
- // trigger the controller from integration-lmd that trigger the API, build the parameters needed
171
- // for etrax didn't support multi awb per order
172
- const marketplaceOrderShippingItems: MarketplaceOrderShippingItem[] =
173
- marketplaceOrderItems[0].marketplaceOrderShippingItems
174
- const marketplaceOrderShipping: MarketplaceOrderShipping =
175
- marketplaceOrderShippingItems[0].marketplaceOrderShipping
176
- const lmd: LastMileDelivery = await tx.getRepository(LastMileDelivery).findOne({
177
- where: {
178
- domain,
179
- platform: 'eTrax'
180
- }
181
- })
182
-
183
- //Get which transporter to use
184
- const marketplaceTransporter: MarketplaceTransporter = await tx
185
- .getRepository(MarketplaceTransporter)
186
- .findOne({
187
- where: { marketplaceStore: marketplaceOrder.marketplaceStore },
188
- relations: ['pickupTransporter', 'deliveryTransporter']
197
+ const resp = await LastMileAPI.createShipmentRequest(lmd, {
198
+ orderNo: marketplaceOrder.orderNo,
199
+ clientId: lmd.clientId,
200
+ clientType: lmd.clientType,
201
+ clientName: lmd.clientName,
202
+ transporterId: marketplaceTransporter.pickupTransporter.transporterId,
203
+ pickupName: warehouseContactPoint.name,
204
+ pickupAddress1: warehouseContactPoint.address,
205
+ pickupAddress2: warehouseContactPoint.address2,
206
+ pickupPostcode: warehouseContactPoint.postCode,
207
+ pickupState: warehouseContactPoint.state,
208
+ pickupCity: warehouseContactPoint.city,
209
+ pickupPhone: warehouseContactPoint.phone,
210
+ pickupEmail: warehouseContactPoint.email,
211
+ name: marketplaceOrderShipping?.attentionTo ? marketplaceOrderShipping.attentionTo.trim() : '',
212
+ address1: marketplaceOrderShipping?.address1 ? marketplaceOrderShipping?.address1.trim() : '-',
213
+ address2: marketplaceOrderShipping?.address2 ? marketplaceOrderShipping?.address2.trim() : '-',
214
+ postCode: marketplaceOrderShipping?.postCode ? marketplaceOrderShipping?.postCode.trim() : '',
215
+ city: marketplaceOrderShipping?.city ? marketplaceOrderShipping?.city.trim() : '',
216
+ state: marketplaceOrderShipping?.state ? marketplaceOrderShipping?.state.trim() : '',
217
+ phone: marketplaceOrderShipping.phone1 || '',
218
+ email: marketplaceOrderShipping.email || '',
219
+ attentionTo: marketplaceOrderShipping.attentionTo,
220
+ quantity: marketplaceOrderItems.length
189
221
  })
190
222
 
191
- const resp = await LastMileAPI.createShipmentRequest(lmd, {
192
- orderNo: marketplaceOrder.orderNo,
193
- clientId: lmd.clientId,
194
- clientType: lmd.clientType,
195
- clientName: lmd.clientName,
196
- transporterId: marketplaceTransporter.pickupTransporter.transporterId,
197
- pickupName: warehouseContactPoint.name,
198
- pickupAddress1: warehouseContactPoint.address,
199
- pickupAddress2: warehouseContactPoint.address2,
200
- pickupPostcode: warehouseContactPoint.postCode,
201
- pickupState: warehouseContactPoint.state,
202
- pickupCity: warehouseContactPoint.city,
203
- pickupPhone: warehouseContactPoint.phone,
204
- pickupEmail: warehouseContactPoint.email,
205
- name: marketplaceOrderShipping?.attentionTo ? marketplaceOrderShipping.attentionTo.trim() : '',
206
- address1: marketplaceOrderShipping?.address1 ? marketplaceOrderShipping?.address1.trim() : '-',
207
- address2: marketplaceOrderShipping?.address2 ? marketplaceOrderShipping?.address2.trim() : '-',
208
- postCode: marketplaceOrderShipping?.postCode ? marketplaceOrderShipping?.postCode.trim() : '',
209
- city: marketplaceOrderShipping?.city ? marketplaceOrderShipping?.city.trim() : '',
210
- state: marketplaceOrderShipping?.state ? marketplaceOrderShipping?.state.trim() : '',
211
- phone: marketplaceOrderShipping.phone1 || '',
212
- email: marketplaceOrderShipping.email || '',
213
- attentionTo: marketplaceOrderShipping.attentionTo,
214
- quantity: marketplaceOrderItems.length
215
- })
216
-
217
- const delay = (ms: number) => {
218
- return new Promise(resolve => setTimeout(resolve, ms))
219
- }
223
+ const delay = (ms: number) => {
224
+ return new Promise(resolve => setTimeout(resolve, ms))
225
+ }
220
226
 
221
- if (resp.Status === 'SUCCESS') {
222
- //Success
223
- let awbObtained = false
224
- let retry = 0
225
- while (!awbObtained) {
226
- const marketplaceOrder2: MarketplaceOrder = await tx.getRepository(MarketplaceOrder).findOne({
227
- where: { releaseOrderId: releaseGood.id },
228
- relations: [
229
- 'marketplaceStore',
230
- 'marketplaceOrderItems',
231
- 'marketplaceOrderItems.marketplaceOrderShippingItems',
232
- 'marketplaceOrderItems.marketplaceOrderShippingItems.marketplaceOrderShipping'
233
- ]
234
- })
235
- const orderShipping =
236
- marketplaceOrder2.marketplaceOrderItems[0].marketplaceOrderShippingItems[0].marketplaceOrderShipping
237
- if (orderShipping?.airwayBill) {
238
- awbObtained = true
239
- }
240
- await delay(5000)
241
- //Timeout after 15sec
242
- if (++retry > 3) {
243
- break
227
+ if (resp.Status === 'SUCCESS') {
228
+ //Success
229
+ let awbObtained = false
230
+ let retry = 0
231
+ while (!awbObtained) {
232
+ const marketplaceOrder2: MarketplaceOrder = await tx.getRepository(MarketplaceOrder).findOne({
233
+ where: { releaseOrderId: releaseGood.id },
234
+ relations: [
235
+ 'marketplaceStore',
236
+ 'marketplaceOrderItems',
237
+ 'marketplaceOrderItems.marketplaceOrderShippingItems',
238
+ 'marketplaceOrderItems.marketplaceOrderShippingItems.marketplaceOrderShipping'
239
+ ]
240
+ })
241
+ const orderShipping =
242
+ marketplaceOrder2.marketplaceOrderItems[0].marketplaceOrderShippingItems[0].marketplaceOrderShipping
243
+ if (orderShipping?.airwayBill) {
244
+ awbObtained = true
245
+ }
246
+ await delay(5000)
247
+ //Timeout after 15sec
248
+ if (++retry > 3) {
249
+ break
250
+ }
244
251
  }
252
+ } else {
253
+ if (resp?.AWBurl && resp?.TrackingNo)
254
+ await tx
255
+ .getRepository(MarketplaceOrderShipping)
256
+ .update({ id: marketplaceOrderShipping.id }, { airwayBill: resp.AWBurl, trackingNo: resp.TrackingNo })
257
+ else throw resp
245
258
  }
246
- } else {
247
- if (resp?.AWBurl && resp?.TrackingNo)
248
- await tx
249
- .getRepository(MarketplaceOrderShipping)
250
- .update({ id: marketplaceOrderShipping.id }, { airwayBill: resp.AWBurl, trackingNo: resp.TrackingNo })
251
- else throw resp
252
259
  }
253
- }
254
260
 
255
- await ecommerceCtrl.createOrderPackage(tx, marketplaceOrder, companyDomain, marketplaceStore, releaseGood)
256
- }
257
- break
258
-
259
- default:
260
- const orderPackage: OrderPackage = {
261
- name: OrderNoGenerator.orderPackage(),
262
- packageId: null,
263
- trackingNo: null,
264
- transporter: null,
265
- airwayBill: null,
266
- status: ORDER_STATUS.PROCESSING,
267
- releaseGood,
268
- domain: releaseGood.domain,
269
- bizplace: releaseGood.bizplace,
270
- creator: releaseGood.creator,
271
- updater: releaseGood.updater
272
- }
273
-
274
- let savedOrderPackage: OrderPackage = await tx.getRepository(OrderPackage).save(orderPackage)
275
- const orderPackageItems: OrderPackageItem[] = releaseGood.orderProducts.map(op => {
276
- return {
277
- name: OrderNoGenerator.orderPackageItem(),
278
- orderProduct: op,
261
+ await ecommerceCtrl.createOrderPackage(tx, marketplaceOrder, companyDomain, marketplaceStore, releaseGood)
262
+ }
263
+ break
264
+
265
+ default:
266
+ const orderPackage: OrderPackage = {
267
+ name: OrderNoGenerator.orderPackage(),
268
+ packageId: null,
269
+ trackingNo: null,
270
+ transporter: null,
271
+ airwayBill: null,
279
272
  status: ORDER_STATUS.PROCESSING,
280
- releaseQty: op.releaseQty,
281
- orderPackage: savedOrderPackage,
273
+ releaseGood,
282
274
  domain: releaseGood.domain,
283
275
  bizplace: releaseGood.bizplace,
284
276
  creator: releaseGood.creator,
285
277
  updater: releaseGood.updater
286
278
  }
287
- })
288
279
 
289
- await tx.getRepository(OrderPackageItem).save(orderPackageItems)
290
- break
291
- }
280
+ let savedOrderPackage: OrderPackage = await tx.getRepository(OrderPackage).save(orderPackage)
281
+ const orderPackageItems: OrderPackageItem[] = releaseGood.orderProducts.map(op => {
282
+ return {
283
+ name: OrderNoGenerator.orderPackageItem(),
284
+ orderProduct: op,
285
+ status: ORDER_STATUS.PROCESSING,
286
+ releaseQty: op.releaseQty,
287
+ orderPackage: savedOrderPackage,
288
+ domain: releaseGood.domain,
289
+ bizplace: releaseGood.bizplace,
290
+ creator: releaseGood.creator,
291
+ updater: releaseGood.updater
292
+ }
293
+ })
294
+
295
+ await tx.getRepository(OrderPackageItem).save(orderPackageItems)
296
+ break
297
+ }
292
298
 
293
- const account: Account = await tx
294
- .getRepository(Account)
295
- .findOne({ domain: releaseGood.bizplace.domain, status: 'active' })
296
-
297
- // Xilnex Create Sales Order and Post Sales Order to Sales Invoice
298
- const createSalesOrder = async (account, tx) => {
299
- if (account) {
300
- try {
301
- if (account.platform == 'xilnex') {
302
- const salesOrder: any = await AccountingAPI.createSalesOrder(account, {
303
- releaseGood,
304
- orderProducts: releaseGood.orderProducts
305
- })
306
-
307
- if (salesOrder) {
308
- const salesInvoice: any = await AccountingAPI.postSalesOrderToSalesInvoice(account, {
309
- orderId: salesOrder?.id || null
299
+ const account: Account = await tx
300
+ .getRepository(Account)
301
+ .findOne({ domain: releaseGood.bizplace.domain, status: 'active' })
302
+
303
+ // Xilnex Create Sales Order and Post Sales Order to Sales Invoice
304
+ const createSalesOrder = async (account, tx) => {
305
+ if (account) {
306
+ try {
307
+ if (account.platform == 'xilnex') {
308
+ const salesOrder: any = await AccountingAPI.createSalesOrder(account, {
309
+ releaseGood,
310
+ orderProducts: releaseGood.orderProducts
310
311
  })
311
312
 
312
- const salesOrderItems: any = salesInvoice.sale.items
313
- await Promise.all(
314
- releaseGood.orderProducts.map(async op => {
315
- const matchedProduct: any = salesOrderItems.find(soi => soi.itemId == op.productDetail.refCode)
316
- if (matchedProduct) {
317
- await tx.getRepository(OrderProduct).update({ id: op.id }, { refItemId: matchedProduct.id })
318
- }
313
+ if (salesOrder) {
314
+ const salesInvoice: any = await AccountingAPI.postSalesOrderToSalesInvoice(account, {
315
+ orderId: salesOrder?.id || null
319
316
  })
320
- )
321
317
 
322
- await tx
323
- .getRepository(ReleaseGood)
324
- .update({ id: releaseGood.id }, { collectionOrderNo: salesInvoice.salesId, updater: releaseGood.updater })
318
+ const salesOrderItems: any = salesInvoice.sale.items
319
+ await Promise.all(
320
+ releaseGood.orderProducts.map(async op => {
321
+ const matchedProduct: any = salesOrderItems.find(soi => soi.itemId == op.productDetail.refCode)
322
+ if (matchedProduct) {
323
+ await tx.getRepository(OrderProduct).update({ id: op.id }, { refItemId: matchedProduct.id })
324
+ }
325
+ })
326
+ )
327
+
328
+ await tx
329
+ .getRepository(ReleaseGood)
330
+ .update(
331
+ { id: releaseGood.id },
332
+ { collectionOrderNo: salesInvoice.salesId, updater: releaseGood.updater }
333
+ )
334
+ }
325
335
  }
336
+ } catch (error) {
337
+ logger.error(`complete-picking[createSalesOrder]: ${error}`)
326
338
  }
327
- } catch (error) {
328
- logger.error(`complete-picking[createSalesOrder]: ${error}`)
329
339
  }
330
340
  }
331
- }
332
341
 
333
- if (releaseGood.type == 'b2c') {
334
- await createSalesOrder(account, tx)
335
- }
342
+ if (releaseGood.type == 'b2c') {
343
+ await createSalesOrder(account, tx)
344
+ }
336
345
 
337
- if (releaseGood.packingOption) {
338
- const packingWSCtrl: PackingWorksheetController = new PackingWorksheetController(tx, domain, user)
339
- await packingWSCtrl.generatePackingWorksheet(releaseGoodNo)
340
- } else {
341
- // Find Existing Loading Worksheet if any
342
- let existLoadingWorksheet: Worksheet = await tx.getRepository(Worksheet).findOne({
343
- where: {
344
- releaseGood,
345
- type: WORKSHEET_TYPE.LOADING,
346
- status: WORKSHEET_STATUS.DEACTIVATED
347
- }
348
- })
346
+ if (releaseGood.packingOption) {
347
+ const packingWSCtrl: PackingWorksheetController = new PackingWorksheetController(tx, domain, user)
348
+ await packingWSCtrl.generatePackingWorksheet(releaseGoodNo)
349
+ } else {
350
+ // Find Existing Loading Worksheet if any
351
+ let existLoadingWorksheet: Worksheet = await tx.getRepository(Worksheet).findOne({
352
+ where: {
353
+ releaseGood,
354
+ type: WORKSHEET_TYPE.LOADING,
355
+ status: WORKSHEET_STATUS.DEACTIVATED
356
+ }
357
+ })
358
+
359
+ if (!existLoadingWorksheet && !releaseGood.courierOption && !releaseGood.packingOption) {
360
+ if (pickedTargetInventories.length > 0) {
361
+ const loadingWSCtrl: LoadingWorksheetController = new LoadingWorksheetController(tx, domain, user)
362
+ let loadingWorksheet: Worksheet = await loadingWSCtrl.generateLoadingWorksheet(
363
+ releaseGoodNo,
364
+ pickedTargetInventories
365
+ )
366
+
367
+ if (!loadingWorksheet.worksheetDetails?.length) {
368
+ loadingWorksheet = await pickingWSCtrl.findWorksheetById(loadingWorksheet.id)
369
+ }
349
370
 
350
- if (!existLoadingWorksheet && !releaseGood.courierOption && !releaseGood.packingOption) {
351
- if (pickedTargetInventories.length > 0) {
371
+ const loadingWorksheetDetails: WorksheetDetail[] = loadingWorksheet.worksheetDetails
372
+ await loadingWSCtrl.activateLoading(loadingWorksheet.name, loadingWorksheetDetails)
373
+ }
374
+ } else {
352
375
  const loadingWSCtrl: LoadingWorksheetController = new LoadingWorksheetController(tx, domain, user)
353
- let loadingWorksheet: Worksheet = await loadingWSCtrl.generateLoadingWorksheet(
376
+ let loadingWorksheet: Worksheet = await loadingWSCtrl.updateLoadingWorksheet(
354
377
  releaseGoodNo,
355
- pickedTargetInventories
378
+ pickedTargetInventories,
379
+ existLoadingWorksheet
356
380
  )
357
381
 
358
382
  if (!loadingWorksheet.worksheetDetails?.length) {
@@ -362,20 +386,33 @@ export async function completePicking(
362
386
  const loadingWorksheetDetails: WorksheetDetail[] = loadingWorksheet.worksheetDetails
363
387
  await loadingWSCtrl.activateLoading(loadingWorksheet.name, loadingWorksheetDetails)
364
388
  }
365
- } else {
366
- const loadingWSCtrl: LoadingWorksheetController = new LoadingWorksheetController(tx, domain, user)
367
- let loadingWorksheet: Worksheet = await loadingWSCtrl.updateLoadingWorksheet(
368
- releaseGoodNo,
369
- pickedTargetInventories,
370
- existLoadingWorksheet
371
- )
372
-
373
- if (!loadingWorksheet.worksheetDetails?.length) {
374
- loadingWorksheet = await pickingWSCtrl.findWorksheetById(loadingWorksheet.id)
375
- }
376
-
377
- const loadingWorksheetDetails: WorksheetDetail[] = loadingWorksheet.worksheetDetails
378
- await loadingWSCtrl.activateLoading(loadingWorksheet.name, loadingWorksheetDetails)
379
389
  }
390
+ } else {
391
+ //update inventories obsolete to true
392
+ await tx.getRepository(Inventory).update({ id: In(foundObsoleteInventories) }, { obsolete: true })
393
+
394
+ foundObsoleteInventories = foundObsoleteInventories
395
+ .map(inv => {
396
+ return "'" + inv.trim() + "'"
397
+ })
398
+ .join(',')
399
+
400
+ //update any orders that is assigned with obsolete inventories
401
+ await tx.getRepository(ReleaseGood).query(`
402
+ update release_goods rg set status = 'OBSOLETE'
403
+ from order_inventories oi
404
+ where oi.release_good_id = rg.id
405
+ and oi.inventory_id in (${foundObsoleteInventories})
406
+ and rg.status in ('PICKING', 'PENDING_WORKSHEET', 'READY_TO_PICK')`)
407
+
408
+ await tx.getRepository(Worksheet).query(`
409
+ update worksheets w set status = 'DEACTIVATED', updater_id = '${user.id}', assignee_id = null
410
+ from worksheet_details wd
411
+ inner join order_inventories oi on oi.id = wd.target_inventory_id
412
+ where wd.worksheet_id = w.id
413
+ and oi.inventory_id in (${foundObsoleteInventories})
414
+ `)
415
+
416
+ return true
380
417
  }
381
418
  }