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; using System.Linq; namespace Sarand.BusinessMgr.Net.Standard.Base.Bus { //======================================================================= public abstract class SbmAddress : SbmHierarchyItem { //------------------------------------------------------------------- // Columns. public enum Column { Hidden, Pos, Id, // Address. Type_Desc, RefExt, Name, DescBrief, Summary, Line1, Line2, Line3, City, Province, Postcode, Country, Contact, Phone, Fax, Email, LastVisitOn, NextVisitOn, IsPrimary, // Common properties. Notes, Flag, Status, Status_Ind, Status_Desc, 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 Sbm.AddressType AddressType { get; set; } = Sbm.AddressType.Any; public SysId AddressIdRef { get; set; } = new SysId(); public String RefExt { get; set; } = ""; public String Name { get; set; } = ""; public String DescBrief { get; set; } = ""; public String Line1 { get; set; } = ""; public String Line2 { get; set; } = ""; public String Line3 { get; set; } = ""; public String City { get; set; } = ""; public String Province { get; set; } = ""; public String Postcode { get; set; } = ""; public String Country { get; set; } = ""; public SysId RegionIdCity { get; set; } = new SysId(); public SysId RegionIdProvince { get; set; } = new SysId(); public SysId RegionIdCountry { get; set; } = new SysId(); public String Contact { get; set; } = ""; public String Phone { get; set; } = ""; public String Fax { get; set; } = ""; public String Email { get; set; } = ""; public String AccountManagerCode { get; set; } = ""; public String AccountHandlerCode { get; set; } = ""; public String ContactAreaCode { get; set; } = ""; public String ContactHandlerCode { get; set; } = ""; public String DeliveryTypeCode { get; set; } = ""; public String DeliveryMethodCode { get; set; } = ""; public String DeliveryBookInCode { get; set; } = ""; public DateTime LastVisitOn { get; set; } = DateTime.MinValue; public DateTime NextVisitOn { get; set; } = DateTime.MinValue; // Flags. public bool IsPrimary { get; set; } public bool IncludeName { 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 { 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 SysId AddressIdRef { get { return data.AddressIdRef; } set { CheckChanged(data.AddressIdRef, value); data.AddressIdRef = value; } } public String RefExt { get { return data.RefExt; } set { CheckChanged(data.RefExt, value); data.RefExt = value; } } public Sbm.AddressType AddressType { get { return data.AddressType; } set { CheckChanged((int)data.AddressType, (int)value); data.AddressType = value; } } public String Name { get { return data.Name; } set { CheckChanged(data.Name, value); data.Name = value; } } public String DescBrief { get { return data.DescBrief; } set { CheckChanged(data.DescBrief, value); data.DescBrief = value; } } public String Line1 { get { return data.Line1; } set { CheckChanged(data.Line1, value); data.Line1 = value; } } public String Line2 { get { return data.Line2; } set { CheckChanged(data.Line2, value); data.Line2 = value; } } public String Line3 { get { return data.Line3; } set { CheckChanged(data.Line3, value); data.Line3 = value; } } public String City { get { return data.City; } set { CheckChanged(data.City, value); data.City = value; } } public String Province { get { return data.Province; } set { CheckChanged(data.Province, value); data.Province = value; } } public String Postcode { get { return data.Postcode; } set { CheckChanged(data.Postcode, value); data.Postcode = value; } } public String Country { get { return data.Country; } set { CheckChanged(data.Country, value); data.Country = value; } } public SysId RegionIdCity { get { return data.RegionIdCity; } set { CheckChanged(data.RegionIdCity, value); data.RegionIdCity = value; } } public SysId RegionIdProvince { get { return data.RegionIdProvince; } set { CheckChanged(data.RegionIdProvince, value); data.RegionIdProvince = value; } } public SysId RegionIdCountry { get { return data.RegionIdCountry; } set { CheckChanged(data.RegionIdCountry, value); data.RegionIdCountry = value; } } public String Contact { get { return data.Contact; } set { CheckChanged(data.Contact, value); data.Contact = value; } } public String Phone { get { return data.Phone; } set { CheckChanged(data.Phone, value); data.Phone = value; } } public String Fax { get { return data.Fax; } set { CheckChanged(data.Fax, value); data.Fax = value; } } public String Email { get { return data.Email; } set { CheckChanged(data.Email, value); data.Email = value; } } 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 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 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 DeliveryBookInCode { get { return data.DeliveryBookInCode; } set { CheckChanged(data.DeliveryBookInCode, value); data.DeliveryBookInCode = value; } } public DateTime LastVisitOn { get { return data.LastVisitOn; } set { CheckChanged(data.LastVisitOn, value); data.LastVisitOn = value; } } public DateTime NextVisitOn { get { return data.NextVisitOn; } set { CheckChanged(data.NextVisitOn, value); data.NextVisitOn = value; } } //------------------------------------------------------------------- // Flags. public bool IsPrimary { get { return GetFlag(Flag_Primary); } set { SetFlag(Flag_Primary, value); } } public bool IncludeName { get { return GetFlag(Flag_IncludeName); } set { SetFlag(Flag_IncludeName, value); } } internal void PopulateFrom(Data data) { ItemType = data.ItemType; ItemId = data.ItemId; AddressType = data.AddressType; AddressIdRef = data.AddressIdRef; RefExt = data.RefExt; Name = data.Name; DescBrief = data.DescBrief; Line1 = data.Line1; Line2 = data.Line2; Line3 = data.Line3; City = data.City; Province = data.Province; Postcode = data.Postcode; Country = data.Country; RegionIdCity = data.RegionIdCity; RegionIdProvince = data.RegionIdProvince; RegionIdCountry = data.RegionIdCountry; Contact = data.Contact; Phone = data.Phone; Fax = data.Fax; Email = data.Email; AccountManagerCode = data.AccountManagerCode; AccountHandlerCode = data.AccountHandlerCode; ContactAreaCode = data.ContactAreaCode; ContactHandlerCode = data.ContactHandlerCode; DeliveryMethodCode = data.DeliveryMethodCode; DeliveryTypeCode = data.DeliveryTypeCode; DeliveryBookInCode = data.DeliveryBookInCode; LastVisitOn = data.LastVisitOn; NextVisitOn = data.NextVisitOn; IsPrimary = data.IsPrimary; IncludeName = data.IncludeName; base.PopulateFrom(data); } public Data Clone() { Data data = new Data(); data.PopulateFrom(this); return data; } } //------------------------------------------------------------------- // ErrField. 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 AddressIdRef { get; set; } = ValidValue.Valid; public ValidValue RefExt { get; set; } = ValidValue.Valid; public ValidValue AddressType { get; set; } = ValidValue.Valid; public ValidValue Name { get; set; } = ValidValue.Valid; public ValidValue DescBrief { get; set; } = ValidValue.Valid; public ValidValue Line1 { get; set; } = ValidValue.Valid; public ValidValue Line2 { get; set; } = ValidValue.Valid; public ValidValue Line3 { get; set; } = ValidValue.Valid; public ValidValue City { get; set; } = ValidValue.Valid; public ValidValue Province { get; set; } = ValidValue.Valid; public ValidValue Postcode { get; set; } = ValidValue.Valid; public ValidValue Country { get; set; } = ValidValue.Valid; public ValidValue RegionIdCity { get; set; } = ValidValue.Valid; public ValidValue RegionIdProvince { get; set; } = ValidValue.Valid; public ValidValue RegionIdCountry { get; set; } = ValidValue.Valid; public ValidValue Contact { get; set; } = ValidValue.Valid; public ValidValue Phone { get; set; } = ValidValue.Valid; public ValidValue Fax { get; set; } = ValidValue.Valid; public ValidValue Email { get; set; } = ValidValue.Valid; public ValidValue AccountManagerCode { get; set; } = ValidValue.Valid; public ValidValue AccountHandlerCode { get; set; } = ValidValue.Valid; public ValidValue ContactAreaCode { get; set; } = ValidValue.Valid; public ValidValue ContactHandlerCode { get; set; } = ValidValue.Valid; public ValidValue DeliveryTypeCode { get; set; } = ValidValue.Valid; public ValidValue DeliveryMethodCode { get; set; } = ValidValue.Valid; public ValidValue DeliveryBookInCode { get; set; } = ValidValue.Valid; public ValidValue LastVisitOn { get; set; } = ValidValue.Valid; public ValidValue NextVisitOn { get; set; } = ValidValue.Valid; public ValidValue IsPrimary { get; set; } = ValidValue.Valid; public ValidValue InlcudeName { get; set; } = ValidValue.Valid; } //------------------------------------------------------------------- // Data members. private readonly Data data = new Data(); public static readonly Byte Flag_Primary = 0x01; public static readonly Byte Flag_IncludeName = 0x02; //------------------------------------------------------------------- // Construction. protected SbmAddress(SysId id, Sbm.ItemType itemType, SysId itemId, Sbm.AddressType addressType) : base(id) { base.SetData(data); ItemType = itemType; ItemId = itemId; AddressType = addressType; Status = DefaultStatus; } //------------------------------------------------------------------- // Address status. private static readonly List addressStatuses = new List() { SaStatus.Current, }; public static SaStatus DefaultStatus { get { return SaStatus.Current; } } public static List AddressStatuses { get { return new List(addressStatuses); } } public static DataValue.TriStateType GetStatusTriState(SaStatus status) { addressStatuses.Add(SaStatus.Current); switch (status) { case SaStatus.Current: return DataValue.TriStateType.Green; } return DataValue.TriStateType.Unknown; } //------------------------------------------------------------------- // Formatting. public enum AddressFmt { ScreenList, Clipboard, } public List Format(AddressFmt addressFmt) { return Format(GetData(), addressFmt); } public static List Format(SbmAddress address, AddressFmt addressFmt) { return Format(address.GetData(), addressFmt); } public static List Format(SbmAddress.Data address, AddressFmt addressFmt) { List addressLines = new List(); switch (addressFmt) { case AddressFmt.ScreenList: case AddressFmt.Clipboard: { if (addressFmt == AddressFmt.ScreenList || address.IncludeName && StringUtil.IsEmpty(address.Name)) addressLines.Add(address.Name); addressLines.Add(address.Line1); addressLines.Add(address.Line2); addressLines.Add(address.Line3); addressLines.Add(address.City); String provincePostcode = address.Province + " " + address.Postcode; provincePostcode.Trim(); addressLines.Add(provincePostcode); addressLines.Add(address.Country); // Trim leading and trailing spaces from each line and trailing commas. for (int addressLineIdx = 0; addressLineIdx < addressLines.Count; addressLineIdx++) { String addressLine = addressLines[addressLineIdx]; addressLine.Trim(new char[] { ',', ' ' }); } break; } } addressLines.RemoveBlanks(); return addressLines; } //------------------------------------------------------------------- // Utilities. public SbmItemId GetItemId() { return new SbmItemId(Sbm.ItemType.Address, Id); } // Address display. public String GetDisplay() { return GetDisplay(Line1, Line2, Line3, City, Province, Postcode, Country); } public static String GetDisplay(String line1, String line2, String line3, String city, String province, String postcode, String country) { List lines = new List() { line1, line2, line3, city, province }; return StringUtil.TrimWhitespace(lines.Concat(", ", null, null, true, true).ToString() + " " + postcode + " " + country); } // Address summary. public String GetSummary() { return GetSummary(Line1, City, Province, Postcode, Country); } public static String GetSummary(String line1, String city, String province, String postcode, String country) { List lines = new List() { line1, city, province }; return StringUtil.TrimWhitespace(lines.Concat(", ", null, null, true, true).ToString() + " " + postcode + " " + country); } // Visit on. public bool IsVisitOn(DateTime visitDate) { if (DateUtil.IsValid(LastVisitOn) && LastVisitOn.CompareTo(visitDate) > 0) return false; if (DateUtil.IsValid(NextVisitOn) && NextVisitOn.CompareTo(visitDate) < 0) return false; return true; } //------------------------------------------------------------------- // Properties. public Data GetData() { return data.Clone(); } public void SetData(Data data) { // Properties that cannot be changed if previously specified. // Id. if (SysId.IsValid(Id) && SysId.ToInt(Id) != SysId.ToInt(data.Id)) throw new NotSupportedException($"{SysUtil.Fn} Id cannot be changed"); // Item type. if ((int)ItemType > 1 && ItemType != data.ItemType) throw new NotSupportedException($"{SysUtil.Fn} Item Type cannot be changed"); // Item Id. if (SysId.IsValid(ItemId) && SysId.ToInt(ItemId) != SysId.ToInt(data.ItemId)) throw new NotSupportedException($"{SysUtil.Fn} Item 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; } protected set { data.ItemType = value; } } public SysId ItemId { get { return data.ItemId; } protected set { data.ItemId = value; } } public SysId AddressIdRef { get { return data.AddressIdRef; } set { data.AddressIdRef = value; } } public String RefExt { get { return data.RefExt; } set { data.RefExt = value; } } public Sbm.AddressType AddressType { get { return data.AddressType; } set { data.AddressType = value; } } public String Name { get { return data.Name; } set { data.Name = value; } } public String DescBrief { get { return data.DescBrief; } set { data.DescBrief = value; } } public String Line1 { get { return data.Line1; } set { data.Line1 = value; } } public String Line2 { get { return data.Line2; } set { data.Line2 = value; } } public String Line3 { get { return data.Line3; } set { data.Line3 = value; } } public String City { get { return data.City; } set { data.City = value; } } public String Province { get { return data.Province; } set { data.Province = value; } } public String Postcode { get { return data.Postcode; } set { data.Postcode = value; } } public String Country { get { return data.Country; } set { data.Country = value; } } public SysId RegionIdCity { get { return data.RegionIdCity; } set { data.RegionIdCity = value; } } public SysId RegionIdProvince { get { return data.RegionIdProvince; } set { data.RegionIdProvince = value; } } public SysId RegionIdCountry { get { return data.RegionIdCountry; } set { data.RegionIdCountry = value; } } public String Contact { get { return data.Contact; } set { data.Contact = value; } } public String Phone { get { return data.Phone; } set { data.Phone = value; } } public String Fax { get { return data.Fax; } set { data.Fax = value; } } public String Email { get { return data.Email; } set { data.Email = 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 ContactAreaCode { get { return data.ContactAreaCode; } set { data.ContactAreaCode = value; } } public String ContactHandlerCode { get { return data.ContactHandlerCode; } set { data.ContactHandlerCode = 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 DeliveryBookInCode { get { return data.DeliveryBookInCode; } set { data.DeliveryBookInCode = value; } } public DateTime LastVisitOn { get { return data.LastVisitOn; } set { data.LastVisitOn = value; } } public DateTime NextVisitOn { get { return data.NextVisitOn; } set { data.NextVisitOn = value; } } //------------------------------------------------------------------- // Flags. public bool IsPrimary { get { return GetFlag(Flag_Primary); } set { SetFlag(Flag_Primary, value); } } public bool IncludeName { get { return GetFlag(Flag_IncludeName); } set { SetFlag(Flag_IncludeName, value); } } //------------------------------------------------------------------- // C o p y F r o m //------------------------------------------------------------------- public void CopyFrom(SbmAddress address) { AddressIdRef = address.AddressIdRef; AddressType = address.AddressType; RefExt = address.RefExt; Name = address.Name; DescBrief = address.DescBrief; Line1 = address.Line1; Line2 = address.Line2; Line3 = address.Line3; City = address.City; Province = address.Province; Postcode = address.Postcode; Country = address.Country; RegionIdCity = address.RegionIdCity; RegionIdProvince = address.RegionIdProvince; RegionIdCountry = address.RegionIdCountry; Contact = address.Contact; Phone = address.Phone; Fax = address.Fax; Email = address.Email; } //------------------------------------------------------------------- // P a r a m s //------------------------------------------------------------------- /// Parameters - used to define the filters that should be applied to a List of Addresses // List parameters. public enum StatusCat { Any, NotDeleted, Deleted, } /// /// Item list parameters. /// public new class Params : SacsHierarchyItem.Params { // List filtering. public HashSet IdsIncluded { get; } = new HashSet(); public HashSet IdsExcluded { get; } = new HashSet(); // Address. public Sbm.AddressType AddressType { get; set; } public ItemId ItemId { get; set; } public SysId AffiliateIdOwner { get; set; } public SysId AddressIdRef { get; set; } public String RefExt { get; set; } public String Name { get; set; } public String NamePartial { get; set; } public String Address { get; set; } public String AddressPartial { get; set; } public String Postcode { get; set; } public String PostcodePartial { get; set; } public String Phone { get; set; } public String PhonePartial { get; set; } public String AccountManagerCode { get; set; } public String AccountHandlerCode { get; set; } public String ContactAreaCode { get; set; } public String ContactHandlerCode { get; set; } public String DeliveryTypeCode { get; set; } public String DeliveryBookInCode { get; set; } public bool PrimaryOnly { get; set; } public StatusCat StatusCat { get; set; } = StatusCat.NotDeleted; } //------------------------------------------------------------------- } //======================================================================= // A d d r e s s D a t a L i s t //======================================================================= public static class SbmAddressList { /// Check whether item exists/locate in list with specified Id. public static bool FindPrimary(this List values, bool IsPrimary) { if (!IsPrimary) return false; return values.Any(item => item.IsPrimary.Equals(IsPrimary)); } public static bool FindById(this List values, SysId addressId) { if (!SysId.IsValid(addressId)) return false; return values.Any(item => item.Id.Equals(addressId)); } public static bool FindByType(this List values, String addressType) { if (StringUtil.IsEmpty(addressType)) return false; return values.Any(item => item.AddressType.ToString().EqualsCI(addressType)); } public static bool FindByTypeRef(this List values, String refExt) { if (String.IsNullOrEmpty(refExt)) return false; return values.Any(item => item.RefExt.Equals(refExt)); } public static bool FindByPostcode(this List values, String postcode) { if (String.IsNullOrEmpty(postcode)) return false; return values.Any(item => item.Postcode.Equals(postcode)); } public static bool FindByTypeVisitOn(this List values, String type, DateTime visitOn) { if (StringUtil.IsEmpty(type)) return false; if (!DateUtil.IsValid(visitOn)) return false; return values.Any(item => item.AddressType.Equals(type) && item.IsVisitOn(visitOn)); } public static bool HasType(this List values, Sbm.AddressType addressType, SbmAddress addressIgnore) { return values.Any(address => address.AddressType == addressType && address != addressIgnore); } public static bool HasType(this List values, Sbm.AddressType addressType, SysId addressIdIgnore) { return values.Any(address => address.AddressType == addressType && !SysId.IsValid(addressIdIgnore) || address.Id != addressIdIgnore); } public static int OccurrencesOf(this List values, Sbm.AddressType addressType) { // How many addresses of the specified type are in the list? return values.Count(address => address.AddressType == addressType); } public static int OccurrencesOfType(this List values) { // Which occurrence of addresses of the same type is the specified position in the list? int iOccur = 1; // Move to this item in the list for (int i = 1; i < values.Count; i++) foreach (SbmAddress address in values) { Sbm.AddressType addressType = Sbm.AddressType.Any; if (address.AddressType == addressType) iOccur++; } return iOccur; /* // Which occurrence of addresses of the same type is the specified position in the list? int iOccur = 1; // Move to this item in the list: if (iPos > -1) Goto(iPos); iPos = Pos(); if (InLst() && Index()) { // Make a note of the type of the specified address: eSapAddressType eType = Index()->GetType(); GotoStart(); while (Next() && Pos() != iPos) if (Index() && Index()->GetType() == eType) iOccur++; Goto(iPos); } return iOccur;*/ } } //======================================================================= }