Esempio n. 1
0
        public static Person FindPersonById(int personId)
        {
            Person requestdPerson = new Person();

            using (DataModelContext context = new DataModelContext())
            {
                List <Group>       groups       = context.Groups.ToList();
                List <Subordinate> subordinates = context.Subordinates.ToList();
                List <Salary>      salaries     = context.Salaries.ToList();

                requestdPerson = context.Persons.Find(personId);
            }

            return(requestdPerson);
        }
Esempio n. 2
0
        public static Person CreateTree(Person targetPerson, bool[] isPersonSalaryCalculated)
        {
            tree = new List <int>();

            Queue <Person> turn = new Queue <Person>(); //хранит сотрудников, которые подлежат проверке

            turn.Enqueue(targetPerson);                 //первый в очереди сотрудник для проверки

            Person currentPerson = new Person();

            while (turn.Count != 0)
            {
                currentPerson = turn.Dequeue();

                using (DataModelContext context = new DataModelContext())
                {
                    List <Group>       groups      = context.Groups.ToList();
                    List <Subordinate> tempSubList = context.Subordinates.ToList();

                    if (currentPerson.Subordinates.Count() > 0)
                    {
                        for (int i = 0; i < currentPerson.Subordinates.Count; i++)
                        {
                            List <Subordinate> subs = currentPerson.Subordinates.ToList();

                            if (subs[i].Group == "Salesman")
                            {
                                tree.Add(subs[i].OwnPersonId);
                            }

                            //Если зарплата для сотрудника НЕ посчитана, тогда
                            //он добавляется следующим узлом в дерево, иначе его
                            //ветвь прерывается
                            if (!isPersonSalaryCalculated[subs[i].OwnPersonId])
                            {
                                //поиск подчиненного в Таблице сотрудников по его OwnPersonId
                                //подчиненный заносится в список как следующий сотрудник для проверки
                                //на наличии своих подчиненных.
                                Person nextPerson = context.Persons.Find(subs[i].OwnPersonId);
                                turn.Enqueue(nextPerson);              //добавляет сотрудника в очередь
                            }
                        }
                    }
                }
            }

            return(currentPerson);
        }
Esempio n. 3
0
        /// <summary>
        /// Метод для расчета зарплаты всех сотрудников группы
        /// Employee
        /// </summary>
        public void CountEmployeeSalary(DateTimeOffset accountingDate)
        {
            using (DataModelContext context = new DataModelContext())
            {
                groups       = context.Groups.ToList();
                persons      = context.Persons.ToList();
                subordinates = context.Subordinates.ToList();

                List <Person> employies = persons.Where(p => p.Group.Name == "Employee").ToList();

                foreach (Person employee in employies)
                {
                    SalaryCalculators.CalculatePersonSalary(employee, accountingDate, 0);
                }
            }
        }
Esempio n. 4
0
        /// <summary>
        /// Сохраняет выбранных подчиненых в таблицу Subordinate
        /// </summary>
        private void AddSubordinate(Person subPerson, Person superviser)
        {
            using (DataModelContext context = new DataModelContext())
            {
                Subordinate subordinate = new Subordinate();

                subordinate.Name  = subPerson.Name;
                subordinate.Group = subPerson.Group.Name;

                subordinate.PersonId    = superviser.Id;
                subordinate.OwnPersonId = subPerson.Id;
                context.Persons.Attach(superviser);

                context.Subordinates.Add(subordinate);

                context.SaveChanges();
            }
        }
Esempio n. 5
0
        public static List <int> CreateTree(Person chosenPerson, int numberOfStaff)
        {
            List <int> tree = new List <int>();

            Queue <Person> turn = new Queue <Person>(); //хранит сотрудников, которые подлежат проверке

            turn.Enqueue(chosenPerson);                 //первый в очереди сотрудник для проверки

            Person person = new Person();

            while (turn.Count != 0)
            {
                person = turn.Dequeue();

                using (DataModelContext context = new DataModelContext())
                {
                    List <Group>       groups      = context.Groups.ToList();
                    List <Subordinate> tempSubList = context.Subordinates.ToList();

                    if (person.Subordinates.Count() > 0)
                    {
                        for (int i = 0; i < person.Subordinates.Count; i++)
                        {
                            var index = string.Format("{0}.{1}", person.Id, i);
                            List <Subordinate> subs = person.Subordinates.ToList();
                            //tree.Add(index, subs[i]); занимает много лишней памяти,
                            //экономней сохранять OwnPersonId подчиненного, который
                            //является его Id в таблице сотрудников

                            tree.Add(subs[i].OwnPersonId);

                            //поиск подчиненного в Таблице сотрудников
                            //подчиненный заносится в список как следующий _person для проверки
                            //на наличии своих подчиненных.
                            Person nextPerson = context.Persons.Find(subs[i].OwnPersonId);
                            turn.Enqueue(nextPerson);              //добавляет сотрудника в очередь
                        }
                    }
                }
            }

            return(tree);
        }
