| Current Path : /home/deltalab/PMS/partner-manager-backend/rest/routes/ |
| Current File : //home/deltalab/PMS/partner-manager-backend/rest/routes/warehouses.js |
/* eslint-disable max-len */
/* eslint-disable no-await-in-loop */
const express = require('express');
const { warehouseJournalModel } = require('../../models/mongoose/warehouse-journal');
const { productModel } = require('../../models/mongoose/product');
const ims = require('../../services/ims');
const { warehouseQuery } = require('../queries');
const router = express.Router();
router.get('/product/:productId/partner/:partnerId/shared/:shared', async (req, res) => {
try {
const warehouseList = await warehouseQuery.readPartnerWarehousesByProduct(req.params.productId, req.params.partnerId, req.params.shared);
return res.status(200).json({ success: true, data: warehouseList });
} catch (error) {
console.log(error);
return res.status(400).send({ success: false, message: 'Error finding warehouses by product', error: error.message });
}
});
router.get('/channel/:channelId/partner/:partnerId/shared/:shared', async (req, res) => {
try {
const warehouseList = await warehouseQuery.readPartnerWarehousesByChannel(req.params.channelId, req.params.partnerId, req.params.shared);
return res.status(200).json({ success: true, data: warehouseList });
} catch (error) {
console.log(error);
return res.status(400).send({ success: false, message: 'Error finding warehouses by channel', error: error.message });
}
});
router.get('/channel/:channelId', async (req, res) => {
try {
const warehouseList = await warehouseQuery.readWarehousesByChannel(req.params.channelId);
return res.status(200).json({ success: true, data: warehouseList });
} catch (error) {
console.log(error);
return res.status(400).send({ success: false, message: 'Error finding warehouses by just channel', error: error.message });
}
});
router.get('/partner/:partnerId', async (req, res) => {
try {
const warehouseList = await warehouseQuery.readAllPartnerWarehouses(req.params.partnerId);
return res.status(200).json({ success: true, data: warehouseList });
} catch (error) {
console.log(error);
return res.status(400).send({ success: false, message: 'Error finding all warehouses', error: error.message });
}
});
router.get('/journal/partner/:partnerId', async (req, res) => {
try {
const journalList = await warehouseQuery.readJournal(req.params.partnerId);
return res.status(200).json({ success: true, data: journalList });
} catch (error) {
console.log(error);
return res.status(400).send({ success: false, message: 'Error finding journal entries for the specified partner', error: error.message });
}
});
//TODO: solo se admin
router.get('/journal/all', async (req, res) => {
try {
const journalList = await warehouseQuery.readJournal();
return res.status(200).json({ success: true, data: journalList });
} catch (error) {
console.log(error);
return res.status(400).send({ success: false, message: 'Error finding journal entries', error: error.message });
}
});
router.get('/journal/warehouse/:warehouseId/:confirmed', async (req, res) => {
try {
//return all movements in
const journalList = await warehouseQuery.readJournal(undefined, req.params.warehouseId, req.params.confirmed);
return res.status(200).json({ success: true, data: journalList });
} catch (error) {
console.log(error);
return res.status(400).send({ success: false, message: 'Error finding journal entries for the specified partner', error: error.message });
}
});
router.post('/journal/warehouses/:confirmed', async (req, res) => {
const { warehouses } = req.body;
try {
let fullJournalList = [];
for (let i = 0; i < warehouses.length; i++) {
//return all movements in
const journalList = await warehouseQuery.readJournal(undefined, warehouses[i]._id, req.params.confirmed);
if (journalList.length > 0) {
fullJournalList = fullJournalList.concat(journalList);
}
}
return res.status(200).json({ success: true, data: fullJournalList });
} catch (error) {
console.log(error);
return res.status(400).send({ success: false, message: 'Error finding journal entries for the specified partner', error: error.message });
}
});
router.get('/journal/pending/', async (req, res) => {
try {
const pendingAmounts = await warehouseQuery.readPendingTransactions();
return res.status(200).json({ success: true, data: pendingAmounts });
} catch (error) {
console.log(error);
return res.status(400).send({ success: false, message: 'Cannot find pending amounts for the data specified', error: error.message });
}
});
router.get('/journal/pending/:productId/:partnerId', async (req, res) => {
try {
const pendingAmounts = await warehouseQuery.readPendingAmounts(req.params.productId, req.params.partnerId);
return res.status(200).json({ success: true, data: pendingAmounts });
} catch (error) {
console.log(error);
return res.status(400).send({ success: false, message: 'Cannot find pending amounts for the data specified', error: error.message });
}
});
router.get('/journal/notFulfilled/:partnerId', async (req, res) => {
const requestBody = {
partnerId: req.params.partnerId,
confirmed: false,
};
const unfulfillable = await warehouseJournalModel.find(requestBody);
console.log(unfulfillable);
return res.status(200).json({ success: true, data: unfulfillable });
});
router.post('/journal/process', async (req, res) => {
try {
const { journalId } = req.body;
const { approved } = req.body;
const journal = await warehouseJournalModel.findById(journalId);
if (journal) {
if (!approved) {
await warehouseJournalModel.findByIdAndDelete(journalId);
} else {
const product = await productModel.findById(journal.productId);
if (product) {
let found = false;
for (let j = 0; j < product.inventoryLevels.length; j++) {
if (product.inventoryLevels[j].warehouseId.equals(journal.warehouseId)) {
found = true;
if (journal.omsgid) {
if (!product.inventoryLevels[j].bookings) {
product[j].bookings = [];
}
product.inventoryLevels[j].bookings.push({ amount: journal.variation, omsgid: journal.omsgid, fulfilled: false });
} else {
product.inventoryLevels[j].amount += journal.variation;
}
await product.save();
journal.confirmed = true;
await journal.save();
console.log('AGGIORNATO PRODOTTO');
break;
}
}
if (!found) {
// no inventory level for this product, add it
console.log(`External warehouse in product, adding it with ${journal.variation} starting quantity`);
product.inventoryLevels.push({ warehouseId: journal.warehouseId, amount: 0, bookings: [{ amount: journal.variation, omsgid: journal.omsgid, fulfilled: false }] });
await product.save();
journal.confirmed = true;
await journal.save();
}
}
console.log('#######################################################################################');
console.log('#######################################################################################');
console.log('####################################### SALVO PRODOTTO ################################################');
console.log('#######################################################################################');
await ims.referenceUpdate(product, product.sku);
}
}
return res.status(200).json({ success: true, data: true });
} catch (error) {
console.log(error);
return res.status(400).send({ success: false, message: 'Error finding journal entries for the specified partner', error: error.message });
}
});
module.exports = router;