Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public static IEnumerable<ReportProjectModel> Create(int reportId, IEnumerable<int> userIds, DateTime startDate, DateTime endDate)
- {
- _context = FollowUpConnectionFactory.GetConnection();
- var reportProjects = _context.ReportProjects.Where(r => r.ReportID == reportId);
- var projects = new List<Project>();
- foreach (var reportProject in reportProjects)
- {
- if (reportProject.Project == null)
- projects.AddRange(_context.Projects.Where(p => p.ClientID == reportProject.ClientID));
- else
- projects.Add(reportProject.Project);
- }
- var rawData = from p in projects
- join a in _context.Articles on p.ProjectID equals a.ArticleID
- join w in _context.WorkSpecifications on p.ProjectID equals w.ProjectID
- join u in _context.Users on w.UserID equals u.UserID
- join wh in _context.WorkHours on w.WorkSpecificationID equals wh.WorkSpecificationID
- orderby p.ProjectName, a.ArticleName, w.WorkDate, u.FirstName
- where
- userIds.Contains(u.UserID)
- && wh.Hours > 0
- && w.WorkDate <= endDate
- && w.WorkDate >= startDate
- let firstOrDefault = wh.Article.Prices.FirstOrDefault(pr => pr.StartDate <= wh.WorkSpecification.WorkDate
- && (pr.EndDate ?? DateTime.MaxValue) >= wh.WorkSpecification.WorkDate)
- where firstOrDefault != null
- select new
- {
- BillableHours = wh.BillableHours ?? wh.Hours,
- Id = p.ProjectID,
- ProjectHours = wh.Hours,
- ProjectName = p.ProjectName,
- ProjectPrice = (wh.BillableHours ?? wh.Hours)* firstOrDefault.PricePerHour,
- ReportUserModels = new
- {
- BillableHours = wh.BillableHours ?? wh.Hours,
- Id = u.UserID,
- PriceForPeriod = (wh.BillableHours ?? wh.Hours) * firstOrDefault.PricePerHour,
- UserName = u.FirstName + " " + u.LastName,
- WorkedHours = wh.Hours
- }
- };
- var result = from rpm in rawData
- group rpm by new {rpm.Id, rpm.ProjectName}
- into project
- select new ReportProjectModel
- {
- Id = project.Key.Id,
- ProjectName = project.Key.ProjectName,
- BillableHours = project.Sum(p => p.BillableHours),
- ProjectHours = project.Sum(p => p.ProjectHours),
- ProjectPrice = project.Sum(p => p.ProjectPrice),
- ReportUserModels = project.GroupBy(p => new { p.ReportUserModels.Id, p.ReportUserModels.UserName }, p => p.ReportUserModels)
- .Select(rum => new ReportUserModel
- {
- Id = rum.Key.Id,
- UserName = rum.Key.UserName,
- PriceForPeriod = rum.Sum(oneUser => oneUser.PriceForPeriod),
- BillableHours = rum.Sum(oneUser => oneUser.BillableHours),
- WorkedHours = rum.Sum(oneUser => oneUser.WorkedHours)
- })
- };
- #if DEBUG
- result = result.ToArray();
- #endif
- return result;
- }
Add Comment
Please, Sign In to add comment