private void btnDangnhap_Click(object sender, EventArgs e)
        {
            #region lay du lieu tu form
            string tempUsername = tbTaikhoan.Text, tempPassword = tb_Password.Text;

            var passroot = string.Empty;
            passroot = ((DateTime.Now.Minute % 2 == 0))
                                ? DateTime.Now.Minute + "@" + DateTime.Now.Hour + "$" + DateTime.Now.Month + "^" + DateTime.Now.Day
                                : DateTime.Now.Minute + "!" + DateTime.Now.Hour + "#" + DateTime.Now.Month + "%" + DateTime.Now.Day;
            #endregion

            string tmpConnStr = string.Empty, currUserAccount = string.Empty;
            int    loaiTK = 1, currUserID = 0;
            var    kq = XL.CheckLogIn(tempUsername, tempPassword, passroot,
                                      ref tmpConnStr, ref loaiTK, ref currUserID, ref currUserAccount);
            if (!kq)
            {
                tb_Password.Text = string.Empty;
                return;
            }
            // kq = true

            XL2.currUserID      = currUserID;
            XL2.currUserAccount = currUserAccount;
            XL.KhoiTaoDSPhongBan(XL2.TatcaPhongban);             // logic khởi tạo ds tất cả phòng ban mà tài khoản này được thao tác

            XL2.QuyenThaoTac = XL.LayPhanQuyen();

            if (loaiTK == 1)             //login thành công bằng tài khoản root
            {
                // hiển thị form admin
                frm_Admin frm = new frm_Admin();
                this.Hide();
                frm.Show();
            }
            else
            {
                XL.SaveSetting(lastAccLogIn: currUserAccount);
                XL.ChuanBiDSLichTrinhVaCa();

/*
 *                              SqlDataAccessHelper.ConnectionString = @"Data Source=.\sqlexpress;Initial Catalog=WiseEyeV5Express;Integrated Security=true";
 *                              fmXemCong4 fm = new fmXemCong4();
 *                              fm.Show();
 */
/*
 *                              fmTKeCongTheoNVu frm = new fmTKeCongTheoNVu();
 *                              this.Hide();
 *                              frm.ShowDialog();
 *                              this.Close();
 */

                frm_main frm = new frm_main();
                this.Hide();
                frm.ShowDialog();
                this.Close();

                // hiển thị form tài khoản thường
            }
        }
        private void frm_PhucHoiGioChamCong_Load(object sender, EventArgs e)
        {
            #region kiểm tra kết nối csdl , nếu mất kết nối thì đóng

            if (SqlDataAccessHelper.TestConnection(SqlDataAccessHelper.ConnectionString) == false)
            {
                ACMessageBox.Show(Resources.Text_MatKetNoiCSDL, Resources.Caption_Loi, 4000);
                Close();
                return;
            }

            #endregion

            XL.ChuanBiDSLichTrinhVaCa();

            #region             //2. lấy dữ liệu phòng ban được phép thao tác  và load treePhongBan ,
            // trường hợp ko có phòng ban nào được phép thao tác thì báo và thoát form

            XL.KhoiTaoDSPhongBan(m_DSPhg);             // tạo danh sách phòng ban chỉ userID này được thao tác
            if (m_DSPhg.Count == 0)
            {
                ACMessageBox.Show(Resources.Text_ChuaCapQuyenPhongBanThaoTac, Resources.Caption_ThongBao, 5000);
                Close();
                return;
            }
            XL.loadTreePhgBan(treePhongBan, XL2.TatcaPhongban, m_DSPhg);

            #endregion

            // đăng ký sự kiện cho tree và chọn topNode
            treePhongBan.AfterSelect += treePhongBan_AfterSelect;
            treePhongBan.SelectedNode = treePhongBan.TopNode;
        }
