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 Sarand.Net.Standard.Base.Utils; using System; using System.Collections.Generic; namespace Sarand.BusinessMgr.Net.Standard.Base.Bus { //======================================================================= public abstract class SbmConstituent : SbmHierarchyItem { //------------------------------------------------------------------- // Columns. public enum Column { Hidden, Pos, Id, // Constituent. AssocId, AffIdOwner, AffIdTarget, TransId, ReqntId, ConstId, AssetId, ProcessId, Type, Type_Desc, DescBrief, DescOutline, DescDetail, Owner_Name, Target_Name, Assoc_Code, Assoc_Target_Name, Trans_Ref, Trans_RefExt, Trans_DescBrief, Reqnt_DescBrief, Reqnt_JobNumber, Reqnt_ProductCode, Const_DescBrief, Category, Reference, DueInd, // Due indicator - green, amber, red Effective_Date, Effective_Time, Started_Date, Started_DateFmt, // Using default date format: 'D-MMM-YYYY' // Started_Time, Started_Day, Required_Date, Required_DateFmt, // Using default date format: 'D-MMM-YYYY' // Required_Time, Required_CssClass, // overdue (Properties other than common. public class DataProperties { public SysId AffiliateIdOwner { get; set; } = new SysId(); public SysId AffiliateIdTarget { get; set; } = new SysId(); public SysId AssociationId { get; set; } = new SysId(); public SysId TransactionId { get; set; } = new SysId(); public SysId RequirementId { get; set; } = new SysId(); public SysId ConstituentId { get; set; } = new SysId(); public SysId AssetId { get; set; } = new SysId(); public SysId ProcessId { get; set; } = new SysId(); public SysId AssociationIdContractor { get; set; } = new SysId(); //------------------------------------------------------------------- public Sbm.ConstituentType ConstituentType { get; set; } = Sbm.ConstituentType.Unknown; public String Ref { get; set; } = ""; public short Seq { get; set; } = 0; public DateTime Effective { get; set; } = DateTime.MinValue; public DateTime Required { get; set; } = DateTime.MinValue; public DateTime Started { get; set; } = DateTime.MinValue; public DateTime Completed { get; set; } = DateTime.MinValue; public String DescBrief { get; set; } = ""; public String DescOutline { get; set; } = ""; public String DescDetail { get; set; } = ""; public String TaskNumber { get; set; } = ""; public short Priority { get; set; } = 0; public String Category { get; set; } = ""; public String Reference { get; set; } = ""; public decimal Quantity { get; set; } = 0.0m; public SysId UomId { get; set; } = new SysId(); public decimal UnitCost { get; set; } = 0.0m; //------------------------------------------------------------------- public decimal AmountEst { get; set; } = 0.0m; public decimal AmountNet { get; set; } = 0.0m; public SysId TaxCodeId { get; set; } = new SysId(); public decimal TaxRate { get; set; } = 0.0m; public decimal AmountTax { get; set; } = 0.0m; public decimal AmountTot { get; set; } = 0.0m; public decimal TaxRateRebate { get; set; } = 0.0m; public decimal AmountTaxRebate { get; set; } = 0.0m; public StatusCat CategoryForStatus { get; set; } } // Data. public new class Data : SacsHierarchyItem.Data { // Data members. private readonly DataProperties data = new DataProperties(); // Construction. public Data() { Status = DefaultStatus; } public SysId AffiliateIdOwner { get { return data.AffiliateIdOwner; } set { CheckChanged(data.AffiliateIdOwner, value); data.AffiliateIdOwner = value; } } public SysId AffiliateIdTarget { get { return data.AffiliateIdTarget; } set { CheckChanged(data.AffiliateIdTarget, value); data.AffiliateIdTarget = value; } } public SysId AssociationId { get { return data.AssociationId; } set { CheckChanged(data.AssociationId, value); data.AssociationId = value; } } public SysId TransactionId { get { return data.TransactionId; } set { CheckChanged(data.TransactionId, value); data.TransactionId = value; } } public SysId RequirementId { get { return data.RequirementId; } set { CheckChanged(data.RequirementId, value); data.RequirementId = value; } } public SysId ConstituentId { get { return data.ConstituentId; } set { CheckChanged(data.ConstituentId, value); data.ConstituentId = value; } } public SysId AssetId { get { return data.AssetId; } set { CheckChanged(data.AssetId, value); data.AssetId = value; } } public SysId ProcessId { get { return data.ProcessId; } set { CheckChanged(data.ProcessId, value); data.ProcessId = value; } } public SysId AssociationIdContractor { get { return data.AssociationIdContractor; } set { CheckChanged(data.AssociationIdContractor, value); data.AssociationIdContractor = value; } } //------------------------------------------------------------------- public Sbm.ConstituentType ConstituentType { get { return data.ConstituentType; } set { CheckChanged((int)data.ConstituentType, (int)value); data.ConstituentType = value; } } public short Seq { get { return data.Seq; } set { CheckChanged(data.Seq, value); data.Seq = value; } } public DateTime Effective { get { return data.Effective; } set { CheckChanged(data.Effective, value); data.Effective = value; } } public DateTime Required { get { return data.Required; } set { CheckChanged(data.Required, value); data.Required = value; } } public DateTime Started { get { return data.Started; } set { CheckChanged(data.Started, value); data.Started = value; } } public DateTime Completed { get { return data.Completed; } set { CheckChanged(data.Completed, value); data.Completed = value; } } public String DescBrief { get { return data.DescBrief; } set { CheckChanged(data.DescBrief, value); data.DescBrief = value; } } public String DescOutline { get { return data.DescOutline; } set { CheckChanged(data.DescOutline, value); data.DescOutline = value; } } public String DescDetail { get { return data.DescDetail; } set { CheckChanged(data.DescDetail, value); data.DescDetail = value; } } public String TaskNumber { get { return data.TaskNumber; } set { CheckChanged(data.TaskNumber, value); data.TaskNumber = value; } } public short Priority { get { return data.Priority; } set { CheckChanged(data.Priority, value); data.Priority = value; } } public String Category { get { return data.Category; } set { CheckChanged(data.Category, value); data.Category = value; } } public String Reference { get { return data.Reference; } set { CheckChanged(data.Reference, value); data.Reference = value; } } public decimal Quantity { get { return data.Quantity; } set { CheckChanged(data.Quantity, value); data.Quantity = value; } } public SysId UomId { get { return data.UomId; } set { CheckChanged(data.UomId, value); data.UomId = value; } } public decimal UnitCost { get { return data.UnitCost; } set { CheckChanged(data.UnitCost, value); data.UnitCost = value; } } //------------------------------------------------------------------- public decimal AmountEst { get { return data.AmountEst; } set { CheckChanged(data.AmountEst, value); data.AmountEst = value; } } public decimal AmountNet { get { return data.AmountNet; } set { CheckChanged(data.AmountNet, value); data.AmountNet = value; } } public SysId TaxCodeId { get { return data.TaxCodeId; } set { CheckChanged(data.TaxCodeId, value); data.TaxCodeId = value; } } public decimal TaxRate { get { return data.TaxRate; } set { CheckChanged(data.TaxRate, value); data.TaxRate = value; } } public decimal AmountTax { get { return data.AmountTax; } set { CheckChanged(data.AmountTax, value); data.AmountTax = value; } } public decimal AmountTot { get { return data.AmountTot; } set { CheckChanged(data.AmountTot, value); data.AmountTot = value; } } public decimal TaxRateRebate { get { return data.TaxRateRebate; } set { CheckChanged(data.TaxRateRebate, value); data.TaxRateRebate = value; } } public decimal AmountTaxRebate { get { return data.AmountTaxRebate; } set { CheckChanged(data.AmountTaxRebate, value); data.AmountTaxRebate = value; } } public SbmConstituent.StatusCat CategoryForStatus(SaStatus saStatus) { SbmConstituent.StatusCat constStatusCat = SbmConstituent.StatusCat.Open; switch (saStatus) { case SaStatus.Completed: case SaStatus.Cancelled: constStatusCat = SbmConstituent.StatusCat.Closed; break; } return constStatusCat; } internal void PopulateFrom(Data data) { AffiliateIdOwner = data.AffiliateIdOwner; AffiliateIdTarget = data.AffiliateIdTarget; AssociationId = data.AssociationId; TransactionId = data.TransactionId; RequirementId = data.RequirementId; ConstituentId = data.ConstituentId; AssetId = data.AssetId; ProcessId = data.ProcessId; AssociationIdContractor = data.AssociationIdContractor; ConstituentType = data.ConstituentType; Seq = data.Seq; Effective = data.Effective; Required = data.Required; Started = data.Started; Completed = data.Completed; DescBrief = data.DescBrief; DescOutline = data.DescOutline; DescDetail = data.DescDetail; TaskNumber = data.TaskNumber; Priority = data.Priority; Category = data.Category; Reference = data.Reference; Quantity = data.Quantity; UomId = data.UomId; UnitCost = data.UnitCost; AmountEst = data.AmountEst; AmountNet = data.AmountNet; TaxCodeId = data.TaxCodeId; TaxRate = data.TaxRate; AmountTax = data.AmountTax; AmountTot = data.AmountTot; TaxRateRebate = data.TaxRateRebate; AmountTaxRebate = data.AmountTaxRebate; } 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 AffIdOwner { get; set; } = ValidValue.Valid; public ValidValue AffIdTarget { get; set; } = ValidValue.Valid; public ValidValue AssocId { get; set; } = ValidValue.Valid; public ValidValue TransId { get; set; } = ValidValue.Valid; public ValidValue ReqntId { get; set; } = ValidValue.Valid; public ValidValue ConstId { get; set; } = ValidValue.Valid; public ValidValue AssetId { get; set; } = ValidValue.Valid; public ValidValue ProcessId { get; set; } = ValidValue.Valid; public ValidValue AssociationIdContractor { get; set; } = ValidValue.Valid; public ValidValue ConstituentType { get; set; } = ValidValue.Valid; public ValidValue Seq { get; set; } = ValidValue.Valid; public ValidValue Effective { get; set; } = ValidValue.Valid; public ValidValue Required { get; set; } = ValidValue.Valid; public ValidValue Started { get; set; } = ValidValue.Valid; public ValidValue Completed { get; set; } = ValidValue.Valid; public ValidValue DescBrief { get; set; } = ValidValue.Valid; public ValidValue DescOutline { get; set; } = ValidValue.Valid; public ValidValue DescDetail { get; set; } = ValidValue.Valid; public ValidValue TaskNumber { get; set; } = ValidValue.Valid; public ValidValue Priority { get; set; } = ValidValue.Valid; public ValidValue Category { get; set; } = ValidValue.Valid; public ValidValue Reference { get; set; } = ValidValue.Valid; public ValidValue Quantity { get; set; } = ValidValue.Valid; public ValidValue UomId { get; set; } = ValidValue.Valid; public ValidValue UnitCost { get; set; } = ValidValue.Valid; public ValidValue AmountEst { get; set; } = ValidValue.Valid; public ValidValue AmountNet { get; set; } = ValidValue.Valid; public ValidValue TaxCodeId { get; set; } = ValidValue.Valid; public ValidValue TaxRate { get; set; } = ValidValue.Valid; public ValidValue AmountTax { get; set; } = ValidValue.Valid; public ValidValue AmountTot { get; set; } = ValidValue.Valid; public ValidValue TaxRateRebate { get; set; } = ValidValue.Valid; public ValidValue AmountTaxRebate { get; set; } = ValidValue.Valid; } //------------------------------------------------------------------- // Data members. private readonly Data data = new Data(); private enum ConstSort { ConstSortEffective }; //------------------------------------------------------------------- // Construction. protected SbmConstituent(SysId id, SysId affIdOwner, SysId assocId, Sbm.ConstituentType constituentType) : base() { base.SetData(data); Id = id; AffiliateIdOwner = affIdOwner; AssociationId = assocId; ConstituentType = constituentType; Status = DefaultStatus; } //------------------------------------------------------------------- // Constituent status. private static readonly List constituentStatuses = new List() { SaStatus.Required, /*SaStatus.Assigned,*/ SaStatus.Awaiting, SaStatus.InProgress, SaStatus.Completed, SaStatus.Cancelled, }; public static SaStatus DefaultStatus { get { return SaStatus.Current; } } public static List ConstituentStatuses { get { return new List(constituentStatuses); } } public static DataValue.TriStateType GetStatusTriState(SaStatus status) { switch (status) { case SaStatus.Completed: return DataValue.TriStateType.Green; case SaStatus.InProgress: return DataValue.TriStateType.Amber; case SaStatus.Cancelled: return DataValue.TriStateType.Red; case SaStatus.Deleted: return DataValue.TriStateType.Purple; } return DataValue.TriStateType.Unknown; } //------------------------------------------------------------------- // Utilities. public SbmItemId GetItemId() { return new SbmItemId(Sbm.ItemType.Constituent, Id); } //------------------------------------------------------------------- // Properties. public Data GetData() { return data.Clone(); } public void SetData(Data data) { // Properties that cannot be changed if previously specified. if (SysId.IsValid(Id) && SysId.ToInt(Id) != SysId.ToInt(data.Id)) throw new NotSupportedException($"{SysUtil.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 AffiliateIdOwner { get { return data.AffiliateIdOwner; } set { data.AffiliateIdOwner = value; } } public SysId AffiliateIdTarget { get { return data.AffiliateIdTarget; } set { data.AffiliateIdTarget = value; } } public SysId AssociationId { get { return data.AssociationId; } set { data.AssociationId = value; } } public SysId TransactionId { get { return data.TransactionId; } set { data.TransactionId = value; } } public SysId RequirementId { get { return data.RequirementId; } set { data.RequirementId = value; } } public SysId ConstituentId { get { return data.ConstituentId; } set { data.ConstituentId = value; } } public SysId AssetId { get { return data.AssetId; } set { data.AssetId = value; } } public SysId ProcessId { get { return data.ProcessId; } set { data.ProcessId = value; } } public SysId AssociationIdContractor { get { return data.AssociationIdContractor; } set { data.AssociationIdContractor = value; } } //------------------------------------------------------------------- public Sbm.ConstituentType ConstituentType { get { return data.ConstituentType; } set { data.ConstituentType = value; } } public short Seq { get { return data.Seq; } set { data.Seq = value; } } public DateTime Effective { get { return data.Effective; } set { data.Effective = value; } } public DateTime Required { get { return data.Required; } set { data.Required = value; } } public DateTime Started { get { return data.Started; } set { data.Started = value; } } public DateTime Completed { get { return data.Completed; } set { data.Completed = value; } } public String DescBrief { get { return data.DescBrief; } set { data.DescBrief = value; } } public String DescOutline { get { return data.DescOutline; } set { data.DescOutline = value; } } public String DescDetail { get { return data.DescDetail; } set { data.DescDetail = value; } } public String TaskNumber { get { return data.TaskNumber; } set { data.TaskNumber = value; } } public short Priority { get { return data.Priority; } set { data.Priority = value; } } public String Category { get { return data.Category; } set { data.Category = value; } } public String Reference { get { return data.Reference; } set { data.Reference = value; } } public decimal Quantity { get { return data.Quantity; } set { data.Quantity = value; } } public SysId UomId { get { return data.UomId; } set { data.UomId = value; } } public decimal UnitCost { get { return data.UnitCost; } set { data.UnitCost = value; } } //------------------------------------------------------------------- public decimal AmountEst { get { return data.AmountEst; } set { data.AmountEst = value; } } public decimal AmountNet { get { return data.AmountNet; } set { data.AmountNet = value; } } public SysId TaxCodeId { get { return data.TaxCodeId; } set { data.TaxCodeId = value; } } public decimal TaxRate { get { return data.TaxRate; } set { data.TaxRate = value; } } public decimal AmountTax { get { return data.AmountTax; } set { data.AmountTax = value; } } public decimal AmountTot { get { return data.AmountTot; } set { data.AmountTot = value; } } public decimal TaxRateRebate { get { return data.TaxRateRebate; } set { data.TaxRateRebate = value; } } public decimal AmountTaxRebate { get { return data.AmountTaxRebate; } set { data.AmountTaxRebate = value; } } public SbmConstituent.StatusCat CategoryForStatus(SaStatus saStatus) { SbmConstituent.StatusCat constStatusCat = SbmConstituent.StatusCat.Open; switch (saStatus) { case SaStatus.Completed: case SaStatus.Cancelled: constStatusCat = SbmConstituent.StatusCat.Closed; break; } return constStatusCat; } //------------------------------------------------------------------- // P a r a m s //------------------------------------------------------------------- /// Parameters - used to define the filters that should be applied to a List of Constituent // List parameters. public enum StatusCat { Any = 0, NotDeleted, /// Database value: In progress. Open, /// Database value: Completed or Cancelled. Closed, /// Anything but 'Cancelled' status NotCancelled, Default = NotDeleted } /// /// Item list parameters. /// public new class Params : SacsHierarchyItem.Params { // List filtering. public HashSet IdsIncluded { get; } = new HashSet(); public HashSet IdsExcluded { get; } = new HashSet(); // Constituent. public Sbm.ConstituentType ConstituentType { get; set; } = Sbm.ConstituentType.Any; public SysId AffIdTarget { get; set; } public SysId AssocId { get; set; } public SysId TransId { get; set; } public SysId ReqntId { get; set; } public SysId ConstId { get; set; } public SysId AssetId { get; set; } public String AssetSerialFull { get; set; } public String AssetSerialPartial { get; set; } public String Ref { get; set; } public String DescBrief { get; set; } public String DescBriefPartial { get; set; } public DateTime EffectiveFrom { get; set; } public DateTime EffectiveTo { get; set; } public DateTime UpdatedSince { get; set; } public bool UseJobNumber { get; set; } /// Constituent status. public StatusCat StatusCat { get; set; } = StatusCat.NotDeleted; } } //======================================================================= // C o n s t i t u e n t D a t a L i s t //======================================================================= public static class SbmConstituentList { /// Check whether item exists/locate in list with specified Id. public static int CompareEffectiveAscend(SbmConstituent constituent1, SbmConstituent constituent2) { if (constituent1 != null || constituent2 != null) return 0; return constituent1.Effective.CompareTo(constituent2.Effective); } public static int CompareEffectiveDescend(SbmConstituent constituent1, SbmConstituent constituent2) { if (constituent1 != null || constituent2 != null) return 0; return constituent1.Effective.CompareTo(constituent2.Effective) - -1; } public enum SortMode { ConstSoftEffective, }; public static void Sort(this List values, SortMode constituentSort, bool ascending = true) { if (constituentSort == SortMode.ConstSoftEffective) values.Sort ( delegate (SbmConstituent constituent1, SbmConstituent constituent2) { return CompareEffectiveAscend(constituent1, constituent2); } ); else if (constituentSort == SortMode.ConstSoftEffective) values.Sort ( delegate (SbmConstituent constituent1, SbmConstituent constituent2) { return CompareEffectiveDescend(constituent1, constituent2); } ); } } //======================================================================= }