Your IP : 216.73.216.220


Current Path : /home/deltalab/PMS/partner-manager-backend/rest/queries/
Upload File :
Current File : //home/deltalab/PMS/partner-manager-backend/rest/queries/warehouse.js

/* eslint-disable no-await-in-loop */
const mongoose = require('mongoose');
const { channelModel } = require('../../models/mongoose/channel');
const { partnerModel } = require('../../models/mongoose/partner');
const { productModel } = require('../../models/mongoose/product');
const { warehouseModel } = require('../../models/mongoose/warehouse');
const { warehouseJournalModel } = require('../../models/mongoose/warehouse-journal');

/**
 * Return a product given its ID
 * @param {string} channelId
 * @returns product
 */
async function readOne(warehouseId) {
  const warehouse = await warehouseModel.findById({ _id: warehouseId });
  return warehouse;
}

async function readPartnerWarehousesByProduct(productId, partnerId, includeShared) {
  const product = await productModel.findById(productId);
  const channel = await channelModel.findById(product.channelId);

  const partnerObjectId = mongoose.Types.ObjectId(partnerId);
  const requestBody = {
    partnerId: partnerObjectId,
  };
  const warehouses = await warehouseModel.find(requestBody);

  const secondRequestBody = {
    'assignments.partnerId': partnerObjectId,
    partnerId: { $nin: partnerObjectId },
  };
  const sharedWarehouses = await warehouseModel.find(secondRequestBody);

  if (includeShared === 'true') {
    return warehouses.concat(sharedWarehouses);
  }
  return warehouses;
}

async function readPartnerWarehousesByChannel(channelId, partnerId, shared) {
  const channel = await channelModel.findById(channelId);

  const requestBody = {
    channels: { $in: channel._id },
    partnerId,
  };
  if (shared) {
    requestBody.isShared = shared;
  }
  // if (product.refrigerated) {
  //   requestBody.refrigerated = true;
  // }

  const warehouses = await warehouseModel.find(requestBody);
  return warehouses;
}

async function readWarehousesByChannel(channelId) {
  const channel = await channelModel.findById(channelId);

  const requestBody = {
    'channelAssignments.channelId': channel._id,
  };
  // if (product.refrigerated) {
  //   requestBody.refrigerated = true;
  // }

  const warehouses = await warehouseModel.find(requestBody);
  return warehouses;
}

async function readAllPartnerWarehouses(partnerId) {
  const requestBody = {
    partnerId,
  };

  const warehouses = await warehouseModel.find(requestBody);
  const secondRequestBody = {
    'assignments.partnerId': partnerId,
  };

  const assignedWarehouses = await warehouseModel.find(secondRequestBody);
  return warehouses.concat(assignedWarehouses);
}

async function createOne(warehouse) {
  const addedWarehouse = await warehouseModel.create(warehouse);
  return addedWarehouse;
}

async function updateOne(warehouseId, warehouse) {
  const updatedProduct = await warehouseModel.findByIdAndUpdate(warehouseId, warehouse, { returnDocument: 'after' });
  return updatedProduct;
}

async function deleteOne(warehouseId) {
  await warehouseModel.deleteOne({ _id: warehouseId });
}

async function readJournal(partnerId = undefined, warehouseId = undefined, confirmed = undefined) {
  const requestBody = {};
  if (partnerId) {
    requestBody.partnerId = partnerId;
  }

  if (warehouseId) {
    requestBody.warehouseId = warehouseId;
  }

  if (confirmed) {
    requestBody.confirmed = confirmed;
  }

  const warehouseJournalList = await warehouseJournalModel.find(requestBody);

  // add product to warehouseJournal
  const list = [];
  for (let i = 0; i < warehouseJournalList.length; i++) {
    const entry = warehouseJournalList[i];
    const editableEntry = { ...entry._doc };
    editableEntry.product = null;
    editableEntry.warehouse = null;
    editableEntry.partner = null;

    const product = await productModel.findById(editableEntry.productId);
    if (product) {
      editableEntry.product = product;
    }

    const warehouse = await warehouseModel.findById(editableEntry.warehouseId);
    if (warehouse) {
      editableEntry.warehouse = warehouse;
    }

    const warehouseOrigin = await warehouseModel.findById(editableEntry.warehouseOriginId);
    if (warehouseOrigin) {
      editableEntry.warehouseOrigin = warehouseOrigin;
    }

    const partner = await partnerModel.findById(editableEntry.partnerId);
    if (partner) {
      editableEntry.partner = partner;
    }
    list.push(editableEntry);
  }

  return list;
}

async function readPendingAmounts(productId, partnerId) {
  const requestBody = {
    partnerId,
    productId,
    confirmed: false,
  };

  const warehouseJournalList = await warehouseJournalModel.find(requestBody);

  //add product to warehouseJournal
  const list = {};
  for (let i = 0; i < warehouseJournalList.length; i++) {
    const entry = warehouseJournalList[i];
    if (!list[entry.warehouseId]) {
      list[entry.warehouseId] = 0;
    }
    list[entry.warehouseId] += entry.variation;
  }
  return list;
}

async function readPendingTransactions() {
  const requestBody = {
    confirmed: false,
  };

  const warehouseJournalList = await warehouseJournalModel.find(requestBody);

  //add product to warehouseJournal
  const list = {};
  for (let i = 0; i < warehouseJournalList.length; i++) {
    const entry = warehouseJournalList[i];
    if (!list[entry.warehouseId]) {
      list[entry.warehouseId] = 0;
    }
    list[entry.warehouseId]++;
  }
  return list;
}

module.exports = {
  readPartnerWarehousesByProduct,
  readPartnerWarehousesByChannel,
  readWarehousesByChannel,
  readAllPartnerWarehouses,
  readPendingAmounts,
  readPendingTransactions,
  readJournal,
  readOne,
  createOne,
  updateOne,
  deleteOne,
};