@things-factory/worksheet-base 4.3.186 → 4.3.188
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/constants/worksheet.js +3 -1
- package/dist-server/constants/worksheet.js.map +1 -1
- package/dist-server/controllers/ecommerce/sellercraft-controller.js +14 -3
- package/dist-server/controllers/ecommerce/sellercraft-controller.js.map +1 -1
- package/dist-server/controllers/index.js +1 -0
- package/dist-server/controllers/index.js.map +1 -1
- package/dist-server/controllers/outbound/picking-worksheet-controller.js +6 -2
- package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/replenishment/index.js +18 -0
- package/dist-server/controllers/replenishment/index.js.map +1 -0
- package/dist-server/controllers/replenishment/replenishment-worksheet-controller.js +455 -0
- package/dist-server/controllers/replenishment/replenishment-worksheet-controller.js.map +1 -0
- package/dist-server/controllers/worksheet-controller.js +32 -9
- package/dist-server/controllers/worksheet-controller.js.map +1 -1
- package/dist-server/entities/index.js +10 -2
- package/dist-server/entities/index.js.map +1 -1
- package/dist-server/entities/warehouse-bizplace-onhand-inventory.js +15 -1
- package/dist-server/entities/warehouse-bizplace-onhand-inventory.js.map +1 -1
- package/dist-server/entities/warehouse-inventory-assignment-ranking.js +37 -0
- package/dist-server/entities/warehouse-inventory-assignment-ranking.js.map +1 -0
- package/dist-server/entities/worksheet.js +13 -9
- package/dist-server/entities/worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/cancel-replenishment.js +57 -0
- package/dist-server/graphql/resolvers/worksheet/cancel-replenishment.js.map +1 -0
- package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-release-good-worksheet.js +7 -1
- package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-release-good-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-replenishement-worksheet.js +19 -0
- package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-replenishement-worksheet.js.map +1 -0
- package/dist-server/graphql/resolvers/worksheet/generate-worksheet/index.js +2 -1
- package/dist-server/graphql/resolvers/worksheet/generate-worksheet/index.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/index.js +5 -2
- package/dist-server/graphql/resolvers/worksheet/index.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js +3 -1
- package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +284 -270
- package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/index.js +2 -1
- package/dist-server/graphql/resolvers/worksheet/picking/index.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/replenishment-picking.js +12 -0
- package/dist-server/graphql/resolvers/worksheet/picking/replenishment-picking.js.map +1 -0
- package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js +142 -78
- package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/putaway/complete-replenishment-putaway.js +16 -0
- package/dist-server/graphql/resolvers/worksheet/putaway/complete-replenishment-putaway.js.map +1 -0
- package/dist-server/graphql/resolvers/worksheet/putaway/index.js +4 -1
- package/dist-server/graphql/resolvers/worksheet/putaway/index.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/putaway/replenishment-putaway.js +15 -0
- package/dist-server/graphql/resolvers/worksheet/putaway/replenishment-putaway.js.map +1 -0
- package/dist-server/graphql/resolvers/worksheet/putaway/undo-replenishment-putaway.js +16 -0
- package/dist-server/graphql/resolvers/worksheet/putaway/undo-replenishment-putaway.js.map +1 -0
- package/dist-server/graphql/resolvers/worksheet/putaway-replenishment-worksheet.js +81 -0
- package/dist-server/graphql/resolvers/worksheet/putaway-replenishment-worksheet.js.map +1 -0
- package/dist-server/graphql/resolvers/worksheet/replenishment/activate-picking-replenishment.js +17 -0
- package/dist-server/graphql/resolvers/worksheet/replenishment/activate-picking-replenishment.js.map +1 -0
- package/dist-server/graphql/resolvers/worksheet/replenishment/index.js +6 -0
- package/dist-server/graphql/resolvers/worksheet/replenishment/index.js.map +1 -0
- package/dist-server/graphql/resolvers/worksheet/worksheet.js +1 -0
- package/dist-server/graphql/resolvers/worksheet/worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/worksheets.js +28 -2
- package/dist-server/graphql/resolvers/worksheet/worksheets.js.map +1 -1
- package/dist-server/graphql/types/worksheet/index.js +42 -1
- package/dist-server/graphql/types/worksheet/index.js.map +1 -1
- package/dist-server/graphql/types/worksheet/replenish-inventory-patch.js +11 -0
- package/dist-server/graphql/types/worksheet/replenish-inventory-patch.js.map +1 -0
- package/dist-server/graphql/types/worksheet/worksheet-info.js +1 -0
- package/dist-server/graphql/types/worksheet/worksheet-info.js.map +1 -1
- package/dist-server/graphql/types/worksheet/worksheet.js +1 -0
- package/dist-server/graphql/types/worksheet/worksheet.js.map +1 -1
- package/dist-server/utils/datetime-util.js +13 -1
- package/dist-server/utils/datetime-util.js.map +1 -1
- package/dist-server/utils/inventory-util.js +2 -0
- package/dist-server/utils/inventory-util.js.map +1 -1
- package/dist-server/utils/worksheet-no-generator.js +21 -1
- package/dist-server/utils/worksheet-no-generator.js.map +1 -1
- package/dist-server/utils/worksheet-util.js +3 -0
- package/dist-server/utils/worksheet-util.js.map +1 -1
- package/package.json +5 -5
- package/server/constants/worksheet.ts +3 -1
- package/server/controllers/ecommerce/sellercraft-controller.ts +25 -6
- package/server/controllers/index.ts +1 -1
- package/server/controllers/outbound/picking-worksheet-controller.ts +12 -3
- package/server/controllers/replenishment/index.ts +1 -0
- package/server/controllers/replenishment/replenishment-worksheet-controller.ts +632 -0
- package/server/controllers/worksheet-controller.ts +47 -13
- package/server/entities/index.ts +15 -2
- package/server/entities/warehouse-bizplace-onhand-inventory.ts +13 -1
- package/server/entities/warehouse-inventory-assignment-ranking.ts +19 -0
- package/server/entities/worksheet.ts +5 -1
- package/server/graphql/resolvers/worksheet/cancel-replenishment.ts +69 -0
- package/server/graphql/resolvers/worksheet/generate-worksheet/generate-release-good-worksheet.ts +6 -1
- package/server/graphql/resolvers/worksheet/generate-worksheet/generate-replenishement-worksheet.ts +30 -0
- package/server/graphql/resolvers/worksheet/generate-worksheet/index.ts +3 -1
- package/server/graphql/resolvers/worksheet/index.ts +8 -2
- package/server/graphql/resolvers/worksheet/inventories-by-pallet.ts +4 -2
- package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +342 -310
- package/server/graphql/resolvers/worksheet/picking/index.ts +3 -1
- package/server/graphql/resolvers/worksheet/picking/replenishment-picking.ts +27 -0
- package/server/graphql/resolvers/worksheet/picking-worksheet.ts +177 -95
- package/server/graphql/resolvers/worksheet/putaway/complete-replenishment-putaway.ts +25 -0
- package/server/graphql/resolvers/worksheet/putaway/index.ts +7 -1
- package/server/graphql/resolvers/worksheet/putaway/replenishment-putaway.ts +23 -0
- package/server/graphql/resolvers/worksheet/putaway/undo-replenishment-putaway.ts +22 -0
- package/server/graphql/resolvers/worksheet/putaway-replenishment-worksheet.ts +95 -0
- package/server/graphql/resolvers/worksheet/replenishment/activate-picking-replenishment.ts +26 -0
- package/server/graphql/resolvers/worksheet/replenishment/index.ts +5 -0
- package/server/graphql/resolvers/worksheet/worksheet.ts +1 -0
- package/server/graphql/resolvers/worksheet/worksheets.ts +38 -3
- package/server/graphql/types/worksheet/index.ts +42 -1
- package/server/graphql/types/worksheet/replenish-inventory-patch.ts +8 -0
- package/server/graphql/types/worksheet/worksheet-info.ts +1 -0
- package/server/graphql/types/worksheet/worksheet.ts +1 -0
- package/server/utils/datetime-util.ts +14 -0
- package/server/utils/inventory-util.ts +3 -0
- package/server/utils/worksheet-no-generator.ts +29 -1
- package/server/utils/worksheet-util.ts +4 -2
|
@@ -21,7 +21,8 @@ import {
|
|
|
21
21
|
OrderPackage,
|
|
22
22
|
OrderPackageItem,
|
|
23
23
|
OrderProduct,
|
|
24
|
-
ReleaseGood
|
|
24
|
+
ReleaseGood,
|
|
25
|
+
Replenishment
|
|
25
26
|
} from '@things-factory/sales-base'
|
|
26
27
|
import { Setting } from '@things-factory/setting-base'
|
|
27
28
|
import { Domain } from '@things-factory/shell'
|
|
@@ -32,6 +33,7 @@ import {
|
|
|
32
33
|
LoadingWorksheetController,
|
|
33
34
|
PackingWorksheetController,
|
|
34
35
|
PickingWorksheetController,
|
|
36
|
+
ReplenishmentWorksheetController,
|
|
35
37
|
SellercraftController
|
|
36
38
|
} from '../../../../controllers/'
|
|
37
39
|
import { EcommerceController } from '../../../../controllers/ecommerce'
|
|
@@ -65,6 +67,11 @@ export async function completePicking(
|
|
|
65
67
|
releaseGoodNo: string
|
|
66
68
|
): Promise<any> {
|
|
67
69
|
const pickingWSCtrl: PickingWorksheetController = new PickingWorksheetController(tx, domain, user)
|
|
70
|
+
const replenishmentPickingWSCtrl: ReplenishmentWorksheetController = new ReplenishmentWorksheetController(
|
|
71
|
+
tx,
|
|
72
|
+
domain,
|
|
73
|
+
user
|
|
74
|
+
)
|
|
68
75
|
let releaseGood: ReleaseGood = await tx.getRepository(ReleaseGood).findOne({
|
|
69
76
|
where: { domain, name: releaseGoodNo },
|
|
70
77
|
relations: [
|
|
@@ -86,333 +93,354 @@ export async function completePicking(
|
|
|
86
93
|
]
|
|
87
94
|
})
|
|
88
95
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
96
|
+
if (releaseGood) {
|
|
97
|
+
const worksheet: Worksheet = await pickingWSCtrl.findWorksheetByRefOrder(releaseGood, WORKSHEET_TYPE.PICKING, [
|
|
98
|
+
'worksheetDetails',
|
|
99
|
+
'worksheetDetails.targetInventory',
|
|
100
|
+
'worksheetDetails.targetInventory.inventory'
|
|
101
|
+
])
|
|
102
|
+
|
|
103
|
+
const warehouseContactPoint: ContactPoint = await tx.getRepository(ContactPoint).findOne({
|
|
104
|
+
where: {
|
|
105
|
+
domain,
|
|
106
|
+
type: 'WAREHOUSE'
|
|
107
|
+
}
|
|
108
|
+
})
|
|
101
109
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
110
|
+
const worksheetDetails: WorksheetDetail[] = worksheet.worksheetDetails
|
|
111
|
+
const targetInventories: OrderInventory[] = worksheetDetails.map((wsd: WorksheetDetail) => wsd.targetInventory)
|
|
112
|
+
const inventories: Inventory[] = targetInventories.map((ti: OrderInventory) => ti.inventory)
|
|
113
|
+
const pickedTargetInventories: OrderInventory[] = targetInventories.filter(
|
|
114
|
+
targetInventory => targetInventory.status === ORDER_INVENTORY_STATUS.PICKED
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
let foundObsoleteInventories = await pickingWSCtrl.completePicking(releaseGood, worksheet, inventories)
|
|
118
|
+
|
|
119
|
+
if (foundObsoleteInventories?.type) {
|
|
120
|
+
const orderSource: string = releaseGood.source
|
|
121
|
+
switch (orderSource) {
|
|
122
|
+
case ApplicationType.SELLERCRAFT:
|
|
123
|
+
const sellercraft: Sellercraft = await tx
|
|
124
|
+
.getRepository(Sellercraft)
|
|
125
|
+
.findOne({ domain: releaseGood.bizplace.domain, status: SellercraftStatus.ACTIVE })
|
|
126
|
+
|
|
127
|
+
if (sellercraft) {
|
|
128
|
+
const initSCOrderShipment = async sellercraft => {
|
|
129
|
+
await getManager().transaction(async txMgr => {
|
|
130
|
+
const sellercraftCtrl: SellercraftController = new SellercraftController(txMgr, domain, user)
|
|
131
|
+
|
|
132
|
+
if (!releaseGood?.orderPackages?.length && !releaseGood?.marketPackCallSuccess) {
|
|
133
|
+
const orderProducts: OrderProduct[] = await txMgr.getRepository(OrderProduct).find({
|
|
134
|
+
where: { releaseGood },
|
|
135
|
+
relations: ['product', 'product.productDetails']
|
|
136
|
+
})
|
|
137
|
+
await sellercraftCtrl.packOrder(sellercraft, { ...releaseGood, orderProducts })
|
|
138
|
+
}
|
|
108
139
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
if (foundObsoleteInventories?.type) {
|
|
112
|
-
const orderSource: string = releaseGood.source
|
|
113
|
-
switch (orderSource) {
|
|
114
|
-
case ApplicationType.SELLERCRAFT:
|
|
115
|
-
const sellercraft: Sellercraft = await tx
|
|
116
|
-
.getRepository(Sellercraft)
|
|
117
|
-
.findOne({ domain: releaseGood.bizplace.domain, status: SellercraftStatus.ACTIVE })
|
|
118
|
-
|
|
119
|
-
if (sellercraft) {
|
|
120
|
-
const initSCOrderShipment = async sellercraft => {
|
|
121
|
-
await getManager().transaction(async txMgr => {
|
|
122
|
-
const sellercraftCtrl: SellercraftController = new SellercraftController(txMgr, domain, user)
|
|
123
|
-
|
|
124
|
-
if (!releaseGood?.orderPackages?.length && !releaseGood?.marketPackCallSuccess) {
|
|
125
|
-
const orderProducts: OrderProduct[] = await txMgr.getRepository(OrderProduct).find({
|
|
126
|
-
where: { releaseGood },
|
|
127
|
-
relations: ['product', 'product.productDetails']
|
|
140
|
+
const rtsTriggerLevel: Setting = await txMgr.getRepository(Setting).findOne({
|
|
141
|
+
where: { domain, category: 'id-rule', name: 'rts-trigger-level' }
|
|
128
142
|
})
|
|
129
|
-
await sellercraftCtrl.packOrder(sellercraft, { ...releaseGood, orderProducts })
|
|
130
|
-
}
|
|
131
143
|
|
|
132
|
-
|
|
133
|
-
|
|
144
|
+
if (rtsTriggerLevel && parseInt(rtsTriggerLevel?.value || 0) == 1) {
|
|
145
|
+
await sellercraftCtrl.initiateOrderShipment(sellercraft, releaseGood)
|
|
146
|
+
}
|
|
134
147
|
})
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
}
|
|
139
|
-
})
|
|
148
|
+
}
|
|
149
|
+
// asynchronouly call to initiate sellercraft order shipment/ RTS
|
|
150
|
+
initSCOrderShipment(sellercraft)
|
|
140
151
|
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
152
|
+
break
|
|
153
|
+
|
|
154
|
+
case ApplicationType.MMS:
|
|
155
|
+
const companyDomain: Domain = releaseGood.bizplace.company.domain
|
|
156
|
+
let marketplaceOrder: MarketplaceOrder = await tx.getRepository(MarketplaceOrder).findOne({
|
|
157
|
+
where: { orderNo: releaseGood.refNo, domain: companyDomain },
|
|
158
|
+
relations: [
|
|
159
|
+
'marketplaceStore',
|
|
160
|
+
'marketplaceStore.marketplaceDistributors',
|
|
161
|
+
'marketplaceOrderItems',
|
|
162
|
+
'marketplaceOrderItems.marketplaceOrderShippingItems',
|
|
163
|
+
'marketplaceOrderItems.marketplaceOrderShippingItems.marketplaceOrderShipping'
|
|
164
|
+
]
|
|
165
|
+
})
|
|
166
|
+
|
|
167
|
+
if (marketplaceOrder) {
|
|
168
|
+
const ecommerceCtrl: EcommerceController = new EcommerceController(tx, domain, user)
|
|
169
|
+
const marketplaceStore: MarketplaceStore = marketplaceOrder.marketplaceStore
|
|
170
|
+
let eTraxOption: boolean
|
|
171
|
+
|
|
172
|
+
if (marketplaceStore?.isAutoUpdateShipment) {
|
|
173
|
+
await ecommerceCtrl.createOrderComment(marketplaceStore, marketplaceOrder, ORDER_STATUS.PACKING)
|
|
174
|
+
|
|
175
|
+
await ecommerceCtrl.createOrderShip(releaseGood, marketplaceStore, marketplaceOrder, companyDomain)
|
|
176
|
+
}
|
|
163
177
|
|
|
164
|
-
|
|
165
|
-
|
|
178
|
+
if (!marketplaceOrder) {
|
|
179
|
+
throw new Error('Failed to find ecommerce order, kindly contact our support team regarding this issue')
|
|
180
|
+
}
|
|
166
181
|
|
|
167
|
-
|
|
168
|
-
|
|
182
|
+
eTraxOption = marketplaceOrder?.marketplaceStore.eTrax
|
|
183
|
+
|
|
184
|
+
// if eTrax option is true
|
|
185
|
+
if (eTraxOption) {
|
|
186
|
+
const marketplaceOrderItems: MarketplaceOrderItem[] = marketplaceOrder.marketplaceOrderItems
|
|
187
|
+
|
|
188
|
+
// access every marketplaceOrderItems for shipping information you need
|
|
189
|
+
// trigger the controller from integration-lmd that trigger the API, build the parameters needed
|
|
190
|
+
// for etrax didn't support multi awb per order
|
|
191
|
+
const marketplaceOrderShippingItems: MarketplaceOrderShippingItem[] =
|
|
192
|
+
marketplaceOrderItems[0].marketplaceOrderShippingItems
|
|
193
|
+
const marketplaceOrderShipping: MarketplaceOrderShipping =
|
|
194
|
+
marketplaceOrderShippingItems[0].marketplaceOrderShipping
|
|
195
|
+
const lmd: LastMileDelivery = await tx.getRepository(LastMileDelivery).findOne({
|
|
196
|
+
where: {
|
|
197
|
+
domain,
|
|
198
|
+
platform: 'eTrax'
|
|
199
|
+
}
|
|
200
|
+
})
|
|
169
201
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
202
|
+
//Get which transporter to use
|
|
203
|
+
const marketplaceTransporter: MarketplaceTransporter = await tx
|
|
204
|
+
.getRepository(MarketplaceTransporter)
|
|
205
|
+
.findOne({
|
|
206
|
+
where: { marketplaceStore: marketplaceOrder.marketplaceStore },
|
|
207
|
+
relations: ['pickupTransporter', 'deliveryTransporter']
|
|
208
|
+
})
|
|
173
209
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
where: { marketplaceStore: marketplaceOrder.marketplaceStore },
|
|
199
|
-
relations: ['pickupTransporter', 'deliveryTransporter']
|
|
210
|
+
const resp = await LastMileAPI.createShipmentRequest(lmd, {
|
|
211
|
+
orderNo: marketplaceOrder.orderNo,
|
|
212
|
+
clientId: lmd.clientId,
|
|
213
|
+
clientType: lmd.clientType,
|
|
214
|
+
clientName: lmd.clientName,
|
|
215
|
+
transporterId: marketplaceTransporter.pickupTransporter.transporterId,
|
|
216
|
+
pickupName: warehouseContactPoint.name,
|
|
217
|
+
pickupAddress1: warehouseContactPoint.address,
|
|
218
|
+
pickupAddress2: warehouseContactPoint.address2,
|
|
219
|
+
pickupPostcode: warehouseContactPoint.postCode,
|
|
220
|
+
pickupState: warehouseContactPoint.state,
|
|
221
|
+
pickupCity: warehouseContactPoint.city,
|
|
222
|
+
pickupPhone: warehouseContactPoint.phone,
|
|
223
|
+
pickupEmail: warehouseContactPoint.email,
|
|
224
|
+
name: marketplaceOrderShipping?.attentionTo ? marketplaceOrderShipping.attentionTo.trim() : '',
|
|
225
|
+
address1: marketplaceOrderShipping?.address1 ? marketplaceOrderShipping?.address1.trim() : '-',
|
|
226
|
+
address2: marketplaceOrderShipping?.address2 ? marketplaceOrderShipping?.address2.trim() : '-',
|
|
227
|
+
postCode: marketplaceOrderShipping?.postCode ? marketplaceOrderShipping?.postCode.trim() : '',
|
|
228
|
+
city: marketplaceOrderShipping?.city ? marketplaceOrderShipping?.city.trim() : '',
|
|
229
|
+
state: marketplaceOrderShipping?.state ? marketplaceOrderShipping?.state.trim() : '',
|
|
230
|
+
phone: marketplaceOrderShipping.phone1 || '',
|
|
231
|
+
email: marketplaceOrderShipping.email || '',
|
|
232
|
+
attentionTo: marketplaceOrderShipping.attentionTo,
|
|
233
|
+
quantity: marketplaceOrderItems.length
|
|
200
234
|
})
|
|
201
235
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
clientType: lmd.clientType,
|
|
206
|
-
clientName: lmd.clientName,
|
|
207
|
-
transporterId: marketplaceTransporter.pickupTransporter.transporterId,
|
|
208
|
-
pickupName: warehouseContactPoint.name,
|
|
209
|
-
pickupAddress1: warehouseContactPoint.address,
|
|
210
|
-
pickupAddress2: warehouseContactPoint.address2,
|
|
211
|
-
pickupPostcode: warehouseContactPoint.postCode,
|
|
212
|
-
pickupState: warehouseContactPoint.state,
|
|
213
|
-
pickupCity: warehouseContactPoint.city,
|
|
214
|
-
pickupPhone: warehouseContactPoint.phone,
|
|
215
|
-
pickupEmail: warehouseContactPoint.email,
|
|
216
|
-
name: marketplaceOrderShipping?.attentionTo ? marketplaceOrderShipping.attentionTo.trim() : '',
|
|
217
|
-
address1: marketplaceOrderShipping?.address1 ? marketplaceOrderShipping?.address1.trim() : '-',
|
|
218
|
-
address2: marketplaceOrderShipping?.address2 ? marketplaceOrderShipping?.address2.trim() : '-',
|
|
219
|
-
postCode: marketplaceOrderShipping?.postCode ? marketplaceOrderShipping?.postCode.trim() : '',
|
|
220
|
-
city: marketplaceOrderShipping?.city ? marketplaceOrderShipping?.city.trim() : '',
|
|
221
|
-
state: marketplaceOrderShipping?.state ? marketplaceOrderShipping?.state.trim() : '',
|
|
222
|
-
phone: marketplaceOrderShipping.phone1 || '',
|
|
223
|
-
email: marketplaceOrderShipping.email || '',
|
|
224
|
-
attentionTo: marketplaceOrderShipping.attentionTo,
|
|
225
|
-
quantity: marketplaceOrderItems.length
|
|
226
|
-
})
|
|
227
|
-
|
|
228
|
-
const delay = (ms: number) => {
|
|
229
|
-
return new Promise(resolve => setTimeout(resolve, ms))
|
|
230
|
-
}
|
|
236
|
+
const delay = (ms: number) => {
|
|
237
|
+
return new Promise(resolve => setTimeout(resolve, ms))
|
|
238
|
+
}
|
|
231
239
|
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
240
|
+
if (resp.Status === 'SUCCESS') {
|
|
241
|
+
//Success
|
|
242
|
+
let awbObtained = false
|
|
243
|
+
let retry = 0
|
|
244
|
+
while (!awbObtained) {
|
|
245
|
+
const marketplaceOrder2: MarketplaceOrder = await tx.getRepository(MarketplaceOrder).findOne({
|
|
246
|
+
where: { releaseOrderId: releaseGood.id },
|
|
247
|
+
relations: [
|
|
248
|
+
'marketplaceStore',
|
|
249
|
+
'marketplaceOrderItems',
|
|
250
|
+
'marketplaceOrderItems.marketplaceOrderShippingItems',
|
|
251
|
+
'marketplaceOrderItems.marketplaceOrderShippingItems.marketplaceOrderShipping'
|
|
252
|
+
]
|
|
253
|
+
})
|
|
254
|
+
const orderShipping =
|
|
255
|
+
marketplaceOrder2.marketplaceOrderItems[0].marketplaceOrderShippingItems[0].marketplaceOrderShipping
|
|
256
|
+
if (orderShipping?.airwayBill) {
|
|
257
|
+
awbObtained = true
|
|
258
|
+
}
|
|
259
|
+
await delay(5000)
|
|
260
|
+
//Timeout after 15sec
|
|
261
|
+
if (++retry > 3) {
|
|
262
|
+
break
|
|
263
|
+
}
|
|
255
264
|
}
|
|
265
|
+
} else {
|
|
266
|
+
if (resp?.AWBurl && resp?.TrackingNo)
|
|
267
|
+
await tx
|
|
268
|
+
.getRepository(MarketplaceOrderShipping)
|
|
269
|
+
.update(
|
|
270
|
+
{ id: marketplaceOrderShipping.id },
|
|
271
|
+
{ airwayBill: resp.AWBurl, trackingNo: resp.TrackingNo }
|
|
272
|
+
)
|
|
273
|
+
else throw resp
|
|
256
274
|
}
|
|
257
|
-
} else {
|
|
258
|
-
if (resp?.AWBurl && resp?.TrackingNo)
|
|
259
|
-
await tx
|
|
260
|
-
.getRepository(MarketplaceOrderShipping)
|
|
261
|
-
.update({ id: marketplaceOrderShipping.id }, { airwayBill: resp.AWBurl, trackingNo: resp.TrackingNo })
|
|
262
|
-
else throw resp
|
|
263
275
|
}
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
releaseGood = await ecommerceCtrl.createOrderPackage(tx, marketplaceOrder, companyDomain, marketplaceStore, releaseGood)
|
|
267
|
-
}
|
|
268
|
-
break
|
|
269
|
-
|
|
270
|
-
default:
|
|
271
|
-
let orderPackage: OrderPackage = {
|
|
272
|
-
name: OrderNoGenerator.orderPackage(),
|
|
273
|
-
packageId: null,
|
|
274
|
-
trackingNo: null,
|
|
275
|
-
transporter: null,
|
|
276
|
-
airwayBill: null,
|
|
277
|
-
status: ORDER_STATUS.PROCESSING,
|
|
278
|
-
releaseGood,
|
|
279
|
-
domain: releaseGood.domain,
|
|
280
|
-
bizplace: releaseGood.bizplace,
|
|
281
|
-
creator: releaseGood.creator,
|
|
282
|
-
updater: releaseGood.updater
|
|
283
|
-
}
|
|
284
276
|
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
277
|
+
await ecommerceCtrl.createOrderPackage(tx, marketplaceOrder, companyDomain, marketplaceStore, releaseGood)
|
|
278
|
+
}
|
|
279
|
+
break
|
|
280
|
+
|
|
281
|
+
default:
|
|
282
|
+
let orderPackage: OrderPackage = {
|
|
283
|
+
name: OrderNoGenerator.orderPackage(),
|
|
284
|
+
packageId: null,
|
|
285
|
+
trackingNo: null,
|
|
286
|
+
transporter: null,
|
|
287
|
+
airwayBill: null,
|
|
290
288
|
status: ORDER_STATUS.PROCESSING,
|
|
291
|
-
|
|
292
|
-
orderPackage: savedOrderPackage,
|
|
289
|
+
releaseGood,
|
|
293
290
|
domain: releaseGood.domain,
|
|
294
291
|
bizplace: releaseGood.bizplace,
|
|
295
292
|
creator: releaseGood.creator,
|
|
296
293
|
updater: releaseGood.updater
|
|
297
294
|
}
|
|
298
|
-
})
|
|
299
295
|
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
296
|
+
let savedOrderPackage: OrderPackage = await tx.getRepository(OrderPackage).save(orderPackage)
|
|
297
|
+
const orderPackageItems: OrderPackageItem[] = releaseGood.orderProducts.map(op => {
|
|
298
|
+
return {
|
|
299
|
+
name: OrderNoGenerator.orderPackageItem(),
|
|
300
|
+
orderProduct: op,
|
|
301
|
+
status: ORDER_STATUS.PROCESSING,
|
|
302
|
+
releaseQty: op.releaseQty,
|
|
303
|
+
orderPackage: savedOrderPackage,
|
|
304
|
+
domain: releaseGood.domain,
|
|
305
|
+
bizplace: releaseGood.bizplace,
|
|
306
|
+
creator: releaseGood.creator,
|
|
307
|
+
updater: releaseGood.updater
|
|
308
|
+
}
|
|
309
|
+
})
|
|
310
|
+
await tx.getRepository(OrderPackageItem).save(orderPackageItems)
|
|
311
|
+
orderPackage.orderPackageItems = orderPackageItems
|
|
312
|
+
releaseGood.orderPackages = [orderPackage]
|
|
313
|
+
break
|
|
314
|
+
}
|
|
305
315
|
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
316
|
+
const account: Account = await tx
|
|
317
|
+
.getRepository(Account)
|
|
318
|
+
.findOne({ where: { domain: releaseGood.bizplace.domain, status: 'active' }, relations: ['domain'] })
|
|
319
|
+
|
|
320
|
+
// Xilnex Create Sales Order and Post Sales Order to Sales Invoice
|
|
321
|
+
const createSalesOrder = async (account, tx) => {
|
|
322
|
+
if (account) {
|
|
323
|
+
if (account.platform == 'xilnex') {
|
|
324
|
+
let integrationInfo: any = {
|
|
325
|
+
xilnex: {
|
|
326
|
+
accountId: account.accountId,
|
|
327
|
+
startTime: new Date()
|
|
328
|
+
}
|
|
318
329
|
}
|
|
319
|
-
}
|
|
320
330
|
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
331
|
+
try {
|
|
332
|
+
const salesOrder: any = await AccountingAPI.createSalesOrder(account, {
|
|
333
|
+
releaseGood,
|
|
334
|
+
orderProducts: releaseGood.orderProducts
|
|
335
|
+
})
|
|
326
336
|
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
337
|
+
if (salesOrder) {
|
|
338
|
+
integrationInfo.xilnex = {
|
|
339
|
+
...integrationInfo.xilnex,
|
|
340
|
+
salesOrderId: salesOrder.id,
|
|
341
|
+
endTime: new Date()
|
|
342
|
+
}
|
|
333
343
|
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
344
|
+
try {
|
|
345
|
+
const salesInvoice: any = await AccountingAPI.postSalesOrderToSalesInvoice(account, {
|
|
346
|
+
orderId: salesOrder?.id || null
|
|
347
|
+
})
|
|
348
|
+
|
|
349
|
+
if (salesInvoice) {
|
|
350
|
+
integrationInfo.xilnex = {
|
|
351
|
+
...integrationInfo.xilnex,
|
|
352
|
+
salesInvoiceId: salesInvoice.salesId,
|
|
353
|
+
endTime: new Date()
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
const salesOrderItems: any = salesInvoice.sale.items
|
|
357
|
+
await Promise.all(
|
|
358
|
+
releaseGood.orderProducts.map(async op => {
|
|
359
|
+
const matchedProduct: any = salesOrderItems.find(soi => soi.itemId == op.productDetail.refCode)
|
|
360
|
+
if (matchedProduct) {
|
|
361
|
+
await tx.getRepository(OrderProduct).update({ id: op.id }, { refItemId: matchedProduct.id })
|
|
362
|
+
}
|
|
363
|
+
})
|
|
364
|
+
)
|
|
338
365
|
|
|
339
|
-
|
|
366
|
+
await tx
|
|
367
|
+
.getRepository(ReleaseGood)
|
|
368
|
+
.update(
|
|
369
|
+
{ id: releaseGood.id },
|
|
370
|
+
{ collectionOrderNo: salesInvoice.salesId, integrationInfo, updater: releaseGood.updater }
|
|
371
|
+
)
|
|
372
|
+
}
|
|
373
|
+
} catch (error) {
|
|
340
374
|
integrationInfo.xilnex = {
|
|
341
375
|
...integrationInfo.xilnex,
|
|
342
|
-
salesInvoiceId: salesInvoice.salesId,
|
|
343
376
|
endTime: new Date()
|
|
344
377
|
}
|
|
345
378
|
|
|
346
|
-
const salesOrderItems: any = salesInvoice.sale.items
|
|
347
|
-
await Promise.all(
|
|
348
|
-
releaseGood.orderProducts.map(async op => {
|
|
349
|
-
const matchedProduct: any = salesOrderItems.find(soi => soi.itemId == op.productDetail.refCode)
|
|
350
|
-
if (matchedProduct) {
|
|
351
|
-
await tx.getRepository(OrderProduct).update({ id: op.id }, { refItemId: matchedProduct.id })
|
|
352
|
-
}
|
|
353
|
-
})
|
|
354
|
-
)
|
|
355
|
-
|
|
356
379
|
await tx
|
|
357
380
|
.getRepository(ReleaseGood)
|
|
358
381
|
.update(
|
|
359
382
|
{ id: releaseGood.id },
|
|
360
|
-
{
|
|
383
|
+
{ integrationInfo, integrationFail: true, updater: releaseGood.updater }
|
|
361
384
|
)
|
|
385
|
+
logger.error(`complete-picking[createSalesInvoice][${releaseGood.refNo}]: ${error}`)
|
|
362
386
|
}
|
|
363
|
-
} catch (error) {
|
|
364
|
-
integrationInfo.xilnex = {
|
|
365
|
-
...integrationInfo.xilnex,
|
|
366
|
-
endTime: new Date()
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
await tx
|
|
370
|
-
.getRepository(ReleaseGood)
|
|
371
|
-
.update(
|
|
372
|
-
{ id: releaseGood.id },
|
|
373
|
-
{ integrationInfo, integrationFail: true, updater: releaseGood.updater }
|
|
374
|
-
)
|
|
375
|
-
logger.error(`complete-picking[createSalesInvoice][${releaseGood.refNo}]: ${error}`)
|
|
376
387
|
}
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
}
|
|
388
|
+
} catch (error) {
|
|
389
|
+
integrationInfo.xilnex = {
|
|
390
|
+
...integrationInfo.xilnex,
|
|
391
|
+
endTime: new Date()
|
|
392
|
+
}
|
|
383
393
|
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
394
|
+
await tx
|
|
395
|
+
.getRepository(ReleaseGood)
|
|
396
|
+
.update(
|
|
397
|
+
{ id: releaseGood.id },
|
|
398
|
+
{ integrationInfo, integrationFail: true, updater: releaseGood.updater }
|
|
399
|
+
)
|
|
400
|
+
logger.error(`complete-picking[createSalesOrder][${releaseGood.refNo}]: ${error}`)
|
|
401
|
+
}
|
|
388
402
|
}
|
|
389
403
|
}
|
|
390
404
|
}
|
|
391
|
-
}
|
|
392
405
|
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
406
|
+
if (releaseGood.type == 'b2c') {
|
|
407
|
+
await createSalesOrder(account, tx)
|
|
408
|
+
}
|
|
396
409
|
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
410
|
+
if (releaseGood.packingOption) {
|
|
411
|
+
const packingWSCtrl: PackingWorksheetController = new PackingWorksheetController(tx, domain, user)
|
|
412
|
+
await packingWSCtrl.generatePackingWorksheet(releaseGoodNo)
|
|
413
|
+
} else {
|
|
414
|
+
// Find Existing Loading Worksheet if any
|
|
415
|
+
let existLoadingWorksheet: Worksheet = await tx.getRepository(Worksheet).findOne({
|
|
416
|
+
where: {
|
|
417
|
+
releaseGood,
|
|
418
|
+
type: WORKSHEET_TYPE.LOADING,
|
|
419
|
+
status: WORKSHEET_STATUS.DEACTIVATED
|
|
420
|
+
}
|
|
421
|
+
})
|
|
422
|
+
|
|
423
|
+
if (!existLoadingWorksheet && !releaseGood.courierOption && !releaseGood.packingOption) {
|
|
424
|
+
if (pickedTargetInventories.length > 0) {
|
|
425
|
+
const loadingWSCtrl: LoadingWorksheetController = new LoadingWorksheetController(tx, domain, user)
|
|
426
|
+
let loadingWorksheet: Worksheet = await loadingWSCtrl.generateLoadingWorksheet(
|
|
427
|
+
releaseGoodNo,
|
|
428
|
+
pickedTargetInventories
|
|
429
|
+
)
|
|
409
430
|
|
|
410
|
-
|
|
411
|
-
|
|
431
|
+
if (!loadingWorksheet.worksheetDetails?.length) {
|
|
432
|
+
loadingWorksheet = await pickingWSCtrl.findWorksheetById(loadingWorksheet.id)
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
const loadingWorksheetDetails: WorksheetDetail[] = loadingWorksheet.worksheetDetails
|
|
436
|
+
await loadingWSCtrl.activateLoading(loadingWorksheet.name, loadingWorksheetDetails)
|
|
437
|
+
}
|
|
438
|
+
} else {
|
|
412
439
|
const loadingWSCtrl: LoadingWorksheetController = new LoadingWorksheetController(tx, domain, user)
|
|
413
|
-
let loadingWorksheet: Worksheet = await loadingWSCtrl.
|
|
440
|
+
let loadingWorksheet: Worksheet = await loadingWSCtrl.updateLoadingWorksheet(
|
|
414
441
|
releaseGoodNo,
|
|
415
|
-
pickedTargetInventories
|
|
442
|
+
pickedTargetInventories,
|
|
443
|
+
existLoadingWorksheet
|
|
416
444
|
)
|
|
417
445
|
|
|
418
446
|
if (!loadingWorksheet.worksheetDetails?.length) {
|
|
@@ -422,48 +450,37 @@ export async function completePicking(
|
|
|
422
450
|
const loadingWorksheetDetails: WorksheetDetail[] = loadingWorksheet.worksheetDetails
|
|
423
451
|
await loadingWSCtrl.activateLoading(loadingWorksheet.name, loadingWorksheetDetails)
|
|
424
452
|
}
|
|
425
|
-
} else {
|
|
426
|
-
const loadingWSCtrl: LoadingWorksheetController = new LoadingWorksheetController(tx, domain, user)
|
|
427
|
-
let loadingWorksheet: Worksheet = await loadingWSCtrl.updateLoadingWorksheet(
|
|
428
|
-
releaseGoodNo,
|
|
429
|
-
pickedTargetInventories,
|
|
430
|
-
existLoadingWorksheet
|
|
431
|
-
)
|
|
432
|
-
|
|
433
|
-
if (!loadingWorksheet.worksheetDetails?.length) {
|
|
434
|
-
loadingWorksheet = await pickingWSCtrl.findWorksheetById(loadingWorksheet.id)
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
const loadingWorksheetDetails: WorksheetDetail[] = loadingWorksheet.worksheetDetails
|
|
438
|
-
await loadingWSCtrl.activateLoading(loadingWorksheet.name, loadingWorksheetDetails)
|
|
439
453
|
}
|
|
440
|
-
}
|
|
441
454
|
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
455
|
+
// trigger LMD API to create parcel
|
|
456
|
+
if (
|
|
457
|
+
releaseGood?.orderPackages?.length &&
|
|
458
|
+
releaseGood.lmdOption &&
|
|
459
|
+
releaseGood.lastMileDelivery &&
|
|
460
|
+
releaseGood?.orderPackages?.some(op => op.parcelId == null)
|
|
461
|
+
) {
|
|
462
|
+
await createLmdParcel([releaseGood], tx)
|
|
463
|
+
}
|
|
464
|
+
//
|
|
465
|
+
} else {
|
|
466
|
+
//update inventories obsolete to true
|
|
467
|
+
await tx.getRepository(Inventory).update({ id: In(foundObsoleteInventories) }, { obsolete: true })
|
|
451
468
|
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
469
|
+
foundObsoleteInventories = foundObsoleteInventories
|
|
470
|
+
.map(inv => {
|
|
471
|
+
return "'" + inv.trim() + "'"
|
|
472
|
+
})
|
|
473
|
+
.join(',')
|
|
457
474
|
|
|
458
|
-
|
|
459
|
-
|
|
475
|
+
//update any orders that is assigned with obsolete inventories
|
|
476
|
+
await tx.getRepository(ReleaseGood).query(`
|
|
460
477
|
update release_goods rg set status = 'OBSOLETE'
|
|
461
478
|
from order_inventories oi
|
|
462
479
|
where oi.release_good_id = rg.id
|
|
463
480
|
and oi.inventory_id in (${foundObsoleteInventories})
|
|
464
481
|
and rg.status in ('PICKING', 'PENDING_WORKSHEET', 'READY_TO_PICK')`)
|
|
465
482
|
|
|
466
|
-
|
|
483
|
+
await tx.getRepository(Worksheet).query(`
|
|
467
484
|
update worksheets w set status = 'DEACTIVATED', updater_id = '${user.id}', assignee_id = null
|
|
468
485
|
from worksheet_details wd
|
|
469
486
|
inner join order_inventories oi on oi.id = wd.target_inventory_id
|
|
@@ -471,6 +488,21 @@ export async function completePicking(
|
|
|
471
488
|
and oi.inventory_id in (${foundObsoleteInventories})
|
|
472
489
|
`)
|
|
473
490
|
|
|
474
|
-
|
|
491
|
+
return true
|
|
492
|
+
}
|
|
493
|
+
} else {
|
|
494
|
+
let replenishment: Replenishment = await tx.getRepository(Replenishment).findOne({
|
|
495
|
+
where: { domain, name: releaseGoodNo }
|
|
496
|
+
})
|
|
497
|
+
|
|
498
|
+
const worksheet: Worksheet = await pickingWSCtrl.findWorksheetByRefOrder(
|
|
499
|
+
replenishment,
|
|
500
|
+
WORKSHEET_TYPE.PICKING_REPLENISHMENT,
|
|
501
|
+
['worksheetDetails', 'worksheetDetails.targetInventory', 'worksheetDetails.targetInventory.inventory']
|
|
502
|
+
)
|
|
503
|
+
|
|
504
|
+
await replenishmentPickingWSCtrl.completeReplenishmentPicking(replenishment, worksheet)
|
|
505
|
+
|
|
506
|
+
await replenishmentPickingWSCtrl.generatePutawayReplenishmentWorksheet(releaseGoodNo)
|
|
475
507
|
}
|
|
476
508
|
}
|