%PDF- %PDF-
| Direktori : /home/opti/workflow/src/routes/ |
| Current File : /home/opti/workflow/src/routes/employee.js |
var express = require('express');
var router = express.Router();
var formidable = require('formidable');
var path = require('path');
var fs = require('fs');
var bcrypt = require('bcrypt');
var secured = require('../middleware/login');
var con = require('../../config');
var db = require('../models');
var Op = require('sequelize').Op;
var formidable = require('formidable');
var bcrypt = require('bcrypt')
var fs = require('fs');
var path = require('path');
/* GET home page. */
router.get('/', secured, (req, res) => {
res.redirect('/employee/dashboard');
});
router.get('/dashboard', secured, (req, res) => {
const user = req.user;
//check if structure is organised so we do not show the add organization structure button
db.OrganisationStructure.findAll({ where: { orgId: req.user.orgId }, include: [{model:db.Structure, as: 'structure'}], order: [['parentId', 'ASC']] }).then(structures => {
// console.log(structures)
isOrganized = false;
if (structures.length > 0) { //structure not already organized
isOrganized = true;
}
res.render('employee/dashboard', { user, isOrganized, structures });
})
});
router.get('/view/:id', secured, async (req, res) => {
var id = req.params.id;
var user = req.user;
const employee = await db.User.findOne({where:{orgId: user.orgId, id: id}, include:[
{
model: db.PayGrade,
as: 'grade'
},
{
model: db.UserRole,
as: 'userRole'
},
{
model: db.Branch,
as:'branch'
},
{model: db.EmployeeJob, as :'employeeJob', required: false, where:{active:1}, include : [{all:true, nested: true}]},
{ model: db.EmployeeSalary, as :'salary', required: false, where:{active:1}, include : [
{model:db.EmployeeSalaryComponent, as: 'components', order:[['type', 'ASC']] , include:[{all:true, nested: true}]},
{all:true, nested: true}
], },
// { model: db.EmployeeSalary, as :'salaryHistories' }
], order: [
[ {model:db.EmployeeSalary, as:'salary'}, {model:db.EmployeeSalaryComponent, as:'components'}, 'type', 'ASC' ]
]});
// console.log(employee.salary.components, "Employee")
const [titles, categories, salaryComponents, employmentStatuses, workShifts, payGrades] = await Promise.all([
db.JobTitle.findAll({where:{orgId: req.user.orgId}}),
db.JobCategory.findAll({where:{orgId: req.user.orgId}}),
db.SalaryComponent.findAll({where:{orgId: req.user.orgId}, order: [['type', 'ASC']]}),
db.EmploymentStatus.findAll({where:{orgId: req.user.orgId}}),
db.WorkShift.findAll({where:{orgId: req.user.orgId}}),
db.PayGrade.findAll({where:{orgId: req.user.orgId}}),
])
if(employee === null){
return res.status(404);
}
console.log(salaryComponents)
res.render('employee/view', {user, employee, titles, categories, salaryComponents, employmentStatuses, workShifts, payGrades})
})
router.post('/search/name', secured, async (req, res) => {
let name = req.body.name;
console.log("Search Param: ", name)
let employees = await db.User.findAll({
where: { orgId: req.user.orgId,
[Op.or] : [
{
firstName: {
[Op.like]: `%${name}%`
}
},
{
middleName: {
[Op.like]: `%${name}%`
}
},
{
lastName: {
[Op.like]: `%${name}%`
}
}
]
}
});
console.log("Employees: ", employees)
if(employees == null){
res.json([])
} else {
res.json(employees)
}
})
router.get('/all', secured, async function(req, res, next) {
var user = req.user;
// console.log(user)
// TODO : Make admins able to see Organizations without orgId
const allEmployees= await db.User.findAll({where: {orgId: user.orgId}});
const allOrgStructures = await db.OrganisationStructure.findAll({where: { orgId: user.orgId}, include: [
{
model: db.Structure,
as: 'structure'
}
]});
// console.log(allOrgStructures, " All organisation structure");
const allRoles = await db.Role.findAll({where: {orgId: user.orgId}});
const allRegions = await db.Region.findAll({where: {orgId: user.orgId}});
const allGrades = await db.PayGrade.findAll({where: {orgId: user.orgId}})
// console.log(allGrades, " All grades");
res.render('employee/index', {title: 'Employees', allGrades, allRoles, allRegions, allOrgStructures , allEmployees: allEmployees, user: user, script: "index"});
// req.new_employ = "sdfgf";
console.log(req.session.new_employ, "here")
});
router.post('/delete', secured, function(req, res){
var id = req.body.id,
user = req.user;
if(user.roleId === 'isAdmin'){
db.User.findOne({where: {id: id}}).then(function(user){
user.destroy().then(function(){
console.log("Employee successfully deleted")
res.redirect('/employee/all')
})
})
} else {
db.User.findOne({where: {id: id}}).then(function(user){
user.destroy().then(function(){
console.log("Employee successfully deleted")
res.redirect('/employee/all')
})
})
}
})
router.get('/add-employee', secured, async function(req, res, next) {
var user = req.user;
// TODO : Make admins able to see Organizations without orgId
const allOrgStructures = await db.OrganisationStructure.findAll({where: { orgId: user.orgId}, include: [
{
model: db.Structure,
as: 'structure'
}
]});
const allRoles = await db.Role.findAll({where: {orgId: user.orgId}});
const allRegions = await db.Region.findAll({where: {orgId: user.orgId}});
const allGrades = await db.PayGrade.findAll({where: {orgId: user.orgId}})
const jobCategories = await db.JobCategory.findAll({where: {orgId: user.orgId}})
const jobTitles = await db.JobTitle.findAll({where: {orgId: user.orgId}})
const workShifts = await db.WorkShift.findAll({where: {orgId: user.orgId}})
const payGrades = await db.PayGrade.findAll({where: {orgId: user.orgId}})
const salaryComponents = await db.SalaryComponent.findAll({where: {orgId: user.orgId}, order:[['type', 'ASC']]})
const employmentStatuses = await db.EmploymentStatus.findAll({where: {orgId: user.orgId} })
// res.locals.new_employ = req.session.new_employ;
res.render('employee/createEmployee', {title: 'Employees', allGrades, allRoles, allRegions, allOrgStructures , new_employee: req.session.new_employee, jobCategories, jobTitles, workShifts, payGrades, salaryComponents, employmentStatuses});
});
router.post('/add', secured, function(req, res){
var form = new formidable.IncomingForm();
form.parse(req, async (err, fields, files) => {
var firstName = fields.firstName,
middleName = fields.middleName,
dob = fields.dob,
lastName = fields.lastName,
email = fields.email,
gender = fields.gender,
phone = fields.phone,
orgId = fields.orgId,
roleId = /*fields.roleId*/ "isEmployee",
regionId = fields.regionId,
branchId = fields.branchId,
email = fields.email,
password = fields.password,
image = saveFile(files.logo),
gradeId = fields.gradeId,
organisationStructureId = fields.organisationStructureId,
companyStructureId = fields.companyStructureId;
var salt = bcrypt.genSaltSync(10);
password = bcrypt.hashSync(password, salt);
var employeeObj = {
firstName,
middleName,
dob,
lastName,
email,
gender,
phone,
orgId,
password,
image,
userRoleId: roleId,
branchId,
regionId,
gradeId,
organisationStructureId,
companyStructureId
};
//TODO: Check if org sub to HR and direct accordingly
//if no hr module add emmployee and go away
//else manage empoyee
//uncomment this snippet to add employee and go away
// db.User.create({...employeeObj, roleId : 'isEmployee'}).then(function(newStaff){
// if(!newStaff){
// req.flash('info', 'Error occured while creating employee');
// return res.redirect('/employee/all');
// }
// req.flash('success', 'Employee created');
// res.redirect('/employee/all');
// })
//hr module
req.session.new_employee = employeeObj;
// res.locals.new_employee = employeeObj;
res.redirect('/employee/add-employee');
});
})
router.post('/edit', secured, function(req, res){
var form = new formidable.IncomingForm();
form.parse(req, async (err, fields, files) => {
console.log("Edit: ", fields)
var employeeId = fields.id;
var firstName = fields.firstName,
middleName = fields.middleName,
dob = fields.dob,
lastName = fields.lastName,
gender = fields.gender,
phone = fields.phone,
orgId = fields.orgId,
branchId = fields.branchId,
regionId = fields.regionId,
// email = fields.email,
// password = fields.password,
image = saveFile(files.logo),
gradeId = fields.gradeId,
organisationStructureId = fields.organisationStructureId,
companyStructureId = fields.companyStructureId;
// var salt = bcrypt.genSaltSync(10);
// password = bcrypt.hashSync(password, salt);
var employeeObj = {
firstName,
middleName,
dob,
lastName,
//email,
gender,
phone,
orgId,
//password,
image,
branchId,
regionId,
gradeId,
organisationStructureId,
companyStructureId
};
// if(password == undefined)
db.User.findOne({where: {id: employeeId}}).then( async function(staff){
if(!staff){
req.flash('info', 'Error occurred while creating employee');
console.log("Error no such employee")
return res.redirect('/employee/all');
}
staff.update(employeeObj).then(function(){
req.flash('info', 'Employee created');
console.log("Employee created")
res.redirect('/employee/all');
})
})
});
})
router.get('/api/all', secured, (req, res) => {
var user = req.user;
db.User.findAll({where:{orgId: user.orgId}})
.then(function(employees){
res.json(employees);
})
})
function saveFile(file){
const name = `${Math.floor(Date.now() / 1000)}_${Math.round(Math.random() * 10000)}.${file.name.split('.').pop()}`;
const dest = path.join(__dirname, '..', 'public', 'assets', 'images', 'users', 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;
}
module.exports = router;