Your IP : 216.73.216.220


Current Path : /home/deltalab/PMS/partner-manager-backend/services/
Upload File :
Current File : //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,
};