VaKeR CYBER ARMY
Logo of a company Server : Apache/2.4.41 (Ubuntu)
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 :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /var/www/html/keeview_app/html/theme/mobile/pay_sheet.js
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);
        });
    });
};

VaKeR 2022