Files
BusinessMgr-2019/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas-Affiliate.cs
T
2025-01-22 08:01:51 +00:00

1102 lines
57 KiB
C#

using Sarand.BusinessMgr.Net.Standard.Base.App;
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
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.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
{
//=======================================================================
partial class SbmAccountMgr_Dbas
{
//*******************************************************************
// A f f i l i a t e
//*******************************************************************
// Utilities.
private List<StringPair> GetLogProperties(SbmAffiliate affiliate)
{
return new List<StringPair>()
{
new StringPair("Id",SysId.ToString(affiliate.Id)),
new StringPair("Name",affiliate.Name),
new StringPair("Status",affiliate.StatusCode)
};
}
//-------------------------------------------------------------------
// Create Affiliate.
public override SbmAffiliate CreateAffiliate(Sbm.AffiliateType affiliateType)
{
return new SbmAffiliate_Dbas(Internals, null, affiliateType, 0);
}
private SbmAffiliate_Dbas CreateAffiliate(Affiliate_Db dbAffiliate)
{
ClearErrorState();
SbmAffiliate_Dbas affiliate = new SbmAffiliate_Dbas(Internals, new SysId(dbAffiliate._Id), (Sbm.AffiliateType)dbAffiliate._Type, (ushort)dbAffiliate._Flags);
PopulateFrom(dbAffiliate, affiliate);
return affiliate;
}
//-------------------------------------------------------------------
// Get Affiliate.
public override SbmAffiliate GetAffiliate(SbmAffiliate.Params prm)
{
return GetAffiliate(GetAffiliateQueryFilter(prm).Concat(" AND ", "(", ")"));
}
private SbmAffiliate GetAffiliate(String filter)
{
ClearErrorState();
long count = GetAffiliateCount(filter);
if (count == 0) return null;
if (count != 1)
{
SetErrorState("Multiple Contacts found");
return null;
}
SbmAffiliate affiliate = null;
// Query data.
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
Affiliate_Db dbAffiliate = new Affiliate_Db(DbInfo);
dbAffiliate.PopulateFrom(dbCommand, aliasAffiliate, filter);
affiliate = CreateAffiliate(dbAffiliate);
}
catch (Exception exc)
{
SetErrorState("Database query exception");
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
}
}
return affiliate;
}
//-------------------------------------------------------------------
public override String GetAffiliateName(SysId affiliateId)
{
ClearErrorState();
if (!SysId.IsValid(affiliateId)) return "";
// Filter to target specified contact.
SbmAffiliate.Params prmAffiliate = new SbmAffiliate.Params();
prmAffiliate.IdsIncluded.Add(affiliateId);
prmAffiliate.StatusCat = SbmAffiliate.StatusCat.Any;
if (GetAffiliateCount(prmAffiliate) != 1) return "";
// Columns to query.
ColumnDfn colName = GetAffiliateColumnDfn(SbmAffiliate.Column.Name);
List<ColumnDfn> columnsToQuery = new List<ColumnDfn>() { colName };
// Query affiliates.
using (DbResultSet dbResultSet = ExecuteAffiliateQuery(columnsToQuery, prmAffiliate))
{
// Only interested in first row.
if (dbResultSet != null && dbResultSet.NextRecord())
{
NamedValue.Map values = dbResultSet.GetRecordValues();
return values.GetValue(colName.DataName).AsString();
}
}
return "";
}
public override String GetAssociationOwnerName(SysId associationIdOwner)
{
ClearErrorState();
if (!SysId.IsValid(associationIdOwner)) return "";
// Filter to target specified association.
SbmAssociation.Params prmAssociation = new SbmAssociation.Params();
prmAssociation.IdsIncluded.Add(associationIdOwner);
prmAssociation.StatusCat = SbmAssociation.StatusCat.Any;
if (GetAssociationCount(prmAssociation) != 1) return "";
// Columns to query.
ColumnDfn colAssocOwnerName = GetAssociationColumnDfn(SbmAssociation.Column.Owner_Name);
List<ColumnDfn> columnsToQuery = new List<ColumnDfn>() { colAssocOwnerName };
// Query associations.
using (DbResultSet dbResultSet = ExecuteAssociationQuery(columnsToQuery, prmAssociation))
{
// Only interested in first row.
if (dbResultSet != null && dbResultSet.NextRecord())
{
NamedValue.Map values = dbResultSet.GetRecordValues();
return (values.GetValue(colAssocOwnerName.DataName).AsString());
}
}
return "";
}
public override String GetAssociationTargetName(SysId associationIdTarget)
{
ClearErrorState();
if (!SysId.IsValid(associationIdTarget)) return "";
// Filter to target specified association.
SbmAssociation.Params prmAssociation = new SbmAssociation.Params();
prmAssociation.IdsIncluded.Add(associationIdTarget);
prmAssociation.StatusCat = SbmAssociation.StatusCat.Any;
if (GetAssociationCount(prmAssociation) != 1) return "";
// Columns to query.
ColumnDfn colAssocTargetName = GetAssociationColumnDfn(SbmAssociation.Column.Target_Name);
List<ColumnDfn> columnsToQuery = new List<ColumnDfn>() { colAssocTargetName };
// Query associations.
using (DbResultSet dbResultSet = ExecuteAssociationQuery(columnsToQuery, prmAssociation))
{
// Only interested in first row.
if (dbResultSet != null && dbResultSet.NextRecord())
{
NamedValue.Map values = dbResultSet.GetRecordValues();
return values.GetValue(colAssocTargetName.DataName).AsString();
}
}
return "";
}
//-------------------------------------------------------------------
// Validate item properties.
public override bool IsValidAffiliateData(SbmAffiliate.Data data, SbmAffiliate.ErrField errField)
{
ClearErrorState();
if (!base.IsValidAffiliateData(data, errField)) return false;
return true;
}
//-------------------------------------------------------------------
// Insert Item.
public override bool InsertAffiliate(SbmAffiliate affiliate, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!IsValidAffiliate(affiliate)) return false;
if (SysId.IsValid(affiliate.Id)) return SetErrorState(ErrorMessage.ValiditemId);
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
Affiliate_Db dbAffiliate = new Affiliate_Db(DbInfo);
PopulateTo(dbAffiliate, affiliate, dbUpdateInfo);
if (Affiliate_Db.FieldsNonId.Contains("Id"))
{
// Generate next Id.
dbAffiliate._Id = SysId.ToInt(Database.GetNextId("Affiliate", dbUpdateInfo));
}
dbAffiliate.ExecuteInsertCommand(dbCommand);
affiliate.Id = new SysId(dbAffiliate._Id);
affiliate.Changed = false;
if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Inserted. {GetLogProperties(affiliate).Concat(": ").Concat("", "\n\t")}");
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Update Affiliate.
public override bool UpdateAffiliate(SbmAffiliate affiliate, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!IsValidAffiliate(affiliate)) return false;
if (!SysId.IsValid(affiliate.Id)) return SetErrorState(ErrorMessage.InvalidItemId);
if (!affiliate.Changed)
{
if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Data not changed. {GetLogProperties(affiliate).Concat(": ").Concat("", "\n\t")}");
return true;
}
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
// Retrieve Affiliate.
dbConnection.Open();
Affiliate_Db dbAffiliate = new Affiliate_Db(DbInfo);
dbAffiliate.PopulateFrom(dbCommand, aliasAffiliate, "Id=" + SysId.ToString(affiliate.Id));
SbmUpdateLogItemMonitor_Affiliate updateLogMonitor = new SbmUpdateLogItemMonitor_Affiliate(Internals, CreateAffiliate(dbAffiliate));
// Update properties.
PopulateTo(dbAffiliate, affiliate, dbUpdateInfo);
dbAffiliate.ExecuteUpdateCommand(dbCommand);
affiliate.Changed = false;
if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Updated. {GetLogProperties(affiliate).Concat(": ").Concat("", "\n\t")}");
// Record updates.
updateLogMonitor.RecordUpdatedValues(affiliate);
updateLogMonitor.LogUpdates();
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Delete Affiliate.
public override bool AffiliateCanBeDeleted(SbmAffiliate affiliate)
{
ClearErrorState();
if (!base.AffiliateCanBeDeleted(affiliate)) return false;
return true;
}
public override bool DeleteAffiliate(SbmAffiliate affiliate, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!AffiliateCanBeDeleted(affiliate)) return false;
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
// Retrieve Affiliate.
dbConnection.Open();
Affiliate_Db dbAffiliate = new Affiliate_Db(DbInfo);
dbAffiliate.PopulateFrom(dbCommand, aliasAffiliate, "Id=" + affiliate.Id.ToString());
// Delete Affiliate.
dbCommand.CommandType = System.Data.CommandType.Text;
dbCommand.CommandText = "DELETE FROM " + SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Affiliate) + " WHERE Id=" + SysId.ToString(affiliate.Id) + ";";
dbCommand.ExecuteNonQuery();
affiliate.Changed = false;
if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Deleted. {GetLogProperties(affiliate).Concat(": ").Concat("", "\n\t")}");
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Copy data properties to and from database.
private void PopulateTo(Affiliate_Db dbAffiliate, SbmAffiliate affiliate, DbUpdateInfo dbUpdateInfo)
{
dbAffiliate._Type = (short)affiliate.AffiliateType;
dbAffiliate._PhoneMain = affiliate.PhoneMain;
dbAffiliate._PhoneAlt = affiliate.PhoneAlt;
dbAffiliate._PhoneFax = affiliate.PhoneFax;
dbAffiliate._Email = affiliate.Email;
dbAffiliate._Website = affiliate.Website;
// Ogranisation.
dbAffiliate._AffIdParent = affiliate.AffiliateIdParent.ToInt();
if (affiliate.IsIndividual())
affiliate.Name = affiliate.GetDisplayName();
dbAffiliate._Name = affiliate.Name;
dbAffiliate._Abbrev = affiliate.Abbr;
dbAffiliate._Nature = affiliate.Nature;
dbAffiliate._Contact = affiliate.Contact;
dbAffiliate._CompanyNo = affiliate.CompanyNo;
dbAffiliate._VatReg = affiliate.VatReg;
dbAffiliate._PhoneDirect = affiliate.PhoneDirect;
// Individual.
dbAffiliate._Title = affiliate.Title;
dbAffiliate._Initials = affiliate.Initials;
dbAffiliate._FirstName = affiliate.FirstName;
dbAffiliate._LastName = affiliate.LastName;
dbAffiliate._Salutation = affiliate.Salutation;
dbAffiliate._PhoneMobile = affiliate.PhoneMobile;
dbAffiliate._BirthDay = affiliate.BirthDay;
dbAffiliate._BirthMonth = affiliate.BirthMonth;
dbAffiliate._BirthYear = affiliate.BirthYear;
dbAffiliate._MaritalStatus = affiliate.MaritalStatus;
dbAffiliate._Spouse = affiliate.Spouse;
dbAffiliate._Children = affiliate.Children;
dbAffiliate._Hometown = affiliate.Hometown;
dbAffiliate._UserId = affiliate.UserId.ToInt();
// Common properties.
dbAffiliate._Notes = affiliate.Notes;
dbAffiliate._Status = SacsSystem.GetStatusCode(affiliate.Status);
dbAffiliate._Flags = (short)affiliate.Flags;
if (!SysId.IsValid(affiliate.Id))
{
dbAffiliate._CreateOn = DateTime.UtcNow;
dbAffiliate._CreateBy = dbUpdateInfo.UserId.ToInt();
dbAffiliate._CreateHost = dbUpdateInfo.Host;
}
dbAffiliate._UpdateOn = DateTime.UtcNow;
dbAffiliate._UpdateBy = dbUpdateInfo.UserId.ToInt();
dbAffiliate._UpdateHost = dbUpdateInfo.Host;
}
private void PopulateFrom(Affiliate_Db dbAffiliate, SbmAffiliate affiliate)
{
//prmAffiliate.Id = new SysId(dbAffiliate._Id);
//affiliate.Category = (Sbm.AffiliateCategory)dbAffiliate._Cat;
affiliate.AffiliateType = (Sbm.AffiliateType)dbAffiliate._Type;
affiliate.PhoneMain = dbAffiliate._PhoneMain;
affiliate.PhoneAlt = dbAffiliate._PhoneAlt;
affiliate.PhoneFax = dbAffiliate._PhoneFax;
affiliate.Email = dbAffiliate._Email;
affiliate.Website = dbAffiliate._Website;
// Ogranisation.
affiliate.AffiliateIdParent = new SysId(dbAffiliate._AffIdParent ?? 0);
affiliate.Name = dbAffiliate._Name;
affiliate.Abbr = dbAffiliate._Abbrev;
affiliate.Nature = dbAffiliate._Nature;
affiliate.Contact = dbAffiliate._Contact;
affiliate.CompanyNo = dbAffiliate._CompanyNo;
affiliate.VatReg = dbAffiliate._VatReg;
affiliate.PhoneDirect = dbAffiliate._PhoneDirect;
// Individual.
affiliate.Title = dbAffiliate._Title;
affiliate.Initials = dbAffiliate._Initials;
affiliate.FirstName = dbAffiliate._FirstName;
affiliate.LastName = dbAffiliate._LastName;
affiliate.Salutation = dbAffiliate._Salutation;
affiliate.PhoneMobile = dbAffiliate._PhoneMobile;
affiliate.BirthDay = dbAffiliate._BirthDay ?? 0;
affiliate.BirthMonth = dbAffiliate._BirthMonth ?? 0;
affiliate.BirthYear = dbAffiliate._BirthYear ?? 0;
affiliate.MaritalStatus = dbAffiliate._MaritalStatus;
affiliate.Spouse = dbAffiliate._Spouse;
affiliate.Children = dbAffiliate._Children;
affiliate.Hometown = dbAffiliate._Hometown;
affiliate.UserId = new SysId(dbAffiliate._UserId ?? 0);
// Common properties.
affiliate.Notes = dbAffiliate._Notes;
affiliate.Status = SacsSystem.GetStatusForCode(dbAffiliate._Status);
affiliate.SetCreateStamp(dbAffiliate._CreateOn, new SysId(dbAffiliate._CreateBy ?? 0), dbAffiliate._CreateHost);
affiliate.SetUpdateStamp(dbAffiliate._UpdateOn ?? default(DateTime), new SysId(dbAffiliate._UpdateBy ?? 0), dbAffiliate._UpdateHost);
affiliate.AcceptChanges();
}
//-------------------------------------------------------------------
// Column definitions.
private static readonly String aliasAffiliate = "aAffil";
private static readonly String aliasAffiliate_AddPrim = "Aff_AddPrim";
private static readonly String prefixAffiliate_AddPrim = aliasAffiliate_AddPrim + "_";
private static readonly String colNameAffiliate_GroupMembers = "GroupMembers";
private static readonly String colNameAffiliate_AssociationOwnerCount = "AssocOwnerCount";
private static readonly String colNameAffiliate_AssociationTargetCount = "AssocTargetCount";
// Column definition population.
private void SetAffiliateColDfn
(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.Affiliate)
alias = aliasAffiliate;
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 prmAffiliate column definition.
public override ColumnDfn GetAffiliateColumnDfn(SbmAffiliate.Column columnId, string caption = "", int width = 0)
{
ColumnDfn columnDfn = new ColumnDfn((int)columnId, caption, width);
switch (columnId)
{
case SbmAffiliate.Column.Pos:
SetAffiliateColDfn(columnDfn, "Pos", 45, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right);
columnDfn.SortMode = ColumnDfn.ColumnSortMode.Off;
columnDfn.ReadOnly = true;
columnDfn.Resizable = false;
break;
case SbmAffiliate.Column.Id:
SetAffiliateColDfn(columnDfn, "Id", 60, SbmDbDfn.ColumnIdx.Affiliate_Id, ColumnAlignment.Right, DataValue.DataType.Long);
columnDfn.ReadOnly = true;
break;
// Affiliate Properties.
case SbmAffiliate.Column.Type:
SetAffiliateColDfn(columnDfn, "Type", 60, SbmDbDfn.ColumnIdx.Affiliate_Type, ColumnAlignment.Center, DataValue.DataType.Long);
break;
case SbmAffiliate.Column.Type_Code:
SetAffiliateColDfn(columnDfn, "Type", 70, SbmDbDfn.ColumnIdx.Affiliate_Type, ColumnAlignment.Center);
break;
case SbmAffiliate.Column.Type_Desc:
SetAffiliateColDfn(columnDfn, "Type", 80, SbmDbDfn.ColumnIdx.Affiliate_Type, ColumnAlignment.Center);
break;
case SbmAffiliate.Column.Name:
SetAffiliateColDfn(columnDfn, "Name", 160, SbmDbDfn.ColumnIdx.Affiliate_Name);
break;
case SbmAffiliate.Column.Abbrev:
SetAffiliateColDfn(columnDfn, "Abbrev", 90, SbmDbDfn.ColumnIdx.Affiliate_Abbrev);
break;
case SbmAffiliate.Column.Title:
SetAffiliateColDfn(columnDfn, "Title", 50, SbmDbDfn.ColumnIdx.Affiliate_Title);
break;
case SbmAffiliate.Column.Initials:
SetAffiliateColDfn(columnDfn, "Initials", 50, SbmDbDfn.ColumnIdx.Affiliate_Initials);
break;
case SbmAffiliate.Column.LastName:
SetAffiliateColDfn(columnDfn, "LastName", 80, SbmDbDfn.ColumnIdx.Affiliate_LastName);
break;
case SbmAffiliate.Column.FirstName:
SetAffiliateColDfn(columnDfn, "FirstName", 80, SbmDbDfn.ColumnIdx.Affiliate_FirstName);
break;
case SbmAffiliate.Column.Salutation:
SetAffiliateColDfn(columnDfn, "Salutation", 50, SbmDbDfn.ColumnIdx.Affiliate_Salutation);
break;
case SbmAffiliate.Column.Nature:
SetAffiliateColDfn(columnDfn, "Nature", 120, SbmDbDfn.ColumnIdx.Affiliate_Nature);
break;
case SbmAffiliate.Column.CompanyNo:
SetAffiliateColDfn(columnDfn, "CompanyNo", 50, SbmDbDfn.ColumnIdx.Affiliate_CompanyNo);
break;
case SbmAffiliate.Column.VatReg:
SetAffiliateColDfn(columnDfn, "VatReg", 80, SbmDbDfn.ColumnIdx.Affiliate_VatReg);
break;
case SbmAffiliate.Column.Contact:
SetAffiliateColDfn(columnDfn, "Contact", 120, SbmDbDfn.ColumnIdx.Affiliate_Contact);
break;
case SbmAffiliate.Column.PhoneMain:
SetAffiliateColDfn(columnDfn, "PhoneMain", 90, SbmDbDfn.ColumnIdx.Affiliate_PhoneMain);
break;
case SbmAffiliate.Column.PhoneDirect:
SetAffiliateColDfn(columnDfn, "PhoneDirect", 90, SbmDbDfn.ColumnIdx.Affiliate_PhoneDirect);
break;
case SbmAffiliate.Column.PhoneAlt:
SetAffiliateColDfn(columnDfn, "PhoneAlt", 90, SbmDbDfn.ColumnIdx.Affiliate_PhoneAlt);
break;
case SbmAffiliate.Column.PhoneMobile:
SetAffiliateColDfn(columnDfn, "PhoneMobile", 90, SbmDbDfn.ColumnIdx.Affiliate_PhoneMobile);
break;
case SbmAffiliate.Column.PhoneFax:
SetAffiliateColDfn(columnDfn, "PhoneFax", 90, SbmDbDfn.ColumnIdx.Affiliate_PhoneFax);
break;
case SbmAffiliate.Column.Email:
SetAffiliateColDfn(columnDfn, "Email", 160, SbmDbDfn.ColumnIdx.Affiliate_Email);
break;
case SbmAffiliate.Column.Website:
SetAffiliateColDfn(columnDfn, "Website", 160, SbmDbDfn.ColumnIdx.Affiliate_Website);
break;
case SbmAffiliate.Column.ProspectGroup:
SetAffiliateColDfn(columnDfn, "Prospect", 70, SbmDbDfn.ColumnIdx.Affiliate_Flags, ColumnAlignment.Center);
columnDfn.BoolFormat = ColumnBoolFormat.Tick;
break;
//---------------------------------------------------------------
// Addresses Summary.
case SbmAffiliate.Column.Address_Summary:
SetAffiliateColDfn(columnDfn, "Address", 220, SbmDbDfn.ColumnIdx.Address_Postcode, ColumnAlignment.Default, DataValue.DataType.String, aliasAffiliate_AddPrim);
break;
case SbmAffiliate.Column.Address_Line1:
SetAffiliateColDfn(columnDfn, "Address", 120, SbmDbDfn.ColumnIdx.Address_Line1, ColumnAlignment.Default, DataValue.DataType.String, aliasAffiliate_AddPrim, prefixAffiliate_AddPrim);
break;
case SbmAffiliate.Column.Address_Line2:
SetAffiliateColDfn(columnDfn, "Line 2", 120, SbmDbDfn.ColumnIdx.Address_Line2, ColumnAlignment.Default, DataValue.DataType.String, aliasAffiliate_AddPrim, prefixAffiliate_AddPrim);
break;
case SbmAffiliate.Column.Address_Line3:
SetAffiliateColDfn(columnDfn, "Line 3", 120, SbmDbDfn.ColumnIdx.Address_Line3, ColumnAlignment.Default, DataValue.DataType.String, aliasAffiliate_AddPrim, prefixAffiliate_AddPrim);
break;
case SbmAffiliate.Column.Address_City:
SetAffiliateColDfn(columnDfn, "City", 80, SbmDbDfn.ColumnIdx.Address_City, ColumnAlignment.Default, DataValue.DataType.String, aliasAffiliate_AddPrim, prefixAffiliate_AddPrim);
break;
case SbmAffiliate.Column.Address_Province:
SetAffiliateColDfn(columnDfn, "Province", 80, SbmDbDfn.ColumnIdx.Address_Province, ColumnAlignment.Default, DataValue.DataType.String, aliasAffiliate_AddPrim, prefixAffiliate_AddPrim);
break;
case SbmAffiliate.Column.Address_Country:
SetAffiliateColDfn(columnDfn, "Country", 80, SbmDbDfn.ColumnIdx.Address_Country, ColumnAlignment.Default, DataValue.DataType.String, aliasAffiliate_AddPrim, prefixAffiliate_AddPrim);
break;
case SbmAffiliate.Column.Address_Postcode:
SetAffiliateColDfn(columnDfn, "Postcode", 65, SbmDbDfn.ColumnIdx.Address_Postcode, ColumnAlignment.Center, DataValue.DataType.String, aliasAffiliate_AddPrim, prefixAffiliate_AddPrim);
break;
//-----------------------------------------------------------------
// Derived columns.
case SbmAffiliate.Column.GroupMembers:
SetAffiliateColDfn(columnDfn, "Members", 90, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right);
columnDfn.DataName = colNameAffiliate_GroupMembers;
break;
case SbmAffiliate.Column.AssociationOwner_Count:
SetAffiliateColDfn(columnDfn, "Owner Assocs", 90, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right);
columnDfn.DataName = colNameAffiliate_AssociationOwnerCount;
break;
case SbmAffiliate.Column.AssociationTarget_Count:
SetAffiliateColDfn(columnDfn, "Target Assocs", 90, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right);
columnDfn.DataName = colNameAffiliate_AssociationTargetCount;
break;
//-----------------------------------------------------------------
// Common properties.
case SbmAffiliate.Column.Notes:
SetAffiliateColDfn(columnDfn, "Notes", 240, SbmDbDfn.ColumnIdx.Affiliate_Notes);
break;
case SbmAffiliate.Column.Status:
SetAffiliateColDfn(columnDfn, "Status", 80, SbmDbDfn.ColumnIdx.Affiliate_Status, ColumnAlignment.Center);
break;
case SbmAffiliate.Column.Status_Desc:
SetAffiliateColDfn(columnDfn, "Status", 90, SbmDbDfn.ColumnIdx.Affiliate_Status, ColumnAlignment.Center);
break;
case SbmAffiliate.Column.Status_Ind:
SetAffiliateColDfn(columnDfn, "Status", 80, SbmDbDfn.ColumnIdx.Affiliate_Status, ColumnAlignment.Center, DataValue.DataType.TriState);
columnDfn.TriStateFormat = ColumnTriStateFormat.Lights;
break;
case SbmAffiliate.Column.CreateOn_Date:
SetAffiliateColDfn(columnDfn, "Created", 80, SbmDbDfn.ColumnIdx.Affiliate_CreateOn, ColumnAlignment.Center, DataValue.DataType.Date);
columnDfn.ReadOnly = true;
break;
case SbmAffiliate.Column.UpdateOn_Date:
SetAffiliateColDfn(columnDfn, "Updated", 80, SbmDbDfn.ColumnIdx.Affiliate_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;
}
//-------------------------------------------------------------------
// Affiliate query filter.
public override List<string> GetAffiliateQueryFilter(SbmAffiliate.Params prm)
{
List<String> filter = new List<String>();
// Item Id.
String colAffiliate_Id = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Id, aliasAffiliate);
if (prm.IdsIncluded.HasValidIds())
filter.Add($"{colAffiliate_Id} IN ({prm.IdsIncluded.Concat(",")})");
if (prm.IdsExcluded.HasValidIds())
filter.Add($"{colAffiliate_Id} NOT IN ({prm.IdsExcluded.Concat(",")})");
// Type.
String colAffiliate_Type = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Type, aliasAffiliate);
// Affiliate type - Individual.
if (prm.AffiliateType == Sbm.AffiliateType.AnyOrganisation)
filter.Add($"{colAffiliate_Type} Not In ({(int)Sbm.AffiliateType.Individual}, {(int)Sbm.AffiliateType.ContactGroup})");
// Affiliate type - ContactGroup.
else if (prm.AffiliateType == Sbm.AffiliateType.AnyContact)
filter.Add($"{colAffiliate_Type}<>{(int)Sbm.AffiliateType.ContactGroup}");
// Affiliate type.
else if (prm.AffiliateType != Sbm.AffiliateType.Any && prm.AffiliateType != Sbm.AffiliateType.Unknown)
filter.Add($"{colAffiliate_Type}={(int)prm.AffiliateType}");
// Parent Id.
String colAffiliate_AffIdParent = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_AffIdParent, aliasAffiliate);
if (SysId.IsValid(prm.AffiliateIdParent))
filter.Add($"{colAffiliate_AffIdParent}={SysId.ToString(prm.AffiliateIdParent)}");
//---------------------------------------------------------------
// Common columns.
String colAffiliate_Name = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Name, aliasAffiliate);
String colAffiliate_FirstName = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_FirstName, aliasAffiliate);
String colAffiliate_LastName = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_LastName, aliasAffiliate);
String colAffiliate_PhoneMain = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_PhoneMain, aliasAffiliate);
String colAffiliate_PhoneAlt = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_PhoneAlt, aliasAffiliate);
String colAffiliate_PhoneFax = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_PhoneFax);
String colAffiliate_PhoneMobile = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_PhoneMobile);
String colAffiliate_PhoneDirect = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_PhoneDirect);
String colAffiliate_Website = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Website, aliasAffiliate);
String colAffiliate_Email = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Email, aliasAffiliate);
String colAffiliate_Notes = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Notes, aliasAffiliate);
//---------------------------------------------------------------
// Generic search.
if (!StringUtil.IsEmpty(prm.Search))
{
List<String> searchFilter = new List<string>();
foreach (String rawSearchValue in prm.Search.Split(new char[] { ' ', ',', ';' }))
{
String searchValue = DbQuery.FormatForLike(StringUtil.TrimAll(rawSearchValue));
if (StringUtil.IsEmpty(searchValue)) continue;
List<String> searchValueFilter = new List<string>();
searchValueFilter.Add(colAffiliate_Name + " LIKE '%" + searchValue + "%'");
searchValueFilter.Add(colAffiliate_FirstName + " LIKE '%" + searchValue + "%'");
searchValueFilter.Add(colAffiliate_LastName + " LIKE '%" + searchValue + "%'");
searchValueFilter.Add(colAffiliate_PhoneMain + " LIKE '%" + searchValue + "%'");
searchValueFilter.Add(colAffiliate_PhoneAlt + " LIKE '%" + searchValue + "%'");
searchValueFilter.Add(colAffiliate_Website + " LIKE '%" + searchValue + "%'");
searchValueFilter.Add(colAffiliate_Email + " LIKE '%" + searchValue + "%'");
searchValueFilter.Add(colAffiliate_Notes + " LIKE '%" + searchValue + "%'");
searchFilter.Add(searchValueFilter.Concat(" OR ", "(", ")"));
}
filter.AddRange(searchFilter);
}
//---------------------------------------------------------------
// Name.
if (!StringUtil.IsEmpty(prm.Name))
filter.Add(colAffiliate_Name + "='" + DbQuery.FormatForCondition(prm.Name) + "'");
// Partial Name with FirstName & LastName.
if (!StringUtil.IsEmpty(prm.NamePartial))
filter.Add(colAffiliate_Name + " LIKE '%" + DbQuery.FormatForLike(prm.NamePartial) + "%' OR " + colAffiliate_FirstName + " LIKE '%" + DbQuery.FormatForLike(prm.NamePartial) + "%' OR " + colAffiliate_LastName + " LIKE '%" + DbQuery.FormatForLike(prm.NamePartial) + "%'");
// First Name.
if (!StringUtil.IsEmpty(prm.FirstName))
filter.Add(colAffiliate_FirstName + "='" + DbQuery.FormatForCondition(prm.FirstName) + "'");
// Last Name.
if (!StringUtil.IsEmpty(prm.LastName))
filter.Add(colAffiliate_LastName + "='" + DbQuery.FormatForCondition(prm.LastName) + "'");
// Partial Email.
if (!StringUtil.IsEmpty(prm.EmailPartial))
filter.Add(colAffiliate_Email + " LIKE '%" + DbQuery.FormatForLike(prm.EmailPartial) + "%'");
//---------------------------------------------------------------
// Partial Phone - type of phone number held against addresses.
if (!StringUtil.IsEmpty(prm.PhonePartial))
{
// Search for matches in any of the phone numbers associated with the affiliate.
String aliasAffAddPhone = "aAffAddPhone";
String colAddress_Id = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Id, aliasAffAddPhone);
String colAddress_Owner = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_AffIdOwner, aliasAffAddPhone);
String colAddress_Phone = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Phone, aliasAffAddPhone);
String colAddress_Fax = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Fax, aliasAffAddPhone);
// Build the sub query to match addresses with this partial phone number.
DbQuery qryAddressPhone = new DbQuery(Database.DbmsType);
qryAddressPhone.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Address), aliasAffAddPhone);
qryAddressPhone.Columns.Add(colAddress_Id);
qryAddressPhone.Filters.Add(colAddress_Owner + "=" + colAffiliate_Id);
qryAddressPhone.Filters.Add(colAddress_Phone + "='" + DbQuery.FormatForCondition(prm.PhonePartial) + "' OR " + DbQuery.FormatFn_Left(colAddress_Phone, DbQuery.FormatForCondition(prm.PhonePartial).Length) + "='" + DbQuery.FormatForCondition(prm.PhonePartial) + "' OR " + colAddress_Phone + " LIKE '%" + DbQuery.FormatForLike(prm.PhonePartial) + "%'");
qryAddressPhone.Filters.Add(colAddress_Fax + "='" + DbQuery.FormatForCondition(prm.PhonePartial) + "' OR " + DbQuery.FormatFn_Left(colAddress_Fax, DbQuery.FormatForCondition(prm.PhonePartial).Length) + "='" + DbQuery.FormatForCondition(prm.PhonePartial) + "' OR " + colAddress_Fax + " LIKE '%" + DbQuery.FormatForLike(prm.PhonePartial) + "%'");
// Phone filters.
List<String> filterPhone = new List<String>();
filterPhone.Add(colAffiliate_PhoneMain + "='" + DbQuery.FormatForCondition(prm.PhonePartial) + "' OR " + DbQuery.FormatFn_Left(colAffiliate_PhoneMain, DbQuery.FormatForCondition(prm.PhonePartial).Length) + "='" + DbQuery.FormatForCondition(prm.PhonePartial) + "' OR " + colAffiliate_PhoneMain + " LIKE '%" + DbQuery.FormatForLike(prm.PhonePartial) + "%'");
filterPhone.Add(colAffiliate_PhoneAlt + "='" + DbQuery.FormatForCondition(prm.PhonePartial) + "' OR " + DbQuery.FormatFn_Left(colAffiliate_PhoneAlt, DbQuery.FormatForCondition(prm.PhonePartial).Length) + "='" + DbQuery.FormatForCondition(prm.PhonePartial) + "' OR " + colAffiliate_PhoneAlt + " LIKE '%" + DbQuery.FormatForLike(prm.PhonePartial) + "%'");
filterPhone.Add(colAffiliate_PhoneFax + "='" + DbQuery.FormatForCondition(prm.PhonePartial) + "' OR " + DbQuery.FormatFn_Left(colAffiliate_PhoneFax, DbQuery.FormatForCondition(prm.PhonePartial).Length) + "='" + DbQuery.FormatForCondition(prm.PhonePartial) + "' OR " + colAffiliate_PhoneFax + " LIKE '%" + DbQuery.FormatForLike(prm.PhonePartial) + "%'");
filterPhone.Add(colAffiliate_PhoneMobile + "='" + DbQuery.FormatForCondition(prm.PhonePartial) + "' OR " + DbQuery.FormatFn_Left(colAffiliate_PhoneMobile, DbQuery.FormatForCondition(prm.PhonePartial).Length) + "='" + DbQuery.FormatForCondition(prm.PhonePartial) + "' OR " + colAffiliate_PhoneMobile + " LIKE '%" + DbQuery.FormatForLike(prm.PhonePartial) + "%'");
filterPhone.Add(colAffiliate_PhoneDirect + "='" + DbQuery.FormatForCondition(prm.PhonePartial) + "' OR " + DbQuery.FormatFn_Left(colAffiliate_PhoneDirect, DbQuery.FormatForCondition(prm.PhonePartial).Length) + "='" + DbQuery.FormatForCondition(prm.PhonePartial) + "' OR " + colAffiliate_PhoneMobile + " LIKE '%" + DbQuery.FormatForLike(prm.PhonePartial) + "%'");
filterPhone.Add("EXISTS (" + qryAddressPhone.BuildQuery() + ")");
filter.Add(filterPhone.Concat(" OR "));
}
//---------------------------------------------------------------
// Partial Address & Partial Postcode - stripping spaces and using the formatted postcode column.
String postcodePartial = DbQuery.FormatForCondition(StringUtil.EmptyOnNull(prm.PostcodePartial).ReplaceAll(" ", ""));
String addressPartial = DbQuery.FormatForCondition(StringUtil.EmptyOnNull(prm.AddressPartial));
if (!StringUtil.IsEmpty(postcodePartial) || !StringUtil.IsEmpty(addressPartial))
{
String aliasAffiliate_Address = "aAffAdd";
String colAddress_Id = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Id, aliasAffiliate_Address);
String colAddress_Owner = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_AffIdOwner, aliasAffiliate_Address);
// Build the sub query.
DbQuery qryAddressPostcode = new DbQuery(Database.DbmsType);
qryAddressPostcode.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Address), aliasAffiliate_Address);
qryAddressPostcode.Columns.Add(colAddress_Id);
qryAddressPostcode.Filters.Add(colAddress_Owner + "=" + colAffiliate_Id);
if (!StringUtil.IsEmpty(prm.PostcodePartial))
{
String colAddress_Postcode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_PostcodeFmt, aliasAffiliate_Address);
qryAddressPostcode.Filters.Add(DbQuery.FormatFn_Left(colAddress_Postcode, postcodePartial.Length) + "='" + postcodePartial + "'");
}
if (!StringUtil.IsEmpty(prm.AddressPartial))
{
// Address filters.
List<SbmDbDfn.ColumnIdx> addressCols = new List<SbmDbDfn.ColumnIdx>()
{
SbmDbDfn.ColumnIdx.Address_Name,
SbmDbDfn.ColumnIdx.Address_Line1,
SbmDbDfn.ColumnIdx.Address_Line2,
SbmDbDfn.ColumnIdx.Address_Line3,
SbmDbDfn.ColumnIdx.Address_City,
//SbmDbDfn.ColumnIdx.Address_Province,
SbmDbDfn.ColumnIdx.Address_Contact,
};
List<String> filterAddress = new List<String>();
foreach (SbmDbDfn.ColumnIdx addressCol in addressCols)
filterAddress.Add(SbmDbDfn.GetColumnNameQual(addressCol, aliasAffiliate_Address) + " LIKE '%" + DbQuery.FormatForCondition(addressPartial) + "%'");
qryAddressPostcode.Filters.Add(filterAddress.Concat(" OR ", "(", ")"));
}
qryAddressPostcode.Filters.Add(GetPrimaryAddressFilter(true, aliasAffiliate_Address));
filter.Add("EXISTS (" + qryAddressPostcode.BuildQuery() + ")");
}
//---------------------------------------------------------------
// Association.
if (SysId.IsValid(prm.AffiliateIdAssocOwner) || SysId.IsValid(prm.AffiliateIdAssocTarget) || prm.AssociationType > 0 || prm.AssociationTypeExclude > 0)
{
String aliasAffAssocRef = "aAffAssocRef";
String colAssociation_Id = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Id, aliasAffAssocRef);
String colAssociation_AffOwner = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_AffIdOwner, aliasAffAssocRef);
String colAssociation_AffTarget = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_AffIdTarget, aliasAffAssocRef);
String subFilter = "";
if (SysId.IsValid(prm.AffiliateIdAssocOwner))
{
// Restrict to affiliates that are the target of an association with the specified owner.
subFilter = colAffiliate_Id + "=" + colAssociation_AffTarget + " AND " + colAssociation_AffOwner + "=" + prm.AffiliateIdAssocOwner.ToString();
}
else if (SysId.IsValid(prm.AffiliateIdAssocTarget))
{
// Restrict to affiliates that are the owner of an association with the specified target.
subFilter = colAffiliate_Id + "=" + colAssociation_AffOwner + " AND " + colAssociation_AffTarget + "=" + prm.AffiliateIdAssocTarget.ToString();
}
else if (prm.AssociationType > 0)
{
// Restrict to affiliates that have an association of the specified type.
subFilter = colAffiliate_Id + "=" + colAssociation_AffOwner + " OR " + colAffiliate_Id + "=" + colAssociation_AffTarget;
}
else if (prm.AssociationTypeExclude > 0)
{
// Restrict to affiliates that don't have an association of the specified type.
subFilter = colAffiliate_Id + "=" + colAssociation_AffOwner + " OR " + colAffiliate_Id + "=" + colAssociation_AffTarget;
}
// Restrict to associations of the specified type.
if (prm.AssociationType > 0)
subFilter += " AND " + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Type, aliasAffAssocRef) + "=" + ((int)prm.AssociationType).ToString();
// Exclude associations of the specified type:
if (prm.AssociationTypeExclude > 0)
subFilter += " AND " + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Type, aliasAffAssocRef) + "<>" + prm.AssociationTypeExclude.ToString();
// Should these associations also be retricted to those that are 'supervisory':
if (prm.TargetSupervised != SbmAffiliate.Params.Supervised.Any)
{
bool superMatch = prm.TargetSupervised == SbmAffiliate.Params.Supervised.Yes;
subFilter += " AND " + GetFlagFilter(SbmAssociation.Flag_Supervised, superMatch, aliasAffAssocRef);
}
DbQuery qryAssociationTarget = new DbQuery(Database.DbmsType);
qryAssociationTarget.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Association), aliasAffAssocRef);
qryAssociationTarget.Columns.Add(colAssociation_Id);
qryAssociationTarget.Filters.Add(subFilter);
if (!DateUtil.IsValid(prm.AssociationEffectiveOn))
{
// NB 'Association.Terminated' column is a long value (not a date).
String colAssociation_Terminated = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Terminated, aliasAffAssocRef);
List<String> filterApplication = new List<String>();
filterApplication.Add(colAssociation_Terminated + " IS NULL");
filterApplication.Add(colAssociation_Terminated + "=" + "0"); //DbQuery.FormatForCondition(Date(1,1,1970)));
filterApplication.Add(colAssociation_Terminated + ">=" + (prm.AssociationEffectiveOn.Year << 16 + prm.AssociationEffectiveOn.Month << 8 + prm.AssociationEffectiveOn.Day).ToString());
qryAssociationTarget.Filters.Add(filterApplication.Concat(" OR ", "(", ")"));
}
if (prm.CurrentAssociationsOnly)
qryAssociationTarget.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Status, aliasAffAssocRef) + "='" + StatusCurrent + "'");
filter.Add("EXISTS (" + qryAssociationTarget.BuildQuery() + ")");
}
// Affiliate Exclude TargetOf Id.
if (SysId.IsValid(prm.AffiliateIdExcludeTargetsOf))
{
// Restrict to affiliates that are the owner of an association with the specified target:
String aliasAffAssExclude = "aAffAssExc";
DbQuery qryAssociationTarget = new DbQuery(Database.DbmsType);
qryAssociationTarget.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Association), aliasAffAssExclude);
qryAssociationTarget.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_AffIdTarget, aliasAffAssExclude));
qryAssociationTarget.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_AffIdOwner, aliasAffAssExclude) + "=" + colAffiliate_Id);
qryAssociationTarget.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_AffIdOwner, aliasAffAssExclude) + "=" + prm.AffiliateIdExcludeTargetsOf.ToString());
filter.Add("NOT EXISTS (" + qryAssociationTarget.BuildQuery() + ")");
}
//---------------------------------------------------------------
// User Id.
String colAffiliate_UserId = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_UserId, aliasAffiliate);
if (SysId.IsValid(prm.UserId))
filter.Add($"{colAffiliate_UserId}={SysId.ToString(prm.UserId)}");
// System User Interface.
if (SysId.IsValid(prm.InterfaceIdExcludeSystemUsers))
{
// Exclude affiliates that are already a system user for the specified Inteface.
String aliasSystemUser = "aSysUser";
DbQuery qrySystemUser = new DbQuery(Database.DbmsType);
qrySystemUser.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SystemUser), aliasSystemUser);
qrySystemUser.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SystemUser_Id, aliasSystemUser));
qrySystemUser.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SystemUser_AffiliateId, aliasSystemUser) + "=" + colAffiliate_Id);
filter.Add($"NOT EXISTS ({qrySystemUser.BuildQuery()})");
}
//---------------------------------------------------------------
// Common properties.
// Partial Notes.
if (!StringUtil.IsEmpty(prm.NotesPartial))
filter.Add($"{colAffiliate_Notes} LIKE '%{DbQuery.FormatForLike(prm.NotesPartial)}%'");
// Status.
if (prm.StatusCat != SbmAffiliate.StatusCat.Any)
{
String colStatus = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Status, aliasAffiliate);
if (prm.StatusCat == SbmAffiliate.StatusCat.CurrentOnly)
filter.Add($"{colStatus}='{StatusCurrent}'");
else if (prm.StatusCat == SbmAffiliate.StatusCat.OnHoldOnly)
filter.Add($"{colStatus}='{SacsSystem.GetStatusCode(SaStatus.OnHold)}'");
else if (prm.StatusCat == SbmAffiliate.StatusCat.NotDeleted)
filter.Add($"{colStatus}!='{SacsSystem.GetStatusCode(SaStatus.Deleted)}'");
else if (prm.StatusCat == SbmAffiliate.StatusCat.DeletedOnly)
filter.Add($"{colStatus}='{SacsSystem.GetStatusCode(SaStatus.Deleted)}'");
}
if (filter.Count < 1 && prm.IncludeDefaultFilter) filter.Add("1=1");
return filter;
}
//-------------------------------------------------------------------
// Affiliate sort columns.
public List<String> GetAffiliateSortColumns(SbmAffiliate.Params prm)
{
// Sort sequence:
List<String> sortColumnNames = new List<String>();
foreach (var columnDfn in prm.SortColumns)
{
// Need to ensure correct alias used for Affiliate columns in case of conflict.
String sortCol = String.Empty;
if (SbmDbDfn.GetTableForColumn((SbmDbDfn.ColumnIdx)columnDfn.DbColumn) == SbmDbDfn.TableIdx.Affiliate)
{
sortCol = SbmDbDfn.GetColumnNameQual((SbmDbDfn.ColumnIdx)columnDfn.DbColumn, aliasAffiliate);
}
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.Affiliate_Type, aliasAffiliate) + " ASC");
sortColumnNames.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Name, aliasAffiliate) + " ASC");
}
return sortColumnNames;
}
//-------------------------------------------------------------------
// GetAffiliateCount.
private long GetAffiliateCount(String filter)
{
ClearErrorState();
return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Affiliate) + " As " + aliasAffiliate, filter);
}
public override long GetAffiliateCount(SbmAffiliate.Params prm)
{
ClearErrorState();
return GetAffiliateCount(GetAffiliateQueryFilter(prm).Concat(" AND ", "(", ")"));
}
/* ToDo GetAffiliateIds.
public SysId GetAffiliateIds(SbmAffiliate.Params prmAffiliate)
{
ClearErrorState();
List<SysId> affiliateIds = new List<SysId>();
if (db != null)
{
DbQuery qryAffId = new DbQuery(Database.DbmsType);
qryAffId.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Affiliate));
String colAffiliate_Id = "AffiliateId";
qryAffId.Columns.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Affiliate_Id, true), colAffiliate_Id);
qryAffId.Filters.AddRange(GetAffiliateQueryFilter(prmAffiliate));
Database.ErrorState = qryAffId.BuildQuery;
}
}*/
//-------------------------------------------------------------------
// Affiliate list.
public override List<SbmAffiliate> GetAffiliateList(SbmAffiliate.Params prm)
{
ClearErrorState();
List<SbmAffiliate> affiliates = new List<SbmAffiliate>();
DbQuery qry = new DbQuery(Database.DbmsType);
qry.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Affiliate), aliasAffiliate);
Affiliate_Db dbAffiliate = new Affiliate_Db(DbInfo);
qry.Columns.AddRange(dbAffiliate.ExistingColumnNames);
qry.Filters.AddRange(GetAffiliateQueryFilter(prm));
qry.OrderBy.AddRange(GetAffiliateSortColumns(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())
{
dbAffiliate = new Affiliate_Db(DbInfo);
dbAffiliate.PopulateFrom(dbDataReader);
affiliates.Add(CreateAffiliate(dbAffiliate));
}
}
}
catch (Exception exc)
{
SetErrorState("Database query exception");
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
}
}
return affiliates;
}
//-------------------------------------------------------------------
// Affiliate query execution.
public override DbResultSet ExecuteAffiliateQuery(List<ColumnDfn> columns, SbmAffiliate.Params prm)
{
ClearErrorState();
//---------------------------------------------------------------
// Construct query.
DbQuery query = new DbQuery(Database.DbmsType);
query.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Affiliate), aliasAffiliate);
// Affiliate Properties - add columns as defined in query list.
if (columns.HasId(SbmAffiliate.Column.Id))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Id, aliasAffiliate));
if (columns.HasId(SbmAffiliate.Column.Type) || columns.HasId(SbmAffiliate.Column.Type_Code) || columns.HasId(SbmAffiliate.Column.Type_Desc))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Type, aliasAffiliate));
if (columns.HasId(SbmAffiliate.Column.Name))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Name, aliasAffiliate));
if (columns.HasId(SbmAffiliate.Column.Abbrev))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Abbrev, aliasAffiliate));
if (columns.HasId(SbmAffiliate.Column.Title))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Title, aliasAffiliate));
if (columns.HasId(SbmAffiliate.Column.Initials))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Initials, aliasAffiliate));
if (columns.HasId(SbmAffiliate.Column.LastName))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_LastName, aliasAffiliate));
if (columns.HasId(SbmAffiliate.Column.FirstName))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_FirstName, aliasAffiliate));
if (columns.HasId(SbmAffiliate.Column.Salutation))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Salutation, aliasAffiliate));
if (columns.HasId(SbmAffiliate.Column.Nature))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Nature, aliasAffiliate));
if (columns.HasId(SbmAffiliate.Column.CompanyNo))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_CompanyNo, aliasAffiliate));
if (columns.HasId(SbmAffiliate.Column.VatReg))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_VatReg, aliasAffiliate));
if (columns.HasId(SbmAffiliate.Column.Contact))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Contact, aliasAffiliate));
if (columns.HasId(SbmAffiliate.Column.PhoneMain))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_PhoneMain, aliasAffiliate));
if (columns.HasId(SbmAffiliate.Column.PhoneAlt))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_PhoneAlt, aliasAffiliate));
if (columns.HasId(SbmAffiliate.Column.PhoneDirect))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_PhoneDirect, aliasAffiliate));
if (columns.HasId(SbmAffiliate.Column.PhoneFax))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_PhoneFax, aliasAffiliate));
if (columns.HasId(SbmAffiliate.Column.PhoneMobile))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_PhoneMobile, aliasAffiliate));
if (columns.HasId(SbmAffiliate.Column.Email))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Email, aliasAffiliate));
if (columns.HasId(SbmAffiliate.Column.Website))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Website, aliasAffiliate));
// Common Properties
if (columns.HasId(SbmAffiliate.Column.Notes))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Notes, aliasAffiliate));
if (columns.HasId(SbmAffiliate.Column.Status) || columns.HasId(SbmAffiliate.Column.Status_Desc) || columns.HasId(SbmAffiliate.Column.Status_Ind))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Status, aliasAffiliate));
if (columns.HasId(SbmAffiliate.Column.CreateOn_Date))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_CreateOn, aliasAffiliate));
if (columns.HasId(SbmAffiliate.Column.UpdateOn_Date))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_UpdateOn, aliasAffiliate));
//---------------------------------------------------------------
// Primary address.
bool hasColsAddPrim = false;
if (!hasColsAddPrim) hasColsAddPrim = columns.HasId(SbmAffiliate.Column.Address_Summary);
if (!hasColsAddPrim) hasColsAddPrim = columns.HasId(SbmAffiliate.Column.Address_Line1);
if (!hasColsAddPrim) hasColsAddPrim = columns.HasId(SbmAffiliate.Column.Address_Line2);
if (!hasColsAddPrim) hasColsAddPrim = columns.HasId(SbmAffiliate.Column.Address_Line3);
if (!hasColsAddPrim) hasColsAddPrim = columns.HasId(SbmAffiliate.Column.Address_City);
if (!hasColsAddPrim) hasColsAddPrim = columns.HasId(SbmAffiliate.Column.Address_Province);
if (!hasColsAddPrim) hasColsAddPrim = columns.HasId(SbmAffiliate.Column.Address_Postcode);
if (!hasColsAddPrim) hasColsAddPrim = columns.HasId(SbmAffiliate.Column.Address_Country);
if (hasColsAddPrim)
{
// Sub-query to identify primary address with lowest Id for each affiliate.
DbQuery qryAddPrimMinId = new DbQuery(Database.DbmsType);
qryAddPrimMinId.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Address));
qryAddPrimMinId.Filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Address_ItemType) + "=" + ((int)Sbm.ItemType.Affiliate).ToString());
qryAddPrimMinId.Filters.Add(DbQuery.BuildBitMappedFilter(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Address_Flags), SbmAddress.Flag_Primary, true));
qryAddPrimMinId.Columns.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Address_ItemType));
qryAddPrimMinId.Columns.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Address_ItemId));
qryAddPrimMinId.Columns.Add("Min(" + SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Address_Id) + ")", SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Address_Id, false));
qryAddPrimMinId.GroupBy.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Address_ItemType));
qryAddPrimMinId.GroupBy.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Address_ItemId));
// Join to primary address with lowest Id.
String aliasAffiliate_AddPrimId = "AddPrimId";
DbQueryJoin joinAddPrimId = new DbQueryJoin(DbJoinType.LeftOuter);
joinAddPrimId.Table = new StringPair("(" + qryAddPrimMinId.BuildQuery() + ")", aliasAffiliate_AddPrimId);
joinAddPrimId.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_ItemType, aliasAffiliate_AddPrimId) + "=" + ((int)Sbm.ItemType.Affiliate).ToString());
joinAddPrimId.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_ItemId, aliasAffiliate_AddPrimId) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Id, aliasAffiliate));
query.Joins.Add(joinAddPrimId);
// Join to the primary address with lowest Id.
DbQueryJoin joinAddPrim = new DbQueryJoin(DbJoinType.LeftOuter);
joinAddPrim.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Address), aliasAffiliate_AddPrim);
joinAddPrim.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Id, aliasAffiliate_AddPrim) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Id, aliasAffiliate_AddPrimId));
query.Joins.Add(joinAddPrim);
// Add the Address columns.
List<SbmDbDfn.ColumnIdx> addprimaryCols = new List<SbmDbDfn.ColumnIdx>()
{
SbmDbDfn.ColumnIdx.Address_Id,
SbmDbDfn.ColumnIdx.Address_Line1,
SbmDbDfn.ColumnIdx.Address_Line2,
SbmDbDfn.ColumnIdx.Address_Line3,
SbmDbDfn.ColumnIdx.Address_City,
SbmDbDfn.ColumnIdx.Address_Province,
SbmDbDfn.ColumnIdx.Address_Postcode,
SbmDbDfn.ColumnIdx.Address_Country,
SbmDbDfn.ColumnIdx.Address_Contact,
SbmDbDfn.ColumnIdx.Address_Phone,
SbmDbDfn.ColumnIdx.Address_Fax,
SbmDbDfn.ColumnIdx.Address_Email,
};
foreach (SbmDbDfn.ColumnIdx dbColumn in addprimaryCols)
query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasAffiliate_AddPrim), prefixAffiliate_AddPrim + SbmDbDfn.GetColumnName(dbColumn, false));
}
//---------------------------------------------------------------
if (columns.HasId(SbmAffiliate.Column.GroupMembers))
{
// Count group members.
String aliasAffiliate_GroupMembers = "AffGrpMembers";
DbQuery qryGrpMembers = new DbQuery(Database.DbmsType);
qryGrpMembers.Tables.Add((SbmDbDfn.TableIdx.Association).ToString(), aliasAffiliate_GroupMembers);
// Was: qryGrpMembers.Columns.Add("Count(" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Id, aliasGrpMembers) + ")");
qryGrpMembers.Columns.Add("Count(*)");
qryGrpMembers.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_AffIdOwner, aliasAffiliate_GroupMembers) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Id, aliasAffiliate));
qryGrpMembers.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Type, aliasAffiliate_GroupMembers) + "=" + ((int)Sbm.AssociationType.Member).ToString());
query.Columns.Add("(" + qryGrpMembers.BuildQuery() + ")", colNameAffiliate_GroupMembers);
}
//---------------------------------------------------------------
// Associations.
if (columns.HasId(SbmAffiliate.Column.AssociationOwner_Count))
{
// Count active associations.
String aliasAffiliate_Associations_Owner = "AffAssOwner";
DbQuery qryAssocs = new DbQuery(Database.DbmsType);
qryAssocs.Tables.Add((SbmDbDfn.TableIdx.Association).ToString(), aliasAffiliate_Associations_Owner);
qryAssocs.Columns.Add("Count(*)");
qryAssocs.Filters.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_AffIdOwner, aliasAffiliate_Associations_Owner)}={SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Id, aliasAffiliate)}");
qryAssocs.Filters.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Type, aliasAffiliate_Associations_Owner)}!={(int)Sbm.AssociationType.Internal}");
qryAssocs.Filters.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Status, aliasAffiliate_Associations_Owner)}='{StatusCurrent}'");
query.Columns.Add("(" + qryAssocs.BuildQuery() + ")", colNameAffiliate_AssociationOwnerCount);
}
if (columns.HasId(SbmAffiliate.Column.AssociationTarget_Count))
{
// Count active associations.
String aliasAffiliate_Associations_Target = "AffAssTarget";
DbQuery qryAssocs = new DbQuery(Database.DbmsType);
qryAssocs.Tables.Add((SbmDbDfn.TableIdx.Association).ToString(), aliasAffiliate_Associations_Target);
qryAssocs.Columns.Add("Count(*)");
qryAssocs.Filters.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_AffIdTarget, aliasAffiliate_Associations_Target)}={SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Id, aliasAffiliate)}");
qryAssocs.Filters.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Type, aliasAffiliate_Associations_Target)}!={(int)Sbm.AssociationType.Internal}");
qryAssocs.Filters.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Status, aliasAffiliate_Associations_Target)}='{StatusCurrent}'");
query.Columns.Add("(" + qryAssocs.BuildQuery() + ")", colNameAffiliate_AssociationTargetCount);
}
//---------------------------------------------------------------
// Populate filter.
query.Filters.AddRange(GetAffiliateQueryFilter(prm));
if (prm.IdsIncluded.Count != 1)
{
// Configure sort sequence.
foreach (String sortColumn in GetAffiliateSortColumns(prm))
query.OrderBy.Add(sortColumn);
}
//---------------------------------------------------------------
//return new DbResultSet_DataTableReader(db, query.BuildQuery());
return DbResultSet_DataReader.ExecuteQuery(Database, query.BuildQuery(prm.ResultsPaging));
}
//-------------------------------------------------------------------
}
//=======================================================================
}