using Sarand.BusinessMgr.Net.Standard.Base.App; using Sarand.BusinessMgr.Net.Standard.Base.Bus; using Sarand.BusinessMgr.Net.Standard.Dbas.Bus; using Sarand.BusinessMgr.Net.Standard.Dbas.Internal; using Sarand.BusinessMgr.Net.Standard.Dbas.UpdateLog; using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Dbas; using Sarand.Net.Standard.Base.Utils; using Sarand.Net.Standard.Dbas.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 { //******************************************************************* // T r a n s a c t i o n //******************************************************************* //------------------------------------------------------------------- // Data members. private static String databaseNotAvailable = "database is not available"; //------------------------------------------------------------------- // Utilities. private List GetLogProperties(SbmTransaction transaction) { return new List() { new StringPair("Id",SysId.ToString(transaction.Id)), new StringPair("Type",transaction.TransactionType.ToString()), new StringPair("Ref",transaction.Ref), new StringPair("Status",transaction.StatusCode) }; } public override decimal GetTransCostLabourRateHourDefault() { String costLabourRateHour = UserContext.GetOwnerOption_Value(Sbm.OrgOption_Value.CostLabourRateDefault); return costLabourRateHour.ToDecimal(); } // ToDo GetTransCostLabourRateHourDefault & GetTransCostLabourRateHour for conversion datatype double to decimal! public override decimal GetTransCostLabourRateHour(SysId transactionId) { string colCostLabourRateHour = "CostLabourRateHour"; decimal labourRate = 0.0m; if (SysId.IsValid(transactionId)) { labourRate = GetTransCostLabourRateHourDefault(); if (ColumnExists(SbmDbDfn.ColumnIdx.Transaction_CostLabourRateHour)) { // Construct the query. DbQuery qry = new DbQuery(db.DbmsType); qry.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction)); qry.Columns.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Transaction_CostLabourRateHour), colCostLabourRateHour); qry.Filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Transaction_Id) + "=" + transactionId.ToString()); qry.Filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Transaction_CostLabourRateHour) + " IS NOT null"); using (DbResultSet dbResultSet = DbResultSet_DataReader.ExecuteQuery(db, qry.ToString())) { if (dbResultSet != null && dbResultSet.NextRecord()) { NamedValue.Map values = dbResultSet.GetRecordValues(); return (decimal)values.GetValue(colCostLabourRateHour).ToNumeric(); } } } } return labourRate; } public override bool DeliveryFinancialsAreAvailable() { // Are the fields defined on the database? if (ColumnExists(SbmDbDfn.ColumnIdx.Transaction_DeliveryAmountNet)) return false; if (ColumnExists(SbmDbDfn.ColumnIdx.Transaction_DeliveryAmountTax)) return false; if (!ColumnExists(SbmDbDfn.ColumnIdx.Transaction_DeliveryAmountTot)) return false; if (!ColumnExists(SbmDbDfn.ColumnIdx.Transaction_TaxCodeIdDelivery)) return false; if (!ColumnExists(SbmDbDfn.ColumnIdx.Transaction_DeliveryDepartment)) return false; if (!ColumnExists(SbmDbDfn.ColumnIdx.Transaction_DeliveryNominalCode)) return false; return true; } public override bool ChangeTransactionsAssociation(SbmTransaction transaction, SysId assocId) { ClearErrorState(); List filters = new List(); List values = new List(); String errorStatePrefix = "Failed to change transaction's association - "; // Database connection. if (!HasErrorState() && db == null) SetErrorState(errorStatePrefix + databaseNotAvailable); // Validate the transaction. if (!HasErrorState() && (transaction == null || !SysId.IsValid(transaction.Id))) SetErrorState(errorStatePrefix + "invalid transaction specified"); ///### Apr2012 Don't bother checking that the transaction's assocition is different ### /* Check that the association is not the same as the current association. if (!HasErrorState() && transaction.AssocId == assocId) SetErrorState(errorStatePrefix+"a different association must be specified");*/ // Check that the specified association exists. if (!HasErrorState() && AccountMgr != null && !AccountMgr.AssociationExistsById(assocId)) SetErrorState(errorStatePrefix + "specified association doesn't exist"); // Replace the association against subordinate data items. if (!HasErrorState() && transaction.HasConstituents()) { SacsDatabase.AddValuePair(values, SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Constituent_AssocId), assocId.ToString(), false); filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Constituent_TransId) + "=" + transaction.Id.ToString()); db.ExecuteUpdate(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Constituent), values, filters.Concat(" AND ", "(", ")")); if (db.HasErrorState()) { SetErrorState(errorStatePrefix + "transaction updates failed"); ChangeTransactionsAssociation(transaction, transaction.AssociationId); // To reset changes. } } if (!HasErrorState() && transaction.HasRequirements()) { SacsDatabase.AddValuePair(values, SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Requirement_AssocId), assocId.ToString(), false); filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Requirement_TransId) + "=" + transaction.Id.ToString()); db.ExecuteUpdate(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement), values, filters.Concat(" AND ", "(", ")")); if (db.HasErrorState()) { SetErrorState(errorStatePrefix + "requirement updates failed"); ChangeTransactionsAssociation(transaction, transaction.AssociationId); // To reset changes. } }// Replace the association against the transaction itself. if (!HasErrorState() && transaction.AssociationId != assocId) { filters.Clear(); values.Clear(); SacsDatabase.AddValuePair(values, SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Transaction_AssocId), assocId.ToString(), false); filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Transaction_Id) + "=" + transaction.Id.ToString()); db.ExecuteUpdate(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction), values, filters.Concat(" AND ", "(", ")")); if (db.HasErrorState()) { SetErrorState(errorStatePrefix + "transaction update failed"); ChangeTransactionsAssociation(transaction, transaction.AssociationId); // To reset changes. } } return !HasErrorState(); } public override bool RefreshAssociatedData(SbmTransaction transaction, List requirements = null) { ClearErrorState(); if (transaction == null) return SetErrorState("Transaction not specified"); bool transactionUpdated = false; bool requirementListCreatedLocally = false; if (!HasErrorState()) { /* ToDo create RefreshAllocations in StockMgr for Stock Allocations. if (!InitStockMgr()) SetErrorState("Failed to create Stock Manager"); if (!HasErrorState() && !StockMgr.RefreshAllocations(transaction, requirements, false)) SetErrorState(StockMgr.ErrorStateMessage); // NB 'RefreshAllocations' updates transaction stock allocation status if necessary.*/ } if (!HasErrorState() && transactionUpdated) { if (requirements.Count() < 1) { requirements = transaction.GetRequirements().ToDataList(); requirementListCreatedLocally = true; } // Refresh totals. if (transaction.RefreshTotals(requirements)) UpdateTransaction(transaction, UserContext.DbUpdateInfo); else SetErrorState(transaction.ErrorStateMessage); } if (requirementListCreatedLocally) { if (requirements.Count() > 0) requirements.Clear(); } return !HasErrorState(); } // Refresh associated transactions (eg. stock allocations on associated sames order when dispatch updated and stock actioned by dispatch). public override bool RefreshAssociatedTransactions(SbmTransaction transaction, List requirements = null) { // Check whether associated transactions need to be updated. bool refreshAssociatedTransactions = false; bool requirementListCreatedLocally = false; // Sales Order whose stock allocations depend on dispatched quantity. if (StockControlConfig.ActionByDispatchedQuantity() && transaction.TransactionType == Sbm.TransactionType.SalesDispatch) refreshAssociatedTransactions = true; if (refreshAssociatedTransactions) { List transactionIdsAssociation = new List(); transactionIdsAssociation.Add(transaction.TransactionIdSource); if (requirements == null) { requirements = transaction.GetRequirements().ToDataList(); requirementListCreatedLocally = true; } foreach (SbmRequirement.Data requirement in requirements) { SbmRequirement requirementSource = TransactionMgr.GetRequirementById(requirement.RequirementIdSource); if (requirementSource != null && !transactionIdsAssociation.Contains(requirementSource.TransactionId)) transactionIdsAssociation.Add(requirementSource.TransactionId); } foreach (SysId transactionIdAssociation in transactionIdsAssociation) { SbmTransaction transactionAssociation = GetTransactionById(transactionIdAssociation); if (transactionAssociation != null) { List requirementsAssociation = transactionAssociation.GetRequirements(); if (requirementsAssociation.Count > 0) { RefreshAssociatedData(transactionAssociation, null); transactionAssociation.RefreshTotals(requirementsAssociation); UpdateTransaction(transactionAssociation, UserContext.DbUpdateInfo); requirementsAssociation.Clear(); } } } } if (requirementListCreatedLocally) { if (requirements.Count > 0) requirements.Clear(); } return !HasErrorState(); } //------------------------------------------------------------------- // Has Transaction. public override bool TransactionIsReferencedByOtherTransactions(SysId transactionId/*, SbmTransaction.StatusCat transactionStatusCat)*/) { ClearErrorState(); if (!SysId.IsValid(transactionId)) return false; DbmsType dbmsType = db.DbmsType; String colRefCount = "RefCount"; ///Transaction Source References INTRO // Transactions (TransSrc) can be referenced via. // 1. Other transactions referencing via TransIdSource. // 2. Requirements referencing (via ReqntIdSource) requirements belonging to the transaction. // 3. Requirements associated (via itemLink) with requirements belonging to the transaction. // Only need to establish if there are any relationships, rather than the precise transactions // that are making them, so just need to count the references rather than link back to the transactions. // Query was originally a simple count, but better as a Union of counts for each possible method of reference. // Build query(filter) for each method of reference List queries = new List(); // 1. Transactions that reference the specified transaction directly. // TransId -> Trans.TransIdSource { DbQuery qry = new DbQuery(db.DbmsType); String aliasTblTransSrc = "tblTraScr"; String tblTransaction = SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction); qry.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction), aliasTblTransSrc); qry.Columns.Add("Count(*)", colRefCount); qry.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_TransIdSource, aliasTblTransSrc, false) + "=" + transactionId.ToString()); queries.Add(qry.BuildQuery()); } // 2. Requirements that reference (via ReqntIdSource) requirements belonging to the source transaction. // TransId -> ReqntSrc.TransId -> ReqntSrc.Id -> Reqnt.ReqntIdSource // NB Only interested if there are any referenced requirements, not what references them. { DbQuery qry = new DbQuery(db.DbmsType); // Start with requirements belonging to the source transaction. String aliasTblReqntSrc = "tblReqSrc"; String colRequirement_TransId = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_TransId, aliasTblReqntSrc, false); qry.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement), aliasTblReqntSrc); qry.Columns.Add("Count(*)"); qry.Filters.Add(colRequirement_TransId + "=" + transactionId.ToString()); // Join to referencing requirements. String aliasTblReqntRef = "tblReqRef"; DbQueryJoin joinReqnt = new DbQueryJoin(DbJoinType.Inner); joinReqnt.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement), aliasTblReqntRef); joinReqnt.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_ReqntIdSource, aliasTblReqntRef, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_Id, aliasTblReqntSrc, false)); qry.Joins.Add(joinReqnt); queries.Add(qry.BuildQuery()); } // 3. Requirements associated (via itemLink) with requirements belonging to the transaction. // TransSrc.Id -> ReqntSrc.TransId -> ReqntSrc.Id -> ItemLink -> Reqnt.Id -> Reqnt.TransId // NB Only need to check whether there are any links to the source requirements // and don't have to join to the referencing requirements themselves. if (db.TableExists(SbmDbDfn.TableIdx.ItemLink.ToString()) && UserContext.GetOwnerOption_AllowOption(Sbm.OrgOption_AllowOption.PurchaseItem_AssociatedSalesItems)) { DbQuery qry = new DbQuery(db.DbmsType); // Start with requirements belonging to the source transaction. String aliasTblReqntSrc = "tblReqSrc"; qry.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement), aliasTblReqntSrc); qry.Columns.Add("Count(*)"); qry.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_TransId, aliasTblReqntSrc, false) + "=" + transactionId.ToString()); // Join to Item Link - Both items (From & To) are requirements and either can match the source requirement. String aliasTblItemLink = "tblItmLnk"; DbQueryJoin joinItmLnk = new DbQueryJoin(DbJoinType.Inner); joinItmLnk.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ItemLink), aliasTblItemLink); joinItmLnk.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_Type, aliasTblItemLink, false) + "=" + Sbm.ItemLinkType.Requirement_AssociatedItem.ToString()); joinItmLnk.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemTypeFrom, aliasTblItemLink, false) + "=" + Sbm.ItemType.Requirement); joinItmLnk.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemTypeTo, aliasTblItemLink, false) + "=" + Sbm.ItemType.Requirement); // Feb2017 joinItmLnk.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemIdFrom, aliasTblItemLink, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_Id, aliasTblReqntSrc, false) + " OR " + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemIdTo, aliasTblItemLink, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_Id, aliasTblReqntSrc, false)); qry.Joins.Add(joinItmLnk); queries.Add(qry.BuildQuery()); } // Execute the queries as a single uioned query. String query = queries.Concat("\n Union All \n"); using (DbResultSet dbResultSet = DbResultSet_DataReader.ExecuteQuery(db, query)) { // As each sub-query returns a count, any positive count value is sufficient to indicate a reference. while (dbResultSet != null && dbResultSet.NextRecord()) { NamedValue.Map values = dbResultSet.GetRecordValues(); long count = values.GetValue(colRefCount).AsLong(); if (count > 0) return true; } } return false; } public override bool TransactionHasRequirements(SysId transactionId, SbmRequirement.StatusCat requirementStatusCat) { ClearErrorState(); if (!SysId.IsValid(transactionId)) return false; List filters = new List(); // Build query filter: filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Requirement_TransId) + "=" + transactionId.ToString()); if (requirementStatusCat == SbmRequirement.StatusCat.NotCancelled) filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Requirement_Status) + "<>'" + SaStatus.Cancelled + "'"); else if (requirementStatusCat > 0) filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Requirement_StatusCat) + "='" + RequirementStatusCats.GetCodeForType(requirementStatusCat) + "'"); // Get row count for these criteria: return db.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement), filters.Concat(" AND ", "(", ")")) > 0; } public override bool TransactionHasConstituents(SysId transactionId, SbmConstituent.StatusCat transactionStatusCat) { ClearErrorState(); if (!SysId.IsValid(transactionId)) return false; List filters = new List(); filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Constituent_TransId) + "=" + transactionId.ToString()); if (transactionStatusCat > 0) filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Constituent_StatusCat) + "='" + SbmSystem.GetCodesOfType(UserContext, Sbm.SystemCode.ConstituentStatusCat/*, transactionStatusCat*/) + "'"); return db.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Constituent), filters.Concat(" AND ", "(", ")")) > 0; } public override bool TransactionHasContainerItems(SysId transactionId) { ClearErrorState(); if (!SysId.IsValid(transactionId)) return false; // Check whether this transaction is the container item itself (unlikely) or the 'source' item. String filterItem = SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.ContainerItem_ItemType) + "=" + ((int)Sbm.ItemType.Transaction).ToString() + " AND " + SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.ContainerItem_ItemId) + "=" + transactionId.ToString(); String filterSource = SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.ContainerItem_ItemTypeSource) + "=" + ((int)Sbm.ItemType.Transaction).ToString() + " AND " + SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.ContainerItem_ItemIdSource) + "=" + transactionId.ToString(); List filters = new List(); filters.Add("(" + filterItem + ") OR (" + filterSource + ")"); return db.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ContainerItem), filters.Concat(" AND ", "(", ")")) > 0; } public override bool TransactionHasStockMovements(SysId transactionId) { ClearErrorState(); if (!SysId.IsValid(transactionId)) return false; // Check whether this transaction is the movement item itself (unlikely) or the 'source' item. String filterItem = SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Movement_ItemType) + "=" + ((int)Sbm.ItemType.Transaction).ToString() + " AND " + SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Movement_ItemId) + "=" + transactionId.ToString(); String filterSource = SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Movement_ItemTypeSource) + "=" + ((int)Sbm.ItemType.Transaction).ToString() + " AND " + SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Movement_ItemIdSource) + "=" + transactionId.ToString(); List filters = new List(); filters.Add("(" + filterItem + ") OR (" + filterSource + ")"); return db.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Movement), filters.Concat(" AND ", "(", ")")) > 0; } public override bool TransactionHasPendingStockMovements(SysId transactionId) { ClearErrorState(); if (!SysId.IsValid(transactionId)) return false; // Check whether this transaction is the movement item itself (unlikely) or the 'source' item: String filterItem = SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Movement_ItemType) + "=" + ((int)Sbm.ItemType.Transaction).ToString() + " AND " + SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Movement_ItemId) + "=" + transactionId.ToString(); // Source item can either be the transaction itself or any one of its requirements: String filterSourceTrans = SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Movement_ItemTypeSource) + "=" + ((int)Sbm.ItemType.Transaction).ToString() + " AND " + SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Movement_ItemIdSource) + "=" + transactionId.ToString(); String aliasTransaction_Reqnt = "TraReq"; DbQuery qryReqnt = new DbQuery(db.DbmsType); qryReqnt.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement), aliasTransaction_Reqnt); qryReqnt.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_Id, aliasTransaction_Reqnt, false)); qryReqnt.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_TransId, aliasTransaction_Reqnt, false) + "=" + transactionId.ToString()); String filterSourceReqnt = SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Movement_ItemTypeSource) + "=" + Sbm.ItemType.Requirement.ToString() + " AND " + SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Movement_ItemIdSource) + " IN (" + qryReqnt.BuildQuery() + ")"; String filterSource = "(" + filterSourceTrans + ") OR (" + filterSourceReqnt + ")"; List filters = new List(); filters.Add("(" + filterItem + ") OR (" + filterSource + ")"); filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Movement_Status) + "='" + SaStatus.Awaiting + "'"); return db.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Movement), filters.Concat(" AND ", "(", ")")) > 0; } //------------------------------------------------------------------- // Get Transaction. public override SbmTransaction GetTransaction(SbmTransaction.Params prm) { return GetTransaction(GetTransactionQueryFilter(prm).Concat(" AND ", "(", ")")); } private SbmTransaction GetTransaction(String filter) { ClearErrorState(); long count = GetTransactionCount(filter); if (count == 0) return null; if (count != 1) { SetErrorState("Multiple Transactions found"); return null; } SbmTransaction prmTransaction = null; // Query data. using (var dbConnection = db.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { dbConnection.Open(); Transaction_Db dbTransaction = new Transaction_Db(DbInfo); dbTransaction.PopulateFrom(dbCommand, aliasTransaction, filter); prmTransaction = CreateTransaction(dbTransaction); } catch (Exception exc) { SetErrorState("Database query exception"); SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}"); } } return prmTransaction; } public override List GetRequirementByIds(SbmTransaction.Params prmTrans) { ClearErrorState(); List ids = new List(); String dataName_ReqntId = "ReqntId"; DbQuery qryReqntTrans = new DbQuery(db.DbmsType); qryReqntTrans.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction)); qryReqntTrans.Columns.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Requirement_Id), dataName_ReqntId); DbQueryJoin joinReqntTrans = new DbQueryJoin(DbJoinType.Inner); joinReqntTrans.Table = SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement); joinReqntTrans.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_TransId) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id)); qryReqntTrans.Joins.Add(joinReqntTrans); qryReqntTrans.Filters.AddRange(GetTransactionQueryFilter(prmTrans)); using (DbResultSet dbResultSet = DbResultSet_DataReader.ExecuteQuery(db, qryReqntTrans.BuildQuery())) { while (dbResultSet != null && dbResultSet.NextRecord()) { NamedValue.Map values = dbResultSet.GetRecordValues(); ids.Add(new SysId((int)values.GetValue(dataName_ReqntId).AsLong())); } } return ids; } //------------------------------------------------------------------- // Create Transaction. public override SbmTransaction CreateTransaction(SysId assocId, Sbm.TransactionType transactionType) { ClearErrorState(); if (!SysId.IsValid(assocId)) { SetErrorState("Association not supplied"); return null; } if ((int)transactionType < 1) { SetErrorState("Transaction type not identified"); return null; } return new SbmTransaction_Dbas(Internals, new SysId(), AffiliateId_Owner, assocId, transactionType, 0); } private SbmTransaction_Dbas CreateTransaction(Transaction_Db dbTransaction) { ClearErrorState(); SbmTransaction_Dbas transaction = new SbmTransaction_Dbas(Internals, new SysId(dbTransaction._Id), new SysId(dbTransaction._AffIdOwner ?? 0), new SysId(dbTransaction._AssocId), (Sbm.TransactionType)dbTransaction._Type, (ushort)dbTransaction._Flags); PopulateFrom(dbTransaction, transaction); return transaction; } //------------------------------------------------------------------- // Validate Transaction. public override bool IsValidTransactionData(SbmTransaction.Data data, SbmTransaction.ErrField errField) { ClearErrorState(); if (!base.IsValidTransactionData(data, errField)) return false; return true; } //------------------------------------------------------------------- // Insert Transaction. public override bool InsertTransaction(SbmTransaction transaction, DbUpdateInfo dbUpdateInfo) { ClearErrorState(); if (!IsValidTransaction(transaction)) return false; if (SysId.IsValid(transaction.Id)) return SetErrorState(ErrorMessage.ValiditemId); using (var dbConnection = db.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { dbConnection.Open(); Transaction_Db dbTransaction = new Transaction_Db(DbInfo); PopulateTo(dbTransaction, transaction, dbUpdateInfo); if (Transaction_Db.FieldsNonId.Contains("Id")) { // Generate next Id. dbTransaction._Id = SysId.ToInt(db.GetNextId("Transaction", dbUpdateInfo)); } dbTransaction.ExecuteInsertCommand(dbCommand); transaction.Id = new SysId(dbTransaction._Id); transaction.Changed = false; if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Inserted. " + GetLogProperties(transaction).Concat(": ").Concat("", "\n\t")); } catch (Exception exc) { SetErrorState(exc.Message); } } return !HasErrorState(); } //------------------------------------------------------------------- // Update Transaction. public override bool UpdateTransaction(SbmTransaction transaction, DbUpdateInfo dbUpdateInfo) { ClearErrorState(); if (!IsValidTransaction(transaction)) return false; if (!SysId.IsValid(transaction.Id)) return SetErrorState(ErrorMessage.InvalidItemId); if (!transaction.Changed) { if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Data not changed. " + GetLogProperties(transaction).Concat(": ").Concat("", "\n\t")); return true; } using (var dbConnection = db.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { // Retrieve Transaction. dbConnection.Open(); Transaction_Db dbTransaction = new Transaction_Db(DbInfo); dbTransaction.PopulateFrom(dbCommand, aliasTransaction, "Id=" + SysId.ToString(transaction.Id)); SbmUpdateLogItemMonitor_Transaction updateLogMonitor = new SbmUpdateLogItemMonitor_Transaction(Internals, CreateTransaction(dbTransaction)); // Update properties. PopulateTo(dbTransaction, transaction, dbUpdateInfo); dbTransaction.ExecuteUpdateCommand(dbCommand); transaction.Changed = false; if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Updated. " + GetLogProperties(transaction).Concat(": ").Concat("", "\n\t")); // Record updates. updateLogMonitor.RecordUpdatedValues(transaction); updateLogMonitor.LogUpdates(); } catch (Exception exc) { SetErrorState(exc.Message); } } return !HasErrorState(); } //------------------------------------------------------------------- // Delete Transaction. public override bool TransactionCanBeDeleted(SbmTransaction transaction) { ClearErrorState(); if (!base.TransactionCanBeDeleted(transaction)) return false; if (transaction == null) return SetErrorState("item not specified"); // Associated transactions. if (transaction.IsReferencedByOtherTransactions()) return SetErrorState("linked transactions are present"); // Requirements. int requirementCount = (int)transaction.GetRequirementCount(); if (requirementCount > 0 && (SessionConsole == null || !SessionConsole.CanRemoveTransactionWithRequirements(transaction, requirementCount))) { if (requirementCount == 1) return SetErrorState("item has a requirement"); else return SetErrorState("item has multiple requirements"); } if (transaction.HasConstituents()) return SetErrorState("item has constituents"); // Transaction status. if (transaction.Status == SaStatus.Completed) return SetErrorState("transaction has been completed"); if (transaction.Status != SaStatus.Cancelled) return SetErrorState("transaction has not been cancelled"); // Stock movements. if (transaction.HasContainerItems()) return SetErrorState("item is references by containers"); if (transaction.HasStockMovements()) return SetErrorState("item is referenced by stock movements"); if (StockMgr != null && StockMgr.SourceItemHasMovements(Sbm.ItemType.Transaction, transaction.Id)) return SetErrorState("item has stock movements"); // Diary links. if (transaction.HasDiaryLinks()) return SetErrorState("item has diary links"); return true; } public override bool DeleteTransaction(SbmTransaction transaction, DbUpdateInfo dbUpdateInfo) { ClearErrorState(); if (!TransactionCanBeDeleted(transaction)) return false; using (var dbConnection = db.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { // Retrieve prmTransaction. dbConnection.Open(); Transaction_Db dbTransaction = new Transaction_Db(DbInfo); dbTransaction.PopulateFrom(dbCommand, aliasTransaction, "Id=" + transaction.Id.ToString()); // Delete prmTransaction. dbCommand.CommandType = System.Data.CommandType.Text; dbCommand.CommandText = "DELETE FROM " + SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction) + " WHERE Id=" + SysId.ToString(transaction.Id) + ";"; dbCommand.ExecuteNonQuery(); transaction.Changed = false; if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Deleted. " + GetLogProperties(transaction).Concat(": ").Concat("", "\n\t")); } catch (Exception exc) { SetErrorState(exc.Message); } } return !HasErrorState(); } //------------------------------------------------------------------- // Copy data properties to and from database. private void PopulateTo(Transaction_Db dbTransaction, SbmTransaction transaction, DbUpdateInfo dbUpdateInfo) { dbTransaction._Id = transaction.Id.ToInt(); dbTransaction._AffIdOwner = SysId.ToInt(transaction.AffiliateIdOwner); dbTransaction._AssocId = SysId.ToInt(transaction.AssociationId); dbTransaction._Type = (short)transaction.TransactionType; dbTransaction._Ref = transaction.Ref; dbTransaction._RefInt = transaction.RefInt; dbTransaction._RefExt = transaction.RefExt; dbTransaction._RaisedBy = transaction.RaisedBy; dbTransaction._AffIdRaise = SysId.ToInt(transaction.AffiliateIdRaise); dbTransaction._AssocIdOffice = SysId.ToInt(transaction.AssociationIdOffice); dbTransaction._ContactName = transaction.ContactName; dbTransaction._Likelihood = transaction.Likelihood; dbTransaction._TransIdSource = SysId.ToInt(transaction.TransactionIdSource); dbTransaction._ReferCode = transaction.ReferCode; dbTransaction._ReferSource = transaction.ReferSource; dbTransaction._AffIdRefer = SysId.ToInt(transaction.AffiliateIdRefer); dbTransaction._AssocIdContract = SysId.ToInt(transaction.AssociationIdContract); dbTransaction._AssIdDeliver = SysId.ToInt(transaction.AssociationIdDelivery); dbTransaction._Raised = transaction.Raised; dbTransaction._Required = transaction.Required; dbTransaction._InProgress = transaction.InProgress; dbTransaction._DeliveredEst = transaction.DeliveredEst; dbTransaction._DeliveredAct = transaction.DeliveredAct; dbTransaction._Closed = transaction.Closed; dbTransaction._Department = transaction.Department; dbTransaction._DescBrief = transaction.DescBrief; dbTransaction._DescIntro = transaction.DescIntro; dbTransaction._DescOutline = transaction.DescOutline; dbTransaction._DescDetail = transaction.DescDetail; dbTransaction._ResponseCode = transaction.ResponseCode; dbTransaction._ContactAreaCode = transaction.ContactAreaCode; dbTransaction._Postcode = transaction.Postcode; dbTransaction._CurrencyId = transaction.CurrencyId.ToInt(); dbTransaction._TaxCodeId = transaction.TaxCodeId.ToInt(); dbTransaction._AmountEst = transaction.AmountEst; dbTransaction._AmountMax = transaction.AmountMax; dbTransaction._AmountNet = transaction.AmountNet; dbTransaction._AmountTax = transaction.AmountTax; dbTransaction._AmountTot = transaction.AmountTot; dbTransaction._TimeEst = transaction.TimeEst; dbTransaction._TimeAct = transaction.TimeAct; dbTransaction._TimeTot = transaction.TimeTot; dbTransaction._LocationIdStock = SysId.ToInt(transaction.LocationIdStock); dbTransaction._Weight = transaction.Weight; dbTransaction._UomIdWeight = SysId.ToInt(transaction.UomIdWeight); dbTransaction._BoxCount = transaction.BoxCount; dbTransaction._DeliveryStatusCode = transaction.DeliveryStatusCode; dbTransaction._DeliveryTypeCode = transaction.DeliveryTypeCode; dbTransaction._DeliveryMethodCode = transaction.DeliveryMethodCode; dbTransaction._DeliveryCourierCode = transaction.DeliveryCourierCode; dbTransaction._DeliveryBookInCode = transaction.DeliveryBookInCode; dbTransaction._StockPickerCode = transaction.StockPickerCode; dbTransaction._DeliveryRef = transaction.DeliveryRef; dbTransaction._DeliveryComment = transaction.DeliveryComment; dbTransaction._DeliveryAmountNet = transaction.DeliveryAmountNet; dbTransaction._TaxCodeIdDelivery = SysId.ToInt(transaction.TaxCodeIdDelivery); dbTransaction._DeliveryAmountTax = transaction.DeliveryAmountTax; dbTransaction._DeliveryAmountTot = transaction.DeliveryAmountTot; dbTransaction._DeliveryDepartment = transaction.DeliveryDepartment; dbTransaction._DeliveryNominalCode = transaction.DeliveryNominalCode; // Common properties. dbTransaction._Notes = transaction.Notes; dbTransaction._StatusCat = TransactionStatusCats.GetCodeForType(transaction.TransactionStatusCat); dbTransaction._Status = SacsSystem.GetStatusCode(transaction.Status); dbTransaction._Flags = (short)transaction.Flags; if (!SysId.IsValid(transaction.Id)) { dbTransaction._CreateOn = DateTime.UtcNow; dbTransaction._CreateBy = dbUpdateInfo.UserId.ToInt(); dbTransaction._CreateHost = dbUpdateInfo.Host; } dbTransaction._UpdateOn = DateTime.UtcNow; dbTransaction._UpdateBy = dbUpdateInfo.UserId.ToInt(); dbTransaction._UpdateHost = dbUpdateInfo.Host; } private void PopulateFrom(Transaction_Db dbTransaction, SbmTransaction transaction) { //transaction.Id = new SysId(dbTransaction._Id); transaction.AffiliateIdOwner = new SysId(dbTransaction._AffIdOwner ?? 0); transaction.AssociationId = new SysId(dbTransaction._AssocId); transaction.TransactionType = (Sbm.TransactionType)(dbTransaction._Type ?? 0); transaction.Ref = dbTransaction._Ref; transaction.RefInt = dbTransaction._RefInt ?? 0; transaction.RefExt = dbTransaction._RefExt; transaction.RaisedBy = dbTransaction._RaisedBy; transaction.AffiliateIdRaise = new SysId(dbTransaction._AffIdRaise ?? 0); transaction.AssociationIdOffice = new SysId(dbTransaction._AssocIdOffice ?? 0); transaction.ContactName = dbTransaction._ContactName; transaction.Likelihood = dbTransaction._Likelihood; transaction.TransactionIdSource = new SysId(dbTransaction._TransIdSource ?? 0); transaction.ReferCode = dbTransaction._ReferCode; transaction.ReferSource = dbTransaction._ReferSource; transaction.AffiliateIdRefer = new SysId(dbTransaction._AffIdRefer ?? 0); transaction.AssociationIdContract = new SysId(dbTransaction._AssocIdContract ?? 0); transaction.AssociationIdDelivery = new SysId(dbTransaction._AssIdDeliver ?? 0); transaction.Raised = dbTransaction._Raised ?? default(DateTime); transaction.Required = dbTransaction._Required ?? default(DateTime); transaction.InProgress = dbTransaction._InProgress ?? default(DateTime); transaction.DeliveredEst = dbTransaction._DeliveredEst ?? default(DateTime); transaction.DeliveredAct = dbTransaction._DeliveredAct ?? default(DateTime); transaction.Closed = dbTransaction._Closed ?? default(DateTime); transaction.Department = dbTransaction._Department; transaction.DescBrief = dbTransaction._DescBrief; transaction.DescIntro = dbTransaction._DescIntro; transaction.DescOutline = dbTransaction._DescOutline; transaction.DescDetail = dbTransaction._DescDetail; transaction.ResponseCode = dbTransaction._ResponseCode; transaction.ContactAreaCode = dbTransaction._ContactAreaCode; transaction.Postcode = dbTransaction._Postcode; transaction.CurrencyId = new SysId(dbTransaction._CurrencyId ?? 0); transaction.TaxCodeId = new SysId(dbTransaction._TaxCodeId ?? 0); transaction.AmountEst = dbTransaction._AmountEst ?? 0.0m; transaction.AmountMax = dbTransaction._AmountMax ?? 0.0m; transaction.AmountNet = dbTransaction._AmountNet ?? 0.0m; transaction.AmountTax = dbTransaction._AmountTax ?? 0.0m; transaction.AmountTot = dbTransaction._AmountTot ?? 0.0m; transaction.TimeEst = dbTransaction._TimeEst ?? 0.0m; transaction.TimeAct = dbTransaction._TimeAct ?? 0.0m; transaction.TimeTot = dbTransaction._TimeTot ?? 0.0m; transaction.LocationIdStock = new SysId(dbTransaction._LocationIdStock ?? 0); transaction.Weight = dbTransaction._Weight ?? 0.0m; transaction.UomIdWeight = new SysId(dbTransaction._UomIdWeight ?? 0); transaction.BoxCount = dbTransaction._BoxCount; transaction.DeliveryStatusCode = dbTransaction._DeliveryStatusCode; transaction.DeliveryTypeCode = dbTransaction._DeliveryTypeCode; transaction.DeliveryMethodCode = dbTransaction._DeliveryMethodCode; transaction.DeliveryCourierCode = dbTransaction._DeliveryCourierCode; transaction.DeliveryBookInCode = dbTransaction._DeliveryBookInCode; transaction.StockPickerCode = dbTransaction._StockPickerCode; transaction.DeliveryRef = dbTransaction._DeliveryRef; transaction.DeliveryComment = dbTransaction._DeliveryComment; transaction.DeliveryAmountNet = dbTransaction._DeliveryAmountNet ?? 0.0m; transaction.TaxCodeIdDelivery = new SysId(dbTransaction._TaxCodeIdDelivery ?? 0); transaction.DeliveryAmountTax = dbTransaction._DeliveryAmountTax ?? 0.0m; transaction.DeliveryAmountTot = dbTransaction._DeliveryAmountTot ?? 0.0m; transaction.DeliveryDepartment = dbTransaction._DeliveryDepartment; transaction.DeliveryNominalCode = dbTransaction._DeliveryNominalCode; // Common properties. transaction.Notes = dbTransaction._Notes; transaction.Status = SacsSystem.GetStatusForCode(dbTransaction._Status); transaction.SetCreateStamp(dbTransaction._CreateOn ?? default(DateTime), new SysId(dbTransaction._CreateBy ?? 0), dbTransaction._CreateHost); transaction.SetUpdateStamp(dbTransaction._UpdateOn ?? default(DateTime), new SysId(dbTransaction._UpdateBy ?? 0), dbTransaction._UpdateHost); transaction.AcceptChanges(); } //------------------------------------------------------------------- // Column definitions. private static readonly String aliasTransaction = "aTrn"; private static readonly String aliasTransaction_Association = "Trn_Ass"; private static readonly String prefixTransaction_Association = aliasTransaction_Association + "_"; private static readonly String aliasTransaction_AffiliateOwner = "Trn_AffOwn"; private static readonly String prefixTransaction_AffiliateOwner = aliasTransaction_AffiliateOwner + "_"; private static readonly String aliasTransaction_AffiliateTarget = "Trn_AffTgt"; private static readonly String prefixTransaction_AffiliateTarget = aliasTransaction_AffiliateTarget + "_"; private static readonly String aliasTransaction_AddressTarget = "Trn_TgtAdd"; private static readonly String prefixTransaction_AddressTarget = aliasTransaction_AddressTarget + "_"; private static readonly String aliasTransaction_DeliveryAddress = "Trn_DelAdd"; private static readonly String prefixTransaction_DeliveryAddress = aliasTransaction_DeliveryAddress + "_"; private static readonly String aliasTransaction_Currency = "Trn_Cur"; private static readonly String prefixTransaction_Currency = aliasTransaction_Currency + "_"; private static readonly String aliasTransaction_DeliveryTaxcode = "Trn_DelTxc"; private static readonly String prefixTransaction_DeliveryTaxcode = aliasTransaction_DeliveryTaxcode + "_"; private static readonly String aliasTransaction_SourceTransaction = "Trn_SrcTrn"; private static readonly String prefixTransaction_SourceTransaction = aliasTransaction_SourceTransaction + "_"; // Column names. private static readonly String colNameCostTotal = "CostTotal"; private static readonly String colNameCountReqnts = "CountReqnts"; private static readonly String colNameCountTimeRecs = "CountTimeRecs"; private static readonly String colNameCountActions = "CountActions"; private static readonly String colNameHasInvoice = "HasInvoice"; private static readonly String colNameAccountsInvoiceRef = "AccInvRef"; // Column definition population. private void SetTransactionColDfn (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.Transaction) alias = aliasTransaction; 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 Transaction column definition. public override ColumnDfn GetTransactionColumnDfn(SbmTransaction.Column column, string caption = "", int width = 0) { bool canViewSupplyFinancials = UserContext.SecurityProfile_Core.UserCanViewFinancials(Sbm.FinancialType.CommoditySupply); bool canViewSalesFinancials = UserContext.SecurityProfile_Core.UserCanViewFinancials(Sbm.FinancialType.CommoditySales); ColumnDfn columnDfn = new ColumnDfn((int)column, caption, width); switch (column) { case SbmTransaction.Column.Pos: SetTransactionColDfn(columnDfn, "Pos", 45, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right); columnDfn.SortMode = ColumnDfn.ColumnSortMode.Off; columnDfn.ReadOnly = true; columnDfn.Resizable = false; break; case SbmTransaction.Column.Id: SetTransactionColDfn(columnDfn, "Id", 60, SbmDbDfn.ColumnIdx.Transaction_Id, ColumnAlignment.Right, DataValue.DataType.Long); columnDfn.ReadOnly = true; break; // Transaction Properties. case SbmTransaction.Column.Type_Desc: SetTransactionColDfn(columnDfn, "Type", 70, SbmDbDfn.ColumnIdx.Transaction_Type, ColumnAlignment.Center, DataValue.DataType.String); break; case SbmTransaction.Column.DescBrief: SetTransactionColDfn(columnDfn, "Narrative", 170, SbmDbDfn.ColumnIdx.Transaction_DescBrief, ColumnAlignment.Default, DataValue.DataType.String); break; case SbmTransaction.Column.Ref: SetTransactionColDfn(columnDfn, "Ref", 80, SbmDbDfn.ColumnIdx.Transaction_Ref, ColumnAlignment.Center, DataValue.DataType.String); break; case SbmTransaction.Column.RefExt: SetTransactionColDfn(columnDfn, "Ext ref", 80, SbmDbDfn.ColumnIdx.Transaction_RefExt, ColumnAlignment.Center); break; case SbmTransaction.Column.ContactName: SetTransactionColDfn(columnDfn, "Contact", 100, SbmDbDfn.ColumnIdx.Transaction_ContactName); break; case SbmTransaction.Column.Likelihood: SetTransactionColDfn(columnDfn, "Prospect", 55, SbmDbDfn.ColumnIdx.Transaction_Likelihood, ColumnAlignment.Center); break; case SbmTransaction.Column.RaisedOn: SetTransactionColDfn(columnDfn, "Raised", 65, SbmDbDfn.ColumnIdx.Transaction_Raised, ColumnAlignment.Center, DataValue.DataType.Date); columnDfn.DateFormat = "d-MMM-yy"; break; case SbmTransaction.Column.RequiredOn: SetTransactionColDfn(columnDfn, "Required", 65, SbmDbDfn.ColumnIdx.Transaction_Required, ColumnAlignment.Center, DataValue.DataType.Date); columnDfn.DateFormat = "d-MMM-yy"; break; case SbmTransaction.Column.InProgressOn: SetTransactionColDfn(columnDfn, "In progress", 75, SbmDbDfn.ColumnIdx.Transaction_InProgress, ColumnAlignment.Center, DataValue.DataType.Date); columnDfn.DateFormat = "d-MMM-yy"; break; case SbmTransaction.Column.ClosedOn: SetTransactionColDfn(columnDfn, "Closed", 65, SbmDbDfn.ColumnIdx.Transaction_Closed, ColumnAlignment.Center, DataValue.DataType.Date); columnDfn.DateFormat = "d-MMM-yy"; break; case SbmTransaction.Column.ContactAreaCode: { String colLabel = GetAttributeCaption(SbmDbDfn.ColumnIdx.Association_ContactAreaCode, "Cont.Area"); SetTransactionColDfn(columnDfn, colLabel, 45, SbmDbDfn.ColumnIdx.Transaction_ContactAreaCode, ColumnAlignment.Center); break; } case SbmTransaction.Column.ContactArea: { String colLabel = GetAttributeCaption(SbmDbDfn.ColumnIdx.Association_ContactAreaCode, "Contact Area"); SetTransactionColDfn(columnDfn, colLabel, 90, SbmDbDfn.ColumnIdx.Transaction_ContactAreaCode, ColumnAlignment.Center); break; } case SbmTransaction.Column.DeliveryStatusCode: SetTransactionColDfn(columnDfn, "Delivery stat", 60, SbmDbDfn.ColumnIdx.Transaction_DeliveryStatusCode, ColumnAlignment.Center); break; case SbmTransaction.Column.DeliveryStatus: SetTransactionColDfn(columnDfn, "Delivery status", 120, SbmDbDfn.ColumnIdx.Transaction_DeliveryStatusCode, ColumnAlignment.Center); break; case SbmTransaction.Column.DeliveryTypeCode: SetTransactionColDfn(columnDfn, "Delivery type", 60, SbmDbDfn.ColumnIdx.Transaction_DeliveryTypeCode, ColumnAlignment.Center); break; case SbmTransaction.Column.DeliveryType: SetTransactionColDfn(columnDfn, "Delivery type", 120, SbmDbDfn.ColumnIdx.Transaction_DeliveryTypeCode, ColumnAlignment.Center); break; case SbmTransaction.Column.DeliveryMethodCode: SetTransactionColDfn(columnDfn, "Delivery Method", 60, SbmDbDfn.ColumnIdx.Transaction_DeliveryMethodCode, ColumnAlignment.Center); break; case SbmTransaction.Column.DeliveryMethod: SetTransactionColDfn(columnDfn, "Delivery Method", 120, SbmDbDfn.ColumnIdx.Transaction_DeliveryMethodCode, ColumnAlignment.Center); break; case SbmTransaction.Column.DeliveryCourierCode: SetTransactionColDfn(columnDfn, "Delivery Courier", 60, SbmDbDfn.ColumnIdx.Transaction_DeliveryCourierCode, ColumnAlignment.Center); break; case SbmTransaction.Column.DeliveryCourier: SetTransactionColDfn(columnDfn, "Delivery Courier", 120, SbmDbDfn.ColumnIdx.Transaction_DeliveryCourierCode, ColumnAlignment.Center); break; case SbmTransaction.Column.DeliveryBookInCode: SetTransactionColDfn(columnDfn, "Delivery BookIn", 60, SbmDbDfn.ColumnIdx.Transaction_DeliveryBookInCode, ColumnAlignment.Center); break; case SbmTransaction.Column.DeliveryBookIn: SetTransactionColDfn(columnDfn, "Delivery BookIn", 120, SbmDbDfn.ColumnIdx.Transaction_DeliveryBookInCode, ColumnAlignment.Center); break; case SbmTransaction.Column.StockPickerCode: SetTransactionColDfn(columnDfn, "Stock picker", 60, SbmDbDfn.ColumnIdx.Transaction_StockPickerCode, ColumnAlignment.Center); break; case SbmTransaction.Column.StockPicker: SetTransactionColDfn(columnDfn, "Stock picker", 120, SbmDbDfn.ColumnIdx.Transaction_StockPickerCode, ColumnAlignment.Center); break; case SbmTransaction.Column.DeliveryAmountNet: if (canViewSalesFinancials) SetTransactionColDfn(columnDfn, "Delivery net amount", 90, SbmDbDfn.ColumnIdx.Transaction_DeliveryAmountNet, ColumnAlignment.Center, DataValue.DataType.Double); break; case SbmTransaction.Column.DeliveryAmountNet_Fmt: if (canViewSalesFinancials) SetTransactionColDfn(columnDfn, "Delivery net amount", 90, SbmDbDfn.ColumnIdx.Transaction_DeliveryAmountNet, ColumnAlignment.Center, DataValue.DataType.String); break; case SbmTransaction.Column.DeliveryTaxCodeId: SetTransactionColDfn(columnDfn, "Delivery tax code Id", 90, SbmDbDfn.ColumnIdx.Transaction_TaxCodeIdDelivery, ColumnAlignment.Center, DataValue.DataType.Long); break; case SbmTransaction.Column.DeliveryTaxCode_Code: SetTransactionColDfn(columnDfn, "Delivery tax code", 90, SbmDbDfn.ColumnIdx.TaxCode_Code, ColumnAlignment.Center, DataValue.DataType.String, aliasTransaction_DeliveryTaxcode, prefixTransaction_DeliveryTaxcode); break; case SbmTransaction.Column.DeliveryTaxCode_Rate: SetTransactionColDfn(columnDfn, "Delivery tax rate", 90, SbmDbDfn.ColumnIdx.TaxCode_TaxRate, ColumnAlignment.Center, DataValue.DataType.Double, aliasTransaction_DeliveryTaxcode, prefixTransaction_DeliveryTaxcode); break; case SbmTransaction.Column.DeliveryAmountTax: if (canViewSalesFinancials) SetTransactionColDfn(columnDfn, "Delivery tax amount", 90, SbmDbDfn.ColumnIdx.Transaction_DeliveryAmountTax, ColumnAlignment.Right, DataValue.DataType.Double); break; case SbmTransaction.Column.DeliveryAmountTax_Fmt: if (canViewSalesFinancials) SetTransactionColDfn(columnDfn, "Delivery tax amount", 90, SbmDbDfn.ColumnIdx.Transaction_DeliveryAmountTax, ColumnAlignment.Right, DataValue.DataType.String); break; case SbmTransaction.Column.DeliveryAmountTot: if (canViewSalesFinancials) SetTransactionColDfn(columnDfn, "Delivery total amount", 90, SbmDbDfn.ColumnIdx.Transaction_DeliveryAmountTot, ColumnAlignment.Right, DataValue.DataType.Double); break; case SbmTransaction.Column.DeliveryAmountTot_Fmt: if (canViewSalesFinancials) SetTransactionColDfn(columnDfn, "Delivery total amount", 90, SbmDbDfn.ColumnIdx.Transaction_DeliveryAmountTot, ColumnAlignment.Right, DataValue.DataType.String); break; case SbmTransaction.Column.DeliveryNominalCode: SetTransactionColDfn(columnDfn, "Delivery nominal", 90, SbmDbDfn.ColumnIdx.Transaction_DeliveryNominalCode, ColumnAlignment.Center); break; case SbmTransaction.Column.DeliveryDepartment: SetTransactionColDfn(columnDfn, "Delivery dept", 90, SbmDbDfn.ColumnIdx.Transaction_DeliveryDepartment, ColumnAlignment.Center); break; case SbmTransaction.Column.CurrencyId: SetTransactionColDfn(columnDfn, "Currency #", 60, SbmDbDfn.ColumnIdx.Transaction_CurrencyId, ColumnAlignment.Right, DataValue.DataType.Long); break; case SbmTransaction.Column.Currency_Code: SetTransactionColDfn(columnDfn, "Currency", 70, SbmDbDfn.ColumnIdx.Currency_Code, ColumnAlignment.Center, DataValue.DataType.String, aliasTransaction_Currency, prefixTransaction_Currency); break; case SbmTransaction.Column.Currency_Symbol: SetTransactionColDfn(columnDfn, "Currency", 79, SbmDbDfn.ColumnIdx.Currency_Symbol, ColumnAlignment.Center, DataValue.DataType.String, aliasTransaction_Currency, prefixTransaction_Currency); break; case SbmTransaction.Column.AmountEst: if (canViewSalesFinancials) { SetTransactionColDfn(columnDfn, "Amount(est)", 75, SbmDbDfn.ColumnIdx.Transaction_AmountEst, ColumnAlignment.Right, DataValue.DataType.Double); } break; case SbmTransaction.Column.AmountEst_Fmt: if (canViewSalesFinancials) { SetTransactionColDfn(columnDfn, "Amount(est)", 80, SbmDbDfn.ColumnIdx.Transaction_AmountEst, ColumnAlignment.Right, DataValue.DataType.String); } break; case SbmTransaction.Column.AmountMax: if (canViewSalesFinancials) { SetTransactionColDfn(columnDfn, "Amount(max)", 75, SbmDbDfn.ColumnIdx.Transaction_AmountMax, ColumnAlignment.Right, DataValue.DataType.Double); } break; case SbmTransaction.Column.AmountMax_Fmt: if (canViewSalesFinancials) { SetTransactionColDfn(columnDfn, "Amount(max)", 80, SbmDbDfn.ColumnIdx.Transaction_AmountMax, ColumnAlignment.Right, DataValue.DataType.String); } break; case SbmTransaction.Column.AmountNet: if (canViewSalesFinancials) { SetTransactionColDfn(columnDfn, "Net", 60, SbmDbDfn.ColumnIdx.Transaction_AmountNet, ColumnAlignment.Right, DataValue.DataType.Double); } break; case SbmTransaction.Column.AmountNet_Fmt: if (canViewSalesFinancials) { SetTransactionColDfn(columnDfn, "Net", 80, SbmDbDfn.ColumnIdx.Transaction_AmountNet, ColumnAlignment.Right, DataValue.DataType.String); } break; case SbmTransaction.Column.AmountTax: if (canViewSalesFinancials) { SetTransactionColDfn(columnDfn, "Tax", 60, SbmDbDfn.ColumnIdx.Transaction_AmountTax, ColumnAlignment.Right, DataValue.DataType.Double); } break; case SbmTransaction.Column.AmountTax_Fmt: if (canViewSalesFinancials) { SetTransactionColDfn(columnDfn, "Tax", 80, SbmDbDfn.ColumnIdx.Transaction_AmountTax, ColumnAlignment.Right, DataValue.DataType.String); } break; case SbmTransaction.Column.AmountTot: if (canViewSalesFinancials) { SetTransactionColDfn(columnDfn, "Total", 60, SbmDbDfn.ColumnIdx.Transaction_AmountTot, ColumnAlignment.Right, DataValue.DataType.Double); } break; case SbmTransaction.Column.AmountTot_Fmt: if (canViewSalesFinancials) { SetTransactionColDfn(columnDfn, "Total", 80, SbmDbDfn.ColumnIdx.Transaction_AmountTot, ColumnAlignment.Right, DataValue.DataType.String); } break; case SbmTransaction.Column.TimeEst: SetTransactionColDfn(columnDfn, "Time (est)", 70, SbmDbDfn.ColumnIdx.Transaction_TimeEst, ColumnAlignment.Right, DataValue.DataType.Double); break; case SbmTransaction.Column.TimeAct: SetTransactionColDfn(columnDfn, "Time (act)", 70, SbmDbDfn.ColumnIdx.Transaction_TimeAct, ColumnAlignment.Right, DataValue.DataType.Double); break; case SbmTransaction.Column.TimeTot: SetTransactionColDfn(columnDfn, "Time (tot)", 70, SbmDbDfn.ColumnIdx.Transaction_TimeTot, ColumnAlignment.Right, DataValue.DataType.Double); break; case SbmTransaction.Column.CostLabourRateHour: SetTransactionColDfn(columnDfn, "Labour rate", 90, SbmDbDfn.ColumnIdx.Transaction_CostLabourRateHour, ColumnAlignment.Right, DataValue.DataType.Double); break; case SbmTransaction.Column.CostTotal: if (canViewSupplyFinancials) { SetTransactionColDfn(columnDfn, "Total cost", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.DataName = colNameCostTotal; } break; case SbmTransaction.Column.CostTotal_Fmt: if (canViewSupplyFinancials) SetTransactionColDfn(columnDfn, "Total cost", 90, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right); break; case SbmTransaction.Column.AmountMargin: if (canViewSupplyFinancials && canViewSalesFinancials) { SetTransactionColDfn(columnDfn, "Margin", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.ShowZeroValues = true; } break; case SbmTransaction.Column.AmountMargin_Fmt: if (canViewSupplyFinancials && canViewSalesFinancials) { SetTransactionColDfn(columnDfn, "Margin", 90, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right); columnDfn.ShowZeroValues = true; } break; case SbmTransaction.Column.PercentMargin: if (canViewSupplyFinancials && canViewSalesFinancials) { SetTransactionColDfn(columnDfn, "% Margin", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.ShowZeroValues = true; } break; case SbmTransaction.Column.PercentMargin_Fmt: if (canViewSupplyFinancials && canViewSalesFinancials) { SetTransactionColDfn(columnDfn, "% Margin", 90, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right); columnDfn.ShowZeroValues = true; } break; case SbmTransaction.Column.StockLocation_Name: SetTransactionColDfn(columnDfn, "Stock loc.", 110, SbmDbDfn.ColumnIdx.Unknown); break; case SbmTransaction.Column.Weight: SetTransactionColDfn(columnDfn, "Weight", 80, SbmDbDfn.ColumnIdx.Transaction_Weight, ColumnAlignment.Center, DataValue.DataType.Double); break; case SbmTransaction.Column.WeightUom_Name: SetTransactionColDfn(columnDfn, "Weight unit", 90, SbmDbDfn.ColumnIdx.Unknown); break; case SbmTransaction.Column.BoxCount: SetTransactionColDfn(columnDfn, "Boxes", 80, SbmDbDfn.ColumnIdx.Transaction_BoxCount, ColumnAlignment.Center, DataValue.DataType.String); break; case SbmTransaction.Column.AllocationInd: SetTransactionColDfn(columnDfn, "Alloc", 45, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.TriState); columnDfn.TriStateFormat = ColumnTriStateFormat.Lights; break; case SbmTransaction.Column.AllocationInd_YP: SetTransactionColDfn(columnDfn, "Alloc", 45, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.String); break; case SbmTransaction.Column.ReplacementOrder_Tick: SetTransactionColDfn(columnDfn, "Replacement", 80, SbmDbDfn.ColumnIdx.Transaction_Flags, ColumnAlignment.Center, DataValue.DataType.Bool); columnDfn.BoolFormat = ColumnBoolFormat.Tick; break; case SbmTransaction.Column.ReplacementOrder_Y: SetTransactionColDfn(columnDfn, "Replacement", 80, SbmDbDfn.ColumnIdx.Transaction_Flags, ColumnAlignment.Center, DataValue.DataType.String); break; case SbmTransaction.Column.Status_OnHold_Tick: SetTransactionColDfn(columnDfn, "Hold", 60, SbmDbDfn.ColumnIdx.Transaction_Status, ColumnAlignment.Center, DataValue.DataType.Bool); columnDfn.BoolFormat = ColumnBoolFormat.Tick; break; case SbmTransaction.Column.Status_OnHold_Cross: SetTransactionColDfn(columnDfn, "Hold", 60, SbmDbDfn.ColumnIdx.Transaction_Status, ColumnAlignment.Center, DataValue.DataType.Bool); columnDfn.BoolFormat = ColumnBoolFormat.Cross_Inv; break; case SbmTransaction.Column.Status_OnHold_Y: SetTransactionColDfn(columnDfn, "Hold", 60, SbmDbDfn.ColumnIdx.Transaction_Status, ColumnAlignment.Center, DataValue.DataType.String); break; //--------------------------------------------------------------- // Association details: case SbmTransaction.Column.Assoc_Code: SetTransactionColDfn(columnDfn, "Code", 80, SbmDbDfn.ColumnIdx.Association_Code, ColumnAlignment.Center, DataValue.DataType.String, aliasTransaction_Association, prefixTransaction_Association); break; case SbmTransaction.Column.Assoc_AccountManagerCode: case SbmTransaction.Column.Assoc_AccountManagerDesc: { String colLabel = GetAttributeCaption(SbmDbDfn.ColumnIdx.Association_AccountManagerCode, "Acc.Mgr."); SetTransactionColDfn(columnDfn, colLabel, 70, SbmDbDfn.ColumnIdx.Association_AccountManagerCode, ColumnAlignment.Center, DataValue.DataType.String, aliasTransaction_Association, prefixTransaction_Association); break; } case SbmTransaction.Column.Assoc_AccountHandlerCode: case SbmTransaction.Column.Assoc_AccountHandlerDesc: { String colLabel = GetAttributeCaption(SbmDbDfn.ColumnIdx.Association_AccountHandlerCode, "Acc.Hndlr"); SetTransactionColDfn(columnDfn, colLabel, 70, SbmDbDfn.ColumnIdx.Association_AccountHandlerCode, ColumnAlignment.Center, DataValue.DataType.String, aliasTransaction_Association, prefixTransaction_Association); break; } case SbmTransaction.Column.AssocOwner_Name: SetTransactionColDfn(columnDfn, "Owner", 100, SbmDbDfn.ColumnIdx.Affiliate_Name, ColumnAlignment.Default, DataValue.DataType.String, aliasTransaction_AffiliateOwner, prefixTransaction_AffiliateOwner); break; case SbmTransaction.Column.AssocTarget_Name: SetTransactionColDfn(columnDfn, "Target", 130, SbmDbDfn.ColumnIdx.Affiliate_Name, ColumnAlignment.Default, DataValue.DataType.String, aliasTransaction_AffiliateTarget, prefixTransaction_AffiliateTarget); break; case SbmTransaction.Column.AssocTarget_PhoneMain: SetTransactionColDfn(columnDfn, "Phone", 85, SbmDbDfn.ColumnIdx.Affiliate_PhoneMain, ColumnAlignment.Default, DataValue.DataType.String, aliasTransaction_AffiliateTarget, prefixTransaction_AffiliateTarget); break; case SbmTransaction.Column.AssocTarget_PhoneAlt: SetTransactionColDfn(columnDfn, "Phone alt", 85, SbmDbDfn.ColumnIdx.Affiliate_PhoneAlt, ColumnAlignment.Default, DataValue.DataType.String, aliasTransaction_AffiliateTarget, prefixTransaction_AffiliateTarget); break; case SbmTransaction.Column.AssocTarget_Address: SetTransactionColDfn(columnDfn, "Account address", 180, SbmDbDfn.ColumnIdx.Unknown); break; case SbmTransaction.Column.AssocTarget_Address_Name: SetTransactionColDfn(columnDfn, "Name (acc)", 120, SbmDbDfn.ColumnIdx.Address_Name, ColumnAlignment.Default, DataValue.DataType.String, aliasTransaction_AddressTarget, prefixTransaction_AddressTarget); break; case SbmTransaction.Column.AssocTarget_Address_Line1: SetTransactionColDfn(columnDfn, "Line 1 (acc)", 120, SbmDbDfn.ColumnIdx.Address_Line1, ColumnAlignment.Default, DataValue.DataType.String, aliasTransaction_AddressTarget, prefixTransaction_AddressTarget); break; case SbmTransaction.Column.AssocTarget_Address_Line2: SetTransactionColDfn(columnDfn, "Line 2 (acc)", 120, SbmDbDfn.ColumnIdx.Address_Line2, ColumnAlignment.Default, DataValue.DataType.String, aliasTransaction_AddressTarget, prefixTransaction_AddressTarget); break; case SbmTransaction.Column.AssocTarget_Address_Line3: SetTransactionColDfn(columnDfn, "Line 3 (acc)", 120, SbmDbDfn.ColumnIdx.Address_Line3, ColumnAlignment.Default, DataValue.DataType.String, aliasTransaction_AddressTarget, prefixTransaction_AddressTarget); break; case SbmTransaction.Column.AssocTarget_Address_City: SetTransactionColDfn(columnDfn, "City (acc)", 120, SbmDbDfn.ColumnIdx.Address_City, ColumnAlignment.Default, DataValue.DataType.String, aliasTransaction_AddressTarget, prefixTransaction_AddressTarget); break; case SbmTransaction.Column.AssocTarget_Address_Province: SetTransactionColDfn(columnDfn, "Province (acc)", 120, SbmDbDfn.ColumnIdx.Address_Province, ColumnAlignment.Default, DataValue.DataType.String, aliasTransaction_AddressTarget, prefixTransaction_AddressTarget); break; case SbmTransaction.Column.AssocTarget_Address_Postcode: SetTransactionColDfn(columnDfn, "Postcode (acc)", 90, SbmDbDfn.ColumnIdx.Address_Postcode, ColumnAlignment.Default, DataValue.DataType.String, aliasTransaction_AddressTarget, prefixTransaction_AddressTarget); break; //--------------------------------------------------------------- // Delivery Address case SbmTransaction.Column.DeliveryAddress: SetTransactionColDfn(columnDfn, "Delivery address", 180, SbmDbDfn.ColumnIdx.Unknown); break; case SbmTransaction.Column.DeliveryAddress_Name: SetTransactionColDfn(columnDfn, "Delivery name", 120, SbmDbDfn.ColumnIdx.Address_Name, ColumnAlignment.Default, DataValue.DataType.String, aliasTransaction_DeliveryAddress, prefixTransaction_DeliveryAddress); break; case SbmTransaction.Column.DeliveryAddress_Line1: SetTransactionColDfn(columnDfn, "Line 1 (del)", 120, SbmDbDfn.ColumnIdx.Address_Line1, ColumnAlignment.Default, DataValue.DataType.String, aliasTransaction_DeliveryAddress, prefixTransaction_DeliveryAddress); break; case SbmTransaction.Column.DeliveryAddress_Line2: SetTransactionColDfn(columnDfn, "Line 2 (del)", 120, SbmDbDfn.ColumnIdx.Address_Line2, ColumnAlignment.Default, DataValue.DataType.String, aliasTransaction_DeliveryAddress, prefixTransaction_DeliveryAddress); break; case SbmTransaction.Column.DeliveryAddress_Line3: SetTransactionColDfn(columnDfn, "Line 3 (del)", 120, SbmDbDfn.ColumnIdx.Address_Line3, ColumnAlignment.Default, DataValue.DataType.String, aliasTransaction_DeliveryAddress, prefixTransaction_DeliveryAddress); break; case SbmTransaction.Column.DeliveryAddress_City: SetTransactionColDfn(columnDfn, "City (del)", 120, SbmDbDfn.ColumnIdx.Address_City, ColumnAlignment.Default, DataValue.DataType.String, aliasTransaction_DeliveryAddress, prefixTransaction_DeliveryAddress); break; case SbmTransaction.Column.DeliveryAddress_Province: SetTransactionColDfn(columnDfn, "Province (del)", 120, SbmDbDfn.ColumnIdx.Address_Province, ColumnAlignment.Default, DataValue.DataType.String, aliasTransaction_DeliveryAddress, prefixTransaction_DeliveryAddress); break; case SbmTransaction.Column.DeliveryAddress_Postcode: SetTransactionColDfn(columnDfn, "Postcode (del)", 90, SbmDbDfn.ColumnIdx.Address_Postcode, ColumnAlignment.Default, DataValue.DataType.String, aliasTransaction_DeliveryAddress, prefixTransaction_DeliveryAddress); break; case SbmTransaction.Column.DeliveryAddress_Phone: SetTransactionColDfn(columnDfn, "Phone (del)", 120, SbmDbDfn.ColumnIdx.Address_Phone, ColumnAlignment.Default, DataValue.DataType.String, aliasTransaction_DeliveryAddress, prefixTransaction_DeliveryAddress); break; case SbmTransaction.Column.DeliveryAddress_Email: SetTransactionColDfn(columnDfn, "Email (del)", 170, SbmDbDfn.ColumnIdx.Address_Email, ColumnAlignment.Default, DataValue.DataType.String, aliasTransaction_DeliveryAddress, prefixTransaction_DeliveryAddress); break; //--------------------------------------------------------------- // Source transaction. case SbmTransaction.Column.SourceTrans_Ref: SetTransactionColDfn(columnDfn, "Source", 90, SbmDbDfn.ColumnIdx.Transaction_Ref, ColumnAlignment.Default, DataValue.DataType.String, aliasTransaction_SourceTransaction, prefixTransaction_SourceTransaction); break; //--------------------------------------------------------------- // Derived values: case SbmTransaction.Column.ReqntCount: SetTransactionColDfn(columnDfn, "Items", 45, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Long); columnDfn.DataName = colNameCountReqnts; break; case SbmTransaction.Column.TimeCount: SetTransactionColDfn(columnDfn, "Times", 45, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Long); columnDfn.DataName = colNameCountTimeRecs; break; case SbmTransaction.Column.TaskCount: SetTransactionColDfn(columnDfn, "Tasks", 50, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Long); columnDfn.DataName = colNameCountActions; break; case SbmTransaction.Column.HasInvoice: SetTransactionColDfn(columnDfn, "Invoiced", 45, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Bool); columnDfn.BoolFormat = ColumnBoolFormat.Tick; columnDfn.DataName = colNameHasInvoice; break; case SbmTransaction.Column.AccountsInvoiceRef: SetTransactionColDfn(columnDfn, "Accounts Inv", 90, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center); columnDfn.DataName = colNameAccountsInvoiceRef; break; // Common properties. case SbmTransaction.Column.Notes: SetTransactionColDfn(columnDfn, "Notes", 200, SbmDbDfn.ColumnIdx.Transaction_Notes); break; case SbmTransaction.Column.Flags: SetTransactionColDfn(columnDfn, "Flags", 40, SbmDbDfn.ColumnIdx.Transaction_Flags, ColumnAlignment.Center, DataValue.DataType.Long); break; case SbmTransaction.Column.Status: SetTransactionColDfn(columnDfn, "Status", 50, SbmDbDfn.ColumnIdx.Transaction_Status, ColumnAlignment.Center); break; case SbmTransaction.Column.Status_Desc: SetTransactionColDfn(columnDfn, "Status", 50, SbmDbDfn.ColumnIdx.Transaction_Status); break; case SbmTransaction.Column.Status_Ind: SetTransactionColDfn(columnDfn, "Status", 50, SbmDbDfn.ColumnIdx.Transaction_Status, ColumnAlignment.Center, DataValue.DataType.TriState); columnDfn.TriStateFormat = ColumnTriStateFormat.Lights; break; case SbmTransaction.Column.CreateOn_Date: SetTransactionColDfn(columnDfn, "Created", 65, SbmDbDfn.ColumnIdx.Transaction_CreateOn, ColumnAlignment.Center, DataValue.DataType.Date); columnDfn.DateFormat = "d-MMM-yy"; columnDfn.ReadOnly = true; break; case SbmTransaction.Column.UpdateOn_Date: SetTransactionColDfn(columnDfn, "Updated", 65, SbmDbDfn.ColumnIdx.Transaction_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; } //------------------------------------------------------------------- // Transaction query filter. public override List GetTransactionQueryFilter(SbmTransaction.Params prm) { List filter = new List(); String tableAlias = StringUtil.OnEmpty(prm.TableAlias, aliasTransaction); // DBMS - used to format elements of queries. DbmsType dbmsType = db != null ? db.DbmsType : DbmsType.General; DbQuery qry = new DbQuery(dbmsType); // Column names. String colTransaction_Id = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, tableAlias); String colTransaction_Type = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Type, tableAlias); String colTransaction_StatusCat = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_StatusCat, tableAlias); String colTransaction_Status = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Status, tableAlias); //--------------------------------------------------------------- // Transaction Id. if (prm.IdsIncluded.HasValidIds()) filter.Add(colTransaction_Id + " IN (" + prm.IdsIncluded.Concat(",") + ")"); if (prm.IdsExcluded.HasValidIds()) filter.Add(colTransaction_Id + " NOT IN (" + prm.IdsExcluded.Concat(",") + ")"); //--------------------------------------------------------------- // Transaction Source. if (SysId.IsValid(prm.TransIdSource)) { List filtersSource = new List(); // 1a. Transactions that reference the source transaction. // Trans#1.TransIdSource -> TransIdSource filtersSource.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_TransIdSource, tableAlias) + "=" + prm.TransIdSource.ToString()); // Check for combinations that allow secondary refs: bool checkForSecondaryRefs = false; if (SessionConsole != null && AllowTransactionType(Sbm.TransactionType.SalesDispatch) && (AllowTransactionType(Sbm.TransactionType.ProformaSalesInvoice) || AllowTransactionType(Sbm.TransactionType.SalesInvoice))) checkForSecondaryRefs = true; if (checkForSecondaryRefs) { // 1b. Transactions that reference a transaction that references the source transaction. // Trans.TransIdSource -> Trans#2.Id -> Trans#2.TransIdSource -> TransIdSource // Sub query to identify where the source transaction for this one has the target transaction as its source. String tableAlias_TransSecondRef = "aTraRefSec"; DbQuery qrySecondRef = new DbQuery(dbmsType); qrySecondRef.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction), tableAlias_TransSecondRef); qrySecondRef.Columns.Add("1"); //colTransaction_Id // Oct-2013 Referencing transactions must belong to the current 'Owner' & Nov-2013 But they surely must do if they reference another transaction that belongs to the 'owner'??? //qrySecondRef.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_AffIdOwner,sAliasTblTransSecondRef,false)+"="+pSesPro->SelectedOwner().ToString()); qrySecondRef.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, tableAlias_TransSecondRef, false) + "=" + colTransaction_Id); qrySecondRef.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_TransIdSource, tableAlias_TransSecondRef, false) + "=" + prm.TransIdSource.ToString()); filtersSource.Add("Exists(" + qrySecondRef.BuildQuery() + ")"); } // 2a. Transactions with a requirement that references one of the primary transaction's requirement: // Trans.Id -> Reqnt#1.TransId -> Reqnt#1.ReqntIdSource -> Reqnt#2.Id -> Reqnt#2.TransId -> TransIdSource // Feb2017 Cadix performance (10 secs down to <1) // Trans.Id In // ( // Select reqntRef.TransId // From Requirement reqntSrc // Inner Join Requirement reqntRef On reqntRef.ReqntIdSource=reqntSrc.Id // Where reqntSrc.TransId=Trans.Id // ) // Feb2017 Was: // TransId In // Select TransId From Reqnt Where ReqntIdSource In // Select Id From Reqnt Where TransId = TransIdSource { DbQuery qryTransRef = new DbQuery(dbmsType); // Feb2017 Cadix performance. Use '[Transaction].Id In()' rather than 'Exists ()' with filtering by transaction id within sub query. // Start with requirements belonging to the source transaction: String tableAlias_ReqntSrc = "aTrnReqSrc"; String tableAlias_ReqntRef = "aTrnReqRef"; qryTransRef.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement), tableAlias_ReqntSrc); qryTransRef.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_TransId, tableAlias_ReqntRef, false)); qryTransRef.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_TransId, tableAlias_ReqntSrc, false) + "=" + prm.TransIdSource.ToString()); // Join to referencing requirements: DbQueryJoin joinReqnt = new DbQueryJoin(DbJoinType.Inner); String colRequirement_Id = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_Id, tableAlias_ReqntSrc, false); String colRequirement_ReqntIdSource = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_ReqntIdSource, tableAlias_ReqntRef, false); joinReqnt.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement), tableAlias_ReqntRef); joinReqnt.Filters.Add(colRequirement_ReqntIdSource + "=" + colRequirement_Id); //joinReqnt.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_TransId,sAliaSbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement)ntRef,false)+"="+colTransaction_Id); qryTransRef.Joins.Add(joinReqnt); // Construct sub query: filtersSource.Add(colTransaction_Id + " In (" + qryTransRef.BuildQuery() + ")"); } // 3a. Transactions with a requirement that is associated with one of the source transaction's requirements: // Trans.Id -> Reqnt.TransId -> Reqnt.ReqntIdSource -> ReqntSrc.Id -> ReqntSrc.TransId -> TransIdSource // Select tr.TransId // From Reqnt ReqSrc Where ReqSrc.TransId = TransIdSource // Inner Join ItemLink Where ItemTypeFrom+To=Requirement And ItemId From|To = ReqSrc.Id // TransId In // Select TransId From Reqnt Where ReqntIdSource In if (db.TableExists(SbmDbDfn.TableIdx.ItemLink.ToString()) && UserContext.GetOwnerOption_AllowOption(Sbm.OrgOption_AllowOption.PurchaseItem_AssociatedSalesItems)) { String tableAlias_RequirementSource = "taReqSrc"; DbQuery qryAssocReqnt = new DbQuery(dbmsType); // Start with requirements belonging to the source transaction: qryAssocReqnt.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement), tableAlias_RequirementSource); qryAssocReqnt.Columns.Add("1"); qryAssocReqnt.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_TransId, tableAlias_RequirementSource, false) + "=" + prm.TransIdSource.ToString()); // Join to Item Link - Both items (From & To) are requirements and either can match the source requirement: String tableAlias_ItemLink = "taItmLnk"; String colItemLink_ItemIdFrom = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemIdFrom, tableAlias_ItemLink, false); String colItemLink_ItemIdTo = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemIdTo, tableAlias_ItemLink, false); String colItemLink_Type = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_Type, tableAlias_ItemLink, false); String colItemLink_ItemTypeFrom = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemTypeFrom, tableAlias_ItemLink, false); String colItemLink_ItemTypeTo = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemTypeTo, tableAlias_ItemLink, false); String colRequirementSrc_Id = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_Id, tableAlias_RequirementSource, false); DbQueryJoin joinItmLnk = new DbQueryJoin(DbJoinType.Inner); joinItmLnk.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ItemLink), tableAlias_ItemLink); joinItmLnk.Filters.Add(colItemLink_Type + "=" + Sbm.ItemLinkType.Requirement_AssociatedItem); joinItmLnk.Filters.Add(colItemLink_ItemTypeFrom + "=" + Sbm.ItemType.Requirement); joinItmLnk.Filters.Add(colItemLink_ItemTypeTo + "=" + Sbm.ItemType.Requirement); // Jan2017 Combine Item Type and Id (for To/From combinations) in sub-clauses as these are indexed and significantly improve performance. // Ref. BPE refreshing reference transactions on transaction view tab taking 16 seconds (down to <1). // Was: joinItmLnk.Filters.Add(colItemLink_ItemIdFrom+"="+colRequirement_Id+" OR "+colItemLink_ItemIdTo+"="+colRequirement_Id); List filtersItemLink = new List(); filtersItemLink.Add(colItemLink_ItemTypeFrom + "=" + Sbm.ItemType.Requirement + " AND " + colItemLink_ItemIdFrom + "=" + colRequirementSrc_Id); filtersItemLink.Add(colItemLink_ItemTypeTo + "=" + Sbm.ItemType.Requirement + " AND " + colItemLink_ItemIdTo + "=" + colRequirementSrc_Id); joinItmLnk.Filters.Add(filtersItemLink.Concat(" OR ", "(", ")")); qryAssocReqnt.Joins.Add(joinItmLnk); // Join to the linked requirement: String tableAlias_RequirementReference = "taReqRef"; String colRequirementRef_Id = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_Id, tableAlias_RequirementReference, false); DbQueryJoin joinReqntSrc = new DbQueryJoin(DbJoinType.Inner); joinReqntSrc.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement), tableAlias_RequirementReference); joinReqntSrc.Filters.Add(colRequirementRef_Id + "=" + colItemLink_ItemIdFrom + " OR " + colRequirementRef_Id + "=" + colItemLink_ItemIdTo); joinReqntSrc.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_TransId, tableAlias_RequirementReference, false) + "=" + colTransaction_Id); qryAssocReqnt.Joins.Add(joinReqntSrc); // Construct sub query: filtersSource.Add("Exists(" + qryAssocReqnt.BuildQuery() + ")"); } // Construct complete filter. filter.Add(filtersSource.Concat(" OR ", "(", ")")); // Explicitly exclude the source transaction as this can be included via the item links (back onto itself). filter.Add(colTransaction_Id + "<>" + prm.TransIdSource.ToString()); } //--------------------------------------------------------------- // Transaction Type. if (prm.TransactionType > 0) filter.Add(colTransaction_Type + "=" + ((int)prm.TransactionType).ToString()); // Location Id Stock. if (SysId.IsValid(prm.LocationIdStock)) filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_LocationIdStock, tableAlias) + "=" + SysId.ToString(prm.LocationIdStock)); // Transaction Status. if (prm.StatusCat == SbmTransaction.StatusCat.NotDeleted) filter.Add(colTransaction_Status + "<>'" + StatusDeleted + "'"); else if (prm.StatusCat == SbmTransaction.StatusCat.Completed) filter.Add(colTransaction_Status + "='" + StatusCompleted + "'"); else if (prm.StatusCat == SbmTransaction.StatusCat.NotClosed) filter.Add(colTransaction_StatusCat + "<>'" + TransactionStatusCats.GetCodeForType(SbmTransaction.StatusCat.Closed) + "'"); else if (prm.StatusCat == SbmTransaction.StatusCat.NotCancelled) filter.Add(colTransaction_Status + "<>'" + StatusCancelled + "'"); else if (!StringUtil.IsEmpty(TransactionStatusCats.GetCodeForType(prm.StatusCat))) filter.Add(colTransaction_StatusCat + "='" + TransactionStatusCats.GetCodeForType(prm.StatusCat) + "'"); // Restrict transactions to the current owner if required. if (SysId.IsValid(AffiliateId_Owner)) { // Only need to filter on owner if no association specified, no transaction Ids and no source transaction id. if (!SysId.IsValid(prm.AssocId) && !prm.IdsIncluded.HasValidIds() && !SysId.IsValid(prm.TransIdSource)) filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_AffIdOwner, tableAlias) + "=" + SysId.ToString(AffiliateId_Owner)); } //--------------------------------------------------------------- // Transaction Reference. String colTransaction_Ref = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Ref, tableAlias); String colTransaction_RefInt = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_RefInt, tableAlias); if (!StringUtil.IsEmpty(prm.TransRefFull)) { String filterTransRef = colTransaction_Ref + "='" + DbQuery.FormatForCondition(prm.TransRefFull) + "'"; if (prm.TransRefFull.IsNumeric() && prm.TransRefFull.ToLong() >= 1) filterTransRef += " OR " + colTransaction_RefInt + "=" + prm.TransRefFull; filter.Add(filterTransRef); } else if (!StringUtil.IsEmpty(prm.TransRefPartial)) { //String sFilter (DbQuery.FormatFn_Left(sColRef,prm.sTransRefPartial.Len())+"='"+sTransRefPartial+"'"); String filterTranRefPartial = colTransaction_Ref + " Like '%" + DbQuery.FormatForLike(prm.TransRefPartial) + "%'"; if (prm.TransRefPartial.IsNumeric() && prm.TransRefPartial.ToLong() >= 1) filterTranRefPartial += " OR " + colTransaction_RefInt + "=" + prm.TransRefPartial; filter.Add(filterTranRefPartial); } // Transaction External reference. String colTransaction_RefExt = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_RefExt, tableAlias); if (!StringUtil.IsEmpty(prm.TransRefExtFull)) filter.Add(colTransaction_RefExt + "='" + DbQuery.FormatForCondition(prm.TransRefExtFull) + "'"); else if (!StringUtil.IsEmpty(prm.TransRefExtPartial)) { //filter.Add(DbQuery.FormatFn_Left(sColRefExt,prm.TransRefExtPartial.Len())+"='"+TransRefExtPartial+"'"); filter.Add(colTransaction_RefExt + " Like '%" + DbQuery.FormatForLike(prm.TransRefExtPartial) + "%'"); } // Transaction DescBrief. String sTransDescBrief = DbQuery.FormatForLike(prm.TransDescBriefPartial); String colTransaction_DescBrief = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_DescBrief, tableAlias); if (!StringUtil.IsEmpty(prm.TransDescBriefPartial)) //filter.Add(DbQuery.FormatFn_Left(sColDescBrief,prm.sTransDescBriefPartial.Len())+"='"+sTransDescBrief+"'"); filter.Add(colTransaction_DescBrief + " LIKE '%" + DbQuery.FormatForLike(prm.TransDescBriefPartial) + "%'"); //--------------------------------------------------------------- // Raised date. if (DateUtil.IsValid(prm.RaisedFrom)) filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Raised, tableAlias) + ">=" + DbQuery.FormatDateForCondition(prm.RaisedFrom)); if (DateUtil.IsValid(prm.RaisedTo)) filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Raised, tableAlias) + "<" + DbQuery.FormatDateForCondition(prm.RaisedTo.AddDays(1))); // Required date. if (DateUtil.IsValid(prm.RequiredFrom)) filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Required, tableAlias) + ">=" + DbQuery.FormatDateForCondition(prm.RequiredFrom)); if (DateUtil.IsValid(prm.RequiredTo)) filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Required, tableAlias) + "<" + DbQuery.FormatDateForCondition(prm.RequiredTo.AddDays(1))); // Closed date. if (DateUtil.IsValid(prm.ClosedFrom)) filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Closed, tableAlias) + ">=" + DbQuery.FormatDateForCondition(prm.ClosedFrom)); if (DateUtil.IsValid(prm.ClosedTo)) filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Closed, tableAlias) + "<" + DbQuery.FormatDateForCondition(prm.ClosedTo.AddDays(1))); //--------------------------------------------------------------- // Active dates. if (DateUtil.IsValid(prm.ActiveOn) || DateUtil.IsValid(prm.ActiveFrom) || DateUtil.IsValid(prm.ActiveTo)) { DateTime latestInProgress = DateTime.MinValue; DateTime earliestClosed = DateTime.MinValue; if (DateUtil.IsValid(prm.ActiveOn)) { latestInProgress = prm.ActiveOn; earliestClosed = prm.ActiveOn; } else if (DateUtil.IsValid(prm.ActiveFrom) && DateUtil.IsValid(prm.ActiveTo)) { if (prm.ActiveFrom <= prm.ActiveTo) { // Active period has been specified - Determine whether to filter for active at any time during period or throughout. if (prm.ActiveAnyDayDuringPeriod) { // Active any day during period: In progress before end of period and not closed before start. latestInProgress = prm.ActiveTo; earliestClosed = prm.ActiveFrom; } else { // Active throughout period: In progress by start of period and not closed by end of period. latestInProgress = prm.ActiveFrom; earliestClosed = prm.ActiveTo; } } else { #if _DEBUG TRACE("### SapTransactionMgr_Odbc::GetQueryFilter Invalid combination of active dates: " + prm.ActiveFrom.ToString() + "-" + prm.ActiveTo.ToString() + ".\n"); #endif } } else if (prm.ActiveFrom.IsValid()) { // Active any day from the specified date: earliestClosed = prm.ActiveFrom; } else if (prm.ActiveTo.IsValid()) { // Active any day up to the specified date: latestInProgress = prm.ActiveTo; } if (latestInProgress.IsValid() && earliestClosed.IsValid()) { String colTransaction_InProgress = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_InProgress, tableAlias); String colTransaction_Closed = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Closed, tableAlias); List filtersActive = new List(); if (latestInProgress.IsValid()) filtersActive.Add(colTransaction_InProgress + "<" + DbQuery.FormatDateForCondition(latestInProgress.AddDays(1))); if (earliestClosed.IsValid()) filtersActive.Add(colTransaction_Closed + " Is Null Or " + colTransaction_Closed + "=" + DbQuery.FormatDateForCondition(new DateTime(1970, 1, 1)) + " Or " + colTransaction_Closed + ">=" + DbQuery.FormatDateForCondition(earliestClosed)); filter.AddRange(filtersActive); #if _DEBUG if (!StringUtil.IsEmpty(filtersActive)) TRACE("SapTransactionMgr_Odbc::GetQueryFilter ActiveOn filter: " + filtersActive.Concat(" And ", "(", ")") + "\n"); #endif } } //--------------------------------------------------------------- // Association Id. String colTransaction_AssocId = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_AssocId, tableAlias); if (SysId.IsValid(prm.AssocId)) filter.Add(colTransaction_AssocId + "=" + prm.AssocId.ToString()); // Association Target. String assocFilter = DbQuery.FormatForCondition(prm.AssocPartial); String defaultNominalCodeFull = DbQuery.FormatForCondition(prm.DefaultNominalCodeFull); String defaultNominalCodePartial = DbQuery.FormatForLike(prm.DefaultNominalCodePartial); String accountManagerCode = DbQuery.FormatForCondition(prm.AccountManagerCode); String accountHandlerCode = DbQuery.FormatForCondition(prm.AccountHandlerCode); if (!StringUtil.IsEmpty(assocFilter) || !StringUtil.IsEmpty(defaultNominalCodeFull) || !StringUtil.IsEmpty(defaultNominalCodePartial) || !StringUtil.IsEmpty(accountManagerCode) || !StringUtil.IsEmpty(accountHandlerCode)) { String tableAlias_Association = "TraAssFlt"; String tableAlias_AssociationTarget = "TraAssTgtFlt"; String colAssociation_Id = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Id, tableAlias_Association, false); DbQuery qryAssoc = new DbQuery(dbmsType); qryAssoc.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Association), tableAlias_Association); qryAssoc.Columns.Add(colAssociation_Id); // Oct-2013 All associations that are targets of transactions must belong to the current 'Owner'. qryAssoc.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_AffIdOwner, tableAlias_Association, false) + "=" + SysId.ToString(AffiliateId_Owner)); qryAssoc.Filters.Add(colAssociation_Id + "=" + colTransaction_AssocId); // Are the target contact details required: bool bRequireAffiliate = (!assocFilter.IsEmpty()); if (bRequireAffiliate) { qryAssoc.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Affiliate), tableAlias_AssociationTarget); qryAssoc.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Id, tableAlias_AssociationTarget, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_AffIdTarget, tableAlias_Association, false)); } // Affiliate Target name. if (!StringUtil.IsEmpty(assocFilter)) { // The association filter will match to either the association code or affiliate name: String colAssociation_Code = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Code, tableAlias_Association, false); String colAffiliate_Name = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Name, tableAlias_AssociationTarget, false); List filtersOR = new List(); filtersOR.Add(DbQuery.FormatFn_Left(colAssociation_Code, prm.AssocPartial.Length) + "='" + assocFilter + "'"); filtersOR.Add(DbQuery.FormatFn_Left(colAffiliate_Name, prm.AssocPartial.Length) + "='" + assocFilter + "'"); qryAssoc.Filters.Add(filtersOR.Concat(" OR ", "(", ")")); } // Default Nominal Code. String colAssociation_DefaultNominalCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_DefaultNominalCode, tableAlias_Association, false); if (!StringUtil.IsEmpty(defaultNominalCodeFull)) qryAssoc.Filters.Add(colAssociation_DefaultNominalCode + "='" + defaultNominalCodeFull + "'"); else if (!StringUtil.IsEmpty(defaultNominalCodePartial)) { String sColAssocDefNomCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_DefaultNominalCode, tableAlias_Association, false); qryAssoc.Filters.Add(colAssociation_DefaultNominalCode + " LIKE '" + defaultNominalCodePartial + "%'"); } // Account Manager. String colAssociation_AccountManagerCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_AccountManagerCode, tableAlias_Association, false); if (!StringUtil.IsEmpty(accountManagerCode)) qryAssoc.Filters.Add(colAssociation_AccountManagerCode + "='" + accountManagerCode + "'"); // Account Handler. String colAssociation_AccountHandlerCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_AccountHandlerCode, tableAlias_Association, false); if (!StringUtil.IsEmpty(accountHandlerCode)) qryAssoc.Filters.Add(colAssociation_AccountHandlerCode + "='" + accountHandlerCode + "'"); // Add this Association sub-query to the filter: filter.Add("EXISTS(" + qryAssoc.BuildQuery() + ")"); } //--------------------------------------------------------------- // Address & Postcode. if (!StringUtil.IsEmpty(prm.PostcodePartial) || !StringUtil.IsEmpty(prm.AddressPartial)) { String tableAlias_Address = "aTraAdd"; String colAddress_Id = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Id, tableAlias_Address, false); String colAddress_AffIdOwner = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_AffIdOwner, tableAlias_Address, false); // Build the sub query. DbQuery qryAdd = new DbQuery(dbmsType); qryAdd.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Address), tableAlias_Address); qryAdd.Columns.Add(colAddress_Id); qryAdd.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_ItemType, tableAlias_Address, false) + "=" + Sbm.ItemType.Transaction); qryAdd.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_ItemId, tableAlias_Address, false) + "=" + colTransaction_Id); if (!StringUtil.IsEmpty(prm.PostcodePartial)) { String colAddress_PostcodeFmt = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_PostcodeFmt, tableAlias_Address, false); qryAdd.Filters.Add(DbQuery.FormatFn_Left(colAddress_PostcodeFmt, prm.PostcodePartial.Length) + "='" + DbQuery.FormatForCondition(prm.PostcodePartial.Trim(' ')) + "'"); } if (!StringUtil.IsEmpty(prm.AddressPartial)) { List addressCols = new List() { SbmDbDfn.ColumnIdx.Address_Name, SbmDbDfn.ColumnIdx.Address_Line1, SbmDbDfn.ColumnIdx.Address_Line2, SbmDbDfn.ColumnIdx.Address_Line3, SbmDbDfn.ColumnIdx.Address_City, //SbmDbDfn.ColumnIdx.Address_Province, SbmDbDfn.ColumnIdx.Address_Contact, }; List filterAddress = new List(); foreach (SbmDbDfn.ColumnIdx addressCol in addressCols) filterAddress.Add(SbmDbDfn.GetColumnNameQual(addressCol, tableAlias_Address, false) + " LIKE '%" + DbQuery.FormatForLike(prm.AddressPartial) + "%'"); qryAdd.Filters.Add(filterAddress.Concat(" OR ", "(", ")")); } //qryAdd.Filters.Add(AccountMgr.GetPrimaryAddressFilter(true, tableAlias_Address)); String qryAddress = qryAdd.BuildQuery(); filter.Add("EXISTS (" + qryAddress + ")"); } //--------------------------------------------------------------- // 'Archive' filter - restrict transaction dates if no other 'significant' filter in place. if (prm.RequiresVolumeThrottle()) { DateTime today = DateTime.Today; DateTime earliestTransaction = new DateTime(today.Year - 1, 1, 1); if (DebugMode) earliestTransaction = new DateTime(today.Year - 3, 1, 1); if (prm.TransactionType == Sbm.TransactionType.Project) earliestTransaction = new DateTime(today.Year - 3, 1, 1); filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Raised, tableAlias) + ">=" + DbQuery.FormatDateForCondition(earliestTransaction)); if (DebugMode) SaLogger.Trace($"{SysUtil.Fn} Including 'Archive' filter: {filter.Concat(" AND ", "(", ")")}"); } //else if (DebugMode) SaLogger.Trace($"{SysUtil.Fn} Excluding 'Archive' filter: {filter.Concat(" AND ", "(", ")")}"); //--------------------------------------------------------------- if (filter.Count < 1 && prm.IncludeDefaultFilter) filter.Add("1=1"); return filter; } //------------------------------------------------------------------- // Sort columns. public List GetTransactionSortColumns(SbmTransaction.Params prm) { String tableAlias = StringUtil.OnEmpty(prm.TableAlias, aliasTransaction); // Sort sequence. List sortColumnCodes = new List(); foreach (var columnDfn in prm.SortColumns) { // Need to ensure correct alias used for Transaction columns in case of conflict. String sortCol = String.Empty; if (SbmDbDfn.GetTableForColumn((SbmDbDfn.ColumnIdx)columnDfn.DbColumn) == SbmDbDfn.TableIdx.Transaction) { sortCol = SbmDbDfn.GetColumnNameQual((SbmDbDfn.ColumnIdx)columnDfn.DbColumn, tableAlias); } 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.Transaction_Type, tableAlias) + " ASC"); } return sortColumnCodes; } //------------------------------------------------------------------- // Item count. private long GetTransactionCount(String filter) { ClearErrorState(); return db.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction) + " As " + aliasTransaction, filter); } public override long GetTransactionCount(SbmTransaction.Params prm) { ClearErrorState(); return GetTransactionCount(GetTransactionQueryFilter(prm).Concat(" AND ", "(", ")")); } //------------------------------------------------------------------- // Item list. public override List GetTransactionList(SbmTransaction.Params prm) { ClearErrorState(); List transactions = new List(); DbQuery qry = new DbQuery(db.DbmsType); qry.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction), aliasTransaction); Transaction_Db dbTransaction = new Transaction_Db(DbInfo); qry.Columns.AddRange(dbTransaction.ExistingColumnNames); qry.Filters.AddRange(GetTransactionQueryFilter(prm)); qry.OrderBy.AddRange(GetTransactionSortColumns(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()) { dbTransaction = new Transaction_Db(DbInfo); dbTransaction.PopulateFrom(dbDataReader); transactions.Add(CreateTransaction(dbTransaction)); } } } catch (Exception exc) { SetErrorState("Database query exception"); SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}"); } } return transactions; } //------------------------------------------------------------------- // Execute query. public override DbResultSet ExecuteTransactionQuery(List columns, SbmTransaction.Params prm) { ClearErrorState(); bool canViewSupplyFinancials = UserContext.SecurityProfile_Core.UserCanViewFinancials(Sbm.FinancialType.CommoditySupply); bool canViewSalesFinancials = UserContext.SecurityProfile_Core.UserCanViewFinancials(Sbm.FinancialType.CommoditySales); //--------------------------------------------------------------------- // Construct build database query. DbQuery query = new DbQuery(db.DbmsType); query.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction), aliasTransaction); //--------------------------------------------------------------------- // Transaction Properties - add columns as defined in query list. query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, aliasTransaction)); query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Type, aliasTransaction)); query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Ref, aliasTransaction)); if (columns.HasId((int)SbmTransaction.Column.RefExt)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_RefExt, aliasTransaction)); if (ColumnExists(SbmDbDfn.ColumnIdx.Transaction_ContactName) && columns.HasId((int)SbmTransaction.Column.ContactName)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_ContactName, aliasTransaction)); if (columns.HasId((int)SbmTransaction.Column.Likelihood)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Likelihood, aliasTransaction)); if (columns.HasId((int)SbmTransaction.Column.RaisedOn)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Raised, aliasTransaction)); if (columns.HasId((int)SbmTransaction.Column.RequiredOn)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Required, aliasTransaction)); if (columns.HasId((int)SbmTransaction.Column.InProgressOn)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_InProgress, aliasTransaction)); if (columns.HasId((int)SbmTransaction.Column.ClosedOn)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Closed, aliasTransaction)); if (columns.HasId((int)SbmTransaction.Column.DescBrief)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_DescBrief, aliasTransaction)); if (columns.HasId((int)SbmTransaction.Column.ContactAreaCode) || columns.HasId((int)SbmTransaction.Column.ContactArea)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_ContactAreaCode, aliasTransaction)); if (columns.HasId((int)SbmTransaction.Column.DeliveryStatusCode) || columns.HasId((int)SbmTransaction.Column.DeliveryStatus)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_DeliveryStatusCode, aliasTransaction)); if (columns.HasId((int)SbmTransaction.Column.DeliveryTypeCode) || columns.HasId((int)SbmTransaction.Column.DeliveryType)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_DeliveryTypeCode, aliasTransaction)); if (columns.HasId((int)SbmTransaction.Column.DeliveryMethodCode) || columns.HasId((int)SbmTransaction.Column.DeliveryMethod)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_DeliveryMethodCode, aliasTransaction)); if (columns.HasId((int)SbmTransaction.Column.DeliveryCourierCode) || columns.HasId((int)SbmTransaction.Column.DeliveryCourier)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_DeliveryCourierCode, aliasTransaction)); if (columns.HasId((int)SbmTransaction.Column.DeliveryBookInCode) || columns.HasId((int)SbmTransaction.Column.DeliveryBookIn)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_DeliveryBookInCode, aliasTransaction)); if (columns.HasId((int)SbmTransaction.Column.StockPickerCode) || columns.HasId((int)SbmTransaction.Column.StockPicker)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_StockPickerCode, aliasTransaction)); if (canViewSalesFinancials && (columns.HasId((int)SbmTransaction.Column.DeliveryAmountNet) || columns.HasId((int)SbmTransaction.Column.DeliveryAmountNet_Fmt))) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_DeliveryAmountNet, aliasTransaction)); if (columns.HasId((int)SbmTransaction.Column.DeliveryTaxCodeId)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_TaxCodeIdDelivery)); if (canViewSalesFinancials && (columns.HasId((int)SbmTransaction.Column.DeliveryAmountTax) || columns.HasId((int)SbmTransaction.Column.DeliveryAmountTax_Fmt))) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_DeliveryAmountTax, aliasTransaction)); if (canViewSalesFinancials && (columns.HasId((int)SbmTransaction.Column.DeliveryAmountTot) || columns.HasId((int)SbmTransaction.Column.DeliveryAmountTot_Fmt))) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_DeliveryAmountTot, aliasTransaction)); if (columns.HasId((int)SbmTransaction.Column.DeliveryNominalCode)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_DeliveryNominalCode, aliasTransaction)); if (columns.HasId((int)SbmTransaction.Column.DeliveryDepartment)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_DeliveryDepartment, aliasTransaction)); query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_CurrencyId, aliasTransaction)); if (canViewSalesFinancials) { if (columns.HasId((int)SbmTransaction.Column.AmountEst) || columns.HasId((int)SbmTransaction.Column.AmountEst_Fmt)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_AmountEst, aliasTransaction)); if (columns.HasId((int)SbmTransaction.Column.AmountMax) || columns.HasId((int)SbmTransaction.Column.AmountMax_Fmt)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_AmountMax, aliasTransaction)); if (columns.HasId((int)SbmTransaction.Column.AmountNet) || columns.HasId((int)SbmTransaction.Column.AmountNet_Fmt)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_AmountNet, aliasTransaction)); if (columns.HasId((int)SbmTransaction.Column.AmountTax) || columns.HasId((int)SbmTransaction.Column.AmountTax_Fmt)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_AmountTax, aliasTransaction)); if (columns.HasId((int)SbmTransaction.Column.AmountTot) || columns.HasId((int)SbmTransaction.Column.AmountTot_Fmt)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_AmountTot, aliasTransaction)); } if (canViewSupplyFinancials) { if (ColumnExists(SbmDbDfn.ColumnIdx.Transaction_CostLabourRateHour) && columns.HasId((int)SbmTransaction.Column.CostLabourRateHour)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_CostLabourRateHour, aliasTransaction)); } if (ColumnExists(SbmDbDfn.ColumnIdx.Transaction_TimeEst) && columns.HasId((int)SbmTransaction.Column.TimeEst)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_TimeEst, aliasTransaction)); if (ColumnExists(SbmDbDfn.ColumnIdx.Transaction_TimeAct) && columns.HasId((int)SbmTransaction.Column.TimeAct)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_TimeAct, aliasTransaction)); if (columns.HasId((int)SbmTransaction.Column.TimeTot)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_TimeTot, aliasTransaction)); if (columns.HasId((int)SbmTransaction.Column.Weight)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Weight, aliasTransaction)); if (columns.HasId((int)SbmTransaction.Column.BoxCount)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_BoxCount, aliasTransaction)); if (columns.HasId((int)SbmTransaction.Column.Notes)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Notes, aliasTransaction)); if (columns.HasId((int)SbmTransaction.Column.AllocationInd) || columns.HasId((int)SbmTransaction.Column.AllocationInd_YP) || columns.HasId((int)SbmTransaction.Column.Flags) || columns.HasId((int)SbmTransaction.Column.ReplacementOrder_Tick) || columns.HasId((int)SbmTransaction.Column.ReplacementOrder_Y)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Flags, aliasTransaction)); if (columns.HasId((int)SbmTransaction.Column.Status) || columns.HasId((int)SbmTransaction.Column.Status_Desc) || columns.HasId((int)SbmTransaction.Column.Status_Ind) || columns.HasId((int)SbmTransaction.Column.Status_OnHold_Tick) || columns.HasId((int)SbmTransaction.Column.Status_OnHold_Cross) || columns.HasId((int)SbmTransaction.Column.Status_OnHold_Y)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Status, aliasTransaction)); //--------------------------------------------------------------------- // Association - Owner Aff - Target Affiliate - Target Address bool hasAssocCols = false; if (!hasAssocCols) hasAssocCols = columns.HasId((int)SbmTransaction.Column.Assoc_Code); if (!hasAssocCols) hasAssocCols = columns.HasId((int)SbmTransaction.Column.Assoc_AccountManagerCode) || columns.HasId((int)SbmTransaction.Column.Assoc_AccountManagerDesc); if (!hasAssocCols) hasAssocCols = columns.HasId((int)SbmTransaction.Column.Assoc_AccountHandlerCode) || columns.HasId((int)SbmTransaction.Column.Assoc_AccountHandlerDesc); bool hasOwnerAffCols = false; if (!hasOwnerAffCols) hasOwnerAffCols = columns.HasId((int)SbmTransaction.Column.AssocOwner_Name); bool hasTgtAffCols = false; if (!hasTgtAffCols) hasTgtAffCols = columns.HasId((int)SbmTransaction.Column.AssocTarget_Name); if (!hasTgtAffCols) hasTgtAffCols = columns.HasId((int)SbmTransaction.Column.AssocTarget_PhoneMain); if (!hasTgtAffCols) hasTgtAffCols = columns.HasId((int)SbmTransaction.Column.AssocTarget_PhoneAlt); bool hasTgtAddrCols = false; if (!hasTgtAddrCols) hasTgtAddrCols = columns.HasId((int)SbmTransaction.Column.AssocTarget_Address); if (!hasTgtAddrCols) hasTgtAddrCols = columns.HasId((int)SbmTransaction.Column.AssocTarget_Address_Name); if (!hasTgtAddrCols) hasTgtAddrCols = columns.HasId((int)SbmTransaction.Column.AssocTarget_Address_Line1); if (!hasTgtAddrCols) hasTgtAddrCols = columns.HasId((int)SbmTransaction.Column.AssocTarget_Address_Line2); if (!hasTgtAddrCols) hasTgtAddrCols = columns.HasId((int)SbmTransaction.Column.AssocTarget_Address_Line3); if (!hasTgtAddrCols) hasTgtAddrCols = columns.HasId((int)SbmTransaction.Column.AssocTarget_Address_City); if (!hasTgtAddrCols) hasTgtAddrCols = columns.HasId((int)SbmTransaction.Column.AssocTarget_Address_Province); if (!hasTgtAddrCols) hasTgtAddrCols = columns.HasId((int)SbmTransaction.Column.AssocTarget_Address_Postcode); if (hasAssocCols || hasOwnerAffCols || hasTgtAffCols || hasTgtAddrCols) { //--------------------------------------------------------------------- //Association. // Join to the Association. DbQueryJoin joinAssoc = new DbQueryJoin(DbJoinType.LeftOuter); joinAssoc.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Association), aliasTransaction_Association); joinAssoc.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Id, aliasTransaction_Association, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_AssocId, aliasTransaction)); query.Joins.Add(joinAssoc); // Add the association columns. List associationCols = new List(); associationCols.Add(SbmDbDfn.ColumnIdx.Association_Code); if (columns.HasId((int)SbmTransaction.Column.Assoc_AccountManagerCode) || columns.HasId((int)SbmTransaction.Column.Assoc_AccountManagerDesc)) associationCols.Add(SbmDbDfn.ColumnIdx.Association_AccountManagerCode); if (columns.HasId((int)SbmTransaction.Column.Assoc_AccountHandlerCode) || columns.HasId((int)SbmTransaction.Column.Assoc_AccountHandlerDesc)) associationCols.Add(SbmDbDfn.ColumnIdx.Association_AccountHandlerCode); foreach (SbmDbDfn.ColumnIdx dbColumn in associationCols) query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasTransaction_Association), prefixTransaction_Association + SbmDbDfn.GetColumnName(dbColumn, false)); //--------------------------------------------------------------------- // Owner Affiliate. if (hasOwnerAffCols) { // Join to the Owner affiliate. DbQueryJoin joinAffOwner = new DbQueryJoin(DbJoinType.LeftOuter); joinAffOwner.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Affiliate), aliasTransaction_AffiliateOwner); joinAffOwner.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Id, aliasTransaction_AffiliateOwner, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_AffIdOwner, aliasTransaction_Association, false)); 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, aliasTransaction_AffiliateOwner), prefixTransaction_AffiliateOwner + SbmDbDfn.GetColumnName(dbColumn, false)); } //--------------------------------------------------------------------- // Target Affiliate. if (hasTgtAffCols || hasTgtAddrCols) { // Join to the target affiliate. DbQueryJoin joinAffTarget = new DbQueryJoin(DbJoinType.LeftOuter); joinAffTarget.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Affiliate), aliasTransaction_AffiliateTarget); joinAffTarget.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Id, aliasTransaction_AffiliateTarget, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_AffIdTarget, aliasTransaction_Association, false)); query.Joins.Add(joinAffTarget); // Add the affiliate columns. List affiliateTargetCols = new List(); affiliateTargetCols.Add(SbmDbDfn.ColumnIdx.Affiliate_Name); affiliateTargetCols.Add(SbmDbDfn.ColumnIdx.Affiliate_PhoneMain); affiliateTargetCols.Add(SbmDbDfn.ColumnIdx.Affiliate_PhoneAlt); foreach (SbmDbDfn.ColumnIdx dbColumn in affiliateTargetCols) query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasTransaction_AffiliateTarget), prefixTransaction_AffiliateTarget + SbmDbDfn.GetColumnName(dbColumn, false)); //--------------------------------------------------------------------- // Target Address. if (hasTgtAddrCols) { // Join to the target affiliate - NB Use an alias to avoid clashing with the owner affiliate. DbQueryJoin joinAddr = new DbQueryJoin(DbJoinType.LeftOuter); joinAddr.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Address), aliasTransaction_AddressTarget); joinAddr.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_ItemType, aliasTransaction_AddressTarget, false) + "=" + Sbm.ItemType.Affiliate.ToString()); joinAddr.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_ItemId, aliasTransaction_AddressTarget, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Id, aliasTransaction_AffiliateTarget, false)); joinAddr.Filters.Add(DbQuery.BuildBitMappedFilter(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Flags, aliasTransaction_AddressTarget, false), SbmAddress.Flag_Primary, true)); query.Joins.Add(joinAddr); // Add the address columns. List addressTargetCols = new List(); addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Name); addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Line1); addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Line2); addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Line3); addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_City); addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Province); addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Postcode); foreach (SbmDbDfn.ColumnIdx dbColumn in addressTargetCols) query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasTransaction_AddressTarget), prefixTransaction_AddressTarget + SbmDbDfn.GetColumnName(dbColumn, false)); } } } //--------------------------------------------------------------------- // Delivery Address. bool hasColDeliveryAddress = columns.HasId((int)SbmTransaction.Column.DeliveryAddress); bool hasColDelAddr_Line1 = columns.HasId((int)SbmTransaction.Column.DeliveryAddress_Line1); bool hasColDelAddr_Postcode = columns.HasId((int)SbmTransaction.Column.DeliveryAddress_Postcode); bool hasColDelAddr_Phone = columns.HasId((int)SbmTransaction.Column.DeliveryAddress_Phone); bool hasColDelAddr_Email = columns.HasId((int)SbmTransaction.Column.DeliveryAddress_Email); if (hasColDeliveryAddress || hasColDelAddr_Line1 || hasColDelAddr_Postcode || hasColDelAddr_Phone || hasColDelAddr_Email) { // Join to the address table. DbQueryJoin joinDelAddr = new DbQueryJoin(DbJoinType.LeftOuter); joinDelAddr.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Address), aliasTransaction_DeliveryAddress); joinDelAddr.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Type, aliasTransaction_DeliveryAddress, false) + "=" + Sbm.AddressType.Delivery); joinDelAddr.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_ItemType, aliasTransaction_DeliveryAddress, false) + "=" + Sbm.ItemType.Transaction); joinDelAddr.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_ItemId, aliasTransaction_DeliveryAddress, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, aliasTransaction)); query.Joins.Add(joinDelAddr); // Add the address columns. List addressDeliveryCols = new List(); addressDeliveryCols.Add(SbmDbDfn.ColumnIdx.Address_Name); addressDeliveryCols.Add(SbmDbDfn.ColumnIdx.Address_Line1); addressDeliveryCols.Add(SbmDbDfn.ColumnIdx.Address_Line2); addressDeliveryCols.Add(SbmDbDfn.ColumnIdx.Address_Line3); addressDeliveryCols.Add(SbmDbDfn.ColumnIdx.Address_City); addressDeliveryCols.Add(SbmDbDfn.ColumnIdx.Address_Province); addressDeliveryCols.Add(SbmDbDfn.ColumnIdx.Address_Postcode); if (hasColDelAddr_Phone) addressDeliveryCols.Add(SbmDbDfn.ColumnIdx.Address_Phone); if (hasColDelAddr_Email) addressDeliveryCols.Add(SbmDbDfn.ColumnIdx.Address_Email); foreach (SbmDbDfn.ColumnIdx dbColumn in addressDeliveryCols) query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasTransaction_DeliveryAddress), prefixTransaction_DeliveryAddress + SbmDbDfn.GetColumnName(dbColumn, false)); } //--------------------------------------------------------------------- // Delivery tax code. bool bHasColDeliveryTaxCode = false; if (!bHasColDeliveryTaxCode) bHasColDeliveryTaxCode = columns.HasId((int)SbmTransaction.Column.DeliveryTaxCode_Code); if (!bHasColDeliveryTaxCode) bHasColDeliveryTaxCode = columns.HasId((int)SbmTransaction.Column.DeliveryTaxCode_Rate); if (bHasColDeliveryTaxCode) { // Join to the delivery Tax Code. DbQueryJoin joinDelTxc = new DbQueryJoin(DbJoinType.LeftOuter); joinDelTxc.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.TaxCode), aliasTransaction_DeliveryTaxcode); joinDelTxc.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.TaxCode_Id, aliasTransaction_DeliveryTaxcode, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_TaxCodeIdDelivery, aliasTransaction)); query.Joins.Add(joinDelTxc); // Add the Tax Code columns. List taxcodeDeliveryCols = new List(); taxcodeDeliveryCols.Add(SbmDbDfn.ColumnIdx.TaxCode_Code); taxcodeDeliveryCols.Add(SbmDbDfn.ColumnIdx.TaxCode_TaxRate); foreach (SbmDbDfn.ColumnIdx dbColumn in taxcodeDeliveryCols) query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasTransaction_DeliveryTaxcode), prefixTransaction_DeliveryTaxcode + SbmDbDfn.GetColumnName(dbColumn, false)); } //--------------------------------------------------------------------- // Currency. bool hasColCurrency = false; if (!hasColCurrency) hasColCurrency = columns.HasId((int)SbmTransaction.Column.Currency_Code); if (!hasColCurrency) hasColCurrency = columns.HasId((int)SbmTransaction.Column.Currency_Symbol); if (hasColCurrency) { // Join to the Currency. DbQueryJoin joinCurr = new DbQueryJoin(DbJoinType.LeftOuter); joinCurr.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Currency), aliasTransaction_Currency); joinCurr.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Currency_Id, aliasTransaction_Currency, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_CurrencyId, aliasTransaction)); query.Joins.Add(joinCurr); // Add the Currency columns. List currencyCols = new List(); currencyCols.Add(SbmDbDfn.ColumnIdx.Currency_Code); currencyCols.Add(SbmDbDfn.ColumnIdx.Currency_Symbol); foreach (SbmDbDfn.ColumnIdx dbColumn in currencyCols) query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasTransaction_Currency), prefixTransaction_Currency + SbmDbDfn.GetColumnName(dbColumn, false)); } //--------------------------------------------------------------------- // Source Transaction. bool hasColSourceTrans = columns.HasId((int)SbmTransaction.Column.SourceTrans_Ref); if (hasColSourceTrans) { // Join to the source transaction. DbQueryJoin joinSourceTrans = new DbQueryJoin(DbJoinType.LeftOuter); joinSourceTrans.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction), aliasTransaction_SourceTransaction); joinSourceTrans.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, aliasTransaction_SourceTransaction, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_TransIdSource, aliasTransaction)); query.Joins.Add(joinSourceTrans); // Add the transaction columns. List transactionSourceCols = new List(); transactionSourceCols.Add(SbmDbDfn.ColumnIdx.Transaction_Type); transactionSourceCols.Add(SbmDbDfn.ColumnIdx.Transaction_Ref); foreach (SbmDbDfn.ColumnIdx dbColumn in transactionSourceCols) query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasTransaction_SourceTransaction), prefixTransaction_SourceTransaction + SbmDbDfn.GetColumnName(dbColumn, false)); } //--------------------------------------------------------------------- // If subordinate records are being counted, other columns must be grouped. //if (bCountRequirements || bCountTimeRecords || bCountActions) //qry.lGroupBy = qry.lColumn.Values(); Slows down query immensely. //--------------------------------------------------------------------- // Total transaction cost. bool includeCostTotal = (columns.HasId((int)SbmTransaction.Column.CostTotal) || columns.HasId((int)SbmTransaction.Column.CostTotal_Fmt)); if (!includeCostTotal) includeCostTotal = (columns.HasId((int)SbmTransaction.Column.AmountMargin) || columns.HasId((int)SbmTransaction.Column.AmountMargin_Fmt)); if (!includeCostTotal) includeCostTotal = (columns.HasId((int)SbmTransaction.Column.PercentMargin) || columns.HasId((int)SbmTransaction.Column.PercentMargin_Fmt)); if (includeCostTotal) { // Build sub query to calculate the total cost total across all items. String aliasTransaction_RequirementCost = "aTrnReqCst"; String colNameCostTotal = "CostTotal"; DbQuery qryReqntCount = new DbQuery(db.DbmsType); qryReqntCount.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement), aliasTransaction_RequirementCost)); qryReqntCount.Columns.Add("Sum(" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_CostTotal, aliasTransaction_RequirementCost, false) + ")"); qryReqntCount.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_TransId, aliasTransaction_RequirementCost, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, aliasTransaction)); query.Columns.Add("(" + qryReqntCount.BuildQuery() + ")", colNameCostTotal); } //--------------------------------------------------------------------- bool countRequirements = columns.HasId((int)SbmTransaction.Column.ReqntCount); if (countRequirements) { // Build sub query to directly return the number of associated requirements. String aliasTransaction_CountRequirement = "aTrnReqCnt"; String colNameCountReqnts = "CountReqnts"; DbQuery qryReqntCount = new DbQuery(db.DbmsType); qryReqntCount.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement), aliasTransaction_CountRequirement)); qryReqntCount.Columns.Add("Count(" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_Id, aliasTransaction_CountRequirement, false) + ")"); qryReqntCount.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_TransId, aliasTransaction_CountRequirement, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, aliasTransaction)); query.Columns.Add("(" + qryReqntCount.BuildQuery() + ")", colNameCountReqnts); } //--------------------------------------------------------------------- bool bCountTimeRecords = columns.HasId((int)SbmTransaction.Column.TimeCount); if (bCountTimeRecords) { // Build sub query to directly return the number of associated constituents of type 'Time'. String aliasTransaction_CountTimes = "ConTim"; String colNameCountTimeRecs = "CountTimeRecs"; DbQuery qryConstTimeCount = new DbQuery(db.DbmsType); qryConstTimeCount.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Constituent), aliasTransaction_CountTimes)); qryConstTimeCount.Columns.Add("Count(" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_Id, aliasTransaction_CountTimes, false) + ")"); qryConstTimeCount.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_TransId, aliasTransaction_CountTimes, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, aliasTransaction)); qryConstTimeCount.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_Type, aliasTransaction_CountTimes, false) + "=" + Sbm.ConstituentType.TimeRecord.ToString()); qryConstTimeCount.Columns.Add("(" + qryConstTimeCount.BuildQuery() + ")", colNameCountTimeRecs); } //--------------------------------------------------------------------- bool bCountActions = columns.HasId((int)SbmTransaction.Column.TaskCount); if (bCountActions) { // Build sub query to directly return the number of associated constituents of type 'Action'. String aliasTransaction_CountActions = "ConAct"; String colNameCountActions = "CountActions"; DbQuery qryConstActionCount = new DbQuery(db.DbmsType); qryConstActionCount.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Constituent), aliasTransaction_CountActions)); qryConstActionCount.Columns.Add("Count(" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_Id, aliasTransaction_CountActions, false) + ")"); qryConstActionCount.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_TransId, aliasTransaction_CountActions, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, aliasTransaction)); qryConstActionCount.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_Type, aliasTransaction_CountActions, false) + "=" + Sbm.ConstituentType.Task.ToString()); qryConstActionCount.Columns.Add("(" + qryConstActionCount.BuildQuery() + ")", colNameCountActions); } //--------------------------------------------------------------------- // Whether transaction has associated invoices. bool checkForInvoices = columns.HasId((int)SbmTransaction.Column.HasInvoice); if (checkForInvoices) { // Check which types of transaction are allowed. bool invoicesAllowed = SessionConsole != null && (AllowTransactionType(Sbm.TransactionType.ProformaSalesInvoice) || AllowTransactionType(Sbm.TransactionType.SalesInvoice) || AllowTransactionType(Sbm.TransactionType.ProformaPurchaseInvoice) || AllowTransactionType(Sbm.TransactionType.PurchaseInvoice)); bool dispatchesAllowed = SessionConsole != null && AllowTransactionType(Sbm.TransactionType.SalesDispatch); if (invoicesAllowed) { // Aliases & Columns. String aliasTransaction_TransactionInvoice = "TraInv"; String aliasTransaction_TransactionSource = "TraSrc"; String colNameHasInvoice = "HasInvoice"; // Supported invoice transaction types. List transTypeInvoices = new List(); transTypeInvoices.Add(Sbm.TransactionType.ProformaSalesInvoice.ToString()); transTypeInvoices.Add(Sbm.TransactionType.SalesInvoice.ToString()); transTypeInvoices.Add(Sbm.TransactionType.ProformaPurchaseInvoice.ToString()); transTypeInvoices.Add(Sbm.TransactionType.PurchaseInvoice.ToString()); // Construct sub query to check whether invoices have been raised against the transaction (usually a sales order). DbQuery qryTransInv = new DbQuery(db.DbmsType); qryTransInv.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction), aliasTransaction_TransactionInvoice)); qryTransInv.Columns.Add("Count(" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, aliasTransaction_TransactionInvoice, false) + ")"); String filterTransIdSource = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_TransIdSource, aliasTransaction_TransactionInvoice, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, aliasTransaction); if (dispatchesAllowed) { // If sales dispatches are allowed, the invoice can reference a dispatch that references the target transaction rather than having to reference the target transaction directly. DbQueryJoin qryTransSrc = new DbQueryJoin(DbJoinType.Inner); qryTransSrc.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction), aliasTransaction_TransactionSource); qryTransSrc.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, aliasTransaction_TransactionSource, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_TransIdSource, aliasTransaction_TransactionInvoice, false)); qryTransInv.Joins.Add(qryTransSrc); filterTransIdSource += " Or " + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_TransIdSource, aliasTransaction_TransactionSource, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, aliasTransaction); } qryTransInv.Filters.Add(filterTransIdSource); qryTransInv.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Type, aliasTransaction_TransactionInvoice, false) + " IN (" + transTypeInvoices.Concat(",") + ")"); qryTransInv.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Status, aliasTransaction_TransactionInvoice, false) + " NOT IN ('" + StatusCancelled + "')"); qryTransInv.Columns.Add("(" + qryTransInv.BuildQuery() + ")", colNameHasInvoice); } } //--------------------------------------------------------------------- bool bAccountInvoiceRef = columns.HasId((int)SbmTransaction.Column.AccountsInvoiceRef); if (bAccountInvoiceRef) { // Identify the accounts interface. List accountsIdsInterface = new List(); accountsIdsInterface = AccountsDfn.GetInterfaceIds(true); if (accountsIdsInterface.Count > 0) { if (prm.TransactionType == Sbm.TransactionType.ProformaSalesInvoice) { // Look for Interface Data item directly associated with this transaction - Build sub query to retrieve reference from interface export for this transaction. String aliasTransaction_IntData = "IntData"; String colNameAccountsInvoiceRef = "AccInvRef"; DbQuery qryIntData = new DbQuery(db.DbmsType); qryIntData.RowLimit = 1; qryIntData.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.InterfaceDataItem), aliasTransaction_IntData)); qryIntData.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.InterfaceDataItem_ExternalRef, aliasTransaction_IntData, false)); qryIntData.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.InterfaceDataItem_InterfaceId, aliasTransaction_IntData, false) + " IN (" + accountsIdsInterface.Concat(",") + ")"); qryIntData.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.InterfaceDataItem_ItemType, aliasTransaction_IntData, false) + "=" + ((int)Sbm.ItemType.Transaction).ToString()); qryIntData.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.InterfaceDataItem_ItemId, aliasTransaction_IntData, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, aliasTransaction)); qryIntData.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.InterfaceDataItem_Direction, aliasTransaction_IntData, false) + "=" + SaInterfaceProcessDirection.Outbound.ToString()); qryIntData.Columns.Add("(" + qryIntData.BuildQuery() + ")", colNameAccountsInvoiceRef); } } } //--------------------------------------------------------------------- // Populate filter. query.Filters.AddRange(GetTransactionQueryFilter(prm)); if (prm.RequiresVolumeThrottle()) { // Limit the number of transactions returned: long maxTransactions = StringUtil.ToLong(UserContext.GetOwnerOption_Value(Sbm.OrgOption_Value.MaxTransactionsQueriedForEmptyFilter)); if (maxTransactions > 0) { query.RowLimit = (uint)maxTransactions; if (DebugMode) SaLogger.Trace($"{SysUtil.Fn}Transactions query throttled at max rows: {maxTransactions.ToString()}"); } } if (prm.IdsIncluded.Count != 1) { // Configure sort sequence. foreach (String sortColumn in GetTransactionSortColumns(prm)) query.OrderBy.Add(sortColumn); } //--------------------------------------------------------------------- //return new DbResultSet_DataTableReader(db, query.BuildQuery()); return DbResultSet_DataReader.ExecuteQuery(db, query.BuildQuery(prm.ResultsPaging)); } //------------------------------------------------------------------- } //======================================================================= }