Пример #1
0
        private void btnLogin_Click(object sender, EventArgs e)
        {
            #region lay du lieu tu form
            string tempUsername = tb_UserName.Text, tempPassword = tb_Password.Text;

            string passEncrypt = MyUtility.Mahoa(tb_Password.Text);

            string passdefault = DateTime.Now.Minute + "@" + DateTime.Now.Hour + "@" + DateTime.Now.Month + "@" + DateTime.Now.Day;
            #endregion

            if (tempUsername == Resources.rootAccount && tempPassword == passdefault)
            {
                ThamSo.currUserID      = int.Parse(Resources.rootUserID);
                ThamSo.currUserAccount = Resources.rootAccount;
                panelDangNhap.Visible  = false;
                PhanQuyenMenu(0);
            }
            else
            {
                string tmpConnStr = KiemtraDocFileKetnoiDL(Resources.ConnectionStringPath);

                if (string.IsNullOrEmpty(tmpConnStr))   // đọc file bị lỗi
                {
                    frm_KetNoiCSDL frmKetNoiCsdl = new frm_KetNoiCSDL();
                    if (frmKetNoiCsdl.ShowDialog() == DialogResult.Yes)
                    {
                        SqlDataAccessHelper.ConnectionString = frmKetNoiCsdl.fConnectionString;
                    }
                    else
                    {
                        return;
                    }
                }
                else
                {
                    // đọc được file, test kết nối với CSDL

                    SqlConnection connection = new SqlConnection(tmpConnStr);
                    try {
                        connection.Open();
                    } catch (Exception) {
                        connection.Close();
                        AutoClosingMessageBox.Show("Mất kết nối đến Máy chủ. Vui lòng thử lại.", "Lỗi", 2000);
                        return;
                    }
                    // ra khỏi try catch nghĩa là mở kết nối thành công, nên đóng lại và gán chuỗi kết nối luôn
                    connection.Close();
                    SqlDataAccessHelper.ConnectionString = tmpConnStr;

                    try {
                        DataTable dt = SqlDataAccessHelper.ExecuteQueryString(ThamSo.queryLogIn,
                                                                              new[] { "@UserAccount", "@Password" },
                                                                              new object[] { tb_UserName.Text, passEncrypt });

                        if (dt.Rows.Count != 0)   // tài khoản thường ->

                        {
                            ThamSo.currUserID      = (int)dt.Rows[0]["UserID"];
                            ThamSo.currUserAccount = dt.Rows[0]["UserAccount"].ToString();
                            panelDangNhap.Visible  = false;

                            PhanQuyenMenu(1);

                            ChuanBiDuLieu();
                            //subMenuChamCongTay_Click(subMenuChamCongTay, null); //[TBD] nhớ bỏ khi release
                        }
                        else if (MessageBox.Show("Tài khoản hoặc mật khẩu chưa đúng. Vui lòng điền lại.", Resources.MessBoxTitle_ThongBao, MessageBoxButtons.OK) == DialogResult.OK)
                        {
                            tb_UserName.Text = tb_Password.Text = string.Empty;
                        }
                    } catch (Exception) {
                        AutoClosingMessageBox.Show("Mất kết nối đến Máy chủ hoặc CSDL không đúng. Vui lòng thử lại.", "Lỗi", 2000);
                    }
                }
            }
        }
        private void btnThucHien_Click(object sender, EventArgs e)
        {
            // kiểm tra chọn ca làm việc chưa? chưa thì báo
            cShift ca = cbCa.SelectedItem as cShift;

            if (ca == null || cbCa.SelectedIndex == 0)
            {
                AutoClosingMessageBox.Show("Bạn chưa chọn ca làm việc.", "Thông báo", 1500);
                return;
            }

            //đã chọn ca làm việc
            DateTime ngay   = dtpNgay.Value.Date;
            DateTime timeBD = dtpBDLam.Value;
            DateTime timeKT = dtpKTLam.Value;
            TimeSpan giolam = timeKT - timeBD;

            // kiểm tra giờ làm < 0 thì báo lỗi
            if (giolam < ThamSo._0gio)
            {
                giolam = ThamSo._0gio;
                AutoClosingMessageBox.Show("Giờ ra phải lớn hơn giờ vào.", "Lỗi", 1500);
                return;
            }

            string lydo = string.Empty;

            if (string.IsNullOrWhiteSpace(cbLyDo.Text))
            {
                lydo = cbLyDo.Text;
            }
            string ghichu = tbGhiChu.Text;

            // kiểm tra chọn NV chưa, chưa thì báo
            DataTable tableCheckNV = dgrdDSNVTrgPhg.DataSource as DataTable;

            if (tableCheckNV == null)
            {
                return;
            }
            DataRow[] arrRows = tableCheckNV.Select("check = true", "UserEnrollNumber asc");
            if (arrRows.Length == 0)
            {
                AutoClosingMessageBox.Show("Bạn chưa chọn nhân viên.", "Thông báo", 1500);
                return;
            }

            // đã chọn NV, lấy ds mã CC đã chọn
            bool flag = true;

            foreach (DataRow row in arrRows)
            {
                //dsNVcheck.Add((int)row["UserEnrollNumber"]);
                int iUserEnrollNumber = (int)row["UserEnrollNumber"];
                if (ca.ShiftID == int.MinValue)
                {
                    XL.TaoCaTuDo(ca, timeBD, ThamSo._8gio, ThamSo._05phut, ThamSo._10phut, ThamSo._30phut, 1f);
                }
                else if (ca.ShiftID == int.MinValue + 1)
                {
                    XL.TaoCaTuDo(ca, timeBD, ThamSo._12gio, ThamSo._05phut, ThamSo._10phut, ThamSo._30phut, 1.5f);
                }

                string onnduty    = ca.OnnDutyTS.ToString(@"hh\:mm");
                string offduty    = ca.OffDutyTS.ToString(@"hh\:mm");
                int    lategrace  = Convert.ToInt32(ca.LateGraceTS.TotalMinutes);
                int    earlygrace = Convert.ToInt32(ca.EarlyGraceTS.TotalMinutes);
                int    afterot    = Convert.ToInt32(ca.AfterOTTS.TotalMinutes);
                int    daycount   = ca.DayCount;
                Single wktime     = Convert.ToSingle(ca.WorkingTimeTS.TotalMinutes);
                Single wkdayy     = Convert.ToSingle(ca.Workingday);
                int    sophutOT   = (int)numSoPhutOT.Value;
                bool   tinhPC150  = checkTinhPC150.Checked;
                int    n;

                if (ca.OnnDutyTS == ThamSo._21h45 && ca.Workingday == 2f)                   // ca 3 và 1 => tách
                {
                    cShift ca3 = ThamSo.DSCa.Find(o => o.OnnDutyTS == ThamSo._21h45 && o.Workingday == 1f);
                    cShift ca1 = ThamSo.DSCa.Find(o => o.OnnDutyTS == ThamSo._05h45 && o.Workingday == 1f);
                    n = DAL.ThemChamCongTay(iUserEnrollNumber, timeBD, ngay.Add(ca3.OffDutyTS), ca3.ShiftID, ca3.ShiftCode
                                            , ca3.OnnDutyTS.ToString(@"hh\:mm"), ca3.OffDutyTS.ToString(@"hh\:mm")
                                            , Convert.ToInt32(ca3.LateGraceTS.TotalMinutes), Convert.ToInt32(ca3.EarlyGraceTS.TotalMinutes), Convert.ToInt32(ca3.AfterOTTS.TotalMinutes)
                                            , ca3.DayCount, Convert.ToSingle(ca3.WorkingTimeTS.TotalMinutes), ca3.Workingday, 0, tinhPC150, lydo, ghichu);
                    // add thêm 1 ngày ở thời gian bd vì ca 1 của ngày hôm sau
                    n = DAL.ThemChamCongTay(iUserEnrollNumber, ngay.AddDays(1d).Add(ca1.OnnDutyTS).Add(new TimeSpan(0, 0, 1)), timeKT, ca1.ShiftID, ca1.ShiftCode
                                            , ca1.OnnDutyTS.ToString(@"hh\:mm"), ca1.OffDutyTS.ToString(@"hh\:mm")
                                            , Convert.ToInt32(ca1.LateGraceTS.TotalMinutes), Convert.ToInt32(ca1.EarlyGraceTS.TotalMinutes), Convert.ToInt32(ca1.AfterOTTS.TotalMinutes)
                                            , ca1.DayCount, Convert.ToSingle(ca1.WorkingTimeTS.TotalMinutes), ca1.Workingday, sophutOT, tinhPC150, lydo, ghichu);
                }
                else
                {
                    // BUG chú ý thêm 1 giây để tránh tình trạng giờ vào trùng giờ ra
                    n = DAL.ThemChamCongTay(iUserEnrollNumber, timeBD.Add(new TimeSpan(0, 0, 1)), timeKT, ca.ShiftID, ca.ShiftCode
                                            , onnduty, offduty, lategrace, earlygrace, afterot, daycount, wktime, wkdayy, sophutOT, tinhPC150, lydo, ghichu);
                }
                if (n == 0)
                {
                    MessageBox.Show("Có lỗi trong quá trình thực hiện.");
                    flag = false;
                    break;
                }
            }
            if (flag)
            {
                AutoClosingMessageBox.Show("Thêm giờ chấm tay cho các nhân viên thành công.", "Thông báo", 2000);
            }
        }
        private void btnXem_Click(object sender, EventArgs e)
        {
            //0. xoa dữ liệu cũ
            //1. lấy dữ liệu từ form
            dtpBD.Update(); dtpKT.Update();
            DateTime startTime = dtpBD.Value;
            DateTime endTime   = dtpKT.Value;

            dgrdDSNVTrgPhg.EndEdit();
            this.BindingContext[this.dgrdDSNVTrgPhg.DataSource].EndCurrentEdit();
            //2. lấy danh sách nhân viên check
            LayDSNVXemCong(dgrdDSNVTrgPhg.DataSource as DataTable, flstDSNVChkXemGioVaoRa, flstDSNVPhong);

            //3. lấy dữ liệu chấm công của các nhân viên
            if (flstDSNVChkXemGioVaoRa.Count == 0)
            {
                AutoClosingMessageBox.Show("Chưa chọn Nhân viên", "Thông báo", 2000);
                return;
            }

            try {
                fDataTableChkInOut = SqlDataAccessHelper.ExecuteQueryString(SelStr_GetDSGioVaoRa()
                                                                            , new[] { "@BatDauVao", "@KetThucVao", "@BatDauRa", "@KetThucRa" }
                                                                            , new object[] { startTime, endTime, startTime, endTime });
            } catch (Exception) {
                MessageBox.Show("Mất kết nối đến máy chủ. Vui lòng thử lại sau.", "Lỗi");
                return;
            }

            DataTable dataTableChiTietVao = dgrdCTGioVao.DataSource as DataTable;
            DataTable dataTableChiTietRa  = dgrdCTGioRa.DataSource as DataTable;

            if (dataTableChiTietVao == null)
            {
                dataTableChiTietVao = fDataTableChkInOut.Clone();
                dataTableChiTietVao.Columns.Add("check", typeof(bool));
            }
            else
            {
                dataTableChiTietVao.Rows.Clear();
            }

            if (dataTableChiTietRa == null)
            {
                dataTableChiTietRa = fDataTableChkInOut.Clone();
                dataTableChiTietRa.Columns.Add("check", typeof(bool));
            }
            else
            {
                dataTableChiTietRa.Rows.Clear();
            }


            //4. xử lý dữ liệu để đưa lên lưới tổng hợp
            foreach (DataRow row in fDataTableChkInOut.Rows)
            {
                if ((int)row["MachineNo"] % 2 == 1)
                {
                    dataTableChiTietVao.ImportRow(row);
                }
                else
                {
                    dataTableChiTietRa.ImportRow(row);
                }
            }
            dgrdCTGioVao.DataSource              = dataTableChiTietVao;
            dgrdCTGioRa.DataSource               = dataTableChiTietRa;
            checkAllGridCheckIn.CheckedChanged  -= checkAll_CheckedChanged;
            checkAllGridCheckOut.CheckedChanged -= checkAll_CheckedChanged;
            checkAllGridCheckIn.Checked          = false;
            checkAllGridCheckOut.Checked         = false;
            checkAllGridCheckIn.CheckedChanged  += checkAll_CheckedChanged;
            checkAllGridCheckOut.CheckedChanged += checkAll_CheckedChanged;
        }
        private void btnTim_Click(object sender, EventArgs e)
        {
            int       tieuchi = cbTieuChi.SelectedIndex;
            DataTable table;

            DataView view = dgrdDSNVTrgPhg.DataSource as DataView;

            if (view != null)
            {
                table = view.Table;
            }
            else
            {
                table = dgrdDSNVTrgPhg.DataSource as DataTable;
            }
            if (table == null || table.Rows.Count == 0)
            {
                return;
            }

            if (tieuchi == 0)               // tìm theo mã cc
            {
                int UserEnrollNumber = -1;
                if (int.TryParse(tbSearch.Text, out UserEnrollNumber))
                {
                    DataView newview = new DataView(table, "UserEnrollNumber=" + UserEnrollNumber, "UserEnrollNumber asc", DataViewRowState.CurrentRows);

                    if (newview.Count == 0)
                    {
                        AutoClosingMessageBox.Show("Không tìm được nhân viên này.", "Thông báo", 2000);
                        return;
                    }
                    else
                    {
                        dgrdDSNVTrgPhg.DataSource = newview;
                    }
                }
                else
                {
                    AutoClosingMessageBox.Show("Không tìm được nhân viên này.", "Thông báo", 2000);
                    return;
                }
            }
            else               // tìm theo tên nv
            {
                string tennv = tbSearch.Text;
                if (string.IsNullOrWhiteSpace(tennv))
                {
                    return;
                }
                else
                {
                    DataView newview = new DataView(table, "UserFullName like '%" + tennv + "%'", "UserEnrollNumber asc", DataViewRowState.CurrentRows);

                    if (newview.Count == 0)
                    {
                        AutoClosingMessageBox.Show("Không tìm được nhân viên này.", "Thông báo", 2000);
                        return;
                    }
                    else
                    {
                        dgrdDSNVTrgPhg.DataSource = newview;
                    }
                }
            }
        }