Esempio n. 6
0
        private void CalculateAllButton_Click(object sender, RoutedEventArgs e)
        {
            int            numberOfStaff  = persons.Last().Id + 1; // список persons формируется сразу после загрузки страницы
            DateTimeOffset accountingDate = datePickerOnSalaryPage.Date;

            List <Person>      employies = new List <Person>();
            List <Group>       groups    = new List <Group>();
            List <Subordinate> subs      = new List <Subordinate>();

            using (DataModelContext context = new DataModelContext())
            {
                groups    = context.Groups.ToList();
                employies = context.Persons.Where(p => p.Group.Name == "Employee").ToList();
                subs      = context.Subordinates.ToList();
            }


            ThirdSolution.StartCalculationsForAllPersons(accountingDate, numberOfStaff, employies[0]);
        }
        /// <summary>
        /// Возвращает зарплату подчиненных первого уровня
        /// </summary>
        /// <param name="p">Начальник</param>
        /// <param name="accountingMonth">Расчетный месяц</param>
        /// <param name="accountingYear">Расчетный год</param>
        /// <returns></returns>
        private static double CalculateFirstLevelSubWeight(Person p, string accountingMonth, string accountingYear)
        {
            double weight = 0D;

            using (DataModelContext context = new DataModelContext())
            {
                List <Salary> salaries = context.Salaries.ToList();

                foreach (Subordinate subordinate in p.Subordinates)
                {
                    Person        _person       = context.Persons.Find(subordinate.OwnPersonId);
                    List <Salary> _personSalary = _person.SalaryHistory.Where(s => s.Month == accountingMonth && s.Year == accountingYear).ToList();

                    weight += _personSalary[0].CurrentSalary;
                }
            }

            return(weight);
        }
Esempio n. 8
0
        /// <summary>
        /// Загружает данные из БД в элементы на странице расчета зарплат
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void SalaryPage_Loaded(object sender, RoutedEventArgs e)
        {
            using (DataModelContext context = new DataModelContext())
            {
                groups = context.Groups.ToList();
                groupSelectComboBox.ItemsSource       = groups;
                groupSelectComboBox.DisplayMemberPath = "Name";
                groupSelectComboBox.SelectedValue     = "Id";


                foreach (Person p in context.Persons)
                {
                    persons.Add(p);
                }

                subordinates = context.Subordinates.ToList();

                foreach (Salary s in context.Salaries)
                {
                    salaries.Add(s);
                }
            }
        }
        private static void AddSalaryToDatabase(Person p, string month, string year, double salary)
        {
            using (DataModelContext context = new DataModelContext())
            {
                var sal = p.SalaryHistory.Where(sHistory => sHistory.Month == month &&
                                                sHistory.Year == year);
                //удаляет записи от предыдущих решений
                foreach (Salary _sal in sal)
                {
                    context.Salaries.Remove(_sal);
                }

                Salary s = new Salary {
                    Month         = month,
                    Year          = year,
                    Group         = p.Group.Name,
                    CurrentSalary = salary,
                    Person        = p
                };
                context.Persons.Attach(p);
                context.Salaries.Add(s);
                context.SaveChanges();
            }
        }
