// получаем часы переработок - возвращается 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;
    }