2164 lines
131 KiB
C#
2164 lines
131 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;
|
|
|
|
namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
|
{
|
|
//=======================================================================
|
|
partial class SbmTransactionMgr_Dbas
|
|
{
|
|
//*******************************************************************
|
|
// T r a n s a c t i o n
|
|
//*******************************************************************
|
|
|
|
//-------------------------------------------------------------------
|
|
// Data members.
|
|
private static String databaseNotAvailable = "database is not available";
|
|
|
|
//-------------------------------------------------------------------
|
|
// Utilities.
|
|
private List<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)
|
|
};
|
|
}
|
|
public override decimal GetTransCostLabourRateHourDefault()
|
|
{
|
|
String costLabourRateHour = UserContext.GetOwnerOption_Value(Sbm.OrgOption_Value.CostLabourRateDefault);
|
|
return costLabourRateHour.ToDecimal();
|
|
}
|
|
// ToDo GetTransCostLabourRateHourDefault & GetTransCostLabourRateHour for conversion datatype double to decimal!
|
|
public override decimal GetTransCostLabourRateHour(SysId transactionId)
|
|
{
|
|
string colCostLabourRateHour = "CostLabourRateHour";
|
|
decimal labourRate = 0.0m;
|
|
if (SysId.IsValid(transactionId))
|
|
{
|
|
labourRate = GetTransCostLabourRateHourDefault();
|
|
if (ColumnExists(SbmDbDfn.ColumnIdx.Transaction_CostLabourRateHour))
|
|
{
|
|
// Construct the query.
|
|
DbQuery qry = new DbQuery(db.DbmsType);
|
|
qry.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction));
|
|
qry.Columns.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Transaction_CostLabourRateHour), colCostLabourRateHour);
|
|
qry.Filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Transaction_Id) + "=" + transactionId.ToString());
|
|
qry.Filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Transaction_CostLabourRateHour) + " IS NOT null");
|
|
|
|
using (DbResultSet dbResultSet = DbResultSet_DataReader.ExecuteQuery(db, qry.ToString()))
|
|
{
|
|
if (dbResultSet != null && dbResultSet.NextRecord())
|
|
{
|
|
NamedValue.Map values = dbResultSet.GetRecordValues();
|
|
return (decimal)values.GetValue(colCostLabourRateHour).ToNumeric();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return labourRate;
|
|
}
|
|
public override bool DeliveryFinancialsAreAvailable()
|
|
{
|
|
// Are the fields defined on the database?
|
|
if (ColumnExists(SbmDbDfn.ColumnIdx.Transaction_DeliveryAmountNet)) return false;
|
|
if (ColumnExists(SbmDbDfn.ColumnIdx.Transaction_DeliveryAmountTax)) return false;
|
|
if (!ColumnExists(SbmDbDfn.ColumnIdx.Transaction_DeliveryAmountTot)) return false;
|
|
if (!ColumnExists(SbmDbDfn.ColumnIdx.Transaction_TaxCodeIdDelivery)) return false;
|
|
if (!ColumnExists(SbmDbDfn.ColumnIdx.Transaction_DeliveryDepartment)) return false;
|
|
if (!ColumnExists(SbmDbDfn.ColumnIdx.Transaction_DeliveryNominalCode)) return false;
|
|
return true;
|
|
}
|
|
public override bool ChangeTransactionsAssociation(SbmTransaction transaction, SysId assocId)
|
|
{
|
|
ClearErrorState();
|
|
List<String> filters = new List<String>();
|
|
List<StringPair> values = new List<StringPair>();
|
|
String errorStatePrefix = "Failed to change transaction's association - ";
|
|
|
|
// Database connection.
|
|
if (!HasErrorState() && db == null) SetErrorState(errorStatePrefix + databaseNotAvailable);
|
|
|
|
// Validate the transaction.
|
|
if (!HasErrorState() && (transaction == null || !SysId.IsValid(transaction.Id)))
|
|
SetErrorState(errorStatePrefix + "invalid transaction specified");
|
|
|
|
///<summary>### Apr2012 Don't bother checking that the transaction's assocition is different ###</summary>
|
|
/* Check that the association is not the same as the current association.
|
|
if (!HasErrorState() && transaction.AssocId == assocId)
|
|
SetErrorState(errorStatePrefix+"a different association must be specified");*/
|
|
|
|
// Check that the specified association exists.
|
|
if (!HasErrorState() && AccountMgr != null && !AccountMgr.AssociationExistsById(assocId))
|
|
SetErrorState(errorStatePrefix + "specified association doesn't exist");
|
|
|
|
// Replace the association against subordinate data items.
|
|
if (!HasErrorState() && transaction.HasConstituents())
|
|
{
|
|
SacsDatabase.AddValuePair(values, SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Constituent_AssocId), assocId.ToString(), false);
|
|
filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Constituent_TransId) + "=" + transaction.Id.ToString());
|
|
if (db.ExecuteUpdate(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Constituent), values, filters.Concat(" AND ", "(", ")")) > 0)
|
|
{
|
|
SetErrorState(errorStatePrefix + "transaction updates failed");
|
|
ChangeTransactionsAssociation(transaction, transaction.AssociationId); // To reset changes.
|
|
}
|
|
}
|
|
if (!HasErrorState() && transaction.HasRequirements())
|
|
{
|
|
SacsDatabase.AddValuePair(values, SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Requirement_AssocId), assocId.ToString(), false);
|
|
filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Requirement_TransId) + "=" + transaction.Id.ToString());
|
|
if (db.ExecuteUpdate(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement), values, filters.Concat(" AND ", "(", ")")) > 0)
|
|
{
|
|
SetErrorState(errorStatePrefix + "requirement updates failed");
|
|
ChangeTransactionsAssociation(transaction, transaction.AssociationId); // To reset changes.
|
|
}
|
|
}// Replace the association against the transaction itself.
|
|
if (!HasErrorState() && transaction.AssociationId != assocId)
|
|
{
|
|
filters.Clear(); values.Clear();
|
|
SacsDatabase.AddValuePair(values, SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Transaction_AssocId), assocId.ToString(), false);
|
|
filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Transaction_Id) + "=" + transaction.Id.ToString());
|
|
if (db.ExecuteUpdate(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction), values, filters.Concat(" AND ", "(", ")")) > 0)
|
|
{
|
|
SetErrorState(errorStatePrefix + "transaction update failed");
|
|
ChangeTransactionsAssociation(transaction, transaction.AssociationId); // To reset changes.
|
|
}
|
|
}
|
|
return !HasErrorState();
|
|
}
|
|
|
|
public override bool RefreshAssociatedData(SbmTransaction transaction, List<SbmRequirement.Data> requirements = null)
|
|
{
|
|
ClearErrorState();
|
|
if (transaction == null) return SetErrorState("Transaction not specified");
|
|
bool transactionUpdated = false;
|
|
bool requirementListCreatedLocally = false;
|
|
|
|
if (!HasErrorState())
|
|
{
|
|
/* ToDo create RefreshAllocations in StockMgr for Stock Allocations.
|
|
if (!InitStockMgr()) SetErrorState("Failed to create Stock Manager");
|
|
if (!HasErrorState() && !StockMgr.RefreshAllocations(transaction, requirements, false)) SetErrorState(StockMgr.ErrorState.ToString());
|
|
// NB 'RefreshAllocations' updates transaction stock allocation status if necessary.*/
|
|
}
|
|
|
|
if (!HasErrorState() && transactionUpdated)
|
|
{
|
|
if (requirements.Count() < 1)
|
|
{
|
|
requirements = transaction.GetRequirements().ToDataList();
|
|
requirementListCreatedLocally = true;
|
|
}
|
|
// Refresh totals.
|
|
if (transaction.RefreshTotals(requirements))
|
|
UpdateTransaction(transaction, UserContext.DbUpdateInfo);
|
|
else SetErrorState(transaction.ErrorState.ToString());
|
|
}
|
|
|
|
if (requirementListCreatedLocally)
|
|
{
|
|
if (requirements.Count() > 0) requirements.Clear();
|
|
}
|
|
return !HasErrorState();
|
|
}
|
|
// Refresh associated transactions (eg. stock allocations on associated sames order when dispatch updated and stock actioned by dispatch).
|
|
public override bool RefreshAssociatedTransactions(SbmTransaction transaction, List<SbmRequirement.Data> requirements = null)
|
|
{
|
|
// Check whether associated transactions need to be updated.
|
|
bool refreshAssociatedTransactions = false;
|
|
bool requirementListCreatedLocally = false;
|
|
|
|
// Sales Order whose stock allocations depend on dispatched quantity.
|
|
if (StockControlConfig.ActionByDispatchedQuantity() && transaction.TransactionType == Sbm.TransactionType.SalesDispatch)
|
|
refreshAssociatedTransactions = true;
|
|
|
|
if (refreshAssociatedTransactions)
|
|
{
|
|
List<SysId> transactionIdsAssociation = new List<SysId>();
|
|
transactionIdsAssociation.Add(transaction.TransactionIdSource);
|
|
if (requirements == null)
|
|
{
|
|
requirements = transaction.GetRequirements().ToDataList();
|
|
requirementListCreatedLocally = true;
|
|
}
|
|
foreach (SbmRequirement.Data requirement in requirements)
|
|
{
|
|
SbmRequirement requirementSource = TransactionMgr.GetRequirementById(requirement.RequirementIdSource);
|
|
if (requirementSource != null && !transactionIdsAssociation.Contains(requirementSource.TransactionId))
|
|
transactionIdsAssociation.Add(requirementSource.TransactionId);
|
|
}
|
|
|
|
foreach (SysId transactionIdAssociation in transactionIdsAssociation)
|
|
{
|
|
SbmTransaction transactionAssociation = GetTransactionById(transactionIdAssociation);
|
|
if (transactionAssociation != null)
|
|
{
|
|
List<SbmRequirement> requirementsAssociation = transactionAssociation.GetRequirements();
|
|
if (requirementsAssociation.Count > 0)
|
|
{
|
|
RefreshAssociatedData(transactionAssociation, null);
|
|
transactionAssociation.RefreshTotals(requirementsAssociation);
|
|
UpdateTransaction(transactionAssociation, UserContext.DbUpdateInfo);
|
|
requirementsAssociation.Clear();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (requirementListCreatedLocally)
|
|
{
|
|
if (requirements.Count > 0) requirements.Clear();
|
|
}
|
|
return !HasErrorState();
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Has Transaction.
|
|
public override bool TransactionIsReferencedByOtherTransactions(SysId transactionId/*, SbmTransaction.StatusCat transactionStatusCat)*/)
|
|
{
|
|
ClearErrorState();
|
|
if (!SysId.IsValid(transactionId)) return false;
|
|
DbmsType dbmsType = db.DbmsType;
|
|
String colRefCount = "RefCount";
|
|
|
|
///<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(db.DbmsType);
|
|
String aliasTblTransSrc = "tblTraScr";
|
|
String tblTransaction = SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction);
|
|
qry.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction), aliasTblTransSrc);
|
|
qry.Columns.Add("Count(*)", colRefCount);
|
|
qry.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_TransIdSource, aliasTblTransSrc, false) + "=" + transactionId.ToString());
|
|
queries.Add(qry.BuildQuery());
|
|
}
|
|
|
|
// 2. Requirements that reference (via ReqntIdSource) requirements belonging to the source transaction.
|
|
// TransId -> ReqntSrc.TransId -> ReqntSrc.Id -> Reqnt.ReqntIdSource
|
|
// NB Only interested if there are any referenced requirements, not what references them.
|
|
{
|
|
DbQuery qry = new DbQuery(db.DbmsType);
|
|
// Start with requirements belonging to the source transaction.
|
|
String aliasTblReqntSrc = "tblReqSrc";
|
|
String colRequirement_TransId = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_TransId, aliasTblReqntSrc, false);
|
|
qry.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement), aliasTblReqntSrc);
|
|
qry.Columns.Add("Count(*)");
|
|
qry.Filters.Add(colRequirement_TransId + "=" + transactionId.ToString());
|
|
// Join to referencing requirements.
|
|
String aliasTblReqntRef = "tblReqRef";
|
|
DbQueryJoin joinReqnt = new DbQueryJoin(DbJoinType.Inner);
|
|
joinReqnt.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement), aliasTblReqntRef);
|
|
joinReqnt.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_ReqntIdSource, aliasTblReqntRef, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_Id, aliasTblReqntSrc, false));
|
|
qry.Joins.Add(joinReqnt);
|
|
queries.Add(qry.BuildQuery());
|
|
}
|
|
// 3. Requirements associated (via itemLink) with requirements belonging to the transaction.
|
|
// TransSrc.Id -> ReqntSrc.TransId -> ReqntSrc.Id -> ItemLink -> Reqnt.Id -> Reqnt.TransId
|
|
// NB Only need to check whether there are any links to the source requirements
|
|
// and don't have to join to the referencing requirements themselves.
|
|
if (db.TableExists(SbmDbDfn.TableIdx.ItemLink.ToString()) && UserContext.GetOwnerOption_AllowOption(Sbm.OrgOption_AllowOption.PurchaseItem_AssociatedSalesItems))
|
|
{
|
|
DbQuery qry = new DbQuery(db.DbmsType);
|
|
// Start with requirements belonging to the source transaction.
|
|
String aliasTblReqntSrc = "tblReqSrc";
|
|
qry.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement), aliasTblReqntSrc);
|
|
qry.Columns.Add("Count(*)");
|
|
qry.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_TransId, aliasTblReqntSrc, false) + "=" + transactionId.ToString());
|
|
// Join to Item Link - Both items (From & To) are requirements and either can match the source requirement.
|
|
String aliasTblItemLink = "tblItmLnk";
|
|
DbQueryJoin joinItmLnk = new DbQueryJoin(DbJoinType.Inner);
|
|
joinItmLnk.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ItemLink), aliasTblItemLink);
|
|
joinItmLnk.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_Type, aliasTblItemLink, false) + "=" + Sbm.ItemLinkType.Requirement_AssociatedItem.ToString());
|
|
joinItmLnk.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemTypeFrom, aliasTblItemLink, false) + "=" + Sbm.ItemType.Requirement);
|
|
joinItmLnk.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemTypeTo, aliasTblItemLink, false) + "=" + Sbm.ItemType.Requirement);
|
|
// Feb2017
|
|
joinItmLnk.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemIdFrom, aliasTblItemLink, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_Id, aliasTblReqntSrc, false) + " OR " + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemIdTo, aliasTblItemLink, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_Id, aliasTblReqntSrc, false));
|
|
qry.Joins.Add(joinItmLnk);
|
|
queries.Add(qry.BuildQuery());
|
|
}
|
|
// Execute the queries as a single uioned query.
|
|
String query = queries.Concat("\n Union All \n");
|
|
using (DbResultSet dbResultSet = DbResultSet_DataReader.ExecuteQuery(db, query))
|
|
{
|
|
// As each sub-query returns a count, any positive count value is sufficient to indicate a reference.
|
|
while (dbResultSet != null && dbResultSet.NextRecord())
|
|
{
|
|
NamedValue.Map values = dbResultSet.GetRecordValues();
|
|
long count = values.GetValue(colRefCount).AsLong();
|
|
if (count > 0) return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
public override bool TransactionHasRequirements(SysId transactionId, SbmRequirement.StatusCat requirementStatusCat)
|
|
{
|
|
ClearErrorState();
|
|
if (!SysId.IsValid(transactionId)) return false;
|
|
List<String> filters = new List<String>();
|
|
// Build query filter:
|
|
filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Requirement_TransId) + "=" + transactionId.ToString());
|
|
if (requirementStatusCat == SbmRequirement.StatusCat.NotCancelled)
|
|
filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Requirement_Status) + "<>'" + SaStatus.Cancelled + "'");
|
|
else if (requirementStatusCat > 0)
|
|
filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Requirement_StatusCat) + "='" + RequirementStatusCats.GetCodeForType(requirementStatusCat) + "'");
|
|
// Get row count for these criteria:
|
|
return db.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement), filters.Concat(" AND ", "(", ")")) > 0;
|
|
}
|
|
public override bool TransactionHasConstituents(SysId transactionId, SbmConstituent.StatusCat transactionStatusCat)
|
|
{
|
|
ClearErrorState();
|
|
if (!SysId.IsValid(transactionId)) return false;
|
|
List<String> filters = new List<String>();
|
|
filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Constituent_TransId) + "=" + transactionId.ToString());
|
|
if (transactionStatusCat > 0)
|
|
filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Constituent_StatusCat) + "='" + SbmSystem.GetCodesOfType(UserContext, Sbm.SystemCode.ConstituentStatusCat/*, transactionStatusCat*/) + "'");
|
|
return db.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Constituent), filters.Concat(" AND ", "(", ")")) > 0;
|
|
}
|
|
public override bool TransactionHasContainerItems(SysId transactionId)
|
|
{
|
|
ClearErrorState();
|
|
if (!SysId.IsValid(transactionId)) return false;
|
|
|
|
// Check whether this transaction is the container item itself (unlikely) or the 'source' item.
|
|
String filterItem = SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.ContainerItem_ItemType) + "=" + ((int)Sbm.ItemType.Transaction).ToString() + " AND " + SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.ContainerItem_ItemId) + "=" + transactionId.ToString();
|
|
String filterSource = SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.ContainerItem_ItemTypeSource) + "=" + ((int)Sbm.ItemType.Transaction).ToString() + " AND " + SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.ContainerItem_ItemIdSource) + "=" + transactionId.ToString();
|
|
List<String> filters = new List<String>();
|
|
filters.Add("(" + filterItem + ") OR (" + filterSource + ")");
|
|
return db.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ContainerItem), filters.Concat(" AND ", "(", ")")) > 0;
|
|
}
|
|
public override bool TransactionHasStockMovements(SysId transactionId)
|
|
{
|
|
ClearErrorState();
|
|
if (!SysId.IsValid(transactionId)) return false;
|
|
|
|
// Check whether this transaction is the movement item itself (unlikely) or the 'source' item.
|
|
String filterItem = SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Movement_ItemType) + "=" + ((int)Sbm.ItemType.Transaction).ToString() + " AND " + SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Movement_ItemId) + "=" + transactionId.ToString();
|
|
String filterSource = SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Movement_ItemTypeSource) + "=" + ((int)Sbm.ItemType.Transaction).ToString() + " AND " + SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Movement_ItemIdSource) + "=" + transactionId.ToString();
|
|
List<String> filters = new List<String>();
|
|
filters.Add("(" + filterItem + ") OR (" + filterSource + ")");
|
|
return db.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Movement), filters.Concat(" AND ", "(", ")")) > 0;
|
|
}
|
|
public override bool TransactionHasPendingStockMovements(SysId transactionId)
|
|
{
|
|
ClearErrorState();
|
|
if (!SysId.IsValid(transactionId)) return false;
|
|
|
|
// Check whether this transaction is the movement item itself (unlikely) or the 'source' item:
|
|
String filterItem = SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Movement_ItemType) + "=" + ((int)Sbm.ItemType.Transaction).ToString() + " AND " + SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Movement_ItemId) + "=" + transactionId.ToString();
|
|
|
|
// Source item can either be the transaction itself or any one of its requirements:
|
|
String filterSourceTrans = SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Movement_ItemTypeSource) + "=" + ((int)Sbm.ItemType.Transaction).ToString() + " AND " + SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Movement_ItemIdSource) + "=" + transactionId.ToString();
|
|
String aliasTransaction_Reqnt = "TraReq";
|
|
DbQuery qryReqnt = new DbQuery(db.DbmsType);
|
|
qryReqnt.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement), aliasTransaction_Reqnt);
|
|
qryReqnt.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_Id, aliasTransaction_Reqnt, false));
|
|
qryReqnt.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_TransId, aliasTransaction_Reqnt, false) + "=" + transactionId.ToString());
|
|
String filterSourceReqnt = SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Movement_ItemTypeSource) + "=" + Sbm.ItemType.Requirement.ToString() + " AND " + SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Movement_ItemIdSource) + " IN (" + qryReqnt.BuildQuery() + ")";
|
|
String filterSource = "(" + filterSourceTrans + ") OR (" + filterSourceReqnt + ")";
|
|
|
|
List<String> filters = new List<String>();
|
|
filters.Add("(" + filterItem + ") OR (" + filterSource + ")");
|
|
filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Movement_Status) + "='" + SaStatus.Awaiting + "'");
|
|
return db.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Movement), filters.Concat(" AND ", "(", ")")) > 0;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Get Transaction.
|
|
public override SbmTransaction GetTransaction(SbmTransaction.Params prm)
|
|
{
|
|
return GetTransaction(GetTransactionQueryFilter(prm).Concat(" AND ", "(", ")"));
|
|
}
|
|
private SbmTransaction GetTransaction(String filter)
|
|
{
|
|
ClearErrorState();
|
|
long count = GetTransactionCount(filter);
|
|
if (count == 0) return null;
|
|
if (count != 1)
|
|
{
|
|
SetErrorState("Multiple Transactions found");
|
|
return null;
|
|
}
|
|
SbmTransaction prmTransaction = null;
|
|
// Query data.
|
|
using (var dbConnection = db.CreateConnection())
|
|
using (var dbCommand = dbConnection.CreateCommand())
|
|
{
|
|
try
|
|
{
|
|
dbConnection.Open();
|
|
Transaction_Db dbTransaction = new Transaction_Db(DbInfo);
|
|
dbTransaction.PopulateFrom(dbCommand, aliasTransaction, filter);
|
|
prmTransaction = CreateTransaction(dbTransaction);
|
|
}
|
|
catch (Exception exc)
|
|
{
|
|
SetErrorState("Database query errorState");
|
|
SaLogger.Warn(GetType().Name + ".GetTransaction\n\tQuery: " + dbCommand.CommandText + "\n\tErrorState: " + exc.Message);
|
|
}
|
|
}
|
|
return prmTransaction;
|
|
}
|
|
|
|
public override List<SysId> GetRequirementByIds(SbmTransaction.Params prmTrans)
|
|
{
|
|
ClearErrorState();
|
|
List<SysId> ids = new List<SysId>();
|
|
String dataName_ReqntId = "ReqntId";
|
|
DbQuery qryReqntTrans = new DbQuery(db.DbmsType);
|
|
qryReqntTrans.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction));
|
|
qryReqntTrans.Columns.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Requirement_Id), dataName_ReqntId);
|
|
DbQueryJoin joinReqntTrans = new DbQueryJoin(DbJoinType.Inner);
|
|
joinReqntTrans.Table = SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement);
|
|
joinReqntTrans.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_TransId) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id));
|
|
qryReqntTrans.Joins.Add(joinReqntTrans);
|
|
qryReqntTrans.Filters.AddRange(GetTransactionQueryFilter(prmTrans));
|
|
|
|
using (DbResultSet dbResultSet = DbResultSet_DataReader.ExecuteQuery(db, qryReqntTrans.BuildQuery()))
|
|
{
|
|
while (dbResultSet != null && dbResultSet.NextRecord())
|
|
{
|
|
NamedValue.Map values = dbResultSet.GetRecordValues();
|
|
ids.Add(new SysId((int)values.GetValue(dataName_ReqntId).AsLong()));
|
|
}
|
|
}
|
|
return ids;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Create Transaction.
|
|
public override SbmTransaction CreateTransaction(SysId assocId, Sbm.TransactionType transactionType)
|
|
{
|
|
ClearErrorState();
|
|
if (!SysId.IsValid(assocId))
|
|
{
|
|
SetErrorState("Association not supplied");
|
|
return null;
|
|
}
|
|
if ((int)transactionType < 1)
|
|
{
|
|
SetErrorState("Transaction type not identified");
|
|
return null;
|
|
}
|
|
return new SbmTransaction_Dbas(Internals, new SysId(), AffiliateId_Owner, assocId, transactionType, 0);
|
|
}
|
|
private SbmTransaction_Dbas CreateTransaction(Transaction_Db dbTransaction)
|
|
{
|
|
ClearErrorState();
|
|
SbmTransaction_Dbas transaction = new SbmTransaction_Dbas(Internals, new SysId(dbTransaction._Id), new SysId(dbTransaction._AffIdOwner), 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)
|
|
{
|
|
String fn = GetType().Name + ".InsertTransaction";
|
|
ClearErrorState();
|
|
if (!IsValidTransaction(transaction)) return false;
|
|
if (SysId.IsValid(transaction.Id)) return SetErrorState(ErrorMessage.ValiditemId);
|
|
using (var dbConnection = db.CreateConnection())
|
|
using (var dbCommand = dbConnection.CreateCommand())
|
|
{
|
|
try
|
|
{
|
|
dbConnection.Open();
|
|
Transaction_Db dbTransaction = new Transaction_Db(DbInfo);
|
|
PopulateTo(dbTransaction, transaction, dbUpdateInfo);
|
|
if (Transaction_Db.FieldsNonId.Contains("Id"))
|
|
{
|
|
// Generate next Id.
|
|
dbTransaction._Id = SysId.ToInt(db.GetNextId("Transaction", dbUpdateInfo));
|
|
}
|
|
dbTransaction.ExecuteInsertCommand(dbCommand);
|
|
transaction.Id = new SysId(dbTransaction._Id);
|
|
transaction.Changed = false;
|
|
if (DebugMode) SaLogger.Debug(fn + " Inserted. " + GetLogProperties(transaction).Concat(": ").Concat("", "\n\t"));
|
|
}
|
|
catch (Exception exc) { SetErrorState(exc.Message); }
|
|
}
|
|
return !HasErrorState();
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Update Transaction.
|
|
public override bool UpdateTransaction(SbmTransaction transaction, DbUpdateInfo dbUpdateInfo)
|
|
{
|
|
String fn = GetType().Name + ".UpdateTransaction";
|
|
ClearErrorState();
|
|
if (!IsValidTransaction(transaction)) return false;
|
|
if (!SysId.IsValid(transaction.Id)) return SetErrorState(ErrorMessage.InvalidItemId);
|
|
if (!transaction.Changed)
|
|
{
|
|
if (DebugMode) SaLogger.Debug(fn + " Data not changed. " + GetLogProperties(transaction).Concat(": ").Concat("", "\n\t"));
|
|
return true;
|
|
}
|
|
using (var dbConnection = db.CreateConnection())
|
|
using (var dbCommand = dbConnection.CreateCommand())
|
|
{
|
|
try
|
|
{
|
|
// Retrieve Transaction.
|
|
dbConnection.Open();
|
|
Transaction_Db dbTransaction = new Transaction_Db(DbInfo);
|
|
dbTransaction.PopulateFrom(dbCommand, aliasTransaction, "Id=" + SysId.ToString(transaction.Id));
|
|
SbmUpdateLogItemMonitor_Transaction updateLogMonitor = new SbmUpdateLogItemMonitor_Transaction(Internals, CreateTransaction(dbTransaction));
|
|
|
|
// Update properties.
|
|
PopulateTo(dbTransaction, transaction, dbUpdateInfo);
|
|
dbTransaction.ExecuteUpdateCommand(dbCommand);
|
|
transaction.Changed = false;
|
|
if (DebugMode) SaLogger.Debug(fn + " Updated. " + GetLogProperties(transaction).Concat(": ").Concat("", "\n\t"));
|
|
|
|
// Record updates.
|
|
updateLogMonitor.RecordUpdatedValues(transaction);
|
|
updateLogMonitor.LogUpdates();
|
|
}
|
|
catch (Exception exc) { SetErrorState(exc.Message); }
|
|
}
|
|
return !HasErrorState();
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Delete Transaction.
|
|
public override bool TransactionCanBeDeleted(SbmTransaction transaction)
|
|
{
|
|
ClearErrorState();
|
|
if (!base.TransactionCanBeDeleted(transaction)) return false;
|
|
|
|
if (transaction == null) return SetErrorState("item not specified");
|
|
|
|
// Associated transactions.
|
|
if (transaction.IsReferencedByOtherTransactions()) return SetErrorState("linked transactions are present");
|
|
|
|
// Requirements.
|
|
int requirementCount = (int)transaction.GetRequirementCount();
|
|
if (requirementCount > 0 && (ConfigConsole == null || !ConfigConsole.CanRemoveTransactionWithRequirements(UserContext, transaction, requirementCount)))
|
|
{
|
|
if (requirementCount == 1) return SetErrorState("item has a requirement");
|
|
else return SetErrorState("item has multiple requirements");
|
|
}
|
|
if (transaction.HasConstituents()) return SetErrorState("item has constituents");
|
|
|
|
// Transaction status.
|
|
if (transaction.Status == SaStatus.Completed) return SetErrorState("transaction has been completed");
|
|
if (transaction.Status != SaStatus.Cancelled) return SetErrorState("transaction has not been cancelled");
|
|
|
|
// Stock movements.
|
|
if (transaction.HasContainerItems()) return SetErrorState("item is references by containers");
|
|
if (transaction.HasStockMovements()) return SetErrorState("item is referenced by stock movements");
|
|
if (StockMgr != null && StockMgr.SourceItemHasMovements(Sbm.ItemType.Transaction, transaction.Id))
|
|
return SetErrorState("item has stock movements");
|
|
|
|
// Diary links.
|
|
if (transaction.HasDiaryLinks()) return SetErrorState("item has diary links");
|
|
|
|
return true;
|
|
}
|
|
public override bool DeleteTransaction(SbmTransaction transaction, DbUpdateInfo dbUpdateInfo)
|
|
{
|
|
String fn = GetType().Name + ".DeleteTransaction";
|
|
ClearErrorState();
|
|
if (!TransactionCanBeDeleted(transaction)) return false;
|
|
using (var dbConnection = db.CreateConnection())
|
|
using (var dbCommand = dbConnection.CreateCommand())
|
|
{
|
|
try
|
|
{
|
|
// Retrieve prmTransaction.
|
|
dbConnection.Open();
|
|
Transaction_Db dbTransaction = new Transaction_Db(DbInfo);
|
|
dbTransaction.PopulateFrom(dbCommand, aliasTransaction, "Id=" + transaction.Id.ToString());
|
|
// Delete prmTransaction.
|
|
dbCommand.CommandType = System.Data.CommandType.Text;
|
|
dbCommand.CommandText = "DELETE FROM " + SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction) + " WHERE Id=" + SysId.ToString(transaction.Id) + ";";
|
|
dbCommand.ExecuteNonQuery();
|
|
transaction.Changed = false;
|
|
if (DebugMode) SaLogger.Debug(fn + " Deleted. " + GetLogProperties(transaction).Concat(": ").Concat("", "\n\t"));
|
|
}
|
|
catch (Exception exc) { SetErrorState(exc.Message); }
|
|
}
|
|
return !HasErrorState();
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Copy data properties to and from database.
|
|
private void PopulateTo(Transaction_Db dbTransaction, SbmTransaction transaction, DbUpdateInfo dbUpdateInfo)
|
|
{
|
|
dbTransaction._Id = transaction.Id.ToInt();
|
|
dbTransaction._AffIdOwner = SysId.ToInt(transaction.AffiliateIdOwner);
|
|
dbTransaction._AssocId = SysId.ToInt(transaction.AssociationId);
|
|
dbTransaction._Type = (short)transaction.TransactionType;
|
|
dbTransaction._Ref = transaction.Ref;
|
|
dbTransaction._RefInt = transaction.RefInt;
|
|
dbTransaction._RefExt = transaction.RefExt;
|
|
dbTransaction._RaisedBy = transaction.RaisedBy;
|
|
dbTransaction._AffIdRaise = SysId.ToInt(transaction.AffiliateIdRaise);
|
|
dbTransaction._AssocIdOffice = SysId.ToInt(transaction.AssociationIdOffice);
|
|
dbTransaction._ContactName = transaction.ContactName;
|
|
dbTransaction._Likelihood = transaction.Likelihood;
|
|
dbTransaction._TransIdSource = SysId.ToInt(transaction.TransactionIdSource);
|
|
dbTransaction._ReferCode = transaction.ReferCode;
|
|
dbTransaction._ReferSource = transaction.ReferSource;
|
|
dbTransaction._AffIdRefer = SysId.ToInt(transaction.AffiliateIdRefer);
|
|
dbTransaction._AssocIdContract = SysId.ToInt(transaction.AssociationIdContract);
|
|
dbTransaction._AssIdDeliver = SysId.ToInt(transaction.AssociationIdDelivery);
|
|
dbTransaction._Raised = transaction.Raised;
|
|
dbTransaction._Required = transaction.Required;
|
|
dbTransaction._InProgress = transaction.InProgress;
|
|
dbTransaction._DeliveredEst = transaction.DeliveredEst;
|
|
dbTransaction._DeliveredAct = transaction.DeliveredAct;
|
|
dbTransaction._Closed = transaction.Closed;
|
|
dbTransaction._Department = transaction.Department;
|
|
dbTransaction._DescBrief = transaction.DescBrief;
|
|
dbTransaction._DescIntro = transaction.DescIntro;
|
|
dbTransaction._DescOutline = transaction.DescOutline;
|
|
dbTransaction._DescDetail = transaction.DescDetail;
|
|
dbTransaction._ResponseCode = transaction.ResponseCode;
|
|
dbTransaction._ContactAreaCode = transaction.ContactAreaCode;
|
|
dbTransaction._Postcode = transaction.Postcode;
|
|
dbTransaction._CurrencyId = transaction.CurrencyId.ToInt();
|
|
dbTransaction._TaxCodeId = transaction.TaxCodeId.ToInt();
|
|
dbTransaction._AmountEst = transaction.AmountEst;
|
|
dbTransaction._AmountMax = transaction.AmountMax;
|
|
dbTransaction._AmountNet = transaction.AmountNet;
|
|
dbTransaction._AmountTax = transaction.AmountTax;
|
|
dbTransaction._AmountTot = transaction.AmountTot;
|
|
dbTransaction._TimeEst = transaction.TimeEst;
|
|
dbTransaction._TimeAct = transaction.TimeAct;
|
|
dbTransaction._TimeTot = transaction.TimeTot;
|
|
dbTransaction._LocationIdStock = SysId.ToInt(transaction.LocationIdStock);
|
|
dbTransaction._Weight = transaction.Weight;
|
|
dbTransaction._UomIdWeight = SysId.ToInt(transaction.UomIdWeight);
|
|
dbTransaction._BoxCount = transaction.BoxCount;
|
|
dbTransaction._DeliveryStatusCode = transaction.DeliveryStatusCode;
|
|
dbTransaction._DeliveryTypeCode = transaction.DeliveryTypeCode;
|
|
dbTransaction._DeliveryMethodCode = transaction.DeliveryMethodCode;
|
|
dbTransaction._DeliveryCourierCode = transaction.DeliveryCourierCode;
|
|
dbTransaction._DeliveryBookInCode = transaction.DeliveryBookInCode;
|
|
dbTransaction._StockPickerCode = transaction.StockPickerCode;
|
|
dbTransaction._DeliveryRef = transaction.DeliveryRef;
|
|
dbTransaction._DeliveryComment = transaction.DeliveryComment;
|
|
dbTransaction._DeliveryAmountNet = transaction.DeliveryAmountNet;
|
|
dbTransaction._TaxCodeIdDelivery = SysId.ToInt(transaction.TaxCodeIdDelivery);
|
|
dbTransaction._DeliveryAmountTax = transaction.DeliveryAmountTax;
|
|
dbTransaction._DeliveryAmountTot = transaction.DeliveryAmountTot;
|
|
dbTransaction._DeliveryDepartment = transaction.DeliveryDepartment;
|
|
dbTransaction._DeliveryNominalCode = transaction.DeliveryNominalCode;
|
|
// Common properties.
|
|
dbTransaction._Notes = transaction.Notes;
|
|
dbTransaction._StatusCat = TransactionStatusCats.GetCodeForType(transaction.TransactionStatusCat);
|
|
dbTransaction._Status = SacsSystem.GetStatusCode(transaction.Status);
|
|
dbTransaction._Flags = (short)transaction.Flags;
|
|
if (!SysId.IsValid(transaction.Id))
|
|
{
|
|
dbTransaction._CreateOn = DateTime.UtcNow;
|
|
dbTransaction._CreateBy = dbUpdateInfo.UserId.ToInt();
|
|
dbTransaction._CreateHost = dbUpdateInfo.Host;
|
|
}
|
|
dbTransaction._UpdateOn = DateTime.UtcNow;
|
|
dbTransaction._UpdateBy = dbUpdateInfo.UserId.ToInt();
|
|
dbTransaction._UpdateHost = dbUpdateInfo.Host;
|
|
}
|
|
private void PopulateFrom(Transaction_Db dbTransaction, SbmTransaction transaction)
|
|
{
|
|
//transaction.Id = new SysId(dbTransaction._Id);
|
|
transaction.AffiliateIdOwner = new SysId(dbTransaction._AffIdOwner);
|
|
transaction.AssociationId = new SysId(dbTransaction._AssocId);
|
|
transaction.TransactionType = (Sbm.TransactionType)dbTransaction._Type;
|
|
transaction.Ref = dbTransaction._Ref;
|
|
transaction.RefInt = dbTransaction._RefInt;
|
|
transaction.RefExt = dbTransaction._RefExt;
|
|
transaction.RaisedBy = dbTransaction._RaisedBy;
|
|
transaction.AffiliateIdRaise = new SysId(dbTransaction._AffIdRaise);
|
|
transaction.AssociationIdOffice = new SysId(dbTransaction._AssocIdOffice);
|
|
transaction.ContactName = dbTransaction._ContactName;
|
|
transaction.Likelihood = dbTransaction._Likelihood;
|
|
transaction.TransactionIdSource = new SysId(dbTransaction._TransIdSource);
|
|
transaction.ReferCode = dbTransaction._ReferCode;
|
|
transaction.ReferSource = dbTransaction._ReferSource;
|
|
transaction.AffiliateIdRefer = new SysId(dbTransaction._AffIdRefer);
|
|
transaction.AssociationIdContract = new SysId(dbTransaction._AssocIdContract);
|
|
transaction.AssociationIdDelivery = new SysId(dbTransaction._AssIdDeliver);
|
|
transaction.Raised = dbTransaction._Raised;
|
|
transaction.Required = dbTransaction._Required;
|
|
transaction.InProgress = dbTransaction._InProgress;
|
|
transaction.DeliveredEst = dbTransaction._DeliveredEst;
|
|
transaction.DeliveredAct = dbTransaction._DeliveredAct;
|
|
transaction.Closed = dbTransaction._Closed;
|
|
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);
|
|
transaction.TaxCodeId = new SysId(dbTransaction._TaxCodeId);
|
|
transaction.AmountEst = dbTransaction._AmountEst;
|
|
transaction.AmountMax = dbTransaction._AmountMax;
|
|
transaction.AmountNet = dbTransaction._AmountNet;
|
|
transaction.AmountTax = dbTransaction._AmountTax;
|
|
transaction.AmountTot = dbTransaction._AmountTot;
|
|
transaction.TimeEst = dbTransaction._TimeEst;
|
|
transaction.TimeAct = dbTransaction._TimeAct;
|
|
transaction.TimeTot = dbTransaction._TimeTot;
|
|
transaction.LocationIdStock = new SysId(dbTransaction._LocationIdStock);
|
|
transaction.Weight = dbTransaction._Weight;
|
|
transaction.UomIdWeight = new SysId(dbTransaction._UomIdWeight);
|
|
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;
|
|
transaction.TaxCodeIdDelivery = new SysId(dbTransaction._TaxCodeIdDelivery);
|
|
transaction.DeliveryAmountTax = dbTransaction._DeliveryAmountTax;
|
|
transaction.DeliveryAmountTot = dbTransaction._DeliveryAmountTot;
|
|
transaction.DeliveryDepartment = dbTransaction._DeliveryDepartment;
|
|
transaction.DeliveryNominalCode = dbTransaction._DeliveryNominalCode;
|
|
// Common properties.
|
|
transaction.Notes = dbTransaction._Notes;
|
|
transaction.Status = SacsSystem.GetStatusForCode(dbTransaction._Status);
|
|
transaction.SetCreateStamp(dbTransaction._CreateOn, new SysId(dbTransaction._CreateBy), dbTransaction._CreateHost);
|
|
transaction.SetUpdateStamp(dbTransaction._UpdateOn, new SysId(dbTransaction._UpdateBy), dbTransaction._UpdateHost);
|
|
transaction.AcceptChanges();
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Table and column aliases.
|
|
private static readonly String aliasTransaction = "aTrn";
|
|
private static readonly String aliasTransaction_Association = "TrnAss";
|
|
private static readonly String prefixTransaction_Association = "TrnAss_";
|
|
private static readonly String aliasTransaction_AffiliateOwner = "TrnAffOwn";
|
|
private static readonly String prefixTransaction_AffiliateOwner = "TrnAffOwn_";
|
|
private static readonly String aliasTransaction_AffiliateTarget = "TrnAffTgt";
|
|
private static readonly String prefixTransaction_AffiliateTarget = "TrnAffTgt_";
|
|
private static readonly String aliasTransaction_AddressTarget = "TrnTgtAdd";
|
|
private static readonly String prefixTransaction_AddressTarget = "TrnTgtAdd_";
|
|
private static readonly String aliasTransaction_DeliveryAddress = "TrnDelAdd";
|
|
private static readonly String prefixTransaction_DeliveryAddress = "TrnDelAdd_";
|
|
private static readonly String aliasTransaction_Currency = "TrnCur";
|
|
private static readonly String prefixTransaction_Currency = "TrnCur_";
|
|
private static readonly String aliasTransaction_DeliveryTaxcode = "TrnDelTxc";
|
|
private static readonly String prefixTransaction_DeliveryTaxcode = "TrnDelTxc_";
|
|
private static readonly String aliasTransaction_SourceTransaction = "TrnSrcTrn";
|
|
private static readonly String prefixTransaction_SourceTransaction = "TrnSrcTrn_";
|
|
|
|
//-------------------------------------------------------------------
|
|
// Setting Transaction column definitions.
|
|
private void SetTransactionColDfn
|
|
(ColumnDfn col, String caption, int width, SbmDbDfn.ColumnIdx dbCol,
|
|
ColumnAlignment align = ColumnAlignment.Default, DataValue.DataType dataType = DataValue.DataType.String,
|
|
String alias = "", String prefix = "")
|
|
{
|
|
if (String.IsNullOrEmpty(alias) && SbmDbDfn.GetTableForColumn(dbCol) == SbmDbDfn.TableIdx.Transaction)
|
|
alias = aliasTransaction;
|
|
col.Set(caption, width, (int)dbCol, prefix + SbmDbDfn.GetColumnName(dbCol, false), SbmDbDfn.GetColumnNameQual(dbCol, alias), dataType, align);
|
|
if (dataType == DataValue.DataType.String && dbCol != SbmDbDfn.ColumnIdx.Unknown)
|
|
col.MaxLength = (int)SbmDbDfn.GetColTextLen(dbCol);
|
|
}
|
|
//-------------------------------------------------------------------
|
|
// Getting Transaction column definition.
|
|
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";
|
|
|
|
public override ColumnDfn GetTransactionColumnDfn(SbmTransaction.Column column, string caption = "", int width = 0)
|
|
{
|
|
bool canViewFinancials = UserContext.SecurityProfile.Financial.CanViewFinancials;
|
|
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 (canViewFinancials)
|
|
SetTransactionColDfn(columnDfn, "Delivery net amount", 90, SbmDbDfn.ColumnIdx.Transaction_DeliveryAmountNet, ColumnAlignment.Center, DataValue.DataType.Double);
|
|
break;
|
|
case SbmTransaction.Column.DeliveryAmountNet_Fmt:
|
|
if (canViewFinancials)
|
|
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 (canViewFinancials)
|
|
SetTransactionColDfn(columnDfn, "Delivery tax amount", 90, SbmDbDfn.ColumnIdx.Transaction_DeliveryAmountTax, ColumnAlignment.Right, DataValue.DataType.Double);
|
|
break;
|
|
case SbmTransaction.Column.DeliveryAmountTax_Fmt:
|
|
if (canViewFinancials)
|
|
SetTransactionColDfn(columnDfn, "Delivery tax amount", 90, SbmDbDfn.ColumnIdx.Transaction_DeliveryAmountTax, ColumnAlignment.Right, DataValue.DataType.String);
|
|
break;
|
|
case SbmTransaction.Column.DeliveryAmountTot:
|
|
if (canViewFinancials)
|
|
SetTransactionColDfn(columnDfn, "Delivery total amount", 90, SbmDbDfn.ColumnIdx.Transaction_DeliveryAmountTot, ColumnAlignment.Right, DataValue.DataType.Double);
|
|
break;
|
|
case SbmTransaction.Column.DeliveryAmountTot_Fmt:
|
|
if (canViewFinancials)
|
|
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 (canViewFinancials)
|
|
{
|
|
SetTransactionColDfn(columnDfn, "Amount(est)", 75, SbmDbDfn.ColumnIdx.Transaction_AmountEst, ColumnAlignment.Right, DataValue.DataType.Double);
|
|
}
|
|
break;
|
|
case SbmTransaction.Column.AmountEst_Fmt:
|
|
if (canViewFinancials)
|
|
{
|
|
SetTransactionColDfn(columnDfn, "Amount(est)", 80, SbmDbDfn.ColumnIdx.Transaction_AmountEst, ColumnAlignment.Right, DataValue.DataType.String);
|
|
}
|
|
break;
|
|
case SbmTransaction.Column.AmountMax:
|
|
if (canViewFinancials)
|
|
{
|
|
SetTransactionColDfn(columnDfn, "Amount(max)", 75, SbmDbDfn.ColumnIdx.Transaction_AmountMax, ColumnAlignment.Right, DataValue.DataType.Double);
|
|
}
|
|
break;
|
|
case SbmTransaction.Column.AmountMax_Fmt:
|
|
if (canViewFinancials)
|
|
{
|
|
SetTransactionColDfn(columnDfn, "Amount(max)", 80, SbmDbDfn.ColumnIdx.Transaction_AmountMax, ColumnAlignment.Right, DataValue.DataType.String);
|
|
}
|
|
break;
|
|
case SbmTransaction.Column.AmountNet:
|
|
if (canViewFinancials)
|
|
{
|
|
SetTransactionColDfn(columnDfn, "Net", 60, SbmDbDfn.ColumnIdx.Transaction_AmountNet, ColumnAlignment.Right, DataValue.DataType.Double);
|
|
}
|
|
break;
|
|
case SbmTransaction.Column.AmountNet_Fmt:
|
|
if (canViewFinancials)
|
|
{
|
|
SetTransactionColDfn(columnDfn, "Net", 80, SbmDbDfn.ColumnIdx.Transaction_AmountNet, ColumnAlignment.Right, DataValue.DataType.String);
|
|
}
|
|
break;
|
|
case SbmTransaction.Column.AmountTax:
|
|
if (canViewFinancials)
|
|
{
|
|
SetTransactionColDfn(columnDfn, "Tax", 60, SbmDbDfn.ColumnIdx.Transaction_AmountTax, ColumnAlignment.Right, DataValue.DataType.Double);
|
|
}
|
|
break;
|
|
case SbmTransaction.Column.AmountTax_Fmt:
|
|
if (canViewFinancials)
|
|
{
|
|
SetTransactionColDfn(columnDfn, "Tax", 80, SbmDbDfn.ColumnIdx.Transaction_AmountTax, ColumnAlignment.Right, DataValue.DataType.String);
|
|
}
|
|
break;
|
|
case SbmTransaction.Column.AmountTot:
|
|
if (canViewFinancials)
|
|
{
|
|
SetTransactionColDfn(columnDfn, "Total", 60, SbmDbDfn.ColumnIdx.Transaction_AmountTot, ColumnAlignment.Right, DataValue.DataType.Double);
|
|
}
|
|
break;
|
|
case SbmTransaction.Column.AmountTot_Fmt:
|
|
if (canViewFinancials)
|
|
{
|
|
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 (canViewFinancials)
|
|
{
|
|
SetTransactionColDfn(columnDfn, "Total cost", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double);
|
|
columnDfn.DataName = colNameCostTotal;
|
|
}
|
|
break;
|
|
case SbmTransaction.Column.CostTotal_Fmt:
|
|
if (canViewFinancials)
|
|
SetTransactionColDfn(columnDfn, "Total cost", 90, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right);
|
|
break;
|
|
case SbmTransaction.Column.AmountMargin:
|
|
if (canViewFinancials)
|
|
{
|
|
SetTransactionColDfn(columnDfn, "Margin", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double);
|
|
columnDfn.ShowZeroValues = true;
|
|
}
|
|
break;
|
|
case SbmTransaction.Column.AmountMargin_Fmt:
|
|
if (canViewFinancials)
|
|
{
|
|
SetTransactionColDfn(columnDfn, "Margin", 90, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right);
|
|
columnDfn.ShowZeroValues = true;
|
|
}
|
|
break;
|
|
case SbmTransaction.Column.PercentMargin:
|
|
if (canViewFinancials)
|
|
{
|
|
SetTransactionColDfn(columnDfn, "% Margin", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double);
|
|
columnDfn.ShowZeroValues = true;
|
|
}
|
|
break;
|
|
case SbmTransaction.Column.PercentMargin_Fmt:
|
|
if (canViewFinancials)
|
|
{
|
|
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 = db != null ? db.DbmsType : DbmsType.General;
|
|
DbQuery qry = new DbQuery(dbmsType);
|
|
|
|
// Column names.
|
|
String colTransaction_Id = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, tableAlias);
|
|
String colTransaction_Type = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Type, tableAlias);
|
|
String colTransaction_StatusCat = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_StatusCat, tableAlias);
|
|
String colTransaction_Status = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Status, tableAlias);
|
|
|
|
//---------------------------------------------------------------
|
|
// Transaction Id.
|
|
if (prm.IncludedIds.HasValidIds())
|
|
filter.Add(colTransaction_Id + " IN (" + prm.IncludedIds.Concat(",") + ")");
|
|
if (prm.ExcludedIds.HasValidIds())
|
|
filter.Add(colTransaction_Id + " NOT IN (" + prm.ExcludedIds.Concat(",") + ")");
|
|
|
|
//---------------------------------------------------------------
|
|
// 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 (ConfigConsole != null && AllowTransactionType(Sbm.TransactionType.SalesDispatch) &&
|
|
(AllowTransactionType(Sbm.TransactionType.ProformaSalesInvoice) || AllowTransactionType(Sbm.TransactionType.SalesInvoice)))
|
|
checkForSecondaryRefs = true;
|
|
if (checkForSecondaryRefs)
|
|
{
|
|
// 1b. Transactions that reference a transaction that references the source transaction.
|
|
// Trans.TransIdSource -> Trans#2.Id -> Trans#2.TransIdSource -> TransIdSource
|
|
// Sub query to identify where the source transaction for this one has the target transaction as its source.
|
|
String tableAlias_TransSecondRef = "aTraRefSec";
|
|
DbQuery qrySecondRef = new DbQuery(dbmsType);
|
|
qrySecondRef.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction), tableAlias_TransSecondRef);
|
|
qrySecondRef.Columns.Add("1"); //colTransaction_Id
|
|
// Oct-2013 Referencing transactions must belong to the current 'Owner' & Nov-2013 But they surely must do if they reference another transaction that belongs to the 'owner'???
|
|
//qrySecondRef.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_AffIdOwner,sAliasTblTransSecondRef,false)+"="+pSesPro->SelectedOwner().ToString());
|
|
qrySecondRef.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, tableAlias_TransSecondRef, false) + "=" + colTransaction_Id);
|
|
qrySecondRef.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_TransIdSource, tableAlias_TransSecondRef, false) + "=" + prm.TransIdSource.ToString());
|
|
filtersSource.Add("Exists(" + qrySecondRef.BuildQuery() + ")");
|
|
}
|
|
// 2a. Transactions with a requirement that references one of the primary transaction's requirement:
|
|
// Trans.Id -> Reqnt#1.TransId -> Reqnt#1.ReqntIdSource -> Reqnt#2.Id -> Reqnt#2.TransId -> TransIdSource
|
|
// Feb2017 Cadix performance (10 secs down to <1)
|
|
// Trans.Id In
|
|
// (
|
|
// Select reqntRef.TransId
|
|
// From Requirement reqntSrc
|
|
// Inner Join Requirement reqntRef On reqntRef.ReqntIdSource=reqntSrc.Id
|
|
// Where reqntSrc.TransId=Trans.Id
|
|
// )
|
|
// Feb2017 Was:
|
|
// TransId In
|
|
// Select TransId From Reqnt Where ReqntIdSource In
|
|
// Select Id From Reqnt Where TransId = TransIdSource
|
|
{
|
|
DbQuery qryTransRef = new DbQuery(dbmsType);
|
|
// Feb2017 Cadix performance. Use '[Transaction].Id In()' rather than 'Exists ()' with filtering by transaction id within sub query.
|
|
// Start with requirements belonging to the source transaction:
|
|
String tableAlias_ReqntSrc = "aTrnReqSrc";
|
|
String tableAlias_ReqntRef = "aTrnReqRef";
|
|
qryTransRef.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement), tableAlias_ReqntSrc);
|
|
qryTransRef.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_TransId, tableAlias_ReqntRef, false));
|
|
qryTransRef.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_TransId, tableAlias_ReqntSrc, false) + "=" + prm.TransIdSource.ToString());
|
|
// Join to referencing requirements:
|
|
DbQueryJoin joinReqnt = new DbQueryJoin(DbJoinType.Inner);
|
|
String colRequirement_Id = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_Id, tableAlias_ReqntSrc, false);
|
|
String colRequirement_ReqntIdSource = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_ReqntIdSource, tableAlias_ReqntRef, false);
|
|
joinReqnt.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement), tableAlias_ReqntRef);
|
|
joinReqnt.Filters.Add(colRequirement_ReqntIdSource + "=" + colRequirement_Id);
|
|
//joinReqnt.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_TransId,sAliaSbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement)ntRef,false)+"="+colTransaction_Id);
|
|
qryTransRef.Joins.Add(joinReqnt);
|
|
// Construct sub query:
|
|
filtersSource.Add(colTransaction_Id + " In (" + qryTransRef.BuildQuery() + ")");
|
|
}
|
|
// 3a. Transactions with a requirement that is associated with one of the source transaction's requirements:
|
|
// Trans.Id -> Reqnt.TransId -> Reqnt.ReqntIdSource -> ReqntSrc.Id -> ReqntSrc.TransId -> TransIdSource
|
|
// Select tr.TransId
|
|
// From Reqnt ReqSrc Where ReqSrc.TransId = TransIdSource
|
|
// Inner Join ItemLink Where ItemTypeFrom+To=Requirement And ItemId From|To = ReqSrc.Id
|
|
// TransId In
|
|
// Select TransId From Reqnt Where ReqntIdSource In
|
|
if (db.TableExists(SbmDbDfn.TableIdx.ItemLink.ToString()) && UserContext.GetOwnerOption_AllowOption(Sbm.OrgOption_AllowOption.PurchaseItem_AssociatedSalesItems))
|
|
{
|
|
String tableAlias_RequirementSource = "taReqSrc";
|
|
DbQuery qryAssocReqnt = new DbQuery(dbmsType);
|
|
// Start with requirements belonging to the source transaction:
|
|
qryAssocReqnt.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement), tableAlias_RequirementSource);
|
|
qryAssocReqnt.Columns.Add("1");
|
|
qryAssocReqnt.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_TransId, tableAlias_RequirementSource, false) + "=" + prm.TransIdSource.ToString());
|
|
// Join to Item Link - Both items (From & To) are requirements and either can match the source requirement:
|
|
String tableAlias_ItemLink = "taItmLnk";
|
|
String colItemLink_ItemIdFrom = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemIdFrom, tableAlias_ItemLink, false);
|
|
String colItemLink_ItemIdTo = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemIdTo, tableAlias_ItemLink, false);
|
|
String colItemLink_Type = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_Type, tableAlias_ItemLink, false);
|
|
String colItemLink_ItemTypeFrom = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemTypeFrom, tableAlias_ItemLink, false);
|
|
String colItemLink_ItemTypeTo = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemTypeTo, tableAlias_ItemLink, false);
|
|
String colRequirementSrc_Id = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_Id, tableAlias_RequirementSource, false);
|
|
DbQueryJoin joinItmLnk = new DbQueryJoin(DbJoinType.Inner);
|
|
joinItmLnk.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ItemLink), tableAlias_ItemLink);
|
|
joinItmLnk.Filters.Add(colItemLink_Type + "=" + Sbm.ItemLinkType.Requirement_AssociatedItem);
|
|
joinItmLnk.Filters.Add(colItemLink_ItemTypeFrom + "=" + Sbm.ItemType.Requirement);
|
|
joinItmLnk.Filters.Add(colItemLink_ItemTypeTo + "=" + Sbm.ItemType.Requirement);
|
|
// Jan2017 Combine Item Type and Id (for To/From combinations) in sub-clauses as these are indexed and significantly improve performance.
|
|
// Ref. BPE refreshing reference transactions on transaction view tab taking 16 seconds (down to <1).
|
|
// Was: joinItmLnk.Filters.Add(colItemLink_ItemIdFrom+"="+colRequirement_Id+" OR "+colItemLink_ItemIdTo+"="+colRequirement_Id);
|
|
List<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());
|
|
}
|
|
|
|
//---------------------------------------------------------------
|
|
// Transaction Type.
|
|
if (prm.TransactionType > 0)
|
|
filter.Add(colTransaction_Type + "=" + ((int)prm.TransactionType).ToString());
|
|
|
|
// Location Id Stock.
|
|
if (SysId.IsValid(prm.LocationIdStock))
|
|
filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_LocationIdStock, tableAlias) + "=" + SysId.ToString(prm.LocationIdStock));
|
|
|
|
// Transaction Status.
|
|
if (prm.StatusCat == SbmTransaction.StatusCat.NotDeleted)
|
|
filter.Add(colTransaction_Status + "<>'" + StatusDeleted + "'");
|
|
else if (prm.StatusCat == SbmTransaction.StatusCat.Completed)
|
|
filter.Add(colTransaction_Status + "='" + StatusCompleted + "'");
|
|
else if (prm.StatusCat == SbmTransaction.StatusCat.NotClosed)
|
|
filter.Add(colTransaction_StatusCat + "<>'" + TransactionStatusCats.GetCodeForType(SbmTransaction.StatusCat.Closed) + "'");
|
|
else if (prm.StatusCat == SbmTransaction.StatusCat.NotCancelled)
|
|
filter.Add(colTransaction_Status + "<>'" + StatusCancelled + "'");
|
|
else if (!StringUtil.IsEmpty(TransactionStatusCats.GetCodeForType(prm.StatusCat)))
|
|
filter.Add(colTransaction_StatusCat + "='" + TransactionStatusCats.GetCodeForType(prm.StatusCat) + "'");
|
|
|
|
// Restrict transactions to the current owner if required.
|
|
if (SysId.IsValid(AffiliateId_Owner))
|
|
{
|
|
// Only need to filter on owner if no association specified, no transaction Ids and no source transaction id.
|
|
if (!SysId.IsValid(prm.AssocId) && !prm.IncludedIds.HasValidIds() && !SysId.IsValid(prm.TransIdSource))
|
|
filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_AffIdOwner, tableAlias) + "=" + SysId.ToString(AffiliateId_Owner));
|
|
}
|
|
|
|
//---------------------------------------------------------------
|
|
// Transaction Reference.
|
|
String colTransaction_Ref = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Ref, tableAlias);
|
|
String colTransaction_RefInt = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_RefInt, tableAlias);
|
|
if (!StringUtil.IsEmpty(prm.TransRefFull))
|
|
{
|
|
String filterTransRef = colTransaction_Ref + "='" + DbQuery.FormatForCondition(prm.TransRefFull) + "'";
|
|
if (prm.TransRefFull.IsNumeric() && prm.TransRefFull.ToLong() >= 1)
|
|
filterTransRef += " OR " + colTransaction_RefInt + "=" + prm.TransRefFull;
|
|
filter.Add(filterTransRef);
|
|
}
|
|
else if (!StringUtil.IsEmpty(prm.TransRefPartial))
|
|
{
|
|
//String sFilter (DbQuery.FormatFn_Left(sColRef,prm.sTransRefPartial.Len())+"='"+sTransRefPartial+"'");
|
|
String filterTranRefPartial = colTransaction_Ref + " Like '%" + DbQuery.FormatForLike(prm.TransRefPartial) + "%'";
|
|
if (prm.TransRefPartial.IsNumeric() && prm.TransRefPartial.ToLong() >= 1)
|
|
filterTranRefPartial += " OR " + colTransaction_RefInt + "=" + prm.TransRefPartial;
|
|
filter.Add(filterTranRefPartial);
|
|
}
|
|
|
|
// Transaction External reference.
|
|
String colTransaction_RefExt = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_RefExt, tableAlias);
|
|
if (!StringUtil.IsEmpty(prm.TransRefExtFull))
|
|
filter.Add(colTransaction_RefExt + "='" + DbQuery.FormatForCondition(prm.TransRefExtFull) + "'");
|
|
else if (!StringUtil.IsEmpty(prm.TransRefExtPartial))
|
|
{
|
|
//filter.Add(DbQuery.FormatFn_Left(sColRefExt,prm.TransRefExtPartial.Len())+"='"+TransRefExtPartial+"'");
|
|
filter.Add(colTransaction_RefExt + " Like '%" + DbQuery.FormatForLike(prm.TransRefExtPartial) + "%'");
|
|
}
|
|
|
|
// Transaction DescBrief.
|
|
String sTransDescBrief = DbQuery.FormatForLike(prm.TransDescBriefPartial);
|
|
String colTransaction_DescBrief = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_DescBrief, tableAlias);
|
|
if (!StringUtil.IsEmpty(prm.TransDescBriefPartial))
|
|
//filter.Add(DbQuery.FormatFn_Left(sColDescBrief,prm.sTransDescBriefPartial.Len())+"='"+sTransDescBrief+"'");
|
|
filter.Add(colTransaction_DescBrief + " LIKE '%" + DbQuery.FormatForLike(prm.TransDescBriefPartial) + "%'");
|
|
|
|
//---------------------------------------------------------------
|
|
// Raised date.
|
|
if (DateUtil.IsValid(prm.RaisedFrom))
|
|
filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Raised, tableAlias) + ">=" + DbQuery.FormatDateForCondition(prm.RaisedFrom));
|
|
if (DateUtil.IsValid(prm.RaisedTo))
|
|
filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Raised, tableAlias) + "<" + DbQuery.FormatDateForCondition(prm.RaisedTo.AddDays(1)));
|
|
|
|
// Required date.
|
|
if (DateUtil.IsValid(prm.RequiredFrom))
|
|
filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Required, tableAlias) + ">=" + DbQuery.FormatDateForCondition(prm.RequiredFrom));
|
|
if (DateUtil.IsValid(prm.RequiredTo))
|
|
filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Required, tableAlias) + "<" + DbQuery.FormatDateForCondition(prm.RequiredTo.AddDays(1)));
|
|
|
|
// Closed date.
|
|
if (DateUtil.IsValid(prm.ClosedFrom))
|
|
filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Closed, tableAlias) + ">=" + DbQuery.FormatDateForCondition(prm.ClosedFrom));
|
|
if (DateUtil.IsValid(prm.ClosedTo))
|
|
filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Closed, tableAlias) + "<" + DbQuery.FormatDateForCondition(prm.ClosedTo.AddDays(1)));
|
|
|
|
//---------------------------------------------------------------
|
|
// Active dates.
|
|
if (DateUtil.IsValid(prm.ActiveOn) || DateUtil.IsValid(prm.ActiveFrom) || DateUtil.IsValid(prm.ActiveTo))
|
|
{
|
|
DateTime latestInProgress = DateTime.MinValue;
|
|
DateTime earliestClosed = DateTime.MinValue;
|
|
if (DateUtil.IsValid(prm.ActiveOn))
|
|
{
|
|
latestInProgress = prm.ActiveOn;
|
|
earliestClosed = prm.ActiveOn;
|
|
}
|
|
else if (DateUtil.IsValid(prm.ActiveFrom) && DateUtil.IsValid(prm.ActiveTo))
|
|
{
|
|
if (prm.ActiveFrom <= prm.ActiveTo)
|
|
{
|
|
// Active period has been specified - Determine whether to filter for active at any time during period or throughout.
|
|
if (prm.ActiveAnyDayDuringPeriod)
|
|
{
|
|
// Active any day during period: In progress before end of period and not closed before start.
|
|
latestInProgress = prm.ActiveTo;
|
|
earliestClosed = prm.ActiveFrom;
|
|
}
|
|
else
|
|
{
|
|
// Active throughout period: In progress by start of period and not closed by end of period.
|
|
latestInProgress = prm.ActiveFrom;
|
|
earliestClosed = prm.ActiveTo;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
#if _DEBUG
|
|
TRACE("### SapTransactionMgr_Odbc::GetQueryFilter Invalid combination of active dates: " + prm.ActiveFrom.ToString() + "-" + prm.ActiveTo.ToString() + ".\n");
|
|
#endif
|
|
}
|
|
}
|
|
else if (prm.ActiveFrom.IsValid())
|
|
{
|
|
// Active any day from the specified date:
|
|
earliestClosed = prm.ActiveFrom;
|
|
}
|
|
else if (prm.ActiveTo.IsValid())
|
|
{
|
|
// Active any day up to the specified date:
|
|
latestInProgress = prm.ActiveTo;
|
|
}
|
|
if (latestInProgress.IsValid() && earliestClosed.IsValid())
|
|
{
|
|
String colTransaction_InProgress = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_InProgress, tableAlias);
|
|
String colTransaction_Closed = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Closed, tableAlias);
|
|
List<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 Id.
|
|
String colTransaction_AssocId = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_AssocId, tableAlias);
|
|
if (SysId.IsValid(prm.AssocId))
|
|
filter.Add(colTransaction_AssocId + "=" + prm.AssocId.ToString());
|
|
|
|
// Association Target.
|
|
String assocFilter = DbQuery.FormatForCondition(prm.AssocPartial);
|
|
String defaultNominalCodeFull = DbQuery.FormatForCondition(prm.DefaultNominalCodeFull);
|
|
String defaultNominalCodePartial = DbQuery.FormatForLike(prm.DefaultNominalCodePartial);
|
|
String accountManagerCode = DbQuery.FormatForCondition(prm.AccountManagerCode);
|
|
String accountHandlerCode = DbQuery.FormatForCondition(prm.AccountHandlerCode);
|
|
if (!StringUtil.IsEmpty(assocFilter) || !StringUtil.IsEmpty(defaultNominalCodeFull) || !StringUtil.IsEmpty(defaultNominalCodePartial) || !StringUtil.IsEmpty(accountManagerCode) || !StringUtil.IsEmpty(accountHandlerCode))
|
|
{
|
|
String tableAlias_Association = "TraAssFlt";
|
|
String tableAlias_AssociationTarget = "TraAssTgtFlt";
|
|
String colAssociation_Id = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Id, tableAlias_Association, false);
|
|
DbQuery qryAssoc = new DbQuery(dbmsType);
|
|
qryAssoc.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Association), tableAlias_Association);
|
|
qryAssoc.Columns.Add(colAssociation_Id);
|
|
// Oct-2013 All associations that are targets of transactions must belong to the current 'Owner'.
|
|
qryAssoc.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_AffIdOwner, tableAlias_Association, false) + "=" + SysId.ToString(AffiliateId_Owner));
|
|
qryAssoc.Filters.Add(colAssociation_Id + "=" + colTransaction_AssocId);
|
|
// Are the target contact details required:
|
|
bool bRequireAffiliate = (!assocFilter.IsEmpty());
|
|
if (bRequireAffiliate)
|
|
{
|
|
qryAssoc.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Affiliate), tableAlias_AssociationTarget);
|
|
qryAssoc.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Id, tableAlias_AssociationTarget, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_AffIdTarget, tableAlias_Association, false));
|
|
}
|
|
// Affiliate Target name.
|
|
if (!StringUtil.IsEmpty(assocFilter))
|
|
{
|
|
// The association filter will match to either the association code or affiliate name:
|
|
String colAssociation_Code = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Code, tableAlias_Association, false);
|
|
String colAffiliate_Name = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Name, tableAlias_AssociationTarget, false);
|
|
List<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(GetType().Name + ".GetTransactionQueryFilter Including 'Archive' filter: " + filter.Concat(" AND ", "(", ")") + "");
|
|
}
|
|
//else if (DebugMode) SaLogger.Trace(GetType().Name + ".GetTransactionQueryFilter Excluding 'Archive' filter: " + filter.Concat(" AND ", "(", ")") + "");
|
|
|
|
//---------------------------------------------------------------
|
|
if (filter.Count < 1 && prm.IncludeDefaultFilter) filter.Add("1=1");
|
|
return filter;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// 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 db.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction) + " As " + aliasTransaction, filter);
|
|
}
|
|
public override long GetTransactionCount(SbmTransaction.Params prm)
|
|
{
|
|
ClearErrorState();
|
|
return GetTransactionCount(GetTransactionQueryFilter(prm).Concat(" AND ", "(", ")"));
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Item list.
|
|
public override List<SbmTransaction> GetTransactionList(SbmTransaction.Params prm)
|
|
{
|
|
List<SbmTransaction> Transactiones = new List<SbmTransaction>();
|
|
DbQuery qry = new DbQuery(db.DbmsType);
|
|
qry.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction), aliasTransaction);
|
|
Transaction_Db dbTransaction = new Transaction_Db(DbInfo);
|
|
qry.Columns.AddRange(dbTransaction.ExistingColumnNames);
|
|
qry.Filters.AddRange(GetTransactionQueryFilter(prm));
|
|
qry.OrderBy.AddRange(GetTransactionSortColumns(prm));
|
|
// Query data.
|
|
using (var dbConnection = db.CreateConnection())
|
|
using (var dbCommand = dbConnection.CreateCommand())
|
|
{
|
|
try
|
|
{
|
|
dbConnection.Open();
|
|
dbCommand.CommandText = qry.BuildQuery(prm.ResultsPaging);
|
|
using (DbDataReader dbDataReader = dbCommand.ExecuteReader())
|
|
{
|
|
while (dbDataReader.Read())
|
|
{
|
|
dbTransaction = new Transaction_Db(DbInfo);
|
|
dbTransaction.PopulateFrom(dbDataReader);
|
|
Transactiones.Add(CreateTransaction(dbTransaction));
|
|
}
|
|
}
|
|
}
|
|
catch (Exception exc)
|
|
{
|
|
SaLogger.Warn(GetType().Name + ".GetTransactionList\n\tQuery: " + dbCommand.CommandText + "\n\tErrorState: " + exc.Message);
|
|
}
|
|
}
|
|
return Transactiones;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Execute query.
|
|
public override DbResultSet ExecuteTransactionQuery(List<ColumnDfn> columns, SbmTransaction.Params prm)
|
|
{
|
|
ClearErrorState();
|
|
|
|
bool canViewFinancials = UserContext.SecurityProfile.Financial.CanViewFinancials;
|
|
//---------------------------------------------------------------------
|
|
// Construct build database query.
|
|
DbQuery query = new DbQuery(db.DbmsType);
|
|
query.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction), aliasTransaction);
|
|
|
|
//---------------------------------------------------------------------
|
|
// Transaction Properties - add columns as defined in query list.
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, aliasTransaction));
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Type, aliasTransaction));
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Ref, aliasTransaction));
|
|
if (columns.HasId((int)SbmTransaction.Column.RefExt)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_RefExt, aliasTransaction));
|
|
if (ColumnExists(SbmDbDfn.ColumnIdx.Transaction_ContactName) && columns.HasId((int)SbmTransaction.Column.ContactName))
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_ContactName, aliasTransaction));
|
|
if (columns.HasId((int)SbmTransaction.Column.Likelihood)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Likelihood, aliasTransaction));
|
|
if (columns.HasId((int)SbmTransaction.Column.RaisedOn)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Raised, aliasTransaction));
|
|
if (columns.HasId((int)SbmTransaction.Column.RequiredOn)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Required, aliasTransaction));
|
|
if (columns.HasId((int)SbmTransaction.Column.InProgressOn)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_InProgress, aliasTransaction));
|
|
if (columns.HasId((int)SbmTransaction.Column.ClosedOn)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Closed, aliasTransaction));
|
|
if (columns.HasId((int)SbmTransaction.Column.DescBrief)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_DescBrief, aliasTransaction));
|
|
if (columns.HasId((int)SbmTransaction.Column.ContactAreaCode) || columns.HasId((int)SbmTransaction.Column.ContactArea))
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_ContactAreaCode, aliasTransaction));
|
|
if (columns.HasId((int)SbmTransaction.Column.DeliveryStatusCode) || columns.HasId((int)SbmTransaction.Column.DeliveryStatus))
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_DeliveryStatusCode, aliasTransaction));
|
|
if (columns.HasId((int)SbmTransaction.Column.DeliveryTypeCode) || columns.HasId((int)SbmTransaction.Column.DeliveryType))
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_DeliveryTypeCode, aliasTransaction));
|
|
if (columns.HasId((int)SbmTransaction.Column.DeliveryMethodCode) || columns.HasId((int)SbmTransaction.Column.DeliveryMethod))
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_DeliveryMethodCode, aliasTransaction));
|
|
if (columns.HasId((int)SbmTransaction.Column.DeliveryCourierCode) || columns.HasId((int)SbmTransaction.Column.DeliveryCourier))
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_DeliveryCourierCode, aliasTransaction));
|
|
if (columns.HasId((int)SbmTransaction.Column.DeliveryBookInCode) || columns.HasId((int)SbmTransaction.Column.DeliveryBookIn))
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_DeliveryBookInCode, aliasTransaction));
|
|
if (columns.HasId((int)SbmTransaction.Column.StockPickerCode) || columns.HasId((int)SbmTransaction.Column.StockPicker))
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_StockPickerCode, aliasTransaction));
|
|
if (canViewFinancials && (columns.HasId((int)SbmTransaction.Column.DeliveryAmountNet) || columns.HasId((int)SbmTransaction.Column.DeliveryAmountNet_Fmt)))
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_DeliveryAmountNet, aliasTransaction));
|
|
if (columns.HasId((int)SbmTransaction.Column.DeliveryTaxCodeId)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_TaxCodeIdDelivery));
|
|
if (canViewFinancials && (columns.HasId((int)SbmTransaction.Column.DeliveryAmountTax) || columns.HasId((int)SbmTransaction.Column.DeliveryAmountTax_Fmt)))
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_DeliveryAmountTax, aliasTransaction));
|
|
if (canViewFinancials && (columns.HasId((int)SbmTransaction.Column.DeliveryAmountTot) || columns.HasId((int)SbmTransaction.Column.DeliveryAmountTot_Fmt)))
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_DeliveryAmountTot, aliasTransaction));
|
|
if (columns.HasId((int)SbmTransaction.Column.DeliveryNominalCode)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_DeliveryNominalCode, aliasTransaction));
|
|
if (columns.HasId((int)SbmTransaction.Column.DeliveryDepartment)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_DeliveryDepartment, aliasTransaction));
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_CurrencyId, aliasTransaction));
|
|
if (canViewFinancials)
|
|
{
|
|
if (columns.HasId((int)SbmTransaction.Column.AmountEst) || columns.HasId((int)SbmTransaction.Column.AmountEst_Fmt)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_AmountEst, aliasTransaction));
|
|
if (columns.HasId((int)SbmTransaction.Column.AmountMax) || columns.HasId((int)SbmTransaction.Column.AmountMax_Fmt)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_AmountMax, aliasTransaction));
|
|
if (columns.HasId((int)SbmTransaction.Column.AmountNet) || columns.HasId((int)SbmTransaction.Column.AmountNet_Fmt)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_AmountNet, aliasTransaction));
|
|
if (columns.HasId((int)SbmTransaction.Column.AmountTax) || columns.HasId((int)SbmTransaction.Column.AmountTax_Fmt)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_AmountTax, aliasTransaction));
|
|
if (columns.HasId((int)SbmTransaction.Column.AmountTot) || columns.HasId((int)SbmTransaction.Column.AmountTot_Fmt)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_AmountTot, aliasTransaction));
|
|
if (ColumnExists(SbmDbDfn.ColumnIdx.Transaction_CostLabourRateHour) && columns.HasId((int)SbmTransaction.Column.CostLabourRateHour))
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_CostLabourRateHour, aliasTransaction));
|
|
}
|
|
if (ColumnExists(SbmDbDfn.ColumnIdx.Transaction_TimeEst) && columns.HasId((int)SbmTransaction.Column.TimeEst))
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_TimeEst, aliasTransaction));
|
|
if (ColumnExists(SbmDbDfn.ColumnIdx.Transaction_TimeAct) && columns.HasId((int)SbmTransaction.Column.TimeAct))
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_TimeAct, aliasTransaction));
|
|
if (columns.HasId((int)SbmTransaction.Column.TimeTot)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_TimeTot, aliasTransaction));
|
|
if (columns.HasId((int)SbmTransaction.Column.Weight)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Weight, aliasTransaction));
|
|
if (columns.HasId((int)SbmTransaction.Column.BoxCount)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_BoxCount, aliasTransaction));
|
|
if (columns.HasId((int)SbmTransaction.Column.Notes)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Notes, aliasTransaction));
|
|
if (columns.HasId((int)SbmTransaction.Column.AllocationInd) || columns.HasId((int)SbmTransaction.Column.AllocationInd_YP) || columns.HasId((int)SbmTransaction.Column.Flags) || columns.HasId((int)SbmTransaction.Column.ReplacementOrder_Tick) || columns.HasId((int)SbmTransaction.Column.ReplacementOrder_Y))
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Flags, aliasTransaction));
|
|
if (columns.HasId((int)SbmTransaction.Column.Status) || columns.HasId((int)SbmTransaction.Column.Status_Desc) || columns.HasId((int)SbmTransaction.Column.Status_Ind) || columns.HasId((int)SbmTransaction.Column.Status_OnHold_Tick) || columns.HasId((int)SbmTransaction.Column.Status_OnHold_Cross) || columns.HasId((int)SbmTransaction.Column.Status_OnHold_Y))
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Status, aliasTransaction));
|
|
//---------------------------------------------------------------------
|
|
// Association - Owner Aff - Target Affiliate - Target Address
|
|
bool hasAssocCols = false;
|
|
if (!hasAssocCols) hasAssocCols = columns.HasId((int)SbmTransaction.Column.Assoc_Code);
|
|
if (!hasAssocCols) hasAssocCols = columns.HasId((int)SbmTransaction.Column.Assoc_AccountManagerCode) || columns.HasId((int)SbmTransaction.Column.Assoc_AccountManagerDesc);
|
|
if (!hasAssocCols) hasAssocCols = columns.HasId((int)SbmTransaction.Column.Assoc_AccountHandlerCode) || columns.HasId((int)SbmTransaction.Column.Assoc_AccountHandlerDesc);
|
|
bool hasOwnerAffCols = false;
|
|
if (!hasOwnerAffCols) hasOwnerAffCols = columns.HasId((int)SbmTransaction.Column.AssocOwner_Name);
|
|
bool hasTgtAffCols = false;
|
|
if (!hasTgtAffCols) hasTgtAffCols = columns.HasId((int)SbmTransaction.Column.AssocTarget_Name);
|
|
if (!hasTgtAffCols) hasTgtAffCols = columns.HasId((int)SbmTransaction.Column.AssocTarget_PhoneMain);
|
|
if (!hasTgtAffCols) hasTgtAffCols = columns.HasId((int)SbmTransaction.Column.AssocTarget_PhoneAlt);
|
|
bool hasTgtAddrCols = false;
|
|
if (!hasTgtAddrCols) hasTgtAddrCols = columns.HasId((int)SbmTransaction.Column.AssocTarget_Address);
|
|
if (!hasTgtAddrCols) hasTgtAddrCols = columns.HasId((int)SbmTransaction.Column.AssocTarget_Address_Name);
|
|
if (!hasTgtAddrCols) hasTgtAddrCols = columns.HasId((int)SbmTransaction.Column.AssocTarget_Address_Line1);
|
|
if (!hasTgtAddrCols) hasTgtAddrCols = columns.HasId((int)SbmTransaction.Column.AssocTarget_Address_Line2);
|
|
if (!hasTgtAddrCols) hasTgtAddrCols = columns.HasId((int)SbmTransaction.Column.AssocTarget_Address_Line3);
|
|
if (!hasTgtAddrCols) hasTgtAddrCols = columns.HasId((int)SbmTransaction.Column.AssocTarget_Address_City);
|
|
if (!hasTgtAddrCols) hasTgtAddrCols = columns.HasId((int)SbmTransaction.Column.AssocTarget_Address_Province);
|
|
if (!hasTgtAddrCols) hasTgtAddrCols = columns.HasId((int)SbmTransaction.Column.AssocTarget_Address_Postcode);
|
|
if (hasAssocCols || hasOwnerAffCols || hasTgtAffCols || hasTgtAddrCols)
|
|
{
|
|
//---------------------------------------------------------------------
|
|
//Association.
|
|
// Join to the Association.
|
|
DbQueryJoin joinAssoc = new DbQueryJoin(DbJoinType.LeftOuter);
|
|
joinAssoc.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Association), aliasTransaction_Association);
|
|
joinAssoc.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Id, aliasTransaction_Association, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_AssocId, aliasTransaction));
|
|
query.Joins.Add(joinAssoc);
|
|
// Add the association columns.
|
|
List<SbmDbDfn.ColumnIdx> associationCols = new List<SbmDbDfn.ColumnIdx>();
|
|
associationCols.Add(SbmDbDfn.ColumnIdx.Association_Code);
|
|
if (columns.HasId((int)SbmTransaction.Column.Assoc_AccountManagerCode) || columns.HasId((int)SbmTransaction.Column.Assoc_AccountManagerDesc))
|
|
associationCols.Add(SbmDbDfn.ColumnIdx.Association_AccountManagerCode);
|
|
if (columns.HasId((int)SbmTransaction.Column.Assoc_AccountHandlerCode) || columns.HasId((int)SbmTransaction.Column.Assoc_AccountHandlerDesc))
|
|
associationCols.Add(SbmDbDfn.ColumnIdx.Association_AccountHandlerCode);
|
|
foreach (SbmDbDfn.ColumnIdx dbColumn in associationCols)
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasTransaction_Association), prefixTransaction_Association + SbmDbDfn.GetColumnName(dbColumn, false));
|
|
|
|
//---------------------------------------------------------------------
|
|
// Owner Affiliate.
|
|
if (hasOwnerAffCols)
|
|
{
|
|
// Join to the Owner affiliate.
|
|
DbQueryJoin joinAffOwner = new DbQueryJoin(DbJoinType.LeftOuter);
|
|
joinAffOwner.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Affiliate), aliasTransaction_AffiliateOwner);
|
|
joinAffOwner.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Id, aliasTransaction_AffiliateOwner, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_AffIdOwner, aliasTransaction_Association, false));
|
|
query.Joins.Add(joinAffOwner);
|
|
// Add the affiliate columns.
|
|
List<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.
|
|
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 target affiliate - NB Use an alias to avoid clashing with the owner affiliate.
|
|
DbQueryJoin joinAddr = new DbQueryJoin(DbJoinType.LeftOuter);
|
|
joinAddr.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Address), aliasTransaction_AddressTarget);
|
|
joinAddr.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_ItemType, aliasTransaction_AddressTarget, false) + "=" + Sbm.ItemType.Affiliate.ToString());
|
|
joinAddr.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_ItemId, aliasTransaction_AddressTarget, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Id, aliasTransaction_AffiliateTarget, false));
|
|
joinAddr.Filters.Add(DbQuery.BuildBitMappedFilter(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Flags, aliasTransaction_AddressTarget, false), SbmAddress.Flag_Primary, true));
|
|
query.Joins.Add(joinAddr);
|
|
// Add the address columns.
|
|
List<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((int)SbmTransaction.Column.DeliveryAddress);
|
|
bool hasColDelAddr_Line1 = columns.HasId((int)SbmTransaction.Column.DeliveryAddress_Line1);
|
|
bool hasColDelAddr_Postcode = columns.HasId((int)SbmTransaction.Column.DeliveryAddress_Postcode);
|
|
bool hasColDelAddr_Phone = columns.HasId((int)SbmTransaction.Column.DeliveryAddress_Phone);
|
|
bool hasColDelAddr_Email = columns.HasId((int)SbmTransaction.Column.DeliveryAddress_Email);
|
|
if (hasColDeliveryAddress || hasColDelAddr_Line1 || hasColDelAddr_Postcode || hasColDelAddr_Phone || hasColDelAddr_Email)
|
|
{
|
|
// Join to the address table.
|
|
DbQueryJoin joinDelAddr = new DbQueryJoin(DbJoinType.LeftOuter);
|
|
joinDelAddr.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Address), aliasTransaction_DeliveryAddress);
|
|
joinDelAddr.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Type, aliasTransaction_DeliveryAddress, false) + "=" + Sbm.AddressType.Delivery);
|
|
joinDelAddr.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_ItemType, aliasTransaction_DeliveryAddress, false) + "=" + Sbm.ItemType.Transaction);
|
|
joinDelAddr.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_ItemId, aliasTransaction_DeliveryAddress, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, aliasTransaction));
|
|
query.Joins.Add(joinDelAddr);
|
|
// Add the address columns.
|
|
List<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((int)SbmTransaction.Column.DeliveryTaxCode_Code);
|
|
if (!bHasColDeliveryTaxCode) bHasColDeliveryTaxCode = columns.HasId((int)SbmTransaction.Column.DeliveryTaxCode_Rate);
|
|
if (bHasColDeliveryTaxCode)
|
|
{
|
|
// Join to the delivery Tax Code.
|
|
DbQueryJoin joinDelTxc = new DbQueryJoin(DbJoinType.LeftOuter);
|
|
joinDelTxc.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.TaxCode), aliasTransaction_DeliveryTaxcode);
|
|
joinDelTxc.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.TaxCode_Id, aliasTransaction_DeliveryTaxcode, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_TaxCodeIdDelivery, aliasTransaction));
|
|
query.Joins.Add(joinDelTxc);
|
|
// Add the Tax Code columns.
|
|
List<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((int)SbmTransaction.Column.Currency_Code);
|
|
if (!hasColCurrency) hasColCurrency = columns.HasId((int)SbmTransaction.Column.Currency_Symbol);
|
|
if (hasColCurrency)
|
|
{
|
|
// Join to the Currency.
|
|
DbQueryJoin joinCurr = new DbQueryJoin(DbJoinType.LeftOuter);
|
|
joinCurr.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Currency), aliasTransaction_Currency);
|
|
joinCurr.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Currency_Id, aliasTransaction_Currency, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_CurrencyId, aliasTransaction));
|
|
query.Joins.Add(joinCurr);
|
|
// Add the Currency columns.
|
|
List<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((int)SbmTransaction.Column.SourceTrans_Ref);
|
|
if (hasColSourceTrans)
|
|
{
|
|
// Join to the source transaction.
|
|
DbQueryJoin joinSourceTrans = new DbQueryJoin(DbJoinType.LeftOuter);
|
|
joinSourceTrans.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction), aliasTransaction_SourceTransaction);
|
|
joinSourceTrans.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, aliasTransaction_SourceTransaction, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_TransIdSource, aliasTransaction));
|
|
query.Joins.Add(joinSourceTrans);
|
|
// Add the transaction columns.
|
|
List<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((int)SbmTransaction.Column.CostTotal) || columns.HasId((int)SbmTransaction.Column.CostTotal_Fmt));
|
|
if (!includeCostTotal) includeCostTotal = (columns.HasId((int)SbmTransaction.Column.AmountMargin) || columns.HasId((int)SbmTransaction.Column.AmountMargin_Fmt));
|
|
if (!includeCostTotal) includeCostTotal = (columns.HasId((int)SbmTransaction.Column.PercentMargin) || columns.HasId((int)SbmTransaction.Column.PercentMargin_Fmt));
|
|
if (includeCostTotal)
|
|
{
|
|
// Build sub query to calculate the total cost total across all items.
|
|
String aliasTransaction_RequirementCost = "aTrnReqCst";
|
|
String colNameCostTotal = "CostTotal";
|
|
DbQuery qryReqntCount = new DbQuery(db.DbmsType);
|
|
qryReqntCount.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement), aliasTransaction_RequirementCost));
|
|
qryReqntCount.Columns.Add("Sum(" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_CostTotal, aliasTransaction_RequirementCost, false) + ")");
|
|
qryReqntCount.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_TransId, aliasTransaction_RequirementCost, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, aliasTransaction));
|
|
query.Columns.Add("(" + qryReqntCount.BuildQuery() + ")", colNameCostTotal);
|
|
}
|
|
//---------------------------------------------------------------------
|
|
bool countRequirements = columns.HasId((int)SbmTransaction.Column.ReqntCount);
|
|
if (countRequirements)
|
|
{
|
|
// Build sub query to directly return the number of associated requirements.
|
|
String aliasTransaction_CountRequirement = "aTrnReqCnt";
|
|
String colNameCountReqnts = "CountReqnts";
|
|
DbQuery qryReqntCount = new DbQuery(db.DbmsType);
|
|
qryReqntCount.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement), aliasTransaction_CountRequirement));
|
|
qryReqntCount.Columns.Add("Count(" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_Id, aliasTransaction_CountRequirement, false) + ")");
|
|
qryReqntCount.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_TransId, aliasTransaction_CountRequirement, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, aliasTransaction));
|
|
query.Columns.Add("(" + qryReqntCount.BuildQuery() + ")", colNameCountReqnts);
|
|
}
|
|
//---------------------------------------------------------------------
|
|
bool bCountTimeRecords = columns.HasId((int)SbmTransaction.Column.TimeCount);
|
|
if (bCountTimeRecords)
|
|
{
|
|
// Build sub query to directly return the number of associated constituents of type 'Time'.
|
|
String aliasTransaction_CountTimes = "ConTim";
|
|
String colNameCountTimeRecs = "CountTimeRecs";
|
|
DbQuery qryConstTimeCount = new DbQuery(db.DbmsType);
|
|
qryConstTimeCount.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Constituent), aliasTransaction_CountTimes));
|
|
qryConstTimeCount.Columns.Add("Count(" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_Id, aliasTransaction_CountTimes, false) + ")");
|
|
qryConstTimeCount.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_TransId, aliasTransaction_CountTimes, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, aliasTransaction));
|
|
qryConstTimeCount.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_Type, aliasTransaction_CountTimes, false) + "=" + Sbm.ConstituentType.TimeRecord.ToString());
|
|
qryConstTimeCount.Columns.Add("(" + qryConstTimeCount.BuildQuery() + ")", colNameCountTimeRecs);
|
|
}
|
|
//---------------------------------------------------------------------
|
|
bool bCountActions = columns.HasId((int)SbmTransaction.Column.TaskCount);
|
|
if (bCountActions)
|
|
{
|
|
// Build sub query to directly return the number of associated constituents of type 'Action'.
|
|
String aliasTransaction_CountActions = "ConAct";
|
|
String colNameCountActions = "CountActions";
|
|
DbQuery qryConstActionCount = new DbQuery(db.DbmsType);
|
|
qryConstActionCount.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Constituent), aliasTransaction_CountActions));
|
|
qryConstActionCount.Columns.Add("Count(" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_Id, aliasTransaction_CountActions, false) + ")");
|
|
qryConstActionCount.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_TransId, aliasTransaction_CountActions, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, aliasTransaction));
|
|
qryConstActionCount.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_Type, aliasTransaction_CountActions, false) + "=" + Sbm.ConstituentType.Task.ToString());
|
|
qryConstActionCount.Columns.Add("(" + qryConstActionCount.BuildQuery() + ")", colNameCountActions);
|
|
}
|
|
//---------------------------------------------------------------------
|
|
// Whether transaction has associated invoices.
|
|
bool checkForInvoices = columns.HasId((int)SbmTransaction.Column.HasInvoice);
|
|
if (checkForInvoices)
|
|
{
|
|
// Check which types of transaction are allowed.
|
|
bool invoicesAllowed = ConfigConsole != null && (AllowTransactionType(Sbm.TransactionType.ProformaSalesInvoice) || AllowTransactionType(Sbm.TransactionType.SalesInvoice) ||
|
|
AllowTransactionType(Sbm.TransactionType.ProformaPurchaseInvoice) || AllowTransactionType(Sbm.TransactionType.PurchaseInvoice));
|
|
bool dispatchesAllowed = ConfigConsole != 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(db.DbmsType);
|
|
qryTransInv.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction), aliasTransaction_TransactionInvoice));
|
|
qryTransInv.Columns.Add("Count(" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, aliasTransaction_TransactionInvoice, false) + ")");
|
|
String filterTransIdSource = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_TransIdSource, aliasTransaction_TransactionInvoice, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, aliasTransaction);
|
|
if (dispatchesAllowed)
|
|
{
|
|
// If sales dispatches are allowed, the invoice can reference a dispatch that references the target transaction rather than having to reference the target transaction directly.
|
|
DbQueryJoin qryTransSrc = new DbQueryJoin(DbJoinType.Inner);
|
|
qryTransSrc.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction), aliasTransaction_TransactionSource);
|
|
qryTransSrc.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, aliasTransaction_TransactionSource, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_TransIdSource, aliasTransaction_TransactionInvoice, false));
|
|
qryTransInv.Joins.Add(qryTransSrc);
|
|
filterTransIdSource += " Or " + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_TransIdSource, aliasTransaction_TransactionSource, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, aliasTransaction);
|
|
}
|
|
qryTransInv.Filters.Add(filterTransIdSource);
|
|
qryTransInv.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Type, aliasTransaction_TransactionInvoice, false) + " IN (" + transTypeInvoices.Concat(",") + ")");
|
|
qryTransInv.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Status, aliasTransaction_TransactionInvoice, false) + " NOT IN ('" + StatusCancelled + "')");
|
|
qryTransInv.Columns.Add("(" + qryTransInv.BuildQuery() + ")", colNameHasInvoice);
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------
|
|
bool bAccountInvoiceRef = columns.HasId((int)SbmTransaction.Column.AccountsInvoiceRef);
|
|
if (bAccountInvoiceRef)
|
|
{
|
|
// Identify the accounts interface.
|
|
List<SysId> accountsIdsInterface = new List<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(db.DbmsType);
|
|
qryIntData.RowLimit = 1;
|
|
qryIntData.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.InterfaceDataItem), aliasTransaction_IntData));
|
|
qryIntData.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.InterfaceDataItem_ExternalRef, aliasTransaction_IntData, false));
|
|
qryIntData.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.InterfaceDataItem_InterfaceId, aliasTransaction_IntData, false) + " IN (" + accountsIdsInterface.Concat(",") + ")");
|
|
qryIntData.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.InterfaceDataItem_ItemType, aliasTransaction_IntData, false) + "=" + ((int)Sbm.ItemType.Transaction).ToString());
|
|
qryIntData.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.InterfaceDataItem_ItemId, aliasTransaction_IntData, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, aliasTransaction));
|
|
qryIntData.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.InterfaceDataItem_Direction, aliasTransaction_IntData, false) + "=" + SaInterfaceProcessDirection.Outbound.ToString());
|
|
qryIntData.Columns.Add("(" + qryIntData.BuildQuery() + ")", colNameAccountsInvoiceRef);
|
|
}
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------
|
|
// Populate filter.
|
|
query.Filters.AddRange(GetTransactionQueryFilter(prm));
|
|
if (prm.RequiresVolumeThrottle())
|
|
{
|
|
// Limit the number of transactions returned:
|
|
long maxTransactions = StringUtil.ToLong(UserContext.GetOwnerOption_Value(Sbm.OrgOption_Value.MaxTransactionsQueriedForEmptyFilter));
|
|
if (maxTransactions > 0)
|
|
{
|
|
query.RowLimit = (uint)maxTransactions;
|
|
if (DebugMode) SaLogger.Trace(GetType().Name + ".ExecuteTransactionQuery Transactions query throttled at max rows: " + maxTransactions.ToString());
|
|
}
|
|
}
|
|
|
|
if (prm.IncludedIds.Count != 1)
|
|
{
|
|
// Configure sort sequence.
|
|
foreach (String sortColumn in GetTransactionSortColumns(prm))
|
|
query.OrderBy.Add(sortColumn);
|
|
}
|
|
|
|
//---------------------------------------------------------------------
|
|
//return new DbResultSet_DataTableReader(db, query.BuildQuery());
|
|
return DbResultSet_DataReader.ExecuteQuery(db, query.BuildQuery(prm.ResultsPaging));
|
|
}
|
|
//-------------------------------------------------------------------
|
|
}
|
|
//=======================================================================
|
|
}
|