This commit is contained in:
2021-11-18 19:51:08 +00:00
parent 8aed8dc8ba
commit ec9ddce6d4

View File

@@ -107,7 +107,7 @@ namespace AyaNova.Biz
}
}
internal static async Task<CustomerRightsRecord> CustomerUserEffectiveRightsAsync(long userId, long? workorderId=null)
internal static async Task<CustomerRightsRecord> CustomerUserEffectiveRightsAsync(long userId, long? workorderId = null)
{
using (AyContext ct = ServiceProviderProvider.DBContext)
{
@@ -116,24 +116,31 @@ namespace AyaNova.Biz
if (UserInfo.UserType != UserType.Customer && UserInfo.UserType != UserType.HeadOffice)
throw new System.NotSupportedException($"UserBiz::CustomerUserEffectiveRights - Requested for non Customer type user with ID {userId} who is UserType: {UserInfo.UserType}");
List<string> AllTags = new List<string>();
AllTags.AddRange(UserInfo.Tags);
//In global settings there are potentially three separate sets of tags that need to be checked
List<string> ContactCustomerHOTagsCombined = new List<string>();//used for most of the customer access features to determine if can even access that feature
List<string> CustomerWorkOrderReportByTagTags = new List<string>();//CUSTOMER & WORKORDER TAGS COMBINED - used to determine correct report to use with customer wo report
List<string> CustomerWorkOrderWikiAttachmentTags = new List<string>();//CONTACT & CUSTOMER & HO & WO TAGS COMBINED - used to determine wo header access like wiki attachments
ContactCustomerHOTagsCombined.AddRange(UserInfo.Tags);
CustomerWorkOrderWikiAttachmentTags.AddRange(UserInfo.Tags);
bool EntityActive = false;
//Contact is for a customer or for a head office not both so...
if (UserInfo.CustomerId != null && UserInfo.CustomerId != 0)
{
var CustomerInfo = await ct.Customer.AsNoTracking().Where(x => x.Id == UserInfo.CustomerId).Select(x => new { x.HeadOfficeId, x.Tags, x.Active }).FirstAsync();
AllTags.AddRange(CustomerInfo.Tags);
ContactCustomerHOTagsCombined.AddRange(CustomerInfo.Tags);
CustomerWorkOrderReportByTagTags.AddRange(CustomerInfo.Tags);
CustomerWorkOrderWikiAttachmentTags.AddRange(CustomerInfo.Tags);
EntityActive = CustomerInfo.Active;
//does the customer have a head office??
if (CustomerInfo.HeadOfficeId != null && CustomerInfo.HeadOfficeId != 0)
AllTags.AddRange(await ct.HeadOffice.AsNoTracking().Where(x => x.Id == CustomerInfo.HeadOfficeId).Select(x => x.Tags).FirstAsync());
ContactCustomerHOTagsCombined.AddRange(await ct.HeadOffice.AsNoTracking().Where(x => x.Id == CustomerInfo.HeadOfficeId).Select(x => x.Tags).FirstAsync());
}
else if (UserInfo.HeadOfficeId != null && UserInfo.HeadOfficeId != 0)
{
var HOInfo = await ct.HeadOffice.AsNoTracking().Where(x => x.Id == UserInfo.HeadOfficeId).Select(x => new { x.Tags, x.Active }).FirstAsync();
AllTags.AddRange(HOInfo.Tags);
ContactCustomerHOTagsCombined.AddRange(HOInfo.Tags);
EntityActive = HOInfo.Active;
}
@@ -141,44 +148,81 @@ namespace AyaNova.Biz
if (UserInfo.UserType == UserType.Customer) EntityId = UserInfo.CustomerId ?? 0;
if (UserInfo.UserType == UserType.HeadOffice) EntityId = UserInfo.HeadOfficeId ?? 0;
bool WorkorderIsAllowed = CustomerUserEffectiveRightsAllowed(AyaNova.Util.ServerGlobalBizSettings.Cache.CustomerAllowViewWO,
ContactCustomerHOTagsCombined,
AyaNova.Util.ServerGlobalBizSettings.Cache.CustomerAllowViewWOInTags);
//Workorder access??
long? ThisWOEffectiveWorkOrderReportId = null;
bool ThisWOCanWiki = false;
bool ThisWOCanAttachments = false;
if (WorkorderIsAllowed)
{
//default report (may be null and may be more detailed tagged version below)
ThisWOEffectiveWorkOrderReportId = AyaNova.Util.ServerGlobalBizSettings.Cache.CustomerDefaultWorkOrderReportId;
//If a workorder id was provided add it's tags to the wo tag checking rights items
if (workorderId != null)
{
var WoTags = await ct.WorkOrder.AsNoTracking().Where(x => x.Id == workorderId).Select(x => x.Tags).FirstOrDefaultAsync();
if (WoTags != null)
{
CustomerWorkOrderReportByTagTags.AddRange(WoTags);
CustomerWorkOrderWikiAttachmentTags.AddRange(WoTags);
}
}
//determine effective wo report if not default, there are 5 slots, any could be used or not so just iterate from bottom to top, last one wins in case of ties
//this prioritizes the lowest numbered slot automatically, i.e. first choice
if (AyaNova.Util.ServerGlobalBizSettings.Cache.CustomerTagWorkOrderReport5Id != null && AyaNova.Util.ServerGlobalBizSettings.Cache.CustomerWorkOrderReport5Tags.Count > 0)
{
if (CustomerWorkOrderReportByTagTags.Intersect(AyaNova.Util.ServerGlobalBizSettings.Cache.CustomerWorkOrderReport5Tags).Any())
ThisWOEffectiveWorkOrderReportId = AyaNova.Util.ServerGlobalBizSettings.Cache.CustomerTagWorkOrderReport5Id;
}
}
return new CustomerRightsRecord(
CustomerUserEffectiveRightsAllowed(AyaNova.Util.ServerGlobalBizSettings.Cache.CustomerAllowCSR,
AllTags,
ContactCustomerHOTagsCombined,
AyaNova.Util.ServerGlobalBizSettings.Cache.CustomerAllowCSRInTags),
CustomerUserEffectiveRightsAllowed(AyaNova.Util.ServerGlobalBizSettings.Cache.CustomerAllowViewWO,
AllTags,
AyaNova.Util.ServerGlobalBizSettings.Cache.CustomerAllowViewWOInTags),
WorkorderIsAllowed,
CustomerUserEffectiveRightsAllowed(AyaNova.Util.ServerGlobalBizSettings.Cache.CustomerAllowWOWiki,
AllTags,
ContactCustomerHOTagsCombined,
AyaNova.Util.ServerGlobalBizSettings.Cache.CustomerAllowWOWikiInTags),
CustomerUserEffectiveRightsAllowed(AyaNova.Util.ServerGlobalBizSettings.Cache.CustomerAllowWOAttachments,
AllTags,
ContactCustomerHOTagsCombined,
AyaNova.Util.ServerGlobalBizSettings.Cache.CustomerAllowWOAttachmentsInTags),
CustomerUserEffectiveRightsAllowed(AyaNova.Util.ServerGlobalBizSettings.Cache.CustomerAllowUserSettings,
AllTags,
ContactCustomerHOTagsCombined,
AyaNova.Util.ServerGlobalBizSettings.Cache.CustomerAllowUserSettingsInTags),
CustomerUserEffectiveRightsAllowed(AyaNova.Util.ServerGlobalBizSettings.Cache.CustomerAllowNotifyServiceImminent,
AllTags,
ContactCustomerHOTagsCombined,
AyaNova.Util.ServerGlobalBizSettings.Cache.CustomerAllowNotifyServiceImminentInTags),
CustomerUserEffectiveRightsAllowed(AyaNova.Util.ServerGlobalBizSettings.Cache.CustomerAllowNotifyCSRAccepted,
AllTags,
ContactCustomerHOTagsCombined,
AyaNova.Util.ServerGlobalBizSettings.Cache.CustomerAllowNotifyCSRAcceptedInTags),
CustomerUserEffectiveRightsAllowed(AyaNova.Util.ServerGlobalBizSettings.Cache.CustomerAllowNotifyCSRRejected,
AllTags,
ContactCustomerHOTagsCombined,
AyaNova.Util.ServerGlobalBizSettings.Cache.CustomerAllowNotifyCSRRejectedInTags),
CustomerUserEffectiveRightsAllowed(AyaNova.Util.ServerGlobalBizSettings.Cache.CustomerAllowNotifyWOCreated,
AllTags,
ContactCustomerHOTagsCombined,
AyaNova.Util.ServerGlobalBizSettings.Cache.CustomerAllowNotifyWOCreatedInTags),
CustomerUserEffectiveRightsAllowed(AyaNova.Util.ServerGlobalBizSettings.Cache.CustomerAllowNotifyWOCompleted,
AllTags,
ContactCustomerHOTagsCombined,
AyaNova.Util.ServerGlobalBizSettings.Cache.CustomerAllowNotifyWOCompletedInTags),
EntityId,
EntityActive
@@ -188,27 +232,27 @@ namespace AyaNova.Biz
}
private static bool CustomerUserEffectiveRightsAllowed(bool allowed, List<string> contactTags, List<string> inTags)
private static bool CustomerUserEffectiveRightsAllowed(bool globalSettingsAllows, List<string> contactCustomerHOTagsCombined, List<string> inTags)
{
//Note: tag match rule as planned and documented is that it's a match if *any* single tag in intags are a match to any single tag in contact tags,
//not the whole list, just any one of them which differs from how notifications are checked for example which need to *all* match
//if outright banned then quickest short circuit here
if (!allowed) return false;
if (!globalSettingsAllows) return false;
//No tags to verify means allowed
if (inTags.Count == 0 ) return true;
if (inTags.Count == 0) return true;
//if contact tags is empty and inclusive is empty then it's a match and can short circuit
if (contactTags.Count == 0) return true;
//if tags is empty and inclusive is empty then it's a match and can short circuit
if (contactCustomerHOTagsCombined.Count == 0) return true;
//if contact tags is empty and inclusive is not empty then no match is possible
if (contactTags.Count == 0 ) return false;
//if tags is empty and inclusive is not empty then no match is possible
if (contactCustomerHOTagsCombined.Count == 0) return false;
//any of the inclusive tags in contact tags?
if (contactTags.Intersect(inTags).Any()) return true;
//any of the inclusive tags in tags?
if (contactCustomerHOTagsCombined.Intersect(inTags).Any()) return true;
return false;//this is because there are contact and in tags but there is no match
return false;//this is because there are contactCustomerHOTagsCombined and in tags but there is no match
}