Esempio n. 10
0
        public static void CreateRealTree(Person lastPerson, int numberOfPersons)
        {
            Queue <Person> turn = new Queue <Person>(); //хранит сотрудников, которые подлежат проверке

            turn.Enqueue(lastPerson);                   //первый в очереди сотрудник для проверки
            bool[] isChecked = new bool[numberOfPersons];

            while (turn.Count() != 0)
            {
                using (DataModelContext context = new DataModelContext())
                {
                    List <Group>       groups      = context.Groups.ToList();
                    List <Subordinate> tempSubList = context.Subordinates.ToList();
                    List <Salary>      salaries    = context.Salaries.ToList();

                    tree = new List <int>();



                    //Текущий сотрудник, для которого выполняется расчет зарплаты
                    Person p = context.Persons.Find(turn.Dequeue().Id);

                    //Осуществляется переход на уровень ниже, если у текущего сотрудника,
                    //есть не просчитанные подчиненные
                    if (p.Subordinates.Count > 0)
                    {
                        int i = 0; //количество подчиненных с нерасчитанными зарплатами

                        foreach (Subordinate s in p.Subordinates)
                        {
                            //Каждый подчиненный записывается в очередь, как сотрудник
                            if (isChecked[s.OwnPersonId] == false)
                            {
                                i++;
                                turn.Enqueue(context.Persons.Find(s.OwnPersonId));
                            }
                            //Если среди подчиненных оказывается Salesman, тогда
                            //из словаря достается сумма всех зарпалат подченных
                            //сотрудника из группы Salesman
                            if (s.Group == "Salesman")
                            {
                                tree.Add(s.OwnPersonId);
                            }
                        }

                        if (i != 0)
                        {
                            continue;
                        }
                    }

                    isChecked[p.Id] = true;

                    //Переход на уровень выше. Для этого текущего сотрудника находим в таблице подчиненных, поскольку
                    //в классе Subperson хранится ссылка на начальника. После чего начальник добавляется в список Stack,

                    List <Subordinate> subs = context.Subordinates.Where(s => s.OwnPersonId == p.Id).ToList();
                    if (subs.Count == 0)
                    {
                        tree.Add(p.Id);
                    }

                    //Создаем класс person в котором хранится информация о начальнике
                    Person superviser = new Person();
                    try
                    {
                        superviser = context.Persons.Find(subs[0].PersonId);
                    }
                    catch
                    {
                        continue;
                    }

                    if (!turn.Any(per => per.Id == superviser.Id))
                    {
                        turn.Enqueue(superviser);
                    }
                }
            }
        }
Esempio n. 11
0
        public static double CalculateSalary(Person lastPerson, Person targetPerson,
                                             DateTimeOffset accountingDate, bool [] isPersonSalaryCalculated)
        {
            Queue <Person> turn = new Queue <Person>(); //хранит сотрудников, которые подлежат проверке

            turn.Enqueue(lastPerson);                   //первый в очереди сотрудник для проверки

            double subsWeightTotal = 0D;
            double salary          = 0D;

            while (isPersonSalaryCalculated[targetPerson.Id] == false)
            {
                using (DataModelContext context = new DataModelContext())
                {
                    List <Group>       groups      = context.Groups.ToList();
                    List <Subordinate> tempSubList = context.Subordinates.ToList();
                    List <Salary>      salaries    = context.Salaries.ToList();


                    //Текущий сотрудник, для которого выполняется расчет зарплаты
                    Person p = context.Persons.Find(turn.Dequeue().Id);

                    //Осуществляется переход на уровень ниже, если у текущего сотрудника,
                    //есть не просчитанные подчиненные
                    if (p.Subordinates.Count > 0)
                    {
                        int i = 0; //количество подчиненных с нерасчитанными зарплатами

                        foreach (Subordinate s in p.Subordinates)
                        {
                            //Каждый подчиненный записывается в очередь, как сотрудник
                            if (isPersonSalaryCalculated[s.OwnPersonId] == false)
                            {
                                i++;
                                turn.Enqueue(context.Persons.Find(s.OwnPersonId));
                            }

                            //Если среди подчиненных оказывается Salesman, тогда
                            //из словаря достается сумма всех зарпалат подченных
                            //сотрудника из группы Salesman
                            if (s.Group == "Salesman")
                            {
                                salaryWeightDictionary.TryGetValue(s.OwnPersonId, out SalesmanMoneyBag _salaryWeight);

                                //Если текущий начальник в первый раз прибавляет
                                //сумму подчиненного Salesman-a, тогда сумма будет
                                //записана в общий котел.
                                if (!_salaryWeight.TakenById.Contains(s.PersonId))
                                {
                                    subsWeightTotal += _salaryWeight.SalesmanSalaryBag;
                                    _salaryWeight.TakenById.Add(s.PersonId);
                                    salaryWeightDictionary[s.OwnPersonId] = new SalesmanMoneyBag(s.OwnPersonId, _salaryWeight.TakenById);
                                }
                            }
                        }

                        if (i != 0)
                        {
                            continue;
                        }
                    }

                    //Иначе расчитывается зарплата текущего сотрудника и осуществляется
                    //переход на уровень выше

                    //Возвращает зарплату текущего сотрудника
                    salary           = SalaryCalculators.CalculatePersonSalary(p, accountingDate, subsWeightTotal);
                    subsWeightTotal += salary;

                    isPersonSalaryCalculated[p.Id] = true;
                    //Переход на уровень выше. Для этого текущего сотрудника находим в таблице подчиненных, поскольку
                    //в классе Subperson хранится ссылка на начальника. После чего начальник добавляется в список Stack,

                    List <Subordinate> subs = context.Subordinates.Where(s => s.OwnPersonId == p.Id).ToList();

                    //Создаем класс person в котором хранится информация о начальнике
                    Person superviser = new Person();
                    try
                    {
                        superviser = context.Persons.Find(subs[0].PersonId);
                    }
                    catch
                    {
                        continue;
                    }

                    if (!turn.Any(per => per.Id == superviser.Id))
                    {
                        turn.Enqueue(superviser);
                    }
                }
            }
            return(subsWeightTotal);
        }
