%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /home/opti/workflow/src/routes/
Upload File :
Create Path :
Current File : /home/opti/workflow/src/routes/inventory.js

var express = require('express');
var router = express.Router();
// TODO : Item image
var path = require('path');
var fs = require('fs');
var formidable = require('formidable');
var secured = require('../middleware/login');
var con = require('../../config');
var db = require('../models');



router.get('/items', secured, async function (req, res, next) {

    var user = req.user;
    const [ items, stores, allOrgStructures] = await Promise.all([
        db.Item.findAll({where:{orgId: user.orgId}, order:[['createdAt', 'DESC']]}),
        db.Store.findAll({where:{orgId: user.orgId}}),
        db.OrganisationStructure.findAll({where: {orgId: user.orgId}, include: [ {model: db.Structure, as: 'structure'}] })
    ])

    res.render('inventory/item', {  items, allOrgStructures, stores });


});

router.get('/stores', secured, async function (req, res, next) {

    var user = req.user;
    const [ stores, allOrgStructures] = await Promise.all([
        db.Store.findAll({where:{orgId: user.orgId}, order:[['createdAt', 'DESC']]}),
        db.OrganisationStructure.findAll({where: {orgId: user.orgId}, include: [ {model: db.Structure, as: 'structure'}] })
    ])

    res.render('inventory/store', { allOrgStructures, stores });


});


router.post('/items/add', secured, async function (req, res, next) {
    var backURL = req.header('Referer') ;

    var form = new formidable.IncomingForm();
    form.parse(req, async (err, fields, files) => {
        console.log("Body: ", fields)
        console.log("Files: ", files )
        var user = req.user;
        var orgId = user.orgId; // TODO: Change 'orgId' to 'OrgId'
        var item = {};
        item.name = fields.name;
        item.description = fields.description;
        item.referenceNo = await genItemRefNumber(orgId);
        item.storeId = fields.storeId;

        var docCount = parseInt(fields.docCount);


        if(files.image){
            item.image = saveFile(files.image, "images")
        }

        // const requester = req.url == 'items/add' ? 'ur';

        // console.log("Ref No: ", item.referenceNo)
        // try{
        //     item.pieces = parseInt(fields.pieces);

        // }
        // catch(err){
        //     req.flash('error', 'An error occured, please try again')
        //     return res.redirect('/inventory/items')
        // }

        if(item.name === undefined || item.name === ""  ){
            req.flash('error', 'Please fill the form correctly')
            return res.redirect(backURL);
        }

        item.orgId = orgId;
        db.Item.findOne({where: {id: fields.itemId}}).then(function(foundItem){
            if(foundItem === null){
                db.Item.create(item).then(async(createdItem)=>{
                    if(createdItem){
                        // con

                        for(var i = 0; i < docCount; i++){
                            // console.log("name :", fields[`documentName[$i]`]);
                            await db.ItemDocument.create({filename : saveFile(files[`document[${i}]`], "documents"), name : fields[`documentName[${i}]`], orgId, createdBy: user.id, itemId:createdItem.id})

                        }
                        req.flash('success', 'Item added');


                        // return res.redirect(backURL);
                        res.redirect('/inventory/items/view/'+createdItem.uuid);
                    }
                });
            } else {
                foundItem.update({
                    pieces: foundItem.pieces += item.pieces
                }).then(function(){
                    req.flash('success', 'Item updated')
                    // return res.redirect(backURL);
                    res.redirect('/inventory/items/view/'+createdItem.uuid);
                }).catch(function(err){
                    req.flash("There was error updating item")
                    return res.redirect(backURL);
                    // res.redirect('/inventory/items')
                })

            }
        })

    })


});

