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