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; namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr { //======================================================================= partial class SbmAccountMgr { //******************************************************************* // A d d r e s s e s //******************************************************************* // Utilities. //public override SbmAddress CloneAddress(SbmAddress addressSource, bool copyId) public abstract bool VerifyAsPrimaryAddress(SbmAddress addressPrimary); //------------------------------------------------------------------- // Retrieve individual addresses. //------------------------------------------------------------------- // Address exists. public bool AddressExistsById(SysId addressId) { ClearErrorState(); if (!SysId.IsValid(addressId)) return false; SbmAddress.Params prmAddress = new SbmAddress.Params(); prmAddress.IncludedIds.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.IncludedIds.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("Item type must be supplied"); } } if (errField.ItemId != SacsHierarchyItem.ValidValue.Ignore) { if (!SysId.IsValid(data.ItemId)) { errField.ItemId = SacsHierarchyItem.ValidValue.Invalid; return SetErrorState("Item Id must be specified"); } } 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)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Address_RefExt))) { errField.RefExt = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.Name != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Name, "name", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Address_Name))) { errField.Name = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.DescBrief != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.DescBrief, "description", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Address_DescBrief))) { errField.DescBrief = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.Line1 != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Line1, "line 1", (long)SbmDbDfn.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)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Address_Line2))) { errField.Line2 = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.Line3 != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Line3, "line 3", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Address_Line3))) { errField.Line3 = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.City != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.City, "city", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Address_City))) { errField.City = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.Province != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Province, "province", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Address_Province))) { errField.Province = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.Postcode != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Postcode, "postcode", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Address_Postcode))) { errField.Postcode = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.Country != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Country, "country", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Address_Country))) { errField.Country = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.Contact != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Contact, "contact", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Address_Contact))) { errField.Contact = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.Phone != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Phone, "phone", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Address_Phone))) { errField.Phone = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.Fax != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Fax, "fax", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Address_Fax))) { errField.Fax = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.Email != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Email, "email", (long)SbmDbDfn.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)SbmDbDfn.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)SbmDbDfn.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)SbmDbDfn.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)SbmDbDfn.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)SbmDbDfn.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)SbmDbDfn.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)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Address_Notes))) { errField.Notes = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.Status != SacsHierarchyItem.ValidValue.Ignore) { if (!IsValidValue(data.StatusCode, "status", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Address_Status), true, true)) { errField.Status = SacsHierarchyItem.ValidValue.Invalid; return false; } if (!SbmAddress.AddressStatuses.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 AddressExecuteQuery(List columns, SbmAddress.Params prm); //------------------------------------------------------------------- // Item addresses. public bool HasItemAddresses(ItemId itemId, Sbm.AddressType addressType = Sbm.AddressType.Any, SbmAddress.StatusCat statusCat = SbmAddress.StatusCat.NotDeleted) { if (itemId.Type < 1 || !SysId.IsValid(itemId.Id)) return false; SbmAddress.Params prm = new SbmAddress.Params { ItemId = itemId, AddressType = addressType, StatusCat = statusCat }; return (GetAddressCount(prm) > 0); } public List GetItemAddresses(ItemId itemId, Sbm.AddressType addressType = Sbm.AddressType.Any, SbmAddress.StatusCat statusCat = SbmAddress.StatusCat.NotDeleted) { if (addressType > 0 || !SysId.IsValid(itemId.Id)) return new List(); SbmAddress.Params prm = new SbmAddress.Params { ItemId = itemId, AddressType = addressType, StatusCat = statusCat }; return GetAddressList(prm); } //------------------------------------------------------------------- // Utilities. public List GetAddressesFor(SbmAddress.Params prm) { GetAddressCount(prm); return GetAddresses(); } public List GetAddresses() { List addresses = new List(); while (true) { SbmAddress address = null; if (address == null) break; addresses.Add(address); address = null; // Do not delete - it is now owned by the list. } return addresses; } public List GetAddressesFor(Sbm.ItemType itemType, ItemId itemId) { if ((int)itemType < 1 || !ItemId.IsValid(itemId)) return null; SbmAddress.Params prmAddress = new SbmAddress.Params(); prmAddress.ItemId = itemId; GetAddressCount(prmAddress); return GetAddresses(); } public bool ClearAddressesFor(Sbm.ItemType itemType, ItemId itemId) { List addresses = GetAddressesFor(itemType, 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 summary. case SbmAddress.Column.Summary: { List addresses = new List(); addresses.Add(values.GetValue(GetAddressColumnDfn(SbmAddress.Column.Line1).DataName).AsString()); addresses.Add(values.GetValue(GetAddressColumnDfn(SbmAddress.Column.Line2).DataName).AsString()); addresses.Add(values.GetValue(GetAddressColumnDfn(SbmAddress.Column.Line3).DataName).AsString()); addresses.Add(values.GetValue(GetAddressColumnDfn(SbmAddress.Column.City).DataName).AsString()); addresses.Add(values.GetValue(GetAddressColumnDfn(SbmAddress.Column.Province).DataName).AsString()); value = new DataValue(addresses.Concat(", ", null, null, true, true).ToString() + " " + values.GetValue(GetAddressColumnDfn(SbmAddress.Column.Postcode).DataName).AsString()); } 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; } return value; } //------------------------------------------------------------------- } //======================================================================= }