private void gridView1_CustomColumnDisplayText(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventArgs e) { if (e.ListSourceRowIndex < 0) { return; } IList <Model.Employee> employeelist = this.EmployeeSource.DataSource as IList <Model.Employee>; if (employeelist == null || employeelist.Count < 1) { return; } _business = employeelist[e.ListSourceRowIndex].BusinessHours; switch (e.Column.Name) { case "BusinessTime": if (_business == null) { return; } e.DisplayText = Convert.ToDateTime(_business.Fromtime).ToString("HH:mm") + "~" + Convert.ToDateTime(_business.ToTime).ToString("HH:mm") + "(" + _business.BusinessHoursName + ")"; break; } }
private void gridView2_CustomColumnDisplayText_1(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventArgs e) { if (e.ListSourceRowIndex < 0) { return; } IList <Model.Flextime> flextimelist = this.FlexTimeSource.DataSource as IList <Model.Flextime>; if (flextimelist == null || flextimelist.Count < 1) { return; } _business = flextimelist[e.ListSourceRowIndex].BusinessHours; if (_business == null) { return; } switch (e.Column.Name) { case "BusinessDate": e.DisplayText = Convert.ToDateTime(_business.Fromtime).ToString("HH:mm") + "~" + Convert.ToDateTime(_business.ToTime).ToString("HH:mm"); break; } }
/// <summary> /// 异常考勤订正处理 /// </summary> /// <param name="checkdate"></param> /// <param name="emp"></param> /// <param name="mActualCheckIn"></param> /// <param name="mActualCheckOut"></param> /// <returns></returns> public Model.HrDailyEmployeeAttendInfo Reatten_Controller(DateTime checkdate, Model.Employee emp, DateTime?mActualCheckIn, DateTime?mActualCheckOut) { Model.BusinessHours mBusinessHour = new Book.Model.BusinessHours(); //--當日應上的班別 DateTime? mShouldCheckIn = null; //--應上班時間 DateTime? mShouldCheckOut = null; //--應下班時間 int mLateInMinute = 0; //--遲到(分) Double?mDayFactor = 0; //--日基數 double?mMonthFactor = 0; //--月基數 Double?mSpecialBonus = 0; //--班别津贴 bool mIsNormal = true; //--是否正常出勤 string mNote = string.Empty; //--備註 string mCardNo = string.Empty; //--卡号 //取得班別表及班別津貼集合 IList <Model.BusinessHours> mBusinessHourCollection = new BL.BusinessHoursManager().Select(); //取得年度假日列表 IList <Model.AnnualHoliday> holidayList = new BL.AnnualHolidayManager().SelectAnnualInfoByYear_list(checkdate.Year); //檢查考勤日是否為假日 Model.AnnualHoliday holiday = null; //取得考情日上班部门,确定员工是否休假 bool h_bool = holidayList.Any(pd => (pd.HolidayDate.Value.ToString("yyyy-MM-dd") == checkdate.ToString("yyyy-MM-dd"))); if (h_bool) { holiday = holidayList.Where(pd => (pd.HolidayDate.Value.ToString("yyyy-MM-dd") == checkdate.ToString("yyyy-MM-dd"))).First(); if (holiday != null) { if (!string.IsNullOrEmpty(holiday.Departs)) { if (!holiday.Departs.Contains(emp.DepartmentId)) { holiday = null; } } } } //取得假別列表 IList <Model.LeaveType> mleaveTypeList = new BL.LeaveTypeManager().Select(); //請假資訊 //Model.Leave mLeave = new BL.LeaveManager().GetEmployeeLeavebyDate(emp.EmployeeId, checkdate); IList <Model.Leave> mLeaves = new BL.LeaveManager().GetEmployeeLeavebyDate(emp.EmployeeId, checkdate); //若该请假不参与考勤 2015年4月1日23:31:08:有考勤资料优先,请假靠后 //if (mLeaves != null && mLeaves.Count > 0) //{ // foreach (Model.Leave l in mLeaves) // if (!l.LeaveType.doAttendance.Value) // return null; // //if (!mLeave.LeaveType.doAttendance.Value) // // return null; //} //彈性排班資訊 Model.Flextime mFlexTime = new BL.FlextimeManager().getbyempiddate(emp.EmployeeId, checkdate); if (mFlexTime == null) { //沒有彈性排班,則取原訂班別 mBusinessHour = emp.BusinessHours; } else { //有彈性排班,則排定之訂班別 mBusinessHour = mFlexTime.BusinessHours; } if (mBusinessHour == null) { return(null); } //____查詢是否有換臨時卡 Model.TempCard mTempCard = new BL.TempCardManager().Selectbyemployeedate(emp.EmployeeId, checkdate, checkdate); if (mTempCard == null) { mCardNo = emp.CardNo; } else { mCardNo = mTempCard.CardNo; } if (holiday == null) { //---------------------------------------------- //非假日:查詢是否有請假及彈性排班, //並查出該員當日應上的班別 //---------------------------------------------- //先找出該員正常應上下班之時間 if (mBusinessHour.Fromtime.Value.Hour == 0) { mShouldCheckIn = DateTime.Parse(checkdate.AddDays(1).ToShortDateString() + " " + "00:" + mBusinessHour.Fromtime.Value.Minute.ToString().PadLeft(2, '0')); } else { mShouldCheckIn = DateTime.Parse(checkdate.ToShortDateString() + " " + mBusinessHour.Fromtime.Value.Hour.ToString().PadLeft(2, '0') + ":" + mBusinessHour.Fromtime.Value.Minute.ToString().PadLeft(2, '0')); } if (mBusinessHour.Fromtime.Value.Hour > mBusinessHour.ToTime.Value.Hour || mBusinessHour.Fromtime.Value.Hour == 0) //上班時段有跨日 { mShouldCheckOut = DateTime.Parse(checkdate.AddDays(1).ToShortDateString() + " " + mBusinessHour.ToTime.Value.Hour.ToString().PadLeft(2, '0') + ":" + mBusinessHour.ToTime.Value.Minute.ToString().PadLeft(2, '0')); } else //沒有跨日 { if (mBusinessHour.ToTime.Value.Hour == 0) { mShouldCheckOut = DateTime.Parse(checkdate.AddDays(1).ToShortDateString() + " " + "00:" + ":" + mBusinessHour.ToTime.Value.Minute.ToString().PadLeft(2, '0')); } else { mShouldCheckOut = DateTime.Parse(checkdate.ToShortDateString() + " " + mBusinessHour.ToTime.Value.Hour.ToString().PadLeft(2, '0') + ":" + mBusinessHour.ToTime.Value.Minute.ToString().PadLeft(2, '0')); } } //是否有請假 if (mLeaves != null && mLeaves.Count > 0) { if (mLeaves.Count == 1) //本日只有一条请假记录 { Model.LeaveType mLeaveType = mLeaves[0].LeaveType; switch (mLeaves[0].LeaveRange.Value) { case 0: //請整日 //mShouldCheckIn = null; //请假也有应上下班时间,为了下面计算实际上下班时间,即使请假但是有上下班时间还是要显示出来。 //mShouldCheckOut = null; if (mLeaveType.PayRate.Value == 0.5) { mDayFactor = 0.5; } else { mDayFactor = Convert.ToInt32(mLeaveType.PayRate); } //if (emp.IsMigrantWorker) //外劳员工请假不计工资(外劳以月薪计算) // mMonthFactor = 0; //else mMonthFactor = 1; mIsNormal = true; mNote = mLeaves[0].LeaveType.ToString() + "(整日)"; break; case 1: //請上半日 mShouldCheckIn = mShouldCheckOut.Value.AddHours(-4); //以應下班時間減四小時為應上班時間 if (mLeaveType.PayRate.Value == 0.5) { mDayFactor = 0.75; } else { mDayFactor = 0.5 + 0.5 * mLeaveType.PayRate; } mNote = mLeaves[0].LeaveType.ToString() + "(上半日)"; //if (emp.IsMigrantWorker) // mMonthFactor = 0.5; //else mMonthFactor = 1; break; case 2: //請下半日 mShouldCheckOut = mShouldCheckIn.Value.AddHours(4); //以應上班時間加四小時為應下班時間 if (mLeaveType.PayRate.Value == 0.5) { mDayFactor = 0.75; } else { mDayFactor = 0.5 + 0.5 * mLeaveType.PayRate; } mNote = mLeaves[0].LeaveType.ToString() + "(下半日)"; //if (emp.IsMigrantWorker) // mMonthFactor = 0.5; //else mMonthFactor = 1; break; } } else //上下半天都有请假记录 { //mShouldCheckIn = null; //mShouldCheckOut = null; mIsNormal = true; string _aNote = string.Empty; double _aDayFactor = 0; foreach (Model.Leave l in mLeaves) { _aDayFactor += l.LeaveType.PayRate.Value / 2; if (l.LeaveRange == 1) { _aNote += l.LeaveType.ToString() + "(上半日)"; } else { _aNote += l.LeaveType.ToString() + "(下半日)"; } } mDayFactor = _aDayFactor; mNote = _aNote; if (emp.IsMigrantWorker) //外劳员工请假不计工资(外劳以月薪计算) { mMonthFactor = 0; } else { mMonthFactor = 1; } } } //判斷出勤記錄 //___找不到上下班打卡資料 if (mActualCheckIn == null || mActualCheckOut == null) { //有請假 if (mLeaves != null && mLeaves.Count > 0) { if (mLeaves.Count == 1) { //只對請半天的做處理 if (mLeaves[0].LeaveRange != 0) { mIsNormal = false; mNote = mNote + ";卻刷卡資料"; } } } else //沒請假 { mIsNormal = false; mNote = "卻刷卡資料"; } } //___有上下班打卡資料 else { if (mLeaves != null && mLeaves.Count > 0) { //有請假 Model.LeaveType mLeaveType = mLeaves[0].LeaveType; if (mLeaves[0].LeaveRange != 0) { //只對請半天的做處理 if (mLeaveType.PayRate.Value == 0.5) { mDayFactor = 0.75; } else { mDayFactor = 0.5 + 0.5 * mLeaveType.PayRate; } //if (emp.IsMigrantWorker) // mMonthFactor = 0.5; //else mMonthFactor = 1; mSpecialBonus = Convert.ToDouble(mBusinessHour.SpecialPay) * 0.5; mIsNormal = true; } } else { //沒請假 mDayFactor = 1; mMonthFactor = 1; mSpecialBonus = Convert.ToDouble(mBusinessHour.SpecialPay); mIsNormal = true; } //if (mActualCheckIn > mShouldCheckIn && mLeaves != null && mLeaves.Count > 0 && mLeaves[0].LeaveRange != 0) if (mActualCheckIn > mShouldCheckIn && !(mLeaves != null && mLeaves.Count > 0 && mLeaves[0].LeaveRange == 0)) { TimeSpan ts = TimeSpan.Parse((mActualCheckIn - mShouldCheckIn).ToString()); mLateInMinute = ts.Hours * 60 + ts.Minutes; if (mLateInMinute > 0) { //if (mLateInMinute > 10) //{ //遲到超過10分鐘,顯示異常(讓員工有申訴機會) mIsNormal = false; //if (mNote != "") if (!string.IsNullOrEmpty(mNote)) { mNote = mNote + ";"; } mNote = mNote + "遲到"; //} } } else { mLateInMinute = 0; } //早退超過5分鐘,顯示異常 //if (mActualCheckOut < mShouldCheckOut && mLeaves != null && mLeaves.Count > 0 && mLeaves[0].LeaveRange != 0) if (mActualCheckOut < mShouldCheckOut && !(mLeaves != null && mLeaves.Count > 0 && mLeaves[0].LeaveRange == 0)) { TimeSpan ts = TimeSpan.Parse((mShouldCheckOut - mActualCheckOut).ToString()); int mLeaveEarly = ts.Hours * 60 + ts.Minutes; if (mLeaveEarly > 0) { mIsNormal = false; //if (mNote != "") if (!string.IsNullOrEmpty(mNote)) { mNote = mNote + ";"; } mNote = mNote + "早退"; } } } } else { //假日 mDayFactor = 1; mMonthFactor = 1; mLateInMinute = 0; mIsNormal = true; mNote = holiday.HolidayName; //找出是否有假日出勤記錄 //___依正常排班表來判 DateTime mayBeCheckIn = global::Helper.DateTimeParse.NullDate; DateTime mayBeCheckOut = global::Helper.DateTimeParse.NullDate; //先找出該員可能上下班之時間 if (mBusinessHour.Fromtime.Value.Hour == 0) { mayBeCheckIn = DateTime.Parse(checkdate.AddDays(1).ToString("yyyy-MM-dd") + " " + "00:" + mBusinessHour.Fromtime.Value.Minute.ToString().PadLeft(2, '0')); } else { mayBeCheckIn = DateTime.Parse(checkdate.ToString("yyyy-MM-dd") + " " + mBusinessHour.Fromtime.Value.Hour.ToString().PadLeft(2, '0') + ":" + mBusinessHour.Fromtime.Value.Minute.ToString().PadLeft(2, '0')); } if (mBusinessHour.Fromtime.Value.Hour > mBusinessHour.ToTime.Value.Hour) { //上班時段有跨日 mayBeCheckOut = DateTime.Parse(checkdate.AddDays(1).ToString("yyyy-MM-dd") + " " + mBusinessHour.ToTime.Value.Hour.ToString().PadLeft(2, '0') + ":" + mBusinessHour.ToTime.Value.Minute.ToString().PadLeft(2, '0')); } else { //上班時段有沒有跨日 if (mBusinessHour.ToTime.Value.Hour == 0) { mayBeCheckOut = DateTime.Parse(checkdate.AddDays(1).ToString("yyyy-MM-dd") + " " + "00:" + ":" + mBusinessHour.ToTime.Value.Minute.ToString().PadLeft(2, '0')); } else { mayBeCheckOut = DateTime.Parse(checkdate.ToString("yyyy-MM-dd") + " " + mBusinessHour.ToTime.Value.Hour.ToString().PadLeft(2, '0') + ":" + mBusinessHour.ToTime.Value.Minute.ToString().PadLeft(2, '0')); } } //有正常刷卡假日加班 if (mActualCheckIn != null && mActualCheckOut != null) { //------------------------------ //檢查是否有上滿一整個班別 //若有,則給予班別津貼 //------------------------------ TimeSpan ts1 = TimeSpan.Parse((mActualCheckOut - mActualCheckIn).ToString()); TimeSpan ts2 = TimeSpan.Parse((mayBeCheckOut - mayBeCheckOut).ToString()); if (ts1.Minutes >= ts2.Minutes) { mSpecialBonus = Convert.ToDouble(mBusinessHour.SpecialPay); } } } Model.HrDailyEmployeeAttendInfo _hrEA = new Book.Model.HrDailyEmployeeAttendInfo(); _hrEA.HrDailyEmployeeAttendInfoId = Guid.NewGuid().ToString(); _hrEA.DutyDate = checkdate; _hrEA.EmployeeId = emp.EmployeeId; _hrEA.ShouldCheckIn = mShouldCheckIn; _hrEA.ShouldCheckOut = mShouldCheckOut; _hrEA.ActualCheckIn = mActualCheckIn; _hrEA.ActualCheckOut = mActualCheckOut; _hrEA.LateInMinute = mLateInMinute; _hrEA.DayFactor = mDayFactor; _hrEA.MonthFactor = mMonthFactor; _hrEA.SpecialBonus = Convert.ToInt32(mSpecialBonus); _hrEA.IsNormal = mIsNormal; _hrEA.Note = mNote; _hrEA.MBusinessHours = mBusinessHour; _hrEA.MLeave = (mLeaves == null || mLeaves.Count == 0) ? null : mLeaves[0]; ReattenSave(_hrEA); return(_hrEA); }