2534 lines
103 KiB
C#
2534 lines
103 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Globalization;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Web.Mvc;
|
|
using EnVisage.Code.BLL;
|
|
using EnVisage.Models;
|
|
using EnVisage.Models.Entities;
|
|
using System.Data.Entity;
|
|
using System.Xml.Serialization;
|
|
using System.IO;
|
|
using System.Xml;
|
|
using System.Reflection;
|
|
using System.Threading.Tasks;
|
|
using System.Web;
|
|
using EnVisage.Models.ProjectDependencies;
|
|
|
|
namespace EnVisage.Code
|
|
{
|
|
public static class Utils
|
|
{
|
|
public static Guid internalContactRoleGuid => Guid.Parse("8EB61521-56CE-4C00-9461-783C576DD110");
|
|
|
|
public static List<Guid> ColorClassificationIds = new List<Guid>();
|
|
|
|
public static string CurrentUserId()
|
|
{
|
|
var userId = HttpContext.Current?.User?.Identity?.GetID();
|
|
if (string.IsNullOrWhiteSpace(userId) || userId == Guid.Empty.ToString())
|
|
userId = Properties.Settings.Default.DomainId.ToString();
|
|
return userId;
|
|
}
|
|
|
|
static Utils()
|
|
{
|
|
ColorClassificationIds = new List<Guid>
|
|
{
|
|
new Guid("0c2508b0-5864-4e96-9bd7-dc442c085591"),
|
|
new Guid("5bdbac12-5549-41fd-9dbb-c771d634b337"),
|
|
new Guid("3750a2b1-caf8-4512-8c96-586fb195cd01")
|
|
};
|
|
}
|
|
|
|
|
|
public static T TrimStringProperties<T>(this T obj)
|
|
{
|
|
// ReSharper disable CompareNonConstrainedGenericWithNull
|
|
//add another comment
|
|
if (obj == null)
|
|
throw new ArgumentNullException();
|
|
foreach (PropertyDescriptor prop in TypeDescriptor.GetProperties(obj))
|
|
{
|
|
if (prop.PropertyType != typeof(string) || prop.IsReadOnly)
|
|
continue;
|
|
|
|
var val = prop.GetValue(obj) as string;
|
|
if (val != null)
|
|
prop.SetValue(obj, val.Trim());
|
|
}
|
|
|
|
return obj;
|
|
|
|
// ReSharper restore CompareNonConstrainedGenericWithNull
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetFiscalCalendarTypes()
|
|
{
|
|
return new List<SelectListItem>
|
|
{
|
|
new SelectListItem
|
|
{
|
|
Text = "",
|
|
Value = ""
|
|
},
|
|
new SelectListItem
|
|
{
|
|
Text = FiscalCalendarModel.FiscalCalendarType.CalendarYear.ToDisplayValue(),
|
|
Value = FiscalCalendarModel.FiscalCalendarType.CalendarYear.ToString()
|
|
},
|
|
new SelectListItem
|
|
{
|
|
Text = FiscalCalendarModel.FiscalCalendarType.Calendar445.ToDisplayValue(),
|
|
Value = FiscalCalendarModel.FiscalCalendarType.Calendar445.ToString()
|
|
},
|
|
new SelectListItem
|
|
{
|
|
Text = FiscalCalendarModel.FiscalCalendarType.Calendar454.ToDisplayValue(),
|
|
Value = FiscalCalendarModel.FiscalCalendarType.Calendar454.ToString()
|
|
},
|
|
new SelectListItem
|
|
{
|
|
Text = FiscalCalendarModel.FiscalCalendarType.Calendar544.ToDisplayValue(),
|
|
Value = FiscalCalendarModel.FiscalCalendarType.Calendar544.ToString()
|
|
}
|
|
};
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetWeekDays()
|
|
{
|
|
return new List<SelectListItem>
|
|
{
|
|
new SelectListItem
|
|
{
|
|
Text = DayOfWeek.Monday.ToDisplayValue(),
|
|
Value = DayOfWeek.Monday.ToString()
|
|
},
|
|
new SelectListItem
|
|
{
|
|
Text = DayOfWeek.Tuesday.ToDisplayValue(),
|
|
Value = DayOfWeek.Tuesday.ToString()
|
|
},
|
|
new SelectListItem
|
|
{
|
|
Text = DayOfWeek.Wednesday.ToDisplayValue(),
|
|
Value = DayOfWeek.Wednesday.ToString()
|
|
},
|
|
new SelectListItem
|
|
{
|
|
Text = DayOfWeek.Thursday.ToDisplayValue(),
|
|
Value = DayOfWeek.Thursday.ToString()
|
|
},
|
|
new SelectListItem
|
|
{
|
|
Text = DayOfWeek.Friday.ToDisplayValue(),
|
|
Value = DayOfWeek.Friday.ToString()
|
|
},
|
|
new SelectListItem
|
|
{
|
|
Text = DayOfWeek.Saturday.ToDisplayValue(),
|
|
Value = DayOfWeek.Saturday.ToString()
|
|
},
|
|
new SelectListItem
|
|
{
|
|
Text = DayOfWeek.Sunday.ToDisplayValue(),
|
|
Value = DayOfWeek.Sunday.ToString()
|
|
}
|
|
};
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetWeekEndingTypes()
|
|
{
|
|
return new List<SelectListItem>
|
|
{
|
|
new SelectListItem
|
|
{
|
|
Text = "",
|
|
Value = ""
|
|
},
|
|
new SelectListItem
|
|
{
|
|
Text = FiscalCalendarModel.CalendarYearType.StandardYear.ToDisplayValue(),
|
|
Value = FiscalCalendarModel.CalendarYearType.StandardYear.ToString()
|
|
},
|
|
new SelectListItem
|
|
{
|
|
Text = FiscalCalendarModel.CalendarYearType.Only52Weeks.ToDisplayValue(),
|
|
Value = FiscalCalendarModel.CalendarYearType.Only52Weeks.ToString()
|
|
},
|
|
new SelectListItem
|
|
{
|
|
Text = FiscalCalendarModel.CalendarYearType.LastWeekDay.ToDisplayValue(),
|
|
Value = FiscalCalendarModel.CalendarYearType.LastWeekDay.ToString()
|
|
}
|
|
};
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetOccurrenceTypes()
|
|
{
|
|
return new List<SelectListItem>
|
|
{
|
|
new SelectListItem
|
|
{
|
|
Text = HolidayModel.HolidayOccurrence.FirstDayOfWeek.ToDisplayValue(),
|
|
Value = HolidayModel.HolidayOccurrence.FirstDayOfWeek.ToString()
|
|
},
|
|
new SelectListItem
|
|
{
|
|
Text = HolidayModel.HolidayOccurrence.SecondDayOfWeek.ToDisplayValue(),
|
|
Value = HolidayModel.HolidayOccurrence.SecondDayOfWeek.ToString()
|
|
},
|
|
new SelectListItem
|
|
{
|
|
Text = HolidayModel.HolidayOccurrence.ThirdDayOfWeek.ToDisplayValue(),
|
|
Value = HolidayModel.HolidayOccurrence.ThirdDayOfWeek.ToString()
|
|
},
|
|
new SelectListItem
|
|
{
|
|
Text = HolidayModel.HolidayOccurrence.FourthDayOfWeek.ToDisplayValue(),
|
|
Value = HolidayModel.HolidayOccurrence.FourthDayOfWeek.ToString()
|
|
},
|
|
new SelectListItem
|
|
{
|
|
Text = HolidayModel.HolidayOccurrence.LastDayOfWeek.ToDisplayValue(),
|
|
Value = HolidayModel.HolidayOccurrence.LastDayOfWeek.ToString()
|
|
},
|
|
};
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetMonths()
|
|
{
|
|
var options = new List<SelectListItem>();
|
|
var month = new DateTime(2000, 1, 1);
|
|
for (var i = 0; i < 12; i++)
|
|
{
|
|
var nextMonth = month.AddMonths(i);
|
|
options.Add(new SelectListItem
|
|
{
|
|
Value = nextMonth.Month.ToString(CultureInfo.InvariantCulture),
|
|
Text = nextMonth.ToString("MMMM")
|
|
});
|
|
}
|
|
return options;
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetMonthDays(int month)
|
|
{
|
|
var date = new DateTime(2000, month, 1);
|
|
var options = new List<SelectListItem>();
|
|
while (date.Month == month)
|
|
{
|
|
options.Add(new SelectListItem
|
|
{
|
|
Value = date.Day.ToString(CultureInfo.InvariantCulture),
|
|
Text = date.Day.ToString(CultureInfo.InvariantCulture)
|
|
});
|
|
date = date.AddDays(1);
|
|
}
|
|
return options;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Prepares a detailed info about provided object including all property values of target and all inner objects.
|
|
/// </summary>
|
|
/// <param name="obj">An object whose property values will be gathered into <see cref="StringBuilder"/> object <paramref name="sb"/>.</param>
|
|
/// <param name="sb">A <see cref="StringBuilder"/> object that will contain gathered info.</param>
|
|
/// <param name="tab">Initial padding of the object level. "" for the target object, " " for the 1st level inner object, etc..</param>
|
|
public static void DebugObjectProperties(this object obj, StringBuilder sb, string tab = " ")
|
|
{
|
|
var properties = TypeDescriptor.GetProperties(obj);
|
|
if (properties.Count == 0)
|
|
sb.AppendLine($"{tab}{obj?.ToString() ?? string.Empty}");
|
|
else
|
|
{
|
|
foreach (PropertyDescriptor property in properties)
|
|
{
|
|
if (property.Attributes.OfType<SkipLoggingAttribute>().Any())
|
|
continue;
|
|
|
|
var value = property.GetValue(obj);
|
|
sb.AppendLine($"{tab}{property.DisplayName}: {value}");
|
|
if (property.PropertyType != typeof(int) && property.PropertyType != typeof(string) && property.PropertyType != typeof(decimal) &&
|
|
property.PropertyType != typeof(float) && property.PropertyType != typeof(DateTime) && property.PropertyType != typeof(int?) &&
|
|
property.PropertyType != typeof(decimal?) && property.PropertyType != typeof(DateTime?) &&
|
|
TypeDescriptor.GetProperties(value).Count > 0)
|
|
{
|
|
var enumerable = value as System.Collections.IEnumerable;
|
|
if (enumerable != null)
|
|
{
|
|
var i = 0;
|
|
foreach (var item in enumerable)
|
|
{
|
|
sb.AppendLine($"{tab + tab}{property.DisplayName}[{i++}]:");
|
|
item.DebugObjectProperties(sb, tab + tab + tab);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
value.DebugObjectProperties(sb, tab + tab);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// Writes a detailed info about provided object including all property values of target and all inner objects.
|
|
/// </summary>
|
|
/// <param name="obj">An object whose property values will be gathered into <see cref="System.IO.StreamWriter"/> object <paramref name="writer"/>.</param>
|
|
/// <param name="writer">A <see cref="System.IO.StreamWriter"/> object that will contain gathered info.</param>
|
|
/// <param name="tab">Initial padding of the object level. "" for the target object, " " for the 1st level inner object, etc..</param>
|
|
public static void DebugObjectProperties(this object obj, StreamWriter writer, string tab = " ")
|
|
{
|
|
var properties = TypeDescriptor.GetProperties(obj);
|
|
if (properties.Count == 0)
|
|
writer.WriteLine($"{tab}{obj?.ToString() ?? string.Empty}");
|
|
else
|
|
{
|
|
foreach (PropertyDescriptor property in properties)
|
|
{
|
|
if (property.Attributes.OfType<SkipLoggingAttribute>().Any())
|
|
continue;
|
|
|
|
var value = property.GetValue(obj);
|
|
writer.WriteLine($"{tab}{property.DisplayName}: {value}");
|
|
if (property.PropertyType != typeof(int) && property.PropertyType != typeof(string) && property.PropertyType != typeof(decimal) &&
|
|
property.PropertyType != typeof(float) && property.PropertyType != typeof(DateTime) && property.PropertyType != typeof(int?) &&
|
|
property.PropertyType != typeof(decimal?) && property.PropertyType != typeof(DateTime?) &&
|
|
TypeDescriptor.GetProperties(value).Count > 0)
|
|
{
|
|
var enumerable = value as System.Collections.IEnumerable;
|
|
if (enumerable != null)
|
|
{
|
|
var i = 0;
|
|
foreach (var item in enumerable)
|
|
{
|
|
writer.WriteLine($"{tab + tab}{property.DisplayName}[{i++}]:");
|
|
item.DebugObjectProperties(writer, tab + tab + tab);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
value.DebugObjectProperties(writer, tab + tab);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Prepares a detailed info about provided object including all property values of target and all inner objects.
|
|
/// </summary>
|
|
/// <param name="obj">An object whose property values will be gathered into <see cref="StringBuilder"/> object <paramref name="sb"/>.</param>
|
|
/// <param name="title">A string title of the object. Log line will start from this title.</param>
|
|
/// <param name="tab">Initial padding of the object level. "" for the target object, " " for the 1st level inner object, etc..</param>
|
|
/// <returns>A string starting with <paramref name="title"/> and containing all info about provided object including sub properties.</returns>
|
|
public static string DebugObjectProperties(this object obj, string title, string tab = " ")
|
|
{
|
|
var builder = new StringBuilder();
|
|
builder.AppendLine($"{tab}{title}: ");
|
|
obj.DebugObjectProperties(builder, tab);
|
|
return builder.ToString();
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetParentCompanies()
|
|
{
|
|
var options = new List<SelectListItem>();
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var parentCompanies = dbContext.Companies.AsNoTracking().Where(t => t.ParentCompanyId == null);
|
|
options.AddRange(parentCompanies.Select(parentCompany => new SelectListItem()
|
|
{
|
|
Value = parentCompany.Id.ToString(),
|
|
Text = parentCompany.Name
|
|
}));
|
|
}
|
|
return options;
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetStatuses(bool useEmptyElement = false)
|
|
{
|
|
var options = new List<SelectListItem>();
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var statuses = dbContext.Status.AsNoTracking().Where(t => !t.IsSystem).OrderBy(s => s.Name);
|
|
options.AddRange(statuses.Select(s => new SelectListItem
|
|
{
|
|
Value = s.Id.ToString(),
|
|
Text = s.Name
|
|
}));
|
|
}
|
|
if (useEmptyElement)
|
|
options.Insert(0, new SelectListItem());
|
|
return options;
|
|
}
|
|
public static IEnumerable<Tag> GetTags(int tagType = 0)
|
|
{
|
|
List<Tag> options;
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var tags = dbContext.Tags.AsNoTracking().Where(x => x.TagType == tagType).OrderBy(s => s.TagName);
|
|
options = tags.ToList();
|
|
}
|
|
|
|
return options;
|
|
}
|
|
public static IEnumerable<SelectListItem> GetTags(Guid? ignoreId, int tagType = 0)
|
|
{
|
|
var options = new List<SelectListItem>();
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var statuses = dbContext.Tags.AsNoTracking().Where(t => t.Id != ignoreId.Value && t.TagType == tagType).OrderBy(s => s.TagName);
|
|
options.AddRange(statuses.Select(t => new SelectListItem
|
|
{
|
|
Value = t.Id.ToString(),
|
|
Text = t.TagName
|
|
}));
|
|
}
|
|
options.Insert(0, new SelectListItem());
|
|
return options;
|
|
}
|
|
public static IEnumerable<SelectListItem> GetTypes()
|
|
{
|
|
var options = new List<SelectListItem>();
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var types = dbContext.Types.AsNoTracking().Where(t => !t.IsSystem).OrderBy(t => t.Name);
|
|
options.AddRange(types.Select(t => new SelectListItem
|
|
{
|
|
Value = t.Id.ToString(),
|
|
Text = t.Name
|
|
}));
|
|
}
|
|
return options;
|
|
}
|
|
|
|
public static List<KeyValuePair<string, List<TypeModel>>> GetTypesWithGroups()
|
|
{
|
|
SortedDictionary<string, List<TypeModel>> typeDict =
|
|
new SortedDictionary<string, List<TypeModel>> {{"No Group", new List<TypeModel>()}};
|
|
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var types = dbContext.Types.AsNoTracking().Where(t => !t.IsSystem).OrderBy(t => t.Name);
|
|
foreach (Type t in types)
|
|
{
|
|
if (t.Type2TypeGroup.Count == 0)
|
|
{
|
|
typeDict["No Group"].Add((TypeModel)t);
|
|
}
|
|
|
|
foreach (Type2TypeGroup t2G in t.Type2TypeGroup)
|
|
{
|
|
if (!typeDict.ContainsKey(t2G.TypeGroup.Name))
|
|
typeDict.Add(t2G.TypeGroup.Name, new List<TypeModel>());
|
|
|
|
typeDict[t2G.TypeGroup.Name].Add((TypeModel)t);
|
|
}
|
|
}
|
|
}
|
|
|
|
return typeDict.ToList();
|
|
}
|
|
|
|
public static MvcHtmlString GetTemplates(Guid? selectedId, bool isBottomUp)
|
|
{
|
|
var context = new EnVisageEntities();
|
|
var templatesQuery = (from pr in context.Scenarios.AsNoTracking()
|
|
where pr.Type == (int) ScenarioType.Template && pr.Status == (int) ScenarioStatus.Active
|
|
select pr);
|
|
templatesQuery = isBottomUp ? templatesQuery.Where(x => x.IsBottomUp) : templatesQuery.Where(x => !x.IsBottomUp);
|
|
|
|
var templates = templatesQuery.OrderBy(x => x.Name).ToDictionary(x => x.Id, x => x.Name);
|
|
if (!isBottomUp)
|
|
{
|
|
var groups = context.TemplateGroups
|
|
.Where(x => x.Template2TemplateGroup.Any(t => t.Scenario.Status == (int) ScenarioStatus.Active))
|
|
.Include(x => x.Template2TemplateGroup)
|
|
.OrderBy(x => x.Name)
|
|
.ToList();
|
|
|
|
var result = new List<TagBuilder>();
|
|
foreach (var group in groups)
|
|
{
|
|
var groupBuilder = new TagBuilder("optgroup");
|
|
groupBuilder.Attributes.Add(new KeyValuePair<string, string>("label", group.Name));
|
|
foreach (var template in group.Template2TemplateGroup)
|
|
{
|
|
if (template.Scenario.Status != (int) ScenarioStatus.Active) continue;
|
|
var option = new TagBuilder("option");
|
|
option.Attributes["value"] = template.TemplateId.ToString();
|
|
option.SetInnerText(template.Scenario.Name);
|
|
if (selectedId.HasValue && selectedId.Value == template.TemplateId)
|
|
option.Attributes["selected"] = string.Empty;
|
|
groupBuilder.InnerHtml += option;
|
|
templates.Remove(template.TemplateId);
|
|
}
|
|
result.Add(groupBuilder);
|
|
}
|
|
var ungroupedBuilder = new TagBuilder("optgroup");
|
|
ungroupedBuilder.Attributes.Add(new KeyValuePair<string, string>("label", "Ungrouped"));
|
|
foreach (var template in templates)
|
|
{
|
|
var option = new TagBuilder("option");
|
|
option.Attributes["value"] = template.Key.ToString();
|
|
option.SetInnerText(template.Value);
|
|
|
|
if (selectedId.HasValue && selectedId.Value == template.Key)
|
|
option.Attributes["selected"] = string.Empty;
|
|
ungroupedBuilder.InnerHtml += option;
|
|
}
|
|
result.Add(ungroupedBuilder);
|
|
|
|
string final = "<option value=\"\"></option>";
|
|
foreach (var gr in result)
|
|
final += gr.ToString();
|
|
return new MvcHtmlString(final);
|
|
}
|
|
if (templates.Count <= 0)
|
|
return new MvcHtmlString("");
|
|
|
|
var buTemplate = templates.FirstOrDefault();
|
|
|
|
// for BU scenarios we have only one template without any group and have no ability to create other one
|
|
// so we mark the first template as selected
|
|
var opt = new TagBuilder("option");
|
|
opt.Attributes["value"] = buTemplate.Key.ToString();
|
|
opt.SetInnerText(buTemplate.Value);
|
|
opt.Attributes["selected"] = string.Empty;
|
|
|
|
return new MvcHtmlString(opt.ToString());
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetClients(bool useEmptyElement = false)
|
|
{
|
|
var options = new List<SelectListItem>();
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var clients = dbContext.Clients.AsNoTracking().OrderBy(c => c.Name);
|
|
options.AddRange(clients.Select(c => new SelectListItem()
|
|
{
|
|
Value = c.Id.ToString(),
|
|
Text = c.Name
|
|
}));
|
|
}
|
|
if (useEmptyElement)
|
|
options.Insert(0, new SelectListItem());
|
|
return options;
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetAllCompanies(bool useEmptyElement = false)
|
|
{
|
|
var options = new List<SelectListItem>();
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var companies = dbContext.Companies.AsNoTracking().OrderBy(c => c.Name);
|
|
options.AddRange(companies.Select(c => new SelectListItem()
|
|
{
|
|
Value = c.Id.ToString(),
|
|
Text = c.Name
|
|
}));
|
|
}
|
|
if (useEmptyElement)
|
|
options.Insert(0, new SelectListItem());
|
|
return options;
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetCompaniesTreeForCurrentUser()
|
|
{
|
|
Guid userId = SecurityManager.GetUserPrincipal();
|
|
CompanyManager cmpnyMngr = new CompanyManager(null);
|
|
|
|
// Get companies, visible for current user
|
|
IList<Company> availableCompanies = cmpnyMngr.GetCompaniesByUser(userId);
|
|
var options = ConvertCompanyListToSelect2OptionsTree(availableCompanies);
|
|
return options;
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetCompaniesTreeAll()
|
|
{
|
|
CompanyManager cmpnyMngr = new CompanyManager(null);
|
|
|
|
// Get unfiltered company list
|
|
IList<Company> availableCompanies = cmpnyMngr.GetCompaniesByUser(null);
|
|
var options = ConvertCompanyListToSelect2OptionsTree(availableCompanies);
|
|
return options;
|
|
}
|
|
public static IEnumerable<SelectListItem> GetWorkFlowRoles()
|
|
{
|
|
var options = new List<SelectListItem>();
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var companies = dbContext.WorkFlowRoles.AsNoTracking().OrderBy(c => c.RoleName);
|
|
options.AddRange(companies.Select(c => new SelectListItem()
|
|
{
|
|
Value = c.Id.ToString(),
|
|
Text = c.RoleName
|
|
}));
|
|
}
|
|
return options;
|
|
}
|
|
public static List<SelectListItem> ConvertCompanyListToSelect2OptionsTree(IList<Company> companies)
|
|
{
|
|
var options = new List<SelectListItem>();
|
|
List<SelectListItem> rootCompanies = companies.Where(x => !x.ParentCompanyId.HasValue ||
|
|
!companies.Any(z => z.Id.Equals(x.ParentCompanyId.Value)))
|
|
.OrderBy(x => x.Name).Select(x => new SelectListItem()
|
|
{
|
|
Text = x.Name,
|
|
Value = x.Id.ToString()
|
|
}).ToList();
|
|
|
|
foreach (SelectListItem rootCompany in rootCompanies)
|
|
{
|
|
var childCompanies = companies
|
|
.Where(x => x.ParentCompanyId.HasValue && x.ParentCompanyId.Value.Equals(new Guid(rootCompany.Value)))
|
|
.OrderBy(x => x.Name).Select(x => new SelectListItem
|
|
{
|
|
Text = x.Name,
|
|
Value = x.Id.ToString(),
|
|
Group = new SelectListGroup
|
|
{
|
|
Name = rootCompany.Value
|
|
}
|
|
}).ToList();
|
|
|
|
options.Add(rootCompany);
|
|
options.AddRange(childCompanies);
|
|
}
|
|
|
|
return options;
|
|
}
|
|
|
|
[Obsolete("Replace with GetCompaniesTreeAll method and remove this one")]
|
|
public static Dictionary<KeyValuePair<Guid, string>, List<CompanyModel>> GetCompanies()
|
|
{
|
|
return (new CompanyManager(null)).GetCompanies();
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetProjectTemplates(Guid clientId, Guid companyId)
|
|
{
|
|
var options = new List<SelectListItem>();
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var companies = dbContext.Companies.AsNoTracking().OrderBy(c => c.Name);
|
|
options.AddRange(companies.Select(c => new SelectListItem()
|
|
{
|
|
Value = c.Id.ToString(),
|
|
Text = c.Name
|
|
}));
|
|
}
|
|
return options;
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetProjectParts(Guid? projectId, Guid userId)
|
|
{
|
|
var options = new List<SelectListItem>();
|
|
if (projectId.HasValue && !Guid.Empty.Equals(projectId.Value))
|
|
{
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var parts =
|
|
from part in dbContext.Projects
|
|
join sec in dbContext.VW_ProjectAccessByUserExtended on part.Id equals sec.Id
|
|
orderby part.Name
|
|
where sec.UserId.Equals(userId) && part.ParentProjectId == projectId
|
|
select part;
|
|
|
|
options.AddRange(parts.Select(c => new SelectListItem()
|
|
{
|
|
Value = c.Id.ToString(),
|
|
Text = c.Name
|
|
}));
|
|
}
|
|
}
|
|
return options;
|
|
}
|
|
|
|
public static IList<UserQuickLink> GetQuickLinksByUser(Guid? userId)
|
|
{
|
|
var dbContext = new EnVisageEntities();
|
|
if (userId.HasValue)
|
|
{
|
|
var quickLinks = dbContext.UserQuickLinks.AsNoTracking()
|
|
.Where(x => x.UserId == userId)
|
|
.ToList();
|
|
|
|
//quickLinks.ForEach(t => t.PeopleResources = t.PeopleResources.OrderBy(r => r.FirstName + r.LastName).ToList());
|
|
return quickLinks;
|
|
}
|
|
|
|
return new List<UserQuickLink>();
|
|
}
|
|
|
|
#region Date calculation
|
|
/// <summary>
|
|
/// Gets next date with provided DayOfWeek.
|
|
/// </summary>
|
|
/// <param name="startDate">A date to start from.</param>
|
|
/// <param name="weekDay">A day of the week, Monday=1, Tuesday=2, etc.</param>
|
|
/// <param name="counter">Which one of next week days to return, 1st, 2nd, 3rd, etc.</param>
|
|
/// <param name="skipMonthCheck">Indicates whether to let next week day to be on next month or not.</param>
|
|
/// <returns>A <see cref="DateTime"/>.</returns>
|
|
public static DateTime GetNextDateByWeekDate(DateTime startDate, short weekDay, int counter, bool skipMonthCheck = false)
|
|
{
|
|
var date = startDate;
|
|
while (date.DayOfWeek != (DayOfWeek)weekDay && (skipMonthCheck || date.Month == date.AddDays(1).Month))
|
|
{
|
|
date = date.AddDays(1);
|
|
}
|
|
if (counter == 1)
|
|
return date;
|
|
date = date.AddDays(7 * (counter - 1));
|
|
return date;
|
|
}
|
|
public static DateTime GetLastDateByWeekDate(DateTime startDate, short weekDay)
|
|
{
|
|
var date = startDate;
|
|
// find first upcoming weekDay
|
|
while (date.DayOfWeek != (DayOfWeek)weekDay && date.Month == date.AddDays(1).Month)
|
|
{
|
|
date = date.AddDays(1);
|
|
}
|
|
|
|
while (date.Month == date.AddDays(7).Month)
|
|
{
|
|
date = date.AddDays(7);
|
|
}
|
|
return date;
|
|
}
|
|
#endregion
|
|
|
|
public static IEnumerable<SelectListItem> GetSystemAttributeOne()
|
|
{
|
|
var options = new List<SelectListItem>
|
|
{
|
|
new SelectListItem
|
|
{
|
|
Value = Guid.Empty.ToString(),
|
|
Text = "None"
|
|
}
|
|
};
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var systemAttributes = dbContext.SystemAttributes.AsNoTracking().Where(t => t.Type == 1);
|
|
options.AddRange(systemAttributes.Select(systemAttribute => new SelectListItem
|
|
{
|
|
Value = systemAttribute.Id.ToString(),
|
|
Text = systemAttribute.Name
|
|
}));
|
|
}
|
|
return options;
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetSystemAttributeTwo()
|
|
{
|
|
var options = new List<SelectListItem>
|
|
{
|
|
new SelectListItem
|
|
{
|
|
Value = Guid.Empty.ToString(),
|
|
Text = "None"
|
|
}
|
|
};
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var systemAttributes = dbContext.SystemAttributes.AsNoTracking().Where(t => t.Type == 2);
|
|
options.AddRange(systemAttributes.Select(systemAttribute => new SelectListItem
|
|
{
|
|
Value = systemAttribute.Id.ToString(),
|
|
Text = systemAttribute.Name
|
|
}));
|
|
}
|
|
return options;
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetExpenditureAllCategories(bool withoutSupperExpCat = false)
|
|
{
|
|
var options = new List<SelectListItem>();
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
IQueryable<ExpenditureCategory> expCats = dbContext.ExpenditureCategory.AsNoTracking();
|
|
if (withoutSupperExpCat)
|
|
{
|
|
expCats = expCats.Where(q => q.AllowResourceAssignment);
|
|
}
|
|
options.AddRange(expCats.Select(expCatItem => new SelectListItem()
|
|
{
|
|
Value = expCatItem.Id.ToString(),
|
|
Text = expCatItem.Expenditure.Name
|
|
}));
|
|
}
|
|
return options.OrderBy(x => x.Text);
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetExpenditureCategories(Guid parentExpenditureCategory)
|
|
{
|
|
var options = new List<SelectListItem>();
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var expCats = dbContext.VW_ExpenditureCategory.AsNoTracking().Where(x => x.Id == parentExpenditureCategory);
|
|
options.AddRange(expCats.Select(expCatItem => new SelectListItem()
|
|
{
|
|
Value = expCatItem.Id.ToString(),
|
|
Text = expCatItem.ExpCategoryWithCcName
|
|
}));
|
|
}
|
|
return options.OrderBy(x => x.Text);
|
|
}
|
|
|
|
public static List<ScenarioModel.ExpenditureItem> GetScenarioExpenditures(Guid scenarioId)
|
|
{
|
|
List<ScenarioModel.ExpenditureItem> result;
|
|
using (var context = new EnVisageEntities())
|
|
{
|
|
result = (from c in context.ScenarioDetail.AsNoTracking()
|
|
join o in context.VW_ExpenditureCategory on c.ExpenditureCategoryId equals o.Id
|
|
where c.ParentID == scenarioId
|
|
select new ScenarioModel.ExpenditureItem
|
|
{
|
|
Id = o.Id,
|
|
Name = o.ExpCategoryWithCcName
|
|
}).Distinct().ToList();
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public static IList<SelectListItem> GetResourceExpendituresList(Guid? resourceExpId, bool displaySuperECs = true)
|
|
{
|
|
List<SelectListItem> result;
|
|
using (var context = new EnVisageEntities())
|
|
{
|
|
var query = context.VW_ExpenditureCategory.AsNoTracking().AsQueryable();
|
|
if (!displaySuperECs)
|
|
query = query.Where(t => t.AllowResourceAssignment);
|
|
result = query.Select(c => new SelectListItem
|
|
{
|
|
Text = c.ExpCategoryWithCcName,
|
|
Value = c.Id.ToString(),
|
|
Selected = resourceExpId.HasValue && resourceExpId != Guid.Empty && resourceExpId == c.Id
|
|
}).Distinct().ToList();
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public static IList<SelectListItem> GetResourceWorkWeeksList(Guid resourceWorkWeekId)
|
|
{
|
|
List<SelectListItem> result;
|
|
using (var context = new EnVisageEntities())
|
|
{
|
|
result = (from c in context.WorkWeeks.AsNoTracking()
|
|
select new SelectListItem
|
|
{
|
|
Text = c.Name,
|
|
Value = c.Id.ToString(),
|
|
Selected = resourceWorkWeekId == c.Id
|
|
}).Distinct().ToList();
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
public static IEnumerable<Select2DataOptionGroup> GetResourcesByTeams(List<Guid> teams, DateTime timePointUtc, Guid? teamId = null)
|
|
{
|
|
if (teams == null)
|
|
throw new ArgumentNullException(nameof(teams));
|
|
|
|
List<Select2DataOptionGroup> result = new List<Select2DataOptionGroup>();
|
|
|
|
if (teams.Count < 1)
|
|
return result;
|
|
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
// Get resources for team list
|
|
PeopleResourcesManager prMngr = new PeopleResourcesManager(dbContext);
|
|
var resources = prMngr.LoadPeopleResourcesByTeamsNonStrict(teams, false, timePointUtc);
|
|
|
|
// Get team names
|
|
TeamManager tmMngr = new TeamManager(dbContext);
|
|
var teamsInfo = tmMngr.GetTeamNames(teams);
|
|
Guid? teamToExcludeFromGeneralList = null;
|
|
|
|
if (teamId.HasValue && teamsInfo.ContainsKey(teamId.Value))
|
|
{
|
|
// Add selected team to the top
|
|
Select2DataOptionGroup topTeamItem = new Select2DataOptionGroup()
|
|
{
|
|
id = teamId.Value.ToString(),
|
|
text = teamsInfo[teamId.Value]
|
|
};
|
|
result.Add(topTeamItem);
|
|
teamToExcludeFromGeneralList = teamId;
|
|
}
|
|
|
|
// Add all other teams
|
|
var teamItems = teamsInfo.Where(x =>
|
|
!teamToExcludeFromGeneralList.HasValue || !x.Key.Equals(teamToExcludeFromGeneralList.Value))
|
|
.OrderBy(x => x.Value)
|
|
.Select(x => new Select2DataOptionGroup()
|
|
{
|
|
id = x.Key.ToString(),
|
|
text = x.Value
|
|
}).ToList();
|
|
|
|
result.AddRange(teamItems);
|
|
|
|
// Fill teams with their resources
|
|
result.ForEach(team =>
|
|
team.children = resources.Where(r => r.TeamId.Equals(new Guid(team.id)))
|
|
.OrderBy(r => r.LastName).ThenBy(r => r.FirstName)
|
|
.Select(r => new Selet2DataOptionItem()
|
|
{
|
|
id = r.Id.ToString(),
|
|
text = r.FirstName + " " + r.LastName
|
|
}).ToList());
|
|
|
|
// Remove teams with no resources found
|
|
result.RemoveAll(x => x.children == null || (x.children.Count < 1));
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetResources(string userId, DateTime timePoint, Guid? teamId = null)
|
|
{
|
|
IEnumerable<SelectListItem> result;
|
|
//get list of teams that user has access to using the standard security
|
|
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var teamAccess = SecurityManager.GetTeamPermissionsForUser(dbContext, userId, null);
|
|
var teams = teamAccess.Keys.ToList();
|
|
|
|
var resources = (from r in dbContext.VW_TeamResource
|
|
join team in dbContext.Teams on r.TeamId equals team.Id
|
|
where teams.Contains(r.TeamId) && r.TeamStartDate <= timePoint &&
|
|
(!r.TeamEndDate.HasValue || r.TeamEndDate.Value >= timePoint)
|
|
select new
|
|
{
|
|
r.Id,
|
|
r.FirstName,
|
|
r.LastName,
|
|
r.TeamId,
|
|
TeamName = team.Name
|
|
}).AsNoTracking().Distinct().ToArray();
|
|
|
|
var groups = resources.Select(x => new { id = x.TeamId, name = x.TeamName }).Distinct()
|
|
.ToDictionary(x => x.id, g => new SelectListGroup() { Name = g.name });
|
|
|
|
|
|
if (teamId.HasValue)
|
|
{
|
|
var res = resources.Where(v => v.TeamId == teamId.Value)
|
|
.OrderBy(x => x.LastName).ThenBy(x => x.FirstName).Select(x => new SelectListItem()
|
|
{
|
|
Group = groups[x.TeamId],
|
|
Text = x.FirstName + " " + x.LastName,
|
|
Value = x.Id.ToString()
|
|
}).ToArray();
|
|
|
|
var resourceList = resources.OrderBy(x => x.TeamName)
|
|
.ThenBy(x => x.LastName).ThenBy(x => x.FirstName)
|
|
.Where(v => v.TeamId != teamId.Value).Select(x => new SelectListItem()
|
|
{
|
|
Group = groups[x.TeamId],
|
|
Text = x.FirstName + " " + x.LastName,
|
|
Value = x.Id.ToString()
|
|
}).ToArray();
|
|
|
|
result = res.Concat(resourceList);
|
|
}
|
|
else
|
|
{
|
|
var resourceList = resources.OrderBy(x => x.TeamName).ThenBy(x => x.LastName)
|
|
.ThenBy(x => x.FirstName).Select(x => new SelectListItem()
|
|
{
|
|
Group = groups[x.TeamId],
|
|
Text = x.FirstName + " " + x.LastName,
|
|
Value = x.Id.ToString()
|
|
}).ToArray();
|
|
|
|
result = resourceList;
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
public class Selet2DataOptionItem
|
|
{
|
|
public string id;
|
|
public string text;
|
|
}
|
|
|
|
public class Select2DataOptionGroup
|
|
{
|
|
public string id;
|
|
public string text;
|
|
public List<Selet2DataOptionItem> children;
|
|
}
|
|
|
|
public static List<Select2DataOptionGroup> ConvertSelectOptionsToSelect2OptionsData(IEnumerable<SelectListItem> data)
|
|
{
|
|
List<Select2DataOptionGroup> result = null;
|
|
|
|
if (data != null)
|
|
{
|
|
var selectListItems = data as SelectListItem[] ?? data.ToArray();
|
|
result = selectListItems.Where(x => x.Group != null && x.Group.Name.Length > 0).Select(x => x.Group.Name)
|
|
.Distinct().Select(x => new Select2DataOptionGroup
|
|
{
|
|
text = x,
|
|
children = selectListItems.Where(k => k.Group != null && k.Group.Name.Equals(x))
|
|
.Select(k => new Selet2DataOptionItem
|
|
{
|
|
id = k.Value,
|
|
text = k.Text
|
|
}).ToList()
|
|
}).ToList();
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
public static Dictionary<Tuple<Guid?, string>, List<SelectListItem>> GetTeamResorces(string userIdentity)
|
|
{
|
|
Dictionary<Tuple<Guid?, string>, List<SelectListItem>> retList = new Dictionary<Tuple<Guid?, string>, List<SelectListItem>>();
|
|
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var accessibleTeams = new TeamManager(dbContext).LoadTeamsWithResourcesByUser(Guid.Parse(userIdentity));
|
|
|
|
foreach (var team in accessibleTeams)
|
|
{
|
|
var key = new Tuple<Guid?, string>(team.Id, team.Name);
|
|
var val = (team.PeopleResources.Select(x => new SelectListItem()
|
|
{
|
|
Text = x.FirstName + " " + x.LastName,
|
|
Value = x.Id.ToString()
|
|
}).OrderBy(x => x.Text).ToList());
|
|
retList.Add(key, val);
|
|
}
|
|
}
|
|
return retList;
|
|
}
|
|
|
|
public static IEnumerable<string> GetTypeGroups()
|
|
{
|
|
List<string> retList = new List<string>();
|
|
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var resources = (from r in dbContext.TypeGroups select r).Distinct().ToArray();
|
|
retList.AddRange(resources
|
|
.Select(x => x.Name));
|
|
}
|
|
return retList;
|
|
}
|
|
|
|
public static IEnumerable<string> GetTemplateGroups()
|
|
{
|
|
List<string> retList = new List<string>();
|
|
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var resources = (from r in dbContext.TemplateGroups select r).Distinct().ToArray();
|
|
retList.AddRange(resources
|
|
.Select(x => x.Name));
|
|
}
|
|
return retList;
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetProjects(Guid userId, bool useEmptyElement = true)
|
|
{
|
|
var retList = new List<SelectListItem>();
|
|
if (useEmptyElement)
|
|
{
|
|
retList.Add(new SelectListItem
|
|
{
|
|
Text = "",
|
|
Value = ""
|
|
});
|
|
}
|
|
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var projects =
|
|
(from sc in dbContext.VW_ProjectAccessByUserExtended
|
|
where sc.UserId.Equals(userId)
|
|
select new SelectListItem()
|
|
{
|
|
Value = sc.Id.ToString(),
|
|
Text = sc.Name
|
|
}).ToList();
|
|
retList.AddRange(projects);
|
|
}
|
|
return retList;
|
|
}
|
|
|
|
public static IEnumerable<Project> GetResourceProjects(Guid resourceId, string username)
|
|
{
|
|
List<Project> retList = new List<Project>();
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var scenarioIds = dbContext.PeopleResourceAllocations.Where(x => x.PeopleResourceId == resourceId).Select(x => x.ScenarioId).ToList();
|
|
var projectIds = dbContext.Scenarios.Where(x => scenarioIds.Contains(x.Id)).Select(x => x.ParentId).Distinct().ToList();
|
|
var projects = dbContext.Projects.Where(x => projectIds.Contains(x.Id)).Distinct().ToList();
|
|
retList.AddRange(projects);
|
|
}
|
|
return retList;
|
|
}
|
|
|
|
public static IReadOnlyCollection<SelectListItem> GetProjectsToScenarioCopy(EnVisageEntities dbContext, Guid projectId, string username)
|
|
{
|
|
const string delim = ": ";
|
|
var userIdAsText = dbContext.AspNetUsers.Where(x => x.UserName == username).Select(x => x.Id).FirstOrDefault();
|
|
if (userIdAsText != null)
|
|
{
|
|
Guid userId = new Guid(userIdAsText);
|
|
var projects = (from proj in dbContext.Projects
|
|
join sc in dbContext.VW_ProjectAccessByUserExtended on proj.Id equals sc.Id
|
|
where sc.UserId.Equals(userId) && sc.Write.HasValue && sc.Write.Value == 1 && !proj.HasChildren
|
|
select proj).Include(x => x.ParentProject);
|
|
|
|
var prIds = projects.Select(p => p.Id).ToList();
|
|
var userteams = SecurityManager.GetTeamPermissionsForUser(dbContext, userIdAsText, null).Select(x => x.Key).Distinct().ToList();
|
|
var teamsProjectsIds = dbContext.Team2Project.Where(x => userteams.Contains(x.TeamId) && prIds.Contains(x.ProjectId)).Select(x => x.ProjectId).Distinct().ToList();
|
|
|
|
var ret = projects.Select(p => new
|
|
{
|
|
Name = p.Name + (p.ParentProject != null ? delim + p.ParentProject.Name : string.Empty),
|
|
p.Id,
|
|
Group = p.Id == projectId ? "0" : teamsProjectsIds.Contains(p.Id) ? "1" : "2"
|
|
})
|
|
.GroupBy(p => p.Group)
|
|
.OrderBy(p => p.Key)
|
|
.Select(p => new {p.Key, Items = p.OrderBy(g => g.Name)})
|
|
.AsEnumerable()
|
|
.SelectMany(p =>
|
|
{
|
|
var group = new SelectListGroup { Name = p.Key == "0" ? "Current Project" : p.Key == "1" ? "Other Projects for Teams Assigned" : "Other Projects" };
|
|
return p.Items.Select(i => new SelectListItem
|
|
{
|
|
Text = i.Name,
|
|
Value = i.Id.ToString(),
|
|
Group = group
|
|
});
|
|
})
|
|
.ToList();
|
|
return ret;
|
|
}
|
|
return new List<SelectListItem>();
|
|
}
|
|
|
|
|
|
public static List<Contact> GetProjectContacts(Guid projectId)
|
|
{
|
|
List<Contact> result;
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
result = dbContext.Contact2Project.Where(c => c.ShowId == projectId).Select(c => c.Contact).Distinct().OrderBy(c => c.LastName).ToList();
|
|
}
|
|
return result;
|
|
}
|
|
public static IEnumerable<SelectListItem> GetWorkFlowContacts(Guid parentId)
|
|
{
|
|
List<SelectListItem> retList =
|
|
new List<SelectListItem> {new SelectListItem {Value = string.Empty, Text = ""}};
|
|
|
|
var usersGroup = new SelectListGroup { Name = "Users" };
|
|
var workflowroleGroup = new SelectListGroup { Name = "Workflow Roles" };
|
|
var systemroleGroup = new SelectListGroup { Name = "System Roles" };
|
|
var systemGroup = new SelectListGroup { Name = "System Roles" };
|
|
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
foreach (var user in dbContext.AspNetUsers
|
|
.Where(x => x.Type == (int)UserType.Active)
|
|
.Select(x => new SelectListItem
|
|
{
|
|
Text = x.FirstName + " " + x.LastName,
|
|
Value = x.Id.ToString()
|
|
}).OrderBy(x => x.Text))
|
|
{
|
|
user.Group = usersGroup;
|
|
retList.Add(user);
|
|
}
|
|
|
|
foreach (var wfrole in dbContext.WorkFlowRoles.Select(x => new SelectListItem()
|
|
{
|
|
Text = x.RoleName,
|
|
Value = x.Id.ToString()
|
|
|
|
}).OrderBy(x => x.Text))
|
|
{
|
|
wfrole.Group = workflowroleGroup;
|
|
retList.Add(wfrole);
|
|
}
|
|
|
|
|
|
foreach (var sysrole in dbContext.AspNetRoles.Select(x => new SelectListItem()
|
|
{
|
|
Text = x.Name,
|
|
Value = x.Id.ToString()
|
|
|
|
}).OrderBy(x => x.Text))
|
|
{
|
|
sysrole.Group = systemroleGroup;
|
|
retList.Add(sysrole);
|
|
}
|
|
var internalGroup = new SelectListItem()
|
|
{
|
|
Group = systemGroup,
|
|
Text = "Internal Contacts",
|
|
Value = internalContactRoleGuid.ToString()
|
|
};
|
|
retList.Add(internalGroup);
|
|
}
|
|
return retList;
|
|
}
|
|
public static IEnumerable<SelectListItem> GetWorkFlowProjectRoles(Guid parentId)
|
|
{
|
|
List<SelectListItem> retList = new List<SelectListItem>();
|
|
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
|
|
retList.AddRange(dbContext.WorkFlowRoles.Select(x => new SelectListItem()
|
|
{
|
|
Text = x.RoleName,
|
|
Value = x.Id.ToString()
|
|
}).OrderBy(x => x.Text));
|
|
}
|
|
return retList;
|
|
}
|
|
public static IEnumerable<SelectListItem> GetWorkFlowCommands(Guid documentId, Guid userId)
|
|
{
|
|
List<SelectListItem> retList = new List<SelectListItem>();
|
|
var commands = new WorkFlowManager(null).GetWorkFlowCommands(documentId, userId);
|
|
foreach (var cmd in commands)
|
|
{
|
|
retList.Add(new SelectListItem()
|
|
{
|
|
Text = cmd.command,
|
|
Value = cmd.command
|
|
});
|
|
}
|
|
return retList;
|
|
}
|
|
public static IEnumerable<SelectListItem> GetAllWorkFlowStates()
|
|
{
|
|
List<SelectListItem> retList = new List<SelectListItem>();
|
|
var wfStates = (new WorkFlowManager(null)).getAllStates();
|
|
foreach (var state in wfStates.OrderBy(x => x.state))
|
|
{
|
|
retList.Add(new SelectListItem
|
|
{
|
|
Text = state.state,
|
|
Value = state.state
|
|
});
|
|
}
|
|
retList.Insert(0, new SelectListItem());
|
|
return retList;
|
|
}
|
|
public static IEnumerable<SelectListItem> GetWorkFlowCommandsForProject(Guid documentId, Guid userId)
|
|
{
|
|
List<SelectListItem> retList = new List<SelectListItem>();
|
|
var commands = (new WorkFlowManager(null)).GetWorkFlowCommands(documentId, userId);
|
|
if (commands.Count == 0)
|
|
{
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var scenario = dbContext.Scenarios.FirstOrDefault(x => x.ParentId == documentId && x.Type == (int)ScenarioType.Portfolio);
|
|
if (scenario != null && scenario.Id != Guid.Empty)
|
|
commands = new WorkFlowManager(null).GetWorkFlowCommands(scenario.Id, userId);
|
|
}
|
|
}
|
|
foreach (var cmd in commands)
|
|
{
|
|
retList.Add(new SelectListItem
|
|
{
|
|
Text = cmd.command,
|
|
Value = cmd.command
|
|
});
|
|
}
|
|
return retList;
|
|
}
|
|
public static IEnumerable<SelectListItem> GetProjectInternalContacts(Guid? companyId)
|
|
{
|
|
List<SelectListItem> retList = new List<SelectListItem>();
|
|
if (companyId.HasValue)
|
|
{
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
retList.AddRange(dbContext.Contacts
|
|
.Where(x => x.ParentId == companyId && x.Type == (int)ContactType.CompanyContact)
|
|
.Select(x => new SelectListItem
|
|
{
|
|
Text = x.FirstName + " " + x.LastName,
|
|
Value = x.Id.ToString()
|
|
}).OrderBy(x => x.Text));
|
|
}
|
|
}
|
|
return retList;
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetProjectExternalContacts(Guid? clientId)
|
|
{
|
|
List<SelectListItem> retList = new List<SelectListItem>();
|
|
if (clientId.HasValue)
|
|
{
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
retList.AddRange(dbContext.Contacts
|
|
.Where(x => x.ParentId == clientId && x.Type == ContactType.ClientContact)
|
|
.Select(x => new SelectListItem
|
|
{
|
|
Text = x.FirstName + " " + x.LastName,
|
|
Value = x.Id.ToString()
|
|
}).OrderBy(x => x.Text));
|
|
}
|
|
}
|
|
return retList;
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetGLAccounts(bool useEmptyElement = false)
|
|
{
|
|
var options = new List<SelectListItem>();
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var glAccounts = dbContext.GLAccounts.AsNoTracking();
|
|
options.AddRange(glAccounts.Select(glAccount => new SelectListItem
|
|
{
|
|
Value = glAccount.Id.ToString(),
|
|
Text = glAccount.Name
|
|
}).OrderBy(x => x.Text));
|
|
}
|
|
if (useEmptyElement)
|
|
options.Insert(0, new SelectListItem());
|
|
return options;
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetAllViews(bool useEmptyElement = false)
|
|
{
|
|
var options = new List<SelectListItem>();
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var views = dbContext.Views.AsNoTracking();
|
|
options.AddRange(views.Select(view => new SelectListItem
|
|
{
|
|
Value = view.Id.ToString(),
|
|
Text = view.Name
|
|
}).OrderBy(x => x.Text));
|
|
}
|
|
if (useEmptyElement)
|
|
options.Insert(0, new SelectListItem());
|
|
return options;
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetUnitsOfMeasure()
|
|
{
|
|
var options = new List<SelectListItem>();
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var unitsOfMeasure = dbContext.UOMs.AsNoTracking();
|
|
options.AddRange(unitsOfMeasure.Select(unitOfMeasure => new SelectListItem
|
|
{
|
|
Value = unitOfMeasure.Id.ToString(),
|
|
Text = unitOfMeasure.Name + " " + unitOfMeasure.UOMValue.ToString()
|
|
}).OrderBy(x => x.Text));
|
|
}
|
|
return options;
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetCreditDepartments(bool useEmptyElement = false)
|
|
{
|
|
var options = new List<SelectListItem>();
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var creditDepartments = dbContext.CreditDepartments.AsNoTracking().ToList();
|
|
options.AddRange(creditDepartments.Select(creditDepartment => new SelectListItem()
|
|
{
|
|
Value = creditDepartment.Id.ToString(),
|
|
Text = string.IsNullOrEmpty(creditDepartment.CreditNumber) ? creditDepartment.Name : $"{creditDepartment.Name} ({creditDepartment.CreditNumber})"
|
|
}).OrderBy(x => x.Text));
|
|
}
|
|
if (useEmptyElement)
|
|
options.Insert(0, new SelectListItem());
|
|
return options;
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetTeams(bool useEmptyElement = false)
|
|
{
|
|
var options = new List<SelectListItem>();
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var teams = dbContext.Teams.AsNoTracking();
|
|
foreach (Team team in teams.OrderBy(x => x.Name))
|
|
{
|
|
options.Add(new SelectListItem()
|
|
{
|
|
Value = team.Id.ToString(),
|
|
Text = team.Name,
|
|
});
|
|
}
|
|
}
|
|
if (useEmptyElement)
|
|
options.Insert(0, new SelectListItem());
|
|
return options;
|
|
}
|
|
|
|
public class SelectListItemExt : SelectListItem
|
|
{
|
|
public bool IsAccessible { get; set; }
|
|
}
|
|
public static IEnumerable<SelectListItemExt> GetTeams(string userId, bool useEmptyElement = false)
|
|
{
|
|
var options = new List<SelectListItemExt>();
|
|
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var teamAccess = SecurityManager.GetTeamPermissionsForUser(dbContext, userId, null);
|
|
var teamIds = teamAccess.Keys.ToArray();
|
|
options.AddRange(dbContext.Teams.OrderBy(x => x.Name).Select(t => new SelectListItemExt
|
|
{
|
|
Value = t.Id.ToString(),
|
|
Text = t.Name,
|
|
IsAccessible = teamIds.Contains(t.Id) //(t.User2Team.FirstOrDefault(u2t => u2t.UserId.Equals(userId)) != null)
|
|
}).AsNoTracking());
|
|
}
|
|
if (useEmptyElement)
|
|
options.Insert(0, new SelectListItemExt());
|
|
return options;
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetStrategicGoals(Guid? companyId, bool useEmptyElement = false)
|
|
{
|
|
var options = new List<SelectListItem>();
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var goals = dbContext.StrategicGoal2Company.AsNoTracking().Where(x => x.CompanyId == companyId.Value).Select(x => x.StrategicGoal).Distinct().OrderBy(x => x.Name).ToList();
|
|
foreach (StrategicGoal goal in goals)
|
|
{
|
|
options.Add(new SelectListItem
|
|
{
|
|
Value = goal.Id.ToString(),
|
|
Text = goal.Name,
|
|
});
|
|
}
|
|
}
|
|
if (useEmptyElement)
|
|
options.Insert(0, new SelectListItem());
|
|
return options;
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetTeamsAvailableForUser(Guid userId, bool useEmptyElement = false, bool useBlankElement = false, Guid? selectedTeam = null)
|
|
{
|
|
var options = new List<SelectListItem>();
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
//var user2team = dbContext.VW_User2Team.AsNoTracking().Where(t => t.UserId.Equals(userId)).Select(t => t.TeamId).ToArray();
|
|
var user2Team = SecurityManager.GetTeamPermissionsForUser(dbContext, userId.ToString(), null)
|
|
.Select(x => x.Key).Distinct().ToArray(); ;
|
|
if (selectedTeam.HasValue && !Guid.Empty.Equals(selectedTeam.Value))
|
|
user2Team = user2Team.Union(new[] { selectedTeam.Value }).Distinct().ToArray();
|
|
|
|
var teams = dbContext.Teams.AsNoTracking().Where(t => user2Team.Contains(t.Id)).ToList();
|
|
foreach (Team team in teams.OrderBy(x => x.Name))
|
|
{
|
|
options.Add(new SelectListItem
|
|
{
|
|
Value = team.Id.ToString(),
|
|
Text = team.Name,
|
|
});
|
|
}
|
|
}
|
|
if (useEmptyElement)
|
|
{
|
|
var allItem = new SelectListItem();
|
|
if (!useBlankElement)
|
|
{
|
|
allItem.Text = "All";
|
|
allItem.Value = "All";
|
|
}
|
|
options.Insert(0, allItem);
|
|
}
|
|
return options;
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetViewsAvailableForUser(Guid userId, bool useEmptyElement = false)
|
|
{
|
|
var options = new List<SelectListItem>();
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var viewMngr = new ViewManager(dbContext);
|
|
var views = viewMngr.GetViewsByOwner(userId);
|
|
var viewsOrdered = views.OrderBy(x => x.Name).ToList();
|
|
|
|
//var user2view = dbContext.User2View.AsNoTracking().Where(t => t.UserId == userId).Select(t => t.ViewId).ToArray();
|
|
//var views = dbContext.Views.AsNoTracking().Where(t => user2view.Contains(t.Id)).ToList();
|
|
//foreach (View view in views.OrderBy(x => x.Name))
|
|
foreach (var view in viewsOrdered)
|
|
{
|
|
options.Add(new SelectListItem
|
|
{
|
|
Value = view.Id.ToString(),
|
|
Text = view.Name,
|
|
});
|
|
}
|
|
}
|
|
if (useEmptyElement)
|
|
{
|
|
var allItem = new SelectListItem
|
|
{
|
|
Text = "All",
|
|
Value = "All"
|
|
};
|
|
options.Insert(0, allItem);
|
|
}
|
|
return options;
|
|
}
|
|
|
|
public static List<SelectListItem> GetViewsTeamsAndCompanies(string userId, bool useEmptyElement)
|
|
{
|
|
using (var context = new EnVisageEntities())
|
|
{
|
|
var userIdGuid = new Guid(userId);
|
|
var result = new List<SelectListItem>();
|
|
|
|
#region Teams
|
|
|
|
var teamMngr = new TeamManager(context);
|
|
var teams = teamMngr.GetTeamsByUser(userIdGuid);
|
|
|
|
var teamgroup = new SelectListGroup()
|
|
{
|
|
Name = "Teams"
|
|
};
|
|
|
|
result.AddRange(teams.Select(x => new SelectListItem()
|
|
{
|
|
Value = x.TeamId.ToString(),
|
|
Text = x.Name,
|
|
Group = teamgroup
|
|
}));
|
|
|
|
#endregion
|
|
|
|
#region Views
|
|
|
|
var viewMngr = new ViewManager(context);
|
|
var views = viewMngr.GetViewsByOwner(userIdGuid);
|
|
|
|
var viewgroup = new SelectListGroup
|
|
{
|
|
Name = "Views"
|
|
};
|
|
|
|
result.AddRange(views.Select(x => new SelectListItem
|
|
{
|
|
Value = x.Id.ToString(),
|
|
Text = x.Name,
|
|
Group = viewgroup
|
|
}));
|
|
|
|
#endregion
|
|
|
|
#region Companies
|
|
|
|
var cmpnyMngr = new CompanyManager(context);
|
|
|
|
// Uncomment below, if only visible for user companies must be displayed by permissions
|
|
// var companies = cmpnyMngr.GetCompaniesByUser4Display(userIdGuid);
|
|
|
|
var companies = cmpnyMngr.GetCompaniesByUser4Display(null);
|
|
|
|
var companygroup = new SelectListGroup
|
|
{
|
|
Name = "Companies"
|
|
};
|
|
|
|
result.AddRange(companies.Select(x => new SelectListItem
|
|
{
|
|
Value = x.Id.ToString(),
|
|
Text = x.Name,
|
|
Group = companygroup
|
|
}));
|
|
|
|
#endregion
|
|
|
|
if (useEmptyElement)
|
|
{
|
|
var allitem = new SelectListItem
|
|
{
|
|
Text = "All",
|
|
Value = "All"
|
|
};
|
|
result.Insert(0, allitem);
|
|
}
|
|
return result;
|
|
}
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetUsers(bool useEmptyElement = false)
|
|
{
|
|
var options = new List<SelectListItem>();
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var users = dbContext.AspNetUsers.AsNoTracking();
|
|
options.AddRange(users.Select(user => new SelectListItem()
|
|
{
|
|
Value = user.Id,
|
|
Text = user.FirstName + " " + user.LastName
|
|
}).OrderBy(x => x.Text));
|
|
}
|
|
if (useEmptyElement)
|
|
options.Insert(0, new SelectListItem());
|
|
return options;
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetCategoryTypes(bool useEmptyElement = false)
|
|
{
|
|
var result = new List<SelectListItem>
|
|
{
|
|
new SelectListItem
|
|
{
|
|
Text = ExpenditureCategoryModel.CategoryTypes.Labor.ToDisplayValue(),
|
|
Value = ExpenditureCategoryModel.CategoryTypes.Labor.ToString()
|
|
},
|
|
new SelectListItem
|
|
{
|
|
Text = ExpenditureCategoryModel.CategoryTypes.Materials.ToDisplayValue(),
|
|
Value = ExpenditureCategoryModel.CategoryTypes.Materials.ToString()
|
|
},
|
|
new SelectListItem
|
|
{
|
|
Text = ExpenditureCategoryModel.CategoryTypes.Usage.ToDisplayValue(),
|
|
Value = ExpenditureCategoryModel.CategoryTypes.Usage.ToString()
|
|
}
|
|
};
|
|
if (useEmptyElement)
|
|
result.Insert(0, new SelectListItem());
|
|
return result;
|
|
}
|
|
|
|
public static List<SelectListItem> CastEnumToSelectedList<T>()
|
|
{
|
|
if (!typeof(T).IsEnum)
|
|
return new List<SelectListItem>();
|
|
|
|
return Enum.GetValues(typeof(T)).Cast<T>().Select(x => new SelectListItem()
|
|
{
|
|
Text = (x as Enum).ToDisplayValue(),
|
|
Value = x.GetHashCode().ToString()
|
|
}).OrderBy(x => x.Text).ToList();
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetUseTypes()
|
|
{
|
|
return new List<SelectListItem>
|
|
{
|
|
new SelectListItem
|
|
{
|
|
Text = ExpenditureCategoryModel.UseTypes.Quantity.ToDisplayValue(),
|
|
Value = ExpenditureCategoryModel.UseTypes.Quantity.GetHashCode().ToString()
|
|
},
|
|
new SelectListItem
|
|
{
|
|
Text = ExpenditureCategoryModel.UseTypes.Cost.ToDisplayValue(),
|
|
Value = ExpenditureCategoryModel.UseTypes.Cost.GetHashCode().ToString()
|
|
}
|
|
//,
|
|
//new SelectListItem
|
|
//{
|
|
// Text = ExpenditureCategoryModel.UseTypes.Calculated.ToDisplayValue(),
|
|
// Value = ExpenditureCategoryModel.UseTypes.Calculated.GetHashCode().ToString()
|
|
//},
|
|
//new SelectListItem
|
|
//{
|
|
// Text = ExpenditureCategoryModel.UseTypes.Fee.ToDisplayValue(),
|
|
// Value = ExpenditureCategoryModel.UseTypes.Fee.GetHashCode().ToString()
|
|
//}
|
|
|
|
};
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetIncomeTypes(bool useEmptyItem = false)
|
|
{
|
|
var options = new List<SelectListItem>();
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var systemAttributes = dbContext.SystemAttributes.AsNoTracking().Where(t => t.Type == (int)SystemAttributeModel.Type.IncomeType);
|
|
options.AddRange(systemAttributes.Select(systemAttribute => new SelectListItem()
|
|
{
|
|
Value = systemAttribute.Id.ToString(),
|
|
Text = systemAttribute.Name
|
|
}).OrderBy(x => x.Text));
|
|
}
|
|
if (useEmptyItem)
|
|
options.Insert(0, new SelectListItem());
|
|
return options;
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetCGEFX(bool useEmptyElement = false)
|
|
{
|
|
var result = new List<SelectListItem>
|
|
{
|
|
new SelectListItem
|
|
{
|
|
Text = ExpenditureCategoryModel.CgEfx.CG.ToDisplayValue(),
|
|
Value = ExpenditureCategoryModel.CgEfx.CG.ToDisplayValue()
|
|
},
|
|
new SelectListItem
|
|
{
|
|
Text = ExpenditureCategoryModel.CgEfx.EFX.ToDisplayValue(),
|
|
Value = ExpenditureCategoryModel.CgEfx.EFX.ToDisplayValue()
|
|
}
|
|
};
|
|
if (useEmptyElement)
|
|
result.Insert(0, new SelectListItem());
|
|
return result;
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetNonProjectTimeCategories(Guid? excludeCategoryId = null)
|
|
{
|
|
var options = new List<SelectListItem>();
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var items = dbContext.NonProjectTimeCategories.Where(x => (excludeCategoryId.HasValue && x.Id != excludeCategoryId.Value) || !excludeCategoryId.HasValue).AsNoTracking().ToArray();
|
|
options.AddRange(items.OrderBy(t => t.Name).Select(item => new SelectListItem()
|
|
{
|
|
Value = item.Id.ToString(),
|
|
Text = item.Name
|
|
}).OrderBy(x => x.Text));
|
|
}
|
|
if (options.Count == 0)
|
|
options.Insert(0, new SelectListItem());
|
|
return options;
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetScenarioTemplates(bool useEmptyElement = false)
|
|
{
|
|
var options = new List<SelectListItem>();
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var items = dbContext.Scenarios.AsNoTracking().Where(t => t.Type == (int?)ScenarioType.Template && t.Status == (int?)ScenarioStatus.Active).ToArray();
|
|
options.AddRange(items.OrderBy(t => t.Name).Select(item => new SelectListItem()
|
|
{
|
|
Value = item.Id.ToString(),
|
|
Text = item.Name
|
|
}).OrderBy(x => x.Text));
|
|
}
|
|
if (useEmptyElement)
|
|
options.Insert(0, new SelectListItem());
|
|
return options;
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetFactorTypes()
|
|
{
|
|
return new List<SelectListItem>
|
|
{
|
|
new SelectListItem
|
|
{
|
|
Text = CalculatesCategoryModel.FactorTypes.Divide.ToDisplayValue(),
|
|
Value = CalculatesCategoryModel.FactorTypes.Divide.GetHashCode().ToString()
|
|
},
|
|
new SelectListItem
|
|
{
|
|
Text = CalculatesCategoryModel.FactorTypes.Multipiy.ToDisplayValue(),
|
|
Value = CalculatesCategoryModel.FactorTypes.Multipiy.GetHashCode().ToString()
|
|
}
|
|
};
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetProjectStatusDropdown(bool includeEmpty = true)
|
|
{
|
|
var options = new List<SelectListItem>();
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var projectStatuses = dbContext.Status.ToList();
|
|
if (includeEmpty)
|
|
{
|
|
var allItem = new SelectListItem()
|
|
{
|
|
Text = "All",
|
|
Value = "All"
|
|
};
|
|
options.Add(allItem);
|
|
}
|
|
options.AddRange(projectStatuses.Select(status => new SelectListItem()
|
|
{
|
|
Value = status.Id.ToString(),
|
|
Text = status.Name
|
|
}).OrderBy(x => x.Text));
|
|
}
|
|
return options;
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetStrategicGoalsDropdown(bool includeEmpty = true)
|
|
{
|
|
var options = new List<SelectListItem>();
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var strategicGoals = dbContext.StrategicGoals.ToList();
|
|
if (includeEmpty)
|
|
{
|
|
var allItem = new SelectListItem
|
|
{
|
|
Text = "All",
|
|
Value = "All"
|
|
};
|
|
options.Add(allItem);
|
|
}
|
|
options.AddRange(strategicGoals.Select(goal => new SelectListItem
|
|
{
|
|
Value = goal.Id.ToString(),
|
|
Text = goal.Name
|
|
}).OrderBy(x => x.Text));
|
|
}
|
|
return options;
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetProjectClassificationDropdown(bool includeEmpty = true)
|
|
{
|
|
var options = new List<SelectListItem>();
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var projectClassifications = dbContext.Types.ToList();
|
|
if (includeEmpty)
|
|
{
|
|
var allItem = new SelectListItem
|
|
{
|
|
Text = "All",
|
|
Value = "All"
|
|
};
|
|
options.Add(allItem);
|
|
}
|
|
options.AddRange(projectClassifications.Select(classification => new SelectListItem
|
|
{
|
|
Value = classification.Id.ToString(),
|
|
Text = classification.Name
|
|
}));
|
|
}
|
|
return options;
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetScenarioGroup(bool includeEmpty = true)
|
|
{
|
|
var options = new List<SelectListItem>();
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var scenarioGroup = dbContext.SystemAttributes.AsNoTracking().Where(t => t.Type == 3).OrderBy(x => x.Name);
|
|
if (includeEmpty)
|
|
{
|
|
options.Add(new SelectListItem
|
|
{
|
|
Text = "Default",
|
|
Value = Guid.Empty.ToString()
|
|
});
|
|
}
|
|
options.AddRange(scenarioGroup.Select(group => new SelectListItem()
|
|
{
|
|
Value = group.Id.ToString(),
|
|
Text = group.Name
|
|
}).OrderBy(x => x.Text));
|
|
}
|
|
return options;
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetListboxItems<T>()
|
|
{
|
|
var options = new List<SelectListItem>();
|
|
//if (type is Enum)
|
|
T t = default(T);
|
|
{
|
|
foreach (string e in Enum.GetNames(t.GetType()))
|
|
{
|
|
object value = Enum.Parse(t.GetType(), e);
|
|
|
|
var members = value.GetType().GetMember(value.ToString());
|
|
var attr = members.Length > 0
|
|
? members[0].GetCustomAttributes(typeof(DisplayValueAttribute), true)
|
|
.Cast<DisplayValueAttribute>()
|
|
.FirstOrDefault()
|
|
: null;
|
|
|
|
options.Add(new SelectListItem()
|
|
{
|
|
Text = attr == null ? value.ToString() : attr.DisplayValue,
|
|
Value = value.GetHashCode().ToString()
|
|
});
|
|
}
|
|
}
|
|
return options;
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetScenarioTypesPortfAndSched()
|
|
{
|
|
return new List<SelectListItem>
|
|
{
|
|
new SelectListItem
|
|
{
|
|
Text = ScenarioType.Portfolio.ToDisplayValue(),
|
|
Value = ScenarioType.Portfolio.ToString()
|
|
},
|
|
new SelectListItem
|
|
{
|
|
Text = ScenarioType.Scheduling.ToDisplayValue(),
|
|
Value = ScenarioType.Scheduling.ToString()
|
|
}
|
|
}.OrderBy(x => x.Text);
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetContactTypes()
|
|
{
|
|
List<SelectListItem> retList = new List<SelectListItem>();
|
|
foreach (int e in Enum.GetValues(typeof(ContactType)))
|
|
{
|
|
retList.Add(new SelectListItem
|
|
{
|
|
Text = ((ContactType)e).ToDisplayValue(),
|
|
Value = e.ToString(),
|
|
});
|
|
}
|
|
return retList;
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetYesNo()
|
|
{
|
|
List<SelectListItem> retList = new List<SelectListItem>();
|
|
|
|
retList.Add(new SelectListItem()
|
|
{
|
|
Text = "Yes",
|
|
Value = "Yes"
|
|
});
|
|
retList.Add(new SelectListItem()
|
|
{
|
|
Text = "No",
|
|
Value = "No"
|
|
});
|
|
|
|
return retList;
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetContactClassification()
|
|
{
|
|
List<SelectListItem> retList = new List<SelectListItem>();
|
|
|
|
foreach (var classification in Enum.GetValues(typeof(InternalContactClassification)))
|
|
retList.Add(new SelectListItem()
|
|
{
|
|
Text = Enum.GetName(typeof(InternalContactClassification), classification),
|
|
Value = classification.ToString()
|
|
});
|
|
|
|
return retList;
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetTeamContacts(Guid? companyId)
|
|
{
|
|
List<SelectListItem> retList = new List<SelectListItem>();
|
|
|
|
retList.Add(new SelectListItem()
|
|
{
|
|
Text = "None",
|
|
Value = Guid.Empty.ToString()
|
|
});
|
|
|
|
if (companyId.HasValue)
|
|
{
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
retList.AddRange(dbContext.Contacts
|
|
.Where(x => x.ParentId == companyId &&
|
|
x.ContactClassification == (int)InternalContactClassification.ResourceManagerContact)
|
|
.Select(x => new SelectListItem()
|
|
{
|
|
Text = x.FirstName + " " + x.LastName,
|
|
Value = x.Id.ToString()
|
|
}));
|
|
}
|
|
}
|
|
|
|
return retList;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns a list of report groups for nav menu. Each group is represented by group name (key) and list of reports (value), each report represented by Type (key) and report name (value).
|
|
/// Result list also contains a group with string.Empty name which represents a "group" of non-grouped reports.
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public static List<KeyValuePair<string, List<KeyValuePair<System.Type, string>>>> GetReports()
|
|
{
|
|
var groups = new Dictionary<string, List<ReportMenuItemModel>> { { string.Empty, new List<ReportMenuItemModel>() } };
|
|
|
|
foreach (var type in Assembly.GetAssembly(typeof(Reports.ResourceAvailability)).GetTypes()
|
|
.Where(t => t.IsClass && !t.IsAbstract && t.IsSubclassOf(typeof(Telerik.Reporting.Report))))
|
|
{
|
|
var rptName = type.Name;
|
|
var nameField = type.GetField("PrevuReportName", BindingFlags.Public | BindingFlags.Static);
|
|
if (nameField != null)
|
|
rptName = (string)nameField.GetValue(null);
|
|
|
|
var rptPosition = int.MaxValue;
|
|
var positionField = type.GetField("PrevuReportPosition", BindingFlags.Public | BindingFlags.Static);
|
|
if (positionField != null)
|
|
rptPosition = (int)positionField.GetValue(null);
|
|
|
|
string groupName = null;
|
|
var groupField = type.GetField("PrevuReportGroupName", BindingFlags.Public | BindingFlags.Static);
|
|
if (groupField != null)
|
|
groupName = (string)groupField.GetValue(null);
|
|
|
|
string clientId = null;
|
|
var ClientField = type.GetField("PrevuReportClientName", BindingFlags.Public | BindingFlags.Static);
|
|
if (ClientField != null)
|
|
clientId = (string) ClientField.GetValue(null);
|
|
bool canViewReport = true;
|
|
if (!string.IsNullOrEmpty(clientId))
|
|
{
|
|
canViewReport = false;
|
|
var url = HttpContext.Current.Request.Url.Host.ToLower();
|
|
if (url.Contains(clientId.ToLower()) || url.StartsWith("qa.prevuplan") || url.Contains("localhost"))
|
|
canViewReport = true;
|
|
}
|
|
if (canViewReport)
|
|
{
|
|
if (!string.IsNullOrEmpty(groupName))
|
|
{
|
|
if (!groups.ContainsKey(groupName))
|
|
groups.Add(groupName, new List<ReportMenuItemModel>());
|
|
|
|
groups[groupName].Add(new ReportMenuItemModel { Name = rptName, SystemName = type, Position = rptPosition });
|
|
}
|
|
else
|
|
{
|
|
groups[string.Empty].Add(new ReportMenuItemModel { Name = rptName, SystemName = type, Position = rptPosition });
|
|
}
|
|
}
|
|
}
|
|
|
|
return groups.Keys.OrderBy(k => k).Select(key => new KeyValuePair<string, List<KeyValuePair<System.Type, string>>>(key, groups[key].OrderBy(r => r.Position).ThenBy(w => w.Name).ThenBy(e => e.SystemName.Name).Select(q => new KeyValuePair<System.Type, string>(q.SystemName, q.Name)).ToList())).ToList();
|
|
}
|
|
|
|
public class DateRange
|
|
{
|
|
public DateTime StartDate { get; set; }
|
|
public DateTime EndDate { get; set; }
|
|
}
|
|
|
|
public static bool IsDateRangesIntersect(DateRange range1, DateRange range2)
|
|
{
|
|
// if ranges are equal - they intersected
|
|
if (range1.StartDate == range2.StartDate && range1.EndDate == range2.EndDate)
|
|
return true;
|
|
|
|
// ranges not intersected if...
|
|
if ((range1.StartDate > range2.EndDate) || (range2.StartDate > range1.EndDate))
|
|
return false;
|
|
|
|
// if range1 partially intersect with range2
|
|
if ((range1.StartDate >= range2.StartDate && range1.StartDate < range2.EndDate)
|
|
|| (range2.StartDate >= range1.StartDate && range2.StartDate < range1.EndDate))
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
public static bool IsDateRangesStacked(DateTime startDate1, DateTime startDate2, DateTime? endDate1 = null, DateTime? endDate2 = null)
|
|
{
|
|
// two not closed records can not be intersected
|
|
if (!endDate1.HasValue && !endDate2.HasValue)
|
|
return false;
|
|
|
|
// if 1st range is closed and 2nd is not
|
|
if (endDate1.HasValue && !endDate2.HasValue)
|
|
{
|
|
// ranges are stacked if 1st ends 1 day before 2nd starts
|
|
if (endDate1.Value.AddDays(1) == startDate2)
|
|
return true;
|
|
}
|
|
// if 2nd range is closed and 1st is not
|
|
if (!endDate1.HasValue && endDate2.HasValue)
|
|
{
|
|
// ranges are stacked if 2nd ends 1 day before 1st starts
|
|
if (endDate2.Value.AddDays(1) == startDate1)
|
|
return true;
|
|
}
|
|
// if both ranges are closed
|
|
if (endDate1.HasValue && endDate2.HasValue)
|
|
{
|
|
// ranges are stacked if 2nd ends 1 day before 1st starts
|
|
if (endDate2.Value.AddDays(1) == startDate1)
|
|
return true;
|
|
// ranges are stacked if 1st ends 1 day before 2nd starts
|
|
if (endDate1.Value.AddDays(1) == startDate2)
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets a multiplier to be applied to scenario detail quantity or rate, value depends on provided expenditure category's UOM value.
|
|
/// </summary>
|
|
/// <param name="expCatId">Expenditure Category Id.</param>
|
|
/// <param name="uomMode">Value indicating selected UOM Mode.<br/>
|
|
/// null - UOM Mode has not been selected. Use default value = 1;<br/>
|
|
/// true - UOM Mode is Hours. Returned value is 1.
|
|
/// false - UOM Mode is Resources. Returned value depends on provided expenditure category Id.
|
|
/// </param>
|
|
/// <param name="categories">Dictionary of all available expenditure categories used as source to search for provided <paramref name="expCatId"/>. Key is Category.Id</param>
|
|
/// <param name="uoms">Dictionary of all Unit of Measures used as a source to search for UOM value. Key is UoM.Id</param>
|
|
/// <returns>Returns a decimal multiplier value depending on provided expenditure category's UOM value.</returns>
|
|
public static decimal GetUOMMultiplier(Dictionary<Guid, ExpenditureCategory> categories, Dictionary<Guid, UOM> uoms, Guid expCatId, bool? uomMode)
|
|
{
|
|
if (!uomMode.HasValue || uomMode.Value)
|
|
return Constants.UOM_HOURS_MULTIPLIER;
|
|
|
|
if (categories == null)
|
|
throw new UOMNotExistsException("Cannot calculate UOM multiplier because categories param is null");
|
|
if (!categories.Any())
|
|
throw new UOMNotExistsException("Cannot calculate UOM multiplier because categories is empty");
|
|
if (uoms == null)
|
|
throw new UOMNotExistsException("Cannot calculate UOM multiplier because uoms param is null");
|
|
if (!uoms.Any())
|
|
throw new UOMNotExistsException("Cannot calculate UOM multiplier because uoms param is empty");
|
|
|
|
ExpenditureCategory category = null;
|
|
if (categories.ContainsKey(expCatId))
|
|
category = categories[expCatId];
|
|
if (category == null)
|
|
throw new UOMNotExistsException("Cannot calculate UOM multiplier because categories param does not contain category with Id [" + expCatId + "]");
|
|
|
|
UOM uom = null;
|
|
if (uoms.ContainsKey(category.UOMId))
|
|
uom = uoms[category.UOMId];
|
|
if (uom == null)
|
|
throw new UOMNotExistsException("Cannot calculate UOM multiplier because uoms param does not contain UOM with Id [" + category.UOMId + "]");
|
|
if (uom.UOMValue == 0)
|
|
throw new UOMNotExistsException(
|
|
$"Cannot calculate UOM multiplier because UOM with Id [{category.UOMId}] have UOMValue equals to {uom.UOMValue}");
|
|
|
|
return 1 / uom.UOMValue;
|
|
}
|
|
|
|
|
|
public static List<MixTeamViewModel> GetViewsAndTeams(string userId)
|
|
{
|
|
var groupViews = new SelectListGroup {Name = "Views"};
|
|
var groupTeams = new SelectListGroup {Name = "Teams"};
|
|
using (var context = new EnVisageEntities())
|
|
{
|
|
var views = context.User2View.AsNoTracking()
|
|
.Where(x => x.UserId == new Guid(userId))
|
|
.Select(x => x.View)
|
|
.OrderBy(x => x.Name)
|
|
.ToList();
|
|
|
|
var user2Teams = SecurityManager.GetTeamPermissionsForUser(context, userId, null).Select(x => x.Key).Distinct().ToList();
|
|
var teams = context.Teams.AsNoTracking().Where(x => user2Teams.Contains(x.Id))
|
|
.OrderBy(x => x.Name)
|
|
.ToList();
|
|
|
|
var result = new List<MixTeamViewModel>(views.Count + teams.Count);
|
|
|
|
result.AddRange(views.Select(x => new MixTeamViewModel
|
|
{
|
|
Id = x.Id.ToString(),
|
|
TVName = x.Name,
|
|
CompanyId = null,//x.Company2View.FirstOrDefault().CompanyId,
|
|
CostCenterId = null,
|
|
CapacityTeamId = null,
|
|
CopyPlanned = false,
|
|
Data = null,
|
|
UserId = null,
|
|
IsNew = false,
|
|
Group = groupViews
|
|
}));
|
|
|
|
result.AddRange(teams.Select(x => new MixTeamViewModel
|
|
{
|
|
Id = x.Id.ToString(),
|
|
TVName = x.Name,
|
|
CompanyId = null,//x.Company2View.FirstOrDefault().CompanyId,
|
|
CostCenterId = null,
|
|
CapacityTeamId = null,
|
|
CopyPlanned = false,
|
|
Data = null,
|
|
UserId = null,
|
|
IsNew = false,
|
|
Group = groupTeams
|
|
}));
|
|
|
|
return result;
|
|
}
|
|
}
|
|
|
|
//public static List<SelectListItem> GetMixesAvailable4User(string userId)
|
|
//{
|
|
// using (var context = new EnVisageEntities())
|
|
// {
|
|
// // ! SA. Remove try..catch block, when the struct for savable data be finished
|
|
// try
|
|
// {
|
|
// MongoMixManager mngr = new MongoMixManager(context, userId);
|
|
// var foundMixes = mngr.GetMixesByUser();
|
|
|
|
// if (foundMixes != null)
|
|
// {
|
|
// return foundMixes.Select(x => new SelectListItem
|
|
// {
|
|
// Value = x.Id.ToString(),
|
|
// Text = x.Name
|
|
// }).ToList();
|
|
// }
|
|
// return new List<SelectListItem>();
|
|
// }
|
|
// catch (FormatException formatException)
|
|
// {
|
|
// var logger = NLog.LogManager.GetCurrentClassLogger();
|
|
// logger.Error(formatException);
|
|
// return new List<SelectListItem>();
|
|
// }
|
|
// }
|
|
//}
|
|
|
|
public static long ConvertToUnixDate(DateTime date)
|
|
{
|
|
return (long)date.Subtract(Constants.UnixEpochDate).TotalMilliseconds;
|
|
}
|
|
|
|
public static DateTime ConvertFromUnixDate(long milliseconds)
|
|
{
|
|
if (milliseconds <= 0)
|
|
return Constants.UnixEpochDate;
|
|
|
|
return Constants.UnixEpochDate.AddMilliseconds(milliseconds);
|
|
}
|
|
|
|
public static string Serialize<T>(this T value)
|
|
{
|
|
if (value == null)
|
|
{
|
|
return string.Empty;
|
|
}
|
|
try
|
|
{
|
|
var xmlserializer = new XmlSerializer(typeof(T));
|
|
using (var stringWriter = new StringWriter())
|
|
using (var writer = XmlWriter.Create(stringWriter))
|
|
{
|
|
xmlserializer.Serialize(writer, value);
|
|
return stringWriter.ToString();
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
throw new Exception("An error occurred", ex);
|
|
}
|
|
}
|
|
public static T Deserialize<T>(this string value)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(value))
|
|
{
|
|
return default(T);
|
|
}
|
|
try
|
|
{
|
|
XmlSerializer serializer = new XmlSerializer(typeof(T));
|
|
T result;
|
|
using (TextReader reader = new StringReader(value))
|
|
{
|
|
result = (T)serializer.Deserialize(reader);
|
|
}
|
|
return result;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
throw new Exception("An error occurred while deserialization", ex);
|
|
}
|
|
}
|
|
|
|
public static string ByteArrayToString(this byte[] ba)
|
|
{
|
|
if (null == ba || ba.Length == 0)
|
|
return string.Empty;
|
|
StringBuilder hex = new StringBuilder(ba.Length * 2);
|
|
foreach (byte b in ba)
|
|
hex.AppendFormat("{0:x2}", b);
|
|
return hex.ToString();
|
|
}
|
|
public static byte[] StringToByteArray(this string hex)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(hex))
|
|
return new byte[0];
|
|
int numberChars = hex.Length;
|
|
byte[] bytes = new byte[numberChars / 2];
|
|
for (int i = 0; i < numberChars; i += 2)
|
|
bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
|
|
return bytes;
|
|
}
|
|
|
|
public static string GetResourseReportJson(List<Guid> resourceIds, DateTime startDate, DateTime endDate)
|
|
{
|
|
// to-do: temporary solution, we should get all records with one query
|
|
string result;
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var weekendings = dbContext.FiscalCalendars.AsNoTracking()
|
|
.Where(c => c.Type == 0 && c.StartDate >= startDate && c.EndDate <= endDate &&
|
|
c.AdjustingPeriod == false && c.NonWorking == 0)
|
|
.OrderBy(c => c.StartDate)
|
|
.Select(c => c.EndDate).ToArray();
|
|
var query =
|
|
dbContext.PeopleResources.Where(x => resourceIds.Contains(x.Id))
|
|
.Select(resource => new
|
|
{
|
|
resource,
|
|
weekdata = weekendings.AsQueryable()
|
|
.Select(weekending => new
|
|
{
|
|
weekending,
|
|
allocations = new Dictionary<string, decimal>()
|
|
})
|
|
}).AsEnumerable().ToList();
|
|
|
|
result = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(query);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public static string FormatDateRange(DateTime startDate, DateTime? endDate, bool includeBoth)
|
|
{
|
|
if (!endDate.HasValue)
|
|
return "Permanent";
|
|
|
|
var totalDays = (int)Math.Ceiling(Math.Max((endDate.Value - startDate).TotalDays, 0)) + (includeBoth && endDate.Value >= startDate ? 1 : 0);
|
|
var weeks = (int)(totalDays / 7.0);
|
|
var days = totalDays % 7;
|
|
|
|
var weeksFormat = string.Empty;
|
|
var daysFormat = $"{days} day{(days > 1 ? "s" : string.Empty)}";
|
|
|
|
if (weeks > 0)
|
|
{
|
|
weeksFormat = $"{weeks} wk{(weeks > 1 ? "s" : string.Empty)}";
|
|
if (days <= 0)
|
|
daysFormat = string.Empty;
|
|
}
|
|
|
|
return $"{weeksFormat} {daysFormat}".Trim();
|
|
}
|
|
|
|
public static DateTime GetMiddleDate(DateTime startDate, DateTime endDate)
|
|
{
|
|
var daysBetween = (endDate - startDate).Days;
|
|
|
|
return startDate.AddDays(daysBetween / 2);
|
|
}
|
|
|
|
public static string GetDefaultProjectColor()
|
|
{
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
string defaultColor = "";
|
|
var settings = dbContext.SystemSettings.FirstOrDefault(
|
|
item =>
|
|
item.Type == (int)SystemSettingType.DefaultProjectColorType);
|
|
if (settings != null)
|
|
{
|
|
defaultColor = settings.Value;
|
|
}
|
|
if (!string.IsNullOrEmpty(defaultColor) && !defaultColor.StartsWith("#"))
|
|
defaultColor = "#" + defaultColor;
|
|
|
|
return defaultColor;
|
|
}
|
|
}
|
|
|
|
public static string GetProjectColor(ProjectWithChildrenView project, string defaultColor)
|
|
{
|
|
if (project == null)
|
|
return defaultColor;
|
|
|
|
var projectColor = project.Color;
|
|
var parentProjectColor = project.ParentProject?.Color;
|
|
var color = GetProjectColor(projectColor, parentProjectColor, defaultColor);
|
|
|
|
return color;
|
|
}
|
|
|
|
public static string GetProjectColor(string projectColor, string parentProjectColor, string defaultColor)
|
|
{
|
|
string color =
|
|
!string.IsNullOrEmpty(projectColor) ? projectColor.Contains('#') ? projectColor : "#" + projectColor :
|
|
(!string.IsNullOrWhiteSpace(parentProjectColor) ? parentProjectColor.Contains('#') ? parentProjectColor : "#" + parentProjectColor : null);
|
|
if (string.IsNullOrEmpty(color))
|
|
color = defaultColor;
|
|
|
|
return color;
|
|
}
|
|
public static IEnumerable<SelectListItem> GetWorkFlowSchemas(int workFlowSchemaType, Guid userId)
|
|
{
|
|
var retList = new List<SelectListItem>
|
|
{
|
|
new SelectListItem
|
|
{
|
|
Text = "",
|
|
Value = ""
|
|
}
|
|
};
|
|
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var schemas = dbContext.WorkflowSchemes.Where(x => x.ProcessType == workFlowSchemaType);
|
|
foreach (var s in schemas)
|
|
{
|
|
retList.Add(new SelectListItem
|
|
{
|
|
Text = s.Name,
|
|
Value = s.Code
|
|
});
|
|
}
|
|
}
|
|
|
|
return retList;
|
|
}
|
|
public static bool ProjectHasWorkFlowHistory(Guid projectId)
|
|
{
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var scenarios = dbContext.Scenarios.Where(x => x.ParentId == projectId && x.Type == (int)ScenarioType.Portfolio).Select(x => x.Id).ToList();
|
|
return dbContext.WorkFlowParallelApprovals.Any(x => scenarios.Contains(x.ProcessId));
|
|
}
|
|
}
|
|
public static IEnumerable<SelectListItem> GetEnumList(System.Type type, bool useEmptyElement)
|
|
{
|
|
var options = new List<SelectListItem>();
|
|
|
|
var names = Enum.GetNames(type);
|
|
foreach (var name in names)
|
|
{
|
|
|
|
|
|
options.Add(new SelectListItem()
|
|
{
|
|
Value = ((int)Enum.Parse(type, name)).ToString(),
|
|
Text = name,
|
|
|
|
});
|
|
|
|
|
|
}
|
|
if (useEmptyElement)
|
|
options.Insert(0, new SelectListItem());
|
|
return options;
|
|
}
|
|
public static string GetEnumDisplay(System.Type type, int value)
|
|
{
|
|
var names = Enum.GetNames(type);
|
|
foreach (var name in names)
|
|
{
|
|
if (value == ((int)Enum.Parse(type, name)))
|
|
return name;
|
|
}
|
|
|
|
return "N/A";
|
|
}
|
|
|
|
public static IEnumerable<SelectListItem> GetDependencyTypes()
|
|
{
|
|
List<SelectListItem> retList = new List<SelectListItem>();
|
|
foreach (int e in Enum.GetValues(typeof(ProjectDependencyDisplayType)))
|
|
{
|
|
retList.Add(new SelectListItem
|
|
{
|
|
Text = ((ProjectDependencyDisplayType)e).ToDisplayValue(),
|
|
Value = e.ToString(),
|
|
});
|
|
}
|
|
return retList;
|
|
}
|
|
public static IEnumerable<SelectListItem> GetDependencyResolveTypes()
|
|
{
|
|
List<SelectListItem> retList = new List<SelectListItem>();
|
|
foreach (int e in Enum.GetValues(typeof(DependencyResolveModel.ActionType)))
|
|
{
|
|
retList.Add(new SelectListItem
|
|
{
|
|
Text = ((DependencyResolveModel.ActionType)e).ToDisplayValue(),
|
|
Value = e.ToString(),
|
|
});
|
|
}
|
|
return retList;
|
|
}
|
|
public static IEnumerable<SelectListItem> GetDependencyResolveTypes(IEnumerable<DependencyResolveModel.ActionType> items)
|
|
{
|
|
List<SelectListItem> retList = new List<SelectListItem>();
|
|
foreach (var e in items)
|
|
{
|
|
retList.Add(new SelectListItem
|
|
{
|
|
Text = e.ToDisplayValue(),
|
|
Value = e.ToString(),
|
|
});
|
|
}
|
|
return retList;
|
|
}
|
|
public static IEnumerable<SelectListItem> GetListOfSceanriosWithApprovalHistory(Guid projectId)
|
|
{
|
|
List<SelectListItem> retList = new List<SelectListItem>();
|
|
using (var dbContext = new EnVisageEntities())
|
|
{
|
|
var scenarioIds = dbContext.Scenarios.Where(x => x.ParentId == projectId && x.Type == (int)ScenarioType.Portfolio).Select(x => x.Id).ToList();
|
|
var scenarioList = dbContext.vw_WorkflowApprovalHistoryInfo.Where(x => scenarioIds.Contains(x.ScenarioId)).Distinct();
|
|
// var scenarioList = (from wfpa in dbContext.WorkFlowParallelApprovals
|
|
//join u in dbContext.AspNetUsers on new {Id = wfpa.UserId.ToString()} equals new {u.Id}
|
|
//join c in dbContext.CreditDepartments on new {Id = wfpa.GroupId.Value} equals new {c.Id}
|
|
//join t in dbContext.Teams on new {CostCenterId = c.Id} equals new {CostCenterId = t.CostCenterId.Value}
|
|
//into tJoin from t in tJoin.DefaultIfEmpty()
|
|
//join t2 in dbContext.Teams on new {Id = wfpa.GroupId.Value} equals new {t2.Id}
|
|
//into t2Join from t2 in t2Join.DefaultIfEmpty()
|
|
//join s in dbContext.Scenarios on new {Id = wfpa.ProcessId} equals new {s.Id}
|
|
//into sJoin from s in sJoin.DefaultIfEmpty()
|
|
//select new {s.Name, id = s.Id}).Distinct().Where(x => scenarioIds.Contains(x.id)).ToList();
|
|
foreach (var e in scenarioList)
|
|
{
|
|
retList.Add(new SelectListItem
|
|
{
|
|
Text = e.ScenarioName,
|
|
Value = e.ScenarioId.ToString(),
|
|
});
|
|
}
|
|
}
|
|
return retList;
|
|
}
|
|
|
|
public static string HistoryValueHtml(string value, Guid? classificationId)
|
|
{
|
|
if (classificationId.HasValue && ColorClassificationIds.Contains(classificationId.Value))
|
|
{
|
|
var template = "<span class='color-value' style='background-color: #{0};'></span>";
|
|
if (!string.IsNullOrEmpty(value))
|
|
{
|
|
return string.Format(template, value);
|
|
}
|
|
}
|
|
return value;
|
|
}
|
|
|
|
public static string GetOrCreateTransactionId(EnVisageEntities dbContext, string transactionId)
|
|
{
|
|
if (string.IsNullOrEmpty(transactionId))
|
|
{
|
|
transactionId = dbContext.GetClientConnectionId();
|
|
if (string.IsNullOrEmpty(transactionId))
|
|
transactionId = Guid.NewGuid().ToString();
|
|
}
|
|
return transactionId;
|
|
}
|
|
}
|
|
} |