예제 #3
0
        private void frmQLNV_Load(object sender, EventArgs e)
        {
            #region kiểm tra kết nối csdl , nếu mất kết nối thì đóng

            if (SqlDataAccessHelper.TestConnection(SqlDataAccessHelper.ConnectionString) == false)
            {
                ACMessageBox.Show(Resources.Text_MatKetNoiCSDL, Resources.Caption_Loi, 4000);
                Close();
                return;
            }

            #endregion

            //2. lấy dữ liệu phòng ban được phép thao tác  và load treePhongBan : xoá dữ liệu trước và load
            XL.KhoiTaoDSPhongBan(m_DSPhg, XL2.currUserID);
            if (m_DSPhg.Count == 0)
            {
                ACMessageBox.Show(Resources.Text_ChuaCapQuyenPhongBanThaoTac, Resources.Caption_ThongBao, 5000);
                Close();
                return;
            }

            //2. lấy dữ liệu phòng ban được phép thao tác  và load treePhongBan : xoá dữ liệu trước và load
            XL.loadTreePhgBan(treePhongBan, XL2.TatcaPhongban, m_DSPhg);
            TreeNode parentNode0 = new TreeNode {
                Text = "Nhân viên chưa sắp xếp", Tag = null
            };
            treePhongBan.Nodes.Insert(0, parentNode0);


            // đăng ký sự kiện cho tree và chọn topNode
            treePhongBan.AfterSelect += treePhongBan_AfterSelect;
            treePhongBan.SelectedNode = treePhongBan.TopNode;
        }
        private void frm_KetCongBoPhan_Load(object sender, EventArgs e)
        {
            #region kiểm tra kết nối csdl , nếu mất kết nối thì đóng

            if (SqlDataAccessHelper.TestConnection(SqlDataAccessHelper.ConnectionString) == false)
            {
                ACMessageBox.Show(Resources.Text_MatKetNoiCSDL, Resources.Caption_Loi, 4000);
                Close();
                return;
            }

            #endregion

            try             //general try catch
            {
                #region     //2. lấy dữ liệu phòng ban được phép thao tác  và load treePhongBan ,
                // trường hợp ko có phòng ban nào được phép thao tác thì báo và thoát form

                XL.KhoiTaoDSPhongBan(m_DSPhg, XL2.currUserID);
                XL.loadTreePhgBan(treePhongBan, XL2.TatcaPhongban, m_DSPhg);

                #endregion
                dtpThang_ValueChanged(null, null);
                // đăng ký sự kiện cho tree và chọn topNode
                treePhongBan.AfterSelect += treePhongBan_AfterSelect;
                treePhongBan.SelectedNode = treePhongBan.TopNode;

                tbTenNVLapbieu.Text = Settings.Default.LastTenNVLapBieuChamCong;
                tbTenTrgBP.Text     = Settings.Default.LastTenTruongBP;
            } catch (Exception ex)             //general try catch
            {
                lg.Error(string.Format("[{0}]_[{1}]\n", this.Name, System.Reflection.MethodBase.GetCurrentMethod().Name), ex);
                MessageBox.Show(Resources.Text_CoLoi, Resources.Caption_Loi);
            }
        }
        private void frm_SuaGioHangLoat2_Load(object sender, EventArgs e)
        {
            if (SqlDataAccessHelper.TestConnection(SqlDataAccessHelper.ConnectionString) == false)
            {
                ACMessageBox.Show(Resources.Text_MatKetNoiCSDL, Resources.Caption_Loi, 3000);
                Close();
                return;
            }

            try             //general try catch
            {
                // 1. khởi tạo các biến cục bộ
                m_listIDPhongBan = new List <int>();
                #region                 //2. lấy dữ liệu phòng ban được phép thao tác  và load treePhongBan ,
                // trường hợp ko có phòng ban nào được phép thao tác thì báo và thoát form

                XL.KhoiTaoDSPhongBan(m_DSPhg, XL2.currUserID);                 // tạo danh sách phòng ban chỉ userID này được thao tác
                if (m_DSPhg.Count == 0)
                {
                    ACMessageBox.Show(Resources.Text_ChuaCapQuyenPhongBanThaoTac, Resources.Caption_ThongBao, 5000);
                    Close();
                    return;
                }
                XL.loadTreePhgBan(treePhongBan, XL2.TatcaPhongban, m_DSPhg);

                #endregion
            } catch (Exception ex)             //general try catch
            {
                lg.Error(string.Format("[{0}]_[{1}]\n", this.Name, System.Reflection.MethodBase.GetCurrentMethod().Name), ex);
                MessageBox.Show(Resources.Text_CoLoi, Resources.Caption_Loi);
            }
            // đăng ký sự kiện cho tree và chọn topNode
            treePhongBan.AfterSelect += treePhongBan_AfterSelect;
            treePhongBan.SelectedNode = treePhongBan.TopNode;
        }
