private void btnDoiCa_Click(object sender, EventArgs e)
        {
            // kiểm tra xem nếu tồn tại 1 ca nào đó rồi thì gửi ca đó đi, nếu chưa tồn tại ca ( chế độ hàng loạt, tbXNCa null thì gửi đi null
            var     currShift = (cCa)tbXNCa.Tag;
            frmDSCa frm       = new frmDSCa {
                StartPosition = FormStartPosition.CenterParent, SelectedShift = currShift
            };

            frm.ShowDialog();
            // sau khi showdialog và nhận được ca từ form xác nhận thì tiến hành fill và tính toán
            if (frm.SelectedShift == null)
            {
                return;
            }
            currShift   = frm.SelectedShift;
            tbXNCa.Tag  = currShift;
            tbXNCa.Text = (currShift != null) ? currShift.Code : string.Empty;
            //nếu ca tự do thì mặc định check VaoTreLaCV, RaSomLaCV
            if (currShift != null && currShift.ID < int.MinValue + 100)
            {
                checkXNVaoTreTinhCV.Checked = true;
                checkXNRaaSomTinhCV.Checked = true;
            }
            linkLabelTinhToan_LinkClicked(null, null);
        }
        private void btnChonCa_Click(object sender, EventArgs e)
        {
            // kiểm tra xem nếu tồn tại 1 ca nào đó rồi thì gửi ca đó đi, nếu chưa tồn tại ca ( chế độ hàng loạt, tbXNCa null thì gửi đi null
            var     currShift = (cCa)tbCa.Tag;
            frmDSCa frm       = new frmDSCa {
                StartPosition = FormStartPosition.CenterParent, SelectedShift = currShift
            };

            frm.ShowDialog();
            // sau khi showdialog và nhận được ca từ form xác nhận thì tiến hành fill và tính toán
            if (frm.SelectedShift == null)
            {
                return;
            }
            currShift = frm.SelectedShift;
            tbCa.Tag  = currShift;
            tbCa.Text = (currShift != null) ? currShift.Code : string.Empty;
            //if (currShift != null && currShift.ID != int.MinValue) {
            if (currShift != null && currShift.ID > int.MinValue + 100)              //ver 4.0.0.4	ko phải ca tự do thì điền giờ chuẩn theo quy định ca vào
            {
                dtpBDLam.Value = DateTime.Today.Date.Add(currShift.Duty.Onn);
                dtpKTLam.Value = DateTime.Today.Date.Add(currShift.Duty.Off);
            }
            else if (currShift != null && currShift.ID < int.MinValue + 100)             // ca tự do thì mặc định check VaoTreLaCV, RaSomLaCV
            {
                checkXNVaoTreTinhCV.Checked = true;
                checkXNRaaSomTinhCV.Checked = true;
            }
            linkTinhLaiCong_LinkClicked(null, null);
        }
        private void btnChonCa_Them_Click(object sender, EventArgs e)
        {
            // kiểm tra xem nếu tồn tại 1 ca nào đó rồi thì gửi ca đó đi, nếu chưa tồn tại ca ( chế độ hàng loạt, tbXNCa null thì gửi đi null
            var     currShift = (cCa)tbCa_Them.Tag;
            frmDSCa frm       = new frmDSCa {
                StartPosition = FormStartPosition.CenterParent,
                SelectedShift = currShift
            };

            frm.ShowDialog();
            // sau khi showdialog và nhận được ca từ form xác nhận thì tiến hành fill và tính toán
            if (frm.SelectedShift == null)
            {
                return;
            }
            currShift      = frm.SelectedShift;
            tbCa_Them.Tag  = currShift;
            tbCa_Them.Text = (currShift != null) ? currShift.Code : string.Empty;
            DataRowView rowView  = (DataRowView)dgrdGioKDQD.SelectedRows[0].DataBoundItem;
            var         ngayCong = (cNgayCong)rowView["cNgayCong"];
            var         CIO      = (rowView["cCheckInOut"] == DBNull.Value) ? null : (cCheckInOut)rowView["cCheckInOut"];
            var         ngay     = ngayCong.Ngay;

            if (currShift == null || currShift.ID < int.MinValue + 100)            //ver 4.0.0.4	// ko có ca hoặc ca tự do thì lấy mặc định 00:00
            {
                dtpVao_Them.Value = ngay;
                dtpRaa_Them.Value = ngay;
            }
            else
            {
                if (currShift.QuaDem && CIO != null && CIO.HaveINOUT == -2)                 // có vào ko có ra thì cứ add theo ngày công
                {
                    ngay = ngay.AddDays(-1d);
                }
                DateTime vao = ngay.Add(currShift.TOD_Duty.Onn);
                DateTime raa = ngay.Add(currShift.TOD_Duty.Off);
                dtpVao_Them.Value = vao;
                dtpRaa_Them.Value = raa;
            }
        }
        private void btnChonCa_Suaa_Click(object sender, EventArgs e)
        {
            // kiểm tra xem nếu tồn tại 1 ca nào đó rồi thì gửi ca đó đi, nếu chưa tồn tại ca ( chế độ hàng loạt, tbXNCa null thì gửi đi null
            var     currShift = (cCa)tbCa_Suaa.Tag;
            frmDSCa frm       = new frmDSCa {
                StartPosition = FormStartPosition.CenterParent,
                SelectedShift = currShift
            };

            frm.ShowDialog();
            // sau khi showdialog và nhận được ca từ form xác nhận thì tiến hành fill và tính toán
            if (frm.SelectedShift == null)
            {
                return;
            }
            currShift      = frm.SelectedShift;
            tbCa_Suaa.Tag  = currShift;
            tbCa_Suaa.Text = (currShift != null) ? currShift.Code : string.Empty;
            DataRowView rowView  = (DataRowView)dgrdGioKDQD.SelectedRows[0].DataBoundItem;
            var         ngayCong = (cNgayCong)rowView["cNgayCong"];
            var         CIO      = (rowView["cCheckInOut"] == DBNull.Value) ? null : (cCheckInOut)rowView["cCheckInOut"];
            var         check    = (cCheck)rowView["cCheck"];
            var         ngay     = ngayCong.Ngay;

            //if (currShift == null || currShift.ID == int.MinValue) {
            if (currShift == null || currShift.ID < int.MinValue + 100)               //ver 4.0.0.4	// ko có ca hoặc ca tự do thì lấy mặc định 00:00
            {
                dtpGioMoi_Sua.Value = ngay;
            }
            else
            {
                // nếu ko có check thì nút chọn ca đã bị disable nên nếu click được thì chắc chắn đang thuộc 1 check-> chắc chắn thuộc 1CIO
                dtpGioMoi_Sua.Value = (check.Type == "I") ? ngay.Add(currShift.TOD_Duty.Onn) : ngay.Add(currShift.TOD_Duty.Off);
                if (check.Type == "O" && currShift.QuaDem && CIO != null && CIO.HaveINOUT == -2)
                {
                    dtpGioMoi_Sua.Value = ngay.AddDays(-1d).Add(currShift.TOD_Duty.Off);
                }
            }
        }