using Sarand.BusinessMgr.Net.Standard.Base.App; using Sarand.BusinessMgr.Net.Standard.Base.Bus; using Sarand.BusinessMgr.Net.Standard.Base.Mgr; using Sarand.BusinessMgr.Net.Standard.Dbas.Bus; using Sarand.BusinessMgr.Net.Standard.Dbas.Internal; using Sarand.BusinessMgr.Net.Standard.Dbas.UpdateLog; 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.Interfaces; using Sarand.Net.Standard.Base.Utils; using Sarand.Net.Standard.Dbas.Data; using System; using System.Collections.Generic; using System.Data.Common; using System.Linq; namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr { //======================================================================= // Account manager - Addresses. //======================================================================= partial class SbmAccountMgr_Dbas { //------------------------------------------------------------------- // Utilities. /* public override SbmAddress CloneAddress(SbmAddress addressSource, bool copyId) { }*/ private List GetLogProperties(SbmAddress address) { return new List() { new StringPair("Id",SysId.ToString(address.Id)), new StringPair("Postcode",address.Postcode), new StringPair("Status",address.StatusCode) }; } public override bool VerifyAsPrimaryAddress(SbmAddress addressPrimary, DbUpdateInfo dbUpdateInfo) { // Check that this is the only primary address for the item. ClearErrorState(); if (addressPrimary == null) return SetErrorState("item not specified"); if (!SysId.IsValid(addressPrimary.Id)) return SetErrorState("invalid item id"); if (!addressPrimary.IsPrimary) return SetErrorState("address is not primary"); if (Database == null) return SetErrorState("database not available"); SysId addressPrimaryId = addressPrimary.Id; String colAddress_Id = SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Address_Id); // Identify the other addresses for the same item that are also primary. DbQuery qry = new DbQuery(Database.DbmsType); qry.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Address)); qry.Columns.Add(colAddress_Id); qry.Filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Address_ItemType) + "=" + ((int)addressPrimary.ItemType).ToString()); qry.Filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Address_ItemId) + "=" + addressPrimary.ItemId.ToString()); qry.Filters.Add(colAddress_Id + "<>" + addressPrimaryId.ToString()); qry.Filters.Add(GetPrimaryAddressFilter(true, aliasAddress)); using (DbResultSet dbResultSet = DbResultSet_DataReader.ExecuteQuery(Database, qry.ToString())) { if (dbResultSet != null && dbResultSet.NextRecord()) { NamedValue.Map values = dbResultSet.GetRecordValues(); SbmAddress address = GetAddressById(new SysId((int)values.GetValue(colAddress_Id).AsLong())); if (address != null && address.Id != addressPrimaryId && address.IsPrimary) { address.IsPrimary = false; if (!UpdateAddress(address, dbUpdateInfo)) SetErrorState("failed to update adress - " + ErrorState); } } } return !HasErrorState(); } //------------------------------------------------------------------- // Associated data. public override bool AddressHasInterfaceDataItems(SbmAddress address) { ClearErrorState(); if (!SysId.IsValid(address.Id)) return false; SaInterfaceConsole interfaceConsole = InterfaceConsole; if (interfaceConsole != null) return false; bool has = interfaceConsole.ItemHasDataItems(address.GetItemId()); return has; } public override bool ClearAddressDependentData(SbmAddress address, DbUpdateInfo dbUpdateInfo) { ClearErrorState(); if (!SysId.IsValid(address.Id)) return false; if (SbmGlobals.System == null) return SetErrorState("System is not available"); // Delete interface data items. if (!HasErrorState()) { SaInterfaceConsole interfaceConsole = InterfaceConsole; if (interfaceConsole != null) { if (!interfaceConsole.ClearInterfaceDataItems(address.GetItemId(), dbUpdateInfo)) SetErrorState("Failed to clear interface data items - " + interfaceConsole.ErrorStateMessage); } else SetErrorState("failed to initialise interface console"); interfaceConsole = null; // Do not delete this global object. } // Remove data item references. if (!HasErrorState()) { SbmDataItemMgr dataItemMgr = DataItemMgr; if (dataItemMgr != null) { if (!dataItemMgr.ClearDataItem(address.GetItemId(), dbUpdateInfo)) SetErrorState(dataItemMgr.ErrorStateMessage); } else SetErrorState("Data item manager is not available"); } return !HasErrorState(); } //------------------------------------------------------------------- // Create Address. public override SbmAddress CreateAddress(Sbm.ItemType itemType, SysId idItem, Sbm.AddressType addressType) { return new SbmAddress_Dbas(null, itemType, idItem, addressType, 0); } private SbmAddress_Dbas CreateAddress(Address_Db dbAddress) { ClearErrorState(); Sbm.ItemType itemType = (Sbm.ItemType)dbAddress._ItemType; SysId itemId = new SysId(dbAddress._ItemId); if (dbAddress._AffIdOwner > 0 && !SysId.IsValid(itemId)) { // 'AffiliateIdOwner' is legacy field prior to ItemType/ItemId being added. // Populate ItemTYpe/Id if ItemId not found in data and ItemType consistent (Affiliate or undefined). if (itemType == Sbm.ItemType.Affiliate || (int)itemType < 1) { itemType = Sbm.ItemType.Affiliate; itemId = new SysId(dbAddress._AffIdOwner); } } SbmAddress_Dbas address = new SbmAddress_Dbas(new SysId(dbAddress._Id), itemType, itemId, (Sbm.AddressType)dbAddress._Type, (ushort)dbAddress._Flags); PopulateFrom(dbAddress, address); return address; } //------------------------------------------------------------------- // Get Address. public override SbmAddress GetAddress(SbmAddress.Params prm) { return GetAddress(GetAddressQueryFilter(prm).Concat(" AND ", "(", ")")); } private SbmAddress GetAddress(String filter) { ClearErrorState(); long count = GetAddressCount(filter); if (count == 0) return null; if (count != 1) { SetErrorState("Multiple Addresses found"); return null; } SbmAddress address = null; // Query data. using (var dbConnection = Database.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { dbConnection.Open(); Address_Db dbAddress = new Address_Db(DbInfo); dbAddress.PopulateFrom(dbCommand, aliasAddress, filter); address = CreateAddress(dbAddress); } catch (Exception exc) { SetErrorState("Database query exception"); SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}"); } } return address; } //------------------------------------------------------------------- // Validate Address. public override bool IsValidAddressData(SbmAddress.Data data, SbmAddress.ErrField errField) { ClearErrorState(); if (!base.IsValidAddressData(data, errField)) return false; return true; } //------------------------------------------------------------------- // Insert Address. public override bool InsertAddress(SbmAddress address, DbUpdateInfo dbUpdateInfo) { ClearErrorState(); if (!IsValidAddress(address)) return false; if (SysId.IsValid(address.Id)) return SetErrorState(ErrorMessage.ValiditemId); using (var dbConnection = Database.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { dbConnection.Open(); Address_Db dbAddress = new Address_Db(DbInfo); PopulateTo(dbAddress, address, dbUpdateInfo); if (Address_Db.FieldsNonId.Contains("Id")) { // Generate next Id. dbAddress._Id = SysId.ToInt(Database.GetNextId("Address", dbUpdateInfo)); } dbAddress.ExecuteInsertCommand(dbCommand); address.Id = new SysId(dbAddress._Id); address.Changed = false; if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Inserted. {GetLogProperties(address).Concat(": ").Concat("", "\n\t")}"); } catch (Exception exc) { SetErrorState(exc.Message); } } return !HasErrorState(); } //------------------------------------------------------------------- // Update Address. public override bool UpdateAddress(SbmAddress address, DbUpdateInfo dbUpdateInfo) { ClearErrorState(); if (!IsValidAddress(address)) return false; if (!SysId.IsValid(address.Id)) return SetErrorState(ErrorMessage.InvalidItemId); if (!address.Changed) { if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Data not changed. {GetLogProperties(address).Concat(": ").Concat("", "\n\t")}"); return true; } using (var dbConnection = Database.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { // Retrieve Address. dbConnection.Open(); Address_Db dbAddress = new Address_Db(DbInfo); dbAddress.PopulateFrom(dbCommand, aliasAddress, $"Id={SysId.ToString(address.Id)}"); SbmUpdateLogItemMonitor_Address updateLogMonitor = new SbmUpdateLogItemMonitor_Address(Internals, CreateAddress(dbAddress)); // Update properties. PopulateTo(dbAddress, address, dbUpdateInfo); dbAddress.ExecuteUpdateCommand(dbCommand); address.Changed = false; if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Updated. {GetLogProperties(address).Concat(": ").Concat("", "\n\t")}"); // Record updates. updateLogMonitor.RecordUpdatedValues(address); updateLogMonitor.LogUpdates(); } catch (Exception exc) { SetErrorState(exc.Message); } } return !HasErrorState(); } //------------------------------------------------------------------- // Delete Address. public override bool AddressCanBeDeleted(SbmAddress address) { ClearErrorState(); if (!base.AddressCanBeDeleted(address)) return false; return true; } public override bool DeleteAddress(SbmAddress address, DbUpdateInfo dbUpdateInfo) { ClearErrorState(); if (!AddressCanBeDeleted(address)) return false; using (var dbConnection = Database.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { // Retrieve Address. dbConnection.Open(); Address_Db dbAddress = new Address_Db(DbInfo); dbAddress.PopulateFrom(dbCommand, aliasAddress, "Id=" + address.Id.ToString()); // Delete Address. dbCommand.CommandType = System.Data.CommandType.Text; dbCommand.CommandText = "DELETE FROM " + SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Address) + " WHERE Id=" + SysId.ToString(address.Id) + ";"; dbCommand.ExecuteNonQuery(); address.Changed = false; if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Deleted. {GetLogProperties(address).Concat(": ").Concat("", "\n\t")}"); } catch (Exception exc) { SetErrorState(exc.Message); } } return !HasErrorState(); } //------------------------------------------------------------------- // Copy data properties to and from database. private void PopulateTo(Address_Db dbAddress, SbmAddress address, DbUpdateInfo dbUpdateInfo) { dbAddress._Id = address.Id.ToInt(); dbAddress._ItemType = (short)address.ItemType; dbAddress._ItemId = SysId.ToInt(address.ItemId); dbAddress._AffIdOwner = (address.ItemType == Sbm.ItemType.Affiliate ? SysId.ToInt(address.ItemId) : 0); dbAddress._AddIdRef = SysId.ToInt(address.AddressIdRef); dbAddress._RefExt = address.RefExt; dbAddress._Type = (short)address.AddressType; dbAddress._Name = address.Name; dbAddress._DescBrief = address.DescBrief; dbAddress._Line1 = address.Line1; dbAddress._Line2 = address.Line2; dbAddress._Line3 = address.Line3; dbAddress._City = address.City; dbAddress._Province = address.Province; dbAddress._Postcode = address.Postcode; dbAddress._Country = address.Country; dbAddress._CityRgn = SysId.ToInt(address.RegionIdCity); dbAddress._ProvinceRgn = SysId.ToInt(address.RegionIdProvince); dbAddress._CountryRgn = SysId.ToInt(address.RegionIdCountry); dbAddress._Contact = address.Contact; dbAddress._Phone = address.Phone; dbAddress._Email = address.Email; dbAddress._AccountManagerCode = address.AccountManagerCode; dbAddress._AccountHandlerCode = address.AccountHandlerCode; dbAddress._ContactAreaCode = address.ContactAreaCode; dbAddress._ContactHandlerCode = address.ContactHandlerCode; dbAddress._DeliveryTypeCode = address.DeliveryTypeCode; dbAddress._DeliveryBookInCode = address.DeliveryBookInCode; dbAddress._LastVisitOn = address.LastVisitOn; dbAddress._NextVisitOn = address.NextVisitOn; // Common properties. dbAddress._Notes = address.Notes; dbAddress._Status = SacsSystem.GetStatusCode(address.Status); dbAddress._Flags = (short)address.Flags; if (!SysId.IsValid(address.Id)) { dbAddress._CreateOn = DateTime.UtcNow; dbAddress._CreateBy = dbUpdateInfo.UserId.ToInt(); dbAddress._CreateHost = dbUpdateInfo.Host; } dbAddress._UpdateOn = DateTime.UtcNow; dbAddress._UpdateBy = dbUpdateInfo.UserId.ToInt(); dbAddress._UpdateHost = dbUpdateInfo.Host; } private void PopulateFrom(Address_Db dbAddress, SbmAddress address) { //address.Id = new SysId(dbAddress._Id); //address.ItemType = (Sbm.ItemType)dbAddress._ItemType; //address.ItemId = new SysId(dbAddress._ItemId); address.AddressIdRef = new SysId(dbAddress._AddIdRef); address.RefExt = dbAddress._RefExt; address.AddressType = (Sbm.AddressType)dbAddress._Type; address.Name = dbAddress._Name; address.DescBrief = dbAddress._DescBrief; address.Line1 = dbAddress._Line1; address.Line2 = dbAddress._Line2; address.Line3 = dbAddress._Line3; address.City = dbAddress._City; address.Province = dbAddress._Province; address.Postcode = dbAddress._Postcode; address.Country = dbAddress._Country; address.RegionIdCity = new SysId(dbAddress._CityRgn); address.RegionIdProvince = new SysId(dbAddress._ProvinceRgn); address.RegionIdCountry = new SysId(dbAddress._CountryRgn); address.Contact = dbAddress._Contact; address.Phone = dbAddress._Phone; address.Email = dbAddress._Email; address.AccountManagerCode = dbAddress._AccountManagerCode; address.AccountHandlerCode = dbAddress._AccountHandlerCode; address.ContactAreaCode = dbAddress._ContactAreaCode; address.ContactHandlerCode = dbAddress._ContactHandlerCode; address.DeliveryTypeCode = dbAddress._DeliveryTypeCode; address.DeliveryBookInCode = dbAddress._DeliveryBookInCode; address.LastVisitOn = dbAddress._LastVisitOn ?? default(DateTime); address.NextVisitOn = dbAddress._NextVisitOn ?? default(DateTime); // Common properties. address.Notes = dbAddress._Notes; address.Status = SacsSystem.GetStatusForCode(dbAddress._Status); address.SetCreateStamp(dbAddress._CreateOn, new SysId(dbAddress._CreateBy), dbAddress._CreateHost); address.SetUpdateStamp(dbAddress._UpdateOn, new SysId(dbAddress._UpdateBy), dbAddress._UpdateHost); address.AcceptChanges(); } //------------------------------------------------------------------- // Column definitions. private static readonly String aliasAddress = "aAdd"; // Column definition population. private void SetAddressColDfn (ColumnDfn col, String caption, int width, SbmDbDfn.ColumnIdx dbCol, ColumnAlignment align = ColumnAlignment.Default, DataValue.DataType dataType = DataValue.DataType.String, String alias = "", String prefix = "") { if (String.IsNullOrEmpty(alias) && SbmDbDfn.GetTableForColumn(dbCol) == SbmDbDfn.TableIdx.Address) alias = aliasAddress; col.Set(caption, width, (int)dbCol, prefix + SbmDbDfn.GetColumnName(dbCol, false), SbmDbDfn.GetColumnNameQual(dbCol, alias), dataType, align); if (dataType == DataValue.DataType.String && dbCol != SbmDbDfn.ColumnIdx.Unknown) col.MaxLength = (int)SbmDbDfn.GetColTextLen(dbCol); } //------------------------------------------------------------------- // Getting prmAddress column definition. public override ColumnDfn GetAddressColumnDfn(SbmAddress.Column columnId, string caption = "", int width = 0) { ColumnDfn columnDfn = new ColumnDfn((int)columnId, caption, width); switch (columnId) { case SbmAddress.Column.Pos: SetAddressColDfn(columnDfn, "Pos", 45, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right); columnDfn.SortMode = ColumnDfn.ColumnSortMode.Off; columnDfn.ReadOnly = true; columnDfn.Resizable = false; break; case SbmAddress.Column.Id: SetAddressColDfn(columnDfn, "Id", 60, SbmDbDfn.ColumnIdx.Address_Id, ColumnAlignment.Right, DataValue.DataType.Long); columnDfn.ReadOnly = true; break; // Address Properties. case SbmAddress.Column.Type_Desc: SetAddressColDfn(columnDfn, "Type", 70, SbmDbDfn.ColumnIdx.Address_Type, ColumnAlignment.Center); break; case SbmAddress.Column.RefExt: SetAddressColDfn(columnDfn, "Ref", 80, SbmDbDfn.ColumnIdx.Address_RefExt); break; case SbmAddress.Column.Name: SetAddressColDfn(columnDfn, "Name", 120, SbmDbDfn.ColumnIdx.Address_Name, ColumnAlignment.Left); break; case SbmAddress.Column.DescBrief: SetAddressColDfn(columnDfn, "Desc Brief", 120, SbmDbDfn.ColumnIdx.Address_DescBrief); break; /*------------------------------------*/ case SbmAddress.Column.Summary: SetAddressColDfn(columnDfn, "Address", 240, SbmDbDfn.ColumnIdx.Unknown); break; case SbmAddress.Column.Line1: SetAddressColDfn(columnDfn, "Line1", 100, SbmDbDfn.ColumnIdx.Address_Line1); break; case SbmAddress.Column.Line2: SetAddressColDfn(columnDfn, "Line2", 100, SbmDbDfn.ColumnIdx.Address_Line2); break; case SbmAddress.Column.Line3: SetAddressColDfn(columnDfn, "Line3", 100, SbmDbDfn.ColumnIdx.Address_Line3); break; case SbmAddress.Column.City: SetAddressColDfn(columnDfn, "City", 90, SbmDbDfn.ColumnIdx.Address_City); break; case SbmAddress.Column.Province: SetAddressColDfn(columnDfn, "Province", 90, SbmDbDfn.ColumnIdx.Address_Province); break; case SbmAddress.Column.Postcode: SetAddressColDfn(columnDfn, "Postcode", 80, SbmDbDfn.ColumnIdx.Address_Postcode); break; case SbmAddress.Column.Country: SetAddressColDfn(columnDfn, "Country", 90, SbmDbDfn.ColumnIdx.Address_Country); break; /*------------------------------------*/ case SbmAddress.Column.Contact: SetAddressColDfn(columnDfn, "Contact", 100, SbmDbDfn.ColumnIdx.Address_Contact); break; case SbmAddress.Column.Phone: SetAddressColDfn(columnDfn, "Phone", 90, SbmDbDfn.ColumnIdx.Address_Phone); break; case SbmAddress.Column.Fax: SetAddressColDfn(columnDfn, "Fax", 90, SbmDbDfn.ColumnIdx.Address_Fax); break; case SbmAddress.Column.Email: SetAddressColDfn(columnDfn, "Email", 100, SbmDbDfn.ColumnIdx.Address_Email); break; case SbmAddress.Column.LastVisitOn: SetAddressColDfn(columnDfn, "Last Visit On", 80, SbmDbDfn.ColumnIdx.Address_LastVisitOn, ColumnAlignment.Center, DataValue.DataType.Date); columnDfn.ReadOnly = true; break; case SbmAddress.Column.NextVisitOn: SetAddressColDfn(columnDfn, "Next Visit On", 80, SbmDbDfn.ColumnIdx.Address_NextVisitOn, ColumnAlignment.Center, DataValue.DataType.Date); columnDfn.ReadOnly = true; break; case SbmAddress.Column.IsPrimary: SetAddressColDfn(columnDfn, "Primary", 40, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center); break; // Derived properties. // Common properties. case SbmAddress.Column.Notes: SetAddressColDfn(columnDfn, "Notes", 200, SbmDbDfn.ColumnIdx.Address_Notes); break; case SbmAddress.Column.Status: SetAddressColDfn(columnDfn, "Status", 50, SbmDbDfn.ColumnIdx.Address_Status, ColumnAlignment.Center); break; case SbmAddress.Column.Status_Desc: SetAddressColDfn(columnDfn, "Status", 50, SbmDbDfn.ColumnIdx.Address_Status, ColumnAlignment.Center); break; case SbmAddress.Column.Status_Ind: SetAddressColDfn(columnDfn, "Status", 50, SbmDbDfn.ColumnIdx.Address_Status, ColumnAlignment.Center, DataValue.DataType.TriState); columnDfn.TriStateFormat = ColumnTriStateFormat.Lights; break; case SbmAddress.Column.CreateOn_Date: SetAddressColDfn(columnDfn, "Created", 65, SbmDbDfn.ColumnIdx.Address_CreateOn, ColumnAlignment.Center, DataValue.DataType.Date); columnDfn.ReadOnly = true; break; case SbmAddress.Column.UpdateOn_Date: SetAddressColDfn(columnDfn, "Updated", 65, SbmDbDfn.ColumnIdx.Address_UpdateOn, ColumnAlignment.Center, DataValue.DataType.Date); columnDfn.ReadOnly = true; break; } if (!String.IsNullOrEmpty(caption)) columnDfn.Caption = caption; if (width > 0) columnDfn.Width = width; return columnDfn; } //------------------------------------------------------------------- // Address query filter. public override List GetAddressQueryFilter(SbmAddress.Params prm) { List filter = new List(); // Address Id. String colId = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Id, aliasAddress); if (prm.IdsIncluded.HasValidIds()) filter.Add($"{colId} IN ({prm.IdsIncluded.Concat(",")})"); if (prm.IdsExcluded.HasValidIds()) filter.Add($"{colId} NOT IN ({prm.IdsExcluded.Concat(",")})"); //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Address Type. String colAddress_Type = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Type, aliasAddress); if (prm.AddressType > 0) filter.Add(colAddress_Type + "='" + ((int)prm.AddressType).ToString()); //--------------------------------------------------------------- - // ItemType & ItemId. if (ItemId.IsValid(prm.ItemId)) { List filterItemTypes = new List(); // ItemType. String colAddress_ItemType = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_ItemType, aliasAddress); filterItemTypes.Add(colAddress_ItemType + "=" + ((int)prm.ItemId.Type).ToString()); String colAddress_ItemId = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_ItemId, aliasAddress); filterItemTypes.Add(colAddress_ItemId + "=" + SysId.ToString(prm.ItemId.Id)); //ItemId. List filterItemIds = new List(); if (!filterItemTypes.IsEmpty()) filterItemIds.Add(filterItemTypes.Concat(" AND ", "(", ")")); // Older installations may still be using the 'AffIdOwner' column instead of ItemType/Id. if (ColumnExists(SbmDbDfn.ColumnIdx.Address_AffIdOwner) && prm.ItemId.Type == (int)Sbm.ItemType.Affiliate && ItemId.IsValid(prm.ItemId)) filterItemIds.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_AffIdOwner, aliasAddress) + "=" + SysId.ToString(prm.ItemId.Id)); filter.Add(filterItemIds.Concat(" OR ", "(", ")")); } //--------------------------------------------------------------- // AffIdOwner. String colAddress_AffIdOwner = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_AffIdOwner, aliasAddress); if (SysId.IsValid(prm.AffiliateIdOwner)) filter.Add(colAddress_AffIdOwner + "=" + SysId.ToString(prm.AffiliateIdOwner)); // AddIdRef. String colAddress_AddIdRef = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_AddIdRef, aliasAddress); if (SysId.IsValid(prm.AddressIdRef)) filter.Add(colAddress_AddIdRef + "=" + SysId.ToString(prm.AddressIdRef)); //--------------------------------------------------------------- // Address RefExt. String colAddress_RefExt = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_RefExt, aliasAddress); if (!StringUtil.IsEmpty(prm.RefExt)) filter.Add(DbQuery.FormatFn_Left(colAddress_RefExt, DbQuery.FormatForCondition(prm.RefExt).Length) + "='" + DbQuery.FormatForCondition(prm.RefExt) + "'"); // Addres Name. String colAddress_Name = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Name, aliasAddress); if (!StringUtil.IsEmpty(prm.Name)) filter.Add(colAddress_Name + " = '" + DbQuery.FormatForCondition(prm.Name) + "'"); // Addresses. if (!StringUtil.IsEmpty(prm.Address)) { String colAddress_Line1 = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Line1, aliasAddress); String colAddress_Line2 = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Line2, aliasAddress); String colAddress_Line3 = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Line3, aliasAddress); String colAddress_City = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_City, aliasAddress); String colAddress_Province = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Province, aliasAddress); String qryFmtCondAddress = DbQuery.FormatForCondition(prm.Address); /*List filterAddress = new List() { DbQuery.FormatFn_Left(colAddress_Line1, qryFmtCondAddress.Length) + "='" + qryFmtCondAddress + "'", DbQuery.FormatFn_Left(colAddress_Line2, qryFmtCondAddress.Length) + "='" + qryFmtCondAddress + "'", DbQuery.FormatFn_Left(colAddress_Line3, qryFmtCondAddress.Length) + "='" + qryFmtCondAddress + "'", DbQuery.FormatFn_Left(colAddress_City, qryFmtCondAddress.Length) + "='" + qryFmtCondAddress + "'", DbQuery.FormatFn_Left(colAddress_Province, qryFmtCondAddress.Length) + "='" + qryFmtCondAddress + "'", };*/ List filterAddress = new List(); filterAddress.Add(DbQuery.FormatFn_Left(colAddress_Line1, DbQuery.FormatForCondition(prm.Address).Length) + "='" + DbQuery.FormatForCondition(prm.Address) + "'"); filterAddress.Add(DbQuery.FormatFn_Left(colAddress_Line2, DbQuery.FormatForCondition(prm.Address).Length) + "='" + DbQuery.FormatForCondition(prm.Address) + "'"); filterAddress.Add(DbQuery.FormatFn_Left(colAddress_Line3, DbQuery.FormatForCondition(prm.Address).Length) + "='" + DbQuery.FormatForCondition(prm.Address) + "'"); filterAddress.Add(DbQuery.FormatFn_Left(colAddress_City, DbQuery.FormatForCondition(prm.Address).Length) + "='" + DbQuery.FormatForCondition(prm.Address) + "'"); filterAddress.Add(DbQuery.FormatFn_Left(colAddress_Province, DbQuery.FormatForCondition(prm.Address).Length) + "='" + DbQuery.FormatForCondition(prm.Address) + "'"); filter.Add(filterAddress.Concat(" OR ", "(", ")", true, true)); } //--------------------------------------------------------------- // Postcode. String colAddress_Postcode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Postcode, aliasAddress); String colAddress_PostcodeFmt = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_PostcodeFmt, aliasAddress); if (!StringUtil.IsEmpty(prm.Postcode)) { String postcodeFmt = DbQuery.FormatForCondition(StringUtil.EmptyOnNull(prm.Postcode).ReplaceAll(" ", "")); if (!postcodeFmt.IsEmpty()) filter.Add("(" + colAddress_PostcodeFmt + "='" + postcodeFmt + "' OR " + colAddress_Postcode + "='" + DbQuery.FormatForCondition(prm.Postcode) + "')"); } if (!StringUtil.IsEmpty(prm.PostcodePartial)) { String postcodepartialFmt = DbQuery.FormatForCondition(StringUtil.EmptyOnNull(prm.PostcodePartial).ReplaceAll(" ", "")); if (!postcodepartialFmt.IsEmpty()) filter.Add("(" + colAddress_PostcodeFmt + "='" + postcodepartialFmt + "' OR " + colAddress_Postcode + "='" + DbQuery.FormatForCondition(prm.Postcode) + "')"); } // Phone. String colAddress_Phone = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Phone, aliasAddress); if (!StringUtil.IsEmpty(prm.Phone)) filter.Add(DbQuery.FormatFn_Left(colAddress_Phone, DbQuery.FormatForCondition(prm.Phone).Length) + " = '" + DbQuery.FormatForCondition(prm.Phone) + "'"); //--------------------------------------------------------------- // Codings. //AccountManagerCode. String colAddress_AccountManagerCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_AccountManagerCode, aliasAddress); if (!StringUtil.IsEmpty(prm.AccountManagerCode)) filter.Add(DbQuery.FormatFn_Left(colAddress_AccountManagerCode, DbQuery.FormatForCondition(prm.AccountManagerCode).Length) + " = '" + DbQuery.FormatForCondition(prm.AccountManagerCode) + "'"); //AccountHandlerCode. String colAddress_AccountHandlerCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_AccountHandlerCode, aliasAddress); if (!StringUtil.IsEmpty(prm.AccountHandlerCode)) filter.Add(DbQuery.FormatFn_Left(colAddress_AccountHandlerCode, DbQuery.FormatForCondition(prm.AccountHandlerCode).Length) + " = '" + DbQuery.FormatForCondition(prm.AccountHandlerCode) + "'"); //ContactAreaCode. String colAddress_ContactAreaCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_ContactAreaCode, aliasAddress); if (!StringUtil.IsEmpty(prm.ContactAreaCode)) filter.Add(DbQuery.FormatFn_Left(colAddress_ContactAreaCode, DbQuery.FormatForCondition(prm.ContactAreaCode).Length) + " = '" + DbQuery.FormatForCondition(prm.ContactAreaCode) + "'"); //ContactHandlerCode. String colAddress_ContactHandlerCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_ContactHandlerCode, aliasAddress); if (!StringUtil.IsEmpty(prm.ContactHandlerCode)) filter.Add(DbQuery.FormatFn_Left(colAddress_ContactHandlerCode, DbQuery.FormatForCondition(prm.ContactHandlerCode).Length) + " = '" + DbQuery.FormatForCondition(prm.ContactHandlerCode) + "'"); //DeliveryTypeCode. String colAddress_DeliveryTypeCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_DeliveryTypeCode, aliasAddress); if (!StringUtil.IsEmpty(prm.DeliveryTypeCode)) filter.Add(DbQuery.FormatFn_Left(colAddress_DeliveryTypeCode, DbQuery.FormatForCondition(prm.DeliveryTypeCode).Length) + " = '" + DbQuery.FormatForCondition(prm.DeliveryTypeCode) + "'"); //DeliveryBookInCode. String colAddress_DeliveryBookInCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_DeliveryBookInCode, aliasAddress); if (!StringUtil.IsEmpty(prm.DeliveryBookInCode)) filter.Add(DbQuery.FormatFn_Left(colAddress_DeliveryBookInCode, DbQuery.FormatForCondition(prm.DeliveryBookInCode).Length) + " = '" + DbQuery.FormatForCondition(prm.DeliveryBookInCode) + "'"); //--------------------------------------------------------------- // Common Properties. /* ToDo does it require: Notes. if (!StringUtil.IsEmpty(prm.NotesPartial)) filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Notes, aliasAddress) + " LIKE '%" + DbQuery.FormatForLike(prm.NotesPartial) + "%'");*/ // Address Status. if (prm.PrimaryOnly) filter.Add(GetPrimaryAddressFilter(true, aliasAddress)); /*if (prm.StatusCat == SbmAddress.StatusCat.ActiveOnly) filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Status, aliasAddress) + " = '" + StatusActive + "'");*/ if (filter.Count < 1 && prm.IncludeDefaultFilter) filter.Add("1=1"); return filter; } //------------------------------------------------------------------- // Primary Address Filter public String GetPrimaryAddressFilter(bool match, String aliasTable) { DbQuery qry = new DbQuery(Database.DbmsType); return DbQuery.BuildBitMappedFilter(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Flags, aliasAddress), SbmAddress.Flag_Primary, match); } // Address sort columns. public List GetAddressSortColumns(SbmAddress.Params prm) { // Sort sequence: List sortColumnNames = new List(); foreach (var columnDfn in prm.SortColumns) { // Need to ensure correct alias used for Address columns in case of conflict. String sortCol = String.Empty; if (SbmDbDfn.GetTableForColumn((SbmDbDfn.ColumnIdx)columnDfn.DbColumn) == SbmDbDfn.TableIdx.Address) { sortCol = SbmDbDfn.GetColumnNameQual((SbmDbDfn.ColumnIdx)columnDfn.DbColumn, aliasAddress); } else { sortCol = columnDfn.DataName; if (!StringUtil.IsEmpty(columnDfn.SortDataName)) sortCol = columnDfn.SortDataName; } if (!sortCol.IsEmpty()) { DbOrderByNullMode orderByNullMode = DbOrderByNullMode.Default; // eSaOrderByDemoteNulls, eSaOrderByPromoteNulls sortColumnNames.Add(DbQuery.FormatForOrderBy(sortCol, columnDfn.SortAscending, orderByNullMode).Concat(", ")); } } sortColumnNames.RemoveBlanks(); if (sortColumnNames.IsEmpty()) { // Default sort columns: sortColumnNames.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Type, aliasAddress) + " ASC"); } return sortColumnNames; } //------------------------------------------------------------------- // Address count. private long GetAddressCount(String filter) { ClearErrorState(); return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Address) + " As " + aliasAddress, filter); } public override long GetAddressCount(SbmAddress.Params prm) { ClearErrorState(); return GetAddressCount(GetAddressQueryFilter(prm).Concat(" AND ", "(", ")")); } //------------------------------------------------------------------- // Address list. public override List GetAddressList(SbmAddress.Params prm) { ClearErrorState(); List addresses = new List(); DbQuery qry = new DbQuery(Database.DbmsType); qry.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Address), aliasAddress); Address_Db dbAddress = new Address_Db(DbInfo); qry.Columns.AddRange(dbAddress.ExistingColumnNames); qry.Filters.AddRange(GetAddressQueryFilter(prm)); qry.OrderBy.AddRange(GetAddressSortColumns(prm)); // Query data. using (var dbConnection = Database.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { dbConnection.Open(); dbCommand.CommandText = qry.BuildQuery(prm.ResultsPaging); using (DbDataReader dbDataReader = dbCommand.ExecuteReader()) { while (dbDataReader.Read()) { dbAddress = new Address_Db(DbInfo); dbAddress.PopulateFrom(dbDataReader); addresses.Add(CreateAddress(dbAddress)); } } } catch (Exception exc) { SetErrorState("Database query exception"); SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}"); } } return addresses; } //------------------------------------------------------------------- // Address query execution. public override DbResultSet AddressExecuteQuery(List columns, SbmAddress.Params prm) { ClearErrorState(); //--------------------------------------------------------------- // Construct query. DbQuery query = new DbQuery(Database.DbmsType); query.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Address), aliasAddress); // Address Properties - add columns as defined in query list. if (columns.HasId(SbmAddress.Column.Id)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Id, aliasAddress)); if (columns.HasId(SbmAddress.Column.Type_Desc)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Type, aliasAddress)); if (columns.HasId(SbmAddress.Column.RefExt)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_RefExt, aliasAddress)); if (columns.HasId(SbmAddress.Column.Name)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Name, aliasAddress)); if (columns.HasId(SbmAddress.Column.DescBrief)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_DescBrief, aliasAddress)); if (columns.HasId(SbmAddress.Column.Line1) || columns.HasId(SbmAddress.Column.Summary)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Line1, aliasAddress)); if (columns.HasId(SbmAddress.Column.Line2) || columns.HasId(SbmAddress.Column.Summary)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Line2, aliasAddress)); if (columns.HasId(SbmAddress.Column.Line3) || columns.HasId(SbmAddress.Column.Summary)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Line3, aliasAddress)); if (columns.HasId(SbmAddress.Column.City) || columns.HasId(SbmAddress.Column.Summary)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_City, aliasAddress)); if (columns.HasId(SbmAddress.Column.Province) || columns.HasId(SbmAddress.Column.Summary)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Province, aliasAddress)); if (columns.HasId(SbmAddress.Column.Postcode) || columns.HasId(SbmAddress.Column.Summary)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Postcode, aliasAddress)); if (columns.HasId(SbmAddress.Column.Country) || columns.HasId(SbmAddress.Column.Summary)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Country, aliasAddress)); if (columns.HasId(SbmAddress.Column.Contact)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Contact, aliasAddress)); if (columns.HasId(SbmAddress.Column.Phone)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Phone, aliasAddress)); if (columns.HasId(SbmAddress.Column.Fax)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Fax, aliasAddress)); if (columns.HasId(SbmAddress.Column.Email)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Email, aliasAddress)); if (columns.HasId(SbmAddress.Column.LastVisitOn) && ColumnExists(SbmDbDfn.ColumnIdx.Address_LastVisitOn)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_LastVisitOn, aliasAddress)); if (columns.HasId(SbmAddress.Column.NextVisitOn) && ColumnExists(SbmDbDfn.ColumnIdx.Address_NextVisitOn)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_NextVisitOn, aliasAddress)); // Common Properties if (columns.HasId(SbmAddress.Column.Notes)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Notes, aliasAddress)); if (columns.HasId(SbmAddress.Column.Status) || columns.HasId(SbmAddress.Column.Status_Desc) || columns.HasId(SbmAddress.Column.Status_Ind)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Status, aliasAddress)); if (columns.HasId(SbmAddress.Column.CreateOn_Date)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_CreateOn, aliasAddress)); if (columns.HasId(SbmAddress.Column.UpdateOn_Date)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_UpdateOn, aliasAddress)); //--------------------------------------------------------------- // Populate filter. query.Filters.AddRange(GetAddressQueryFilter(prm)); if (prm.IdsIncluded.Count != 1) { // Configure sort sequence. foreach (String sortColumn in GetAddressSortColumns(prm)) query.OrderBy.Add(sortColumn); } //--------------------------------------------------------------- //return new DbResultSet_DataTableReader(Database, query.BuildQuery()); return DbResultSet_DataReader.ExecuteQuery(Database, query.BuildQuery(prm.ResultsPaging)); } //------------------------------------------------------------------- } //======================================================================= }