3.0.0.4 Portal Commodity Sales properties. Control Index population.

This commit is contained in:
Andy Howard
2025-02-11 21:03:34 +00:00
parent a7bec4e806
commit ef4da874b0
80 changed files with 1294 additions and 383 deletions
@@ -513,8 +513,8 @@
<data name="label.phone" xml:space="preserve">
<value>Phone</value>
</data>
<data name="label.sales.price" xml:space="preserve">
<value>Sales price</value>
<data name="label.sale.price" xml:space="preserve">
<value>Sale price</value>
</data>
<data name="label.cost.price" xml:space="preserve">
<value>Cost price</value>
@@ -744,4 +744,13 @@
<data name="label.strength" xml:space="preserve">
<value>Strength</value>
</data>
<data name="label.unit" xml:space="preserve">
<value>Unit</value>
</data>
<data name="label.price" xml:space="preserve">
<value>Price</value>
</data>
<data name="label.tax" xml:space="preserve">
<value>Tax</value>
</data>
</root>
@@ -33,6 +33,7 @@ using Sarand.Net.Standard.Base.Utils;
using Sarand.Net.Standard.Dbas.Base;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
@@ -217,13 +218,16 @@ namespace Sarand.BusinessMgr.Web.Portal.App
else if (AppConfig.Instance.EqualsCI("PreProd")) instanceType = Sbm.InstanceType.UAT;
// Initialise hard-coded logging path.
if (StringUtil.IsEmpty(LoggingRootFolder))
if (StringUtil.IsBlank(LoggingRootFolder))
{
if (SbmSystem.ComputerName.EqualsCI("WIN-BPCLM1QUOMT"))
LoggingRootFolder = @"D:\Sbmonite\Logs\" + (Development ? "Dev" : "Test");
}
if (DirectoryUtil.DirectoryExists(LoggingRootFolder))
SaLogger.LogFolder = LoggingRootFolder;
{
SaLogger.LogFolder = Path.Combine(LoggingRootFolder, Sbm.Config.Logging.Folder.WebPortal);
FileUtil.ValidateDirectory(SaLogger.LogFolder, true);
}
LogApplicationStart($"{SysUtil.Fn}");
// Control database connection.
@@ -9,6 +9,7 @@ using Sarand.BusinessMgr.Web.Portal.Components;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.ReferenceData;
using Sarand.Net.Standard.Base.Security;
using Sarand.Net.Standard.Base.Utils;
using System;
@@ -109,7 +110,14 @@ namespace Sarand.BusinessMgr.Web.Portal.Consoles
SbmRepositoryPopulationData.CommodityData commodity02 = new SbmRepositoryPopulationData.StockCommodityData() { Code = "MONOPOLY-DEL", Caption = "Monopoly Deluxe", SalePrice = 32.45m };
SbmRepositoryPopulationData.CommodityData commodity03 = new SbmRepositoryPopulationData.StockCommodityData() { Code = "CLUEDO-STD", Caption = "Cluedo", SalePrice = 18.25m };
SbmRepositoryPopulationData.CommodityData commodity04 = new SbmRepositoryPopulationData.StockCommodityData() { Code = "RISK-STD", Caption = "Risk", SalePrice = 21.50m };
data.Commodities.AddRange(new List<SbmRepositoryPopulationData.CommodityData>() { commodity01, commodity02, commodity03, commodity04 });
SbmRepositoryPopulationData.CommodityData commodity90 = new SbmRepositoryPopulationData.ServiceCommodityData() { Code = "TUITION-EXP", Caption = "Expert Tuition", SalePrice = 45.00m };
SbmRepositoryPopulationData.CommodityData commodity91 = new SbmRepositoryPopulationData.ServiceCommodityData() { Code = "TUITION-STD", Caption = "Standard Tuition", SalePrice = 38.75m };
SbmRepositoryPopulationData.CommodityData commodity92 = new SbmRepositoryPopulationData.ServiceCommodityData() { Code = "TUITION-BAS", Caption = "Basic Tuition", SalePrice = 32.50m };
data.Commodities.AddRange(new List<SbmRepositoryPopulationData.CommodityData>()
{
commodity01, commodity02, commodity03, commodity04,
commodity90, commodity91, commodity92
});
return data;
}
@@ -223,12 +231,14 @@ namespace Sarand.BusinessMgr.Web.Portal.Consoles
{
if (HasErrorState()) return false;
SysId affilliateIdOwner = data.AffiliateIdOrganisation;
Dictionary<SaUomType, SaUnitMeasure> uomTypes = Internals.GetUnitsOfMeasure().ToDictionary(item => item.UnitType, item => item);
foreach (var commodityData in data.Commodities)
{
SbmCommodity commodity = Internals.CommodityMgr.CreateCommodity(commodityData.Type, commodityData.Code);
commodity.DescBrief = commodityData.Caption;
commodity.SalesPrice = commodityData.SalePrice;
commodity.UomIdSale = uomTypes.GetValueOrDefault(commodityData.SaleUnitType)?.Id;
if (!Internals.CommodityMgr.InsertCommodity(commodity, DbUpdateInfo))
{
string msg = "Repository population failed (Commodity).";
@@ -8,10 +8,12 @@ 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.ReferenceData;
using Sarand.Net.Standard.Base.Security;
using Sarand.Net.Standard.Base.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Sarand.BusinessMgr.Web.Portal.Controllers.Commodities
{
@@ -30,21 +32,22 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Commodities
// Field values.
public AjaxResponse_Data.FieldValuesData Field { get; } = new AjaxResponse_Data.FieldValuesData();
}
private enum CommodityDataGroup
public enum CommodityDataGroup
{
Sales, Purchasing, Specification, Production
Unknown, Sales, Purchasing, Specification, Production
}
private class CommodityItemData : CommodityListData
{
// Affiliate properties with specific handling.
public String TypeCode { get; set; }
public String TypeDesc { get; set; }
public String SalesUnitType { get; set; }
}
private void PopulateCommodityResponseListData(SbmCommodity commodity, CommodityListData data)
{
data.Id = SysId.ToString(commodity.Id);
}
private void PopulateCommodityResponseItemData(SbmCommodity commodity, CommodityItemData data, HashSet<CommodityDataGroup> dataGroups = null)
private void PopulateCommodityResponseItemData(SbmCommodity commodity, CommodityItemData data, HashSet<CommodityDataGroup> dataGroups)
{
PopulateCommodityResponseListData(commodity, data as CommodityListData);
// Prominent properties for selecting and editing.
@@ -58,26 +61,33 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Commodities
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);
// Sales.
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.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)));
data.Field.Value.Add($"{Model_Commodity.ItemField.SalesTaxCode}", Internals.GetTaxCodeById(commodity.TaxCodeId)?.Code);
data.SalesUnitType = SbmSystem.GetSystemCodes(Sbm.SystemCode.UnitMeasureType).GetCodeForType(Internals.GetUnitOfMeasureType(commodity.UomIdSale));
if (commodity.PackQtySale > 0)
data.Field.Value.Add($"{Model_Commodity.ItemField.SalesPackQty}", $"{commodity.PackQtySale}");
data.Field.Value.Add($"{Model_Commodity.ItemField.AssocIdCustomer}", StringUtil.NullOnBlank(SysId.ToString(commodity.AssociationIdCustomer)));
}
// Purchasing.
if (dataGroups != null && dataGroups.Contains(CommodityDataGroup.Purchasing))
{
// Purchasing.
data.Field.Value.Add($"{Model_Commodity.ItemField.CostPrice}", StringUtil.NullOnBlank(StringUtil.FormatNumeric(commodity.CostPrice, SbmInternals.CurrencyDecimalsDefault)));
data.Field.Value.Add($"{Model_Commodity.ItemField.CostPriceFmt}", StringUtil.NullOnBlank(StringUtil.FormatNumeric(commodity.CostPrice, SbmInternals.CurrencyDecimalsDefault, 0, ',')));
data.Field.Value.Add($"{Model_Commodity.ItemField.AssocIdSupplier}", StringUtil.NullOnBlank(SysId.ToString(commodity.AssociationIdSupplier)));
}
// Specification.
if (dataGroups != null && dataGroups.Contains(CommodityDataGroup.Specification))
{
// Specification.
}
// Production.
if (dataGroups != null && dataGroups.Contains(CommodityDataGroup.Production))
{
// Production.
@@ -104,8 +114,14 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Commodities
public Model_Commodity.ListConfigData Config { get; } = new Model_Commodity.ListConfigData();
public Model_Commodity.ItemConfigData ConfigItemNew { get; } = new Model_Commodity.ItemConfigData();
// Reference data.
public List<CodeDesc> CommodityTypes { get; } = new List<CodeDesc>();
public List<CodeDesc> Statuses { get; } = new List<CodeDesc>();
public List<ItemCodeDesc> CommodityTypes { get; } = new List<ItemCodeDesc>();
public List<TaxCode> TaxCodes { get; } = new List<TaxCode>();
public String taxCodeDefault { get; set; }
public List<ItemCodeDesc> UomCats { get; } = new List<ItemCodeDesc>();
public List<ItemCodeDesc> UomTypes { get; } = new List<ItemCodeDesc>();
public String uomTypeDefault { get; set; }
public List<UomData> Uoms { get; set; } = new List<UomData>();
public List<ItemCodeDesc> Statuses { get; } = new List<ItemCodeDesc>();
public String DefaultStatusCode { get; set; }
}
// Ajax request.
@@ -137,11 +153,33 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Commodities
// Reference data - commodity types.
foreach (TypeCodeDesc commodityType in GetCodesOfType(Sbm.SystemCode.CommodityType))
responseData.CommodityTypes.Add(commodityType.Code, commodityType.Desc);
responseData.CommodityTypes.Add(new AjaxResponse_Data.ItemCodeDesc(commodityType.Code, commodityType.Desc));
// Tax codes.
DateTime taxEffectiveOn = DateTime.Today;
responseData.TaxCodes.AddRange(Internals.GetTaxCodesEffectiveOn(taxEffectiveOn).Select(tax => new AjaxResponse_Data.TaxCode() { Id = $"{SysId.ToLong(tax.Id)}", Code = tax.Code, Caption = tax.GetCaption(), Rate = tax.TaxRate }));
responseData.taxCodeDefault = Internals.GetDefaultTaxCode();
// Units of measure.
List<TypeCodeDesc> uomCategories = SbmSystem.GetSystemCodes(Sbm.SystemCode.UnitMeasureCategory);
List<TypeCodeDesc> uomTypes = SbmSystem.GetSystemCodes(Sbm.SystemCode.UnitMeasureType);
responseData.UomCats.AddRange(uomCategories.Select(item => new AjaxResponse_Data.ItemCodeDesc(item.Code, item.Desc)));
responseData.UomTypes.AddRange(uomTypes.Select(item => new AjaxResponse_Data.ItemCodeDesc(item.Code, item.Desc)));
foreach (SaUnitMeasure uom in Internals.GetUnitsOfMeasure())
{
responseData.Uoms.Add(new AjaxResponse_Data.UomData()
{
Id = $"{SysId.ToLong(uom.Id)}",
Category = uomCategories.GetCodeForType(uom.Category),
Type = uomTypes.GetCodeForType(uom.UnitType),
Caption = uom.Multiple,
});
}
responseData.uomTypeDefault = uomTypes.GetCodeForType(Internals.GetDefaultUomType());
// Reference data - statuses.
foreach (SaStatus status in SbmCommodity.ValidStatuses.FindAll(item => item != SaStatus.Deleted))
responseData.Statuses.Add(SacsSystem.GetStatusCode(status), Localiser.GetStatusCaption(status));
responseData.Statuses.Add(new AjaxResponse_Data.ItemCodeDesc(SacsSystem.GetStatusCode(status), Localiser.GetStatusCaption(status)));
responseData.DefaultStatusCode = SacsSystem.GetStatusCode(SbmCommodity.DefaultStatus);
}
@@ -317,7 +355,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Commodities
// Construct response.
model.PopulateItemConfig(responseData.Config, commodity);
PopulateCommodityResponseItemData(commodity, responseData.commodity);
PopulateCommodityResponseItemData(commodity, responseData.commodity, model.GetDataGroups());
responseData.Success = true;
}
return Json(responseData);
@@ -385,6 +423,15 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Commodities
commodity.Code = model.Commodity.Code;
if (model.Commodity.DescBrief != null)
commodity.DescBrief = model.Commodity.DescBrief;
// Sales.
if (model.Commodity.SalesPrice != null)
commodity.SalesPrice = model.GetCommoditySalesPrice();
if (model.Commodity.SalesTaxCode != null)
commodity.TaxCodeId = model.GetCommoditySalesTaxCodeId();
if (model.Commodity.SalesUnitType != null)
commodity.UomIdSale = model.GetCommoditySalesUnitId();
if (model.Commodity.SalesPackQty != null)
commodity.PackQtySale = model.GetCommoditySalesPackQty();
// Common properties.
if (model.Commodity.Notes != null)
commodity.Notes = model.Commodity.Notes;
@@ -414,7 +461,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Commodities
// Construct response.
model.PopulateItemConfig(responseData.Config, commodity);
PopulateCommodityResponseItemData(commodity, responseData.commodity);
PopulateCommodityResponseItemData(commodity, responseData.commodity, model.GetDataGroups());
responseData.Success = true;
}
return Json(responseData);
@@ -71,15 +71,14 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Commodities
SalesPrice,
/// <summary>Formatted sales price - for list only.</summary>
SalesPriceFmt,
SalesTaxCode,
/// <summary>Unit of sale - caption for list & name of form control.</summary>
SalesUnit,
SalesPackQty,
MinOrderQty,
RetailPrice,
RetailPricePlanned,
TaxCodeId,
CarriageCostIndicative,
UomIdSale,
/// <summary>Unit of sale caption - for list only.</summary>
SalesUnit,
PackQtySale,
MinOrderQty,
DescOrder,
AssocIdCustomer,
Customer,
@@ -261,9 +260,9 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Commodities
// Pack qty.
if (modeIsStockControl || SessionConsole.GetOwnerOption_ShowColumn(Sbm.OrgOption_ShowColumn.Commodity_PackQtySale))
config.Column.Label.Add($"{ItemField.PackQtySale}", Localiser["label.pack.quantity"]);
config.Column.Label.Add($"{ItemField.SalesPackQty}", Localiser["label.pack.quantity"]);
else
config.Column.Hide.Add($"{ItemField.PackQtySale}");
config.Column.Hide.Add($"{ItemField.SalesPackQty}");
// Customer.
if (modeIsStockControl || !SessionConsole.AllowOption(Sbm.ConfigOption.CommodityExclusiveToCustomer))
@@ -446,7 +445,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Commodities
// Tax code
if (managedByAccounts || !UserCanUpdateFinancials())
config.Field.Readonly.Add($"{ItemField.TaxCodeId}");
config.Field.Readonly.Add($"{ItemField.SalesTaxCode}");
// Indicative carriage cost.
if (UserCanViewCommodityFinancials_Sales() && SessionConsole.DisplayAttribute(SbmDbDfn.ColumnIdx.Commodity_CarriageCostIndicative) || !CommodityMgr.ColumnExists(SbmDbDfn.ColumnIdx.Commodity_CarriageCostIndicative))
@@ -459,7 +458,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Commodities
// Sales Unit.
if (managedByAccounts || !UserCanUpdateFinancials())
config.Field.Readonly.Add($"{ItemField.UomIdSale}");
config.Field.Readonly.Add($"{ItemField.SalesUnit}");
// Sales Pack quantity.
@@ -2,12 +2,16 @@
using Sarand.BusinessMgr.Net.Standard.Base.App;
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
using Sarand.BusinessMgr.Web.Portal.Components;
using Sarand.BusinessMgr.Web.Portal.Controllers.Commodities;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.ReferenceData;
using Sarand.Net.Standard.Base.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
namespace Sarand.BusinessMgr.Web.Portal.Models.Commodities
{
@@ -60,6 +64,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Commodities
{
public String Exists { get; set; }
public String Id { get; set; }
public String DataGroups { get; set; }
public String IdSupersede { get; set; }
public String Type { get; set; }
public String Code { get; set; }
@@ -67,16 +72,51 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Commodities
public String DescBrief { get; set; }
public String AssocIdCustomer { get; set; }
public String AssocIdSupplier { get; set; }
// Sales.
public String SalesPrice { get; set; }
public String SalesTaxCode { get; set; }
public String SalesUnitType { get; set; }
public String SalesPackQty { get; set; }
// Common properties.
public String Notes { get; set; }
public String StatusCode { get; set; }
public String SupersededStatusConfirmed { get; set; }
}
public CommodityData Commodity { get; } = new CommodityData();
public HashSet<CommodityController.CommodityDataGroup> GetDataGroups()
{
return
Regex.Split(StringUtil.OnBlank(Commodity.DataGroups), "[\\s,;\\-+]+")
.Select(item => EnumUtil.ParseEnum(item, CommodityController.CommodityDataGroup.Unknown))
.Where(item => item != CommodityController.CommodityDataGroup.Unknown)
.ToHashSet();
}
public Sbm.CommodityType GetCommodityType()
{
return (Sbm.CommodityType)Internals.CommodityTypeCodes.GetTypeForCode(Commodity.Type);
}
// Sales.
public decimal GetCommoditySalesPrice()
{
return StringUtil.ToDecimal(Commodity.SalesPrice);
}
public SysId GetCommoditySalesTaxCodeId()
{
return Internals.GetTaxCodesEffectiveOn(DateTime.Today).FirstOrDefault(tax => tax.Code.EqualsCI(Commodity.SalesTaxCode))?.Id;
}
public SaUomType GetCommoditySalesUnitType()
{
return (SaUomType)Internals.GetSystemCodes(Sbm.SystemCode.UnitMeasureType).GetTypeForCode(Commodity.SalesUnitType);
}
public SysId GetCommoditySalesUnitId()
{
return Internals.GetUnitsOfMeasure().FirstOrDefault(uom => uom.UnitType == GetCommoditySalesUnitType())?.Id;
}
public int GetCommoditySalesPackQty()
{
return StringUtil.ToInt(Commodity.SalesPackQty);
}
// Common properties.
public SaStatus GetCommodityStatus()
{
return SacsSystem.GetStatusForCode(Commodity.StatusCode);
@@ -91,7 +131,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Commodities
// Commodity Type.
if (Commodity.Type != null)
{
String controlName = "CommodityType";
String controlName = GetFieldName(Model_Commodity.ItemField.Type);
if (Commodity.Type.IsEmpty() || GetCommodityType() <= 0)
responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]);
}
@@ -99,25 +139,64 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Commodities
// Commodity Code.
if (Commodity.Code != null)
{
String controlName = "CommodityCode";
String controlName = GetFieldName(Model_Commodity.ItemField.Code);
responseData.SetControlValue(controlName, Commodity.Code);
if (Commodity.Code.IsEmpty())
responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]);
if (StringUtil.GetLength(Commodity.Code) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Commodity_Code))
else if (StringUtil.GetLength(Commodity.Code) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Commodity_Code))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Commodity_Code)]);
}
// Commodity Description.
if (Commodity.DescBrief != null)
{
String controlName = "CommodityDesc";
String controlName = GetFieldName(Model_Commodity.ItemField.DescBrief);
responseData.SetControlValue(controlName, Commodity.DescBrief);
if (Commodity.DescBrief.IsEmpty())
responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]);
if (StringUtil.GetLength(Commodity.DescBrief) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Commodity_DescBrief))
else if (StringUtil.GetLength(Commodity.DescBrief) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Commodity_DescBrief))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Commodity_DescBrief)]);
}
// Commodity Sales Price.
if (Commodity.SalesPrice != null)
{
String controlName = GetFieldName(Model_Commodity.ItemField.SalesPrice);
responseData.SetControlValue(controlName, Commodity.SalesPrice);
if (Commodity.SalesPrice.IsBlank())
responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]);
else if (!StringUtil.IsDecimal(Commodity.SalesPrice) || GetCommoditySalesPrice() < 0.0m)
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
}
// Commodity Tax.
if (Commodity.SalesTaxCode != null)
{
String controlName = GetFieldName(Model_Commodity.ItemField.SalesTaxCode);
if (Commodity.SalesTaxCode.IsBlank())
responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]);
else if (!SysId.IsValid(GetCommoditySalesTaxCodeId()))
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
}
// Commodity Sales Unit Type.
if (Commodity.SalesUnitType != null)
{
String controlName = GetFieldName(Model_Commodity.ItemField.SalesUnit);
if (Commodity.SalesUnitType.IsBlank())
responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]);
else if (GetCommoditySalesUnitType() == SaUomType.Unknown || !SysId.IsValid(GetCommoditySalesUnitId()))
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
}
// Commodity Sales pack quantity.
if (Commodity.SalesPackQty != null)
{
String controlName = GetFieldName(Model_Commodity.ItemField.SalesPackQty);
if (!StringUtil.IsBlank(Commodity.SalesPackQty) && (!StringUtil.IsNumeric(Commodity.SalesPackQty) || GetCommoditySalesPackQty() < 1))
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
}
// Commodity Notes.
if (Commodity.Notes != null)
{
@@ -161,10 +240,10 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Commodities
SbmCommodity.Params prmCommodity = new SbmCommodity.Params();
// Ignore this commodity if it already exists.
if (StringUtil.ToBool(Commodity.Exists) && SysId.IsValid(SysId.ToSysId(Commodity.Id)))
prmCommodity.PriceSetIdsExcluded.Add(SysId.ToSysId(Commodity.Id));
prmCommodity.IdsExcluded.Add(SysId.ToSysId(Commodity.Id));
// Ignore the commodity being superseded, if any.
if (SysId.IsValid(SysId.ToSysId(Commodity.IdSupersede)))
prmCommodity.PriceSetIdsExcluded.Add(SysId.ToSysId(Commodity.IdSupersede));
prmCommodity.IdsExcluded.Add(SysId.ToSysId(Commodity.IdSupersede));
// Same code and issue.
prmCommodity.CodeFull = Commodity.Code;
prmCommodity.DrawingIssueFull = Commodity.DrawingIssue;
@@ -198,7 +277,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Commodities
SbmCommodity.Params prmCommodity = new SbmCommodity.Params();
// Ignore this commodity if it already exists.
if (StringUtil.ToBool(Commodity.Exists) && SysId.IsValid(SysId.ToSysId(Commodity.Id)))
prmCommodity.PriceSetIdsExcluded.Add(SysId.ToSysId(Commodity.Id));
prmCommodity.IdsExcluded.Add(SysId.ToSysId(Commodity.Id));
// Same code.
prmCommodity.CodeFull = Commodity.Code;
prmCommodity.StatusCat = SbmCommodity.StatusCat.Current;
@@ -15,6 +15,7 @@
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmCommodityId", @class = "sbm-form" }))
{
@Html.Hidden("Commodity.Id", "", new { @id = "", @class = "CommodityId" })
@Html.Hidden("Commodity.DataGroups", "", new { @id = "", @class = "CommodityDataGroups" })
}
<div id="dlgCommodity" class="sbm-dialog" title="">
@@ -24,45 +25,56 @@
@Html.Hidden("Commodity.Id", "", new { @id = "", @class = "CommodityId sbm-input" })
@Html.Hidden("Commodity.Exists", "", new { @id = "", @class = "CommodityExists sbm-input" })
@Html.Hidden("Commodity.SupersededStatusConfirmed", "", new { @id = "", @class = "SupersededStatusConfirmed sbm-input" })
<div class="spacer2"></div>
@* Commodity Type *@
<div class="sbm-form-control @Model_Commodity.GetFieldName(Model_Commodity.ItemField.Type)">
<div class="row">
<div class="col-sm-3">
<div class="sbm-label">
<label for="cbCommodityType"><span>@Localiser["label.type"]</span><span class="required">&nbsp;*</span></label>
<div class="row">
<div class="col-6">
@* Commodity Code *@
<div class="sbm-form-control @Model_Commodity.GetFieldName(Model_Commodity.ItemField.Code)">
<div class="row">
<div class="col-sm-4">
<div class="sbm-label">
<label for="ifCommodityCode"><span>@Localiser["label.code"]</span><span class="required">&nbsp;*</span></label>
</div>
</div>
<div class="col-sm">
<div class="sbm-control">
@Html.TextBox("Commodity.Code", "", new { @id = "ifCommodityCode", @class = "CommodityCode sbm-input sbm-auto-val", @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.Commodity_Code) })
</div>
<div class="sbm-message"></div>
</div>
</div>
</div>
<div class="col-sm">
<div class="sbm-control">
@Html.DropDownList("Commodity.Type", Model.GetCommodityTypeCodesForDropdown(), Localiser["label.select"], new { @id = "cbCommodityType", @class = "CommodityType sbm-select" })
</div>
<div class="sbm-message"></div>
</div>
</div>
</div>
<div class="col-6">
@* Commodity Code *@
<div class="sbm-form-control @Model_Commodity.GetFieldName(Model_Commodity.ItemField.Code)">
<div class="row">
<div class="col-sm-3">
<div class="sbm-label">
<label for="ifCommodityCode"><span>@Localiser["label.code"]</span><span class="required">&nbsp;*</span></label>
@* Commodity Type *@
<div class="sbm-form-control @Model_Commodity.GetFieldName(Model_Commodity.ItemField.Type)">
<div class="row">
<div class="col-sm-1"></div>
<div class="col-sm-3">
<div class="sbm-label">
<label for="cbCommodityType"><span>@Localiser["label.type"]</span><span class="required">&nbsp;*</span></label>
</div>
</div>
<div class="col-sm">
<div class="sbm-control">
@Html.DropDownList("Commodity.Type", Model.GetCommodityTypeCodesForDropdown(), Localiser["label.select"], new { @id = "cbCommodityType", @class = "CommodityType sbm-select" })
</div>
<div class="sbm-message"></div>
</div>
</div>
</div>
<div class="col-sm">
<div class="sbm-control">
@Html.TextBox("Commodity.Code", "", new { @id = "ifCommodityCode", @class = "CommodityCode sbm-input sbm-auto-val", @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.Commodity_Code) })
</div>
<div class="sbm-message"></div>
</div>
</div>
</div>
@* Commodity Description *@
<div class="sbm-form-control @Model_Commodity.GetFieldName(Model_Commodity.ItemField.DescBrief)">
<div class="row">
<div class="col-sm-3">
<div class="col-sm-2">
<div class="sbm-label">
<label for="ifCommodityDesc"><span>@Localiser["label.description"]</span><span class="required">&nbsp;*</span></label>
</div>
@@ -76,10 +88,106 @@
</div>
</div>
<div class="row">
<div class="col-sm-6">
@* Sales Price *@
<div class="sbm-form-control @Model_Commodity.GetFieldName(Model_Commodity.ItemField.SalesPrice)">
<div class="row">
<div class="col-sm-4">
<div class="sbm-label">
<label for="ifCommoditySalesPrice"><span>@Localiser["label.price"]</span><span class="required">&nbsp;*</span></label>
</div>
</div>
<div class="col-sm">
<div class="sbm-control">
@Html.TextBox("Commodity.SalesPrice", "", new { @id = "ifCommoditySalesPrice", @class = "CommoditySalesPrice sbm-input right sbm-auto-val sbm-format-currency", @maxlength = 12 })
</div>
<div class="sbm-message"></div>
</div>
</div>
</div>
</div>
<div class="col-sm-6">
@* Sales Unit *@
<div class="sbm-form-control @Model_Commodity.GetFieldName(Model_Commodity.ItemField.SalesUnit)">
<div class="row">
<div class="col-sm-1"></div>
<div class="col-sm-3">
<div class="sbm-label">
<label for="ifCommoditySalesUnit"><span>@Localiser["label.unit"]</span><span class="required">&nbsp;*</span></label>
</div>
</div>
<div class="col-sm">
<div class="sbm-control">
<div class="row">
<div class="col-5">
<select id="" class="CommoditySalesUnitCategory sbm-select" name=""></select>
</div>
<div class="col-7">
<select id="" class="CommoditySalesUnitType sbm-select" name="Commodity.SalesUnitType"></select>
</div>
</div>
</div>
<div class="sbm-message"></div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-6">
@* Sales Tax *@
<div class="sbm-form-control @Model_Commodity.GetFieldName(Model_Commodity.ItemField.SalesTaxCode)">
<div class="row">
<div class="col-sm-4">
<div class="sbm-label">
<label for="ifCommoditySalesTax"><span>@Localiser["label.tax"]</span><span class="required">&nbsp;*</span></label>
</div>
</div>
<div class="col-sm">
<div class="sbm-control">
<select id="" class="CommoditySalesTaxCode sbm-select sbm-auto-val" name="Commodity.SalesTaxCode"></select>
</div>
<div class="sbm-message"></div>
</div>
</div>
</div>
</div>
<div class="col-sm-6">
@* Sales Unit *@
<div class="sbm-form-control @Model_Commodity.GetFieldName(Model_Commodity.ItemField.SalesPackQty)">
@Html.Hidden("Commodity.SalesUomId")
<div class="row">
<div class="col-sm-1"></div>
<div class="col-sm-3">
<div class="sbm-label">
<label for="ifCommoditySalesUnit"><span>@Localiser["label.pack.quantity"]</span><span class="required">&nbsp;*</span></label>
</div>
</div>
<div class="col-sm">
<div class="sbm-control">
@Html.TextBox("Commodity.SalesPackQty", "", new { @id = "ifCommoditySalesPackQty", @class = "CommoditySalesPackQty sbm-input right sbm-auto-val sbm-format-integer", @maxlength = 5 })
</div>
<div class="sbm-message"></div>
</div>
</div>
</div>
</div>
</div>
@* Commodity status *@
<div class="sbm-form-control @Model_Commodity.GetFieldName(Model_Commodity.ItemField.Status)">
<div class="row">
<div class="col-sm-3">
<div class="col-sm-2">
<div class="sbm-label">
<label for="cbCommodityStatus"><span>@Localiser["label.status"]</span><span class="required">&nbsp;*</span></label>
</div>
@@ -96,7 +204,7 @@
@* Commodity Notes *@
<div class="sbm-form-control @Model_Commodity.GetFieldName(Model_Commodity.ItemField.Notes)">
<div class="row">
<div class="col-sm-3">
<div class="col-sm-2">
<div class="sbm-label">
<label for="ifCommodityNotes"><span>@Localiser["label.notes"]</span></label>
</div>
@@ -16,8 +16,8 @@
<th class="@Model_Commodity.GetFieldName(Model_Commodity.ItemField.Type) width5pc center">@Localiser["label.type"]</th>
@if (Model.UserCanViewCommodityFinancials_Sales())
{
<th class="@Model_Commodity.GetFieldName(Model_Commodity.ItemField.SalesPriceFmt) width5pc right">@Localiser["label.sales.price"]</th>
<th class="@Model_Commodity.GetFieldName(Model_Commodity.ItemField.SalesUnit) width5pc center">@Localiser["label.unit.of.sale"]</th>
<th class="@Model_Commodity.GetFieldName(Model_Commodity.ItemField.SalesPriceFmt) width5pc right">@Localiser["label.price"]</th>
<th class="@Model_Commodity.GetFieldName(Model_Commodity.ItemField.SalesUnit) width5pc center">@Localiser["label.unit"]</th>
}
<th class="@Model_Commodity.GetFieldName(Model_Commodity.ItemField.Notes) width25pc d-none d-md-table-cell">@Localiser["label.notes"]</th>
<th class="@Model_Commodity.GetFieldName(Model_Commodity.ItemField.Status) width5pc center">@Localiser["label.status"]</th>
@@ -63,6 +63,7 @@
<partial name="Panel-CommodityList.cshtml" />
</div>
</div>
<partial name="Panel-CommodityDialog.cshtml" />
<partial name="Panel-CommodityDialog.cshtml" />
</div>
@@ -32,7 +32,7 @@
</div>
<div class="col-sm">
<div class="sbm-control">
@Html.TextBoxFor(model => model.EmailAddress, new { @id = "", @class = "AccountEmailAddress sbm-input lower", @readonly = true, @maxlength = @Model.GetControlMaxLength(SaSecurityDbDfn.ColumnIdx.SaSecItem_EmailAddress) })
@Html.TextBoxFor(model => model.EmailAddress, new { @type = "email", @id = "", @class = "AccountEmailAddress sbm-input lower", @readonly = true, @maxlength = @Model.GetControlMaxLength(SaSecurityDbDfn.ColumnIdx.SaSecItem_EmailAddress) })
</div>
<div class="sbm-message"></div>
</div>
@@ -24,7 +24,7 @@
<label for="ifEmailAddress"><span>@Localiser["label.email"]</span><span class="required">&nbsp;*</span></label>
</div>
<div class="sbm-control">
@Html.TextBoxFor(model => model.EmailAddress, new { @id = "ifEmailAddress", @class = "sbm-input lower", @maxlength = @Model.GetControlMaxLength(SaSecurityDbDfn.ColumnIdx.SaSecItem_EmailAddress) })
@Html.TextBoxFor(model => model.EmailAddress, new { @type = "email", @id = "ifEmailAddress", @class = "sbm-input lower", @maxlength = @Model.GetControlMaxLength(SaSecurityDbDfn.ColumnIdx.SaSecItem_EmailAddress) })
</div>
<div class="sbm-message"></div>
</div>
@@ -31,7 +31,7 @@
<label for="ifEmailAddress"><span>@Localiser["label.email"]</span><span class="required">&nbsp;*</span></label>
</div>
<div class="sbm-control">
@Html.TextBoxFor(model => model.EmailAddress, new { @id = "ifEmailAddress", @class = "sbm-input lower", @maxlength = "128" })
@Html.TextBoxFor(model => model.EmailAddress, new { @type = "email", @id = "ifEmailAddress", @class = "sbm-input lower", @maxlength = "128" })
</div>
<div class="sbm-message"></div>
</div>
@@ -34,7 +34,7 @@
<label for="ifEmailAddress"><span>@Localiser["label.email"]</span><span class="required">&nbsp;*</span></label>
</div>
<div class="sbm-control">
@Html.TextBoxFor(model => model.EmailAddress, new { @id = "ifEmailAddress", @class = "sbm-input lower", @maxlength = @Model.GetControlMaxLength(SaSecurityDbDfn.ColumnIdx.SaSecItem_EmailAddress) })
@Html.TextBoxFor(model => model.EmailAddress, new { @type = "email", @id = "ifEmailAddress", @class = "sbm-input lower", @maxlength = @Model.GetControlMaxLength(SaSecurityDbDfn.ColumnIdx.SaSecItem_EmailAddress) })
</div>
<div class="sbm-message"></div>
</div>
@@ -87,6 +87,7 @@
sbm.msg.dataNoneFound = '@Localiser.GetJavascriptText("msg.data.noneFound")';
sbm.maxProfileImageSize = 2 * 10 ** 6;
sbm.sessionCookieName = '@Model.SessionCookieName';
sbm.data.decimalsCurrency = 2;
sbm.awaitingLogin = @awaitingLogin;
sbm.keepLoggedIn = @keepLoggedIn;
sbm.keepLoggedInDelay = @(Sbm.Config.Control.Session.Cookie.KeepLoggedInTimeoutMillis);
@@ -18,7 +18,7 @@
"RootFolder": "D:\\Sarand\\Projects\\Users\\AHoward\\VS2022\\BusinessMgr\\Docs"
},
"Logging": {
"RootFolder": "D:\\Sarand\\Projects\\Users\\AHoward\\VS2022\\BusinessMgr\\Logs\\WebPortal"
"RootFolder": "D:\\Sarand\\Projects\\Users\\AHoward\\VS2022\\BusinessMgr\\Logs"
}
}
}
@@ -16,10 +16,10 @@
}
},
"Documents": {
"RootFolder": "D:\\Sarand\\Projects\\Users\\AHoward\\VS2022\\BusinessMgr\\Docs"
"RootFolder": "C:\\Sarand\\BusinessMgr\\Docs"
},
"Logging": {
"RootFolder": "D:\\Sarand\\Projects\\Users\\AHoward\\VS2022\\BusinessMgr\\Logs\\WebPortal"
"RootFolder": "C:\\Sarand\\BusinessMgr\\Logs"
}
}
}
@@ -109,11 +109,10 @@
.sbm-form .sbm-form-control .sbm-label
{
margin: 0 0 8px 0;
font-size: 1rem;
line-height: 1.25;
margin: 2px 0 8px 0;
}
.sbm-form .sbm-form-control .sbm-label,
.sbm-form .sbm-form-control .sbm-label-text
{
font-size: 1rem;
@@ -140,11 +139,10 @@
.sbm-form .sbm-form-control .sbm-label
{
margin: 0 0 8px 0;
font-size: 1rem;
line-height: 1.25;
margin: 2px 0 8px 0;
}
.sbm-form .sbm-form-control .sbm-label,
.sbm-form .sbm-form-control .sbm-label-text
{
font-size: 1rem;
@@ -22,6 +22,12 @@
env.config = response.config;
env.configItemNew = response.configItemNew;
env.data.commodityTypes = response.commodityTypes;
env.data.taxCodes = response.taxCodes;
env.data.taxCodeDefault = response.taxCodeDefault;
env.data.uomCats = response.uomCats;
env.data.uomTypes = response.uomTypes;
env.data.uomTypeDefault = response.uomTypeDefault;
env.data.uoms = response.uoms;
env.data.statuses = response.statuses;
env.data.defaultStatusCode = response.defaultStatusCode;
}
@@ -140,6 +146,10 @@
{
sbm.clearItemForm(env.$frm.item);
sbm.populateSelectCodeDesc('#cbCommodityStatus', env.data.statuses);
sbm.populateSelectCodeDesc(env.$ctrl.saleTaxCode, env.data.taxCodes.map(function (tax) { return { code: tax.code, desc: tax.caption }; }));
env.$ctrl.saleTaxCode.val(env.data.taxCodeDefault);
sbm.populateSelectCodeDesc(env.$ctrl.saleUomCat, env.data.uomCats);
co.populateSalesUomType(env, env.data.uomTypeDefault);
}
co.openItemDlg = function (env, cfg, title)
{
@@ -154,17 +164,60 @@
sbm.openDialog($dlg, 720, 640);
}
//--------------------------------------------------------------
co.onTaxCodeSelected = function (env, $taxCode)
{
}
co.onSaleTaxCodeSelected = function (env)
{
co.onTaxCodeSelected(env.$ctrl.saleTaxCode);
}
//--------------------------------------------------------------
co.onUomCatSelected = function (env, $saleUomCat, $saleUom)
{
let uomCat = $saleUomCat.val();
let uom = $saleUom.val();
let uoms = env.data.uoms.filter(function (uom) { return uom.category == uomCat; }).map(function (uom) { return { code: uom.type, desc: uom.caption }; });
sbm.populateSelectCodeDesc($saleUom, uoms);
$saleUom.val(uom);
}
co.onSaleUomCatSelected = function (env)
{
co.onUomCatSelected(env, env.$ctrl.saleUomCat, env.$ctrl.saleUom);
}
co.populateUomType = function (env, $saleUomCat, $saleUom, type)
{
//sbm.debug('populateUomType', type);
let uom = env.data.uoms.find(function (uom) { return uom.type == type; });
if (!uom) return;
$saleUomCat.val(uom.category).trigger('change');
$saleUom.val(uom.type);
}
co.populateSalesUomType = function (env, type)
{
co.populateUomType(env, env.$ctrl.saleUomCat, env.$ctrl.saleUom, type);
}
co.onUomSelected = function (env, $saleUomCat, $saleUom)
{
}
co.onSaleUomSelected = function (env)
{
co.onUomSelected(env, env.$ctrl.saleUomCat, env.$ctrl.saleUom);
}
//--------------------------------------------------------------
co.updateItem = function (env, id)
{
let $frm = env.$frm.itemId;
$('.CommodityId', $frm).val(id);
$('.CommodityDataGroups', $frm).val('Sales');
env.ajax.updateItem = env.ajax.updateItem || { url: sbm.url.base + 'Commodity/Ajax/GetItem', formSel: $frm, callbackFn: function (response) { co.onUpdateItem(env, response); } };
sbm.doAjaxRequest(env.ajax.updateItem, 50);
}
co.onUpdateItem = function (env, response)
{
//sbm.debug('onUpdateItem', env, response);
sbm.debug('onUpdateItem', env, response);
if (!response.success) return;
let cfg = response.config || {};
co.clearItem(env, cfg);
@@ -175,6 +228,7 @@
$ctrls.filter('.CommodityId').val(item.id);
$ctrls.filter('.CommodityExists').val(1);
sbm.selectOrAdd($ctrls.filter('.CommodityType'), item.typeCode, item.typeDesc);
co.populateSalesUomType(env, item.salesUnitType);
sbm.selectOrAdd($ctrls.filter('.CommodityStatus'), item.statusCode, item.field.value.Status);
co.openItemDlg(env, cfg, sbm.dlg.title.updateCommodity);
}
@@ -182,7 +236,7 @@
//--------------------------------------------------------------
co.storeItem = function (env)
{
env.ajax.storeItem = env.ajax.storeItem || {url: sbm.url.base + 'Commodity/Ajax/StoreItem', formSel: env.$frm.item, callbackFn: function (response) { co.onStoreItem(env, response); }};
env.ajax.storeItem = env.ajax.storeItem || { url: sbm.url.base + 'Commodity/Ajax/StoreItem', formSel: env.$frm.item, callbackFn: function (response) { co.onStoreItem(env, response); } };
sbm.doAjaxRequest(env.ajax.storeItem, 50);
}
co.onStoreItem = function (env, response)
@@ -258,27 +312,31 @@
{
let env = { data: {}, ajax: {}, $pnl: {}, $frm: {}, $ctrl: {}, $dlg: {} };
env.$pnl.items = $($pnlItems);
env.$pnl.header = env.$pnl.items.find('.sbm-panel-header');
let $items = env.$pnl.items = $($pnlItems);
env.$pnl.header = $items.find('.sbm-panel-header');
env.$pnl.bgr = env.$pnl.header.find('.sbm-burger');
env.$pnl.mnu = env.$pnl.bgr.find('ul.sbm-dropdown-menu');
env.$pnl.table = env.$pnl.items.find('.sbm-panel-item-table');
env.$pnl.table = $items.find('.sbm-panel-item-table');
env.$pnl.msgs = env.$pnl.table.find('.sbm-panel-messages');
env.$pnl.tmpls = env.$pnl.items.find('.sbm-panel-item-template');
env.$pnl.tmpls = $items.find('.sbm-panel-item-template');
env.$frm.filter = $('#frmCommodityFilter');
env.$frm.filter = $items.find('#frmCommodityFilter');
env.$frm.filter.on('input', '.FilterSearch', function () { co.refreshResults(env, 250); }).on('change', '.FilterCommodityType,.FilterStatusCat', function () { co.refreshResults(env, 50); });
env.$frm.itemId = $items.find('#frmCommodityId');
var opt = sbm.dlgOpts();
opt.dialogClass += " sbm-Commodity";
env.$dlg.item = $('#dlgCommodity').dialog(opt);
env.$frm.itemId = $('#frmCommodityId');
env.$frm.item = $('#frmCommodity').on('input', '.sbm-input, .sbm-textarea', function () { sbm.clearControlError(this); }).on('change', '.sbm-select', function () { sbm.clearControlError(this); });
env.$dlg.item = $items.find('#dlgCommodity').dialog(opt);
env.$frm.item = env.$dlg.item.find('#frmCommodity').on('input', '.sbm-input, .sbm-textarea', function () { sbm.clearControlError(this); }).on('change', '.sbm-select', function () { sbm.clearControlError(this); });
env.$frm.item.on('blur', '.sbm-input.sbm-format-integer', function () { sbm.formatInteger($(this)); }).on('blur', '.sbm-input.sbm-format-currency', function () { sbm.formatCurrency($(this)); });
env.$ctrl.saleTaxCode = env.$frm.item.find('.sbm-select.CommoditySalesTaxCode').on('change', function () { co.onSaleTaxCodeSelected(env); });
env.$ctrl.saleUomCat = env.$frm.item.find('.sbm-select.CommoditySalesUnitCategory').on('change', function () { co.onSaleUomCatSelected(env); })
env.$ctrl.saleUom = env.$frm.item.find('.sbm-select.CommoditySalesUnitType').on('change', function () { co.onSaleUomSelected(env); });
var opt = sbm.dlgOpts();
opt.dialogClass += " sbm-Commodity";
opt.buttons[sbm.lbl.ok] = function () { co.selectItem(env); };
opt.buttons[sbm.lbl.cancel] = function () { delete env.prmSelect; $(this).dialog('close'); };
env.$dlg.select = $('#dlgCommoditySelect').dialog(opt);
env.$dlg.select = $items.find('#dlgCommoditySelect').dialog(opt);
return env;
}
@@ -188,6 +188,16 @@
let $ctrl = $('.sbm-form-control', $frm);
for (var name in val || {}) { $ctrl.filter('.' + cfg.field.prefix + name).find('.sbm-input,.sbm-textarea,.sbm-select').filter('.sbm-auto-val').val(val[name]).end().find('.sbm-checkbox').prop('checked', !!val[name]); };
}
sbm.formatInteger = function ($ctrl)
{
if (sbm.isNumeric($ctrl.val()))
$ctrl.val(parseFloat($ctrl.val()).toFixed(0));
}
sbm.formatCurrency = function ($ctrl)
{
if (sbm.isNumeric($ctrl.val()))
$ctrl.val(parseFloat($ctrl.val()).toFixed(sbm.data.decimalsCurrency));
}
//--------------------------------------------------------------
// Page navigation.