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