Files
BusinessMgr-2019/SaBusMgrStandardDbas/Dbas/Mgr/SbmTransactionMgr_Dbas-Constituent.cs
T
2024-12-04 15:30:59 +00:00

1212 lines
62 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.ReferenceData;
using Sarand.Net.Standard.Base.Utils;
using Sarand.Net.Standard.Dbas.Base;
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 SbmTransactionMgr_Dbas
{
//*******************************************************************
// C o n s t i t u e n t
//*******************************************************************
// Data members.
private bool uomTimePopulated = false;
//-------------------------------------------------------------------
// Utilities.
private List<StringPair> GetLogProperties(SbmConstituent constituent)
{
return new List<StringPair>()
{
new StringPair("Id",SysId.ToString(constituent.Id)),
new StringPair("DescBrief",constituent.DescBrief),
new StringPair("Status",constituent.StatusCode)
};
}
/// <summary>Get the unit of time specified by the Unit of Measure.</summary>
public override SaUomType GetTimeTypeForUom(SysId uomId)
{
SaUnitMeasure unitMeasure = TransactionMgr.FindUnitOfMeasureById(uomId);
if (unitMeasure != null && unitMeasure.Category == SaUomCategory.Time)
return unitMeasure.UnitType;
return SaUomType.Time_Hour;
}
//-------------------------------------------------------------------
/// <summary>Refresh the total time stored against all transactions and requirments in the system.</summary>
public override bool RefreshAllTotalTimes()
{
// Update all transactions.
String colTransaction_Id = SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Transaction_Id, false);
DbQuery qryTrans = new DbQuery(db.DbmsType);
qryTrans.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction));
qryTrans.Columns.Add(colTransaction_Id);
using (DbResultSet dbResultSet = DbResultSet_DataReader.ExecuteQuery(db, qryTrans.ToString()))
{
if (dbResultSet != null && dbResultSet.NextRecord())
{
NamedValue.Map values = dbResultSet.GetRecordValues();
SysId transactionId = new SysId((int)values.GetValue(colTransaction_Id).AsLong());
RefreshTransTotalTime(transactionId);
}
}
// Update all Requirements.
String colRequirement_Id = SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Requirement_Id, false);
DbQuery qryReqnt = new DbQuery(db.DbmsType);
qryReqnt.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement));
qryReqnt.Columns.Add(colRequirement_Id);
using (DbResultSet dbResultSet = DbResultSet_DataReader.ExecuteQuery(db, qryReqnt.ToString()))
{
if (dbResultSet != null && dbResultSet.NextRecord())
{
NamedValue.Map values = dbResultSet.GetRecordValues();
SysId transactionId = new SysId((int)values.GetValue(colRequirement_Id).AsLong());
RefreshReqntTotalTime(transactionId);
}
}
return true;
}
/// <summary>Refresh the total times recorded against the old and new transactions and requirements associated with a time record.</summary>
public override bool RefreshTotalTimes(SbmConstituent constituent, SysId TransIdPrevious, SysId ReqntIdPrevious)
{
if (constituent == null) return false;
bool refresh = true;
if (constituent.ConstituentType == Sbm.ConstituentType.TimeRecord)
{
// Update the 'previous' transaction.
if (refresh && TransIdPrevious != constituent.TransactionId)
refresh = RefreshTransTotalTime(TransIdPrevious);
// Update the 'current' transaction.
if (refresh)
refresh = RefreshTransTotalTime(constituent.TransactionId);
// Update the 'previous' requirement.
if (refresh && ReqntIdPrevious != constituent.RequirementId)
refresh = RefreshReqntTotalTime(ReqntIdPrevious);
// Update the 'current' requirement:
if (refresh)
refresh = RefreshReqntTotalTime(constituent.RequirementId);
}
return true;
}
/// <summary>Refresh the total time recorded against a transaction.</summary>
public override bool RefreshTransTotalTime(SysId transId)
{
if (SysId.IsValid(transId))
{
// Calculate total for this transaction.
double quantityTot = 0;
List<String> filters = new List<String>();
filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Constituent_TransId) + "=" + transId.ToString());
filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Constituent_Status) + "<>'" + StatusCancelled + "'");
if (db != null)
{
db.GetRowValue(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Constituent), SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Constituent_Quantity), filters.Concat(" AND ", "(", ")"), DbGetValueType.eDbValueSum);
// Update the total time against the Transaction.
List<StringPair> columnValues = new List<StringPair>();
SacsDatabase.AddValuePair(columnValues, SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Transaction_TimeTot), quantityTot.ToString(), false);
String filter = SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Transaction_Id) + "=" + transId.ToString();
db.ExecuteUpdate(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction), columnValues, filter);
}
}
return true;
}
/// <summary>Refresh the total time recorded against a requirement.</summary>
public override bool RefreshReqntTotalTime(SysId reqntId)
{
if (SysId.IsValid(reqntId))
{
// Calculate total for this Requirement.
double quantityTot = 0;
List<String> filters = new List<String>();
filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Constituent_ReqntId) + "=" + reqntId.ToString());
filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Constituent_Status) + "<>'" + StatusCancelled + "'");
if (db != null)
{
db.GetRowValue(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Constituent), SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Constituent_Quantity), filters.Concat(" AND ", "(", ")"), DbGetValueType.eDbValueSum);
// Update the total time against the Requirement.
List<StringPair> columnValues = new List<StringPair>();
SacsDatabase.AddValuePair(columnValues, SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Requirement_TimeTot), quantityTot.ToString(), false);
String filter = SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Requirement_Id) + "=" + reqntId.ToString();
db.ExecuteUpdate(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement), columnValues, filter);
}
}
return true;
}
//-------------------------------------------------------------------
/// <summary>Get the list of time records recorded for the specified parameters.</summary>
public override List<DataItem> GetPeriodTimeBooked(SysId affiliateIdEmployee, DateTime periodStart, DateTime periodEnd, SaUomType uomPeriod)
{
ClearErrorState();
List<DataItem> dataItems = new List<DataItem>();
if (!SysId.IsValid(affiliateIdEmployee))
SetErrorState("Employee must be specified.");
else if (!DateUtil.IsValid(periodStart))
SetErrorState("Period start date must be specified.");
else if (!DateUtil.IsValid(periodEnd))
SetErrorState("Period end date must be specified.");
else if (periodStart > periodEnd)
SetErrorState("Period start date must not be after the end date.");
if (HasErrorState()) return dataItems;
// Validate the Unit of time:
switch (uomPeriod)
{
case SaUomType.Time_Day:
case SaUomType.Time_WorkingDay:
uomPeriod = SaUomType.Time_Day;
break;
case SaUomType.Time_Week:
case SaUomType.Time_WorkingWeek:
case SaUomType.Time_Month:
case SaUomType.Time_Quarter:
case SaUomType.Time_Year:
break;
default:
#if DEBUG
SaLogger.Warn($"{SysUtil.Fn} Period unit defaulted to working week.");
#endif
uomPeriod = SaUomType.Time_WorkingWeek;
break;
}
// Construct the query.
DbQuery qry = new DbQuery(db.DbmsType);
qry.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Constituent));
qry.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_Effective));
qry.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_AffIdTarget));
qry.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_UomId));
qry.Columns.Add("Sum(" + SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Constituent_Quantity) + ")", SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Constituent_Quantity, false));
// Filter.
qry.Filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Constituent_Type) + "=" + ((int)Sbm.ConstituentType.TimeRecord).ToString());
qry.Filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Constituent_AffIdTarget) + "=" + affiliateIdEmployee.ToString());
qry.Filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Constituent_Effective) + ">=" + DbQuery.FormatDateForCondition(periodStart));
qry.Filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Constituent_Effective) + "<" + DbQuery.FormatDateForCondition(periodEnd.AddDays(1)));
qry.Filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Constituent_Status) + "<>'" + StatusCancelled + "'");
// Group to consoldiate time records with same unit:
qry.GroupBy.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Constituent_Effective));
qry.GroupBy.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Constituent_AffIdTarget));
qry.GroupBy.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Constituent_UomId));
// Retrieve results.
using (DbResultSet dbResultSet = DbResultSet_DataReader.ExecuteQuery(db, qry.ToString()))
{
if (dbResultSet != null && dbResultSet.NextRecord())
{
NamedValue.Map values = dbResultSet.GetRecordValues();
DateTime effective = values.GetValue(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Constituent_Effective, false)).AsDate();
double quantity = values.GetValue(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Constituent_Quantity, false)).AsDouble();
SysId uomId = new SysId(StringUtil.ToInt(values.GetValue(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Constituent_UomId, false))));
SaUomType eUom = GetTimeTypeForUom(uomId);
// Calculated the period date.
switch (uomPeriod)
{
case SaUomType.Time_Week:
effective = effective.StartOfWeek();
break;
case SaUomType.Time_WorkingWeek:
effective = effective.StartOfWorkingWeek();
break;
case SaUomType.Time_Month:
effective = effective.StartOfMonth();
break;
case SaUomType.Time_Quarter:
effective = effective.StartOfQuarter();
break;
case SaUomType.Time_Year:
effective = effective.StartOfYear();
break;
}
// Calculate time in hours:
switch (eUom)
{
case SaUomType.Time_Second:
quantity *= 60 * 60;
break;
case SaUomType.Time_Minute:
quantity *= 60;
break;
case SaUomType.Time_Hour:
break;
case SaUomType.Time_Day:
case SaUomType.Time_WorkingDay:
quantity /= 24;
break;
case SaUomType.Time_Week:
case SaUomType.Time_WorkingWeek:
quantity /= 24 * 7;
break;
case SaUomType.Time_Fortnight:
quantity /= 24 * 14;
break;
case SaUomType.Time_Month:
quantity /= 24 * 31;
break;
case SaUomType.Time_Quarter:
quantity /= 24 * 92;
break;
case SaUomType.Time_Year:
quantity /= 24 * 365;
break;
default:
break;
}
// Locate this date in the list:
bool dPeriodFound = false;
foreach (DataItem dataItem in dataItems)
{
DateTime dPeriod = dataItem.GetValue(GetPeriodTimeColumnName_Date()).AsDate();
if (dPeriod == effective)
{
// Update the hours:
dataItem.SetValue(GetPeriodTimeColumnName_Hours(), new DataValue(dataItem.GetValue(GetPeriodTimeColumnName_Hours()).AsDouble() + quantity));
dPeriodFound = true;
break;
}
}
if (!dPeriodFound)
{
// Add a new period date to the list:
DataItem dataItem = new DataItem();
dataItem.SetValue(GetPeriodTimeColumnName_Date(), new DataValue(effective));
dataItem.SetValue(GetPeriodTimeColumnName_Hours(), new DataValue(quantity));
dataItems.Add(dataItem);
}
}
}
//else SetErrorStae("Database not available");
#if _DEBUG
SATRACE("SapConstituentMgr_Odbc::GetPeriodTimeBooked Returning " + String(dataItems.Len()) + " consolidated time records.\n");
#endif
return dataItems;
}
//-------------------------------------------------------------------
// Get Constituent.
public override SbmConstituent GetConstituent(SbmConstituent.Params prm)
{
return GetConstituent(GetConstituentQueryFilter(prm).Concat(" AND ", "(", ")"));
}
private SbmConstituent GetConstituent(String filter)
{
ClearErrorState();
long count = GetConstituentCount(filter);
if (count == 0) return null;
if (count != 1)
{
SetErrorState("Multiple Constituent found");
return null;
}
SbmConstituent prmituent = null;
// Query data.
using (var dbConnection = db.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
Constituent_Db dbConstituent = new Constituent_Db(DbInfo);
dbConstituent.PopulateFrom(dbCommand, aliasConstituent, filter);
prmituent = CreateConstituent(dbConstituent);
}
catch (Exception exc)
{
SetErrorState("Database query exception");
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
}
}
return prmituent;
}
//-------------------------------------------------------------------
// Create Constituent.
public override SbmConstituent CreateConstituent(SysId assocId, Sbm.ConstituentType constituentType)
{
ClearErrorState();
SbmConstituent constituent = null;
if (SysId.IsValid(assocId) && constituentType > 0)
constituent = new SbmConstituent_Dbas(Internals, new SysId(), AffiliateId_Owner, assocId, constituentType, 0);
else SetErrorState("Asset type not identified");
return constituent;
}
private SbmConstituent_Dbas CreateConstituent(Constituent_Db dbConstituent)
{
ClearErrorState();
SbmConstituent_Dbas constituent = new SbmConstituent_Dbas(Internals, new SysId(dbConstituent._Id), new SysId(dbConstituent._AffIdOwner), new SysId(dbConstituent._AssocId ?? 0), (Sbm.ConstituentType)dbConstituent._Type, (ushort)dbConstituent._Flags);
PopulateFrom(dbConstituent, constituent);
return constituent;
}
//-------------------------------------------------------------------
// Validate Constituent.
public override bool IsValidConstituentData(SbmConstituent.Data data, SbmConstituent.ErrField errField)
{
ClearErrorState();
if (!base.IsValidConstituentData(data, errField)) return false;
return true;
}
//-------------------------------------------------------------------
// Insert Constituent.
public override bool InsertConstituent(SbmConstituent constituent, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!IsValidConstituent(constituent)) return false;
if (SysId.IsValid(constituent.Id)) return SetErrorState(ErrorMessage.ValiditemId);
using (var dbConnection = db.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
Constituent_Db dbConstituent = new Constituent_Db(DbInfo);
PopulateTo(dbConstituent, constituent, dbUpdateInfo);
if (Constituent_Db.FieldsNonId.Contains("Id"))
{
// Generate next Id.
dbConstituent._Id = SysId.ToInt(db.GetNextId("Constituent", dbUpdateInfo));
}
dbConstituent.ExecuteInsertCommand(dbCommand);
constituent.Id = new SysId(dbConstituent._Id);
constituent.Changed = false;
if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Inserted. " + GetLogProperties(constituent).Concat(": ").Concat("", "\n\t"));
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Update Constituent.
public override bool UpdateConstituent(SbmConstituent constituent, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!IsValidConstituent(constituent)) return false;
if (!SysId.IsValid(constituent.Id)) return SetErrorState(ErrorMessage.InvalidItemId);
if (!constituent.Changed)
{
if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Data not changed. " + GetLogProperties(constituent).Concat(": ").Concat("", "\n\t"));
return true;
}
using (var dbConnection = db.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
// Retrieve Constituent.
dbConnection.Open();
Constituent_Db dbConstituent = new Constituent_Db(DbInfo);
dbConstituent.PopulateFrom(dbCommand, aliasConstituent, "Id=" + SysId.ToString(constituent.Id));
SbmUpdateLogItemMonitor_Constituent updateLogMonitor = new SbmUpdateLogItemMonitor_Constituent(Internals, CreateConstituent(dbConstituent));
// Update properties.
PopulateTo(dbConstituent, constituent, dbUpdateInfo);
dbConstituent.ExecuteUpdateCommand(dbCommand);
constituent.Changed = false;
if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Updated. " + GetLogProperties(constituent).Concat(": ").Concat("", "\n\t"));
// Record updates.
updateLogMonitor.RecordUpdatedValues(constituent);
updateLogMonitor.LogUpdates();
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Delete Constituent.
public override bool ConstituentCanBeDeleted(SbmConstituent constituent)
{
ClearErrorState();
if (!base.ConstituentCanBeDeleted(constituent)) return false;
return true;
}
public override bool DeleteConstituent(SbmConstituent constituent, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!ConstituentCanBeDeleted(constituent)) return false;
using (var dbConnection = db.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
// Retrieve prmituent.
dbConnection.Open();
Constituent_Db dbConstituent = new Constituent_Db(DbInfo);
dbConstituent.PopulateFrom(dbCommand, aliasConstituent, "Id=" + constituent.Id.ToString());
// Delete prmituent.
dbCommand.CommandType = System.Data.CommandType.Text;
dbCommand.CommandText = "DELETE FROM " + SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Constituent) + " WHERE Id=" + SysId.ToString(constituent.Id) + ";";
dbCommand.ExecuteNonQuery();
constituent.Changed = false;
if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Deleted. " + GetLogProperties(constituent).Concat(": ").Concat("", "\n\t"));
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Copy data properties to and from database.
private void PopulateTo(Constituent_Db dbConstituent, SbmConstituent constituent, DbUpdateInfo dbUpdateInfo)
{
dbConstituent._Id = constituent.Id.ToInt();
dbConstituent._AffIdOwner = constituent.AffiliateIdOwner.ToInt();
dbConstituent._AffIdTarget = constituent.AffiliateIdTarget.ToInt();
dbConstituent._AssocId = constituent.AssociationId.ToInt();
dbConstituent._TransId = constituent.TransactionId.ToInt();
dbConstituent._ReqntId = constituent.RequirementId.ToInt();
dbConstituent._ConstId = constituent.ConstituentId.ToInt();
dbConstituent._AssetId = constituent.AssetId.ToInt();
dbConstituent._ProcessId = constituent.ProcessId.ToInt();
dbConstituent._AssocIdContractor = constituent.AssociationIdContractor.ToInt();
dbConstituent._Type = (short)constituent.ConstituentType;
dbConstituent._Seq = constituent.Seq;
dbConstituent._Effective = constituent.Effective;
dbConstituent._Required = constituent.Required;
dbConstituent._Started = constituent.Started;
dbConstituent._Completed = constituent.Completed;
dbConstituent._DescBrief = constituent.DescBrief;
dbConstituent._DescOutline = constituent.DescOutline;
dbConstituent._DescDetail = constituent.DescDetail;
dbConstituent._TaskNumber = constituent.TaskNumber.ToInt();
dbConstituent._Priority = constituent.Priority;
dbConstituent._Category = constituent.Category;
dbConstituent._Reference = constituent.Reference;
dbConstituent._Quantity = constituent.Quantity;
dbConstituent._UomId = constituent.UomId.ToInt();
dbConstituent._UnitCost = constituent.UnitCost;
dbConstituent._AmountEst = constituent.AmountEst;
dbConstituent._AmountNet = constituent.AmountNet;
dbConstituent._TaxCodeId = constituent.TaxCodeId.ToInt();
dbConstituent._TaxRate = constituent.TaxRate;
dbConstituent._AmountTax = constituent.AmountTax;
dbConstituent._AmountTot = constituent.AmountTot;
dbConstituent._TaxRateRebate = constituent.TaxRateRebate;
dbConstituent._AmountTaxRebate = constituent.AmountTaxRebate;
// Common properties.
dbConstituent._Notes = constituent.Notes;
dbConstituent._Status = SacsSystem.GetStatusCode(constituent.Status);
dbConstituent._Flags = (short)constituent.Flags;
if (!SysId.IsValid(constituent.Id))
{
dbConstituent._CreateOn = DateTime.UtcNow;
dbConstituent._CreateBy = dbUpdateInfo.UserId.ToInt();
dbConstituent._CreateHost = dbUpdateInfo.Host;
}
dbConstituent._UpdateOn = DateTime.UtcNow;
dbConstituent._UpdateBy = dbUpdateInfo.UserId.ToInt();
dbConstituent._UpdateHost = dbUpdateInfo.Host;
}
private void PopulateFrom(Constituent_Db dbConstituent, SbmConstituent constituent)
{
//constituent.Id = new SysId(dbConstituent._Id);
constituent.AffiliateIdOwner = new SysId(dbConstituent._AffIdOwner);
constituent.AffiliateIdTarget = new SysId(dbConstituent._AffIdTarget ?? 0);
constituent.AssociationId = new SysId(dbConstituent._AssocId ?? 0);
constituent.TransactionId = new SysId(dbConstituent._TransId ?? 0);
constituent.RequirementId = new SysId(dbConstituent._ReqntId ?? 0);
constituent.ConstituentId = new SysId(dbConstituent._ConstId ?? 0);
constituent.AssetId = new SysId(dbConstituent._AssetId ?? 0);
constituent.ProcessId = new SysId(dbConstituent._ProcessId ?? 0);
constituent.AssociationIdContractor = new SysId(dbConstituent._AssocIdContractor ?? 0);
constituent.ConstituentType = (Sbm.ConstituentType)(dbConstituent._Type ?? 0);
constituent.Seq = dbConstituent._Seq ?? 0;
constituent.Effective = dbConstituent._Effective ?? default(DateTime);
constituent.Required = dbConstituent._Required ?? default(DateTime);
constituent.Started = dbConstituent._Started ?? default(DateTime);
constituent.Completed = dbConstituent._Completed ?? default(DateTime);
constituent.DescBrief = dbConstituent._DescBrief;
constituent.DescOutline = dbConstituent._DescOutline;
constituent.DescDetail = dbConstituent._DescDetail;
constituent.TaskNumber = dbConstituent._TaskNumber.ToString();
constituent.Priority = dbConstituent._Priority ?? 0;
constituent.Category = dbConstituent._Category;
constituent.Reference = dbConstituent._Reference;
constituent.Quantity = dbConstituent._Quantity ?? 0.0m;
constituent.UomId = new SysId(dbConstituent._UomId ?? 0);
constituent.UnitCost = dbConstituent._UnitCost ?? 0.0m;
constituent.AmountEst = dbConstituent._AmountEst ?? 0.0m;
constituent.AmountNet = dbConstituent._AmountNet ?? 0.0m;
constituent.TaxCodeId = new SysId(dbConstituent._TaxCodeId ?? 0);
constituent.TaxRate = dbConstituent._TaxRate ?? 0.0m;
constituent.AmountTax = dbConstituent._AmountTax ?? 0.0m;
constituent.AmountTot = dbConstituent._AmountTot ?? 0.0m;
constituent.TaxRateRebate = dbConstituent._TaxRateRebate ?? 0.0m;
constituent.AmountTaxRebate = dbConstituent._AmountTaxRebate ?? 0.0m;
// Common properties.
constituent.Notes = dbConstituent._Notes;
constituent.Status = SacsSystem.GetStatusForCode(dbConstituent._Status);
constituent.SetCreateStamp(dbConstituent._CreateOn ?? default(DateTime), new SysId(dbConstituent._CreateBy ?? 0), dbConstituent._CreateHost);
constituent.SetUpdateStamp(dbConstituent._UpdateOn ?? default(DateTime), new SysId(dbConstituent._UpdateBy ?? 0), dbConstituent._UpdateHost);
constituent.AcceptChanges();
}
//-------------------------------------------------------------------
// Column definitions.
private static readonly String aliasConstituent = "aConst";
private static readonly String aliasConstituent_AffiliateOwner = "Const_AffOwn";
private static readonly String prefixConstituent_AffiliateOwner = aliasConstituent_AffiliateOwner + "_";
private static readonly String aliasConstituent_AffiliateTarget = "Const_AffTgt";
private static readonly String prefixConstituent_AffiliateTarget = aliasConstituent_AffiliateTarget + "_";
private static readonly String aliasConstituent_Association = "Const_Ass";
private static readonly String prefixConstituent_Association = aliasConstituent_Association + "_";
private static readonly String aliasConstituent_AssociationTarget = "Const_AssTgt";
private static readonly String prefixConstituent_AssociationTarget = aliasConstituent_AssociationTarget + "_";
private static readonly String aliasConstituent_Transaction = "Const_Trans";
private static readonly String prefixConstituent_Transaction = aliasConstituent_Transaction + "_";
private static readonly String aliasConstituent_Requirement = "Const_Reqnt";
private static readonly String prefixConstituent_Requirement = aliasConstituent_Requirement + "_";
private static readonly String aliasConstituent_Constituent = "Const_Const";
private static readonly String prefixConstituent_Constituent = aliasConstituent_Constituent + "_";
private static readonly String aliasConstituent_UnitMeasure = "Const_Uom";
private static readonly String prefixConstituent_UnitMeasure = aliasConstituent_UnitMeasure + "_";
// Column definition population.
private void SetConstituentColDfn
(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.Constituent)
alias = aliasConstituent;
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 Constituent column definition.
public override ColumnDfn GetConstituentColumnDfn(SbmConstituent.Column column, string caption = "", int width = 0)
{
ColumnDfn columnDfn = new ColumnDfn((int)column, caption, width);
switch (column)
{
case SbmConstituent.Column.Pos:
SetConstituentColDfn(columnDfn, "Pos", 45, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right);
columnDfn.SortMode = ColumnDfn.ColumnSortMode.Off;
columnDfn.ReadOnly = true;
columnDfn.Resizable = false;
break;
case SbmConstituent.Column.Id:
SetConstituentColDfn(columnDfn, "Id", 60, SbmDbDfn.ColumnIdx.Constituent_Id, ColumnAlignment.Right, DataValue.DataType.Long);
columnDfn.ReadOnly = true;
break;
// Constituent Properties.
case SbmConstituent.Column.AssocId:
SetConstituentColDfn(columnDfn, "Assoc #", 60, SbmDbDfn.ColumnIdx.Constituent_AssocId, ColumnAlignment.Right, DataValue.DataType.Long);
break;
case SbmConstituent.Column.AffIdOwner:
SetConstituentColDfn(columnDfn, "Owner #", 60, SbmDbDfn.ColumnIdx.Constituent_AffIdOwner, ColumnAlignment.Right, DataValue.DataType.Long);
break;
case SbmConstituent.Column.AffIdTarget:
SetConstituentColDfn(columnDfn, "Target #", 60, SbmDbDfn.ColumnIdx.Constituent_AffIdTarget, ColumnAlignment.Right, DataValue.DataType.Long);
break;
case SbmConstituent.Column.TransId:
SetConstituentColDfn(columnDfn, "Trans #", 60, SbmDbDfn.ColumnIdx.Constituent_TransId, ColumnAlignment.Right, DataValue.DataType.Long);
break;
case SbmConstituent.Column.ReqntId:
SetConstituentColDfn(columnDfn, "Reqnt #", 60, SbmDbDfn.ColumnIdx.Constituent_ReqntId, ColumnAlignment.Right, DataValue.DataType.Long);
break;
case SbmConstituent.Column.ConstId:
SetConstituentColDfn(columnDfn, "Const #", 60, SbmDbDfn.ColumnIdx.Constituent_ConstId, ColumnAlignment.Right, DataValue.DataType.Long);
break;
case SbmConstituent.Column.AssetId:
SetConstituentColDfn(columnDfn, "Asset #", 60, SbmDbDfn.ColumnIdx.Constituent_AssetId, ColumnAlignment.Right, DataValue.DataType.Long);
columnDfn.ReadOnly = true;
break;
case SbmConstituent.Column.ProcessId:
SetConstituentColDfn(columnDfn, "Process #", 60, SbmDbDfn.ColumnIdx.Constituent_ProcessId, ColumnAlignment.Right, DataValue.DataType.Long);
break;
case SbmConstituent.Column.DescBrief:
SetConstituentColDfn(columnDfn, "Caption", 200, SbmDbDfn.ColumnIdx.Constituent_DescBrief);
break;
case SbmConstituent.Column.DescDetail:
SetConstituentColDfn(columnDfn, "Detail", 200, SbmDbDfn.ColumnIdx.Constituent_DescDetail);
break;
case SbmConstituent.Column.DescOutline:
SetConstituentColDfn(columnDfn, "Outline", 200, SbmDbDfn.ColumnIdx.Constituent_DescOutline);
break;
case SbmConstituent.Column.Type:
SetConstituentColDfn(columnDfn, "Type", 60, SbmDbDfn.ColumnIdx.Constituent_Type, ColumnAlignment.Right, DataValue.DataType.Long);
break;
case SbmConstituent.Column.Type_Desc:
SetConstituentColDfn(columnDfn, "Type", 70, SbmDbDfn.ColumnIdx.Constituent_Type);
break;
case SbmConstituent.Column.Category:
SetConstituentColDfn(columnDfn, "Category", 100, SbmDbDfn.ColumnIdx.Constituent_Category, ColumnAlignment.Center);
break;
case SbmConstituent.Column.Reference:
SetConstituentColDfn(columnDfn, "Reference", 100, SbmDbDfn.ColumnIdx.Constituent_Reference, ColumnAlignment.Center);
break;
case SbmConstituent.Column.DueInd:
SetConstituentColDfn(columnDfn, "Due", 40, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center);
columnDfn.TriStateFormat = ColumnTriStateFormat.Lights;
break;
case SbmConstituent.Column.Effective_Date:
SetConstituentColDfn(columnDfn, "Effective", 65, SbmDbDfn.ColumnIdx.Constituent_Effective, ColumnAlignment.Center, DataValue.DataType.Date);
columnDfn.DateFormat = "d-MMM-yy";
break;
case SbmConstituent.Column.Effective_Time:
SetConstituentColDfn(columnDfn, "at", 60, SbmDbDfn.ColumnIdx.Constituent_Effective, ColumnAlignment.Center, DataValue.DataType.Time);
break;
case SbmConstituent.Column.Started_Date:
SetConstituentColDfn(columnDfn, "Started", 65, SbmDbDfn.ColumnIdx.Constituent_Started, ColumnAlignment.Center, DataValue.DataType.Date);
columnDfn.DateFormat = "d-MMM-yy";
break;
case SbmConstituent.Column.Started_DateFmt:
SetConstituentColDfn(columnDfn, "Started", 80, SbmDbDfn.ColumnIdx.Constituent_Started);
columnDfn.DateFormat = "d-MMM-yyyy";
//columnDfn.DataName = "StartedDateFmt"; //Not related to database. Do not change!
break;
case SbmConstituent.Column.Started_Time:
SetConstituentColDfn(columnDfn, "at", 60, SbmDbDfn.ColumnIdx.Constituent_Started, ColumnAlignment.Center, DataValue.DataType.Time);
break;
case SbmConstituent.Column.Started_Day:
SetConstituentColDfn(columnDfn, "Day", 70, SbmDbDfn.ColumnIdx.Constituent_Started, ColumnAlignment.Center);
break;
case SbmConstituent.Column.Required_Date:
SetConstituentColDfn(columnDfn, "Required date", 65, SbmDbDfn.ColumnIdx.Constituent_Required, ColumnAlignment.Center, DataValue.DataType.Date);
columnDfn.DateFormat = "d-MMM-yy";
break;
case SbmConstituent.Column.Required_DateFmt:
SetConstituentColDfn(columnDfn, "Required date format", 80, SbmDbDfn.ColumnIdx.Constituent_Required);
columnDfn.DateFormat = "d-MMM-yyyy";
//columnDfn.DataName = "RequiredDateFmt"; // Not related to database. Do not change!
break;
case SbmConstituent.Column.Required_Time:
SetConstituentColDfn(columnDfn, "Required time", 60, SbmDbDfn.ColumnIdx.Constituent_Required, ColumnAlignment.Center, DataValue.DataType.Time);
break;
case SbmConstituent.Column.Required_CssClass:
SetConstituentColDfn(columnDfn, "Required css class", 80, SbmDbDfn.ColumnIdx.Constituent_Required);
columnDfn.DataName = "RequiredCssClass"; // Not related to database. Do not change!
break;
case SbmConstituent.Column.Required_Today:
SetConstituentColDfn(columnDfn, "Required today", 100, SbmDbDfn.ColumnIdx.Constituent_Required);
columnDfn.DateFormat = "d-MMM-yyyy";
columnDfn.DataName = "RequiredToday"; // Not related to database. Do not change!
break;
case SbmConstituent.Column.Completed_Date:
SetConstituentColDfn(columnDfn, "Completed", 65, SbmDbDfn.ColumnIdx.Constituent_Completed, ColumnAlignment.Center, DataValue.DataType.Date);
columnDfn.DateFormat = "d-MMM-yy";
break;
case SbmConstituent.Column.Completed_DateFmt:
SetConstituentColDfn(columnDfn, "Completed", 80, SbmDbDfn.ColumnIdx.Constituent_Completed);
columnDfn.DateFormat = "d-MMM-yyyy";
//columnDfn.DataName = "CompletedDateFmt"; // Not related to database. Do not change!
break;
case SbmConstituent.Column.Completed_Time:
SetConstituentColDfn(columnDfn, "at", 60, SbmDbDfn.ColumnIdx.Constituent_Completed, ColumnAlignment.Center, DataValue.DataType.Time);
break;
case SbmConstituent.Column.TaskNumber:
SetConstituentColDfn(columnDfn, "Task no", 80, SbmDbDfn.ColumnIdx.Constituent_TaskNumber, ColumnAlignment.Center);
break;
case SbmConstituent.Column.Priority:
SetConstituentColDfn(columnDfn, "Priority", 60, SbmDbDfn.ColumnIdx.Constituent_Priority, ColumnAlignment.Center, DataValue.DataType.Long);
break;
case SbmConstituent.Column.Quantity:
SetConstituentColDfn(columnDfn, "Quantity", 60, SbmDbDfn.ColumnIdx.Constituent_Quantity, ColumnAlignment.Right, DataValue.DataType.Double);
break;
case SbmConstituent.Column.Hours:
SetConstituentColDfn(columnDfn, "Hours", 60, SbmDbDfn.ColumnIdx.Constituent_Quantity, ColumnAlignment.Right, DataValue.DataType.Double);
//columnDfn.NumDecimals = prm.iDecimals_Time;
break;
case SbmConstituent.Column.UnitCost:
SetConstituentColDfn(columnDfn, "Unit cost", 60, SbmDbDfn.ColumnIdx.Constituent_UnitCost, ColumnAlignment.Right, DataValue.DataType.Double);
break;
case SbmConstituent.Column.AmountEst:
SetConstituentColDfn(columnDfn, "Estimate", 60, SbmDbDfn.ColumnIdx.Constituent_AmountEst, ColumnAlignment.Right, DataValue.DataType.Double);
break;
case SbmConstituent.Column.AmountNet:
SetConstituentColDfn(columnDfn, "Net", 60, SbmDbDfn.ColumnIdx.Constituent_AmountNet, ColumnAlignment.Right, DataValue.DataType.Double);
break;
case SbmConstituent.Column.TaxRate:
SetConstituentColDfn(columnDfn, "Tax %", 60, SbmDbDfn.ColumnIdx.Constituent_TaxRate, ColumnAlignment.Right, DataValue.DataType.Double);
break;
case SbmConstituent.Column.AmountTax:
SetConstituentColDfn(columnDfn, "Tax", 60, SbmDbDfn.ColumnIdx.Constituent_AmountTax, ColumnAlignment.Right, DataValue.DataType.Double);
break;
case SbmConstituent.Column.AmountTot:
SetConstituentColDfn(columnDfn, "Total", 60, SbmDbDfn.ColumnIdx.Constituent_AmountTot, ColumnAlignment.Right, DataValue.DataType.Double);
break;
// Common properties.
case SbmConstituent.Column.Notes:
SetConstituentColDfn(columnDfn, "Notes", 200, SbmDbDfn.ColumnIdx.Constituent_Notes);
break;
case SbmConstituent.Column.Flag:
SetConstituentColDfn(columnDfn, "Flags", 40, SbmDbDfn.ColumnIdx.Constituent_Flags, ColumnAlignment.Center, DataValue.DataType.Long);
break;
case SbmConstituent.Column.Status:
SetConstituentColDfn(columnDfn, "Status", 50, SbmDbDfn.ColumnIdx.Constituent_Status, ColumnAlignment.Center);
break;
case SbmConstituent.Column.Status_Desc:
SetConstituentColDfn(columnDfn, "Status", 50, SbmDbDfn.ColumnIdx.Constituent_Status);
break;
case SbmConstituent.Column.Status_Ind:
SetConstituentColDfn(columnDfn, "Status", 50, SbmDbDfn.ColumnIdx.Constituent_Status, ColumnAlignment.Center, DataValue.DataType.TriState);
columnDfn.TriStateFormat = ColumnTriStateFormat.Lights;
break;
case SbmConstituent.Column.CreateOn_Date:
SetConstituentColDfn(columnDfn, "Created", 65, SbmDbDfn.ColumnIdx.Constituent_CreateOn, ColumnAlignment.Center, DataValue.DataType.Date);
columnDfn.DateFormat = "d-MMM-yy";
columnDfn.ReadOnly = true;
break;
case SbmConstituent.Column.UpdateOn_Date:
SetConstituentColDfn(columnDfn, "Updated", 65, SbmDbDfn.ColumnIdx.Constituent_UpdateOn, ColumnAlignment.Center, DataValue.DataType.Date);
columnDfn.DateFormat = "d-MMM-yy";
columnDfn.ReadOnly = true;
break;
}
if (!String.IsNullOrEmpty(caption))
columnDfn.Caption = caption;
if (width > 0)
columnDfn.Width = width;
return columnDfn;
}
//-------------------------------------------------------------------
// Constituent query filter.
public override List<string> GetConstituentQueryFilter(SbmConstituent.Params prm)
{
List<String> filter = new List<String>();
// Constituent Id.
String includedIds = prm.IdsIncluded.Concat(",");
String colConstituent_Id = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_Id, aliasConstituent);
if (!includedIds.IsEmpty())
filter.Add(colConstituent_Id + " IN (" + includedIds + ")");
String excludedIds = prm.IdsExcluded.Concat(",");
if (!excludedIds.IsEmpty())
filter.Add(colConstituent_Id + " NOT IN (" + excludedIds + ")");
// Affiliate Owner.
String colConstituent_AffIdOwner = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_AffIdOwner, aliasConstituent);
filter.Add(colConstituent_AffIdOwner + "=" + SysId.ToString(AffiliateId_Owner));
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Associated items Ids.
if (SysId.IsValid(prm.AffIdTarget))
filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_AffIdTarget, aliasConstituent) + "=" + prm.AffIdTarget.ToString());
if (SysId.IsValid(prm.AssocId))
filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_AssocId, aliasConstituent) + "=" + prm.AssocId.ToString());
if (SysId.IsValid(prm.TransId))
filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_TransId, aliasConstituent) + "=" + prm.TransId.ToString());
if (SysId.IsValid(prm.ReqntId))
filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_ReqntId, aliasConstituent) + "=" + prm.ReqntId.ToString());
if (SysId.IsValid(prm.ConstId))
filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_ConstId, aliasConstituent) + "=" + prm.ConstId.ToString());
if (SysId.IsValid(prm.AssetId))
filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_AssetId, aliasConstituent) + "=" + prm.AssetId.ToString());
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//Constituent Type.
String colConstituent_Type = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_Type, aliasConstituent);
if (prm.ConstituentType > 0)
filter.Add(colConstituent_Type + "=" + ((int)prm.ConstituentType).ToString());
// DescBrief Partial.
String colConstituent_DescBrief = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_DescBrief, aliasConstituent);
if (!prm.DescBriefPartial.IsEmpty())
filter.Add(colConstituent_DescBrief + " LIKE '" + DbQuery.FormatForLike(prm.DescBriefPartial) + "%'");
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Asset serial number.
if (!StringUtil.IsEmpty(prm.AssetSerialFull) || !StringUtil.IsEmpty(prm.AssetSerialPartial) && db.TableExists(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaAsset)))
{
// Restrict to constituents associated with the specified asset(s):
DbQuery qryAsset = new DbQuery(db.DbmsType);
String colAsset_SerialNumber = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_SerialNumber);
String colConstituent_AssetId = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_AssetId);
qryAsset.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaAsset));
qryAsset.Columns.Add(colConstituent_AssetId);
if (!StringUtil.IsEmpty(prm.AssetSerialFull))
qryAsset.Filters.Add(colAsset_SerialNumber + "='" + DbQuery.FormatForCondition(prm.AssetSerialFull) + "'");
else if (!StringUtil.IsEmpty(prm.AssetSerialPartial))
qryAsset.Filters.Add(colAsset_SerialNumber + " LIKE '" + DbQuery.FormatForLike(prm.AssetSerialPartial) + "'");
filter.Add(colConstituent_AssetId + " IN (" + qryAsset.BuildQuery() + ")");
}
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Effective Date.
if (DateUtil.IsValid(prm.EffectiveFrom) || DateUtil.IsValid(prm.EffectiveTo))
{
String colEffective = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_Effective, aliasConstituent);
if (DateUtil.IsValid(prm.EffectiveFrom))
filter.Add(colEffective + "<" + DbQuery.FormatForCondition(prm.EffectiveTo.ToLongDateString() + 1));
if (DateUtil.IsValid(prm.EffectiveTo))
filter.Add(colEffective + ">=" + DbQuery.FormatForCondition(prm.EffectiveFrom.ToString()));
}
// Status Category.
if (prm.StatusCat == SbmConstituent.StatusCat.NotDeleted)
filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_Status, aliasConstituent) + "<>'" + StatusDeleted + "'");
else if (prm.StatusCat == SbmConstituent.StatusCat.NotCancelled)
filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_Status, aliasConstituent) + "<>'" + StatusCancelled + "'");
else if (!StringUtil.IsEmpty(ConstituentStatusCats.GetCodeForType(prm.StatusCat)))
filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_StatusCat, aliasConstituent) + "='" + ConstituentStatusCats.GetCodeForType(prm.StatusCat) + "'");
// Updated Since.
if (DateUtil.IsValid(prm.UpdatedSince))
filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_UpdateOn, aliasConstituent) + ">=" + DbQuery.FormatForCondition(prm.UpdatedSince.ToString()));
if (filter.Count < 1 && prm.IncludeDefaultFilter) filter.Add("1=1");
return filter;
}
// Constituent sort columns.
public List<String> GetConstituentSortColumns(SbmConstituent.Params prm)
{
// Sort sequence:
List<String> sortColumnCodes = new List<String>();
foreach (var columnDfn in prm.SortColumns)
{
// Need to ensure correct alias used for Constituent columns in case of conflict.
String sortCol = String.Empty;
if (SbmDbDfn.GetTableForColumn((SbmDbDfn.ColumnIdx)columnDfn.DbColumn) == SbmDbDfn.TableIdx.Constituent)
{
sortCol = SbmDbDfn.GetColumnNameQual((SbmDbDfn.ColumnIdx)columnDfn.DbColumn, aliasConstituent);
}
else
{
sortCol = columnDfn.DataName;
if (!StringUtil.IsEmpty(columnDfn.SortDataName))
sortCol = columnDfn.SortDataName;
}
if (!sortCol.IsEmpty())
{
DbOrderByNullMode orderByNullMode = DbOrderByNullMode.Default; // eSaOrderByDemoteNulls, eSaOrderByPromoteNulls
sortColumnCodes.Add(DbQuery.FormatForOrderBy(sortCol, columnDfn.SortAscending, orderByNullMode).Concat(", "));
}
}
sortColumnCodes.RemoveBlanks();
if (sortColumnCodes.IsEmpty())
{
// Default sort columns:
sortColumnCodes.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_Type, aliasConstituent) + " ASC");
}
return sortColumnCodes;
}
//-------------------------------------------------------------------
// Constituent count.
private long GetConstituentCount(String filter)
{
ClearErrorState();
return db.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Constituent) + " As " + aliasConstituent, filter);
}
public override long GetConstituentCount(SbmConstituent.Params prm)
{
ClearErrorState();
return GetConstituentCount(GetConstituentQueryFilter(prm).Concat(" AND ", "(", ")"));
}
//-------------------------------------------------------------------
// Constituent list.
public override List<SbmConstituent> GetConstituentList(SbmConstituent.Params prm)
{
ClearErrorState();
List<SbmConstituent> constituents = new List<SbmConstituent>();
DbQuery qry = new DbQuery(db.DbmsType);
qry.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Constituent), aliasConstituent);
Constituent_Db dbConstituent = new Constituent_Db(DbInfo);
qry.Columns.AddRange(dbConstituent.ExistingColumnNames);
qry.Filters.AddRange(GetConstituentQueryFilter(prm));
qry.OrderBy.AddRange(GetConstituentSortColumns(prm));
// Query data.
using (var dbConnection = db.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
dbCommand.CommandText = qry.BuildQuery(prm.ResultsPaging);
using (DbDataReader dbDataReader = dbCommand.ExecuteReader())
{
while (dbDataReader.Read())
{
dbConstituent = new Constituent_Db(DbInfo);
dbConstituent.PopulateFrom(dbDataReader);
constituents.Add(CreateConstituent(dbConstituent));
}
}
}
catch (Exception exc)
{
SetErrorState("Database query exception");
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
}
}
return constituents;
}
//-------------------------------------------------------------------
// Constituent query execution.
public override DbResultSet ExecuteConstituentQuery(List<ColumnDfn> columns, SbmConstituent.Params prm)
{
ClearErrorState();
//---------------------------------------------------------------------
// Construct build database query.
DbQuery query = new DbQuery(db.DbmsType);
bool canViewSalesFinancials = UserContext.SecurityProfile_Core.UserCanViewFinancials(Sbm.FinancialType.CommoditySales);
//---------------------------------------------------------------------
// Sort Column ~ lColSort?
//---------------------------------------------------------------------
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Constituent Properties - add columns as defined in query list.
query.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Constituent), aliasConstituent);
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_Id));
if (columns.HasId((int)SbmConstituent.Column.AssocId))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_AssocId));
if (columns.HasId((int)SbmConstituent.Column.AffIdTarget))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_AffIdTarget));
if (columns.HasId((int)SbmConstituent.Column.TransId))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_TransId));
if (columns.HasId((int)SbmConstituent.Column.ReqntId))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_ReqntId));
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_Type));
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_Effective));
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_Required));
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_Started));
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_Completed));
if (columns.HasId((int)SbmConstituent.Column.DescBrief) && ColumnExists(SbmDbDfn.ColumnIdx.Constituent_DescBrief))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_DescBrief));
if (columns.HasId((int)SbmConstituent.Column.DescOutline) && ColumnExists(SbmDbDfn.ColumnIdx.Constituent_DescOutline))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_DescOutline));
if (columns.HasId((int)SbmConstituent.Column.DescDetail) && ColumnExists(SbmDbDfn.ColumnIdx.Constituent_DescDetail))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_DescDetail));
if (columns.HasId((int)SbmConstituent.Column.Category))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_Category));
if (columns.HasId((int)SbmConstituent.Column.Reference))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_Reference));
if (ColumnExists(SbmDbDfn.ColumnIdx.Constituent_TaskNumber))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_TaskNumber));
if (ColumnExists(SbmDbDfn.ColumnIdx.Constituent_Priority))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_Priority));
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_Quantity));
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_Status));
if (ColumnExists(SbmDbDfn.ColumnIdx.Constituent_Notes))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_Notes));
if (canViewSalesFinancials)
{
if (ColumnExists(SbmDbDfn.ColumnIdx.Constituent_UnitCost))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_UnitCost));
if (ColumnExists(SbmDbDfn.ColumnIdx.Constituent_AmountEst))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_AmountEst));
if (ColumnExists(SbmDbDfn.ColumnIdx.Constituent_AmountNet))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_AmountNet));
if (ColumnExists(SbmDbDfn.ColumnIdx.Constituent_TaxRate))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_TaxRate));
if (ColumnExists(SbmDbDfn.ColumnIdx.Constituent_AmountTax))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_AmountTax));
if (ColumnExists(SbmDbDfn.ColumnIdx.Constituent_AmountTot))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_AmountTot));
if (ColumnExists(SbmDbDfn.ColumnIdx.Constituent_TaxRateRebate))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_TaxRateRebate));
if (ColumnExists(SbmDbDfn.ColumnIdx.Constituent_AmountTaxRebate))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_AmountTaxRebate));
}
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Referenced constituent.
bool hasConstCols = false;
if (!hasConstCols) hasConstCols = columns.HasId((int)SbmConstituent.Column.Const_DescBrief);
if (hasConstCols)
{
// Join to the Constituent table.
DbQueryJoin joinConst = new DbQueryJoin(DbJoinType.LeftOuter);
joinConst.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Constituent), aliasConstituent_Constituent);
joinConst.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_Id, aliasConstituent_Constituent) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_ConstId));
query.Joins.Add(joinConst);
// Add the constituent columns.
List<SbmDbDfn.ColumnIdx> constituentCols = new List<SbmDbDfn.ColumnIdx>();
constituentCols.Add(SbmDbDfn.ColumnIdx.Constituent_DescBrief);
foreach (SbmDbDfn.ColumnIdx dbColumn in constituentCols)
query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasConstituent), prefixConstituent_Constituent + SbmDbDfn.GetColumnName(dbColumn, false));
}
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Affiliate Owner.
bool hasOwnerCols = false;
if (!hasOwnerCols) hasOwnerCols = columns.HasId((int)SbmConstituent.Column.Owner_Name);
if (hasOwnerCols)
{
// Join to the Owner affiliate.
DbQueryJoin joinAffOwner = new DbQueryJoin(DbJoinType.LeftOuter);
joinAffOwner.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Affiliate), aliasConstituent_AffiliateOwner);
joinAffOwner.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Id, aliasConstituent_AffiliateOwner) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_AffIdOwner));
query.Joins.Add(joinAffOwner);
// Add the affiliate columns.
List<SbmDbDfn.ColumnIdx> affiliateOwnerCols = new List<SbmDbDfn.ColumnIdx>();
affiliateOwnerCols.Add(SbmDbDfn.ColumnIdx.Affiliate_Name);
foreach (SbmDbDfn.ColumnIdx dbColumn in affiliateOwnerCols)
query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasConstituent_AffiliateOwner), prefixConstituent_AffiliateOwner + SbmDbDfn.GetColumnName(dbColumn, false));
}
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Affiliate Target.
bool hasTargetCols = false;
if (!hasTargetCols) hasTargetCols = columns.HasId((int)SbmConstituent.Column.Target_Name);
if (hasTargetCols)
{
// Join to the Target affiliate.
DbQueryJoin joinAffTarget = new DbQueryJoin(DbJoinType.LeftOuter);
joinAffTarget.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Affiliate), aliasConstituent_AffiliateTarget);
joinAffTarget.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Id, aliasConstituent_AffiliateTarget) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_AffIdTarget));
query.Joins.Add(joinAffTarget);
// Add the affiliate columns.
List<SbmDbDfn.ColumnIdx> affiliateTargetCols = new List<SbmDbDfn.ColumnIdx>();
affiliateTargetCols.Add(SbmDbDfn.ColumnIdx.Affiliate_Name);
foreach (SbmDbDfn.ColumnIdx dbColumn in affiliateTargetCols)
query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasConstituent_AffiliateTarget), prefixConstituent_AffiliateTarget + SbmDbDfn.GetColumnName(dbColumn, false));
}
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Association.
bool hasAssocCols = false;
if (!hasAssocCols) hasAssocCols = columns.HasId((int)SbmConstituent.Column.Assoc_Code);
bool hasAssocTargetCols = false;
if (!hasAssocTargetCols) hasAssocTargetCols = columns.HasId((int)SbmConstituent.Column.Assoc_Target_Name);
if (hasAssocCols || hasAssocTargetCols)
{
// Join to the Association table.
DbQueryJoin joinAssoc = new DbQueryJoin(DbJoinType.LeftOuter);
joinAssoc.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Association), aliasConstituent_Association);
joinAssoc.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Id, aliasConstituent_Association) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_AssocId));
query.Joins.Add(joinAssoc);
// Add the affiliate columns.
List<SbmDbDfn.ColumnIdx> associationCols = new List<SbmDbDfn.ColumnIdx>();
associationCols.Add(SbmDbDfn.ColumnIdx.Association_Code);
foreach (SbmDbDfn.ColumnIdx dbColumn in associationCols)
query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasConstituent_Association), prefixConstituent_Association + SbmDbDfn.GetColumnName(dbColumn, false));
if (hasAssocTargetCols)
{
// Join to the association's target affiliate.
DbQueryJoin joinAssocTarget = new DbQueryJoin(DbJoinType.LeftOuter);
joinAssocTarget.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Affiliate), aliasConstituent_AssociationTarget);
joinAssocTarget.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Id, aliasConstituent_AssociationTarget) + "=" + aliasConstituent_Association + "." + SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Association_AffIdTarget));
query.Joins.Add(joinAssocTarget);
// Add the affiliate columns.
List<SbmDbDfn.ColumnIdx> assaffTargetCols = new List<SbmDbDfn.ColumnIdx>();
assaffTargetCols.Add(SbmDbDfn.ColumnIdx.Affiliate_Name);
foreach (SbmDbDfn.ColumnIdx dbColumn in assaffTargetCols)
query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasConstituent_AssociationTarget), prefixConstituent_AssociationTarget + SbmDbDfn.GetColumnName(dbColumn, false));
}
}
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Transaction.
bool hasTransCols = false;
if (!hasTransCols) hasTransCols = columns.HasId((int)SbmConstituent.Column.Trans_Ref);
if (!hasTransCols) hasTransCols = columns.HasId((int)SbmConstituent.Column.Trans_RefExt);
if (!hasTransCols) hasTransCols = columns.HasId((int)SbmConstituent.Column.Trans_DescBrief);
if (hasTransCols)
{
// Join to the Transaction table.
DbQueryJoin joinTrans = new DbQueryJoin(DbJoinType.LeftOuter);
joinTrans.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction), aliasConstituent_Transaction);
joinTrans.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, aliasConstituent_Transaction) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_TransId));
query.Joins.Add(joinTrans);
// Add the transaction columns.
List<SbmDbDfn.ColumnIdx> transactionCols = new List<SbmDbDfn.ColumnIdx>();
transactionCols.Add(SbmDbDfn.ColumnIdx.Transaction_Ref);
transactionCols.Add(SbmDbDfn.ColumnIdx.Transaction_RefExt);
transactionCols.Add(SbmDbDfn.ColumnIdx.Transaction_DescBrief);
foreach (SbmDbDfn.ColumnIdx dbColumn in transactionCols)
query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasConstituent_Transaction), prefixConstituent_Transaction + SbmDbDfn.GetColumnName(dbColumn, false));
}
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Requirement.
bool hasReqntCols = false;
if (!hasReqntCols) hasReqntCols = columns.HasId((int)SbmConstituent.Column.Reqnt_DescBrief);
if (!hasReqntCols) hasReqntCols = columns.HasId((int)SbmConstituent.Column.Reqnt_JobNumber);
if (!hasReqntCols) hasReqntCols = columns.HasId((int)SbmConstituent.Column.Reqnt_ProductCode);
if (hasReqntCols)
{
// Join to the requirement table.
DbQueryJoin joinReqnt = new DbQueryJoin(DbJoinType.LeftOuter);
joinReqnt.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement), aliasConstituent_Requirement);
joinReqnt.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_Id, aliasConstituent_Requirement) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_ReqntId));
query.Joins.Add(joinReqnt);
// Add the requirement columns.
List<SbmDbDfn.ColumnIdx> requirementCols = new List<SbmDbDfn.ColumnIdx>();
requirementCols.Add(SbmDbDfn.ColumnIdx.Requirement_ProductCode);
requirementCols.Add(SbmDbDfn.ColumnIdx.Requirement_DescBrief);
if (prm.UseJobNumber)
requirementCols.Add(SbmDbDfn.ColumnIdx.Requirement_JobNumber);
foreach (SbmDbDfn.ColumnIdx dbColumn in requirementCols)
query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasConstituent_Requirement), prefixConstituent_Requirement + SbmDbDfn.GetColumnName(dbColumn, false));
}
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Unit of measure.
bool hasUomCols = false;
if (!hasUomCols) hasUomCols = columns.HasId((int)SbmConstituent.Column.Uom_Single);
if (hasUomCols)
{
// Join to the UnitOfMeasure table.
DbQueryJoin joinUom = new DbQueryJoin(DbJoinType.LeftOuter);
joinUom.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.UnitMeasure), aliasConstituent_UnitMeasure);
joinUom.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.UnitMeasure_Id, aliasConstituent_UnitMeasure) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_UomId));
query.Joins.Add(joinUom);
// Add the UOM columns.
List<SbmDbDfn.ColumnIdx> unitMeasureCols = new List<SbmDbDfn.ColumnIdx>();
unitMeasureCols.Add(SbmDbDfn.ColumnIdx.UnitMeasure_Abbr);
unitMeasureCols.Add(SbmDbDfn.ColumnIdx.UnitMeasure_Single);
unitMeasureCols.Add(SbmDbDfn.ColumnIdx.UnitMeasure_Multiple);
foreach (SbmDbDfn.ColumnIdx dbColumn in unitMeasureCols)
query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasConstituent_UnitMeasure), prefixConstituent_UnitMeasure + SbmDbDfn.GetColumnName(dbColumn, false));
}
// Common Properties
if (columns.HasId((int)SbmConstituent.Column.Notes))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_Notes, aliasConstituent));
if (columns.HasId((int)SbmConstituent.Column.Flag))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_Flags, aliasConstituent));
if (columns.HasId((int)SbmConstituent.Column.Status) || columns.HasId((int)SbmConstituent.Column.Status_Desc) || columns.HasId((int)SbmConstituent.Column.Status_Ind))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_Status, aliasConstituent));
if (columns.HasId((int)SbmConstituent.Column.CreateOn_Date))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_CreateOn, aliasConstituent));
if (columns.HasId((int)SbmConstituent.Column.UpdateOn_Date))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_UpdateOn, aliasConstituent));
//---------------------------------------------------------------------
// Populate filter.
query.Filters.AddRange(GetConstituentQueryFilter(prm));
if (prm.IdsIncluded.Count != 1)
{
// Configure sort sequence.
foreach (String sortColumn in GetConstituentSortColumns(prm))
query.OrderBy.Add(sortColumn);
}
//---------------------------------------------------------------------
//return new DbResultSet_DataTableReader(db, query.BuildQuery());
return DbResultSet_DataReader.ExecuteQuery(db, query.BuildQuery(prm.ResultsPaging));
}
//-------------------------------------------------------------------
}
//=======================================================================
}