Your IP : 216.73.217.95


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