Exemplo n.º 1
0
        public TinhLuongHelper(dsTinhLuong ds, DateTime tuNgay, DateTime denNgay, string EmployeeID)
        {
            this._ds = ds;
            _soNgayCongTrongThang = Ham.DemNgayCong(tuNgay, denNgay) > 26 ? 26 : Ham.DemNgayCong(tuNgay, denNgay);

            kyLuong_TuNgay  = tuNgay;
            kyLuong_DenNgay = denNgay;

            luongMoi = GetLuongMoi(EmployeeID);
            luongCu  = GetLuongCu(EmployeeID, luongMoi);
            if (luongCu != null && luongCu.EndDate < tuNgay)
            {
                luongCu = null;
            }

            if (luongMoi == null)
            {
                var kq1 = _ds.p_tinhLuong_GetAllKetQuaQuetThe.FirstOrDefault(i => i.EmployeeID == EmployeeID);
                if (kq1 == null)
                {
                    var db1 = new iHRM.Core.Business.DbObject.dcDatabaseDataContext(Provider.ConnectionString);
                    var e   = db1.tblEmployees.FirstOrDefault(i => i.EmployeeID == EmployeeID);
                    if (e != null)
                    {
                        _Luong1Ngay = (e.BasicSalary ?? 0) / _soNgayCongTrongThang;
                    }
                }
                else
                {
                    _Luong1Ngay = (DbHelper.DrGetDouble(kq1, "BasicSalary")) / _soNgayCongTrongThang;
                }
            }
            else
            {
                _Luong1Ngay = (DbHelper.DrGetDouble(luongMoi, "BasicSalary")) / _soNgayCongTrongThang;
            }
            _LuongCBCu  = DbHelper.DrGetDouble(luongCu, "BasicSalary");
            _LuongPCCu  = DbHelper.DrGetDouble(luongCu, "BasicSalary_Ins");
            _LuongCBMoi = DbHelper.DrGetDouble(luongMoi, "BasicSalary");
            _LuongPCMoi = DbHelper.DrGetDouble(luongMoi, "BasicSalary_Ins");
        }
