private void OK_Click(object sender, RoutedEventArgs e)
 {
     if (int.Parse(SerialNumber.Text) < 1 || int.Parse(SerialNumber.Text) > CurPr.Events.Count + 1)
     {
         MessageBox.Show(string.Format("Порядковий номер івента повинен бути менше {0} і більше 0.",
             CurPr.Events.Count + 2));
     }
     else if (Name.Text == string.Empty)
         MessageBox.Show("Необхідно вказати заголовок");
     else 
     {
         Event ev = new Event(CurPr.ID, int.Parse(SerialNumber.Text), Name.Text, 
             DeadlineDate.SelectedDate == null ? DateTime.Now : DeadlineDate.SelectedDate.Value, Description.Text);
         try
         {
             Configuration config = (App.Current as App).config;
             using (TcpClient eClient = new TcpClient(config.IP.ToString(), config.Port))
             {
                 using (NetworkStream writerStream = eClient.GetStream())
                 {
                     MSG message = new MSG();
                     if(curWindow == CurrentWindow.AddEvent)
                         message.stat = STATUS.ADD_EVENT;
                     else if (curWindow == CurrentWindow.EditEvent)
                     {
                         ev.ID = CurPr.Events[EventNumber].ID;
                         message.stat = STATUS.UPDATE_EVENT;
                     }
                     BinaryFormatter formatter = new BinaryFormatter();
                     formatter.Serialize(writerStream, message);
                     formatter.Serialize(writerStream, ev);
                     if (!(bool)formatter.Deserialize(writerStream))
                         MessageBox.Show("Помилка обробки івенту");
                     else
                     {
                         this.Close();
                     }
                 }
             }
         }
         catch (Exception)
         {
             MessageBox.Show("Помилка обробки івенту");
         }   
     }
 }
        /// <summary>Обновляє подію по переданому об'єкту події</summary>
        /// <param name="event">Подія дані якої необхідно обновити в базі</param>
        /// <exception cref="ArgumentException">Якщо поле дедлайн знаходиться за межами типу SqlDateTime</exception>
        public static void UpdateEvent(Event @event)
        {
            if (@event.DeadLine < (DateTime)SqlDateTime.MinValue || @event.DeadLine > (DateTime)SqlDateTime.MaxValue)
                throw new ArgumentException(string.Format("Невірний формат дати для поля дедлайн, значення повинно бути в межах: від {0} до {1}", SqlDateTime.MinValue, SqlDateTime.MaxValue), "event");
            if (@event.ID < 1)
                throw new ArgumentException("невірний id події", "event");

            using (SqlConnection connection = new SqlConnection(ConnectionString))
            {
                connection.Open();
                using (SqlTransaction transaction = connection.BeginTransaction())
                using (
                    SqlCommand query =
                        new SqlCommand(
                            "UPDATE Event SET ProjectId = @ProjectId, SerialNumber = @SerialNumber, Title = @Title, Description = @Description, DeadLine = @DeadLine, AcceptDate = @AcceptDate, EventStatus = @EventStatus, Mark = @Mark, Penalty = @Penalty WHERE EventId = @Id",
                            connection, transaction))
                using (SqlCommand getSerialNumber = new SqlCommand("SELECT SerialNumber FROM [Event] WHERE EventId = @Id", connection, transaction))
                {
                    try
                    {
                        getSerialNumber.Parameters.Add("@Id", SqlDbType.Int).Value = @event.ID;
                        int oldSerialNumber = (int)(getSerialNumber.ExecuteScalar() ?? int.MinValue);
                        if (oldSerialNumber == int.MinValue)
                            throw new Exception("Event not found");

                        query.Parameters.Add("@ProjectId", SqlDbType.Int).Value = @event.ProjectId;
                        query.Parameters.Add("@SerialNumber", SqlDbType.Int).Value = @event.SerialNumber;
                        query.Parameters.Add("@Title", SqlDbType.VarChar, 50).Value = @event.Title;
                        query.Parameters.Add("@Description", SqlDbType.Text).Value = @event.Description;
                        query.Parameters.Add("@DeadLine", SqlDbType.DateTime).Value = @event.DeadLine;
                        query.Parameters.Add("@AcceptDate", SqlDbType.DateTime).Value = @event.AcceptDate < (DateTime)SqlDateTime.MinValue ? DBNull.Value : (object)@event.AcceptDate;
                        query.Parameters.Add("@EventStatus", SqlDbType.Int).Value = @event.EStatus;
                        query.Parameters.Add("@Mark", SqlDbType.Int).Value = @event.Mark;
                        query.Parameters.Add("@Penalty", SqlDbType.Real).Value = @event.Penalty;
                        query.Parameters.Add("@Id", SqlDbType.Int).Value = @event.ID;
                        query.ExecuteNonQuery();
                        using (SqlCommand childrenUpdate = new SqlCommand("UPDATE Event SET ProjectId = @ProjectId, SerialNumber = @SerialNumber, Title = @Title, Description = @Description, DeadLine = @DeadLine, AcceptDate = @AcceptDate, EventStatus = @EventStatus, Mark = @Mark, Penalty = @Penalty WHERE ProjectId = @ProjectId AND SerialNumber = @OldSerialNumber", connection, transaction))
                        {
                            childrenUpdate.Parameters.Add("@ProjectId", SqlDbType.Int);
                            childrenUpdate.Parameters.Add("@SerialNumber", SqlDbType.Int).Value = @event.SerialNumber;
                            childrenUpdate.Parameters.Add("@OldSerialNumber", SqlDbType.Int).Value = oldSerialNumber;
                            childrenUpdate.Parameters.Add("@Title", SqlDbType.VarChar, 50).Value = @event.Title;
                            childrenUpdate.Parameters.Add("@Description", SqlDbType.Text).Value = @event.Description;
                            childrenUpdate.Parameters.Add("@DeadLine", SqlDbType.DateTime).Value = @event.DeadLine;
                            childrenUpdate.Parameters.Add("@AcceptDate", SqlDbType.DateTime).Value = @event.AcceptDate < (DateTime)SqlDateTime.MinValue ? DBNull.Value : (object)@event.AcceptDate;
                            childrenUpdate.Parameters.Add("@EventStatus", SqlDbType.Int).Value = @event.EStatus;
                            childrenUpdate.Parameters.Add("@Mark", SqlDbType.Int).Value = @event.EStatus;
                            childrenUpdate.Parameters.Add("@Penalty", SqlDbType.Real).Value = @event.Penalty;
                            foreach (var project in GetProjectsByParentId(@event.ProjectId, false))
                            {
                                childrenUpdate.Parameters["@ProjectId"].Value = project.ID;
                                childrenUpdate.ExecuteNonQuery();
                            }
                        }
                        foreach (var penalty in @event.PenaltyCollection)
                            UpdatePenalty(penalty);
                        
                        transaction.Commit();
                    }
                    catch (Exception)
                    {
                        transaction.Rollback();
                        throw;
                    }
                }
            }
        }
        /// <summary>Додає event в базу</summary>
        /// <param name="event">Об'єкт дані якого заносяться в базу</param>
        /// <exception cref="ArgumentException">Якщо поле дедлайн знаходиться за межами типу SqlDateTime</exception>
        public static bool AddEvent(Event @event)
        {
            if (@event.DeadLine < (DateTime)SqlDateTime.MinValue || @event.DeadLine > (DateTime)SqlDateTime.MaxValue)
                throw new ArgumentException(
                    string.Format(
                        "Невірний формат дати для поля дедлайн, значення повинно бути в межах: від {0} до {1}",
                        SqlDateTime.MinValue, SqlDateTime.MaxValue), "event");


            using (SqlConnection connection = new SqlConnection(ConnectionString))
            {
                connection.Open();
                using (SqlCommand count = new SqlCommand("SELECT COUNT(*) FROM Event WHERE ProjectId = @ProjectId AND SerialNumber = @SerialNumber", connection))
                {
                    count.Parameters.Add("@ProjectId", SqlDbType.Int).Value = @event.ProjectId;
                    count.Parameters.Add("@SerialNumber", SqlDbType.Int).Value = @event.SerialNumber;
                    if ((int)count.ExecuteScalar() > 0)
                        return false;
                }
                using (SqlTransaction transaction = connection.BeginTransaction())
                using (SqlCommand query = new SqlCommand(
                    "INSERT INTO Event(SerialNumber, Title, Description, DeadLine, AcceptDate, Mark, Penalty, ProjectId, EventStatus, DateOfCreation) Values(@SerialNumber, @Title, @Description, @DeadLine, @AcceptDate, @Mark, @Penalty, @ProjectId, @EventStatus, @DateOfCreation); SELECT CAST(scope_identity() AS int)",
                    connection, transaction))
                {
                    try
                    {
                        query.Parameters.Add("@SerialNumber", SqlDbType.Int).Value = @event.SerialNumber;
                        query.Parameters.Add("@Title", SqlDbType.VarChar, 50).Value = @event.Title;
                        query.Parameters.Add("@Description", SqlDbType.Text).Value = @event.Description;
                        query.Parameters.Add("@DeadLine", SqlDbType.DateTime).Value = @event.DeadLine;
                        query.Parameters.Add("@AcceptDate", SqlDbType.DateTime).Value = @event.AcceptDate < (DateTime)SqlDateTime.MinValue ? DBNull.Value : (object)@event.AcceptDate;
                        query.Parameters.Add("@Mark", SqlDbType.Decimal).Value = @event.Mark;
                        query.Parameters.Add("@Penalty", SqlDbType.Real).Value = @event.Penalty;
                        query.Parameters.Add("@ProjectId", SqlDbType.Int).Value = @event.ProjectId;
                        query.Parameters.Add("@EventStatus", SqlDbType.Int).Value = @event.EStatus;
                        query.Parameters.Add("@DateOfCreation", SqlDbType.DateTime).Value = @event.DateOfCreation <
                                                                                            (DateTime)
                                                                                                SqlDateTime.MinValue
                            ? DateTime.Now
                            : (object) @event.DateOfCreation; 
                        @event.ID = (int)query.ExecuteScalar();
                        foreach (var project in GetProjectsByParentId(@event.ProjectId, false))
                        {
                            query.Parameters["@ProjectId"].Value = project.ID;
                            query.ExecuteScalar();
                        }
                        transaction.Commit();
                        return true;
                    }
                    catch (Exception)
                    {
                        transaction.Rollback();
                        throw;
                    }
                }
            }
        }