예제 #1
0
 /// <summary>
 /// Konstruktor.
 /// </summary>
 /// <param name="connection">Połączenie z bazą danych. Powinno być otwarte.</param>
 /// <param name="employee"></param>
 public FormEmployee(SqlConnection connection, Employee employee)
 {
     InitializeComponent();
     this.connection = connection;
     this.employee = employee;
     labelNameValue.Text = employee.Name + " " + employee.Surname;
     labelPositionValue.Text = employee.Position;
     RefreshData();
 }
        public FormAddOrEditEmployee(SqlConnection connection, int employeeId)
        {
            InitializeComponent();
            this.connection = connection;
            try
            {
                employeeToEdit = this.GetEmployee(employeeId);
            }
            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();
            }
            //przystosowanie odpowiednich elementów okna tak aby pasowały do funkcji związanych z edycją pracownika
            labelInfo.Text = "Here you can edit information about " + employeeToEdit.Name + " " + employeeToEdit.Surname;
            buttonAdd.Text = "Edit employee";
            //Ustawienie ograniczeń dla daty urodzenia nowego pracownika.
            dateTimePickerBirthDate.MinDate = (DateTime.Today.AddYears(-100));
            dateTimePickerBirthDate.MaxDate = (DateTime.Today.AddYears(-16));
            dateTimePickerBirthDate.Value = (DateTime.Today.AddYears(-20));
            //Zczytanie listy możliwych do ustawienia uprawnień oraz pozycji pracownika.
            comboBoxPermissions.DataSource = this.GetPermissions();
            comboBoxPossition.DataSource = this.GetPositionsList();

            comboBoxPermissions.SelectedItem = employeeToEdit.Permission;
            textBoxName.Text = employeeToEdit.Name;
            textBoxSurname.Text = employeeToEdit.Surname;
            textBoxAddress.Text = employeeToEdit.Address;
            textBoxPesel.Text = employeeToEdit.Pesel;
            textBoxEMail.Text = employeeToEdit.EMail;
            textBoxNumberOfLeaveDays.Text = employeeToEdit.LeaveDays.ToString();
            comboBoxPossition.SelectedItem = employeeToEdit.Position;
        }
        /// <summary>
        /// Konstruktor.
        /// </summary>
        /// <param name="connection">Połączenie do bazy danych. Powinno być otwarte.</param>
        public FormAddOrEditEmployee(SqlConnection connection)
        {
            InitializeComponent();
            employeeToEdit = null;
            this.connection = connection;
            //Ustawienie ograniczeń dla daty urodzenia nowego pracownika.
            dateTimePickerBirthDate.MinDate = (DateTime.Today.AddYears(-100));
            dateTimePickerBirthDate.MaxDate = (DateTime.Today.AddYears(-16));
            dateTimePickerBirthDate.Value = (DateTime.Today.AddYears(-20));
            //Zczytanie listy możliwych do ustawienia uprawnień oraz pozycji pracownika.
            try
            {
                comboBoxPermissions.DataSource = this.GetPermissions();
                comboBoxPossition.DataSource = this.GetPositionsList();
            }
            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 (Exception ex)
            {
                MessageBox.Show("Unknown exception has occured" + ex.Message);
                this.Close();
            }

            //todo usunąć dane wspomagające testy poniżej
            textBoxName.Text = "trol";
            textBoxSurname.Text = "trol";
            textBoxAddress.Text = "jaskinia";
            textBoxPesel.Text = "99999999999";
            textBoxEMail.Text = "asdf";
            textBoxNumberOfLeaveDays.Text = "22";
        }