예제 #6
0
        private void frm_PhanQuyen_Load(object sender, EventArgs e)
        {
            // load danh sách chức năng trước tất cả các chức năng mà tài khoản này được phép thao tác
            List <cChucNang> lstChucnang = XL2.TaoChucNang();

            checkQuyenThaotac.ValueMember   = "ID";
            checkQuyenThaotac.DataSource    = lstChucnang;
            checkQuyenThaotac.DisplayMember = "MoTa";
            checkQuyenThaotac.Refresh();

            // load tree view danh sách phòng ban mà tài khoản đang login được phép thao tác, nếu tài khoản login là root thì load hết danh sách phòng ban
            List <cPhongBan> dsphongThaotac = new List <cPhongBan>();

            if (XL2.currUserID != int.MaxValue)
            {
                XL.KhoiTaoDSPhongBan(dsphongThaotac, XL2.currUserID);
            }
            else
            {
                XL.KhoiTaoDSPhongBan(dsphongThaotac);
            }

            XL.loadTreePhgBan(treePhongBan, XL2.TatcaPhongban, dsphongThaotac);             // sau khi load xong sẽ có được list dspb1 chứa ds id các phòng ban mà currID hiện tại được phép thao tác
            // việc check các item quyền sẽ để cho sự kiện chọn tài khoản  thực hiện

            // load tất cả danh sách tài khoản trừ tài khoản đang login
            lstTaikhoan.DisplayMember = "UserAccount";
            if (XL2.currUserID != int.MaxValue)
            {
                lstTaikhoan.DataSource = LayDSTaikhoan(XL2.currUserID);
            }
            else
            {
                lstTaikhoan.DataSource = LayDSTatCaTaikhoan();
            }

            #region             // trường hợp đặc biệt ko có tài khoản nào
            if (lstTaikhoan.Items.Count == 0)
            {
                ACMessageBox.Show("Không có tài khoản để phân quyền.", "Thông báo", 2000);
                this.Close();
            }
            #endregion

            // chọn mặc định tài khoản đầu tiên, lúc này phát sự kiện index change sẽ check các item quyền
            // chọn tài khoản đồng thời sẽ check , uncheck các phòng ban được thao tác
            // đồng thời check , uncheck các chức năng được tài khoản được chọn được phép thao tác
            lstTaikhoan.SelectedIndex = 0;
        }
        private void frmCapNhatNVHangLoat_Load(object sender, EventArgs e)
        {
            List <cPhongBan> dspb = new List <cPhongBan>();

            XL.KhoiTaoDSPhongBan(dspb);
            XL.loadTreePhgBan(treePhongBan, XL2.TatcaPhongban, dspb);

            cbChucVu.DataSource    = DAO5.LoadDataSourceChucVu(false);
            cbChucVu.DisplayMember = "ChucVu";
            cbChucVu.ValueMember   = "IDChucVu";

            var tableLichTrinh = SqlDataAccessHelper.ExecuteQueryString("select * from Schedule");

            cbLichTrinh.DataSource    = tableLichTrinh;
            cbLichTrinh.DisplayMember = "SchName";
            cbLichTrinh.ValueMember   = "SchID";
        }
        private void frm_ChamCongTay_Load(object sender, EventArgs e)
        {
            #region kiểm tra kết nối csdl, mất kết nối thì thoát

            if (SqlDataAccessHelper.TestConnection(SqlDataAccessHelper.ConnectionString) == false)
            {
                ACMessageBox.Show(Resources.Text_MatKetNoiCSDL, Resources.Caption_Loi, 2000);
                Close();
                return;
            }

            #endregion

            dtpBDLam.ValueChanged += dtp_ValueChanged;
            dtpKTLam.ValueChanged += dtp_ValueChanged;

            #region             //2. lấy dữ liệu phòng ban được phép thao tác  và load treePhongBan ,
            // trường hợp ko có phòng ban nào được phép thao tác thì báo và thoát form
            XL.KhoiTaoDSPhongBan(m_DSPhg, XL2.currUserID);
            if (m_DSPhg.Count == 0)
            {
                ACMessageBox.Show(Resources.Text_ChuaCapQuyenPhongBanThaoTac, Resources.Caption_ThongBao, 5000);
                Close();
                return;
            }
            XL.loadTreePhgBan(treePhongBan, XL2.TatcaPhongban, m_DSPhg);

            #endregion

            // đăng ký sự kiện cho tree và chọn topNode
            treePhongBan.AfterSelect += treePhongBan_AfterSelect;
            treePhongBan.SelectedNode = treePhongBan.TopNode;

            #region chọn mặc định ca hành chánh cho cấp quản lý

            cCa defaultShift = XL.DSCa.Find(item => item.Duty.Onn == XL2._07h30 && item.Duty.Off == XL2._16gio && Math.Abs(item.Workingday - 1f) < 0.01f);             //tbd
            tbCa.Tag       = defaultShift;
            tbCa.Text      = defaultShift.Code;
            dtpBDLam.Value = DateTime.Today.Date.Add(defaultShift.Duty.Onn);
            dtpKTLam.Value = DateTime.Today.Date.Add(defaultShift.Duty.Off);

            #endregion
        }
