%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;