public ActionResult GenerateReport()
        {
            const string reportNameColumn = "Имя";
            const string reportSalaryColumn = "Заработная плата";
            const string reportTaxColumn = "Сумма налога на з/п";
            const string reportTaxAfterSalaryColumn = "Заработная плата с вычетом налога";

            var reportsLines = new List<string> { string.Format("{0, -30} | {1, -20} | {2, -20} | {3, -20}", reportNameColumn, reportSalaryColumn, reportTaxColumn, reportTaxAfterSalaryColumn) };
            double salaries = 0;
            double tax = 0;
            double salariesAfterTax = 0;
            using (var db = new Dl.CompanyContext())
            {
                var activeEmployees = db.Employees.Where(e => e.IsActive).OrderBy(e => e.Name);
                foreach (var item in activeEmployees)
                {
                    salaries += item.Salary;
                    salariesAfterTax += item.GetSalaryAfterTax();
                    tax += item.GetTax();
                    reportsLines.Add(string.Format("{0, -30} | {1, -20} | {2, -20} | {3, -20}", item.Name, item.Salary, item.GetTax(), item.GetSalaryAfterTax()));
                }
            }
            reportsLines.Add(string.Format("{0, -30} | {1, -20} | {2, -20} | {3, -20}", "Итого", salaries, tax, salariesAfterTax));
            return File(Encoding.UTF8.GetBytes(string.Join("\r\n", reportsLines)), "text/plain", "report.txt");
        }
        public string CreateEmployee(string jEmployee)
        {
            var errorResult = JsonConvert.SerializeObject(false);
            Employee incomingEmployee;
            try
            {
                incomingEmployee = JSonHelpers.DeserializeJSon<Employee>(jEmployee);
            }
            catch (Exception)
            {
                //Todo: exception not logged
                return errorResult;
            }

            if (string.IsNullOrEmpty(incomingEmployee.Name))
                return errorResult;

            if (incomingEmployee.Salary < 0)
                return errorResult;

            using (var db = new Dl.CompanyContext())
            {
                var position = db.Positions.FirstOrDefault(p => p.Id == incomingEmployee.PositionId);
                if (position == null)
                    return errorResult;

                var employee = new Employee
                {
                    Id = Guid.NewGuid(),
                    Name = incomingEmployee.Name,
                    PositionId = incomingEmployee.PositionId,
                    IsActive = incomingEmployee.IsActive,
                    Salary = incomingEmployee.Salary
                };

                try
                {
                    db.Employees.Add(employee);
                    db.SaveChanges();
                }
                catch (Exception ex)
                {
                    //Todo: exception not logged
                    return errorResult;
                }
            }
            return JsonConvert.SerializeObject(true);
        }
        public void GetEmployeePositions_Test()
        {
            using (var db = new Dl.CompanyContext())
            {
                var positions = db.Positions.OrderBy(p => p.Key).ToList();
                var jPositions = JsonConvert.SerializeObject(positions);

                EmployeeController controller = new EmployeeController();
                var actionResult = controller.GetEmployeePositions();
                Assert.IsNotNull(actionResult);
                Assert.AreEqual(jPositions, actionResult);
                var deserializedActionResult = JSonHelpers.DeserializeJSon<List<Position>>(actionResult);
                Assert.IsNotNull(deserializedActionResult);
                Assert.AreEqual(deserializedActionResult.Count, positions.Count);
            }
        }
        public void GetEmployeesByStatusAndPageNum_Test()
        {
            EmployeeController controller = new EmployeeController();
            const string incomingData = "{\"PageNum\":1,\"CountPerPage\":10,\"IsActive\":true,\"ViewAll\":true}";
            var result = controller.GetEmployeesByStatusAndPageNum(incomingData);
            var deserializedResult = JSonHelpers.DeserializeJSon<EmployeeListModel>(result);
            Assert.IsNotNull(deserializedResult);
            Assert.AreEqual(deserializedResult.CountPerPage, 10);
            Assert.IsTrue(deserializedResult.IsActive);
            Assert.IsTrue(deserializedResult.ViewAll);

            using (var db = new Dl.CompanyContext())
            {
                var employeeCount = db.Employees.Count();
                Assert.AreEqual(employeeCount, deserializedResult.AllCount);
            }
        }
 public string GetEmployeePositions()
 {
     using (var db = new Dl.CompanyContext())
     {
         var result = db.Positions.OrderBy(p => p.Key).ToList();
         return JsonConvert.SerializeObject(result);
     }
 }
        public string GetEmployeesByStatusAndPageNum(string jData)
        {
            EmployeeListModel incomingData;
            try
            {
                incomingData = JSonHelpers.DeserializeJSon<EmployeeListModel>(jData);
            }
            catch (Exception)
            {
                //Todo: exception not logged
                return JsonConvert.SerializeObject(new EmployeeListModel());
            }

            using (var db = new Dl.CompanyContext())
            {
                var employees = db.Employees.AsQueryable();
                if (!incomingData.ViewAll)
                    employees = employees.Where(e => e.IsActive == incomingData.IsActive);

                var result = new EmployeeListModel
                {
                    AllCount = 0,
                    Employees = new List<Employee>(),
                    PageNum = incomingData.PageNum < 1 ? 1 : incomingData.PageNum,
                    IsActive = incomingData.IsActive,
                    ViewAll = incomingData.ViewAll,
                    CountPerPage = incomingData.CountPerPage < 0 ? 0 : incomingData.CountPerPage
                };

                result.AllCount = employees.Count();
                if (result.AllCount == 0)
                    return JsonConvert.SerializeObject(result);

                var temp =
                    from emps in
                        (employees.OrderBy(e => e.Name)
                            .Skip((result.PageNum - 1)*result.CountPerPage)
                            .Take(result.CountPerPage))
                    join pos in db.Positions
                        on emps.PositionId equals pos.Id
                    select new {em = emps, pos};

                foreach (var item in temp)
                {
                    result.Employees.Add(new Employee
                    {
                        Id = item.em.Id,
                        IsActive = item.em.IsActive,
                        Name = item.em.Name,
                        PositionId = item.em.PositionId,
                        Salary = item.em.Salary,
                        Position = new Position {Key = item.pos.Key}
                    });
                }
                return JsonConvert.SerializeObject(result);
            }
        }