@things-factory/worksheet-base 4.3.159 → 4.3.162
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.
- package/dist-server/controllers/inbound/putaway-returning-worksheet-controller.js +3 -1
- package/dist-server/controllers/inbound/putaway-returning-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/inbound/putaway-worksheet-controller.js +3 -1
- package/dist-server/controllers/inbound/putaway-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/picking-worksheet-controller.js +25 -14
- package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/render-manifest.js +11 -11
- package/dist-server/controllers/render-manifest.js.map +1 -1
- package/dist-server/controllers/worksheet-controller.js +9 -17
- package/dist-server/controllers/worksheet-controller.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js +20 -13
- package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js +155 -124
- package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +249 -217
- package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet-detail/regenerate-release-good-worksheet-details.js +23 -5
- package/dist-server/graphql/resolvers/worksheet-detail/regenerate-release-good-worksheet-details.js.map +1 -1
- package/dist-server/graphql/types/worksheet/index.js +2 -2
- package/dist-server/utils/inventory-util.js +29 -1
- package/dist-server/utils/inventory-util.js.map +1 -1
- package/package.json +6 -6
- package/server/controllers/inbound/putaway-returning-worksheet-controller.ts +3 -1
- package/server/controllers/inbound/putaway-worksheet-controller.ts +3 -1
- package/server/controllers/outbound/picking-worksheet-controller.ts +32 -16
- package/server/controllers/render-manifest.ts +10 -12
- package/server/controllers/worksheet-controller.ts +13 -17
- package/server/graphql/resolvers/worksheet/inventories-by-pallet.ts +24 -13
- package/server/graphql/resolvers/worksheet/picking/complete-batch-picking.ts +180 -142
- package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +276 -239
- package/server/graphql/resolvers/worksheet-detail/regenerate-release-good-worksheet-details.ts +38 -8
- package/server/graphql/types/worksheet/index.ts +2 -2
- 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
|
-
|
|
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<
|
|
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(
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
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
|
-
|
|
114
|
-
|
|
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
|
-
|
|
122
|
-
|
|
131
|
+
if (rtsTriggerLevel && parseInt(rtsTriggerLevel?.value || 0) == 1) {
|
|
132
|
+
await sellercraftCtrl.initiateOrderShipment(sellercraft, releaseGood)
|
|
133
|
+
}
|
|
123
134
|
})
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
}
|
|
128
|
-
})
|
|
135
|
+
}
|
|
136
|
+
// asynchronouly call to initiate sellercraft order shipment/ RTS
|
|
137
|
+
initSCOrderShipment(sellercraft)
|
|
129
138
|
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
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
|
-
|
|
154
|
-
|
|
165
|
+
if (!marketplaceOrder) {
|
|
166
|
+
throw new Error('Failed to find ecommerce order, kindly contact our support team regarding this issue')
|
|
167
|
+
}
|
|
155
168
|
|
|
156
|
-
|
|
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
|
-
|
|
160
|
-
|
|
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
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
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
|
-
|
|
192
|
-
|
|
193
|
-
|
|
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
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
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
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
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
|
-
|
|
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
|
-
|
|
290
|
-
|
|
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
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
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
|
-
|
|
313
|
-
|
|
314
|
-
|
|
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
|
-
|
|
323
|
-
.
|
|
324
|
-
|
|
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
|
-
|
|
334
|
-
|
|
335
|
-
|
|
342
|
+
if (releaseGood.type == 'b2c') {
|
|
343
|
+
await createSalesOrder(account, tx)
|
|
344
|
+
}
|
|
336
345
|
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
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
|
-
|
|
351
|
-
|
|
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.
|
|
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
|
}
|