%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /home/opti/workflow/src/routes/
Upload File :
Create Path :
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;

Zerion Mini Shell 1.0