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 Commodities { get; } = new List(); // Reference data. public List Statuses { get; } = new List(); 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 columns = new List() { 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); } //------------------------------------------------------------------- } //======================================================================= }