예제 #4
0
 /// <summary>
 /// Metoda wywoływana w przypadku naciśnięcia guzika logowania.
 /// </summary>
 /// <param name="sender">Obiekt wysyłający.</param>
 /// <param name="e">Argumenty.</param>
 private void buttonLogin_Click(object sender, EventArgs e)
 {
     try
     {
         //Próba zalogowania
         employee = this.Login(textBoxLogin.Text, textBoxPassword.Text);
         //Jeżeli próba zalogowania powiodła się to ustawiamy flagę zalogowania.
         loggedIn = true;
         this.Close();
     }
     catch (SqlException)
     {
         MessageBox.Show("SQL error. Please try connection to database or try again later");
     }
     catch (InvalidOperationException)
     {
         MessageBox.Show("Invalid operation. Please try again later.");
     }
     catch (LoginOrPasswordException)
     {
         MessageBox.Show("Incorrect login or password. Please try again later.");
     }
     catch (Exception ex)
     {
         MessageBox.Show("Unknown exception has occured" + ex.Message);
     }
 }
예제 #5
0
 /// <summary>
 /// Metoda dodawania nowego pracownika.
 /// Rozszerza formularz dodawania pracownika.
 /// </summary>
 /// <param name="form">Formularz wywołujący.</param>
 /// <param name="employee">Obiekt zawierający dane dodawanego 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>
 /// <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="NoFreeLoginException">Wyjątek występuje, gdy wszystkie z możliwych do wylosowania loginów są zajęte.</exception>
 public static void AddEmployee(this FormAddOrEditEmployee form, Employee employee)
 {
     AddEmployee((LeaveManagerForm)form, employee);
 }
예제 #6
0
 /// <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();
     }
 }
예제 #7
0
 /// <summary>
 /// Metoda służy do edycji danych pracownika. Rozszerza formularz dodawania lub edycji pracownika.
 /// </summary>
 /// <param name="form">Formularz wywołujący metode</param>
 /// <param name="newEmployee">Nowe dane 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>
 /// <exception cref="PermissionException">"Bład podczas odczytywania uprawnień(uprawnienia nie została odnaleziona"</exception>
 /// <exception cref="PositionException">"Bład podczas odczytywania pozycji (pozycja nie została odnaleziona"</exception>
 public static void EditEmployee(this FormAddOrEditEmployee form, Employee newEmployee)
 {
     EditEmployee((LeaveManagerForm)form, newEmployee);
 }
예제 #8
0
 /// <summary>
 /// Metoda zwracająca obiekt reprezentujący dane pracownika.
 /// </summary>
 /// <param name="form">Formularz wywołujący metodę.</param>
 /// <param name="employeeId">Numer id pobieranego pracownika.</param>
 /// <returns>Obiekt pracownika, którego numer id zgadza się z argumentem.</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="EmployeeIdException">"Pracownik o podanym Id nie istnieje"</exception>
 private static Employee GetEmployee(LeaveManagerForm form, int employeeId)
 {
     //Zapytanie sql czytające dane pracownika o danym numerze id.
     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 Employee_ID = @Employee_ID " +
                                            "AND E.Permission_ID = Perm.Permission_ID AND " +
                                            "E.Position_ID = Pos.Position_ID", form.Connection);
     //Jeżeli formularz ma uruchomioną transakcję, dodaj do niej zapytanie.
     if (form.TransactionOn)
         command.Transaction = form.Transaction;
     //Ustawienie parametru numeru id szukanego pracownika w zapytaniu.
     command.Parameters.Add("@Employee_ID", SqlDbType.Int).Value = employeeId;
     //Stworzenie obiektu czytającego wyniki zapytania.
     SqlDataReader reader = command.ExecuteReader();
     //Jeżeli znaleziono wpis z danym numerem id.
     if (reader.Read())
     {
         //Zczytanie danych z obiektu czytającego do nowego obiektu pracownika i zwrócenie go.
         Employee employee = new Employee(employeeId, 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"]);
         reader.Close();
         return employee;
     }
     else
     {
         reader.Close();
         throw new EmployeeIdException();
     }
 }
