Files
BusinessMgr-2019/SaBusinessMgrCoreWebPortal/Portal/Controllers/CommodityController-Ajax.cs
T
2021-08-05 20:36:06 +01:00

306 lines
12 KiB
C#

using Microsoft.AspNetCore.Mvc;
using Sarand.BusinessMgr.Net.Core.Web.App;
using Sarand.BusinessMgr.Net.Core.Web.Helpers;
using Sarand.BusinessMgr.Net.Core.Web.Portal.Models;
using Sarand.BusinessMgr.Net.Standard.Base.App;
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
using Sarand.BusinessMgr.Net.Standard.Base.Consoles;
using Sarand.BusinessMgr.Net.Standard.Base.Helpers;
using Sarand.BusinessMgr.Net.Standard.Base.Mgr;
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 Sarand.Net.Standard.Base.Email;
using Sarand.Net.Standard.Base.Helpers;
using Sarand.Net.Standard.Base.Security;
using Sarand.Net.Standard.Base.Utils;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
namespace Sarand.BusinessMgr.Net.Core.Web.Portal.Controllers
{
//=======================================================================
// Portal Commodity Controller - Ajax actions.
//=======================================================================
partial class CommodityController
{
//-------------------------------------------------------------------
// Commodity data.
private class CommodityData_List : AjaxResponse_Data.ItemData
{
public String TypeCode { get; set; }
public String TypeDesc { get; set; }
public String Code { get; set; } = "";
public String Desc { get; set; } = "";
// Address.
public String AddressSummary { get; set; }
}
private class CommodityData_Full : CommodityData_List
{
// Commodity properties.
}
private void PopulateCommodityResponseData(SbmCommodity commodity, CommodityData_List data)
{
data.Id = SysId.ToString(commodity.Id);
data.TypeCode = Internals.CommodityTypeCodes.GetCodeForType(commodity.CommodityType);
data.TypeDesc = Internals.CommodityTypeCodes.GetDescForType(commodity.CommodityType);
data.Code = commodity.Code;
data.Desc = commodity.DescBrief;
// Common properties.
data.Notes = commodity.Notes;
data.StatusCode = commodity.StatusCode;
data.StatusDesc = commodity.StatusDesc;
}
private void PopulateCommodityResponseData(SbmCommodity commodity, CommodityData_Full data)
{
PopulateCommodityResponseData(commodity, data as CommodityData_List);
// Commodity properties.
}
//-------------------------------------------------------------------
// Commodity list.
//-------------------------------------------------------------------
private class AjaxResponse_CommodityList : AjaxResponse_Data
{
// Construction.
public AjaxResponse_CommodityList(SbmModel_Portal model) : base(model) { }
// Commodity list.
public List<CommodityData_List> Commodities { get; } = new List<CommodityData_List>();
// Reference data.
public List<CodeDesc> Statuses { get; } = new List<CodeDesc>();
public String DefaultStatusCode { get; set; }
}
// Ajax request.
[HttpPost]
[Route("Commodity/Ajax/List")]
[Route("Commodity/Ajax/GetList")]
public IActionResult Ajax_CommodityList(Model_Commodity model)
{
String fn = GetType().Name + ".Ajax_CommodityList";
AjaxResponse_CommodityList responseData = new AjaxResponse_CommodityList(model);
String messageTitle = Localiser["commodity.caption.commodities"];
// Validate session and referrer.
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
if (!ValidReferer) return Forbid();
RefreshModel(model);
// Reference data - statuses.
foreach (SaStatus status in SbmCommodity.ValidStatuses.FindAll(item => item != SaStatus.Deleted))
responseData.Statuses.Add(SacsSystem.GetStatusCode(status), Localiser.GetStatusCaption(status));
responseData.DefaultStatusCode = SacsSystem.GetStatusCode(SbmCommodity.DefaultStatus);
// Item filter.
SbmCommodity.Params prmCommodity = new SbmCommodity.Params();
prmCommodity.Search = model.Filter.CommoditySearch;
prmCommodity.CommodityType = model.GetFilterCommodityType();
prmCommodity.StatusCat = SbmCommodity.StatusCat.NotDeleted;
prmCommodity.SortColumns.Add(CommodityMgr.GetCommodityColumnDfn(SbmCommodity.Column.Code));
prmCommodity.SortColumns.Add(CommodityMgr.GetCommodityColumnDfn(SbmCommodity.Column.DescBrief));
model.Paging.ItemTotal = (ulong)CommodityMgr.GetCommodityCount(prmCommodity);
model.PopulatePagingTo(prmCommodity.ResultsPaging);
// Item columns.
ColumnDfn colId = CommodityMgr.GetCommodityColumnDfn(SbmCommodity.Column.Id);
ColumnDfn colCommodityType = CommodityMgr.GetCommodityColumnDfn(SbmCommodity.Column.Type_Desc);
ColumnDfn colCode = CommodityMgr.GetCommodityColumnDfn(SbmCommodity.Column.Code);
ColumnDfn colDescBrief = CommodityMgr.GetCommodityColumnDfn(SbmCommodity.Column.DescBrief);
ColumnDfn colNotes = CommodityMgr.GetCommodityColumnDfn(SbmCommodity.Column.Notes);
ColumnDfn colStatus = CommodityMgr.GetCommodityColumnDfn(SbmCommodity.Column.Status);
ColumnDfn colCreatedOn = CommodityMgr.GetCommodityColumnDfn(SbmCommodity.Column.CreateOn_Date);
ColumnDfn colUpdatedOn = CommodityMgr.GetCommodityColumnDfn(SbmCommodity.Column.UpdateOn_Date);
List<ColumnDfn> columns = new List<ColumnDfn>()
{
colId, colCommodityType, colCode, colDescBrief,
colNotes, colStatus, colCreatedOn, colUpdatedOn
};
// Query items.
using (DbResultSet resultSet = CommodityMgr.ExecuteCommodityQuery(columns, prmCommodity))
{
while (resultSet != null && resultSet.HasRows && resultSet.NextRecord())
{
NamedValue.Map values = resultSet.GetRecordValues();
Sbm.CommodityType commodityType = (Sbm.CommodityType)values.GetLong(colCommodityType.DataName);
CommodityData_List commodityData = new CommodityData_List()
{
Id = values.GetString(colId.DataName),
TypeCode = Internals.CommodityTypeCodes.GetCodeForType(commodityType),
TypeDesc = Internals.CommodityTypeCodes.GetDescForType(commodityType),
Code = values.GetString(colCode.DataName),
Desc = values.GetString(colDescBrief.DataName),
Notes = values.GetString(colNotes.DataName),
StatusCode = values.GetString(colStatus.DataName),
StatusDesc = SacsSystem.GetStatusDescForCode(values.GetString(colStatus.DataName)),
CreatedOn = DateUtil.Format(values.GetDate(colCreatedOn.DataName), "yyyyMMdd"),
CreatedOnFmt = Localiser.FormatDate(values.GetDate(colCreatedOn.DataName)),
UpdatedOn = DateUtil.Format(values.GetDate(colUpdatedOn.DataName), "yyyyMMdd"),
UpdatedOnFmt = Localiser.FormatDate(values.GetDate(colUpdatedOn.DataName))
};
responseData.Commodities.Add(commodityData);
}
}
// Refresh paging info.
if (model.Paging.IsPaged)
model.Paging.ItemCount = (ushort)responseData.Commodities.Count;
SessionData_Portal.Profile.Commodities.Filter.PageNo = model.Paging.PageNo;
SessionData_Portal.Profile.Commodities.Filter.PageLength = model.Paging.PageLength;
responseData.SetPaging(model);
// Complete response.
responseData.Success = true;
return Json(responseData);
}
//-------------------------------------------------------------------
// Get Commodity ajax request.
//-------------------------------------------------------------------
private class AjaxResponse_Commodity : AjaxResponse_Data
{
// Construction.
public AjaxResponse_Commodity(SbmModel_Portal model) : base(model) { }
// Commodity details.
public CommodityData_Full commodity { get; } = new CommodityData_Full();
}
//-------------------------------------------------------------------
[HttpPost]
[Route("Commodity/Ajax/Item")]
[Route("Commodity/Ajax/GetItem")]
public IActionResult Ajax_GetItem(Model_Commodity model)
{
String fn = GetType().Name + ".Ajax_GetItem";
String messageTitle = Localiser["commodity.caption.commodity"];
AjaxResponse_Commodity responseData = new AjaxResponse_Commodity(model);
// Validate session and referrer.
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
if (!ValidReferer) return Forbid();
RefreshModel(model);
// Identify item.
SysId commodityId = model.CommodityId.ToSysId();
if (!SysId.IsValid(commodityId))
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.specified"]));
// Retrieve item.
SbmCommodity commodity = CommodityMgr.GetCommodityById(commodityId);
if (commodity == null)
{
SaLogger.Warn(fn + " Failed to retrieve commodity for Id: '" + model.CommodityId + "'");
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.found"]));
}
// Construct response.
PopulateCommodityResponseData(commodity, responseData.commodity);
// Complete response.
responseData.Success = true;
return Json(responseData);
}
//-------------------------------------------------------------------
// Store Commodity ajax request.
//-------------------------------------------------------------------
[HttpPost]
[Route("Commodity/Ajax/Store")]
[Route("Commodity/Ajax/StoreItem")]
public IActionResult Ajax_StoreItem(Model_Commodity model)
{
String fn = GetType().Name + ".Ajax_StoreItem";
String messageTitle = Localiser["commodity.caption.commodity"];
AjaxResponse_Commodity responseData = new AjaxResponse_Commodity(model);
// Validate session and referrer.
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
if (!ValidReferer) return Forbid();
RefreshModel(model);
// Validate item properties.
model.ValidateCommodityData(responseData);
if (responseData.HasControlErrors())
return Json(responseData);
// Validate item Id against 'Exists' flag.
SysId commodityId = model.CommodityId.ToSysId();
bool commodityExists = StringUtil.ToBool(model.CommodityExists);
if (commodityExists && !SysId.IsValid(commodityId))
{
SaLogger.Warn(fn + " Id not specified for existing Commodity.");
return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"]));
}
if (!commodityExists && SysId.IsValid(commodityId))
{
SaLogger.Warn(fn + " Id specified for new Commodity: '" + model.CommodityId + "'");
return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"]));
}
// Retrieve existing item.
SbmCommodity commodity = CommodityMgr.GetCommodityById(commodityId);
if (commodity == null && SysId.IsValid(commodityId))
{
SaLogger.Warn(fn + " Failed to retrieve commodity for Id: '" + model.CommodityId + "'");
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.found"]));
}
// Create new item if required.
if (commodity == null)
{
commodity = CommodityMgr.CreateCommodity(SessionData.Organisation.AffiliateId, model.GetCommodityType(), model.CommodityCode);
if (model.CommodityCode != null)
commodity.Code = model.CommodityCode;
}
// Populate item properties.
if (model.CommodityType != null)
commodity.CommodityType = model.GetCommodityType();
if (model.CommodityCode != null)
commodity.Code = model.CommodityCode;
if (model.CommodityDesc != null)
commodity.DescBrief = model.CommodityDesc;
// Common properties.
if (model.CommodityNotes != null)
commodity.Notes = model.CommodityNotes;
if (model.CommodityStatusCode != null)
commodity.Status = model.CommodityStatus;
// Store item.
if (!SysId.IsValid(commodity.Id))
{
if (!CommodityMgr.InsertCommodity(commodity, DbUpdateInfo))
{
SaLogger.Warn(fn + " Failed to insert commodity: " + CommodityMgr.ErrorStateMessage);
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.insert.failed"] + "\n\n" + CommodityMgr.ErrorStateMessage));
}
responseData.SetNotification(messageTitle, Localiser["msg.item.created"]);
}
else
{
if (!CommodityMgr.UpdateCommodity(commodity, DbUpdateInfo))
{
SaLogger.Warn(fn + " Failed to update commodity [Id:" + SysId.ToString(commodity.Id) + "]: " + CommodityMgr.ErrorStateMessage);
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.update.failed"] + "\n\n" + CommodityMgr.ErrorStateMessage));
}
responseData.SetNotification(messageTitle, Localiser["msg.item.updated"]);
}
// Construct response.
PopulateCommodityResponseData(commodity, responseData.commodity);
// Complete response.
responseData.Success = true;
return Json(responseData);
}
//-------------------------------------------------------------------
}
//=======================================================================
}