/// <summary>
 /// Konstruktor.
 /// </summary>
 /// <param name="leaveManagerParentForm">Obiekt rodzica.</param>
 /// <param name="connection">Połączenie z bazą danych. Powinno być otwarte.</param>
 /// <param name="employeeId">Numer id pracownika, którego dotyczy zgłoszenie urlopowe.</param>
 /// <param name="firstDay">Data rozpoczęcia urlopu.</param>
 /// <param name="lastDay">Data zakończenia urlopu.</param>
 public FormLeaveConsideration(LeaveManagerForm leaveManagerParentForm, SqlConnection connection, Leave consideredLeave )
 {
     InitializeComponent();
     this.connection = connection;
     this.consideredLeave = consideredLeave;
     this.leaveManagerParentForm = leaveManagerParentForm;
     labelFirstDayValue.Text = consideredLeave.FirstDay.ToString("d");
     labelLastDayValue.Text = consideredLeave.LastDay.ToString("d");
     try
     {
         //Zczytanie imienia, nazwiska oraz pozycji pracownika.
         Employee employee = this.GetEmployee(consideredLeave.EmployeeId);
         labelNameValue.Text = employee.Name;
         labelPositionValue.Text = employee.Position;
         DateTime tmp = consideredLeave.FirstDay;
         bool[] days = this.GetWorkingDaysOfWeek(employee.EmployeeId);
         while (tmp <= consideredLeave.LastDay)
         {
             if (days[((int)tmp.DayOfWeek + 6) % 7] && !IsHoliday(tmp))
                 dataGridView.Rows.Add(tmp, this.GetSimiliarWorkerCount(this.GetPositionID(employee.Position), employee.EmployeeId, tmp), this.GetNeededEmployeesNo(tmp));
             tmp = tmp.AddDays(1);
         }
     }
     catch (SqlException)
     {
         MessageBox.Show("SQL Error. This form will be close. Please try again later.");
         this.Close();
     }
     catch (InvalidOperationException)
     {
         MessageBox.Show("Invalid operation. This form will be close. Please try again later");
         this.Close();
     }
     catch (EmployeeIdException)
     {
         MessageBox.Show("EmployeeID not found in database. This form will be close. Please try again later");
         this.Close();
     }
     catch (Exception ex)
     {
         MessageBox.Show("Unknown exception has occured" + ex.Message);
         this.Close();
     }
 }
 /// <summary>
 /// Zwraca tablicę pracowników będących obecnie na urlopie
 /// </summary>
 /// <param name="form">Formularz wywołujący</param>
 /// <returns>Tabela z danymi pracowników będących na urlopie</returns>
 /// <exception cref="SqlException">An exception occurred while executing the command against a locked row.</exception>
 /// <exception cref="InvalidOperationException">The current state of the connection is closed.</exception>
 private static DataTable GetEmployeesCurrentlyOnLeave(LeaveManagerForm form)
 {
     DataTable result = new DataTable();
     using (SqlCommand command = new SqlCommand("SELECT E.Name, E.Surname, P.Description AS Position, L.First_day AS 'Start', " +
             "L.Last_day AS 'End', LT.Name AS 'Leave type' FROM Employee AS E INNER JOIN " +
             "Leave AS L ON E.Employee_ID = L.Employee_ID INNER JOIN Position AS P ON E.Position_ID = P.Position_ID " +
             "INNER JOIN Leave_type AS LT ON L.LT_ID = LT.LT_ID WHERE  (L.First_day <= @Date) AND (L.Last_day >= @Date)", form.Connection))
     {
         command.Parameters.AddWithValue("@Date", GetServerTimeNow(form).Date);
         if (form.TransactionOn)
             command.Transaction = form.Transaction;
         SqlDataReader reader = command.ExecuteReader();
         result.Load(reader);
     }
     return result;
 }
 /// <summary>
 /// Zwraca opis podanej pozycji
 /// </summary>
 /// <param name="form">Formularz wywołujący</param>
 /// <param name="positiondID">ID pozycji</param>
 /// <returns>Opis pozycji</returns>
 /// <exception cref="SqlException">"Sql Error"</exception>
 public static string GetPositionDescription(LeaveManagerForm form, int positiondID)
 {
     using (SqlCommand command = new SqlCommand("SELECT Description FROM Position WHERE Position_ID = @Position", form.Connection))
     {
         if (form.TransactionOn)
             command.Transaction = form.Transaction;
         command.Parameters.AddWithValue("@Position", positiondID);
         return (string)command.ExecuteScalar();
     }
 }
        /// <summary>
        /// Metoda służaca do wyszukiwania pracownika.
        /// </summary>
        /// <param name="form">Formularz wywołujący metodę</param>
        /// <param name="name">Imię pracownika, który ma zostać wyszukany</param>
        /// <param name="surname">Nazwisko pracownika, który ma zostać wyszukany</param>
        /// <param name="pesel">Pesel pracownika, który ma zostać wyszukany</param>
        /// <param name="position">Pozycja pracownika, który ma zostać wyszukany</param>
        /// <returns>Tabele z danymi pracowników spełniających kryteria</returns>
        /// <exception cref="SqlException">An exception occurred while executing the command against a locked row.</exception>
        /// <exception cref="InvalidOperationException">The current state of the connection is closed.</exception>
        private static DataTable SearchEmployee(LeaveManagerForm form, String name, String surname, String pesel, String position)
        {
            //Zapytanie sql zczytujące dane pracownika o podanym loginie i haśle.
            SqlCommand command = new SqlCommand("SELECT E.Employee_ID AS 'Employee id', " +
                "E.Name, E.Surname, E.Birth_date AS 'Birth date'," +
               "E.Address, E.PESEL, E.EMail AS 'e-mail', Pos.Description AS 'Position', " +
               "Perm.Description AS 'Permission', E.Leave_days AS 'Remaining leave days', " +
               "E.Old_leave_days AS 'Old left leave days' " +
               "FROM Employee E, Position Pos, Permission Perm " +
               "WHERE E.Permission_ID = Perm.Permission_ID " +
               "AND E.Position_ID = Pos.Position_ID AND Name LIKE @Name AND " +
               "Surname LIKE @Surname AND PESEL LIKE @Pesel AND Pos.Description LIKE @Position", form.Connection);

            //Dodanie parametru imienia.
            name = "%" + name + "%";
            command.Parameters.Add("@Name", SqlDbType.VarChar).Value = name;
            //Dodanie parametru nazwiska.
            surname = "%" + surname + "%";
            command.Parameters.Add("@Surname", SqlDbType.VarChar).Value = surname;
            //Dodania parametru peselu
            pesel = "%" + pesel + "%";
            command.Parameters.Add("@Pesel", SqlDbType.VarChar).Value = pesel;
            //Dodanie parametru pozycji.
            position = "%" + position + "%";
            command.Parameters.Add("@Position", SqlDbType.VarChar).Value = position;
            //Jeżeli formularz ma włączoną transakcję.
            if (form.TransactionOn)
                //Przypisanie do zapytania transakcji formularza.
                command.Transaction = form.Transaction;
            //Stworzenie obiektu wyniku.
            DataTable result = new DataTable();
            //Stworzenie obiektu czytającego wyniki zapytania.
            SqlDataReader reader = command.ExecuteReader();
            //Jeżeli wyniki zapytania są nie puste.
            result.Load(reader);
            //Zamknięcie obiektu czytającego.
            reader.Close();
            //Zwrócenie wyniku.
            return result;
        }
 /// <summary>
 /// Metoda powodująca przeliczenie liczby dni dla danego pracownika.
 /// </summary>
 /// <param name="form">Formularz wywołujący.</param>
 /// <param name="employeeId">Numer id pracownika.</param>
 /// <exception cref="SqlException">An exception occurred while executing the command against a locked row.</exception>
 /// <exception cref="InvalidOperationException">The current state of the connection is closed.</exception>
 private static void RecountLeaveDays(LeaveManagerForm form, int employeeId)
 {
     int daysToAdd = 0;
     DataTable leaves = GetLeaves(form, employeeId);
     for (int i = 0; i < leaves.Rows.Count; ++i)
     {
         //Jeżeli urlop zaczyna się później niż teraz.
         if ((GetServerTimeNow(form).CompareTo((DateTime)leaves.Rows[i].ItemArray.GetValue(2)) < 0)
             //Jeżeli urlop konsumuje dni.
             && ConsumesDays(form, leaves.Rows[i].ItemArray.GetValue(4).ToString()))
         {
             int numberOfUsedDays = GetNumberOfWorkDays(form, (DateTime)leaves.Rows[i].ItemArray.GetValue(2),
                 (DateTime)leaves.Rows[i].ItemArray.GetValue(3), employeeId);
             if ((int)leaves.Rows[i].ItemArray.GetValue(6) != numberOfUsedDays)
             {
                 daysToAdd += ((int)leaves.Rows[i].ItemArray.GetValue(6)) - numberOfUsedDays;
                 using (SqlCommand command = new SqlCommand("UPDATE Leave SET Used_days = @Used_days WHERE Leave_ID = @Leave_ID", form.Connection, form.Transaction))
                 {
                     command.Parameters.AddWithValue("@Leave_ID", leaves.Rows[i].ItemArray.GetValue(0));
                     command.Parameters.AddWithValue("@Used_days", numberOfUsedDays);
                     command.ExecuteNonQuery();
                 }
             }
         }
     }
     AddLeaveDays(form, employeeId, daysToAdd);
 }
 /// <summary>
 /// Metoda sprawdzająca, czy któryś z dni z okresu między argumentami date1 i date2
 /// jest użyty w ktorymś aktywnym(nie odrzuconym/anulowanym) zgłoszeniu urlopowym
 /// danego pracownika. Przy sprawdzaniu pomija wpis urlopowy zaczynający się w podanym
 /// dniu.
 /// </summary>
 /// <param name="form">Formularz wywołujący metodę.</param>
 /// <param name="date1">Data rozpoczęcia okresu.</param>
 /// <param name="date2">Data zakończenia okresu.</param>
 /// <param name="employeeID">Numer id pracownika, którego urlopy będą brane pod uwagę.</param>
 /// <param name="skippedEntryFirstDay">Data rozpoczęcia ignorowanego wpisu urlopowego.</param>
 /// <returns>Wartość logiczną mówiącą czy któryś z dni okresu jest już użyty.</returns>
 /// <exception cref="SqlException">An exception occurred while executing the command against a locked row.</exception>
 /// <exception cref="InvalidOperationException">The current state of the connection is closed.</exception>
 private static bool IsDateFromPeriodUsed(LeaveManagerForm form, DateTime date1, DateTime date2,
     int employeeID, DateTime skippedEntryFirstDay)
 {
     //Jeżeli date2 jest wcześniej niż date1 zamień je miejscami.
     if (date1.CompareTo(date2) > 0)
     {
         DateTime tmpDate = date1;
         date1 = date2;
         date2 = tmpDate;
     }
     //Zapytanie sql zczytujące daty urlopów.
     SqlCommand command = new SqlCommand("SELECT First_day, Last_day FROM Leave WHERE " +
         "Employee_ID = @Employee_ID AND First_day != @Skipped_entry_first_day", form.Connection);//todo dodać warunek w zapytaniu wykluczający wpisy, canceled i rejected.
     //Jeżeli formularz ma uruchomioną transakcję, dołącz ją do zapytania.
     if (form.TransactionOn)
         command.Transaction = form.Transaction;
     command.Parameters.Add("@Employee_ID", SqlDbType.Int).Value = employeeID;
     command.Parameters.Add("@Skipped_entry_first_day", SqlDbType.Date).Value = skippedEntryFirstDay;
     //Stworzenie obiektu czytającego wyniki zapytania.
     SqlDataReader reader = command.ExecuteReader();
     //Dopóki udało się odczytać wiersz z wyników zapytania.
     while (reader.Read())
     {
         //Zczytanie dni początku i końca urlopu.
         DateTime firstDay = (DateTime)reader["First_day"];
         DateTime lastDay = (DateTime)reader["Last_day"];
         if ((date1.CompareTo(firstDay) <= 0) && (date2.CompareTo(firstDay) >= 0)//firstDay between date1 & date2
             || (date1.CompareTo(lastDay) <= 0) && (date2.CompareTo(lastDay) >= 0)//lastDay between date1 & date2
             || (date1.CompareTo(firstDay) >= 0 && (date2.CompareTo(lastDay) <= 0)))//date1 & date2 between firstDay & lastDay
         {
             reader.Close();
             return true;
         }
     }
     //Jeżeli nie znaleziono kolizji.
     reader.Close();
     return false;
 }
 /// <summary>
 /// Metoda pobierania tabeli zawierającej informacje o nowych pracownikach, którzy nie zostali jeszcze 
 /// poinformowanie o swoim loginie/haśle.
 /// </summary>
 /// <param name="form">Formularz wywołujący metodę.</param>
 /// <returns>Zwraca tabelę zawierającą informacje o nowych pracownikach, którzy nie zostali jeszcze
 /// poinformowani o swoim loginie/haśle. Kolumny tabeli:
 /// "ID", "e-mail", "Login", "Password", "Name", "Surname"</returns>
 /// <exception cref="SqlException">An exception occurred while executing the command against a locked row.</exception>
 /// <exception cref="InvalidOperationException">The current state of the connection is closed.</exception>
 private static DataTable GetUninformedEmployees(LeaveManagerForm form)
 {
     SqlCommand command = new SqlCommand("SELECT E.Employee_ID AS 'ID', E.EMail AS 'e-mail', E.Login, U.Password, E.Name, " +
         "E.Surname FROM Employee E, Uninformed U WHERE E.Employee_ID = U.Employee_ID", form.Connection);
     //Jeżeli formularz ma włączoną transakcję, to dołącz ją do zapytania.
     if (form.TransactionOn)
         command.Transaction = form.Transaction;
     //Stworzenie obiektu czytającego wyniki zapytania.
     SqlDataReader reader = command.ExecuteReader();
     //Stworzenie tabeli na dane.
     DataTable uninformedEmployees = new DataTable();
     //Załadowanie danych do tabeli.
     uninformedEmployees.Load(reader);
     reader.Close();
     return uninformedEmployees;
 }
 /// <summary>
 /// Metoda oblicza liczbę pracowników danego typu, którzy są dostępni danego dnia. 
 /// </summary>
 /// <param name="form">Formularz wywołujący metode</param>
 /// <param name="positionId">Pozycja szukanych pracowników</param>
 /// <param name="employeeId">"Identyfikator pracownika, który nie jest brany pod uwagę (np. ubiega się o
 /// urlop w danym dniu)"</param>
 /// <param name="date">"Data"</param>
 /// <returns>"Liczba pracowników tego samego typu, którzy są dostępni danego dnia</returns>
 /// <exception cref="SqlException">An exception occurred while executing the command against a locked row.</exception>
 /// <exception cref="InvalidOperationException">The current state of the connection is closed.</exception>
 /// <exception cref="SqlException">An exception occurred while executing the command against a locked row.</exception>
 /// <exception cref="InvalidOperationException">The current state of the connection is closed.</exception>
 private static int GetSimiliarWorkerCount(LeaveManagerForm form, int positionId, int employeeId, DateTime date)
 {
     string day = date.DayOfWeek.ToString();
     //using (SqlCommand command = new SqlCommand("SELECT COUNT(DISTINCT E.Employee_ID) AS amount " +
     //        "FROM Employee AS E LEFT OUTER JOIN Leave AS L ON E.Employee_ID = L.Employee_ID " +
     //        "LEFT OUTER JOIN Work_hours AS W ON E.Employee_ID = W.Employee_ID " +
     //        "WHERE  (E.Position_ID = @Position) AND (L.First_day > @Date) AND (W." + day + "Start <> W."
     //        + day + "End) AND (E.Employee_ID != @EmployeeID) OR " +
     //        "(E.Position_ID = @Position) AND (L.Last_day < @Date) AND (W." + day + "Start <> W."
     //        + day + "End) AND (E.Employee_ID != @EmployeeID) OR " +
     //        "(E.Position_ID = @Position) AND (L.Leave_ID IS NULL) AND (W." + day + "Start <> W."
     //        + day + "End) AND (E.Employee_ID != @EmployeeID) OR " +
     //        "(E.Position_ID = @Position) AND (L.LS_ID != (SELECT ST_ID From Status_type WHERE Name = 'Approved')) AND (W." + day + "Start <> W."
     //        + day + "End) AND (E.Employee_ID != @EmployeeID)", form.Connection))
     //{
     using (SqlCommand command = new SqlCommand("SELECT COUNT(E.Employee_ID) AS amount " +
                 "FROM Employee AS E LEFT OUTER JOIN Replacments AS R ON E.Employee_ID = R.Employee_ID "+
                 "WHERE  (E.Employee_ID NOT IN " +
                 "(SELECT DISTINCT W.Employee_ID FROM Work_hours AS W LEFT OUTER JOIN " +
                 "Leave AS L ON L.Employee_ID = W.Employee_ID WHERE   (L.First_day <= @Date) " +
                 "AND (L.Last_day >= @Date) AND (L.LS_ID = 3) OR (W." + day + "Start = W." + day + "End) OR " +
                 "(W.Employee_ID = @EmployeeID)) OR (R.Date = @Date)) AND (E.Position_ID = @Position)", form.Connection))
     {
         //"SELECT COUNT(E.Employee_ID) AS amount " +
         //        "FROM Employee AS E LEFT OUTER JOIN Replacments AS R ON E.Employee_ID = R.Employee_ID "+
         //        "WHERE  (E.Employee_ID NOT IN " +
         //        "(SELECT DISTINCT W.Employee_ID FROM Work_hours AS W LEFT OUTER JOIN " +
         //        "Leave AS L ON L.Employee_ID = W.Employee_ID WHERE   (L.First_day <= @Date) " +
         //        "AND (L.Last_day >= @Date) AND (L.LS_ID = 3) OR (W." + day + "Start = W." + day + "End)) OR (R.Date = @Date)) " +
         //        "AND (E.Position_ID = @Position)"
         if (form.TransactionOn)
         {
             command.Transaction = form.Transaction;
         }
         command.Parameters.AddWithValue("@Position", positionId);
         command.Parameters.AddWithValue("@Date", date);
         command.Parameters.AddWithValue("@EmployeeID", employeeId);
         using (SqlDataReader reader = command.ExecuteReader())
         {
             int result;
             if (reader.Read())
                 result = (int)reader["amount"];
             else
                 result = 0;
             reader.Close();
             return result;
         }
     }
 }
 /// <summary>
 /// Zwraca liczbę pracowników którzy muszą być w pracy danego dnia.
 /// </summary>
 /// <param name="form">"Formularz wywołujący metode"</param>
 /// <param name="date">"Data do sprawdzenia"</param>
 /// <returns>"Liczba pracowników wymaganych w pracy"</returns>
 /// <exception cref="SqlException">"Sql Error"</exception>
 private static int GetNeededEmployeesNo(LeaveManagerForm form, DateTime date)
 {
     using (SqlCommand command = new SqlCommand("SELECT Workers_no FROM Workers_needed WHERE Day = @Day", form.Connection))
     {
         if (form.TransactionOn)
             command.Transaction = form.Transaction;
         command.Parameters.AddWithValue("@Day", date.DayOfWeek.ToString());
         return (int)command.ExecuteScalar();
     }
 }
 /// <summary>
 /// Metoda pobierania z bazy danych typów urlopów do tabeli.
 /// </summary>
 /// <param name="form">Formularz z którego została wywołana metoda.</param>
 /// <returns>Zwraca tabelę zawierającą informacje o typach urlopów posortowane po numerze id.
 /// Zwracana tabela zawiera następujące kolumny: 
 /// "Leave type id", "Name", "Consumes days". </returns>
 /// <exception cref="SqlException">An exception occurred while executing the command against a locked row.</exception>
 /// <exception cref="InvalidOperationException">The current state of the connection is closed.</exception>
 private static DataTable GetLeaveTypesTable(LeaveManagerForm form)
 {
     //Zapytanie sql zczytujące dane.
     SqlCommand command = new SqlCommand("SELECT LT_ID AS 'Leave type id', Name, Consumes_days AS 'Consumes days' " +
         "FROM Leave_type ORDER BY LT_ID", form.Connection);
     //Jeżeli transakcja jest włączona, to ujmij nią również to zapytanie.
     if (form.TransactionOn)
         command.Transaction = form.Transaction;
     //Inicjalizacja obiektu wyniku.
     DataTable result = new DataTable();
     //Stworzenie obiektu czytającego wyniki polecenia.
     SqlDataReader reader = command.ExecuteReader();
     //Wypełnienie tabeli wynikiem zapytania sql.
     result.Load(reader);
     //Zamknięcie obiektu czytającego.
     reader.Close();
     return result;
 }
 /// <summary>
 /// Metoda pobierania z bazy danych typów urlopów do listy.
 /// </summary>
 /// <param name="form">Formularz z którego została wywołana metoda.</param>
 /// <returns>Zwraca listę typów urlopów.</returns>
 /// <exception cref="SqlException">An exception occurred while executing the command against a locked row.</exception>
 /// <exception cref="InvalidOperationException">The current state of the connection is closed.</exception>
 private static List<LeaveType> GetLeaveTypesList(LeaveManagerForm form)
 {
     //Lista do której zostaną zczytane dane z bazy danych.
     List<LeaveType> result = new List<LeaveType>();
     //Zapytanie sql zczytujące typy urlopów.
     SqlCommand command = new SqlCommand("SELECT LT_ID AS 'Leave type id', Name, Consumes_days AS 'Consumes days' " +
         "FROM Leave_type ORDER BY LT_ID", form.Connection);
     //Jeżeli formularz ma włączoną transakcję, to dodaj zapytanie do tej transakcji.
     if (form.TransactionOn)
         command.Transaction = form.Transaction;
     //Stworzenie obiektu czytającego wyniki zapytania.
     SqlDataReader reader = command.ExecuteReader();
     //Wykonuj dopóki udało się odczytać kolejny wiersz.
     while (reader.Read())
     {
         //Dodanie kolejnego wpisu do listy wyniku.
         result.Add(new LeaveType((int)reader["Leave type id"], reader["Name"].ToString(), (bool)reader["Consumes days"]));
     }
     //Zamknięcie obiektu czytającego.
     reader.Close();
     return result;
 }
 /// <summary>
 /// Metoda zwraca historię urlopów
 /// </summary>
 /// <param name="form">Formularz wywołujący</param>
 /// <returns>Zwraca tabele z pobranymi urlopami</returns>
 /// <exception cref="SqlException">An exception occurred while executing the command against a locked row.</exception>
 /// <exception cref="InvalidOperationException">The current state of the connection is closed.</exception>
 private static DataTable GetLeavesHistory(LeaveManagerForm form)
 {
     DataTable result = new DataTable();
     using (SqlCommand command = new SqlCommand("SELECT E.Name, E.Surname, P.Description AS Position, L.First_day AS 'Start', L.Last_day AS 'End', LT.Name AS 'Leave type' " +
             "FROM Employee AS E INNER JOIN Leave AS L ON E.Employee_ID = L.Employee_ID INNER JOIN " +
             "Position AS P ON E.Position_ID = P.Position_ID INNER JOIN Leave_type AS LT ON L.LT_ID = LT.LT_ID", form.Connection))
     {
         if (form.TransactionOn)
             command.Transaction = form.Transaction;
         SqlDataReader reader = command.ExecuteReader();
         result.Load(reader);
         return result;
     }
 }
 /// <summary>
 /// Zwraca urlopy które kończą się po podanej dacie.
 /// </summary>
 /// <param name="form">"Formularz wywołujący"</param>
 /// <param name="date">"Data od której interesują nas urlopy"</param>
 /// <returns>"Tablica zawierająca informację o urlopach, które dopiero mają się rozpocząć</returns>
 /// <exception cref="SqlException">An exception occurred while executing the command against a locked row.</exception>
 /// <exception cref="InvalidOperationException">The current state of the connection is closed.</exception>
 private static DataTable GetLeavesForFuture(LeaveManagerForm form)
 {
     DataTable result = new DataTable();
     using (SqlCommand command = new SqlCommand("SELECT E.Position_ID, L.Leave_ID, L.First_day, L.Last_day " +
             "FROM Employee AS E INNER JOIN Leave AS L ON E.Employee_ID = L.Employee_ID " +
             "WHERE L.Last_day > @Date ORDER BY L.First_day", form.Connection))
     {
         if (form.TransactionOn)
             command.Transaction = form.Transaction;
         command.Parameters.AddWithValue("@Date", GetServerTimeNow(form).Date);
         SqlDataReader reader = command.ExecuteReader();
         result.Load(reader);
     }
     return result;
 }
 /// <summary>
 /// Metoda pobietania tabeli z danymi urlopowymi danego pracownika.
 /// </summary>
 /// <param name="form">Formularz wywołujący metodę.</param>
 /// <param name="employeeId">Numer id pracownika.</param>
 /// <returns>Zwraca tabelę z danymi urlopowymi pracownika.
 /// Kolumny tabeli: "Leave Id", "Status", "First day", "Last day", "Type",
 /// "Remarks", "No. used days"</returns>
 /// <exception cref="SqlException">An exception occurred while executing the command against a locked row.</exception>
 /// <exception cref="InvalidOperationException">The current state of the connection is closed.</exception>
 private static DataTable GetLeaves(LeaveManagerForm form, int employeeId)
 {
     //Zapytanie zczytujące dane.
     SqlCommand commandSelectLeaves = new SqlCommand("SELECT Leave_ID AS 'Leave Id', LS.Name AS 'Status', L.First_day AS 'First day', " +
                 "L.Last_day AS 'Last day', LT.Name AS 'Type', L.Remarks, L.Used_days AS 'No. used days' " +
                 "FROM Employee E, Leave L, Leave_type LT, Status_type LS " +
                 "WHERE L.LT_ID = LT.LT_ID AND L.LS_ID = LS.ST_ID AND E.Employee_ID = L.Employee_ID " +
                 "AND E.Employee_ID = @Employee_ID ORDER BY L.First_day", form.Connection);
     //Jeżeli formularz ma uruchomioną transakcję, dodaj ją do zapytania.
     if (form.TransactionOn)
         commandSelectLeaves.Transaction = form.Transaction;
     commandSelectLeaves.Parameters.Add("@Employee_ID", SqlDbType.Int).Value = employeeId;
     //Stwórz obiekt czytający wyniki zapytania.
     SqlDataReader readerLeaves = commandSelectLeaves.ExecuteReader();
     //Stworzenie obiektu do którego załadowane zostaną dane.
     DataTable leaves = new DataTable();
     //Wczytanie danych.
     leaves.Load(readerLeaves);
     return leaves;
 }
 /// <summary>
 /// Metoda pobierająca wpis urlopowy.
 /// </summary>
 /// <param name="form">Formularz potrzebujący metody.</param>
 /// <param name="id">Numer id pobieranego urlopu.</param>
 /// <returns>Obiekt reprezentujący dany urlop.</returns>
 /// <exception cref="SqlException">An exception occurred while executing the command against a locked row.</exception>
 /// <exception cref="InvalidOperationException">The current state of the connection is closed.</exception>
 private static Leave GetLeave(LeaveManagerForm form, int leaveId)
 {
     SqlCommand command = new SqlCommand("SELECT L.Employee_ID, LT.Name AS 'Type', " +
         "LS.Name AS 'Status', L.First_day, L.Last_day, " +
         "L.Remarks, L.Used_days FROM Leave L, Leave_type LT, Status_type LS WHERE Leave_ID = @Leave_ID",
         form.Connection);
     if (form.TransactionOn)
         command.Transaction = form.Transaction;
     command.Parameters.Add("@Leave_ID", SqlDbType.Int).Value = leaveId;
     SqlDataReader reader = command.ExecuteReader();
     reader.Read();
     Leave result = new Leave(leaveId, (int)reader["Employee_ID"], reader["Type"].ToString(), reader["Status"].ToString(),
         (DateTime)reader["First_day"], (DateTime)reader["Last_day"], reader["Remarks"].ToString(), (int)reader["Used_days"]);
     reader.Close();
     return result;
 }
 /// <summary>
 /// Metoda pobierania harmonogramu pracy.
 /// </summary>
 /// <param name="form">Formularz wywołujący metodę.</param>
 /// <param name="employeeId">Numer id pracownika.</param>
 /// <returns>Tablicę z harmonogramem pracy.</returns>
 /// <exception cref="SqlException">An exception occurred while executing the command against a locked row.</exception>
 /// <exception cref="InvalidOperationException">The current state of the connection is closed.</exception>
 private static DataTable GetSchedule(LeaveManagerForm form, int employeeId)
 {
     using (SqlCommand command = new SqlCommand("SELECT MondayStart, MondayEnd, TuesdayStart, TuesdayEnd" +
         ", WednesdayStart, WednesdayEnd, ThursdayStart, ThursdayEnd, FridayStart, FridayEnd" +
         ", SaturdayStart, SaturdayEnd, SundayStart, SundayEnd FROM Work_hours WHERE Employee_ID = @Employee_ID",
         form.Connection))
     {
         if (form.TransactionOn)
         {
             command.Transaction = form.Transaction;
         }
         command.Parameters.AddWithValue("@Employee_ID", employeeId);
         using (SqlDataReader reader = command.ExecuteReader())
         {
             DataTable result = new DataTable();
             result.Load(reader);
             return result;
         }
     }
 }
 /// <summary>
 /// Metoda pobierająca aktualny czas serwera.
 /// </summary>
 /// <param name="form">Formularz wywołujący.</param>
 /// <returns>Aktualny czas serwera.</returns>
 private static DateTime GetServerTimeNow(LeaveManagerForm form)
 {
     SqlCommand commandGetServerTime = new SqlCommand("SELECT GETDATE()", form.Connection);
     if (form.TransactionOn)
         commandGetServerTime.Transaction = form.Transaction;
     return (DateTime)commandGetServerTime.ExecuteScalar();
 }
 /// <summary>
 /// Metoda pobierająca tabelę ze zgłoszeniami urlopowymi (i ich właścicielami) wymagającymi zatwierdzenia/odrzucenia
 /// różnego typu w zależności od tego, przej jaki typ formularza została wywołana.
 /// </summary>
 /// <param name="form">Formularz wywołujący.</param>
 /// <returns>Zwraca tabelę zawierającą zgłoszenia urlopowe wymagające zatwierdzenia/odrzucenia.
 /// Tabela zawiera kolumny: "Employee id", "Position", "Name", "Surname", "e-mail", "Leave Id",
 /// "Type", "Status"
 /// "First day", "Last day", "Remarks", "Used days".</returns>
 /// <exception cref="SqlException">An exception occurred while executing the command against a locked row.</exception>
 /// <exception cref="InvalidOperationException">The current state of the connection is closed.</exception>
 /// <exception cref="ArgumentException">Rzucany, gdy formularz nie jest typu, który pozwala na tą operację.</exception>
 private static DataTable GetNeedsAction(LeaveManagerForm form)
 {
     //Zapytanie sql zczytujące zgłoszenia wymagające zatwierdzenia/odrzucenia.
     SqlCommand command = new SqlCommand("SELECT E.Employee_ID AS 'Employee id', P.Description AS 'Position', " +
         "E.Name, E.Surname, E.EMail AS 'e-mail',L.Leave_ID AS 'Leave Id', LT.Name AS 'Type', " +
         "LS.Name AS 'Status', L.First_day AS 'First day', L.Last_day AS 'Last day', L.Remarks, L.Used_days " +
         "AS 'Used days' FROM Employee E, " +
         "Leave L, Leave_type LT, Position P, Status_type LS WHERE L.Employee_ID = E.Employee_ID " +
         "AND L.LT_ID = LT.LT_ID AND P.Position_ID = E.Position_ID AND LS.ST_ID = L.LS_ID AND " +
         "LS.Name = @Name ORDER BY L.First_day", form.Connection);
     //Jeżeli formularz posiada uruchomioną transakcję, to dodaj do niej zapytanie.
     if (form.TransactionOn)
         command.Transaction = form.Transaction;
     //Ustaw parametr nazwy statusu w zależności od typu formularza.
     if (form.GetType() == new FormAssistant().GetType())
     {
         command.Parameters.Add("@Name", SqlDbType.VarChar).Value = "Pending validation";
     }
     else//to znaczy, że manager //todo ładny koment :P
     {
         if (form.GetType() == new FormManager().GetType())
         {
             command.Parameters.Add("@Name", SqlDbType.VarChar).Value = "Pending manager aproval";
         }
         else
         {
             throw new ArgumentException();
         }
     }
     //Stworzenie obiektu czytającego wyniki zapytania.
     SqlDataReader reader = command.ExecuteReader();
     DataTable Result = new DataTable();
     //Zczytanie wyników zapytania do tabeli.
     Result.Load(reader);
     reader.Close();
     return Result;
 }
 /// <summary>
 /// Metoda pobierająca listę możliwych stanów zgłoszenia urlopowego.
 /// </summary>
 /// <param name="form">Formularz wywołujący metodę.</param>
 /// <returns>Lista możliwych stanów zgłoszenia (same nazwy).</returns>
 /// <exception cref="SqlException">An exception occurred while executing the command against a locked row.</exception>
 /// <exception cref="InvalidOperationException">The current state of the connection is closed.</exception>
 private static List<String> GetStatusTypes(LeaveManagerForm form)
 {
     //Lista do której zostaną zczytane możliwe stany zgłoszeń urlopowych.
     List<String> result = new List<string>();
     //Zapytanie sql zczytujące możliwe stany zgłoszeń urlopowych.
     SqlCommand command = new SqlCommand("SELECT Name FROM Status_type ORDER BY ST_ID", form.Connection);
     //Jeżeli formularz posiada rozpoczętą transakcję, to dodaj do niej zapytanie.
     if (form.TransactionOn)
         command.Transaction = form.Transaction;
     //Stworzenie obiektu czytającego wyniki zapytania.
     SqlDataReader reader = command.ExecuteReader();
     //Dopóki udało się odczytać kolejną linijkę wyników zapytania.
     while (reader.Read())
     {
         result.Add(reader["Name"].ToString());
     }
     reader.Close();
     return result;
 }
        //todo tabela z dniami wolnymi od pracy, uwzględnić godziny/dni pracy pracownika, gdy już będa.
        //Nie zapomnieć dodać odpowiednich wyjątków, gdy będzie operacja na BD.
        /// <summary>
        /// Metoda zwracająca liczbę dni w okresie od date1(włącznie) do date2(włącznie), które konsumują dni urlopowe.
        /// </summary>
        /// <param name="form">Formularz wymagający metody.</param>
        /// <param name="date1">Pierwszy dzień sprawdzanego okresu.</param>
        /// <param name="date2">Ostatni dzień sprawdzanego okresu.</param>
        /// <returns>Liczba dni w okresie między date1 i date2, które konsumują dni rulopowe.</returns>
        private static int GetNumberOfWorkDays(LeaveManagerForm form, DateTime date1, DateTime date2, int employeeId)
        {
            bool[] workingDays = GetWorkingDaysOfWeek(form, employeeId);
            //Obliczenie różnicy czasu pomiędzy datami.
            TimeSpan timeSpan = date2 - date1;
            //Obliczenie maksymalnej liczby dni, które mogą konsumować dni.
            int numberOfDays = (int)Math.Round(timeSpan.TotalDays) + 1;
            //Dopóki nie sprawdzono wszystkich dni.
            List<DateTime> publicHolidays = GetPublicHolidays(form);
            while (date1.CompareTo(date2) <= 0)
            {
                switch (date1.DayOfWeek)
                {
                    case DayOfWeek.Monday:
                        if (!workingDays[0])
                        {
                            numberOfDays--;
                        }
                        break;
                    case DayOfWeek.Tuesday:
                        if (!workingDays[1])
                        {
                            numberOfDays--;
                        }
                        break;
                    case DayOfWeek.Wednesday:
                        if (!workingDays[2])
                        {
                            numberOfDays--;
                        }
                        break;
                    case DayOfWeek.Thursday:
                        if (!workingDays[3])
                        {
                            numberOfDays--;
                        }
                        break;
                    case DayOfWeek.Friday:
                        if (!workingDays[4])
                        {
                            numberOfDays--;
                        }
                        break;
                    case DayOfWeek.Saturday:
                        if (!workingDays[5])
                        {
                            numberOfDays--;
                        }
                        break;
                    case DayOfWeek.Sunday:
                        if (!workingDays[6])
                        {
                            numberOfDays--;
                        }
                        break;
                }

                if (publicHolidays.IndexOf(date1) != -1)
                {
                    numberOfDays--;
                }
                //Przesunięcie sprawdzanego dnia na następny.
                date1 = date1.AddDays(1);
            }
            return numberOfDays;
        }
 private static bool[] GetWorkingDaysOfWeek(LeaveManagerForm form, int employeeId)
 {
     bool[] days = new bool[7];
     DataTable schedule = GetSchedule(form, employeeId);
     for (int i = 0; i < 7; ++i)
     {
         if (!schedule.Rows[0].ItemArray.GetValue(2 * i).ToString().Equals(schedule.Rows[0].ItemArray.GetValue((2 * i) + 1).ToString()))
         {
             days[i] = true;
         }
         else
         {
             days[i] = false;
         }
     }
     return days;
 }
 /// <summary>
 /// Metoda pobrania listy uprawnień.
 /// </summary>
 /// <param name="form">Formularz z którego została wywołana metoda.</param>
 /// <returns>Zwraca listę ciągów znaków reprezentujących poziomy uprawnień.</returns>
 /// <exception cref="SqlException">An exception occurred while executing the command against a locked row.</exception>
 /// <exception cref="InvalidOperationException">The current state of the connection is closed.</exception>
 private static List<String> GetPermissions(LeaveManagerForm form)
 {
     //Lista do której będą zczytywane rodzaje uprawnień.
     List<String> result = new List<String>();
     //Zapytanie sql zczytujące rodzaje uprawnień.
     SqlCommand command = new SqlCommand("SELECT Description FROM Permission ORDER BY Permission_ID", form.Connection);
     //Jeżeli formularz posiada uruchomioną transakcję, to ustaw ją jako transakcję polecenia sql.
     if (form.TransactionOn)
         command.Transaction = form.Transaction;
     //Stworzenie obiektu czytającego wyniki zapytania.
     SqlDataReader reader = command.ExecuteReader();
     //Dopóki udało się odczytać kolejny wiersz wyników zapytania.
     while (reader.Read())
     {
         //Dodanie nowego obiektu do listy.
         result.Add(reader["Description"].ToString());
     }
     reader.Close();
     return result;
 }
 /// <summary>
 /// Metoda logowania.
 /// </summary>
 /// <param name="form">Formularz wywołujący.</param>
 /// <param name="login">Login.</param>
 /// <param name="password">Hasło.</param>
 /// <returns>Zwraca obiekt reprezentujący zalogowanego pracownika.</returns>
 /// <exception cref="SqlException">An exception occurred while executing the command against a locked row.</exception>
 /// <exception cref="InvalidOperationException">The current state of the connection is closed.</exception>
 /// <exception cref="LoginOrPasswordException">Login or password is wrong.</exception>
 private static Employee Login(LeaveManagerForm form, String login, String password)
 {
     //Zapytanie sql zczytujące dane pracownika o podanym loginie i haśle.
     SqlCommand command = new SqlCommand("SELECT E.Employee_ID, Perm.Description AS Permission, E.Name, E.Surname, E.Birth_date," +
                                        "E.Address, E.PESEL, E.EMail, Pos.Description AS Position, E.Year_leave_days, " +
                                        "E.Leave_days, E.Old_leave_days, E.Demand_days " +
                                        "FROM Employee E, Permission Perm, Position Pos WHERE Login = @Login AND " +
                                        "Password = @Password AND E.Permission_ID = Perm.Permission_ID AND " +
                                        "E.Position_ID = Pos.Position_ID", form.Connection);
     //Dodanie parametru loginu.
     command.Parameters.Add("@Login", SqlDbType.VarChar).Value = login;
     //Dodanie parametru hasła. Hasła są przechowywane w bazie w formie skrótu, stąd parametr to skrót hasła.
     command.Parameters.Add("@Password", SqlDbType.VarChar).Value = StringSha.GetSha256Managed(password);
     //Jeżeli formularz ma włączoną transakcję.
     if (form.TransactionOn)
         //Przypisanie do zapytania transakcji formularza.
         command.Transaction = form.Transaction;
     //Stworzenie obiektu czytającego wyniki zapytania.
     SqlDataReader reader = command.ExecuteReader();
     //Jeżeli wyniki zapytania są nie puste.
     if (reader.Read())
     {
         //Stworzenie nowego obiektu pracownika z danymi zczytanymi za pomocą zapytania.
         Employee employee = new Employee((int)reader["Employee_ID"], reader["Permission"].ToString(),
             reader["Name"].ToString(), reader["Surname"].ToString(), (DateTime)reader["Birth_date"],
             reader["Address"].ToString(), reader["PESEL"].ToString(), reader["EMail"].ToString(),
             reader["Position"].ToString(), (int)reader["Year_leave_days"], (int)reader["Leave_days"],
             (int)reader["Old_leave_days"], (int)reader["Demand_days"]);
         //Zamknięcie obiektu czytającego.
         reader.Close();
         //Zwrócenie wyniku.
         return employee;
     }
     else//Nie znaleziono żadnego pracownika o podanym loginie i hasle.
     {
         //Zamknięcie obiektu czytającego.
         reader.Close();
         throw new LoginOrPasswordException();
     }
 }
 /// <summary>
 /// Metoda zwraca identyfikator pozycji o podanym opisie
 /// </summary>
 /// <param name="form">Formularz wywołujący</param>
 /// <param name="position">Opis pozycji</param>
 /// <returns>"Identyfikator pozycji o zadanym opisie"</returns>
 /// <exception cref="SqlException">An exception occurred while executing the command against a locked row.</exception>
 /// <exception cref="InvalidOperationException">The current state of the connection is closed.</exception>
 /// <exception cref="PositionException">"Bład podczas odczytywania pozycji (pozycja nie została odnaleziona"</exception>
 private static int GetPositionID(LeaveManagerForm form, string position)
 {
     SqlCommand command = new SqlCommand("SELECT Position_ID FROM Position WHERE Description" +
         " = @Description", form.Connection);
     command.Parameters.Add("@Description", SqlDbType.VarChar).Value = position;
     if (form.TransactionOn)
         //Przypisanie do zapytania transakcji formularza.
         command.Transaction = form.Transaction;
     SqlDataReader reader = command.ExecuteReader();
     if (reader.Read())
     {
         int result = (int)reader["Position_ID"];
         reader.Close();
         return result;
     }
     reader.Close();
     throw new PositionException();
 }
        /// <summary>
        /// Metoda służąca do odrzucania zgłoszeń urlopowych.
        /// </summary>
        /// <param name="form">Formularz wywołujący.</param>
        /// <param name="rejectedLeaveId">Numer id odrzucanego urlopu.</param>
        /// <exception cref="SqlException">An exception occurred while executing the command against a locked row.</exception>
        /// <exception cref="InvalidOperationException">The current state of the connection is closed.</exception>
        /// <exception cref="IsolationLevelException">Wyjątek występuje, gdy poziom izolacji uruchomionej w 
        /// formularzu transakcji jest zbyt niski do zapewnienia poprawnego wykonania poleceń metody.</exception>
        private static void RejectLeave(LeaveManagerForm form, int rejectedLeaveId)
        {
            /* Dla poprawnego działania tej metody konieczne jest aby posiadała ona transakcję
              * o odpowiednim poziomie izolacji.
              */

            //Zmienna przechowująca stan transakcji przed uruchomieniem metody.
            bool isFormTransactionOn = form.TransactionOn;
            //Jeżeli formularz posiada uruchomioną transakcję.
            if (form.TransactionOn)
            {
                //Sprawdzenie, czy poziom izolacji istniejącej transakcji jest wystarczający.
                if (form.Transaction.IsolationLevel != IsolationLevel.RepeatableRead &&
                    form.Transaction.IsolationLevel != IsolationLevel.Serializable)
                {
                    throw new IsolationLevelException();
                }
            }
            else//Jeżeli formularz nie posiada uruchomionej transakcji.
                //Uruchomienie nowej transakcji na potrzeby tej metody z odpowiednim poziomem izolacji.
                form.BeginTransaction(IsolationLevel.RepeatableRead);

            try
            {
                Leave rejectedLeave = GetLeave(form, rejectedLeaveId);
                //Polecenie sql służące do aktualizacji stanu zgłoszenia.
                SqlCommand command = new SqlCommand("UPDATE Leave SET LS_ID = (SELECT ST_ID FROM " +
                    "Status_type WHERE Name = @Name), Used_days = @Used_days WHERE Leave_ID = @Leave_ID", form.Connection,
                    form.Transaction);
                command.Parameters.Add("@Used_days", SqlDbType.Int).Value = 0;
                command.Parameters.Add("@Leave_ID", SqlDbType.Int).Value = rejectedLeave.Id;
                command.Parameters.Add("@Name", SqlDbType.VarChar).Value = "Rejected";
                command.ExecuteNonQuery();
                AddLeaveDays(form, rejectedLeave.EmployeeId, rejectedLeave.UsedDays);
            }
            catch (Exception e)
            {
                //Jeżeli transakcja formularza była uruchomiona tylko na potrzeby tej metody, to ją cofamy.
                if (!isFormTransactionOn)
                    form.RollbackTransaction();
                //Wyrzucamy wyjątek do dalszej obsługi.
                throw e;
            }
            //Jeżeli operacja powiodła się, a transakcja była uruchomiona tylko na potrzeby tej metody to ją zatwierdzamy.
            if (!isFormTransactionOn)
                form.CommitTransaction();
        }
 /// <summary>
 /// Metoda pobierająca listę możliwych pozycji pracowników.
 /// </summary>
 /// <param name="form">Formularz wywołujący.</param>
 /// <returns>Zwraca listę możliwych pozycji pracowników..</returns>
 /// <exception cref="SqlException">An exception occurred while executing the command against a locked row.</exception>
 /// <exception cref="InvalidOperationException">The current state of the connection is closed.</exception>
 private static List<String> GetPositionsList(LeaveManagerForm form)
 {
     //Stworzenie obiektu do którego będą zczytywane wyniki zapytania.
     List<String> result = new List<string>();
     //Zapytanie sql zczytujące nazwy pozycji.
     SqlCommand command = new SqlCommand("SELECT Description FROM Position ORDER BY Position_ID", form.Connection);
     //Jeżeli formularz ma rozpoczętą transakcję, to dodaj do niej zapytanie.
     if (form.TransactionOn)
         command.Transaction = form.Transaction;
     //Stworzenie obiektu czytającego wyniki zapytania.
     SqlDataReader reader = command.ExecuteReader();
     //Dopóki udało się odczytać kolejną linijkę wyników zapytania.
     while (reader.Read())
     {
         //Dodanie nowego obiektu do listy wyników.
         result.Add(reader["Description"].ToString());
     }
     reader.Close();
     return result;
 }
        /// <summary>
        /// Metoda ustawiania godzin pracy pracownika.
        /// </summary>
        /// <param name="form">Formularz wywołujący</param>
        /// <param name="hours">Tablica 14 elementów zawierająca godziny rozpoczęcia i zakończenia pracy
        /// w kolejnych dniach tygodnia. Np. hours[0] == godzina rozpoczęcia pracy w poniedziałek, 
        /// hours[1] == godzina zakończenia pracy w poniedziałek,
        /// hours[2] == godzina rozpoczęcia pracy we wtorek itd.
        /// 
        /// Format godziny to dd:mm:[ss[.nnnnnnn]]</param>
        /// <param name="employeeId">Numer id pracownika, któremu zmieniamy harmonogram.</param>
        /// <exception cref="SqlException">An exception occurred while executing the command against a locked row.</exception>
        /// <exception cref="InvalidOperationException">The current state of the connection is closed.</exception>
        /// <exception cref="IsolationLevelException">Wyjątek występuje, gdy poziom izolacji uruchomionej w 
        /// formularzu transakcji jest zbyt niski do zapewnienia poprawnego wykonania poleceń metody.</exception>
        /// <exception cref="ArgumentException">Występuje w przypadku próby odjęcia większej liczby dni, niż pracownik posiada.</exception>
        private static void SetSchedule(LeaveManagerForm form, string[] hours, int employeeId)
        {
            /* Dla poprawnego działania tej metody konieczne jest aby posiadała ona transakcję
              * o odpowiednim poziomie izolacji.
              */

            //Zmienna przechowująca stan transakcji przed uruchomieniem metody.
            bool isFormTransactionOn = form.TransactionOn;
            //Jeżeli formularz posiada uruchomioną transakcję.
            if (form.TransactionOn)
            {
                //Sprawdzenie, czy poziom izolacji istniejącej transakcji jest wystarczający.
                if (form.Transaction.IsolationLevel != IsolationLevel.RepeatableRead &&
                    form.Transaction.IsolationLevel != IsolationLevel.Serializable)
                {
                    throw new IsolationLevelException();
                }
            }
            else//Jeżeli formularz nie posiada uruchomionej transakcji.
                //Uruchomienie nowej transakcji na potrzeby tej metody z odpowiednim poziomem izolacji.
                form.BeginTransaction(IsolationLevel.RepeatableRead);

            try
            {
                if (hours.Length != 14)
                {
                    throw new ArgumentException();
                }
                using (SqlCommand command = new SqlCommand("UPDATE Work_hours " +
                    "SET " +
                    "MondayStart = @MondayStart, " +
                    "MondayEnd = @MondayEnd, " +

                    "TuesdayStart = @TuesdayStart, " +
                    "TuesdayEnd = @TuesdayEnd, " +

                    "WednesdayStart = @WednesdayStart, " +
                    "WednesdayEnd = @WednesdayEnd, " +

                    "ThursdayStart = @ThursdayStart, " +
                    "ThursdayEnd = @ThursdayEnd, " +

                    "FridayStart = @FridayStart, " +
                    "FridayEnd = @FridayEnd, " +

                    "SaturdayStart = @SaturdayStart, " +
                    "SaturdayEnd = @SaturdayEnd, " +

                    "SundayStart = @SundayStart, " +
                    "SundayEnd = @SundayEnd " +
                    "WHERE Employee_ID = @Employee_ID", form.Connection, form.Transaction))
                {
                    command.Parameters.AddWithValue("@MondayStart", hours[0]);
                    command.Parameters.AddWithValue("@MondayEnd", hours[1]);

                    command.Parameters.AddWithValue("@TuesdayStart", hours[2]);
                    command.Parameters.AddWithValue("@TuesdayEnd", hours[3]);

                    command.Parameters.AddWithValue("@WednesdayStart", hours[4]);
                    command.Parameters.AddWithValue("@WednesdayEnd", hours[5]);

                    command.Parameters.AddWithValue("@ThursdayStart", hours[6]);
                    command.Parameters.AddWithValue("@ThursdayEnd", hours[7]);

                    command.Parameters.AddWithValue("@FridayStart", hours[8]);
                    command.Parameters.AddWithValue("@FridayEnd", hours[9]);

                    command.Parameters.AddWithValue("@SaturdayStart", hours[10]);
                    command.Parameters.AddWithValue("@SaturdayEnd", hours[11]);

                    command.Parameters.AddWithValue("@SundayStart", hours[12]);
                    command.Parameters.AddWithValue("@SundayEnd", hours[13]);

                    command.Parameters.AddWithValue("@Employee_ID", employeeId);

                    command.ExecuteNonQuery();
                }
                RecountLeaveDays(form, employeeId);
            }
            catch (Exception e)
            {
                //Jeżeli transakcja formularza była uruchomiona tylko na potrzeby tej metody, to ją cofamy.
                if (!isFormTransactionOn)
                    form.RollbackTransaction();
                //Wyrzucamy wyjątek do dalszej obsługi.
                throw e;
            }
            //Jeżeli operacja powiodła się, a transakcja była uruchomiona tylko na potrzeby tej metody to ją zatwierdzamy.
            if (!isFormTransactionOn)
                form.CommitTransaction();
        }
 /// <summary>
 /// Metoda pobrania tabeli z danymi pozycji. 
 /// </summary>
 /// <param name="form">Formularz wywołujący.</param>
 /// <returns>Zwraca tabelę z danymi pozycji posortowane po numerach id pozycji.
 /// Kolumny w zwracanej tabeli: "Position id", "Name".</returns>
 /// <exception cref="SqlException">An exception occurred while executing the command against a locked row.</exception>
 /// <exception cref="InvalidOperationException">The current state of the connection is closed.</exception>
 private static DataTable GetPositionsTable(LeaveManagerForm form)
 {
     SqlCommand command = new SqlCommand("SELECT Position_ID AS 'Position id', " +
         "Description AS 'Name' FROM Position ORDER BY Position_ID", form.Connection);
     //Jeżeli formularz ma włączoną transakcję, to dołącz do niej zapytanie.
     if (form.TransactionOn)
         command.Transaction = form.Transaction;
     //Stworzenie obiektu wyników.
     DataTable result = new DataTable();
     //Stworzenie obiektu czytającego wyniki zapytania.
     SqlDataReader reader = command.ExecuteReader();
     //Zczytanie wyników zapytania do tabeli.
     result.Load(reader);
     reader.Close();
     return result;
 }
 /// <summary>
 /// Gets public Holidays data.
 /// </summary>
 /// <param name="form">Formularz wywołujący metodę.</param>
 /// <returns>Zwraca listę dat.</returns>
 /// <exception cref="SqlException">An exception occurred while executing the command against a locked row.</exception>
 /// <exception cref="InvalidOperationException">The current state of the connection is closed.</exception>
 private static List<DateTime> GetPublicHolidays(LeaveManagerForm form)
 {
     using (SqlCommand command = new SqlCommand("SELECT Date FROM Public_holidays", form.Connection))
     {
         if (form.TransactionOn)
         {
             command.Transaction = form.Transaction;
         }
         using (SqlDataReader reader = command.ExecuteReader())
         {
             List<DateTime> results = new List<DateTime>();
             while (reader.Read())
             {
                 results.Add((DateTime)reader["Date"]);
             }
             return results;
         }
     }
 }
 /// <summary>
 /// Metoda pobrania tabeli z danymi pracowników.
 /// </summary>
 /// <param name="form">Formularz wywołujący.</param>
 /// <returns>Tabelę z danymi pracowników. Zawiera następujące kolumny:
 /// "Employee id", "Name", "Surname", "Birth date", "Address",
 /// "PESEL", "e-mail", "Position", "Permission", "Remaining leave days",
 /// "Old leave days", "Demand days".</returns>
 /// <exception cref="SqlException">An exception occurred while executing the command against a locked row.</exception>
 /// <exception cref="InvalidOperationException">The current state of the connection is closed.</exception>
 private static DataTable GetEmployees(LeaveManagerForm form)
 {
     //Zapytanie sql zwracające dane wszystkich pracowników.
     SqlCommand command = new SqlCommand("SELECT E.Employee_ID AS 'Employee id', " +
         "E.Name, E.Surname, E.Birth_date AS 'Birth date'," +
        "E.Address, E.PESEL, E.EMail AS 'e-mail', Pos.Description AS 'Position', " +
        "Perm.Description AS 'Permission', E.Leave_days AS 'Remaining leave days', " +
       "E.Old_leave_days AS 'Old left leave days', Demand_days AS 'Demand days' " +
        "FROM Employee E, Position Pos, Permission Perm " +
        "WHERE E.Permission_ID = Perm.Permission_ID " +
        "AND E.Position_ID = Pos.Position_ID", form.Connection);
     //Jeżeli formularz ma włączoną transakcję, dołącz do niej zapytanie.
     if (form.TransactionOn)
         command.Transaction = form.Transaction;
     //Stworzenie obiektu czytającego wyniki zapytania.
     SqlDataReader reader = command.ExecuteReader();
     DataTable Results = new DataTable();
     //Załadowanie wyników zapytania do tabeli.
     Results.Load(reader);
     reader.Close();
     return Results;
 }