Example #1
0
        public async Task <IActionResult> Create(int?id)
        {
            var workPackage = await _context.WorkPackages.FindAsync(id);

            var uid = (await _usermanager.GetUserAsync(User)).Id;
            var isResponsibleEngineer = _context.ProjectEmployees.Where(e => e.WorkPackageId == workPackage.WorkPackageId &&
                                                                        e.Role == ProjectEmployee.RESPONSIBLE_ENGINEER).FirstOrDefault() != null;

            if (User.IsInRole("AD") || isResponsibleEngineer)
            {
                var project = _context.Projects.Where(m => m.ProjectId == workPackage.ProjectId).FirstOrDefault();

                var manager = _context.ProjectEmployees
                              .Where(e => e.ProjectId == project.ProjectId && e.Role == ProjectEmployee.PROJECT_MANAGER)
                              .FirstOrDefault();
                if (manager != null)
                {
                    var projectManager = _context.Employees.Where(e => e.Id == manager.EmployeeId).FirstOrDefault();
                    TempData["projectManager"] = projectManager.FirstName + " " + projectManager.LastName;
                }

                var assistant = _context.ProjectEmployees
                                .Where(e => e.ProjectId == project.ProjectId && e.Role == ProjectEmployee.PROJECT_ASSISTANT)
                                .FirstOrDefault();
                if (assistant != null)
                {
                    var projectManagerAssistant = _context.Employees.Where(e => e.Id == assistant.EmployeeId).FirstOrDefault();
                    TempData["projectManagerAssistant"] = projectManagerAssistant.FirstName + " " + projectManagerAssistant.LastName;
                }

                var responsibleEngineer = _context.ProjectEmployees
                                          .Where(e => e.ProjectId == project.ProjectId && e.Role == ProjectEmployee.RESPONSIBLE_ENGINEER)
                                          .FirstOrDefault();
                if (responsibleEngineer != null)
                {
                    var projectresponsibleEngineer = _context.Employees.Where(e => e.Id == responsibleEngineer.EmployeeId).FirstOrDefault();
                    TempData["projectResponsibleEngineer"] = projectresponsibleEngineer.FirstName + " " + projectresponsibleEngineer.LastName;
                }

                TempData["projectName"]     = project.Name;
                TempData["workPackageName"] = workPackage.Name;

                TempData["projectCode"]     = project.ProjectCode;
                TempData["workPackageCode"] = workPackage.WorkPackageCode;

                TempData["projectId"]         = workPackage.ProjectId;
                TempData["workPackageStatus"] = workPackage.Status;

                ResponsibleEngineerReport respEngReport = new ResponsibleEngineerReport
                {
                    WeekNumber    = Utility.GetWeekNumberByDate(DateTime.Today),
                    WorkPackageId = id,
                    WorkPackage   = workPackage
                };

                var payGrades = await _context.PayGrades.ToListAsync();

                var budgets = await _context.Budgets.Where(u => u.WorkPackageId == workPackage.WorkPackageId).ToListAsync();

                var timeSheets = from ts in _context.Timesheets
                                 join tsr in _context.TimesheetRows
                                 on ts.TimesheetId equals tsr.TimesheetId into joined
                                 from tsr in joined.DefaultIfEmpty()
                                 select new {
                    SatHour       = tsr.SatHour,
                    SunHour       = tsr.SunHour,
                    MonHour       = tsr.MonHour,
                    TueHour       = tsr.TueHour,
                    WedHour       = tsr.WedHour,
                    ThuHour       = tsr.ThuHour,
                    FriHour       = tsr.FriHour,
                    WeekNumber    = ts.WeekNumber,
                    EmployeePayId = ts.EmployeePayId,
                    WorkPackageId = tsr.WorkPackageId
                };

                var timeSheetsEP = from ts in timeSheets
                                   join ep in _context.EmployeePays
                                   on ts.EmployeePayId equals ep.EmployeePayId into joined
                                   from ep in joined.DefaultIfEmpty()
                                   select new {
                    SatHour       = ts.SatHour,
                    SunHour       = ts.SunHour,
                    MonHour       = ts.MonHour,
                    TueHour       = ts.TueHour,
                    WedHour       = ts.WedHour,
                    ThuHour       = ts.ThuHour,
                    FriHour       = ts.FriHour,
                    WeekNumber    = ts.WeekNumber,
                    EmployeePayId = ts.EmployeePayId,
                    WorkPackageId = ts.WorkPackageId,
                    PayGradeId    = ep.PayGradeId
                };

                //All Weeks
                var timeSheetsAllWeeks = await timeSheetsEP.Where(ts => ts.WorkPackageId == workPackage.WorkPackageId).ToListAsync();

                var timeSheetsAllWeeksDictionary = timeSheetsAllWeeks.ToDictionary(ts => ts.PayGradeId);
                //This Week
                var timeSheetsThisWeek = await timeSheetsEP.Where(ts => ts.WorkPackageId == workPackage.WorkPackageId && ts.WeekNumber == respEngReport.WeekNumber).ToListAsync();

                var timeSheetsThisWeekDictionary = timeSheetsThisWeek.ToDictionary(ts => ts.PayGradeId);

                ArrayList pLevels = new ArrayList();
                ArrayList planned = new ArrayList();
                ArrayList spentTD = new ArrayList();
                ArrayList spentTW = new ArrayList();
                ArrayList needed  = new ArrayList();

                var totalBudget   = 0.0;
                var workCompleted = 0.0;

                pLevels.Add("P-Level");
                planned.Add("Planned (Budget Total)");
                spentTD.Add("Spent (To Date)");
                spentTW.Add("Spent (This Week)");
                needed.Add("Needed/Remaining (Input)");

                double[] spentToDate   = new double[payGrades.Count];
                double[] spentThisWeek = new double[payGrades.Count];

                foreach (var ts in timeSheetsAllWeeksDictionary)
                {
                    var sum = ts.Value.SatHour +
                              ts.Value.SunHour +
                              ts.Value.MonHour +
                              ts.Value.TueHour +
                              ts.Value.WedHour +
                              ts.Value.ThuHour +
                              ts.Value.FriHour;
                    var index = payGrades.IndexOf(payGrades.Find(pg => pg.PayGradeId == ts.Value.PayGradeId));
                    spentToDate[index] += sum;
                    workCompleted      += workCompleted;
                }
                ;

                foreach (var ts in timeSheetsThisWeekDictionary)
                {
                    var sum = ts.Value.SatHour +
                              ts.Value.SunHour +
                              ts.Value.MonHour +
                              ts.Value.TueHour +
                              ts.Value.WedHour +
                              ts.Value.ThuHour +
                              ts.Value.FriHour;
                    var index = payGrades.IndexOf(payGrades.Find(pg => pg.PayGradeId == ts.Value.PayGradeId));
                    spentThisWeek[index] += sum;
                }
                ;

                payGrades.ForEach(pg => {
                    pLevels.Add(pg.PayLevel);

                    if (budgets == null)
                    {
                        planned.Add("0");
                    }
                    else if (budgets.Any(
                                 b => b.PayGradeId == pg.PayGradeId &&
                                 b.Status == Budget.VALID &&
                                 b.Type == Budget.ESTIMATE))
                    {
                        var budg = budgets.Find(
                            b => b.PayGradeId == pg.PayGradeId &&
                            b.Status == Budget.VALID &&
                            b.Type == Budget.ESTIMATE).REHour;

                        planned.Add(budg.ToString("N"));
                        totalBudget += budg;
                    }
                    else
                    {
                        planned.Add("0");
                    }

                    for (int i = 0; i < spentToDate.Length; i++)
                    {
                        spentTD.Add(spentToDate[i].ToString("N"));
                    }

                    for (int i = 0; i < spentThisWeek.Length; i++)
                    {
                        spentTW.Add(spentThisWeek[i].ToString("N"));
                    }
                });

                //Grab last weeks responsible Engineers report
                if (_context.ResponsibleEngineerReport != null)
                {
                    var lastWeekREReport = _context.ResponsibleEngineerReport
                                           .Where(re => re.WorkPackageId == workPackage.WorkPackageId &&
                                                  re.WeekNumber == (respEngReport.WeekNumber - 1)).FirstOrDefault();

                    TempData["startPer"] = lastWeekREReport != null ? lastWeekREReport.CompletedPercentage : 0;
                }

                if (totalBudget <= 0 || workCompleted <= 0)
                {
                    TempData["compPer"] = 0;
                }
                else
                {
                    var compPer = 100 * (workCompleted / totalBudget > 1 ? 1 : workCompleted / totalBudget);
                    TempData["compPer"] = compPer;
                }

                ViewBag.tableLength = pLevels.Count;
                ViewBag.pLevels     = pLevels;
                ViewBag.planned     = planned;
                ViewBag.spentTD     = spentTD;
                ViewBag.spentTW     = spentTW;
                ViewBag.needed      = needed;

                return(View(respEngReport));
            }
            TempData["ErrorMessage"] = "Do not have permission to create a responsible engineer's report.";
            return(RedirectToAction("Reports", "ResponsibleEngineerReports", new { id = workPackage.WorkPackageId }));
        }
