2292 lines
136 KiB
C#
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));
|
|
}
|
|
//-------------------------------------------------------------------
|
|
}
|
|
//=======================================================================
|
|
}
|