private void XuatBBChamCong(object sender, WaitWindowEventArgs e) { string filePath = e.Arguments[0].ToString(); string tenNVLapBieu = e.Arguments[1].ToString(); string tenTrgBP = e.Arguments[2].ToString(); DateTime thang = (DateTime)e.Arguments[3]; List <cPhongBan> dsphongban = (List <cPhongBan>)e.Arguments[4]; var tongCongKoTinhCV = 0f; var congTinhLuong = 0f; var congKOtinhLuong = 0f; try //general try catch { List <WarningMessage> warningMessages = new List <WarningMessage>(); #region lấy thông tin từ csdl và khỏi tạo nv DateTime ngaydauthang = MyUtility.FirstDayOfMonth(dtpThang.Value), ngaycuoithang = MyUtility.LastDayOfMonth(dtpThang.Value); 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 tableDSNVChiCongnhatThang = DAO.LayTableCongNhat(ngaydauthang); var dsnv = new List <cUserInfo>(); XL.KhoiTaoDSNV_ChamCong(dsnv, (from p in dsphongban select p.ID).ToList(), 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 /* * List<cPhongBan> dsphongban = new List<cPhongBan>(); * // đưa về root node trước khi thực hiện * var root = treePhongBan.TopNode; * GetTopLevelNode(ref root);// mỗi lần duyệt node sẽ làm root node chuyển về parent của node cuối nên phải trả về node gốc để duyệt từ đầu * while (root.PrevNode != null) root = root.PrevNode; * GetNode_DuocThaotac_CheckKetcong(root, dsphongban); */ #endregion // xác định công chuẩn của tháng var congChuanThang = XL.TinhCongChuanCuaThang(ngaydauthang); #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 try { foreach (var nv in dsnv) { nv.ThongKeThang = new ThongKeCong_PC(); 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); } //load ds xp vắng //XL.LoadDSXPVang(nv.MaCC, nv.DSNgayCong, tableXPVang); //XL.LoadNgayLe(nv.DSNgayCong, tableNgayLe); 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); } var soNgayChuNhat = XL.DemSoNgayNghiChunhat(ngaydauthang, true, false); var soNgayThu7 = XL.DemSoNgayNghiChunhat(ngaydauthang, false, true); //v 4.0.0.1 int soNgayChamCongx2 = 0, soNgayNghiAnhHuongCongx2 = 0; foreach (var nv in dsnv) { XL.ThongKeThang(ref nv.ThongKeThang, nv.DSNgayCong, nv.NgayBDCongnhat, nv.NgayKTCongnhat, nv.LoaiCN, out soNgayChamCongx2, out soNgayNghiAnhHuongCongx2); // 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 { congTinhLuong = (nv.ThongKeThang.TongNgayLV4008 + nv.ThongKeThang.Phep + nv.ThongKeThang.Le //ver4.0.0.8 + nv.ThongKeThang.H_CT_PT); congKOtinhLuong = nv.ThongKeThang.TongTruCongTreVR + nv.ThongKeThang.TongTruCongSomVR + nv.ThongKeThang.TreSom_KoDuBuCong + nv.ThongKeThang.BHXH + nv.ThongKeThang.PTDT + nv.ThongKeThang.NghiRo; //ko có nv.ThongKeThang.CongCV_KB tongCongKoTinhCV = congTinhLuong + congKOtinhLuong; /* * tongCongKoTinhCV = (nv.ThongKeThang.TongNgayLV4008 + nv.ThongKeThang.TongTruCongTreVR+nv.ThongKeThang.TongTruCongSomVR + nv.ThongKeThang.TreSom_KoDuBuCong + 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 */ nv.ThongKeThang.CongCV_Auto = congChuanThang - tongCongKoTinhCV; 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; if (XL.KiemTraDieuKienCongCVAuto_VuotNguong(nv.ThongKeThang.CongCV_Auto, soNgayThu7, soNgayChuNhat)) { warningMessages.Add( new WarningMessage { MaCC = nv.MaCC, MaNV = nv.MaNV, TenNV = nv.TenNV, NoiDung = string.Format( "Có số công chờ việc được tính tự động [{0}] công theo quy định vượt quá [{1}] ngày thứ Bảy trong tháng.", nv.ThongKeThang.CongCV_Auto.ToString("#0.0#"), soNgayThu7) }); } if (XL.KiemTraDieuKienChamCongx2(congChuanThang, congTinhLuong, soNgayChuNhat, soNgayChamCongx2, soNgayNghiAnhHuongCongx2) == 1) { warningMessages.Add( new WarningMessage { MaCC = nv.MaCC, MaNV = nv.MaNV, TenNV = nv.TenNV, NoiDung = string.Format( "Chấm công làm việc ngày nghỉ hàng tuần chưa đúng quy định ([{0}] ngày nghỉ >= [{1}] ngày chủ nhật).", soNgayNghiAnhHuongCongx2, soNgayChuNhat) }); } else if (XL.KiemTraDieuKienChamCongx2(congChuanThang, congTinhLuong, soNgayChuNhat, soNgayChamCongx2, soNgayNghiAnhHuongCongx2) == 2) { warningMessages.Add( new WarningMessage { MaCC = nv.MaCC, MaNV = nv.MaNV, TenNV = nv.TenNV, NoiDung = string.Format( "Chấm công làm việc ngày nghỉ hàng tuần chưa đúng quy định ([{0}] ngày chấm công làm việc ngày nghỉ hàng tuần + [{1}] ngày nghỉ > [{2}] ngày chủ nhật).", soNgayChamCongx2, soNgayNghiAnhHuongCongx2, soNgayChuNhat) }); } else if (XL.KiemTraDieuKienChamCongx2(congChuanThang, congTinhLuong, soNgayChuNhat, soNgayChamCongx2, soNgayNghiAnhHuongCongx2) == 3) { warningMessages.Add( new WarningMessage { MaCC = nv.MaCC, MaNV = nv.MaNV, TenNV = nv.TenNV, NoiDung = string.Format( "Nhân viên có [{0}] công làm việc vượt [{1}] ngày công chuẩn của tháng.", congTinhLuong.ToString("#0.0#"), congChuanThang.ToString("")) }); } } } catch (Exception ex) { lg.Error(string.Format("[{0}]_[{1}]\n", this.Name, System.Reflection.MethodBase.GetCurrentMethod().Name), ex); } #endregion using (var p = new ExcelPackage()) { //2. xuat bb bang ket cong thang #region ghi sheet bang ket cong thang trinh ky p.Workbook.Worksheets.Add("BangKetCong"); var ws = p.Workbook.Worksheets["BangKetCong"]; ws.Name = "BangKetCong"; //Setting Sheet's name XL.ExportSheetBangKetcongThang(ws, MyUtility.FirstDayOfMonth(dtpThang.Value), MyUtility.LastDayOfMonth(dtpThang.Value), dsnv, tenNVLapBieu, tenTrgBP, XL2.PC30, XL2.PC50, XL2.PCTCC3, XL2.PC100, XL2.PC160, XL2.PC200, XL2.PC290); //info dsnv kết công bộ phận gồm cả nv công nhật, chính thức, vừa chính thức vừa công nhật khác với bảng lương #endregion //3. xuat bb chi tiết kết công #region ghi sheet chi tiết kết công p.Workbook.Worksheets.Add("ChiTietKetCong"); ws = p.Workbook.Worksheets["ChiTietKetCong"]; ws.Name = "ChiTietKetCong"; //Setting Sheet's name XL.ExportSheetBangChiTietKetCong(ws, MyUtility.FirstDayOfMonth(dtpThang.Value), MyUtility.LastDayOfMonth(dtpThang.Value), dsnv, XL2.PC30, XL2.PC50, XL2.PCTCC3, XL2.PC100, XL2.PC160, XL2.PC200, XL2.PC290); #endregion //4. xuất bb lưu ý nếu có if (warningMessages.Count > 0) { p.Workbook.Worksheets.Add("LUUY"); ws = p.Workbook.Worksheets["LUUY"]; ws.Name = "LuuY"; //Setting Sheet's name ws.Cells.Style.Font.Name = "Times New Roman"; ws.Cells.Style.Font.Size = 12; int top = 1, left = 1; int ir = top, ic = left; XL.FormatCell_T(ws, ref ir, ref ic, "Mã NV", plusCol: 1); XL.FormatCell_T(ws, ref ir, ref ic, "Tên NV", plusCol: 1); XL.FormatCell_T(ws, ref ir, ref ic, "Nội dung lưu ý", plusCol: 1, plusRow: 1); foreach (WarningMessage message in warningMessages) { ic = left; XL.FormatCell_W(ws, ref ir, ref ic, message.MaNV, colWidth: (int)L.MANV, plusCol: 1); XL.FormatCell_W(ws, ref ir, ref ic, message.TenNV, colWidth: (int)L.HOTEN, plusCol: 1); XL.FormatCell_W(ws, ref ir, ref ic, message.NoiDung, colWidth: 60, plusCol: 1, plusRow: 1); } } Byte[] bytes = p.GetAsByteArray(); XL.XuatFileExcel(filePath, bytes, "frm_KetCongBoPhan XuatBBChamCong "); } if (warningMessages.Count > 0) { MessageBox.Show("Vui lòng xem lại các cảnh báo của quá trình kết công trong sheet lưu ý.", Resources.Caption_ThongBao); } } 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); } }