using Sarand.BusinessMgr.Net.Standard.Base.App; using Sarand.BusinessMgr.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Dbas; using Sarand.Net.Standard.Base.Utils; using System; using System.Collections.Generic; using System.Linq; namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr { //======================================================================= // Account manager - Addresses. //======================================================================= partial class SbmAccountMgr { //------------------------------------------------------------------- // Utilities. //public override SbmAddress CloneAddress(SbmAddress addressSource, bool copyId, DbUpdateInfo dbUpdateInfo) public abstract bool VerifyAsPrimaryAddress(SbmAddress addressPrimary, DbUpdateInfo dbUpdateInfo); // Associate data. public abstract bool AddressHasInterfaceDataItems(SbmAddress address); public abstract bool ClearAddressDependentData(SbmAddress address, DbUpdateInfo dbUpdateInfo); //------------------------------------------------------------------- // Retrieve individual addresses. //------------------------------------------------------------------- // Address exists. public bool AddressExistsById(SysId addressId) { ClearErrorState(); if (!SysId.IsValid(addressId)) return false; SbmAddress.Params prmAddress = new SbmAddress.Params(); prmAddress.IdsIncluded.Add(addressId); prmAddress.StatusCat = SbmAddress.StatusCat.Any; return GetAddressCount(prmAddress) == 1; } //------------------------------------------------------------------- // Get address. public abstract SbmAddress GetAddress(SbmAddress.Params prm); public SbmAddress GetAddressById(SysId addressId) { ClearErrorState(); if (!SysId.IsValid(addressId)) return null; SbmAddress.Params prmAddress = new SbmAddress.Params(); prmAddress.IdsIncluded.Add(addressId); prmAddress.StatusCat = SbmAddress.StatusCat.Any; return GetAddress(prmAddress); } //------------------------------------------------------------------- // Create address. public abstract SbmAddress CreateAddress(Sbm.ItemType itemType, SysId idItem, Sbm.AddressType addressType); //------------------------------------------------------------------- // Validate address data. public bool IsValidAddress(SbmAddress address) { ClearErrorState(); if (address == null) return SetErrorState(ErrorMessage.ItemNotSpecified); return IsValidAddressData(address.GetData(), new SbmAddress.ErrField()); } public virtual bool IsValidAddressData(SbmAddress.Data data, SbmAddress.ErrField errField) { ClearErrorState(); // Address properties. if (errField.ItemType != SacsHierarchyItem.ValidValue.Ignore) { if ((int)data.ItemType < 1) { errField.ItemType = SacsHierarchyItem.ValidValue.Invalid; return SetErrorState(ErrorMessage.ItemTypeNotSpecified); } } if (errField.ItemId != SacsHierarchyItem.ValidValue.Ignore) { if (!SysId.IsValid(data.ItemId)) { errField.ItemId = SacsHierarchyItem.ValidValue.Invalid; return SetErrorState(ErrorMessage.ItemIdNotSpecified); } } if (errField.AddressType != SacsHierarchyItem.ValidValue.Ignore) { if ((int)data.AddressType < 1) { errField.AddressType = SacsHierarchyItem.ValidValue.Invalid; return SetErrorState("Address type must be supplied"); } } if (errField.RefExt != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.RefExt, "reference", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Address_RefExt))) { errField.RefExt = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.Name != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Name, "name", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Address_Name))) { errField.Name = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.DescBrief != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.DescBrief, "description", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Address_DescBrief))) { errField.DescBrief = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.Line1 != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Line1, "line 1", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Address_Line1), true)) { errField.Line1 = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.Line2 != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Line2, "line 2", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Address_Line2))) { errField.Line2 = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.Line3 != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Line3, "line 3", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Address_Line3))) { errField.Line3 = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.City != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.City, "city", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Address_City))) { errField.City = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.Province != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Province, "province", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Address_Province))) { errField.Province = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.Postcode != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Postcode, "postcode", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Address_Postcode))) { errField.Postcode = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.Country != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Country, "country", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Address_Country))) { errField.Country = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.Contact != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Contact, "contact", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Address_Contact))) { errField.Contact = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.Phone != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Phone, "phone", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Address_Phone))) { errField.Phone = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.Fax != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Fax, "fax", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Address_Fax))) { errField.Fax = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.Email != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Email, "email", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Address_Email))) { errField.Email = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.AccountManagerCode != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.AccountManagerCode, " account manager phone", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Address_AccountManagerCode))) { errField.AccountManagerCode = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.AccountHandlerCode != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.AccountHandlerCode, "account handler phone", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Address_AccountHandlerCode))) { errField.AccountHandlerCode = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.ContactAreaCode != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.ContactAreaCode, "contact area phone", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Address_ContactAreaCode))) { errField.ContactAreaCode = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.ContactHandlerCode != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.ContactHandlerCode, "contact handler phone", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Address_ContactHandlerCode))) { errField.ContactHandlerCode = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.DeliveryTypeCode != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.DeliveryTypeCode, "delivery type code", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Address_DeliveryTypeCode))) { errField.DeliveryTypeCode = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.DeliveryBookInCode != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.DeliveryBookInCode, "delivery book-in code", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Address_DeliveryBookInCode))) { errField.DeliveryBookInCode = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.LastVisitOn != SacsHierarchyItem.ValidValue.Ignore && errField.NextVisitOn != SacsHierarchyItem.ValidValue.Ignore && DateUtil.IsValid(data.LastVisitOn) && DateUtil.IsValid(data.NextVisitOn)) { if (data.LastVisitOn.CompareTo(data.NextVisitOn) > 0) { errField.LastVisitOn = SacsHierarchyItem.ValidValue.Invalid; return SetErrorState("Invalid visit date range"); } } // Common properties. if (!IsValidValue(data.Notes, "notes", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Address_Notes))) { errField.Notes = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.Status != SacsHierarchyItem.ValidValue.Ignore) { if (!IsValidValue(data.StatusCode, "status", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Address_Status), true, true)) { errField.Status = SacsHierarchyItem.ValidValue.Invalid; return false; } if (!SbmAddress.ValidStatuses.Contains(data.Status)) { errField.Status = SacsHierarchyItem.ValidValue.Invalid; return SetErrorState(ErrorMessage.InvalidStatus); } } // Validate associated data. if (errField.AddressIdRef != SacsHierarchyItem.ValidValue.Ignore && SysId.IsValid(data.AddressIdRef)) { errField.AddressIdRef = SacsHierarchyItem.ValidValue.Invalid; return SetErrorState("Invalid Reference Address Id specified"); } if (errField.RegionIdCity != SacsHierarchyItem.ValidValue.Ignore && SysId.IsValid(data.RegionIdCity)) { errField.RegionIdCity = SacsHierarchyItem.ValidValue.Invalid; return SetErrorState("Invalid City Region Id specified"); } if (errField.RegionIdProvince != SacsHierarchyItem.ValidValue.Ignore && SysId.IsValid(data.RegionIdProvince)) { errField.RegionIdProvince = SacsHierarchyItem.ValidValue.Invalid; return SetErrorState("Invalid Province Region Id specified"); } if (errField.RegionIdCountry != SacsHierarchyItem.ValidValue.Ignore && SysId.IsValid(data.RegionIdCountry)) { errField.RegionIdCountry = SacsHierarchyItem.ValidValue.Invalid; return SetErrorState("Invalid Country Region Id specified"); } return true; } //------------------------------------------------------------------- // Address database interface. public abstract bool InsertAddress(SbmAddress address, DbUpdateInfo dbUpdateInfo); public abstract bool UpdateAddress(SbmAddress address, DbUpdateInfo dbUpdateInfo); public virtual bool AddressCanBeDeleted(SbmAddress address) { ClearErrorState(); return true; } public abstract bool DeleteAddress(SbmAddress address, DbUpdateInfo dbUpdateInfo); //------------------------------------------------------------------- // Address list. public abstract ColumnDfn GetAddressColumnDfn(SbmAddress.Column columnId, String caption = "", int width = 0); public abstract List GetAddressQueryFilter(SbmAddress.Params prm); public abstract long GetAddressCount(SbmAddress.Params prm); public abstract List GetAddressList(SbmAddress.Params prm); public abstract DbResultSet ExecuteAddressQuery(List columns, SbmAddress.Params prm); //------------------------------------------------------------------- // Item addresses. public bool HasItemAddresses(SbmItemId itemId, Sbm.AddressType addressType = Sbm.AddressType.Any, SbmAddress.StatusCat statusCat = SbmAddress.StatusCat.NotDeleted) { if (!SbmItemId.IsValid(itemId)) return false; SbmAddress.Params prm = new SbmAddress.Params { ItemId = itemId, AddressType = addressType, StatusCat = statusCat }; return (GetAddressCount(prm) > 0); } public List GetItemAddresses(SbmItemId itemId, Sbm.AddressType addressType = Sbm.AddressType.Any, SbmAddress.StatusCat statusCat = SbmAddress.StatusCat.NotDeleted) { if (!SbmItemId.IsValid(itemId)) return new List(); SbmAddress.Params prm = new SbmAddress.Params { ItemId = itemId, AddressType = addressType, StatusCat = statusCat }; return GetAddressList(prm); } //------------------------------------------------------------------- // Primary address. public SbmAddress GetPrimaryAddress(SbmItemId itemId) { if (!SbmItemId.IsValid(itemId)) return null; SbmAddress.Params prm = new SbmAddress.Params { ItemId = itemId, PrimaryOnly = true, StatusCat = SbmAddress.StatusCat.NotDeleted }; return GetAddress(prm); } /// /// Return the summary for the most appropriate address for this item. ///
- Prioritise Primary, Office addresses and by Id (earliest created). ///
- Specify address type to restrict. ///
public String GetItemAddressSummary(SbmItemId itemId, Sbm.AddressType addressType = Sbm.AddressType.Any) { // More efficient cloning logic used in Affiliate/Association/Transaction query execution. List addresses = GetItemAddresses(itemId, addressType, SbmAddress.StatusCat.NotDeleted) .Where(add => (addressType <= 0 || add.AddressType == addressType) && !add.IsStatusDeleted) .OrderBy(add => SysId.ToLong(add.Id)) .ToList(); SbmAddress address = addresses.FirstOrDefault(add => add.IsPrimary); if (address == null) address = addresses.FirstOrDefault(add => add.AddressType == Sbm.AddressType.Office); return address?.GetSummary() ?? ""; } //------------------------------------------------------------------- // Utilities. public List GetAddressesFor(SbmAddress.Params prm) { return GetAddressList(prm); } public List GetAddressesFor(SbmItemId itemId) { if (!ItemId.IsValid(itemId)) return null; SbmAddress.Params prmAddress = new SbmAddress.Params(); prmAddress.ItemId = itemId; return GetAddressList(prmAddress); } public bool ClearAddressesFor(SbmItemId itemId) { List addresses = GetAddressesFor(itemId); bool bClear = ClearAddresses(addresses); if (addresses != null) addresses.Clear(); return bClear; } public bool ClearAddresses(List addresses) { bool clear = addresses != null; if (clear) { foreach (SbmAddress addresss in addresses) { return false; } addresses.Clear(); } return clear; } public String GetRegionDesc(SysId regionId) { return FindRegionById(regionId)?.Name ?? ""; } //------------------------------------------------------------------- // D a t a V a l u e s //------------------------------------------------------------------- /// /// Extract and format result set data value where specific handling is required. /// Where response is an invalid data value, format value using column.FormatValue(values). /// public DataValue GetAddressDataValue(ColumnDfn column, NamedValue.Map values) { DataValue value = new DataValue(); switch ((SbmAddress.Column)column.Id) { //----------------------------------------------------------- // Address type description. case SbmAddress.Column.Type_Desc: { Sbm.AddressType addressType = (Sbm.AddressType)values.GetValue(column.DataName).AsLong(); value = new DataValue(AddressTypes.GetDescForType(addressType, ((int)addressType).ToString())); } break; //----------------------------------------------------------- // Address caption. case SbmAddress.Column.Caption: { String line1 = values.GetValue(GetAddressColumnDfn(SbmAddress.Column.Line1).DataName).AsString(); String city = values.GetValue(GetAddressColumnDfn(SbmAddress.Column.City).DataName).AsString(); String province = values.GetValue(GetAddressColumnDfn(SbmAddress.Column.Province).DataName).AsString(); String postcode = values.GetValue(GetAddressColumnDfn(SbmAddress.Column.Postcode).DataName).AsString(); String country = values.GetValue(GetAddressColumnDfn(SbmAddress.Column.Country).DataName).AsString(); value = new DataValue(SbmAddress.GetSummary(line1, city, province, postcode, country)); } break; //----------------------------------------------------------- // Address summary. case SbmAddress.Column.Summary: { String line1 = values.GetValue(GetAddressColumnDfn(SbmAddress.Column.Line1).DataName).AsString(); String city = values.GetValue(GetAddressColumnDfn(SbmAddress.Column.City).DataName).AsString(); String province = values.GetValue(GetAddressColumnDfn(SbmAddress.Column.Province).DataName).AsString(); String postcode = values.GetValue(GetAddressColumnDfn(SbmAddress.Column.Postcode).DataName).AsString(); String country = values.GetValue(GetAddressColumnDfn(SbmAddress.Column.Country).DataName).AsString(); value = new DataValue(SbmAddress.GetSummary(line1, city, province, postcode, country)); } break; //----------------------------------------------------------- // Notes. case SbmAddress.Column.Notes: value = new DataValue(SacsHierarchyItem.FormatForDisplay(values.GetValue(column.DataName).ToString(), 200)); break; // Status. case SbmAddress.Column.Status_Desc: case SbmAddress.Column.Status_Ind: { String statusCode = values.GetValue(column.DataName).ToString(); SaStatus status = SacsSystem.GetStatusForCode(statusCode); if (column.Id == (int)SbmAddress.Column.Status_Desc) value = new DataValue(SacsSystem.GetStatusDescForCode(statusCode)); else if (column.Id == (int)SbmAddress.Column.Status_Ind) value = new DataValue(SbmAddress.GetStatusTriState(status)); } break; //----------------------------------------------------------- default: value = values.GetValue(column.DataName); break; } return value; } //------------------------------------------------------------------- } //======================================================================= }