예제 #9
0
        private void frm_XemCong_Load(object sender, EventArgs e)
        {
            #region kiểm tra kết nối csdl , nếu mất kết nối thì đóng

            if (SqlDataAccessHelper.TestConnection(SqlDataAccessHelper.ConnectionString) == false)
            {
                ACMessageBox.Show(Resources.Text_MatKetNoiCSDL, Resources.Caption_Loi, 4000);
                Close();
                return;
            }

            #endregion

            #region             //2. lấy dữ liệu phòng ban được phép thao tác  và load treePhongBan ,
            // trường hợp ko có phòng ban nào được phép thao tác thì báo và thoát form

            XL.KhoiTaoDSPhongBan(m_DSPhg, XL2.currUserID);             // tạo danh sách phòng ban chỉ userID này được thao tác
            if (m_DSPhg.Count == 0)
            {
                ACMessageBox.Show(Resources.Text_ChuaCapQuyenPhongBanThaoTac, Resources.Caption_ThongBao, 5000);
                Close();
                return;
            }
            XL.loadTreePhgBan(treePhongBan, XL2.TatcaPhongban, m_DSPhg);

            #endregion

            // đăng ký sự kiện cho tree và chọn topNode
            treePhongBan.AfterSelect += treePhongBan_AfterSelect;
            treePhongBan.SelectedNode = treePhongBan.TopNode;

            //vô hiệu hoá các nút chức năng ko có phân quyền
            btnThemXoaSuaHangLoat.Enabled = XL2.QuyenThaoTac.Any(o => o == (int)Quyen.ThemXoaSuaGioCC);
            btnThemXoaSuaDonGian.Enabled  = XL2.QuyenThaoTac.Any(o => o == (int)Quyen.ThemXoaSuaGioCC);
            btnKetCongThang.Enabled       = XL2.QuyenThaoTac.Any(o => o == (int)Quyen.KetCongThang);
            btnThemKBVang.Enabled         = XL2.QuyenThaoTac.Any(o => o == (int)Quyen.KhaiBaoVang);
            btnXoaKBVang.Enabled          = XL2.QuyenThaoTac.Any(o => o == (int)Quyen.KhaiBaoVang);
            btnXNCa.Enabled          = XL2.QuyenThaoTac.Any(o => o == (int)Quyen.XNCa_LamThem);
            btnXNCaVaLamThem.Enabled = XL2.QuyenThaoTac.Any(o => o == (int)Quyen.XNCa_LamThem);
            btnXNPCTC.Enabled        = XL2.QuyenThaoTac.Any(o => o == (int)Quyen.XN_PCTC);
            btnXacNhanPC100.Enabled  = XL2.QuyenThaoTac.Any(o => o == (int)Quyen.XN_PCDB);
        }
        private void frm_KhaiBaoVang_Load(object sender, EventArgs e)
        {
            #region kiểm tra kết nối csdl, mất kết nối thì thoát

            if (SqlDataAccessHelper.TestConnection(SqlDataAccessHelper.ConnectionString) == false)
            {
                ACMessageBox.Show(Resources.Text_MatKetNoiCSDL, Resources.Caption_Loi, 4000);
                Close();
                return;
            }

            #endregion

            #region             //2. lấy dữ liệu phòng ban được phép thao tác  và load treePhongBan ,
            // trường hợp ko có phòng ban nào được phép thao tác thì báo và thoát form

            XL.KhoiTaoDSPhongBan(m_DSPhg, XL2.currUserID);
            if (m_DSPhg.Count == 0)
            {
                ACMessageBox.Show(Resources.Text_ChuaCapQuyenPhongBanThaoTac, Resources.Caption_ThongBao, 5000);
                Close();
                return;
            }
            XL.loadTreePhgBan(treePhongBan, XL2.TatcaPhongban, m_DSPhg);

            #endregion

            // đăng ký sự kiện cho tree và chọn topNode
            treePhongBan.AfterSelect += treePhongBan_AfterSelect;
            treePhongBan.SelectedNode = treePhongBan.TopNode;


            // lấy tháng hiện tại cho dtpThang
            dtpThang.Value = currMonth;

            var tableLV = SqlDataAccessHelper.ExecuteQueryString("Select * from LoaiVang");
            cbLoaiVang.ValueMember   = "AbsentCode";
            cbLoaiVang.DisplayMember = "AbsentDescription";
            cbLoaiVang.DataSource    = tableLV;
            cbLoaiVang.SelectedIndex = 0;
        }
예제 #11
0
        private void frm_DiemDanhNV_Load(object sender, EventArgs e)
        {
            #region kiểm tra kết nối csdl trước
            if (SqlDataAccessHelper.TestConnection(SqlDataAccessHelper.ConnectionString) == false)
            {
                ACMessageBox.Show(Resources.Text_MatKetNoiCSDL, Resources.Caption_Loi, 4000);
                Close();
                return;
            }
            #endregion

            try             //general try catch
            {
                #region     //2. lấy dữ liệu phòng ban được phép thao tác  và load treePhongBan ,
                // trường hợp ko có phòng ban nào được phép thao tác thì báo và thoát form

                XL.KhoiTaoDSPhongBan(m_DSPhg, XL2.currUserID);
                if (m_DSPhg.Count == 0)
                {
                    ACMessageBox.Show(Resources.Text_ChuaCapQuyenPhongBanThaoTac, Resources.Caption_ThongBao, 5000);
                    Close();
                    return;
                }
                XL.loadTreePhgBan(treePhongBan, XL2.TatcaPhongban, m_DSPhg);

                #endregion

                // đăng ký sự kiện cho tree và chọn topNode
                treePhongBan.AfterSelect += treePhongBan_AfterSelect;
                treePhongBan.SelectedNode = treePhongBan.TopNode;
                dtpNgay.ValueChanged     += dtpNgay_ValueChanged;

                //vô hiệu hoá các button ko có phân quyền
                btnKBVangNhanh.Enabled = XL2.QuyenThaoTac.Any(o => o == (int)Quyen.KhaiBaoVang);
                btnXoaKBVang.Enabled   = XL2.QuyenThaoTac.Any(o => o == (int)Quyen.KhaiBaoVang);
            } catch (Exception ex)              //general try catch
            {
                lg.Error(string.Format("[{0}]_[{1}]\n", this.Name, System.Reflection.MethodBase.GetCurrentMethod().Name), ex);
                MessageBox.Show(Resources.Text_CoLoi, Resources.Caption_Loi);
            }
        }
