/* Copyright (c) 2018 [Glacies UG, Berlin, Germany] (http://glacies.de) Developer: Thilina Hasantha (http://lk.linkedin.com/in/thilinah | https://github.com/thilinah) */ /* global modJs, modJsList */ import AdapterBase from '../../../api/AdapterBase'; import TableEditAdapter from '../../../api/TableEditAdapter'; require('codemirror/mode/javascript/javascript'); require('codemirror/addon/edit/closebrackets'); require('codemirror/addon/display/autorefresh'); const CodeMirror = require('codemirror'); /** * PaydayAdapter */ class PaydayAdapter extends AdapterBase { getDataMapping() { return [ 'id', 'name', ]; } getHeaders() { return [ { sTitle: 'ID', bVisible: false }, { sTitle: 'Select Pay Frequency' }, ]; } getFormFields() { return [ ['name', { label: 'Name', type: 'text', validation: '' }], ]; } getAddNewLabel() { return 'Run Payroll'; } createTable(elementId) { $('#payday_all').off(); super.createTable(elementId); $('#payday_all').off().on('click', function () { if ($(this).is(':checked')) { $('.paydayCheck').prop('checked', true); } else { $('.paydayCheck').prop('checked', false); } }); } getActionButtonsHtml(id, data) { const editButton = ''; let html = '
_edit_
'; html = html.replace('_edit_', editButton); html = html.replace(/_id_/g, id); html = html.replace(/_BASE_/g, this.baseUrl); return html; } getActionButtonHeader() { return { sTitle: '', sClass: 'center' }; } } /** * PayrollAdapter */ class PayrollAdapter extends AdapterBase { getDataMapping() { return [ 'id', 'name', 'pay_period', 'department', 'date_start', 'date_end', 'status', ]; } getHeaders() { return [ { sTitle: 'ID', bVisible: false }, { sTitle: 'Name' }, { sTitle: 'Pay Frequency' }, { sTitle: 'Department' }, { sTitle: 'Date Start' }, { sTitle: 'Date End' }, { sTitle: 'Status' }, ]; } getFormFields() { return [ ['id', { label: 'ID', type: 'hidden' }], ['name', { label: 'Name', type: 'text' }], ['pay_period', { label: 'Pay Frequency', type: 'select', 'remote-source': ['PayFrequency', 'id', 'name'], sort: 'none', }], ['deduction_group', { label: 'Payroll Group', type: 'select', 'remote-source': ['DeductionGroup', 'id', 'name'], sort: 'none', }], ['payslipTemplate', { label: 'Payslip Template', type: 'select', 'remote-source': ['PayslipTemplate', 'id', 'name'] }], ['department', { label: 'Department', type: 'select2', 'remote-source': ['CompanyStructure', 'id', 'title'], sort: 'none', }], ['date_start', { label: 'Start Date', type: 'date', validation: '' }], ['date_end', { label: 'End Date', type: 'date', validation: '' }], // [ "column_template", {"label":"Report Column Template","type":"select","remote-source":["PayrollColumnTemplate","id","name"]}], ['columns', { label: 'Payroll Columns', type: 'select2multi', 'remote-source': ['PayrollColumn', 'id', 'name'] }], ['status', { label: 'Status', type: 'select', source: [['Draft', 'Draft'], ['Completed', 'Completed']], sort: 'none', }], ]; } postRenderForm(object, $tempDomObj) { if (object != null && object !== undefined && object.id !== undefined && object.id != null) { $tempDomObj.find('#pay_period').attr('disabled', 'disabled'); $tempDomObj.find('#department').attr('disabled', 'disabled'); // $tempDomObj.find("#date_start").attr('disabled','disabled'); // $tempDomObj.find("#date_end").attr('disabled','disabled'); // $tempDomObj.find("#column_template").attr('disabled','disabled'); } } process(id, status) { // eslint-disable-next-line no-global-assign modJs = modJsList.tabPayrollData; modJs.setCurrentPayroll(id); $('#Payroll').hide(); $('#PayrollData').show(); $('#PayrollDataButtons').show(); if (status === 'Completed') { $('.completeBtnTable').hide(); $('.saveBtnTable').hide(); } else { $('.completeBtnTable').show(); $('.saveBtnTable').show(); } modJs.get([]); } getActionButtonsHtml(id, data) { const editButton = ''; const processButton = ''; const deleteButton = ''; const cloneButton = ''; let html = '
_edit__process__clone__delete_
'; if (this.showAddNew) { html = html.replace('_clone_', cloneButton); } else { html = html.replace('_clone_', ''); } if (this.showDelete) { html = html.replace('_delete_', deleteButton); } else { html = html.replace('_delete_', ''); } if (this.showEdit) { html = html.replace('_edit_', editButton); } else { html = html.replace('_edit_', ''); } html = html.replace('_process_', processButton); html = html.replace(/_id_/g, id); html = html.replace(/_status_/g, data[6]); html = html.replace(/_BASE_/g, this.baseUrl); return html; } get(callBackData) { $('#PayrollData').hide(); $('#PayrollForm').hide(); $('#PayrollDataButtons').hide(); $('#Payroll').show(); modJsList.tabPayrollData.setCurrentPayroll(null); super.get(callBackData); } getHelpLink() { return 'https://icehrm.gitbook.io/icehrm/payroll-and-expenses/payroll-management'; } } /** * PayrollDataAdapter */ class PayrollDataAdapter extends TableEditAdapter { constructor(endPoint, tab, filter, orderBy) { super(endPoint, tab, filter, orderBy); this.cellDataUpdates = {}; this.payrollId = null; } validateCellValue(element, evt, newValue) { modJs.addCellDataUpdate(element.data('colId'), element.data('rowId'), newValue); return true; } setCurrentPayroll(val) { this.payrollId = val; } addAdditionalRequestData(type, req) { if (type === 'updateData') { req.payrollId = this.payrollId; } else if (type === 'updateAllData') { req.payrollId = this.payrollId; } else if (type === 'getAllData') { req.payrollId = this.payrollId; } return req; } modifyCSVHeader(header) { header.unshift(''); return header; } getCSVData() { let csv = ''; for (let i = 0; i < this.csvData.length; i++) { csv += this.csvData[i].join(','); if (i < this.csvData.length - 1) { csv += '\r\n'; } } return csv; } downloadPayroll() { const element = document.createElement('a'); element.setAttribute('href', `data:text/plain;charset=utf-8,${encodeURIComponent(this.getCSVData())}`); element.setAttribute('download', `payroll_${this.payrollId}.csv`); element.style.display = 'none'; document.body.appendChild(element); element.click(); document.body.removeChild(element); } getHelpLink() { return 'https://icehrm.gitbook.io/icehrm/payroll-and-expenses/payroll-management'; } } /** * PayrollColumnAdapter */ class PayrollColumnAdapter extends AdapterBase { constructor(endPoint, tab, filter, orderBy) { super(endPoint, tab, filter, orderBy); this.codeMirror = CodeMirror; } getDataMapping() { return [ 'id', 'name', 'colorder', 'calculation_hook', 'deduction_group', 'editable', 'enabled', ]; } getHeaders() { return [ { sTitle: 'ID', bVisible: false }, { sTitle: 'Name' }, { sTitle: 'Column Order' }, { sTitle: 'Calculation Method' }, { sTitle: 'Payroll Group' }, { sTitle: 'Editable' }, { sTitle: 'Enabled' }, ]; } getFormFields() { const fucntionColumnList = ['calculation_columns', { label: 'Calculation Columns', type: 'datagroup', form: [ ['name', { label: 'Name', type: 'text', validation: '' }], ['column', { label: 'Column', type: 'select2', 'remote-source': ['PayrollColumn', 'id', 'name'] }], ], html: '
#_delete_##_edit_#
#_renderFunction_#
', validation: 'none', render(item) { const output = `Variable:${item.name}`; return output; }, }]; return [ ['id', { label: 'ID', type: 'hidden' }], ['name', { label: 'Name', type: 'text', validation: '' }], ['calculation_hook', { label: 'Predefined Calculations', type: 'select2', 'allow-null': true, 'null-label': 'None', 'remote-source': ['CalculationHook', 'code', 'name'], }], ['deduction_group', { label: 'Payroll Group', type: 'select2', 'allow-null': true, 'null-label': 'Common', 'remote-source': ['DeductionGroup', 'id', 'name'], }], ['salary_components', { label: 'Salary Components', type: 'select2multi', 'remote-source': ['SalaryComponent', 'id', 'name'] }], ['deductions', { label: 'Calculation Method', type: 'select2multi', 'remote-source': ['Deduction', 'id', 'name'] }], ['add_columns', { label: 'Columns to Add', type: 'select2multi', 'remote-source': ['PayrollColumn', 'id', 'name'] }], ['sub_columns', { label: 'Columns to Subtract', type: 'select2multi', 'remote-source': ['PayrollColumn', 'id', 'name'] }], ['colorder', { label: 'Column Order', type: 'text', validation: 'number' }], ['editable', { label: 'Editable', type: 'select', source: [['Yes', 'Yes'], ['No', 'No']] }], ['enabled', { label: 'Enabled', type: 'select', source: [['Yes', 'Yes'], ['No', 'No']] }], ['default_value', { label: 'Default Value', type: 'text', validation: '' }], fucntionColumnList, ['function_type', { label: 'Function Type', type: 'select', source: [['Simple', 'Simple']] }], ['calculation_function', { label: 'Function', type: 'code', validation: 'none' }], ]; } getFilters() { return [ ['deduction_group', { label: 'Payroll Group', type: 'select2', 'allow-null': false, 'remote-source': ['DeductionGroup', 'id', 'name'], }], ]; } getHelpLink() { return 'https://icehrm.gitbook.io/icehrm/payroll-and-expenses/payroll-management'; } } /** * PayrollColumnTemplateAdapter */ class PayrollColumnTemplateAdapter extends AdapterBase { getDataMapping() { return [ 'id', 'name', ]; } getHeaders() { return [ { sTitle: 'ID', bVisible: true }, { sTitle: 'Name' }, ]; } getFormFields() { return [ ['id', { label: 'ID', type: 'hidden' }], ['name', { label: 'Name', type: 'text', validation: '' }], ['columns', { label: 'Payroll Columns', type: 'select2multi', 'remote-source': ['PayrollColumn', 'id', 'name'] }], ]; } } /* * PayrollEmployeeAdapter */ class PayrollEmployeeAdapter extends AdapterBase { getDataMapping() { return [ 'id', 'employee', 'pay_frequency', 'deduction_group', 'currency', ]; } getHeaders() { return [ { sTitle: 'ID', bVisible: false }, { sTitle: 'Employee' }, { sTitle: 'Pay Frequency' }, { sTitle: 'Payroll Group' }, { sTitle: 'Currency' }, ]; } getFormFields() { return [ ['id', { label: 'ID', type: 'hidden' }], ['employee', { label: 'Employee', type: 'select2', 'remote-source': ['Employee', 'id', 'first_name+last_name'] }], ['pay_frequency', { label: 'Pay Frequency', type: 'select2', 'remote-source': ['PayFrequency', 'id', 'name'] }], ['currency', { label: 'Currency', type: 'select2', 'remote-source': ['CurrencyType', 'id', 'code'] }], ['deduction_group', { label: 'Payroll Group', type: 'select2', 'allow-null': true, 'null-label': 'None', 'remote-source': ['DeductionGroup', 'id', 'name'], }], ['deduction_exemptions', { label: 'Calculation Exemptions', type: 'select2multi', 'remote-source': ['Deduction', 'id', 'name'], validation: 'none', }], ['deduction_allowed', { label: 'Calculations Assigned', type: 'select2multi', 'remote-source': ['Deduction', 'id', 'name'], validation: 'none', }], ]; } getFilters() { return [ ['employee', { label: 'Employee', type: 'select2', 'remote-source': ['Employee', 'id', 'first_name+last_name'] }], ]; } } /** * DeductionAdapter */ class DeductionAdapter extends AdapterBase { getDataMapping() { return [ 'id', 'name', 'deduction_group', ]; } getHeaders() { return [ { sTitle: 'ID', bVisible: false }, { sTitle: 'Name' }, { sTitle: 'Payroll Group' }, ]; } getFormFields() { const rangeAmounts = ['rangeAmounts', { label: 'Calculation Process', type: 'datagroup', form: [ ['lowerCondition', { label: 'Lower Limit Condition', type: 'select', source: [['No Lower Limit', 'No Lower Limit'], ['gt', 'Greater than'], ['gte', 'Greater than or Equal']] }], ['lowerLimit', { label: 'Lower Limit', type: 'text', validation: 'float' }], ['upperCondition', { label: 'Upper Limit Condition', type: 'select', source: [['No Upper Limit', 'No Upper Limit'], ['lt', 'Less than'], ['lte', 'Less than or Equal']] }], ['upperLimit', { label: 'Upper Limit', type: 'text', validation: 'float' }], ['amount', { label: 'Value', type: 'text', validation: '' }], ], html: '
#_delete_##_edit_#
#_renderFunction_#
', validation: 'none', 'custom-validate-function': function (data) { const res = {}; res.valid = true; if (data.lowerCondition === 'No Lower Limit') { data.lowerLimit = 0; } if (data.upperCondition === 'No Upper Limit') { data.upperLimit = 0; } res.params = data; return res; }, render(item) { let output = ''; const getSymbol = function (text) { const map = {}; map.gt = '>'; map.gte = '>='; map.lt = '<'; map.lte = '<='; return map[text]; }; if (item.lowerCondition !== 'No Lower Limit') { output += `${item.lowerLimit} ${getSymbol(item.lowerCondition)} `; } if (item.upperCondition !== 'No Upper Limit') { output += ' and '; output += `${getSymbol(item.upperCondition)} ${item.upperLimit} `; } if (output === '') { return `Deduction is ${item.amount} for all ranges`; } return `If salary component ${output} deduction is ${item.amount}`; }, }]; return [ ['id', { label: 'ID', type: 'hidden' }], ['name', { label: 'Name', type: 'text', validation: '' }], ['componentType', { label: 'Salary Component Type', type: 'select2multi', 'allow-null': true, 'remote-source': ['SalaryComponentType', 'id', 'name'], }], ['component', { label: 'Salary Component', type: 'select2multi', 'allow-null': true, 'remote-source': ['SalaryComponent', 'id', 'name'], }], ['payrollColumn', { label: 'Payroll Report Column', type: 'select2', 'allow-null': true, 'remote-source': ['PayrollColumn', 'id', 'name'], }], rangeAmounts, ['deduction_group', { label: 'Payroll Group', type: 'select2', 'allow-null': false, 'remote-source': ['DeductionGroup', 'id', 'name'], }], ]; } } /* * DeductionGroupAdapter */ class DeductionGroupAdapter extends AdapterBase { getDataMapping() { return [ 'id', 'name', 'description', ]; } getHeaders() { return [ { sTitle: 'ID', bVisible: false }, { sTitle: 'Name' }, { sTitle: 'Details' }, ]; } getFormFields() { return [ ['id', { label: 'ID', type: 'hidden' }], ['name', { label: 'Name', type: 'text', validation: '' }], ['description', { label: 'Details', type: 'textarea', validation: 'none' }], ]; } getActionButtonsHtml(id) { let html = '
' + '' + '' + '' + '
'; html = html.replace(/_id_/g, id); html = html.replace(/_BASE_/g, this.baseUrl); return html; } deletePayrollGroup(id) { if (confirm('Are you sure you want to delete this payroll group? Deleting the payroll group will delete all the Payroll columns and Saved calculations attached to this Payroll Group')) { // Terminate } else { return; } const params = {}; params.id = id; const reqJson = JSON.stringify(params); const callBackData = []; callBackData.callBackData = []; callBackData.callBackSuccess = 'deletePayrollGroupSuccessCallback'; callBackData.callBackFail = 'deletePayrollGroupFailCallback'; this.customAction('deletePayrollGroup', 'admin=payroll', reqJson, callBackData); } deletePayrollGroupSuccessCallback(callBackData) { this.showMessage('Success', 'Payroll Group Deleted '); this.get([]); } deletePayrollGroupFailCallback(callBackData) { this.showMessage('Error occured while deleting Payroll Group', callBackData); } } /* * PayslipTemplateAdapter */ class PayslipTemplateAdapter extends AdapterBase { getDataMapping() { return [ 'id', 'name', ]; } getHeaders() { return [ { sTitle: 'ID', bVisible: false }, { sTitle: 'Name' }, ]; } getFormFields() { const payslipFields = ['data', { label: 'Payslip Fields', type: 'datagroup', form: [ ['type', { label: 'Type', type: 'select', sort: 'none', source: [['Payroll Column', 'Payroll Column'], ['Text', 'Text'], ['Company Name', 'Company Name'], ['Company Logo', 'Company Logo'], ['Separators', 'Separators']], }], ['payrollColumn', { label: 'Payroll Column', type: 'select2', sort: 'none', 'allow-null': true, 'null-label': 'None', 'remote-source': ['PayrollColumn', 'id', 'name'], }], ['label', { label: 'Label', type: 'text', validation: 'none' }], ['text', { label: 'Text', type: 'textarea', validation: 'none' }], ['status', { label: 'Status', type: 'select', sort: 'none', source: [['Show', 'Show'], ['Hide', 'Hide']], }], ], // "html":'
#_delete_##_edit_#
Type#_type_#
Label#_label_#
Text#_text_#
Font Size#_fontSize_#
Font Style#_fontStyle_#
Font Color#_fontColor_#
Status#_status_#
', html: '
#_delete_##_edit_#
#_type_# #_label_#
#_text_#
', validation: 'none', 'custom-validate-function': function (data) { const res = {}; res.valid = true; if (data.type === 'Payroll Column') { if (data.payrollColumn === 'NULL') { res.valid = false; res.message = 'Please select payroll column'; } } else { data.payrollColumn = 'NULL'; } if (data.type === 'Text') { if (data.text === '') { res.valid = false; res.message = 'Text can not be empty'; } } res.params = data; return res; }, }]; return [ ['id', { label: 'ID', type: 'hidden' }], ['name', { label: 'Name', type: 'text', validation: '' }], payslipFields, ]; } } module.exports = { PaydayAdapter, PayrollAdapter, PayrollDataAdapter, PayrollColumnAdapter, PayrollColumnTemplateAdapter, PayrollEmployeeAdapter, DeductionAdapter, DeductionGroupAdapter, PayslipTemplateAdapter, };