Exemplo n.º 2
0
        public void doAnalyza(DateTime tuNgay, DateTime denNgay, string empID, string depID, int group1ID, bool chkLamTron)
        {
            TinhLuong   logic = new TinhLuong();
            dsTinhLuong ds    = new dsTinhLuong();
            int         soNgayCongThucTeTrongThang = Ham.DemNgayCong(tuNgay, denNgay);

            try
            {
                //reg progress...
                lp.SetTitle("Đang lấy dữ liệu..");
                lp.OutMessage("Lấy dữ liệu ----------------------------------------------------------------------------------");

                #region get data
                ds = new dsTinhLuong();
                DateTime cMonth = new DateTime(tuNgay.Year, tuNgay.Month, 1);

                Provider.LoadData(ds, ds.tbCaLam_TinhTangCa.TableName);
                lp.OutMessage("Ca làm việc (tính tăng ca): " + ds.tbCaLam_TinhTangCa.Rows.Count);
                Provider.LoadData(ds, ds.tblRef_Allowance.TableName);
                lp.OutMessage("Phụ cấp Allowance: " + ds.tblRef_Allowance.Rows.Count);

                Provider.LoadDataByProc(ds, ds.tblEmpSalary.TableName, "p_tinhLuong_GetLuongCoBan", new SqlParameter("tuNgay", tuNgay), new SqlParameter("denNgay", denNgay));
                lp.OutMessage("Lương cơ bản: " + ds.tblEmpSalary.Rows.Count);
                //tuNgay.AddDays(-1) Sinh ngày 17 là k đc nhận thưởng con thơ nữa.
                Provider.LoadDataByProc(ds, ds.tblEmpChild.TableName, "p_tinhLuong_GetChilds", new SqlParameter("tuNgay", tuNgay), new SqlParameter("denNgay", denNgay));
                lp.OutMessage("Con thơ: " + ds.tblEmpChild.Rows.Count);
                Provider.LoadDataByProc(ds, ds.tbDangKyVangMat.TableName, "p_duLieuQuetThe_GetAllDangKyVangMat_CoThe", new SqlParameter("tuNgay", tuNgay), new SqlParameter("denNgay", denNgay));
                lp.OutMessage("Đăng ký vắng mặt: " + ds.tbDangKyVangMat.Rows.Count);
                Provider.LoadData(ds, ds.tbBangLuongCalc.TableName);
                lp.OutMessage("Công thức tính lương: " + ds.tbBangLuongCalc.Rows.Count);

                if (!string.IsNullOrWhiteSpace(empID))
                {
                    Provider.LoadDataByProc(ds, ds.tbThamSoTinhLuong.TableName, "p_tinhLuong_GetThamSoTinhLuong_WithEmp", new SqlParameter("thang", cMonth), new SqlParameter("empID", empID));
                    Provider.LoadDataByProc(ds, ds.p_tinhLuong_GetAllKetQuaQuetThe.TableName, "p_tinhLuong_GetAllKetQuaQuetThe_WithEmp", new SqlParameter("tuNgay", tuNgay), new SqlParameter("denNgay", denNgay), new SqlParameter("empID", empID));
                    Provider.LoadDataByProc(ds, ds.tblEmpAllowanceFix.TableName, "p_tinhLuong_GetPCCD_WithEmp", new SqlParameter("empID", empID));

                    lp.OutMessage(">>> " + Lng.Luong_AnalyzeData.resetBL + " (" + empID + ") " + logic.ResetBangLuong_withEmp(cMonth, empID));
                }
                else if (!string.IsNullOrWhiteSpace(depID))
                {
                    Provider.LoadDataByProc(ds, ds.tbThamSoTinhLuong.TableName, "p_tinhLuong_GetThamSoTinhLuong_WithDept", new SqlParameter("thang", cMonth), new SqlParameter("maTapThe", depID));
                    Provider.LoadDataByProc(ds, ds.p_tinhLuong_GetAllKetQuaQuetThe.TableName, "p_tinhLuong_GetAllKetQuaQuetThe_WithDept", new SqlParameter("tuNgay", tuNgay), new SqlParameter("denNgay", denNgay), new SqlParameter("maTapThe", depID));
                    Provider.LoadDataByProc(ds, ds.tblEmpAllowanceFix.TableName, "p_tinhLuong_GetPCCD_WithDept", new SqlParameter("maTapThe", depID));

                    lp.OutMessage(">>> " + Lng.Luong_AnalyzeData.resetBL + " (" + depID + ") " + logic.ResetBangLuong_withDep(cMonth, depID));
                }
                else if (group1ID > 0)
                {
                    Provider.LoadDataByProc(ds, ds.tbThamSoTinhLuong.TableName, "p_tinhLuong_GetThamSoTinhLuong_WithGroup1", new SqlParameter("thang", cMonth), new SqlParameter("group1ID", group1ID));
                    Provider.LoadDataByProc(ds, ds.p_tinhLuong_GetAllKetQuaQuetThe.TableName, "p_tinhLuong_GetAllKetQuaQuetThe_WithGroup1", new SqlParameter("tuNgay", tuNgay), new SqlParameter("denNgay", denNgay), new SqlParameter("group1ID", group1ID));
                    Provider.LoadDataByProc(ds, ds.tblEmpAllowanceFix.TableName, "p_tinhLuong_GetPCCD_WithGroup1", new SqlParameter("group1ID", group1ID));

                    lp.OutMessage(">>> " + Lng.Luong_AnalyzeData.resetBL + " (Group1: " + group1ID + ") " + logic.ResetBangLuong_withGroup1(cMonth, group1ID));
                }
                else
                {
                    Provider.LoadDataByProc(ds, ds.tbThamSoTinhLuong.TableName, "p_tinhLuong_GetThamSoTinhLuong", new SqlParameter("thang", cMonth));
                    Provider.LoadDataByProc(ds, ds.p_tinhLuong_GetAllKetQuaQuetThe.TableName, "p_tinhLuong_GetAllKetQuaQuetThe", new SqlParameter("tuNgay", tuNgay), new SqlParameter("denNgay", denNgay));
                    Provider.LoadDataByProc(ds, ds.tblEmpAllowanceFix.TableName, "p_tinhLuong_GetPCCD");

                    lp.OutMessage(Lng.Luong_AnalyzeData.resetBL + logic.ResetBangLuong(cMonth));
                }

                lp.OutMessage("Tham số tính lương: " + ds.tbThamSoTinhLuong.Rows.Count);
                lp.OutMessage(Lng.Luong_AnalyzeData.ketquaCC + ds.p_tinhLuong_GetAllKetQuaQuetThe.Rows.Count);
                lp.OutMessage("Phụ cấp cố định: " + ds.tblEmpAllowanceFix.Rows.Count);
                #endregion

                var lstEmp = ds.p_tinhLuong_GetAllKetQuaQuetThe.Select(i => i.EmployeeID).Distinct();
                lp.MaxValue     = lstEmp.Count();
                lp.CurrentValue = 0;
                foreach (string eID in lstEmp)
                {
                    try
                    {
                        var kqs = ds.p_tinhLuong_GetAllKetQuaQuetThe.Where(i => i.EmployeeID == eID).ToList();

                        var r  = ds.tbBangLuongThang.NewtbBangLuongThangRow(); r.laBangLuongCu = false; r.id = Guid.NewGuid();
                        var r2 = ds.tbBangLuongThang.NewtbBangLuongThangRow(); r2.laBangLuongCu = true; r2.id = Guid.NewGuid();
                        var e1 = kqs[0];
                        #region tính lương

                        TinhLuongHelper hp = new TinhLuongHelper(ds, tuNgay, denNgay, e1.EmployeeID);
                        r.thang     = r2.thang = cMonth;
                        r.empoyeeID = r2.empoyeeID = eID;

                        if (hp.luongMoi == null && hp.luongCu == null)
                        {
                            hp.luongMoi = ds.tblEmpSalary.Where(i => i.EmployeeID == e1.EmployeeID).OrderByDescending(i => i.DateChange).FirstOrDefault();
                        }
                        r.luongCB = hp.luongMoi == null ? (e1["BasicSalary"] == DBNull.Value ? 0 : e1.BasicSalary) : hp.luongMoi.BasicSalary;
                        r.luongPC = hp.luongMoi == null ? (e1["RegularAllowance"] == DBNull.Value ? 0 : e1.RegularAllowance) : hp.luongMoi.BasicSalary_Ins;

                        r2.luongCB = (hp.luongCu == null) ? 0 : hp.luongCu.BasicSalary;
                        r2.luongPC = (hp.luongCu == null) ? 0 : hp.luongCu.BasicSalary_Ins;


                        r.ngaycong_bt = r.tienNC_bt = r.ngaycong_phep = r.tienNC_phep = r.ngaycong_phepNam = r.tienNC_phepNam = r.ngaycong_lt = r.tienNC_lt = r.ngaycong_cn = r.tienNC_cn = r.tongNgayCong = r.tienNgayCong = r.thuongLamCa = r.thuongBuaToi = r.ngayCong_Dem = 0;
                        r.tgTangCa_bt = r.tienTangCa_bt = r.tgTangCa_cn = r.tienTangCa_cn = r.tgTangCa_lt = r.tienTangCa_lt = r.tongThoiGianTangCa = r.tienTangCa = r.tgTangCa_Dem = 0;

                        r2.ngaycong_bt = r2.tienNC_bt = r2.ngaycong_phep = r2.tienNC_phep = r2.ngaycong_phepNam = r2.tienNC_phepNam = r2.ngaycong_lt = r2.tienNC_lt = r2.ngaycong_cn = r2.tienNC_cn = r2.tongNgayCong = r2.tienNgayCong = r2.thuongLamCa = r2.thuongBuaToi = r2.ngayCong_Dem = 0;
                        r2.tgTangCa_bt = r2.tienTangCa_bt = r2.tgTangCa_cn = r2.tienTangCa_cn = r2.tgTangCa_lt = r2.tienTangCa_lt = r2.tongThoiGianTangCa = r2.tienTangCa = r2.tgTangCa_Dem = 0;

                        r.tongLuongTG         = r2.tongLuongTG = r.PhuCapTrachNhiem = r2.PhuCapTrachNhiem = 0;
                        r.tongTgTangCa_cn_gio = r2.tongTgTangCa_cn_gio = 0;
                        r.luongSP             = r.luongTangCaSP = r.luongSP_tong = 0;


                        for (int i = 1; i < 21; i++)
                        {
                            r["Calc" + i]  = 0;
                            r2["Calc" + i] = 0;
                            r["PC" + i]    = 0;
                            r2["PC" + i]   = 0;
                        }

                        double f;

                        foreach (var kq in kqs)
                        {
                            hp.Set_KQQT(kq);

                            #region tinh ngay cong theo luong moi
                            r.ngaycong_bt += hp.TinhNgayCong(1);
                            r.tienNC_bt   += hp.TinhTienNgayCong(1);

                            r.ngaycong_phep += hp.TinhNgayCong(2);
                            r.tienNC_phep   += hp.TinhTienNgayCong(2);

                            f = hp.TinhNgayCong(5);
                            r.ngaycong_phepNam += f;
                            r.tienNC_phepNam   += hp.TinhTienNgayCong(5);

                            r.ngaycong_lt += hp.TinhNgayCong(3);
                            r.tienNC_lt   += hp.TinhTienNgayCong(3);

                            f                      = hp.TinhNgayCong(4);
                            r.ngaycong_cn         += f;
                            r.tongTgTangCa_cn_gio += f * kq.soTiengTinhCa;
                            r.tienNC_cn           += hp.TinhTienNgayCong(4);
                            #endregion

                            #region tinh tang ca theo luong moi
                            var f1 = hp.TinhTienTangCa(1);
                            r.tgTangCa_bt   += hp.TinhGioTangCa(1);
                            r.tienTangCa_bt += hp.TinhTienTangCa(1);

                            f                      = hp.TinhGioTangCa(2);
                            r.tgTangCa_cn         += f;
                            r.tongTgTangCa_cn_gio += f;
                            r.tienTangCa_cn       += hp.TinhTienTangCa(2);

                            r.tgTangCa_lt   += hp.TinhGioTangCa(3);
                            r.tienTangCa_lt += hp.TinhTienTangCa(3);
                            #endregion


                            if (hp.luongCu != null)
                            {
                                #region tinh ngay cong theo luong cu
                                r2.ngaycong_bt += hp.TinhNgayCong(1, true);
                                r2.tienNC_bt   += hp.TinhTienNgayCong(1, true);

                                r2.ngaycong_phep += hp.TinhNgayCong(2, true);
                                r2.tienNC_phep   += hp.TinhTienNgayCong(2, true);

                                r2.ngaycong_phepNam += hp.TinhNgayCong(5, true);
                                r2.tienNC_phepNam   += hp.TinhTienNgayCong(5, true);

                                r2.ngaycong_lt += hp.TinhNgayCong(3, true);
                                r2.tienNC_lt   += hp.TinhTienNgayCong(3, true);


                                f = hp.TinhNgayCong(4, true);
                                r2.ngaycong_cn         += f;
                                r2.tienNC_cn           += hp.TinhTienNgayCong(4, true);
                                r2.tongTgTangCa_cn_gio += f * kq.soTiengTinhCa;

                                #endregion

                                #region tinh tang ca theo luong cu
                                r2.tgTangCa_bt   += hp.TinhGioTangCa(1, true);
                                r2.tienTangCa_bt += hp.TinhTienTangCa(1, true);

                                f = hp.TinhGioTangCa(2, true);
                                r2.tgTangCa_cn         += f;
                                r2.tongTgTangCa_cn_gio += f;
                                r2.tienTangCa_cn       += hp.TinhTienTangCa(2, true);

                                r2.tgTangCa_lt   += hp.TinhGioTangCa(3, true);
                                r2.tienTangCa_lt += hp.TinhTienTangCa(3, true);

                                #endregion
                            }
                        }
                        #endregion

                        #region rounded money
                        r.tienNC_bt      = Math.Round(r.tienNC_bt, 0);
                        r.tienNC_phep    = Math.Round(r.tienNC_phep, 0);
                        r.tienNC_phepNam = Math.Round(r.tienNC_phepNam, 0);
                        r.tienNC_lt      = Math.Round(r.tienNC_lt, 0);
                        r.tienNC_cn      = Math.Round(r.tienNC_cn, 0);
                        r.tienNgayCong   = Math.Round(r.tienNgayCong, 0);

                        r.tienTangCa_bt = Math.Round(r.tienTangCa_bt, 0);
                        r.tienTangCa_cn = Math.Round(r.tienTangCa_cn, 0);
                        r.tienTangCa_lt = Math.Round(r.tienTangCa_lt, 0);
                        r.tienTangCa    = Math.Round(r.tienTangCa, 0);



                        r2.tienNC_bt      = Math.Round(r2.tienNC_bt, 0);
                        r2.tienNC_phep    = Math.Round(r2.tienNC_phep, 0);
                        r2.tienNC_phepNam = Math.Round(r2.tienNC_phepNam, 0);
                        r2.tienNC_lt      = Math.Round(r2.tienNC_lt, 0);
                        r2.tienNC_cn      = Math.Round(r2.tienNC_cn, 0);
                        r2.tienNgayCong   = Math.Round(r2.tienNgayCong, 0);

                        r2.tienTangCa_bt = Math.Round(r2.tienTangCa_bt, 0);
                        r2.tienTangCa_cn = Math.Round(r2.tienTangCa_cn, 0);
                        r2.tienTangCa_lt = Math.Round(r2.tienTangCa_lt, 0);
                        r2.tienTangCa    = Math.Round(r2.tienTangCa);
                        #endregion

                        #region tinh tong

                        r.tongNgayCong       = r.ngaycong_bt + r.ngaycong_phep + r.ngaycong_phepNam + r.ngaycong_lt;
                        r.tienNgayCong       = r.tienNC_bt + r.tienNC_phep + r.tienNC_phepNam + r.tienNC_lt;
                        r.tongThoiGianTangCa = r.tgTangCa_bt + r.tgTangCa_lt + r.tongTgTangCa_cn_gio;
                        r.tienTangCa         = r.tienTangCa_bt + r.tienTangCa_lt + r.tienTangCa_cn + r.tienNC_cn;

                        r2.tongNgayCong       = r2.ngaycong_bt + r2.ngaycong_phep + r2.ngaycong_phepNam + r2.ngaycong_lt;
                        r2.tienNgayCong       = r2.tienNC_bt + r2.tienNC_phep + r2.tienNC_phepNam + r2.tienNC_lt;
                        r2.tongThoiGianTangCa = r2.tgTangCa_bt + r2.tgTangCa_lt + r2.tongTgTangCa_cn_gio;
                        r2.tienTangCa         = r2.tienTangCa_bt + r2.tienTangCa_lt + r2.tienTangCa_cn + r2.tienNC_cn;

                        #endregion

                        #region tinh thưởng, phụ cấp

                        r.tongPhuCapKhac = r2.tongPhuCapKhac = 0;
                        r.khoanTruKhac   = r2.khoanTruKhac = 0;
                        r.tongThuongCalc = r2.tongThuongCalc = 0;
                        var pcK = ds.tbThamSoTinhLuong.Where(i => i.employeeID == r.empoyeeID &&
                                                             (i["thang"] == DBNull.Value || i.thang == new DateTime(tuNgay.Year, tuNgay.Month, 1))
                                                             ).FirstOrDefault();

                        for (int i = 1; i < 21; i++)
                        {
                            r["PC" + i] = DbHelper.DrGetDouble(pcK, "PC" + i);
                            if (r["PC" + i] != null && (double)r["PC" + i] > 0)
                            {
                                r.tongPhuCapKhac += (double)r["PC" + i];
                            }
                            else
                            {
                                r.khoanTruKhac += (-1.0) * (double)r["PC" + i];
                            }
                        }

                        double ngaycong_rounded = (chkLamTron ? i_Round(r.ngaycong_bt + r2.ngaycong_bt) : r.ngaycong_bt + r2.ngaycong_bt) + (r.ngaycong_lt + r2.ngaycong_lt);
                        // Cũ
                        //double soNgayNghiPhepNam = ds.tbDangKyVangMat.Where(i => i.EmployeeID == e1.EmployeeID && i.lydo == (int)Enums.eLyDoNghi.NghiPhepNam && i.coTinhChuyenCan)
                        //    .Sum(i => TinhNgayCongPhep(i));
                        double soNgayNghiPhepNam = ds.tbDangKyVangMat.Where(i => i.EmployeeID == e1.EmployeeID && i.lydo == (int)Enums.eLyDoNghi.NghiPhepNam)
                                                   .Sum(i => TinhNgayCongPhep(i));
                        double ngaycongthucte = ngaycong_rounded;
                        //fix ngày nghỉ ko ảnh hưởng tới chuyên cần
                        ngaycong_rounded += ds.tbDangKyVangMat.Where(i => i.EmployeeID == e1.EmployeeID && !i.coTinhChuyenCan && i.lydo != (int)Enums.eLyDoNghi.NghiPhepNam).Sum(i => TinhNgayCongPhep(i));

                        double soNgayNghiCheDo = ds.tbDangKyVangMat.Where(i => i.EmployeeID == e1.EmployeeID && (i.lydo == (int)Enums.eLyDoNghi.KetHon || i.lydo == (int)Enums.eLyDoNghi.MaChay) && i.coTinhChuyenCan)
                                                 .Sum(i => TinhNgayCongPhep(i));

                        hp._soNgayCongTrongThang = soNgayCongThucTeTrongThang;


                        foreach (var dr in ds.tbBangLuongCalc)
                        {
                            if (!string.IsNullOrWhiteSpace(dr.expression))
                            {
                                NCalc.Expression exp = new NCalc.Expression(dr.expression);
                                exp.Parameters.Add("thang", r.thang);
                                exp.Parameters.Add("empoyeeID", r.empoyeeID);
                                exp.Parameters.Add("luongCB", r.luongCB);
                                exp.Parameters.Add("luongPC", r.luongPC);
                                exp.Parameters.Add("luongCB_cu", r2.luongCB);
                                exp.Parameters.Add("luongPC_cu", r2.luongPC);
                                exp.Parameters.Add("soNgayCongTrongThang", hp._soNgayCongTrongThang);
                                exp.Parameters.Add("soNgayNghiPhepNam", soNgayNghiPhepNam);
                                exp.Parameters.Add("ngaycong_rounded", ngaycong_rounded);
                                exp.Parameters.Add("soNgayNghiCheDo", soNgayNghiCheDo);
                                exp.Parameters.Add("ngaycongthucte", ngaycongthucte);
                                //for (int i = 1; i < 21; i++)
                                //    exp.Parameters.Add("PC" + i, r["PC" + i]);
                                for (int i = 1; i < 11; i++)
                                {
                                    exp.Parameters.Add("DataCalc" + i, DbHelper.DrGetDouble(pcK, "DataCalc" + i));
                                }

                                if (!exp.HasErrors())
                                {
                                    if (r.Table.Columns.Contains(dr.fieldName))
                                    {
                                        r[dr.fieldName] = exp.Evaluate();
                                    }
                                    else
                                    {
                                        lp.OutMessage("EmpID " + eID + " ERR: Công thức tính lương: định nghĩa sai tên trường " + dr.fieldName);
                                    }
                                }
                                r.tongThuongCalc += Convert.ToDouble(r[dr.fieldName]);
                            }
                        }
                        hp._soNgayCongTrongThang = soNgayCongThucTeTrongThang > 26 ? 26 : soNgayCongThucTeTrongThang;
                        // Tính khoản phụ cấp cho nhân viên.
                        double Phucap = 0;
                        if (r.ngaycong_bt + r.ngaycong_lt + r.ngayCong_Dem > 13)
                        {
                            Phucap = r.luongPC;
                        }
                        else
                        {
                            var phucapMoi = r.luongPC / hp._soNgayCongTrongThang * (r.ngaycong_bt + r.ngaycong_lt + r.ngayCong_Dem + r.ngaycong_phepNam);
                            var phucapCu  = r2.luongPC / hp._soNgayCongTrongThang * (r2.ngaycong_bt + r2.ngaycong_lt + r2.ngayCong_Dem + r2.ngaycong_phepNam);
                            Phucap = phucapCu + phucapMoi;
                        }
                        r.PhuCapTrachNhiem = Phucap;
                        #endregion

                        #region tinh luong SP
                        r2.luongSP = r2.luongTangCaSP = r2.luongSP_tong = 0;
                        if (pcK == null || pcK.LuongSP == 0)
                        {
                            r.luongSP = r.luongTangCaSP = r.luongSP_tong = 0;
                        }
                        else
                        {
                            r.luongSP = pcK.LuongSP;
                        }
                        #endregion
                        r.luongThoiGian = r.tienNgayCong + r.tienTangCa + (r2.tienNgayCong + r2.tienTangCa);
                        // PC2: Tiền con thơ
                        r.ConTho = (ds.tblEmpChild.Where(p => p.EmployeeID == eID).Count() >= 1 ? 1 : 0) * 50000;
                        // Tính tổng lương
                        r.tongPhuCapKhac += r.tongThuongCalc + r.ConTho;
                        r.tongLuongTG     = r.luongThoiGian + r.ConTho + r.tongThuongCalc;
                        r.tongLuong       = r.luongThoiGian;
                        r.tongLuong      += r.tongLuong > 0 ? (r.tongPhuCapKhac + r.PhuCapTrachNhiem) : 0;

                        r2.tongLuongTG   = 0;
                        r2.luongThoiGian = 0;
                        r2.tongLuong     = 0;

                        #region khau tru
                        r.ThueTNCN    = 0;
                        r.BH105       = 0;
                        r.phiCongDoan = 0;
                        r2.BH105      = 0;
                        if (e1["coBH"] != DBNull.Value && e1.coBH)
                        {
                            if (e1["coBH_ngay"] != DBNull.Value && e1.coBH_ngay < denNgay)
                            {
                                r.BH105 = (r.luongCB + r.luongPC) * 10.5 / 100;
                            }
                        }
                        r.tongKhauTru  = r.BH105 + r.khoanTruKhac + r.phiCongDoan;
                        r2.tongKhauTru = 0;
                        #endregion
                        int soNguoiPhuThuoc = (int)Provider.ExecSqlScalar(string.Format("select isnull(SoNguoiPhuThuoc,0) from tblEmployee where employeeID ='{0}'", eID));
                        r.SoNguoiPhuThuoc       = soNguoiPhuThuoc;
                        r.LuongThucNhanTinhThue = r.tongLuong - (r.tongLuong > 0 ? r.tongKhauTru : 0); //có lương mới trừ
                        // Nếu thực nhận tính thuế < 9tr. Không phải tính.
                        if (r.LuongThucNhanTinhThue > 9000000)
                        {
                            r.ThueTNCN = TinhThueTNCN(r.LuongThucNhanTinhThue, r.SoNguoiPhuThuoc);
                        }

                        r.tongKhauTru        += r.ThueTNCN;
                        r.actualBankTransfer  = r.tongLuong - (r.tongLuong > 0 ? r.tongKhauTru : 0);//có lương mới trừ
                        r2.actualBankTransfer = 0;

                        r.analyzeDate      = r2.analyzeDate = DateTime.Now;
                        r.analyzeBy        = r2.analyzeBy = UserDoing.id;
                        r.statePushServer  = "edit";
                        r2.statePushServer = "edit";

                        ds.tbBangLuongThang.Rows.Add(r);
                        if (hp.luongCu != null)
                        {
                            ds.tbBangLuongThang.Rows.Add(r2);
                        }
                    }
                    catch (Exception ex)
                    {
                        lp.OutMessage("EmpID " + eID + " ERR: " + ex.Message);
                    }
                    lp.CurrentValue += 1;
                }

                if (ds.tbBangLuongThang.GetChanges() == null)
                {
                    lp.OutMessage("\n>> " + Lng.Luong_AnalyzeData.emptmsg);
                }
                else
                {
                    var rowChanged = ds.tbBangLuongThang.GetChanges().Rows.Count;
                    lp.OutMessage("\n>> Commit data to database...");
                    SqlParameter pa = new SqlParameter("dtBangLuongThang", SqlDbType.Structured);
                    pa.TypeName = "dtBangLuongThang";
                    pa.Value    = ds.tbBangLuongThang;
                    Provider.ExecuteNonQuery("p_tinhLuong_updateBangLuongThang", pa);
                    //Provider.UpdateData(ds, ds.tbBangLuongThang.TableName);
                    lp.OutMessage("\n>> " + Lng.Luong_AnalyzeData.msg_1 + "(" + rowChanged + ") bản ghi");
                }
                lp.OutMessage(Lng.Luong_AnalyzeData.msg_2);
            }
            catch (Exception ex)
            {
                lp.OutMessage(ex.Message);
            }
        }