Пример #1
0
        public CalculateSalaryView()
        {
            InitializeComponent();
            CalculateSalaryViewModel viewModel = new CalculateSalaryViewModel();

            this.DataContext = viewModel;
        }
Пример #2
0
        public IActionResult CalculateSalary(CalculateSalaryFilter filter)
        {
            var model = new CalculateSalaryViewModel();

            model.Filter      = filter;
            model.Departments = _repository.Departments.ToArray()
                                .Select(i => new SelectListItem()
            {
                Text = i.Name, Value = i.Id.ToString()
            });
            model.EmployeeItems = _repository.Employees.ToArray()
                                  .Select(i => new SelectListItem {
                Text = i.Name, Value = i.Id.ToString()
            });
            model.Months = Enumerable.Range(1, 12).Select(i => new SelectListItem
            {
                Text = DateTimeFormatInfo.CurrentInfo.GetMonthName(i), Value = i.ToString()
            });

            var minYear = _repository.Employees.Min(e => e.EmploymentStartDate);

            model.Years = Enumerable.Range(minYear.Year, DateTime.Now.Year - minYear.Year + 1)
                          .Select(i => new SelectListItem {
                Text = i.ToString(), Value = i.ToString()
            });

            if (!ModelState.IsValid)
            {
                return(View(model));
            }

            var periodStart = new DateTime(filter.Year.Value, filter.Month.Value, 1);
            var periodEnd   = periodStart.AddMonths(1).AddSeconds(-1);

            var employees = _repository.Employees.Include(e => e.TimeReports).Include(e => e.SalesDeals)
                            .Where(e => e.EmploymentStartDate <= periodStart && e.IsActive);

            if (filter.DepartmentId.HasValue)
            {
                employees = employees.Where(e => e.DepartmentId == filter.DepartmentId.Value);
            }

            if (filter.EmployeeId.HasValue)
            {
                employees = employees.Where(e => e.Id == filter.EmployeeId.Value);
            }

            var employeeItems = employees.ToArray();

            var employeeModels = new List <CalculateSalaryEmployeeItem>();

            foreach (var employee in employeeItems)
            {
                if (employee.Type == EmployeeType.Manager)
                {
                    var time = employee.TimeReports.Where(t => t.Date >= periodStart && t.Date < periodEnd).ToArray();

                    var monthlySalary = employee.ManagerMonthlySalary.Value;

                    var vacationDays  = time.Where(t => t.Type == TimeReportType.Vacation);
                    var managerSalary = monthlySalary
                                        + vacationDays.Count() * (monthlySalary / 20) * 1.2M
                                        - vacationDays.Count() * (monthlySalary / 20);

                    var sickDays = time.Where(t => t.Type == TimeReportType.SickDay);
                    managerSalary = managerSalary
                                    + sickDays.Count() * (monthlySalary / 20) * 0.8M
                                    - sickDays.Count() * (monthlySalary / 20);

                    employeeModels.Add(new CalculateSalaryEmployeeItem {
                        Name = employee.Name, Department = employee.Department.Name, Type = employee.Type, Salary = managerSalary
                    });
                }
                else if (employee.Type == EmployeeType.Standard)
                {
                    var time = employee.TimeReports.Where(t => t.Date >= periodStart && t.Date < periodEnd).ToArray();

                    var monthlySalary = employee.StandardMonthlySalary.Value;

                    var vacationDays   = time.Where(t => t.Type == TimeReportType.Vacation);
                    var standardSalary = monthlySalary
                                         + vacationDays.Count() * (monthlySalary / 20) * 1.2M
                                         - vacationDays.Count() * (monthlySalary / 20);

                    var sickDays = time.Where(t => t.Type == TimeReportType.SickDay);
                    standardSalary = standardSalary
                                     + sickDays.Count() * (monthlySalary / 20) * 0.8M
                                     - sickDays.Count() * (monthlySalary / 20);

                    employeeModels.Add(new CalculateSalaryEmployeeItem {
                        Name = employee.Name, Department = employee.Department.Name, Type = employee.Type, Salary = standardSalary
                    });
                }
                else if (employee.Type == EmployeeType.Sales)
                {
                    var time = employee.TimeReports.Where(t => t.Date >= periodStart && t.Date < periodEnd).ToArray();

                    var monthlyBaseSalary = employee.SalesBaseSalary.Value;

                    var vacationDays = time.Where(t => t.Type == TimeReportType.Vacation);
                    var baseSalary   = monthlyBaseSalary
                                       + vacationDays.Count() * (monthlyBaseSalary / 20) * 1.2M
                                       - vacationDays.Count() * (monthlyBaseSalary / 20);

                    var sickDays = time.Where(t => t.Type == TimeReportType.SickDay);
                    baseSalary = baseSalary
                                 + sickDays.Count() * (monthlyBaseSalary / 20) * 0.8M
                                 - sickDays.Count() * (monthlyBaseSalary / 20);

                    var deals = employee.SalesDeals.Where(d => d.AgreementDate >= periodStart && d.AgreementDate < periodEnd).ToArray();

                    var totalDealsPrice = deals.Sum(d => d.Price);

                    var provisionSalary = (decimal)employee.SalesProvision.Value / 100 * totalDealsPrice;

                    employeeModels.Add(new CalculateSalaryEmployeeItem {
                        Name = employee.Name, Department = employee.Department.Name, Type = employee.Type, Salary = baseSalary + provisionSalary
                    });
                }
                else if (employee.Type == EmployeeType.Hourly)
                {
                    var time = employee.TimeReports.Where(t => t.Date >= periodStart && t.Date < periodEnd).ToArray();

                    var hourlySalary = employee.HourlySalary.Value;

                    var workedHours = time.Where(t => t.Type == TimeReportType.WorkingHours);

                    var monthlySalary = hourlySalary * workedHours.Sum(h => h.WorkingHours.Value);

                    employeeModels.Add(new CalculateSalaryEmployeeItem {
                        Name = employee.Name, Department = employee.Department.Name, Type = employee.Type, Salary = monthlySalary
                    });
                }
                else if (employee.Type == EmployeeType.Intern)
                {
                    employeeModels.Add(new CalculateSalaryEmployeeItem {
                        Name = employee.Name, Department = employee.Department.Name, Type = employee.Type, Salary = 0
                    });
                }
            }

            model.Employees = employeeModels;

            return(View(model));
        }