This commit is contained in:
2022-10-25 11:55:32 +01:00
parent 6c853d4091
commit d95d49d4c6
76 changed files with 3242 additions and 222 deletions
@@ -74,7 +74,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
// Utilites.
private ItemId GetUserItemId(SysId userAccountId)
{
return new ItemId((short)Sax.DataItemType.UserAccount, UserAccountId);
return new ItemId((short)Sax.DataItemType.UserAccount, userAccountId);
}
//-------------------------------------------------------------------
@@ -122,11 +122,11 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
responseData.ImageContentTypes = SaxItemImage.GetValidContentTypes(Sax.DataItemType.UserAccount);
// Retrieve user details.
SaxUserAccount userAccount = AccountMgr.GetUserAccountById(UserAccountId);
SaxUserAccount userAccount = AccountMgr.GetUserAccountById(SessionUserAccountId);
disposableItems.Add(userAccount);
if (userAccount == null)
{
SaLogger.Warn(fn + " Failed to retrieve user account for Id: " + SysId.ToString(UserAccountId));
SaLogger.Warn(fn + " Failed to retrieve user account for Id: " + SysId.ToString(SessionUserAccountId));
return Json(responseData.SetGoHome(messageTitle, Localiser["msg.something.gone.wrong"]));
}
@@ -218,7 +218,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
return Json(responseData.SetControlError("AccountContactImage", Localiser["msg.upload.image.resize.failed"]));
// Image belongs to the user's account.
ItemId userItemId = GetUserItemId(UserAccountId);
ItemId userItemId = GetUserItemId(SessionUserAccountId);
// Store uploaded image as 'Upload' Avatar - awaiting confirmation that the contact details are to be saved.
SaxItemImage itemImage = ItemDataMgr.GetItemImage(userItemId, Sax.ImageType.Avatar_Upload, SaxItemImage.StatusCat.Any);
@@ -291,11 +291,11 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
return Json(responseData);
// Retrieve user details.
SaxUserAccount userAccount = AccountMgr.GetUserAccountById(UserAccountId);
SaxUserAccount userAccount = AccountMgr.GetUserAccountById(SessionUserAccountId);
disposableItems.Add(userAccount);
if (userAccount == null)
{
SaLogger.Warn(fn + " Failed to retrieve user account for Id: " + SysId.ToString(UserAccountId));
SaLogger.Warn(fn + " Failed to retrieve user account for Id: " + SysId.ToString(SessionUserAccountId));
return Json(responseData.SetGoHome(messageTitle, Localiser["msg.something.gone.wrong"]));
}
if (!userAccount.EmailAddress.EqualsCI(SessionData.User.EmailAddress))
@@ -0,0 +1,462 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Saxonite.Net.Core.Web.Online.Models;
using Saxonite.Net.Core.Web.Base.App;
using Saxonite.Net.Core.Web.Base.Controllers;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using Saxonite.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Utils;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Dbas;
using Saxonite.Net.Standard.Base.App;
using MailKit;
using Org.BouncyCastle.Asn1.Mozilla;
namespace Saxonite.Net.Core.Web.Online.Controllers
{
//=======================================================================
// Online Account Controller - User Eligibility - Ajax actions.
//=======================================================================
partial class AccountController
{
//-------------------------------------------------------------------
// Data definitions.
private class UserEligibilityResponseListData : AjaxResponse_Data.ItemData_Base
{
public String UserAccountId { get; set; }
public String RegionName { get; set; }
public String EligibilityTypeDesc { get; set; }
public String Info { get; set; }
public String ExpiresOnFmt { get; set; }
}
private class UserEligibilityResponseItemData : UserEligibilityResponseListData
{
public String RegionId { get; set; }
public String EligibilityType { get; set; }
public String ExpiresOnFrm { get; set; }
}
private void PopulateUserEligibilityResponseListData(SaxModel_Online model, SaxUserEligibility userEligibility, UserEligibilityResponseListData data)
{
data.Id = model.EncryptId(userEligibility.Id);
data.UserAccountId = model.EncryptId(userEligibility.UserAccountId);
data.RegionName = model.GetRegionCaption(userEligibility.RegionId);
data.EligibilityTypeDesc = Localiser.GetEligibilityTypeCaption(userEligibility.EligibilityType);
data.Info = userEligibility.Info;
data.ExpiresOnFmt = model.FormatDateForDisplay(userEligibility.ExpiresOn);
}
private void PopulateUserEligibilityResponseItemData(SaxModel_Online model, SaxUserEligibility userEligibility, UserEligibilityResponseItemData data)
{
PopulateUserEligibilityResponseListData(model, userEligibility, data);
data.RegionId = model.GetEncryptedRegionId(userEligibility.RegionId);
data.EligibilityType = EligibilityTypeCodes.GetCodeForType(userEligibility.EligibilityType);
data.ExpiresOnFrm = model.FormatDateForForm(userEligibility.ExpiresOn);
data.CreatedOnFmt = model.FormatDateForDisplay(userEligibility.CreateStamp.On);
data.StatusCode = userEligibility.StatusCode;
data.StatusDesc = userEligibility.StatusDesc;
}
//-------------------------------------------------------------------
// Account - Get User Eligibility list.
//-------------------------------------------------------------------
private class EligibilityTypeData
{
public String Code { get; set; }
public String Desc { get; set; }
/// <summary>Does the eligibility type allow a date range.</summary>
public bool? Dates { get; set; } = null;
}
private class AjaxResponse_UserEligibilityListData : AjaxResponse_Data
{
// Construction.
public AjaxResponse_UserEligibilityListData(SaxModel_Online model) : base(model) { }
// Eligibility list.
public List<UserEligibilityResponseListData> Eligibilities { get; } = new List<UserEligibilityResponseListData>();
// Eligibility types.
public List<EligibilityTypeData> Types { get; } = new List<EligibilityTypeData>();
}
// Ajax request.
[HttpPost]
[Route("Account/Ajax/GetUserEligibilities")]
[Route("Account/Ajax/GetUserEligibilityList")]
public IActionResult GetUserEligibilities(Model_UserEligibility model)
{
String fn = GetType().Name + ".GetUserEligibilities";
AjaxResponse_UserEligibilityListData responseData = new AjaxResponse_UserEligibilityListData(model);
String messageTitle = Localiser["account.caption.profile.eligibility"];
// Validate session and referrer.
if (!ValidReferer) return Forbid();
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
RefreshModel(model);
// Eligibility types.
foreach (Sax.EligibilityType eligibilityType in EnumUtil.GetValues<Sax.EligibilityType>())
{
EligibilityTypeData typeData = new EligibilityTypeData();
typeData.Code = model.EligibilityTypeCodes.GetCodeForType(eligibilityType);
if (StringUtil.IsBlank(typeData.Code)) continue;
typeData.Desc = Localiser.GetEligibilityTypeCaption(eligibilityType);
if (SaxUserEligibility.AllowsApplicablePeriod(eligibilityType))
typeData.Dates = true;
responseData.Types.Add(typeData);
}
// User account.
SysId userAccountId = StringUtil.ToSysId(model.UserAccount.Id);
if (!SysId.IsValid(userAccountId))
userAccountId = SessionUserAccountId;
// Item filter.
SaxUserEligibility.Params prmUserEligibility = new SaxUserEligibility.Params();
prmUserEligibility.UserAccountIdsIncluded.Add(userAccountId);
prmUserEligibility.StatusCat = SaxUserEligibility.StatusCat.NotDeleted;
prmUserEligibility.SortColumns.Add(AccountMgr.GetUserEligibilityColumnDfn(SaxUserEligibility.Column.EligibilityType));
model.Paging.ItemTotal = (ulong)AccountMgr.GetUserEligibilityCount(prmUserEligibility);
model.PopulatePagingTo(prmUserEligibility.ResultsPaging);
// Item columns.
ColumnDfn colId = AccountMgr.GetUserEligibilityColumnDfn(SaxUserEligibility.Column.Id);
ColumnDfn colUserAccountId = AccountMgr.GetUserEligibilityColumnDfn(SaxUserEligibility.Column.UserAccountId);
ColumnDfn colRegionName = AccountMgr.GetUserEligibilityColumnDfn(SaxUserEligibility.Column.Region_Name);
ColumnDfn colEligibilityType = AccountMgr.GetUserEligibilityColumnDfn(SaxUserEligibility.Column.EligibilityType);
ColumnDfn colInfo = AccountMgr.GetUserEligibilityColumnDfn(SaxUserEligibility.Column.Info);
ColumnDfn colExpires = AccountMgr.GetUserEligibilityColumnDfn(SaxUserEligibility.Column.ExpiresOn);
ColumnDfn colStatus = AccountMgr.GetUserEligibilityColumnDfn(SaxUserEligibility.Column.Status);
List<ColumnDfn> columns = new List<ColumnDfn>()
{
colId,colUserAccountId,
colRegionName, colEligibilityType,
colInfo, colExpires,
colStatus,
};
// Sort columns.
prmUserEligibility.SortColumns.Add(colRegionName);
// Query items.
using (DbResultSet resultSet = AccountMgr.ExecuteUserEligibilityQuery(columns, prmUserEligibility))
{
while (resultSet != null && resultSet.HasRows && resultSet.NextRecord())
{
NamedValue.Map values = resultSet.GetRecordValues();
Sax.EligibilityType eligibilityType = (Sax.EligibilityType)values.GetLong(colEligibilityType.DataName);
UserEligibilityResponseListData userEligibilityData = new UserEligibilityResponseListData()
{
Id = model.EncryptId(new SysId(values.GetLong(colId.DataName))),
UserAccountId = model.EncryptId(new SysId(values.GetLong(colUserAccountId.DataName))),
RegionName = values.GetString(colRegionName.DataName),
EligibilityTypeDesc = Localiser.GetEligibilityTypeCaption(eligibilityType),
Info = values.GetString(colInfo.DataName),
ExpiresOnFmt = model.FormatDateForDisplay(values.GetDate(colExpires.DataName)),
StatusCode = values.GetString(colStatus.DataName),
StatusDesc = SacsSystem.GetStatusDescForCode(values.GetString(colStatus.DataName))
};
responseData.Eligibilities.Add(userEligibilityData);
}
}
if (model.Paging.IsPaged)
model.Paging.ItemCount = (ushort)responseData.Eligibilities.Count;
// Complete response.
responseData.SetPaging(model);
responseData.Success = true;
return Json(responseData);
}
//-------------------------------------------------------------------
// Get User Eligibility ajax request.
//-------------------------------------------------------------------
private class AjaxResponse_UserEligibility : AjaxResponse_Data
{
// Construction.
public AjaxResponse_UserEligibility(SaxModel_Online model) : base(model) { }
// Eligibility details.
public UserEligibilityResponseItemData Eligibility { get; } = new UserEligibilityResponseItemData();
}
//-------------------------------------------------------------------
[HttpPost]
[Route("Account/Ajax/GetUserEligibility")]
public IActionResult Ajax_GetUserEligibility(Model_UserEligibility model)
{
String fn = GetType().Name + ".Ajax_GetUserEligibility";
String messageTitle = Localiser["account.caption.profile.eligibility"];
AjaxResponse_UserEligibility responseData = new AjaxResponse_UserEligibility(model);
// Validate session and referrer.
if (!ValidReferer) return Forbid();
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
RefreshModel(model);
// Record disposable items as they are created so all can be disposed when needed.
using (DisposableCollection<SacsHierarchyItem> disposableItems = new DisposableCollection<SacsHierarchyItem>())
{
// Identify item.
SysId userEligibilityId = model.ExtractSysId(model.Eligibility.Id);
if (!SysId.IsValid(userEligibilityId))
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.specified"]));
// Retrieve item.
SaxUserEligibility userEligibility = AccountMgr.GetUserEligibilityById(userEligibilityId);
disposableItems.Add(userEligibility);
if (userEligibility == null)
{
SaLogger.Warn(fn + " Failed to retrieve User Eligibility for Id: '" + model.Eligibility.Id + "'");
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.found"]));
}
// Construct response.
PopulateUserEligibilityResponseItemData(model, userEligibility, responseData.Eligibility);
responseData.Success = true;
}
return Json(responseData);
}
//-------------------------------------------------------------------
// Store User Eligibility ajax request.
//-------------------------------------------------------------------
private class AjaxResponse_StoreUserEligibility : AjaxResponse_Data
{
// Construction.
public AjaxResponse_StoreUserEligibility(SaxModel_Online model) : base(model) { }
// Eligibility details.
public UserEligibilityResponseItemData Eligibility { get; } = new UserEligibilityResponseItemData();
}
//-------------------------------------------------------------------
[HttpPost]
[Route("Account/Ajax/StoreUserEligibility")]
public IActionResult Ajax_StoreUserEligibility(Model_UserEligibility model)
{
String fn = GetType().Name + ".Ajax_StoreUserEligibility";
String messageTitle = Localiser["account.caption.profile.eligibility"];
AjaxResponse_StoreUserEligibility responseData = new AjaxResponse_StoreUserEligibility(model);
// Validate session and referrer.
if (!ValidReferer) return Forbid();
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
RefreshModel(model);
// Record disposable items as they are created so all can be disposed when needed.
using (DisposableCollection<SacsHierarchyItem> disposableItems = new DisposableCollection<SacsHierarchyItem>())
{
// Validate item properties.
model.ValidateEligibilityDetails(responseData);
if (responseData.HasControlErrors())
return Json(responseData);
// User account.
SysId userAccountId = StringUtil.ToSysId(model.UserAccount.Id);
if (!SysId.IsValid(userAccountId))
userAccountId = SessionUserAccountId;
// Validate User Eligibility Id against 'Exists' flag.
SysId userEligibilityId = model.ExtractSysId(model.Eligibility.Id);
bool eligibilityExists = StringUtil.ToBool(model.Eligibility.Exists);
if (eligibilityExists && !SysId.IsValid(userEligibilityId))
{
SaLogger.Warn(fn + " Id not specified for existing User Eligibility.");
return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"]));
}
if (!eligibilityExists && SysId.IsValid(userEligibilityId))
{
SaLogger.Warn(fn + " Id specified for new User Eligibility: '" + model.Eligibility.Id + "'");
return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"]));
}
// Retrieve existing item.
SaxUserEligibility userEligibility = AccountMgr.GetUserEligibilityById(userEligibilityId);
disposableItems.Add(userEligibility);
if (userEligibility == null && SysId.IsValid(userEligibilityId))
{
SaLogger.Warn(fn + " Failed to retrieve User Eligibility for Id: '" + model.Eligibility.Id + "'");
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.found"]));
}
// Validate user eligibility properties.
if (userEligibility != null)
{
if (!userEligibility.UserAccountId.Equals(userAccountId))
{
SaLogger.Warn(fn + " Inconsistent User Account Id specified for User Eligibility. Expected: " + userEligibility.UserAccountId + ". Found: " + userAccountId);
return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"]));
}
}
// Region.
SysId regionId = model.Eligibility.RegionId != null ? model.DecryptId(model.Eligibility.RegionId) : userEligibility != null ? userEligibility.RegionId : null;
if (!SysId.IsValid(regionId))
{
// Shouldn't get here.
SaLogger.Warn(fn + " Region Id not supplied for " + (eligibilityExists ? "existing" : "new") + " eligibility.");
return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"]));
}
SaxRegion.Data region = Internals.GetRegion(regionId);
// Eligibility type.
Sax.EligibilityType eligibilityType = userEligibility != null ? userEligibility.EligibilityType : model.Eligibility.getEligibilityType();
if (eligibilityType <= 0)
{
// Shouldn't get here.
SaLogger.Warn(fn + " Eligibility type not specified for " + (eligibilityExists ? "existing" : "new") + " eligibility.");
return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"]));
}
// Check for duplicate data.
// ToDo Should include date range in checking for duplicate eligibility?
{
// First check without region.
SaxUserEligibility.Params prmUserEligibility = new SaxUserEligibility.Params();
if (userEligibility != null)
prmUserEligibility.IdsExcluded.Add(userEligibility.Id);
prmUserEligibility.UserAccountIdsIncluded.Add(userAccountId);
prmUserEligibility.EligibilityTypesIncluded.Add(eligibilityType);
prmUserEligibility.StatusCat = SaxUserEligibility.StatusCat.NotDeleted;
long eligibilityCount = AccountMgr.GetUserEligibilityCount(prmUserEligibility);
// Selected Eligibility types have a limit on the number of instances allowed.
if (eligibilityCount >= SaxUserEligibility.GetMaxInstances(eligibilityType))
return Json(responseData.SetMessage(messageTitle, Localiser["msg.validation.duplicate.value"]));
// Now include region - only allow one eligibility of each type.
prmUserEligibility.RegionIdsIncluded.Add(regionId);
eligibilityCount = AccountMgr.GetUserEligibilityCount(prmUserEligibility);
if (eligibilityCount >= 1)
return Json(responseData.SetMessage(messageTitle, Localiser["msg.validation.duplicate.value"]));
}
// If eligibility doesn't exist for the user, it may have been previously deleted.
if (userEligibility == null)
{
SaxUserEligibility.Params prmUserEligibility = new SaxUserEligibility.Params();
prmUserEligibility.UserAccountIdsIncluded.Add(userAccountId);
prmUserEligibility.RegionIdsIncluded.Add(regionId);
prmUserEligibility.EligibilityTypesIncluded.Add(eligibilityType);
prmUserEligibility.StatusCat = SaxUserEligibility.StatusCat.Any;
userEligibility = AccountMgr.GetUserEligibility(prmUserEligibility);
if (userEligibility != null)
{
disposableItems.Add(userEligibility);
if (userEligibility.Status == SaStatus.Deleted)
{
SaLogger.Info(fn + " Resurrecting User Eligibility with status: " + userEligibility.StatusDesc + ". Id: " + SysId.ToString(userEligibility.Id));
userEligibility.Status = SaxUserEligibility.DefaultStatus;
}
else
return Json(responseData.SetMessage(messageTitle, Localiser["msg.validation.duplicate.value"]));
}
else
{
userEligibility = AccountMgr.CreateUserEligibility(userAccountId, regionId, eligibilityType);
disposableItems.Add(userEligibility);
}
}
// Populate item properties.
if (model.Eligibility.Info != null)
userEligibility.Info = model.Eligibility.Info;
if (model.Eligibility.ExpiresOn != null)
userEligibility.ExpiresOn = model.ParseDateFromForm(model.Eligibility.ExpiresOn);
// Store item.
if (!SysId.IsValid(userEligibility.Id))
{
if (!AccountMgr.InsertUserEligibility(userEligibility, DbUpdateInfo))
{
SaLogger.Warn(fn + " Failed to insert user eligibility: " + AccountMgr.ErrorStateMessage);
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.insert.failed"]));
}
}
else
{
if (!AccountMgr.UpdateUserEligibility(userEligibility, DbUpdateInfo))
{
SaLogger.Warn(fn + " Failed to update user eligibility [Id:" + SysId.ToString(userEligibility.Id) + "]: " + AccountMgr.ErrorStateMessage);
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.update.failed"]));
}
}
// Construct response.
PopulateUserEligibilityResponseItemData(model, userEligibility, responseData.Eligibility);
responseData.Success = true;
}
return Json(responseData);
}
//-------------------------------------------------------------------
// Remove User Eligibility ajax request.
//-------------------------------------------------------------------
private class AjaxResponse_RemoveUserEligibility : AjaxResponse_Data
{
// Construction.
public AjaxResponse_RemoveUserEligibility(SaxModel_Online model) : base(model) { }
}
//-------------------------------------------------------------------
[HttpPost]
[Route("Account/Ajax/RemoveUserEligibility")]
public IActionResult Ajax_RemoveUserEligibility(Model_UserEligibility model)
{
String fn = GetType().Name + ".Ajax_RemoveUserEligibility";
String messageTitle = Localiser["account.caption.profile.eligibility"];
AjaxResponse_UserEligibility responseData = new AjaxResponse_UserEligibility(model);
// Validate session and referrer.
if (!ValidReferer) return Forbid();
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
RefreshModel(model);
// User account.
SysId userAccountId = StringUtil.ToSysId(model.UserAccount.Id);
if (!SysId.IsValid(userAccountId))
userAccountId = SessionUserAccountId;
// Record disposable items as they are created so all can be disposed when needed.
using (DisposableCollection<SacsHierarchyItem> disposableItems = new DisposableCollection<SacsHierarchyItem>())
{
// User Eligibility Id.
SysId userEligibilityId = model.ExtractSysId(model.Eligibility.Id);
if (!SysId.IsValid(userEligibilityId))
{
SaLogger.Warn(fn + " Id not specified to remove User Eligibility.");
return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"]));
}
// Retrieve existing item.
SaxUserEligibility userEligibility = AccountMgr.GetUserEligibilityById(userEligibilityId);
disposableItems.Add(userEligibility);
if (userEligibility == null)
{
SaLogger.Warn(fn + " Failed to retrieve User Eligibility for Id: '" + model.Eligibility.Id + "'");
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.found"]));
}
// Validate user eligibility properties.
if (!userEligibility.UserAccountId.Equals(userAccountId))
{
SaLogger.Warn(fn + " Inconsistent User Account Id specified for User Eligibility. Expected: " + userEligibility.UserAccountId + ". Found: " + userAccountId);
return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"]));
}
// Delete item.
if (!AccountMgr.DeleteUserEligibility(userEligibility, DbUpdateInfo))
{
SaLogger.Warn(fn + " Failed to delete user eligibility [Id:" + SysId.ToString(userEligibility.Id) + "]: " + AccountMgr.ErrorStateMessage);
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.update.failed"]));
}
// Construct response.
PopulateUserEligibilityResponseItemData(model, userEligibility, responseData.Eligibility);
responseData.Success = true;
}
return Json(responseData);
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -166,7 +166,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
// Query organisations that user is a member of.
SaxUserOrganisation.Params prmUserOrganisation = new SaxUserOrganisation.Params();
prmUserOrganisation.UserAccountIdsIncluded.Add(UserAccountId);
prmUserOrganisation.UserAccountIdsIncluded.Add(SessionUserAccountId);
prmUserOrganisation.OrganisationStatusCat = SaxOrganisation.StatusCat.ActiveOnly;
prmUserOrganisation.OrganisationMembersOnly = true;
prmUserOrganisation.StatusCat = SaxUserOrganisation.StatusCat.ActiveOnly;
@@ -294,7 +294,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
disposableItems.Add(address);
// Check whether user is a member of this organisation.
SaxUserOrganisation userOrganisation = AccountMgr.GetUserOrganisationByUserOrganisation(UserAccountId, organisationId);
SaxUserOrganisation userOrganisation = AccountMgr.GetUserOrganisationByUserOrganisation(SessionUserAccountId, organisationId);
disposableItems.Add(userOrganisation);
if (userOrganisation != null)
{
@@ -402,7 +402,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
}
// Check whether user is a member of this organisation.
SaxUserOrganisation userOrganisation = AccountMgr.GetUserOrganisationByUserOrganisation(UserAccountId, organisationId);
SaxUserOrganisation userOrganisation = AccountMgr.GetUserOrganisationByUserOrganisation(SessionUserAccountId, organisationId);
disposableItems.Add(userOrganisation);
if (userOrganisation == null)
{
@@ -54,7 +54,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
data.SportAbout = userSport.About;
data.SportParticipationCode = SportParticipationCodes.GetCodeForType(userSport.Participation);
data.SportOfficiatingCode = SportOfficiatingCodes.GetCodeForType(userSport.Officiating);
data.CreatedOnFmt = DateUtil.Format(userSport.CreateStamp.On, "d-MMM-yyyy");
data.CreatedOnFmt = model.FormatDateForDisplay(userSport.CreateStamp.On);
data.StatusCode = userSport.StatusCode;
data.StatusDesc = userSport.StatusDesc;
}
@@ -85,7 +85,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
// Item filter.
SaxUserSport.Params prmUserSport = new SaxUserSport.Params();
prmUserSport.UserAccountIdsIncluded.Add(UserAccountId);
prmUserSport.UserAccountIdsIncluded.Add(SessionUserAccountId);
prmUserSport.StatusCat = SaxUserSport.StatusCat.NotDeleted;
model.Paging.ItemTotal = (ulong)AccountMgr.GetUserSportCount(prmUserSport);
model.PopulatePagingTo(prmUserSport.ResultsPaging);
@@ -267,7 +267,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
if (userSport == null)
{
SaxUserSport.Params prmUserSport = new SaxUserSport.Params();
prmUserSport.UserAccountIdsIncluded.Add(UserAccountId);
prmUserSport.UserAccountIdsIncluded.Add(SessionUserAccountId);
prmUserSport.SportIdsIncluded.Add(sportId);
prmUserSport.StatusCat = SaxUserSport.StatusCat.Any;
userSport = AccountMgr.GetUserSport(prmUserSport);
@@ -287,7 +287,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
}
else
{
userSport = AccountMgr.CreateUserSport(UserAccountId, sportId);
userSport = AccountMgr.CreateUserSport(SessionUserAccountId, sportId);
disposableItems.Add(userSport);
}
}
@@ -129,7 +129,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
SysId userSportId = model.ExtractSysId(model.UserSportId);
SaxUserSport userSport = AccountMgr.GetUserSportById(userSportId);
disposableItems.Add(userSport);
if (userSport == null || !userSport.UserAccountId.Equals(UserAccountId))
if (userSport == null || !userSport.UserAccountId.Equals(SessionUserAccountId))
return Json(responseData.SetGoHome(messageTitle, Localiser["msg.something.gone.wrong"]));
// Sport details.
@@ -226,7 +226,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
disposableItems.Add(userSportExperience);
SaxUserSport userSport = AccountMgr.GetUserSportById(userSportExperience?.UserSportId ?? null);
disposableItems.Add(userSport);
if (userSportExperience == null || userSport == null || !userSport.UserAccountId.Equals(UserAccountId))
if (userSportExperience == null || userSport == null || !userSport.UserAccountId.Equals(SessionUserAccountId))
return Json(responseData.SetGoHome(messageTitle, Localiser["msg.something.gone.wrong"]));
// Populate data to response.
@@ -285,7 +285,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
disposableItems.Add(userSportExperience);
userSport = AccountMgr.GetUserSportById(userSportExperience?.UserSportId ?? null);
disposableItems.Add(userSport);
if (userSportExperience == null || userSport == null || !userSport.UserAccountId.Equals(UserAccountId))
if (userSportExperience == null || userSport == null || !userSport.UserAccountId.Equals(SessionUserAccountId))
return Json(responseData.SetGoHome(messageTitle, Localiser["msg.something.gone.wrong"]));
}
else
@@ -295,7 +295,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
SysId userSportId = model.ExtractSysId(model.UserSportId);
userSport = AccountMgr.GetUserSportById(userSportId);
disposableItems.Add(userSport);
if (userSport == null || !userSport.UserAccountId.Equals(UserAccountId))
if (userSport == null || !userSport.UserAccountId.Equals(SessionUserAccountId))
return Json(responseData.SetGoHome(messageTitle, Localiser["msg.something.gone.wrong"]));
// Create User Sport Experience.
userSportExperience = AccountMgr.CreateUserSportExperience(userSport.Id);
@@ -47,6 +47,30 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
return View(model);
}
//-------------------------------------------------------------------
[HttpGet]
public IActionResult Sports()
{
// Validate session.
if (!ValidUserSession)
return RedirectToAction("", "");
Model_Account model = new Model_Account(Localiser);
return View(model);
}
//-------------------------------------------------------------------
[HttpGet]
public IActionResult Organisations()
{
// Validate session.
if (!ValidUserSession)
return RedirectToAction("", "");
Model_Account model = new Model_Account(Localiser);
return View(model);
}
//-------------------------------------------------------------------
}
//=======================================================================
@@ -116,7 +116,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
Organisation = model.GetOrganisationName(organisationEvent.OrganisationId);
if (controller.ItemDataMgr.ItemHasActiveImage(organisation?.GetItemId() ?? null, Sax.ImageType.OrganisationLogo))
OrganisationLogoUrl = controller.GetOrganisationLogoLink(organisation.Id, false);
EventAt = DateUtil.Format(organisationEvent.EventAt, "d-MMM-yy");
EventAt = model.FormatDateForDisplay(organisationEvent.EventAt);
if (organisationEvent.EventAt.Hour > 0 || organisationEvent.EventAt.Minute > 0)
EventAt += DateUtil.Format(organisationEvent.EventAt, " HH:ss");
Summary = organisationEvent.Summary;
@@ -182,7 +182,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
SaxSessionData_Online sessionData = SessionData_Online;
// User context.
SysId userAccountId = UserAccountId;
SysId userAccountId = SessionUserAccountId;
SaxActivityConsole.IndexContext indexContext = new SaxActivityConsole.IndexContext(userAccountId);
if (SysId.IsValid(userAccountId))
indexContext.UserAccountIdsOwner.Add(userAccountId);
@@ -389,8 +389,8 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
responseData.Opportunity = new ActivityResponseData_Opportunity(this, model, opportunity, organisation);
}
// Record activty viewing.
if (!ActivityConsole.RecordUserActivityViewed(UserAccountId, new ItemId((short)itemType, itemId), DbUpdateInfo))
// Record activity viewing.
if (!ActivityConsole.RecordUserActivityViewed(SessionUserAccountId, new ItemId((short)itemType, itemId), DbUpdateInfo))
{
SaLogger.Warn(fn + " Failed to record Activity Viewing: " + ActivityConsole.ErrorStateMessage + "." + GetLogSuffix());
return Json(responseData);
@@ -435,7 +435,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
}
// Record activity reaction.
if (!ActivityConsole.RecordUserActivityReaction(UserAccountId, new ItemId((short)itemType, itemId), model.GetActivityReaction(), DbUpdateInfo))
if (!ActivityConsole.RecordUserActivityReaction(SessionUserAccountId, new ItemId((short)itemType, itemId), model.GetActivityReaction(), DbUpdateInfo))
{
SaLogger.Warn(fn + " Failed to record Activity Reaction: " + ActivityConsole.ErrorStateMessage + "." + GetLogSuffix());
return Json(responseData);
@@ -87,8 +87,8 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
PopulateFeedbackResponseListData(activityFeedback, data);
data.RegionCaptionPrimary = model.GetRegionCaption(article.RegionIdPrimary);
data.SportCaptionPrimary = model.GetSportCaption(article.SportIdPrimary);
data.CreatedOnFmt = DateUtil.Format(article.CreateStamp.On, "d-MMM-yyyy");
data.PublishedOnFmt = DateUtil.Format(article.PublishedAt, "d-MMM-yyyy");
data.CreatedOnFmt = model.FormatDateForDisplay(article.CreateStamp.On);
data.PublishedOnFmt = model.FormatDateForDisplay(article.PublishedAt);
data.StatusCode = article.StatusCode;
data.StatusDesc = article.StatusDesc;
}
@@ -173,14 +173,14 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
if (!ValidReferer) return Forbid();
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
SaxSessionData_Online sessionData = SessionData_Online;
SysId userAccountId = UserAccountId;
SysId userAccountId = SessionUserAccountId;
RefreshModel(model);
// Record disposable items as they are created so all can be disposed when needed.
using (DisposableCollection<SacsHierarchyItem> disposableItems = new DisposableCollection<SacsHierarchyItem>())
{
// User account.
SaxUserAccount userAccount = AccountMgr.GetUserAccountById(UserAccountId);
SaxUserAccount userAccount = AccountMgr.GetUserAccountById(userAccountId);
disposableItems.Add(userAccount);
// Organisations that the user has rights to author articles for.
@@ -292,8 +292,8 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
Summary = values.GetString(colSummary.DataName),
RegionCaptionPrimary = model.GetRegionCaption(values.GetString(colRegionIdPrimary.DataName).ToSysId()),
SportCaptionPrimary = model.GetSportCaption(values.GetString(colSportIdPrimary.DataName).ToSysId()),
CreatedOnFmt = DateUtil.Format(values.GetDateTime(colCreatedOn.DataName), "d-MMM-yyyy"),
PublishedOnFmt = DateUtil.Format(values.GetDateTime(colPublishedOn.DataName), "d-MMM-yyyy"),
CreatedOnFmt = model.FormatDateForDisplay(values.GetDateTime(colCreatedOn.DataName)),
PublishedOnFmt = model.FormatDateForDisplay(values.GetDateTime(colPublishedOn.DataName)),
StatusCode = values.GetString(colStatus.DataName),
StatusDesc = SacsSystem.GetStatusDescForCode(values.GetString(colStatus.DataName))
};
@@ -338,7 +338,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
// Validate session and referrer.
if (!ValidReferer) return Forbid();
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
SysId userAccountId = UserAccountId;
SysId userAccountId = SessionUserAccountId;
RefreshModel(model);
// Record disposable items as they are created so all can be disposed when needed.
@@ -552,7 +552,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
return Json(responseData);
// Validate User & Organisation.
SysId userAccountId = UserAccountId;
SysId userAccountId = SessionUserAccountId;
SysId organisationId = model.ExtractSysId(model.ArticleOrganisationId);
if (SysId.IsValid(organisationId))
{
@@ -34,7 +34,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
return RedirectToAction("", "");
// User must either be a Journalist or have Article Admin rights with at least one organisation.
List<SaxAccountMgr.OrganisationIdName> organisations = AccountMgr.GetOrganisationsForAnyUserRole(UserAccountId, new [] { Sax.OrganisationRole.Admin, Sax.OrganisationRole.ArticleAdmin });
List<SaxAccountMgr.OrganisationIdName> organisations = AccountMgr.GetOrganisationsForAnyUserRole(SessionUserAccountId, new [] { Sax.OrganisationRole.Admin, Sax.OrganisationRole.ArticleAdmin });
if (organisations.Count < 1 && !UserIsJournalist)
return RedirectToAction("", "");
@@ -59,7 +59,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
String userAccountIdParam = "";// ToDo Decrypt from uaie value.
SysId userAccountId = userAccountIdParam.ToSysId();
if (!SysId.IsValid(userAccountId))
userAccountId = UserAccountId;
userAccountId = SessionUserAccountId;
return GetAccountContactImage(userAccountId, Sax.ImageType.Avatar);
}
@@ -81,7 +81,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
// Response should not be cached.
Response.Headers[HeaderNames.CacheControl] = "no-cache, no-store, must-revalidate, max-age=0";
Response.Headers[HeaderNames.Expires] = "-1";
SysId userAccountId = UserAccountId;
SysId userAccountId = SessionUserAccountId;
return GetAccountContactImage(userAccountId, Sax.ImageType.Avatar_Upload);
}
@@ -206,7 +206,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
// Validate session and referrer.
if (!ValidReferer) return Forbid();
if (!ValidUserSession) return Forbid();
ItemId userItemId = new ItemId((short)Sax.DataItemType.UserAccount, UserAccountId);
ItemId userItemId = new ItemId((short)Sax.DataItemType.UserAccount, SessionUserAccountId);
// Extract encrypted parameters.
NameValueCollection parameters = ExtractOnlineParams(iie);
@@ -116,7 +116,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
if (!ValidReferer) return Forbid();
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
RefreshModel(model);
SysId userAccountId = UserAccountId;
SysId userAccountId = SessionUserAccountId;
// Record disposable items as they are created so all can be disposed when needed.
using (DisposableCollection<SacsHierarchyItem> disposableItems = new DisposableCollection<SacsHierarchyItem>())
@@ -370,7 +370,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
}
// Ensure that the user has the correct role to update Events for this organisation.
if (!AccountMgr.UserHasAnyOrganisationRole(UserAccountId, organisationId, new[] { Sax.OrganisationRole.Admin, Sax.OrganisationRole.ScheduleAdmin }))
if (!AccountMgr.UserHasAnyOrganisationRole(SessionUserAccountId, organisationId, new[] { Sax.OrganisationRole.Admin, Sax.OrganisationRole.ScheduleAdmin }))
{
SaLogger.Warn(fn + " User doesn't have 'Event Admin' role for Organisation Id: " + organisationId);
return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"]));
@@ -44,7 +44,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
{
data.Id = model.EncryptId(userOrganisation.Id);
data.UserAccountId = model.EncryptId(userOrganisation.UserAccountId);
if (userOrganisation.UserAccountId.Equals(UserAccountId)) data.CurrentUser = true;
if (userOrganisation.UserAccountId.Equals(SessionUserAccountId)) data.CurrentUser = true;
data.EmailAddress = userAccount.EmailAddress;
data.DisplayName = userAccount.GetDisplayName();
data.RoleCodes.Clear();
@@ -133,7 +133,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
responseData.MemberRoles.Add(memberRole.Code, Localiser.GetOrganisationRoleCaption((Sax.OrganisationRole)memberRole.Type));
// Session User roles.
responseData.User.CanManage = AccountMgr.UserHasAnyOrganisationRole(UserAccountId, organisation.Id, new List<Sax.OrganisationRole> { Sax.OrganisationRole.Admin, Sax.OrganisationRole.MemberAdmin });
responseData.User.CanManage = AccountMgr.UserHasAnyOrganisationRole(SessionUserAccountId, organisation.Id, new List<Sax.OrganisationRole> { Sax.OrganisationRole.Admin, Sax.OrganisationRole.MemberAdmin });
// Item filter.
SaxUserOrganisation.Params prmMember = new SaxUserOrganisation.Params();
@@ -183,7 +183,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
StatusCode = values.GetString(colUserStatus.DataName),
StatusDesc = SacsSystem.GetStatusDescForCode(values.GetString(colUserStatus.DataName))
};
if (model.ExtractSysId(memberData.UserAccountId).Equals(UserAccountId)) memberData.CurrentUser = true;
if (model.ExtractSysId(memberData.UserAccountId).Equals(SessionUserAccountId)) memberData.CurrentUser = true;
String memberRoleCodes = values.GetString(colOrganisationRoleCodes.DataName);
foreach (String memberRoleCode in StringListUtil.Split(memberRoleCodes, SaxUserOrganisation.UserOrgnisationRoleDelim))
{
@@ -259,7 +259,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
}
// Session User roles.
bool userCanManageMembers = AccountMgr.UserHasAnyOrganisationRole(UserAccountId, organisation.Id, new List<Sax.OrganisationRole> { Sax.OrganisationRole.Admin, Sax.OrganisationRole.MemberAdmin });
bool userCanManageMembers = AccountMgr.UserHasAnyOrganisationRole(SessionUserAccountId, organisation.Id, new List<Sax.OrganisationRole> { Sax.OrganisationRole.Admin, Sax.OrganisationRole.MemberAdmin });
// Validate user account.
SaxUserAccount userAccount = AccountMgr.GetUserAccountById(userOrganisation.UserAccountId);
@@ -369,7 +369,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
}
// Ensure that the user has the correct role to update Members for this organisation.
bool userCanManageMembers = AccountMgr.UserHasAnyOrganisationRole(UserAccountId, organisationId, new List<Sax.OrganisationRole> { Sax.OrganisationRole.Admin, Sax.OrganisationRole.MemberAdmin });
bool userCanManageMembers = AccountMgr.UserHasAnyOrganisationRole(SessionUserAccountId, organisationId, new List<Sax.OrganisationRole> { Sax.OrganisationRole.Admin, Sax.OrganisationRole.MemberAdmin });
if (!userCanManageMembers)
{
SaLogger.Warn(fn + " User doesn't have 'Member Admin' role for Organisation Id: " + organisationId);
@@ -395,7 +395,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
}
// Validate roles for current user.
if (userOrganisation.UserAccountId.Equals(UserAccountId))
if (userOrganisation.UserAccountId.Equals(SessionUserAccountId))
{
// User is modifying their own organisation member.
if (userOrganisation.CanManageOrganisation && !model.OrganisationRoleCodes.Any(item => item.Type == (int)Sax.OrganisationRole.Admin))
@@ -562,7 +562,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
}
// Ensure that the user has the correct role to update Members for this organisation.
bool userCanManageMembers = AccountMgr.UserHasAnyOrganisationRole(UserAccountId, organisation.Id, new List<Sax.OrganisationRole> { Sax.OrganisationRole.Admin, Sax.OrganisationRole.MemberAdmin });
bool userCanManageMembers = AccountMgr.UserHasAnyOrganisationRole(SessionUserAccountId, organisation.Id, new List<Sax.OrganisationRole> { Sax.OrganisationRole.Admin, Sax.OrganisationRole.MemberAdmin });
if (!userCanManageMembers)
{
SaLogger.Warn(fn + " User doesn't have 'Member Admin' role for Organisation Id: " + organisation.Id);
@@ -678,7 +678,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
}
// Ensure that the user has the correct role to update Members for this organisation.
bool userCanManageMembers = AccountMgr.UserHasAnyOrganisationRole(UserAccountId, organisation.Id, new List<Sax.OrganisationRole> { Sax.OrganisationRole.Admin, Sax.OrganisationRole.MemberAdmin });
bool userCanManageMembers = AccountMgr.UserHasAnyOrganisationRole(SessionUserAccountId, organisation.Id, new List<Sax.OrganisationRole> { Sax.OrganisationRole.Admin, Sax.OrganisationRole.MemberAdmin });
if (!userCanManageMembers)
{
SaLogger.Warn(fn + " User doesn't have 'Member Admin' role for Organisation Id: " + organisation.Id);
@@ -106,7 +106,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
if (!ValidReferer) return Forbid();
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
RefreshModel(model);
SysId userAccountId = UserAccountId;
SysId userAccountId = SessionUserAccountId;
// Record disposable items as they are created so all can be disposed when needed.
using (DisposableCollection<SacsHierarchyItem> disposableItems = new DisposableCollection<SacsHierarchyItem>())
@@ -357,7 +357,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
}
// Ensure that the user has the correct role to update Opportunities for this organisation.
if (!AccountMgr.UserHasAnyOrganisationRole(UserAccountId, organisationId, new[] { Sax.OrganisationRole.Admin, Sax.OrganisationRole.OpportunityAdmin }))
if (!AccountMgr.UserHasAnyOrganisationRole(SessionUserAccountId, organisationId, new[] { Sax.OrganisationRole.Admin, Sax.OrganisationRole.OpportunityAdmin }))
{
SaLogger.Warn(fn + " User doesn't have 'Opportunity Admin' role for Organisation Id: " + organisationId);
return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"]));
@@ -153,7 +153,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
// Organisation filter
SaxUserOrganisation.Params prmUserOrganisation = new SaxUserOrganisation.Params();
prmUserOrganisation.UserAccountIdsIncluded.Add(UserAccountId);
prmUserOrganisation.UserAccountIdsIncluded.Add(SessionUserAccountId);
prmUserOrganisation.OrganisationStatusCat = SaxOrganisation.StatusCat.ActiveOnly;
prmUserOrganisation.OrganisationMembersOnly = true;
prmUserOrganisation.OrganisationRolesAny.Add(Sax.OrganisationRole.Admin);
@@ -228,7 +228,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
// Organisation filter
SaxUserOrganisation.Params prmUserOrganisation = new SaxUserOrganisation.Params();
prmUserOrganisation.UserAccountIdsIncluded.Add(UserAccountId);
prmUserOrganisation.UserAccountIdsIncluded.Add(SessionUserAccountId);
prmUserOrganisation.OrganisationStatusCat = SaxOrganisation.StatusCat.ActiveOnly;
prmUserOrganisation.OrganisationMembersOnly = true;
prmUserOrganisation.OrganisationRolesAny.Add(Sax.OrganisationRole.Admin);
@@ -303,7 +303,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
// Organisation filter
SaxUserOrganisation.Params prmUserOrganisation = new SaxUserOrganisation.Params();
prmUserOrganisation.UserAccountIdsIncluded.Add(UserAccountId);
prmUserOrganisation.UserAccountIdsIncluded.Add(SessionUserAccountId);
prmUserOrganisation.OrganisationStatusCat = SaxOrganisation.StatusCat.ActiveOnly;
prmUserOrganisation.OrganisationMembersOnly = true;
prmUserOrganisation.OrganisationRolesAny.Add(Sax.OrganisationRole.Admin);
@@ -138,7 +138,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
// Filter to identify suitable organisations that user is a member of and has the appropriate rights.
SaxUserOrganisation.Params prmUserOrganisation = new SaxUserOrganisation.Params();
prmUserOrganisation.UserAccountIdsIncluded.Add(UserAccountId);
prmUserOrganisation.UserAccountIdsIncluded.Add(SessionUserAccountId);
prmUserOrganisation.OrganisationStatusCat = SaxOrganisation.StatusCat.ActiveOnly;
prmUserOrganisation.OrganisationMembersOnly = true;
prmUserOrganisation.OrganisationRolesAny.AddRange(requiredRoles);