%PDF- %PDF-
Mini Shell

Mini Shell

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

var express = require('express');
var router = express.Router();
var formidable = require('formidable');
var fs = require('fs');
var path = require('path');
var Op = require('sequelize').Op;

var ejs = require('ejs');
var pdf = require('html-pdf');
// var moment = require('moment');

// const email = require('../config/mail');


var secured = require('../middleware/login');
var db = require('../models');
//import models


// const db = require('../models'); // new require for db object

//TODO::list all contacts, invoices etc...

//get method/route for job, category list/view,
router.get('/jobs', secured, async(req, res, next)=> {
    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}}),
        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(salaryComponents.length == 0){
        //this company doesn't have any salary component yet,
        //let's create a basic salary for them so they don't spoil our work
        await db.SalaryComponent.create({title:"Basic Salary", type:"Earning", partOfTotal:1, valueType:"Amount", orgId: req.user.orgId})

    }

    res.render('hr/job/title', {titles, categories, salaryComponents, employmentStatuses, workShifts, payGrades});
});

router.get('/jobs/view/:uuid', secured, async(req, res, next)=> {
    const [category, categories] = await Promise.all([
        db.JobCategory.findOne({where:{orgId: req.user.orgId, uuid:req.params.uuid}, include:'titles'}),
        db.JobCategory.findAll({where:{orgId: req.user.orgId}}),
    ])

    const titles = await db.JobTitle.findAll({where:{orgId: req.user.orgId, categoryId:category.id}});

    res.render('hr/job/categoryView', {category, categories, titles});
});

router.get('/salary-component', secured, async(req, res, next)=> {
    const [salaryComponents] = await Promise.all([
        db.SalaryComponent.findAll({where:{orgId: req.user.orgId}}),
    ])

    if(salaryComponents.length == 0){
        //this company doesn't have any salary component yet,
        //let's create a basic salary for them so they don't spoil our work
        await db.SalaryComponent.create({title:"Basic Salary", type:"Earning", partOfTotal:1, valueType:"Amount", orgId: req.user.orgId})

    }

    res.render('hr/job/salaryComponent', {salaryComponents});
});

router.get('/employment-status', secured, async(req, res, next)=> {
    const [employmentStatuses] = await Promise.all([
        db.EmploymentStatus.findAll({where:{orgId: req.user.orgId}}),
    ])

    res.render('hr/job/employmentStatus', {employmentStatuses});
});

router.get('/work-shift', secured, async(req, res, next)=> {
    const [workShifts] = await Promise.all([
        db.WorkShift.findAll({where:{orgId: req.user.orgId}}),
    ])

    res.render('hr/job/workShift', {workShifts});
});

router.get('/pay-grade', secured, async(req, res, next)=> {
    const [payGrades] = await Promise.all([
        db.PayGrade.findAll({where:{orgId: req.user.orgId}}),
    ])

    res.render('hr/job/payGrade', {payGrades});
});

router.get('/leave', secured, async(req, res, next)=> {
    const [leaves] = await Promise.all([
        db.Leave.findAll({where:{orgId: req.user.orgId}}),
    ])

    res.render('hr/job/leave', {leaves});
});

//post method/route for job, category list/view,
router.post('/jobs/add-title', secured, function(req, res, next) {
    const body = req.body
    // console.log(body);
    db.JobCategory.findOne({where:{id:body.categoryId, orgId:req.user.orgId}})
    .then(category=>{
        if(!category)
            return res.json({status:"error", msg: "Category not found!"});

        if(body.id){
            db.JobTitle.findOne({where:{id:body.id, orgId:req.user.orgId}})
            .then(jobTitle=>{
                if(!jobTitle)
                    return res.json({status:"error", msg: "Job not found!"});
                else{
                    jobTitle.update({title:body.title, description: body.description, categoryId:body.categoryId})
                    .then(job => {
                        return res.json({status:"success", msg: "Job Title updated!", job:{id:job.id, title:job.title, description:job.description, categoryId:job.categoryId, }});

                    })
                }
            })
        }
        else{
            db.JobTitle.create({title:body.title, description:body.description, categoryId:body.categoryId, orgId: req.user.orgId})
            .then(jobTitle=>{
                if(!jobTitle)
                    return res.json({status:"error", msg: "Unable to add Job title!"});
                else
                    return res.json({status:"success", msg: "Job Title added!", job:{id:jobTitle.id, title:jobTitle.title, description:jobTitle.description, categoryId:jobTitle.categoryId, }});
            })
        }

    })

});

