| Current Path : /proc/thread-self/root/home/deltalab/PMS/partner-manager-backend/services/ |
| Current File : //proc/thread-self/root/home/deltalab/PMS/partner-manager-backend/services/utility.js |
/* eslint-disable max-len */
/* eslint-disable no-param-reassign */
require('dotenv').config();
const ACTIVITY_REGISTER = 'register';
const ACTIVITY_ERP_INSERT = 'erpInsert';
const ACTIVITY_SELLER_EMAIL = 'sellerEmail';
const ACTIVITY_WAREHOUSE = 'warehouse';
const ACTIVITY_BOOKING = 'booking';
const ACTIVITY_TRANSFER = 'transfer';
const ACTIVITY_PICKING_LIST = 'pickingList';
const ACTIVITY_SHIPMENT_GENERAL = 'generalShipment';
const ACTIVITY_SHIPMENT_SHIPPYPRO = 'shipmentShippyPro';
const ACTIVITY_SHIPMENT_SURF = 'shipmentSurf';
const ACTIVITY_MAIL = 'mail';
const ACTIVITY_PICKING = 'picking';
const ACTIVITY_PICKUP = 'pickup';
const ACTIVITY_CLOSE = 'close';
const ACTIVITY_CANCEL = 'cancel';
const ACTION_MASSIVE_EMAIL = 'sellerEmail';
const ACTION_TRADITIONAL = 'traditional';
const ACTION_SURF = 'surf';
const ORDER_LIST_SEPARATOR = ',';
const activityPrerequisites = {
[ACTIVITY_REGISTER]: { trueNeeded: [], falseNeeded: [] },
[ACTIVITY_ERP_INSERT]: { trueNeeded: [ACTIVITY_REGISTER], falseNeeded: [ACTIVITY_CANCEL, ACTIVITY_CLOSE] },
[ACTIVITY_SELLER_EMAIL]: { trueNeeded: [ACTIVITY_REGISTER], falseNeeded: [ACTIVITY_CANCEL, ACTIVITY_CLOSE] },
[ACTIVITY_WAREHOUSE]: { trueNeeded: [ACTIVITY_REGISTER], falseNeeded: [ACTIVITY_CANCEL, ACTIVITY_CLOSE] },
[ACTIVITY_BOOKING]: { trueNeeded: [ACTIVITY_REGISTER, ACTIVITY_WAREHOUSE], falseNeeded: [ACTIVITY_CANCEL] },
[ACTIVITY_TRANSFER]: { trueNeeded: [ACTIVITY_REGISTER, ACTIVITY_WAREHOUSE, ACTIVITY_BOOKING], falseNeeded: [ACTIVITY_CANCEL, ACTIVITY_CLOSE] },
[ACTIVITY_PICKING_LIST]: { trueNeeded: [ACTIVITY_REGISTER, ACTIVITY_WAREHOUSE, ACTIVITY_BOOKING], falseNeeded: [ACTIVITY_CANCEL, ACTIVITY_CLOSE] },
[ACTIVITY_SHIPMENT_SHIPPYPRO]: { trueNeeded: [ACTIVITY_REGISTER, ACTIVITY_WAREHOUSE, ACTIVITY_BOOKING], falseNeeded: [ACTIVITY_CANCEL, ACTIVITY_CLOSE] },
[ACTIVITY_SHIPMENT_SURF]: { trueNeeded: [ACTIVITY_REGISTER, ACTIVITY_WAREHOUSE, ACTIVITY_BOOKING], falseNeeded: [ACTIVITY_CANCEL, ACTIVITY_CLOSE] },
[ACTIVITY_MAIL]: { trueNeeded: [ACTIVITY_REGISTER, ACTIVITY_WAREHOUSE, ACTIVITY_BOOKING], falseNeeded: [ACTIVITY_CANCEL, ACTIVITY_CLOSE] },
[ACTIVITY_PICKING]: { trueNeeded: [ACTIVITY_REGISTER, ACTIVITY_WAREHOUSE, ACTIVITY_BOOKING], falseNeeded: [ACTIVITY_CANCEL, ACTIVITY_CLOSE] },
[ACTIVITY_PICKUP]: { trueNeeded: [ACTIVITY_REGISTER, ACTIVITY_WAREHOUSE, ACTIVITY_BOOKING], falseNeeded: [ACTIVITY_CANCEL, ACTIVITY_CLOSE] },
[ACTIVITY_CLOSE]: { trueNeeded: [ACTIVITY_SHIPMENT_GENERAL, ACTIVITY_PICKING, ACTIVITY_BOOKING], falseNeeded: [ACTIVITY_CANCEL] },
[ACTIVITY_CANCEL]: { trueNeeded: [ACTIVITY_REGISTER], falseNeeded: [ACTIVITY_CANCEL] },
};
function checkProductOwner(product, decoded) {
if (decoded.user.userType === 'ADMIN') {
return true;
}
return product.partnerId.toString() === decoded.partnerId && decoded.partnerId === decoded.user.partnerId.toString();
}
function isPartnerEqualToParams(req) {
if (req.decoded.user.userType === 'ADMIN') {
return true;
}
return req.body.partnerId.toString() === req.params.partnerId && req.params.partnerId === req.decoded.user.partnerId.toString();
}
function isAdmin(req) {
if (req.decoded.user.userType === 'ADMIN') {
return true;
}
return false;
}
function isActivityDone(order, activityName) {
console.log(`[ACTIVITY-CHECK] checking ${activityName}`);
if (order.activities && order.activities[activityName]) {
return order.activities[activityName].done;
}
console.log('no activity with that name yet or no activities at all, return false (ok for execution)');
return false;
}
function checkActivity(order, activityName) {
let allowed = true;
if (!order.activities) {
console.log('Order without activities, execute everything as normal');
return true;
}
if (isActivityDone(order, activityName)) {
console.log(`[ERROR] step ${activityName} has already been done`);
return false;
}
for (let i = 0; i < activityPrerequisites[activityName].falseNeeded.length; i++) {
console.log(`[ACTIVITY] check if activity ${activityName} does not have any blocking condition`);
if (activityName === ACTIVITY_SHIPMENT_GENERAL) {
allowed = allowed && (!isActivityDone(order, ACTIVITY_SHIPMENT_SHIPPYPRO) && !isActivityDone(order, ACTIVITY_SHIPMENT_SURF));
} else {
allowed = allowed && !isActivityDone(order, activityPrerequisites[activityName].falseNeeded[i]);
}
}
for (let i = 0; i < activityPrerequisites[activityName].trueNeeded.length; i++) {
console.log(`[ACTIVITY] check if activity ${activityName} fulfills all requirements`);
if (activityName === ACTIVITY_SHIPMENT_GENERAL) {
allowed = allowed && (isActivityDone(order, ACTIVITY_SHIPMENT_SHIPPYPRO) || isActivityDone(order, ACTIVITY_SHIPMENT_SURF));
} else {
allowed = allowed && isActivityDone(order, activityPrerequisites[activityName].trueNeeded[i]);
}
}
return allowed;
}
async function updateActivity(order, activityName, done) {
if (order.activities && !order.activities[activityName]) {
order.activities[activityName] = { done, date: new Date() };
await order.save();
}
}
// EXPORTS =========================================
module.exports = {
checkProductOwner,
isPartnerEqualToParams,
isAdmin,
checkActivity,
isActivityDone,
updateActivity,
ACTIVITY_REGISTER,
ACTIVITY_ERP_INSERT,
ACTIVITY_SELLER_EMAIL,
ACTIVITY_WAREHOUSE,
ACTIVITY_BOOKING,
ACTIVITY_TRANSFER,
ACTIVITY_PICKING_LIST,
ACTIVITY_SHIPMENT_SHIPPYPRO,
ACTIVITY_SHIPMENT_SURF,
ACTIVITY_MAIL,
ACTIVITY_PICKING,
ACTIVITY_PICKUP,
ACTIVITY_CLOSE,
ACTIVITY_CANCEL,
ACTION_MASSIVE_EMAIL,
ACTION_SURF,
ACTION_TRADITIONAL,
ORDER_LIST_SEPARATOR,
};