Commodities

This commit is contained in:
Andy Howard
2024-12-07 18:09:06 +00:00
parent 30d0352f48
commit d015470f58
39 changed files with 1588 additions and 602 deletions
@@ -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);
@@ -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.