router.post('/jobs/add-category', secured, function(req, res, next) {
    const body = req.body
    // console.log(body);
    if(body.id){
        db.JobCategory.findOne({where:{id:body.id, orgId:req.user.orgId}})
        .then(category=>{
            if(!category)
                return res.json({status:"error", msg: "Category not found!"});
            else{
                category.update({title:body.title, description: body.description})
                .then(c => {
                    return res.json({status:"success", msg: "Job Category updated!", category:{id: c.id, title: c.title, description: c.description}});

                })
            }
        })
    }else{
        db.JobCategory.create({title:body.title, description:body.description, orgId: req.user.orgId})
        .then(category=>{
            if(!category)
                return res.json({status:"error", msg: "Unable to add category"});
            else
                return res.json({status:"success", msg: "Job Category added!", category:{id: category.id, title: category.title, description: category.description}});
        })
    }


});


router.post('/jobs/add-salary-component', secured, function(req, res, next) {
    const body = req.body
    // console.log(body);
    var type = body.type == 1 ? "Earning" :  "Deduction";
    var partOfTotal = body.partOfTotal == 1 ? 1 :  0;
    var valueType = body.valueType == 1 ? "Amount" :  "Percentage";
    if(body.id){
        // console.log("fffff")
        db.SalaryComponent.findOne({where:{id:body.id, orgId:req.user.orgId}})
        .then(salary=>{
            if(!salary)
                return res.json({status:"error", msg: "Salary Component not found!"});
            else{
                salary.update({title:body.title, type, partOfTotal, valueType})
                .then(s => {
                    return res.json({status:"success", msg: "Salary Component updated!", salary:{id:s.id, title:s.title, type:s.type, partOfTotal:s.partOfTotal, valueType:s.valueType, }});

                })
            }
        })
    }else{
        // console.log("dddddd")
        db.SalaryComponent.create({title:body.title, type, partOfTotal, valueType, orgId: req.user.orgId})
        .then(salary=>{
            if(!salary)
                return res.json({status:"error", msg: "Unable to add Salary Component"});
            else
                return res.json({status:"success", msg: "Salary Component added!", salary:{id:salary.id, title:salary.title, type:salary.type, partOfTotal:salary.partOfTotal, valueType:salary.valueType, }});
        })
    }


});

router.post('/jobs/add-employment-status', secured, function(req, res, next) {
    const body = req.body
    // console.log(body);
    if(body.id){
        db.EmploymentStatus.findOne({where:{id:body.id, orgId:req.user.orgId}})
        .then(status=>{
            if(!status)
                return res.json({status:"error", msg: "Employment Status not found!"});
            else{
                status.update({title:body.title, description: body.description})
                .then(s => {
                    return res.json({status:"success", msg: "Employment Status updated!", employmentStatus:{id:s.id, title:s.title, description:s.description, }});

                })
            }
        })
    }else{
        db.EmploymentStatus.create({title:body.title, description:body.description, orgId: req.user.orgId})
        .then(status=>{
            if(!status)
                return res.json({status:"error", msg: "Unable to add Employment Status"});
            else
                return res.json({status:"success", msg: "Employment Status added!", employmentStatus:{id:status.id, title:status.title, description:status.description, }});
        })
    }


});

router.post('/jobs/add-work-shift', secured, function(req, res, next) {
    const body = req.body
    // console.log(body);
    if(body.id){
        db.WorkShift.findOne({where:{id:body.id, orgId:req.user.orgId}})
        .then(shift=>{
            if(!shift)
                return res.json({status:"error", msg: "Work Shift not found!"});
            else{
                shift.update({title:body.title, description: body.description, from:body.from, to:body.to})
                .then(s => {
                    return res.json({status:"success", msg: "Work Shift updated!", workShift:{id:s.id, title:s.title, from:s.from, to:s.to, description:s.description, }});

                })
            }
        })
    }else{
        db.WorkShift.create({title:body.title, description:body.description, from:body.from, to:body.to, orgId: req.user.orgId})
        .then(shift=>{
            if(!shift)
                return res.json({status:"error", msg: "Unable to add Work Shift"});
            else
                return res.json({status:"success", msg: "Work Shift added!", workShift:{id:shift.id, title: shift.title, from:shift.from, to:shift.to, description:shift.description, }});
        })
    }


});

