using Sarand.BusinessMgr.Net.Standard.Base.App; using Sarand.BusinessMgr.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Dbas; using Sarand.Net.Standard.Base.ReferenceData; using Sarand.Net.Standard.Base.Utils; using System; using System.Collections.Generic; namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr { //======================================================================= partial class SbmTransactionMgr { //******************************************************************* // T r a n s a c t i o n s //******************************************************************* // Data members. private static long maxTranNotesLength = -1; //------------------------------------------------------------------- // Utilities. public abstract decimal GetTransCostLabourRateHourDefault(); public abstract decimal GetTransCostLabourRateHour(SysId transactionId); public abstract bool DeliveryFinancialsAreAvailable(); public abstract bool ChangeTransactionsAssociation(SbmTransaction transaction, SysId assocId); public abstract bool RefreshAssociatedData(SbmTransaction transaction, List requirements = null); public abstract bool RefreshAssociatedTransactions(SbmTransaction transaction, List requirements = null); //------------------------------------------------------------------- // Has transactions. public abstract bool TransactionIsReferencedByOtherTransactions(SysId transactionId/*, Sbm.TransactionStatusCat transactionStatusCat)*/); public abstract bool TransactionHasRequirements(SysId transId, SbmRequirement.StatusCat requirementStatusCat); public abstract bool TransactionHasConstituents(SysId transId, SbmConstituent.StatusCat constituentStatusCat); public abstract bool TransactionHasContainerItems(SysId transactionId); public abstract bool TransactionHasStockMovements(SysId transactionId); public abstract bool TransactionHasPendingStockMovements(SysId transactionId); //------------------------------------------------------------------- // Transaction exists. public bool TransactionExistsById(SysId id) { ClearErrorState(); if (!SysId.IsValid(id)) return false; SbmTransaction.Params prmTransaction = new SbmTransaction.Params(); prmTransaction.IncludedIds.Add(id); prmTransaction.StatusCat = SbmTransaction.StatusCat.Any; return GetTransactionCount(prmTransaction) == 1; } public bool TransactionExistsByOwnerTypeRef(SysId affIdOwner, Sbm.TransactionType transactionType, String transactionRef) { if (!SysId.IsValid(affIdOwner) || (int)transactionType < 1 || StringUtil.IsEmpty(transactionRef)) return false; SbmTransaction.Params prmTransaction = new SbmTransaction.Params(); prmTransaction.IncludedIds.Add(affIdOwner); prmTransaction.TransactionType = transactionType; prmTransaction.TransRefFull = transactionRef; prmTransaction.StatusCat = SbmTransaction.StatusCat.Any; return GetTransactionCount(prmTransaction) == 1; } //------------------------------------------------------------------- // Get transaction. public abstract SbmTransaction GetTransaction(SbmTransaction.Params prm); public SbmTransaction GetTransactionById(SysId id) { ClearErrorState(); if (!SysId.IsValid(id)) return null; SbmTransaction.Params prmTransaction = new SbmTransaction.Params(); prmTransaction.IncludedIds.Add(id); prmTransaction.StatusCat = SbmTransaction.StatusCat.Any; return GetTransaction(prmTransaction); } public abstract List GetRequirementByIds(SbmTransaction.Params prmTrans); public SbmTransaction GetTransactionByOwnerTypeRef(SysId affIdOwner, Sbm.TransactionType transactionType, String transRef) { SbmTransaction transaction = null; if (!SysId.IsValid(affIdOwner) || transactionType > 0 || StringUtil.IsEmpty(transRef)) return transaction; SbmTransaction.Params prmTransaction = new SbmTransaction.Params(); prmTransaction.IncludedIds.Add(affIdOwner); prmTransaction.TransactionType = Sbm.TransactionType.Any; prmTransaction.TransRefFull = transRef; prmTransaction.StatusCat = SbmTransaction.StatusCat.Any; return GetTransaction(prmTransaction); } //------------------------------------------------------------------- // Create transactions. public abstract SbmTransaction CreateTransaction(SysId associationId, Sbm.TransactionType transactionType); //------------------------------------------------------------------- // Validate transaction data. public bool IsValidTransaction(SbmTransaction transaction) { ClearErrorState(); if (transaction == null) return SetErrorState(ErrorMessage.ItemNotSpecified); if (!IsValidTransactionData(transaction.GetData(), new SbmTransaction.ErrField())) return false; // Transaction status category. if (!IsValidValue(TransactionStatusCats.GetCodeForType(transaction.TransactionStatusCat), "status cat", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Transaction_StatusCat), true, true)) return false; return true; } public virtual bool IsValidTransactionData(SbmTransaction.Data data, SbmTransaction.ErrField errField) { ClearErrorState(); // Transaction properties. if (errField.AffiliateIdOwner != SacsHierarchyItem.ValidValue.Ignore && !SysId.IsValid(data.AffiliateIdOwner)) { errField.AffiliateIdOwner = SacsHierarchyItem.ValidValue.Invalid; return SetErrorState("invalid owner"); } if (errField.AssociationId != SacsHierarchyItem.ValidValue.Ignore && !SysId.IsValid(data.AssociationId)) { errField.AssociationId = SacsHierarchyItem.ValidValue.Invalid; return SetErrorState("invalid association"); } if (errField.TransactionType != SacsHierarchyItem.ValidValue.Ignore && (short)data.TransactionType < 1) { if ((int)data.TransactionType < 1) { errField.TransactionType = SacsHierarchyItem.ValidValue.Invalid; return SetErrorState("invalid type"); } } // NB Ref, RefInt is optional. if (errField.RefExt != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.RefExt, "external ref", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Transaction_RefExt))) { errField.RefExt = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.RaisedBy != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.RaisedBy, "raised by", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Transaction_RaisedBy))) { errField.RaisedBy = SacsHierarchyItem.ValidValue.Invalid; return false; } // NB AffIdRaise, AssocIdOffice, TransIdSource is optional. if (errField.ContactName != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.ContactName, "contact name", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Transaction_ContactName))) { errField.ContactName = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.Likelihood != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Likelihood, "likelihood", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Transaction_Likelihood))) { errField.Likelihood = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.ReferCode != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.ReferCode, "refer code", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Transaction_ReferCode))) { errField.ReferCode = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.ReferSource != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.ReferSource, "refer source", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Transaction_ReferSource))) { errField.ReferSource = SacsHierarchyItem.ValidValue.Invalid; return false; } // NB AffIdRefer > Closed is optional. if (errField.Department != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Department, "department", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Transaction_Department))) { errField.Department = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.DescBrief != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.DescBrief, "brief description", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Transaction_DescBrief))) { errField.DescBrief = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.DescIntro != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.DescIntro, "introduction description", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Transaction_DescIntro))) { errField.DescIntro = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.DescOutline != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.DescOutline, "outline description", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Transaction_DescOutline))) { errField.DescOutline = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.DescDetail != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.DescDetail, "detail description", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Transaction_DescDetail))) { errField.DescDetail = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.ContactAreaCode != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.ContactAreaCode, "contact area", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Transaction_ContactAreaCode))) { errField.ContactAreaCode = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.ResponseCode != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.ResponseCode, "response", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Transaction_ResponseCode))) { errField.ResponseCode = SacsHierarchyItem.ValidValue.Invalid; return false; } // NB CurrencyId > UomIdWeight is optional. if (errField.BoxCount != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.BoxCount, "box count", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Transaction_BoxCount))) { errField.BoxCount = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.DeliveryStatusCode != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.DeliveryStatusCode, "delivery status", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Transaction_DeliveryStatusCode))) { errField.DeliveryStatusCode = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.DeliveryTypeCode != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.DeliveryTypeCode, "delivery type", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Transaction_DeliveryTypeCode))) { errField.DeliveryTypeCode = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.DeliveryMethodCode != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.DeliveryMethodCode, "delivery method", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Transaction_DeliveryMethodCode))) { errField.DeliveryMethodCode = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.DeliveryCourierCode != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.DeliveryCourierCode, "delivery courier", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Transaction_DeliveryCourierCode))) { errField.DeliveryCourierCode = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.DeliveryBookInCode != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.DeliveryBookInCode, "delivery book-in", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Transaction_DeliveryBookInCode))) { errField.DeliveryBookInCode = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.StockPickerCode != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.StockPickerCode, "stock picker", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Transaction_StockPickerCode))) { errField.StockPickerCode = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.DeliveryRef != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.DeliveryRef, "delivery ref", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Transaction_DeliveryRef))) { errField.DeliveryRef = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.DeliveryComment != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.DeliveryComment, "delivery comment", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Transaction_DeliveryComment))) { errField.DeliveryComment = SacsHierarchyItem.ValidValue.Invalid; return false; } // NB DeliveryAmountNet, TaxCodeIdDelivery, DeliveryAmountTax, DeliveryAmountTot is optional. if (errField.DeliveryDepartment != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.DeliveryDepartment, "delivery department", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Transaction_DeliveryDepartment))) { errField.DeliveryDepartment = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.DeliveryNominalCode != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.DeliveryNominalCode, " delivery nominal code", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Transaction_DeliveryNominalCode))) { errField.DeliveryNominalCode = SacsHierarchyItem.ValidValue.Invalid; return false; } // Establish notes length for validation. if (maxTranNotesLength < 1) { // Standard notes length: maxTranNotesLength = (int)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Transaction_Notes); // Check if this database allows longer notes: ISacsDatabase db = SbmGlobals.Application.GetDatabase(SessionContext); if (db != null) { DbDfnTable tableDfn = db.GetTableDfn(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction, false)); DbDfnColumn columnDfn = tableDfn.Columns.Find(item => item.Name.EqualsCI(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Transaction_Notes, false))); if (columnDfn != null) maxTranNotesLength = Math.Max(maxTranNotesLength, columnDfn.Size); } } if (errField.Notes != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Notes, "notes", maxTranNotesLength)) { errField.Notes = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.Status != SacsHierarchyItem.ValidValue.Ignore) { if (!IsValidValue(data.StatusCode, "status", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Transaction_Status), true, true)) { errField.Status = SacsHierarchyItem.ValidValue.Invalid; return false; } if (!SbmTransaction.GetTransactionStatuses(data.TransactionType).Contains(data.Status)) { errField.Status = SacsHierarchyItem.ValidValue.Invalid; return SetErrorState(ErrorMessage.InvalidStatus); } } // Populate and validate dates. SbmTransaction.StatusCat transactionStatusCat = SbmTransaction.GetCategoryForStatus(data.Status); if (transactionStatusCat == SbmTransaction.StatusCat.Open || transactionStatusCat == SbmTransaction.StatusCat.Closed) { if (!DateUtil.IsValid(data.InProgress)) data.InProgress = DateTime.Today; } if (transactionStatusCat == SbmTransaction.StatusCat.Closed) { if (!DateUtil.IsValid(data.Closed)) data.Closed = DateTime.Today; } // Populate reference if not already done. if (StringUtil.IsEmpty(data.Ref) && ConfigConsole.TransactionAssignRefMethod(UserContext, data.TransactionType) != SbmConfigConsole.AssignTransRefMethod.Manual) { // Retrieve the next available transaction reference. String sRef = ConfigConsole.GetTransactionCreateRef(UserContext, data.AffiliateIdOwner, data.AssociationId, data.TransactionType); ; ; // Check that another transaction doesn't already exist with this reference. SbmTransaction transRef = GetTransactionByOwnerTypeRef(data.AffiliateIdOwner, data.TransactionType, sRef); if (transRef == null) data.Ref = sRef; else { String tranTypeDesc = TransactionTypes.GetDescForType(data.TransactionType); if (StringUtil.IsEmpty(tranTypeDesc)) tranTypeDesc = "Transaction"; SetErrorState("Another " + tranTypeDesc + " already exists with this reference."); } if (HasErrorState()) return false; } if (errField.Ref != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Ref, "Ref", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Transaction_Ref), true)) { errField.Ref = SacsHierarchyItem.ValidValue.Invalid; return false; } return true; } //------------------------------------------------------------------- // Transaction database interface. public abstract bool InsertTransaction(SbmTransaction transaction, DbUpdateInfo dbUpdateInfo); public abstract bool UpdateTransaction(SbmTransaction transaction, DbUpdateInfo dbUpdateInfo); public virtual bool TransactionCanBeDeleted(SbmTransaction transaction) { ClearErrorState(); return true; } public abstract bool DeleteTransaction(SbmTransaction transaction, DbUpdateInfo dbUpdateInfo); //------------------------------------------------------------------- // Transaction list. public abstract ColumnDfn GetTransactionColumnDfn(SbmTransaction.Column columnId, String caption = "", int width = 0); public abstract List GetTransactionQueryFilter(SbmTransaction.Params prm); public abstract long GetTransactionCount(SbmTransaction.Params prm); public abstract List GetTransactionList(SbmTransaction.Params prm); public abstract DbResultSet ExecuteTransactionQuery(List columns, SbmTransaction.Params prm); //------------------------------------------------------------------- // D a t a V a l u e s //------------------------------------------------------------------- /// /// Extract and format result set data value where specific handling is required. /// Where response is an invalid data value, format value using column.FormatValue(values). /// public DataValue GetTransactionDataValue(ColumnDfn column, NamedValue.Map values) { DataValue value = new DataValue(); switch ((SbmTransaction.Column)column.Id) { //--------------------------------------------------------------------- - // Transaction TypeDesc. case SbmTransaction.Column.Type_Desc: { Sbm.TransactionType transactionType = (Sbm.TransactionType)values.GetValue(column.DataName).AsLong(); value = new DataValue(TransactionTypes.GetDescForType(transactionType, ((int)transactionType).ToString())); break; } //Transaction Likelihood. case SbmTransaction.Column.Likelihood: { long likelihood = StringUtil.ToLong(values.GetValue(column.DataName).ToString()); if (likelihood >= 0 && likelihood <= 100) value = new DataValue(); break; } //--------------------------------------------------------------------- - // Association Codings. case SbmTransaction.Column.Assoc_AccountManagerDesc: { String accountManagerCode = values.GetValue(column.DataName).ToString(); value = new DataValue(GetCodeTypeCodeDesc(Sbm.ApplCodeType.AccountManager, accountManagerCode)); break; } case SbmTransaction.Column.Assoc_AccountHandlerDesc: { String accountHandlerCode = values.GetValue(column.DataName).ToString(); value = new DataValue(GetCodeTypeCodeDesc(Sbm.ApplCodeType.AccountHandler, accountHandlerCode)); break; } // Transaction Codings. case SbmTransaction.Column.ContactArea: { String contactAreaCode = values.GetValue(column.DataName).ToString(); value = new DataValue(GetCodeTypeCodeDesc(Sbm.ApplCodeType.ContactArea, contactAreaCode)); break; } case SbmTransaction.Column.DeliveryStatus: { String deliveryStatusCode = values.GetValue(column.DataName).ToString(); value = new DataValue(GetCodeTypeCodeDesc(Sbm.ApplCodeType.DeliveryStatus, deliveryStatusCode)); break; } case SbmTransaction.Column.DeliveryType: { String deliveryTypeCode = values.GetValue(column.DataName).ToString(); value = new DataValue(GetCodeTypeCodeDesc(Sbm.ApplCodeType.DeliveryType, deliveryTypeCode)); break; } case SbmTransaction.Column.DeliveryMethod: { String deliveryMethodCode = values.GetValue(column.DataName).ToString(); value = new DataValue(GetCodeTypeCodeDesc(Sbm.ApplCodeType.DeliveryMethod, deliveryMethodCode)); break; } case SbmTransaction.Column.DeliveryCourier: { String deliveryCourierCode = values.GetValue(column.DataName).ToString(); value = new DataValue(GetCodeTypeCodeDesc(Sbm.ApplCodeType.DeliveryCourier, deliveryCourierCode)); break; } case SbmTransaction.Column.DeliveryBookIn: { String deliveryBookInCode = values.GetValue(column.DataName).ToString(); value = new DataValue(GetCodeTypeCodeDesc(Sbm.ApplCodeType.DeliveryBookIn, deliveryBookInCode)); break; } case SbmTransaction.Column.StockPicker: { String stockPickerCode = values.GetValue(column.DataName).ToString(); value = new DataValue(GetCodeTypeCodeDesc(Sbm.ApplCodeType.StockPicker, stockPickerCode)); break; } //--------------------------------------------------------------------- - // Transaction DeliveryAmount & Amount. case SbmTransaction.Column.DeliveryAmountNet_Fmt: case SbmTransaction.Column.DeliveryAmountTax_Fmt: case SbmTransaction.Column.DeliveryAmountTot_Fmt: case SbmTransaction.Column.AmountEst_Fmt: case SbmTransaction.Column.AmountMax_Fmt: case SbmTransaction.Column.AmountNet_Fmt: case SbmTransaction.Column.AmountTax_Fmt: case SbmTransaction.Column.AmountTot_Fmt: { String valAmount = ""; ColumnDfn colAmount = GetTransactionColumnDfn(SbmTransaction.Column.Unknown); switch (column.Id) { case (int)SbmTransaction.Column.DeliveryAmountNet_Fmt: colAmount = GetTransactionColumnDfn(SbmTransaction.Column.DeliveryAmountNet); break; case (int)SbmTransaction.Column.DeliveryAmountTax_Fmt: colAmount = GetTransactionColumnDfn(SbmTransaction.Column.DeliveryAmountTax); break; case (int)SbmTransaction.Column.DeliveryAmountTot_Fmt: colAmount = GetTransactionColumnDfn(SbmTransaction.Column.DeliveryAmountTot); break; case (int)SbmTransaction.Column.AmountEst_Fmt: colAmount = GetTransactionColumnDfn(SbmTransaction.Column.AmountEst); break; case (int)SbmTransaction.Column.AmountMax_Fmt: colAmount = GetTransactionColumnDfn(SbmTransaction.Column.AmountMax); break; case (int)SbmTransaction.Column.AmountNet_Fmt: colAmount = GetTransactionColumnDfn(SbmTransaction.Column.AmountNet); break; case (int)SbmTransaction.Column.AmountTax_Fmt: colAmount = GetTransactionColumnDfn(SbmTransaction.Column.AmountTax); break; case (int)SbmTransaction.Column.AmountTot_Fmt: colAmount = GetTransactionColumnDfn(SbmTransaction.Column.AmountTot); break; } double amount = values.GetValue(colAmount.DataName).ToNumeric(); if (Math.Abs(amount) > 0.001 || column.ShowZeroValues) { SysId currencyId = new SysId(StringUtil.ToInt(values.GetValue(GetTransactionColumnDfn(SbmTransaction.Column.CurrencyId).DataName).ToString())); valAmount = StringUtil.FormatNumeric((decimal)amount, 2, 0, ','); SaCurrency currency = GetCurrency(currencyId); if (currency == null) currency = GetDefaultCurrency(); if (currency != null) currency.FormatAmount((decimal)amount); } value = new DataValue(valAmount); break; } //--------------------------------------------------------------------- // Transaction cost and margin. case SbmTransaction.Column.CostTotal_Fmt: case SbmTransaction.Column.AmountMargin: case SbmTransaction.Column.AmountMargin_Fmt: case SbmTransaction.Column.PercentMargin: case SbmTransaction.Column.PercentMargin_Fmt: { double amount = 0.0f; double costTotal = values.GetValue(GetTransactionColumnDfn(SbmTransaction.Column.CostTotal).DataName).ToNumeric(); SysId currencyId = new SysId(StringUtil.ToInt(values.GetValue(GetTransactionColumnDfn(SbmTransaction.Column.CurrencyId).DataName).ToString())); SaCurrency currency = GetCurrency(currencyId); if (currency == null) currency = GetDefaultCurrency(); // Calculate the relevant amount. if (column.Id == (int)SbmRequirement.Column.Trans_CostTotal_Fmt) { amount = costTotal; } else { // Calculate the Margin. double amountNet = values.GetValue(GetTransactionColumnDfn(SbmTransaction.Column.AmountNet).DataName).ToNumeric(); if (column.Id == (int)SbmTransaction.Column.AmountMargin || column.Id == (int)SbmTransaction.Column.AmountMargin_Fmt) amount = amountNet - costTotal; else if (column.Id == (int)SbmRequirement.Column.Trans_PercentMargin || column.Id == (int)SbmTransaction.Column.PercentMargin_Fmt) amount = (amountNet > 0.0) ? (amountNet - costTotal) / amountNet * 100.0f : 0.0f; } // Format the result. if (column.Id == (int)SbmTransaction.Column.CostTotal || column.Id == (int)SbmTransaction.Column.AmountMargin || column.Id == (int)SbmTransaction.Column.PercentMargin) { // Numeric value: value = new DataValue(amount); } else if (column.Id == (int)SbmTransaction.Column.PercentMargin_Fmt) { // Percentage. if (Math.Abs(amount) > 0.001 || column.ShowZeroValues) value = new DataValue(StringUtil.FormatNumeric((decimal)amount, 2, 0, ',') + "%"); } else { // Format the amount. String valFmtAmount = ""; if (Math.Abs(amount) > 0.001 || column.ShowZeroValues) { valFmtAmount = StringUtil.FormatNumeric((decimal)amount, 2, 0, ','); if (currency != null) valFmtAmount = currency.FormatAmount((decimal)amount); } value = new DataValue(valFmtAmount); } break; } //--------------------------------------------------------------------- // Transaction Notes. case SbmTransaction.Column.Notes: value = new DataValue(SacsHierarchyItem.FormatForDisplay(values.GetValue(column.DataName).ToString(), 200)); break; // Transaction Flags (Allocation & Replacement). case SbmTransaction.Column.AllocationInd: case SbmTransaction.Column.AllocationInd_YP: { ushort flags = (ushort)StringUtil.ToInt(values.GetValue(column.DataName).ToString()); String statusCode = values.GetValue(GetRequirementColumnDfn(SbmRequirement.Column.Trans_StatusDesc).DataName).ToString(); SaStatus saStatus = SacsSystem.GetStatusForCode(statusCode); if (column.Id == (int)SbmTransaction.Column.AllocationInd) { DataValue.TriStateType allocationTriState = DataValue.TriStateType.Unknown; if (saStatus == SaStatus.Cancelled) allocationTriState = DataValue.TriStateType.Red; else if (SacsHierarchyItem.GetFlag(flags, SbmTransaction.Flag_FullAllocation)) allocationTriState = DataValue.TriStateType.Green; else if (SacsHierarchyItem.GetFlag(flags, SbmTransaction.Flag_PartialAllocation)) allocationTriState = DataValue.TriStateType.Amber; value = new DataValue(new DataValue(allocationTriState)); } else if (column.Id == (int)SbmTransaction.Column.AllocationInd_YP) { if (saStatus == SaStatus.Cancelled) value = new DataValue(); else if (SacsHierarchyItem.GetFlag(flags, SbmTransaction.Flag_FullAllocation)) value = new DataValue("Y"); else if (SacsHierarchyItem.GetFlag(flags, SbmTransaction.Flag_PartialAllocation)) value = new DataValue("P"); } break; } case SbmTransaction.Column.ReplacementOrder_Tick: case SbmTransaction.Column.ReplacementOrder_Y: { ushort flags = (ushort)StringUtil.ToInt(values.GetValue(column.DataName).ToString()); bool replacementOrder = SacsHierarchyItem.GetFlag(flags, SbmTransaction.Flag_ReplacementOrder); if (column.Id == (int)SbmTransaction.Column.ReplacementOrder_Tick) value = new DataValue(replacementOrder); else if (column.Id == (int)SbmTransaction.Column.ReplacementOrder_Y) value = new DataValue(replacementOrder ? "Y" : ""); break; } // Transaction Status. case SbmTransaction.Column.Status_Desc: case SbmTransaction.Column.Status_Ind: { SaStatus status = SacsSystem.GetStatusForCode(values.GetValue(column.DataName).ToString()); if (column.Id == (int)SbmTransaction.Column.Status_Desc) value = new DataValue(SacsSystem.GetStatusDesc(status)); else if (column.Id == (int)SbmTransaction.Column.Status_Ind) value = new DataValue(SbmTransaction.GetStatusTriState(status)); break; } case SbmTransaction.Column.Status_OnHold_Tick: case SbmTransaction.Column.Status_OnHold_Cross: case SbmTransaction.Column.Status_OnHold_Y: { SaStatus status = SacsSystem.GetStatusForCode(values.GetValue(column.DataName).ToString()); bool onHold = (status == SaStatus.OnHold); if (column.Id == (int)SbmTransaction.Column.Status_OnHold_Tick) value = new DataValue(onHold); else if (column.Id == (int)SbmTransaction.Column.Status_OnHold_Cross) value = new DataValue(onHold); else if (column.Id == (int)SbmTransaction.Column.Status_OnHold_Y) value = new DataValue(onHold ? "Y" : ""); break; } //--------------------------------------------------------------------- // Target Address. case SbmTransaction.Column.AssocTarget_Address: { List addresses = new List() { values.GetValue(GetTransactionColumnDfn(SbmTransaction.Column.AssocTarget_Address_Name).DataName).ToString(), values.GetValue(GetTransactionColumnDfn(SbmTransaction.Column.AssocTarget_Address_Line1).DataName).ToString(), values.GetValue(GetTransactionColumnDfn(SbmTransaction.Column.AssocTarget_Address_Line2).DataName).ToString(), values.GetValue(GetTransactionColumnDfn(SbmTransaction.Column.AssocTarget_Address_Line3).DataName).ToString(), values.GetValue(GetTransactionColumnDfn(SbmTransaction.Column.AssocTarget_Address_City).DataName).ToString(), values.GetValue(GetTransactionColumnDfn(SbmTransaction.Column.AssocTarget_Address_Province).DataName).ToString(), values.GetValue(GetTransactionColumnDfn(SbmTransaction.Column.AssocTarget_Address_Postcode).DataName).ToString(), }; value = new DataValue(addresses.Concat(", ", null, null, true, true).Replace(" ,", ",").Trim(',').Trim()); break; } // Delivery Address. case SbmTransaction.Column.DeliveryAddress: { List addresses = new List() { values.GetValue(GetTransactionColumnDfn(SbmTransaction.Column.DeliveryAddress_Name).DataName).ToString(), values.GetValue(GetTransactionColumnDfn(SbmTransaction.Column.DeliveryAddress_Line1).DataName).ToString(), values.GetValue(GetTransactionColumnDfn(SbmTransaction.Column.DeliveryAddress_Line2).DataName).ToString(), values.GetValue(GetTransactionColumnDfn(SbmTransaction.Column.DeliveryAddress_Line3).DataName).ToString(), values.GetValue(GetTransactionColumnDfn(SbmTransaction.Column.DeliveryAddress_City).DataName).ToString(), values.GetValue(GetTransactionColumnDfn(SbmTransaction.Column.DeliveryAddress_Province).DataName).ToString(), values.GetValue(GetTransactionColumnDfn(SbmTransaction.Column.DeliveryAddress_Postcode).DataName).ToString(), }; value = new DataValue(addresses.Concat(", ", null, null, true, true).Replace(" ,", ",").Trim(',').Trim()); break; } //--------------------------------------------------------------------- } return value; } //------------------------------------------------------------------- } //======================================================================= }