public static TimeBinding CreateTimeBinding(int id, int stepId, Step step, DateTime time, int day, int month, int year)
        {
            var set = DAL.SqlRepository.DBContext.GetDbSet<TimeBinding>();
            var tb = new TimeBinding();

            tb.Id = id;
            tb.StepId = stepId;
            tb.Step = step;
            tb.Time = time;
            tb.Day = day;
            tb.Month = month;
            tb.Year = year;

            set.Add(tb);
            DAL.SqlRepository.Save();
            return tb;
        }
 public Step(Step toCopy)
 {
     Order = toCopy.Order;
     ParentTask = toCopy.ParentTask;
     TaskId = toCopy.TaskId;
     Description = toCopy.Description;
     TimeRule = toCopy.TimeRule;
     TimeRuleId = toCopy.TimeRuleId;
     CriteriaId = toCopy.CriteriaId;
     Criteria = toCopy.Criteria;
     Importance = toCopy.Importance;
     ImportanceName = toCopy.ImportanceName;
     Urgency = toCopy.Urgency;
     UrgencyName = toCopy.UrgencyName;
     Id = toCopy.Id;
     EndDate = toCopy.EndDate;
     BeginDate = toCopy.BeginDate;
 }
 private void EditStep(object sender, RoutedEventArgs e)
 {
     int id = Convert.ToInt32((sender as Button).Name.Substring(1));
     var targetStep = new Step(BL.ChangesBuffer.CurrentState.StepBuffer.First(step => step.Id == id));
     Adding.Visibility = Visibility.Visible;
     Adding.IsEnabled = true;
     InAnimation();
     Labl.Content = "Редактирование";
     Chos.Visibility = Visibility.Collapsed;
     DescBox.Text = targetStep.Description;
     Begin.SelectedDate = targetStep.BeginDate;
     End.SelectedDate = targetStep.EndDate;
     Periodic.IsChecked = targetStep.TimeRule.IsPeriodic;
     Graphs.SelectedItem = targetStep.TimeRule.IsPeriodic
                               ? Graphs.Items.Cast<ComboBoxItem>()
                                       .First(
                                           i => i.Content.ToString() == targetStep.TimeRule.ScheduleId.ToString())
                               : null;
     Imp.SelectedItem =
         Imp.Items.Cast<ComboBoxItem>().First(item => item.Content.ToString() == targetStep.ImportanceName);
     Urg.SelectedItem =
         Urg.Items.Cast<ComboBoxItem>().First(item => item.Content.ToString() == targetStep.UrgencyName);
     TargetVal.Text = targetStep.Criteria.TargetValue.ToString();
     UnitBox.Text = targetStep.Criteria.Unit;
     DescBox.Name = "S" + targetStep.Id.ToString();
     UnitBox.Name = "C" + targetStep.CriteriaId.ToString();
     OkButton.Click -= Add_Click;
     _addFlag = true;
     OkButton.Click += ApplyStep;
 }
 private void ChangeCurrentValueOfStep(object sender, RoutedEventArgs e)
 {
     int id = Convert.ToInt32((sender as Button).Name.Substring(1));
     var step = BL.ChangesBuffer.CurrentState.StepBuffer.First(s => s.Id == id);
     var crit = BL.ChangesBuffer.CurrentState.CriteriaBuffer.First(c => step.CriteriaId == c.Id);
     var newStep = new Step(step);
     var newCrit = new Criteria(crit);
     newCrit.CurrentValue = Convert.ToInt32((_stepChanger.Children[1] as TextBox).Text);
     var buff = new BL.Buffer(BL.ChangesBuffer.CurrentState);
     buff.CriteriaBuffer.Remove(crit);
     buff.CriteriaBuffer.Add(newCrit);
     newStep.Criteria = newCrit;
     buff.StepBuffer.Remove(step);
     buff.StepBuffer.Add(newStep);
     BL.ChangesBuffer.CaptureChanges(buff);
     UpdateTree(BL.ChangesBuffer.CurrentState.TaskBuffer.First(t=>t.Description==_parent.Desc.Text),MoveDirections.None);
 }
        private void ApplyStep(object sender, RoutedEventArgs e)
        {
            var buff = new BL.Buffer(BL.ChangesBuffer.CurrentState);
            int id = Convert.ToInt32(DescBox.Name.Substring(1));
            var step = BL.ChangesBuffer.CurrentState.StepBuffer.First(s => s.Id == id);
            var newStep = new Step(step);
            var crit =
                BL.ChangesBuffer.CurrentState.CriteriaBuffer.First(
                    c => c.Id == Convert.ToInt32(UnitBox.Name.Substring(1)));
            var newCrit = new Criteria(crit);
            buff.CriteriaBuffer.Remove(crit);
            buff.CriteriaBuffer.Add(newCrit);
            buff.StepBuffer.Remove(step);
            newStep.Criteria = newCrit;
            newStep.Description = DescBox.Text;
            var tr = BL.ChangesBuffer.CurrentState.TimeRuleBuffer.First(t => t.Id == step.TimeRuleId);
            var newtr = new TimeRule(tr);
            if (Periodic.IsChecked.HasValue && Periodic.IsChecked.Value)
            {
                newtr.IsPeriodic = true;
                newtr.Schedule =
                    DAL.SqlRepository.Schedules.Cast<Models.Schedule>().ToList()
                       .First(sc => sc.Id == Convert.ToInt32((Graphs.SelectedItem as ComboBoxItem).Content.ToString()));
                newtr.ScheduleId = newtr.Schedule.Id;
            }
            else
            {
                newtr.IsPeriodic = false;

            }
            buff.TimeRuleBuffer.Remove(tr);
            buff.TimeRuleBuffer.Add(newtr);
            newStep.TimeRule = newtr;
            buff.StepBuffer.Add(newStep);
            BL.ChangesBuffer.CaptureChanges(buff);
            UpdateTree(BL.ChangesBuffer.CurrentState.TaskBuffer.First(task=>task.Description==_parent.Desc.Text),MoveDirections.None);
            OkButton.Click -= ApplyStep;

            Discard_Click(sender, e);
        }
        private void Add_Click(object sender, RoutedEventArgs e)
        {
            if (
                BL.ChangesBuffer.CurrentState.TaskBuffer.Any(
                    entity =>
                    Task.GetOldestParent(entity).Id == BL.Application.CurrentTree.MainTaskId &&
                    entity.Description == DescBox.Text))
            {
                MessageBox.Show("Такая цель уже есть в этом дереве!", "Warning", MessageBoxButton.OK,
                                MessageBoxImage.Warning);
                return;
            }
            if (DescBox.Text.Length < 3)
            {
                MessageBox.Show("Слишком короткое описание!", "Warning", MessageBoxButton.OK,
                                MessageBoxImage.Warning);
                return;
            }
            var imp =
                DAL.SqlRepository.Importancies.Cast<Importance>()
                   .First(x => ((ComboBoxItem)Imp.SelectedItem).Content.ToString() == x.ImportanceName);
            var buff = new BL.Buffer(BL.ChangesBuffer.CurrentState);
            if (StepButton.IsChecked == true)
            {
                var tr = new TimeRule
                    {
                        IsPeriodic = Periodic.IsChecked == true,
                        Schedule =
                            DAL.SqlRepository.Schedules.Cast<Models.Schedule>().ToList()
                               .First(x => Periodic.IsChecked != true || x.Id == Convert.ToInt32(((ComboBoxItem)Graphs.SelectedItem).Content.ToString())),

                    };
                tr.ScheduleId = tr.Schedule.Id;
                var t = BL.ChangesBuffer.CurrentState.TaskBuffer.First(x => x.Description == _parent.Desc.Text);
                if (
                    BL.ChangesBuffer.CurrentState.StepBuffer
                       .Any(x => x.TaskId == t.Id && x.Description == DescBox.Text))
                {
                    MessageBox.Show("Такой шаг у цели уже есть!", "Warning", MessageBoxButton.OK,
                                MessageBoxImage.Warning);
                }
                var crit = new Criteria
                {
                    CurrentValue = 0,
                    TargetValue = Convert.ToInt32(TargetVal.Text),
                    Unit = UnitBox.Text
                };
                var st = new Step
                    {
                        BeginDate = Begin.SelectedDate != null ? (DateTime) Begin.SelectedDate : DateTime.Now,
                        EndDate = End.SelectedDate != null ? (DateTime) End.SelectedDate : Interval.PIOS,
                        Criteria = crit,
                        CriteriaId = crit.Id,
                        Description = DescBox.Text,
                        Importance = imp,
                        ImportanceName = imp.ImportanceName,
                        TimeRule = tr,
                        TimeRuleId = tr.Id,
                        ParentTask = t,
                        TaskId = t.Id
                    };
                st.UpdateUrgency();
                buff.StepBuffer.Add(st);
                BL.ChangesBuffer.CaptureChanges(buff);
                UpdateTree(t,MoveDirections.None);
            }
            else
            {
                var crit = new Criteria
                {
                    CurrentValue = 0,
                    TargetValue = 1,
                    Unit = "default"
                };
                var p = BL.ChangesBuffer.CurrentState.TaskBuffer.First(x => x.Description == _parent.Desc.Text);
                var t = new Task
                    {
                    BeginDate = Begin.SelectedDate != null ? (DateTime)Begin.SelectedDate : DateTime.Now,
                    EndDate = End.SelectedDate != null ? (DateTime)End.SelectedDate : Interval.PIOS,
                    Criteria = crit,
                    CriteriaId = crit.Id,
                    Description = DescBox.Text,
                    Importance = imp,
                    ImportanceName = imp.ImportanceName,
                    Parent = p,
                    ParentId = p.Id,
                    Id = BL.ChangesBuffer.CurrentState.TaskBuffer.Max(taskk=>taskk.Id) + 1
                };
                t.UpdateUrgency();
                buff.TaskBuffer.Add(t);
                BL.ChangesBuffer.CaptureChanges(buff);
                UpdateTree(p,MoveDirections.None);

            }
            UpdateRawView();
            Discard_Click(sender,e);
        }
 protected bool Equals(Step other)
 {
     return Id == other.Id && BeginDate.Equals(other.BeginDate) && EndDate.Equals(other.EndDate) &&
            string.Equals(UrgencyName, other.UrgencyName) && Equals(Urgency, other.Urgency) &&
            string.Equals(ImportanceName, other.ImportanceName) && Equals(Importance, other.Importance) &&
            CriteriaId == other.CriteriaId && Equals(Criteria, other.Criteria) && TimeRuleId == other.TimeRuleId &&
            Equals(TimeRule, other.TimeRule) && string.Equals(Description, other.Description) &&
            TaskId == other.TaskId && Equals(ParentTask, other.ParentTask) && Order == other.Order;
 }
 public int CompareTo(Step st)
 {
     return Order.CompareTo(st.Order);
 }
 public static void DeleteStep(Step step)
 {
     var set = DAL.SqlRepository.Steps;
     var toDelete = set.Find(step.Id);
     if (toDelete == null) return;
     set.Remove(toDelete);
     DAL.SqlRepository.DBContext.SaveChanges();
 }
        //private static User[] users;
        //private static Urgency[] urgencies;
        //private static Importance[] importancies;
        //private static Interval[] intervals;
        //private static Criteria[] criterias;
        //private static Models.Schedule[] schedules;
        //private static TimeRule[] timeRules;
        //private static TimeBinding[] timeBindings;
        //private static Models.Task[] tasks;
        //private static Step[] steps;
        //private static Tree[] trees;
        //PLEASE DO NOT CALL THIS METHOD IT IS TOTALLY BAD.
        public static void Seed()
        {
            var user = User.CreateUser("xxxrassiyavperedxxx", "A.Pistoletov", new DateTime(1985, 3, 22), "secret_pass", DateTime.Now);
            //var user = (User)DAL.SqlRepository.Users.Find("xxxrassiyavperedxxx");
            var tree = Tree.CreateTree(user, user.Login, "new era of trees", "must work please");
               // var tree = Tree.FindTreesForUser(user).First();

            var importancies = Importance.GetViableImportanceLevels();
            var urgencies = Urgency.GetViableUrgencyLevels();
            var criterias = new Criteria[] {
                Criteria.CreateCriteria(0, 10, "wtuk"),
                Criteria.CreateCriteria(0, 1, "raz"),
                Criteria.CreateCriteria(0, 666, "fragov v cs")
            };
            //var criterias = DAL.SqlRepository.Criterias.Cast<Criteria>().ToList();

            var tasks = new Task[4];

            tasks[0] =  Task.CreateTask(DateTime.Now, DateTime.Now.AddDays(5), urgencies[0].UrgencyName, importancies[0].ImportanceName, importancies[0], urgencies[0], criterias[0].Id, criterias[0], "task 1", tree.MainTask, tree.MainTask.Id);
            tasks[1] = Task.CreateTask(DateTime.Now, DateTime.Now.AddDays(5), urgencies[1].UrgencyName, importancies[2].ImportanceName, importancies[2], urgencies[1], criterias[1].Id, criterias[1], "task 2", tree.MainTask, tree.MainTask.Id);
            tasks[2] = Task.CreateTask(DateTime.Now, DateTime.Now.AddDays(5), urgencies[2].UrgencyName, importancies[1].ImportanceName, importancies[1], urgencies[2], criterias[2].Id, criterias[2], "task 3", tasks[0], tasks[0].Id);
            tasks[3] = Task.CreateTask(DateTime.Now, DateTime.Now.AddDays(5), urgencies[0].UrgencyName, importancies[0].ImportanceName, importancies[0], urgencies[0], criterias[0].Id, criterias[0], "task 4", tasks[1], tasks[1].Id);

            var intervals = new Interval[] {
                Interval.CreateInterval(DateTime.Now, DateTime.Now.AddHours(3)),
                Interval.CreateInterval(DateTime.Now, DateTime.Now.AddHours(5)),
                Interval.CreateInterval(DateTime.Now, DateTime.Now.AddHours(7)),
                Interval.CreateInterval(DateTime.Now, DateTime.Now.AddHours(13)),
                Interval.CreateInterval(DateTime.Now, DateTime.Now.AddHours(22)),
                Interval.CreateInterval(DateTime.Now, DateTime.Now.AddHours(50))
            };

            var schedules = new Models.Schedule[] {
                Models.Schedule.CreateSchedule(intervals[0],intervals[1],intervals[2],intervals[3],intervals[4],intervals[5],intervals[0], "first"),
                Models.Schedule.CreateSchedule(intervals[1],intervals[2],intervals[3],intervals[4],intervals[5],intervals[0],intervals[1], "second"),
                Models.Schedule.CreateSchedule(intervals[2],intervals[3],intervals[4],intervals[5],intervals[0],intervals[1],intervals[0], "third")

            };

            var timeRules = new TimeRule[] {
                TimeRule.CreateTimeRule(false, schedules[0].Id, schedules[0]),
                TimeRule.CreateTimeRule(true, schedules[1].Id, schedules[1]),
                TimeRule.CreateTimeRule(false, schedules[2].Id, schedules[2]),
                TimeRule.CreateTimeRule(true, schedules[0].Id, schedules[0]),
            };

            var steps = new Step[] {
                Step.CreateStep(DateTime.Now, DateTime.Now.AddDays(30), urgencies[0].UrgencyName, urgencies[0], importancies[0].ImportanceName, importancies[0], criterias[2].Id, criterias[2], timeRules[1].Id, timeRules[0], "step 1", tasks[2], tasks[2].Id, 0),
                Step.CreateStep(DateTime.Now, DateTime.Now.AddDays(30), urgencies[1].UrgencyName, urgencies[1], importancies[1].ImportanceName, importancies[1], criterias[1].Id, criterias[1], timeRules[2].Id, timeRules[0], "step 1", tasks[2], tasks[2].Id, 1),
                Step.CreateStep(DateTime.Now, DateTime.Now.AddDays(30), urgencies[2].UrgencyName, urgencies[2], importancies[2].ImportanceName, importancies[2], criterias[0].Id, criterias[0], timeRules[3].Id, timeRules[0], "step 1", tasks[2], tasks[2].Id, 2),
                Step.CreateStep(DateTime.Now, DateTime.Now.AddDays(30), urgencies[1].UrgencyName, urgencies[1], importancies[0].ImportanceName, importancies[0], criterias[1].Id, criterias[1], timeRules[0].Id, timeRules[0], "step 1", tasks[2], tasks[2].Id, 3),
                Step.CreateStep(DateTime.Now, DateTime.Now.AddDays(30), urgencies[2].UrgencyName, urgencies[2], importancies[2].ImportanceName, importancies[2], criterias[2].Id, criterias[2], timeRules[1].Id, timeRules[0], "step 1", tasks[2], tasks[2].Id, 4),
                Step.CreateStep(DateTime.Now, DateTime.Now.AddDays(30), urgencies[1].UrgencyName, urgencies[1], importancies[1].ImportanceName, importancies[1], criterias[0].Id, criterias[0], timeRules[2].Id, timeRules[0], "step 1", tasks[2], tasks[2].Id, 5),
                Step.CreateStep(DateTime.Now, DateTime.Now.AddDays(30), urgencies[2].UrgencyName, urgencies[2], importancies[0].ImportanceName, importancies[0], criterias[0].Id, criterias[0], timeRules[3].Id, timeRules[0], "step 1", tasks[2], tasks[2].Id, 6),
                Step.CreateStep(DateTime.Now, DateTime.Now.AddDays(30), urgencies[0].UrgencyName, urgencies[0], importancies[1].ImportanceName, importancies[1], criterias[0].Id, criterias[0], timeRules[0].Id, timeRules[0], "step 1", tasks[2], tasks[2].Id, 7),
                Step.CreateStep(DateTime.Now, DateTime.Now.AddDays(30), urgencies[1].UrgencyName, urgencies[1], importancies[2].ImportanceName, importancies[2], criterias[2].Id, criterias[2], timeRules[1].Id, timeRules[0], "step 1", tasks[3], tasks[3].Id, 0),
                Step.CreateStep(DateTime.Now, DateTime.Now.AddDays(30), urgencies[0].UrgencyName, urgencies[0], importancies[0].ImportanceName, importancies[0], criterias[0].Id, criterias[0], timeRules[2].Id, timeRules[0], "step 1", tasks[3], tasks[3].Id, 1),
                Step.CreateStep(DateTime.Now, DateTime.Now.AddDays(30), urgencies[2].UrgencyName, urgencies[2], importancies[2].ImportanceName, importancies[2], criterias[1].Id, criterias[1], timeRules[3].Id, timeRules[0], "step 1", tasks[3], tasks[3].Id, 2),
                Step.CreateStep(DateTime.Now, DateTime.Now.AddDays(30), urgencies[0].UrgencyName, urgencies[0], importancies[1].ImportanceName, importancies[1], criterias[0].Id, criterias[0], timeRules[0].Id, timeRules[0], "step 1", tasks[3], tasks[3].Id, 3),
                Step.CreateStep(DateTime.Now, DateTime.Now.AddDays(30), urgencies[2].UrgencyName, urgencies[2], importancies[0].ImportanceName, importancies[0], criterias[0].Id, criterias[0], timeRules[1].Id, timeRules[0], "step 1", tasks[3], tasks[3].Id, 4),
                Step.CreateStep(DateTime.Now, DateTime.Now.AddDays(30), urgencies[1].UrgencyName, urgencies[1], importancies[1].ImportanceName, importancies[1], criterias[2].Id, criterias[2], timeRules[2].Id, timeRules[0], "step 1", tasks[3], tasks[3].Id, 5),
                Step.CreateStep(DateTime.Now, DateTime.Now.AddDays(30), urgencies[0].UrgencyName, urgencies[0], importancies[2].ImportanceName, importancies[2], criterias[0].Id, criterias[0], timeRules[3].Id, timeRules[0], "step 1", tasks[3], tasks[3].Id, 6),
                Step.CreateStep(DateTime.Now, DateTime.Now.AddDays(30), urgencies[1].UrgencyName, urgencies[1], importancies[0].ImportanceName, importancies[0], criterias[0].Id, criterias[0], timeRules[0].Id, timeRules[0], "step 1", tasks[3], tasks[3].Id, 7)
            };
        }