Files
BusinessMgr-2019/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas-Address.cs
T
2025-02-19 16:01:05 +00:00

841 lines
39 KiB
C#

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<StringPair> GetLogProperties(SbmAddress address)
{
return new List<StringPair>()
{
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(ErrorMessage.InvalidStatus);
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.BuildQuery()))
{
while (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 OK;
}
//-------------------------------------------------------------------
// 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 OK;
}
//-------------------------------------------------------------------
// 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(ErrorMessage.MultipleItemsFound);
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(ErrorMessage.DatabaseQueryException);
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 OK;
}
//-------------------------------------------------------------------
// 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 OK;
}
//-------------------------------------------------------------------
// 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 OK;
}
//-------------------------------------------------------------------
// 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)Internals.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<string> GetAddressQueryFilter(SbmAddress.Params prm)
{
List<String> filter = new List<String>();
// 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<String> filterItemTypes = new List<String>();
// 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<String> filterItemIds = new List<String>();
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<String> filterAddress = new List<String>()
{
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<String> filterAddress = new List<String>();
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<String> GetAddressSortColumns(SbmAddress.Params prm)
{
// Sort sequence:
List<String> sortColumnNames = new List<String>();
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<SbmAddress> GetAddressList(SbmAddress.Params prm)
{
ClearErrorState();
List<SbmAddress> addresses = new List<SbmAddress>();
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(ErrorMessage.DatabaseQueryException);
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
}
}
return addresses;
}
//-------------------------------------------------------------------
// Address query execution.
public override DbResultSet AddressExecuteQuery(List<ColumnDfn> 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));
}
//-------------------------------------------------------------------
}
//=======================================================================
}