Commodities
This commit is contained in:
+143
-148
@@ -1,27 +1,17 @@
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Sarand.BusinessMgr.Net.Core.Web.App;
|
||||
using Sarand.BusinessMgr.Net.Core.Web.Helpers;
|
||||
using Sarand.BusinessMgr.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.BusinessMgr.Web.Portal.Models;
|
||||
using Sarand.BusinessMgr.Web.Portal.Models.Commodities;
|
||||
using Sarand.BusinessMgr.Web.Portal.Models.Contacts;
|
||||
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;
|
||||
using Sarand.BusinessMgr.Web.Portal.Models.Commodities;
|
||||
using static Sarand.BusinessMgr.Net.Standard.Base.App.Sbm;
|
||||
|
||||
namespace Sarand.BusinessMgr.Web.Portal.Controllers.Commodities
|
||||
@@ -32,16 +22,19 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Commodities
|
||||
partial class CommodityController
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
// Commodity data.
|
||||
// Item data.
|
||||
private class CommodityListData : AjaxResponse_Data.ItemData_Base
|
||||
{
|
||||
public String TypeCode { get; set; }
|
||||
public String TypeDesc { get; set; }
|
||||
// Item properties with specific handling.
|
||||
public String Code { get; set; }
|
||||
public String Desc { get; set; }
|
||||
public String SalesPriceFmt { get; set; }
|
||||
public String SalesUnit { get; set; }
|
||||
public String CostPriceFmt { get; set; }
|
||||
public String Caption { get; set; }
|
||||
// Fields.
|
||||
public class FieldData
|
||||
{
|
||||
// Item property values keyed to match field name.
|
||||
public Dictionary<string, string> Value { get; } = new Dictionary<string, string>();
|
||||
}
|
||||
public FieldData Field { get; } = new FieldData();
|
||||
}
|
||||
private enum CommodityDataGroup
|
||||
{
|
||||
@@ -49,48 +42,43 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Commodities
|
||||
}
|
||||
private class CommodityItemData : CommodityListData
|
||||
{
|
||||
// Commodity properties.
|
||||
public String DrawingIssue { get; set; }
|
||||
public String AssocIdCustomer { get; set; }
|
||||
public String AssocIdSupplier { get; set; }
|
||||
// Sales.
|
||||
public String SalesPrice { get; set; }
|
||||
// Purchasing.
|
||||
public String CostPrice { get; set; }
|
||||
// Specification.
|
||||
// Production.
|
||||
// Affiliate properties with specific handling.
|
||||
public String TypeCode { get; set; }
|
||||
public String TypeDesc { get; set; }
|
||||
}
|
||||
private void PopulateCommodityResponseListData(SbmCommodity commodity, CommodityListData 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;
|
||||
data.SalesPriceFmt = StringUtil.NullOnBlank(StringUtil.FormatNumeric(commodity.SalesPrice, SbmInternals.CurrencyDecimalsDefault, 0, ','));
|
||||
data.SalesUnit = StringUtil.NullOnBlank(Internals.GetUnitOfMeasureCaption(commodity.UomIdSale));
|
||||
data.CostPriceFmt = StringUtil.NullOnBlank(StringUtil.FormatNumeric(commodity.CostPrice, SbmInternals.CurrencyDecimalsDefault, 0, ','));
|
||||
// Common properties.
|
||||
data.Notes = commodity.Notes;
|
||||
data.StatusCode = commodity.StatusCode;
|
||||
data.StatusDesc = commodity.StatusDesc;
|
||||
}
|
||||
private void PopulateCommodityResponseItemData(SbmCommodity commodity, CommodityItemData data, HashSet<CommodityDataGroup> dataGroups = null)
|
||||
{
|
||||
PopulateCommodityResponseListData(commodity, data as CommodityListData);
|
||||
// Prominent properties for selecting and editing.
|
||||
data.Code = commodity.Code;
|
||||
data.Caption = commodity.DescBrief;
|
||||
// Affiliate type - populate for list ('Type' property populated with desc) and form (Type Code & Desc).
|
||||
data.TypeCode = Internals.CommodityTypeCodes.GetCodeForType(commodity.CommodityType);
|
||||
data.TypeDesc = Internals.CommodityTypeCodes.GetDescForType(commodity.CommodityType);
|
||||
data.Field.Value.Add($"{Model_Commodity.ItemField.Type}", Internals.CommodityTypeCodes.GetDescForType(commodity.CommodityType));
|
||||
// Commodity properties.
|
||||
data.DrawingIssue = StringUtil.NullOnBlank(commodity.DrawingIssue);
|
||||
data.AssocIdCustomer = StringUtil.NullOnBlank(SysId.ToString(commodity.AssociationIdCustomer));
|
||||
data.AssocIdSupplier = StringUtil.NullOnBlank(SysId.ToString(commodity.AssociationIdSupplier));
|
||||
data.Field.Value.Add($"{Model_Commodity.ItemField.Code}", commodity.Code);
|
||||
data.Field.Value.Add($"{Model_Commodity.ItemField.DescBrief}", commodity.DescBrief);
|
||||
data.Field.Value.Add($"{Model_Commodity.ItemField.DrawingIssue}", commodity.DrawingIssue);
|
||||
data.Field.Value.Add($"{Model_Commodity.ItemField.SalesPriceFmt}", StringUtil.NullOnBlank(StringUtil.FormatNumeric(commodity.SalesPrice, SbmInternals.CurrencyDecimalsDefault, 0, ',')));
|
||||
data.Field.Value.Add($"{Model_Commodity.ItemField.SalesUnit}", StringUtil.NullOnBlank(Internals.GetUnitOfMeasureCaption(commodity.UomIdSale)));
|
||||
data.Field.Value.Add($"{Model_Commodity.ItemField.CostPriceFmt}", StringUtil.NullOnBlank(StringUtil.FormatNumeric(commodity.CostPrice, SbmInternals.CurrencyDecimalsDefault, 0, ',')));
|
||||
data.Field.Value.Add($"{Model_Commodity.ItemField.AssocIdCustomer}", StringUtil.NullOnBlank(SysId.ToString(commodity.AssociationIdCustomer)));
|
||||
data.Field.Value.Add($"{Model_Commodity.ItemField.AssocIdSupplier}", StringUtil.NullOnBlank(SysId.ToString(commodity.AssociationIdSupplier)));
|
||||
if (dataGroups != null && dataGroups.Contains(CommodityDataGroup.Sales))
|
||||
{
|
||||
// Sales.
|
||||
data.SalesPrice = StringUtil.NullOnBlank(StringUtil.FormatNumeric(commodity.SalesPrice, SbmInternals.CurrencyDecimalsDefault));
|
||||
data.Field.Value.Add($"{Model_Commodity.ItemField.SalesPrice}", StringUtil.NullOnBlank(StringUtil.FormatNumeric(commodity.SalesPrice, SbmInternals.CurrencyDecimalsDefault)));
|
||||
data.Field.Value.Add($"{Model_Commodity.ItemField.UomIdSale}", StringUtil.NullOnBlank(SysId.ToString(commodity.UomIdSale)));
|
||||
}
|
||||
if (dataGroups != null && dataGroups.Contains(CommodityDataGroup.Purchasing))
|
||||
{
|
||||
// Purchasing.
|
||||
data.CostPrice = StringUtil.NullOnBlank(StringUtil.FormatNumeric(commodity.CostPrice, SbmInternals.CurrencyDecimalsDefault));
|
||||
data.Field.Value.Add($"{Model_Commodity.ItemField.CostPrice}", StringUtil.NullOnBlank(StringUtil.FormatNumeric(commodity.CostPrice, SbmInternals.CurrencyDecimalsDefault)));
|
||||
}
|
||||
if (dataGroups != null && dataGroups.Contains(CommodityDataGroup.Specification))
|
||||
{
|
||||
@@ -100,74 +88,87 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Commodities
|
||||
{
|
||||
// Production.
|
||||
}
|
||||
// Common properties.
|
||||
data.StatusCode = commodity.StatusCode;
|
||||
data.StatusDesc = commodity.StatusDesc;
|
||||
data.Field.Value.Add($"{Model_Contact.ItemField.Status}", commodity.StatusDesc);
|
||||
// Cleanse field values.
|
||||
data.Field.Value.RemoveAll(item => StringUtil.IsBlank(item.Value));
|
||||
// Populate item list values that might be cleared during update after removing blank values to ensure that blank values are published.
|
||||
data.Field.Value.Add($"{Model_Commodity.ItemField.Notes}", commodity.Notes);
|
||||
data.Field.Value.Add($"{Model_Commodity.ItemField.UpdatedOn}", Localiser.FormatDate(commodity.UpdateStamp.On));
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Commodity configuration.
|
||||
//-------------------------------------------------------------------
|
||||
private class AjaxResponse_CommodityConfig : AjaxResponse_Data
|
||||
{
|
||||
// Construction.
|
||||
public AjaxResponse_CommodityConfig(SbmModel_Portal model) : base(model) { }
|
||||
// Configuration.
|
||||
public Model_Commodity.ListConfigData Config { get; } = new Model_Commodity.ListConfigData();
|
||||
public Model_Commodity.ItemConfigData ConfigCmd { get; } = new Model_Commodity.ItemConfigData();
|
||||
// Reference data.
|
||||
public List<CodeDesc> CommodityTypes { get; } = new List<CodeDesc>();
|
||||
public List<CodeDesc> Statuses { get; } = new List<CodeDesc>();
|
||||
public String DefaultStatusCode { get; set; }
|
||||
}
|
||||
// Ajax request.
|
||||
[HttpPost]
|
||||
[Route("Commodity/Ajax/Config")]
|
||||
[Route("Commodity/Ajax/GetConfig")]
|
||||
public IActionResult Ajax_CommodityConfig(Model_Commodity model)
|
||||
{
|
||||
AjaxResponse_CommodityConfig responseData = new AjaxResponse_CommodityConfig(model);
|
||||
String messageTitle = Localiser["caption.commodities"];
|
||||
|
||||
// Validate session and referrer.
|
||||
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
|
||||
if (!ValidReferer) return Forbid();
|
||||
RefreshModel(model);
|
||||
|
||||
// Populate configuration data.
|
||||
PopulateCommodityConfig(model, responseData);
|
||||
|
||||
// Complete response.
|
||||
responseData.Success = true;
|
||||
return Json(responseData);
|
||||
}
|
||||
private void PopulateCommodityConfig(Model_Commodity model, AjaxResponse_CommodityConfig responseData)
|
||||
{
|
||||
// Configuration.
|
||||
model.PopulateListConfig(responseData.Config);
|
||||
model.PopulateItemConfig(responseData.ConfigCmd, null, Sbm.CommodityType.Unknown);
|
||||
|
||||
// Reference data - commodity types.
|
||||
foreach (TypeCodeDesc commodityType in GetCodesOfType(Sbm.SystemCode.CommodityType))
|
||||
responseData.CommodityTypes.Add(commodityType.Code, commodityType.Desc);
|
||||
|
||||
// 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);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Commodity list.
|
||||
//-------------------------------------------------------------------
|
||||
private class AjaxResponse_CommodityList : AjaxResponse_Data
|
||||
private class AjaxResponse_CommodityList : AjaxResponse_CommodityConfig
|
||||
{
|
||||
// Construction.
|
||||
public AjaxResponse_CommodityList(SbmModel_Portal model) : base(model) { }
|
||||
// View mode.
|
||||
public class ModeData
|
||||
{
|
||||
public bool? Search { get; set; }
|
||||
public bool? Maintain { get; set; }
|
||||
public bool? StockControl { get; set; }
|
||||
public bool? StockTake { get; set; }
|
||||
}
|
||||
public ModeData Mode { get; set; }
|
||||
// Commodity list.
|
||||
public List<CommodityListData> Commodities { get; } = new List<CommodityListData>();
|
||||
// Commodity configuration.
|
||||
public class ConfigData
|
||||
{
|
||||
// Optional columns to show.
|
||||
public class ShowColumnData
|
||||
{
|
||||
public bool? CatalogRef { get; set; }
|
||||
public bool? Weight { get; set; }
|
||||
public bool? PackQtySale { get; set; }
|
||||
public bool? StockAllocated { get; set; }
|
||||
public bool? StockLevelSales { get; set; }
|
||||
public bool? StockAvailable { get; set; }
|
||||
}
|
||||
public ShowColumnData ShowColumn { get; } = new ShowColumnData();
|
||||
// Optional fields to show.
|
||||
public class ShowFieldData
|
||||
{
|
||||
public bool? DrawingIssue { get; set; }
|
||||
public bool? DrawingNo { get; set; }
|
||||
public bool? Department { get; set; }
|
||||
public bool? CatalogRef { get; set; }
|
||||
public bool? Volume { get; set; }
|
||||
public bool? Density { get; set; }
|
||||
public bool? BoxQuantity { get; set; }
|
||||
public bool? ICNTariffCode { get; set; }
|
||||
public bool? PlaceOfOrigin { get; set; }
|
||||
public bool? MaterialCost { get; set; }
|
||||
public bool? ExWorksCost { get; set; }
|
||||
public bool? RetailPricePlanned { get; set; }
|
||||
public bool? CarriageCostIndicative { get; set; }
|
||||
}
|
||||
public ShowFieldData ShowField { get; } = new ShowFieldData();
|
||||
// Configurable field label.
|
||||
public class FieldLabelData
|
||||
{
|
||||
public String CatalogRef { get; set; }
|
||||
public String Dimensions { get; set; }
|
||||
public String ICNTariffCode { get; set; }
|
||||
public String CostPrice { get; set; }
|
||||
public String PlaceOfOrigin { get; set; }
|
||||
public String MaterialCost { get; set; }
|
||||
public String CurrencyIdMaterial { get; set; }
|
||||
public String ExWorksCost { get; set; }
|
||||
public String CurrencyIdExWorks { get; set; }
|
||||
public String SpecSummary { get; set; }
|
||||
public String MaterialCode { get; set; }
|
||||
public String FinishCode { get; set; }
|
||||
public String DescDetail { get; set; }
|
||||
public String RetailPricePlanned { get; set; }
|
||||
}
|
||||
public FieldLabelData FieldLabel { get; } = new FieldLabelData();
|
||||
}
|
||||
public ConfigData Config { get; } = new ConfigData();
|
||||
// Reference data.
|
||||
public List<CodeDesc> CommodityTypes { get; } = new List<CodeDesc>();
|
||||
public List<CodeDesc> Statuses { get; } = new List<CodeDesc>();
|
||||
public String DefaultStatusCode { get; set; }
|
||||
}
|
||||
// Ajax request.
|
||||
[HttpPost]
|
||||
@@ -183,17 +184,20 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Commodities
|
||||
if (!ValidReferer) return Forbid();
|
||||
RefreshModel(model);
|
||||
|
||||
// Configuration.
|
||||
PopulateConfigShow(responseData.Config.ShowField);
|
||||
// Populate configuration data.
|
||||
PopulateCommodityConfig(model, responseData);
|
||||
|
||||
// Reference data - commodity types.
|
||||
foreach (TypeCodeDesc commodityType in GetCodesOfType(Sbm.SystemCode.CommodityType))
|
||||
responseData.CommodityTypes.Add(commodityType.Code, commodityType.Desc);
|
||||
|
||||
// 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);
|
||||
// View mode.
|
||||
responseData.Mode = new AjaxResponse_CommodityList.ModeData();
|
||||
Model_Commodity.CommodityViewMode viewMode = model.GetFilterMode();
|
||||
if (viewMode == Model_Commodity.CommodityViewMode.Maintain)
|
||||
responseData.Mode.Maintain = true;
|
||||
else if (viewMode == Model_Commodity.CommodityViewMode.StockControl)
|
||||
responseData.Mode.StockControl = true;
|
||||
else if (viewMode == Model_Commodity.CommodityViewMode.StockTake)
|
||||
responseData.Mode.StockTake = true;
|
||||
else
|
||||
responseData.Mode.Search = true;
|
||||
|
||||
// Item filter.
|
||||
SbmCommodity.Params prmCommodity = new SbmCommodity.Params();
|
||||
@@ -220,9 +224,12 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Commodities
|
||||
List<ColumnDfn> columns = new List<ColumnDfn>()
|
||||
{
|
||||
colId, colCommodityType, colCode, colDescBrief,
|
||||
colSalesPrice, colSalesUomId,colCostPrice,
|
||||
colNotes, colStatus, colCreatedOn, colUpdatedOn
|
||||
};
|
||||
if (model.UserCanViewCommodityFinancials_Sales())
|
||||
columns.AddRange(new[] { colSalesPrice, colSalesUomId });
|
||||
if (model.UserCanViewCommodityFinancials_Supply())
|
||||
columns.AddRange(new[] { colCostPrice });
|
||||
|
||||
// Query items.
|
||||
using (DbResultSet resultSet = CommodityMgr.ExecuteCommodityQuery(columns, prmCommodity))
|
||||
@@ -234,21 +241,26 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Commodities
|
||||
CommodityListData commodityData = new CommodityListData()
|
||||
{
|
||||
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),
|
||||
SalesPriceFmt = StringUtil.NullOnBlank(StringUtil.FormatNumeric(values.GetValue(colSalesPrice.DataName).ToDecimal(), SbmInternals.CurrencyDecimalsDefault, 0, ',')),
|
||||
SalesUnit = Internals.GetUnitOfMeasureCaption(new SysId(values.GetLong(colSalesUomId.DataName))),
|
||||
CostPriceFmt = StringUtil.NullOnBlank(StringUtil.FormatNumeric(values.GetValue(colCostPrice.DataName).ToDecimal(), SbmInternals.CurrencyDecimalsDefault, 0, ',')),
|
||||
Notes = StringUtil.NullOnBlank(values.GetString(colNotes.DataName)),
|
||||
Caption = values.GetString(colDescBrief.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))
|
||||
};
|
||||
commodityData.Field.Value.Add($"{Model_Commodity.ItemField.Type}", Internals.CommodityTypeCodes.GetDescForType(commodityType));
|
||||
commodityData.Field.Value.Add($"{Model_Commodity.ItemField.Code}", values.GetString(colCode.DataName));
|
||||
commodityData.Field.Value.Add($"{Model_Commodity.ItemField.DescBrief}", values.GetString(colDescBrief.DataName));
|
||||
if (model.UserCanViewCommodityFinancials_Sales())
|
||||
{
|
||||
commodityData.Field.Value.Add($"{Model_Commodity.ItemField.SalesPriceFmt}", StringUtil.FormatNumeric(values.GetValue(colSalesPrice.DataName).ToDecimal(), SbmInternals.CurrencyDecimalsDefault, 0, ','));
|
||||
commodityData.Field.Value.Add($"{Model_Commodity.ItemField.SalesUnit}", Internals.GetUnitOfMeasureCaption(new SysId(values.GetLong(colSalesUomId.DataName))));
|
||||
}
|
||||
if (model.UserCanViewCommodityFinancials_Supply())
|
||||
commodityData.Field.Value.Add($"{Model_Commodity.ItemField.CostPriceFmt}", StringUtil.FormatNumeric(values.GetValue(colCostPrice.DataName).ToDecimal(), SbmInternals.CurrencyDecimalsDefault, 0, ','));
|
||||
commodityData.Field.Value.Add($"{Model_Commodity.ItemField.Notes}", CommodityMgr.GetCommodityDataValue(colNotes, values).ToString());
|
||||
commodityData.Field.Value.Add($"{Model_Commodity.ItemField.Status}", SacsSystem.GetStatusDescForCode(values.GetString(colStatus.DataName)));
|
||||
commodityData.Field.Value.Add($"{Model_Commodity.ItemField.CreatedOn}", Localiser.FormatDate(values.GetDate(colCreatedOn.DataName)));
|
||||
commodityData.Field.Value.Add($"{Model_Commodity.ItemField.UpdatedOn}", Localiser.FormatDate(values.GetDate(colUpdatedOn.DataName)));
|
||||
// Cleanse item values.
|
||||
commodityData.Field.Value.RemoveAll(item => StringUtil.IsBlank(item.Value));
|
||||
responseData.Commodities.Add(commodityData);
|
||||
}
|
||||
}
|
||||
@@ -265,27 +277,6 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Commodities
|
||||
return Json(responseData);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Populate configuration.
|
||||
|
||||
private void PopulateConfigShow(AjaxResponse_CommodityList.ConfigData.ShowFieldData show)
|
||||
{
|
||||
// Ref. Sbm.OrgOption_ShowField.
|
||||
if (UserContext_Core.GetOwnerOption_ShowField(SbmDbDfn.ColumnIdx.Commodity_DrawingIssue)) show.DrawingIssue = true;
|
||||
if (UserContext_Core.GetOwnerOption_ShowField(SbmDbDfn.ColumnIdx.Commodity_DrawingNo)) show.DrawingNo = true;
|
||||
if (UserContext_Core.GetOwnerOption_ShowField(SbmDbDfn.ColumnIdx.Commodity_Department)) show.Department = true;
|
||||
if (UserContext_Core.GetOwnerOption_ShowField(SbmDbDfn.ColumnIdx.Commodity_CatalogRef)) show.CatalogRef = true;
|
||||
if (UserContext_Core.GetOwnerOption_ShowField(SbmDbDfn.ColumnIdx.Commodity_Volume)) show.Volume = true;
|
||||
if (UserContext_Core.GetOwnerOption_ShowField(SbmDbDfn.ColumnIdx.Commodity_Density)) show.Density = true;
|
||||
if (UserContext_Core.GetOwnerOption_ShowField(SbmDbDfn.ColumnIdx.Commodity_BoxQuantity)) show.BoxQuantity = true;
|
||||
if (UserContext_Core.GetOwnerOption_ShowField(SbmDbDfn.ColumnIdx.Commodity_ICNTariffCode)) show.ICNTariffCode = true;
|
||||
if (UserContext_Core.GetOwnerOption_ShowField(SbmDbDfn.ColumnIdx.Commodity_PlaceOfOrigin)) show.PlaceOfOrigin = true;
|
||||
if (UserContext_Core.GetOwnerOption_ShowField(SbmDbDfn.ColumnIdx.Commodity_MaterialCost)) show.MaterialCost = true;
|
||||
if (UserContext_Core.GetOwnerOption_ShowField(SbmDbDfn.ColumnIdx.Commodity_ExWorksCost)) show.ExWorksCost = true;
|
||||
if (UserContext_Core.GetOwnerOption_ShowField(SbmDbDfn.ColumnIdx.Commodity_RetailPricePlanned)) show.RetailPricePlanned = true;
|
||||
if (UserContext_Core.GetOwnerOption_ShowField(SbmDbDfn.ColumnIdx.Commodity_CarriageCostIndicative)) show.CarriageCostIndicative = true;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Get Commodity ajax request.
|
||||
//-------------------------------------------------------------------
|
||||
@@ -293,6 +284,8 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Commodities
|
||||
{
|
||||
// Construction.
|
||||
public AjaxResponse_Commodity(SbmModel_Portal model) : base(model) { }
|
||||
// Configuration.
|
||||
public Model_Commodity.ItemConfigData Config { get; } = new Model_Commodity.ItemConfigData();
|
||||
// Commodity details.
|
||||
public CommodityItemData commodity { get; } = new CommodityItemData();
|
||||
}
|
||||
@@ -324,6 +317,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Commodities
|
||||
}
|
||||
|
||||
// Construct response.
|
||||
model.PopulateItemConfig(responseData.Config, commodity);
|
||||
PopulateCommodityResponseItemData(commodity, responseData.commodity);
|
||||
|
||||
// Complete response.
|
||||
@@ -418,6 +412,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Commodities
|
||||
UpdateAssociatedData(commodity);
|
||||
|
||||
// Construct response.
|
||||
model.PopulateItemConfig(responseData.Config, commodity);
|
||||
PopulateCommodityResponseItemData(commodity, responseData.commodity);
|
||||
|
||||
// Complete response.
|
||||
|
||||
@@ -47,6 +47,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Commodities
|
||||
|
||||
// Commodity page.
|
||||
RefreshModel(model);
|
||||
model.PopulateListConfig();
|
||||
model.Paging.PageNo = SessionData_Portal.Profile.Commodities.Filter.PageNo;
|
||||
model.Paging.PageLength = SessionData_Portal.Profile.Commodities.Filter.PageLength;
|
||||
return View(model);
|
||||
|
||||
+10
-16
@@ -171,8 +171,8 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Contacts
|
||||
// View mode.
|
||||
public class ModeData
|
||||
{
|
||||
public bool? Maintain { get; set; }
|
||||
public bool? Search { get; set; }
|
||||
public bool? Maintain { get; set; }
|
||||
public bool? Relationships { get; set; }
|
||||
public bool? PriceSet { get; set; }
|
||||
}
|
||||
@@ -199,21 +199,15 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Contacts
|
||||
|
||||
// View mode.
|
||||
responseData.Mode = new AjaxResponse_AssociationList.ModeData();
|
||||
switch (model.GetFilterMode())
|
||||
{
|
||||
case Model_Association.AssociationViewMode.Search:
|
||||
responseData.Mode.Search = true;
|
||||
break;
|
||||
case Model_Association.AssociationViewMode.Relationships:
|
||||
responseData.Mode.Relationships = true;
|
||||
break;
|
||||
case Model_Association.AssociationViewMode.PriceSet:
|
||||
responseData.Mode.PriceSet = true;
|
||||
break;
|
||||
default:
|
||||
responseData.Mode.Maintain = true;
|
||||
break;
|
||||
}
|
||||
Model_Association.AssociationViewMode viewMode = model.GetFilterMode();
|
||||
if (viewMode == Model_Association.AssociationViewMode.Maintain)
|
||||
responseData.Mode.Maintain = true;
|
||||
else if (viewMode == Model_Association.AssociationViewMode.Relationships)
|
||||
responseData.Mode.Relationships = true;
|
||||
else if (viewMode == Model_Association.AssociationViewMode.PriceSet)
|
||||
responseData.Mode.PriceSet = true;
|
||||
else
|
||||
responseData.Mode.Search = true;
|
||||
|
||||
// Item filter.
|
||||
SbmAssociation.Params prmAssociation = new SbmAssociation.Params();
|
||||
|
||||
@@ -24,10 +24,10 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Contacts
|
||||
partial class ContactController
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
// Affiliate data.
|
||||
// Item data.
|
||||
private class AffiliateListData : AjaxResponse_Data.ItemData_Base
|
||||
{
|
||||
// Affiliate properties with specific handling.
|
||||
// Item properties with specific handling.
|
||||
public String Name { get; set; }
|
||||
// Affiliate properties for list with specific handling.
|
||||
public long? AssociationCount { get; set; }
|
||||
@@ -52,7 +52,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Contacts
|
||||
private void PopulateAffiliateResponseItemData(Model_Contact model, SbmAffiliate affiliate, AffiliateItemData data)
|
||||
{
|
||||
PopulateAffiliateResponseListData(model, affiliate, data as AffiliateListData);
|
||||
// Affiliate name - prominent property for selecting and editing.
|
||||
// Name - prominent property for selecting and editing.
|
||||
data.Name = affiliate.Name;
|
||||
// Affiliate type - populate for list ('Type' property populated with desc) and form (Type Code & Desc).
|
||||
data.TypeCode = Internals.AffiliateTypeCodes.GetCodeForType(affiliate.AffiliateType);
|
||||
@@ -206,10 +206,10 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Contacts
|
||||
// View mode.
|
||||
responseData.Mode = new AjaxResponse_ContactList.ModeData();
|
||||
Model_Contact.ContactViewMode viewMode = model.GetFilterMode();
|
||||
if (viewMode == Model_Contact.ContactViewMode.Search)
|
||||
responseData.Mode.Search = true;
|
||||
else
|
||||
if (viewMode == Model_Contact.ContactViewMode.Maintain)
|
||||
responseData.Mode.Maintain = true;
|
||||
else
|
||||
responseData.Mode.Search = true;
|
||||
|
||||
// Item filter.
|
||||
SbmAffiliate.Params prmAffiliate = new SbmAffiliate.Params();
|
||||
|
||||
@@ -80,7 +80,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers
|
||||
/// <para>- Open user session - store details against Sesion Data.</para>
|
||||
/// <para>- Set 'Keep logged in' cookie if required.</para>
|
||||
/// </summary>
|
||||
protected bool SignUserIn(ISbmUserContext_Core userContext, String repositoryContext, SaSecurityItem securityItemUser, SbmAffiliate affiliateUser, List<SysIdString> supervisedOrganisations, SbmAssociation associationOrganisation, SbmAffiliate affiliateOrganisation, bool keepLoggedIn, ref String errorMessage)
|
||||
protected bool SignUserIn(ISbmUserContext_Core userContext, String repositoryContext, SaSecurityConsole securityConsoleForUser, SbmAccountMgr accountMgrForUser, SaSecurityItem securityItemUser, SbmAffiliate affiliateUser, List<SysIdString> supervisedOrganisations, SbmAssociation associationOrganisation, SbmAffiliate affiliateOrganisation, bool keepLoggedIn, ref String errorMessage)
|
||||
{
|
||||
// Validate Security Item and Affiliate, just in case - should have been done before arriving here!
|
||||
if (securityItemUser == null)
|
||||
@@ -125,8 +125,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers
|
||||
// 'Keep logged in' can be switched off by the application configuration.
|
||||
keepLoggedIn = App.AppConfig.Security.SignIn.KeepLoggedIn.Allowed && keepLoggedIn;
|
||||
|
||||
using (SaSecurityConsole securityConsoleForUser = App.CreateSecurityConsole(userContext))
|
||||
using (SbmAccountMgr accountMgrForUser = App.System.CreateAccountMgr(userContext))
|
||||
using (DisposableCollection<SacsDisposable> disposables = new DisposableCollection<SacsDisposable>())
|
||||
{
|
||||
// Log user in.
|
||||
securityItemUser.LastLogin = DateTime.Now;
|
||||
@@ -148,14 +147,14 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers
|
||||
return false;
|
||||
}
|
||||
SaLogger.Info($"{SysUtil.Fn} User session opened for {securityItemUser.EmailAddress}", true);
|
||||
|
||||
// Create session.
|
||||
OpenUserSession(userContext.SessionContext, repositoryContext, securityItemUser, affiliateUser, supervisedOrganisations, associationOrganisation, affiliateOrganisation);
|
||||
|
||||
// Configure security profile.
|
||||
SessionData_Portal.SecurityProfile_Core.RefreshProfile(SessionConsole, securityConsoleForUser, securityItemUser.Id, securityConsoleForUser.GetRegisteredRights());
|
||||
}
|
||||
|
||||
// Create session.
|
||||
OpenUserSession(userContext.SessionContext, repositoryContext, securityItemUser, affiliateUser, supervisedOrganisations, associationOrganisation, affiliateOrganisation);
|
||||
|
||||
// Configure security profile.
|
||||
SessionData_Portal.SecurityProfile_Core.RefreshProfile(SessionConsole, SecurityConsole, securityItemUser.Id, SecurityConsole.GetRegisteredRights());
|
||||
|
||||
// Send the 'Keep Logged In' cookie if requested.
|
||||
if (affiliateUser.KeepLoggedIn_Portal)
|
||||
SetKeepLoggedInCookie();
|
||||
@@ -264,7 +263,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers
|
||||
{
|
||||
List<SysIdString> supervisedOrganisations = accountMgrForUser.GetAffiliatesSupervisedBy(affiliateUser.Id);
|
||||
String errorMessage = "";
|
||||
if (SignUserIn(userContext, keepLoggedInParams.RepositoryContext, securityItemUser, affiliateUser, supervisedOrganisations, associationOrganisation, affiliateOrganisation, true, ref errorMessage))
|
||||
if (SignUserIn(userContext, keepLoggedInParams.RepositoryContext, securityConsoleForUser, accountMgrForUser, securityItemUser, affiliateUser, supervisedOrganisations, associationOrganisation, affiliateOrganisation, true, ref errorMessage))
|
||||
{
|
||||
SaLogger.Info(logPrefix + " 'Keep Logged In' cookie found." + logSuffix);
|
||||
return true;
|
||||
|
||||
@@ -175,7 +175,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Security
|
||||
}
|
||||
|
||||
// Initialise user session.
|
||||
if (SignUserIn(userContext, model.RepositoryContext, securityItemUser, affiliateUser, supervisedOrganisations, associationOrganisation, affiliateOrganisation, model.KeepMeSignedIn, ref errorMessage))
|
||||
if (SignUserIn(userContext, model.RepositoryContext, securityConsoleForUser, accountMgrForUser, securityItemUser, affiliateUser, supervisedOrganisations, associationOrganisation, affiliateOrganisation, model.KeepMeSignedIn, ref errorMessage))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
||||
@@ -0,0 +1,715 @@
|
||||
using Sarand.BusinessMgr.Net.Standard.Base.App;
|
||||
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
|
||||
using Sarand.Net.Standard.Base.Bus;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
|
||||
namespace Sarand.BusinessMgr.Web.Portal.Models.Commodities
|
||||
{
|
||||
//=======================================================================
|
||||
// Commodity model - Configuration.
|
||||
//=======================================================================
|
||||
partial class Model_Commodity
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
// Commodity fields.
|
||||
//-------------------------------------------------------------------
|
||||
|
||||
/// <summary>Prefix for field names.</summary>
|
||||
public const String FieldNamePrefix = "Commodity";
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Legacy Commodity dialog tabs and panels.
|
||||
// - Commodity.
|
||||
// - Tab 1:
|
||||
// - Sales.
|
||||
// - Costs (grid - category cost/labour per unit/job).
|
||||
// - Orders ('Purchasing').
|
||||
// - Specification.
|
||||
// - Asset Category.
|
||||
// - Defaults.
|
||||
// - Machines.
|
||||
// - Notes.
|
||||
// - Tab 2:
|
||||
// - Images.
|
||||
// - Tab 3:
|
||||
// - Processes
|
||||
// - Production
|
||||
// - Special Instructions.
|
||||
// - Item Docs
|
||||
// - Tab 4:
|
||||
// - Stock
|
||||
// - Stock Events
|
||||
// - Sage Stock Transfers
|
||||
// - Sales Budget
|
||||
// - Tab 5:
|
||||
// - Portfolio Items
|
||||
// - Associated Products
|
||||
// - Tab 6:
|
||||
// - Update Log
|
||||
// - Tab 7:
|
||||
// - Requirements x 6.
|
||||
// - Other.
|
||||
// - Stock Projection
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
/// <summary>Item fields.</summary>
|
||||
public enum ItemField
|
||||
{
|
||||
//---------------------------------------------------------------
|
||||
// Commodity.
|
||||
Pos,
|
||||
Id,
|
||||
Code,
|
||||
DrawingNo,
|
||||
DrawingIssue,
|
||||
Type,
|
||||
DescBrief,
|
||||
//---------------------------------------------------------------
|
||||
// Sales.
|
||||
SalesPrice,
|
||||
/// <summary>Formatted sales price - for list only.</summary>
|
||||
SalesPriceFmt,
|
||||
RetailPrice,
|
||||
RetailPricePlanned,
|
||||
TaxCodeId,
|
||||
CarriageCostIndicative,
|
||||
UomIdSale,
|
||||
/// <summary>Unit of sale caption - for list only.</summary>
|
||||
SalesUnit,
|
||||
PackQtySale,
|
||||
MinOrderQty,
|
||||
DescOrder,
|
||||
AssocIdCustomer,
|
||||
Customer,
|
||||
Department,
|
||||
NominalCode,
|
||||
Promotion,
|
||||
//---------------------------------------------------------------
|
||||
// Purchasing.
|
||||
CostPrice,
|
||||
/// <summary>Formatted cost price - for list only.</summary>
|
||||
CostPriceFmt,
|
||||
PlaceOfOrigin,
|
||||
MaterialCost,
|
||||
MaterialCurrency,
|
||||
ExWorksCost,
|
||||
ExWorksCurrency,
|
||||
AssocIdSupplier,
|
||||
Supplier,
|
||||
SupplierRef,
|
||||
NominalCodePurchase,
|
||||
//---------------------------------------------------------------
|
||||
// Specification.
|
||||
Weight,
|
||||
WeightUnit,
|
||||
Length,
|
||||
LengthUnit,
|
||||
Volume,
|
||||
VolumeUnit,
|
||||
Density,
|
||||
DensityUnit,
|
||||
BoxQuantity,
|
||||
BoxUnit,
|
||||
Dimensions,
|
||||
SpecSummary,
|
||||
//---------------------------------------------------------------
|
||||
// Asset.
|
||||
AssetCategory,
|
||||
//---------------------------------------------------------------
|
||||
// Defaults.
|
||||
ICNTariffCode,
|
||||
Category,
|
||||
Category2,
|
||||
Category3,
|
||||
Location,
|
||||
CatalogRef,
|
||||
//---------------------------------------------------------------
|
||||
// Production.
|
||||
MaterialCode,
|
||||
FinishCode,
|
||||
//---------------------------------------------------------------
|
||||
// Special instructions.
|
||||
DescDetail,
|
||||
//---------------------------------------------------------------
|
||||
// Codes.
|
||||
RangeCode,
|
||||
ColourCode,
|
||||
SourceCode,
|
||||
SupplyMethodCode,
|
||||
HandlingCode,
|
||||
DeliveryCode,
|
||||
//---------------------------------------------------------------
|
||||
// Inages.
|
||||
ImagePath,
|
||||
Image,
|
||||
//---------------------------------------------------------------
|
||||
// Production time.
|
||||
TimeProd,
|
||||
//---------------------------------------------------------------
|
||||
// Stock.
|
||||
QtyOnOrder,
|
||||
LastOrderDate,
|
||||
LastOrderQty,
|
||||
ReorderLevel,
|
||||
ReorderQty,
|
||||
CurrentLevel,
|
||||
StockAvailable,
|
||||
StockMonthCurrent,
|
||||
StockMonth,
|
||||
StockDueProvisional,
|
||||
QtyInStock,
|
||||
QtyAllocated,
|
||||
FreeStock,
|
||||
StockTakeDate,
|
||||
StockTakeQty,
|
||||
//---------------------------------------------------------------
|
||||
// Projected sales.
|
||||
ProjectedSales,
|
||||
//---------------------------------------------------------------
|
||||
// Common properties.
|
||||
Notes,
|
||||
Status,
|
||||
CreatedOn,
|
||||
UpdatedOn,
|
||||
Actions,
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Identifier used by form fields to show control specific messages generated by model validation etc.
|
||||
/// <para>- Both page and model should use this method to consistently generate the field name.</para>
|
||||
/// </summary>
|
||||
public static String GetFieldName(ItemField field)
|
||||
{
|
||||
return $"{FieldNamePrefix}{field}";
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
|
||||
// List configuration.
|
||||
public class ListConfigData
|
||||
{
|
||||
// List columns.
|
||||
public class ColumnData
|
||||
{
|
||||
// Column name prefix.
|
||||
public String Prefix { get; } = Model_Commodity.FieldNamePrefix;
|
||||
// Hide column.
|
||||
public HashSet<string> Hide { get; } = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase);
|
||||
// Column labels.
|
||||
public Dictionary<String, String> Label { get; } = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
|
||||
}
|
||||
public ColumnData Column { get; } = new ColumnData();
|
||||
}
|
||||
public ListConfigData ListConfig { get; private set; }
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
/// <summary>
|
||||
/// Populate Commodity list configuration data in this model - only required on initial page construction.
|
||||
/// </summary>
|
||||
public void PopulateListConfig()
|
||||
{
|
||||
ListConfig = new ListConfigData();
|
||||
PopulateListConfig(ListConfig);
|
||||
}
|
||||
/// <summary>
|
||||
/// Populate Commodity list configuration data.
|
||||
/// </summary>
|
||||
public void PopulateListConfig(ListConfigData config)
|
||||
{
|
||||
// View properties.
|
||||
CommodityViewMode viewMode = GetFilterMode();
|
||||
bool modeIsMaintain = viewMode == CommodityViewMode.Maintain;
|
||||
bool modeIsSearch = viewMode == CommodityViewMode.Search;
|
||||
bool modeIsStockControl = viewMode == CommodityViewMode.StockControl;
|
||||
bool modeIsStockTake = viewMode == CommodityViewMode.StockTake;
|
||||
|
||||
Sbm.CommodityType commodityType = GetFilterCommodityType();
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// Commodity list columns.
|
||||
|
||||
// Position.
|
||||
|
||||
// Id
|
||||
if (!SbmSystem.DebugMode)
|
||||
config.Column.Hide.Add($"{ItemField.Id}");
|
||||
|
||||
// Code.
|
||||
|
||||
// Drawing issue.
|
||||
if (SessionConsole.DisplayAttribute(SbmDbDfn.ColumnIdx.Commodity_DrawingIssue))
|
||||
config.Column.Label.Add($"{ItemField.DrawingIssue}", SessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_DrawingIssue, Localiser["label.issue"]));
|
||||
else
|
||||
config.Column.Hide.Add($"{ItemField.DrawingIssue}");
|
||||
|
||||
// Commodity type.
|
||||
if (commodityType <= 0)
|
||||
config.Column.Label.Add($"{ItemField.Type}", SessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_Type, Localiser["label.type"]));
|
||||
else
|
||||
config.Column.Hide.Add($"{ItemField.Type}");
|
||||
|
||||
// Description.
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// Sales.
|
||||
|
||||
// Sales price.
|
||||
if (!UserCanViewCommodityFinancials_Sales())
|
||||
config.Column.Hide.Add($"{ItemField.SalesPrice}");
|
||||
|
||||
// Pack qty.
|
||||
if (modeIsStockControl || SessionData_Portal.GetOwnerOption_ShowColumn(Sbm.OrgOption_ShowColumn.Commodity_PackQtySale))
|
||||
config.Column.Label.Add($"{ItemField.PackQtySale}", Localiser["label.pack.quantity"]);
|
||||
else
|
||||
config.Column.Hide.Add($"{ItemField.PackQtySale}");
|
||||
|
||||
// Customer.
|
||||
if (modeIsStockControl || !SessionConsole.AllowOption(Sbm.ConfigOption.CommodityExclusiveToCustomer))
|
||||
config.Column.Hide.Add($"{ItemField.Customer}");
|
||||
|
||||
// Promotion.
|
||||
if (!SessionConsole.AllowOption(Sbm.ConfigOption.CommodityPromotion) || !CodeTypeConsole.CodeTypeHasCodes(Internals.GetCodeTypeCode(Sbm.ApplCodeType.CommodityPromotion)) || !CommodityMgr.ColumnExists(SbmDbDfn.ColumnIdx.Commodity_PromotionCode))
|
||||
config.Column.Hide.Add($"{ItemField.Promotion}");
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// Purchasing.
|
||||
|
||||
// Cost price.
|
||||
if (!UserCanViewCommodityFinancials_Supply())
|
||||
config.Column.Hide.Add($"{ItemField.CostPrice}");
|
||||
|
||||
// Supplier.
|
||||
if (!modeIsStockControl)
|
||||
config.Column.Hide.Add($"{ItemField.Supplier}");
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// Specification.
|
||||
|
||||
// Weight.
|
||||
if (modeIsStockControl || SessionData_Portal.GetOwnerOption_ShowColumn(Sbm.OrgOption_ShowColumn.Commodity_Weight))
|
||||
config.Column.Label.Add($"{ItemField.Weight}", Localiser["label.weight"]);
|
||||
else
|
||||
config.Column.Hide.Add($"{ItemField.Weight}");
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// Defaults.
|
||||
|
||||
// Catalog Reference.
|
||||
if (modeIsStockControl || SessionData_Portal.GetOwnerOption_ShowColumn(Sbm.OrgOption_ShowColumn.Commodity_CatalogRef))
|
||||
config.Column.Label.Add($"{ItemField.CatalogRef}", SessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_CatalogRef, Localiser["label.catalog.ref"]));
|
||||
else
|
||||
config.Column.Hide.Add($"{ItemField.CatalogRef}");
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// Stock.
|
||||
|
||||
// Stock - allocated.
|
||||
if ((modeIsStockControl || SessionData_Portal.GetOwnerOption_ShowColumn(Sbm.OrgOption_ShowColumn.Commodity_StockAllocated)) && SessionConsole.DisplayAttribute(SbmDbDfn.ColumnIdx.Commodity_QtyAllocated))
|
||||
config.Column.Label.Add($"{ItemField.QtyAllocated}", SessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_QtyAllocated, Localiser["label.allocated"]));
|
||||
else
|
||||
config.Column.Hide.Add($"{ItemField.QtyAllocated}");
|
||||
|
||||
// Stock - available.
|
||||
if (!modeIsStockControl && SessionData_Portal.GetOwnerOption_ShowColumn(Sbm.OrgOption_ShowColumn.Commodity_StockAvailable))
|
||||
config.Column.Label.Add($"{ItemField.StockAvailable}", Localiser["label.available"]);
|
||||
else
|
||||
config.Column.Hide.Add($"{ItemField.StockAvailable}");
|
||||
|
||||
// Current Level.
|
||||
if (modeIsStockControl || SessionData_Portal.GetOwnerOption_ShowColumn(Sbm.OrgOption_ShowColumn.Commodity_StockLevelSales))
|
||||
config.Column.Label.Add($"{ItemField.CurrentLevel}", Localiser["label.current.level"]);
|
||||
else
|
||||
config.Column.Hide.Add($"{ItemField.CurrentLevel}");
|
||||
|
||||
// Stock - current month.
|
||||
if (!modeIsStockControl)
|
||||
config.Column.Hide.Add($"{ItemField.StockMonthCurrent}");
|
||||
|
||||
// Stock - by month.
|
||||
if (!modeIsStockControl)
|
||||
config.Column.Hide.Add($"{ItemField.StockMonth}");
|
||||
|
||||
// Stock - due provisional.
|
||||
if (!modeIsStockControl)
|
||||
config.Column.Hide.Add($"{ItemField.StockDueProvisional}");
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// Common.
|
||||
|
||||
// Status.
|
||||
if (modeIsSearch)
|
||||
config.Column.Hide.Add($"{ItemField.Status}");
|
||||
|
||||
// Actions.
|
||||
if (!modeIsMaintain)
|
||||
config.Column.Hide.Add($"{ItemField.Actions}");
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Item configuration.
|
||||
//-------------------------------------------------------------------
|
||||
|
||||
// Contact item configuration.
|
||||
public class ItemConfigData
|
||||
{
|
||||
// Item type.
|
||||
public bool? IsOrganisation { get; set; }
|
||||
public bool? IsIndividual { get; set; }
|
||||
public bool? IsGroup { get; set; }
|
||||
// Item fields.
|
||||
public class FieldData
|
||||
{
|
||||
// Field name prefix.
|
||||
public String Prefix { get; } = Model_Commodity.FieldNamePrefix;
|
||||
// Hide field.
|
||||
public HashSet<string> Hide { get; } = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase);
|
||||
// Read-only field.
|
||||
public HashSet<string> Readonly { get; } = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase);
|
||||
// Field labels.
|
||||
public Dictionary<String, String> Label { get; } = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
|
||||
}
|
||||
public FieldData Field { get; } = new FieldData();
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
/// <summary>
|
||||
/// Populate item configuration for existing association.
|
||||
/// </summary>
|
||||
public void PopulateItemConfig(ItemConfigData config, SbmCommodity commodity)
|
||||
{
|
||||
PopulateItemConfig(config, commodity.GetItemId(), commodity.CommodityType);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Populate item configuration for new or existing association.
|
||||
/// </summary>
|
||||
public void PopulateItemConfig(ItemConfigData config, ItemId commodityItemId, Sbm.CommodityType commodityType)
|
||||
{
|
||||
// Item type.
|
||||
bool isProduct = commodityType != Sbm.CommodityType.Service;
|
||||
bool isService = commodityType == Sbm.CommodityType.Service;
|
||||
|
||||
bool importedFromAccounts = Internals.AccountsDfn.ItemIsImportedFromAccounts(commodityItemId);
|
||||
bool managedByAccounts = Internals.AccountsDfn.IsItemTypeManagedByAccounts(Sbm.ItemType.Commodity);
|
||||
bool showNotes = true;
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// Commodity.
|
||||
|
||||
// Id.
|
||||
if (SbmSystem.DebugMode)
|
||||
config.Field.Readonly.Add($"{ItemField.Id}");
|
||||
else
|
||||
config.Field.Hide.Add($"{ItemField.Id}");
|
||||
|
||||
// Code.
|
||||
// Read-only if commodity being superceded.
|
||||
if (managedByAccounts)
|
||||
config.Field.Readonly.Add($"{ItemField.Code}");
|
||||
|
||||
// Commodity type.
|
||||
if (managedByAccounts)
|
||||
config.Field.Readonly.Add($"{ItemField.Type}");
|
||||
|
||||
// Description.
|
||||
if (managedByAccounts)
|
||||
config.Field.Readonly.Add($"{ItemField.DescBrief}");
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// Sales.
|
||||
|
||||
// Sales price.
|
||||
if (!UserCanViewCommodityFinancials_Sales())
|
||||
config.Field.Hide.Add($"{ItemField.SalesPrice}");
|
||||
else if (managedByAccounts || !UserCanUpdateFinancials())
|
||||
config.Field.Readonly.Add($"{ItemField.SalesPrice}");
|
||||
|
||||
// Retail price.
|
||||
if (UserCanViewCommodityFinancials_Sales() && SessionConsole.DisplayAttribute(SbmDbDfn.ColumnIdx.Commodity_RetailPrice))
|
||||
{
|
||||
config.Field.Label.Add($"{ItemField.RetailPrice}", SessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_RetailPrice, Localiser["label.retail.price"]));
|
||||
if (!UserCanUpdateFinancials())
|
||||
config.Field.Readonly.Add($"{ItemField.RetailPrice}");
|
||||
}
|
||||
else config.Field.Hide.Add($"{ItemField.RetailPrice}");
|
||||
|
||||
// Retail price - planned.
|
||||
if (UserCanViewCommodityFinancials_Sales() && SessionConsole.DisplayAttribute(SbmDbDfn.ColumnIdx.Commodity_RetailPricePlanned))
|
||||
{
|
||||
config.Field.Label.Add($"{ItemField.RetailPricePlanned}", SessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_RetailPricePlanned, Localiser["label.retail.price.planned"]));
|
||||
if (!UserCanUpdateFinancials())
|
||||
config.Field.Readonly.Add($"{ItemField.RetailPricePlanned}");
|
||||
}
|
||||
else config.Field.Hide.Add($"{ItemField.RetailPricePlanned}");
|
||||
|
||||
// Tax code
|
||||
if (managedByAccounts || !UserCanUpdateFinancials())
|
||||
config.Field.Readonly.Add($"{ItemField.TaxCodeId}");
|
||||
|
||||
// Indicative carriage cost.
|
||||
if (UserCanViewCommodityFinancials_Sales() && SessionConsole.DisplayAttribute(SbmDbDfn.ColumnIdx.Commodity_CarriageCostIndicative) || !CommodityMgr.ColumnExists(SbmDbDfn.ColumnIdx.Commodity_CarriageCostIndicative))
|
||||
{
|
||||
config.Field.Label.Add($"{ItemField.CarriageCostIndicative}", SessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_CarriageCostIndicative, Localiser["label.carriage.cost.indicative"]));
|
||||
if (!UserCanUpdateFinancials())
|
||||
config.Field.Readonly.Add($"{ItemField.CarriageCostIndicative}");
|
||||
}
|
||||
else config.Field.Hide.Add($"{ItemField.CarriageCostIndicative}");
|
||||
|
||||
// Sales Unit.
|
||||
if (managedByAccounts || !UserCanUpdateFinancials())
|
||||
config.Field.Readonly.Add($"{ItemField.UomIdSale}");
|
||||
|
||||
// Sales Pack quantity.
|
||||
|
||||
// Min order quantity.
|
||||
|
||||
// Description - order.
|
||||
if (managedByAccounts)
|
||||
config.Field.Readonly.Add($"{ItemField.DescOrder}");
|
||||
|
||||
// Customer.
|
||||
if (!SessionConsole.AllowOption(Sbm.ConfigOption.CommodityExclusiveToCustomer))
|
||||
config.Field.Hide.Add($"{ItemField.Customer}");
|
||||
else if (managedByAccounts)
|
||||
config.Field.Readonly.Add($"{ItemField.Customer}");
|
||||
|
||||
// Department.
|
||||
if (managedByAccounts)
|
||||
config.Field.Readonly.Add($"{ItemField.Department}");
|
||||
|
||||
// Nominal code.
|
||||
if (!managedByAccounts)
|
||||
config.Field.Hide.Add($"{ItemField.NominalCode}");
|
||||
|
||||
// Promotion.
|
||||
if (!SessionConsole.AllowOption(Sbm.ConfigOption.CommodityPromotion) || !CodeTypeConsole.CodeTypeHasCodes(Internals.GetCodeTypeCode(Sbm.ApplCodeType.CommodityPromotion)) || !CommodityMgr.ColumnExists(SbmDbDfn.ColumnIdx.Commodity_PromotionCode))
|
||||
config.Field.Hide.Add($"{ItemField.Promotion}");
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// Purchasing.
|
||||
|
||||
// Cost price.
|
||||
if (UserCanViewCommodityFinancials_Supply())
|
||||
{
|
||||
config.Field.Label.Add($"{ItemField.CostPrice}", SessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_CostPrice, Localiser["label.cost.price"]));
|
||||
if (!UserCanUpdateFinancials())
|
||||
config.Field.Readonly.Add($"{ItemField.CostPrice}");
|
||||
}
|
||||
else config.Field.Hide.Add($"{ItemField.CostPrice}");
|
||||
|
||||
// Place of origin.
|
||||
config.Field.Label.Add($"{ItemField.PlaceOfOrigin}", SessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_PlaceOfOrigin, Localiser["label.place.of.origin"]));
|
||||
|
||||
// Material.
|
||||
if (UserCanViewCommodityFinancials_Supply())
|
||||
{
|
||||
config.Field.Label.Add($"{ItemField.MaterialCost}", SessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_MaterialCost, Localiser["label.material.cost"]));
|
||||
config.Field.Label.Add($"{ItemField.MaterialCurrency}", SessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_CurrencyIdMaterial, Localiser["label.material.currency"]));
|
||||
if (!UserCanUpdateFinancials())
|
||||
{
|
||||
config.Field.Readonly.Add($"{ItemField.MaterialCost}");
|
||||
config.Field.Readonly.Add($"{ItemField.MaterialCurrency}");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
config.Field.Hide.Add($"{ItemField.MaterialCost}");
|
||||
config.Field.Hide.Add($"{ItemField.MaterialCurrency}");
|
||||
}
|
||||
|
||||
// Ex-works cost.
|
||||
if (UserCanViewCommodityFinancials_Supply())
|
||||
{
|
||||
config.Field.Label.Add($"{ItemField.ExWorksCost}", SessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_ExWorksCost, Localiser["label.ex.works.cost"]));
|
||||
config.Field.Label.Add($"{ItemField.ExWorksCurrency}", SessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_CurrencyIdExWorks, Localiser["label.ex.works.currency"]));
|
||||
if (!UserCanUpdateFinancials())
|
||||
{
|
||||
config.Field.Readonly.Add($"{ItemField.ExWorksCost}");
|
||||
config.Field.Readonly.Add($"{ItemField.ExWorksCurrency}");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
config.Field.Hide.Add($"{ItemField.ExWorksCost}");
|
||||
config.Field.Hide.Add($"{ItemField.ExWorksCurrency}");
|
||||
}
|
||||
|
||||
// Nominal code - purchase.
|
||||
if (!managedByAccounts)
|
||||
config.Field.Hide.Add($"{ItemField.NominalCodePurchase}");
|
||||
|
||||
// Supplier.
|
||||
if (!managedByAccounts)
|
||||
config.Field.Hide.Add($"{ItemField.Supplier}");
|
||||
|
||||
// Supplier reference.
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// Specification.
|
||||
|
||||
// Weight.
|
||||
if (isProduct && SessionConsole.DisplayAttribute(SbmDbDfn.ColumnIdx.Commodity_Weight))
|
||||
{
|
||||
config.Field.Label.Add($"{ItemField.Weight}", SessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_Weight, Localiser["label.weight"]));
|
||||
}
|
||||
else
|
||||
{
|
||||
config.Field.Hide.Add($"{ItemField.Weight}");
|
||||
config.Field.Hide.Add($"{ItemField.WeightUnit}");
|
||||
}
|
||||
|
||||
// Lenghth.
|
||||
if (isProduct && SessionConsole.DisplayAttribute(SbmDbDfn.ColumnIdx.Commodity_Length))
|
||||
{
|
||||
config.Field.Label.Add($"{ItemField.Length}", SessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_Length, Localiser["label.length"]));
|
||||
}
|
||||
else
|
||||
{
|
||||
config.Field.Hide.Add($"{ItemField.Length}");
|
||||
config.Field.Hide.Add($"{ItemField.LengthUnit}");
|
||||
}
|
||||
|
||||
// Volume.
|
||||
if (isProduct && SessionConsole.DisplayAttribute(SbmDbDfn.ColumnIdx.Commodity_Volume))
|
||||
{
|
||||
config.Field.Label.Add($"{ItemField.Volume}", SessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_Volume, Localiser["label.volume"]));
|
||||
}
|
||||
else
|
||||
{
|
||||
config.Field.Hide.Add($"{ItemField.Volume}");
|
||||
config.Field.Hide.Add($"{ItemField.VolumeUnit}");
|
||||
}
|
||||
|
||||
// Density.
|
||||
if (isProduct && SessionConsole.DisplayAttribute(SbmDbDfn.ColumnIdx.Commodity_Density))
|
||||
{
|
||||
config.Field.Label.Add($"{ItemField.Density}", SessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_Density, Localiser["label.density"]));
|
||||
}
|
||||
else
|
||||
{
|
||||
config.Field.Hide.Add($"{ItemField.Density}");
|
||||
config.Field.Hide.Add($"{ItemField.DensityUnit}");
|
||||
}
|
||||
|
||||
// Box quantity.
|
||||
if (isProduct && SessionConsole.DisplayAttribute(SbmDbDfn.ColumnIdx.Commodity_Dimensions))
|
||||
{
|
||||
config.Field.Label.Add($"{ItemField.BoxQuantity}", SessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_BoxQuantity, Localiser["label.box.quantity"]));
|
||||
}
|
||||
else
|
||||
{
|
||||
config.Field.Hide.Add($"{ItemField.BoxQuantity}");
|
||||
config.Field.Hide.Add($"{ItemField.BoxUnit}");
|
||||
}
|
||||
|
||||
// Dimensions.
|
||||
if (isProduct && SessionConsole.DisplayAttribute(SbmDbDfn.ColumnIdx.Commodity_Dimensions))
|
||||
config.Field.Label.Add($"{ItemField.Dimensions}", SessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_Dimensions, Localiser["label.dimensions"]));
|
||||
else
|
||||
config.Field.Hide.Add($"{ItemField.Dimensions}");
|
||||
|
||||
// Spec summary.
|
||||
if (isProduct && SessionConsole.DisplayAttribute(SbmDbDfn.ColumnIdx.Commodity_SpecSummary))
|
||||
config.Field.Label.Add($"{ItemField.SpecSummary}", SessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_SpecSummary, Localiser["label.specification"]));
|
||||
else
|
||||
config.Field.Hide.Add($"{ItemField.SpecSummary}");
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// Asset.
|
||||
|
||||
// Asset category.
|
||||
if (!SessionConsole.AllowOption(Sbm.ConfigOption.AllowAssets))
|
||||
config.Field.Hide.Add($"{ItemField.AssetCategory}");
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// Defaults.
|
||||
|
||||
// ICN Tariff code.
|
||||
if (managedByAccounts)
|
||||
{
|
||||
config.Field.Label.Add($"{ItemField.ICNTariffCode}", SessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_ICNTariffCode, Localiser["label.icn.tariff.code"]));
|
||||
config.Field.Readonly.Add($"{ItemField.ICNTariffCode}");
|
||||
}
|
||||
else
|
||||
config.Field.Hide.Add($"{ItemField.ICNTariffCode}");
|
||||
|
||||
// Category.
|
||||
if (managedByAccounts)
|
||||
{
|
||||
config.Field.Readonly.Add($"{ItemField.Category}");
|
||||
config.Field.Readonly.Add($"{ItemField.Category2}");
|
||||
config.Field.Readonly.Add($"{ItemField.Category3}");
|
||||
}
|
||||
|
||||
// Location.
|
||||
config.Field.Label.Add($"{ItemField.Location}", SessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_Location, Localiser["label.location"]));
|
||||
if (managedByAccounts)
|
||||
config.Field.Readonly.Add($"{ItemField.Location}");
|
||||
|
||||
// Catalog reference.
|
||||
config.Field.Label.Add($"{ItemField.CatalogRef}", SessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_CatalogRef, Localiser["label.catalog.ref"]));
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// Special Instructions.
|
||||
|
||||
// Description - detail.
|
||||
config.Field.Label.Add($"{ItemField.DescDetail}", SessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_DescDetail, Localiser["label.desc.detail"]));
|
||||
if (managedByAccounts)
|
||||
config.Field.Readonly.Add($"{ItemField.DescDetail}");
|
||||
|
||||
// Image path.
|
||||
if (managedByAccounts)
|
||||
config.Field.Readonly.Add($"{ItemField.ImagePath}");
|
||||
|
||||
// Weight.
|
||||
if (managedByAccounts)
|
||||
config.Field.Readonly.Add($"{ItemField.Weight}");
|
||||
if (managedByAccounts)
|
||||
config.Field.Readonly.Add($"{ItemField.WeightUnit}");
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// Production.
|
||||
|
||||
// Material.
|
||||
config.Field.Label.Add($"{ItemField.MaterialCode}", SessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_MaterialCode, Localiser["label.material"]));
|
||||
|
||||
// Finish.
|
||||
config.Field.Label.Add($"{ItemField.FinishCode}", SessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_FinishCode, Localiser["label.finish"]));
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// Stock.
|
||||
|
||||
// Reorder level - not currently in use.
|
||||
config.Field.Hide.Add($"{ItemField.ReorderLevel}");
|
||||
|
||||
// Reorder quantity - not currently in use.
|
||||
config.Field.Hide.Add($"{ItemField.ReorderQty}");
|
||||
|
||||
// Quantity on order.
|
||||
config.Field.Readonly.Add($"{ItemField.QtyOnOrder}");
|
||||
|
||||
// Last order date - not currently in use. Otherwise always read-only.
|
||||
config.Field.Hide.Add($"{ItemField.LastOrderDate}");
|
||||
|
||||
// Last order quantity - not currently in use. Otherwise always read-only.
|
||||
config.Field.Hide.Add($"{ItemField.LastOrderQty}");
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// Common.
|
||||
|
||||
// Notes.
|
||||
if (!showNotes)
|
||||
config.Field.Hide.Add($"{ItemField.Notes}");
|
||||
|
||||
// Status.
|
||||
// Read-only if commodity being superceded.
|
||||
if (managedByAccounts)
|
||||
config.Field.Readonly.Add($"{ItemField.Status}");
|
||||
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
}
|
||||
}
|
||||
@@ -13,12 +13,26 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using static Sarand.BusinessMgr.Net.Standard.Base.App.Sbm;
|
||||
using static Sarand.BusinessMgr.Web.Portal.Models.Contacts.Model_Contact;
|
||||
|
||||
namespace Sarand.BusinessMgr.Web.Portal.Models.Commodities
|
||||
{
|
||||
//=======================================================================
|
||||
public class Model_Commodity : SbmModel_Portal
|
||||
// Commodity model.
|
||||
//=======================================================================
|
||||
/// <summary>
|
||||
/// Commodity model - Filter, Form, validation and configuration.
|
||||
/// </summary>
|
||||
public partial class Model_Commodity : SbmModel_Portal
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
// Definitions.
|
||||
public enum CommodityViewMode
|
||||
{
|
||||
Search, Maintain, StockControl, StockTake
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Construction.
|
||||
public Model_Commodity(SbmLocaliser localiser) :
|
||||
@@ -30,13 +44,21 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Commodities
|
||||
// Filter properties.
|
||||
public class FilterData
|
||||
{
|
||||
public string Search { get; set; }
|
||||
public string CommodityType { get; set; }
|
||||
public String Mode { get; set; }
|
||||
public String CommodityType { get; set; }
|
||||
public String Search { get; set; }
|
||||
}
|
||||
public FilterData Filter { get; } = new FilterData();
|
||||
public CommodityViewMode GetFilterMode()
|
||||
{
|
||||
return EnumUtil.ParseEnum(Filter.Mode, CommodityViewMode.Search);
|
||||
}
|
||||
public Sbm.CommodityType GetFilterCommodityType()
|
||||
{
|
||||
return (Sbm.CommodityType)Internals.CommodityTypeCodes.GetTypeForCode(Filter.CommodityType);
|
||||
Sbm.CommodityType commodityType = (Sbm.CommodityType)Internals.CommodityTypeCodes.GetTypeForCode(Filter.CommodityType);
|
||||
if (commodityType == 0 && !StringUtil.IsBlank(Filter.CommodityType) && StringUtil.IsNumeric(Filter.CommodityType, true))
|
||||
commodityType = (Sbm.CommodityType)StringUtil.ToInt(Filter.CommodityType);
|
||||
return commodityType;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
|
||||
@@ -13,9 +13,8 @@ using System.Xml.Serialization;
|
||||
namespace Sarand.BusinessMgr.Web.Portal.Models.Contacts
|
||||
{
|
||||
//=======================================================================
|
||||
/// <summary>
|
||||
/// Association model - Configuration.
|
||||
/// </summary>
|
||||
// Association model - Configuration.
|
||||
//=======================================================================
|
||||
partial class Model_Association
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
@@ -143,8 +142,6 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Contacts
|
||||
bool typeIsSupplier = associationType == Sbm.AssociationType.Supplier;
|
||||
bool typeIsMember = associationType == Sbm.AssociationType.Member;
|
||||
|
||||
bool userCanViewFinancials = SessionData_Portal.SecurityProfile_Core.UserCanViewFinancials();
|
||||
|
||||
// Actions.
|
||||
|
||||
if (typeIsCustomer)
|
||||
@@ -180,23 +177,23 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Contacts
|
||||
config.Column.Hide.Add($"{ItemField.Address}");
|
||||
|
||||
// Customer financials.
|
||||
if (!modeIsMaintain || !typeIsCustomer || !userCanViewFinancials || !SessionData_Portal.GetOwnerOption_ShowColumn(Sbm.OrgOption_ShowColumn.Association_Trans_SalesValue_Open))
|
||||
if (!modeIsMaintain || !typeIsCustomer || !UserCanViewFinancials() || !SessionData_Portal.GetOwnerOption_ShowColumn(Sbm.OrgOption_ShowColumn.Association_Trans_SalesValue_Open))
|
||||
config.Column.Hide.Add($"{ItemField.TransSalesValueOpen}");
|
||||
if (!modeIsMaintain || !typeIsCustomer || !SessionData_Portal.GetOwnerOption_ShowColumn(Sbm.OrgOption_ShowColumn.Association_Trans_LastSaleRaised))
|
||||
config.Column.Hide.Add($"{ItemField.TransLastSaleRaised}");
|
||||
if (!modeIsMaintain || !typeIsCustomer || !userCanViewFinancials || !SessionData_Portal.GetOwnerOption_ShowColumn(Sbm.OrgOption_ShowColumn.Association_AnnualSalesTarget))
|
||||
if (!modeIsMaintain || !typeIsCustomer || !UserCanViewFinancials() || !SessionData_Portal.GetOwnerOption_ShowColumn(Sbm.OrgOption_ShowColumn.Association_AnnualSalesTarget))
|
||||
config.Column.Hide.Add($"{ItemField.AnnualSalesTarget}");
|
||||
if (!modeIsMaintain || !typeIsCustomer || !userCanViewFinancials || !SessionData_Portal.GetOwnerOption_ShowColumn(Sbm.OrgOption_ShowColumn.Association_Trans_SalesValue_Cytd))
|
||||
if (!modeIsMaintain || !typeIsCustomer || !UserCanViewFinancials() || !SessionData_Portal.GetOwnerOption_ShowColumn(Sbm.OrgOption_ShowColumn.Association_Trans_SalesValue_Cytd))
|
||||
config.Column.Hide.Add($"{ItemField.TransSalesValueCytd}");
|
||||
if (!modeIsMaintain || !typeIsCustomer || !userCanViewFinancials || !SessionData_Portal.GetOwnerOption_ShowColumn(Sbm.OrgOption_ShowColumn.Association_Trans_SalesValue_Lcy))
|
||||
if (!modeIsMaintain || !typeIsCustomer || !UserCanViewFinancials() || !SessionData_Portal.GetOwnerOption_ShowColumn(Sbm.OrgOption_ShowColumn.Association_Trans_SalesValue_Lcy))
|
||||
config.Column.Hide.Add($"{ItemField.TransSalesValueLcy}");
|
||||
// Customer commodities.
|
||||
if (!modeIsMaintain || !typeIsCustomer || !CommodityMgr.CanManageCommodityCustomers())
|
||||
config.Column.Hide.Add($"{ItemField.CommodityCount}");
|
||||
// Customer pricing.
|
||||
if (!modeIsMaintain || !typeIsCustomer || !userCanViewFinancials || !SessionConsole.AllowOption(Sbm.ConfigOption.CustomerDiscount))
|
||||
if (!modeIsMaintain || !typeIsCustomer || !UserCanViewFinancials() || !SessionConsole.AllowOption(Sbm.ConfigOption.CustomerDiscount))
|
||||
config.Column.Hide.Add($"{ItemField.DiscountRate}");
|
||||
if (!modeIsMaintain || !typeIsCustomer || !userCanViewFinancials || !SessionConsole.AllowOption(Sbm.ConfigOption.CustomerPriceSet) && PriceMgr.PriceDatabaseIsValid)
|
||||
if (!modeIsMaintain || !typeIsCustomer || !UserCanViewFinancials() || !SessionConsole.AllowOption(Sbm.ConfigOption.CustomerPriceSet) && PriceMgr.PriceDatabaseIsValid)
|
||||
config.Column.Hide.Add($"{ItemField.PriceSet}");
|
||||
// Association group.
|
||||
if (!modeIsMaintain || !typeIsCustomer || !SessionData_Portal.GetOwnerOption_ShowColumn(Sbm.OrgOption_ShowColumn.Association_Group))
|
||||
@@ -302,8 +299,6 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Contacts
|
||||
/// </summary>
|
||||
public void PopulateItemConfig(ItemConfigData config, ItemId associationItemId, SysId ownerId, Sbm.AssociationType associationType)
|
||||
{
|
||||
bool canViewFinancials = SessionData_Portal.SecurityProfile_Core.UserCanViewFinancials();
|
||||
bool canUpdateFinancials = SessionData_Portal.SecurityProfile_Core.UserCanUpdateFinancials();
|
||||
bool ownerIsInternal = SessionData_Portal.Organisation.AffiliateId.Equals(ownerId);
|
||||
bool isCustomer = SbmAssociation.IsCustomer(associationType);
|
||||
bool isSupplier = SbmAssociation.IsSupplier(associationType);
|
||||
@@ -384,9 +379,9 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Contacts
|
||||
// Financials.
|
||||
|
||||
// Annual Sales Target.
|
||||
if (!canViewFinancials)
|
||||
if (!UserCanViewFinancials())
|
||||
config.Field.Hide.Add($"{ItemField.AnnualSalesTarget}");
|
||||
else if (!canUpdateFinancials)
|
||||
else if (!UserCanUpdateFinancials())
|
||||
config.Field.Readonly.Add($"{ItemField.AnnualSalesTarget}");
|
||||
|
||||
// Default Nominal Code.
|
||||
@@ -396,37 +391,37 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Contacts
|
||||
config.Field.Readonly.Add($"{ItemField.DefaultNominalCode}");
|
||||
|
||||
// Credit limit.
|
||||
if (!canViewFinancials || !managedByAccounts)
|
||||
if (!UserCanViewFinancials() || !managedByAccounts)
|
||||
config.Field.Hide.Add($"{ItemField.CreditLimit}");
|
||||
else if (managedByAccounts || !canUpdateFinancials)
|
||||
else if (managedByAccounts || !UserCanUpdateFinancials())
|
||||
config.Field.Readonly.Add($"{ItemField.CreditLimit}");
|
||||
|
||||
// Account balance.
|
||||
if (!canViewFinancials || !managedByAccounts)
|
||||
if (!UserCanViewFinancials() || !managedByAccounts)
|
||||
config.Field.Hide.Add($"{ItemField.AccountBalance}");
|
||||
else if (managedByAccounts || !canUpdateFinancials)
|
||||
else if (managedByAccounts || !UserCanUpdateFinancials())
|
||||
config.Field.Readonly.Add($"{ItemField.AccountBalance}");
|
||||
|
||||
// Discount.
|
||||
if (!canViewFinancials || (!managedByAccounts && !SessionConsole.AllowOption(isSupplier ? Sbm.ConfigOption.SupplierDiscount : Sbm.ConfigOption.CustomerDiscount)))
|
||||
if (!UserCanViewFinancials() || (!managedByAccounts && !SessionConsole.AllowOption(isSupplier ? Sbm.ConfigOption.SupplierDiscount : Sbm.ConfigOption.CustomerDiscount)))
|
||||
{
|
||||
config.Field.Hide.Add($"{ItemField.DiscountType}");
|
||||
config.Field.Hide.Add($"{ItemField.DiscountRate}");
|
||||
}
|
||||
else if (!localPricing || !canUpdateFinancials)
|
||||
else if (!localPricing || !UserCanUpdateFinancials())
|
||||
{
|
||||
config.Field.Readonly.Add($"{ItemField.DiscountType}");
|
||||
config.Field.Readonly.Add($"{ItemField.DiscountRate}");
|
||||
}
|
||||
|
||||
// Price set.
|
||||
if (!canViewFinancials || (!managedByAccounts && !SessionConsole.AllowOption(isSupplier ? Sbm.ConfigOption.SupplierPriceSet : Sbm.ConfigOption.CustomerPriceSet)) || !PriceMgr.PriceDatabaseIsValid)
|
||||
if (!UserCanViewFinancials() || (!managedByAccounts && !SessionConsole.AllowOption(isSupplier ? Sbm.ConfigOption.SupplierPriceSet : Sbm.ConfigOption.CustomerPriceSet)) || !PriceMgr.PriceDatabaseIsValid)
|
||||
config.Field.Hide.Add($"{ItemField.PriceSet}");
|
||||
else if (!localPricing || !canUpdateFinancials)
|
||||
else if (!localPricing || !UserCanUpdateFinancials())
|
||||
config.Field.Readonly.Add($"{ItemField.PriceSet}");
|
||||
|
||||
// Tax code.
|
||||
if (managedByAccounts || !canUpdateFinancials)
|
||||
if (managedByAccounts || !UserCanUpdateFinancials())
|
||||
config.Field.Readonly.Add($"{ItemField.TaxCode}");
|
||||
|
||||
// Default sales commodity.
|
||||
|
||||
@@ -17,9 +17,11 @@ using System.Threading.Tasks;
|
||||
|
||||
namespace Sarand.BusinessMgr.Web.Portal.Models.Contacts
|
||||
{
|
||||
//=======================================================================
|
||||
// Association model.
|
||||
//=======================================================================
|
||||
/// <summary>
|
||||
/// Association model - Filter and Form.
|
||||
/// Association model - Filter, Form, validation and configuration.
|
||||
/// </summary>
|
||||
public partial class Model_Association : SbmModel_Portal
|
||||
{
|
||||
@@ -53,7 +55,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Contacts
|
||||
public FilterData Filter { get; } = new FilterData();
|
||||
public AssociationViewMode GetFilterMode()
|
||||
{
|
||||
return EnumUtil.ParseEnum(Filter.Mode, AssociationViewMode.Maintain);
|
||||
return EnumUtil.ParseEnum(Filter.Mode, AssociationViewMode.Search);
|
||||
}
|
||||
public Sbm.AssociationType GetFilterAssociationType()
|
||||
{
|
||||
|
||||
@@ -8,9 +8,8 @@ using System.Collections.Generic;
|
||||
namespace Sarand.BusinessMgr.Web.Portal.Models.Contacts
|
||||
{
|
||||
//=======================================================================
|
||||
/// <summary>
|
||||
/// Contact model - Configuration.
|
||||
/// </summary>
|
||||
// Contact model - Configuration.
|
||||
//=======================================================================
|
||||
partial class Model_Contact
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
@@ -124,29 +123,29 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Contacts
|
||||
|
||||
// Contact type.
|
||||
if (affiliateType <= 0)
|
||||
config.Column.Label.Add($"{ItemField.Type}", Localiser["label.type"]);
|
||||
config.Column.Label.Add($"{ItemField.Type}", SessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Affiliate_Type, Localiser["label.type"]));
|
||||
else
|
||||
config.Column.Hide.Add($"{ItemField.Type}");
|
||||
|
||||
// Contact name.
|
||||
config.Column.Label.Add($"{ItemField.Name}", Localiser["label.name"]);
|
||||
config.Column.Label.Add($"{ItemField.Name}", SessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Affiliate_Name, Localiser["label.name"]));
|
||||
|
||||
// Nature.
|
||||
bool showNature = false;
|
||||
if (!contactGroupsOnly && showNature)
|
||||
config.Column.Label.Add($"{ItemField.Nature}", Localiser["label.nature"]);
|
||||
config.Column.Label.Add($"{ItemField.Nature}", SessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Affiliate_Nature, Localiser["label.nature"]));
|
||||
else
|
||||
config.Column.Hide.Add($"{ItemField.Nature}");
|
||||
|
||||
// Email.
|
||||
if (!contactGroupsOnly && (affiliateType == Sbm.AffiliateType.Individual || !StringUtil.IsBlank(Filter.Email)))
|
||||
config.Column.Label.Add($"{ItemField.Email}", Localiser["label.email"]);
|
||||
config.Column.Label.Add($"{ItemField.Email}", SessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Affiliate_Email, Localiser["label.email"]));
|
||||
else
|
||||
config.Column.Hide.Add($"{ItemField.Email}");
|
||||
|
||||
// Contact.
|
||||
if (!contactGroupsOnly && (affiliateType != Sbm.AffiliateType.Individual))
|
||||
config.Column.Label.Add($"{ItemField.Contact}", Localiser["label.contact"]);
|
||||
config.Column.Label.Add($"{ItemField.Contact}", SessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Affiliate_Contact, Localiser["label.contact"]));
|
||||
else
|
||||
config.Column.Hide.Add($"{ItemField.Contact}");
|
||||
|
||||
|
||||
@@ -17,9 +17,11 @@ using System.Threading.Tasks;
|
||||
|
||||
namespace Sarand.BusinessMgr.Web.Portal.Models.Contacts
|
||||
{
|
||||
//=======================================================================
|
||||
// Contact model.
|
||||
//=======================================================================
|
||||
/// <summary>
|
||||
/// Contact (Affiliate) model - Configuration.
|
||||
/// Contact (Affiliate) model - Filter, Form, validation and configuration.
|
||||
/// </summary>
|
||||
public partial class Model_Contact : SbmModel_Portal
|
||||
{
|
||||
@@ -42,14 +44,14 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Contacts
|
||||
public class FilterData
|
||||
{
|
||||
public String Mode { get; set; }
|
||||
public string ContactType { get; set; }
|
||||
public string Search { get; set; }
|
||||
public string Email { get; set; }
|
||||
public String ContactType { get; set; }
|
||||
public String Search { get; set; }
|
||||
public String Email { get; set; }
|
||||
}
|
||||
public FilterData Filter { get; } = new FilterData();
|
||||
public ContactViewMode GetFilterMode()
|
||||
{
|
||||
return EnumUtil.ParseEnum(Filter.Mode, ContactViewMode.Maintain);
|
||||
return EnumUtil.ParseEnum(Filter.Mode, ContactViewMode.Search);
|
||||
}
|
||||
public Sbm.AffiliateType GetFilterContactType()
|
||||
{
|
||||
@@ -63,31 +65,31 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Contacts
|
||||
// Contact properties.
|
||||
public class ContactData
|
||||
{
|
||||
public string Id { get; set; }
|
||||
public string Exists { get; set; }
|
||||
public string Type { get; set; }
|
||||
public string IsIndividual { get; set; }
|
||||
public string IsGroup { get; set; }
|
||||
public String Id { get; set; }
|
||||
public String Exists { get; set; }
|
||||
public String Type { get; set; }
|
||||
public String IsIndividual { get; set; }
|
||||
public String IsGroup { get; set; }
|
||||
// Organisation.
|
||||
public string Name { get; set; }
|
||||
public string Abbreviation { get; set; }
|
||||
public string Nature { get; set; }
|
||||
public string Contact { get; set; }
|
||||
public string PhoneMain { get; set; }
|
||||
public string PhoneAlt { get; set; }
|
||||
public string PhoneDirect { get; set; }
|
||||
public string PhoneFax { get; set; }
|
||||
public string Email { get; set; }
|
||||
public string Website { get; set; }
|
||||
public string CompanyNo { get; set; }
|
||||
public string VatReg { get; set; }
|
||||
public String Name { get; set; }
|
||||
public String Abbreviation { get; set; }
|
||||
public String Nature { get; set; }
|
||||
public String Contact { get; set; }
|
||||
public String PhoneMain { get; set; }
|
||||
public String PhoneAlt { get; set; }
|
||||
public String PhoneDirect { get; set; }
|
||||
public String PhoneFax { get; set; }
|
||||
public String Email { get; set; }
|
||||
public String Website { get; set; }
|
||||
public String CompanyNo { get; set; }
|
||||
public String VatReg { get; set; }
|
||||
// Individual.
|
||||
public string Title { get; set; }
|
||||
public string Salutation { get; set; }
|
||||
public string FirstName { get; set; }
|
||||
public string Initials { get; set; }
|
||||
public string LastName { get; set; }
|
||||
public string PhoneMobile { get; set; }
|
||||
public String Title { get; set; }
|
||||
public String Salutation { get; set; }
|
||||
public String FirstName { get; set; }
|
||||
public String Initials { get; set; }
|
||||
public String LastName { get; set; }
|
||||
public String PhoneMobile { get; set; }
|
||||
// Flags.
|
||||
// NB Have to use bool with checkbox and then cannot tell whether
|
||||
// false is unchecked or not submitted (ie. excluded from form, disabled etc).
|
||||
@@ -95,12 +97,11 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Contacts
|
||||
private bool? prospectValue { get; set; }
|
||||
public bool Prospect { get { return prospectValue ?? false; } set { prospectValue = value; } }
|
||||
// Common properties.
|
||||
public string Notes { get; set; }
|
||||
public string StatusCode { get; set; }
|
||||
public String Notes { get; set; }
|
||||
public String StatusCode { get; set; }
|
||||
}
|
||||
public SysId GetAffiliateId() { return StringUtil.ToSysId(Contact.Id); }
|
||||
public SaStatus GetAffiliateStatus() { return SacsSystem.GetStatusForCode(Contact.StatusCode); }
|
||||
public ContactData Contact { get; } = new ContactData();
|
||||
public SysId GetAffiliateId() { return StringUtil.ToSysId(Contact.Id); }
|
||||
public Sbm.AffiliateType GetAffiliateType()
|
||||
{
|
||||
if (StringUtil.ToBool(Contact.IsIndividual))
|
||||
@@ -111,6 +112,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Contacts
|
||||
return (Sbm.AffiliateType)Internals.AffiliateTypeCodes.GetTypeForCode(Contact.Type);
|
||||
return Sbm.AffiliateType.Unknown;
|
||||
}
|
||||
public SaStatus GetAffiliateStatus() { return SacsSystem.GetStatusForCode(Contact.StatusCode); }
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Validation.
|
||||
|
||||
@@ -10,6 +10,7 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using static Sarand.BusinessMgr.Net.Standard.Base.App.Sbm;
|
||||
|
||||
namespace Sarand.BusinessMgr.Web.Portal.Models
|
||||
{
|
||||
@@ -29,6 +30,16 @@ namespace Sarand.BusinessMgr.Web.Portal.Models
|
||||
public override ISbmUserContext_Core UserContext_Core { get { return SessionData_Portal; } }
|
||||
public String OrganisationName { get { return SessionData_Portal?.Organisation?.DisplayName ?? ""; } }
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Security profile.
|
||||
public bool UserCanViewFinancials() { return SessionData_Portal.SecurityProfile_Core.UserCanViewFinancials(); }
|
||||
public bool UserCanViewCommodityFinancials_Supply() { return SessionData_Portal.SecurityProfile_Core.UserCanViewFinancials(FinancialType.CommoditySupply); }
|
||||
public bool UserCanViewCommodityFinancials_Sales() { return SessionData_Portal.SecurityProfile_Core.UserCanViewFinancials(FinancialType.CommoditySales); }
|
||||
public bool UserCanUpdateFinancials() { return SessionData_Portal.SecurityProfile_Core.UserCanUpdateFinancials(); }
|
||||
public bool UserCanStockTake() { return SessionData_Portal.SecurityProfile_Core.UserHasSecurityRight(SecurityRight.StockTake); }
|
||||
public bool UserCanCreateItem(Sbm.ItemType itemType) { return SessionData_Portal.SecurityProfile_Core.UserCanCreateItemType(itemType); }
|
||||
public bool UserCanUpdateItem(Sbm.ItemType itemType) { return SessionData_Portal.SecurityProfile_Core.UserCanUpdateItemType(itemType); }
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// View reference data.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user