예제 #9
0
 /// <summary>
 /// Metoda służy do edycji danych pracownika
 /// </summary>
 /// <param name="form">Formularz wywołujący metode</param>
 /// <param name="newEmployee">Nowe dane 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>
 /// <exception cref="PermissionException">"Bład podczas odczytywania uprawnień(uprawnienia nie została odnaleziona"</exception>
 /// <exception cref="PositionException">"Bład podczas odczytywania pozycji (pozycja nie została odnaleziona"</exception>
 private static void EditEmployee(LeaveManagerForm form, Employee newEmployee)
 {
     //Zapytanie SQL edytujące danego pracownika
     SqlCommand command = new SqlCommand("UPDATE Employee SET Permission_ID = @Permission, Position_ID = @Position"
         + ", Name = @Name, Surname = @Surname, Birth_date = @Birth_date, Address = @Address, Pesel = @Pesel"
         + ", EMail = @Email, Year_leave_days = @Year_leave_days WHERE Employee_ID = @Employee_ID", form.Connection);
     //Ustawienie parametrów zapytania
     command.Parameters.Add("@Permission", SqlDbType.Int).Value = GetPermissionID(form, newEmployee.Permission);
     command.Parameters.Add("@Position", SqlDbType.Int).Value = GetPositionID(form, newEmployee.Position);
     command.Parameters.Add("@Name", SqlDbType.VarChar).Value = newEmployee.Name;
     command.Parameters.Add("@Surname", SqlDbType.VarChar).Value = newEmployee.Surname;
     command.Parameters.Add("@Birth_date", SqlDbType.Date).Value = newEmployee.BirthDate;
     command.Parameters.Add("@Address", SqlDbType.VarChar).Value = newEmployee.Address;
     command.Parameters.Add("@Pesel", SqlDbType.VarChar).Value = newEmployee.Pesel;
     command.Parameters.Add("@Email", SqlDbType.VarChar).Value = newEmployee.EMail;
     command.Parameters.Add("@Year_leave_days", SqlDbType.Int).Value = newEmployee.YearLeaveDays;
     command.Parameters.Add("@Employee_ID", SqlDbType.Int).Value = newEmployee.EmployeeId;
     if (form.TransactionOn)
         //Przypisanie do zapytania transakcji formularza.
         command.Transaction = form.Transaction;
     command.ExecuteNonQuery();
 }
