using Sarand.BusinessMgr.Net.Standard.Base.App; 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 SbmAssociation : SbmHierarchyItem { //------------------------------------------------------------------- // Columns. public enum Column { Hidden, Pos, Id, //Association. Type, Type_Desc, Code, ExtRef, Role, Location, PhoneMain, Email, Group, DescDetail, DefaultNominalCode, AmountTransMax, AnnualSalesTarget, CreditLimit, AccountBalance, DiscountType, DiscountType_Desc, DiscountRate, PriceSetId, PriceSet_Ref, PriceSet_Type, PriceSet_TypeDesc, PriceSet_Name, TaxCodeId, PaymentTerms, InvoiceDesc, AccountManagerCode, AccountManagerDesc, AccountHandlerCode, AccountHandlerDesc, AccountTypeCode, AccountTypeDesc, AccountRatingCode, AccountRatingDesc, ContactAreaCode, ContactAreaDesc, ContactHandlerCode, ContactHandlerDesc, ContactMethodCode, ContactMethodDesc, ContactCallCycleCode, ContactCallCycleDesc, CallsPerYear, LastCall, SeasonalCategoryCodes, SeasonalCategoryCode1, SeasonalCategoryDesc1, SeasonalCategoryCode2, SeasonalCategoryDesc2, SeasonalCategoryCode3, SeasonalCategoryDesc3, OrderLeadTimeCode, OrderLeadTimeDesc, DeliveryTypeCode, DeliveryTypeDesc, DeliveryMethodCode, DeliveryMethodDesc, DeliveryBookInCode, DeliveryBookInDesc, Terminated, Primary, Technician, // Association's owner details AffIdOwner, Owner_Name, // Association's target details AffIdTarget, Target_Type, Target_TypeDesc, Target_Name, Target_FirstName, Target_LastName, Target_Nature, Target_PhoneMain, Target_PhoneAlt, Target_PhoneFax, Target_PhoneMobile, Target_Email, Target_Website, Target_Notes, // Association's target Address details Target_Address_Type, Target_Address_TypeDesc, Target_Address_RefExt, Target_Address_Name, Target_Address_DescBrief, Target_Address_Summary, Target_Address_Line1, Target_Address_Line2, Target_Address_Line3, Target_Address_City, Target_Address_Province, Target_Address_Postcode, Target_Address_Country, Target_Address_Contact, Target_Address_Phone, Target_Address_Email, Target_Address_AccountManagerCode, Target_Address_AccountManagerDesc, Target_Address_AccountHandlerCode, Target_Address_AccountHandlerDesc, Target_Address_ContactAreaCode, Target_Address_ContactAreaDesc, Target_Address_ContactHandlerCode, Target_Address_ContactHandlerDesc, Target_Address_LastVisitOn, Target_Address_NextVisitOn, // Target delivery addresses. [27-Jan-2016 Association import for Cadix] Target_DeliveryAddress_Postcode, Target_DeliveryAddress_AccountManagerCode, Target_DeliveryAddress_ContactAreaCode, // Associated members. [17-Nov-10] Member_Type, Member_TypeDesc, Member_Code, Member_ExtRef, Member_Role, Member_Location, Member_PhoneMain, Member_Email, Member_Target_Name, Member_Target_Nature, Member_Target_PhoneMain, Member_Target_PhoneAlt, Member_Target_PhoneFax, Member_Target_PhoneMobile, Member_Target_Email, Member_Target_Website, Member_Target_Notes, Member_Target_Address_Summary, Member_Target_Address_Line1, Member_Target_Address_Line2, Member_Target_Address_City, Member_Target_Address_Province, Member_Target_Address_Postcode, Member_Target_Address_Country, Trans_LastSaleRaised, // Most recent sales order opened date. Trans_SalesValue_Open, // Net open sales order value. Trans_SalesValue_Cytd, // Net sales order value closed this calendar year. Trans_SalesValue_Lcy, // Net sales order value closed last calendar year. CommodityCount, // Count of commodities defined against association (customer or supplier). LastColumn, // Must be last in list (ref. SapProcAssociationImport). // Common properties. Notes, Flag, Status, Status_Ind, Status_Desc, CreateOn_Date, UpdateOn_Date, } //------------------------------------------------------------------- /// Properties other than common. public class DataProperties { public SysId AffiliateIdOwner { get; set; } = new SysId(); public SysId AffiliateIdTarget { get; set; } = new SysId(); public Sbm.AssociationType AssociationType { get; set; } public String Code { get; set; } = ""; public String RefExt { get; set; } = ""; public String Location { get; set; } = ""; public String Role { get; set; } = ""; public String PhoneMain { get; set; } = ""; public String Email { get; set; } = ""; public String Group { get; set; } = ""; public String DescDetail { get; set; } = ""; public String DefaultNominalCode { get; set; } = ""; // Account. public String AccountManagerCode { get; set; } = ""; public String AccountHandlerCode { get; set; } = ""; public String AccountTypeCode { get; set; } = ""; public String AccountRatingCode { get; set; } = ""; // Contact. public String ContactAreaCode { get; set; } = ""; public String ContactHandlerCode { get; set; } = ""; public String ContactMethodCode { get; set; } = ""; public String ContactCallCycleCode { get; set; } = ""; public int CallsPerYear { get; set; } = 0; public DateTime LastCall { get; set; } = DateTime.MinValue; // Customer. public SysId CommodityIdSalesDefault { get; set; } = new SysId(); public String OrderLeadTimeCode { get; set; } = ""; public String DeliveryTypeCode { get; set; } = ""; public String DeliveryMethodCode { get; set; } = ""; public String DeliveryCourierCode { get; set; } = ""; public String DeliveryBookInCode { get; set; } = ""; // Transactions. public decimal AmountTransMax { get; set; } = 0.0m; public decimal AnnualSalesTarget { get; set; } = 0.0m; public decimal CreditLimit { get; set; } = 0.0m; public decimal AccountBalance { get; set; } = 0.0m; public Sbm.DiscountType DiscountType { get; set; } = Sbm.DiscountType.NoDiscount; public decimal DiscountRate { get; set; } = 0.0m; public SysId PriceSetId { get; set; } = new SysId(); public SysId TaxCodeId { get; set; } = new SysId(); public short PaymentTerms { get; set; } = 0; public String InvoiceDesc { get; set; } = ""; public DateTime Terminated { get; set; } = DateTime.MinValue; } // 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 Sbm.AssociationType AssociationType { get { return data.AssociationType; } set { CheckChanged((int)data.AssociationType, (int)value); data.AssociationType = value; } } public String Code { get { return data.Code; } set { CheckChanged(data.Code, value); data.Code = value; } } public String RefExt { get { return data.RefExt; } set { CheckChanged(data.RefExt, value); data.RefExt = value; } } public String Location { get { return data.Location; } set { CheckChanged(data.Location, value); data.Location = value; } } public String Role { get { return data.Role; } set { CheckChanged(data.Role, value); data.Role = value; } } public String PhoneMain { get { return data.PhoneMain; } set { CheckChanged(data.PhoneMain, value); data.PhoneMain = value; } } public String Email { get { return data.Email; } set { CheckChanged(data.Email, value); data.Email = value; } } public String Group { get { return data.Group; } set { CheckChanged(data.Group, value); data.Group = value; } } public String DescDetail { get { return data.DescDetail; } set { CheckChanged(data.DescDetail, value); data.DescDetail = value; } } public String DefaultNominalCode { get { return data.DefaultNominalCode; } set { CheckChanged(data.DefaultNominalCode, value); data.DefaultNominalCode = value; } } // Account. public String AccountManagerCode { get { return data.AccountManagerCode; } set { CheckChanged(data.AccountManagerCode, value); data.AccountManagerCode = value; } } public String AccountHandlerCode { get { return data.AccountHandlerCode; } set { CheckChanged(data.AccountHandlerCode, value); data.AccountHandlerCode = value; } } public String AccountTypeCode { get { return data.AccountTypeCode; } set { CheckChanged(data.AccountTypeCode, value); data.AccountTypeCode = value; } } public String AccountRatingCode { get { return data.AccountRatingCode; } set { CheckChanged(data.AccountRatingCode, value); data.AccountRatingCode = value; } } // Contact. public String ContactAreaCode { get { return data.ContactAreaCode; } set { CheckChanged(data.ContactAreaCode, value); data.ContactAreaCode = value; } } public String ContactHandlerCode { get { return data.ContactHandlerCode; } set { CheckChanged(data.ContactHandlerCode, value); data.ContactHandlerCode = value; } } public String ContactMethodCode { get { return data.ContactMethodCode; } set { CheckChanged(data.ContactMethodCode, value); data.ContactMethodCode = value; } } public String ContactCallCycleCode { get { return data.ContactCallCycleCode; } set { CheckChanged(data.ContactCallCycleCode, value); data.ContactCallCycleCode = value; } } public int CallsPerYear { get { return data.CallsPerYear; } set { CheckChanged(data.CallsPerYear, value); data.CallsPerYear = value; } } public DateTime LastCall { get { return data.LastCall; } set { CheckChanged(data.LastCall, value); data.LastCall = value; } } // Customer. public SysId CommodityIdSalesDefault { get { return data.CommodityIdSalesDefault; } set { CheckChanged(data.CommodityIdSalesDefault, value); data.CommodityIdSalesDefault = value; } } public String OrderLeadTimeCode { get { return data.OrderLeadTimeCode; } set { CheckChanged(data.OrderLeadTimeCode, value); data.OrderLeadTimeCode = value; } } public String DeliveryTypeCode { get { return data.DeliveryTypeCode; } set { CheckChanged(data.DeliveryTypeCode, value); data.DeliveryTypeCode = value; } } public String DeliveryMethodCode { get { return data.DeliveryMethodCode; } set { CheckChanged(data.DeliveryMethodCode, value); data.DeliveryMethodCode = value; } } public String DeliveryCourierCode { get { return data.DeliveryCourierCode; } set { CheckChanged(data.DeliveryCourierCode, value); data.DeliveryCourierCode = value; } } public String DeliveryBookInCode { get { return data.DeliveryBookInCode; } set { CheckChanged(data.DeliveryBookInCode, value); data.DeliveryBookInCode = value; } } // Transactions. public decimal AmountTransMax { get { return data.AmountTransMax; } set { CheckChanged(data.AmountTransMax, value); data.AmountTransMax = value; } } public decimal AnnualSalesTarget { get { return data.AnnualSalesTarget; } set { CheckChanged(data.AnnualSalesTarget, value); data.AnnualSalesTarget = value; } } public decimal CreditLimit { get { return data.CreditLimit; } set { CheckChanged(data.CreditLimit, value); data.CreditLimit = value; } } public decimal AccountBalance { get { return data.AccountBalance; } set { CheckChanged(data.AccountBalance, value); data.AccountBalance = value; } } public Sbm.DiscountType DiscountType { get { return data.DiscountType; } set { CheckChanged((int)data.DiscountType, (int)value); data.DiscountType = value; } } public decimal DiscountRate { get { return data.DiscountRate; } set { CheckChanged(data.DiscountRate, value); data.DiscountRate = value; } } public SysId PriceSetId { get { return data.PriceSetId; } set { CheckChanged(data.PriceSetId, value); data.PriceSetId = value; } } public SysId TaxCodeId { get { return data.TaxCodeId; } set { CheckChanged(data.TaxCodeId, value); data.TaxCodeId = value; } } public short PaymentTerms { get { return data.PaymentTerms; } set { CheckChanged(data.PaymentTerms, value); data.PaymentTerms = value; } } public String InvoiceDesc { get { return data.InvoiceDesc; } set { CheckChanged(data.InvoiceDesc, value); data.InvoiceDesc = value; } } public DateTime Terminated { get { return data.Terminated; } set { CheckChanged(data.Terminated, value); data.Terminated = value; } } internal void PopulateFrom(Data data) { AffiliateIdOwner = data.AffiliateIdOwner; AffiliateIdTarget = data.AffiliateIdTarget; AssociationType = data.AssociationType; Code = data.Code; RefExt = data.RefExt; Location = data.Location; Role = data.Role; PhoneMain = data.PhoneMain; Email = data.Email; Group = data.Group; DescDetail = data.DescDetail; DefaultNominalCode = data.DefaultNominalCode; // Account. AccountManagerCode = data.AccountManagerCode; AccountHandlerCode = data.AccountHandlerCode; AccountTypeCode = data.AccountTypeCode; AccountRatingCode = data.AccountRatingCode; // Contact. ContactAreaCode = data.ContactAreaCode; ContactHandlerCode = data.ContactHandlerCode; ContactMethodCode = data.ContactMethodCode; ContactCallCycleCode = data.ContactCallCycleCode; CallsPerYear = data.CallsPerYear; LastCall = data.LastCall; // Customer. CommodityIdSalesDefault = data.CommodityIdSalesDefault; OrderLeadTimeCode = data.OrderLeadTimeCode; DeliveryTypeCode = data.DeliveryTypeCode; DeliveryMethodCode = data.DeliveryMethodCode; DeliveryCourierCode = data.DeliveryCourierCode; DeliveryBookInCode = data.DeliveryBookInCode; // Transactions. AmountTransMax = data.AmountTransMax; AnnualSalesTarget = data.AnnualSalesTarget; CreditLimit = data.CreditLimit; AccountBalance = data.AccountBalance; DiscountType = data.DiscountType; DiscountRate = data.DiscountRate; PriceSetId = data.PriceSetId; TaxCodeId = data.TaxCodeId; PaymentTerms = data.PaymentTerms; InvoiceDesc = data.InvoiceDesc; Terminated = data.Terminated; 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 AffiliateIdOwner { get; set; } = ValidValue.Valid; public ValidValue AffiliateIdTarget { get; set; } = ValidValue.Valid; public ValidValue AssociationType { get; set; } = ValidValue.Valid; public ValidValue Code { get; set; } = ValidValue.Valid; public ValidValue RefExt { get; set; } = ValidValue.Valid; public ValidValue Location { get; set; } = ValidValue.Valid; public ValidValue Role { get; set; } = ValidValue.Valid; public ValidValue PhoneMain { get; set; } = ValidValue.Valid; public ValidValue Email { get; set; } = ValidValue.Valid; public ValidValue Group { get; set; } = ValidValue.Valid; public ValidValue DescDetail { get; set; } = ValidValue.Valid; public ValidValue DefaultNominalCode { get; set; } = ValidValue.Valid; public ValidValue AccountManagerCode { get; set; } = ValidValue.Valid; public ValidValue AccountHandlerCode { get; set; } = ValidValue.Valid; public ValidValue AccountTypeCode { get; set; } = ValidValue.Valid; public ValidValue AccountRatingCode { get; set; } = ValidValue.Valid; public ValidValue ContactAreaCode { get; set; } = ValidValue.Valid; public ValidValue ContactHandlerCode { get; set; } = ValidValue.Valid; public ValidValue ContactMethodCode { get; set; } = ValidValue.Valid; public ValidValue ContactCallCycleCode { get; set; } = ValidValue.Valid; public ValidValue CallsPerYear { get; set; } = ValidValue.Valid; public ValidValue LastCall { get; set; } = ValidValue.Valid; public ValidValue CommodityIdSalesDefault { get; set; } = ValidValue.Valid; public ValidValue OrderLeadTimeCode { get; set; } = ValidValue.Valid; public ValidValue DeliveryTypeCode { get; set; } = ValidValue.Valid; public ValidValue DeliveryMethodCode { get; set; } = ValidValue.Valid; public ValidValue DeliveryCourierCode { get; set; } = ValidValue.Valid; public ValidValue DeliveryBookInCode { get; set; } = ValidValue.Valid; public ValidValue AmountTransMax { get; set; } = ValidValue.Valid; public ValidValue AnnualSalesTarget { get; set; } = ValidValue.Valid; public ValidValue CreditLimit { get; set; } = ValidValue.Valid; public ValidValue AccountBalance { get; set; } = ValidValue.Valid; public ValidValue DiscountType { get; set; } = ValidValue.Valid; public ValidValue DiscountRate { get; set; } = ValidValue.Valid; public ValidValue PriceSetId { get; set; } = ValidValue.Valid; public ValidValue TaxCodeId { get; set; } = ValidValue.Valid; public ValidValue PaymentTerms { get; set; } = ValidValue.Valid; public ValidValue InvoiceDesc { get; set; } = ValidValue.Valid; public ValidValue Terminated { get; set; } = ValidValue.Valid; } //------------------------------------------------------------------- // Data members. private readonly Data data = new Data(); public static readonly Byte Flag_Supervised = 0x01; public static readonly Byte Flag_Primary = 0x02; public static readonly Byte Flag_AccountOnHold = 0x03; public static readonly Byte Flag_Technician = 0x04; public static readonly Byte Flag_TaxCodeOverridden = 0x05; //------------------------------------------------------------------- // Construction. protected SbmAssociation(SysId id, SysId affiliateIdOwner, Sbm.AssociationType associationType, SysId affiliateIdTarget) : base(id) { base.SetData(data); AffiliateIdOwner = affiliateIdOwner; AssociationType = associationType; AffiliateIdTarget = affiliateIdTarget; Status = DefaultStatus; } //------------------------------------------------------------------- // Association status. private static readonly List associationStatuses = new List() { SaStatus.Current, SaStatus.OnHold, SaStatus.Disabled, }; public static SaStatus DefaultStatus { get { return SaStatus.Current; } } public static List ValidStatuses { get { return new List(associationStatuses); } } 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. public SbmItemId GetItemId() { return new SbmItemId(Sbm.ItemType.Association, Id); } // Association type. public static bool TypeIsValid(Sbm.AssociationType associationType) { return (associationType > 0); } public bool TypeIsValid() { return TypeIsValid(AssociationType); } public bool IsOfType(Sbm.AssociationType associationType) { return AssociationType == associationType; } public static bool IsCustomer(Sbm.AssociationType associationType) { return associationType == Sbm.AssociationType.Customer; } public static bool IsSupplier(Sbm.AssociationType associationType) { return associationType == Sbm.AssociationType.Supplier; } public bool IsInternal() { return IsOfType(Sbm.AssociationType.Internal); } public bool IsCustomer() { return IsOfType(Sbm.AssociationType.Customer); } public bool IsSupplier() { return IsOfType(Sbm.AssociationType.Supplier); } public bool IsAssociate() { return IsOfType(Sbm.AssociationType.Associate); } public bool IsMember() { return IsOfType(Sbm.AssociationType.Member); } //------------------------------------------------------------------- // 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 Sbm.AssociationType AssociationType { get { return data.AssociationType; } set { data.AssociationType = value; } } public String Code { get { return data.Code; } set { data.Code = value; } } public String RefExt { get { return data.RefExt; } set { data.RefExt = value; } } public String Location { get { return data.Location; } set { data.Location = value; } } public String Role { get { return data.Role; } set { data.Role = value; } } public String PhoneMain { get { return data.PhoneMain; } set { data.PhoneMain = value; } } public String Email { get { return data.Email; } set { data.Email = value; } } public String Group { get { return data.Group; } set { data.Group = value; } } public String DescDetail { get { return data.DescDetail; } set { data.DescDetail = value; } } // Codes. public String DefaultNominalCode { get { return data.DefaultNominalCode; } set { data.DefaultNominalCode = value; } } public String AccountManagerCode { get { return data.AccountManagerCode; } set { data.AccountManagerCode = value; } } public String AccountHandlerCode { get { return data.AccountHandlerCode; } set { data.AccountHandlerCode = value; } } public String AccountTypeCode { get { return data.AccountTypeCode; } set { data.AccountTypeCode = value; } } public String AccountRatingCode { get { return data.AccountRatingCode; } set { data.AccountRatingCode = value; } } public String ContactAreaCode { get { return data.ContactAreaCode; } set { data.ContactAreaCode = value; } } public String ContactHandlerCode { get { return data.ContactHandlerCode; } set { data.ContactHandlerCode = value; } } public String ContactMethodCode { get { return data.ContactMethodCode; } set { data.ContactMethodCode = value; } } public String ContactCallCycleCode { get { return data.ContactCallCycleCode; } set { data.ContactCallCycleCode = value; } } public int CallsPerYear { get { return data.CallsPerYear; } set { data.CallsPerYear = value; } } public DateTime LastCall { get { return data.LastCall; } set { data.LastCall = value; } } public SysId CommodityIdSalesDefault { get { return data.CommodityIdSalesDefault; } set { data.CommodityIdSalesDefault = value; } } public String OrderLeadTimeCode { get { return data.OrderLeadTimeCode; } set { data.OrderLeadTimeCode = value; } } public String DeliveryTypeCode { get { return data.DeliveryTypeCode; } set { data.DeliveryTypeCode = value; } } public String DeliveryMethodCode { get { return data.DeliveryMethodCode; } set { data.DeliveryMethodCode = value; } } public String DeliveryCourierCode { get { return data.DeliveryCourierCode; } set { data.DeliveryCourierCode = value; } } public String DeliveryBookInCode { get { return data.DeliveryBookInCode; } set { data.DeliveryBookInCode = value; } } public decimal AmountTransMax { get { return data.AmountTransMax; } set { data.AmountTransMax = value; } } public decimal AnnualSalesTarget { get { return data.AnnualSalesTarget; } set { data.AnnualSalesTarget = value; } } public decimal CreditLimit { get { return data.CreditLimit; } set { data.CreditLimit = value; } } public decimal AccountBalance { get { return data.AccountBalance; } set { data.AccountBalance = value; } } public Sbm.DiscountType DiscountType { get { return data.DiscountType; } set { data.DiscountType = value; } } public decimal DiscountRate { get { return data.DiscountRate; } set { data.DiscountRate = value; } } public SysId PriceSetId { get { return data.PriceSetId; } set { data.PriceSetId = value; } } public SysId TaxCodeId { get { return data.TaxCodeId; } set { data.TaxCodeId = value; } } public short PaymentTerms { get { return data.PaymentTerms; } set { data.PaymentTerms = value; } } public String InvoiceDesc { get { return data.InvoiceDesc; } set { data.InvoiceDesc = value; } } public DateTime Terminated { get { return data.Terminated; } set { data.Terminated = value; } } public bool IsActiveStatus(SaStatus status) { switch (status) { case SaStatus.Inactive: case SaStatus.Disabled: case SaStatus.Cancelled: return false; } return true; } public bool IsActiveStatus() { return IsActiveStatus(SaStatus.Unknown); } //------------------------------------------------------------------- // Flags. public bool Supervised { get { return GetFlag(Flag_Supervised); } set { SetFlag(Flag_Supervised, value); } } public bool Primary { get { return GetFlag(Flag_Primary); } set { SetFlag(Flag_Primary, value); } } public bool AccountOnHold { get { return GetFlag(Flag_AccountOnHold); } set { SetFlag(Flag_AccountOnHold, value); } } public bool Technician { get { return GetFlag(Flag_Technician); } set { SetFlag(Flag_Technician, value); } } public bool TaxCodeOverridden { get { return GetFlag(Flag_TaxCodeOverridden); } set { SetFlag(Flag_TaxCodeOverridden, value); } } //------------------------------------------------------------------- // P a r a m s //------------------------------------------------------------------- /// Status category - to restrict associations by status. public enum StatusCat { Any = 0, CurrentOnly, OnHoldOnly, /// Current or On-hold Active, DisabledOnly, NotDeleted, DeletedOnly, } /// Parameters - used to define the filters that should be applied to a List of Association public new class Params : SacsHierarchyItem.Params { // List filtering. public HashSet IdsIncluded { get; } = new HashSet(); public HashSet IdsExcluded { get; } = new HashSet(); // Association. public Sbm.AssociationType AssociationType { get; set; } = Sbm.AssociationType.NotInternal; public SysId AffiliateIdOwner { get; set; } public SysId AffiliateIdTarget { get; set; } public SysId AffiliateIdContactGroup { get; set; } /// Generic search value - code, name, phone, website, email, address etc. public String Search { get; set; } public String Code { get; set; } public String CodePartial { get; set; } public String NameTargetFull { get; set; } public String NameTargetPartial { get; set; } public String GroupFull { get; set; } public String GroupPartial { get; set; } public String AddressPartial { get; set; } public String PostcodePartial { get; set; } public SysId PriceSetId { get; set; } // Association codes. public String DefaultNominalCodeFull { get; set; } public String DefaultNominalCodePartial { get; set; } public HashSet AccountManagerCodes { get; } = new HashSet(); public HashSet AccountHandlerCodes { get; } = new HashSet(); public HashSet AccountTypeCodes { get; } = new HashSet(); public HashSet AccountRatingCodes { get; } = new HashSet(); public HashSet ContactAreaCodes { get; } = new HashSet(); public HashSet ContactHandlerCodes { get; } = new HashSet(); public HashSet ContactMethodCodes { get; } = new HashSet(); public HashSet ContactCallCycleCodes { get; } = new HashSet(); public HashSet OrderLeadTimeCodes { get; } = new HashSet(); public HashSet DeliveryTypeCodes { get; } = new HashSet(); public HashSet DeliveryMethodCodes { get; } = new HashSet(); public HashSet DeliveryCourierCodes { get; } = new HashSet(); public HashSet DeliveryBookInCodes { get; } = new HashSet(); // Association must have a transaction of the specified type (optional) active at some time between the specified dates (one date can be specified for open ended period). /// Transaction status - Value other than 'Any' triggers transaction filter. public SbmTransaction.StatusCat TransactionStatusCat { get; set; } = SbmTransaction.StatusCat.Any; /// Has transactions of type. public Sbm.TransactionType TransactionType { get; set; } = Sbm.TransactionType.Unknown; /// Has transactions active from. public DateTime TransactionActiveFrom { get; set; } = DateTime.MinValue; /// Has transactions active up to (inclusive). public DateTime TransactionActiveTo { get; set; } = DateTime.MinValue; /// Excluded associations that are already a System Account for the specified Interface. public SysId InterfaceIdExcludeSystemAccounts { get; set; } /// Associated codes (via ItemLink) - Seasonal Category. public String SeasonalCategoryCode { get; set; } /// Target addresses public enum AddressContextType { All, Primary, Delivery }; /// Target address context - for Target Address join.NB Not included in query filter. public AddressContextType AddressContext { get; set; } = Params.AddressContextType.Primary; /// Whether association is flagged as 'supervised'. public enum AssociationSupervised { Any, Yes, No }; /// Restrict to supervised associations. public AssociationSupervised Supervised { get; set; } = AssociationSupervised.Any; /// Primary associations only. public bool PrimaryOnly { get; set; } /// Not terminated on this date. public DateTime ApplicableFrom { get; set; } /// Status category. public StatusCat StatusCat { get; set; } = StatusCat.NotDeleted; // Aliases for tables included in the query. public String Alias_Affiliate_Owner { get; set; } public String Alias_Affiliate_Target { get; set; } public String Alias_Address_Target { get; set; } public String Alias_Association_Member { get; set; } public String Alias_Address_Member { get; set; } public String Alias_PriceSet { get; set; } } } //======================================================================= // A s s o c i a t i o n D a t a L i s t //======================================================================= public static class SbmAssociationList { /// Check whether association exists/locate in list with specified Id. public static bool FindById(this List values, SysId associationId) { if (!SysId.IsValid(associationId)) return false; return values.Exists(item => item.Id.Equals(associationId)); } public static bool FindByType(this List values, String associationType) { if (StringUtil.IsEmpty(associationType)) return false; return values.Exists(item => item.AssociationType.ToString().EqualsCI(associationType)); } public static bool FindByCode(this List values, String associationCode) { if (StringUtil.IsEmpty(associationCode)) return false; return values.Exists(item => item.Code.EqualsCI(associationCode)); } public static bool FindByTypeRef(this List values, String refExt) { if (String.IsNullOrEmpty(refExt)) return false; return values.Exists(item => item.RefExt.Equals(refExt)); } } //======================================================================= }