![]() System : Linux absol.cf 5.4.0-198-generic #218-Ubuntu SMP Fri Sep 27 20:18:53 UTC 2024 x86_64 User : www-data ( 33) PHP Version : 7.4.33 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare, Directory : /var/www/html/keeview_app/html/theme/mobile/ |
Upload File : |
hr.pay_sheet.denyPay_sheet = function(host, id, comment){ ModalElement.show_loading(); FormClass.api_call({ url: "pay_sheet_deny.php", params: [ {name: "pay_sheetid", value: id}, {name: "employeeid", value: host.employeeOfMe[0]}, {name: "employee_peopleid", value: host.peopleOfMe}, {name: "comment", value: comment} ], func: function(success, message){ if (success){ if (message.substr(0, 2) == "ok"){ var st = EncodingClass.string.toVariable(message.substr(2)); host.dataPay_sheetEdit = st.data; delete st.data; contentModule.makeDatabaseContent(host, st); host.redrawViewFunc(); } else if (message == "failed_id"){ ModalElement.alert({message: LanguageModule.text("war_txt_failed_data")}); } else { ModalElement.alert({message: message}); } } else { ModalElement.alert({message: message}); } } }); }; hr.pay_sheet.denyPay_sheetConfirm = function(host, id){ var comment_input = DOMElement.textarea({ attrs: { className: "cardSimpleTextarea", style: { minWidth: "250px", width: "100%", height: "100px" } } }); ModalElement.showWindow({ title: LanguageModule.text("war_title_deny_pay_sheet"), bodycontent: DOMElement.div({ children: [ DOMElement.div({ attrs: { style: { height: "var(--control-height)", lineHeight: "var(--control-height)", width: "300px" } }, text: LanguageModule.text("txt_reason_deny") }), comment_input ] }), buttonlist: [ { text: LanguageModule.text("txt_save"), onclick: function(){ ModalElement.close(); var comment = comment_input.value.trim(); hr.pay_sheet.denyPay_sheet(host, id, comment); } }, { text: LanguageModule.text("txt_cancel"), onclick: function(){ ModalElement.close(); } } ] }); comment_input.focus(); }; hr.pay_sheet.approvalPay_sheet = function(host, id){ ModalElement.show_loading(); FormClass.api_call({ url: "pay_sheet_approval.php", params: [ {name: "pay_sheetid", value: id}, {name: "employeeid", value: host.employeeOfMe[0]}, {name: "employee_peopleid", value: host.peopleOfMe} ], func: function(success, message){ if (success){ if (message.substr(0, 2) == "ok"){ var st = EncodingClass.string.toVariable(message.substr(2)); host.dataPay_sheetEdit = st.data; delete st.data; contentModule.makeDatabaseContent(host, st); host.redrawViewFunc(); } else if (message == "failed_id"){ ModalElement.alert({message: LanguageModule.text("war_txt_failed_data")}); } else { ModalElement.alert({message: message}); } } else { ModalElement.alert({message: message}); } } }); }; hr.pay_sheet.getDataFormPolicy = function(host, peopleIdList, list_type){ return new Promise(function(resolve, reject){ FormClass.api_call({ url: "database_load.php", params: [ {name: "task", value: "pay_sheet_load_list_by_employeeid_list_and_cycle"}, {name: "data", value: EncodingClass.string.fromVariable({ list_type: list_type, peopleIdList: peopleIdList, cycleid: host.dataPay_sheetEdit.cycleid, payroll_date: contentModule.getDateFrom1970(host.dataPay_sheetEdit.payroll_date) })} ], func: function(success, message){ if (success){ if (message.substr(0,2) == "ok"){ var content = EncodingClass.string.toVariable(message.substr(2)); var host1 = {database: {}}; contentModule.makeDatabaseContent(host1, content); var policyDic = contentModule.makeDictionaryIndex(host1.database.policies.items); var listDic = {}; host1.database.list.items.forEach(function(item){ listDic[item.id] = item.policyid; }); var data = {}; host1.database.list_details.items.forEach(function(item){ var policyid = listDic[item.listid]; if (policyid === undefined) return; if (!data[policyid]){ var pIndex = policyDic[policyid]; if (pIndex === undefined) return; data[policyid] = EncodingClass.string.duplicate(host1.database.policies.items[pIndex]); data[policyid].employees = {}; } if (!data[policyid].employees[item.employee_peopleid]){ data[policyid].employees[item.employee_peopleid] = 0; } data[policyid].employees[item.employee_peopleid] += item.amount; }); host.dataPay_sheetPolicy[list_type] = data; resolve(); } else if (message == "no_list"){ resolve(); return; } else { ModalElement.alert({message: message}); } } else { ModalElement.alert({message: message}); } } }); }); }; hr.pay_sheet.loadTaxPolicyApplyToEmployee = function(host, peopleIdList){ return new Promise(function(resolve, reject){ FormClass.api_call({ url: "database_load.php", params: [ {name: "task", value: "pay_sheet_load_tax_policy_apply_to_employee_by_peopleIdList"}, {name: "peopleIdList", value: EncodingClass.string.fromVariable(peopleIdList)} ], func: function(success, message){ if (success){ if (message.substr(0,2) == "ok"){ var content = EncodingClass.string.toVariable(message.substr(2)); var host1 = {database: {}}; contentModule.makeDatabaseContent(host1, content); host1.database.tax_policies.items.forEach(function(item){ if (item.tax_type == "progressive_tax"){ item.tax_rate_progressive_tax = EncodingClass.string.toVariable(item.tax_rate_progressive_tax); item.tax_rate_progressive_tax.sort(function(a, b){ return a.tax_rate_lines_amount - b.tax_rate_lines_amount; }); } }); var policyDic = contentModule.makeDictionaryIndex(host1.database.tax_policies.items); host.paysheetConfig.tax = {}; host1.database.employee_policies.items.forEach(function(item){ var k = policyDic[item.policyid]; var eData = host.employee_peopleDic[item.employee_peopleid]; if (k >= 0) host.paysheetConfig.tax[eData.code] = host1.database.tax_policies.items[k]; }); resolve(); } else { ModalElement.alert({message: message}); } } else { ModalElement.alert({message: message}); } } }); }); }; hr.pay_sheet.deletePay_sheet = function(host, id){ return new Promise(function(resolve,reject){ ModalElement.show_loading(); FormClass.api_call({ url: "pay_sheet_delete.php", params: [{name: "id", value: id}], func: function(success, message){ ModalElement.close(-1); if (success){ if (message.substr(0, 2) == "ok"){ var index = host.database.pay_sheet.getIndex(id); host.database.pay_sheet.items.splice(index, 1); resolve(); } else if (message == "lock_system"){ ModalElement.alert({message: LanguageModule.text("war_txt_system_lock")}); } else if (message == "failed_used"){ ModalElement.alert({ message: LanguageModule.text("war_txt_can_not_delete") }); } else { ModalElement.alert({message: message}); } } else { ModalElement.alert({message: message}); } } }); }); }; hr.pay_sheet.deletePay_sheetConfirm = function(host, id){ return new Promise(function(resolve,reject){ var index = host.database.pay_sheet.getIndex(id); ModalElement.question({ title: LanguageModule.text("war_title_delete_pay_sheet"), message: LanguageModule.text2("war_txt_detele", [host.database.pay_sheet.items[index].name]), onclick: function(sel){ if (sel == 0){ hr.pay_sheet.deletePay_sheet(host, id).then(function(value){ resolve(value); }); } } }); }); }; hr.pay_sheet.addPay_sheetSubmit = function(host, data){ return new Promise(function(resolve,reject){ var saveFunc = function(){ ModalElement.show_loading(); FormClass.api_call({ url: "pay_sheet_save.php", params: [{name: "data", value: EncodingClass.string.fromVariable(data)}], func: function(success, message){ ModalElement.close(-1); if (success){ if (message.substr(0, 2) == "ok"){ var st = EncodingClass.string.toVariable(message.substr(2)); if (data.id != 0){ var index = host.database.pay_sheet.getIndex(id); host.database.pay_sheet.items[index] = st; host.dataPay_sheetEdit = host.database.pay_sheet.items[index]; } else { var id = st.id; data.id = id; host.id = id; host.database.pay_sheet.items.push(st); host.dataPay_sheetEdit = st; } hr.pay_sheet.redraw(host); resolve(); } else if (message == "lock_system"){ ModalElement.alert({message: LanguageModule.text("war_txt_system_lock")}); } else if (message == "deleted" || message == "edited"){ ModalElement.alert({ message: LanguageModule.text("war_txt_failed_ver_reload_data") }); } else { ModalElement.alert({message: message}); } } else { ModalElement.alert({message: message}); } } }); }; if (data.id != 0){ var ischange = contentModule.isChanged(host.dataPay_sheetEdit, data, ["name", "cycleid"]); if (!ischange){ resolve(); return; } data.ver = host.dataPay_sheetEdit.ver; } else { var orgDic = contentModule.makeDictionaryIndex(host.database.orgs.items); var employeeDic = contentModule.makeDictionaryIndex(host.database.employees.items); var peopleIdList = [], oIndex, empIndex; for (var i = 0; i < host.database.payroll_cycle_orgs.items.length; i++){ if (host.database.payroll_cycle_orgs.items[i].cycleid != data.cycleid) continue; if (host.database.payroll_cycle_orgs.items[i].orgid < 0){ empIndex = [-host.database.payroll_cycle_orgs.items[i].orgid]; if (empIndex >= 0 && host.database.employees.items[empIndex].available) peopleIdList.push(host.database.employees.items[empIndex].peopleid); } else { oIndex = orgDic[host.database.payroll_cycle_orgs.items[i].orgid]; var orgIDList = contentModule.getDepartmentIDList(host, oIndex); for (var i = 0; i < orgIDList.length; i++){ oIndex = orgDic[orgIDList[i]]; host.database.orgs.items[oIndex].employeeIndexList.forEach(function(empIndex){ if (!host.database.employees.items[empIndex].available) return; peopleIdList.push(host.database.employees.items[empIndex].peopleid); }); } } } peopleIdList.sort(function(a, b){ return a - b; }); data.peopleIdList = peopleIdList; if (peopleIdList.length > 0){ ModalElement.show_loading(); FormClass.api_call({ url: "database_load.php", params: [ {name: "task", value: "check_employee_has_pay_sheet"}, {name: "peopleIdList", value: EncodingClass.string.fromVariable(peopleIdList)}, {name: "payroll_date", value: EncodingClass.string.fromVariable(data.payroll_date)} ], func: function(success, message){ ModalElement.close(-1); if (success){ if (message.substr(0, 2) == "ok"){ var st = EncodingClass.string.toVariable(message.substr(2)); if (st.count > 0){ saveFunc(); } else { var time_input = absol.buildDom({ tag: "dateinput", props: { value: new Date(), notNull: true } }); ModalElement.showWindow({ bodycontent: DOMElement.table({ data: [ [{text: "Thời gian bắt đầu tính lương"}], [{attrs: {style: {height: "var(--control-verticle-distance-2)"}}}], [{attrs: {align: "center"}, children: [time_input]}] ] }), buttonlist: [ { text: LanguageModule.text("txt_ok"), onclick: function(){ data.starttime = time_input.value; ModalElement.close(); saveFunc(); } }, { text: LanguageModule.text("txt_cancel"), onclick: function(){ ModalElement.close(); } } ] }); } } else { ModalElement.alert({message: message}); } } else { ModalElement.alert({message: message}); } } }); return; } } saveFunc(); }); }; hr.pay_sheet.addPay_sheetClose = function(host, data){ return new Promise(function(resolve, reject){ if (data.id != 0){ var oldData = host.dataPay_sheetEdit; var ischange = contentModule.isChanged(oldData, data, ["name", "cycleid"]); if (!ischange){ resolve(); return; } } contentModule.questionChange({ onclick: function(sel){ if (sel == 0){ hr.pay_sheet.addPay_sheetSubmit(host, data); } else if (sel == 1){ resolve(); } } }); }); }; hr.pay_sheet.redrawDetails = function(host, id){ host.id = id; var payroll_cycleItems = []; for (var i = 0; i < host.database.payroll_cycle.items.length; i++){ payroll_cycleItems.push({ value: host.database.payroll_cycle.items[i].id, text: contentModule.getPayRollCycleView(host, host.database.payroll_cycle.items[i].id), noSelect: host.database.payroll_cycle.items[i].expired }); } theme.formPay_sheetEdit({ id: id, data: id > 0? host.dataPay_sheetEdit : "", payroll_cycleItems: payroll_cycleItems, func: { get_cycle_data_by_cycleid: function(cycleid){ if (cycleid == 0) return {}; var cIndex = host.database.payroll_cycle.getIndex(cycleid); return host.database.payroll_cycle.items[cIndex]; }, save: function(data){ return hr.pay_sheet.addPay_sheetSubmit(host, data); }, cancel: function(data){ return hr.pay_sheet.addPay_sheetClose(host, data); } } }); }; hr.pay_sheet.loadPay_sheetData = function(host, id){ return new Promise(function(resolve, reject){ FormClass.api_call({ url: "database_load.php", params: [ {name: "task", value: "pay_sheet_load_by_id"}, {name: "id", value: id} ], func: function(success, message){ if (success){ if (message.substr(0, 2) == "ok"){ var st = EncodingClass.string.toVariable(message.substr(2)); host.dataPay_sheetEdit = st; resolve(); } else if (message == "war_txt_failed_data"){ ModalElement.alert({ message: LanguageModule.text("war_txt_failed_data"), func: function(){ hr.pay_sheet.init(host); } }); } else { ModalElement.alert({message: message}); } } else { ModalElement.alert({message: message}); } } }); }); }; hr.pay_sheet.loadPay_sheetDataView = function(host, id){ return new Promise(function(resolve, reject){ FormClass.api_call({ url: "database_load.php", params: [ {name: "task", value: "pay_sheet_load_view_by_id"}, {name: "id", value: id} ], func: function(success, message){ if (success){ if (message.substr(0, 2) == "ok"){ var st = EncodingClass.string.toVariable(message.substr(2)); host.dataPay_sheetEdit = st.data; delete st.data; contentModule.makeDatabaseContent(host, st); host.dataPay_sheetEdit.hasApproval = host.database.pay_sheet_approvers.items.length > 0; host.privApproval = false; if (host.dataPay_sheetEdit.status == 0){ var ex = -1; host.database.payroll_cycle_approvers.items.forEach(function(item, index){ if (item.employee_peopleid == host.peopleOfMe){ ex = index; } }); if (ex >= 0){ var dic = {}; host.database.pay_sheet_approvers.items.forEach(function(item){ dic[item.employee_peopleid] = item.status; }); console.log(dic); console.log(host.peopleOfMe); var cIndex = host.database.payroll_cycle.getIndex(host.dataPay_sheetEdit.cycleid); switch (host.database.payroll_cycle.items[cIndex].approval_method) { case "sequence": if (!dic[host.peopleOfMe]){ var prevDone = true; for (var i = 0; i < ex; i++){ if (!dic[host.database.payroll_cycle_approvers.items[i].employee_peopleid]){ prevDone = false; break; } } if (prevDone) host.privApproval = true; } break; case "parallel": if (!dic[host.peopleOfMe]) host.privApproval = true; break; case "one_approver": host.privApproval = true; break; default: } } } resolve(); } else if (message == "war_txt_failed_data"){ ModalElement.alert({ message: LanguageModule.text("war_txt_failed_data"), func: function(){ hr.pay_sheet.init(host); } }); } else { ModalElement.alert({message: message}); } } else { ModalElement.alert({message: message}); } } }); }); }; hr.pay_sheet.addPay_sheet = function(host, id){ if (host.database.payroll_cycle.items.length == 0){ ModalElement.alert({message: "Chưa có chu kỳ tính lương"}); return; } if (id == 0){ hr.pay_sheet.redrawDetails(host, id); } else { if (host.database.pay_sheet.getIndex(id) < 0) return; ModalElement.show_loading(); hr.pay_sheet.loadPay_sheetData(host, id).then(function(){ ModalElement.close(-1); hr.pay_sheet.redrawDetails(host, id); }); } }; hr.pay_sheet.loadPay_sheet_employeesList = function(host, id){ return new Promise(function(resolve, reject){ FormClass.api_call({ url: "database_load.php", params: [ {name: "task", value: "pay_sheet_load_employees"}, {name: "id", value: id} ], func: function(success, message){ if (success){ if (message.substr(0, 2) == "ok"){ var st = EncodingClass.string.toVariable(message.substr(2)); contentModule.makeDatabaseContent(host, st); resolve(); } else { ModalElement.alert({message: message}); } } else { ModalElement.alert({message: message}); } } }); }); }; hr.pay_sheet.loadSalaryDecisionsByEmployeePeopleIdList = function(host, peopleIdList){ return new Promise(function(resolve, reject){ FormClass.api_call({ url: "database_load.php", params: [ {name: "task", value: "pay_sheet_load_salary_decisions"}, {name: "peopleIdList", value: EncodingClass.string.fromVariable(peopleIdList)} ], func: function(success, message){ if (success){ if (message.substr(0, 2) == "ok"){ for (var i = 0; i < host.database.employees.items.length; i++){ host.database.employees.items[i].basic_salary_amount = 0; host.database.employees.items[i].gross_salary_amount = 0; } var st = EncodingClass.string.toVariable(message.substr(2)); var eData; for (var i = 0; i < st.length; i++){ eData = host.employee_peopleDic[st[i].employee_peopleid]; if (eData){ eData.basic_salary_amount = st[i].basic_salary_amount; eData.gross_salary_amount = st[i].gross_salary_amount; } } resolve(); } else { ModalElement.alert({message: message}); } } else { ModalElement.alert({message: message}); } } }); }); }; hr.pay_sheet.loadStandard_workdaysConfig = function(host, peopleIdList){ return new Promise(function(resolve, reject){ FormClass.api_call({ url: "database_load.php", params: [ {name: "task", value: "load_standard_workday_by_peopleIdList"}, {name: "peopleIdList", value: EncodingClass.string.fromVariable(peopleIdList)} ], func: function(success, message){ if (success){ if (message.substr(0, 2) == "ok"){ var host1 = {database: {}}; var st = EncodingClass.string.toVariable(message.substr(2)); contentModule.makeDatabaseContent(host1, st); var dic = contentModule.makeDictionaryIndex(host1.database.standard_workday_policies.items); var peopleNeedLoadAssign = []; host1.database.employee_policies.items.forEach(function(item){ var k = dic[item.policyid]; if (k >= 0){ if (host1.database.standard_workday_policies.items[k].calculation == "total_shifts_assigned"){ peopleNeedLoadAssign.push(item.employee_peopleid); } } }); var cIndex = host.database.payroll_cycle.getIndex(host.dataPay_sheetEdit.cycleid); var cycle = host.database.payroll_cycle.items[cIndex].cycle; var payroll_date = EncodingClass.string.duplicate(host.dataPay_sheetEdit.payroll_date); var enddate = contentModule.getDateFrom1970(host.dataPay_sheetEdit.payroll_date); var startdate; if (cycle == "month"){ if (host.database.payroll_cycle.items[cIndex].payroll_date == 0){ startdate = new Date(payroll_date.setDate(0)); } else { startdate = absol.datetime.prevMonth(payroll_date); startdate = new Date(startdate.setDate(cycleData.payroll_date)); } } else { startdate = new Date(payroll_date.getTime() - 7*24*60*60*1000); } startdate = contentModule.getDateFrom1970(startdate) + 1; var f = function(){ var standard_workdayDic = {}; host1.database.standard_workday_policies.items.forEach(function(item){ if (item.calculation == "total_shifts_assigned") return; standard_workdayDic[item.calculation] = contentModule.getStandardWorkdayByCalculation(item, startdate, enddate); }); var policyDic = contentModule.makeDictionaryIndex(host1.database.standard_workday_policies.items); if (peopleNeedLoadAssign.length > 0){ contentModule.makeShiftsData(host1); host1.database.shifts.items.sort(function(a, b){ return b.fromdate - a.fromdate; }); var emp_assignDic = {}; host1.database.assign_employee_shifts.items.forEach(function(item){ if (!emp_assignDic[item.employee_peopleid]) emp_assignDic[item.employee_peopleid] = 0; var shiftContent = contentModule.getContentShiftFollowDateById(host1, item.shiftid, item.date); if (!shiftContent) return; var duration_h = contentModule.getOverTimeHoursHasShiftContent( host1, new Date(item.date*86400000), new Date(item.date*86400000), { dayOffset: item.time_in, duration: item.time_out - item.time_in }, shiftContent, item.ot_in_breaktime, ); var workdays = (duration_h/shiftContent.number_of_standard_working_hours)*shiftContent.number_of_work_days; emp_assignDic[item.employee_peopleid] += workdays; }); } host.standard_workdays = {}; host1.database.employee_policies.items.forEach(function(item){ var pIndex = policyDic[item.policyid]; if (pIndex >= 0){ if (host1.database.standard_workday_policies.items[pIndex].calculation == "total_shifts_assigned"){ host.standard_workdays[item.employee_peopleid] = emp_assignDic[item.employee_peopleid]; } else { host.standard_workdays[item.employee_peopleid] = standard_workdayDic[host1.database.standard_workday_policies.items[pIndex].calculation]; } } }); console.log(host.standard_workdays); resolve(); }; if (peopleNeedLoadAssign.length > 0){ FormClass.api_call({ url: "database_load.php", params: [ {name: "task", value: "load_assign_by_peopleIdList_in_time"}, {name: "peopleIdList", value: EncodingClass.string.fromVariable(peopleNeedLoadAssign)}, {name: "startdate", value: startdate}, {name: "enddate", value: enddate} ], func: function(success, message){ if (success){ if (message.substr(0, 2) == "ok"){ var content = EncodingClass.string.toVariable(message.substr(2)); contentModule.makeDatabaseContent(host1, content); f(); } else { ModalElement.alert({message: message}); } } else { ModalElement.alert({message: message}); } } }) } else { f(); } } else { ModalElement.alert({message: message}); } } else { ModalElement.alert({message: message}); } } }); }); }; hr.pay_sheet.loadActualWorkdays = function(host){ return new Promise(function(resolve, reject){ FormClass.api_call({ url: "database_load.php", params: [ {name: "task", value: "pay_sheet_load_timesheet"}, {name: "data", value: EncodingClass.string.fromVariable({ cycleid: host.dataPay_sheetEdit.cycleid, payroll_date: contentModule.getDateFrom1970(host.dataPay_sheetEdit.payroll_date) })} ], func: function(success, message){ if (success){ if (message.substr(0,2) == "ok"){ var content = EncodingClass.string.toVariable(message.substr(2)); contentModule.makeDatabaseContent(host, content); host.actual_workdays = {}; host.database.timesheet_employees.items.forEach(function(item){ host.actual_workdays[item.employee_peopleid] = item.workdays; }); resolve(); } else { ModalElement.alert({message: message}); } } else { ModalElement.alert({message: message}); } } }); }); }; hr.pay_sheet.reCalculatedPayByChange = function(host, peopleIdDic){ return new Promise(function(resolve, reject){ var f = function(){ var data = EncodingClass.string.duplicate(host.dataPay_sheetDetails); var listSetting = EncodingClass.string.duplicate(host.database.pay_sheet_column_configs.items); for (var i = 0; i < listSetting.length; i++){ if (listSetting[i].setting && (listSetting[i].setting.data == "formula")){ if (listSetting[i].setting.formula == "") listSetting[i].setting.formula = "0"; listSetting[i].setting.formula = MathClass.Expression.parse(listSetting[i].setting.formula); } } var pList = []; var t = contentModule.getCalOrderList(listSetting); if (!t.status){ ModalElement.close(-1); return; } var res = t.content; var dataInsert = [], dataUpdate = []; host.database.pay_sheet_employees.items.forEach(function(item){ if (!peopleIdDic[item.employee_peopleid]) return; var eData = host.employee_peopleDic[item.employee_peopleid]; if (!eData) return; var employee_code = eData.code; res.forEach(function(columnIndex){ var column_code = listSetting[columnIndex].code; var setting = listSetting[columnIndex].setting; if (setting){ switch (setting.data) { case "formula": pList.push(function(){ return new Promise(function(rs, rj){ data[item.employee_peopleid][column_code] = setting.formula.calc(function (varname) { if (data[item.employee_peopleid][varname] !== undefined){ if (EncodingClass.type.isNumber(data[item.employee_peopleid][varname]) || !absol.int.isNumber(data[item.employee_peopleid][varname])){ return data[item.employee_peopleid][varname]; } else { return contentModule.getValueFromMoneyFormat(data[item.employee_peopleid][varname]); } } return null; }); if (host.dataPay_sheetDetailsIdDic && host.dataPay_sheetDetailsIdDic[item.employee_peopleid] && host.dataPay_sheetDetailsIdDic[item.employee_peopleid][column_code]){ dataUpdate.push({ id: host.dataPay_sheetDetailsIdDic[item.employee_peopleid][column_code], employee_peopleid: item.employee_peopleid, code: column_code, content: EncodingClass.string.fromVariable(data[item.employee_peopleid][column_code]) }); } else { dataInsert.push({ id: 0, pay_sheetid: host.dataPay_sheetEdit.id, employee_peopleid: item.employee_peopleid, code: column_code, content: EncodingClass.string.fromVariable(data[item.employee_peopleid][column_code]) }); } rs(); }); }); break; case "function": pList.push(function(){ return new Promise(function(rs, rj){ var args = []; setting.function.args.forEach(function(arg){ switch (arg.type) { case "number": case "string": args.push(arg.value); break; case "employee_code": args.push(employee_code); break; case "code_of_column": args.push(data[item.employee_peopleid][arg.value]); break; default: } }); contentModule.sclangCall(setting.function.functionid, {args: args}).then(function(value){ data[item.employee_peopleid][column_code] = value; if (host.dataPay_sheetDetailsIdDic && host.dataPay_sheetDetailsIdDic[item.employee_peopleid] && host.dataPay_sheetDetailsIdDic[item.employee_peopleid][column_code]){ dataUpdate.push({ id: host.dataPay_sheetDetailsIdDic[item.employee_peopleid][column_code], employee_peopleid: item.employee_peopleid, code: column_code, content: EncodingClass.string.fromVariable(data[item.employee_peopleid][column_code]) }); } else { dataInsert.push({ id: 0, pay_sheetid: host.dataPay_sheetEdit.id, employee_peopleid: item.employee_peopleid, code: column_code, content: EncodingClass.string.fromVariable(data[item.employee_peopleid][column_code]) }); } rs(); }); }); }); break; default: } } }); }); var finishedCal = pList.reduce(function(ac, item){ return ac.then(function(){ return item(); }); }, Promise.resolve()); finishedCal.then(function(){ if (dataInsert.length == 0 && dataUpdate.length == 0){ resolve(); return; } hr.pay_sheet.saveDataInsertUpdate(host, dataInsert, dataUpdate).then(function(){ resolve(); }); }); }; if (host.paysheetConfig.tax){ f(); } else { var peopleIdList = []; host.database.pay_sheet_employees.items.forEach(function(item){ if (!peopleIdDic[item.employee_peopleid]) return; peopleIdList.push(item.employee_peopleid); }); hr.pay_sheet.loadTaxPolicyApplyToEmployee(host, peopleIdList).then(function(){ f(); }); } }); }; hr.pay_sheet.saveDataInsertUpdate = function(host, dataInsert, dataUpdate){ return new Promise(function(resolve, reject){ FormClass.api_call({ url: "pay_sheet_save_employee_data_change.php", params: [ {name: "dataInsert", value: EncodingClass.string.fromVariable(dataInsert)}, {name: "dataUpdate", value: EncodingClass.string.fromVariable(dataUpdate)} ], func: function(success, message){ if (success){ if (message.substr(0, 2) == "ok"){ var st = EncodingClass.string.toVariable(message.substr(2)); for (var i = 0; i < dataUpdate.length; i++){ host.dataPay_sheetDetails[dataUpdate[i].employee_peopleid][dataUpdate[i].code] = EncodingClass.string.toVariable(dataUpdate[i].content); } for (var i = 0; i < st.length; i++){ if (!host.dataPay_sheetDetails[st[i].employee_peopleid]) host.dataPay_sheetDetails[st[i].employee_peopleid] = {}; host.dataPay_sheetDetails[st[i].employee_peopleid][st[i].code] = EncodingClass.string.toVariable(st[i].content); if (!host.dataPay_sheetDetailsIdDic[st[i].employee_peopleid]) host.dataPay_sheetDetailsIdDic[st[i].employee_peopleid] = {}; host.dataPay_sheetDetailsIdDic[st[i].employee_peopleid][st[i].code] = st[i].id } resolve(); } else { ModalElement.alert({message: message}); } } else { ModalElement.alert({message: message}); } } }); }); }; hr.pay_sheet.calculatedPay = function(host){ return new Promise(function(resolve, reject){ host.paysheetConfig = {}; host.dataPay_sheetPolicy = {}; var peopleIdList = []; for (var i = 0; i < host.database.pay_sheet_employees.items.length; i++){ peopleIdList.push(host.database.pay_sheet_employees.items[i].employee_peopleid); } var promiseList = [hr.pay_sheet.loadSalaryDecisionsByEmployeePeopleIdList(host, peopleIdList)]; promiseList.push(hr.pay_sheet.loadStandard_workdaysConfig(host, peopleIdList)); promiseList.push(hr.pay_sheet.loadActualWorkdays(host)); promiseList.push(hr.pay_sheet.loadTaxPolicyApplyToEmployee(host, peopleIdList)); host.database.pay_sheet_column_configs.items.forEach(function(item){ if (item.setting && item.setting.data == "policy"){ var policys = item.setting.policy.split("_"); var list_type = policys[0]; if (!host.dataPay_sheetPolicy[list_type]){ host.dataPay_sheetPolicy[list_type] = {}; promiseList.push(hr.pay_sheet.getDataFormPolicy(host, peopleIdList, list_type)); } } }); Promise.all(promiseList).then(function(values){ var listSetting = EncodingClass.string.duplicate(host.database.pay_sheet_column_configs.items); for (var i = 0; i < listSetting.length; i++){ if (listSetting[i].setting && (listSetting[i].setting.data == "formula")){ if (listSetting[i].setting.formula == "") listSetting[i].setting.formula = "0"; listSetting[i].setting.formula = MathClass.Expression.parse(listSetting[i].setting.formula); } } var pList = []; var t = contentModule.getCalOrderList(listSetting); if (!t.status){ ModalElement.close(-1); return; } var res = t.content; var data = {}; host.database.pay_sheet_employees.items.forEach(function(item){ var eData = host.employee_peopleDic[item.employee_peopleid]; if (!eData) return; var employee_code = eData.code; data[item.employee_peopleid] = {}; res.forEach(function(columnIndex){ var column_code = listSetting[columnIndex].code; switch (column_code) { case "EmployeeName": data[item.employee_peopleid][column_code] = eData.fullname; break; case "EmployeeCode": data[item.employee_peopleid][column_code] = eData.code; break; case "EmployeeDepartment": data[item.employee_peopleid][column_code] = host.database.orgs.items[eData.orgIndex].name; break; case "EmployeePosition": data[item.employee_peopleid][column_code] = eData.positionName; break; case "BasicSalary": data[item.employee_peopleid][column_code] = eData.basic_salary_amount; break; case "GrossSalary": data[item.employee_peopleid][column_code] = eData.gross_salary_amount; break; case "StandardWorkdays": data[item.employee_peopleid][column_code] = host.standard_workdays[item.employee_peopleid]? host.standard_workdays[item.employee_peopleid] : 0; break; case "ActualWorkdays": data[item.employee_peopleid][column_code] = host.actual_workdays[item.employee_peopleid]? host.actual_workdays[item.employee_peopleid] : 0; break; default: var setting = listSetting[columnIndex].setting; if (setting){ switch (setting.data) { case "direct_input": if (host.dataPay_sheetDetails && host.dataPay_sheetDetails[item.employee_peopleid] && host.dataPay_sheetDetails[item.employee_peopleid][column_code] !== undefined){ data[item.employee_peopleid][column_code] = host.dataPay_sheetDetails[item.employee_peopleid][column_code]; } else { data[item.employee_peopleid][column_code] = ""; } break; case "formula": pList.push(function(){ return new Promise(function(rs, rj){ data[item.employee_peopleid][column_code] = setting.formula.calc(function (varname) { if (data[item.employee_peopleid][varname] !== undefined){ if (EncodingClass.type.isNumber(data[item.employee_peopleid][varname]) || !absol.int.isNumber(data[item.employee_peopleid][varname])){ return data[item.employee_peopleid][varname]; } else { return contentModule.getValueFromMoneyFormat(data[item.employee_peopleid][varname]); } } return null; }); rs(); }); }); break; case "function": pList.push(function(){ return new Promise(function(rs, rj){ var args = []; setting.function.args.forEach(function(arg){ switch (arg.type) { case "number": case "string": args.push(arg.value); break; case "employee_code": args.push(employee_code); break; case "code_of_column": args.push(data[item.employee_peopleid][arg.value]); break; default: } }); contentModule.sclangCall(setting.function.functionid, {args: args}).then(function(value){ data[item.employee_peopleid][column_code] = value; rs(); }); }); }); break; case "policy": policys = setting.policy.split("_"); var list_type = policys[0]; var policyid = parseInt(policys[1]); if (host.dataPay_sheetPolicy[list_type][policyid] && host.dataPay_sheetPolicy[list_type][policyid].employees[item.employee_peopleid]){ data[item.employee_peopleid][column_code] = host.dataPay_sheetPolicy[list_type][policyid].employees[item.employee_peopleid]; } else { data[item.employee_peopleid][column_code] = 0; } break; default: } } } }); }); var finishedCal = pList.reduce(function(ac, item){ return ac.then(function(){ return item(); }); }, Promise.resolve()); finishedCal.then(function(){ var dataSave = [], sIndex; host.database.pay_sheet_employees.items.forEach(function(item, index){ if (index%50 == 0){ dataSave.push([]); sIndex = dataSave.length - 1; } var employee_peopleid = item.employee_peopleid; host.database.pay_sheet_column_configs.items.forEach(function(itemSetting){ var column_code = itemSetting.code; dataSave[sIndex].push({ pay_sheetid: host.dataPay_sheetEdit.id, employee_peopleid: employee_peopleid, code: column_code, content: EncodingClass.string.fromVariable(data[employee_peopleid][column_code]) }); }); }); var finishedSave = dataSave.reduce(function(ac, item, index) { return ac.then(function(){ return new Promise(function(rs) { var params = [ {name: "data", value: EncodingClass.string.fromVariable(item)}, {name: "pay_sheetid", value: host.dataPay_sheetEdit.id} ]; if (index == 0) params.push({name: "del", value: 1}); if (index == dataSave.length - 1) params.push({name: "done", value: 1}); FormClass.api_call({ url: "pay_sheet_save_employee_data.php", params: params, func: function(success, message){ if (success){ if (message.substr(0, 2) == "ok"){ host.dataPay_sheetEdit.calculated = 1; rs(); } else { ModalElement.alert({message: message}); } } else { ModalElement.alert({message: message}); } } }); }); }); }, Promise.resolve()); finishedSave.then(function(){ resolve(); }); }); }); }); }; hr.pay_sheet.loadPay_sheetDataDetails = function(host, id){ return new Promise(function(resolve, reject){ FormClass.api_call({ url: "database_load.php", params: [ {name: "task", value: "pay_sheet_load_employee_data"}, {name: "pay_sheetid", value: id} ], func: function(success, message){ if (success){ if (message.substr(0, 2) == "ok"){ var st = EncodingClass.string.toVariable(message.substr(2)); contentModule.makeDatabaseContent(host, st); var data = {}; host.dataPay_sheetDetailsIdDic = {}; host.database.pay_sheet_employee_data.items.forEach(function(item){ item.content = EncodingClass.string.toVariable(item.content); if (!data[item.employee_peopleid]){ data[item.employee_peopleid] = {}; host.dataPay_sheetDetailsIdDic[item.employee_peopleid] = {}; } if (!data[item.employee_peopleid][item.code]){ data[item.employee_peopleid][item.code] = item.content; host.dataPay_sheetDetailsIdDic[item.employee_peopleid][item.code] = item.id; } }); resolve(data); } else { ModalElement.alert({message: message}); } } else { ModalElement.alert({message: message}); } } }); }); }; hr.pay_sheet.saveChangeDirectInput = function(host){ return new Promise(function(resolve, reject){ var peopleIdDic = {}; var dataInsert = [], dataUpdate = []; var peopleid, value; for (var i = 0; i < host.database.pay_sheet_employees.items.length; i++){ peopleid = host.database.pay_sheet_employees.items[i].employee_peopleid; if (!host.inputidboxesDirectInput[peopleid]) continue; host.database.pay_sheet_column_configs.items.forEach(function(item){ if (!host.inputidboxesDirectInput[peopleid][item.code]) return; value = host.inputidboxesDirectInput[peopleid][item.code].value.trim(); if (absol.int.isNumber(value)) value = contentModule.getValueFromMoneyFormat(value); if (host.dataPay_sheetDetailsIdDic[peopleid] && host.dataPay_sheetDetailsIdDic[peopleid][item.code]){ if (value != host.dataPay_sheetDetails[peopleid][item.code]){ dataUpdate.push({ id: host.dataPay_sheetDetailsIdDic[peopleid][item.code], employee_peopleid: peopleid, code: item.code, content: EncodingClass.string.fromVariable(value) }); peopleIdDic[peopleid] = true; } } else { if (value != ""){ dataInsert.push({ id: 0, pay_sheetid: host.dataPay_sheetEdit.id, employee_peopleid: peopleid, code: item.code, content: EncodingClass.string.fromVariable(value) }); peopleIdDic[peopleid] = true; } } }); } if (dataInsert.length == 0 && dataUpdate.length == 0){ resolve(); return; } hr.pay_sheet.saveDataInsertUpdate(host, dataInsert, dataUpdate).then(function(){ hr.pay_sheet.reCalculatedPayByChange(host, peopleIdDic).then(function(){ resolve(); }); }); }); }; hr.pay_sheet.showPay_sheet = function(host, id){ host.pay_sheetid = id; ModalElement.show_loading(); Promise.all([hr.pay_sheet.loadColumConfigs(host, id), hr.pay_sheet.loadPay_sheetDataView(host, id), hr.pay_sheet.loadPay_sheet_employeesList(host, id)]).then(function(values){ host.redrawViewFunc = function(){ var statusElt; switch (host.dataPay_sheetEdit.status) { case 0: statusElt = DOMElement.div({ attrs: { className: "hr-status-view-btn waiting-approval" }, text: LanguageModule.text("txt_waiting_approval") }); break; case 1: statusElt = DOMElement.div({ attrs: { className: "hr-status-view-btn approved" }, text: LanguageModule.text("txt_approved") }); break; case 2: statusElt = DOMElement.div({ attrs: { className: "hr-status-view-btn deny" }, text: LanguageModule.text("txt_deny") }); break; } DOMElement.removeAllChildren(button_header_ctn); button_header_ctn.appendChild(DOMElement.div({ attrs: {className: "single-button-header"}, children: [theme.backButton({ onclick: function(){ host.frameList.removeLast(); } })] })); if (host.dataPay_sheetEdit.hasApproval == 0){ button_header_ctn.appendChild( DOMElement.div({ attrs: {className: "single-button-header"}, children: [theme.addButton({ text: "Tính lại bảng lương", onclick: function(){ ModalElement.show_loading(); hr.pay_sheet.calculatedPay(host).then(function(value){ hr.pay_sheet.loadPay_sheetDataDetails(host, id).then(function(value){ saveBtnCtn.classList.remove("hidden"); host.dataPay_sheetDetails = value; ModalElement.close(-1); redrawTableFunc(); }); }); } })] }) ); var saveBtnCtn = DOMElement.div({ attrs: {className: "single-button-header hidden"}, children: [theme.saveButton({ onclick: function(){ ModalElement.show_loading(); hr.pay_sheet.saveChangeDirectInput(host).then(function(value){ ModalElement.close(-1); redrawTableFunc(); }); } })] }); button_header_ctn.appendChild(saveBtnCtn); if (host.privApproval){ button_header_ctn.appendChild(DOMElement.div({ attrs: {className: "single-button-header"}, children: [theme.approvalButton({ onclick: function(){ hr.pay_sheet.approvalPay_sheet(host, id); } })] })); button_header_ctn.appendChild(DOMElement.div({ attrs: {className: "single-button-header"}, children: [theme.denyButton({ onclick: function(){ hr.pay_sheet.denyPay_sheetConfirm(host, id); } })] })); } } var redrawTableFunc = function(){ var fontValue = getComputedStyle(document.body).getPropertyValue('--font'); host.inputidboxesDirectInput = {}; var data = host.dataPay_sheetDetails; var getRow = function(peopleid){ host.inputidboxesDirectInput[peopleid] = {}; function applyParam(elt){ return elt; }; var cells = [ { style: {textAlign: "center"}, render: function(tdElt){ tdElt.addChild(DOMElement.span({attrs: {className: "as-dt-row-index"}})); } } ]; host.database.pay_sheet_column_configs.items.forEach(function(item){ var value = ""; if (data[peopleid] && data[peopleid][item.code] !== undefined) value = data[peopleid][item.code]; var isNumber = 0; if (absol.int.isNumber(value)){ value = contentModule.moneyFormat2(value, 0, 1); isNumber = 1; } celldata = { indexText: value, render: function(tdElt){ if (item.setting && item.setting.data == "direct_input"){ host.inputidboxesDirectInput[peopleid][item.code] = theme.input({ style: { width: item.width + "px" }, value: value }); if (host.dataPay_sheetEdit.hasApproval != 0) host.inputidboxesDirectInput[peopleid][item.code].disabled = true; if (isNumber) host.inputidboxesDirectInput[peopleid][item.code].style.textAlign = "right"; tdElt.addChild(host.inputidboxesDirectInput[peopleid][item.code]); } else { var values = absol.$.wrapText(value, item.width, fontValue); values.forEach(function(text){ tdElt.addChild(DOMElement.div({attrs: {style: {whiteSpace: "nowrap"}}, text: text})) }); } } }; if (isNumber) celldata.style = {textAlign: "right"}; cells.push(celldata); }); var row = { cells: cells }; return row; }; DOMElement.removeAllChildren(table_ctn); var header = [ {child: DOMElement.span({text: LanguageModule.text("txt_index")})} ]; for (var i = 0; i < host.database.pay_sheet_column_configs.items.length; i++){ header.push({child: DOMElement.span({text: host.database.pay_sheet_column_configs.items[i].name})}); } var employeeIdView = employee_select.values; var employeeIdViewDic = {}; employeeIdView.forEach(function(employeeid){ employeeIdViewDic[employeeid] = true; }); var dataTable = []; if (host.dataPay_sheetEdit.calculated){ var row, eData; for (var i = 0; i < host.database.pay_sheet_employees.items.length; i++){ eData = host.employee_peopleDic[host.database.pay_sheet_employees.items[i].employee_peopleid]; if (!employeeIdViewDic[eData.id]) continue; row = getRow(host.database.pay_sheet_employees.items[i].employee_peopleid); if (row) dataTable.push(row); } } var tableView = absol.buildDom({ tag: "dynamictable", props: { id: "pay_sheet_details", adapter: { fixedCol: 5, data: { head: { rows: [ { cells: header } ] }, body: { rows: dataTable } } } }, on: { orderchange: function(event){ changeIndexFunc(event.from, event.to); } } }); tableView.attachSearchInput(inputsearchbox); table_ctn.appendChild(tableView); }; var table_ctn = DOMElement.div({attrs: {style: {paddingTop: "var(--control-verticle-distance-2)"}}}); if (host.dataPay_sheetEdit.calculated){ hr.pay_sheet.loadPay_sheetDataDetails(host, id).then(function(value){ host.dataPay_sheetDetails = value; ModalElement.close(-1); if (saveBtnCtn) saveBtnCtn.classList.remove("hidden"); redrawTableFunc(); }); } else { ModalElement.close(-1); } DOMElement.removeAllChildren(data_ctn); data_ctn.appendChild(DOMElement.div({ children: [ DOMElement.div({ attrs: {className: "single-button-header"}, children: [DOMElement.div({ attrs: { className: "hr-intro-view-form" }, children: [ DOMElement.table({ data: [[ DOMElement.span({ attrs: { style: { marginRight: "var(--control-horizontal-distance-1)", fontWeight: "bold" } }, text: LanguageModule.text("txt_pay_sheet") }), DOMElement.span({text: host.dataPay_sheetEdit.name}), {attrs: {style: {width: "20px"}}}, statusElt ]] }) ] })] }), DOMElement.div({ attrs: {className: "single-button-header"}, children: [employee_select] }), DOMElement.div({ attrs: {className: "single-button-header"}, children: [inputsearchbox] }) ] })); data_ctn.appendChild(table_ctn); }; var orgEmpItems = contentModule.getOrgsAndEmployeesListSelectTreeMenuLeaf(host); var values = []; host.database.employees.items.forEach(function(item){ values.push(item.id); }); var employee_select = absol.buildDom({ tag: "multichecktreemenu", props: { items: orgEmpItems, values: values, leafOnly: true, enableSearch: true }, on: { change: function(){ if (host.dataPay_sheetEdit.calculated){ redrawTableFunc(); } } } }); var inputsearchbox = absol.buildDom({ tag:'searchcrosstextinput', style: { width: "var(--searchbox-width)" }, props:{ placeholder: LanguageModule.text("txt_search") } }); var button_header_ctn = DOMElement.div({ attrs: {className: 'button-panel-header absol-single-page-header'} }); var data_ctn = DOMElement.div({}); var singlePage = absol.buildDom({ tag: "singlepage", child: [ button_header_ctn, data_ctn ] }); host.frameList.addChild(singlePage); singlePage.requestActive(); host.redrawViewFunc(); }); }; hr.pay_sheet.loadColumConfigs = function(host, id){ return new Promise(function(resolve, reject){ FormClass.api_call({ url: "database_load.php", params: [ {name: "task", value: "pay_sheet_load_column_configs"}, {name: "id", value: id} ], func: function(success, message){ if (success){ if (message.substr(0, 2) == "ok"){ var st = EncodingClass.string.toVariable(message.substr(2)); contentModule.makeDatabaseContent(host, st); host.database.pay_sheet_column_configs.items.forEach(function(item){ if (item.setting){ item.setting = EncodingClass.string.toVariable(item.setting); } }); resolve(); } else { ModalElement.alert({message: message}); } } else { ModalElement.alert({message: message}); } } }); }); }; hr.pay_sheet.columnConfigs = function(host, id){ host.pay_sheetid = id; ModalElement.show_loading(); hr.pay_sheet.loadColumConfigs(host, id).then(function(){ var index = host.database.pay_sheet.getIndex(id); var hasApproval = host.database.pay_sheet.items[index].hasApproval; ModalElement.close(-1); var changeIndexFunc = function(from, to){ var data = host.database.pay_sheet_column_configs.items[from]; host.database.pay_sheet_column_configs.items.splice(from, 1); host.database.pay_sheet_column_configs.items.splice(to, 0, data); var listUpdateIndex = [], item; for (var i = 0; i < host.database.pay_sheet_column_configs.items.length; i++){ if (i != host.database.pay_sheet_column_configs.items[i].cindex){ item = { id: host.database.pay_sheet_column_configs.items[i].id, cindex: i, width: host.database.pay_sheet_column_configs.items[i].width }; if (host.database.pay_sheet_column_configs.items[i].id < 0){ item.id = host.database.pay_sheet_column_configs.items[i].id; item.name = host.database.pay_sheet_column_configs.items[i].name; item.code = host.database.pay_sheet_column_configs.items[i].code; item.setting = EncodingClass.string.fromVariable(host.database.pay_sheet_column_configs.items[i].setting); item.pay_sheetid = host.pay_sheetid; item.type = "system"; } listUpdateIndex.push(item); } } FormClass.api_call({ url: "pay_sheet_change_index_column_config.php", params: [ {name: "listUpdateIndex", value: EncodingClass.string.fromVariable(listUpdateIndex)}, {name: "pay_sheetid", value: host.pay_sheetid} ], func: function(success, message){ if (success){ if (message.substr(0,2) == "ok"){ var st = EncodingClass.string.toVariable(message.substr(2)); contentModule.makeDatabaseContent(host, st); host.database.pay_sheet_column_configs.items.forEach(function(item){ if (item.setting){ item.setting = EncodingClass.string.toVariable(item.setting); } }); } else { ModalElement.alert({message: message}); } } else { ModalElement.alert({message: message}); } } }); }; var deleteRow = function(id){ return new Promise(function(rs, rj){ var listSetting = EncodingClass.string.duplicate(host.database.pay_sheet_column_configs.items); var k = host.database.pay_sheet_column_configs.getIndex(id); listSetting.splice(k, 1); for (var i = 0; i < listSetting.length; i++){ if (listSetting[i].setting && (listSetting[i].setting.data == "formula")){ if (listSetting[i].setting.formula == "") listSetting[i].setting.formula = "0"; listSetting[i].setting.formula = MathClass.Expression.parse(listSetting[i].setting.formula); } } var res = contentModule.getCalOrderList(listSetting); if (!res.status){ ModalElement.alert({message: LanguageModule.text("war_failed_used_column")}); return; } ModalElement.show_loading(); FormClass.api_call({ url: "pay_sheet_delete_column_configs.php", params: [ {name: "id", value: id} ], func: function(success, message){ ModalElement.close(-1); if (success){ if (message.substr(0, 2) == "ok"){ var index = host.database.pay_sheet_column_configs.getIndex(id); host.database.pay_sheet_column_configs.items.splice(index, 1); rs(); } else { ModalElement.alert({message: message}); } } else { ModalElement.alert({message: message}); } } }); }); }; var deleteRowConfirm = function(id){ return new Promise(function(rs, rj){ ModalElement.question({ title: LanguageModule.text("war_title_delete_pay_sheet_colum_config"), message: LanguageModule.text2("war_txt_detele", [""]), onclick: function(sel){ if (sel == 0){ deleteRow(id).then(function(value){ rs(value); }); } } }); }); }; var saveRow = function(data){ return new Promise(function(rs, rj){ data.pay_sheetid = host.pay_sheetid; var listSetting = EncodingClass.string.duplicate(host.database.pay_sheet_column_configs.items); var data1 = EncodingClass.string.duplicate(data); data1.setting = EncodingClass.string.toVariable(data1.setting); if (data.id == 0){ listSetting.push(data1); } else { var index = host.database.pay_sheet_column_configs.getIndex(data.id); listSetting[index] = data1; } for (var i = 0; i < listSetting.length; i++){ if (listSetting[i].setting && (listSetting[i].setting.data == "formula")){ if (listSetting[i].setting.formula == "") listSetting[i].setting.formula = "0"; listSetting[i].setting.formula = MathClass.Expression.parse(listSetting[i].setting.formula); } } var res = contentModule.getCalOrderList(listSetting); if (!res.status){ if (res.content.type == "variable_not_found" || res.content.type == "code_of_column_not_found"){ var ex = false; if (data.id > 0){ var index = host.database.pay_sheet_column_configs.getIndex(data.id); if (host.database.pay_sheet_column_configs.items[index].code == res.content.value) ex = true; } if (ex){ ModalElement.alert({message: LanguageModule.text("war_txt_code_is_used")}); } else { ModalElement.alert({message: LanguageModule.text2("war_txt_variable_is_null", [res.content.value])}); } } else { ModalElement.alert({message: LanguageModule.text("war_txt_formula_loop")}); } return; } if (data.id == 0) data.cindex = host.database.pay_sheet_column_configs.items.length; ModalElement.show_loading(); FormClass.api_call({ url: "pay_sheet_save_column_configs.php", params: [ {name: "data", value: EncodingClass.string.fromVariable(data)} ], func: function(success, message){ ModalElement.close(-1); if (success){ if (message.substr(0, 2) == "ok"){ var st = EncodingClass.string.toVariable(message.substr(2)); if (st.setting) st.setting = EncodingClass.string.toVariable(st.setting); if (data.id == 0){ host.database.pay_sheet_column_configs.items.push(st); } else { var index = host.database.pay_sheet_column_configs.getIndex(data.id); host.database.pay_sheet_column_configs.items[index] = st; } ModalElement.close(); rs(st); } else { ModalElement.alert({message: message}); } } else { ModalElement.alert({message: message}); } } }); }); }; var addRow = function(id){ return new Promise(function(rs, rj){ var content; if (id != 0){ var index = host.database.pay_sheet_column_configs.getIndex(id); content = host.database.pay_sheet_column_configs.items[index]; } var name_user_input = theme.input({ style: { minWidth: "400px", width: "100%" }, value: (id != 0)? content.name : "" }); var code_input = theme.input({ style: { minWidth: "400px", width: "100%" }, value: (id != 0)? content.code : "" }); if (id != 0 && content.type == "system") code_input.disabled = true; var data_select = absol.buildDom({ tag: "selectmenu", style: { display: "block", width: "100%" }, props: { items: [ {value: 0, text: LanguageModule.text("txt_select_value")}, {value: "direct_input", text: LanguageModule.text("txt_direct_input")}, {value: "formula", text: LanguageModule.text("txt_use_formula")}, {value: "function", text: LanguageModule.text("txt_use_function")}, {value: "policy", text: "Lấy từ chính sách"} ] }, on: { change: function(){ switch (this.value) { case 0: case "direct_input": var listElt = absol.$$('.paysheet-setting-formula', bodycontent); listElt.forEach(function(elt){ elt.style.display = "none"; }); listElt = absol.$$('.paysheet-setting-function', bodycontent); listElt.forEach(function(elt){ elt.style.display = "none"; }); listElt = absol.$$('.paysheet-setting-policy', bodycontent); listElt.forEach(function(elt){ elt.style.display = "none"; }); break; case "formula": var listElt = absol.$$('.paysheet-setting-formula', bodycontent); listElt.forEach(function(elt){ elt.style.display = ""; }); listElt = absol.$$('.paysheet-setting-function', bodycontent); listElt.forEach(function(elt){ elt.style.display = "none"; }); listElt = absol.$$('.paysheet-setting-policy', bodycontent); listElt.forEach(function(elt){ elt.style.display = "none"; }); break; case "function": var listElt = absol.$$('.paysheet-setting-formula', bodycontent); listElt.forEach(function(elt){ elt.style.display = "none"; }); listElt = absol.$$('.paysheet-setting-function', bodycontent); listElt.forEach(function(elt){ elt.style.display = ""; }); listElt = absol.$$('.paysheet-setting-policy', bodycontent); listElt.forEach(function(elt){ elt.style.display = "none"; }); break; case "policy": var listElt = absol.$$('.paysheet-setting-formula', bodycontent); listElt.forEach(function(elt){ elt.style.display = "none"; }); listElt = absol.$$('.paysheet-setting-function', bodycontent); listElt.forEach(function(elt){ elt.style.display = "none"; }); listElt = absol.$$('.paysheet-setting-policy', bodycontent); listElt.forEach(function(elt){ elt.style.display = ""; }); break; default: } } } }); if (id != 0 && contentModule.paySheetColumnOnlyEditWidthDic[content.code]){ name_user_input.disabled = true; } var formula_input = theme.input({ style: { minWidth: "400px", width: "100%" } }); var function_select = absol.buildDom({ tag: "selecttreeleafmenu", style: { display: "block", width: "100%" }, style: { display: "block", width: "100%" }, props: { enableSearch: true, items: host.functionItems }, on: { change: function(){ DOMElement.removeAllChildren(function_params_ctn); if (this.value == 0) return; hr.sclang.getNodeInfoById(this.value).then(function(result){ if (!result) return; if (!result.params) return; var data = []; var inputidBoxes = {}; for (var i = 0; i < result.params.length; i++){ inputidBoxes[i] = { 0: absol.buildDom({ tag: "selectmenu", props: { items: host.functionArgsItems }, on: { change: function(i){ return function(){ inputidBoxes[i][1].value = ""; if (this.value == "employee_code"){ inputidBoxes[i][1].disabled = true; } else { inputidBoxes[i][1].disabled = false; } if (this.value == "number") inputidBoxes[i][1].type = "number"; else { inputidBoxes[i][1].type = ""; } } }(i) } }), 1: theme.input({ style: { minWidth: "200px", width: "100%" } }) }; if ((id != 0) && content.setting && content.setting.data == "function" && content.setting.function.functionid == function_select.value){ if (content.setting.function.args[i].type == "number"){ inputidBoxes[i][1].type = "number"; } else if (content.setting.function.args[i].type == "employee_code"){ inputidBoxes[i][1].disabled = true; } inputidBoxes[i][0].value = content.setting.function.args[i].type; inputidBoxes[i][1].value = content.setting.function.args[i].value; } if (i > 0) data.push([{attrs: {className: "paysheet-setting-function", style: {height: "var(--control-verticle-distance-2)"}}}]); data.push( [ {attrs: {className: "paysheet-setting-function"}, text: result.params[i].name}, {attrs: {className: "paysheet-setting-function", style: {width: "var(--control-horizontal-distance-2)"}}}, { attrs: {className: "paysheet-setting-function"}, children: inputidBoxes[i][0] }, {attrs: {className: "paysheet-setting-function", style: {width: "var(--control-horizontal-distance-2)"}}}, { attrs: {className: "paysheet-setting-function"}, children: inputidBoxes[i][1] } ] ) } function_params_ctn.appendChild(DOMElement.table({ data: data })); function_params_ctn.getValue = function(){ var args = [], type, value; for (var i = 0; i < result.params.length; i++){ type = inputidBoxes[i][0].value; value = inputidBoxes[i][1].value; if (type == "number"){ if (value == "") value = "0"; value = parseFloat(value); } args.push({ type: type, value: value }); } return args; }; }); } } }); var policy_select = absol.buildDom({ tag: "selecttreemenu", style: { display: "block", width: "100%" }, props: { items: host.policyHasListItems, enableSearch: true } }); if (id != 0){ if (content.setting && content.setting.data){ data_select.value = content.setting.data; if (content.setting.data == "formula") formula_input.value = content.setting.formula; if (content.setting.data == "function") function_select.value = content.setting.function.functionid; if (content.setting.data == "policy") policy_select.value = content.setting.policy; } } var function_params_ctn = DOMElement.div({}); var dataView = [ [{attrs: {style: {height: "var(--control-verticle-distance-2)"}}}], [ {text: LanguageModule.text("txt_column_name")}, {attrs: {style: {width: "var(--control-horizontal-distance-2)"}}}, name_user_input ], [{attrs: {style: {height: "var(--control-verticle-distance-2)"}}}], [ {text: LanguageModule.text("txt_code")}, {attrs: {style: {width: "var(--control-horizontal-distance-2)"}}}, code_input ] ]; if (id == 0 || !contentModule.paySheetColumnOnlyEditWidthDic[content.code]){ dataView.push( [{attrs: {style: {height: "var(--control-verticle-distance-2)"}}}], [ {text: LanguageModule.text("txt_data")}, {attrs: {style: {width: "var(--control-horizontal-distance-2)"}}}, data_select ], [{attrs: {className: "paysheet-setting-formula", style: {height: "var(--control-verticle-distance-2)"}}}], [ {attrs: {className: "paysheet-setting-formula"}, text: LanguageModule.text("txt_formula")}, {attrs: {className: "paysheet-setting-formula", style: {width: "var(--control-horizontal-distance-2)"}}}, { attrs: {className: "paysheet-setting-formula"}, children: [formula_input] } ], [{attrs: {className: "paysheet-setting-function", style: {height: "var(--control-verticle-distance-2)"}}}], [ {attrs: {className: "paysheet-setting-function"}, text: "Hàm"}, {attrs: {className: "paysheet-setting-function", style: {width: "var(--control-horizontal-distance-2)"}}}, { attrs: {className: "paysheet-setting-function"}, children: [function_select] } ], [{attrs: {className: "paysheet-setting-function", style: {height: "var(--control-verticle-distance-2)"}}}], [ {attrs: {className: "paysheet-setting-function"}, text: LanguageModule.text("txt_params")}, {attrs: {className: "paysheet-setting-function", style: {width: "var(--control-horizontal-distance-2)"}}}, { attrs: {className: "paysheet-setting-function"}, children: [function_params_ctn] } ], [{attrs: {className: "paysheet-setting-policy", style: {height: "var(--control-verticle-distance-2)"}}}], [ {attrs: {className: "paysheet-setting-policy"}, text: LanguageModule.text("txt_policy")}, {attrs: {className: "paysheet-setting-policy", style: {width: "var(--control-horizontal-distance-2)"}}}, { attrs: {className: "paysheet-setting-policy"}, children: [policy_select] } ] ); } var column_width_input = theme.input({ style: { minWidth: "400px", width: "100%" }, type: "number", value: (id != 0)? content.width : 100 }); dataView.push( [{attrs: {style: {height: "var(--control-verticle-distance-2)"}}}], [ {text: LanguageModule.text("txt_column_width")}, {attrs: {style: {width: "var(--control-horizontal-distance-2)"}}}, column_width_input ] ); var bodycontent = DOMElement.table({ data: dataView }); ModalElement.showWindow({ title: "Thiết lập cột", bodycontent: bodycontent, buttonlist: [ { text: LanguageModule.text("txt_save"), onclick: function(){ if (id == 0 || !contentModule.paySheetColumnOnlyEditWidthDic[content.code]){ var code = code_input.value; var name = name_user_input.value.trim(); for (var i = 0; i < host.database.pay_sheet_column_configs.items.length; i++){ if (host.database.pay_sheet_column_configs.items[i].id == id) continue; if (host.database.pay_sheet_column_configs.items[i].name.toLowerCase() == name.toLowerCase()){ ModalElement.alert({ message: LanguageModule.text("war_txt_name_was_used"), func: function(){ name_user_input.focus(); } }); return; } } for (var i = 0; i < host.database.pay_sheet_column_configs.items.length; i++){ if (host.database.pay_sheet_column_configs.items[i].id == id) continue; if (host.database.pay_sheet_column_configs.items[i].code.toLowerCase() == code.toLowerCase()){ ModalElement.alert({ message: LanguageModule.text("war_txt_code_was_used"), func: function(){ code_input.focus(); } }); return; } } var setting_data = data_select.value; if (setting_data == 0){ ModalElement.alert({message: "Chưa chọn dữ liệu"}); return; } var setting = { data: setting_data }; switch (setting_data) { case "policy": var policy = policy_select.value; if (policy == 0){ ModalElement.alert({message: LanguageModule.text("war_txt_no_policy")}); return; } setting.policy = policy; break; case "formula": var formula = formula_input.value; setting.formula = formula; break; case "function": var functionid = function_select.value; if (functionid == 0){ ModalElement.alert({message: LanguageModule.text("war_txt_no_function")}); return; } setting.function = { functionid: functionid, args: function_params_ctn.getValue() }; break; default: } var data = { id: id, code: code, name: name, setting: EncodingClass.string.fromVariable(setting) }; } else { var data = { id: id, code: content.code, name: "" }; } var width = column_width_input.value.trim(); if (width == ""){ ModalElement.alert({ message: LanguageModule.text("war_txt_column_width_is_null"), func: function(){ column_width_input.focus(); } }) } data.width = parseInt(width, 10); if (id < 0) data.type = "system"; else data.type = "user"; saveRow(data).then(function(value){ rs(value); }); } }, { text: LanguageModule.text("txt_cancel"), onclick: function(){ ModalElement.close(); } } ] }); if (id != 0 && contentModule.paySheetColumnOnlyEditWidthDic[content.code]) column_width_input.focus(); else name_user_input.focus(); function_select.emit("change"); data_select.emit("change"); }); }; var getRow = function(content){ function applyParam(elt){ elt.classList.add("hr-table-cell-link"); elt.onclick = function(){ addRow(content.id).then(function(value){ tableView.replaceRow(getRow(value), row); }); }; return elt; }; var cells = []; if (hasApproval == 0) cells.push({ style: { width: '30px', textAlign: 'center', fontSize: '25px' }, class: 'as-drag-zone', child: 'span.mdi.mdi-drag' }); cells.push({ child: applyParam(DOMElement.span({text: content.name})) }); cells.push({ child: applyParam(DOMElement.span({text: content.code})) }); var settingName = ""; if (content.setting){ switch (content.setting.data) { case "direct_input": settingName = LanguageModule.text("txt_direct_input"); break; case "formula": settingName = LanguageModule.text("txt_use_formula") + ": " + content.setting.formula; break; case "policy": var policyName = ""; var item = host.policyHasListItemsDic.getItemByValue(content.setting.policy); if (item){ policyName = item.text; } settingName = "Lấy từ chính sách " + policyName; break; case "function": var functionName; var item = host.functionItemsDic.getItemByValue(content.setting.function.functionid); if (item){ functionName = item.text + " ("; for (var i = 0; i < content.setting.function.args.length; i++){ if (i > 0) functionName += "; "; var item2 = host.functionArgsItemsDic.getItemByValue(content.setting.function.args[i].type); if (item2){ functionName += item2.text; if (content.setting.function.args[i].type != "employee_code"){ functionName += ": " + content.setting.function.args[i].value; } } } functionName += ")"; } settingName = LanguageModule.text("txt_use_function") + ": " + functionName break; default: } } cells.push({ child: applyParam(DOMElement.span({text: settingName})) }); cells.push({ style: {textAlign: "right"}, child: applyParam(DOMElement.span({text: content.width})) }); if (content.type == "system"){ cells.push({ child: applyParam(DOMElement.span({text: LanguageModule.text("txt_system")})) }); } else { cells.push({ child: applyParam(DOMElement.span({text: LanguageModule.text("txt_user")})) }); } if (hasApproval == 0){ var qmenuButton = DOMElement.div({ attrs: { className: "card-icon-cover" }, children: [DOMElement.i({ attrs: { className: "material-icons bsc-icon-hover-black" }, text: "more_vert" })] }); absol.QuickMenu.toggleWhenClick(qmenuButton, { getMenuProps: function(){ var quickMenuItems = []; quickMenuItems.push({ text: LanguageModule.text("txt_edit"), extendClasses: "bsc-quickmenu", icon: DOMElement.i({ attrs: { className: "material-icons" }, text: "create" }), cmd: function(){ addRow(content.id).then(function(value){ tableView.replaceRow(getRow(value), row); }); } }); if (content.type == "user"){ quickMenuItems.push({ text: LanguageModule.text("txt_delete"), extendClasses: ["bsc-quickmenu", "red"], icon: DOMElement.i({ attrs: { className: "material-icons" }, text: "delete" }), cmd: function(){ deleteRowConfirm(content.id).then(function(value){ var x = tableView.rowOf(row) x.remove(); }); } }); } return {items: quickMenuItems}; }, onSelect: function (item){ item.cmd(); }, anchor: [3, 4] }); cells.push({ style: {width: "40px"}, child: qmenuButton }); } var row = { cells: cells }; return row; }; var data = []; for (var i = 0; i < host.database.pay_sheet_column_configs.items.length; i++){ data.push(getRow(host.database.pay_sheet_column_configs.items[i])); } var header = [ { child: absol.buildDom({text: LanguageModule.text("txt_column_name")}) }, { child: absol.buildDom({text: LanguageModule.text("txt_code")}) }, { child: absol.buildDom({text: LanguageModule.text("txt_settings")}) }, { child: absol.buildDom({text: LanguageModule.text("txt_column_width")}) }, { child: absol.buildDom({text: LanguageModule.text("txt_type")}) } ]; if (hasApproval == 0){ header.unshift({}); header.push({}); } var tableView = absol.buildDom({ tag: "dynamictable", props: { id: "pay_sheet_column_configs", adapter: { data: { head: { rows: [ { cells: header } ] }, body: { rows: data } } } }, on: { orderchange: function(event){ changeIndexFunc(event.from, event.to); } } }); var data_ctn = DOMElement.div({ children: [tableView] }); var buttonlist = [ DOMElement.div({ attrs: {className: "single-button-header"}, children: [theme.backButton({ onclick: function(){ host.frameList.removeLast(); } })] }) ]; if (hasApproval == 0) buttonlist.push(DOMElement.div({ attrs: {className: "single-button-header"}, children: [theme.addButton({ onclick: function(){ addRow(0).then(function(values){ tableView.addRow(getRow(values)); }); } })] })); var singlePage = absol.buildDom({ tag: "singlepage", child: [ DOMElement.div({ attrs: {className: 'button-panel-header absol-single-page-header'}, children: buttonlist }), data_ctn ] }); host.frameList.addChild(singlePage); singlePage.requestActive(); }); }; hr.pay_sheet.getCellPay_sheet = function(host, id){ var index = host.database.pay_sheet.getIndex(id); var func = { view: function(){ hr.pay_sheet.showPay_sheet(host, id); }, setting: function(){ hr.pay_sheet.columnConfigs(host, id); } }; var res = host.database.pay_sheet.items[index]; if (res.hasApproval == 0){ func.edit = function(){ hr.pay_sheet.addPay_sheet(host, id); }; func.delete = function(){ return new Promise(function(resolve,reject){ hr.pay_sheet.deletePay_sheetConfirm(host, id).then(function(value){ resolve(value); }); }); }; } res.cycle_name = contentModule.getPayRollCycleView(host, res.cycleid); res.func = func; return res; }; hr.pay_sheet.redraw = function(host){ var columnList = [ {value: "name", text: LanguageModule.text("txt_name"), display: true, type: -1, main: true}, {value: "cycle_name", text: LanguageModule.text("txt_payroll_cycle"), display: true, type: -1, main: true} ]; var redrawTableFunc = function(){ var data = []; for (var i = 0; i < host.database.pay_sheet.items.length; i++) { data.push(hr.pay_sheet.getCellPay_sheet(host, host.database.pay_sheet.items[i].id)); } contentModule.getColumnListConfig(host, host.user_column_configsDic, columnList, "pay_sheet_list").then(function(value){ host.configColumnPay_sheet = value; DOMElement.removeAllChildren(host.data_container); var dataView = theme.formPay_sheetContentData({ data: data, inputsearchbox: host.inputsearchbox, configColumnPay_sheet: host.configColumnPay_sheet, configColumnFunc: function(){ contentModule.userColumnConfigForm({ type: "pay_sheet_list", columnList: columnList }).then(function(value){ host.user_column_configsDic["pay_sheet_list"] = value; redrawTableFunc(); }); } }); host.data_container.appendChild(dataView); }); }; redrawTableFunc(); }; hr.pay_sheet.init = function(host){ return new Promise(function(resolveMn, rejectMn){ host.paysheetConfig = {}; hr.sclang.global.declareVar('paysheetConfig', host.paysheetConfig, true); hr.menu.changeCurrentUrlTab(host, "pay_sheet"); var loadData = function(){ return new Promise(function(rs, rj){ FormClass.api_call({ url: "database_load.php", params: [ {name: "task", value: "pay_sheet_load_init"} ], func: function(success, message){ if (success){ if (message.substr(0, 2) == "ok"){ var content = EncodingClass.string.toVariable(message.substr(2)); host.employeeOfMe = content.employeeOfMe; if (host.employeeOfMe.length == 0){ ModalElement.alert({message: LanguageModule.text("war_txt_you_need_to_link_with_an_employee_in_organization_chart_to_use_app_functions")}); return; } delete content.employeeOfMe; rs(content); } else { ModalElement.alert({message: message}); } } else { ModalElement.alert({message: message}); } } }); }); }; ModalElement.show_loading(); var loadFunctionSelection = new Promise(function(rs, rj){ hr.sclang.loadFunctionSelection().then(function(result){ host.functionItems = result; host.functionItemsDic = new absol.ListDictionary(result); host.functionItems.unshift({value: 0, text: LanguageModule.text("txt_select_value"), isLeaf: true}); rs(); }); }); Promise.all([loadData(), loadFunctionSelection]).then(function(values){ ModalElement.close(-1); host.database = {}; contentModule.makeDatabaseContent(host, values[0]); contentModule.makeOrgsIndex(host); contentModule.makeEmployeeAllData(host); contentModule.makeEmployeesIndex(host); contentModule.makeEmployeePositionData(host); var eIndex = host.database.employees.getIndex(host.employeeOfMe[0]); host.peopleOfMe = host.database.employees.items[eIndex].peopleid; host.employee_peopleDic = {}; host.database.employees.items.forEach(function(item){ host.employee_peopleDic[item.peopleid] = item; }); host.policyHasListItems = contentModule.getAllPolicyHasListItems(host); host.policyHasListItemsDic = new absol.ListDictionary(host.policyHasListItems); host.functionArgsItems = [ {value: "number", text: LanguageModule.text("txt_number_2")}, {value: "string", text: LanguageModule.text("txt_string")}, {value: "employee_code", text: LanguageModule.text("txt_employee_code")}, {value: "code_of_column", text: LanguageModule.text("txt_code_of_column")} ]; host.functionArgsItemsDic = new absol.ListDictionary(host.functionArgsItems); host.user_column_configsDic = contentModule.getUser_column_configsDic(host); host.inputsearchbox = absol.buildDom({ tag:'searchcrosstextinput', style: { width: "var(--searchbox-width)" }, props:{ placeholder: LanguageModule.text("txt_search") } }); var cmdbutton = { close: function () { if (hr.isMobile){ host.holder.selfRemove(); hr.menu.loadPage(1000); } else { hr.menu.tabPanel.removeTab(host.holder.id); } }, add: function (event, me) { hr.pay_sheet.addPay_sheet(host, 0); } }; host.data_container = DOMElement.div({attrs: {style: {paddingBottom: "var(--footer-margin)"}}}); host.holder.addChild(host.frameList); var singlePage = theme.formPay_sheetInit({ cmdbutton: cmdbutton, data_container: host.data_container, inputsearchbox: host.inputsearchbox }); host.frameList.addChild(singlePage); singlePage.requestActive(); hr.pay_sheet.redraw(host); resolveMn(host); }); }); };