Esempio n. 12
0
        public static double CalculateSalary(Person lastPerson, Person targerPerson, int numberOfStaff,
                                             DateTimeOffset accountingDate)
        {
            bool[] isPersonSalaryCalculated = new bool[numberOfStaff];
            //Stack<Person> stack = new Stack<Person>();
            //stack.Push(lastPerson);
            Queue <Person> turn = new Queue <Person>(); //хранит сотрудников, которые подлежат проверке

            turn.Enqueue(lastPerson);                   //первый в очереди сотрудник для проверки

            double subsWeightTotal = 0D;
            double salary          = 0D;

            while (isPersonSalaryCalculated[targerPerson.Id] == false)
            {
                using (DataModelContext context = new DataModelContext())
                {
                    List <Subordinate> tempSubList = context.Subordinates.ToList();
                    List <Salary>      salaries    = context.Salaries.ToList();
                    List <Group>       groups      = context.Groups.ToList();

                    Person p = context.Persons.Find(turn.Dequeue().Id);

                    //Осуществляется переход на уровень ниже, если у текущего сотрудника,
                    //есть не просчитанные подчиненные
                    if (p.Subordinates.Count > 0)
                    {
                        int i = 0; //количество подчиненных с нерасчитанными зарплатами
                        foreach (Subordinate s in p.Subordinates)
                        {
                            //Каждый подчиненный записывается в очередь, как сотрудник
                            if (isPersonSalaryCalculated[s.OwnPersonId] == false)
                            {
                                i++;
                                turn.Enqueue(context.Persons.Find(s.OwnPersonId));
                            }
                        }
                        if (i != 0)
                        {
                            continue;
                        }
                    }

                    //Иначе расчитывается зарплата текущего сотрудника и осуществляется
                    //переход на уровень выше



                    //Возвращает зарплату текущего сотрудника
                    salary = SalaryCalculators.CalculatePersonSalary(p, accountingDate, subsWeightTotal);

                    isPersonSalaryCalculated[p.Id] = true;
                    //Переход на уровень выше. Для этого текущего сотрудника находим в таблице подчиненных, поскольку
                    //в классе Subperson хранится ссылка на начальника. После чего начальник добавляется в список Stack,

                    /*  context.Subordinates.Find("OwnPersonId", p.Id);*/ //если у человека есть два начальника,
                                                                          //то тут возникнет ошибка, поэтому
                                                                          //сохраняем результат в список подчиненных

                    List <Subordinate> subs = context.Subordinates.Where(s => s.OwnPersonId == p.Id).ToList();

                    //Создаем класс person в котором хранится информация о начальнике
                    Person superviser = new Person();
                    try
                    {
                        superviser = context.Persons.Find(subs[0].PersonId);
                    }
                    catch
                    {
                        continue;
                    }

                    if (!turn.Any(per => per.Id == superviser.Id))
                    {
                        turn.Enqueue(superviser);
                    }
                }
            }
            return(salary);
        }
