|
|
|
@@ -0,0 +1,351 @@
|
|
|
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
|
|
using Microsoft.Extensions.Logging;
|
|
|
|
|
using Sarand.Net.Standard.Base.App;
|
|
|
|
|
using Sarand.Net.Standard.Base.Bus;
|
|
|
|
|
using Sarand.Net.Standard.Base.Core;
|
|
|
|
|
using Sarand.Net.Standard.Base.Dbas;
|
|
|
|
|
using Saxonite.Net.Standard.Base.App;
|
|
|
|
|
using Saxonite.Net.Core.Web.Admin.Models;
|
|
|
|
|
using Saxonite.Net.Core.Web.Admin.Models.Support;
|
|
|
|
|
using Saxonite.Net.Core.Web.Base.App;
|
|
|
|
|
using Saxonite.Net.Standard.Base.Bus;
|
|
|
|
|
using Saxonite.Net.Standard.Base.Bus.Support;
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using Sarand.Net.Standard.Base.Utils;
|
|
|
|
|
|
|
|
|
|
namespace Saxonite.Net.Core.Web.Admin.Controllers.Support
|
|
|
|
|
{
|
|
|
|
|
//=======================================================================
|
|
|
|
|
// UserReport Controller - Ajax requests.
|
|
|
|
|
//=======================================================================
|
|
|
|
|
partial class Controller_UserReport
|
|
|
|
|
{
|
|
|
|
|
//-------------------------------------------------------------------
|
|
|
|
|
// UserReport data.
|
|
|
|
|
private class UserReportListData : AjaxResponse_Data.ItemData_Base
|
|
|
|
|
{
|
|
|
|
|
// Account Id only populated while account names are being queried, then nulled.
|
|
|
|
|
public SysId UserAccountId { get; set; }
|
|
|
|
|
public String UserDisplayName { get; set; }
|
|
|
|
|
public String ReportTypeCode { get; set; }
|
|
|
|
|
public String ReportTypeDesc { get; set; }
|
|
|
|
|
public String Title { get; set; }
|
|
|
|
|
public String RecordedOnDisp { get; set; }
|
|
|
|
|
}
|
|
|
|
|
private class UserReportItemData : UserReportListData
|
|
|
|
|
{
|
|
|
|
|
public String ReportType { get; set; }
|
|
|
|
|
public String Report { get; set; }
|
|
|
|
|
public String RecordedOnForm { get; set; }
|
|
|
|
|
}
|
|
|
|
|
private void PopulateUserReportResponseListData(SaxModel_Admin model, SaxUserReport userReport, SaxUserAccount userAccount, UserReportListData data)
|
|
|
|
|
{
|
|
|
|
|
data.Id = SysId.ToString(userReport.Id);
|
|
|
|
|
data.UserDisplayName = userAccount.GetDisplayName();
|
|
|
|
|
data.ReportTypeCode = UserReportTypeCodes.GetCodeForType(userReport.ReportType);
|
|
|
|
|
data.ReportTypeDesc = model.Localiser.GetUserReportTypeCaption(userReport.ReportType);
|
|
|
|
|
data.Title = userReport.Title;
|
|
|
|
|
data.RecordedOnDisp = model.FormatDateForDisplay(userReport.RecordedOn);
|
|
|
|
|
data.StatusCode = userReport.StatusCode;
|
|
|
|
|
data.StatusDesc = userReport.StatusDesc;
|
|
|
|
|
}
|
|
|
|
|
private void PopulateUserReportResponseItemData(Model_UserReport model, SaxUserReport userReport, SaxUserAccount userAccount, UserReportItemData data)
|
|
|
|
|
{
|
|
|
|
|
PopulateUserReportResponseListData(model, userReport, userAccount, data);
|
|
|
|
|
data.Report = userReport.Report;
|
|
|
|
|
data.RecordedOnForm = model.FormatDateForForm(userReport.RecordedOn);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------
|
|
|
|
|
// Ajax - User Report list.
|
|
|
|
|
//-------------------------------------------------------------------
|
|
|
|
|
private class AjaxResponse_UserReportList : AjaxResponse_Data
|
|
|
|
|
{
|
|
|
|
|
// Construction.
|
|
|
|
|
public AjaxResponse_UserReportList(SaxModel_Admin model) : base(model) { }
|
|
|
|
|
// UserReport list.
|
|
|
|
|
public List<UserReportListData> Reports { get; } = new List<UserReportListData>();
|
|
|
|
|
// Reference data.
|
|
|
|
|
public List<ItemCodeDesc> ReportTypes { get; } = new List<ItemCodeDesc>();
|
|
|
|
|
public List<ItemCodeDesc> Statuses { get; } = new List<ItemCodeDesc>();
|
|
|
|
|
public String DefaultStatusCode { get; set; }
|
|
|
|
|
}
|
|
|
|
|
//-------------------------------------------------------------------
|
|
|
|
|
[HttpPost]
|
|
|
|
|
[Route("UserReport/Ajax/GetList")]
|
|
|
|
|
public IActionResult Ajax_GetList(Model_UserReport model)
|
|
|
|
|
{
|
|
|
|
|
String fn = GetType().Name + ".Ajax_GetList";
|
|
|
|
|
String messageTitle = Localiser["caption.user.reports"];
|
|
|
|
|
AjaxResponse_UserReportList responseData = new AjaxResponse_UserReportList(model);
|
|
|
|
|
|
|
|
|
|
// Validate session.
|
|
|
|
|
if (!ValidUserSession)
|
|
|
|
|
return GetAjaxResult_InvalidSession(responseData);
|
|
|
|
|
|
|
|
|
|
// Reference data - report types.
|
|
|
|
|
responseData.ReportTypes.Add(new AjaxResponse_Data.ItemCodeDesc());
|
|
|
|
|
List<Sax.UserReportType> validReportTypes = new List<Sax.UserReportType>(EnumUtil.GetValues<Sax.UserReportType>());
|
|
|
|
|
foreach (TypeCodeDesc reportType in UserReportTypeCodes)
|
|
|
|
|
{
|
|
|
|
|
if (!validReportTypes.Contains((Sax.UserReportType)reportType.Type)) continue;
|
|
|
|
|
responseData.ReportTypes.Add(new AjaxResponse_Data.ItemCodeDesc() { Code = reportType.Code, Desc = Localiser.GetUserReportTypeCaption((Sax.UserReportType)reportType.Type) });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Reference data - statuses.
|
|
|
|
|
foreach (SaStatus status in SaxUserReport.ValidStatuses.FindAll(item => item != SaStatus.Deleted))
|
|
|
|
|
responseData.Statuses.Add(new AjaxResponse_Data.ItemCodeDesc() { Code = SacsSystem.GetStatusCode(status), Desc = Localiser.GetStatusCaption(status) });
|
|
|
|
|
responseData.DefaultStatusCode = SacsSystem.GetStatusCode(SaxUserReport.DefaultStatus);
|
|
|
|
|
|
|
|
|
|
// Item filter.
|
|
|
|
|
SaxUserReport.Params prmUserReport = new SaxUserReport.Params();
|
|
|
|
|
prmUserReport.UserReportFilter = model.Filter.Report;
|
|
|
|
|
prmUserReport.StatusCat = SaxUserReport.StatusCat.NotDeleted;
|
|
|
|
|
model.Paging.ItemTotal = (ulong)SupportMgr.GetUserReportCount(prmUserReport);
|
|
|
|
|
model.PopulatePagingTo(prmUserReport.ResultsPaging);
|
|
|
|
|
|
|
|
|
|
// Item columns.
|
|
|
|
|
ColumnDfn colId = SupportMgr.GetUserReportColumnDfn(SaxUserReport.Column.Id);
|
|
|
|
|
ColumnDfn colUserAccountId = SupportMgr.GetUserReportColumnDfn(SaxUserReport.Column.UserAccountId);
|
|
|
|
|
ColumnDfn colReportType = SupportMgr.GetUserReportColumnDfn(SaxUserReport.Column.ReportType);
|
|
|
|
|
ColumnDfn colTitle = SupportMgr.GetUserReportColumnDfn(SaxUserReport.Column.Title);
|
|
|
|
|
ColumnDfn colRecordedOn = SupportMgr.GetUserReportColumnDfn(SaxUserReport.Column.RecordedOn);
|
|
|
|
|
ColumnDfn colStatus = SupportMgr.GetUserReportColumnDfn(SaxUserReport.Column.Status);
|
|
|
|
|
List<ColumnDfn> columns = new List<ColumnDfn>()
|
|
|
|
|
{
|
|
|
|
|
colId, colUserAccountId, colReportType, colTitle,
|
|
|
|
|
colRecordedOn, colStatus
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Sort order.
|
|
|
|
|
prmUserReport.SortColumns.Add(colRecordedOn);
|
|
|
|
|
prmUserReport.SortColumns.Last().SortAscending = false;
|
|
|
|
|
prmUserReport.SortColumns.Add(colId);
|
|
|
|
|
prmUserReport.SortColumns.Last().SortAscending = false;
|
|
|
|
|
|
|
|
|
|
// User account details must be queried separately - different database!
|
|
|
|
|
HashSet<SysId> userAccountIds = new HashSet<SysId>();
|
|
|
|
|
|
|
|
|
|
// Query items.
|
|
|
|
|
using (DbResultSet resultSet = SupportMgr.ExecuteUserReportQuery(columns, prmUserReport))
|
|
|
|
|
{
|
|
|
|
|
while (resultSet != null && resultSet.HasRows && resultSet.NextRecord())
|
|
|
|
|
{
|
|
|
|
|
NamedValue.Map values = resultSet.GetRecordValues();
|
|
|
|
|
SysId userAccountId = new SysId(values.GetLong(colUserAccountId.DataName));
|
|
|
|
|
userAccountIds.AddId(userAccountId);
|
|
|
|
|
Sax.UserReportType reportType = (Sax.UserReportType)values.GetLong(colReportType.DataName);
|
|
|
|
|
UserReportListData userReportData = new UserReportListData()
|
|
|
|
|
{
|
|
|
|
|
Id = values.GetString(colId.DataName),
|
|
|
|
|
UserAccountId = userAccountId,
|
|
|
|
|
ReportTypeCode = UserReportTypeCodes.GetCodeForType(reportType),
|
|
|
|
|
ReportTypeDesc = model.Localiser.GetUserReportTypeCaption(reportType),
|
|
|
|
|
Title = values.GetString(colTitle.DataName),
|
|
|
|
|
RecordedOnDisp = model.FormatDateForDisplay(values.GetDate(colRecordedOn.DataName)),
|
|
|
|
|
StatusCode = values.GetString(colStatus.DataName),
|
|
|
|
|
StatusDesc = SacsSystem.GetStatusDescForCode(values.GetString(colStatus.DataName))
|
|
|
|
|
};
|
|
|
|
|
responseData.Reports.Add(userReportData);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (model.Paging.IsPaged)
|
|
|
|
|
model.Paging.ItemCount = (ushort)responseData.Reports.Count;
|
|
|
|
|
|
|
|
|
|
// Query and populate User Account details.
|
|
|
|
|
if (userAccountIds.Any())
|
|
|
|
|
{
|
|
|
|
|
// User Account columns.
|
|
|
|
|
ColumnDfn colUserAccount_Id = AccountMgr.GetUserAccountColumnDfn(SaxUserAccount.Column.Id);
|
|
|
|
|
ColumnDfn colUserAccount_Title = AccountMgr.GetUserAccountColumnDfn(SaxUserAccount.Column.Title);
|
|
|
|
|
ColumnDfn colUserAccount_FirstName = AccountMgr.GetUserAccountColumnDfn(SaxUserAccount.Column.FirstName);
|
|
|
|
|
ColumnDfn colUserAccount_LastName = AccountMgr.GetUserAccountColumnDfn(SaxUserAccount.Column.LastName);
|
|
|
|
|
List<ColumnDfn> userAccountCols = new List<ColumnDfn>() { colUserAccount_Id, colUserAccount_Title, colUserAccount_FirstName, colUserAccount_LastName };
|
|
|
|
|
// User Account filter.
|
|
|
|
|
SaxUserAccount.Params prmUserAccount = new SaxUserAccount.Params();
|
|
|
|
|
prmUserAccount.IdsIncluded.AddRange(userAccountIds);
|
|
|
|
|
prmUserAccount.StatusCat = SaxUserAccount.StatusCat.Any;
|
|
|
|
|
// Query user accounts and populate properties to report list.
|
|
|
|
|
using (DbResultSet resultSet = AccountMgr.ExecuteUserAccountQuery(userAccountCols, prmUserAccount))
|
|
|
|
|
{
|
|
|
|
|
while (resultSet != null && resultSet.HasRows && resultSet.NextRecord())
|
|
|
|
|
{
|
|
|
|
|
NamedValue.Map values = resultSet.GetRecordValues();
|
|
|
|
|
SysId userAccountId = new SysId(values.GetLong(colUserAccount_Id.DataName));
|
|
|
|
|
String title = values.GetString(colUserAccount_Title.DataName);
|
|
|
|
|
String firstName = values.GetString(colUserAccount_FirstName.DataName);
|
|
|
|
|
String lastName = values.GetString(colUserAccount_LastName.DataName);
|
|
|
|
|
foreach (UserReportListData userReportData in responseData.Reports.FindAll(item => SysId.InvalidOnNull(item.UserAccountId).Equals(userAccountId)))
|
|
|
|
|
{
|
|
|
|
|
userReportData.UserDisplayName = SaxUserAccount.GetDisplayName(title, firstName, lastName);
|
|
|
|
|
userReportData.UserAccountId = null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Clear any remaining User Account Ids.
|
|
|
|
|
foreach (UserReportListData userReportData in responseData.Reports.FindAll(item => item.UserAccountId != null))
|
|
|
|
|
userReportData.UserAccountId = null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Complete response.
|
|
|
|
|
responseData.SetPaging(model);
|
|
|
|
|
responseData.Success = true;
|
|
|
|
|
return Json(responseData);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------
|
|
|
|
|
// Ajax - User Report properties.
|
|
|
|
|
//-------------------------------------------------------------------
|
|
|
|
|
private class AjaxResponse_UserReport : AjaxResponse_Data
|
|
|
|
|
{
|
|
|
|
|
// Construction.
|
|
|
|
|
public AjaxResponse_UserReport(SaxModel_Admin model) : base(model) { }
|
|
|
|
|
// UserReport details.
|
|
|
|
|
public UserReportItemData Report { get; } = new UserReportItemData();
|
|
|
|
|
}
|
|
|
|
|
//-------------------------------------------------------------------
|
|
|
|
|
[HttpPost]
|
|
|
|
|
[Route("UserReport/Ajax/GetItem")]
|
|
|
|
|
public IActionResult Ajax_GetItem(Model_UserReport model)
|
|
|
|
|
{
|
|
|
|
|
String fn = GetType().Name + ".Ajax_GetItem";
|
|
|
|
|
String messageTitle = Localiser["caption.user.report"];
|
|
|
|
|
AjaxResponse_UserReport responseData = new AjaxResponse_UserReport(model);
|
|
|
|
|
|
|
|
|
|
// Validate session.
|
|
|
|
|
if (!ValidUserSession)
|
|
|
|
|
return GetAjaxResult_InvalidSession(responseData);
|
|
|
|
|
|
|
|
|
|
// Record disposable items as they are created so all can be disposed when needed.
|
|
|
|
|
using (DisposableCollection<SacsHierarchyItem> disposableItems = new DisposableCollection<SacsHierarchyItem>())
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
// Identify item.
|
|
|
|
|
SysId userReportId = model.UserReport.Id.ToSysId();
|
|
|
|
|
if (!SysId.IsValid(userReportId))
|
|
|
|
|
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.specified"]));
|
|
|
|
|
|
|
|
|
|
// Retrieve item.
|
|
|
|
|
SaxUserReport userReport = SupportMgr.GetUserReportById(userReportId);
|
|
|
|
|
disposableItems.Add(userReport);
|
|
|
|
|
if (userReport == null)
|
|
|
|
|
{
|
|
|
|
|
SaLogger.Warn(fn + " Failed to retrieve userReport for Id: '" + model.UserReport.Id + "'");
|
|
|
|
|
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.found"]));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Retrieve user.
|
|
|
|
|
SaxUserAccount userAccount = AccountMgr.GetUserAccountById(userReport.UserAccountId);
|
|
|
|
|
disposableItems.Add(userAccount);
|
|
|
|
|
|
|
|
|
|
// Construct response.
|
|
|
|
|
PopulateUserReportResponseItemData(model, userReport, userAccount, responseData.Report);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Complete response.
|
|
|
|
|
responseData.Success = true;
|
|
|
|
|
|
|
|
|
|
return Json(responseData);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------
|
|
|
|
|
// Ajax - User Report storage.
|
|
|
|
|
//-------------------------------------------------------------------
|
|
|
|
|
[HttpPost]
|
|
|
|
|
[Route("UserReport/Ajax/StoreItem")]
|
|
|
|
|
public IActionResult Ajax_StoreItem(Model_UserReport model)
|
|
|
|
|
{
|
|
|
|
|
String fn = GetType().Name + ".Ajax_StoreItem";
|
|
|
|
|
String messageTitle = Localiser["caption.user.report"];
|
|
|
|
|
AjaxResponse_UserReport responseData = new AjaxResponse_UserReport(model);
|
|
|
|
|
|
|
|
|
|
// Validate session.
|
|
|
|
|
if (!ValidUserSession)
|
|
|
|
|
return GetAjaxResult_InvalidSession(responseData);
|
|
|
|
|
|
|
|
|
|
// 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.ValidateUserReportData(responseData);
|
|
|
|
|
if (responseData.HasControlErrors())
|
|
|
|
|
return Json(responseData);
|
|
|
|
|
|
|
|
|
|
// Retrieve existing item.
|
|
|
|
|
SysId userReportId = model.UserReport.Id.ToSysId();
|
|
|
|
|
if (StringUtil.ToBool(model.UserReport.Exists) && !SysId.IsValid(userReportId))
|
|
|
|
|
{
|
|
|
|
|
SaLogger.Warn(fn + " Item Id not supplied for existing item.");
|
|
|
|
|
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.system"]));
|
|
|
|
|
}
|
|
|
|
|
if (!StringUtil.ToBool(model.UserReport.Exists) && SysId.IsValid(userReportId))
|
|
|
|
|
{
|
|
|
|
|
SaLogger.Warn(fn + " Item Id supplied for new item: '" + model.UserReport.Id + "'");
|
|
|
|
|
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.system"]));
|
|
|
|
|
}
|
|
|
|
|
SaxUserReport userReport = SupportMgr.GetUserReportById(userReportId);
|
|
|
|
|
disposableItems.Add(userReport);
|
|
|
|
|
if (userReport == null && SysId.IsValid(userReportId))
|
|
|
|
|
{
|
|
|
|
|
SaLogger.Warn(fn + " Failed to retrieve userReport for Id: '" + model.UserReport.Id + "'");
|
|
|
|
|
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.found"]));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Create new item if required.
|
|
|
|
|
if (userReport == null)
|
|
|
|
|
{
|
|
|
|
|
userReport = SupportMgr.CreateUserReport(SessionUserAccountId);
|
|
|
|
|
disposableItems.Add(userReport);
|
|
|
|
|
userReport.RecordedOn = DateTime.Today;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Populate item properties.
|
|
|
|
|
if (model.UserReport.ReportType != null)
|
|
|
|
|
userReport.ReportType = model.UserReportType;
|
|
|
|
|
if (model.UserReport.Title != null)
|
|
|
|
|
userReport.Title = model.UserReport.Title;
|
|
|
|
|
if (model.UserReport.Report != null)
|
|
|
|
|
userReport.Report = model.UserReport.Report;
|
|
|
|
|
if (model.UserReport.Status != null)
|
|
|
|
|
userReport.Status = model.UserReportStatus;
|
|
|
|
|
|
|
|
|
|
// Store item.
|
|
|
|
|
if (!SysId.IsValid(userReport.Id))
|
|
|
|
|
{
|
|
|
|
|
if (!SupportMgr.InsertUserReport(userReport, DbUpdateInfo))
|
|
|
|
|
{
|
|
|
|
|
SaLogger.Warn(fn + " Failed to insert userReport: " + SupportMgr.ErrorStateMessage);
|
|
|
|
|
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.insert.failed"] + "\n\n" + SupportMgr.ErrorStateMessage));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (!SupportMgr.UpdateUserReport(userReport, DbUpdateInfo))
|
|
|
|
|
{
|
|
|
|
|
SaLogger.Warn(fn + " Failed to update userReport [Id:" + SysId.ToString(userReport.Id) + "]: " + SupportMgr.ErrorStateMessage);
|
|
|
|
|
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.update.failed"] + "\n\n" + SupportMgr.ErrorStateMessage));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Retrieve user.
|
|
|
|
|
SaxUserAccount userAccount = AccountMgr.GetUserAccountById(userReport.UserAccountId);
|
|
|
|
|
disposableItems.Add(userAccount);
|
|
|
|
|
|
|
|
|
|
// Construct response.
|
|
|
|
|
PopulateUserReportResponseItemData(model, userReport, userAccount, responseData.Report);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Complete response.
|
|
|
|
|
responseData.Success = true;
|
|
|
|
|
|
|
|
|
|
return Json(responseData);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------
|
|
|
|
|
}
|
|
|
|
|
//=======================================================================
|
|
|
|
|
}
|