Exemplo n.º 1
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);
                }
            }
        }
Exemplo n.º 2
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);
        }
Exemplo n.º 3
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);
        }