using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using EnVisage.Code; using EnVisage.Code.Cache; using EnVisage.Models; namespace EnVisage.Controllers { public class SingleResQtiesOrCostByTimeController : BaseController { public enum GraphType{ General = 0, Probability =1 } const string CG = "CG"; const string EFX = "EFX"; // GET: /ShowRollUp/ [AreaSecurityAttribute(area = Areas.Reports, level = AccessLevel.Read)] public ActionResult Index() { var model = new SingleResQtiesOrCostByTimeModel(); model.ExpenditureItems = GetExpenditureCategories(); model.SelectedExpenditureItems = "[" + string.Join(",", model.ExpenditureItems.Select(x => "\"" + x.Id.ToString() + "\"").ToArray()) + "]"; model.FormScenarioReport(DbContext); var l = new List(); foreach (var s in model.Scenarios) { l.Add(s.Id); } model.SelectedScenarios = "[" + string.Join(",", l.Select(x=>"\"" + x.ToString() + "\"").ToArray()) + "]"; model.FormСhartListElements(DbContext); var user = new UsersCache().Value.FirstOrDefault(x => x.Id == new Guid(HttpContext.User.Identity.GetID())); if (user != null) ViewBag.IsUOMHours = !user.PreferredResourceAllocation; return View(model); } [HttpPost] [AreaSecurityAttribute(area = Areas.Reports, level = AccessLevel.Read)] public ActionResult Index(SingleResQtiesOrCostByTimeModel model) { ModelState.Clear(); model.FormScenarioReport(DbContext); model.FormСhartListElements(DbContext); model.ExpenditureItems = GetExpenditureCategories(); return PartialView("_filter", model); } [HttpPost] [AreaSecurityAttribute(area = Areas.Reports, level = AccessLevel.Read)] public ActionResult Filter(SingleResQtiesOrCostByTimeModel model) { model.FormScenarioReport(DbContext); model.FormСhartListElements(DbContext); return View(model); } [HttpPost] [AreaSecurityAttribute(area = Areas.Reports, level = AccessLevel.Read)] public JsonResult GetGraphData(DateTime? StartDate, DateTime? EndDate, bool cost, List selectedScenarios, List selectedExpenditureItems, GraphType graphType, ScenarioType type, Guid? groupId, string SystemAttributeOne, string SystemAttributeTwo, bool? isUOMHours) { if (selectedScenarios == null) selectedScenarios = new List(); if (selectedExpenditureItems == null) selectedExpenditureItems = new List(); SingleResQtiesOrCostByTimeDataModel result = new SingleResQtiesOrCostByTimeDataModel(); StartDate = StartDate ?? DateTime.Now.AddMonths(-3); EndDate = EndDate ?? DateTime.Now.AddMonths(3); var model = new SingleResQtiesOrCostByTimeModel() { StartDate = StartDate.Value, EndDate = EndDate.Value, SelectedExpenditureItems = "[" + string.Join(",", selectedExpenditureItems.Select(x => x.ToString()).ToArray()) + "]", SelectedScenarioType= type, GroupId = groupId, SystemAttribute1 = SystemAttributeOne, SystemAttribute2 = SystemAttributeTwo, UOMSwitcherMode = isUOMHours }; model.FormScenarioReport(DbContext); selectedScenarios.RemoveAll(x => !model.Scenarios.Select(s => s.Id).Contains(x)); model.SelectedScenarios = "[" + string.Join(",", selectedScenarios.Select(x => x.ToString()).ToArray()) + "]"; //model.SelectedCapacityId = Guid.Parse("{B04238F5-32A6-4EA2-A4E7-22D64439229A}"); model.FormСhartListElements(DbContext); var days = EndDate.Value.Subtract(StartDate.Value).TotalDays; var periodType = (int)FiscalCalendarModel.FiscalYearType.Week; if (days > 400) periodType = (int)FiscalCalendarModel.FiscalYearType.Month; var weeks = DbContext.FiscalCalendars .Where(t => t.Type == periodType && t.EndDate <= EndDate && t.EndDate >= StartDate && t.AdjustingPeriod == false) .OrderBy(t => t.EndDate) .ToArray(); var gridHeaders = weeks.Select(t => t.EndDate).ToList(); foreach (var s in model.Scenarios.Where(t => selectedScenarios.Contains(t.Id) && t.StartDate <= model.EndDate && t.EndDate >= model.StartDate)) { result.SingleResQtiesOrCostByTime.Add(new SingleResQtiesOrCostByTimeDataModel.SingleResQtiesOrCostByTimeDataRow() { ScenarioName = s.Name, ProjectName = s.ProjectName, QuantityValues = new List(), CostValues = new List() }); } List ScenarioTypes = new List(); result.SingleResQtiesOrCostByTime.Add(new SingleResQtiesOrCostByTimeDataModel.SingleResQtiesOrCostByTimeDataRow() { ScenarioName = ScenarioType.TeamActualCapacity.ToDisplayValue(), ProjectName = ScenarioType.TeamActualCapacity.ToDisplayValue(), ScenarioDisplayName = "Actual Capacity", }); ScenarioTypes.Add(ScenarioType.TeamActualCapacity); result.SingleResQtiesOrCostByTime.Add(new SingleResQtiesOrCostByTimeDataModel.SingleResQtiesOrCostByTimeDataRow() { ScenarioName = ScenarioType.TeamPlannedCapacity.ToDisplayValue(), ProjectName = ScenarioType.TeamPlannedCapacity.ToDisplayValue(), ScenarioDisplayName = "Planned Capacity", }); ScenarioTypes.Add(ScenarioType.TeamPlannedCapacity); result.SingleResQtiesOrCostByTime.Add(new SingleResQtiesOrCostByTimeDataModel.SingleResQtiesOrCostByTimeDataRow() { ScenarioName = ScenarioType.Vacation.ToDisplayValue(), ProjectName = ScenarioType.Vacation.ToDisplayValue(), ScenarioDisplayName = "Vacations", }); ScenarioTypes.Add(ScenarioType.Vacation); result.SingleResQtiesOrCostByTime.Add(new SingleResQtiesOrCostByTimeDataModel.SingleResQtiesOrCostByTimeDataRow() { ScenarioName = ScenarioType.Training.ToDisplayValue(), ProjectName = ScenarioType.Training.ToDisplayValue(), ScenarioDisplayName = "Trainings", }); ScenarioTypes.Add(ScenarioType.Training); for (int i = 0; i < weeks.Count(); i++) { var endDate = weeks[i].EndDate; foreach (var s in ScenarioTypes) { decimal qty_val = 0; decimal cost_val = 0; if (model.ChartData.ContainsKey(s.ToDisplayValue())) { var scenario = model.ChartData[s.ToDisplayValue()]; var chartVals = new List(); if (ScenarioType.Vacation.GetHashCode().Equals(scenario.FirstOrDefault().ScenarioType) || ScenarioType.Training.GetHashCode().Equals(scenario.FirstOrDefault().ScenarioType)) chartVals = scenario.Where(t => endDate >= t.WeekEndingDate && t.WeekEndingDate >= endDate.AddDays(-6)).ToList(); else chartVals = scenario.Where(t => endDate.ToShortDateString().Equals(t.WeekEndingDate.ToShortDateString())).ToList(); qty_val = (decimal)chartVals.Select(x=>x.Quantity).Sum(); if (graphType == GraphType.Probability) // && CG.Equals(chartVal.CGEFX.Trim())) { //qty_val = Convert.ToDecimal(qty_val * chartVal.Probability); qty_val = Convert.ToDecimal(Math.Round((decimal)chartVals.Where(chartVal => CG.Equals(chartVal.CGEFX.Trim())). Select(chartVal => chartVal.Quantity * chartVal.Probability).Sum(), 2)); } cost_val = Math.Round((decimal)chartVals.Select(x => x.Cost).Sum(), 2); if (graphType == GraphType.Probability) // && CG.Equals(chartVal.CGEFX.Trim())) { cost_val = Convert.ToDecimal(Math.Round((decimal)chartVals.Where(chartVal=>CG.Equals(chartVal.CGEFX.Trim())). Select(chartVal => chartVal.Cost * chartVal.Probability).Sum(), 2)); } } var item = result.SingleResQtiesOrCostByTime.FirstOrDefault(x => x.ProjectName.Equals(s.ToDisplayValue())); item.QuantityValues.Add(qty_val); item.ScenarioType = s.ToDisplayValue(); item.CostValues.Add(cost_val); } foreach (var s in model.Scenarios.Where(t => selectedScenarios.Contains(t.Id) && t.StartDate <= model.EndDate && t.EndDate >= model.StartDate)) { decimal qty_val = 0; decimal cost_val = 0; if (model.ChartData.ContainsKey(s.ProjectName)) { var projectData = model.ChartData[s.ProjectName]; var chartVals = projectData.Where(t => endDate.ToShortDateString().Equals(t.WeekEndingDate.ToShortDateString())).ToList(); qty_val = (decimal)chartVals.Select(x => x.Quantity).Sum(); if (graphType == GraphType.Probability) // && CG.Equals(chartVal.CGEFX.Trim())) { //qty_val = Convert.ToDecimal(qty_val * chartVal.Probability); qty_val = Convert.ToDecimal(Math.Round((decimal)chartVals.Where(chartVal => CG.Equals(chartVal.CGEFX.Trim())). Select(chartVal => chartVal.Quantity * chartVal.Probability).Sum(), 2)); } cost_val = Math.Round((decimal)chartVals.Select(x => x.Cost).Sum(), 2); if (graphType == GraphType.Probability) // && CG.Equals(chartVal.CGEFX.Trim())) { cost_val = Convert.ToDecimal(Math.Round((decimal)chartVals.Where(chartVal => CG.Equals(chartVal.CGEFX.Trim())). Select(chartVal => chartVal.Cost * chartVal.Probability).Sum(), 2)); } } var items = result.SingleResQtiesOrCostByTime.Where(x => x.ProjectName.Equals(s.ProjectName)).ToList(); items.ForEach(x => x.QuantityValues.Add(qty_val)); items.ForEach(x => x.CostValues.Add(cost_val)); items.ForEach(x => x.Probability = (s.Probability != null ? (int)(s.Probability*100) : 0)); } } result.FiscalCalendarRecordHeaders = gridHeaders.Select(t=>t.ToShortDateString()).ToList(); result.FiscalCalendarRecordMilliseconds = gridHeaders.Select(t => (long)t.Subtract(Constants.UnixEpochDate).TotalMilliseconds).ToList(); return Json(result, JsonRequestBehavior.AllowGet); } public IList GetExpenditureCategories() { //if (templateId == null || templateId == Guid.Empty) // return new ScenarioModel.ExpenditureItem[0]; var list = new List(); var categories = DbContext.VW_ExpCategoriesInScenario.ToArray(); var lstIds = categories.Select(t => t.Id).ToList(); var arrCalculatedIds = categories.Where(t => t.UseType == (int)ExpenditureCategoryModel.UseTypes.Calculated).Select(t => t.Id).ToArray(); if (arrCalculatedIds.Length > 0) { foreach (var item in DbContext.VW_Expenditure2Calculation.Where(t => arrCalculatedIds.Contains(t.ParentId))) { if (!lstIds.Contains(item.ExpenditureCategoryID)) lstIds.Add(item.ExpenditureCategoryID); } } // add not checked expenditure categories for Labor/Materials/Usage types list.AddRange(DbContext.VW_Expenditure2Category.Where(t => !lstIds.Contains(t.Id)) .OrderBy(t => t.Type) .ThenBy(t => t.ExpCategoryWithCcName) // SA. ENV-756 .Select(t => new { t.Id, t.ExpCategoryWithCcName, // SA. ENV-756. ENV-839 t.Type }).ToArray() .Select(t => new SingleResQtiesOrCostByTimeModel.ExpenditureItem { Id = t.Id, Group = ((ExpenditureCategoryModel.CategoryTypes)(t.Type ?? 0)).ToDisplayValue(), Name = t.ExpCategoryWithCcName, // SA. ENV-756. ENV-839 Checked = false })); // add checked expenditure categories from template list.AddRange(DbContext.VW_Expenditure2Category.Where(t => lstIds.Contains(t.Id)) .OrderBy(t => t.ExpCategoryWithCcName) // SA. ENV-756 .Select(t => new SingleResQtiesOrCostByTimeModel.ExpenditureItem { Id = t.Id, Group = "In Scenarios", Name = t.ExpCategoryWithCcName, // SA. ENV-756. ENV-839 Checked = true }).ToArray()); return list; } } }