286 lines
12 KiB
C#
286 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.AffiliateIdOrganisation = SessionData.Organisation.AffiliateId;
|
|
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.Commodities.Filter.PageNo = model.Paging.PageNo;
|
|
SessionData.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.
|
|
if (!ValidUserSession)
|
|
return GetAjaxResult_InvalidSession(responseData);
|
|
|
|
// 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.
|
|
if (!ValidUserSession)
|
|
return GetAjaxResult_InvalidSession(responseData);
|
|
|
|
// Validate item properties.
|
|
model.ValidateCommodityData(responseData);
|
|
if (responseData.HasControlErrors())
|
|
return Json(responseData);
|
|
|
|
// Retrieve existing item.
|
|
SysId commodityId = model.CommodityId.ToSysId();
|
|
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.CommodityCode != null)
|
|
commodity.Code = model.CommodityCode;
|
|
// Common properties.
|
|
if (model.CommodityNotes != null)
|
|
commodity.Notes = model.CommodityNotes;
|
|
if (model.CommodityStatus != null)
|
|
commodity.Status = model.GetCommodityStatus();
|
|
|
|
// 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));
|
|
}
|
|
}
|
|
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));
|
|
}
|
|
}
|
|
|
|
// Construct response.
|
|
PopulateCommodityResponseData(commodity, responseData.commodity);
|
|
|
|
// Complete response.
|
|
responseData.Success = true;
|
|
|
|
return Json(responseData);
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
}
|
|
//=======================================================================
|
|
}
|