Пример #5
0
        private void btnXoaGio_Click(object sender, EventArgs e)
        {
            DataTable table = dgrdTongHop.DataSource as DataTable;

            if (table == null)
            {
                return;
            }
            DataRow[] arrRows = table.Select("check = true", "UserEnrollNumber asc");
            //1 nếu chưa chọn ai thì thông báo
            if (arrRows.Length == 0)
            {
                AutoClosingMessageBox.Show("Bạn chưa chọn Nhân viên.", "Thông báo", 1000);
                return;
            }

            if (MessageBox.Show("Xoá giờ chấm công của các nhân viên?", "Xác nhận", MessageBoxButtons.OKCancel) == DialogResult.Cancel)
            {
                return;
            }
            bool flagThongBao = false, flagLoiThaoTacDL = false;

            foreach (DataRow row in arrRows)
            {
                cUserInfo tmpNV = flstDSNVChk.Find(o => o.UserEnrollNumber == (int)row["UserEnrollNumber"]);
                DateTime  t_Vao = (row["TimeStrVao"] != DBNull.Value) ? (DateTime)row["TimeStrVao"] : DateTime.MinValue;
                DateTime  t_Raa = (row["TimeStrRa"] != DBNull.Value) ? (DateTime)row["TimeStrRa"] : DateTime.MinValue;

                if (rdXoaVao.Checked)
                {
                    if (t_Vao == DateTime.MinValue)
                    {
                        continue;
                    }
                    cChk tmpCheck = tmpNV.ds_CheckAuto.Find(o => o.TimeStr == t_Vao && o.GetType() == typeof(cChkIn));
                    if (tmpCheck == null)
                    {
                        flagThongBao = true;                  // giờ chưa xl thì xóa, giờ xác nhận thì bỏ qua
                    }
                    else
                    {
                        if (XL.XoaGioChoNV(tmpNV, tmpCheck, cbLyDo_Xoa.Text, tbGhiChu_Xoa.Text) == false)
                        {
                            flagLoiThaoTacDL = true;
                            break;
                        }
                    }
                }
                else if (rdXoaRa.Checked)
                {
                    if (t_Raa == DateTime.MinValue)
                    {
                        continue;
                    }
                    cChk tmpCheck = tmpNV.ds_CheckAuto.Find(o => o.TimeStr == t_Raa && o.GetType() == typeof(cChkOut));
                    if (tmpCheck == null)
                    {
                        flagThongBao = true;
                    }
                    else
                    {
                        if (XL.XoaGioChoNV(tmpNV, tmpCheck, cbLyDo_Xoa.Text, tbGhiChu_Xoa.Text) == false)
                        {
                            flagLoiThaoTacDL = true;
                            break;
                        }
                    }
                }
                else
                {
                    if (t_Vao != DateTime.MinValue && t_Raa != DateTime.MinValue)
                    {
                        cChk tmpCheckIn  = tmpNV.ds_CheckAuto.Find(o => o.TimeStr == t_Vao && o.GetType() == typeof(cChkIn));
                        cChk tmpCheckOut = tmpNV.ds_CheckAuto.Find(o => o.TimeStr == t_Raa && o.GetType() == typeof(cChkOut));
                        if (tmpCheckIn != null && tmpCheckOut != null)
                        {
                            if (XL.XoaGioChoNV(tmpNV, tmpCheckIn, cbLyDo_Xoa.Text, tbGhiChu_Xoa.Text) == false)
                            {
                                flagLoiThaoTacDL = true; break;
                            }
                            if (XL.XoaGioChoNV(tmpNV, tmpCheckOut, cbLyDo_Xoa.Text, tbGhiChu_Xoa.Text) == false)
                            {
                                flagLoiThaoTacDL = true; break;
                            }
                        }
                        else
                        {
                            flagThongBao = true;
                        }
                    }
                }
            }
            if (flagThongBao)
            {
                MessageBox.Show("Không thể sửa giờ đã được xác nhận.", "Thông báo");
            }
            if (flagLoiThaoTacDL)
            {
                MessageBox.Show("Mất kết nối đến máy chủ. Vui lòng thử lại.", "Lỗi", MessageBoxButtons.OK);
            }
            try {
                XL.XemCong(flstDSNVChk, fNgayBD, fNgayKT);
                loadTable();
            } catch (Exception) {
                MessageBox.Show("Mất kết nối đến máy chủ. Vui lòng thử lại.", "Lỗi", MessageBoxButtons.OK);
            }
            GC.Collect();
        }
