Files
BusinessMgr-2019/SaBusMgrStandardDbas/Dbas/Mgr/SbmTransactionMgr_Dbas-Transaction.cs
T

2292 lines
136 KiB
C#

using Sarand.BusinessMgr.Net.Standard.Base.App;
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
using Sarand.BusinessMgr.Net.Standard.Dbas.Bus;
using Sarand.BusinessMgr.Net.Standard.Dbas.Internal;
using Sarand.BusinessMgr.Net.Standard.Dbas.UpdateLog;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Utils;
using Sarand.Net.Standard.Dbas.Base;
using Sarand.Net.Standard.Dbas.Data;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using System.Text.RegularExpressions;
namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
{
//=======================================================================
// Transaction manager - Transactions.
//=======================================================================
partial class SbmTransactionMgr_Dbas
{
//-------------------------------------------------------------------
// Utilities.
private List<StringPair> GetLogProperties(SbmTransaction transaction)
{
return new List<StringPair>()
{
new StringPair("Id",SysId.ToString(transaction.Id)),
new StringPair("Type",transaction.TransactionType.ToString()),
new StringPair("Ref",transaction.Ref),
new StringPair("Status",transaction.StatusCode)
};
}
//-------------------------------------------------------------------
// Transaction Requirements.
public override bool UpdateRequirements(SbmTransaction transaction, List<SbmRequirement> requirements, DbUpdateInfo dbUpdateInfo)
{
if (this == null) return false;
ClearErrorState();
if (!SysId.IsValid(transaction.Id)) return SetErrorState("transaction does not exist");
// Verify requirements list.
if (!HasErrorState())
{
// Validate the identity of each each requirement in the list.
foreach (SbmRequirement requirement in requirements)
{
if (requirement == null) continue;
if (SysId.IsValid(requirement.AssociationId) && requirement.AssociationId != transaction.AssociationId)
{
SetErrorState("Invalid requirement in list: doesn't belong to association.");
}
else if (SysId.IsValid(requirement.TransactionId) && requirement.TransactionId != transaction.Id)
{
SetErrorState("Invalid requirement in list: doesn't belong to transaction.");
}
}
}
// Set identity for each requirements in the list.
if (!HasErrorState())
{
// Set the sequence and identity against each requirement in the list.
for (int requirementIdx = 0; requirementIdx < requirements.Count; requirementIdx++)
{
SbmRequirement requirement = requirements[requirementIdx];
requirement.Seq = (short)(requirementIdx + 1);
requirement.AssociationId = transaction.AssociationId;
requirement.TransactionId = transaction.Id;
if (TransactionItemsRequireJobNumber(transaction.TransactionType) && StringUtil.IsEmpty(requirement.JobNumber))
{
String jobNumberNextIdObject = "JobNumber:" + SysId.ToString(UserContext.OrganisationAffiliateId);
/*
// Check for original Job Number 'NextId' key and convert to organisation specific.
String filter = SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.NextId_Object) + "='JobNumber'";
if (db.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.NextId), filter) > 0)
{
String query =
"Begin Transaction;\n" + "Update dbo.NextId Set Object='" + jobNumberNextIdObject + "' Where " + filter + ";\n" + "Commit Transaction;\n";
db.ExecuteQuery(query);
}
*/
String jobNumber = SysId.ToString(Database.GetNextId(jobNumberNextIdObject, dbUpdateInfo, false));
requirement.JobNumber = "";
}
transaction.SetDefaults(requirement);
}
}
// Make a copy of the list (pointers only) to keep track of those requirements in the list that have not been updated against the database.
List<SbmRequirement> requirementsNotUpdated = new List<SbmRequirement>(requirements);
// Retrieve each of the requirements currently specified for this transaction in turn.
List<SysId> requirementIdsUpdated = new List<SysId>();
if (!HasErrorState())
{
List<ColumnDfn> columnsQuery = new List<ColumnDfn>();
String colRequirement_Id = SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Requirement_Id);
SbmRequirement.Params prmRequirement = new SbmRequirement.Params();
prmRequirement.TransactionIdsIncluded.Add(transaction.Id);
using (DbResultSet dbResultSet = ExecuteRequirementQuery(columnsQuery, prmRequirement))
{
while (!HasErrorState() && dbResultSet != null && dbResultSet.NextRecord())
{
NamedValue.Map values = dbResultSet.GetRecordValues();
SysId requirementId = new SysId((int)values.GetValue(colRequirement_Id).AsLong());
// Does this requirement exist in the list.
if (requirementsNotUpdated.ExistsById(requirementId))
{
// Requirement still in list - update the details.
SbmRequirement requirement = requirementsNotUpdated[0];
if (UpdateRequirement(requirement, dbUpdateInfo))
{
if (!CommitRequirementData(requirement, dbUpdateInfo))
SetErrorState("Failed to update requirement's data: " + requirement.ErrorStateMessage);
}
else SetErrorState("Failed to update requirement: " + ErrorStateMessage);
requirementsNotUpdated.Remove(requirement);
}
else
{
// Requirement not in list - remove it.
SbmRequirement requirement = GetRequirement(prmRequirement);
if (requirement != null)
{
if (!DeleteRequirement(requirement, transaction.TransactionType, dbUpdateInfo))
SetErrorState("Failed to remove requirement: " + ErrorStateMessage);
}
else SetErrorState("Failed to retrieve requirement for deletion: " + ErrorStateMessage);
}
}
}
}
// Any requirements left in the 'Not Updated' list must be new.
foreach (SbmRequirement requirementNotUpdate in requirementsNotUpdated)
{
if (requirementNotUpdate != null)
{
if (!SysId.IsValid(requirementNotUpdate.Id))
{
// Requirement does not yet exist - create it:
if (InsertRequirement(requirementNotUpdate, dbUpdateInfo))
{
if (!CommitRequirementData(requirementNotUpdate, dbUpdateInfo))
SetErrorState("Failed to update requirement's data: " + requirementNotUpdate.ErrorStateMessage);
}
else SetErrorState("Failed to create requirement: " + ErrorStateMessage);
}
}
else SetErrorState("null item in list");
requirementsNotUpdated = null;
}
// Clean-up:
requirementsNotUpdated.Clear();
return OK;
}
public override bool RefreshAssociatedData(SbmTransaction transaction, List<SbmRequirement> requirements, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (transaction == null) return SetErrorState("Transaction not specified");
bool transactionUpdated = false;
if (!HasErrorState())
{
// Stock Allocations.
// NB 'RefreshAllocations' updates transaction stock allocation status if necessary.*/
if (!StockMgr.RefreshAllocations(transaction, requirements, false, dbUpdateInfo))
SetErrorState(StockMgr.ErrorStateMessage);
}
if (!HasErrorState() && transactionUpdated)
{
if (requirements == null)
{
requirements = GetRequirementsForTransaction(transaction.Id);
}
// Refresh totals.
if (transaction.RefreshTotals(requirements))
UpdateTransaction(transaction, dbUpdateInfo);
else SetErrorState(transaction.ErrorStateMessage);
}
return OK;
}
// 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<SbmRequirement> requirements, DbUpdateInfo dbUpdateInfo)
{
// Check whether associated transactions need to be updated.
bool refreshAssociatedTransactions = false;
// Sales Order whose stock allocations depend on dispatched quantity.
if (StockControlConfig.ActionByDispatchedQuantity() && transaction.TransactionType == Sbm.TransactionType.SalesDispatch)
refreshAssociatedTransactions = true;
if (refreshAssociatedTransactions)
{
List<SysId> transactionIdsAssociation = new List<SysId>();
transactionIdsAssociation.Add(transaction.TransactionIdSource);
if (requirements == null)
requirements = GetRequirementsForTransaction(transaction.Id);
foreach (SbmRequirement 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<SbmRequirement> requirementsAssociation = GetRequirementsForTransaction(transactionAssociation.Id);
if (requirementsAssociation.Count > 0)
{
RefreshAssociatedData(transactionAssociation, null, dbUpdateInfo);
transactionAssociation.RefreshTotals(requirementsAssociation);
UpdateTransaction(transactionAssociation, dbUpdateInfo);
requirementsAssociation.Clear();
}
}
}
}
return OK;
}
//-------------------------------------------------------------------
// Associated data.
// Associated data - Referencing transactions.
public override bool TransactionIsReferencedByOtherTransactions(SysId transactionId/*, SbmTransaction.StatusCat transactionStatusCat)*/)
{
ClearErrorState();
if (!SysId.IsValid(transactionId)) return false;
DbmsType dbmsType = Database.DbmsType;
String colRefCount = "RefCount";
///<summary>Transaction Source References INTRO</summary>
// 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<String> queries = new List<String>();
// 1. Transactions that reference the specified transaction directly.
// TransId -> Trans.TransIdSource
{
DbQuery qry = new DbQuery(Database.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(Database.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 (Database.TableExists(SbmDbDfn.TableIdx.ItemLink.ToString()) && Internals.GetOwnerOption_AllowOption(Sbm.OrgOption_AllowOption.PurchaseItem_AssociatedSalesItems))
{
DbQuery qry = new DbQuery(Database.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(Database, 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;
}
// Associated data - Requirements.
public override long GetTransactionRequirementCount(SysId transactionId, SbmRequirement.StatusCat requirementStatusCat = SbmRequirement.StatusCat.NotDeleted)
{
ClearErrorState();
if (!SysId.IsValid(transactionId)) return 0;
List<String> filter = new List<String>();
filter.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_TransId)}={SysId.ToLong(transactionId)}");
if (requirementStatusCat == SbmRequirement.StatusCat.NotCancelled)
filter.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_Status)} Not IN ('{StatusCancelled}','{StatusDeleted}')");
else if (requirementStatusCat > 0)
filter.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_StatusCat)}='{RequirementStatusCats.GetCodeForType(requirementStatusCat)}'");
return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement), filter.Concat(" AND ", "(", ")"));
}
public override bool TransactionHasRequirements(SysId transactionId, SbmRequirement.StatusCat requirementStatusCat = SbmRequirement.StatusCat.NotDeleted)
{
ClearErrorState();
return GetTransactionRequirementCount(transactionId, requirementStatusCat) > 0;
}
// Associated data - Constituents.
public override bool TransactionHasConstituents(SysId transactionId, SbmConstituent.StatusCat constituentStatusCat = SbmConstituent.StatusCat.NotDeleted)
{
ClearErrorState();
if (!SysId.IsValid(transactionId)) return false;
List<String> filters = new List<String>();
filters.Add($"{SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Constituent_TransId)}={SysId.ToLong(transactionId)}");
if (constituentStatusCat > 0)
filters.Add($"{SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Constituent_StatusCat)}='{ConstituentStatusCats.GetCodeForType(constituentStatusCat)}'");
return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Constituent), filters.Concat(" AND ", "(", ")")) > 0;
}
// Associated data - Container Items.
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<String> filters = new List<String>();
filters.Add("(" + filterItem + ") OR (" + filterSource + ")");
return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ContainerItem), filters.Concat(" AND ", "(", ")")) > 0;
}
// Associated data - Stock Movements.
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<String> filters = new List<String>();
filters.Add("(" + filterItem + ") OR (" + filterSource + ")");
return Database.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(Database.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<String> filters = new List<String>();
filters.Add("(" + filterItem + ") OR (" + filterSource + ")");
filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Movement_Status) + "='" + SaStatus.Awaiting + "'");
return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Movement), filters.Concat(" AND ", "(", ")")) > 0;
}
// Associated data - Diary Links.
public override bool TransactionHasDiaryLinks(SysId transactionId)
{
if (!SysId.IsValid(transactionId)) return false;
/*SbmDiaryConsole diaryConsole = SbmGlobals.Application.GetDiaryConsole(SessionContext);
if (diaryConsole != null)
diaryConsole.DataItemHasLinks((short)Sbm.ItemType.Transaction, Id);*/
return false;
}
//-------------------------------------------------------------------
/// <summary>
/// Clear Transaction associated data.
/// <para>- Delete associated Interface items.</para>
/// <para>- Delete associated Item documents.</para>
/// <para>- Delete associated Data items.</para>
/// <para>- Delete associated Constituents.</para>
/// <para>- Delete associated Requirements.</para>
/// <para>- Delete associated Addresses.</para>
/// <para>Remove - Transaction reference against other Transactions.</para>
/// </summary>
public override bool ClearTransactionAssociatedData(SbmTransaction transaction, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!SysId.IsValid(transaction.Id)) return false;
if (!HasErrorState())
{
// Delete interface data items.
if (!InterfaceConsole.ClearInterfaceDataItems(new SbmItemId(Sbm.ItemType.Transaction, transaction.Id), dbUpdateInfo))
SetErrorState("Failed to clear interface data items - " + InterfaceConsole.ErrorStateMessage);
}
if (!HasErrorState())
{
// Remove document references.
if (!ItemDocConsole.ClearItemDocs(transaction.GetItemId(), dbUpdateInfo))
SetErrorState(ItemDocConsole.ErrorStateMessage);
}
// Delete any associated items links.
if (!HasErrorState())
{
if (!DataItemMgr.ClearDataItem(transaction.GetItemId(), dbUpdateInfo))
SetErrorState("failed to clear transaction item links");
}
// Delete any constituents that belong to this Transaction.
if (!HasErrorState())
{
String filter = $"{SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Constituent_TransId)}={SysId.ToLong(transaction.Id)}";
if (Database.ExecuteDelete(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Constituent), filter) > 0)
SetErrorState("failed to clear Transaction constituents");
}
// Clear requirements.
if (!HasErrorState())
{
List<SbmRequirement> requirements = GetRequirementsForTransaction(transaction.Id);
if (requirements != null && requirements.Count > 0)
{
foreach (SbmRequirement requirement in requirements)
{
if (!DeleteRequirement(requirement, transaction.TransactionType, dbUpdateInfo))
SetErrorState(ErrorStateMessage);
requirements = null;
}
}
if (requirements != null) requirements.Clear();
}
// Clear addresses.
if (!HasErrorState())
{
if (!AccountMgr.ClearAddressesFor(Sbm.ItemType.Transaction, new ItemId()))
SetErrorState("failed to clear addresses - " + AccountMgr.ErrorStateMessage);
}
// Clear any references to this transaction from other transactions:
if (!HasErrorState())
{
String filter = $"{SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Transaction_TransIdSource)}={SysId.ToLong(transaction.Id)}";
List<StringPair> values = new List<StringPair>();
SacsDatabase.AddValuePair(values, SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Transaction_TransIdSource), "0", false);
Database.ExecuteUpdate(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction), values, filter);
if (Database.HasErrorState())
SetErrorState($"{Database.ErrorStateMessage}");
}
return OK;
}
//-------------------------------------------------------------------
// 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(Msg_MultipleItemsFound);
return null;
}
SbmTransaction prmTransaction = null;
// Query data.
using (var dbConnection = Database.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(Msg_DatabaseQueryException);
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
}
}
return prmTransaction;
}
public override List<SysId> GetRequirementIds(SbmTransaction.Params prmTrans)
{
ClearErrorState();
List<SysId> ids = new List<SysId>();
String dataName_ReqntId = "ReqntId";
DbQuery qryReqntTrans = new DbQuery(Database.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(Database, 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(new SysId(), AffiliateId_Owner, assocId, transactionType, 0);
}
private SbmTransaction_Dbas CreateTransaction(Transaction_Db dbTransaction)
{
ClearErrorState();
SbmTransaction_Dbas transaction = new SbmTransaction_Dbas(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 = Database.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(Database.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 OK;
}
//-------------------------------------------------------------------
// 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 = Database.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 OK;
}
//-------------------------------------------------------------------
// Delete Transaction.
public override bool TransactionCanBeDeleted(SbmTransaction transaction)
{
ClearErrorState();
if (!base.TransactionCanBeDeleted(transaction)) return false;
if (transaction == null) return SetErrorState(Msg_ItemNotSpecified);
// Associated transactions.
if (TransactionIsReferencedByOtherTransactions(transaction.Id)) return SetErrorState("linked transactions are present");
// Requirements.
long requirementCount = GetTransactionRequirementCount(transaction.Id);
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 (TransactionHasConstituents(transaction.Id)) 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 (TransactionHasContainerItems(transaction.Id)) return SetErrorState("item is references by containers");
if (TransactionHasStockMovements(transaction.Id)) 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 (TransactionHasDiaryLinks(transaction.Id)) 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 = Database.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 OK;
}
//-------------------------------------------------------------------
// 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)Internals.GetColTextLen(dbCol);
}
//-------------------------------------------------------------------
// Getting Transaction column definition.
public override ColumnDfn GetTransactionColumnDfn(SbmTransaction.Column column, string caption = "", int width = 0)
{
bool canViewSupplyFinancials = UserCanViewCommoditySupplyFinancials();
bool canViewSalesFinancials = UserCanViewCommoditySalesFinancials();
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<string> GetTransactionQueryFilter(SbmTransaction.Params prm)
{
List<String> filter = new List<String>();
String tableAlias = StringUtil.OnEmpty(prm.TableAlias, aliasTransaction);
// DBMS - used to format elements of queries.
DbmsType dbmsType = Database != null ? Database.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_Ref = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Ref, tableAlias);
String colTransaction_RefInt = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_RefInt, tableAlias);
String colTransaction_RefExt = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_RefExt, tableAlias);
String colTransaction_DescBrief = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_DescBrief, tableAlias);
String colTransaction_Notes = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Notes, 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 search.
if (!StringUtil.IsBlank(prm.Search))
{
foreach (String search in Regex.Split(prm.Search, "[\\s,;\\-+]+"))
{
if (StringUtil.IsBlank(search)) continue;
String searchForLike = DbQuery.FormatForLike(search, true);
List<String> searchFilter = new List<string>();
searchFilter.Add($"{colTransaction_Ref} LIKE '%{searchForLike}%'");
searchFilter.Add($"{colTransaction_RefExt} LIKE '%{searchForLike}%'");
searchFilter.Add($"{colTransaction_DescBrief} LIKE '%{searchForLike}%'");
if (!StringUtil.IsBlank(prm.TableAlias_AffiliateTarget))
{
searchFilter.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Name, prm.TableAlias_AffiliateTarget)} LIKE '%{searchForLike}%'");
}
if (searchFilter.Any())
filter.Add(searchFilter.Concat(" OR ", "(", ")"));
}
}
// 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.AssociationId) && !prm.IdsIncluded.HasValidIds() && !SysId.IsValid(prm.TransIdSource))
filter.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_AffIdOwner, tableAlias)}={SysId.ToLong(AffiliateId_Owner)}");
}
// Association Id.
String colTransaction_AssocId = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_AssocId, tableAlias);
if (SysId.IsValid(prm.AssociationId))
filter.Add($"{colTransaction_AssocId}={SysId.ToLong(prm.AssociationId)}");
// Transaction Type.
if (prm.TransactionType > 0)
filter.Add($"{colTransaction_Type}={(int)prm.TransactionType}");
//---------------------------------------------------------------
// Transaction Reference.
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 filterTranRefPartial = $"{colTransaction_Ref} Like '%{DbQuery.FormatForLike(prm.TransRefPartial)}%'";
if (prm.TransRefPartial.IsNumeric() && prm.TransRefPartial.ToLong() >= 1)
filterTranRefPartial += $" OR {colTransaction_RefInt}={prm.TransRefPartial.ToLong()}";
filter.Add(filterTranRefPartial);
}
// Transaction External reference.
if (!StringUtil.IsEmpty(prm.TransRefExtFull))
filter.Add($"{colTransaction_RefExt}='{DbQuery.FormatForCondition(prm.TransRefExtFull)}'");
else if (!StringUtil.IsEmpty(prm.TransRefExtPartial))
filter.Add($"{colTransaction_RefExt} Like '%{DbQuery.FormatForLike(prm.TransRefExtPartial)}%'");
// Transaction DescBrief.
String sTransDescBrief = DbQuery.FormatForLike(prm.TransDescBriefPartial);
if (!StringUtil.IsEmpty(prm.TransDescBriefPartial))
filter.Add($"{colTransaction_DescBrief} LIKE '%{DbQuery.FormatForLike(prm.TransDescBriefPartial)}%'");
//---------------------------------------------------------------
// Transaction Source.
if (SysId.IsValid(prm.TransIdSource))
{
List<String> filtersSource = new List<string>();
// 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 (Database.TableExists(SbmDbDfn.TableIdx.ItemLink.ToString()) && Internals.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<String> filtersItemLink = new List<String>();
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());
}
//---------------------------------------------------------------
// Location Id Stock.
if (SysId.IsValid(prm.LocationIdStock))
filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_LocationIdStock, tableAlias) + "=" + SysId.ToString(prm.LocationIdStock));
// Transaction Status.
String statusCatCondition = GetTransactionStatusCatFilter(prm.StatusCat, tableAlias, TransactionStatusCats);
if (!StringUtil.IsBlank(statusCatCondition))
filter.Add(statusCatCondition);
//---------------------------------------------------------------
// 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<String> filtersActive = new List<String>();
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 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<String> filtersOR = new List<String>();
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<SbmDbDfn.ColumnIdx> addressCols = new List<SbmDbDfn.ColumnIdx>()
{
SbmDbDfn.ColumnIdx.Address_Name,
SbmDbDfn.ColumnIdx.Address_Line1,
SbmDbDfn.ColumnIdx.Address_Line2,
SbmDbDfn.ColumnIdx.Address_Line3,
SbmDbDfn.ColumnIdx.Address_City,
//SbmDbDfn.ColumnIdx.Address_Province,
SbmDbDfn.ColumnIdx.Address_Contact,
};
List<String> filterAddress = new List<String>();
foreach (SbmDbDfn.ColumnIdx addressCol in addressCols)
filterAddress.Add(SbmDbDfn.GetColumnNameQual(addressCol, 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;
}
internal static String GetTransactionStatusCatFilter(SbmTransaction.StatusCat statusCat, String aliasTransaction, List<TypeCodeDesc> transactionStatusCats)
{
String colTransaction_StatusCat = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_StatusCat, aliasTransaction);
String colTransaction_Status = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Status, aliasTransaction);
if (statusCat == SbmTransaction.StatusCat.NotDeleted)
return $"{colTransaction_Status}<>'{StatusDeleted}'";
else if (statusCat == SbmTransaction.StatusCat.Completed)
return $"{colTransaction_Status}='{StatusCompleted}'";
else if (statusCat == SbmTransaction.StatusCat.NotClosed)
return $"{colTransaction_StatusCat}<>'{transactionStatusCats.GetCodeForType(SbmTransaction.StatusCat.Closed)}'";
else if (statusCat == SbmTransaction.StatusCat.NotCancelled)
return $"{colTransaction_Status}<>'{StatusCancelled}'";
else if (!StringUtil.IsBlank(transactionStatusCats.GetCodeForType(statusCat)))
return $"{colTransaction_StatusCat}='{transactionStatusCats.GetCodeForType(statusCat)}'";
return "";
}
//-------------------------------------------------------------------
// Sort columns.
public List<String> GetTransactionSortColumns(SbmTransaction.Params prm)
{
String tableAlias = StringUtil.OnEmpty(prm.TableAlias, aliasTransaction);
// Sort sequence.
List<String> sortColumnCodes = new List<String>();
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 Database.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<SbmTransaction> GetTransactionList(SbmTransaction.Params prm)
{
ClearErrorState();
List<SbmTransaction> transactions = new List<SbmTransaction>();
DbQuery qry = new DbQuery(Database.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 = Database.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(Msg_DatabaseQueryException);
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
}
}
return transactions;
}
//-------------------------------------------------------------------
// Execute query.
public override DbResultSet ExecuteTransactionQuery(List<ColumnDfn> columns, SbmTransaction.Params prm)
{
ClearErrorState();
bool canViewSupplyFinancials = UserCanViewCommoditySupplyFinancials();
bool canViewSalesFinancials = UserCanViewCommoditySalesFinancials();
//---------------------------------------------------------------------
// Construct build database query.
DbQuery query = new DbQuery(Database.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(SbmTransaction.Column.RefExt)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_RefExt, aliasTransaction));
if (ColumnExists(SbmDbDfn.ColumnIdx.Transaction_ContactName) && columns.HasId(SbmTransaction.Column.ContactName))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_ContactName, aliasTransaction));
if (columns.HasId(SbmTransaction.Column.Likelihood)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Likelihood, aliasTransaction));
if (columns.HasId(SbmTransaction.Column.RaisedOn)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Raised, aliasTransaction));
if (columns.HasId(SbmTransaction.Column.RequiredOn)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Required, aliasTransaction));
if (columns.HasId(SbmTransaction.Column.InProgressOn)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_InProgress, aliasTransaction));
if (columns.HasId(SbmTransaction.Column.ClosedOn)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Closed, aliasTransaction));
if (columns.HasId(SbmTransaction.Column.DescBrief)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_DescBrief, aliasTransaction));
if (columns.HasId(SbmTransaction.Column.ContactAreaCode) || columns.HasId(SbmTransaction.Column.ContactArea))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_ContactAreaCode, aliasTransaction));
if (columns.HasId(SbmTransaction.Column.DeliveryStatusCode) || columns.HasId(SbmTransaction.Column.DeliveryStatus))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_DeliveryStatusCode, aliasTransaction));
if (columns.HasId(SbmTransaction.Column.DeliveryTypeCode) || columns.HasId(SbmTransaction.Column.DeliveryType))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_DeliveryTypeCode, aliasTransaction));
if (columns.HasId(SbmTransaction.Column.DeliveryMethodCode) || columns.HasId(SbmTransaction.Column.DeliveryMethod))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_DeliveryMethodCode, aliasTransaction));
if (columns.HasId(SbmTransaction.Column.DeliveryCourierCode) || columns.HasId(SbmTransaction.Column.DeliveryCourier))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_DeliveryCourierCode, aliasTransaction));
if (columns.HasId(SbmTransaction.Column.DeliveryBookInCode) || columns.HasId(SbmTransaction.Column.DeliveryBookIn))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_DeliveryBookInCode, aliasTransaction));
if (columns.HasId(SbmTransaction.Column.StockPickerCode) || columns.HasId(SbmTransaction.Column.StockPicker))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_StockPickerCode, aliasTransaction));
if (canViewSalesFinancials && (columns.HasId(SbmTransaction.Column.DeliveryAmountNet) || columns.HasId(SbmTransaction.Column.DeliveryAmountNet_Fmt)))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_DeliveryAmountNet, aliasTransaction));
if (columns.HasId(SbmTransaction.Column.DeliveryTaxCodeId)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_TaxCodeIdDelivery));
if (canViewSalesFinancials && (columns.HasId(SbmTransaction.Column.DeliveryAmountTax) || columns.HasId(SbmTransaction.Column.DeliveryAmountTax_Fmt)))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_DeliveryAmountTax, aliasTransaction));
if (canViewSalesFinancials && (columns.HasId(SbmTransaction.Column.DeliveryAmountTot) || columns.HasId(SbmTransaction.Column.DeliveryAmountTot_Fmt)))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_DeliveryAmountTot, aliasTransaction));
if (columns.HasId(SbmTransaction.Column.DeliveryNominalCode)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_DeliveryNominalCode, aliasTransaction));
if (columns.HasId(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(SbmTransaction.Column.AmountEst) || columns.HasId(SbmTransaction.Column.AmountEst_Fmt)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_AmountEst, aliasTransaction));
if (columns.HasId(SbmTransaction.Column.AmountMax) || columns.HasId(SbmTransaction.Column.AmountMax_Fmt)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_AmountMax, aliasTransaction));
if (columns.HasId(SbmTransaction.Column.AmountNet) || columns.HasId(SbmTransaction.Column.AmountNet_Fmt)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_AmountNet, aliasTransaction));
if (columns.HasId(SbmTransaction.Column.AmountTax) || columns.HasId(SbmTransaction.Column.AmountTax_Fmt)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_AmountTax, aliasTransaction));
if (columns.HasId(SbmTransaction.Column.AmountTot) || columns.HasId(SbmTransaction.Column.AmountTot_Fmt)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_AmountTot, aliasTransaction));
}
if (canViewSupplyFinancials)
{
if (ColumnExists(SbmDbDfn.ColumnIdx.Transaction_CostLabourRateHour) && columns.HasId(SbmTransaction.Column.CostLabourRateHour))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_CostLabourRateHour, aliasTransaction));
}
if (ColumnExists(SbmDbDfn.ColumnIdx.Transaction_TimeEst) && columns.HasId(SbmTransaction.Column.TimeEst))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_TimeEst, aliasTransaction));
if (ColumnExists(SbmDbDfn.ColumnIdx.Transaction_TimeAct) && columns.HasId(SbmTransaction.Column.TimeAct))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_TimeAct, aliasTransaction));
if (columns.HasId(SbmTransaction.Column.TimeTot)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_TimeTot, aliasTransaction));
if (columns.HasId(SbmTransaction.Column.Weight)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Weight, aliasTransaction));
if (columns.HasId(SbmTransaction.Column.BoxCount)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_BoxCount, aliasTransaction));
if (columns.HasId(SbmTransaction.Column.Notes)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Notes, aliasTransaction));
if (columns.HasId(SbmTransaction.Column.AllocationInd) || columns.HasId(SbmTransaction.Column.AllocationInd_YP) || columns.HasId(SbmTransaction.Column.Flags) || columns.HasId(SbmTransaction.Column.ReplacementOrder_Tick) || columns.HasId(SbmTransaction.Column.ReplacementOrder_Y))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Flags, aliasTransaction));
if (columns.HasId(SbmTransaction.Column.Status) || columns.HasId(SbmTransaction.Column.Status_Desc) || columns.HasId(SbmTransaction.Column.Status_Ind) || columns.HasId(SbmTransaction.Column.Status_OnHold_Tick) || columns.HasId(SbmTransaction.Column.Status_OnHold_Cross) || columns.HasId(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(SbmTransaction.Column.Assoc_Code);
if (!hasAssocCols) hasAssocCols = columns.HasId(SbmTransaction.Column.Assoc_AccountManagerCode) || columns.HasId(SbmTransaction.Column.Assoc_AccountManagerDesc);
if (!hasAssocCols) hasAssocCols = columns.HasId(SbmTransaction.Column.Assoc_AccountHandlerCode) || columns.HasId(SbmTransaction.Column.Assoc_AccountHandlerDesc);
bool hasOwnerAffCols = false;
if (!hasOwnerAffCols) hasOwnerAffCols = columns.HasId(SbmTransaction.Column.AssocOwner_Name);
bool hasTgtAffCols = false;
if (!hasTgtAffCols) hasTgtAffCols = columns.HasId(SbmTransaction.Column.AssocTarget_Name);
if (!hasTgtAffCols) hasTgtAffCols = columns.HasId(SbmTransaction.Column.AssocTarget_PhoneMain);
if (!hasTgtAffCols) hasTgtAffCols = columns.HasId(SbmTransaction.Column.AssocTarget_PhoneAlt);
bool hasTgtAddrCols = false;
if (!hasTgtAddrCols) hasTgtAddrCols = columns.HasId(SbmTransaction.Column.AssocTarget_Address);
if (!hasTgtAddrCols) hasTgtAddrCols = columns.HasId(SbmTransaction.Column.AssocTarget_Address_Name);
if (!hasTgtAddrCols) hasTgtAddrCols = columns.HasId(SbmTransaction.Column.AssocTarget_Address_Line1);
if (!hasTgtAddrCols) hasTgtAddrCols = columns.HasId(SbmTransaction.Column.AssocTarget_Address_Line2);
if (!hasTgtAddrCols) hasTgtAddrCols = columns.HasId(SbmTransaction.Column.AssocTarget_Address_Line3);
if (!hasTgtAddrCols) hasTgtAddrCols = columns.HasId(SbmTransaction.Column.AssocTarget_Address_City);
if (!hasTgtAddrCols) hasTgtAddrCols = columns.HasId(SbmTransaction.Column.AssocTarget_Address_Province);
if (!hasTgtAddrCols) hasTgtAddrCols = columns.HasId(SbmTransaction.Column.AssocTarget_Address_Postcode);
if (hasAssocCols || hasOwnerAffCols || hasTgtAffCols || hasTgtAddrCols)
{
//---------------------------------------------------------------------
// Join to the Association.
prm.TableAlias_Association = aliasTransaction_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<SbmDbDfn.ColumnIdx> associationCols = new List<SbmDbDfn.ColumnIdx>();
associationCols.Add(SbmDbDfn.ColumnIdx.Association_Code);
if (columns.HasId(SbmTransaction.Column.Assoc_AccountManagerCode) || columns.HasId(SbmTransaction.Column.Assoc_AccountManagerDesc))
associationCols.Add(SbmDbDfn.ColumnIdx.Association_AccountManagerCode);
if (columns.HasId(SbmTransaction.Column.Assoc_AccountHandlerCode) || columns.HasId(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.
prm.TableAlias_AffiliateOwner = aliasTransaction_AffiliateOwner;
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<SbmDbDfn.ColumnIdx> affiliateOwnerCols = new List<SbmDbDfn.ColumnIdx>();
affiliateOwnerCols.Add(SbmDbDfn.ColumnIdx.Affiliate_Name);
foreach (SbmDbDfn.ColumnIdx dbColumn in affiliateOwnerCols)
query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasTransaction_AffiliateOwner), prefixTransaction_AffiliateOwner + SbmDbDfn.GetColumnName(dbColumn, false));
}
//---------------------------------------------------------------------
// Target Affiliate.
if (hasTgtAffCols || hasTgtAddrCols)
{
// Join to the Target Affiliate.
prm.TableAlias_AffiliateTarget = aliasTransaction_AffiliateTarget;
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<SbmDbDfn.ColumnIdx> affiliateTargetCols = new List<SbmDbDfn.ColumnIdx>();
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 Primary Target Address.
prm.TableAlias_AddressTarget = aliasTransaction_AddressTarget;
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<SbmDbDfn.ColumnIdx> addressTargetCols = new List<SbmDbDfn.ColumnIdx>();
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(SbmTransaction.Column.DeliveryAddress);
bool hasColDelAddr_Line1 = columns.HasId(SbmTransaction.Column.DeliveryAddress_Line1);
bool hasColDelAddr_Postcode = columns.HasId(SbmTransaction.Column.DeliveryAddress_Postcode);
bool hasColDelAddr_Phone = columns.HasId(SbmTransaction.Column.DeliveryAddress_Phone);
bool hasColDelAddr_Email = columns.HasId(SbmTransaction.Column.DeliveryAddress_Email);
if (hasColDeliveryAddress || hasColDelAddr_Line1 || hasColDelAddr_Postcode || hasColDelAddr_Phone || hasColDelAddr_Email)
{
// Join to the Delivery Address.
prm.TableAlias_AddressDelivery = aliasTransaction_DeliveryAddress;
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<SbmDbDfn.ColumnIdx> addressDeliveryCols = new List<SbmDbDfn.ColumnIdx>();
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(SbmTransaction.Column.DeliveryTaxCode_Code);
if (!bHasColDeliveryTaxCode) bHasColDeliveryTaxCode = columns.HasId(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<SbmDbDfn.ColumnIdx> taxcodeDeliveryCols = new List<SbmDbDfn.ColumnIdx>();
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(SbmTransaction.Column.Currency_Code);
if (!hasColCurrency) hasColCurrency = columns.HasId(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<SbmDbDfn.ColumnIdx> currencyCols = new List<SbmDbDfn.ColumnIdx>();
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(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<SbmDbDfn.ColumnIdx> transactionSourceCols = new List<SbmDbDfn.ColumnIdx>();
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(SbmTransaction.Column.CostTotal) || columns.HasId(SbmTransaction.Column.CostTotal_Fmt));
if (!includeCostTotal) includeCostTotal = (columns.HasId(SbmTransaction.Column.AmountMargin) || columns.HasId(SbmTransaction.Column.AmountMargin_Fmt));
if (!includeCostTotal) includeCostTotal = (columns.HasId(SbmTransaction.Column.PercentMargin) || columns.HasId(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(Database.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(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(Database.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(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(Database.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(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(Database.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(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<String> transTypeInvoices = new List<String>();
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(Database.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(SbmTransaction.Column.AccountsInvoiceRef);
if (bAccountInvoiceRef)
{
// Identify the accounts interface.
HashSet<SysId> 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(Database.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(Internals.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(Database, query.BuildQuery());
return DbResultSet_DataReader.ExecuteQuery(Database, query.BuildQuery(prm.ResultsPaging));
}
//-------------------------------------------------------------------
}
//=======================================================================
}