public List <cNgayCong> TinhCongTheoNgay(List <cChkInOut> pDSVaoRa, DateTime ngayBD, DateTime ngayKT, int UserEnrollNumber) { log.Debug("UserEnrollNumber " + UserEnrollNumber); List <cNgayCong> kq = new List <cNgayCong>(); DateTime ngaydem; if (pDSVaoRa.Count == 0) { ngaydem = ngayBD.Date; while (ngaydem <= ngayKT) // <= vì lấy luôn ngày KT : vắng mặt { cNgayCong ngayKOcheck = new cNgayCong() { NgayCong = ngaydem, HasCheck = false, DSVaoRa = new List <cChkInOut>(), }; kq.Add(ngayKOcheck); ngaydem = ngaydem.AddDays(1.0d); } return(kq); } int vtriBD = 0; ngaydem = ngayBD.Date; while (ngaydem <= ngayKT.Date) { if (vtriBD >= pDSVaoRa.Count) // hết DS nhưng ngaydem <= ngày KT ==> ghi lại những ngày sau là vắng mặt { while (ngaydem <= ngayKT.Date) { cNgayCong ngayKOcheck = new cNgayCong() { NgayCong = ngaydem, HasCheck = false, DSVaoRa = new List <cChkInOut>(), }; kq.Add(ngayKOcheck); ngaydem = ngaydem.AddDays(1d); } continue; } // chưa hết DS, bắt đầu từ ngày của DSVaoRa tại vtbd, đó là ngày có mặt cChkInOut CIO = pDSVaoRa[vtriBD]; XL.TinhCongTheoCa(CIO, CIO.ThuocCa); DateTime ngayCoMat = CIO.ThuocNgayCong; // ghi lại những ngày vắng mặt trước ngày có mặt while (ngaydem < ngayCoMat) // ko có = vì chỉ chạy đến trước ngày của tmpVaoRa thôi { cNgayCong ngayKOcheck = new cNgayCong() { NgayCong = ngaydem, HasCheck = false, DSVaoRa = new List <cChkInOut>(), }; kq.Add(ngayKOcheck); ngaydem = ngaydem.AddDays(1.0d); } //ngaydem = ngày có mặt. stop, tmpVaoRa là vào ra đầu tiên trong ngày #region collapse cNgayCong ngayCOcheck = new cNgayCong() { HasCheck = true, NgayCong = ngayCoMat, TinhPC150 = true, TinhPC200 = false,// mặc định khởi tạo ngày có tính PC 50%, nếu tồn tại ít nhất 1 ca nào ko tính pc 50% thì set cả ngày ko tính pc 50% TongGioLam = CIO.TGLamTinhCong, TongGioLamDem = CIO.TGLamDem, TongGioThuc = CIO.TongGioThuc, TongTre = CIO.VaoTre, TongSom = CIO.RaaSom, TongCong = CIO.Cong, PhuCapDem = ((CIO.TGLamDem.TotalHours > 0f) ? ((float)(CIO.TGLamDem.TotalHours / 8f) * 0.3f) : 0f) // công thức cũ (tính phụ cấp tăng ca theo công) là : + (((tmpVaoRa.Cong > 1f) ? (tmpVaoRa.Cong - 1f) * 0.5f : 0f)) // đổi lại công thức mới (tính phụ cấp theo giờ) là : + (((tmpVaoRa.TGLamTinhCong.TotalHours > 8f) ? (((float)tmpVaoRa.TGLamTinhCong.TotalHours - 8f) / 8f) * 0.5f : 0f)) }; if (CIO.QuaDem == true) { ngayCOcheck.QuaDem = true; // set qua đêm nếu có } if (ngayCOcheck.TinhPC150) { if (CIO.TinhPC150 == false) { ngayCOcheck.TinhPC150 = false; } if (ngayCOcheck.TinhPC150) { ngayCOcheck.PhuCapThem = (((CIO.TGLamTinhCong.TotalHours > 8f) ? ((((float)CIO.TGLamTinhCong.TotalHours - 8f) / 8f) * 0.5f) : 0f)); } else { ngayCOcheck.PhuCapThem = 0f; } } else { ngayCOcheck.PhuCapThem = 0f; } ngayCOcheck.TongPhuCap = ngayCOcheck.PhuCapDem + ngayCOcheck.PhuCapThem; ngayCOcheck.them(CIO); #endregion // sau khi tạo ngày công mới vào ra đó là vào ra đầu tiên thì chuyển sang VAORA next vtriBD++; // nếu hết ds thì ngưng, add tmpNgayCong1 vào danh sách ngày công (do chưa add) if (vtriBD >= pDSVaoRa.Count) { kq.Add(ngayCOcheck); ngaydem = ngayCOcheck.NgayCong.AddDays(1d); while (ngaydem <= ngayKT.Date) { cNgayCong ngayKOcheck = new cNgayCong() { NgayCong = ngaydem, HasCheck = false, DSVaoRa = new List <cChkInOut>(), }; kq.Add(ngayKOcheck); ngaydem = ngaydem.AddDays(1.0d); } continue; } // chưa hết DSVàoRa, xem các vào ra kế tiếp, nếu cùng ngày công thì add thêm vào tmpNgayCong1 while (vtriBD < pDSVaoRa.Count && ThamSo.GetDate(pDSVaoRa[vtriBD].TimeStrDaiDien) == ngayCOcheck.NgayCong) { cChkInOut CIO_1 = pDSVaoRa[vtriBD]; XL.TinhCongTheoCa(CIO_1, CIO_1.ThuocCa); #region collapse ngayCOcheck.TongGioThuc += CIO_1.TongGioThuc; ngayCOcheck.TongGioLam += CIO_1.TGLamTinhCong; ngayCOcheck.TongGioLamDem += CIO_1.TGLamDem; ngayCOcheck.TongTre += CIO_1.VaoTre; ngayCOcheck.TongSom += CIO_1.RaaSom; ngayCOcheck.TongCong += CIO_1.Cong; ngayCOcheck.PhuCapDem = ((ngayCOcheck.TongGioLamDem.TotalHours > 0f) ? ((float)(ngayCOcheck.TongGioLamDem.TotalHours / 8f) * 0.3f) : 0f); #endregion if (CIO_1.QuaDem == true) { ngayCOcheck.QuaDem = true; // set qua đêm nếu có } if (ngayCOcheck.TinhPC150) { if (CIO.TinhPC150 == false) { ngayCOcheck.TinhPC150 = false; } if (ngayCOcheck.TinhPC150) { ngayCOcheck.PhuCapThem = (((ngayCOcheck.TongGioLam.TotalHours > 8f) ? ((((float)ngayCOcheck.TongGioLam.TotalHours - 8f) / 8f) * 0.5f) : 0f)); } else { ngayCOcheck.PhuCapThem = 0f; } } else { ngayCOcheck.PhuCapThem = 0f; } ngayCOcheck.TongPhuCap = ngayCOcheck.PhuCapDem + ngayCOcheck.PhuCapThem; ngayCOcheck.them(CIO_1); vtriBD++; } //thoát khỏi vòng lặp: hoặc hết ds hoặc chuyển sang ngày mới if (vtriBD >= pDSVaoRa.Count) { kq.Add(ngayCOcheck); ngaydem = ngayCOcheck.NgayCong.AddDays(1d); while (ngaydem <= ngayKT.Date) { cNgayCong tmpNgayCong = new cNgayCong() { NgayCong = ngaydem, HasCheck = false, DSVaoRa = new List <cChkInOut>(), }; kq.Add(tmpNgayCong); ngaydem = ngaydem.AddDays(1.0d); } } else { kq.Add(ngayCOcheck); ngaydem = ngaydem.AddDays(1.0d); } } return(kq); }
public List <cNgayCong> TinhCongTheoNgay(List <cChkInOut> pDSVaoRa, DateTime ngayBD, DateTime ngayKT, bool macdinhtinhpc50) { List <cNgayCong> kq = new List <cNgayCong>(); DateTime ngaydem; if (pDSVaoRa.Count == 0) { ngaydem = ngayBD.Date; while (ngaydem <= ngayKT) // <= vì lấy luôn ngày KT : vắng mặt { cNgayCong ngayKOcheck = new cNgayCong() { NgayCong = ngaydem, HasCheck = false, DSVaoRa = new List <cChkInOut>(), }; kq.Add(ngayKOcheck); ngaydem = ngaydem.AddDays(1d); } return(kq); } int vtriBD = 0; ngaydem = ngayBD.Date; while (ngaydem <= ngayKT.Date) { if (vtriBD >= pDSVaoRa.Count) // hết DS nhưng ngaydem <= ngày KT ==> ghi lại những ngày sau là vắng mặt { while (ngaydem <= ngayKT.Date) { cNgayCong ngayKOcheck = new cNgayCong() { NgayCong = ngaydem, HasCheck = false, DSVaoRa = new List <cChkInOut>(), }; kq.Add(ngayKOcheck); ngaydem = ngaydem.AddDays(1d); } continue; } // chưa hết DS, bắt đầu từ ngày của DSVaoRa tại vtbd, đó là ngày có mặt cChkInOut CIO = pDSVaoRa[vtriBD]; XL.TinhCongTheoCa(CIO, CIO.ThuocCa); DateTime ngayCoMat = CIO.ThuocNgayCong; // ghi lại những ngày vắng mặt trước ngày có mặt while (ngaydem < ngayCoMat) // ko có = vì chỉ chạy đến trước ngày của tmpVaoRa thôi { cNgayCong ngayKOcheck = new cNgayCong() { NgayCong = ngaydem, HasCheck = false, DSVaoRa = new List <cChkInOut>(), }; kq.Add(ngayKOcheck); ngaydem = ngaydem.AddDays(1d); } //ngaydem = ngày có mặt. stop, tmpVaoRa là vào ra đầu tiên trong ngày #region collapse double pcdem = Convert.ToDouble(Properties.Settings.Default.PCDem / 100); double pctc = Convert.ToDouble(Properties.Settings.Default.PCTangCuong / 100); cNgayCong ngayCOcheck = new cNgayCong() { HasCheck = true, NgayCong = ngayCoMat, TinhPC150 = macdinhtinhpc50, // mặc định khởi tạo ngày có tính PC 50%, nếu tồn tại ít nhất 1 ca nào ko tính pc 50% thì set cả ngày ko tính pc 50% TG = new ThoiGian() { LamTinhCong = CIO.TG.LamTinhCong, LamTinhPC30 = CIO.TG.LamTinhPC30 }, TongGioThuc = CIO.TongGioThuc, TongTre = CIO.VaoTre, TongSom = CIO.RaaSom, TongCong = Math.Round(CIO.Cong, 2), PhuCap30 = Math.Round(((CIO.TG.LamTinhPC30.TotalHours > 0d) ? ((CIO.TG.LamTinhPC30.TotalHours / 8d) * pcdem) : 0d), 2) // công thức cũ (tính phụ cấp tăng ca theo công) là : + (((tmpVaoRa.Cong > 1f) ? (tmpVaoRa.Cong - 1f) * 0.5f : 0f)) // đổi lại công thức mới (tính phụ cấp theo giờ) là : + (((tmpVaoRa.TGLamTinhCong.TotalHours > 8f) ? (((float)tmpVaoRa.TGLamTinhCong.TotalHours - 8f) / 8f) * 0.5f : 0f)) }; if (CIO.QuaDem == true) { ngayCOcheck.QuaDem = true; // set qua đêm nếu có } if (CIO.TinhPC150 != macdinhtinhpc50) { ngayCOcheck.TinhPC150 = CIO.TinhPC150; } if (ngayCOcheck.TinhPC150) { ngayCOcheck.PhuCap50 = Math.Round((((CIO.TG.LamTinhCong.TotalHours > 8d) ? (((CIO.TG.LamTinhCong.TotalHours - 8d) / 8d) * pctc) : 0d)), 2); } else { ngayCOcheck.PhuCap50 = 0d; } ngayCOcheck.TongPhuCap = Math.Round((ngayCOcheck.PhuCap30 + ngayCOcheck.PhuCap50), 2); ngayCOcheck.them(CIO); #endregion // sau khi tạo ngày công mới vào ra đó là vào ra đầu tiên thì chuyển sang VAORA next vtriBD++; // nếu hết ds thì ngưng, add tmpNgayCong1 vào danh sách ngày công (do chưa add) if (vtriBD >= pDSVaoRa.Count) { kq.Add(ngayCOcheck); ngaydem = ngayCOcheck.NgayCong.AddDays(1d); while (ngaydem <= ngayKT.Date) { cNgayCong ngayKOcheck = new cNgayCong() { NgayCong = ngaydem, HasCheck = false, DSVaoRa = new List <cChkInOut>(), }; kq.Add(ngayKOcheck); ngaydem = ngaydem.AddDays(1.0d); } continue; } // chưa hết DSVàoRa, xem các vào ra kế tiếp, nếu cùng ngày công thì add thêm vào tmpNgayCong1 while (vtriBD < pDSVaoRa.Count && ThamSo.GetDate(pDSVaoRa[vtriBD].TimeStrDaiDien) == ngayCOcheck.NgayCong) { cChkInOut CIO_1 = pDSVaoRa[vtriBD]; XL.TinhCongTheoCa(CIO_1, CIO_1.ThuocCa); #region collapse ngayCOcheck.TongGioThuc += CIO_1.TongGioThuc; ngayCOcheck.TG.LamTinhCong += CIO_1.TG.LamTinhCong; ngayCOcheck.TG.LamTinhPC30 += CIO_1.TG.LamTinhPC30; ngayCOcheck.TongTre += CIO_1.VaoTre; ngayCOcheck.TongSom += CIO_1.RaaSom; ngayCOcheck.TongCong += Math.Round(CIO_1.Cong, 2); ngayCOcheck.PhuCap30 = Math.Round(((ngayCOcheck.TG.LamTinhPC30.TotalHours > 0d) ? ((ngayCOcheck.TG.LamTinhPC30.TotalHours / 8d) * pcdem) : 0d), 2); #endregion if (CIO_1.QuaDem == true) { ngayCOcheck.QuaDem = true; // set qua đêm nếu có } if (CIO_1.TinhPC150 != macdinhtinhpc50) { ngayCOcheck.TinhPC150 = CIO_1.TinhPC150; } if (ngayCOcheck.TinhPC150) { ngayCOcheck.PhuCap50 = Math.Round((((ngayCOcheck.TG.LamTinhCong.TotalHours > 8d) ? (((ngayCOcheck.TG.LamTinhCong.TotalHours - 8d) / 8d) * pctc) : 0d)), 2); } else { ngayCOcheck.PhuCap50 = 0d; } ngayCOcheck.TongPhuCap = Math.Round((ngayCOcheck.PhuCap30 + ngayCOcheck.PhuCap50), 2); ngayCOcheck.them(CIO_1); vtriBD++; } //thoát khỏi vòng lặp: hoặc hết ds hoặc chuyển sang ngày mới if (vtriBD >= pDSVaoRa.Count) { kq.Add(ngayCOcheck); ngaydem = ngayCOcheck.NgayCong.AddDays(1d); while (ngaydem <= ngayKT.Date) { cNgayCong tmpNgayCong = new cNgayCong() { NgayCong = ngaydem, HasCheck = false, DSVaoRa = new List <cChkInOut>(), }; kq.Add(tmpNgayCong); ngaydem = ngaydem.AddDays(1d); } } else { kq.Add(ngayCOcheck); ngaydem = ngaydem.AddDays(1d); } } return(kq); }