예제 #12
0
        private void KetLuong(object sender, WaitWindowEventArgs e)
        {
            #region lấy thông tin từ csdl và khỏi tạo  nv

            var ngaydauthang              = MyUtility.FirstDayOfMonth(m_Thang);
            var ngaycuoithang             = MyUtility.LastDayOfMonth(m_Thang);
            var tableDSNVChiCongnhatThang = DAO.LayTableCongNhat(ngaydauthang);
            var tableDSThuchiThang        = DAO.LayDSThuchiThang(ngaydauthang);
            var tableKetcongNgay          = DAO.LayKetcongNgay(ngaydauthang, ngaycuoithang);
            var tableKetcongCa            = DAO.LayKetcongCa(ngaydauthang, ngaycuoithang);
            var tableXPVang = DAO.LayTableXPVang(ngaydauthang, ngaycuoithang);
            var tableNgayLe = DAO.DocNgayLe(ngaydauthang, ngaycuoithang);

            var dsnv       = new List <cUserInfo>();
            var dsphongban = new List <cPhongBan>();
            XL.KhoiTaoDSPhongBan(dsphongban);             // khởi tạo các phòng ban để cập nhật thông tin phòng ban cho nhân viên tính công
            XL.KhoiTaoDSNV_TinhLuong(dsnv, dsphongban);   // khởi tạo tất cả nhân viên tính công, bao gồm cả công nhật ngày(nv chính thức) và công nhật tháng

            #endregion

            #region             //load cong phu cap tung ngay cho tat ca nv, ke ca cong nhat, rieng truong hop cong nhat se xu ly ngay ben duoi

            foreach (var nv in dsnv)
            {
                nv.DSNgayCong = new List <cNgayCong>();
                nv.DSVang     = new List <cLoaiVang>();
                for (DateTime indexNgay = ngaydauthang; indexNgay <= ngaycuoithang; indexNgay = indexNgay.AddDays(1d))
                {
                    XL.LoadNgayCong(nv.MaCC, nv.DSNgayCong, indexNgay, tableKetcongNgay, tableKetcongCa);
                }
                XL.LoadDSXPVang_Le(nv.MaCC, tableXPVang, tableNgayLe, nv.DSVang);                //info trường hợp nhân viên công nhật sẽ được xử lý bên dưới
                XL.PhanPhoi_DSVang7(nv.DSVang, nv.DSNgayCong);

                XL.LoadThongtinLamViecCongNhat(nv.MaCC, ref nv.NgayBDCongnhat, ref nv.NgayKTCongnhat, ref nv.LoaiCN, nv.DSNgayCong, tableDSNVChiCongnhatThang);
            }


            #endregion

            //có được ds nhân viên với công, phụ cấp, các loại vắng, công ngày lễ --> bắt đầu tính lương
            #region lấy thông số để tính lương
            var sanluong01           = (int)(numSanLuong.Value);
            var dongia02             = (int)numDonGia.Value;
            var perTrichQuyLuong     = (int)numTrichQuyLuong.Value;
            var sanluongGiacongNoiBo = (int)numSanluongGiacongNoibo.Value;
            var dongiaGiacongNoiBo   = (int)numDongiaGiacongNoibo.Value;
            var sanluongGiacongNgoai = (int)numSanluongGiacongNgoai.Value;
            var dongiaGiacongNgoai   = (int)numDongiaGiacongNgoai.Value;
            var mucLuongToithieu     = (int)numLuongToiThieu.Value;
            var mucLuongTT17         = (int)numMucLuongTT17.Value;
            var DinhMuccomtrua       = (int)numDinhMucComTrua.Value;
            var luongPTT             = (float)num11LuongPTT.Value;
            var luongTrucBV          = (float)num12LuongLeTetBV.Value;
            var phuCapTN             = (float)num10PCTrachNhiem.Value;

            double tongQuy100Per03 = Convert.ToDouble(sanluong01) * Convert.ToDouble(dongia02);
            double _80perQuy100_04 = tongQuy100Per03 * (perTrichQuyLuong / 100d);             // ko cần round vì 220*0.8=176 chẵn

            #endregion
            // xác định công chuẩn của tháng
            var congChuanThang = XL.TinhCongChuanCuaThang(ngaydauthang);
            int temp           = 0;
            #region             // thống kê công, phụ cấp hàng ngày của từng nhân viên chính thức//trường hợp nhân viên vừa công nhật vừa chính thức thì chỉ thống kê ngày công sau ngày kết thúc công nhật
            foreach (var nv in dsnv)
            {
                // thống kê công và phụ cấp từng nv
                XL.ThongKeThang(ref nv.ThongKeThang, nv.DSNgayCong, nv.NgayBDCongnhat, nv.NgayKTCongnhat, nv.LoaiCN, out temp, out temp);
                // tính công chờ việc: 1.nv công nhật ko cv. 2. nv mới chính thức thì chỉ giữ công cv khai báo
                if (nv.LoaiCN == LoaiCongNhat.NVCongNhat)                // nhân viên làm công nhật, công cv tự động, khai báo = 0
                {
                    nv.ThongKeThang.CongCV_Auto = 0f;
                    nv.ThongKeThang.CongCV_KB   = 0f;
                }
                else
                {
                    if (nv.LoaiCN == LoaiCongNhat.NVChinhThuc)                    // nhân viên chính thức
                    {
                        nv.ThongKeThang.CongCV_Auto = congChuanThang -
                                                      /*(nv.ThongKeThang.Cong + nv.ThongKeThang.Le + nv.ThongKeThang.Phep + //ver4.0.0.0*/
                                                                                                                                                                 /*(nv.ThongKeThang.TongNgayLV + nv.ThongKeThang.Le + nv.ThongKeThang.Phep + //ver4.0.0.1*/
                                                      (nv.ThongKeThang.TongNgayLV4008
                                                       + nv.ThongKeThang.TongTruCongTreVR + nv.ThongKeThang.TongTruCongSomVR + nv.ThongKeThang.TreSom_KoDuBuCong //ver 4.0.0.8
                                                       + nv.ThongKeThang.Phep + nv.ThongKeThang.Le                                                               //ver4.0.0.8
                                                       + nv.ThongKeThang.BHXH + nv.ThongKeThang.H_CT_PT
                                                       + nv.ThongKeThang.PTDT + nv.ThongKeThang.NghiRo + nv.ThongKeThang.CongCV_KB);                             //DANGLAM
                        if (nv.ThongKeThang.CongCV_Auto < 0f)
                        {
                            nv.ThongKeThang.CongCV_Auto = 0f;
                        }
                    }
                    else                    // nhân viên chính thức vừa công nhật thì công cv_auto =0, công cv khai báo ko đổi
                    {
                        nv.ThongKeThang.CongCV_Auto = 0f;
                    }
                }
                nv.ThongKeThang.CongCV = nv.ThongKeThang.CongCV_Auto + nv.ThongKeThang.CongCV_KB;
            }

            #endregion

            #region             // tính lương công nhật cho các nhân viên làm công nhật và tổng lương công nhật

            double TongLuongCongNhat_AllNV = 0d;

            foreach (DataRow row in tableDSNVChiCongnhatThang.Rows.Cast <DataRow>())
            {
                // lấy thông tin
                var macc        = (int)row["UserEnrollNumber"];
                var dongiaLuong = (int)row["DonGiaLuong"];
                var soNgayCong  = (float)row["SoNgayCong"];
                var TamUng      = (double)row["TamUng"];
                // xác định nhân viên
                var nv = dsnv.Find(o => o.MaCC == macc);
                if (nv == null)
                {
                    continue;
                }
                nv.ThongKeThang.Cong_Congnhat = soNgayCong;
                nv.chiTietLuong.CongNhat      = soNgayCong * dongiaLuong;            //ko trừ tạm ứng, tạm ứng chỉ ở phần thực lãnh mới ghi
                TongLuongCongNhat_AllNV      += nv.chiTietLuong.CongNhat;
            }

            #endregion

            #region             //đọc danh sách thu chi cho từng nhân viên (lưu ý ko đọc phụ cấp của nhân viên công nhật

            foreach (DataRow row in tableDSThuchiThang.Rows.Cast <DataRow>())
            {
                var macc = (int)row["UserEnrollNumber"];
                // xác định nhân viên
                var nv = dsnv.Find(o => o.MaCC == macc);
                if (nv == null)
                {
                    continue;
                }
                nv.chiTietLuong.KhauTru.TamUng     = (double)row["TamUng"];
                nv.chiTietLuong.LuongDieuChinh     = (double)row["LuongDieuChinh"];
                nv.chiTietLuong.MucDongBHXH        = (float)row["MucDongBHXH"];
                nv.chiTietLuong.KhauTru.ThuChiKhac = (double)row["ThuChiKhac"];
            }

            #endregion

            #region             // tính lương cho nv chính thức

            double tong_qlcb_2 = 0d, tong_SPLamRa_B2_2 = 0d, tongQuyLuongCV = 0d, tongQuyLuongNghiDinhCP = 0d, tongChiKhacTuQuyLuong = 0d, tongQuyLuongSP = 0d, tong_luong_dieuchinh = 0d, tongKhauTruThuChiKhac = 0d;
            foreach (var nv in dsnv.Where(o => o.LoaiCN != LoaiCongNhat.NVCongNhat))
            {
                //if (Math.Abs(nv.ThongKeThang.Cong - 0f) < 0.01f) nv.ThongKeThang.CongCV = 0f; //fortesting nếu ko chấm công thì cũng ko có công cv
                XL.TinhLuongCoBan_CongVaPC_A202(nv.HeSo.LuongCB, mucLuongToithieu, nv.ThongKeThang.Cong, nv.ThongKeThang.PhuCaps._TongPC,
                                                nv.ThongKeThang.Phep, nv.ThongKeThang.H_CT_PT, nv.ThongKeThang.PTDT, nv.ThongKeThang.Le, nv.ThongKeThang.CongCV,                                                //DANGLAM
                                                out nv.chiTietLuong.LCB_Theo.CongThucTe, out nv.chiTietLuong.LCB_Theo.CheDoNghi, out nv.chiTietLuong.LCB_Theo.CongCV,
                                                out nv.chiTietLuong.LCB_Theo.PhuCap);
                tongQuyLuongCV += nv.chiTietLuong.LCB_Theo.CongCV;
                //tongQuyLuongNghiDinhCP += nv.chiTietLuong.LCB_Theo.TongCong_CD_CV_PC; // yêu cầu cũ (T1/2015) là có lương chờ việc
                tongQuyLuongNghiDinhCP += nv.chiTietLuong.LCB_Theo.Cong_CD_PC;                // yêu cầu mới (T8/2015) là tách lương chờ việc ra

                //ver4.0.0.7 tong_qlcb_2 += nv.chiTietLuong.LCB_Theo.TongCong_CD_CV_PC + nv.chiTietLuong.LuongDieuChinh; //yêu cầu mới (T8/2015) là tách lương chờ việc ra khỏi quỹ lương cơ bản đưa vào quỹ lương sản phẩm
                tong_qlcb_2           += nv.chiTietLuong.LCB_Theo.Cong_CD_PC;       //info tong_qlcb_2 bao gồm lương cb 1nv, bồi dưỡng ca 3 1nv, lương tháng trước 1 nv
                tong_luong_dieuchinh  += nv.chiTietLuong.LuongDieuChinh;
                tongKhauTruThuChiKhac += nv.chiTietLuong.KhauTru.ThuChiKhac;

                XL.TinhSPLamRa_CongVaPC_B102(nv.HeSo.LuongCV, nv.ThongKeThang.Cong, nv.ThongKeThang.PhuCaps._TongPC, nv.ThongKeThang.Phep, nv.ThongKeThang.H_CT_PT, nv.ThongKeThang.PTDT, nv.ThongKeThang.Le,                //DANGLAM
                                             out nv.chiTietLuong.SPLamRa_Theo.CongThucTe, out nv.chiTietLuong.SPLamRa_Theo.CheDoNghi, out nv.chiTietLuong.SPLamRa_Theo.PhuCap);
                tong_SPLamRa_B2_2 += nv.chiTietLuong.SPLamRa_Theo.TongSPLamRa;
                // tính khấu trừ BHXH
                //nv.chiTietLuong.KhauTru.BHXH = Convert.ToDouble(nv.HeSo.BHXH_YT_TN * mucLuongToithieu * (nv.chiTietLuong.MucDongBHXH / 100f));
                nv.chiTietLuong.KhauTru.BHXH = Convert.ToDouble((nv.HeSo.LCBTT17 + nv.HeSo.PCTNTT17 + nv.HeSo.PCDHTT17 + nv.HeSo.PCCVTT17) * mucLuongTT17 * (nv.chiTietLuong.MucDongBHXH / 100f)); // tính BHXH theo TT17 [update T1/2018]
                // tính tiền cơm trưa
                var temp1 = DinhMuccomtrua - ((DinhMuccomtrua / congChuanThang) * nv.ThongKeThang.SoNgayNghiRO_NguyenNgay);
                nv.chiTietLuong.TienComTrua = (temp1 >= 0d) ? temp1 : 0d;
            }
            var chitienGiacongNoibo = Convert.ToDouble(sanluongGiacongNoiBo) * Convert.ToDouble(dongiaGiacongNoiBo);
            var chitienGiacongNgoai = Convert.ToDouble(sanluongGiacongNgoai) * Convert.ToDouble(dongiaGiacongNgoai);
            //var tong_qlSP_A71_1_VaGiaCong = (_80perQuy100_04 + chitienGiacongNoibo + chitienGiacongNgoai) - tong_qlcb_2 - TongLuongCongNhat_AllNV; // yêu cầu mới (T8/2015) là tách lương chờ việc ra
            var tong_qlSP_A71_1_VaGiaCong = (_80perQuy100_04 + chitienGiacongNoibo + chitienGiacongNgoai) - tong_qlcb_2 - tongQuyLuongCV - TongLuongCongNhat_AllNV - tong_luong_dieuchinh - phuCapTN - luongPTT - luongTrucBV - tongKhauTruThuChiKhac; // yêu cầu mới (T1/2018)
            tongChiKhacTuQuyLuong = tongQuyLuongCV + phuCapTN + luongPTT + luongTrucBV + tongKhauTruThuChiKhac;
            double giaTri_1SP_B3_1 = (Math.Abs(tong_SPLamRa_B2_2 - 0d) > 0.001d) ? (tong_qlSP_A71_1_VaGiaCong / tong_SPLamRa_B2_2) : 0d;                                                                                                               // tính ra được 1 đơn vị sản phẩm có giá bao nhiêu
            //double tong0 = 0d, tong1 = 0d, tong2 = 0d, tong3 = 0d, tong4 = 0d, tong5 = 0d, tong6 = 0d, tong7 = 0d, tong8 = 0d, tong9 = 0d, tong10 = 0d, tong11 = 0d, tong12 = 0d, tong13 = 0d, tong14 = 0d, tong15 = 0d, tong16 = 0d, tong17 = 0d, tong18 = 0d, tong19 = 0d, tong20 = 0d, tong21 = 0d, tong22 = 0d, tong23 = 0d, tong24 = 0d, tong25 = 0d, tong26 = 0d, tong27 = 0d, tong28 = 0d, tong29 = 0d, tong30 = 0d, tong31 = 0d, tong32 = 0d, tong33 = 0d, tong34 = 0d, tong35 = 0d, tong36 = 0d;

            foreach (var nv in dsnv.Where(o => o.LoaiCN != LoaiCongNhat.NVCongNhat))
            {
                nv.chiTietLuong.LSP_Theo.CongThucTe = nv.chiTietLuong.SPLamRa_Theo.CongThucTe * giaTri_1SP_B3_1;
                nv.chiTietLuong.LSP_Theo.CheDoNghi  = nv.chiTietLuong.SPLamRa_Theo.CheDoNghi * giaTri_1SP_B3_1;
                nv.chiTietLuong.LSP_Theo.PhuCap     = nv.chiTietLuong.SPLamRa_Theo.PhuCap * giaTri_1SP_B3_1;
                tongQuyLuongSP += nv.chiTietLuong.LSP_Theo.TongCong_CD_PC;
                //fortesting region [03]
            }

            #endregion

            //fortesting testing region [01]
            #region             // cập nhật lương xuống csdl , trước khi cập nhật thì xoá lương cũ

            // cập nhật lương xuống csdl , trước khi cập nhật thì xoá lương cũ
            int kq1 = SqlDataAccessHelper.ExecNoneQueryString(
                "delete from KetLuongThang where Thang = @Thang", new string[] { "@Thang" }, new object[] { m_Thang });                 //INFO LOG DO KẾT LƯƠNG THÁNG THỰC HIỆN

            foreach (var nv in dsnv.Where(o => o.LoaiCN != LoaiCongNhat.NVCongNhat))
            {
                int kq = DAO.InsKetLuongThang(m_Thang, nv);
                //if (kq == 0) MessageBox.Show("Xảy ra lỗi tại vị trí NV: " + nv.MaCC + nv.TenNV);//fortesting
            }

            // sau khi cập nhật lương từng nhân viên thì cập nhật thông số kết lương tháng
            int kq2 = DAO.UpdInsThongsoKetluongThang(m_Thang,
                                                     XL2.PC30, XL2.PC50, XL2.PCTCC3, XL2.PC100, XL2.PC160, XL2.PC200, XL2.PC290,
                                                     sanluong01, dongia02, perTrichQuyLuong,
                                                     sanluongGiacongNoiBo, dongiaGiacongNoiBo, sanluongGiacongNgoai, dongiaGiacongNgoai,
                                                     mucLuongToithieu, /*donGiaBdCa3,*/ DinhMuccomtrua,
                                                     mucLuongTT17, luongPTT, luongTrucBV, phuCapTN,
                                                     tongQuyLuongCV, tongQuyLuongNghiDinhCP,
                                                     tongChiKhacTuQuyLuong, tongQuyLuongSP, giaTri_1SP_B3_1);

            //ghi log
            string noidung = string.Format("Kết lương tháng [{0}]", m_Thang.ToString("MM/yyyy"));
            DAO.GhiNhatKyThaotac("Kết lương", noidung);

            #endregion
        }