예제 #10
0
        /// <summary>
        /// Metoda dodawania nowego pracownika.
        /// </summary>
        /// <param name="form">Formularz wywołujący.</param>
        /// <param name="employee">Obiekt zawierający dane dodawanego pracownika.</param>
        /// <remarks>Jeżeli formularz ma uruchomioną transakcję,to poziom jej izolacji
        /// musi być == ReapeatableRead lub Serializable.
        /// 
        /// Nowy pracownik będzie posiadał losowo wygenerowane login i hasło składające się z cyfr.</remarks>
        /// <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="NoFreeLoginException">Wyjątek występuje, gdy wszystkie z możliwych do wylosowania loginów są zajęte.</exception>
        private static void AddEmployee(LeaveManagerForm form, Employee employee)
        {
            /* 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
            {
                //Obiekt umożliwiający losowanie.
                Random random = new Random();
                //Zmienna do której zostanie wygenerowany login.
                int login = 0;
                /* Zapytanie sql służące do sprawdzenia, czy wygenerowany login już istnieje. Jeżeli zwróci wynik,
                 * to oznacza to, że podany login istnieje.
                 */
                SqlCommand commandCheckLogin = new SqlCommand("SELECT Login FROM Employee WHERE Login = @Login",
                    form.Connection, form.Transaction);
                //Stworzenie obiektu służącego do czytania wyników zapytania.
                SqlDataReader reader;
                //Pętla szukająca wolnego loginu składającego się z 7 cyfr.
                for (int i = 1000000; i <= 10000000; ++i)
                {
                    //Wylosowanie loginu.
                    login = random.Next(1000000, 10000000);
                    //Wyczyszczenie parametrów zapytania.
                    commandCheckLogin.Parameters.Clear();
                    //Dodanei nowego parametru zapytania: losowo wygenerowanego loginu.
                    commandCheckLogin.Parameters.Add("@Login", SqlDbType.VarChar).Value = login.ToString();
                    //Przypisanie wyników zapytania z nowym parametrem do obiektu czytającego.
                    reader = commandCheckLogin.ExecuteReader();
                    /* Jeżeli obiekt czytający nie ma czego czytać (=> zapytanie nic nie zwróciło =>
                     * wygenerowany login nie istnieje w bazie.
                     */
                    if (!reader.Read())
                    {
                        //Zamykamy obiekt czytający i przerywamy pętle szukającą nie wykorzystanego loginu.
                        reader.Close();
                        reader.Dispose();
                        break;
                    }
                    reader.Close();
                    //Jeżeli szukanie wolnego loginu zakończyło się niepowodzeniem.
                    if (i == 10000000)
                        throw new NoFreeLoginException();
                }
                //Wygenerowanie 7 znakowego hasła składającego się z samych cyfr.
                int password = random.Next(1000000, 10000000);
                //Polecenie sql dodające wpis nowego pracownika. Nadaje mu id o 1 większe od największego numeru id w bazie.
                SqlCommand commandInsertEmployee = new SqlCommand("INSERT INTO Employee (Employee_ID, Permission_ID, Position_ID, " +
                  "Login, Password, Name, Surname, Birth_date, Address, PESEL, EMail, " +
                  "Year_leave_days, Leave_days, Old_leave_days) VALUES ((SELECT MAX(Employee_ID) + 1 FROM Employee)," +
                  "(SELECT Permission_ID FROM Permission WHERE Description = @Permission_Description), " +
                  "(SELECT Position_ID FROM Position WHERE Description = @Position_Description), " +
                  "@Login, @Password, @Name, @Surname, @Birth_date, @Address," +
                  "@PESEL, @EMail, @Year_leave_days, @Leave_days, 0)", form.Connection, form.Transaction);
                //Ustawienie parametrów polecenia.
                commandInsertEmployee.Parameters.Add("@Permission_Description", SqlDbType.VarChar).Value = employee.Permission;
                commandInsertEmployee.Parameters.Add("@Position_Description", SqlDbType.VarChar).Value = employee.Position;
                commandInsertEmployee.Parameters.Add("@Login", SqlDbType.VarChar).Value = login.ToString();
                commandInsertEmployee.Parameters.Add("@Password", SqlDbType.VarChar).Value = StringSha.GetSha256Managed(password.ToString());
                commandInsertEmployee.Parameters.Add("@Name", SqlDbType.VarChar).Value = employee.Name;
                commandInsertEmployee.Parameters.Add("@Surname", SqlDbType.VarChar).Value = employee.Surname;
                commandInsertEmployee.Parameters.Add("@Birth_date", SqlDbType.DateTime).Value = employee.BirthDate;
                commandInsertEmployee.Parameters.Add("@Address", SqlDbType.VarChar).Value = employee.Address;
                commandInsertEmployee.Parameters.Add("@PESEL", SqlDbType.VarChar).Value = employee.Pesel;
                commandInsertEmployee.Parameters.Add("@EMail", SqlDbType.VarChar).Value = employee.EMail;
                commandInsertEmployee.Parameters.Add("@Year_leave_days", SqlDbType.Int).Value = employee.YearLeaveDays;
                commandInsertEmployee.Parameters.Add("@Leave_days", SqlDbType.Int).Value = employee.LeaveDays;
                commandInsertEmployee.ExecuteNonQuery();
                /* Polecenie sql odpowiedzialne za wpisanie nowego pracownika do tablicy pracowników nie poinformowanych
                 * o swoim loginie i hasle.
                 */
                SqlCommand commandInsertUninformed = new SqlCommand("INSERT INTO Uninformed (Employee_ID, Password) " +
                    "VALUES ((SELECT MAX(Employee_ID) FROM Employee), @Password)", form.Connection, form.Transaction);
                commandInsertUninformed.Parameters.Add("@Password", SqlDbType.VarChar).Value = password.ToString();
                commandInsertUninformed.ExecuteNonQuery();
                /* Polecenie sql odpowiedzialne za dodanie pustego wpisu do tablicy z harmonogramem pracy*/
                SqlCommand commandInsertWorkHours = new SqlCommand("INSERT INTO Work_hours (Employee_ID) VALUES ((SELECT MAX(Employee_ID) FROM Employee))", form.Connection, form.Transaction);
                commandInsertWorkHours.ExecuteNonQuery();
            }
            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();
        }