// получаем часы переработок - возвращается 0 - если у человека 0 часов переработок. 1 - если у человека есть ненулевое количество переработок, -1 - нет такого сотрудника public int insertOvertimeHoursToDB(string employee_id, string start_period, string begda, string endda, int count_days, int month, int year, string accountant_id, int period_id) { SQLDB db = new SQLDB(); Date dt = new Date(); int day = 1; EmployeeList emp_list = new EmployeeList(); List<TimekeeperHours> current = emp_list.getEmployeesTimekeeperHours(employee_id, start_period, begda, endda); List<HRHours> hr_current = emp_list.getEmployeesHRHours(employee_id, start_period, begda, endda); List<Schedule> schedule = emp_list.getEmployeesSchedule(employee_id, start_period, begda, endda); List<ScheduleDeflection> dschedule = emp_list.getEmployeesScheduleDeflection(employee_id, start_period, begda, endda); decimal overhours_count = db.getOverhoursSum(employee_id, start_period, begda, endda); bool t13 = false; bool diversity = false; if (overhours_count == 0) { db.insertOverhoursToManagement(employee_id, start_period, begda, endda, dt.getDateToSQL(day, month, year), 0, accountant_id, period_id); return 0; } if (overhours_count <= 8) t13 = true; else diversity = true; // если кол-во переработок больше 8 часов, то используем эти переменные decimal m111 = 0; // тип переработок M111 - сумма первых 2 часов переработок, кроме выходных decimal m122 = 0; // тип переработок M122 - сумма оставшихся часов и переработки в выходные и праздничные дни decimal m210 = 0; // тип переработок M210 - сумма только ночных переработок foreach (Schedule sch in schedule) { // если у нас день не совпадает с днем в графике, заполняю пустым квадратом int d = Convert.ToInt32(sch.DayPeriod); while (d != day) { if (day == count_days) break; day++; } HRHours hrh = hr_current.Find(delegate(HRHours h) { return h.Day == day.ToString(); }); decimal hr_sum = 0; if (hrh != null) hr_sum = hrh.DayOverHours + hrh.NightOverHours; ScheduleDeflection sd = dschedule.Find(delegate(ScheduleDeflection dsch) { return Convert.ToInt32(dsch.DayPeriod) == day; }); if (sd == null) { // если у нас выходной то считаем все переработки за этот день if (((sch.DaySchedule == "FREE") && (Convert.ToInt32(sch.TimeHours) == 0)) || (sch.DayScheduleVar == "F")) { if (hrh != null) { db.insertOverhoursToManagement(employee_id, start_period, begda, endda, dt.getDateToSQL(day, month, year), hr_sum, accountant_id, period_id); if (t13) db.insertOverhoursToT13(employee_id, start_period, begda, endda, dt.getDateToSQL(day, month, year), hr_sum, accountant_id, period_id); } if ((diversity) && (hrh != null)) m122 += hr_sum; } else // если рабочий день { if (hrh != null) { db.insertOverhoursToManagement(employee_id, start_period, begda, endda, dt.getDateToSQL(day, month, year), hr_sum, accountant_id, period_id); if (t13) db.insertOverhoursToT13(employee_id, start_period, begda, endda, dt.getDateToSQL(day, month, year), hr_sum, accountant_id, period_id); } if ((diversity) && (hrh != null)) { if (hr_sum <= 2) m111 += hr_sum; else { m111 += 2; m122 += (hr_sum - 2); } if (hrh.NightOverHours != 0) m210 += hrh.NightOverHours; } } } else // !!!!!!!!!!!! Посмотреть внимательно, когда будет действовать блок закачки переработок в SAP !!!!!!!!! { // смотрим отклонение Отзыв из отпуска. Если в этот день есть переработка - пишем ее if (sd.AbsAttType.Equals("2000") || sd.AbsAttType.Equals("2001")) { // если у нас выходной то считаем все переработки за этот день if (((sch.DaySchedule == "FREE") && (Convert.ToInt32(sch.TimeHours) == 0)) || (sch.DayScheduleVar == "F")) { if (hrh != null) { db.insertOverhoursToManagement(employee_id, start_period, begda, endda, dt.getDateToSQL(day, month, year), hr_sum, accountant_id, period_id); if (t13) db.insertOverhoursToT13(employee_id, start_period, begda, endda, dt.getDateToSQL(day, month, year), hr_sum, accountant_id, period_id); } if ((diversity) && (hrh != null)) m122 += hr_sum; } else // если рабочий день { if (hrh != null) { db.insertOverhoursToManagement(employee_id, start_period, begda, endda, dt.getDateToSQL(day, month, year), hr_sum, accountant_id, period_id); if (t13) db.insertOverhoursToT13(employee_id, start_period, begda, endda, dt.getDateToSQL(day, month, year), hr_sum, accountant_id, period_id); } if ((diversity) && (hrh != null)) { if (hr_sum <= 2) m111 += hr_sum; else { m111 += 2; m122 += (hr_sum - 2); } if (hrh.NightOverHours != 0) m210 += hrh.NightOverHours; } } } } day++; } if (m111 > 0) db.insertOverhoursDiversity(employee_id, start_period, begda, endda, dt.getDateFromSAPToSQL(endda), m111, "M111", accountant_id, period_id); if (m122 > 0) db.insertOverhoursDiversity(employee_id, start_period, begda, endda, dt.getDateFromSAPToSQL(endda), m122, "M122", accountant_id, period_id); if (m210 > 0) db.insertOverhoursDiversity(employee_id, start_period, begda, endda, dt.getDateFromSAPToSQL(endda), m210, "M210", accountant_id, period_id); return 1; }
// получаем список сотрудников у которых графики не совпадают public bool checkEmployee(string employee_id, string start_period, string begda, string endda, int count_days) { bool is_right = true; int day = 1; EmployeeList emp_list = new EmployeeList(); List<TimekeeperHours> current = emp_list.getEmployeesTimekeeperHours(employee_id, start_period, begda, endda); List<HRHours> hr_current = emp_list.getEmployeesHRHours(employee_id, start_period, begda, endda); List<Schedule> schedule = emp_list.getEmployeesSchedule(employee_id, start_period, begda, endda); List<ScheduleDeflection> dschedule = emp_list.getEmployeesScheduleDeflection(employee_id, start_period, begda, endda); foreach (Schedule sch in schedule) { // если у нас день не совпадает с днем в графике, заполняю пустым квадратом int d = Convert.ToInt32(sch.DayPeriod); while (d != day) { if (day == count_days) break; day++; } is_right = true; string time = ""; decimal hour_timekeeper = 0; decimal hour_schedule = 0; decimal hour_hr = 0; string symbols = ""; TimekeeperHours th = current.Find(delegate(TimekeeperHours h) { return h.Day == day.ToString(); }); if (th != null) { hour_timekeeper = th.Hours; symbols = th.Symbols.ToUpper(); } ScheduleDeflection sd = dschedule.Find(delegate(ScheduleDeflection dsch) { return Convert.ToInt32(dsch.DayPeriod) == day; }); if (sd != null) { time = sd.CodeT13; decimal diversity = sch.TimeHours - sd.TimeHours; if (diversity == 0) { // если отклонение с кодом 2000 или 2001 - Отзыв из отпуска, то в основной график проставляем часы. Это присутствие. if (sd.AbsAttType.Equals("2000") || sd.AbsAttType.Equals("2001")) hour_schedule = Convert.ToDecimal(sd.TimeHours); else time = sd.CodeT13; } else { if (diversity > 0) { time = CheckDecimalNumber(diversity.ToString()); hour_schedule = Convert.ToDecimal(diversity); } else { time = CheckDecimalNumber(sd.TimeHours.ToString()); hour_schedule = Convert.ToDecimal(sd.TimeHours); } } } else { // если у нас выходной то вставляем в квадрат букву В if (((sch.DaySchedule == "FREE") && (Convert.ToDecimal(sch.TimeHours) == 0)) || (sch.DayScheduleVar == "F")) { time = "В"; // В - в русской раскладке!!!!!!!! } else { time = CheckDecimalNumber(sch.TimeHours.ToString()); hour_schedule = Convert.ToDecimal(sch.TimeHours); } } HRHours hrh = hr_current.Find(delegate(HRHours h) { return h.Day == day.ToString(); }); if (hrh != null) { if ((hrh.DayOverHours != null) && (hrh.NightOverHours != null)) hour_hr = hrh.DayOverHours + hrh.NightOverHours; if ((hrh.DayOverHours != null) && (hrh.NightOverHours == null)) hour_hr = hrh.DayOverHours; if ((hrh.DayOverHours == null) && (hrh.NightOverHours != null)) hour_hr = hrh.NightOverHours; } if (hour_timekeeper <= 0) { // если в часах табельщика буквы и они совпадают с основным графиком, идем дальше try { if ((symbols.Equals(time) == true) || ((symbols == "") && (Convert.ToDecimal(time) == 0))) continue; } catch { } // если в часах табельщика проставлены буквы и они не совпадают с основным графиком, то записываем сотрудника if ((symbols.Equals(time) == false) || (hour_hr > 0)) { is_right = false; break; } } // вычисляем результат = часы табельщика - часы переработки - часы по основному графику decimal result = hour_timekeeper - hour_hr - hour_schedule; if (result != 0) { is_right = false; break; } day++; } return is_right; }
// формируем html для графиков сотрудников public string DisplaySchedules(int count_days, int size, Employee emp, string role, bool check, bool is_closed_emp, string month, string year) { string html = "<table cellpadding='0' cellspacing='0' border='0' class='days_table_schedules' >"; string time = ""; string day_message = ""; string timetable = ""; string hr = ""; string hrdoc = ""; decimal sum_hour_timekeeper = 0; decimal sum_hour_schedule = 0; decimal sum_hour_hr = 0; string readonle = ""; if (is_closed_emp == true) readonle = "readonly"; int day = 1; EmployeeList emp_list = new EmployeeList(); List<TimekeeperHours> current = emp_list.getEmployeesTimekeeperHours(emp.EmployeeID, emp.StartPeriod, emp.BeginDate, emp.EndDate); List<HRHours> hr_current = emp_list.getEmployeesHRHours(emp.EmployeeID, emp.StartPeriod, emp.BeginDate, emp.EndDate); List<Schedule> schedule = emp_list.getEmployeesSchedule(emp.EmployeeID, emp.StartPeriod, emp.BeginDate, emp.EndDate); List<ScheduleDeflection> dschedule = emp_list.getEmployeesScheduleDeflection(emp.EmployeeID, emp.StartPeriod, emp.BeginDate, emp.EndDate); // крутимся в цикле с основным графиком foreach (Schedule sch in schedule) { int d = Convert.ToInt32(sch.DayPeriod); // если у нас день не совпадает с днем в графике, заполняю пустым квадратом while (d != day) { if (day == count_days) break; time = ""; timetable += "<td width='22px' style='padding-bottom: 2px;'><input type='text' class='timekeeper' readonly name='" + emp.EmployeeID + "+" + emp.PostID + "+" + emp.DepartmentID + "+" + emp.BeginDate + "+" + emp.EndDate + "+" + day.ToString() + "' value='' style='width: " + (size - 2) + "px; height: " + (size - 2) + "px; border: 1px #818181 solid; background-color:#EEEEEE' ></td>"; hr += "<td width='22px' style='padding-bottom: 2px;'><div title='" + day.ToString() + "' style='width: " + size + "px; height: " + size + "px; border: 1px #818181 solid; background-color:#FED7AB;overflow: hidden; '><span class='day_number'>" + time + "</span></div></td>"; hrdoc += "<td width='22px' style='padding-bottom: 2px;'><input type='text' value='' readonly maxlength='5' style='width: " + (size - 2) + "px; height: " + (size - 2) + "px; border: 1px #818181 solid; background-color:#D1E9E9; text-align: center; font-family: 'Trebuchet MS' , 'Times New Roman'; color: #000000; font-size: 8pt;'></td>"; day++; } decimal hour_timekeeper = 0; decimal hour_schedule = 0; decimal hour_hr = 0; // если есть отклонение, пишем его, иначе выводим основной график ScheduleDeflection sd = dschedule.Find(delegate(ScheduleDeflection dsch) { return Convert.ToInt32(dsch.DayPeriod) == day; }); if (sd != null) { decimal diversity = sch.TimeHours - sd.TimeHours; if (diversity == 0) { // если отклонение с кодом 2000 или 2001 - Отзыв из отпуска, то в основной график проставляем часы. Это присутствие. if (sd.AbsAttType.Equals("2000") || sd.AbsAttType.Equals("2001")) { time = CheckDecimalNumber(sd.TimeHours.ToString()); hour_schedule = Convert.ToDecimal(sd.TimeHours); } else time = sd.CodeT13; } else { if (diversity > 0) { time = CheckDecimalNumber(diversity.ToString()); hour_schedule = Convert.ToDecimal(diversity); } else { time = CheckDecimalNumber(sd.TimeHours.ToString()); hour_schedule = Convert.ToDecimal(sd.TimeHours); } } hr += "<td width='22px' style='padding-bottom: 2px;'><div onmouseover='ShowFilter(\"helpsap\", event.clientX + document.body.scrollLeft, event.clientY + document.body.scrollTop);' onmouseout='HideBlock(\"helpsap\");' style='width: " + size + "px; height: " + size + "px; border: 1px #818181 solid; background-color:#FED7AB;overflow: hidden; '><span class='day_number'>" + time + "</span></div></td>"; } else { // если у нас выходной то вставляем в квадрат букву В - в русской раскладке!!!!!!!! if (((sch.DaySchedule == "FREE") && (Convert.ToDecimal(sch.TimeHours) == 0)) || (sch.DayScheduleVar == "F")) { time = "В"; // В - в русской раскладке!!!!!!!! hr += "<td width='22px' style='padding-bottom: 2px;'><div onmouseover='ShowFilter(\"helpsap\", event.clientX + document.body.scrollLeft, event.clientY + document.body.scrollTop);' onmouseout='HideBlock(\"helpsap\");' style='width: " + size + "px; height: " + size + "px; border: 1px #818181 solid; background-color:#DCB589;overflow: hidden; '><span class='day_number'>" + time + "</span></div></td>"; } else { time = CheckDecimalNumber(sch.TimeHours.ToString()); hour_schedule = Convert.ToDecimal(sch.TimeHours); hr += "<td width='22px' style='padding-bottom: 2px;'><div onmouseover='ShowFilter(\"helpsap\", event.clientX + document.body.scrollLeft, event.clientY + document.body.scrollTop);' onmouseout='HideBlock(\"helpsap\");' style='width: " + size + "px; height: " + size + "px; border: 1px #818181 solid; background-color:#FED7AB;overflow: hidden; '><span class='day_number'>" + time + "</span></div></td>"; } } // выводим график переработок string bgcolor = "#D1E9E9"; HRHours hrh = hr_current.Find(delegate(HRHours h) { return h.Day == day.ToString(); }); string hr_value = ""; if (hrh != null) { hour_hr = hrh.DayOverHours + hrh.NightOverHours; hr_value = CheckDecimalNumber(hour_hr.ToString()); } if (time == "В") bgcolor = "#A4C8B7"; if ((hrh != null) && (hrh.NightOverHours != 0)) bgcolor = "#83abdc"; hrdoc += "<td width='22px' style='padding-bottom: 2px;'><input type='text' value='" + hr_value + "' name='' readonly maxlength='5' style='width: " + (size - 2) + "px; height: " + (size - 2) + "px; border: 1px #818181 solid; background-color:" + bgcolor + "; text-align: center; font-family: 'Trebuchet MS' , 'Times New Roman'; color: #000000; font-size: 8pt;'></td>"; // выводим график табельщика TimekeeperHours th = current.Find(delegate(TimekeeperHours h) { return h.Day == day.ToString(); }); string value = ""; if (th != null) { if (th.Hours >= 0) { value = CheckDecimalNumber(th.Hours.ToString()); hour_timekeeper = th.Hours; } else { value = th.Symbols; } } string color_check = "#EEEEEE"; string color_check_timekeeper = "#FFFFFF"; if (check) { decimal result = hour_timekeeper - hour_hr - hour_schedule; if (result != 0) { color_check = "red"; color_check_timekeeper = "red"; } if ((hour_timekeeper <= 0) && (!value.ToUpper().Equals(time))) { color_check = "red"; color_check_timekeeper = "red"; } } if ((role == "1") && (!is_closed_emp)) timetable += "<td width='22px' style='padding-bottom: 2px;'><span class='day_number'><input type='text' class='timekeeper' " + readonle + " value='" + value + "' name='" + emp.EmployeeID + "+" + emp.PostID + "+" + emp.DepartmentID + "+" + emp.BeginDate + "+" + emp.EndDate + "+" + day.ToString() + "' maxlength='5' style='width: " + (size - 2) + "px; height: " + (size - 2) + "px; border: 1px #818181 solid; text-align: center; background-color:" + color_check_timekeeper + "' onblur='CheckHourType(this)'></span></td>"; else timetable += "<td width='22px' style='padding-bottom: 2px;'><input type='text' readonly value='" + value + "' name='' style='width: " + (size - 2) + "px; height: " + (size - 2) + "px; border: 1px #818181 solid; text-align: center; background-color:" + color_check + "' ></td>"; sum_hour_timekeeper += hour_timekeeper; sum_hour_schedule += hour_schedule; sum_hour_hr += hour_hr; day++; } while (day <= count_days) { time = ""; timetable += "<td width='22px' style='padding-bottom: 2px;'><input type='text' class='timekeeper' readonly name='" + emp.EmployeeID + "+" + emp.PostID + "+" + emp.DepartmentID + "+" + emp.BeginDate + "+" + emp.EndDate + "+" + day.ToString() + "' value='' style='width: " + (size - 2) + "px; height: " + (size - 2) + "px; border: 1px #818181 solid; background-color:#EEEEEE' ></td>"; hr += "<td width='22px' style='padding-bottom: 2px;'><div title='" + day.ToString() + "' style='width: " + size + "px; height: " + size + "px; border: 1px #818181 solid; background-color:#FED7AB; overflow: hidden;'><span class='day_number'>" + time + "</span></div></td>"; hrdoc += "<td width='22px' style='padding-bottom: 2px;'><input type='text' value='' readonly maxlength='5' style='width: " + (size - 2) + "px; height: " + (size - 2) + "px; border: 1px #818181 solid; background-color:#D1E9E9; text-align: center; font-family: 'Trebuchet MS' , 'Times New Roman'; color: #000000; font-size: 8pt;'></td>"; day++; } html += "<tr>" + timetable + "<td style='padding-bottom: 2px;'><input type='text' value='" + CheckDecimalNumber(sum_hour_timekeeper.ToString()) + "' name='' readonly class='sum_timetable' ></td></tr>"; html += "<tr>" + hr + "<td style='padding-bottom: 2px;'><input type='text' value='" + CheckDecimalNumber(sum_hour_schedule.ToString()) + "' name='' readonly class='sum_timetable' ></td></tr>"; html += "<tr>" + hrdoc + "<td style='padding-bottom: 2px;'><input type='text' value='" + CheckDecimalNumber(sum_hour_hr.ToString()) + "' name='' readonly class='sum_timetable' ></td></tr>"; html += "</table>"; return html; }