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;*/
}
}
//=======================================================================
}