3.0.1.0 Portal Transactions.

This commit is contained in:
Andy Howard
2025-02-19 11:31:33 +00:00
parent fa01e0799a
commit f8aaa534d1
70 changed files with 1179 additions and 266 deletions
@@ -828,4 +828,13 @@
<data name="label.raised.by" xml:space="preserve">
<value>Raised by</value>
</data>
<data name="label.requirements" xml:space="preserve">
<value>Requirements</value>
</data>
<data name="label.requirement" xml:space="preserve">
<value>Requirement</value>
</data>
<data name="caption.item.requirements" xml:space="preserve">
<value>{0} Items</value>
</data>
</root>
@@ -1,5 +1,4 @@
using DocumentFormat.OpenXml.EMMA;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc;
using Sarand.BusinessMgr.Net.Standard.Base.App;
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
using Sarand.BusinessMgr.Web.Portal.Components;
@@ -13,6 +12,7 @@ using Sarand.Net.Standard.Base.Security;
using Sarand.Net.Standard.Base.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
{
@@ -150,7 +150,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
responseData.Data.TransactionTypes.Add(new AjaxResponse_Data.ItemCodeDesc(transactionType.Code, transactionType.Desc));
// Reference data - statuses.
foreach (SaStatus status in SbmTransaction.ValidStatuses().FindAll(item => item != SaStatus.Deleted))
foreach (SaStatus status in SbmTransaction.ValidStatusesByType(model.GetFilterTransactionType()).Where(item => item != SaStatus.Deleted))
responseData.Data.Statuses.Add(new AjaxResponse_Data.ItemCodeDesc(SacsSystem.GetStatusCode(status), Localiser.GetStatusCaption(status)));
responseData.Data.DefaultStatusCode = SacsSystem.GetStatusCode(SbmTransaction.DefaultStatus);
}
@@ -218,7 +218,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
else prmTransaction.StatusCat = SbmTransaction.StatusCat.NotDeleted;
if (model.GetFilterTransactionType() <= 0)
prmTransaction.SortColumns.Add(TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.Type_Desc));
prmTransaction.SortColumns.Add(TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.Ref));
prmTransaction.SortColumns.Add(TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.RaisedOn).SetSortDescending());
model.Paging.ItemTotal = (ulong)TransactionMgr.GetTransactionCount(prmTransaction);
model.PopulatePagingTo(prmTransaction.ResultsPaging);
@@ -407,6 +407,11 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"]));
}
transaction = TransactionMgr.CreateTransaction(associationId, model.GetTransactionType());
if (transaction == null)
{
SaLogger.Warn($"{SysUtil.Fn} Failed to create Transaction. {TransactionMgr.ErrorStateMessage.TrimEnd('.')}.");
return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"]));
}
}
// Populate item properties.
@@ -416,11 +421,34 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
transaction.RefExt = model.Transaction.ReferenceExt;
if (model.Transaction.DescBrief != null)
transaction.DescBrief = model.Transaction.DescBrief;
if (model.Transaction.RaisedBy != null)
transaction.RaisedBy = model.Transaction.RaisedBy;
if (model.Transaction.ContactName != null)
transaction.ContactName = model.Transaction.ContactName;
// Status & dates.
if (model.Transaction.StatusCode != null)
transaction.Status = model.GetTransactionStatus();
// Raised date.
if (model.Transaction.Raised != null)
transaction.Raised = model.ParseDateFromForm(model.Transaction.Raised);
if (transaction.TransactionStatusCat == SbmTransaction.StatusCat.Pending)
transaction.InProgress = DateTime.MinValue;
else
{
// In Progress date.
if (model.Transaction.InProgress != null)
transaction.InProgress = model.ParseDateFromForm(model.Transaction.InProgress);
// Closed date.
if (transaction.TransactionStatusCat == SbmTransaction.StatusCat.Closed)
transaction.Closed = DateTime.MinValue;
else if (model.Transaction.Closed != null)
transaction.Closed = model.ParseDateFromForm(model.Transaction.Closed);
}
// Common properties.
if (model.Transaction.Notes != null)
transaction.Notes = model.Transaction.Notes;
if (model.Transaction.StatusCode != null)
transaction.Status = model.GetTransactionStatus();
// Store item.
if (!SysId.IsValid(transaction.Id))
@@ -17,6 +17,7 @@ using System.Threading.Tasks;
using Sarand.BusinessMgr.Web.Portal.Models.Transactions;
using Sarand.BusinessMgr.Web.Portal.Components;
using Sarand.Net.Standard.Base.Core;
using System.Transactions;
namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
{
@@ -55,7 +56,13 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
// Transaction page.
Model_Transaction model = new Model_Transaction(Localiser);
RefreshModel(model);
model.Filter.TransactionType = transactionTypes.GetCodeForType(transactionType);
model.Filter.Type = transactionTypes.GetCodeForType(transactionType);
if (StringUtil.IsBlank(model.Filter.Type))
{
SaLogger.Warn($"{SysUtil.Fn} Transaction View invoked without Transaction Type specified.");
return RedirectToAction("", "");
}
model.Filter.StatusCat = Internals.GetSystemCodes(Sbm.SystemCode.TransactionStatusCat).GetCodeForType(SbmTransaction.StatusCat.Open);
model.Paging.PageNo = SessionData_Portal.Profile.Transaction.Filter.PageNo;
model.Paging.PageLength = SessionData_Portal.Profile.Transaction.Filter.PageLength;
model.PopulateListConfig();
@@ -0,0 +1,520 @@
using Sarand.BusinessMgr.Net.Standard.Base.App;
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Utils;
using System;
using System.Collections.Generic;
using System.Drawing;
namespace Sarand.BusinessMgr.Web.Portal.Models.Requirements
{
//=======================================================================
// Requirement model - Configuration.
//=======================================================================
partial class Model_Requirement
{
//-------------------------------------------------------------------
// Requirement fields.
//-------------------------------------------------------------------
/// <summary>Prefix for field names.</summary>
public const String FieldNamePrefix = "Reqnt";
//-------------------------------------------------------------------
/// <summary>Item fields.</summary>
public enum ItemField
{
// Identity.
Pos,
Id,
TransactionId,
AssociationName,
AssociationId,
Type,
Sequence,
JobNumber,
// Source requirement.
SourceReqntId,
SourceReqntTransRef,
SourceReqntTransRefExt,
SourceReqntJobNumber,
// Status dates.
Required, RequiredFmt,
Started, StartedFmt,
Completed, CompletedFmt,
// Details.
AssociationIdSubContract,
DescBrief,
DescIntro,
DescOutline,
DescDetail,
PromotionCode,
PromotionCaption,
NominalCode,
RandDIndicator,
// Commodity.
CommodityId,
ProductCode,
DrawingIssue,
AssetId,
Quantity,
QuantityProd,
UomId,
MaterialSourceCode,
LocationIdStock,
AllocationIndicator,
// Amounts.
AmountUnit,
AmountAct,
AmountDisc,
AmountNet,
TaxCodeId,
TaxRate,
AmountTax,
AmountTot,
TimeEst,
TimeAct,
TimeTot,
// Costs.
CostLabourHours,
CostLabourRateHour,
CostLabour,
CostCommodity,
CostPurchase,
CostProcess,
CostAdditional,
CostTotal,
CostCalculated,
CostPercentMargin,
// Common.
Notes,
Status,
OnHold,
CreatedOn,
UpdatedOn,
Actions,
//---------------------------------------------------------------
}
/// <summary>
/// Identifier used by form fields to show control specific messages generated by model validation etc.
/// <para>- Both page and model should use this method to consistently generate the field name.</para>
/// </summary>
public static String GetFieldName(ItemField field)
{
return $"{FieldNamePrefix}{field}";
}
//-------------------------------------------------------------------
// List configuration.
public class ListConfigData
{
// List caption.
public String Caption { get; set; }
// Actions.
public class ActionData
{
public class AllowData
{
public bool? Create { get; set; }
public bool? Update { get; set; }
}
public AllowData Allow { get; } = new AllowData();
}
public ActionData Action { get; } = new ActionData();
// List columns.
public class ColumnData
{
// Column name prefix.
public String Prefix { get; } = Model_Requirement.FieldNamePrefix;
// Hide column.
public HashSet<string> Hide { get; } = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase);
// Column labels.
public Dictionary<String, String> Label { get; } = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
}
public ColumnData Column { get; } = new ColumnData();
}
public ListConfigData ListConfig { get; private set; }
//-------------------------------------------------------------------
/// <summary>
/// Populate Requirement list configuration data in this model - only required on initial page construction.
/// </summary>
public void PopulateListConfig()
{
ListConfig = new ListConfigData();
PopulateListConfig(ListConfig);
}
/// <summary>
/// Populate Requirement list configuration data.
/// </summary>
public void PopulateListConfig(ListConfigData config)
{
// View properties.
ViewMode viewMode = GetFilterMode();
bool modeIsSearch = viewMode == ViewMode.Search;
bool modeIsMaintain = viewMode == ViewMode.Maintain;
bool modeIsProductionControl = viewMode == ViewMode.ProductionControl;
bool modeIsCommodityHistory_Maintain = viewMode == ViewMode.CommodityHistory_Maintain;
bool modeIsCommodityHistory_ReadOnly = viewMode == ViewMode.CommodityHistory_ReadOnly;
bool modeIsCommodityHistory = modeIsCommodityHistory_Maintain || modeIsCommodityHistory_ReadOnly;
bool modeIsAssetOrders_Maintain = viewMode == ViewMode.AssetOrders_Maintain;
bool modeIsAssetOrders_ReadOnly = viewMode == ViewMode.AssetOrders_ReadOnly;
bool modeIsAssetOrders = modeIsAssetOrders_Maintain || modeIsAssetOrders_ReadOnly;
// Transaction.
Sbm.TransactionType transactionType = GetFilterTransactionType();
SbmTransaction.StatusCat transactionStatusCat = GetFilterTransactionStatusCat();
bool isProject = transactionType == Sbm.TransactionType.Project;
bool isSales = SbmTransaction.IsSalesType(transactionType);
bool isSalesLead = transactionType == Sbm.TransactionType.SalesLead;
bool isSalesQuote = transactionType == Sbm.TransactionType.SalesQuote;
bool isSalesOrder = transactionType == Sbm.TransactionType.SalesOrder || transactionType == Sbm.TransactionType.ProformaSalesOrder;
bool isSalesPO = transactionType == Sbm.TransactionType.SalesPO;
bool isSalesDispatch = transactionType == Sbm.TransactionType.SalesDispatch;
bool isSalesInvoice = transactionType == Sbm.TransactionType.SalesInvoice || transactionType == Sbm.TransactionType.ProformaSalesInvoice;
bool isPurchase = SbmTransaction.IsPurchaseType(transactionType);
bool isPurchaseQuote = transactionType == Sbm.TransactionType.PurchaseQuote;
bool isPurchaseOrder = transactionType == Sbm.TransactionType.PurchaseOrder || transactionType == Sbm.TransactionType.ProformaPurchaseOrder;
bool isPurchaseSO = transactionType == Sbm.TransactionType.PurchaseSO;
bool isPurchaseDelivery = transactionType == Sbm.TransactionType.PurchaseDelivery;
bool isPurchaseInvoice = transactionType == Sbm.TransactionType.PurchaseInvoice || transactionType == Sbm.TransactionType.ProformaPurchaseInvoice;
// Requirement.
Sbm.RequirementType requirementType = GetFilterRequirementType();
SbmRequirement.StatusCat requirementStatusCat = GetFilterRequirementStatusCat();
// Options.
bool userCanCreateRequirements = SessionData_Portal.SecurityProfile.UserCanCreateItemType(Sbm.ItemType.Requirement);
bool userCanUpdateRequirements = SessionData_Portal.SecurityProfile.UserCanUpdateItemType(Sbm.ItemType.Requirement);
bool allowJobNumber = SessionConsole.AllowOption(Sbm.ConfigOption.SalesOrderItemJobNumber);
bool showDrawingIssue = SessionConsole.DisplayAttribute(SbmDbDfn.ColumnIdx.Commodity_DrawingIssue);
bool showAllocationInd = SessionConsole.GetOwnerOption_ShowColumn(Sbm.OrgOption_ShowColumn.OrderItem_AllocationInd);
SbmStockControlConfig stockControlConfig = Internals.StockControlConfig;
bool allowProductionControl = SessionConsole.AllowOption(Sbm.ConfigOption.ProductionControl);
bool allowTimeRecording = SessionConsole.AllowOption(Sbm.ConfigOption.TimeRecording);
bool allowCommodityPromotions = SessionConsole.AllowOption(Sbm.ConfigOption.CommodityPromotion);
bool allowJobCosting = SessionConsole.GetRequirementCostingConfig().AllowRequirementCosting(transactionType) && TransactionMgr.CostColumnsAreAvailable() && UserCanViewFinancials();
bool allowSalesOrderItemRandD = SessionConsole.AllowOption(Sbm.ConfigOption.SalesOrderItemRandD);
//---------------------------------------------------------------
// List Caption.
config.Caption = StringUtil.OnBlank(GetListCaptionByTransactionType(transactionType), Localiser["label.requirements"]);
//---------------------------------------------------------------
// Actions.
if (userCanCreateRequirements)
config.Action.Allow.Create = true;
if (userCanUpdateRequirements)
config.Action.Allow.Update = true;
//---------------------------------------------------------------
// Requirement list columns.
// Position.
// Id
if (!SbmSystem.DebugMode)
config.Column.Hide.Add($"{ItemField.Id}");
// Sequence - Maintain mode.
if (modeIsMaintain)
{
// Sequence column shown.
}
else config.Column.Hide.Add($"{ItemField.Sequence}");
// Job Number - Only Sales Orders and not Search/Production/Asset modes.
if (isSalesOrder && !modeIsSearch && !modeIsProductionControl && !modeIsAssetOrders && allowJobNumber)
{
// Job Number column shown.
}
else config.Column.Hide.Add($"{ItemField.JobNumber}");
//---------------------------------------------------------------
// Source Requirement references - Sales Dispatch/Invoice not in Search/Production/Asset modes.
if ((isSalesDispatch || isSalesInvoice) && !modeIsSearch && !modeIsProductionControl && !modeIsAssetOrders)
{
// Source requirement references shown.
if (!allowJobNumber)
config.Column.Hide.Add($"{ItemField.SourceReqntJobNumber}");
}
else
{
config.Column.Hide.Add($"{ItemField.SourceReqntTransRef}");
config.Column.Hide.Add($"{ItemField.SourceReqntTransRefExt}");
config.Column.Hide.Add($"{ItemField.SourceReqntJobNumber}");
}
//---------------------------------------------------------------
// Product code - not in Commodity/Asset modes.
if (!modeIsCommodityHistory && !modeIsAssetOrders)
{
// Product Code is shown.
}
else config.Column.Hide.Add($"{ItemField.ProductCode}");
// Drawing Issue - not Assets modes.
if (showDrawingIssue && !modeIsAssetOrders)
{
// Drawing Issue is shown.
}
else config.Column.Hide.Add($"{ItemField.DrawingIssue}");
// Description - always shown.
// Required - Sales Quote/Order, Purchase Order.
if (isSalesQuote || isSalesOrder || isPurchaseOrder)
{
// Required is shown.
}
else
{
config.Column.Hide.Add($"{ItemField.Required}");
config.Column.Hide.Add($"{ItemField.RequiredFmt}");
}
//---------------------------------------------------------------
// Quantity - always shown.
// Production Quantity - Sales Quote/Order not in Assets mode.
if (allowProductionControl && (isSalesQuote || isSalesOrder) && !modeIsAssetOrders)
{
// Production Quantity is shown.
}
else config.Column.Hide.Add($"{ItemField.QuantityProd}");
// Allocation Indicator - Sales/Purchase Order not in Assets mode.
if (stockControlConfig.AllowStockControl() && showAllocationInd && (isSalesOrder || isPurchaseOrder) && transactionStatusCat != SbmTransaction.StatusCat.Pending && !modeIsAssetOrders)
{
// Allocation Indicator is shown.
}
else config.Column.Hide.Add($"{ItemField.AllocationIndicator}");
//---------------------------------------------------------------
// Financials.
// Unit Amount.
if (UserCanViewFinancials())
{
// Unit Amount is shown.
}
else config.Column.Hide.Add($"{ItemField.AmountUnit}");
// Net Amount - Maintain mode only.
if (UserCanViewFinancials() && modeIsMaintain)
{
// Unit Amount is shown.
}
else config.Column.Hide.Add($"{ItemField.AmountNet}");
// Tax Amount - Maintain mode only.
if (UserCanViewFinancials() && isSalesInvoice && modeIsMaintain)
{
// Tax Amount is shown.
}
else config.Column.Hide.Add($"{ItemField.AmountTax}");
// Total Amount - Maintain mode only.
if (UserCanViewFinancials() && !isSalesDispatch && !isPurchaseQuote && !isPurchaseOrder && modeIsMaintain)
{
// Total Amount is shown.
}
else config.Column.Hide.Add($"{ItemField.AmountTot}");
//---------------------------------------------------------------
// Research & Development Indicator.
if (isSalesOrder && allowSalesOrderItemRandD && modeIsMaintain)
{
// R&D Indicator is shown.
}
else config.Column.Hide.Add($"{ItemField.RandDIndicator}");
// Time columns.
// Estimated Time.
if ((isProject || isSalesQuote || isSalesOrder) && allowProductionControl && modeIsMaintain)
{
// Estimated Time is shown.
}
else config.Column.Hide.Add($"{ItemField.TimeEst}");
// Actual time.
if (isSalesOrder && allowProductionControl && modeIsMaintain)
{
// Actual Time is shown.
}
else config.Column.Hide.Add($"{ItemField.TimeAct}");
// Total time.
if ((isProject || isSalesOrder) && allowTimeRecording && modeIsMaintain)
{
// Total Time is shown.
}
else config.Column.Hide.Add($"{ItemField.TimeTot}");
// Job Costing.
if (allowJobCosting && modeIsMaintain)
{
}
else
{
config.Column.Hide.Add($"{ItemField.CostTotal}");
config.Column.Hide.Add($"{ItemField.CostPercentMargin}");
}
// Promotions.
if (allowCommodityPromotions && modeIsMaintain)
{
// Promotion is shown.
}
else
{
config.Column.Hide.Add($"{ItemField.PromotionCode}");
config.Column.Hide.Add($"{ItemField.PromotionCaption}");
}
//---------------------------------------------------------------
// Common.
// Status.
if (!isSalesDispatch && !isSalesInvoice && !isPurchaseInvoice && modeIsMaintain)
{
// Status is shown.
}
else config.Column.Hide.Add($"{ItemField.Status}");
// Actions.
if (modeIsMaintain)
{
// Actions are shown.
}
else config.Column.Hide.Add($"{ItemField.Actions}");
}
//-------------------------------------------------------------------
private String GetListCaptionByTransactionType(Sbm.TransactionType transactionType)
{
String transactionTypeCaption = GetTransactionTypeCaption(transactionType);
if (!StringUtil.IsBlank(transactionTypeCaption))
return Localiser.GetText("caption.item.requirements", new object[] { transactionTypeCaption });
return Localiser["label.requirements"];
}
private String GetTransactionTypeCaption(Sbm.TransactionType transactionType)
{
switch (transactionType)
{
case Sbm.TransactionType.Project: return Localiser["caption.projects"];
case Sbm.TransactionType.SalesLead: return Localiser["caption.sales.leads"];
case Sbm.TransactionType.SalesQuote: return Localiser["caption.sales.quotes"];
case Sbm.TransactionType.ProformaSalesOrder: return Localiser["caption.proforma.sales.orders"];
case Sbm.TransactionType.SalesPO: return Localiser["caption.sales.purchase.orders"];
case Sbm.TransactionType.SalesOrder: return Localiser["caption.sales.orders"];
case Sbm.TransactionType.SalesDispatch: return Localiser["caption.sales.dispatches"];
case Sbm.TransactionType.ProformaSalesInvoice: return Localiser["caption.proforma.sales.invoices"];
case Sbm.TransactionType.SalesInvoice: return Localiser["caption.sales.invoices"];
case Sbm.TransactionType.PurchaseQuote: return Localiser["caption.purchase.quotes"];
case Sbm.TransactionType.ProformaPurchaseOrder: return Localiser["caption.proforma.purchase.orders"];
case Sbm.TransactionType.PurchaseSO: return Localiser["caption.purchase.sales.orders"];
case Sbm.TransactionType.PurchaseOrder: return Localiser["caption.purchase.orders"];
case Sbm.TransactionType.PurchaseDelivery: return Localiser["caption.purchase.deliveries"];
case Sbm.TransactionType.ProformaPurchaseInvoice: return Localiser["caption.proforma.purchase.invoices"];
case Sbm.TransactionType.PurchaseInvoice: return Localiser["caption.purchase.invoices"];
}
return "";
}
//-------------------------------------------------------------------
// Item configuration.
//-------------------------------------------------------------------
// Contact item configuration.
public class ItemConfigData
{
// Item type.
public bool? IsOrganisation { get; set; }
public bool? IsIndividual { get; set; }
public bool? IsGroup { get; set; }
// Item fields.
public class FieldData
{
// Field name prefix.
public String Prefix { get; } = Model_Requirement.FieldNamePrefix;
// Hide field.
public HashSet<string> Hide { get; } = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase);
// Read-only field.
public HashSet<string> Readonly { get; } = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase);
// Field labels.
public Dictionary<String, String> Label { get; } = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
}
public FieldData Field { get; } = new FieldData();
}
//-------------------------------------------------------------------
/// <summary>
/// Populate item configuration for existing requirement.
/// </summary>
public void PopulateItemConfig(ItemConfigData config, SbmTransaction transaction, SbmRequirement requirement)
{
PopulateItemConfig(config, requirement.GetItemId(), transaction.TransactionType, requirement.RequirementType);
}
/// <summary>
/// Populate item configuration for new or existing requirement.
/// </summary>
public void PopulateItemConfig(ItemConfigData config, ItemId requirementItemId, Sbm.TransactionType transactionType, Sbm.RequirementType requirementType)
{
// Item type.
bool isSales = SbmTransaction.IsSalesType(transactionType);
bool isPurchase = SbmTransaction.IsPurchaseType(transactionType);
// Configuration options.
bool importedFromAccounts = Internals.AccountsConsole.ItemIsImportedFromAccounts(requirementItemId);
bool managedByAccounts = Internals.AccountsConsole.IsItemTypeManagedByAccounts(Sbm.ItemType.Requirement);
bool showDrawingIssue = SessionConsole.DisplayAttribute(SbmDbDfn.ColumnIdx.Commodity_DrawingIssue);
bool showNotes = true;
//---------------------------------------------------------------
// Requirement.
// Id.
if (SbmSystem.DebugMode)
config.Field.Readonly.Add($"{ItemField.Id}");
else
config.Field.Hide.Add($"{ItemField.Id}");
// Job Number.
if (transactionType != Sbm.TransactionType.SalesOrder || !SessionConsole.AllowOption(Sbm.ConfigOption.SalesOrderItemJobNumber))
config.Field.Hide.Add($"{ItemField.JobNumber}");
// Narrative.
config.Field.Label.Add($"{ItemField.DescBrief}", SessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Requirement_DescBrief, Localiser["label.narrative"]));
if (managedByAccounts)
config.Field.Readonly.Add($"{ItemField.DescBrief}");
//---------------------------------------------------------------
// Sales order.
//---------------------------------------------------------------
// Purchase order.
//---------------------------------------------------------------
// Common.
// Notes.
if (!showNotes)
config.Field.Hide.Add($"{ItemField.Notes}");
// Status.
// Read-only if transaction being superceded.
if (managedByAccounts)
config.Field.Readonly.Add($"{ItemField.Status}");
}
//-------------------------------------------------------------------
}
}
@@ -0,0 +1,235 @@
using Microsoft.AspNetCore.Mvc.Rendering;
using Sarand.BusinessMgr.Net.Core.Web.App;
using Sarand.BusinessMgr.Net.Standard.Base.App;
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
using Sarand.BusinessMgr.Web.Portal.Components;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Sarand.BusinessMgr.Web.Portal.Models.Requirements
{
//=======================================================================
// Requirement model.
//=======================================================================
/// <summary>
/// Requirement model - Filter, Form, validation and configuration.
/// </summary>
public partial class Model_Requirement : SbmModel_Portal
{
//-------------------------------------------------------------------
// Definitions.
public enum ViewMode
{
// 'Commit updates' modes - changes are immediately commited to the database.
Maintain,
ProductionControl,
CommodityHistory_Maintain,
AssetOrders_Maintain,
// 'No updates' modes - no changes are allowed.
CommodityHistory_ReadOnly,
AssetOrders_ReadOnly,
Search
}
//-------------------------------------------------------------------
// Construction.
public Model_Requirement(SbmLocaliser localiser) :
base(localiser)
{
}
//-------------------------------------------------------------------
// Filter properties.
public class FilterData
{
public String Mode { get; set; }
public String TransactionType { get; set; }
public String Type { get; set; }
public String Search { get; set; }
public String TransactionStatusCat { get; set; }
public String StatusCat { get; set; }
}
public FilterData Filter { get; } = new FilterData();
public ViewMode GetFilterMode()
{
return EnumUtil.ParseEnum(Filter.Mode, ViewMode.Search);
}
public Sbm.TransactionType GetFilterTransactionType()
{
Sbm.TransactionType transactionType = (Sbm.TransactionType)Internals.TransactionTypeCodes.GetTypeForCode(Filter.Type);
if (transactionType == 0 && !StringUtil.IsBlank(Filter.Type) && StringUtil.IsNumeric(Filter.Type, true))
transactionType = (Sbm.TransactionType)StringUtil.ToInt(Filter.Type);
return transactionType;
}
public Sbm.RequirementType GetFilterRequirementType()
{
Sbm.RequirementType transactionType = (Sbm.RequirementType)Internals.RequirementTypeCodes.GetTypeForCode(Filter.Type);
if (transactionType == 0 && !StringUtil.IsBlank(Filter.Type) && StringUtil.IsNumeric(Filter.Type, true))
transactionType = (Sbm.RequirementType)StringUtil.ToInt(Filter.Type);
return transactionType;
}
public SbmTransaction.StatusCat GetFilterTransactionStatusCat()
{
return (SbmTransaction.StatusCat)Internals.GetSystemCodes(Sbm.SystemCode.TransactionStatusCat).GetTypeForCode(Filter.TransactionStatusCat);
}
public SbmRequirement.StatusCat GetFilterRequirementStatusCat()
{
return (SbmRequirement.StatusCat)Internals.GetSystemCodes(Sbm.SystemCode.RequirementStatusCat).GetTypeForCode(Filter.StatusCat);
}
//-------------------------------------------------------------------
// Requirement properties.
public class RequirementData
{
public String Exists { get; set; }
public String Id { get; set; }
public String TransactionId { get; set; }
public String RequirementIdSource { get; set; }
public String Type { get; set; }
public String Sequence { get; set; }
public String JobNumber { get; set; }
// Status dates.
public String Required { get; set; }
public String Started { get; set; }
public String Completed { get; set; }
// Details.
public String AssociationIdSubContract { get; set; }
public String DescBrief { get; set; }
public String DescIntro { get; set; }
public String DescOutline { get; set; }
public String DescDetail { get; set; }
public String PromotionCode { get; set; }
public String NominalCode { get; set; }
// Commodity.
public String CommodityId { get; set; }
public String ProductCode { get; set; }
public String AssetId { get; set; }
public String Quantity { get; set; }
public String QuantityProd { get; set; }
public String UomId { get; set; }
public String Weight { get; set; }
public String UomIdWeight { get; set; }
public String MaterialSourceCode { get; set; }
public String LocationIdStock { get; set; }
// Amounts.
public String AmountUnit { get; set; }
public String AmountAct { get; set; }
public String AmountDisc { get; set; }
public String AmountNet { get; set; }
public String TaxCodeId { get; set; }
public String TaxRate { get; set; }
public String AmountTax { get; set; }
public String AmountTot { get; set; }
// Common properties.
public String Notes { get; set; }
public String StatusCode { get; set; }
}
public RequirementData Requirement { get; } = new RequirementData();
public Sbm.RequirementType GetRequirementType()
{
return (Sbm.RequirementType)Internals.RequirementTypeCodes.GetTypeForCode(Requirement.Type);
}
public SaStatus GetRequirementStatus()
{
return SacsSystem.GetStatusForCode(Requirement.StatusCode);
}
//-------------------------------------------------------------------
// Validation.
//-------------------------------------------------------------------
// Requirement validation.
public bool ValidateRequirementData(Sacs.Web.Components.SaController.AjaxResponse_Data responseData)
{
// Narrative.
if (Requirement.DescBrief != null)
{
String controlName = GetFieldName(ItemField.DescBrief);
responseData.SetControlValue(controlName, Requirement.DescBrief);
if (StringUtil.GetLength(Requirement.DescBrief) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Requirement_DescBrief))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Requirement_DescBrief)]);
}
// Desc Intro.
if (Requirement.DescIntro != null)
{
String controlName = GetFieldName(ItemField.DescIntro);
responseData.SetControlValue(controlName, Requirement.DescIntro);
if (StringUtil.GetLength(Requirement.DescIntro) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Requirement_DescIntro))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Requirement_DescIntro)]);
}
// Desc Outline.
if (Requirement.DescOutline != null)
{
String controlName = GetFieldName(ItemField.DescOutline);
responseData.SetControlValue(controlName, Requirement.DescOutline);
if (StringUtil.GetLength(Requirement.DescOutline) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Requirement_DescOutline))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Requirement_DescOutline)]);
}
// Desc Detail.
if (Requirement.DescDetail != null)
{
String controlName = GetFieldName(ItemField.DescDetail);
responseData.SetControlValue(controlName, Requirement.DescDetail);
if (StringUtil.GetLength(Requirement.DescDetail) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Requirement_DescDetail))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Requirement_DescDetail)]);
}
// Requirement status.
if (Requirement.StatusCode != null)
{
String controlName = GetFieldName(ItemField.Status);
if (Requirement.StatusCode.IsEmpty())
responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]);
else if (!SbmRequirement.ValidStatuses.Contains(GetRequirementStatus()))
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
}
// Required.
if (Requirement.Required != null)
{
String controlName = GetFieldName(ItemField.Required);
if (!Requirement.Required.IsEmpty() && !DateUtil.IsValid(ParseDateFromForm(Requirement.Required)))
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
}
// Status dates - Started.
if (Requirement.Started != null)
{
String controlName = GetFieldName(ItemField.Started);
if (!Requirement.Started.IsEmpty() && !DateUtil.IsValid(ParseDateFromForm(Requirement.Started)))
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
}
// Status dates - Completed.
if (Requirement.Completed != null)
{
String controlName = GetFieldName(ItemField.Completed);
if (!Requirement.Completed.IsEmpty() && !DateUtil.IsValid(ParseDateFromForm(Requirement.Completed)))
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
}
// Requirement Notes.
if (Requirement.Notes != null)
{
String controlName = GetFieldName(ItemField.Notes);
responseData.SetControlValue(controlName, Requirement.Notes);
if (!Requirement.Notes.IsEmpty() && StringUtil.GetLength(Requirement.Notes) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Requirement_Notes))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Requirement_Notes)]);
}
return !responseData.HasControlErrors();
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -233,7 +233,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
//---------------------------------------------------------------
// List Caption.
config.Caption = StringUtil.OnBlank(GetListCaptionByTransactionType(transactionType),Localiser["label.transactions"]);
config.Caption = StringUtil.OnBlank(GetListCaptionByTransactionType(transactionType), Localiser["label.transactions"]);
//---------------------------------------------------------------
// Actions.
@@ -343,7 +343,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
}
// In Progress date.
if (!modeIsDeliveryPlanning && !isSalesLead && !isSalesDispatch && transactionStatusCat != SbmTransaction.StatusCat.Pending)
if (!modeIsDeliveryPlanning && !isSalesLead && !isSalesDispatch && transactionStatusCat == SbmTransaction.StatusCat.Open)
{
//config.Column.Label.Add($"{ItemField.InProgress}", Localiser["label.in.progress"]);
}
@@ -367,7 +367,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
}
// Closed date.
if (modeIsDeliveryPlanning || transactionStatusCat != SbmTransaction.StatusCat.Open)
if (modeIsDeliveryPlanning || transactionStatusCat == SbmTransaction.StatusCat.Closed)
{
//config.Column.Label.Add($"{ItemField.Closed}", Localiser["label.closed"]);
}
@@ -588,7 +588,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
//-------------------------------------------------------------------
/// <summary>
/// Populate item configuration for existing association.
/// Populate item configuration for existing transaction.
/// </summary>
public void PopulateItemConfig(ItemConfigData config, SbmTransaction transaction)
{
@@ -596,7 +596,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
}
/// <summary>
/// Populate item configuration for new or existing association.
/// Populate item configuration for new or existing transaction.
/// </summary>
public void PopulateItemConfig(ItemConfigData config, ItemId transactionItemId, Sbm.TransactionType transactionType)
{
@@ -40,7 +40,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
public class FilterData
{
public String Mode { get; set; }
public String TransactionType { get; set; }
public String Type { get; set; }
public String Search { get; set; }
public String StatusCat { get; set; }
}
@@ -51,9 +51,9 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
}
public Sbm.TransactionType GetFilterTransactionType()
{
Sbm.TransactionType transactionType = (Sbm.TransactionType)Internals.TransactionTypeCodes.GetTypeForCode(Filter.TransactionType);
if (transactionType == 0 && !StringUtil.IsBlank(Filter.TransactionType) && StringUtil.IsNumeric(Filter.TransactionType, true))
transactionType = (Sbm.TransactionType)StringUtil.ToInt(Filter.TransactionType);
Sbm.TransactionType transactionType = (Sbm.TransactionType)Internals.TransactionTypeCodes.GetTypeForCode(Filter.Type);
if (transactionType == 0 && !StringUtil.IsBlank(Filter.Type) && StringUtil.IsNumeric(Filter.Type, true))
transactionType = (Sbm.TransactionType)StringUtil.ToInt(Filter.Type);
return transactionType;
}
public String GetFilterAssociationTypeCode()
@@ -66,7 +66,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
}
public SbmTransaction.StatusCat GetFilterTransactionStatusCat()
{
return (SbmTransaction.StatusCat)StringUtil.ToInt(Filter.StatusCat);
return (SbmTransaction.StatusCat)Internals.GetSystemCodes(Sbm.SystemCode.TransactionStatusCat).GetTypeForCode(Filter.StatusCat);
}
/// <summary>Transaction Status Cats for filter dropdown.</summary>
@@ -100,10 +100,10 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
public String Raised { get; set; }
public String Required { get; set; }
public String InProgress { get; set; }
public String Closed { get; set; }
// Delivery.
public String DeliveredEst { get; set; }
public String DeliveredAct { get; set; }
public String Closed { get; set; }
public String Department { get; set; }
public String DescBrief { get; set; }
public String DescIntro { get; set; }
@@ -168,7 +168,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
Sbm.TransactionType transactionType = GetTransactionType();
if (Transaction.Type != null)
{
String controlName = Model_Transaction.GetFieldName(Model_Transaction.ItemField.Type);
String controlName = GetFieldName(ItemField.Type);
if (Transaction.Type.IsEmpty() || GetTransactionType() <= 0)
responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]);
else if (!SessionConsole.AllowTransactionType(transactionType))
@@ -178,7 +178,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
// Association.
if (Transaction.AssociationId != null)
{
String controlName = Model_Transaction.GetFieldName(Model_Transaction.ItemField.AssociationName);
String controlName = GetFieldName(ItemField.AssociationName);
SysId associationId = SysId.ToSysId(Transaction.AssociationId);
if (!SysId.IsValid(associationId))
responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]);
@@ -187,7 +187,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
// Reference.
if (Transaction.Reference != null)
{
String controlName = Model_Transaction.GetFieldName(Model_Transaction.ItemField.Reference);
String controlName = GetFieldName(ItemField.Reference);
responseData.SetControlValue(controlName, Transaction.Reference);
if (StringUtil.GetLength(Transaction.Reference) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_Ref))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_Ref)]);
@@ -196,7 +196,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
// Ext Reference.
if (Transaction.ReferenceExt != null)
{
String controlName = Model_Transaction.GetFieldName(Model_Transaction.ItemField.ReferenceExt);
String controlName = GetFieldName(ItemField.ReferenceExt);
responseData.SetControlValue(controlName, Transaction.ReferenceExt);
if (StringUtil.GetLength(Transaction.ReferenceExt) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_RefExt))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_RefExt)]);
@@ -205,7 +205,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
// Narrative.
if (Transaction.DescBrief != null)
{
String controlName = Model_Transaction.GetFieldName(Model_Transaction.ItemField.DescBrief);
String controlName = GetFieldName(ItemField.DescBrief);
responseData.SetControlValue(controlName, Transaction.DescBrief);
if (StringUtil.GetLength(Transaction.DescBrief) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_DescBrief))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_DescBrief)]);
@@ -214,7 +214,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
// Contact Name.
if (Transaction.ContactName != null)
{
String controlName = Model_Transaction.GetFieldName(Model_Transaction.ItemField.ContactName);
String controlName = GetFieldName(ItemField.ContactName);
responseData.SetControlValue(controlName, Transaction.ContactName);
if (StringUtil.GetLength(Transaction.ContactName) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_ContactName))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_ContactName)]);
@@ -223,7 +223,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
// Likelihood.
if (Transaction.Likelihood != null)
{
String controlName = Model_Transaction.GetFieldName(Model_Transaction.ItemField.Likelihood);
String controlName = GetFieldName(ItemField.Likelihood);
responseData.SetControlValue(controlName, Transaction.Likelihood);
if (StringUtil.GetLength(Transaction.Likelihood) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_Likelihood))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_Likelihood)]);
@@ -232,7 +232,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
// Referral code.
if (Transaction.ReferCode != null)
{
String controlName = Model_Transaction.GetFieldName(Model_Transaction.ItemField.ReferCode);
String controlName = GetFieldName(ItemField.ReferCode);
responseData.SetControlValue(controlName, Transaction.ReferCode);
if (StringUtil.GetLength(Transaction.ReferCode) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_ReferCode))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_ReferCode)]);
@@ -241,7 +241,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
// Refer source.
if (Transaction.ReferSource != null)
{
String controlName = Model_Transaction.GetFieldName(Model_Transaction.ItemField.ReferSource);
String controlName = GetFieldName(ItemField.ReferSource);
responseData.SetControlValue(controlName, Transaction.ReferSource);
if (StringUtil.GetLength(Transaction.ReferSource) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_ReferSource))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_ReferSource)]);
@@ -250,7 +250,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
// Department.
if (Transaction.Department != null)
{
String controlName = Model_Transaction.GetFieldName(Model_Transaction.ItemField.Department);
String controlName = GetFieldName(ItemField.Department);
responseData.SetControlValue(controlName, Transaction.Department);
if (StringUtil.GetLength(Transaction.Department) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_Department))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_Department)]);
@@ -259,7 +259,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
// Desc Intro.
if (Transaction.DescIntro != null)
{
String controlName = Model_Transaction.GetFieldName(Model_Transaction.ItemField.DescIntro);
String controlName = GetFieldName(ItemField.DescIntro);
responseData.SetControlValue(controlName, Transaction.DescIntro);
if (StringUtil.GetLength(Transaction.DescIntro) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_DescIntro))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_DescIntro)]);
@@ -268,7 +268,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
// Desc Outline.
if (Transaction.DescOutline != null)
{
String controlName = Model_Transaction.GetFieldName(Model_Transaction.ItemField.DescOutline);
String controlName = GetFieldName(ItemField.DescOutline);
responseData.SetControlValue(controlName, Transaction.DescOutline);
if (StringUtil.GetLength(Transaction.DescOutline) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_DescOutline))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_DescOutline)]);
@@ -277,7 +277,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
// Desc Detail.
if (Transaction.DescDetail != null)
{
String controlName = Model_Transaction.GetFieldName(Model_Transaction.ItemField.DescDetail);
String controlName = GetFieldName(ItemField.DescDetail);
responseData.SetControlValue(controlName, Transaction.DescDetail);
if (StringUtil.GetLength(Transaction.DescDetail) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_DescDetail))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_DescDetail)]);
@@ -286,7 +286,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
// Contact Area code.
if (Transaction.ContactAreaCode != null)
{
String controlName = Model_Transaction.GetFieldName(Model_Transaction.ItemField.ContactAreaCode);
String controlName = GetFieldName(ItemField.ContactAreaCode);
responseData.SetControlValue(controlName, Transaction.ContactAreaCode);
if (StringUtil.GetLength(Transaction.ContactAreaCode) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_ContactAreaCode))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_ContactAreaCode)]);
@@ -295,7 +295,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
// Response code.
if (Transaction.ResponseCode != null)
{
String controlName = Model_Transaction.GetFieldName(Model_Transaction.ItemField.ResponseCode);
String controlName = GetFieldName(ItemField.ResponseCode);
responseData.SetControlValue(controlName, Transaction.ResponseCode);
if (StringUtil.GetLength(Transaction.ResponseCode) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_ResponseCode))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_ResponseCode)]);
@@ -304,7 +304,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
// Box Count.
if (Transaction.BoxCount != null)
{
String controlName = Model_Transaction.GetFieldName(Model_Transaction.ItemField.BoxCount);
String controlName = GetFieldName(ItemField.BoxCount);
responseData.SetControlValue(controlName, Transaction.BoxCount);
if (StringUtil.GetLength(Transaction.BoxCount) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_BoxCount))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_BoxCount)]);
@@ -313,7 +313,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
// Delivery Status code.
if (Transaction.DeliveryStatusCode != null)
{
String controlName = Model_Transaction.GetFieldName(Model_Transaction.ItemField.DeliveryStatus);
String controlName = GetFieldName(ItemField.DeliveryStatus);
responseData.SetControlValue(controlName, Transaction.DeliveryStatusCode);
if (StringUtil.GetLength(Transaction.DeliveryStatusCode) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_DeliveryStatusCode))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_DeliveryStatusCode)]);
@@ -322,7 +322,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
// Delivery Type code.
if (Transaction.DeliveryTypeCode != null)
{
String controlName = Model_Transaction.GetFieldName(Model_Transaction.ItemField.DeliveryType);
String controlName = GetFieldName(ItemField.DeliveryType);
responseData.SetControlValue(controlName, Transaction.DeliveryTypeCode);
if (StringUtil.GetLength(Transaction.DeliveryTypeCode) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_DeliveryTypeCode))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_DeliveryTypeCode)]);
@@ -331,7 +331,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
// Delivery Method code.
if (Transaction.DeliveryMethodCode != null)
{
String controlName = Model_Transaction.GetFieldName(Model_Transaction.ItemField.DeliveryMethod);
String controlName = GetFieldName(ItemField.DeliveryMethod);
responseData.SetControlValue(controlName, Transaction.DeliveryMethodCode);
if (StringUtil.GetLength(Transaction.DeliveryMethodCode) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_DeliveryMethodCode))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_DeliveryMethodCode)]);
@@ -340,7 +340,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
// Delivery Courier code.
if (Transaction.DeliveryCourierCode != null)
{
String controlName = Model_Transaction.GetFieldName(Model_Transaction.ItemField.DeliveryCourier);
String controlName = GetFieldName(ItemField.DeliveryCourier);
responseData.SetControlValue(controlName, Transaction.DeliveryCourierCode);
if (StringUtil.GetLength(Transaction.DeliveryCourierCode) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_DeliveryCourierCode))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_DeliveryCourierCode)]);
@@ -349,7 +349,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
// Delivery Book In code.
if (Transaction.DeliveryBookInCode != null)
{
String controlName = Model_Transaction.GetFieldName(Model_Transaction.ItemField.DeliveryBookIn);
String controlName = GetFieldName(ItemField.DeliveryBookIn);
responseData.SetControlValue(controlName, Transaction.DeliveryBookInCode);
if (StringUtil.GetLength(Transaction.DeliveryBookInCode) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_DeliveryBookInCode))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_DeliveryBookInCode)]);
@@ -358,7 +358,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
// Stock Picker code.
if (Transaction.StockPickerCode != null)
{
String controlName = Model_Transaction.GetFieldName(Model_Transaction.ItemField.StockPicker);
String controlName = GetFieldName(ItemField.StockPicker);
responseData.SetControlValue(controlName, Transaction.StockPickerCode);
if (StringUtil.GetLength(Transaction.StockPickerCode) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_StockPickerCode))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_StockPickerCode)]);
@@ -367,7 +367,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
// Delivery Ref.
if (Transaction.DeliveryRef != null)
{
String controlName = Model_Transaction.GetFieldName(Model_Transaction.ItemField.DeliveryRef);
String controlName = GetFieldName(ItemField.DeliveryRef);
responseData.SetControlValue(controlName, Transaction.DeliveryRef);
if (StringUtil.GetLength(Transaction.DeliveryRef) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_DeliveryRef))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_DeliveryRef)]);
@@ -376,7 +376,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
// Delivery Comment.
if (Transaction.DeliveryComment != null)
{
String controlName = Model_Transaction.GetFieldName(Model_Transaction.ItemField.DeliveryComment);
String controlName = GetFieldName(ItemField.DeliveryComment);
responseData.SetControlValue(controlName, Transaction.DeliveryComment);
if (StringUtil.GetLength(Transaction.DeliveryComment) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_DeliveryComment))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_DeliveryComment)]);
@@ -385,7 +385,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
// Delivery Department.
if (Transaction.DeliveryDepartment != null)
{
String controlName = Model_Transaction.GetFieldName(Model_Transaction.ItemField.DeliveryDepartment);
String controlName = GetFieldName(ItemField.DeliveryDepartment);
responseData.SetControlValue(controlName, Transaction.DeliveryDepartment);
if (StringUtil.GetLength(Transaction.DeliveryDepartment) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_DeliveryDepartment))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_DeliveryDepartment)]);
@@ -394,30 +394,61 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
// Delivery Nominal code.
if (Transaction.DeliveryNominalCode != null)
{
String controlName = Model_Transaction.GetFieldName(Model_Transaction.ItemField.DeliveryNominalCode);
String controlName = GetFieldName(ItemField.DeliveryNominalCode);
responseData.SetControlValue(controlName, Transaction.DeliveryNominalCode);
if (StringUtil.GetLength(Transaction.DeliveryNominalCode) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_DeliveryNominalCode))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_DeliveryNominalCode)]);
}
// Transaction Notes.
if (Transaction.Notes != null)
{
String controlName = Model_Transaction.GetFieldName(Model_Transaction.ItemField.Notes);
responseData.SetControlValue(controlName, Transaction.Notes);
if (!Transaction.Notes.IsEmpty() && StringUtil.GetLength(Transaction.Notes) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_Notes))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_Notes)]);
}
// Transaction status.
if (Transaction.StatusCode != null)
{
String controlName = Model_Transaction.GetFieldName(Model_Transaction.ItemField.Status);
String controlName = GetFieldName(ItemField.Status);
if (Transaction.StatusCode.IsEmpty())
responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]);
else if (!SbmTransaction.ValidStatusesByType(transactionType).Contains(GetTransactionStatus()))
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
}
SbmTransaction.StatusCat transactionStatusCat = SbmTransaction.GetCategoryForStatus(GetTransactionStatus());
// Status dates - Raised.
if (Transaction.Raised != null)
{
String controlName = GetFieldName(ItemField.Raised);
if (Transaction.Raised.IsEmpty() || !DateUtil.IsValid(ParseDateFromForm(Transaction.Raised)))
responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]);
else if (ParseDateFromForm(Transaction.Raised) > DateTime.Today)
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
}
// Status dates - In Progress.
if (Transaction.InProgress != null)
{
String controlName = GetFieldName(ItemField.InProgress);
if ((Transaction.InProgress.IsEmpty() || !DateUtil.IsValid(ParseDateFromForm(Transaction.InProgress))) && (transactionStatusCat == SbmTransaction.StatusCat.Open || transactionStatusCat == SbmTransaction.StatusCat.Closed))
responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]);
else if (ParseDateFromForm(Transaction.InProgress) > DateTime.Today)
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
}
// Status dates - Closed.
if (Transaction.Closed != null)
{
String controlName = GetFieldName(ItemField.Closed);
if ((Transaction.Closed.IsEmpty() || !DateUtil.IsValid(ParseDateFromForm(Transaction.Closed))) && (transactionStatusCat == SbmTransaction.StatusCat.Closed))
responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]);
else if (ParseDateFromForm(Transaction.Closed) > DateTime.Today)
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
}
// Transaction Notes.
if (Transaction.Notes != null)
{
String controlName = GetFieldName(ItemField.Notes);
responseData.SetControlValue(controlName, Transaction.Notes);
if (!Transaction.Notes.IsEmpty() && StringUtil.GetLength(Transaction.Notes) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_Notes))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_Notes)]);
}
return !responseData.HasControlErrors();
}
@@ -80,4 +80,9 @@
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<Folder Include="Portal\Controllers\Requirements\" />
<Folder Include="Views\Requirement\" />
</ItemGroup>
</Project>
@@ -24,6 +24,7 @@
{
@Html.Hidden("Transaction.Id", "", new { @id = "", @class = "TransactionId sbm-input" })
@Html.Hidden("Transaction.Exists", "", new { @id = "", @class = "TransactionExists sbm-input" })
@Html.Hidden("Transaction.Type", "", new { @id = "", @class = "TransactionType sbm-input" })
<div class="spacer2"></div>
@* Association *@
@@ -218,9 +219,33 @@
</div>
<div class="col-6">
@* Raised by *@
<div class="sbm-form-control @Model_Transaction.GetFieldName(Model_Transaction.ItemField.Closed)">
@* Required *@
<div class="sbm-form-control @Model_Transaction.GetFieldName(Model_Transaction.ItemField.Required)">
<div class="row pl-3">
<div class="col-sm-4">
<div class="sbm-label">
<label for="ifTransactionRequired"><span>@Localiser["label.required"]</span></label>
</div>
</div>
<div class="col-sm">
<div class="sbm-control row">
<div class="fixed">@Html.TextBox("Transaction.Required", "", new { @id = "ifTransactionRequired", @class = "TransactionRequired sbm-input sbm-calendar sbm-auto-val", @maxlen = 10 })</div>
<div class="col"><div class="pt-2 pl-2"><img src="~/img/action/delete16.png" class="ClearTransactionRequired sbm-action" alt="" title="" /></div></div>
</div>
<div class="sbm-message"></div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-6">
@* Closed *@
<div class="sbm-form-control @Model_Transaction.GetFieldName(Model_Transaction.ItemField.Closed)">
<div class="row">
<div class="col-sm-4">
<div class="sbm-label">
<label for="ifTransactionClosed"><span>@Localiser["label.closed"]</span></label>
@@ -235,6 +260,9 @@
</div>
</div>
</div>
<div class="col-6">
</div>
</div>
@@ -43,7 +43,7 @@
<div class="row">
@if (ModelTransaction?.GetFilterTransactionType() > 0)
{
@Html.Hidden("Filter.TransactionType", ModelTransaction.Filter.TransactionType, new { @id = "", @class = "FilterTransactionType" })
@Html.Hidden("Filter.Type", ModelTransaction.Filter.Type, new { @id = "", @class = "FilterType sbm-input" })
<input type="hidden" class="FilterAssociationType" value="@ModelTransaction.GetFilterAssociationTypeCode()" />
}
else
@@ -52,7 +52,7 @@
@* Transaction Category *@
<div class="col-4 col-sm-4 sbm-label text-left text-sm-right">@Localiser["label.type"]</div>
<div class="col-7 col-sm-8">
@Html.DropDownList("Filter.TransactionType", Model.GetTransactionTypeCodesForFilterDropdown(), null, new { @id = "", @class = "FilterTransactionType sbm-select" })
@Html.DropDownList("Filter.Type", Model.GetTransactionTypeCodesForFilterDropdown(), null, new { @id = "", @class = "FilterType sbm-select" })
</div>
</div>
}
@@ -60,7 +60,7 @@
@* Transaction Status *@
<div class="col-4 col-sm-4 sbm-label text-left text-sm-right">@Localiser["label.status"]</div>
<div class="col-7 col-sm-8">
@Html.DropDownList("Filter.TransactionStatusCat", ModelTransaction?.GetTransactionStatusCatsForFilterDropdown() ?? Model.GetEmptyListForSelect(), null, new { @id = "", @class = "FilterTransactionStatusCat sbm-select" })
@Html.DropDownList("Filter.StatusCat", ModelTransaction?.GetTransactionStatusCatsForFilterDropdown() ?? Model.GetEmptyListForSelect(), null, new { @id = "", @class = "FilterStatusCat sbm-select" })
</div>
</div>
<div class="col-sm-4 row pb4">
@@ -24,7 +24,7 @@
@* Transaction type *@
<div class="col-4 col-sm-4 sbm-label text-left text-sm-right">@Localiser["label.type"]</div>
<div class="col-8 col-sm-8">
@Html.DropDownList("Filter.TransactionType", Model.GetTransactionTypeCodesForFilterDropdown(), Localiser["label.any"], new { @id = "", @class = "FilterTransactionType sbm-select" })
@Html.DropDownList("Filter.Type", Model.GetTransactionTypeCodesForFilterDropdown(), Localiser["label.any"], new { @id = "", @class = "FilterType sbm-select" })
</div>
</div>
<div class="col-sm-4 row pb4">
@@ -484,7 +484,7 @@ table.sbm-item-list tbody td
/* Item statuses */
.sbm-status-awa, .sbm-status-req, .sbm-status-rai, .sbm-status-clo
.sbm-status-pre, .sbm-status-awa, .sbm-status-req, .sbm-status-rai, .sbm-status-clo
{
color: darkorange;
}
@@ -499,12 +499,12 @@ table.sbm-item-list tbody td
color: darkred;
}
.sbm-status-inp, .sbm-status-exp, .sbm-status-inv, .sbm-status-suc, .sbm-status-act, .sbm-status-que, .sbm-status-log
.sbm-status-wip, .sbm-status-exp, .sbm-status-inv, .sbm-status-suc, .sbm-status-act, .sbm-status-que, .sbm-status-log
{
color: darkcyan;
}
.sbm-status-pre, .sbm-status-pro, .sbm-status-inp, .sbm-status-hld, .sbm-status-upd, .sbm-status-sup, .sbm-status-aut, .sbm-status-sub
.sbm-status-pro, sbm-status-hld, .sbm-status-upd, .sbm-status-sup, .sbm-status-aut, .sbm-status-sub
{
color: dodgerblue;
}
@@ -171,7 +171,7 @@
.sbm-form .sbm-input.sbm-calendar
{
max-width: 180px;
max-width: 120px;
}
.sbm-form .sbm-textarea, .sbm-form .sbm-select[multiple="multiple"]
@@ -442,4 +442,9 @@ a:focus
border: 1px solid var(--color-OldGold);
}
.ui-datepicker-trigger
{
margin-left:4px;
}
/* The End */
@@ -138,7 +138,7 @@
}
sbm.initCalendars = function (sel, opt)
{
return $(sel).datepicker(opt || {});
return $(sel).prop('autocomplete', false).datepicker(opt || {});
}
sbm.allowClearCalendar = function (sel)
{
@@ -583,14 +583,15 @@
$.datepicker.setDefaults({
showOn: 'both',
buttonImageOnly: true,
buttonImage: '../img/action/calendar32.png',
buttonImage: '../img/action/calendar24.png',
buttonText: sbm.lbl.calendar,
dateFormat: sbm.form.calendarDateFormat,
changeMonth: true,
changeYear: false,
yearRange: '-14:+01',
yearRange: '-30:+01',
firstDay: 1,
//defaultDate: 0,
beforeShow: function (i) { if ($(i).attr('readonly')) { return false; } },
});
});
@@ -127,15 +127,16 @@
{
co.clearItem(env, cfg);
let $frm = env.$frm.item;
$frm.find('.TransactionType').val(env.data.transactionTypeDefault);
env.$ctrl.trnType.val(env.$frm.filter.find('.sbm-input.FilterType').val());
env.$ctrl.searchTgtAssoc.show();
$frm.find('.TransactionStatus').val(env.data.defaultStatusCode);
env.$ctrl.trnStatus.val(env.data.defaultStatusCode).trigger('change');
env.$ctrl.trnRaised.datepicker('setDate', 'today');
co.openItemDlg(env, cfg, sbm.dlg.title.createTransaction);
}
co.clearItem = function (env, cfg)
{
sbm.clearItemForm(env.$frm.item);
sbm.populateSelectCodeDesc('#cbTransactionStatus', env.data.statuses);
sbm.populateSelectCodeDesc(env.$ctrl.trnStatus, env.data.statuses);
}
co.openItemDlg = function (env, cfg, title)
{
@@ -161,7 +162,7 @@
}
co.onUpdateItem = function (env, response)
{
sbm.debug('onUpdateItem', env, response);
//sbm.debug('onUpdateItem', env, response);
if (!response.success) return;
let cfg = response.config || {};
co.clearItem(env, cfg);
@@ -171,11 +172,10 @@
let $ctrls = $frm.find('.sbm-input,.sbm-textarea,.sbm-select');
$ctrls.filter('.TransactionId').val(item.id);
$ctrls.filter('.TransactionExists').val(1);
sbm.debug(item.field.value.AssociationId);
$ctrls.filter('.TransactionAssociationId').val(item.field.value.AssociationId);
env.$ctrl.searchTgtAssoc.hide();
sbm.selectOrAdd($ctrls.filter('.TransactionType'), item.typeCode, item.typeDesc);
sbm.selectOrAdd($ctrls.filter('.TransactionStatus'), item.statusCode, item.field.value.Status);
sbm.selectOrAdd(env.$ctrl.trnStatus, item.statusCode, item.field.value.Status);
env.$ctrl.trnStatus.trigger('change');
co.openItemDlg(env, cfg, sbm.dlg.title.updateTransaction);
}
@@ -187,11 +187,22 @@
}
co.onSelectAssocTarget = function (env, item)
{
sbm.debug('onSelectAssocTarget', env, item);
//sbm.debug('onSelectAssocTarget', env, item);
env.$frm.item.find('.TransactionAssociationId').val(item.id);
env.$frm.item.find('.TransactionAssociation').val(item.name);
}
co.onChangeStatus = function (env)
{
let sta = env.$ctrl.trnStatus.val();
env.$ctrl.trnRaised.prop('readonly', sta != 'PRE');
env.$ctrl.trnInProgress.prop('readonly', sta != 'WIP');
if (sta == 'PRE') env.$ctrl.trnInProgress.val('')
env.$ctrl.trnRequired.prop('readonly', (sta != 'PRE' && sta != 'WIP'));
env.$ctrl.trnClosed.prop('readonly', sta == 'PRE' || sta == 'WIP');
if (sta == 'PRE' || sta == 'WIP') env.$ctrl.trnClosed.val('')
}
//--------------------------------------------------------------
co.storeItem = function (env)
{
@@ -230,7 +241,7 @@
//sbm.debug('selectTransaction', prm);
let env = co.env.select;
env.prmSelect = prm;
env.$frm.filter.find('.FilterTransactionType').val('');
env.$frm.filter.find('.FilterType').val('');
env.$frm.filter.find('.FilterSearch').val(prm.search || '');
env.$pnl.table.find('tbody tr').remove();
sbm.openDialog(env.$dlg.select, 1000, 800);
@@ -282,17 +293,28 @@
env.$frm.filter = $items.find('.frmTransactionFilter');
if (env.$frm.filter.length)
env.$frm.filter.on('input', '.FilterSearch', function () { co.refreshItems(env, 250); }).on('change', '.FilterTransactionType,.FilterTransactionStatusCat', function () { co.refreshItems(env, 50); });
env.$frm.filter.on('input', '.FilterSearch', function () { co.refreshItems(env, 250); }).on('change', '.sbm-select.FilterType,.sbm-select.FilterStatusCat', function () { co.refreshItems(env, 50); });
env.$frm.itemId = $items.find('#frmTransactionId');
var opt = sbm.dlgOpts();
opt.dialogClass += " sbm-Transaction";
env.$dlg.item = $items.find('#dlgTransaction').dialog(opt);
env.$frm.item = env.$dlg.item.find('#frmTransaction').on('input', '.sbm-input, .sbm-textarea', function () { sbm.clearControlError(this); }).on('change', '.sbm-select', function () { sbm.clearControlError(this); });
sbm.initCalendars(env.$dlg.item.find('.sbm-input.sbm-calendar'), {});
env.$frm.item.on('blur', '.sbm-input.sbm-format-integer', function () { sbm.formatInteger($(this)); }).on('blur', '.sbm-input.sbm-format-currency', function () { sbm.formatCurrency($(this)); });
env.$frm.item.find('.TransactionAssociation').on('dblclick', function () { co.selectAssocTarget(env); });
env.$ctrl.searchTgtAssoc = env.$frm.item.find('.AssociationTargetSearch').on('click', function () { co.selectAssocTarget(env); });
if (env.$frm.item.length)
{
env.$frm.item.on('blur', '.sbm-input.sbm-format-integer', function () { sbm.formatInteger($(this)); }).on('blur', '.sbm-input.sbm-format-currency', function () { sbm.formatCurrency($(this)); });
env.$ctrl.trnType = env.$frm.item.find('.sbm-input.TransactionType');
env.$frm.item.find('.TransactionAssociation').on('dblclick', function () { co.selectAssocTarget(env); });
env.$ctrl.searchTgtAssoc = env.$frm.item.find('.AssociationTargetSearch').on('click', function () { co.selectAssocTarget(env); });
env.$ctrl.trnStatus = env.$frm.item.find('.sbm-select.TransactionStatus');
if (env.$ctrl.trnStatus.length) env.$ctrl.trnStatus.on('change', function () { co.onChangeStatus(env); });
sbm.initCalendars(env.$frm.item.find('.sbm-input.sbm-calendar'), {});
env.$ctrl.trnRaised = env.$frm.item.find('.sbm-input.TransactionRaised');
env.$ctrl.trnInProgress = env.$frm.item.find('.sbm-input.TransactionInProgress');
env.$ctrl.trnRequired = env.$frm.item.find('.sbm-input.TransactionRequired');
env.$ctrl.clearRequired = env.$frm.item.find('.ClearTransactionRequired').on('click', function () { env.$ctrl.trnRequired.val(''); });
sbm.allowClearCalendar(env.$ctrl.trnRequired);
env.$ctrl.trnClosed = env.$frm.item.find('.sbm-input.TransactionClosed');
}
var opt = sbm.dlgOpts();
opt.dialogClass += " sbm-Transaction";
opt.buttons[sbm.lbl.ok] = function () { co.selectItem(env); };