using Sarand.BusinessMgr.Net.Standard.Base.App; using Sarand.BusinessMgr.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.Core; using System; using System.Collections.Generic; namespace Sarand.BusinessMgr.Net.Standard.Base.Bus { //======================================================================= public abstract class SbmContainerItem : SbmHierarchyItem { //------------------------------------------------------------------- // Columns. public enum Column { Hidden, Pos, Id, // ContainerItem. ItemSeq, ItemType, ItemId, SourceItemType, SourceItemId, SourceItem, Quantity, // Container details. Container_OwnerName, Container_CategoryDesc, Container_TypeDesc, Container_Reference, Container_DescBrief, Container_TagId, Container_AssIdSupplier, Container_SupplierName, Container_AssIdCustomer, Container_CustomerName, Container_Expected, Container_Notes, Container_StatusDesc, Container_StatusInd, Container_CreateOn, Container_UpdateOn, Container_ItemCount, Container_MovementCount, // Commodity details. Commodity_Id, Commodity_Code, Commodity_DescBrief, Commodity_Dimensions, Commodity_ICNTariffCode, Commodity_CostPrice_Unit, Commodity_CostPrice_Unit_Fmt, Commodity_CostPrice_Total, Commodity_CostPrice_Total_Fmt, Commodity_MaterialCurrencyId, Commodity_MaterialCost_Unit, Commodity_MaterialCost_Unit_Fmt, Commodity_MaterialCost_Total, Commodity_MaterialCost_Total_Fmt, Commodity_SalesPrice_Unit, Commodity_SalesPrice_Unit_Fmt, Commodity_SalesPrice_Total, Commodity_SalesPrice_Total_Fmt, Commodity_RetailPrice_Unit, Commodity_RetailPrice_Unit_Fmt, Commodity_RetailPrice_Total, Commodity_RetailPrice_Total_Fmt, Commodity_RRP, Commodity_Image, // Only for export. Commodity_Notes, // Common properties. Notes, Status, Status_Ind, Status_Desc, CreateOn_Date, UpdateOn_Date, } //------------------------------------------------------------------- /// Properties other than common. public class DataProperties { public SysId ContainerItemId { get; set; } = new SysId(); public SysId ContainerId { get; set; } = new SysId(); public Sbm.ItemType ItemType { get; set; } = Sbm.ItemType.Unknown; public SysId ItemId { get; set; } = new SysId(); public short ItemSeq { get; set; } = 0; public Sbm.ItemType ItemTypeSource { get; set; } = Sbm.ItemType.Unknown; public SysId ItemIdSource { get; set; } = new SysId(); public decimal Quantity { get; set; } = 0.0m; } // Data. public new class Data : SacsHierarchyItem.Data { // Data members. private readonly DataProperties data = new DataProperties(); // Construction. public Data() { Status = DefaultStatus; } public SysId ContainerItemId { get { return data.ContainerItemId; } set { CheckChanged(data.ContainerItemId, value); data.ContainerItemId = value; } } public SysId ContainerId { get { return data.ContainerId; } set { CheckChanged(data.ContainerId, value); data.ContainerId = value; } } public Sbm.ItemType ItemType { get { return data.ItemType; } set { CheckChanged((int)data.ItemType, (int)value); data.ItemType = value; } } public SysId ItemId { get { return data.ItemId; } set { CheckChanged(data.ItemId, value); data.ItemId = value; } } public short ItemSeq { get { return data.ItemSeq; } set { CheckChanged(data.ItemSeq, value); data.ItemSeq = value; } } public Sbm.ItemType ItemTypeSource { get { return data.ItemTypeSource; } set { CheckChanged((int)data.ItemTypeSource, (int)value); data.ItemTypeSource = value; } } public SysId ItemIdSource { get { return data.ItemIdSource; } set { CheckChanged(data.ItemIdSource, value); data.ItemIdSource = value; } } public decimal Quantity { get { return data.Quantity; } set { CheckChanged(data.Quantity, value); data.Quantity = value; } } internal void PopulateFrom(Data data) { ContainerItemId = data.ContainerItemId; ContainerId = data.ContainerId; ItemType = data.ItemType; ItemId = data.ItemId; ItemSeq = data.ItemSeq; ItemTypeSource = data.ItemTypeSource; ItemIdSource = data.ItemIdSource; Quantity = data.Quantity; base.PopulateFrom(data); } public Data Clone() { Data data = new Data(); data.PopulateFrom(this); return data; } } public new class ErrField : SacsHierarchyItem.ErrField { // Identifies the field that has invalid data. public ValidValue ContainerItemId { get; set; } = ValidValue.Valid; public ValidValue ContainerId { get; set; } = ValidValue.Valid; public ValidValue ItemType { get; set; } = ValidValue.Valid; public ValidValue ItemId { get; set; } = ValidValue.Valid; public ValidValue ItemSeq { get; set; } = ValidValue.Valid; public ValidValue ItemTypeSource { get; set; } = ValidValue.Valid; public ValidValue ItemIdSource { get; set; } = ValidValue.Valid; public ValidValue Quantity { get; set; } = ValidValue.Valid; } //------------------------------------------------------------------- // Data members. private readonly Data data = new Data(); //------------------------------------------------------------------- // Construction. protected SbmContainerItem(ISbmUserContext userContext, SysId containerId, Sbm.ItemType itemType, SysId itemId) : base(userContext) { base.SetData(data); ContainerId = containerId; ItemType = itemType; ItemId = itemId; ItemSeq = 0; ItemTypeSource = Sbm.ItemType.Unknown; Quantity = 0.0m; Status = DefaultStatus; } //------------------------------------------------------------------- // ContainerItem status. private static readonly List containerItemStatuses = new List() { SaStatus.Active, SaStatus.Disabled, }; public static SaStatus DefaultStatus { get { return SaStatus.Current; } } public static List ContainerItemStatuses { get { return new List(containerItemStatuses); } } public static DataValue.TriStateType GetStatusTriState(SaStatus status) { switch (status) { case SaStatus.Active: return DataValue.TriStateType.Green; case SaStatus.OnHold: return DataValue.TriStateType.Amber; case SaStatus.Disabled: return DataValue.TriStateType.Red; case SaStatus.Deleted: return DataValue.TriStateType.Purple; } return DataValue.TriStateType.Unknown; } //------------------------------------------------------------------- // Utilities. //------------------------------------------------------------------- // Properties. public Data GetData() { return data.Clone(); } public void SetData(Data data) { String fn = GetType().Name + ".SetData"; // Properties that cannot be changed if previously specified. if (SysId.IsValid(Id) && SysId.ToInt(Id) != SysId.ToInt(data.Id)) throw new NotSupportedException(fn + " Id cannot be changed"); // Populate individual properties to ensure that 'Changed' indicator is kept up to date. this.data.PopulateFrom(data); } //------------------------------------------------------------------- // Attributes. public SysId ContainerItemId { get { return data.ContainerItemId; } set { data.ContainerItemId = value; } } public SysId ContainerId { get { return data.ContainerId; } set { data.ContainerId = value; } } public Sbm.ItemType ItemType { get { return data.ItemType; } set { data.ItemType = value; } } public SysId ItemId { get { return data.ItemId; } set { data.ItemId = value; } } public short ItemSeq { get { return data.ItemSeq; } set { data.ItemSeq = value; } } public Sbm.ItemType ItemTypeSource { get { return data.ItemTypeSource; } set { data.ItemTypeSource = value; } } public SysId ItemIdSource { get { return data.ItemIdSource; } set { data.ItemIdSource = value; } } public decimal Quantity { get { return data.Quantity; } set { data.Quantity = value; } } //------------------------------------------------------------------- // A s s o c i a t e d D a t a E l e m e n t s //------------------------------------------------------------------- //------------------------------------------------------------------- // P a r a m s //------------------------------------------------------------------- /// Item Status categories. public enum StatusCat { Any, ActiveOnly } /// Item list parameters. public new class Params : SacsHierarchyItem.Params { // Item Ids. public List IncludedIds { get; } = new List(); public List ExcludedIds { get; } = new List(); // Item properties. public SysId ContainerId { get; set; } public short ItemSeq { get; set; } public Sbm.ItemType ItemType { get; set; } public List ItemIds { get; } = new List(); public Sbm.ItemType ItemTypeSource { get; set; } public List ItemIdsSource { get; } = new List(); public decimal Quantity { get; set; } // Container. public String TableAlias_Container { get; set; } public Sbm.ContainerCategory ContainerCategory { get; set; } public Sbm.ContainerType ContainerType { get; set; } public String ContainerReference { get; set; } public String ContainerTagId { get; set; } public String ContainerReferencePartial { get; set; } public String ContainerTagIdPartial { get; set; } public String ProductCode { get; set; } public String ProductCodePartial { get; set; } public DateTime ContainerExpectedFrom { get; set; } public DateTime ContainerExpectedTo { get; set; } public SaStatus ContainerStatus { get; set; } public bool ContainerHasItems { get; set; } = false; /// Container Item status. public StatusCat StatusCat { get; set; } = StatusCat.Any; // Utilities. public List GetDisplayValues() { List values = new List(); return values; } } //------------------------------------------------------------------- } //======================================================================= // C o n t a i n e r I t e m L i s t //======================================================================= public static class SbmContainerItemList { /// Check whether currency exists/locate in list with specified Id. public static bool Find(this List values, SbmContainerItem containerItem) { if (containerItem == null) return false; return (values.Find(item => item == containerItem) != null); } public static bool FindByContainerId(this List values, SysId containerId) { if (!SysId.IsValid(containerId)) return false; return values.Exists(item => item.ContainerId.Equals(containerId)); } public static bool FindByItemId(this List values, SysId itemId) { if (!SysId.IsValid(itemId)) return false; return values.Exists(item => item.ItemType.Equals(itemId)); } //------------------------------------------------------------------- // Utilities. public static List GetCommodityIds(this List values) { List commodityIds = new List(); foreach (SbmContainerItem containerItem in values) { if (containerItem.ItemType == Sbm.ItemType.Commodity) { SysId commodityId = containerItem.ItemId; if (SysId.IsValid(commodityId) && !commodityIds.Contains(commodityId)) commodityIds.Add(commodityId); } } return commodityIds; } public static decimal GetQuantityByCommodity(this List values, SysId commodityId) { decimal quantity = 0.0m; foreach (SbmContainerItem containerItem in values) { if (containerItem.ItemType == Sbm.ItemType.Commodity && containerItem.ItemId == commodityId) quantity += containerItem.Quantity; } return quantity; } // Comparison. } //======================================================================= }