%PDF- %PDF-
Direktori : /home/opti/workflow/src/routes/ |
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;