router.post('/jobs/add-pay-grade', secured, function(req, res, next) {
    const body = req.body
    // console.log(body);
    if(body.id){
        db.PayGrade.findOne({where:{id:body.id, orgId:req.user.orgId}})
        .then(grade=>{
            if(!grade)
                return res.json({status:"error", msg: "Pay Grade not found!"});
            else{
                grade.update({title:body.title, description: body.description, currencyId:body.currencyId, minSalary:body.minSalary, maxSalary:body.maxSalary})
                .then(g => {
                    return res.json({status:"success", msg: "Work Shift updated!", payGrade:{id:g.id, title:g.title, currencyId:g.currencyId, minSalary:g.minSalary, maxSalary:g.maxSalary, description:g.description, }});

                })
            }
        })
    }else{
        db.PayGrade.create({title:body.title, description:body.description, currencyId:body.currencyId, maxSalary:body.maxSalary, minSalary:body.minSalary, orgId: req.user.orgId})
        .then(grade=>{
            if(!grade)
                return res.json({status:"error", msg: "Unable to add Pay Grade"});
            else
                return res.json({status:"success", msg: "Pay Grade added!", payGrade:{id:grade.id, title: grade.title, currencyId:grade.currencyId, minSalary:grade.minSalary, maxSalary:grade.maxSalary, description:grade.description, }});
        })
    }


});



//json
//get list of jobTitles in respect to jobCategory
router.post('/jobs/get-jobTitles', secured, function(req, res, next) {
    const body = req.body
    // console.log(body);

    db.JobTitle.findAll({where:{categoryId : body.jobCategoryId, orgId : req.user.orgId}})
    .then(jobTitles=>{
        if(!jobTitles)
            return res.json({status:"error", msg: "Category not found!"});

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

    })

});

//json
//get list of jobTitles in respect to jobCategory
router.post('/jobs/get-salaryComponents', secured, function(req, res, next) {
    // const body = req.body
    // console.log(body);

    db.SalaryComponent.findAll({where:{orgId : req.user.orgId}, order:[['createdAt', 'ASC']]})
    .then(salaryComponents=>{
        if(!salaryComponents)
            return res.json({status:"error", msg: "salaryComponents not found!"});

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

    })

});

//handle new employeee job detils, salary components,
router.post('/employee/add', secured, function(req, res, next) {
    const new_employee = req.session.new_employee;

    var form = new formidable.IncomingForm();
    form.parse(req, async (err, fields, files) => {

    const components = JSON.parse(fields.salaryComponents)
    let earnings = 0;
    let deduction = 0;
    let annualPayment = 0;
    const salaryComponents = await db.SalaryComponent.findAll({where:{orgId: req.user.orgId}});
    const basicSalary = components[0];

    salaryComponents.forEach((component, index) => {

        if(component.type == "Earning"){
            if(component.valueType == "Amount")
                earnings  += parseFloat(components[index]);
            else{
                var a = (basicSalary * components[index])/ 100; //its percentage now
                earnings += a;
            }
            // console.log(components[index], index)
        }
        else{
            if(component.valueType == "Amount")
                deduction  += parseFloat(components[index]);
            else{
                var a = (basicSalary * components[index])/ 100; //its percentage now
                deduction += a;
            }
        }

    });

    annualPayment = earnings - deduction;


    //create new user
    db.User.create({...new_employee, roleId : 'isEmployee'})
    .then(function(newStaff){
        if(!newStaff){
        req.flash('info', 'Error occurred while creating employee');
        return res.redirect('/employee/all');
        }

        db.EmployeeJob.create({orgId:req.user.orgId, jobTitleId: fields.jobTitleId, workShiftId: fields.workShiftId, employmentStatusId: fields.employmentStatusId, dateOfEmployment: fields.dateOfEmployment, dateOfPermanency: fields.dateOfPermanency, contractStarts: fields.contractStarts, contractEnds: fields.contractEnds, userId: newStaff.id, createdBy: req.user.id, active: 1})
        // .then(employee)
        db.EmployeeSalary.create({ orgId: req.user.orgId, userId: newStaff.id, payGradeId: fields.payGradeId, currencyId:fields.currencyId, effectiveFrom: fields.effectiveFrom, effectiveTo: fields.effectiveTo, earnings, deduction, annualPayment, active:1})
        .then(salary => {
            salaryComponents.forEach((component, index) => {
                var type = 2;
                if(salaryComponents.type == "Earning"){
                    type = 1;
                }
                db.EmployeeSalaryComponent.create({orgId: req.user.orgId, employeeSalaryId: salary.id, salaryComponentId: component.id, value: components[index], createdBy:req.user.id, userId: newStaff.id, type})

            });

            res.redirect('/employee/all')

        })

    })


    })

});

