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.
}
//=======================================================================
}