public EditEventWindow(Project pr, int evnum = 0)
        {
            InitializeComponent();

            DataGridTextColumn col = new DataGridTextColumn();
            col.Header = "Опис штрафу";
            col.Width = new DataGridLength(180);
            col.Binding = new Binding("Description");
            PenaltiesGrid.Columns.Add(col);
            col = new DataGridTextColumn();
            col.Header = "Штраф(%)";
            col.Width = new DataGridLength(70);
            col.Binding = new Binding("Mode");
            PenaltiesGrid.Columns.Add(col);
            col = new DataGridTextColumn();
            col.Header = "Штраф(бали)";
            col.Width = new DataGridLength(85);
            col.Binding = new Binding("Value");
            PenaltiesGrid.Columns.Add(col);

            PenaltyRow val = new PenaltyRow("Prosto tak", 0.5);
            PenaltyRow mod = new PenaltyRow("Potomu chto loh", 50);
            PenaltiesGrid.Items.Add(val);
            PenaltiesGrid.Items.Add(mod);

            DeadlineDate.SelectedDate = DateTime.Today;
            CurPr = pr;
            SerialNumber.Text = (CurPr.Events.Count + 1).ToString();
            EventNumber = evnum;
            OK.Content = "Зберегти";
            DeadlineDate.SelectedDate = CurPr.Events[EventNumber].DeadLine;
            Name.Text = CurPr.Events[EventNumber].Title;
            Description.Text = CurPr.Events[EventNumber].Description;
            SerialNumber.Text = CurPr.Events[EventNumber].SerialNumber.ToString();
        }
 public AddPenaltyWindow(Project cp, int evnum, CurrentWindow cw)
 {
     CurPr = cp;
     EventNumber = evnum;
     curWindow = cw;
     InitializeComponent();
     if (curWindow == CurrentWindow.AddPenalty)
     {
         this.Title = "Додати штраф";
     }
     else
     {
         this.Title = "Редагувати штраф";
     }
 }
 public GradeEventWindow(CurrentWindow cw, Project pr, int evnum = 0)
 {
     curWindow = cw;
     InitializeComponent();
     DeadlineDate.SelectedDate = DateTime.Today;
     CurPr = pr;
     SerialNumber.Text = (CurPr.Events.Count + 1).ToString();
     if (cw == CurrentWindow.AddEvent)
     {
         OK.Content = "Додати";
         FileControl.IsEnabled = false;
     }
     else
     {
         EventNumber = evnum;
         OK.Content = "Зберегти";
         DeadlineDate.SelectedDate = CurPr.Events[EventNumber].DeadLine;
         Name.Text = CurPr.Events[EventNumber].Title;
         Description.Text = CurPr.Events[EventNumber].Description;
         SerialNumber.Text = CurPr.Events[EventNumber].SerialNumber.ToString();
     }
 }
        public AddProjectWindow(CurrentWindow cw, Project pr = null)
        {
            InitializeComponent();
            _currentWindow = cw;
            proj = pr;
            // TODO добавить для курсовіх, діпломніх
            switch (_currentWindow)
            {
                case CurrentWindow.CreateLab:
                    this.Title = "Створення лабораторних робіт";
                    GreyName.Text = "Назва лабораторної роботи";
                    break;

                case CurrentWindow.CreateRgr:
                    this.Title = "Створення РГР";
                    GreyName.Text = "Назва розрахункової роботи";
                    break;

                case CurrentWindow.EditRgr:
                    this.Title = "Редагування РГР";
                    break;
                case CurrentWindow.EditLab:
                    this.Title = "Редагування лабораторних робіт";
                    break;
            }
            if(cw == CurrentWindow.CreateLab || cw == CurrentWindow.CreateRgr)
                treeView1.ItemsSource = TreeViewModel.SetTree();
            else if (cw == CurrentWindow.EditLab || cw == CurrentWindow.EditRgr)
                treeView1.ItemsSource = TreeViewModel.SetTree(true, pr);
            Configuration config = (App.Current as App).config;
            TcpClient eClient = new TcpClient();
            try
            {
                eClient = new TcpClient(config.IP.ToString(), config.Port);
                using (NetworkStream writerStream = eClient.GetStream())
                {
                    MSG message = new MSG();
                    message.stat = STATUS.GET_SUBJECTS;
                    BinaryFormatter formatter = new BinaryFormatter();
                    formatter.Serialize(writerStream, message);
                    bool fl = (bool)formatter.Deserialize(writerStream);
                    if (fl)
                    {
                        _subjectsCollection = (Dictionary<string, int>) formatter.Deserialize(writerStream);
                        foreach (var subject in _subjectsCollection)
                            Subject.Items.Add(subject.Key);
                    }
                   
                    else
                    {
                        // TODO возможен баг из-за закрытия в конструкторе
                        MessageBox.Show("Помилка з'єднання з сервером");
                        this.Close();
                    }
                    if (_currentWindow == CurrentWindow.EditLab || _currentWindow == CurrentWindow.EditRgr)
                    {
                        try
                        {
                            Subject.SelectedItem = proj.Subject;
                            
                        }
                        catch (Exception)
                        {
                            if(Subject.Items.Count > 0)
                                Subject.SelectedIndex = 0;
                        }
                        Name.Text = proj.Theme;
                        FlowDocument document = new FlowDocument();
                        Paragraph paragraph = new Paragraph();
                        paragraph.Inlines.Add(new Bold(new Run(proj.Description)));
                        document.Blocks.Add(paragraph);
                        Description.Document = document;
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                eClient.Close();
            }
        }
 public static List<TreeViewModel> SetTree(bool IsUpdate = false, Project pr = null)
 {
     List<TreeViewModel> treeView = new List<TreeViewModel>();
     Configuration config = (App.Current as App).config;
     TcpClient eClient = new TcpClient();
     List<int> stInProj = new List<int>();
     try
     {
         eClient = new TcpClient(config.IP.ToString(), config.Port);
         using (NetworkStream writerStream = eClient.GetStream())
         {
             MSG message = new MSG();
             message.stat = STATUS.GET_GROUPS;
             BinaryFormatter formatter = new BinaryFormatter();
             formatter.Serialize(writerStream, message);
             bool fl = (bool)formatter.Deserialize(writerStream);
             if (fl)
             {
                 var dic = (Dictionary<string, int>)formatter.Deserialize(writerStream);
                 foreach (var i in dic)
                 {
                     TreeViewModel tv = new TreeViewModel(i.Key, i.Value);
                     treeView.Add(tv);
                 }
             }
         }
     }
     catch (Exception ex)
     {
         MessageBox.Show(ex.Message);
     }
     finally
     {
         eClient.Close();
     }
     if (IsUpdate)
     {
         TcpClient Client1 = new TcpClient();
         try
         {
             Client1 = new TcpClient(config.IP.ToString(), config.Port);
             using (NetworkStream writerStream = Client1.GetStream())
             {
                 MSG message = new MSG();
                 message.stat = STATUS.GET_STUDENTS_ID_BY_PARENT;
                 BinaryFormatter formatter = new BinaryFormatter();
                 formatter.Serialize(writerStream, message);
                 formatter.Serialize(writerStream, pr.ID);
                 stInProj = (List<int>) formatter.Deserialize(writerStream);
             }
         }
         catch (Exception ex)
         {
             MessageBox.Show(ex.Message);
         }
         finally
         {
             Client1.Close();
         }
     }
     foreach (var i in treeView)
     {
         List<TreeViewModel> tvmCollection =new List<TreeViewModel>();
         TcpClient Client = new TcpClient();
         if (!IsUpdate)
         {
             try
             {
                 Client = new TcpClient(config.IP.ToString(), config.Port);
                 using (NetworkStream writerStream = Client.GetStream())
                 {
                     MSG message = new MSG();
                     message.stat = STATUS.GET_STUDENTS_NAME_BY_GROUP;
                     BinaryFormatter formatter = new BinaryFormatter();
                     formatter.Serialize(writerStream, message);
                     formatter.Serialize(writerStream, i.Name);
                     bool fl = (bool)formatter.Deserialize(writerStream);
                     if (fl)
                     {
                         var dic = (List<StringToInt>)formatter.Deserialize(writerStream);
                         foreach (var j in dic)
                         {
                             TreeViewModel tv = new TreeViewModel(j.Key, j.Value);
                             tvmCollection.Add(tv);
                         }
                     }
                 }
             }
             catch (Exception ex)
             {
                 MessageBox.Show(ex.Message);
             }
             finally
             {
                 Client.Close();
             }   
         }
         else
         {
             try
             {
                 Client = new TcpClient(config.IP.ToString(), config.Port);
                 using (NetworkStream writerStream = Client.GetStream())
                 {
                     MSG message = new MSG();
                     message.stat = STATUS.GET_STUDENTS_NAME_BY_GROUP;
                     BinaryFormatter formatter = new BinaryFormatter();
                     formatter.Serialize(writerStream, message);
                     formatter.Serialize(writerStream, i.Name);
                     bool fl = (bool)formatter.Deserialize(writerStream);
                     if (fl)
                     {
                         var dic = (List<StringToInt>)formatter.Deserialize(writerStream);
                         foreach (var j in dic)
                         {
                             TreeViewModel tv = new TreeViewModel(j.Key, j.Value);
                             // todo поправить ибо не все галочки доставятся ибо они перенты
                             if(stInProj.Contains(j.Value))
                                 tv.SetIsChecked(true, false, false);
                             tvmCollection.Add(tv);
                         }
                     }
                 }
             }
             catch (Exception ex)
             {
                 MessageBox.Show(ex.Message);
             }
             finally
             {
                 Client.Close();
             }
         }
         i.Children = tvmCollection;
     }
     return treeView;
 }
        public static void UpdateProject(Project project)
        {
            using (SqlConnection connection = new SqlConnection(ConnectionString))
            {
                connection.Open();
                using (SqlTransaction transaction = connection.BeginTransaction())
                {
                    try
                    {
                        SqlCommand query = new SqlCommand("UPDATE Project SET Theme = @Theme, ProjectStatus = @ProjectStatus, Description = @Description  WHERE ProjectId = @Id", connection, transaction);
                        query.Parameters.Add("@Theme", SqlDbType.VarChar, 100).Value = project.Theme;
                        query.Parameters.Add("@Description", SqlDbType.Text).Value = project.Description;
                        query.Parameters.Add("@ProjectStatus", SqlDbType.Int).Value = (int)project.PStatus;
                        query.Parameters.Add("@Id", SqlDbType.Int).Value = project.ID;
                        query.ExecuteNonQuery();

                        switch (project.Type)
                        {
                            case EProjectType.DiplomaProject:
                                DiplomaProject diploma = (DiplomaProject)project;
                                //int instructorId = GetInstructorIdByName(diploma.InstroctorName);
                                //if (instructorId < 0)
                                //    throw new ArgumentException("не знайдено id викладача", "project");
                                int normokontrolerId = GetNormokontrolerIdByName(diploma.NormokontrolerName);
                                if (normokontrolerId < 0)
                                    throw new ArgumentException("не знайдено id нормоконтролера", "project");
                                query = new SqlCommand("UPDATE DiplomaProject SET Classification = @Classification, NumberOfPages = @NumberOfPages, NumberOfPictures = @NumberOfPictures, NumberOfTables = @NumberOfTables, NumberOfFormuls = @NumberOfFormuls, NumberOfLiterature = @NumberOfLiterature, NumberOfPosters = @NumberOfPosters, NormokontrolerId = @NormokontrolerId, Defence0 = @Defence0, Defence1 = @Defence1, Defence2 = @Defence2, Defence3 = @Defence3, Defence4 = @Defence4, Defence5 = @Defence5 WHERE DiplomaId = @id", connection, transaction);

                                query.Parameters.Add("@Classification", SqlDbType.VarChar, 50).Value = diploma.Classification;
                                query.Parameters.Add("@NumberOfPages", SqlDbType.Int).Value = diploma.NumberOfPages;
                                query.Parameters.Add("@NumberOfPictures", SqlDbType.Int).Value = diploma.NumberOfPictures;
                                query.Parameters.Add("@NumberOfTables", SqlDbType.Int).Value = diploma.NumberOfTables;
                                query.Parameters.Add("@NumberOfFormuls", SqlDbType.Int).Value = diploma.NumberOfFormuls;
                                query.Parameters.Add("@NumberOfLiterature", SqlDbType.Int).Value = diploma.NumberOfLiterature;
                                query.Parameters.Add("@NumberOfPosters", SqlDbType.Int).Value = diploma.NumberOfPosters;
                                query.Parameters.Add("@NormokontrolerId", SqlDbType.Int).Value = normokontrolerId;
                                query.Parameters.Add("@id", SqlDbType.Int).Value = diploma.ID;
                                
                                DateTime time = new DateTime();
                                if(diploma.DefenceDate == null)
                                    diploma.DefenceDate = new List<string>(){"", "", "", "", "", ""};
                                while (diploma.DefenceDate.Count < 6)
                                    diploma.DefenceDate.Add("");
                                for (int i = 0; i < 6; i++)
                                    if (diploma.DefenceDate[i] == null || !DateTime.TryParse(diploma.DefenceDate[i], out time))
                                        diploma.DefenceDate[i] = "";

                                for (int i = 0; i < 6; i++)
                                    query.Parameters.Add("@Defence" + i, SqlDbType.VarChar, 20).Value = diploma.DefenceDate[i];
                 
                                
                                query.ExecuteNonQuery();
                                break;
                            case EProjectType.LabWork: break;
                            case EProjectType.Rgr: break;
                            default: throw new ArgumentException("Wrong project type", "project");
                        }
                        query.Dispose();
                        transaction.Commit();
                    }
                    catch (Exception)
                    {
                        transaction.Rollback();
                        throw;
                    }

                }
            }
        }
        public static void AddProject(Project project)
        {
            using (SqlConnection connection = new SqlConnection(ConnectionString))
            {
                connection.Open();
                using (SqlTransaction transaction = connection.BeginTransaction())
                using (SqlCommand query = new SqlCommand("INSERT INTO Project(Theme, ParentProjectId, InstructorId, SubjectId, ProjectType, ProjectStatus, Description) VALUES(@Theme, @ParentProjectId, @InstructorId, @SubjectId, @ProjectType, @ProjectStatus, @Description); SELECT CAST(scope_identity() AS int)", connection, transaction))
                {
                    try
                    {
                        query.Parameters.Add("@InstructorId", SqlDbType.Int).Value = project.InstructorId;
                        query.Parameters.Add("@Theme", SqlDbType.VarChar, 100).Value = project.Theme;
                        query.Parameters.Add("@ProjectStatus", SqlDbType.Int).Value = (int)project.PStatus;
                        query.Parameters.Add("@ParentProjectId", SqlDbType.Int).Value = project.ParentProjectId;
                        query.Parameters.Add("@Description", SqlDbType.Text).Value = project.Description;
                        query.Parameters.Add("@ProjectType", SqlDbType.Int).Value = (int)project.Type;
                        query.Parameters.Add("@SubjectId", SqlDbType.Int).Value = GetSubjectIdByName(project.Subject);
                        project.ID = (int)query.ExecuteScalar();

                        if (project.Type == EProjectType.DiplomaProject)
                        {
                            DiplomaProject diploma = (DiplomaProject)project;
                            int instructorId = GetInstructorIdByName(diploma.InstroctorName);
                            if (instructorId < 0)
                                throw new ArgumentException("не знайдено id викладача", "project");
                            int normokontrolerId = GetNormokontrolerIdByName(diploma.NormokontrolerName);
                            if (normokontrolerId < 0)
                                normokontrolerId = 0;

                            SqlCommand diplomaInsert = new SqlCommand("INSERT INTO DiplomaProject(ProjectId, NormokontrolerId, Classification, NumberOfPages, NumberOfPictures, NumberOfTables, NumberOfFormuls, NumberOfLiterature, NumberOfPosters, Defence0, Defence1, Defence2, Defence3, Defence4, Defence5) VALUES(@ProjectId, @NormokontrolerId, @Classification, @NumberOfPages, @NumberOfPictures, @NumberOfTables, @NumberOfFormulas, @NumberOfLiterature, @NumberOfPosters, @Defence0, @Defence1, @Defence2, @Defence3, @Defence4, @Defence5); SELECT CAST(scope_identity() AS int)", connection, transaction);
                            diplomaInsert.Parameters.Add("@ProjectId", SqlDbType.Int).Value = project.ID;
                            diplomaInsert.Parameters.Add("@Classification", SqlDbType.VarChar, 50).Value = (diploma.Classification ?? "");
                            diplomaInsert.Parameters.Add("@NumberOfPages", SqlDbType.Int).Value = diploma.NumberOfPages;
                            diplomaInsert.Parameters.Add("@NumberOfPictures", SqlDbType.Int).Value = diploma.NumberOfPictures;
                            diplomaInsert.Parameters.Add("@NumberOfTables", SqlDbType.Int).Value = diploma.NumberOfTables;
                            diplomaInsert.Parameters.Add("@NumberOfFormulas", SqlDbType.Int).Value = diploma.NumberOfFormuls;
                            diplomaInsert.Parameters.Add("@NumberOfLiterature", SqlDbType.Int).Value = diploma.NumberOfLiterature;
                            diplomaInsert.Parameters.Add("@NumberOfPosters", SqlDbType.Int).Value = diploma.NumberOfPosters;
                            diplomaInsert.Parameters.Add("@NormokontrolerId", SqlDbType.Int).Value = normokontrolerId;
                            
                            DateTime time = new DateTime();
                            if(diploma.DefenceDate == null)
                                diploma.DefenceDate = new List<string>(){"", "", "", "", "", ""};
                            while (diploma.DefenceDate.Count < 6)
                                diploma.DefenceDate.Add("");
                            for (int i = 0; i < 6; i++)
                                if (diploma.DefenceDate[i] == null || !DateTime.TryParse(diploma.DefenceDate[i], out time))
                                    diploma.DefenceDate[i] = "";

                            for (int i = 0; i < 6; i++) 
                                diplomaInsert.Parameters.Add("@Defence" + i, SqlDbType.VarChar, 20).Value = diploma.DefenceDate[i];
                            ((DiplomaProject)project).DiplomaId = (int)diplomaInsert.ExecuteScalar();
                        }
                    }
                    catch (Exception)
                    {
                        transaction.Rollback();
                        throw;
                    }

                    //TODO: Single Transaction?
                    transaction.Commit();
                    if (project.Events != null && project.Events.Count > 0)
                        foreach (var @event in project.Events)
                            AddEvent(@event);
                }
            }
        }
 public static bool AddParentProject(Project project)
 {
     using (SqlConnection connection = new SqlConnection(ConnectionString))
     {
         connection.Open();
         using (SqlTransaction transaction = connection.BeginTransaction())
         using (SqlCommand query = new SqlCommand("INSERT INTO ParentProject(ParentId, InstructorId, SubjectId) VALUES(@ParentId, @InstructorId, @SubjectId)", connection, transaction))
         {
             try
             {
                 using (SqlCommand count = new SqlCommand("SELECT COUNT(*) FROM ParentProject WHERE ParentId = @Id", connection, transaction))
                 {
                     count.Parameters.Add("@Id", SqlDbType.Int).Value = project.ID;
                     if ((int)count.ExecuteScalar() > 0)
                         return false;
                 }
                 project.ParentProjectId = 0;
                 AddProject(project);
                 query.Parameters.Add("ParentId", SqlDbType.Int).Value = project.ID;
                 query.Parameters.Add("@InstructorId", SqlDbType.Int).Value = project.InstructorId;
                 query.Parameters.Add("@SubjectId", SqlDbType.Int).Value = GetSubjectIdByName(project.Subject);
                 query.ExecuteNonQuery();
                 transaction.Commit();
                 return true;
             }
             catch
             {
                 transaction.Rollback();
                 throw;
             }
         }
     }
 }
        public static void UpdateParentProject(Project project)
        {
            using (SqlConnection connection = new SqlConnection(ConnectionString))
            {
                connection.Open();
                using (SqlTransaction transaction = connection.BeginTransaction())
                using (SqlCommand query = new SqlCommand("UPDATE Project SET Theme = @Theme, Description = @Description WHERE ParentProjectId = @ParentId OR ProjectId = @ParentId", connection, transaction))
                {
                    try
                    {
                        query.Parameters.Add("@ParentId", SqlDbType.Int).Value = project.ID;
                        query.Parameters.Add("@Description", SqlDbType.Text).Value = project.Description;
                        query.Parameters.Add("@Theme", SqlDbType.Text).Value = project.Theme;
                        query.ExecuteNonQuery();
                    }
                    catch
                    {
                        transaction.Rollback();
                        throw;
                    }

                    transaction.Commit();
                }

            }
        }
 private void Projects_SelectionChanged(object sender, SelectionChangedEventArgs e)
 {
     EventsGrid.Items.Clear();
     GeneralInfoTab.IsSelected = true;
     EventsTab.IsEnabled = false;
     UpdateEventsGrid(ProjectCollection[Projects.SelectedIndex].ID);
     ProjectDescription.Text = ProjectCollection[Projects.SelectedIndex].Description;
     CurProject = ProjectCollection[Projects.SelectedIndex];
     ProjectInfo.Text = "Поточна оцінка: " + (from i in EventCollection select i.RealMark).Sum().ToString();
     if(EventCollection.Count != 0)
         ProjectInfo.Text += "\nКінцевий термін здачі: " +
                         EventCollection[EventCollection.Count - 1].DeadLine.ToShortDateString();
     
 }