Example #2
0
        public async Task <IActionResult> Create([Bind("WeekNumber,WorkPackageId,WorkPackage,Comments,WorkAccomplished,WorkPlanned,Problem,ProblemAnticipated,StartingPercentage,CompletedPercentage,ResponsibleEngineerEstimate")] ResponsibleEngineerReport report)
        {
            var workPackage = await _context.WorkPackages.FindAsync(report.WorkPackageId);

            var uid = (await _usermanager.GetUserAsync(User)).Id;
            var isResponsibleEngineer = _context.ProjectEmployees.Where(e => e.WorkPackageId == workPackage.WorkPackageId &&
                                                                        e.Role == ProjectEmployee.RESPONSIBLE_ENGINEER).FirstOrDefault() != null;

            if (ModelState.IsValid && (User.IsInRole("AD") || isResponsibleEngineer))
            {
                var project        = _context.Projects.Where(m => m.ProjectId == workPackage.ProjectId).FirstOrDefault();
                var sameWeekReport = _context.ResponsibleEngineerReport
                                     .Where(re => re.WorkPackageId == report.WorkPackageId &&
                                            re.WeekNumber == report.WeekNumber).FirstOrDefault();

                //Invalid if there has already been a REreport created for this week.
                if (sameWeekReport != null)
                {
                    TempData["ErrorMessage"] = "Responsible Engineer Report already created for this week.";
                    return(RedirectToAction("Reports", "ResponsibleEngineerReports", new { id = report.WorkPackageId }));
                }

                //Invalid if project is closed
                if (project.Status != Project.ONGOING)
                {
                    TempData["ErrorMessage"] = "Cannot create Responsible Engineer Report for closed project.";
                    return(RedirectToAction("Reports", "ResponsibleEngineerReports", new { id = report.WorkPackageId }));
                }

                //Invalid if work package is closed
                if (workPackage.Status != WorkPackage.OPENED)
                {
                    TempData["ErrorMessage"] = "Cannot create Responsible Engineer Report for closed work packages.";
                    return(RedirectToAction("Reports", "ResponsibleEngineerReports", new { id = report.WorkPackageId }));
                }

                //Invalid if work package is a parent
                var parentWorkPackageTest = _context.WorkPackages.Where(m => m.ParentWorkPackageId == workPackage.WorkPackageId && m.Status != WorkPackage.CLOSED).FirstOrDefault();
                if (parentWorkPackageTest != null)
                {
                    TempData["ErrorMessage"] = "Can only create Responsible Engineer Report for leaf work packages.";
                    return(RedirectToAction("Reports", "ResponsibleEngineerReports", new { id = report.WorkPackageId }));
                }

                report.Status = ResponsibleEngineerReport.VALID;

                JObject json = JObject.Parse(report.ResponsibleEngineerEstimate);

                bool workPackageNotCompleted = false;

                foreach (var p in json.Properties())
                {
                    if ((int)p.Value != 0)
                    {
                        workPackageNotCompleted = true;
                    }
                }

                if (report.CompletedPercentage == 100 && workPackageNotCompleted)
                {
                    report.CompletedPercentage = 99;
                }

                _context.Add(report);

                _context.SaveChanges();

                await _context.SaveChangesAsync();

                return(RedirectToAction("ReportDetails", "ResponsibleEngineerReports", new { id = report.ResponsibleEngineerReportId }));
            }
            TempData["ErrorMessage"] = "Do not have permission to create a responsible engineer's report.";
            return(RedirectToAction("Reports", "ResponsibleEngineerReports", new { id = report.WorkPackageId }));
        }