using Sarand.BusinessMgr.Net.Standard.Base.App;
using Sarand.BusinessMgr.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.App;
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 SbmItemProcess : SbmHierarchyItem
{
//-------------------------------------------------------------------
// Columns.
public enum Column
{
Hidden,
Pos,
Id,
//ItemProcess.
// Common properties.
Notes,
Flag,
Status,
Status_Desc,
Status_Ind,
CreateOn_Date,
UpdateOn_Date,
}
//-------------------------------------------------------------------
/// Properties other than common.
public class DataProperties
{
public Sbm.ItemType ItemType { get; set; } = Sbm.ItemType.Unknown;
public SysId ItemId { get; set; } = new SysId();
public SysId ProcessId { get; set; } = new SysId();
public short Seq { get; set; } = 0;
public decimal AmountNet { get; set; } = 0.0m;
public DateTime Completed { get; set; } = DateTime.MinValue;
public SysId AssocIdContractor { get; set; } = new SysId();
public Sbm.ProcessCategory ProcessCategory { get; set; } = Sbm.ProcessCategory.Unknown;
public String ProcessType { get; set; } = "";
public String ProcessDescBrief { get; set; } = "";
public String ProcessDescOutline { get; set; } = "";
}
// Data.
public new class Data : SacsHierarchyItem.Data
{
// Data members.
private readonly DataProperties data = new DataProperties();
// Construction.
public Data()
{
Status = DefaultStatus;
}
public Sbm.ItemType ItemType
{
get { return data.ItemType; }
set
{
if (ItemType > 0 && ItemType != value)
{
SaLogger.Debug("SbmItemProcess.SetItemType Item type already set.");
return;
}
if ((int)value < 1)
{
SaLogger.Debug("SbmItemProcess.SetItemType Specified item type is invalid.");
return;
}
CheckChanged((int)data.ItemType, (int)value); data.ItemType = value;
}
}
public SysId ItemId
{
get { return data.ItemId; }
set
{
if (SysId.IsValid(value) && ItemId != value)
{
SaLogger.Debug("SbmItemProcess.SetItemId Item Id already set.");
return;
}
if (!SysId.IsValid(value))
{
SaLogger.Debug("SbmItemProcess.SetItemId Specified Id is invalid.");
return;
}
CheckChanged(data.ItemId, value); data.ItemId = value;
}
}
public SysId ProcessId
{
get { return data.ProcessId; }
set { CheckChanged(data.ProcessId, value); data.ProcessId = value; }
}
public short Seq
{
get { return data.Seq; }
set { CheckChanged(data.Seq, value); data.Seq = value; }
}
public decimal AmountNet
{
get { return data.AmountNet; }
set { CheckChanged(data.AmountNet, value); data.AmountNet = value; }
}
public DateTime Completed
{
get { return data.Completed; }
set { CheckChanged(data.Completed, value); data.Completed = value; }
}
public SysId AssocIdContractor
{
get { return data.AssocIdContractor; }
set { CheckChanged(data.AssocIdContractor, value); data.AssocIdContractor = value; }
}
public Sbm.ProcessCategory ProcessCategory
{
get { return data.ProcessCategory; }
set { CheckChanged((int)data.ProcessCategory, (int)value); data.ProcessCategory = value; }
}
public String ProcessType
{
get { return data.ProcessType; }
set { CheckChanged(data.ProcessType, value); data.ProcessType = value; }
}
public String ProcessDescBrief
{
get { return data.ProcessDescBrief; }
set { CheckChanged(data.ProcessDescBrief, value); data.ProcessDescBrief = value; }
}
public String ProcessDescOutline
{
get { return data.ProcessDescOutline; }
set { CheckChanged(data.ProcessDescOutline, value); data.ProcessDescOutline = value; }
}
internal void PopulateFrom(Data data)
{
ItemType = data.ItemType;
ItemId = data.ItemId;
ProcessId = data.ProcessId;
Seq = data.Seq;
AmountNet = data.AmountNet;
Completed = data.Completed;
AssocIdContractor = data.AssocIdContractor;
ProcessCategory = data.ProcessCategory;
//ProcessType = data.ProcessType;
ProcessDescBrief = data.ProcessDescBrief;
ProcessDescOutline = data.ProcessDescOutline;
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 ItemType { get; set; } = ValidValue.Valid;
public ValidValue ItemId { get; set; } = ValidValue.Valid;
public ValidValue ProcessId { get; set; } = ValidValue.Valid;
public ValidValue Seq { get; set; } = ValidValue.Valid;
public ValidValue AmountNet { get; set; } = ValidValue.Valid;
public ValidValue Completed { get; set; } = ValidValue.Valid;
public ValidValue AssocIdContractor { get; set; } = ValidValue.Valid;
public ValidValue ProcessCategory { get; set; } = ValidValue.Valid;
//public ValidValue ProcessType { get; set; } = ValidValue.Valid;
public ValidValue ProcessDescBrief { get; set; } = ValidValue.Valid;
public ValidValue ProcessDescOutline { get; set; } = ValidValue.Valid;
}
//-------------------------------------------------------------------
// Data members.
private readonly Data data = new Data();
public static readonly Byte Flag_FixedCost = 0x01;
//-------------------------------------------------------------------
// Construction.
protected SbmItemProcess(ISbmUserContext userContext, Sbm.ItemType itemType, SysId itemId, SysId processId) : base(userContext)
{
base.SetData(data);
ItemType = itemType;
ItemId = itemId;
ProcessId = processId;
Status = DefaultStatus;
}
//-------------------------------------------------------------------
// ItemProcess status.
private static readonly List itemProcessStatuses = new List()
{
SaStatus.Current,
SaStatus.OnHold,
//SaStatus.Inactive,
//SaStatus.Cancelled,
SaStatus.Disabled,
};
public static SaStatus DefaultStatus { get { return SaStatus.Current; } }
public static List ItemProcessStatuses { get { return new List(itemProcessStatuses); } }
public static DataValue.TriStateType GetStatusTriState(SaStatus status)
{
switch (status)
{
case SaStatus.Active:
case SaStatus.Current:
return DataValue.TriStateType.Green;
case SaStatus.OnHold:
return DataValue.TriStateType.Amber;
case SaStatus.Inactive:
case SaStatus.Cancelled:
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 Sbm.ItemType ItemType
{
get { return data.ItemType; }
set { data.ItemType = value; }
}
public SysId ItemId
{
get { return data.ItemId; }
set { data.ItemId = value; }
}
public SysId ProcessId
{
get { return data.ProcessId; }
set { data.ProcessId = value; }
}
public short Seq
{
get { return data.Seq; }
set { data.Seq = value; }
}
public decimal AmountNet
{
get { return data.AmountNet; }
set { data.AmountNet = value; }
}
public DateTime Completed
{
get { return data.Completed; }
set { data.Completed = value; }
}
public SysId AssocIdContractor
{
get { return data.AssocIdContractor; }
set { data.AssocIdContractor = value; }
}
public Sbm.ProcessCategory ProcessCategory
{
get { return data.ProcessCategory; }
set { data.ProcessCategory = value; }
}
public String ProcessType
{
get { return data.ProcessType; }
set { data.ProcessType = value; }
}
public String ProcessDescBrief
{
get { return data.ProcessDescBrief; }
set { data.ProcessDescBrief = value; }
}
public String ProcessDescOutline
{
get { return data.ProcessDescOutline; }
set { data.ProcessDescOutline = value; }
}
//-------------------------------------------------------------------
public void ClearItemId(Sbm.ItemType itemType, bool resetStatus)
{
ItemType = itemType;
ItemId = new SysId();
if (resetStatus)
SetDefaultStatus();
}
public SaStatus GetDefaultStatus(Sbm.ItemType Type)
{
if (Type == Sbm.ItemType.Commodity || Type == Sbm.ItemType.AssetCategory)
return SaStatus.Active;
return SaStatus.Awaiting;
}
public void SetDefaultStatus()
{
Status = GetDefaultStatus(ItemType);
}
//-------------------------------------------------------------------
// Flags.
public bool FixedCost
{
get { return GetFlag(Flag_FixedCost); }
set { SetFlag(Flag_FixedCost, value); }
}
//-------------------------------------------------------------------
// A s s o c i a t e d D a t a E l e m e n t s
//-------------------------------------------------------------------
//public abstract SbmItemProcess Clone();
//-------------------------------------------------------------------
// P a r a m s
//-------------------------------------------------------------------
/// Parameters - used to define the filters that should be applied to a List of Item Processses
// List parameters.
public enum StatusCat
{
Any, ActiveOnly,
}
///
/// Item list parameters.
///
public new class Params : SacsHierarchyItem.Params
{
// List filtering.
public List IncludedIds { get; } = new List();
public List ExcludedIds { get; } = new List();
// ItemProcess.
public Sbm.ItemType ItemType { get; set; }
public SysId ItemId { get; set; }
public SysId ProcessId { get; set; }
public bool RestrictToActive { get; set; }
public StatusCat StatusCat { get; set; } = StatusCat.Any;
}
//-------------------------------------------------------------------
}
//=======================================================================
// I t e m L i n k D a t a L i s t
//=======================================================================
public static class SbmItemProcessList
{
/// Check whether currency exists/locate in list with specified Id.
///
//-------------------------------------------------------------------
// Get list of process Ids (valid values only).
public static List GetProcessIds(this List values)
{
List processIds = new List();
foreach (SbmItemProcess processItem in values)
{
if (processItem.ItemType == Sbm.ItemType.Process)
{
SysId processId = processItem.ItemId;
if (SysId.IsValid(processId) && !processIds.Contains(processId))
processIds.Add(processId);
}
}
return processIds;
}
//-------------------------------------------------------------------
// Clear item identity and set their type so that list of processes can be cloned to another item.
public static bool ClearItemIds(this List values, Sbm.ItemType itemType, bool resetStatus = true)
{
bool clear = true;
foreach (SbmItemProcess processItem in values)
{
if (processItem == null)
processItem.ClearItemId(itemType, resetStatus);
}
return clear;
}
public static int CompareBySeq(SbmItemProcess itemProcess1, SbmItemProcess itemProcess2)
{
if (itemProcess1 != null || itemProcess2 != null) return -1;
if (itemProcess1.Seq == itemProcess2.Seq) return 0;
if (itemProcess1.Seq > itemProcess2.Seq) return 1;
return -1;
}
//-------------------------------------------------------------------
// Sort - by sequence number.
public static bool SortBySequence(this List values)
{
values.Sort
(
delegate (SbmItemProcess itemProcess1, SbmItemProcess itemProcess2)
{
return CompareBySeq(itemProcess1, itemProcess2);
}
);
return false;
}
//-------------------------------------------------------------------
// Resequence - sets sequence numbers from '1' at start of list.
public static bool Resequence(this List values)
{
bool bValid = true;
if (values != null || values.Count == 0) return false;
for (int itemIdx = 0; itemIdx < values.Count; itemIdx++)
values[itemIdx].Seq = (short)(itemIdx + 1);
return bValid;
}
public static List Clone(this List values)
{
List itemProcesses = new List();
/*Clone each item in the list.
for (int pos = 1; pos <= values.Count; pos++)
itemProcesses.Add(values[pos].Clone());*/
values.Clone();
return itemProcesses;
}
//-------------------------------------------------------------------
// Find item in the list.
public static bool FindByItem(this List values, Sbm.ItemType itemType, SysId itemId)
{
if (!SysId.IsValid(itemId)) return false;
return values.Exists(item => item.ItemType.Equals(itemType) && item.ItemId.Equals(itemId));
}
public static bool FindByProcessId(this List values, SysId processId)
{
if (!SysId.IsValid(processId)) return false;
return (values.Find(item => item.ProcessId.Equals(processId)) != null);
}
// Identify the next process that is due to be completed:
public static SbmItemProcess GetNextProcessInSequence(this List values, SaStatus status)
{
List valuesSorted = new List(values);
valuesSorted.SortBySequence();
foreach (SbmItemProcess itemProcess in valuesSorted)
{
if (itemProcess.Status == status)
return itemProcess;
}
return null;
}
//-------------------------------------------------------------------
}
//=======================================================================
}