//with ability to move or edit item
router.get('/items/view/:uuid', secured, async function (req, res, next) {

    const uuid = req.params.uuid;

    const [ item, allOrgStructures] = await Promise.all([
        db.Item.findOne({where: {uuid: uuid}, include:[{model: db.ItemDocument, as:'documents', order:[['createdAt', 'DESC']]}, {model: db.ItemMovement, as:'movements', include:[ 'moveBy']}, 'store']}),
        db.OrganisationStructure.findAll({where: {orgId: req.user.orgId}, include: [ {model: db.Structure, as: 'structure'}] })
    ])

    item.movements.forEach( mov =>{
        console.log("rfvdgdfgdgdg", mov.getMoverName())
        console.log(mov.receiverName)
    })

    var receiver;
    if(item.movements.length > 0){
        var movement = item.movements[item.movements.length - 1];
        switch(movement.location){
            case 'Store':
            await db.Store.findOne({where:{id:movement.receiverId}})
                .then(store=>{
                    receiver = store.name;
                })
            break;
            case 'Region':
                await db.Region.findOne({where:{id:movement.receiverId}})
                .then(region=>{
                    receiver = region.name;
                })
            break;
            case 'Branch':
            await db.Branch.findOne({where:{id:movement.receiverId}})
                .then(branch=>{
                    receiver = branch.name;
                })
            break;
            case 'Company Structure':
            await db.CompanyStructure.findOne({where:{id:movement.receiverId}})
                .then(structure=>{

                    receiver = structure.name;
                    console.log(receiver ,"here ");
                })
            case 'Employee':
            await db.User.findOne({where:{id:movement.receiverId}})
                .then(employee=>{
                    receiver = employee.firstName +' '+employee.lastName;
                })
            break;

        }

    }
    else{
        receiver = item.store.name;
    }
    item.receiver = receiver;

    res.render('inventory/viewItem', { allOrgStructures, item });

});

//without ability to move or edit item
router.get('/item/:uuid', secured, async function (req, res, next) {

    const uuid = req.params.uuid;

    const [ item, allOrgStructures] = await Promise.all([
        db.Item.findOne({where: {uuid: uuid}, include:[{model: db.ItemDocument, as:'documents', order:[['createdAt', 'DESC']]}, {model: db.ItemMovement, as:'movements', include:[ 'moveBy']},]}),
        db.OrganisationStructure.findAll({where: {orgId: req.user.orgId}, include: [ {model: db.Structure, as: 'structure'}] })
    ])

    item.movements.forEach( mov =>{
        console.log("rfvdgdfgdgdg", mov.getMoverName())
        console.log(mov.receiverName)
    })

    res.render('inventory/userViewItem', { allOrgStructures, item });

});

router.post('/item/move', secured, async function(req, res){

    var location = req.body.location;//receiverType
    var itemId = req.body.itemId;
    var remarks = req.body.remarks;
    var receiverId = req.body.receiverId;
    var user = req.user;

    var item = await db.Item.findOne({where:{id:itemId}});
    // if(item.pieces < pieces){
    //     req.flash('info', `Not enough of ${item.name} in the Store `)
    //     return res.redirect('/inventory')
    // }

    if(
        location !== null &&
        location !== undefined &&
        location !== '' &&
        // pieces !== undefined &&
        // pieces !== null &&
        // pieces > 0 &&
        receiverId !== null &&
        receiverId !== undefined &&
        receiverId !== ''
    ){
        // await item.updateAttributes({pieces: item.pieces - pieces});
        //find if item has ever been moved
        const [movedItem] = await Promise.all([
            db.ItemMovement.findOne({where:{itemId: item.id, current:1}})
        ])

        var moverId = item.storeId;
        var moverType = 'Store';

        if(movedItem){
            //item previously been  moved
            moverId = movedItem.receiverId
            moverType = movedItem.location //receiverType
            movedItem.update({current:0})
        }

        await db.ItemMovement.create({
            location,
            // pieces:pieces,
            receiverId,
            orgId: user.orgId,
            itemId: item.id,
            moverId,
            moverType,
            createdBy: user.id,
            current: 1,
            remarks
        })
        .then(movement =>{
            let msg = `Item ${item.referenceNo} (${item.name}) has been moved/assigned to `
            sendNotification(user.id, location, receiverId, msg, item.uuid)//to receiver
            msg = `Item ${item.referenceNo} (${item.name}) has been moved from `

            sendNotification(user.id, moverType, moverId, msg, item.uuid)//to previous owner
        })

        //TODO:: notify receiver


        req.flash('success', 'Item moved successfully');
    } else {
        req.flash('error', 'Fill the form correctly');
    }

    res.redirect(req.header('Referer'));
})

