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); }
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); }
/// <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); } } }
/// <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(); } }
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); }
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); }
/// <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(); } }
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); } } } }
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); }
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); }
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); } }