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