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 GetLogProperties(SbmConstituent constituent) { return new List() { new StringPair("Id",SysId.ToString(constituent.Id)), new StringPair("DescBrief",constituent.DescBrief), new StringPair("Status",constituent.StatusCode) }; } /// Get the unit of time specified by the Unit of Measure. 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; } //------------------------------------------------------------------- /// Refresh the total time stored against all transactions and requirments in the system. public override bool RefreshAllTotalTimes() { // Update all transactions. String colTransaction_Id = SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Transaction_Id, false); DbQuery qryTrans = new DbQuery(Database.DbmsType); qryTrans.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction)); qryTrans.Columns.Add(colTransaction_Id); using (DbResultSet dbResultSet = DbResultSet_DataReader.ExecuteQuery(Database, 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(Database.DbmsType); qryReqnt.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement)); qryReqnt.Columns.Add(colRequirement_Id); using (DbResultSet dbResultSet = DbResultSet_DataReader.ExecuteQuery(Database, 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; } /// Refresh the total times recorded against the old and new transactions and requirements associated with a time record. 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; } /// Refresh the total time recorded against a transaction. public override bool RefreshTransTotalTime(SysId transId) { if (SysId.IsValid(transId)) { // Calculate total for this transaction. double quantityTot = 0; List filters = new List(); filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Constituent_TransId) + "=" + transId.ToString()); filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Constituent_Status) + "<>'" + StatusCancelled + "'"); if (Database != null) { Database.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 columnValues = new List(); SacsDatabase.AddValuePair(columnValues, SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Transaction_TimeTot), quantityTot.ToString(), false); String filter = SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Transaction_Id) + "=" + transId.ToString(); Database.ExecuteUpdate(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction), columnValues, filter); } } return true; } /// Refresh the total time recorded against a requirement. public override bool RefreshReqntTotalTime(SysId reqntId) { if (SysId.IsValid(reqntId)) { // Calculate total for this Requirement. double quantityTot = 0; List filters = new List(); filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Constituent_ReqntId) + "=" + reqntId.ToString()); filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Constituent_Status) + "<>'" + StatusCancelled + "'"); if (Database != null) { Database.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 columnValues = new List(); SacsDatabase.AddValuePair(columnValues, SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Requirement_TimeTot), quantityTot.ToString(), false); String filter = SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Requirement_Id) + "=" + reqntId.ToString(); Database.ExecuteUpdate(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement), columnValues, filter); } } return true; } //------------------------------------------------------------------- /// Get the list of time records recorded for the specified parameters. public override List GetPeriodTimeBooked(SysId affiliateIdEmployee, DateTime periodStart, DateTime periodEnd, SaUomType uomPeriod) { ClearErrorState(); List dataItems = new List(); 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(Database.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(Database, 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 = Database.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 = Database.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(Database.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 = Database.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 = Database.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 GetConstituentQueryFilter(SbmConstituent.Params prm) { List filter = new List(); // 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) && Database.TableExists(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaAsset))) { // Restrict to constituents associated with the specified asset(s): DbQuery qryAsset = new DbQuery(Database.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 GetConstituentSortColumns(SbmConstituent.Params prm) { // Sort sequence: List sortColumnCodes = new List(); 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 Database.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 GetConstituentList(SbmConstituent.Params prm) { ClearErrorState(); List constituents = new List(); DbQuery qry = new DbQuery(Database.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 = Database.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 columns, SbmConstituent.Params prm) { ClearErrorState(); //--------------------------------------------------------------------- // Construct build database query. DbQuery query = new DbQuery(Database.DbmsType); bool canViewSalesFinancials = UserCanViewCommoditySalesFinancials(); //--------------------------------------------------------------------- // 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 constituentCols = new List(); 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 affiliateOwnerCols = new List(); 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 affiliateTargetCols = new List(); 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 associationCols = new List(); 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 assaffTargetCols = new List(); 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 transactionCols = new List(); 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 requirementCols = new List(); 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 unitMeasureCols = new List(); 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(Database, query.BuildQuery()); return DbResultSet_DataReader.ExecuteQuery(Database, query.BuildQuery(prm.ResultsPaging)); } //------------------------------------------------------------------- } //======================================================================= }