router.post('/stores/add', secured, async function (req, res, next) {

    var form = new formidable.IncomingForm();

    form.parse(req, async (err, fields, files) => {
        // console.log("Body: ", fields)
        var user = req.user;
        var orgId = user.orgId;
        var store = {};

        store.name = fields.name;
        store.description = fields.description;
        store.location = fields.location;
        store.createdBy = user.id;

        if(store.name === undefined || store.name === ""){
            console.log("Error!! Please fill the form correctly")
            req.flash('error', 'Please fill the form correctly')
            return res.redirect('/inventory/stores')
        }
        store.orgId = orgId;

        db.Store.findOne({where: {id: fields.storeId}}).then(async(foundStore)=>{
            if(foundStore === null){
                store.referenceNumber = await genItemRefNumber(orgId, 'STR'); //yeah get item but is store

                db.Store.create(store).then(function(createdStore, err){
                    if(err){
                        req.flash("There was error creating store")
                        res.redirect('/inventory/stores')
                    }
                    if(createdStore){
                        req.flash('success', 'Store Added')
                        // console.log("Store saved successfully");
                        res.redirect('/inventory/stores');
                    }
                });
            } else {
                store.id = foundStore.id;
                foundStore.update({
                    name:store.name, description:store.description, location:store.location,
                }).then(function(){
                    req.flash('success', 'Store updated')
                    res.redirect('/inventory/stores')
                }).catch(function(err){
                    req.flash("There was error updating store")
                    res.redirect('/inventory/stores')
                })

            }
        })

    })


});

router.get('/stores/view/:uuid', secured, async function (req, res, next) {

    const uuid = req.params.uuid;

    const [ store, allOrgStructures] = await Promise.all([
        db.Store.findOne({where: {uuid: uuid}, include:[{model: db.Item, as:'items', order:[['createdAt', 'DESC']]}], order:[['createdAt', 'DESC']]}),
        db.OrganisationStructure.findAll({where: {orgId: req.user.orgId}, include: [ {model: db.Structure, as: 'structure'}] })
    ])

    res.render('inventory/viewStore', { allOrgStructures, store });

});

//json
//get list of store details
router.post('/stores/get-store', secured, function(req, res, next) {
    const body = req.body
    // console.log(body);

    db.Store.findOne({where:{uuid : body.uuid}})
    .then(store=>{
        if(!store)
            return res.json({status:"error", msg: "Status not found!"});

        return res.json({status:"success", msg: "", store});

    })

});

router.get('/items/document/download/:file', secured, async (req, res) => {
    db.ItemDocument.findOne({ where: { orgId: req.user.orgId, fileName: req.params.file } })
        .then(result => {
            if(!result){
                req.flash('info', 'Document not found!');
                res.redirect(req.header('Referer'));
            }
            const file = path.join(__dirname, '..', 'public', 'assets', 'documents','items', result.filename);
            res.download(file);
        });
});


router.post('/items/get-moverOrReceiverName', secured, async(req, res, next) => {
    const body = req.body
    console.log(body);
    // const moverType = body.moverType;
    const itemId = body.itemId;

    const itemMovements = await db.ItemMovement.findAll({where:{orgId: req.user.id, itemId} })

    let movements = [];
    for(var i = 0; i < itemMovements.length; i++){
        var mover;
        var receiver;
        switch(itemMovements[i].location){
            case 'Store':
            await db.Store.findOne({where:{id:itemMovements[i].receiverId}})
                .then(store=>{
                    receiver = store.name;
                })
            break;
            case 'Region':
                await db.Region.findOne({where:{id:itemMovements[i].receiverId}})
                .then(region=>{
                    receiver = region.name;
                })
            break;
            case 'Branch':
            await db.Branch.findOne({where:{id:itemMovements[i].receiverId}})
                .then(branch=>{
                    receiver = branch.name;
                })
            break;
            case 'Company Structure':
            await db.CompanyStructure.findOne({where:{id:itemMovements[i].receiverId}})
                .then(structure=>{

                    receiver = structure.name;
                    console.log(receiver ,"here ");
                })
            case 'Employee':
            await db.User.findOne({where:{id:itemMovements[i].receiverId}})
                .then(employee=>{
                    receiver = employee.firstName +' '+employee.lastName;
                })
            break;

        }
        switch(itemMovements[i].moverType){
            case 'Store':
            await db.Store.findOne({where:{id:itemMovements[i].moverId}})
                .then(store=>{
                mover = store.name;
                })
            break;
            case 'Region':
              await db.Region.findOne({where:{id:itemMovements[i].moverId}})
                .then(region=>{
                mover = region.name;
                })
            break;
            case 'Branch':
            await db.Branch.findOne({where:{id:itemMovements[i].moverId}})
                .then(branch=>{
                mover = branch.name;
                })
            break;
            case 'Company Structure':
            await db.Structure.findOne({where:{id:itemMovements[i].moverId}})
                .then(structure=>{
                mover = structure.name;
                })
            case 'Employee':
            await db.User.findOne({where:{id:itemMovements[i].moverId}})
                .then(employee=>{
                mover = employee.firstName +' '+employee.lastName;
                })
            break;
        }

        movements.push({id:itemMovements[i].id, receiver, mover});
    }

    // console.log(movements);
    return res.json({status:"success", msg: "", itemMovements:movements});



});