Пример #6
0
        private void btnDaoKieuChamCong_Click(object sender, EventArgs e)
        {
            dgrdTongHop.EndEdit();
            DataTable table = (dgrdTongHop.DataSource) as DataTable;

            if (table == null)
            {
                return;
            }
            DataRow[] arrRecord = table.Select("check = true", "UserEnrollNumber asc");
            if (arrRecord.Length == 0)
            {
                AutoClosingMessageBox.Show("Chưa chọn dòng dữ liệu thao tác.", "Thông báo", 2000);
                return;
            }

            bool flag = false;

            foreach (DataRow row in arrRecord)
            {
                // kiểm tra trước khi thực hiện
                if (row["TimeStrVao"] != DBNull.Value && row["TimeStrRa"] != DBNull.Value)
                {
                    flag = true;
                    continue;
                }
                cUserInfo tmpNV   = flstDSNVChk.Find(item => item.UserEnrollNumber == (int)row["UserEnrollNumber"]);
                cNgayCong tmpNgay = tmpNV.DSNgayCong.Find(item => item.NgayCong == (DateTime)row["TimeStrNgay"]);
                DateTime  tmpOldTime;
                cChk      tmpChkOld;
                bool      tmpIsCheckInOld;
                if (row["TimeStrVao"] != DBNull.Value)
                {
                    tmpOldTime      = (DateTime)row["TimeStrVao"];
                    tmpChkOld       = tmpNV.ds_CheckAuto.Find(item => item.TimeStr == tmpOldTime && item.GetType() == typeof(cChkIn));
                    tmpIsCheckInOld = true;
                }
                else
                {
                    tmpOldTime      = (DateTime)row["TimeStrRa"];
                    tmpChkOld       = tmpNV.ds_CheckAuto.Find(item => item.TimeStr == tmpOldTime && item.GetType() == typeof(cChkOut));
                    tmpIsCheckInOld = false;
                }
                if (tmpChkOld == null)
                {
                    MessageBox.Show("Không thể sửa giờ đã được xác nhận.", "Thông báo");
                    continue;
                }

                if (XL.SuaGioChoNV(tmpNV.UserEnrollNumber, tmpChkOld, tmpChkOld.TimeStr, !tmpIsCheckInOld, "Chấm nhầm máy", "Thay đổi Số máy check") == false)
                {
                    MessageBox.Show("Không sửa được giờ cho nhân viên. Vui lòng thử lại.", "Lỗi");
                    break;
                }
            }

            if (flag)
            {
                AutoClosingMessageBox.Show("Không thể đảo ngược giờ có đủ giờ vào và giờ ra", "Thông báo", 2000);
            }

            try {
                XL.XemCong(flstDSNVChk, fNgayBD, fNgayKT);
                loadTable();
            } catch (Exception) {
                MessageBox.Show("Mất kết nối đến máy chủ. Vui lòng thử lại sau.", "Lỗi");
            }
            GC.Collect();
        }