Esempio n. 13
0
        public void AddTestPersons()
        {
            List <String> personsList = new List <string> {
                "S", "N", "M", "E", "L", "K", "F", "D", "R", "G", "Q"
            };

            using (DataModelContext context = new DataModelContext())
            {
                List <Group> groups = context.Groups.ToList();
                Person       S      = new Person
                {
                    Name        = "S",
                    BaseSalary  = 30000,
                    Group       = groups[0] as Group,
                    Login       = "******",
                    Password    = "******",
                    DateOfStart = Convert.ToDateTime("2017-08-31 22:26:59.4535923+02:00")
                };

                Person N = new Person
                {
                    Name        = "N",
                    BaseSalary  = 23000,
                    Group       = groups[0] as Group,
                    Login       = "******",
                    Password    = "******",
                    DateOfStart = Convert.ToDateTime("2015-03-31 22:26:59.4535923+02:00")
                };

                Person M = new Person
                {
                    Name        = "М",
                    BaseSalary  = 20000,
                    Group       = groups[1] as Group,
                    Login       = "******",
                    Password    = "******",
                    DateOfStart = Convert.ToDateTime("2015-08-31 22:26:59.4535923+02:00")
                };

                Person E = new Person
                {
                    Name        = "E",
                    BaseSalary  = 13000,
                    Group       = groups[2] as Group,
                    Login       = "******",
                    Password    = "******",
                    DateOfStart = Convert.ToDateTime("2015-08-31 22:26:59.4535923+02:00")
                };

                Person L = new Person
                {
                    Name        = "L",
                    BaseSalary  = 12000,
                    Group       = groups[2] as Group,
                    Login       = "******",
                    Password    = "******",
                    DateOfStart = Convert.ToDateTime("2015-03-31 22:26:59.4535923+02:00")
                };

                Person K = new Person
                {
                    Name        = "K",
                    BaseSalary  = 15000,
                    Group       = groups[2] as Group,
                    Login       = "******",
                    Password    = "******",
                    DateOfStart = Convert.ToDateTime("2015-07-31 22:26:59.4535923+02:00")
                };

                Person F = new Person
                {
                    Name        = "F",
                    BaseSalary  = 13000,
                    Group       = groups[2] as Group,
                    Login       = "******",
                    Password    = "******",
                    DateOfStart = Convert.ToDateTime("2016-01-31 22:26:59.4535923+02:00")
                };

                Person D = new Person
                {
                    Name        = "D",
                    BaseSalary  = 23000,
                    Group       = groups[0] as Group,
                    Login       = "******",
                    Password    = "******",
                    DateOfStart = Convert.ToDateTime("2016-01-31 22:26:59.4535923+02:00")
                };

                Person R = new Person
                {
                    Name        = "R",
                    BaseSalary  = 21000,
                    Group       = groups[1] as Group,
                    Login       = "******",
                    Password    = "******",
                    DateOfStart = Convert.ToDateTime("2016-12-11 22:26:59.4535923+02:00")
                };

                Person G = new Person
                {
                    Name        = "G",
                    BaseSalary  = 21000,
                    Group       = groups[0] as Group,
                    Login       = "******",
                    Password    = "******",
                    DateOfStart = Convert.ToDateTime("2016-01-31 22:26:59.4535923+02:00")
                };

                Person Q = new Person
                {
                    Name        = "Q",
                    BaseSalary  = 21000,
                    Group       = groups[2] as Group,
                    Login       = "******",
                    Password    = "******",
                    DateOfStart = Convert.ToDateTime("2016-02-21 22:26:59.4535923+02:00")
                };

                context.Groups.Attach(S.Group);
                context.Persons.Add(S);

                context.Groups.Attach(N.Group);
                context.Persons.Add(N);

                context.Groups.Attach(M.Group);
                context.Persons.Add(M);

                context.Groups.Attach(E.Group);
                context.Persons.Add(E);

                context.Groups.Attach(L.Group);
                context.Persons.Add(L);

                context.Groups.Attach(K.Group);
                context.Persons.Add(K);

                context.Groups.Attach(F.Group);
                context.Persons.Add(F);

                context.Groups.Attach(D.Group);
                context.Persons.Add(D);

                context.Groups.Attach(R.Group);
                context.Persons.Add(R);

                context.Groups.Attach(G.Group);
                context.Persons.Add(G);

                context.Groups.Attach(Q.Group);
                context.Persons.Add(Q);

                context.SaveChanges();

                AddSubordinate(N, S);
                AddSubordinate(M, S);
                AddSubordinate(E, S);

                AddSubordinate(K, N);
                AddSubordinate(L, N);

                AddSubordinate(F, M);
                AddSubordinate(D, M);

                AddSubordinate(R, D);
                AddSubordinate(G, D);
                AddSubordinate(Q, D);
            }
        }