private static Data.TimeRemarkData getDetailStamp1Time(string person_id, string TimeStamp, Data.TimeRuleData tr, string WorkDate, DataTable LeaveInfo) { //ตรวจสอบกรณีมีการลงเวลาแค่ครั้งเดียวในวันนั้น Data.TimeRemarkData ret = new Data.TimeRemarkData(); try { //ตรวจสอบว่าเป็นการลงเวลาในช่วงไหน if (Convert.ToInt64(TimeStamp) <= Convert.ToInt64(tr.TimeLate)) { //ลงเวลาทำงานตอนเช้า ไม่มีการลงชื่อตอนกลับ ret.TimeRemark = "ลืมลงชื่อกลับ"; ret.IsProblem = true; if (CheckLeaveID(Convert.ToInt64(person_id), WorkDate, 95, LeaveInfo) == true) { //ถ้ามีการยื่นใบลาลืมลงชื่อกลับ ret.IsProblem = false; } } else if (Convert.ToInt64(TimeStamp) > Convert.ToInt64(tr.TimeLate) && Convert.ToInt64(TimeStamp) <= Convert.ToInt64(tr.TimeLeaveHaft)) { ret.TimeRemark = "มาสายลืมลงชื่อกลับ"; ret.IsProblem = true; bool chkLeaveLate = CheckLeaveID(Convert.ToInt64(person_id), WorkDate, 91, LeaveInfo); bool chkLeaveTimeBack = CheckLeaveID(Convert.ToInt64(person_id), WorkDate, 95, LeaveInfo); if (chkLeaveLate == true && chkLeaveTimeBack == true) { ret.IsProblem = false; } } else if (Convert.ToInt64(TimeStamp) > Convert.ToInt64(tr.TimeLeaveHaft) && Convert.ToInt64(TimeStamp) <= Convert.ToInt64(tr.TimeComeAfter)) { ret.TimeRemark = "มาสาย ต้องลาครึ่งเช้า ลืมลงชื่อกลับ"; ret.IsProblem = true; ret.MustLeaveStatus = "1"; bool chkLeaveLate = CheckHaveLeave(Convert.ToInt64(person_id), WorkDate, "1", LeaveInfo); bool chkLeaveTimeBack = CheckLeaveID(Convert.ToInt64(person_id), WorkDate, 95, LeaveInfo); if (chkLeaveLate == true && chkLeaveTimeBack == true) { ret.IsProblem = false; } } else if (Convert.ToInt64(TimeStamp) > Convert.ToInt64(tr.TimeComeAfter) && Convert.ToInt64(TimeStamp) <= Convert.ToInt64(tr.TimeLateAfter)) { ret.TimeRemark = "มาสาย ต้องลาครึ่งเช้า ลืมลงชื่อกลับ"; ret.IsProblem = true; ret.MustLeaveStatus = "1"; bool chkLeaveLate = CheckHaveLeave(Convert.ToInt64(person_id), WorkDate, "1", LeaveInfo); bool chkLeaveTimeBack = CheckLeaveID(Convert.ToInt64(person_id), WorkDate, 95, LeaveInfo); if (chkLeaveLate == true && chkLeaveTimeBack == true) { ret.IsProblem = false; } } else if (Convert.ToInt64(TimeStamp) > Convert.ToInt64(tr.TimeLateAfter) && Convert.ToInt64(TimeStamp) <= Convert.ToInt64(tr.TimeLeaveFull)) { ret.TimeRemark = "มาสายช่วงบ่าย ต้องลาครึ่งเช้า ลืมลงชื่อกลับ"; ret.IsProblem = true; ret.MustLeaveStatus = "1"; bool chkLeaveLate = CheckHaveLeave(Convert.ToInt64(person_id), WorkDate, "1", LeaveInfo); bool chkLeaveTimeBack = CheckLeaveID(Convert.ToInt64(person_id), WorkDate, 95, LeaveInfo); if (chkLeaveLate == true && chkLeaveTimeBack == true) { ret.IsProblem = false; } } else if (Convert.ToInt64(TimeStamp) > Convert.ToInt64(tr.TimeLeaveFull)) { ret.TimeRemark = "ลืมลงชื่อมา ต้องลาเต็มวัน"; ret.IsProblem = true; bool chkLeaveFullDay = CheckLeaveID(Convert.ToInt64(person_id), WorkDate, 90, LeaveInfo); if (chkLeaveFullDay == true) { ret.IsProblem = false; } } } catch (Exception ex) { OPM_BL.CreateErrorLog("getDetailStamp1Time", "Exception : " + ex.Message + Environment.NewLine + ex.StackTrace); } return ret; }
private static Data.TimeRemarkData getDetailStamp2Time(string person_id, string vTimeCome, string vTimeBack, Data.TimeRuleData tr, DateTime vWorkDate, DataTable LeaveInfo) { Data.TimeRemarkData ret = new Data.TimeRemarkData(); try { bool isCheckTimeBack = true; ret.WorkFullDay = true; string WorkDate = vWorkDate.ToString("yyyyMMdd", new System.Globalization.CultureInfo("en-US")); long TimeCome = Convert.ToInt64(vTimeCome.Replace(":", "")); long TimeBack = Convert.ToInt64(vTimeBack.Replace(":", "")); //ตรวจสอบว่าเป็นการลงเวลามา ในช่วงไหน if (TimeCome > Convert.ToInt64(tr.TimeLate) && TimeCome <= Convert.ToInt64(tr.TimeLeaveHaft)) { ret.TimeRemark = "มาสาย"; ret.IsProblem = true; bool chkLeaveLate = CheckLeaveID(Convert.ToInt64(person_id), WorkDate, 91, LeaveInfo); if (chkLeaveLate == true) { ret.IsProblem = false; } } else if (TimeCome > Convert.ToInt64(tr.TimeLeaveHaft) && TimeCome <= Convert.ToInt64(tr.TimeComeAfter)) { ret.TimeRemark = "มาสาย ต้องลาครึ่งเช้า"; ret.IsProblem = true; ret.WorkFullDay = false; ret.WorkHalfA = true; ret.MustLeaveStatus = "1"; bool chkLeaveLate = CheckHaveLeave(Convert.ToInt64(person_id), WorkDate, "1", LeaveInfo); if (chkLeaveLate == true) { ret.IsProblem = false; } } else if (TimeCome > Convert.ToInt64(tr.TimeComeAfter) && TimeCome <= Convert.ToInt64(tr.TimeLateAfter)) { ret.TimeRemark = "มาสาย ต้องลาครึ่งเช้า"; ret.IsProblem = true; ret.MustLeaveStatus = "1"; ret.WorkFullDay = false; ret.WorkHalfA = true; bool chkLeaveLate = CheckHaveLeave(Convert.ToInt64(person_id), WorkDate, "1", LeaveInfo); if (chkLeaveLate == true) { ret.IsProblem = false; } } else if (TimeCome > Convert.ToInt64(tr.TimeLateAfter) && TimeCome <= Convert.ToInt64(tr.TimeLeaveFull)) { ret.TimeRemark = "มาสายช่วงบ่าย ต้องลาครึ่งเช้า"; ret.IsProblem = true; ret.MustLeaveStatus = "1"; ret.WorkFullDay = false; ret.WorkHalfA = true; bool chkLeaveLate = CheckHaveLeave(Convert.ToInt64(person_id), WorkDate, "1", LeaveInfo); if (chkLeaveLate == true) { ret.IsProblem = false; } } else if (TimeCome > Convert.ToInt64(tr.TimeLeaveFull)) { ret.TimeRemark = "ลืมลงชื่อมา ต้องลาเต็มวัน"; ret.IsProblem = true; ret.WorkFullDay = false; ret.WorkHalfA = true; bool chkLeaveFullDay = CheckLeaveID(Convert.ToInt64(person_id), WorkDate, 90, LeaveInfo); if (chkLeaveFullDay == true) { ret.IsProblem = false; } isCheckTimeBack = false; } if (isCheckTimeBack == true) { //ตรวจสอบเวลากลับก่อนตอนเช้า if (TimeBack < Convert.ToInt64(tr.TimeBackMorning)) { ret.TimeRemark += " กลับก่อน"; bool chkBackBef = CheckLeaveID(Convert.ToInt64(person_id), WorkDate, 92, LeaveInfo); //ถ้ามีการยื่นขอกลับก่อน ret.WorkHalfM = true; ret.WorkHalfA = false; ret.WorkFullDay = false; //ถ้าเวลามาไม่มีปัญหา แต่มีปัญหาตอนเวลากลับ และไม่ยื่นขอกลับก่อน if (ret.IsProblem == false && chkBackBef == false) { ret.IsProblem = true; ret.MustLeaveStatus = "2"; } } else if (TimeBack < Convert.ToInt64(tr.TimeBackBefore)) { //ตรวจสอบเวลากลับก่อนตอนเย็น ret.TimeRemark += " กลับก่อน"; ret.WorkHalfM = true; ret.WorkHalfA = false; ret.WorkFullDay = false; //ถ้ามีการยื่นขอกลับก่อนตอนเย็น bool chkBackBef = CheckLeaveID(Convert.ToInt64(person_id), WorkDate, 92, LeaveInfo); //ถ้าเวลามาไม่มีปัญหา แต่มีปัญหาตอนเวลากลับ และไม่ยื่นขอกลับก่อนตอนเย็น if (ret.IsProblem == false && chkBackBef == false) { ret.IsProblem = true; ret.MustLeaveStatus = "2"; } } } //กรณีรอบเวลายืดหยุ่ 8 ชั่วโมง if (tr.TMCheck == true) { DateTime dTimeCome = new DateTime(vWorkDate.Year, vWorkDate.Month, vWorkDate.Day, Convert.ToInt16(vTimeCome.Split(':')[0]), Convert.ToInt16(vTimeCome.Split(':')[1]), Convert.ToInt16(vTimeCome.Split(':')[2]), 0); DateTime dTimeBack = new DateTime(vWorkDate.Year, vWorkDate.Month, vWorkDate.Day, Convert.ToInt16(vTimeBack.Split(':')[0]), Convert.ToInt16(vTimeBack.Split(':')[1]), Convert.ToInt16(vTimeBack.Split(':')[2]), 0); double WorkTimeMin = (dTimeBack - dTimeCome).TotalMinutes; if (ret.WorkFullDay == true) { if (WorkTimeMin < tr.TMFullBef) { ret.IsProblem = true; if (ret.TimeRemark.IndexOf("กลับก่อน") == 0) { ret.TimeRemark += " กลับก่อน"; } ret.MustLeaveStatus = "2"; } } else if (ret.WorkHalfM == true) { if (WorkTimeMin < tr.TMHalf) { ret.IsProblem = true; if (ret.TimeRemark.IndexOf("กลับก่อน") == 0) { ret.TimeRemark += " กลับก่อน"; } ret.MustLeaveStatus = "2"; } } else if (ret.WorkHalfA == true) { if (WorkTimeMin < tr.TMHalfAft) { ret.IsProblem = true; if (ret.TimeRemark.IndexOf("กลับก่อน") == 0) { ret.TimeRemark += " กลับก่อน"; } ret.MustLeaveStatus = "2"; } } } } catch (Exception ex) { OPM_BL.CreateErrorLog("getDetailStamp2Time", "Exception : " + ex.Message + Environment.NewLine + ex.StackTrace); } return ret; }
public static void ProcessTimeByPerson(DateTime CurDate, DataRow pDr, DataTable TimeDt) { //ประมวลผลเวลาการมาทำงานในแต่ละวันเป็นรายบุคคล try { long person_id = Convert.ToInt64(pDr["id"].ToString()); string UserCode = ""; long orgSerial = 0; string CurDateStr = CurDate.ToString("yyyyMMdd", new System.Globalization.CultureInfo("en-US")); //ข้อมูลการลงเวลา DataTable pTimeDt = new DataTable(); bool isTimeStamp = false; //มีการลงเวลา bool isStamp1Time = false; //ลงเวลา 1 ครั้ง bool isStamp2Time = false; //ลงเวลา ตั้งแต่ 2 ครั้งขึ้นไป //ข้อมูลรอบเวลา Data.TimeRuleData tr = new Data.TimeRuleData(); tr.TimeCode = pDr["time_code"].ToString(); tr.TimeName = pDr["time_name"].ToString(); //ชื่อรอบเวลา tr.TimeCome = pDr["time_come"].ToString(); //เวลาที่ต้องมา tr.TimeLate = pDr["time_late"].ToString(); //เวลาที่สาย tr.TimeLeaveHaft = pDr["time_leavehalf"].ToString(); //ต้องลาครึ่งวันเช้า tr.TimeLeaveFull = pDr["time_leavefull"].ToString(); //ต้องลาเต็มวัน tr.TimeBackBefore = pDr["time_backbef"].ToString(); //สามารถกลับก่อน tr.TimeBack = pDr["time_back"].ToString(); //เวลากลับปกติ tr.TimeComeAfter = pDr["time_comeaft"].ToString(); //เวลามาปฏิบัติราชการบ่าย tr.TimeLateAfter = pDr["time_lateaft"].ToString(); //เวลามาสาย(มาปฏิบัติราชการบ่าย) tr.TimeBackMorning = pDr["time_back_m"].ToString(); //เวลากลับปกติเช้า tr.TMCheck = Convert.ToBoolean(pDr["tm_check"]); //ยืดหยุ่น 8 ขั่วโมง if (tr.TMCheck == true) { tr.TMHalf = (Convert.ToInt16(pDr["tm_haft"].ToString().Substring(0, 2)) * 60) + Convert.ToInt16(pDr["tm_haft"].ToString().Substring(2, 2)); tr.TMHalfAft = (Convert.ToInt16(pDr["tm_haftbef"].ToString().Substring(0, 2)) * 60) + Convert.ToInt16(pDr["tm_haftbef"].ToString().Substring(2, 2)); tr.TMFull = (Convert.ToInt16(pDr["tm_full"].ToString().Substring(0, 2)) * 60) + Convert.ToInt16(pDr["tm_full"].ToString().Substring(2, 2)); tr.TMFullBef = (Convert.ToInt16(pDr["tm_fullbef"].ToString().Substring(0, 2)) * 60) + Convert.ToInt16(pDr["tm_fullbef"].ToString().Substring(2, 2)); } #region "ตรวจสอบวันที่มีการกำหนดรอบการลงเวลากรณีพิเศษ" string sql = "select s.TIME_RULE_S_DATE, ds.TIME_CODE,ds.TIME_COME,ds.TIME_BACK,ds.TIME_LATE,ds.TIME_BACKBF "; sql += " from PSST_TIME_RULE_S s "; sql += " inner join PSST_TIME_RULE_S_DETAIL ds on s.id = ds.TIME_RULE_S_ID "; sql += " where convert(varchar(8),s.time_rule_s_date,112) = @_TIME_RULE_S_DATE "; sql += " and ds.time_code=@_TIME_CODE "; SqlParameter[] sp = new SqlParameter[2]; sp[0] = OPMSqlDb.setText("@_TIME_RULE_S_DATE", CurDateStr); sp[1] = OPMSqlDb.setText("@_TIME_CODE", pDr["time_code"].ToString()); DataTable sDt = OPMSqlDb.ExecuteTable(sql, sp); if (sDt.Rows.Count > 0) { DataRow sDr = sDt.Rows[0]; tr.TimeCome = sDr["time_come"].ToString(); //เวลาที่ต้องมา tr.TimeBack = sDr["time_back"].ToString(); //เวลากลับปกติ tr.TimeLate = sDr["time_late"].ToString(); //เวลาที่สาย tr.TimeBackBefore = sDr["time_backbf"].ToString(); //สามารถกลับก่อน } sDt.Dispose(); #endregion //ข้อมูลการยื่นใบลา DataTable LeaveInfo = getPersonLeave(person_id, CurDateStr); if (Convert.IsDBNull(pDr["user_code"]) == false) { UserCode = pDr["user_code"].ToString(); } if (Convert.IsDBNull(pDr["org_serial"]) == false) { orgSerial = Convert.ToInt64(pDr["org_serial"]); } //Clear Data เดิมก่อนเลยเป็นอันดับแรก ClearProcessTimeData(person_id, CurDateStr); Data.TimeRemarkData vRemark = new Data.TimeRemarkData(); TimeDt.DefaultView.RowFilter = "person_id='" + person_id.ToString() + "' and this_time_str='" + CurDateStr + "'"; pTimeDt = TimeDt.DefaultView.ToTable().Copy(); //2. ตรวจสอบข้อมูลการลงเวลา string TimeCome = "00:00:00"; string TimeBack = "00:00:00"; if (TimeDt.DefaultView.Count == 1) { //2.1 ถ้ามี 1 Record แล้วเป็นเวลาที่อยู่ในช่วง เวลามา, เวลาสาย, ต้องลาครึ่งวันเช้า, ต้องลาเต็มวัน ให้ Stamp หมายเหตุ ตามเงื่อนไขนั้น string StampTime = Convert.ToDateTime(TimeDt.DefaultView[0]["this_time"]).ToString("HH:mm:ss"); TimeCome = StampTime; TimeBack = StampTime; isTimeStamp = true; isStamp1Time = true; } else if (TimeDt.DefaultView.Count > 1) { //2.2 ถ้ามีมากกว่า 1 Record ให้พิจารณาที่ Record แรก และ Record สุดท้าย TimeCome = Convert.ToDateTime(TimeDt.DefaultView[0]["this_time"]).ToString("HH:mm:ss"); TimeBack = Convert.ToDateTime(TimeDt.DefaultView[TimeDt.DefaultView.Count - 1]["this_time"]).ToString("HH:mm:ss"); isTimeStamp = true; isStamp2Time = true; } //กรณีมีการลงเวลาทำงานในวันหยุด ให้แสดงเวลานั้นเลยไม่ต้องมี Process if (CheckIsHoliday(CurDateStr) == true && isTimeStamp==true) { InsertTimeProcess(person_id, UserCode, orgSerial, tr.TimeCode, DateTime.Now, CurDate, TimeCome, TimeBack, ""); return; } if (isTimeStamp == true) { if (tr.TimeCode != "00") { //3. พิจารณาช่วงเวลาที่มีการลงเวลา if (isStamp1Time == true) { //ถ้าลงเวลาครั้งเดียว vRemark = getDetailStamp1Time(person_id.ToString(), TimeCome.Replace(":", ""), tr, CurDateStr, LeaveInfo); //เสร็จแล้วค่อยไปพิจารณาเรื่องมีหรือไม่มีใบลาอีก } else if (isStamp2Time == true) { vRemark = getDetailStamp2Time(person_id.ToString(), TimeCome, TimeBack, tr, CurDate, LeaveInfo); } } else { vRemark.IsProblem = false; vRemark.TimeRemark = ""; //กรณีอยู่รอบเวลาที่ไม่ต้องลงเวลา ดันทะลึ่งมาลงเวลา } } else { //กรณีไม่มีการลงเวลา if (tr.TimeCode == "00") { vRemark.IsProblem = false; vRemark.TimeRemark = ""; //กรณีอยู่รอบเวลาที่ไม่ต้องลงเวลา ดันทะลึ่งมาลงเวลา } else { vRemark.IsProblem = true; vRemark.TimeRemark = "ลืมลงเวลามา-กลับ"; vRemark.MustLeaveStatus = "3";//ลาเต็มวัน } } string DPISAbsentFlag = ""; if (vRemark.MustLeaveStatus == "1")//สาย DPISAbsentFlag = "3"; if (vRemark.IsProblem == true) //ถ้ามีปัญหาเกี่ยวกับการลงเวลา ให้ตรวจสอบใบลา { //4. ตรวจสอบข้อมูลการยื่นใบลา และหมายเหตุการลงเวลาของเจ้าหน้าที่ if (LeaveInfo.Rows.Count > 0) { //กรณีมีใบลา vRemark.TimeRemark = GetLeaveDetail(person_id, CurDateStr, LeaveInfo); if (isStamp1Time == true) { //และมีการลงเวลาครั้งเดียวในวันนั้น //ก็ให้ Insert ลงใน HRM_TIME_PROCESS ได้เลย InsertTimeProcess(person_id, UserCode, orgSerial, tr.TimeCode, DateTime.Now, CurDate, TimeCome, TimeBack, vRemark.TimeRemark); InsertDPISWorkTime(person_id, CurDate, TimeCome, TimeBack, vRemark.TimeRemark, ""); } else if (isStamp2Time == true) { InsertTimeProcess(person_id, UserCode, orgSerial, tr.TimeCode, DateTime.Now, CurDate, TimeCome, TimeBack, vRemark.TimeRemark); InsertDPISWorkTime(person_id, CurDate, TimeCome, TimeBack, vRemark.TimeRemark, ""); } else if (isTimeStamp == false) { //ถ้าไม่มีการลงเวลาแต่มีใบลา InsertTimeProcess(person_id, UserCode, orgSerial, tr.TimeCode, DateTime.Now, CurDate, TimeCome, TimeBack, vRemark.TimeRemark); InsertDPISWorkTime(person_id, CurDate, TimeCome, TimeBack, vRemark.TimeRemark, "2"); } } else { //กรณีไม่มีใบลา if (isStamp1Time == true) { //และมีการลงเวลาครั้งเดียวในวันนั้น //5. ตรวจสอบรอบเวลา ถ้าเป็นรอบไม่ต้องลงเวลาก็ให้ตรวจสอบว่ามีการลงเวลาหรือไม่ if (tr.TimeCode == "00") { InsertTimeProcess(person_id, UserCode, orgSerial, tr.TimeCode, DateTime.Now, CurDate, TimeCome, TimeBack, tr.TimeName); InsertDPISWorkTime(person_id, CurDate, TimeCome, TimeBack, vRemark.TimeRemark, ""); } else { InsertTimeDataLate(person_id, UserCode, orgSerial, tr.TimeCode, DateTime.Now, CurDate, TimeCome, TimeBack, vRemark.TimeRemark, vRemark.MustLeaveStatus); InsertDPISWorkTime(person_id, CurDate, TimeCome, TimeBack, vRemark.TimeRemark, DPISAbsentFlag); } } else if (isStamp2Time == true) { InsertTimeDataLate(person_id, UserCode, orgSerial, tr.TimeCode, DateTime.Now, CurDate, TimeCome, TimeBack, vRemark.TimeRemark, vRemark.MustLeaveStatus); InsertDPISWorkTime(person_id, CurDate, TimeCome, TimeBack, vRemark.TimeRemark, DPISAbsentFlag); ////ถ้ามีการลงเวลาทั้ง 2 ครั้ง และเป็นคนที่อยู่ในรอบเวลายืดหยุ่น 8 ชั่วโมง //if (tr.TMCheck == true) //{ //} //else //{ //} } else if (isTimeStamp == false) { //กรณีไม่มีการลงเวลาเลย if (tr.TimeCode == "00") { InsertTimeProcess(person_id, UserCode, orgSerial, tr.TimeCode, DateTime.Now, CurDate, TimeCome, TimeBack, tr.TimeName); InsertDPISWorkTime(person_id, CurDate, TimeCome, TimeBack, vRemark.TimeRemark, ""); } else { InsertTimeDataLate(person_id, UserCode, orgSerial, tr.TimeCode, DateTime.Now, CurDate, TimeCome, TimeBack, vRemark.TimeRemark, vRemark.MustLeaveStatus); InsertDPISWorkTime(person_id, CurDate, TimeCome, TimeBack, vRemark.TimeRemark, DPISAbsentFlag); } } } } else { //กรณีไม่พบปัญหา //Insert Time Process InsertTimeProcess(person_id, UserCode, orgSerial, tr.TimeCode, DateTime.Now, CurDate, TimeCome, TimeBack, vRemark.TimeRemark); InsertDPISWorkTime(person_id, CurDate, TimeCome, TimeBack, vRemark.TimeRemark, ""); } TimeDt.DefaultView.RowFilter = ""; } catch (Exception ex) { OPM_BL.CreateErrorLog("TimeProcessEng.PorcessTimeByPerson", "Exception : " + ex.Message + Environment.NewLine + ex.StackTrace); } }