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