router.post('/item/delete', secured, function(req, res){
    var itemId = req.body.itemId;
    var orgId = req.user.orgId;
    db.Item.findOne({where: {id: itemId, orgId}}).then(function(item){
        if(item === null){
             console.log("Item not found for removal")
             return res.status(404)
        }

        item.destroy().then(function(){
            console.log(`Item ${item.name} deleted`)
            res.redirect('/inventory')
        })
    })
})

router.get('/api/employees', secured, async function(req, res){
    console.log("api Employees")
    var user = req.user;
    var employees = await db.User.findAll({where: {orgId: user.orgId}});
    console.log(employees)
    if(employees !== null || employees !== undefined){
        res.json(employees)
    } else {
        res.json([]);
    }
})

router.get('/api/business', secured, async function(req, res){
    var user = req.user;
    var businessStuctures = await db.CompanyStructure.findAll({where: {orgId: user.orgId}});

    if(businessStuctures !== null || businessStuctures !== undefined){
        res.json(businessStuctures)
    } else {
        res.json([]);
    }
})

router.get('/stores/api/all', secured, async (req, res) => {
    var user = req.user;
    var stores = await db.Store.findAll({where: {orgId: user.orgId}});
    res.json(stores);
  })


async function genItemRefNumber(orgId, type) {
    const organization = await db.Organization.findOne({ where: {id: orgId}});
    let orgName = organization.name;
    orgName = orgName.substring(0, 3);

    var text = orgName.toUpperCase();
    if(type)
        text +=  ("-"+ type.toUpperCase());
    var possible = '0123456789';

    for (var i = 0; i < 8; i++)
      text += possible.charAt(Math.floor(Math.random() * possible.length));

    return text;
  }

  function saveFile(file, type){
	const name = `${Math.floor(Date.now() / 1000)}_${Math.round(Math.random() * 10000)}.${file.name.split('.').pop()}`;
	const dest = path.join(__dirname, '..', 'public', 'assets', type, 'items', name);
	const data = fs.readFileSync(file.path);
	fs.writeFileSync(dest, data);
	fs.unlinkSync(file.path);
    // console.log("Path: ", dest)
    // console.log("Data: ", data)
	// uploadInfo.fileSize = fileUpload.size;
	// uploadInfo.fileType = fileUpload.type;
	return  name;

}

//location is the kind of place the item is moved to, e.g branch, region
async function sendNotification(userId, location, id, msg, itemUuid){
    var name ;

    switch(location){

        case 'Store':
        await db.Store.findOne({where:{id:id}})
            .then(store=>{
                db.Notification.create({senderId:userId,receiverId:store.headId,type:"Item Movement",message:`${msg} your Store`,url:"/inventory/item/"+itemUuid,seen:0})
				// .then(notification =>console.log(notification));
            })
        break;
        case 'Region':
            await db.Region.findOne({where:{id:id}})
            .then(region=>{
                db.Notification.create({senderId:userId,receiverId:region.headId,type:"Item Movement",message:`${msg} your Region`,url:"/inventory/item/"+itemUuid,seen:0})
				// .then(notification =>console.log(notification));
            })
        break;
        case 'Branch':
        await db.Branch.findOne({where:{id:id}})
            .then(branch=>{
                db.Notification.create({senderId:userId,receiverId:branch.headId,type:"Item Movement",message:`${msg} your branch`,url:"/inventory/item/"+itemUuid,seen:0})
				// .then(notification =>console.log(notification));
            })
        break;
        case 'Company Structure':
        await db.CompanyStructure.findOne({where:{id:id}})
            .then(structure=>{

                db.Notification.create({senderId:userId,receiverId:structure.headId,type:"Item Movement",message:`${msg} your structure`,url:"/inventory/item/"+itemUuid,seen:0})
				// .then(notification =>console.log(notification));
            })
        case 'Employee':
        await db.User.findOne({where:{id:id}})
            .then(employee=>{
                db.Notification.create({senderId:userId,receiverId:id,type:"Item Movement",message:`${msg} you`,url:"/inventory/item/"+itemUuid,seen:0})
				// .then(notification =>console.log(notification));
            })
        break;

    }

    return name;
}

module.exports = router;

Zerion Mini Shell 1.0