//handle edit employee's job
router.post('/jobs/employee/job-edit', secured, function(req, res, next) {
    // const new_employee = req.session.new_employee;
    var form = new formidable.IncomingForm();
    form.parse(req, async (err, fields, files) => {
        console.log(fields)

        // check e
        if(fields.jobId){
            //find current job record and make it inactive
            db.EmployeeJob.findOne({where:{userId: fields.userId, id :fields.jobId, active:1}})
            .then(async job => {
                await job.update({active: 0});
                // console.log(job)
            })

        }

        //create new record either record exist or not

        db.EmployeeJob.create({orgId:req.user.orgId, jobTitleId: fields.jobTitleId, workShiftId: fields.workShiftId, employmentStatusId: fields.employmentStatusId, dateOfEmployment: fields.dateOfEmployment, dateOfPermanency: fields.dateOfPermanency, contractStarts: fields.contractStarts, contractEnds: fields.contractEnds, userId: fields.userId, createdBy: req.user.id, active: 1})
        .then( newJob => {
            req.flash('success', 'Employee Job Updated')
            res.redirect('/employee/view/'+fields.userId)
        })

        // req.flash('info', 'Something went wrong')
        // res.redirect('employee/view/'+job.userId)

    })

});

//handle edit employee's salary
router.post('/jobs/employee/salary-edit', secured, function(req, res, next) {

    var form = new formidable.IncomingForm();
    form.parse(req, async (err, fields, files) => {
// console.log(fields)
        const components = JSON.parse(fields.salaryComponents)
        let earnings = 0;
        let deduction = 0;
        let annualPayment = 0;
        const salaryComponents = await db.SalaryComponent.findAll({where:{orgId: req.user.orgId}});
        const basicSalary = components[0];
        salaryComponents.forEach((component, index) => {
            if(component.type == "Earning"){
                if(component.valueType == "Amount")
                    earnings  += parseFloat(components[index]);
                else{
                    var a = (basicSalary * components[index])/ 100; //its percentage now
                    earnings += a;
                }
                // console.log(components[index], index)
            }
            else{
                if(component.valueType == "Amount")
                    deduction  += parseFloat(components[index]);
                else{
                    var a = (basicSalary * components[index])/ 100; //its percentage now
                    deduction += a;
                }
            }

        });

        annualPayment = earnings - deduction;


        if(fields.salaryId)
        //find current salary record and make inactive
        await db.EmployeeSalary.findOne({where:{userId: fields.userId, id:fields.salaryId}})
        .then( async salary => {
            await salary.update({active:0, effectiveTo:fields.effectiveFrom});//this becomes non-effective when new becomes effective
        })

        ///create new record even if no record exist or record set to inactive
        await db.EmployeeSalary.create({ orgId: req.user.orgId, userId: fields.userId, payGradeId: fields.payGradeId, currencyId:fields.currencyId, effectiveFrom: fields.effectiveFrom, effectiveTo: fields.effectiveTo, earnings, deduction, annualPayment, active:1})
        .then(async (newSalary) => {
            await salaryComponents.forEach(async(component, index) => {
                var type = 2;
                if(salaryComponents.type == "Earning"){
                    type = 1;
                }
                await db.EmployeeSalaryComponent.create({orgId: req.user.orgId, employeeSalaryId: newSalary.id, salaryComponentId: component.id, value: components[index], createdBy:req.user.id, userId: fields.userId, type  })
                // .then( com => console.log(com))
            console.log("inside")


            });
            // for(var i = 0; i < salaryComponents.length; i++){
            //     await db.EmployeeSalaryComponent.create({orgId: req.user.orgId, employeeSalaryId: newSalary.id, salaryComponentId: salaryComponents[i].id, value: components[i], createdBy:req.user.id, userId: fields.userId,});
            //     console.log("inside")
            // }
            // console.log("outside")
            req.flash('success', "Employee's Salary updated")
            res.redirect('/employee/view/'+fields.userId)

        })

        // req.flash('info', 'Something went wrong')
        // res.redirect('employee/view/'+job.userId)

    })

});


module.exports = router;

Zerion Mini Shell 1.0