private void btnThucHien_Click(object sender, EventArgs e)
        {
            if (XL2.KiemtraKetnoiCSDL() == false)
            {
                return;
            }

            #region ko cho chỉnh sửa giờ nếu khoảng thời gian xem công tồn tại các ngày đã kết lương

            if (XL.Kiemtra(new DateTime(dtpThang.Value.Year, dtpThang.Value.Month, 1), new DateTime(dtpThang.Value.Year, dtpThang.Value.Month, DateTime.DaysInMonth(dtpThang.Value.Year, dtpThang.Value.Month))))
            {
                MessageBox.Show(string.Format(Resources.Text_KhoangTGDaKetCong_KoChinhSuaGioCC, "khai báo chấm công cho quản lý", "khai báo chấm công", ""),
                                Resources.Caption_ThongBao, MessageBoxButtons.OK);
                return;
            }

            #endregion


            #region lấy và kiểm tra dsnv được chọn

            BindingContext[dgrdDSNVTrgPhg.DataSource].EndCurrentEdit();
            //2. lấy danh sách nhân viên check, nếu chưa có nv nào check thì thông báo
            var listNV = (from DataGridViewRow dataGridViewRow in dgrdDSNVTrgPhg.Rows
                          let rowView = dataGridViewRow.DataBoundItem as DataRowView
                                        where (rowView["check"] != DBNull.Value && (bool)rowView["check"])
                                        select((cUserInfo)rowView["cUserInfo"]))
                         .ToArray();

            if (listNV.Length == 0)
            {
                ACMessageBox.Show(Resources.Text_ChuaChonNV, Resources.Caption_ThongBao, 2000);                 //
                GC.Collect();
            }

            #endregion

            #region lấy ds các ngày đã check

            var DSNgayCheck = (from object item in checklistNgay.CheckedItems select(DateTime) item).ToList();
            if (DSNgayCheck.Count == 0)
            {
                ACMessageBox.Show("Bạn chưa chọn ngày làm việc.", "Thông báo", 2000);
                return;
            }

            #endregion

            #region lấy thông tin

            var      ngay1      = DateTime.Today.Date;
            TimeSpan TimeSpanBD = dtpBDLam.Value.TimeOfDay;
            TimeSpan TimeSpanKT = dtpKTLam.Value.TimeOfDay;
            var      timeBD     = ngay1.Add(TimeSpanBD);
            var      timeKT     = ngay1.Add(TimeSpanKT);
            if (TimeSpanBD > TimeSpanKT)
            {
                timeKT = timeKT.AddDays(1d);
            }
            //var sophutOT = (checkXNLamThem.Checked && numSoPhutOT.Value > 0) ? (int)numSoPhutOT.Value : 0;
            TimeSpan OTCa = TimeSpan.Zero;            //ver 4.0.0.4
            if (checkXNLamThem.Checked && TimeSpan.TryParseExact(maskPhutTinhLamThem.Text, @"hh\:mm", CultureInfo.InvariantCulture, out OTCa) == false)
            {
                ACMessageBox.Show(Resources.Text_NhapThoiGianLamThemChuaHopLe, Resources.Caption_Loi, 2000);
                return;
            }
            var    sophutOT    = Convert.ToInt32(OTCa.TotalMinutes);  //ver 4.0.0.4
            var    TinhPCTC    = (checkTinhPC150.Checked);
            var    bVaoTreLaCV = checkXNVaoTreTinhCV.Checked;         //ver 4.0.0.4
            var    bRaaSomLaCV = checkXNRaaSomTinhCV.Checked;         //ver 4.0.0.4
            string lydo        = (cbLyDo.SelectedItem != null) ? cbLyDo.SelectedItem.ToString() : cbLyDo.SelectedText;
            string ghichu      = tbGhiChu.Text;

            #endregion

            #region hỏi lại trước khi thực hiện

            if (MessageBox.Show(Resources.Text_XacNhanThemChamCongTayChoQL, Resources.Caption_XacNhan, MessageBoxButtons.YesNo) == DialogResult.No)
            {
                return;
            }

            #endregion

            try
            {
                var ca = (tbCa.Tag == null) ? null : (cCa)tbCa.Tag;
                foreach (var nv in listNV)
                {
                    foreach (var ngay in DSNgayCheck)
                    {
                        DateTime TimeStrInn = ngay.Date.Add(TimeSpanBD);
                        DateTime TimeStrOut = ngay.Date.Add(TimeSpanKT);
                        if (TimeSpanBD > TimeSpanKT)
                        {
                            TimeStrOut = TimeStrOut.AddDays(1d);
                        }

                        if (ca.QuaDem && TimeSpanBD < TimeSpanKT && TimeSpanBD < XL2._04h30)
                        {
                            TimeStrInn = TimeStrInn.AddDays(1d);
                            TimeStrOut = TimeStrOut.AddDays(1d);
                        }

/*
 *                                              if (ca.ID == int.MinValue)
 *                                                      XL.TaoCaTuDo(ca, TimeStrInn, XL2._08gio, XL2.ChoPhepTre, XL2.ChoPhepSom, XL2.LamThemAfterOT, 1f, "8");
 *                                              else if (ca.ID == int.MinValue + 1)
 *                                                      XL.TaoCaTuDo(ca, TimeStrInn, XL2._12gio, XL2.ChoPhepTre, XL2.ChoPhepSom, XL2.LamThemAfterOT, 1.5f, "D");
 */
                        if (ca.ID < int.MinValue + 100)
                        {
                            XL.TaoCaTuDo(ca, TimeStrInn);                                                    //ver 4.0.0.4
                        }
                        bool match = XL.KiemtraThuocCa5(TimeStrInn, TimeStrOut, ngay, ca);
                        // trường hợp chỉ chấm công bình thường thì chỉ thêm giờ cho đơn giản
                        // các trường hợp xác nhận làm thêm x phút thì chuyển sang xác nhận
                        if (ca.ID < 0)
                        {
                            DAO5.ThemGioChoNV(nv.MaCC, TimeStrInn, "I", 21, lydo, ghichu);
                            DAO5.ThemGioChoNV(nv.MaCC, TimeStrOut, "O", 22, lydo, ghichu);
                            XL.XacNhan_CIO_A(nv.MaCC, TimeStrInn, TimeStrOut, ca, false, false, sophutOT, TinhPCTC, lydo, ghichu,
                                             bVaoTreLaCV, bRaaSomLaCV);
                        }
                        else if (ca.IsExtended || sophutOT > 0 || match == false)
                        {
                            // các trường hợp phải xác nhận là ca tự do, ca mở rộng, ca có làm thêm và giờ nhập ko nằm trong khoảng nhận diện
                            if (ca.TachCaDem)
                            {
                                var timeOutCa3 = ngay.Add(ca.catruoc.TOD_Duty.Off);
                                var timeInnCa1 = ngay.AddDays(1d).Add(ca.casauuu.TOD_Duty.Onn).Add(XL2._01giay);
                                DAO5.ThemGioChoNV(nv.MaCC, TimeStrInn, "I", 21, lydo, ghichu);
                                DAO5.ThemGioChoNV(nv.MaCC, timeOutCa3, "O", 22, "Hệ thống tự động thêm giờ đệm tách ca qua ngày", "Thực hiện tự động");
                                DAO5.ThemGioChoNV(nv.MaCC, timeInnCa1, "I", 21, "Hệ thống tự động thêm giờ đệm tách ca qua ngày", "Thực hiện tự động");
                                DAO5.ThemGioChoNV(nv.MaCC, TimeStrOut, "O", 22, lydo, ghichu);
                                XL.XacNhan_CIO_A(nv.MaCC, TimeStrInn, timeOutCa3, ca.catruoc, false, false, 0, TinhPCTC, lydo, ghichu,
                                                 bVaoTreLaCV, bRaaSomLaCV);                       //ver 4.0.0.4
                                XL.XacNhan_CIO_A(nv.MaCC, timeInnCa1, TimeStrOut, ca.casauuu, false, false, sophutOT, TinhPCTC, lydo, ghichu,
                                                 bVaoTreLaCV, bRaaSomLaCV);                       //ver 4.0.0.4
                            }
                            else
                            {
                                DAO5.ThemGioChoNV(nv.MaCC, TimeStrInn, "I", 21, lydo, ghichu);
                                DAO5.ThemGioChoNV(nv.MaCC, TimeStrOut, "O", 22, lydo, ghichu);
                                XL.XacNhan_CIO_A(nv.MaCC, TimeStrInn, TimeStrOut, ca, false, false, sophutOT, TinhPCTC, lydo, ghichu,
                                                 bVaoTreLaCV, bRaaSomLaCV);                       //ver 4.0.0.4
                            }
                        }
                        else
                        {
                            DAO5.ThemGioChoNV(nv.MaCC, TimeStrInn, "I", 21, lydo, ghichu);
                            DAO5.ThemGioChoNV(nv.MaCC, TimeStrOut, "O", 22, lydo, ghichu);
                        }
                    }
                }
                MyUtility.CheckedCheckBox(false, chkAllWKDays, chkAddSat, chkAddSun);                //ver 4.0.0.4
                ACMessageBox.Show("Đã thêm giờ chấm công cho quản lý.", Resources.Caption_ThongBao, 2000);
            }
            catch (Exception ex)
            {
                lg.Error(string.Format("[{0}]_[{1}]\n", this.Name, System.Reflection.MethodBase.GetCurrentMethod().Name), ex);
                MessageBox.Show(Resources.Text_CoLoi, Resources.Caption_Loi);
            }
        }