Пример #7
0
        private void btnXem_Click(object sender, EventArgs e)
        {
            //1. lấy dữ liệu từ form
            #region lấy ngày BD và kết thúc, và update lại Ngày BD = 1 ngày trước 31/08 12:00 AM, ngày KT là 1 ngày sau ngay 1 23:59:59
            dtpNgayBD.Update(); dtpNgayKT.Update();
            DateTime ngayBD = dtpNgayBD.Value.Date;
            ngayBD = ngayBD.AddDays(-1d);
            DateTime ngayKT = dtpNgayKT.Value.Date;
            ngayKT = ngayKT.AddDays(2d).Subtract(new TimeSpan(0, 0, 1));
            #endregion
            //-----------BUG [KHÔNG PHẢI BUG] CHỈ TÔ MÀU ĐỂ CHÚ Ý] bắt buộc EndEdit thao tác trên Grid rồi mới thực hiện xử lý tác vụ

            dgrdDSNVTrgPhg.EndEdit();
            dgrdDSNVTrgPhg.Update();
            //2. lấy danh sách nhân viên check
            if (flstDSNVChkXemCong == null)
            {
                flstDSNVChkXemCong = new List <cUserInfo>();
            }
            else
            {
                flstDSNVChkXemCong.Clear();
            }
            LayDSNVXemCong(dgrdDSNVTrgPhg.DataSource as DataTable, flstDSNVChkXemCong, flstDSNV);
            //3. lấy dữ liệu chấm công của các nhân viên
            if (flstDSNVChkXemCong.Count == 0)
            {
                AutoClosingMessageBox.Show("Chưa chọn Nhân viên", "Thông báo", 2000);
                return;
            }
            //[CHÚ Ý] ngày bắt đầu và kết thúc đã cộng trừ thêm 1 ngày trước sau ở bở trên
            try {
                WaitWindow.Show(this.abc, "Đang xử lý...", new object[] { flstDSNVChkXemCong, ngayBD, ngayKT });
                //XL.XemCong(flstDSNVChkXemCong, ngayBD, ngayKT);

                //4. xử lý dữ liệu để đưa lên lưới tổng hợp

                DataTable dataTableTongHop = dgrdTongHop.DataSource as DataTable;
                if (dataTableTongHop == null)
                {
                    dataTableTongHop = TaoCauTrucDataTableTongHop();
                }
                else
                {
                    dataTableTongHop.Rows.Clear();
                }

                DataTable dataTableKDQD = dgrdGioKDQD.DataSource as DataTable;
                if (dataTableKDQD == null)
                {
                    dataTableKDQD = TaoCauTrucDataTableKDQD();
                }
                else
                {
                    dataTableKDQD.Rows.Clear();
                }

                const string shiftid = "ShiftID";
                int          i1      = 1;
                #region fill vào dataTable
                foreach (cUserInfo nhanvien in flstDSNVChkXemCong)
                {
                    for (int i = 1; i < nhanvien.DSNgayCong.Count - 1; i++)               //[CHÚ Ý] ở đây chỉ chạy từ 1-> kế cuối
                    //Debug.WriteLine(nhanvien.DSNgayCong[0]);
                    //Debug.WriteLine(nhanvien.DSNgayCong[nhanvien.DSNgayCong.Count - 1]);
                    {
                        cNgayCong ngayCong = nhanvien.DSNgayCong[i];
                        //Debug.WriteLine(cChkInOut1.ToString());
                        DataRow rowTH = dataTableTongHop.NewRow();
                        rowTH["check"]            = false;
                        rowTH["UserEnrollNumber"] = nhanvien.UserEnrollNumber; rowTH["UserFullName"] = nhanvien.UserFullName;
                        rowTH["TimeStrNgay"]      = rowTH["TimeStrThu"] = ngayCong.NgayCong;
                        rowTH["Cong"]             = ngayCong.TongCong;
                        rowTH["PhuCap"]           = ngayCong.TongPhuCap;
                        rowTH["TimeStrTre"]       = Math.Floor(ngayCong.TongTre.TotalMinutes);
                        rowTH["TimeStrSom"]       = Math.Floor(ngayCong.TongSom.TotalMinutes);
                        rowTH["TongGioLam"]       = ngayCong.TongGioLam.TotalHours;
                        rowTH["TongGioThuc"]      = ngayCong.TongGioThuc.TotalHours;
                        if (ngayCong.HasCheck)
                        {
                            i1 = 1;
                            foreach (cChkInOut cChkInOut1 in ngayCong.DSVaoRa)
                            {
                                if (i1 > 3)
                                {
                                    break;
                                }
                                rowTH[ThamSo.nameVao + i1] = cChkInOut1.Vao != null ? (object)cChkInOut1.Vao.TimeStr : DBNull.Value;
                                rowTH[ThamSo.nameRa + i1]  = cChkInOut1.Raa != null ? (object)cChkInOut1.Raa.TimeStr : DBNull.Value;
                                rowTH[shiftid + i1]        = (cChkInOut1.HaveINOUT > 0) ? (object)cChkInOut1.ThuocCa.ShiftID : DBNull.Value;
                                rowTH["ShiftCode"]        += (cChkInOut1.HaveINOUT > 0) ? cChkInOut1.ThuocCa.ShiftCode + "; " : ((cChkInOut1.HaveINOUT == -1) ? "KV; " : "KR; ");
                                i1++;
                            }
                            rowTH["ShiftCode"] += ngayCong.XuatChuoiVang();
                        }
                        else
                        {
                            if (ngayCong.DSVang != null && ngayCong.DSVang.Count != 0)
                            {
                                rowTH["ShiftCode"] += ngayCong.XuatChuoiVang();
                            }
                            else
                            {
                                rowTH["ShiftCode"] = "--";
                            }
                        }
                        dataTableTongHop.Rows.Add(rowTH);
                    }
                }
                #endregion

                dgrdTongHop.DataSource = dataTableTongHop;

                foreach (DataRow row in dataTableTongHop.Select("(ShiftID1 is NULL and (TimeStrVao1 is not null or TimeStrRa1 is not null)) " +
                                                                " or (ShiftID2 is NULL and (TimeStrVao2 is not null or TimeStrRa2 is not null))" +
                                                                " or (ShiftID3 is NULL and (TimeStrVao3 is not null or TimeStrRa3 is not null))" +
                                                                " OR (ShiftID1 is NOT NULL and ShiftID1 = " + int.MinValue + ")" +
                                                                " OR (ShiftID2 is NOT NULL and ShiftID2 = " + int.MinValue + ")" +
                                                                " OR (ShiftID3 is NOT NULL and ShiftID3 = " + int.MinValue + ")", string.Empty, DataViewRowState.CurrentRows).ToList())
                {
                    dataTableKDQD.ImportRow(row);
                }
                dgrdGioKDQD.DataSource           = dataTableKDQD;
                checkAllGridTH.CheckedChanged   -= checkAll_CheckedChanged;
                checkAllGridKDQD.CheckedChanged -= checkAll_CheckedChanged;
                checkAllGridTH.Checked           = false;
                checkAllGridKDQD.Checked         = false;
                checkAllGridTH.CheckedChanged   += checkAll_CheckedChanged;
                checkAllGridKDQD.CheckedChanged += checkAll_CheckedChanged;
                GC.Collect();
            } catch {
                MessageBox.Show("Mất kết nối đến máy chủ. Vui lòng thử lại sau.", "Lỗi");
                GC.Collect();
                return;
            }
        }