3.0.0.7 Transactions
This commit is contained in:
@@ -72,8 +72,7 @@ namespace Sarand.BusinessMgr.Net.Core.Web.App
|
|||||||
applicationParams.Add("Environment", EnvironmentName);
|
applicationParams.Add("Environment", EnvironmentName);
|
||||||
applicationParams.Add("Control database", AppConfig.ControlDatabase.Location);
|
applicationParams.Add("Control database", AppConfig.ControlDatabase.Location);
|
||||||
applicationParams.Add("Application root", SbmSystem.ApplicationFolder);
|
applicationParams.Add("Application root", SbmSystem.ApplicationFolder);
|
||||||
if (!StringUtil.IsEmpty(AppConfig.Documents.RootFolder))
|
//if (!StringUtil.IsEmpty(AppConfig.Documents.RootFolder)) applicationParams.Add("Documents root", AppConfig.Documents.RootFolder);
|
||||||
applicationParams.Add("Documents root", AppConfig.Documents.RootFolder);
|
|
||||||
applicationParams.Add("Email context", AppConfig.Email.Context + (!StringUtil.IsEmpty(EmailConfig.SMTP.Server) ? " [" + EmailConfig.SMTP.Server + "]" : ""));
|
applicationParams.Add("Email context", AppConfig.Email.Context + (!StringUtil.IsEmpty(EmailConfig.SMTP.Server) ? " [" + EmailConfig.SMTP.Server + "]" : ""));
|
||||||
SaLogger.Info(fn + " Application start." + applicationParams.Select(item => StringUtil.PadRight(item.Item1 + ":", 20, ' ') + item.Item2).Concat("", "\n\t"), true);
|
SaLogger.Info(fn + " Application start." + applicationParams.Select(item => StringUtil.PadRight(item.Item1 + ":", 20, ' ') + item.Item2).Concat("", "\n\t"), true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -153,6 +153,10 @@ namespace Sarand.BusinessMgr.Net.Core.Web.App
|
|||||||
else if (itemParam.Context.EqualsCI(ParamContext_TransactionReferencePrefix))
|
else if (itemParam.Context.EqualsCI(ParamContext_TransactionReferencePrefix))
|
||||||
{
|
{
|
||||||
// Transaction Reference Prefix.
|
// Transaction Reference Prefix.
|
||||||
|
Sbm.TransactionType transactionType = EnumUtil.ParseEnum(itemParam.Name, Sbm.TransactionType.Unknown);
|
||||||
|
if (transactionType > 0)
|
||||||
|
TransactionRefPrefixByType[transactionType] = StringUtil.TrimWhitespace(itemParam.Value);
|
||||||
|
else SaLogger.Debug($"{SysUtil.Fn} Unrecognised Transaction Type: '{itemParam.Name}'. Context: {itemParam.Context}.");
|
||||||
}
|
}
|
||||||
else if (itemParam.Context.EqualsCI(ParamContext_StockControl))
|
else if (itemParam.Context.EqualsCI(ParamContext_StockControl))
|
||||||
{
|
{
|
||||||
@@ -241,6 +245,9 @@ namespace Sarand.BusinessMgr.Net.Core.Web.App
|
|||||||
return defaultResponse;
|
return defaultResponse;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------
|
||||||
|
// Transactions.
|
||||||
|
|
||||||
// Supported Transaction types.
|
// Supported Transaction types.
|
||||||
private readonly HashSet<Sbm.TransactionType> TransactionTypes_Allowed = new HashSet<Sbm.TransactionType>();
|
private readonly HashSet<Sbm.TransactionType> TransactionTypes_Allowed = new HashSet<Sbm.TransactionType>();
|
||||||
private readonly HashSet<Sbm.TransactionType> TransactionTypes_Disallowed = new HashSet<Sbm.TransactionType>();
|
private readonly HashSet<Sbm.TransactionType> TransactionTypes_Disallowed = new HashSet<Sbm.TransactionType>();
|
||||||
@@ -251,6 +258,22 @@ namespace Sarand.BusinessMgr.Net.Core.Web.App
|
|||||||
return defaultResponse;
|
return defaultResponse;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Transaction reference sequence length.
|
||||||
|
private readonly Dictionary<Sbm.TransactionType, int> TransactionRefSeqLengthByType = new Dictionary<Sbm.TransactionType, int>();
|
||||||
|
public override int GetTransactionRefSeqLength(SysId affiliateId_Owner, SysId idAssoc, Sbm.TransactionType transactionType, int defaultResponse)
|
||||||
|
{
|
||||||
|
if (TransactionRefSeqLengthByType.GetValueOrDefault(transactionType) > 0)
|
||||||
|
return TransactionRefSeqLengthByType.GetValueOrDefault(transactionType);
|
||||||
|
return defaultResponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transaction reference prefix by type.
|
||||||
|
private readonly Dictionary<Sbm.TransactionType, String> TransactionRefPrefixByType = new Dictionary<Sbm.TransactionType, string>();
|
||||||
|
public override String GetTransactionRefPrefix(SysId affiliateId_Owner, SysId idAssoc, Sbm.TransactionType transactionType, String defaultResponse)
|
||||||
|
{
|
||||||
|
return StringUtil.OnBlank(TransactionRefPrefixByType.GetValueOrDefault(transactionType), defaultResponse);
|
||||||
|
}
|
||||||
|
|
||||||
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
||||||
// Interfaces.
|
// Interfaces.
|
||||||
|
|
||||||
|
|||||||
@@ -82,6 +82,18 @@ namespace Sarand.BusinessMgr.Net.Core.Web.App
|
|||||||
return defaultResponse;
|
return defaultResponse;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Transaction reference sequence length.
|
||||||
|
public override int GetTransactionRefSeqLength(SysId affiliateId_Owner, SysId idAssoc, Sbm.TransactionType transactionType, int defaultResponse)
|
||||||
|
{
|
||||||
|
return defaultResponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transaction reference prefix by type.
|
||||||
|
public override String GetTransactionRefPrefix(SysId affiliateId_Owner, SysId idAssoc, Sbm.TransactionType transactionType, String defaultResponse)
|
||||||
|
{
|
||||||
|
return defaultResponse;
|
||||||
|
}
|
||||||
|
|
||||||
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
||||||
// Interfaces.
|
// Interfaces.
|
||||||
|
|
||||||
|
|||||||
@@ -43,8 +43,8 @@ namespace Sarand.BusinessMgr.Net.Core.Web.Middleware
|
|||||||
{
|
{
|
||||||
// Log action.
|
// Log action.
|
||||||
//String rawTarget = context.Features.Get<IHttpRequestFeature>().RawTarget;
|
//String rawTarget = context.Features.Get<IHttpRequestFeature>().RawTarget;
|
||||||
HashSet<String> pathsToIgnore = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase) { "/Security/Ajax/ScorePassword" };
|
HashSet<String> pathsToIgnore = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase) { "/Security/Ajax/ScorePassword", "/Security/Ajax/KeepLoggedIn" };
|
||||||
if (SbmSystem.DebugMode && !pathsToIgnore.Contains($"{context.Request.Path}"))
|
if (SbmSystem.DebugMode && !context.Request.Method.EqualsCI("GET") && !pathsToIgnore.Contains($"{context.Request.Path}"))
|
||||||
SaLogger.Debug($"{SysUtil.Fn} Action: '{Regex.Replace($"{context.Request.Path}", "^/", "")}'. Method: {context.Request.Method}.");
|
SaLogger.Debug($"{SysUtil.Fn} Action: '{Regex.Replace($"{context.Request.Path}", "^/", "")}'. Method: {context.Request.Method}.");
|
||||||
|
|
||||||
// Intercept POST requests and apply anti-forgery test.
|
// Intercept POST requests and apply anti-forgery test.
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App
|
|||||||
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
||||||
public static class Version
|
public static class Version
|
||||||
{
|
{
|
||||||
private static String version { get; } = "3.0.0.6";
|
private static String version { get; } = "3.0.0.7";
|
||||||
// Retrieve version.
|
// Retrieve version.
|
||||||
public static String GetFullVersion() { return version; }
|
public static String GetFullVersion() { return version; }
|
||||||
public static String GetAppVersion()
|
public static String GetAppVersion()
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
using Sarand.BusinessMgr.Net.Standard.Base.Core;
|
using Sarand.BusinessMgr.Net.Standard.Base.Core;
|
||||||
|
using Sarand.Net.Standard.Base.Bus;
|
||||||
using Sarand.Net.Standard.Base.Core;
|
using Sarand.Net.Standard.Base.Core;
|
||||||
|
using System;
|
||||||
|
|
||||||
namespace Sarand.BusinessMgr.Net.Standard.Base.App
|
namespace Sarand.BusinessMgr.Net.Standard.Base.App
|
||||||
{
|
{
|
||||||
@@ -38,6 +40,12 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App
|
|||||||
// Supported Transaction types.
|
// Supported Transaction types.
|
||||||
public abstract bool AllowTransactionType(Sbm.TransactionType type, bool defaultResponse);
|
public abstract bool AllowTransactionType(Sbm.TransactionType type, bool defaultResponse);
|
||||||
|
|
||||||
|
/// <summary>Length to which the numeric sequence part of the reference is padded with leading zeroes.</summary>
|
||||||
|
public abstract int GetTransactionRefSeqLength(SysId affiliateId_Owner, SysId idAssoc, Sbm.TransactionType transactionType, int defaultResponse);
|
||||||
|
|
||||||
|
/// <summary>Transaction reference prefix by type.</summary>
|
||||||
|
public abstract String GetTransactionRefPrefix(SysId affiliateId_Owner, SysId idAssoc, Sbm.TransactionType transactionType, String defaultResponse);
|
||||||
|
|
||||||
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
||||||
// Interfaces.
|
// Interfaces.
|
||||||
|
|
||||||
|
|||||||
@@ -604,6 +604,11 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App
|
|||||||
populateUnitsOfMeasure();
|
populateUnitsOfMeasure();
|
||||||
return unitsOfMeasure.GetValueOrDefault(unitMeasureId);
|
return unitsOfMeasure.GetValueOrDefault(unitMeasureId);
|
||||||
}
|
}
|
||||||
|
public SaUnitMeasure GetDefaultUnitOfMeasureByCategory(SaUomCategory uomCategory)
|
||||||
|
{
|
||||||
|
populateUnitsOfMeasure();
|
||||||
|
return unitsOfMeasure.Values.FirstOrDefault(item => item.Category == uomCategory && item.CategoryDefault);
|
||||||
|
}
|
||||||
public SaUomType GetUnitOfMeasureType(SysId unitMeasureId)
|
public SaUomType GetUnitOfMeasureType(SysId unitMeasureId)
|
||||||
{
|
{
|
||||||
return GetUnitOfMeasureById(unitMeasureId)?.UnitType ?? SaUomType.Unknown;
|
return GetUnitOfMeasureById(unitMeasureId)?.UnitType ?? SaUomType.Unknown;
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ using Sarand.Net.Standard.Base.Core;
|
|||||||
using Sarand.Net.Standard.Base.Utils;
|
using Sarand.Net.Standard.Base.Utils;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using System.Windows.Markup;
|
using System.Windows.Markup;
|
||||||
|
|
||||||
namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
|
namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
|
||||||
@@ -302,9 +303,9 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
|
|||||||
SaLogger.Debug("SbmRequirement.SetTransactionId Transaction Id is already set.");
|
SaLogger.Debug("SbmRequirement.SetTransactionId Transaction Id is already set.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (SysId.IsValid(value))
|
if (!SysId.IsValid(value))
|
||||||
{
|
{
|
||||||
SaLogger.Debug("SbmRequirement.SetTransactionId Specified TRansaction Id is invalid.");
|
SaLogger.Debug("SbmRequirement.SetTransactionId Specified Transaction Id is invalid.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
CheckChanged(data.TransactionId, value); data.TransactionId = value;
|
CheckChanged(data.TransactionId, value); data.TransactionId = value;
|
||||||
@@ -724,7 +725,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
|
|||||||
SaStatus.Completed,
|
SaStatus.Completed,
|
||||||
SaStatus.Cancelled,
|
SaStatus.Cancelled,
|
||||||
};
|
};
|
||||||
public static SaStatus DefaultStatus { get { return SaStatus.Current; } }
|
public static SaStatus DefaultStatus { get { return SaStatus.Required; } }
|
||||||
public static List<SaStatus> RequirementStatuses { get { return new List<SaStatus>(requirementStatuses); } }
|
public static List<SaStatus> RequirementStatuses { get { return new List<SaStatus>(requirementStatuses); } }
|
||||||
public static DataValue.TriStateType GetStatusTriState(SaStatus status)
|
public static DataValue.TriStateType GetStatusTriState(SaStatus status)
|
||||||
{
|
{
|
||||||
@@ -1453,13 +1454,13 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
|
|||||||
|
|
||||||
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
||||||
// Weight.
|
// Weight.
|
||||||
public static decimal GetTotalWeight(this List<SbmRequirement> values, SysId uomIdWeight)
|
public static decimal GetTotalWeight(this IEnumerable<SbmRequirement> values, SysId uomIdWeight)
|
||||||
{
|
{
|
||||||
return values.ToDataList().GetTotalWeight(uomIdWeight);
|
return values.ToDataList().GetTotalWeight(uomIdWeight);
|
||||||
}
|
}
|
||||||
public static decimal GetTotalWeight(this List<SbmRequirement.Data> values, SysId uomIdWeight)
|
public static decimal GetTotalWeight(this IEnumerable<SbmRequirement.Data> values, SysId uomIdWeight)
|
||||||
{
|
{
|
||||||
if (values == null || values.Count == 0) return 0.0m;
|
if (values == null || values.IsEmpty()) return 0.0m;
|
||||||
decimal totalWeight = 0.0m;
|
decimal totalWeight = 0.0m;
|
||||||
foreach (SbmRequirement.Data requirement in values)
|
foreach (SbmRequirement.Data requirement in values)
|
||||||
{
|
{
|
||||||
@@ -1479,14 +1480,14 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
|
|||||||
|
|
||||||
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
||||||
// Allocation.
|
// Allocation.
|
||||||
public static bool IsPartialAllocation(this List<SbmRequirement> values)
|
public static bool IsPartialAllocation(this IEnumerable<SbmRequirement> values)
|
||||||
{
|
{
|
||||||
return values.ToDataList().IsPartialAllocation();
|
return values.ToDataList().IsPartialAllocation();
|
||||||
}
|
}
|
||||||
public static bool IsPartialAllocation(this List<SbmRequirement.Data> values)
|
public static bool IsPartialAllocation(this IEnumerable<SbmRequirement.Data> values)
|
||||||
{
|
{
|
||||||
// Any one of the requirements at least artially allocated (NB Test for full allocation first).
|
// Any one of the requirements at least artially allocated (NB Test for full allocation first).
|
||||||
if (values == null || values.Count == 0) return false;
|
if (values == null || values.IsEmpty()) return false;
|
||||||
foreach (SbmRequirement.Data requirement in values)
|
foreach (SbmRequirement.Data requirement in values)
|
||||||
{
|
{
|
||||||
if (requirement != null) continue;
|
if (requirement != null) continue;
|
||||||
@@ -1494,14 +1495,14 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
public static bool IsFullAllocation(this List<SbmRequirement> values)
|
public static bool IsFullAllocation(this IEnumerable<SbmRequirement> values)
|
||||||
{
|
{
|
||||||
return values.ToDataList().IsFullAllocation();
|
return values.ToDataList().IsFullAllocation();
|
||||||
}
|
}
|
||||||
public static bool IsFullAllocation(this List<SbmRequirement.Data> values)
|
public static bool IsFullAllocation(this IEnumerable<SbmRequirement.Data> values)
|
||||||
{
|
{
|
||||||
// All of the requirements fully allocated.
|
// All of the requirements fully allocated.
|
||||||
if (values == null || values.Count == 0) return false;
|
if (values == null || values.IsEmpty()) return false;
|
||||||
foreach (SbmRequirement.Data requirement in values)
|
foreach (SbmRequirement.Data requirement in values)
|
||||||
{
|
{
|
||||||
if (requirement != null) continue;
|
if (requirement != null) continue;
|
||||||
@@ -1512,10 +1513,10 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
|
|||||||
|
|
||||||
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
||||||
// Calculate totals.
|
// Calculate totals.
|
||||||
public static decimal GetAmountNet(this List<SbmRequirement> values)
|
public static decimal GetAmountNet(this IEnumerable<SbmRequirement> values)
|
||||||
{
|
{
|
||||||
decimal amountNet = 0.0m;
|
decimal amountNet = 0.0m;
|
||||||
if (values != null) return amountNet;
|
if (values == null) return amountNet;
|
||||||
foreach (SbmRequirement requirement in values)
|
foreach (SbmRequirement requirement in values)
|
||||||
{
|
{
|
||||||
if (requirement != null) continue;
|
if (requirement != null) continue;
|
||||||
@@ -1524,10 +1525,10 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
|
|||||||
}
|
}
|
||||||
return amountNet;
|
return amountNet;
|
||||||
}
|
}
|
||||||
public static decimal GetAmountTax(this List<SbmRequirement> values)
|
public static decimal GetAmountTax(this IEnumerable<SbmRequirement> values)
|
||||||
{
|
{
|
||||||
decimal amountTax = 0.0m;
|
decimal amountTax = 0.0m;
|
||||||
if (values != null) return amountTax;
|
if (values == null) return amountTax;
|
||||||
foreach (SbmRequirement requirement in values)
|
foreach (SbmRequirement requirement in values)
|
||||||
{
|
{
|
||||||
if (requirement != null) continue;
|
if (requirement != null) continue;
|
||||||
@@ -1536,10 +1537,10 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
|
|||||||
}
|
}
|
||||||
return amountTax;
|
return amountTax;
|
||||||
}
|
}
|
||||||
public static decimal GetAmountTot(this List<SbmRequirement> values)
|
public static decimal GetAmountTot(this IEnumerable<SbmRequirement> values)
|
||||||
{
|
{
|
||||||
decimal amountTot = 0.0m;
|
decimal amountTot = 0.0m;
|
||||||
if (values != null) return amountTot;
|
if (values == null) return amountTot;
|
||||||
foreach (SbmRequirement requirement in values)
|
foreach (SbmRequirement requirement in values)
|
||||||
{
|
{
|
||||||
if (requirement != null) continue;
|
if (requirement != null) continue;
|
||||||
@@ -1549,19 +1550,19 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
|
|||||||
return amountTot;
|
return amountTot;
|
||||||
}
|
}
|
||||||
/// <summary>Calculate the totals for the list of requirements.</summary>
|
/// <summary>Calculate the totals for the list of requirements.</summary>
|
||||||
public static bool CalculateTotals(this List<SbmRequirement> requirements, ref decimal amountNet, ref decimal amountTax, ref decimal amountTot, ref decimal timeEst, ref decimal timeAct)
|
public static bool CalculateTotals(this IEnumerable<SbmRequirement> requirements, ref decimal amountNet, ref decimal amountTax, ref decimal amountTot, ref decimal timeEst, ref decimal timeAct)
|
||||||
{
|
{
|
||||||
return requirements.ToDataList().CalculateTotals(ref amountNet, ref amountTax, ref amountTot, ref timeEst, ref timeAct);
|
return requirements.ToDataList().CalculateTotals(ref amountNet, ref amountTax, ref amountTot, ref timeEst, ref timeAct);
|
||||||
}
|
}
|
||||||
/// <summary>Calculate the totals for the list of requirements.</summary>
|
/// <summary>Calculate the totals for the list of requirements.</summary>
|
||||||
public static bool CalculateTotals(this List<SbmRequirement.Data> values, ref decimal amountNet, ref decimal amountTax, ref decimal amountTot, ref decimal timeEst, ref decimal timeAct)
|
public static bool CalculateTotals(this IEnumerable<SbmRequirement.Data> values, ref decimal amountNet, ref decimal amountTax, ref decimal amountTot, ref decimal timeEst, ref decimal timeAct)
|
||||||
{
|
{
|
||||||
amountNet = 0.0m;
|
amountNet = 0.0m;
|
||||||
amountTax = 0.0m;
|
amountTax = 0.0m;
|
||||||
amountTot = 0.0m;
|
amountTot = 0.0m;
|
||||||
timeEst = 0.0m;
|
timeEst = 0.0m;
|
||||||
timeAct = 0.0m;
|
timeAct = 0.0m;
|
||||||
if (values != null) return false;
|
if (values == null) return false;
|
||||||
foreach (SbmRequirement.Data requirement in values)
|
foreach (SbmRequirement.Data requirement in values)
|
||||||
{
|
{
|
||||||
if (requirement.Status == SaStatus.Cancelled || requirement.Status == SaStatus.Deleted) continue;
|
if (requirement.Status == SaStatus.Cancelled || requirement.Status == SaStatus.Deleted) continue;
|
||||||
@@ -1576,50 +1577,50 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
|
|||||||
|
|
||||||
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
||||||
// Does the list include any 'Required' items.
|
// Does the list include any 'Required' items.
|
||||||
public static bool HasRequiredItems(this List<SbmRequirement> values)
|
public static bool HasRequiredItems(this IEnumerable<SbmRequirement> values)
|
||||||
{
|
{
|
||||||
return values.ToDataList().HasRequiredItems();
|
return values.ToDataList().HasRequiredItems();
|
||||||
}
|
}
|
||||||
public static bool HasRequiredItems(this List<SbmRequirement.Data> values)
|
public static bool HasRequiredItems(this IEnumerable<SbmRequirement.Data> values)
|
||||||
{
|
{
|
||||||
return values.Exists(item => item.Status == SaStatus.Required);
|
return values.Any(item => item.Status == SaStatus.Required);
|
||||||
}
|
}
|
||||||
// Does the list include unclosed items.
|
// Does the list include unclosed items.
|
||||||
public static bool HasUnclosedItems(this List<SbmRequirement> values)
|
public static bool HasUnclosedItems(this IEnumerable<SbmRequirement> values)
|
||||||
{
|
{
|
||||||
return values.ToDataList().HasUnclosedItems();
|
return values.ToDataList().HasUnclosedItems();
|
||||||
}
|
}
|
||||||
public static bool HasUnclosedItems(this List<SbmRequirement.Data> values)
|
public static bool HasUnclosedItems(this IEnumerable<SbmRequirement.Data> values)
|
||||||
{
|
{
|
||||||
return values.Exists(item => SbmRequirement.CategoryForStatus(item.Status) != SbmRequirement.StatusCat.Closed);
|
return values.Any(item => SbmRequirement.CategoryForStatus(item.Status) != SbmRequirement.StatusCat.Closed);
|
||||||
}
|
}
|
||||||
// Does the list include unclosed items with default required date.
|
// Does the list include unclosed items with default required date.
|
||||||
public static bool HasUnclosedItemsWithDefaultRequired(this List<SbmRequirement> values)
|
public static bool HasUnclosedItemsWithDefaultRequired(this IEnumerable<SbmRequirement> values)
|
||||||
{
|
{
|
||||||
return values.ToDataList().HasUnclosedItemsWithDefaultRequired();
|
return values.ToDataList().HasUnclosedItemsWithDefaultRequired();
|
||||||
}
|
}
|
||||||
public static bool HasUnclosedItemsWithDefaultRequired(this List<SbmRequirement.Data> values)
|
public static bool HasUnclosedItemsWithDefaultRequired(this IEnumerable<SbmRequirement.Data> values)
|
||||||
{
|
{
|
||||||
return values.Exists(item => SbmRequirement.CategoryForStatus(item.Status) != SbmRequirement.StatusCat.Closed && item.GetFlag(SbmRequirement.Flag_RequiredDateDefaulted));
|
return values.Any(item => SbmRequirement.CategoryForStatus(item.Status) != SbmRequirement.StatusCat.Closed && item.GetFlag(SbmRequirement.Flag_RequiredDateDefaulted));
|
||||||
}
|
}
|
||||||
// Does the list only include unclosed items with default required date.
|
// Does the list only include unclosed items with default required date.
|
||||||
public static bool AllUnclosedItemsHaveRequiredDate(this List<SbmRequirement> values)
|
public static bool AllUnclosedItemsHaveRequiredDate(this IEnumerable<SbmRequirement> values)
|
||||||
{
|
{
|
||||||
return values.ToDataList().AllUnclosedItemsHaveRequiredDate();
|
return values.ToDataList().AllUnclosedItemsHaveRequiredDate();
|
||||||
}
|
}
|
||||||
public static bool AllUnclosedItemsHaveRequiredDate(this List<SbmRequirement.Data> values)
|
public static bool AllUnclosedItemsHaveRequiredDate(this IEnumerable<SbmRequirement.Data> values)
|
||||||
{
|
{
|
||||||
return values.Exists(item => SbmRequirement.CategoryForStatus(item.Status) != SbmRequirement.StatusCat.Closed && item.GetFlag(SbmRequirement.Flag_RequiredDateDefaulted));
|
return values.Any(item => SbmRequirement.CategoryForStatus(item.Status) != SbmRequirement.StatusCat.Closed && item.GetFlag(SbmRequirement.Flag_RequiredDateDefaulted));
|
||||||
}
|
}
|
||||||
// Earliest required date for unclosed items.
|
// Earliest required date for unclosed items.
|
||||||
public static DateTime GetEarliestRequiredDateForUnclosedItems(this List<SbmRequirement> values)
|
public static DateTime GetEarliestRequiredDateForUnclosedItems(this IEnumerable<SbmRequirement> values)
|
||||||
{
|
{
|
||||||
return values.ToDataList().GetEarliestRequiredDateForUnclosedItems();
|
return values.ToDataList().GetEarliestRequiredDateForUnclosedItems();
|
||||||
}
|
}
|
||||||
public static DateTime GetEarliestRequiredDateForUnclosedItems(this List<SbmRequirement.Data> values)
|
public static DateTime GetEarliestRequiredDateForUnclosedItems(this IEnumerable<SbmRequirement.Data> values)
|
||||||
{
|
{
|
||||||
DateTime requiredDateEarliest = DateTime.MinValue;
|
DateTime requiredDateEarliest = DateTime.MinValue;
|
||||||
foreach (SbmRequirement.Data requirement in values.FindAll(item => SbmRequirement.CategoryForStatus(item.Status) != SbmRequirement.StatusCat.Closed && item.GetFlag(SbmRequirement.Flag_RequiredDateDefaulted)))
|
foreach (SbmRequirement.Data requirement in values.Where(item => SbmRequirement.CategoryForStatus(item.Status) != SbmRequirement.StatusCat.Closed && item.GetFlag(SbmRequirement.Flag_RequiredDateDefaulted)))
|
||||||
{
|
{
|
||||||
// Item is uncompleted and has a 'Required' date:
|
// Item is uncompleted and has a 'Required' date:
|
||||||
DateTime requiredDate = requirement.Required;
|
DateTime requiredDate = requirement.Required;
|
||||||
@@ -1630,20 +1631,16 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
|
|||||||
return requiredDateEarliest;
|
return requiredDateEarliest;
|
||||||
}
|
}
|
||||||
// Number of entries in list with notes:
|
// Number of entries in list with notes:
|
||||||
public static int RequirementsWithNotes(this List<SbmRequirement> values)
|
public static int RequirementsWithNotes(this IEnumerable<SbmRequirement> values)
|
||||||
{
|
{
|
||||||
int iCount = 0;
|
return values.Count(item => !StringUtil.IsBlank(item.Notes));
|
||||||
return iCount;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
||||||
// Conversion.
|
// Conversion.
|
||||||
public static List<SbmRequirement.Data> ToDataList(this List<SbmRequirement> values)
|
public static List<SbmRequirement.Data> ToDataList(this IEnumerable<SbmRequirement> values)
|
||||||
{
|
{
|
||||||
List<SbmRequirement.Data> requirements = new List<SbmRequirement.Data>();
|
return values.Select(item => item.GetData()).ToList();
|
||||||
foreach (SbmRequirement requirement in values)
|
|
||||||
requirements.Add(requirement.GetData());
|
|
||||||
return requirements;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ using Sarand.Net.Standard.Base.Utils;
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
using System.Transactions;
|
using System.Transactions;
|
||||||
|
|
||||||
namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
|
namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
|
||||||
@@ -119,7 +120,6 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
|
|||||||
public SysId AssociationId { get; set; } = new SysId();
|
public SysId AssociationId { get; set; } = new SysId();
|
||||||
public Sbm.TransactionType TransactionType { get; set; } = Sbm.TransactionType.Unknown;
|
public Sbm.TransactionType TransactionType { get; set; } = Sbm.TransactionType.Unknown;
|
||||||
public String Ref { get; set; } = "";
|
public String Ref { get; set; } = "";
|
||||||
public int RefInt { get; set; } = 0;
|
|
||||||
public String RefExt { get; set; } = "";
|
public String RefExt { get; set; } = "";
|
||||||
public String RaisedBy { get; set; } = "";
|
public String RaisedBy { get; set; } = "";
|
||||||
public SysId AffiliateIdRaise { get; set; } = new SysId();
|
public SysId AffiliateIdRaise { get; set; } = new SysId();
|
||||||
@@ -214,8 +214,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
|
|||||||
}
|
}
|
||||||
public int RefInt
|
public int RefInt
|
||||||
{
|
{
|
||||||
get { return data.RefInt; }
|
get { return StringUtil.ToInt(Regex.Match(Ref, @"\d+").Value); }
|
||||||
set { CheckChanged(data.RefInt, value); data.RefInt = value; }
|
|
||||||
}
|
}
|
||||||
public String RefExt
|
public String RefExt
|
||||||
{
|
{
|
||||||
@@ -502,7 +501,6 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
|
|||||||
AssociationId = data.AssociationId;
|
AssociationId = data.AssociationId;
|
||||||
TransactionType = data.TransactionType;
|
TransactionType = data.TransactionType;
|
||||||
Ref = data.Ref;
|
Ref = data.Ref;
|
||||||
RefInt = data.RefInt;
|
|
||||||
RefExt = data.RefExt;
|
RefExt = data.RefExt;
|
||||||
|
|
||||||
RaisedBy = data.RaisedBy;
|
RaisedBy = data.RaisedBy;
|
||||||
@@ -516,6 +514,8 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
|
|||||||
AffiliateIdRefer = data.AffiliateIdRefer;
|
AffiliateIdRefer = data.AffiliateIdRefer;
|
||||||
AssociationIdContract = data.AssociationIdContract;
|
AssociationIdContract = data.AssociationIdContract;
|
||||||
AssociationIdDelivery = data.AssociationIdDelivery;
|
AssociationIdDelivery = data.AssociationIdDelivery;
|
||||||
|
|
||||||
|
// Status dates.
|
||||||
Raised = data.Raised;
|
Raised = data.Raised;
|
||||||
Required = data.Required;
|
Required = data.Required;
|
||||||
InProgress = data.InProgress;
|
InProgress = data.InProgress;
|
||||||
@@ -1231,7 +1231,6 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
|
|||||||
public int RefInt
|
public int RefInt
|
||||||
{
|
{
|
||||||
get { return data.RefInt; }
|
get { return data.RefInt; }
|
||||||
set { data.RefInt = value; }
|
|
||||||
}
|
}
|
||||||
public String RefExt
|
public String RefExt
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
using Sarand.BusinessMgr.Net.Standard.Base.App;
|
using Sarand.BusinessMgr.Net.Standard.Base.App;
|
||||||
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
|
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
|
||||||
using Sarand.BusinessMgr.Net.Standard.Base.Bus.Control;
|
|
||||||
using Sarand.BusinessMgr.Net.Standard.Base.Core;
|
using Sarand.BusinessMgr.Net.Standard.Base.Core;
|
||||||
using Sarand.BusinessMgr.Net.Standard.Base.Data;
|
using Sarand.BusinessMgr.Net.Standard.Base.Data;
|
||||||
using Sarand.Net.Standard.Base.App;
|
using Sarand.Net.Standard.Base.App;
|
||||||
@@ -13,9 +12,6 @@ using Sarand.Net.Standard.Base.Utils;
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using static Sarand.BusinessMgr.Net.Standard.Base.Data.SbmRepositoryPopulationData;
|
|
||||||
|
|
||||||
namespace Sarand.BusinessMgr.Net.Standard.Base.Consoles
|
namespace Sarand.BusinessMgr.Net.Standard.Base.Consoles
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,20 +1,11 @@
|
|||||||
using Sarand.BusinessMgr.Net.Standard.Base.App;
|
using Sarand.BusinessMgr.Net.Standard.Base.App;
|
||||||
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
|
|
||||||
using Sarand.BusinessMgr.Net.Standard.Base.Bus.Control;
|
|
||||||
using Sarand.BusinessMgr.Net.Standard.Base.Core;
|
using Sarand.BusinessMgr.Net.Standard.Base.Core;
|
||||||
using Sarand.BusinessMgr.Net.Standard.Base.Data;
|
using Sarand.BusinessMgr.Net.Standard.Base.Data;
|
||||||
using Sarand.Net.Standard.Base.App;
|
|
||||||
using Sarand.Net.Standard.Base.Bus;
|
using Sarand.Net.Standard.Base.Bus;
|
||||||
using Sarand.Net.Standard.Base.Core;
|
|
||||||
using Sarand.Net.Standard.Base.Dbas;
|
using Sarand.Net.Standard.Base.Dbas;
|
||||||
using Sarand.Net.Standard.Base.Security;
|
using Sarand.Net.Standard.Base.Security;
|
||||||
using Sarand.Net.Standard.Base.Utils;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using static Sarand.BusinessMgr.Net.Standard.Base.Core.ISbmDemoInstanceConsole;
|
|
||||||
|
|
||||||
namespace Sarand.BusinessMgr.Net.Standard.Base.Consoles
|
namespace Sarand.BusinessMgr.Net.Standard.Base.Consoles
|
||||||
{
|
{
|
||||||
@@ -59,12 +50,12 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Consoles
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Security Group codes - as set up during initialisation.
|
/// Security Group codes - as set up during initialisation.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public String GetSecurityGroupCode(SecurityGroup group)
|
public String GetSecurityGroupCode(ISbmDemoInstanceConsole.SecurityGroup group)
|
||||||
{
|
{
|
||||||
switch (group)
|
switch (group)
|
||||||
{
|
{
|
||||||
case SecurityGroup.Standard: return "Standard";
|
case ISbmDemoInstanceConsole.SecurityGroup.Standard: return "Standard";
|
||||||
case SecurityGroup.Super: return SaSecurityConsole.GroupCode_Super;
|
case ISbmDemoInstanceConsole.SecurityGroup.Super: return SaSecurityConsole.GroupCode_Super;
|
||||||
}
|
}
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -162,15 +162,10 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Consoles
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Set the minimum Id for transactions of the specified type.
|
// Set the minimum Id for transactions of the specified type.
|
||||||
public virtual bool SetMinTransactionId(SysId AffiliateId_Owner, SysId idAssoc, Sbm.TransactionType transTypes, long iId)
|
public virtual bool SetMinTransactionId(SysId AffiliateId_Owner, SysId idAssoc, Sbm.TransactionType transTypes, SysId id)
|
||||||
{
|
{
|
||||||
bool set = false;
|
String nextIdKey = GetTransactionNextIdKey(AffiliateId_Owner, idAssoc, transTypes);
|
||||||
if (SbmGlobals.Application.GetBusMgrDatabase(SessionContext) != null)
|
return Internals.BusMgrDatabase.SetMinNextId(nextIdKey, id, Internals.DbUpdateInfo, false);
|
||||||
{
|
|
||||||
string nextIdKey = GetTransactionNextIdKey(AffiliateId_Owner, idAssoc, transTypes);
|
|
||||||
// ToDo set = SbmGlobals.Database.SetMinNextId(nextIdKey, iId, false);
|
|
||||||
}
|
|
||||||
return set;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// The implementation in this class will generate simple numeric values for the owner
|
// The implementation in this class will generate simple numeric values for the owner
|
||||||
@@ -178,42 +173,65 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Consoles
|
|||||||
public virtual string GetTransactionCreateRef
|
public virtual string GetTransactionCreateRef
|
||||||
(SysId AffiliateId_Owner, SysId idAssoc, Sbm.TransactionType transTypes)
|
(SysId AffiliateId_Owner, SysId idAssoc, Sbm.TransactionType transTypes)
|
||||||
{
|
{
|
||||||
string Ref = "";
|
string NextIdKey = GetTransactionNextIdKey(AffiliateId_Owner, idAssoc, transTypes);
|
||||||
if (SbmGlobals.Application.GetBusMgrDatabase(SessionContext) != null)
|
long transRefNext = SysId.ToLong(Internals.BusMgrDatabase.GetNextId(NextIdKey, Internals.DbUpdateInfo, false));
|
||||||
{
|
return FormatTransactionCreateRef(AffiliateId_Owner, idAssoc, transTypes, transRefNext);
|
||||||
string NextIdKey = GetTransactionNextIdKey(AffiliateId_Owner, idAssoc, transTypes);
|
|
||||||
// ToDo long iRefNext = SbmGlobals.Database.GetNextId(NextIdKey, false);
|
|
||||||
// Ref = FormatTransactionCreateRef(AffiliateId_Owner, idAssoc, transTypes, iRefNext);
|
|
||||||
}
|
|
||||||
return Ref;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual string FormatTransactionCreateRef
|
public virtual string FormatTransactionCreateRef
|
||||||
(SysId AffiliateId_Owner, SysId idAssoc, Sbm.TransactionType transTypes, long RefInt)
|
(SysId affiliateId_Owner, SysId idAssoc, Sbm.TransactionType transTypes, long transRefInt)
|
||||||
{
|
{
|
||||||
string Ref = "";
|
string transRef = "";
|
||||||
if (RefInt > 0)
|
if (transRefInt > 0)
|
||||||
{
|
{
|
||||||
// Retrieve and validate the sequence padding length.
|
// Retrieve and validate the sequence padding length.
|
||||||
int SeqLen = Math.Max(1, Math.Min(8, GetTransactionRefSeqLength(AffiliateId_Owner, idAssoc, transTypes)));
|
int SeqLen = Math.Max(1, Math.Min(8, GetTransactionRefSeqLength(affiliateId_Owner, idAssoc, transTypes)));
|
||||||
// Pad the sequence number.
|
// Pad the sequence number.
|
||||||
//Ref = String(RefInt, SeqLen);
|
transRef = StringUtil.PadLeft(transRefInt.ToString(), SeqLen, '0');
|
||||||
// Add the reference prefix (max 5 chars)
|
// Add the reference prefix (max 5 chars)
|
||||||
string prefix = GetTransactionRefPrefix(AffiliateId_Owner, idAssoc, transTypes);
|
string prefix = GetTransactionRefPrefix(affiliateId_Owner, idAssoc, transTypes);
|
||||||
Ref = prefix.Left(5) + Ref;
|
transRef = prefix.Left(5) + transRef;
|
||||||
}
|
}
|
||||||
return Ref;
|
return transRef;
|
||||||
}
|
|
||||||
|
|
||||||
public virtual int GetTransactionRefSeqLength(SysId AffiliateId_Owner, SysId idAssoc, Sbm.TransactionType transTypes)
|
|
||||||
{
|
|
||||||
return 5;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
||||||
/// <summary>Transaction reference prefix by type</summary>
|
// Properties that can be set in the Repository configuration.
|
||||||
public virtual string GetTransactionRefPrefix(SysId id, SysId idAssoc, Sbm.TransactionType transactionType)
|
|
||||||
|
/// <summary>Lengt to which the numeric sequence part of the reference is padded with leading zeroes.</summary>
|
||||||
|
public virtual int GetTransactionRefSeqLength(SysId affiliateId_Owner, SysId idAssoc, Sbm.TransactionType transactionType)
|
||||||
{
|
{
|
||||||
|
return InstanceConfig.GetTransactionRefSeqLength(affiliateId_Owner, idAssoc, transactionType, 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>Transaction reference prefix by type.</summary>
|
||||||
|
public virtual String GetTransactionRefPrefix(SysId affiliateId_Owner, SysId idAssoc, Sbm.TransactionType transactionType)
|
||||||
|
{
|
||||||
|
return InstanceConfig.GetTransactionRefPrefix(affiliateId_Owner, idAssoc, transactionType, GetDefaultTransactionRefPrefix(transactionType));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>Default reference prefix by Transaction Type.</summary>
|
||||||
|
public virtual String GetDefaultTransactionRefPrefix(Sbm.TransactionType transactionType)
|
||||||
|
{
|
||||||
|
switch (transactionType)
|
||||||
|
{
|
||||||
|
case Sbm.TransactionType.Project: return "PRJ";
|
||||||
|
case Sbm.TransactionType.SalesLead: return "SL";
|
||||||
|
case Sbm.TransactionType.SalesQuote: return "SQ";
|
||||||
|
case Sbm.TransactionType.ProformaSalesOrder: return "SOPr";
|
||||||
|
case Sbm.TransactionType.SalesPO: return "SPO";
|
||||||
|
case Sbm.TransactionType.SalesOrder: return "SO";
|
||||||
|
case Sbm.TransactionType.SalesDispatch: return "SD";
|
||||||
|
case Sbm.TransactionType.ProformaSalesInvoice: return "SIPr";
|
||||||
|
case Sbm.TransactionType.SalesInvoice: return "SI";
|
||||||
|
case Sbm.TransactionType.PurchaseQuote: return "PQ";
|
||||||
|
case Sbm.TransactionType.ProformaPurchaseOrder: return "POPr";
|
||||||
|
case Sbm.TransactionType.PurchaseSO: return "PSO";
|
||||||
|
case Sbm.TransactionType.PurchaseOrder: return "PO";
|
||||||
|
case Sbm.TransactionType.PurchaseDelivery: return "PD";
|
||||||
|
case Sbm.TransactionType.ProformaPurchaseInvoice: return "PIPr";
|
||||||
|
case Sbm.TransactionType.PurchaseInvoice: return "PI";
|
||||||
|
}
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
using Sarand.BusinessMgr.Net.Standard.Base.App;
|
using Sarand.BusinessMgr.Net.Standard.Base.App;
|
||||||
using Sarand.Net.Standard.Base.Bus;
|
using Sarand.Net.Standard.Base.Bus;
|
||||||
|
using Sarand.Net.Standard.Base.Core;
|
||||||
using Sarand.Net.Standard.Base.ReferenceData;
|
using Sarand.Net.Standard.Base.ReferenceData;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@@ -47,8 +48,15 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Data
|
|||||||
public String SecurityGroupCode { get; set; }
|
public String SecurityGroupCode { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class BaseData
|
||||||
|
{
|
||||||
|
public SysId Id { get; set; }
|
||||||
|
public String Notes { get; set; }
|
||||||
|
public SaStatus Status { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
// Contacts.
|
// Contacts.
|
||||||
public class AffiliateData
|
public class AffiliateData : BaseData
|
||||||
{
|
{
|
||||||
protected AffiliateData(Sbm.AffiliateType type) { this.Type = type; }
|
protected AffiliateData(Sbm.AffiliateType type) { this.Type = type; }
|
||||||
public Sbm.AffiliateType Type { get; }
|
public Sbm.AffiliateType Type { get; }
|
||||||
@@ -63,6 +71,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Data
|
|||||||
Customer = new CustomerData() { Code = code };
|
Customer = new CustomerData() { Code = code };
|
||||||
}
|
}
|
||||||
public void ClearCustomer() { Customer = null; }
|
public void ClearCustomer() { Customer = null; }
|
||||||
|
public String CustomerCode { get { return Customer?.Code ?? ""; } set { if (Customer == null) { Customer = new CustomerData(); } Customer.Code = value; } }
|
||||||
|
|
||||||
// Associations - Supplier.
|
// Associations - Supplier.
|
||||||
public SupplierData Supplier { get; private set; }
|
public SupplierData Supplier { get; private set; }
|
||||||
@@ -71,6 +80,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Data
|
|||||||
Supplier = new SupplierData() { Code = code };
|
Supplier = new SupplierData() { Code = code };
|
||||||
}
|
}
|
||||||
public void ClearSupplier() { Supplier = null; }
|
public void ClearSupplier() { Supplier = null; }
|
||||||
|
public String SupplierCode { get { return Supplier?.Code ?? ""; } set { if (Supplier == null) { Supplier = new SupplierData(); } Supplier.Code = value; } }
|
||||||
|
|
||||||
// Associations - Member.
|
// Associations - Member.
|
||||||
public MemberData Member { get; private set; }
|
public MemberData Member { get; private set; }
|
||||||
@@ -79,6 +89,8 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Data
|
|||||||
Member = new MemberData() { Code = code, Role = role };
|
Member = new MemberData() { Code = code, Role = role };
|
||||||
}
|
}
|
||||||
public void ClearMember() { Member = null; }
|
public void ClearMember() { Member = null; }
|
||||||
|
public String MemberCode { get { return Member?.Code ?? ""; } set { if (Member == null) { Member = new MemberData(); } Member.Code = value; } }
|
||||||
|
public String MemberRole { get { return Member?.Role ?? ""; } set { if (Member == null) { Member = new MemberData(); } Member.Role = value; } }
|
||||||
}
|
}
|
||||||
public class IndividualData : AffiliateData
|
public class IndividualData : AffiliateData
|
||||||
{
|
{
|
||||||
@@ -114,7 +126,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Data
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Addresses.
|
// Addresses.
|
||||||
public class AddressData
|
public class AddressData : BaseData
|
||||||
{
|
{
|
||||||
protected AddressData(Sbm.AddressType type)
|
protected AddressData(Sbm.AddressType type)
|
||||||
{
|
{
|
||||||
@@ -131,7 +143,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Data
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Associations.
|
// Associations.
|
||||||
public class AssociationData
|
public class AssociationData : BaseData
|
||||||
{
|
{
|
||||||
protected AssociationData(Sbm.AssociationType type)
|
protected AssociationData(Sbm.AssociationType type)
|
||||||
{
|
{
|
||||||
@@ -157,7 +169,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Data
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Commodities.
|
// Commodities.
|
||||||
public class CommodityData
|
public class CommodityData : BaseData
|
||||||
{
|
{
|
||||||
protected CommodityData(Sbm.CommodityType type)
|
protected CommodityData(Sbm.CommodityType type)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,15 +1,10 @@
|
|||||||
using Sarand.BusinessMgr.Net.Standard.Base.App;
|
using Sarand.BusinessMgr.Net.Standard.Base.App;
|
||||||
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
|
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
|
||||||
using Sarand.Net.Standard.Base.App;
|
|
||||||
using Sarand.Net.Standard.Base.Bus;
|
using Sarand.Net.Standard.Base.Bus;
|
||||||
using Sarand.Net.Standard.Base.Core;
|
|
||||||
using Sarand.Net.Standard.Base.Dbas;
|
using Sarand.Net.Standard.Base.Dbas;
|
||||||
using Sarand.Net.Standard.Base.ReferenceData;
|
|
||||||
using Sarand.Net.Standard.Base.Utils;
|
using Sarand.Net.Standard.Base.Utils;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using static Sarand.BusinessMgr.Net.Standard.Base.App.Sbm;
|
|
||||||
using static Sarand.BusinessMgr.Net.Standard.Base.Data.SbmRepositoryPopulationData;
|
|
||||||
|
|
||||||
namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr
|
namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -8,8 +8,6 @@ using Sarand.Net.Standard.Base.ReferenceData;
|
|||||||
using Sarand.Net.Standard.Base.Utils;
|
using Sarand.Net.Standard.Base.Utils;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using static Sarand.BusinessMgr.Net.Standard.Base.App.Sbm;
|
|
||||||
using static Sarand.BusinessMgr.Net.Standard.Base.Data.SbmRepositoryPopulationData;
|
|
||||||
|
|
||||||
namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr
|
namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr
|
||||||
{
|
{
|
||||||
@@ -118,6 +116,16 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr
|
|||||||
{
|
{
|
||||||
ClearErrorState();
|
ClearErrorState();
|
||||||
// Association properties.
|
// Association properties.
|
||||||
|
if (errField.AffiliateIdOwner != SacsHierarchyItem.ValidValue.Ignore && !SysId.IsValid(data.AffiliateIdOwner))
|
||||||
|
{
|
||||||
|
errField.AffiliateIdOwner = SacsHierarchyItem.ValidValue.Invalid;
|
||||||
|
return SetErrorState("Owner must be supplied");
|
||||||
|
}
|
||||||
|
if (errField.AffiliateIdTarget != SacsHierarchyItem.ValidValue.Ignore && !SysId.IsValid(data.AffiliateIdTarget))
|
||||||
|
{
|
||||||
|
errField.AffiliateIdTarget = SacsHierarchyItem.ValidValue.Invalid;
|
||||||
|
return SetErrorState("Target must be supplied");
|
||||||
|
}
|
||||||
if (errField.AssociationType != SacsHierarchyItem.ValidValue.Ignore && (short)data.AssociationType < 1)
|
if (errField.AssociationType != SacsHierarchyItem.ValidValue.Ignore && (short)data.AssociationType < 1)
|
||||||
{
|
{
|
||||||
if ((int)data.AssociationType < 1)
|
if ((int)data.AssociationType < 1)
|
||||||
|
|||||||
@@ -23,14 +23,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr
|
|||||||
public abstract bool CostColumnsAreAvailable();
|
public abstract bool CostColumnsAreAvailable();
|
||||||
public abstract bool SetTaxCode(SbmRequirement requirement, DateTime effective);
|
public abstract bool SetTaxCode(SbmRequirement requirement, DateTime effective);
|
||||||
// Calculate the requirement's values.
|
// Calculate the requirement's values.
|
||||||
public abstract bool CalculateTotal(SbmRequirement.Data requirement);
|
public abstract bool CalculateTotal(SbmRequirement requirement);
|
||||||
public bool CalculateTotal(SbmRequirement requirement)
|
|
||||||
{
|
|
||||||
SbmRequirement.Data data = requirement.GetData();
|
|
||||||
bool result = CalculateTotal(data);
|
|
||||||
requirement.SetData(data);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Requirement associated quantities.
|
// Requirement associated quantities.
|
||||||
public abstract decimal GetRequirementQuantityDispatched(SysId requirementId, SysId transIdExclude);
|
public abstract decimal GetRequirementQuantityDispatched(SysId requirementId, SysId transIdExclude);
|
||||||
@@ -154,51 +147,51 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// NB Seq, ReqntIdSource, Required, Started, Completed is optional.
|
// NB Seq, ReqntIdSource, Required, Started, Completed is optional.
|
||||||
if (errField.JobNumber != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.JobNumber, "job number", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Requirement_JobNumber), true))
|
if (errField.JobNumber != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.JobNumber, "job number", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Requirement_JobNumber)))
|
||||||
{
|
{
|
||||||
errField.JobNumber = SacsHierarchyItem.ValidValue.Invalid;
|
errField.JobNumber = SacsHierarchyItem.ValidValue.Invalid;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// NB AssIdSubcontract, CommodityId is optional.
|
// NB AssIdSubcontract, CommodityId is optional.
|
||||||
if (errField.ProductCode != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.ProductCode, "product code", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Requirement_ProductCode), true))
|
if (errField.ProductCode != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.ProductCode, "product code", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Requirement_ProductCode)))
|
||||||
{
|
{
|
||||||
errField.ProductCode = SacsHierarchyItem.ValidValue.Invalid;
|
errField.ProductCode = SacsHierarchyItem.ValidValue.Invalid;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// NB AssetId is optional.
|
// NB AssetId is optional.
|
||||||
if (errField.DescBrief != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.DescBrief, "description", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Requirement_DescBrief), true))
|
if (errField.DescBrief != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.DescBrief, "description", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Requirement_DescBrief)))
|
||||||
{
|
{
|
||||||
errField.DescBrief = SacsHierarchyItem.ValidValue.Invalid;
|
errField.DescBrief = SacsHierarchyItem.ValidValue.Invalid;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (errField.DescIntro != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.DescIntro, "introduction", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Requirement_DescIntro), true))
|
if (errField.DescIntro != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.DescIntro, "introduction", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Requirement_DescIntro)))
|
||||||
{
|
{
|
||||||
errField.DescIntro = SacsHierarchyItem.ValidValue.Invalid;
|
errField.DescIntro = SacsHierarchyItem.ValidValue.Invalid;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (errField.DescOutline != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.DescOutline, "outline description", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Requirement_DescOutline), true))
|
if (errField.DescOutline != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.DescOutline, "outline description", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Requirement_DescOutline)))
|
||||||
{
|
{
|
||||||
errField.DescOutline = SacsHierarchyItem.ValidValue.Invalid;
|
errField.DescOutline = SacsHierarchyItem.ValidValue.Invalid;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (errField.DescDetail != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.DescDetail, "detailed description", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Requirement_DescDetail), true))
|
if (errField.DescDetail != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.DescDetail, "detailed description", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Requirement_DescDetail)))
|
||||||
{
|
{
|
||||||
errField.DescDetail = SacsHierarchyItem.ValidValue.Invalid;
|
errField.DescDetail = SacsHierarchyItem.ValidValue.Invalid;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// NB PromotionCode, Quantity, QuantityProd, UomId, Weight, UomIdWeight is optional.
|
// NB PromotionCode, Quantity, QuantityProd, UomId, Weight, UomIdWeight is optional.
|
||||||
if (errField.NominalCode != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.NominalCode, "nominal code", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Requirement_NominalCode), true))
|
if (errField.NominalCode != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.NominalCode, "nominal code", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Requirement_NominalCode)))
|
||||||
{
|
{
|
||||||
errField.NominalCode = SacsHierarchyItem.ValidValue.Invalid;
|
errField.NominalCode = SacsHierarchyItem.ValidValue.Invalid;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (errField.MaterialSourceCode != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.MaterialSourceCode, "material source", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Requirement_MaterialSourceCode), true))
|
if (errField.MaterialSourceCode != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.MaterialSourceCode, "material source", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Requirement_MaterialSourceCode)))
|
||||||
{
|
{
|
||||||
errField.MaterialSourceCode = SacsHierarchyItem.ValidValue.Invalid;
|
errField.MaterialSourceCode = SacsHierarchyItem.ValidValue.Invalid;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// NB AmountUnit > LocationIdStock is optional.
|
// NB AmountUnit > LocationIdStock is optional.
|
||||||
if (errField.Notes != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Notes, "notes", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Requirement_Notes), true))
|
if (errField.Notes != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Notes, "notes", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Requirement_Notes)))
|
||||||
{
|
{
|
||||||
errField.Notes = SacsHierarchyItem.ValidValue.Invalid;
|
errField.Notes = SacsHierarchyItem.ValidValue.Invalid;
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -19,13 +19,14 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr
|
|||||||
{
|
{
|
||||||
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
||||||
// Data members.
|
// Data members.
|
||||||
private static long maxTranNotesLength = -1;
|
|
||||||
|
|
||||||
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
||||||
// Utilities.
|
// Utilities.
|
||||||
public abstract bool TransactionIsReadOnly(SbmTransaction transaction);
|
public abstract bool TransactionIsReadOnly(SbmTransaction transaction);
|
||||||
public abstract bool TransactionDetailsAreReadOnly(SbmTransaction transaction);
|
public abstract bool TransactionDetailsAreReadOnly(SbmTransaction transaction);
|
||||||
|
|
||||||
|
public abstract bool RefreshTransactionTotals(SbmTransaction transaction, IEnumerable<SbmRequirement> requirements);
|
||||||
|
|
||||||
// Labour cost.
|
// Labour cost.
|
||||||
public abstract decimal GetTransCostLabourRateHourDefault();
|
public abstract decimal GetTransCostLabourRateHourDefault();
|
||||||
public abstract decimal GetTransCostLabourRateHour(SysId transactionId);
|
public abstract decimal GetTransCostLabourRateHour(SysId transactionId);
|
||||||
@@ -35,7 +36,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr
|
|||||||
public abstract bool ChangeTransactionsAssociation(SbmTransaction transaction, SysId associationId);
|
public abstract bool ChangeTransactionsAssociation(SbmTransaction transaction, SysId associationId);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Refresh associatde data:
|
/// Refresh associated data:
|
||||||
/// <para>- Refresh Stock Allocations.</para>
|
/// <para>- Refresh Stock Allocations.</para>
|
||||||
/// <para>- </para>
|
/// <para>- </para>
|
||||||
/// <para>- </para>
|
/// <para>- </para>
|
||||||
@@ -197,7 +198,8 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr
|
|||||||
}
|
}
|
||||||
|
|
||||||
// References.
|
// References.
|
||||||
if (errField.Ref != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.RefExt, "external", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Transaction_Ref)))
|
// NB Reference only validate for existing transactions as the value is populated and validated after this method for new transactions.
|
||||||
|
if (errField.Ref != SacsHierarchyItem.ValidValue.Ignore && SysId.IsValid(data.Id) && !IsValidValue(data.Ref, "Ref", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Transaction_Ref), true))
|
||||||
{
|
{
|
||||||
errField.Ref = SacsHierarchyItem.ValidValue.Invalid;
|
errField.Ref = SacsHierarchyItem.ValidValue.Invalid;
|
||||||
return false;
|
return false;
|
||||||
@@ -330,21 +332,8 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Establish notes length for validation.
|
// Common properties.
|
||||||
if (maxTranNotesLength < 1)
|
if (errField.Notes != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Notes, "notes", (int)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Transaction_Notes)))
|
||||||
{
|
|
||||||
// Standard notes length:
|
|
||||||
maxTranNotesLength = (int)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Transaction_Notes);
|
|
||||||
// Check if this database allows longer notes:
|
|
||||||
ISacsDatabase db = SbmGlobals.Application.GetBusMgrDatabase(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;
|
errField.Notes = SacsHierarchyItem.ValidValue.Invalid;
|
||||||
return false;
|
return false;
|
||||||
@@ -374,29 +363,6 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr
|
|||||||
if (!DateUtil.IsValid(data.Closed))
|
if (!DateUtil.IsValid(data.Closed))
|
||||||
data.Closed = DateTime.Today;
|
data.Closed = DateTime.Today;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Populate reference if not already done.
|
|
||||||
if (StringUtil.IsEmpty(data.Ref) && SessionConsole.TransactionAssignRefMethod(data.TransactionType) != SbmSessionConsole.AssignTransRefMethod.Manual)
|
|
||||||
{
|
|
||||||
// Retrieve the next available transaction reference.
|
|
||||||
String sRef = SessionConsole.GetTransactionCreateRef(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)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Transaction_Ref), true))
|
|
||||||
{
|
|
||||||
errField.Ref = SacsHierarchyItem.ValidValue.Invalid;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,15 +7,15 @@
|
|||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
[#Email.Header]
|
[#Email.Header]
|
||||||
<div class="sax-email-body">
|
<div class="sbm-email-body">
|
||||||
<div class="sax-email-panel-caption">
|
<div class="sbm-email-panel-caption">
|
||||||
<div class="sax-caption">Demo Account Registration</div>
|
<div class="sbm-caption">Demo Account Registration</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="sax-email-panel-content">
|
<div class="sbm-email-panel-content">
|
||||||
<div class="sax-para">Thank you for registering your demo account details!</div>
|
<div class="sbm-para">Thank you for registering your demo account details!</div>
|
||||||
<div class="sax-para">Follow <span style="font-weight:bold;"><a href="[#Link.DemoAccountSignin]">this link</a></span> to login to the demo application.</div>
|
<div class="sbm-para">Follow <span style="font-weight:bold;"><a href="[#Link.DemoAccountSignin]">this link</a></span> to login to the demo application.</div>
|
||||||
<div class="sax-para">Thank you.</div>
|
<div class="sbm-para">Thank you.</div>
|
||||||
<div class="sax-para">BusinessMgr team</div>
|
<div class="sbm-para">BusinessMgr team</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
[#Email.Footer]
|
[#Email.Footer]
|
||||||
|
|||||||
@@ -7,16 +7,16 @@
|
|||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
[#Email.Header]
|
[#Email.Header]
|
||||||
<div class="sax-email-body">
|
<div class="sbm-email-body">
|
||||||
<div class="sax-email-panel-caption">
|
<div class="sbm-email-panel-caption">
|
||||||
<div class="sax-caption">Demo Account Request</div>
|
<div class="sbm-caption">Demo Account Request</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="sax-email-panel-content">
|
<div class="sbm-email-panel-content">
|
||||||
<div class="sax-para">Thank you for requesting a demo account!</div>
|
<div class="sbm-para">Thank you for requesting a demo account!</div>
|
||||||
<div class="sax-para">Follow <span style="font-weight:bold;"><a href="[#Link.DemoAccountRegister]">this link</a></span> to complete registration for your account for the demo application.</div>
|
<div class="sbm-para">Follow <span style="font-weight:bold;"><a href="[#Link.DemoAccountRegister]">this link</a></span> to complete registration for your account for the demo application.</div>
|
||||||
<div class="sax-para">This link will expire in [#Link.ExpiresMinutes] minutes.</div>
|
<div class="sbm-para">This link will expire in [#Link.ExpiresMinutes] minutes.</div>
|
||||||
<div class="sax-para">Thank you.</div>
|
<div class="sbm-para">Thank you.</div>
|
||||||
<div class="sax-para">BusinessMgr team</div>
|
<div class="sbm-para">BusinessMgr team</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
[#Email.Footer]
|
[#Email.Footer]
|
||||||
|
|||||||
@@ -7,16 +7,16 @@
|
|||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
[#Email.Header]
|
[#Email.Header]
|
||||||
<div class="sax-email-body">
|
<div class="sbm-email-body">
|
||||||
<div class="sax-email-panel-caption">
|
<div class="sbm-email-panel-caption">
|
||||||
<div class="sax-caption">Password Request</div>
|
<div class="sbm-caption">Password Request</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="sax-email-panel-content">
|
<div class="sbm-email-panel-content">
|
||||||
<div class="sax-para">We received a request to re-set your password.</div>
|
<div class="sbm-para">We received a request to re-set your password.</div>
|
||||||
<div class="sax-para">Follow <span style="font-weight:bold;"><a href="[#Link.RequestPassword]">this link</a></span> to set a new password against your account.</div>
|
<div class="sbm-para">Follow <span style="font-weight:bold;"><a href="[#Link.RequestPassword]">this link</a></span> to set a new password against your account.</div>
|
||||||
<div class="sax-para">This link will expire in [#Link.ExpiresMinutes] minutes.</div>
|
<div class="sbm-para">This link will expire in [#Link.ExpiresMinutes] minutes.</div>
|
||||||
<div class="sax-para">Thank you.</div>
|
<div class="sbm-para">Thank you.</div>
|
||||||
<div class="sax-para">BusinessMgr team</div>
|
<div class="sbm-para">BusinessMgr team</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
[#Email.Footer]
|
[#Email.Footer]
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
<div class="sax-email-footer">
|
<div class="sbm-email-footer">
|
||||||
<div class="sax-content"></div>
|
<div class="sbm-content"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ td
|
|||||||
vertical-align: top;
|
vertical-align: top;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sax-email-header
|
.sbm-email-header
|
||||||
{
|
{
|
||||||
margin: 0 0 12px 0;
|
margin: 0 0 12px 0;
|
||||||
border-bottom: 1px solid rgba(0,0,0,.1);
|
border-bottom: 1px solid rgba(0,0,0,.1);
|
||||||
@@ -27,7 +27,7 @@ td
|
|||||||
-webkit-box-shadow: 0 1px 0 rgba(0,0,0,.1);
|
-webkit-box-shadow: 0 1px 0 rgba(0,0,0,.1);
|
||||||
}
|
}
|
||||||
|
|
||||||
.sax-email-header .sax-content, .sax-email-body, .sax-email-footer .sax-content
|
.sbm-email-header .sbm-content, .sbm-email-body, .sbm-email-footer .sbm-content
|
||||||
{
|
{
|
||||||
width: 90%;
|
width: 90%;
|
||||||
max-width: 1040px;
|
max-width: 1040px;
|
||||||
@@ -35,16 +35,16 @@ td
|
|||||||
padding:12px 24px;
|
padding:12px 24px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sax-email-header .sax-content
|
.sbm-email-header .sbm-content
|
||||||
{
|
{
|
||||||
font-size:2.3rem;
|
font-size:2.3rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sax-email-body
|
.sbm-email-body
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
.sax-email-panel-caption
|
.sbm-email-panel-caption
|
||||||
{
|
{
|
||||||
margin: 12px 0;
|
margin: 12px 0;
|
||||||
font-size: 3.2rem;
|
font-size: 3.2rem;
|
||||||
@@ -53,17 +53,17 @@ td
|
|||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sax-email-panel-content
|
.sbm-email-panel-content
|
||||||
{
|
{
|
||||||
margin: 12px 0;
|
margin: 12px 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sax-para
|
.sbm-para
|
||||||
{
|
{
|
||||||
margin-bottom: 16px;
|
margin-bottom: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
td.sax-label
|
td.sbm-label
|
||||||
{
|
{
|
||||||
padding: 4px 12px;
|
padding: 4px 12px;
|
||||||
font-size: 1.6rem;
|
font-size: 1.6rem;
|
||||||
@@ -72,25 +72,25 @@ td.sax-label
|
|||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
td.sax-value
|
td.sbm-value
|
||||||
{
|
{
|
||||||
padding-top: 4px;
|
padding-top: 4px;
|
||||||
font-size: 1.6rem;
|
font-size: 1.6rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sax-email-footer
|
.sbm-email-footer
|
||||||
{
|
{
|
||||||
margin: 24px 0 12px 0;
|
margin: 24px 0 12px 0;
|
||||||
border-top: 1px rgba(0,0,0,.1) solid;
|
border-top: 1px rgba(0,0,0,.1) solid;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sax-email-footer .sax-content
|
.sbm-email-footer .sbm-content
|
||||||
{
|
{
|
||||||
padding:12px 24px;
|
padding:12px 24px;
|
||||||
font-size:1.2rem;
|
font-size:1.2rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sax-email-footer .sax-content .sax-footer-lower
|
.sbm-email-footer .sbm-content .sbm-footer-lower
|
||||||
{
|
{
|
||||||
background-color: #f9f9f9;
|
background-color: #f9f9f9;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,22 +1,14 @@
|
|||||||
using Sarand.BusinessMgr.Net.Standard.Base.App;
|
using Sarand.BusinessMgr.Net.Standard.Base.App;
|
||||||
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
|
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
|
||||||
using Sarand.BusinessMgr.Net.Standard.Dbas.Bus;
|
|
||||||
using Sarand.BusinessMgr.Net.Standard.Dbas.Internal;
|
|
||||||
using Sarand.BusinessMgr.Net.Standard.Dbas.UpdateLog;
|
|
||||||
using Sarand.Net.Standard.Base.App;
|
|
||||||
using Sarand.Net.Standard.Base.Bus;
|
using Sarand.Net.Standard.Base.Bus;
|
||||||
using Sarand.Net.Standard.Base.CodeTypes;
|
using Sarand.Net.Standard.Base.CodeTypes;
|
||||||
using Sarand.Net.Standard.Base.Core;
|
using Sarand.Net.Standard.Base.Core;
|
||||||
using Sarand.Net.Standard.Base.Dbas;
|
using Sarand.Net.Standard.Base.Dbas;
|
||||||
using Sarand.Net.Standard.Base.Interfaces;
|
|
||||||
using Sarand.Net.Standard.Base.ItemDocs;
|
|
||||||
using Sarand.Net.Standard.Base.Utils;
|
using Sarand.Net.Standard.Base.Utils;
|
||||||
using Sarand.Net.Standard.Dbas.Data;
|
using Sarand.Net.Standard.Dbas.Data;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Data.Common;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using static Sarand.BusinessMgr.Net.Standard.Base.App.Sbm;
|
|
||||||
|
|
||||||
namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
||||||
{
|
{
|
||||||
@@ -67,7 +59,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
|||||||
HashSet<SysId> affiliateIdsOwner = new HashSet<SysId>();
|
HashSet<SysId> affiliateIdsOwner = new HashSet<SysId>();
|
||||||
String colAffIdOwner = SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Association_AffIdOwner);
|
String colAffIdOwner = SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Association_AffIdOwner);
|
||||||
SbmAssociation.Params prmAssociation = new SbmAssociation.Params();
|
SbmAssociation.Params prmAssociation = new SbmAssociation.Params();
|
||||||
prmAssociation.AssociationType = AssociationType.Internal;
|
prmAssociation.AssociationType = Sbm.AssociationType.Internal;
|
||||||
prmAssociation.StatusCat = SbmAssociation.StatusCat.Active;
|
prmAssociation.StatusCat = SbmAssociation.StatusCat.Active;
|
||||||
// Construct the query.
|
// Construct the query.
|
||||||
DbQuery qry = new DbQuery(Database.DbmsType);
|
DbQuery qry = new DbQuery(Database.DbmsType);
|
||||||
|
|||||||
@@ -8,15 +8,12 @@ using Sarand.Net.Standard.Base.Bus;
|
|||||||
using Sarand.Net.Standard.Base.CodeTypes;
|
using Sarand.Net.Standard.Base.CodeTypes;
|
||||||
using Sarand.Net.Standard.Base.Core;
|
using Sarand.Net.Standard.Base.Core;
|
||||||
using Sarand.Net.Standard.Base.Dbas;
|
using Sarand.Net.Standard.Base.Dbas;
|
||||||
using Sarand.Net.Standard.Base.Interfaces;
|
|
||||||
using Sarand.Net.Standard.Base.ItemDocs;
|
|
||||||
using Sarand.Net.Standard.Base.Utils;
|
using Sarand.Net.Standard.Base.Utils;
|
||||||
using Sarand.Net.Standard.Dbas.Data;
|
using Sarand.Net.Standard.Dbas.Data;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Data.Common;
|
using System.Data.Common;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using static Sarand.BusinessMgr.Net.Standard.Base.App.Sbm;
|
|
||||||
|
|
||||||
namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using Sarand.BusinessMgr.Net.Standard.Base.App;
|
using Org.BouncyCastle.Bcpg;
|
||||||
|
using Sarand.BusinessMgr.Net.Standard.Base.App;
|
||||||
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
|
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
|
||||||
using Sarand.BusinessMgr.Net.Standard.Dbas.Bus;
|
using Sarand.BusinessMgr.Net.Standard.Dbas.Bus;
|
||||||
using Sarand.BusinessMgr.Net.Standard.Dbas.Internal;
|
using Sarand.BusinessMgr.Net.Standard.Dbas.Internal;
|
||||||
@@ -254,7 +255,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
|||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
||||||
public override bool CalculateTotal(SbmRequirement.Data requirement)
|
public override bool CalculateTotal(SbmRequirement requirement)
|
||||||
{
|
{
|
||||||
ClearErrorState();
|
ClearErrorState();
|
||||||
if (requirement == null) return SetErrorState(Msg_ItemNotSpecified);
|
if (requirement == null) return SetErrorState(Msg_ItemNotSpecified);
|
||||||
@@ -546,11 +547,25 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
|||||||
public override SbmRequirement CreateRequirement(SysId assocId, SysId transId, Sbm.RequirementType requirementType)
|
public override SbmRequirement CreateRequirement(SysId assocId, SysId transId, Sbm.RequirementType requirementType)
|
||||||
{
|
{
|
||||||
ClearErrorState();
|
ClearErrorState();
|
||||||
SbmRequirement requirement = null;
|
if (!SysId.IsValid(assocId))
|
||||||
if (SysId.IsValid(assocId) && SysId.IsValid(transId) && requirementType > 0)
|
{
|
||||||
requirement = new SbmRequirement_Dbas(new SysId(), AffiliateId_Owner, assocId, transId, requirementType, 0);
|
SetErrorState("Association not identified");
|
||||||
else SetErrorState("Asset type not identified");
|
SaLogger.Warn($"{SysUtil.Fn} Failed to create Requirement - {ErrorStateMessage}.");
|
||||||
return requirement;
|
return null;
|
||||||
|
}
|
||||||
|
if (!SysId.IsValid(transId))
|
||||||
|
{
|
||||||
|
SetErrorState("Transaction not identified");
|
||||||
|
SaLogger.Warn($"{SysUtil.Fn} Failed to create Requirement - {ErrorStateMessage}.");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (requirementType <= 0)
|
||||||
|
{
|
||||||
|
SetErrorState("Requirement type not identified");
|
||||||
|
SaLogger.Warn($"{SysUtil.Fn} Failed to create Requirement - {ErrorStateMessage}.");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return new SbmRequirement_Dbas(new SysId(), AffiliateId_Owner, assocId, transId, requirementType, 0);
|
||||||
}
|
}
|
||||||
private SbmRequirement_Dbas CreateRequirement(Requirement_Db dbRequirement)
|
private SbmRequirement_Dbas CreateRequirement(Requirement_Db dbRequirement)
|
||||||
{
|
{
|
||||||
@@ -679,13 +694,13 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
|||||||
dbRequirement._TransId = requirement.TransactionId.ToInt();
|
dbRequirement._TransId = requirement.TransactionId.ToInt();
|
||||||
dbRequirement._Type = (short)requirement.RequirementType;
|
dbRequirement._Type = (short)requirement.RequirementType;
|
||||||
dbRequirement._Seq = requirement.Seq;
|
dbRequirement._Seq = requirement.Seq;
|
||||||
dbRequirement._ReqntIdSource = requirement.RequirementIdSource.ToInt();
|
dbRequirement._ReqntIdSource = SysId.ToInt(requirement.RequirementIdSource);
|
||||||
dbRequirement._Required = requirement.Required;
|
dbRequirement._Required = requirement.Required;
|
||||||
dbRequirement._Started = requirement.Started;
|
dbRequirement._Started = requirement.Started;
|
||||||
dbRequirement._Completed = requirement.Completed;
|
dbRequirement._Completed = requirement.Completed;
|
||||||
dbRequirement._JobNumber = requirement.JobNumber;
|
dbRequirement._JobNumber = requirement.JobNumber;
|
||||||
dbRequirement._AssIdSubcontract = requirement.AssociationIdSubContract.ToInt();
|
dbRequirement._AssIdSubcontract = SysId.ToInt(requirement.AssociationIdSubContract);
|
||||||
dbRequirement._CommodityId = requirement.CommodityId.ToInt();
|
dbRequirement._CommodityId = SysId.ToInt(requirement.CommodityId);
|
||||||
dbRequirement._ProductCode = requirement.ProductCode;
|
dbRequirement._ProductCode = requirement.ProductCode;
|
||||||
dbRequirement._AssetId = requirement.AssetId.ToInt();
|
dbRequirement._AssetId = requirement.AssetId.ToInt();
|
||||||
dbRequirement._DescBrief = requirement.DescBrief;
|
dbRequirement._DescBrief = requirement.DescBrief;
|
||||||
@@ -709,7 +724,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
|||||||
dbRequirement._TimeEst = requirement.TimeEst;
|
dbRequirement._TimeEst = requirement.TimeEst;
|
||||||
dbRequirement._TimeAct = requirement.TimeAct;
|
dbRequirement._TimeAct = requirement.TimeAct;
|
||||||
dbRequirement._TimeTot = requirement.TimeTot;
|
dbRequirement._TimeTot = requirement.TimeTot;
|
||||||
dbRequirement._LocationIdStock = requirement.LocationIdStock.ToInt();
|
dbRequirement._LocationIdStock = SysId.ToInt(requirement.LocationIdStock);
|
||||||
dbRequirement._CostLabourHours = requirement.CostLabourHours;
|
dbRequirement._CostLabourHours = requirement.CostLabourHours;
|
||||||
dbRequirement._CostLabourRateHour = requirement.CostLabourRateHour;
|
dbRequirement._CostLabourRateHour = requirement.CostLabourRateHour;
|
||||||
dbRequirement._CostLabour = requirement.CostLabour;
|
dbRequirement._CostLabour = requirement.CostLabour;
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ using Sarand.Net.Standard.Base.App;
|
|||||||
using Sarand.Net.Standard.Base.Bus;
|
using Sarand.Net.Standard.Base.Bus;
|
||||||
using Sarand.Net.Standard.Base.Core;
|
using Sarand.Net.Standard.Base.Core;
|
||||||
using Sarand.Net.Standard.Base.Dbas;
|
using Sarand.Net.Standard.Base.Dbas;
|
||||||
|
using Sarand.Net.Standard.Base.ReferenceData;
|
||||||
using Sarand.Net.Standard.Base.Utils;
|
using Sarand.Net.Standard.Base.Utils;
|
||||||
using Sarand.Net.Standard.Dbas.Base;
|
using Sarand.Net.Standard.Dbas.Base;
|
||||||
using Sarand.Net.Standard.Dbas.Data;
|
using Sarand.Net.Standard.Dbas.Data;
|
||||||
@@ -68,6 +69,41 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
|||||||
return detailsAreReadOnly;
|
return detailsAreReadOnly;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------
|
||||||
|
public override bool RefreshTransactionTotals(SbmTransaction transaction, IEnumerable<SbmRequirement> requirements)
|
||||||
|
{
|
||||||
|
ClearErrorState();
|
||||||
|
if (transaction == null) return SetErrorState(Msg_ItemNotSpecified);
|
||||||
|
if (requirements == null) requirements = new List<SbmRequirement>();
|
||||||
|
|
||||||
|
// Total weight.
|
||||||
|
decimal totalWeight = requirements.GetTotalWeight(Internals.GetDefaultUnitOfMeasureByCategory(SaUomCategory.Weight)?.Id);
|
||||||
|
transaction.Weight = totalWeight;
|
||||||
|
|
||||||
|
// Set the allocation status:
|
||||||
|
transaction.ClearAllocationStatus();
|
||||||
|
if (requirements.IsFullAllocation()) transaction.FullAllocation = true;
|
||||||
|
else if (requirements.IsPartialAllocation()) transaction.PartialAllocation = true;
|
||||||
|
|
||||||
|
// Calculate the totals from the list of requirements:
|
||||||
|
decimal totalAmountNet = 0.0m, totalAmountTax = 0.0m, totalAmountTot = 0.0m, totalTimeEst = 0.0m, totalTimeAct = 0.0m;
|
||||||
|
requirements.CalculateTotals(ref totalAmountNet, ref totalAmountTax, ref totalAmountTot, ref totalTimeEst, ref totalTimeAct);
|
||||||
|
|
||||||
|
// Include delivery amounts:
|
||||||
|
totalAmountNet += transaction.DeliveryAmountNet;
|
||||||
|
totalAmountTax += transaction.DeliveryAmountTax;
|
||||||
|
totalAmountTot += transaction.DeliveryAmountTot;
|
||||||
|
|
||||||
|
// Store amounts:
|
||||||
|
transaction.AmountNet = totalAmountNet;
|
||||||
|
transaction.AmountTax = totalAmountTax;
|
||||||
|
transaction.AmountTot = totalAmountTot;
|
||||||
|
transaction.TimeEst = totalTimeEst;
|
||||||
|
transaction.TimeAct = totalTimeAct;
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
||||||
// Labour Cost.
|
// Labour Cost.
|
||||||
public override decimal GetTransCostLabourRateHourDefault()
|
public override decimal GetTransCostLabourRateHourDefault()
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
using Sarand.BusinessMgr.Net.Standard.Base.App;
|
using Sarand.BusinessMgr.Net.Standard.Base.App;
|
||||||
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
|
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
|
||||||
|
using Sarand.BusinessMgr.Net.Standard.Base.Consoles;
|
||||||
using Sarand.BusinessMgr.Net.Standard.Dbas.Bus;
|
using Sarand.BusinessMgr.Net.Standard.Dbas.Bus;
|
||||||
using Sarand.BusinessMgr.Net.Standard.Dbas.Internal;
|
using Sarand.BusinessMgr.Net.Standard.Dbas.Internal;
|
||||||
using Sarand.BusinessMgr.Net.Standard.Dbas.UpdateLog;
|
using Sarand.BusinessMgr.Net.Standard.Dbas.UpdateLog;
|
||||||
@@ -551,11 +552,13 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
|||||||
if (!SysId.IsValid(assocId))
|
if (!SysId.IsValid(assocId))
|
||||||
{
|
{
|
||||||
SetErrorState("Association not supplied");
|
SetErrorState("Association not supplied");
|
||||||
|
SaLogger.Warn($"{SysUtil.Fn} Failed to create Requirement - {ErrorStateMessage}.");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if ((int)transactionType < 1)
|
if (transactionType <= 0)
|
||||||
{
|
{
|
||||||
SetErrorState("Transaction type not identified");
|
SetErrorState("Transaction type not supplied");
|
||||||
|
SaLogger.Warn($"{SysUtil.Fn} Failed to create Requirement - {ErrorStateMessage}.");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return new SbmTransaction_Dbas(new SysId(), AffiliateId_Owner, assocId, transactionType, 0);
|
return new SbmTransaction_Dbas(new SysId(), AffiliateId_Owner, assocId, transactionType, 0);
|
||||||
@@ -584,6 +587,13 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
|||||||
ClearErrorState();
|
ClearErrorState();
|
||||||
if (!IsValidTransaction(transaction)) return false;
|
if (!IsValidTransaction(transaction)) return false;
|
||||||
if (SysId.IsValid(transaction.Id)) return SetErrorState(ErrorMessage.ValiditemId);
|
if (SysId.IsValid(transaction.Id)) return SetErrorState(ErrorMessage.ValiditemId);
|
||||||
|
if (StringUtil.IsBlank(transaction.Ref))
|
||||||
|
{
|
||||||
|
if (!AssignTransactionReference(transaction))
|
||||||
|
return false;
|
||||||
|
if (!IsValidValue(transaction.Ref, "Ref", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Transaction_Ref), true))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
using (var dbConnection = Database.CreateConnection())
|
using (var dbConnection = Database.CreateConnection())
|
||||||
using (var dbCommand = dbConnection.CreateCommand())
|
using (var dbCommand = dbConnection.CreateCommand())
|
||||||
{
|
{
|
||||||
@@ -607,6 +617,29 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
|||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private bool AssignTransactionReference(SbmTransaction transaction)
|
||||||
|
{
|
||||||
|
if (HasErrorState()) return false;
|
||||||
|
// Populate reference if not already done.
|
||||||
|
if (StringUtil.IsBlank(transaction.Ref) && SessionConsole.TransactionAssignRefMethod(transaction.TransactionType) != SbmSessionConsole.AssignTransRefMethod.Manual)
|
||||||
|
{
|
||||||
|
// Retrieve the next available transaction reference.
|
||||||
|
String sRef = SessionConsole.GetTransactionCreateRef(transaction.AffiliateIdOwner, transaction.AssociationId, transaction.TransactionType);
|
||||||
|
// Check that another transaction doesn't already exist with this reference.
|
||||||
|
SbmTransaction transRef = GetTransactionByOwnerTypeRef(transaction.AffiliateIdOwner, transaction.TransactionType, sRef);
|
||||||
|
if (transRef == null)
|
||||||
|
transaction.Ref = sRef;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
String tranTypeDesc = TransactionTypes.GetDescForType(transaction.TransactionType);
|
||||||
|
if (StringUtil.IsEmpty(tranTypeDesc)) tranTypeDesc = "Transaction";
|
||||||
|
SetErrorState("Another " + tranTypeDesc + " already exists with this reference.");
|
||||||
|
}
|
||||||
|
if (HasErrorState()) return false;
|
||||||
|
}
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
||||||
// Update Transaction.
|
// Update Transaction.
|
||||||
public override bool UpdateTransaction(SbmTransaction transaction, DbUpdateInfo dbUpdateInfo)
|
public override bool UpdateTransaction(SbmTransaction transaction, DbUpdateInfo dbUpdateInfo)
|
||||||
@@ -792,7 +825,6 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
|||||||
transaction.AssociationId = new SysId(dbTransaction._AssocId);
|
transaction.AssociationId = new SysId(dbTransaction._AssocId);
|
||||||
transaction.TransactionType = (Sbm.TransactionType)(dbTransaction._Type ?? 0);
|
transaction.TransactionType = (Sbm.TransactionType)(dbTransaction._Type ?? 0);
|
||||||
transaction.Ref = dbTransaction._Ref;
|
transaction.Ref = dbTransaction._Ref;
|
||||||
transaction.RefInt = dbTransaction._RefInt ?? 0;
|
|
||||||
transaction.RefExt = dbTransaction._RefExt;
|
transaction.RefExt = dbTransaction._RefExt;
|
||||||
transaction.RaisedBy = dbTransaction._RaisedBy;
|
transaction.RaisedBy = dbTransaction._RaisedBy;
|
||||||
transaction.AffiliateIdRaise = new SysId(dbTransaction._AffIdRaise ?? 0);
|
transaction.AffiliateIdRaise = new SysId(dbTransaction._AffIdRaise ?? 0);
|
||||||
@@ -2046,6 +2078,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
// Delivery Address.
|
// Delivery Address.
|
||||||
bool hasColDeliveryAddress = columns.HasId(SbmTransaction.Column.DeliveryAddress);
|
bool hasColDeliveryAddress = columns.HasId(SbmTransaction.Column.DeliveryAddress);
|
||||||
@@ -2077,6 +2110,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
|||||||
foreach (SbmDbDfn.ColumnIdx dbColumn in addressDeliveryCols)
|
foreach (SbmDbDfn.ColumnIdx dbColumn in addressDeliveryCols)
|
||||||
query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasTransaction_DeliveryAddress), prefixTransaction_DeliveryAddress + SbmDbDfn.GetColumnName(dbColumn, false));
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasTransaction_DeliveryAddress), prefixTransaction_DeliveryAddress + SbmDbDfn.GetColumnName(dbColumn, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
// Delivery tax code.
|
// Delivery tax code.
|
||||||
bool bHasColDeliveryTaxCode = false;
|
bool bHasColDeliveryTaxCode = false;
|
||||||
@@ -2096,6 +2130,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
|||||||
foreach (SbmDbDfn.ColumnIdx dbColumn in taxcodeDeliveryCols)
|
foreach (SbmDbDfn.ColumnIdx dbColumn in taxcodeDeliveryCols)
|
||||||
query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasTransaction_DeliveryTaxcode), prefixTransaction_DeliveryTaxcode + SbmDbDfn.GetColumnName(dbColumn, false));
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasTransaction_DeliveryTaxcode), prefixTransaction_DeliveryTaxcode + SbmDbDfn.GetColumnName(dbColumn, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
// Currency.
|
// Currency.
|
||||||
bool hasColCurrency = false;
|
bool hasColCurrency = false;
|
||||||
@@ -2115,6 +2150,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
|||||||
foreach (SbmDbDfn.ColumnIdx dbColumn in currencyCols)
|
foreach (SbmDbDfn.ColumnIdx dbColumn in currencyCols)
|
||||||
query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasTransaction_Currency), prefixTransaction_Currency + SbmDbDfn.GetColumnName(dbColumn, false));
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasTransaction_Currency), prefixTransaction_Currency + SbmDbDfn.GetColumnName(dbColumn, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
// Source Transaction.
|
// Source Transaction.
|
||||||
bool hasColSourceTrans = columns.HasId(SbmTransaction.Column.SourceTrans_Ref);
|
bool hasColSourceTrans = columns.HasId(SbmTransaction.Column.SourceTrans_Ref);
|
||||||
@@ -2132,8 +2168,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
|||||||
foreach (SbmDbDfn.ColumnIdx dbColumn in transactionSourceCols)
|
foreach (SbmDbDfn.ColumnIdx dbColumn in transactionSourceCols)
|
||||||
query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasTransaction_SourceTransaction), prefixTransaction_SourceTransaction + SbmDbDfn.GetColumnName(dbColumn, false));
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasTransaction_SourceTransaction), prefixTransaction_SourceTransaction + SbmDbDfn.GetColumnName(dbColumn, false));
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------
|
|
||||||
// If subordinate records are being counted, other columns must be grouped. //if (bCountRequirements || bCountTimeRecords || bCountActions) //qry.lGroupBy = qry.lColumn.Values(); Slows down query immensely.
|
|
||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
// Total transaction cost.
|
// Total transaction cost.
|
||||||
bool includeCostTotal = (columns.HasId(SbmTransaction.Column.CostTotal) || columns.HasId(SbmTransaction.Column.CostTotal_Fmt));
|
bool includeCostTotal = (columns.HasId(SbmTransaction.Column.CostTotal) || columns.HasId(SbmTransaction.Column.CostTotal_Fmt));
|
||||||
@@ -2150,40 +2185,41 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
|||||||
qryReqntCount.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_TransId, aliasTransaction_RequirementCost, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, aliasTransaction));
|
qryReqntCount.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_TransId, aliasTransaction_RequirementCost, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, aliasTransaction));
|
||||||
query.Columns.Add("(" + qryReqntCount.BuildQuery() + ")", colNameCostTotal);
|
query.Columns.Add("(" + qryReqntCount.BuildQuery() + ")", colNameCostTotal);
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
bool countRequirements = columns.HasId(SbmTransaction.Column.ReqntCount);
|
// Requirements.
|
||||||
if (countRequirements)
|
if (columns.HasId(SbmTransaction.Column.ReqntCount))
|
||||||
{
|
{
|
||||||
// Build sub query to directly return the number of associated requirements.
|
// Build sub query to directly return the number of associated requirements.
|
||||||
String aliasTransaction_CountRequirement = "aTrnReqCnt";
|
String aliasTransaction_CountRequirement = "aTrnReqCnt";
|
||||||
String colNameCountReqnts = "CountReqnts";
|
|
||||||
DbQuery qryReqntCount = new DbQuery(Database.DbmsType);
|
DbQuery qryReqntCount = new DbQuery(Database.DbmsType);
|
||||||
qryReqntCount.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement), aliasTransaction_CountRequirement));
|
qryReqntCount.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement), aliasTransaction_CountRequirement));
|
||||||
qryReqntCount.Columns.Add("Count(" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_Id, aliasTransaction_CountRequirement, false) + ")");
|
qryReqntCount.Columns.Add("Count(*)");
|
||||||
qryReqntCount.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_TransId, aliasTransaction_CountRequirement, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, aliasTransaction));
|
qryReqntCount.Filters.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_TransId, aliasTransaction_CountRequirement, false)}={SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, aliasTransaction)}");
|
||||||
|
qryReqntCount.Filters.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_Status, aliasTransaction_CountRequirement, false)} Not In ('{StatusCancelled}','{StatusDeleted}')");
|
||||||
query.Columns.Add("(" + qryReqntCount.BuildQuery() + ")", colNameCountReqnts);
|
query.Columns.Add("(" + qryReqntCount.BuildQuery() + ")", colNameCountReqnts);
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
bool bCountTimeRecords = columns.HasId(SbmTransaction.Column.TimeCount);
|
// Time records.
|
||||||
if (bCountTimeRecords)
|
if (columns.HasId(SbmTransaction.Column.TimeCount))
|
||||||
{
|
{
|
||||||
// Build sub query to directly return the number of associated constituents of type 'Time'.
|
// Build sub query to directly return the number of associated constituents of type 'Time'.
|
||||||
String aliasTransaction_CountTimes = "ConTim";
|
String aliasTransaction_CountTimes = "ConTim";
|
||||||
String colNameCountTimeRecs = "CountTimeRecs";
|
|
||||||
DbQuery qryConstTimeCount = new DbQuery(Database.DbmsType);
|
DbQuery qryConstTimeCount = new DbQuery(Database.DbmsType);
|
||||||
qryConstTimeCount.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Constituent), aliasTransaction_CountTimes));
|
qryConstTimeCount.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Constituent), aliasTransaction_CountTimes));
|
||||||
qryConstTimeCount.Columns.Add("Count(" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_Id, aliasTransaction_CountTimes, false) + ")");
|
qryConstTimeCount.Columns.Add("Count(*)");
|
||||||
qryConstTimeCount.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_TransId, aliasTransaction_CountTimes, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, aliasTransaction));
|
qryConstTimeCount.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_TransId, aliasTransaction_CountTimes, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, aliasTransaction));
|
||||||
qryConstTimeCount.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_Type, aliasTransaction_CountTimes, false) + "=" + Sbm.ConstituentType.TimeRecord.ToString());
|
qryConstTimeCount.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_Type, aliasTransaction_CountTimes, false) + "=" + Sbm.ConstituentType.TimeRecord.ToString());
|
||||||
qryConstTimeCount.Columns.Add("(" + qryConstTimeCount.BuildQuery() + ")", colNameCountTimeRecs);
|
qryConstTimeCount.Columns.Add("(" + qryConstTimeCount.BuildQuery() + ")", colNameCountTimeRecs);
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
bool bCountActions = columns.HasId(SbmTransaction.Column.TaskCount);
|
// Tasks.
|
||||||
if (bCountActions)
|
if (columns.HasId(SbmTransaction.Column.TaskCount))
|
||||||
{
|
{
|
||||||
// Build sub query to directly return the number of associated constituents of type 'Action'.
|
// Build sub query to directly return the number of associated constituents of type 'Action'.
|
||||||
String aliasTransaction_CountActions = "ConAct";
|
String aliasTransaction_CountActions = "ConAct";
|
||||||
String colNameCountActions = "CountActions";
|
|
||||||
DbQuery qryConstActionCount = new DbQuery(Database.DbmsType);
|
DbQuery qryConstActionCount = new DbQuery(Database.DbmsType);
|
||||||
qryConstActionCount.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Constituent), aliasTransaction_CountActions));
|
qryConstActionCount.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Constituent), aliasTransaction_CountActions));
|
||||||
qryConstActionCount.Columns.Add("Count(" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_Id, aliasTransaction_CountActions, false) + ")");
|
qryConstActionCount.Columns.Add("Count(" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Constituent_Id, aliasTransaction_CountActions, false) + ")");
|
||||||
@@ -2193,8 +2229,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
|||||||
}
|
}
|
||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
// Whether transaction has associated invoices.
|
// Whether transaction has associated invoices.
|
||||||
bool checkForInvoices = columns.HasId(SbmTransaction.Column.HasInvoice);
|
if (columns.HasId(SbmTransaction.Column.HasInvoice))
|
||||||
if (checkForInvoices)
|
|
||||||
{
|
{
|
||||||
// Check which types of transaction are allowed.
|
// Check which types of transaction are allowed.
|
||||||
bool invoicesAllowed = SessionConsole != null && (AllowTransactionType(Sbm.TransactionType.ProformaSalesInvoice) || AllowTransactionType(Sbm.TransactionType.SalesInvoice) ||
|
bool invoicesAllowed = SessionConsole != null && (AllowTransactionType(Sbm.TransactionType.ProformaSalesInvoice) || AllowTransactionType(Sbm.TransactionType.SalesInvoice) ||
|
||||||
@@ -2205,7 +2240,6 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
|||||||
// Aliases & Columns.
|
// Aliases & Columns.
|
||||||
String aliasTransaction_TransactionInvoice = "TraInv";
|
String aliasTransaction_TransactionInvoice = "TraInv";
|
||||||
String aliasTransaction_TransactionSource = "TraSrc";
|
String aliasTransaction_TransactionSource = "TraSrc";
|
||||||
String colNameHasInvoice = "HasInvoice";
|
|
||||||
|
|
||||||
// Supported invoice transaction types.
|
// Supported invoice transaction types.
|
||||||
List<String> transTypeInvoices = new List<String>();
|
List<String> transTypeInvoices = new List<String>();
|
||||||
@@ -2235,8 +2269,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
bool bAccountInvoiceRef = columns.HasId(SbmTransaction.Column.AccountsInvoiceRef);
|
if (columns.HasId(SbmTransaction.Column.AccountsInvoiceRef))
|
||||||
if (bAccountInvoiceRef)
|
|
||||||
{
|
{
|
||||||
// Identify the accounts interface.
|
// Identify the accounts interface.
|
||||||
HashSet<SysId> accountsIdsInterface = AccountsDfn.GetInterfaceIds(true);
|
HashSet<SysId> accountsIdsInterface = AccountsDfn.GetInterfaceIds(true);
|
||||||
|
|||||||
+7
-13
@@ -1,28 +1,22 @@
|
|||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.Extensions.Logging;
|
using Sarand.BusinessMgr.Net.Standard.Base.App;
|
||||||
using NPOI.SS.Formula.Functions;
|
using Sarand.BusinessMgr.Net.Standard.Base.Bus.Control;
|
||||||
using Sarand.BusinessMgr.Net.Core.Web.App;
|
|
||||||
using Sarand.BusinessMgr.Net.Standard.Dbas.App;
|
using Sarand.BusinessMgr.Net.Standard.Dbas.App;
|
||||||
|
using Sarand.BusinessMgr.Net.Standard.Dbas.Consoles;
|
||||||
using Sarand.BusinessMgr.Web.Control.Components;
|
using Sarand.BusinessMgr.Web.Control.Components;
|
||||||
|
using Sarand.BusinessMgr.Web.Control.Models.System;
|
||||||
|
using Sarand.Net.Standard.Base.App;
|
||||||
using Sarand.Net.Standard.Base.Core;
|
using Sarand.Net.Standard.Base.Core;
|
||||||
using Sarand.Net.Standard.Base.Dbas;
|
using Sarand.Net.Standard.Base.Dbas;
|
||||||
using Sarand.Net.Standard.Base.Helpers;
|
using Sarand.Net.Standard.Base.Helpers;
|
||||||
using Sarand.Net.Standard.Base.Utils;
|
using Sarand.Net.Standard.Base.Utils;
|
||||||
|
using Sarand.Net.Standard.Dbas.Base;
|
||||||
using Sarand.Net.Standard.Dbas.Data;
|
using Sarand.Net.Standard.Dbas.Data;
|
||||||
using Sarand.Net.Standard.Dbas.Proc;
|
using Sarand.Net.Standard.Dbas.Proc;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System;
|
using System;
|
||||||
using Sarand.BusinessMgr.Web.Control.Models.System;
|
using System.Collections.Generic;
|
||||||
using Sarand.BusinessMgr.Net.Standard.Base.App;
|
|
||||||
using DocumentFormat.OpenXml.EMMA;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Sarand.BusinessMgr.Net.Standard.Base.Bus.Control;
|
|
||||||
using Sarand.Net.Standard.Dbas.Base;
|
|
||||||
using Sarand.BusinessMgr.Web.Control.Consoles;
|
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using static Sarand.BusinessMgr.Net.Standard.Dbas.Utils.SbmDbDfnGenerator;
|
|
||||||
using Sarand.Net.Standard.Base.App;
|
|
||||||
using Sarand.BusinessMgr.Net.Standard.Dbas.Consoles;
|
|
||||||
|
|
||||||
namespace Sarand.BusinessMgr.Web.Control.Controllers.System
|
namespace Sarand.BusinessMgr.Web.Control.Controllers.System
|
||||||
{
|
{
|
||||||
|
|||||||
+3
-21
@@ -1,29 +1,11 @@
|
|||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.Extensions.Logging;
|
|
||||||
using NPOI.SS.Formula.Functions;
|
|
||||||
using Sarand.BusinessMgr.Net.Core.Web.App;
|
|
||||||
using Sarand.BusinessMgr.Net.Standard.Dbas.App;
|
|
||||||
using Sarand.BusinessMgr.Web.Control.Components;
|
using Sarand.BusinessMgr.Web.Control.Components;
|
||||||
using Sarand.Net.Standard.Base.Core;
|
|
||||||
using Sarand.Net.Standard.Base.Dbas;
|
|
||||||
using Sarand.Net.Standard.Base.Helpers;
|
|
||||||
using Sarand.Net.Standard.Base.Utils;
|
|
||||||
using Sarand.Net.Standard.Dbas.Data;
|
|
||||||
using Sarand.Net.Standard.Dbas.Proc;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System;
|
|
||||||
using Sarand.BusinessMgr.Web.Control.Models.System;
|
using Sarand.BusinessMgr.Web.Control.Models.System;
|
||||||
using Sarand.BusinessMgr.Net.Standard.Base.App;
|
|
||||||
using DocumentFormat.OpenXml.EMMA;
|
|
||||||
using System.Linq;
|
|
||||||
using Sarand.BusinessMgr.Net.Standard.Base.Bus.Control;
|
|
||||||
using Sarand.Net.Standard.Dbas.Base;
|
|
||||||
using Sarand.BusinessMgr.Web.Control.Consoles;
|
|
||||||
using System.Reflection;
|
|
||||||
using static Sarand.BusinessMgr.Net.Standard.Dbas.Utils.SbmDbDfnGenerator;
|
|
||||||
using Sarand.Net.Standard.Base.App;
|
using Sarand.Net.Standard.Base.App;
|
||||||
using Sarand.BusinessMgr.Net.Standard.Dbas.Consoles;
|
|
||||||
using Sarand.Net.Standard.Base.IO;
|
using Sarand.Net.Standard.Base.IO;
|
||||||
|
using Sarand.Net.Standard.Base.Utils;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
<div class="sax-email-footer">
|
<div class="sbc-email-footer">
|
||||||
<div class="sax-content"></div>
|
<div class="sbc-content"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
<div class="sax-email-header">
|
<div class="sbc-email-header">
|
||||||
<div class="sax-content">Sarand BusinessMgr</div>
|
<div class="sbc-content">Sarand BusinessMgr</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ td
|
|||||||
vertical-align: top;
|
vertical-align: top;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sax-email-header
|
.sbc-email-header
|
||||||
{
|
{
|
||||||
margin: 0 0 12px 0;
|
margin: 0 0 12px 0;
|
||||||
border-bottom: 1px solid rgba(0,0,0,.1);
|
border-bottom: 1px solid rgba(0,0,0,.1);
|
||||||
@@ -27,7 +27,7 @@ td
|
|||||||
-webkit-box-shadow: 0 1px 0 rgba(0,0,0,.1);
|
-webkit-box-shadow: 0 1px 0 rgba(0,0,0,.1);
|
||||||
}
|
}
|
||||||
|
|
||||||
.sax-email-header .sax-content, .sax-email-body, .sax-email-footer .sax-content
|
.sbc-email-header .sbc-content, .sbc-email-body, .sbc-email-footer .sbc-content
|
||||||
{
|
{
|
||||||
width: 90%;
|
width: 90%;
|
||||||
max-width: 1040px;
|
max-width: 1040px;
|
||||||
@@ -35,16 +35,16 @@ td
|
|||||||
padding:12px 24px;
|
padding:12px 24px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sax-email-header .sax-content
|
.sbc-email-header .sbc-content
|
||||||
{
|
{
|
||||||
font-size:2.3rem;
|
font-size:2.3rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sax-email-body
|
.sbc-email-body
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
.sax-email-panel-caption
|
.sbc-email-panel-caption
|
||||||
{
|
{
|
||||||
margin: 12px 0;
|
margin: 12px 0;
|
||||||
font-size: 3.2rem;
|
font-size: 3.2rem;
|
||||||
@@ -53,17 +53,17 @@ td
|
|||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sax-email-panel-content
|
.sbc-email-panel-content
|
||||||
{
|
{
|
||||||
margin: 12px 0;
|
margin: 12px 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sax-para
|
.sbc-para
|
||||||
{
|
{
|
||||||
margin-bottom: 16px;
|
margin-bottom: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
td.sax-label
|
td.sbc-label
|
||||||
{
|
{
|
||||||
padding: 4px 12px;
|
padding: 4px 12px;
|
||||||
font-size: 1.6rem;
|
font-size: 1.6rem;
|
||||||
@@ -72,25 +72,25 @@ td.sax-label
|
|||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
td.sax-value
|
td.sbc-value
|
||||||
{
|
{
|
||||||
padding-top: 4px;
|
padding-top: 4px;
|
||||||
font-size: 1.6rem;
|
font-size: 1.6rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sax-email-footer
|
.sbc-email-footer
|
||||||
{
|
{
|
||||||
margin: 24px 0 12px 0;
|
margin: 24px 0 12px 0;
|
||||||
border-top: 1px rgba(0,0,0,.1) solid;
|
border-top: 1px rgba(0,0,0,.1) solid;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sax-email-footer .sax-content
|
.sbc-email-footer .sbc-content
|
||||||
{
|
{
|
||||||
padding:12px 24px;
|
padding:12px 24px;
|
||||||
font-size:1.2rem;
|
font-size:1.2rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sax-email-footer .sax-content .sax-footer-lower
|
.sbc-email-footer .sbc-content .sbc-footer-lower
|
||||||
{
|
{
|
||||||
background-color: #f9f9f9;
|
background-color: #f9f9f9;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,7 +43,7 @@
|
|||||||
<div class="row pb4">
|
<div class="row pb4">
|
||||||
<div class="col-sm-5 sbc-label text-left text-sm-right">@Localiser["label.search"]</div>
|
<div class="col-sm-5 sbc-label text-left text-sm-right">@Localiser["label.search"]</div>
|
||||||
<div class="col-sm-7">
|
<div class="col-sm-7">
|
||||||
@Html.TextBoxFor(model => model.Filter.Search, new { @id = "", @class = "FilterSearch", @maxlength = "32" })
|
@Html.TextBoxFor(model => model.Filter.Search, new { @type = "search", @id = "", @class = "FilterSearch", @maxlength = "32" })
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -71,17 +71,17 @@
|
|||||||
max-width: 960px;
|
max-width: 960px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sax-panel-results .sax-panel-info.DbSchema > .sax-content
|
.sbc-panel-results .sbc-panel-info.DbSchema > .sbc-content
|
||||||
{
|
{
|
||||||
max-height: auto;
|
max-height: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sax-panel-results .sax-panel-info.DbSchema .sax-panel-messages
|
.sbc-panel-results .sbc-panel-info.DbSchema .sbc-panel-messages
|
||||||
{
|
{
|
||||||
margin-bottom: 8px;
|
margin-bottom: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sax-panel-results .sax-panel-info.DbSchema table.sax-item-list thead tr th
|
.sbc-panel-results .sbc-panel-info.DbSchema table.sbc-item-list thead tr th
|
||||||
{
|
{
|
||||||
background-color: #ffc8c7;
|
background-color: #ffc8c7;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,7 +43,7 @@
|
|||||||
<div class="row pb4">
|
<div class="row pb4">
|
||||||
<div class="col-sm-5 sbc-label text-left text-sm-right">@Localiser["label.search"]</div>
|
<div class="col-sm-5 sbc-label text-left text-sm-right">@Localiser["label.search"]</div>
|
||||||
<div class="col-sm-7">
|
<div class="col-sm-7">
|
||||||
@Html.TextBoxFor(model => model.Filter.Search, new { @id = "", @class = "FilterSearch", @maxlength = "32" })
|
@Html.TextBoxFor(model => model.Filter.Search, new { @type = "search", @id = "", @class = "FilterSearch", @maxlength = "32" })
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -50,7 +50,7 @@
|
|||||||
<div class="col-sm-4 row pb4">
|
<div class="col-sm-4 row pb4">
|
||||||
<div class="col-sm-5 sbc-label text-left text-sm-right">@Localiser["label.search"]</div>
|
<div class="col-sm-5 sbc-label text-left text-sm-right">@Localiser["label.search"]</div>
|
||||||
<div class="col-sm-7">
|
<div class="col-sm-7">
|
||||||
@Html.TextBoxFor(model => model.DatabaseFilter.Search, new { @id = "", @class = "FilterSearch", @maxlength = "32" })
|
@Html.TextBoxFor(model => model.DatabaseFilter.Search, new { @type = "search", @id = "", @class = "FilterSearch", @maxlength = "32" })
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -47,7 +47,7 @@
|
|||||||
<div class="col-sm-4 row pb4">
|
<div class="col-sm-4 row pb4">
|
||||||
<div class="col-sm-5 sbc-label text-left text-sm-right">@Localiser["label.search"]</div>
|
<div class="col-sm-5 sbc-label text-left text-sm-right">@Localiser["label.search"]</div>
|
||||||
<div class="col-sm-7">
|
<div class="col-sm-7">
|
||||||
@Html.TextBoxFor(model => model.DatabaseFilter.Search, new { @id = "", @class = "FilterSearch", @maxlength = "32" })
|
@Html.TextBoxFor(model => model.DatabaseFilter.Search, new { @type = "search", @id = "", @class = "FilterSearch", @maxlength = "32" })
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -44,7 +44,7 @@
|
|||||||
<div class="row pb4">
|
<div class="row pb4">
|
||||||
<div class="col-sm-5 sbc-label text-left text-sm-right">@Localiser["label.search"]</div>
|
<div class="col-sm-5 sbc-label text-left text-sm-right">@Localiser["label.search"]</div>
|
||||||
<div class="col-sm-7">
|
<div class="col-sm-7">
|
||||||
@Html.TextBoxFor(model => model.Filter.Search, new { @id = "", @class = "FilterSearch", @maxlength = "32" })
|
@Html.TextBoxFor(model => model.Filter.Search, new { @type = "search", @id = "", @class = "FilterSearch", @maxlength = "32" })
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -63,7 +63,7 @@
|
|||||||
<div class="col-sm-4 row pb4">
|
<div class="col-sm-4 row pb4">
|
||||||
<div class="col-sm-4 sbc-label text-left text-sm-right">@Localiser["label.search"]</div>
|
<div class="col-sm-4 sbc-label text-left text-sm-right">@Localiser["label.search"]</div>
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
@Html.TextBoxFor(model => model.Filter.Search, new { @id = "", @class = "FilterSearch fullwidth", @maxlength = "32" })
|
@Html.TextBoxFor(model => model.Filter.Search, new { @type = "search", @id = "", @class = "FilterSearch fullwidth", @maxlength = "32" })
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -92,6 +92,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.sbc-panel-data .sbc-panel-content input[type="text"],
|
.sbc-panel-data .sbc-panel-content input[type="text"],
|
||||||
|
.sbc-panel-data .sbc-panel-content input[type="email"],
|
||||||
|
.sbc-panel-data .sbc-panel-content input[type="search"],
|
||||||
.sbc-panel-data .sbc-panel-content select
|
.sbc-panel-data .sbc-panel-content select
|
||||||
{
|
{
|
||||||
min-width: 75%;
|
min-width: 75%;
|
||||||
|
|||||||
@@ -65,7 +65,7 @@
|
|||||||
sbc.goToPage('Security/Signin');
|
sbc.goToPage('Security/Signin');
|
||||||
}
|
}
|
||||||
if (response.successMsg)
|
if (response.successMsg)
|
||||||
sbc.doAlert($('.sax-page-caption').text(), response.successMsg, gotoSigninPage);
|
sbc.doAlert($('.sbc-page-caption').text(), response.successMsg, gotoSigninPage);
|
||||||
else gotoSigninPage();
|
else gotoSigninPage();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -129,9 +129,6 @@
|
|||||||
<data name="label.associations" xml:space="preserve">
|
<data name="label.associations" xml:space="preserve">
|
||||||
<value>Associations</value>
|
<value>Associations</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="caption.commodities" xml:space="preserve">
|
|
||||||
<value>Commodities</value>
|
|
||||||
</data>
|
|
||||||
<data name="caption.commodity" xml:space="preserve">
|
<data name="caption.commodity" xml:space="preserve">
|
||||||
<value>Commodity</value>
|
<value>Commodity</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -339,9 +336,6 @@
|
|||||||
<data name="msg.item.updated" xml:space="preserve">
|
<data name="msg.item.updated" xml:space="preserve">
|
||||||
<value>Item updated.</value>
|
<value>Item updated.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="msg.item.updated" xml:space="preserve">
|
|
||||||
<value>Item updated.</value>
|
|
||||||
</data>
|
|
||||||
<data name="msg.something.gone.wrong" xml:space="preserve">
|
<data name="msg.something.gone.wrong" xml:space="preserve">
|
||||||
<value>Unfortunately, something has gone wrong.\n\nYou will be returned to the home page.</value>
|
<value>Unfortunately, something has gone wrong.\n\nYou will be returned to the home page.</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -753,4 +747,85 @@
|
|||||||
<data name="label.tax" xml:space="preserve">
|
<data name="label.tax" xml:space="preserve">
|
||||||
<value>Tax</value>
|
<value>Tax</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="label.sales.orders" xml:space="preserve">
|
||||||
|
<value>Sales orders</value>
|
||||||
|
</data>
|
||||||
|
<data name="label.raised" xml:space="preserve">
|
||||||
|
<value>Raised</value>
|
||||||
|
</data>
|
||||||
|
<data name="label.in.progress" xml:space="preserve">
|
||||||
|
<value>In progress</value>
|
||||||
|
</data>
|
||||||
|
<data name="label.required" xml:space="preserve">
|
||||||
|
<value>Required</value>
|
||||||
|
</data>
|
||||||
|
<data name="label.closed" xml:space="preserve">
|
||||||
|
<value>Closed</value>
|
||||||
|
</data>
|
||||||
|
<data name="label.amount.net" xml:space="preserve">
|
||||||
|
<value>Amount net</value>
|
||||||
|
</data>
|
||||||
|
<data name="label.amount.tax" xml:space="preserve">
|
||||||
|
<value>Amount tax</value>
|
||||||
|
</data>
|
||||||
|
<data name="label.customer" xml:space="preserve">
|
||||||
|
<value>Customer</value>
|
||||||
|
</data>
|
||||||
|
<data name="label.supplier" xml:space="preserve">
|
||||||
|
<value>Supplier</value>
|
||||||
|
</data>
|
||||||
|
<data name="caption.projects" xml:space="preserve">
|
||||||
|
<value>Projects</value>
|
||||||
|
</data>
|
||||||
|
<data name="caption.sales.leads" xml:space="preserve">
|
||||||
|
<value>Sales Leads</value>
|
||||||
|
</data>
|
||||||
|
<data name="caption.sales.quotes" xml:space="preserve">
|
||||||
|
<value>Sales Quotes</value>
|
||||||
|
</data>
|
||||||
|
<data name="caption.proforma.sales.orders" xml:space="preserve">
|
||||||
|
<value>Proforma Sales Orders</value>
|
||||||
|
</data>
|
||||||
|
<data name="caption.sales.purchase.orders" xml:space="preserve">
|
||||||
|
<value>SalesPurchaseOrders</value>
|
||||||
|
</data>
|
||||||
|
<data name="caption.sales.orders" xml:space="preserve">
|
||||||
|
<value>Sales Orders</value>
|
||||||
|
</data>
|
||||||
|
<data name="caption.sales.dispatches" xml:space="preserve">
|
||||||
|
<value>Sales Dispatches</value>
|
||||||
|
</data>
|
||||||
|
<data name="caption.proforma.sales.invoices" xml:space="preserve">
|
||||||
|
<value>Proforma Sales Invoices</value>
|
||||||
|
</data>
|
||||||
|
<data name="caption.sales.invoices" xml:space="preserve">
|
||||||
|
<value>Sales Invoices</value>
|
||||||
|
</data>
|
||||||
|
<data name="caption.purchase.quotes" xml:space="preserve">
|
||||||
|
<value>Purchase Quotes</value>
|
||||||
|
</data>
|
||||||
|
<data name="caption.purchase.sales.orders" xml:space="preserve">
|
||||||
|
<value>Purchase Sales Orders</value>
|
||||||
|
</data>
|
||||||
|
<data name="caption.purchase.orders" xml:space="preserve">
|
||||||
|
<value>Purchase Orders</value>
|
||||||
|
</data>
|
||||||
|
<data name="caption.purchase.deliveries" xml:space="preserve">
|
||||||
|
<value>Purchase Deliveries</value>
|
||||||
|
</data>
|
||||||
|
<data name="caption.proforma.purchase.invoices" xml:space="preserve">
|
||||||
|
<value>Proforma Purchase Invoices</value>
|
||||||
|
</data>
|
||||||
|
<data name="caption.purchase.invoices" xml:space="preserve">
|
||||||
|
<value>Purchase Invoices</value>
|
||||||
|
</data>
|
||||||
|
<data name="caption.proforma.purchase.orders" xml:space="preserve">
|
||||||
|
<value>Proforma Purchase Orders</value>
|
||||||
|
</data>
|
||||||
|
<data name="label.items" xml:space="preserve">
|
||||||
|
<value>Items</value>
|
||||||
|
</data>
|
||||||
|
<data name="label.raised.by" xml:space="preserve">
|
||||||
|
<value>Raised by</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
@@ -204,6 +204,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Components
|
|||||||
if (keepLoggedInParams.IsValid())
|
if (keepLoggedInParams.IsValid())
|
||||||
{
|
{
|
||||||
// Instance Repository configured on Control database identified by Context.
|
// Instance Repository configured on Control database identified by Context.
|
||||||
|
bool demoContext = keepLoggedInParams.RepositoryContext.EqualsCI(Sbm.RepositoryContext_Demo);
|
||||||
SbmSessionContext sessionContext = SbmCoreInstanceHelper_Portal.GetSessionContextByRepositoryContext(keepLoggedInParams.RepositoryContext);
|
SbmSessionContext sessionContext = SbmCoreInstanceHelper_Portal.GetSessionContextByRepositoryContext(keepLoggedInParams.RepositoryContext);
|
||||||
if (sessionContext != null)
|
if (sessionContext != null)
|
||||||
{
|
{
|
||||||
@@ -237,7 +238,8 @@ namespace Sarand.BusinessMgr.Web.Portal.Components
|
|||||||
}
|
}
|
||||||
else SaLogger.Warn(logPrefix + "Security Item and Affiliate are inconsistent. " + logSuffix);
|
else SaLogger.Warn(logPrefix + "Security Item and Affiliate are inconsistent. " + logSuffix);
|
||||||
}
|
}
|
||||||
else SaLogger.Warn(logPrefix + "Security Item or Affiliate not found. " + logSuffix);
|
else if (!demoContext)
|
||||||
|
SaLogger.Warn(logPrefix + "Security Item or Affiliate not found. " + logSuffix);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -175,6 +175,15 @@ namespace Sarand.BusinessMgr.Web.Portal.Components
|
|||||||
if (commoditiesItem.Options.Any())
|
if (commoditiesItem.Options.Any())
|
||||||
Menu.Items.Add(commoditiesItem);
|
Menu.Items.Add(commoditiesItem);
|
||||||
|
|
||||||
|
// Transactions.
|
||||||
|
if (SessionConsole.AllowOption(Sbm.ConfigOption.Transactions))
|
||||||
|
{
|
||||||
|
MenuItemData transactionsItem = new MenuItemData() { Caption = @Localiser["label.transactions"] };
|
||||||
|
transactionsItem.Options.Add(new MenuOptionData() { Caption = @Localiser["label.sales.orders"], Page = "Transactions/SalesOrder" });
|
||||||
|
if (transactionsItem.Options.Any())
|
||||||
|
Menu.Items.Add(transactionsItem);
|
||||||
|
}
|
||||||
|
|
||||||
// Reference.
|
// Reference.
|
||||||
MenuItemData referenceItem = new MenuItemData() { Caption = @Localiser["label.reference"] };
|
MenuItemData referenceItem = new MenuItemData() { Caption = @Localiser["label.reference"] };
|
||||||
referenceItem.Options.Add(new MenuOptionData() { Caption = @Localiser["caption.code.types"], Page = "Codes/CodeType" });
|
referenceItem.Options.Add(new MenuOptionData() { Caption = @Localiser["caption.code.types"], Page = "Codes/CodeType" });
|
||||||
|
|||||||
@@ -4,11 +4,14 @@ using Sarand.BusinessMgr.Net.Standard.Base.Bus;
|
|||||||
using Sarand.BusinessMgr.Net.Standard.Base.Consoles;
|
using Sarand.BusinessMgr.Net.Standard.Base.Consoles;
|
||||||
using Sarand.BusinessMgr.Net.Standard.Base.Core;
|
using Sarand.BusinessMgr.Net.Standard.Base.Core;
|
||||||
using Sarand.BusinessMgr.Net.Standard.Base.Data;
|
using Sarand.BusinessMgr.Net.Standard.Base.Data;
|
||||||
|
using Sarand.BusinessMgr.Net.Standard.Base.Mgr;
|
||||||
using Sarand.BusinessMgr.Web.Portal.App;
|
using Sarand.BusinessMgr.Web.Portal.App;
|
||||||
using Sarand.BusinessMgr.Web.Portal.Components;
|
using Sarand.BusinessMgr.Web.Portal.Components;
|
||||||
using Sarand.Net.Standard.Base.App;
|
using Sarand.Net.Standard.Base.App;
|
||||||
using Sarand.Net.Standard.Base.Bus;
|
using Sarand.Net.Standard.Base.Bus;
|
||||||
|
using Sarand.Net.Standard.Base.Core;
|
||||||
using Sarand.Net.Standard.Base.Dbas;
|
using Sarand.Net.Standard.Base.Dbas;
|
||||||
|
using Sarand.Net.Standard.Base.Helpers;
|
||||||
using Sarand.Net.Standard.Base.ReferenceData;
|
using Sarand.Net.Standard.Base.ReferenceData;
|
||||||
using Sarand.Net.Standard.Base.Security;
|
using Sarand.Net.Standard.Base.Security;
|
||||||
using Sarand.Net.Standard.Base.Utils;
|
using Sarand.Net.Standard.Base.Utils;
|
||||||
@@ -16,6 +19,7 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Runtime.Serialization;
|
using System.Runtime.Serialization;
|
||||||
|
using System.Transactions;
|
||||||
|
|
||||||
namespace Sarand.BusinessMgr.Web.Portal.Consoles
|
namespace Sarand.BusinessMgr.Web.Portal.Consoles
|
||||||
{
|
{
|
||||||
@@ -87,37 +91,29 @@ namespace Sarand.BusinessMgr.Web.Portal.Consoles
|
|||||||
data.InitData.User.Password = "ap@www.boardgameoutlet.co.uk";
|
data.InitData.User.Password = "ap@www.boardgameoutlet.co.uk";
|
||||||
|
|
||||||
// Contacts - Organisations.
|
// Contacts - Organisations.
|
||||||
SbmRepositoryPopulationData.OrganisationData organisation01 = new SbmRepositoryPopulationData.CommercialOrganisationData() { Name = "Online Board Games" };
|
data.Organisations.Add(new SbmRepositoryPopulationData.CommercialOrganisationData() { Name = "Online Board Games", CustomerCode = "CUST123" });
|
||||||
organisation01.SetCustomer("CUST123");
|
data.Organisations.Add(new SbmRepositoryPopulationData.CommercialOrganisationData() { Name = "Traditional Pastimes Ltd", CustomerCode = "CUST017" });
|
||||||
SbmRepositoryPopulationData.OrganisationData organisation02 = new SbmRepositoryPopulationData.CommercialOrganisationData() { Name = "Traditional Pastimes Ltd" };
|
data.Organisations.Add(new SbmRepositoryPopulationData.CommercialOrganisationData() { Name = "Surplus Stock Ltd", SupplierCode = "SUPP012" });
|
||||||
organisation02.SetCustomer("CUST017");
|
data.Organisations.Add(new SbmRepositoryPopulationData.CharityOrganisationData() { Name = "Ethical Game Redistribution", CustomerCode = "CUST124", SupplierCode = "SUPP018" });
|
||||||
SbmRepositoryPopulationData.OrganisationData organisation03 = new SbmRepositoryPopulationData.CommercialOrganisationData() { Name = "Surplus Stock Ltd" };
|
data.Organisations.Add(new SbmRepositoryPopulationData.CharityOrganisationData() { Name = "The Games Emporium", CustomerCode = "CUST004" });
|
||||||
organisation02.SetSupplier("SUPP012");
|
data.Organisations.Add(new SbmRepositoryPopulationData.CharityOrganisationData() { Name = "Spare Time Cafe", CustomerCode = "CUST016" });
|
||||||
SbmRepositoryPopulationData.OrganisationData organisation04 = new SbmRepositoryPopulationData.CharityOrganisationData() { Name = "Ethical Game Redistribution" };
|
data.Organisations.Add(new SbmRepositoryPopulationData.CharityOrganisationData() { Name = "Take a Break Coffee Shop", CustomerCode = "CUST102" });
|
||||||
organisation04.SetCustomer("CUST1234");
|
|
||||||
organisation04.SetSupplier("SUPP018");
|
|
||||||
data.Organisations.AddRange(new List<SbmRepositoryPopulationData.OrganisationData>() { organisation01, organisation02, organisation03, organisation04 });
|
|
||||||
|
|
||||||
// Contact - Individuals.
|
// Contact - Individuals.
|
||||||
SbmRepositoryPopulationData.IndividualData individual01 = new SbmRepositoryPopulationData.IndividualData() { FirstName = "Billy", LastName = "Sparks", Email = "bs@www.boardgameoutlet.co.uk" };
|
data.Individuals.Add(new SbmRepositoryPopulationData.IndividualData() { FirstName = "Billy", LastName = "Sparks", Email = "bs@www.boardgameoutlet.co.uk", MemberCode = "OBG110", MemberRole = "Dice Cleaner" });
|
||||||
individual01.SetMember("OBG110", "Dice Cleaner");
|
data.Individuals.Add(new SbmRepositoryPopulationData.IndividualData() { FirstName = "Sally", LastName = "Sparks", Email = "ss@www.boardgameoutlet.co.uk", MemberCode = "OBG120", MemberRole = "Banker" });
|
||||||
SbmRepositoryPopulationData.IndividualData individual02 = new SbmRepositoryPopulationData.IndividualData() { FirstName = "Sally", LastName = "Sparks", Email = "ss@www.boardgameoutlet.co.uk" };
|
|
||||||
individual02.SetMember("OBG120", "Banker");
|
|
||||||
data.Individuals.AddRange(new List<SbmRepositoryPopulationData.IndividualData>() { individual01, individual02 });
|
|
||||||
|
|
||||||
// Commodities.
|
// Commodities.
|
||||||
SbmRepositoryPopulationData.CommodityData commodity01 = new SbmRepositoryPopulationData.StockCommodityData() { Code = "MONOPOLY-STD", Caption = "Monopoly", SalePrice = 24.75m };
|
data.Commodities.Add(new SbmRepositoryPopulationData.StockCommodityData() { Code = "MONOPOLY-STD", Caption = "Monopoly", SalePrice = 24.75m });
|
||||||
SbmRepositoryPopulationData.CommodityData commodity02 = new SbmRepositoryPopulationData.StockCommodityData() { Code = "MONOPOLY-DEL", Caption = "Monopoly Deluxe", SalePrice = 32.45m };
|
data.Commodities.Add(new SbmRepositoryPopulationData.StockCommodityData() { Code = "MONOPOLY-DEL", Caption = "Monopoly Deluxe", SalePrice = 32.45m });
|
||||||
SbmRepositoryPopulationData.CommodityData commodity03 = new SbmRepositoryPopulationData.StockCommodityData() { Code = "CLUEDO-STD", Caption = "Cluedo", SalePrice = 18.25m };
|
data.Commodities.Add(new SbmRepositoryPopulationData.StockCommodityData() { Code = "CLUEDO-STD", Caption = "Cluedo", SalePrice = 18.25m });
|
||||||
SbmRepositoryPopulationData.CommodityData commodity04 = new SbmRepositoryPopulationData.StockCommodityData() { Code = "RISK-STD", Caption = "Risk", SalePrice = 21.50m };
|
data.Commodities.Add(new SbmRepositoryPopulationData.StockCommodityData() { Code = "RISK-STD", Caption = "Risk", SalePrice = 21.50m });
|
||||||
SbmRepositoryPopulationData.CommodityData commodity90 = new SbmRepositoryPopulationData.ServiceCommodityData() { Code = "TUITION-EXP", Caption = "Expert Tuition", SalePrice = 45.00m };
|
data.Commodities.Add(new SbmRepositoryPopulationData.StockCommodityData() { Code = "JIGS-1000", Caption = "1000 piece jigsaw", SalePrice = 12.25m });
|
||||||
SbmRepositoryPopulationData.CommodityData commodity91 = new SbmRepositoryPopulationData.ServiceCommodityData() { Code = "TUITION-STD", Caption = "Standard Tuition", SalePrice = 38.75m };
|
data.Commodities.Add(new SbmRepositoryPopulationData.StockCommodityData() { Code = "JIGS-2500", Caption = "2500 piece jigsaw", SalePrice = 16.75m });
|
||||||
SbmRepositoryPopulationData.CommodityData commodity92 = new SbmRepositoryPopulationData.ServiceCommodityData() { Code = "TUITION-BAS", Caption = "Basic Tuition", SalePrice = 32.50m };
|
data.Commodities.Add(new SbmRepositoryPopulationData.StockCommodityData() { Code = "JIGS-5000", Caption = "5000 piece jigsaw", SalePrice = 18.50m });
|
||||||
data.Commodities.AddRange(new List<SbmRepositoryPopulationData.CommodityData>()
|
data.Commodities.Add(new SbmRepositoryPopulationData.ServiceCommodityData() { Code = "TUITION-EXP", Caption = "Expert Tuition", SalePrice = 45.00m });
|
||||||
{
|
data.Commodities.Add(new SbmRepositoryPopulationData.ServiceCommodityData() { Code = "TUITION-STD", Caption = "Standard Tuition", SalePrice = 38.75m });
|
||||||
commodity01, commodity02, commodity03, commodity04,
|
data.Commodities.Add(new SbmRepositoryPopulationData.ServiceCommodityData() { Code = "TUITION-BAS", Caption = "Basic Tuition", SalePrice = 32.50m });
|
||||||
commodity90, commodity91, commodity92
|
|
||||||
});
|
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
@@ -164,8 +160,10 @@ namespace Sarand.BusinessMgr.Web.Portal.Consoles
|
|||||||
if (!ConfigureSecurityComponents()) return false;
|
if (!ConfigureSecurityComponents()) return false;
|
||||||
|
|
||||||
// Populate demo data.
|
// Populate demo data.
|
||||||
if (!PopulateCommodities(data)) return false;
|
// NB Log any errors but continue with population to ensure at least some data results.
|
||||||
if (!PopulateContacts(data)) return false;
|
PopulateCommodities(data);
|
||||||
|
PopulateContacts(data);
|
||||||
|
PopulateTransactions(data);
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
@@ -239,11 +237,16 @@ namespace Sarand.BusinessMgr.Web.Portal.Consoles
|
|||||||
commodity.DescBrief = commodityData.Caption;
|
commodity.DescBrief = commodityData.Caption;
|
||||||
commodity.SalesPrice = commodityData.SalePrice;
|
commodity.SalesPrice = commodityData.SalePrice;
|
||||||
commodity.UomIdSale = uomTypes.GetValueOrDefault(commodityData.SaleUnitType)?.Id;
|
commodity.UomIdSale = uomTypes.GetValueOrDefault(commodityData.SaleUnitType)?.Id;
|
||||||
if (!Internals.CommodityMgr.InsertCommodity(commodity, DbUpdateInfo))
|
commodity.Notes = commodityData.Notes;
|
||||||
|
if (Internals.CommodityMgr.InsertCommodity(commodity, DbUpdateInfo))
|
||||||
|
{
|
||||||
|
commodityData.Id = commodity.Id;
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
string msg = "Repository population failed (Commodity).";
|
string msg = "Repository population failed (Commodity).";
|
||||||
SaLogger.Warn($"{SysUtil.Fn} {msg} {Internals.CommodityMgr.ErrorStateMessage.TrimEnd('.')}.");
|
SaLogger.Warn($"{SysUtil.Fn} {msg} {Internals.CommodityMgr.ErrorStateMessage.TrimEnd('.')}.");
|
||||||
return SetErrorState($"{msg}");
|
//return SetErrorState($"{msg}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return OK;
|
return OK;
|
||||||
@@ -274,8 +277,10 @@ namespace Sarand.BusinessMgr.Web.Portal.Consoles
|
|||||||
affiliate.CompanyNo = organisation.CompanyNo;
|
affiliate.CompanyNo = organisation.CompanyNo;
|
||||||
affiliate.VatReg = organisation.VatReg;
|
affiliate.VatReg = organisation.VatReg;
|
||||||
affiliate.Website = organisation.Website;
|
affiliate.Website = organisation.Website;
|
||||||
|
affiliate.Notes = organisation.Notes;
|
||||||
if (Internals.AccountMgr.InsertAffiliate(affiliate, DbUpdateInfo))
|
if (Internals.AccountMgr.InsertAffiliate(affiliate, DbUpdateInfo))
|
||||||
{
|
{
|
||||||
|
organisation.Id = affiliate.Id;
|
||||||
if (!PopulateAffiliate(data.AffiliateIdOrganisation, affiliate, organisation))
|
if (!PopulateAffiliate(data.AffiliateIdOrganisation, affiliate, organisation))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -283,7 +288,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Consoles
|
|||||||
{
|
{
|
||||||
string msg = "Repository population failed (Individual).";
|
string msg = "Repository population failed (Individual).";
|
||||||
SaLogger.Warn($"{SysUtil.Fn} {msg} {Internals.AccountMgr.ErrorStateMessage.TrimEnd('.')}.");
|
SaLogger.Warn($"{SysUtil.Fn} {msg} {Internals.AccountMgr.ErrorStateMessage.TrimEnd('.')}.");
|
||||||
return SetErrorState($"{msg}");
|
//return SetErrorState($"{msg}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -296,8 +301,10 @@ namespace Sarand.BusinessMgr.Web.Portal.Consoles
|
|||||||
affiliate.Email = individual.Email;
|
affiliate.Email = individual.Email;
|
||||||
affiliate.PhoneMain = individual.PhoneMain;
|
affiliate.PhoneMain = individual.PhoneMain;
|
||||||
affiliate.PhoneMobile = individual.PhoneMobile;
|
affiliate.PhoneMobile = individual.PhoneMobile;
|
||||||
|
affiliate.Notes = individual.Notes;
|
||||||
if (Internals.AccountMgr.InsertAffiliate(affiliate, DbUpdateInfo))
|
if (Internals.AccountMgr.InsertAffiliate(affiliate, DbUpdateInfo))
|
||||||
{
|
{
|
||||||
|
individual.Id = affiliate.Id;
|
||||||
if (!PopulateAffiliate(data.AffiliateIdOrganisation, affiliate, individual))
|
if (!PopulateAffiliate(data.AffiliateIdOrganisation, affiliate, individual))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -305,10 +312,9 @@ namespace Sarand.BusinessMgr.Web.Portal.Consoles
|
|||||||
{
|
{
|
||||||
string msg = "Repository population failed (Individual).";
|
string msg = "Repository population failed (Individual).";
|
||||||
SaLogger.Warn($"{SysUtil.Fn} {msg} {Internals.AccountMgr.ErrorStateMessage.TrimEnd('.')}.");
|
SaLogger.Warn($"{SysUtil.Fn} {msg} {Internals.AccountMgr.ErrorStateMessage.TrimEnd('.')}.");
|
||||||
return SetErrorState($"{msg}");
|
//return SetErrorState($"{msg}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -327,33 +333,38 @@ namespace Sarand.BusinessMgr.Web.Portal.Consoles
|
|||||||
address.Province = address.Province;
|
address.Province = address.Province;
|
||||||
address.Postcode = address.Postcode;
|
address.Postcode = address.Postcode;
|
||||||
address.Country = address.Country;
|
address.Country = address.Country;
|
||||||
if (!Internals.AccountMgr.InsertAddress(address, DbUpdateInfo))
|
address.Notes = address.Notes;
|
||||||
|
if (Internals.AccountMgr.InsertAddress(address, DbUpdateInfo))
|
||||||
|
{
|
||||||
|
addressData.Id = address.Id;
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
string msg = "Repository population failed (Address).";
|
string msg = "Repository population failed (Address).";
|
||||||
SaLogger.Warn($"{SysUtil.Fn} {msg} {Internals.AccountMgr.ErrorStateMessage.TrimEnd('.')}.");
|
SaLogger.Warn($"{SysUtil.Fn} {msg} {Internals.AccountMgr.ErrorStateMessage.TrimEnd('.')}.");
|
||||||
return SetErrorState($"{msg}");
|
//return SetErrorState($"{msg}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Associations.
|
// Associations.
|
||||||
if (!PopulateAssociation(affilliateIdOwner, affiliate, affiliateData.Customer))
|
if (!PopulateAssociation(affilliateIdOwner, affiliate, affiliateData.Customer))
|
||||||
{
|
{
|
||||||
string msg = "Repository population failed (Customer).";
|
string msg = "Repository population failed (Customer).";
|
||||||
SaLogger.Warn($"{SysUtil.Fn} {msg}");
|
SaLogger.Warn($"{SysUtil.Fn} {msg}");
|
||||||
return SetErrorState($"{msg}");
|
//return SetErrorState($"{msg}");
|
||||||
}
|
}
|
||||||
if (!PopulateAssociation(affilliateIdOwner, affiliate, affiliateData.Supplier))
|
if (!PopulateAssociation(affilliateIdOwner, affiliate, affiliateData.Supplier))
|
||||||
{
|
{
|
||||||
string msg = "Repository population failed (Supplier).";
|
string msg = "Repository population failed (Supplier).";
|
||||||
SaLogger.Warn($"{SysUtil.Fn} {msg}");
|
SaLogger.Warn($"{SysUtil.Fn} {msg}");
|
||||||
return SetErrorState($"{msg}");
|
//return SetErrorState($"{msg}");
|
||||||
}
|
}
|
||||||
if (!PopulateAssociation(affilliateIdOwner, affiliate, affiliateData.Member))
|
if (!PopulateAssociation(affilliateIdOwner, affiliate, affiliateData.Member))
|
||||||
{
|
{
|
||||||
string msg = "Repository population failed (Member).";
|
string msg = "Repository population failed (Member).";
|
||||||
SaLogger.Warn($"{SysUtil.Fn} {msg}");
|
SaLogger.Warn($"{SysUtil.Fn} {msg}");
|
||||||
return SetErrorState($"{msg}");
|
//return SetErrorState($"{msg}");
|
||||||
}
|
}
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -362,23 +373,173 @@ namespace Sarand.BusinessMgr.Web.Portal.Consoles
|
|||||||
{
|
{
|
||||||
if (HasErrorState()) return false;
|
if (HasErrorState()) return false;
|
||||||
if (associationData == null) return true;
|
if (associationData == null) return true;
|
||||||
|
|
||||||
SbmAssociation association = Internals.AccountMgr.CreateAssociation(affilliateIdOwner, associationData.Type, affiliate.Id);
|
SbmAssociation association = Internals.AccountMgr.CreateAssociation(affilliateIdOwner, associationData.Type, affiliate.Id);
|
||||||
association.Code = associationData.Code;
|
association.Code = associationData.Code;
|
||||||
association.Location = associationData.Location;
|
association.Location = associationData.Location;
|
||||||
association.Role = associationData.Role;
|
association.Role = associationData.Role;
|
||||||
association.PhoneMain = associationData.PhoneMain;
|
association.PhoneMain = associationData.PhoneMain;
|
||||||
|
association.Notes = associationData.Notes;
|
||||||
if (Internals.AccountMgr.InsertAssociation(association, DbUpdateInfo))
|
if (Internals.AccountMgr.InsertAssociation(association, DbUpdateInfo))
|
||||||
{
|
{
|
||||||
// ToDo Populate Transactions.
|
associationData.Id = association.Id;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
string msg = $"Repository population failed ({associationData.Type}).";
|
string msg = $"Repository population failed ({associationData.Type}).";
|
||||||
SaLogger.Warn($"{SysUtil.Fn} {msg} {Internals.AccountMgr.ErrorStateMessage.TrimEnd('.')}.");
|
SaLogger.Warn($"{SysUtil.Fn} {msg} {Internals.AccountMgr.ErrorStateMessage.TrimEnd('.')}.");
|
||||||
return SetErrorState($"{msg}");
|
//return SetErrorState($"{msg}");
|
||||||
|
}
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------
|
||||||
|
|
||||||
|
private class TransactionData
|
||||||
|
{
|
||||||
|
public TransactionData(SbmTransaction transaction)
|
||||||
|
{
|
||||||
|
this.Transaction = transaction;
|
||||||
|
}
|
||||||
|
public SbmTransaction Transaction { get; }
|
||||||
|
public List<SbmRequirement> Requirements { get; } = new List<SbmRequirement>();
|
||||||
|
}
|
||||||
|
// Populate demo transactions.
|
||||||
|
private bool PopulateTransactions(SbmRepositoryPopulationData data)
|
||||||
|
{
|
||||||
|
if (HasErrorState()) return false;
|
||||||
|
SysId affilliateIdOwner = data.AffiliateIdOrganisation;
|
||||||
|
Dictionary<String, SaTaxCode> taxCodes = Internals.GetTaxCodesEffectiveOn(DateTime.Today).ToDictionary(item => item.Code, item => item);
|
||||||
|
SaTaxCode taxCodeDefault = taxCodes.Values.FirstOrDefault(item => item.Code.EqualsCI(Internals.GetDefaultTaxCode()));
|
||||||
|
|
||||||
|
//---------------------------------------------------------------
|
||||||
|
// Sales Orders.
|
||||||
|
|
||||||
|
// Customers.
|
||||||
|
List<SbmRepositoryPopulationData.CustomerData> customers =
|
||||||
|
data.Organisations.Concat<SbmRepositoryPopulationData.AffiliateData>(data.Individuals)
|
||||||
|
.Where(item => item.Customer != null && SysId.IsValid(item.Customer.Id))
|
||||||
|
.Select(item => item.Customer)
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
// Compile transactions and requirements.
|
||||||
|
List<TransactionData> transactions = new List<TransactionData>();
|
||||||
|
|
||||||
|
// Sales Orders for Customers.
|
||||||
|
foreach (var customerData in customers)
|
||||||
|
{
|
||||||
|
int transactionCount = 0;
|
||||||
|
DateTime raisedOn = DateTime.Today;
|
||||||
|
for (int i = 0; i < SacsRandomHelper.GetInt32(6, 24); i++)
|
||||||
|
{
|
||||||
|
// Prepare transaction data.
|
||||||
|
transactionCount++;
|
||||||
|
raisedOn = DateUtil.IncrementDate(raisedOn, -SacsRandomHelper.GetInt32(2, transactionCount == 1 ? 5 : 18));
|
||||||
|
|
||||||
|
// Create transaction.
|
||||||
|
SbmTransaction salesOrder = Internals.TransactionMgr.CreateTransaction(customerData.Id, Sbm.TransactionType.SalesOrder);
|
||||||
|
salesOrder.DescBrief = "";
|
||||||
|
salesOrder.Status = SaStatus.InProgress;
|
||||||
|
salesOrder.Raised = raisedOn;
|
||||||
|
salesOrder.InProgress = DateUtil.IncrementDate(salesOrder.Raised, SacsRandomHelper.GetInt32(0, 2));
|
||||||
|
if (transactionCount > SacsRandomHelper.GetInt32(1, 3))
|
||||||
|
{
|
||||||
|
salesOrder.Status = SaStatus.Completed;
|
||||||
|
salesOrder.Closed = DateUtil.IncrementDate(salesOrder.InProgress, SacsRandomHelper.GetInt32(2, 5));
|
||||||
|
}
|
||||||
|
salesOrder.RaisedBy = "";
|
||||||
|
salesOrder.ContactName = "";
|
||||||
|
salesOrder.Notes = "";
|
||||||
|
TransactionData transactionData = new TransactionData(salesOrder);
|
||||||
|
transactions.Add(transactionData);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Store transactions in 'Raised' order before adding requirements.
|
||||||
|
foreach (var transactionData in transactions.OrderBy(item => item.Transaction.Raised))
|
||||||
|
{
|
||||||
|
// Transaction must exist before requirements are created.
|
||||||
|
if (Internals.TransactionMgr.InsertTransaction(transactionData.Transaction, DbUpdateInfo))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
string msg = "Repository population failed (Transaction).";
|
||||||
|
SaLogger.Warn($"{SysUtil.Fn} {msg} {Internals.TransactionMgr.ErrorStateMessage.TrimEnd('.')}.");
|
||||||
|
//return SetErrorState($"{msg}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add requirements.
|
||||||
|
foreach (var transactionData in transactions)
|
||||||
|
{
|
||||||
|
if (!SysId.IsValid(transactionData.Transaction.Id)) continue;
|
||||||
|
|
||||||
|
// Add requirements.
|
||||||
|
int serviceCommodityCount = 0;
|
||||||
|
foreach (var commodityData in data.Commodities)
|
||||||
|
{
|
||||||
|
// Only include 1 in 3 items.
|
||||||
|
if (SacsRandomHelper.GetInt32(0, 3) < 1) continue;
|
||||||
|
if (commodityData.Type == Sbm.CommodityType.Service)
|
||||||
|
{
|
||||||
|
serviceCommodityCount++;
|
||||||
|
if (serviceCommodityCount > 1) continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
SbmRequirement requirement = Internals.TransactionMgr.CreateRequirement(transactionData.Transaction.AssociationId, transactionData.Transaction.Id, Sbm.RequirementType.Detail);
|
||||||
|
requirement.CommodityId = commodityData.Id;
|
||||||
|
requirement.DescBrief = commodityData.Caption;
|
||||||
|
requirement.Quantity = (decimal)(commodityData.Type == Sbm.CommodityType.Service ? 0.25 * SacsRandomHelper.GetInt32(2, 12) : SacsRandomHelper.GetInt32(1, 6));
|
||||||
|
requirement.AmountUnit = commodityData.SalePrice;
|
||||||
|
requirement.AmountNet = requirement.AmountUnit * requirement.Quantity;
|
||||||
|
requirement.TaxCodeId = taxCodeDefault?.Id;
|
||||||
|
Internals.TransactionMgr.SetTaxCode(requirement, transactionData.Transaction.InProgress);
|
||||||
|
Internals.TransactionMgr.CalculateTotal(requirement);
|
||||||
|
transactionData.Requirements.Add(requirement);
|
||||||
|
}
|
||||||
|
// Assign requirement sequence in random order.
|
||||||
|
short sequence = 0;
|
||||||
|
foreach (SbmRequirement requirement in transactionData.Requirements.OrderBy(x => Guid.NewGuid()))
|
||||||
|
requirement.Seq = ++sequence;
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------
|
||||||
|
StoreTransactions(transactions);
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool StoreTransactions(List<TransactionData> transactions)
|
||||||
|
{
|
||||||
|
// Store transactions and requirements.
|
||||||
|
// Sort so from oldest to newest to mimc real-world.
|
||||||
|
foreach (TransactionData transactionData in transactions.OrderBy(item => item.Transaction.Raised))
|
||||||
|
{
|
||||||
|
if (SysId.IsValid(transactionData.Transaction.Id) || Internals.TransactionMgr.InsertTransaction(transactionData.Transaction, DbUpdateInfo))
|
||||||
|
{
|
||||||
|
List<SbmRequirement> requirements = transactionData.Requirements;
|
||||||
|
foreach (var requirement in requirements.OrderBy(item => item.Seq))
|
||||||
|
{
|
||||||
|
if (!Internals.TransactionMgr.InsertRequirement(requirement, DbUpdateInfo))
|
||||||
|
{
|
||||||
|
string msg = "Repository population failed (Requirement).";
|
||||||
|
SaLogger.Warn($"{SysUtil.Fn} {msg} {Internals.TransactionMgr.ErrorStateMessage.TrimEnd('.')}.");
|
||||||
|
//return SetErrorState($"{msg}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Update transaction totals.
|
||||||
|
Internals.TransactionMgr.RefreshTransactionTotals(transactionData.Transaction, requirements.Where(item => SysId.IsValid(item.Id)));
|
||||||
|
if (!Internals.TransactionMgr.UpdateTransaction(transactionData.Transaction, DbUpdateInfo))
|
||||||
|
SaLogger.Warn($"{SysUtil.Fn} Faield to update transaction. {Internals.TransactionMgr.ErrorStateMessage.TrimEnd('.')}.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
string msg = "Repository population failed (Transaction).";
|
||||||
|
SaLogger.Warn($"{SysUtil.Fn} {msg} {Internals.TransactionMgr.ErrorStateMessage.TrimEnd('.')}.");
|
||||||
|
//return SetErrorState($"{msg}");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+14
-13
@@ -111,12 +111,13 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Commodities
|
|||||||
{
|
{
|
||||||
// Construction.
|
// Construction.
|
||||||
public AjaxResponse_CommodityConfig(SbmModel_Portal model) : base(model) { }
|
public AjaxResponse_CommodityConfig(SbmModel_Portal model) : base(model) { }
|
||||||
// Configuration.
|
// Configuration data - object copied directly to env.datain script.
|
||||||
public Model_Commodity.ListConfigData Config { get; } = new Model_Commodity.ListConfigData();
|
public class ConfigData
|
||||||
public Model_Commodity.ItemConfigData ConfigItemNew { get; } = new Model_Commodity.ItemConfigData();
|
|
||||||
// Reference data - object copied directly to env.datain script.
|
|
||||||
public class ReferenceData
|
|
||||||
{
|
{
|
||||||
|
// Configurations.
|
||||||
|
public Model_Commodity.ListConfigData CfgList { get; } = new Model_Commodity.ListConfigData();
|
||||||
|
public Model_Commodity.ItemConfigData CfgItemNew { get; } = new Model_Commodity.ItemConfigData();
|
||||||
|
// Reference data.
|
||||||
public List<ItemCodeDesc> CommodityTypes { get; } = new List<ItemCodeDesc>();
|
public List<ItemCodeDesc> CommodityTypes { get; } = new List<ItemCodeDesc>();
|
||||||
public String CommodityTypeDefault { get; set; }
|
public String CommodityTypeDefault { get; set; }
|
||||||
public List<TaxCode> TaxCodes { get; } = new List<TaxCode>();
|
public List<TaxCode> TaxCodes { get; } = new List<TaxCode>();
|
||||||
@@ -128,7 +129,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Commodities
|
|||||||
public List<ItemCodeDesc> Statuses { get; } = new List<ItemCodeDesc>();
|
public List<ItemCodeDesc> Statuses { get; } = new List<ItemCodeDesc>();
|
||||||
public String DefaultStatusCode { get; set; }
|
public String DefaultStatusCode { get; set; }
|
||||||
}
|
}
|
||||||
public ReferenceData Data { get; set; } = new ReferenceData();
|
public ConfigData Data { get; set; } = new ConfigData();
|
||||||
}
|
}
|
||||||
// Ajax request.
|
// Ajax request.
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
@@ -137,7 +138,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Commodities
|
|||||||
public IActionResult Ajax_CommodityConfig(Model_Commodity model)
|
public IActionResult Ajax_CommodityConfig(Model_Commodity model)
|
||||||
{
|
{
|
||||||
AjaxResponse_CommodityConfig responseData = new AjaxResponse_CommodityConfig(model);
|
AjaxResponse_CommodityConfig responseData = new AjaxResponse_CommodityConfig(model);
|
||||||
String messageTitle = Localiser["caption.commodities"];
|
String messageTitle = Localiser["label.commodities"];
|
||||||
|
|
||||||
// Validate session and referrer.
|
// Validate session and referrer.
|
||||||
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
|
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
|
||||||
@@ -154,8 +155,8 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Commodities
|
|||||||
private void PopulateCommodityConfig(Model_Commodity model, AjaxResponse_CommodityConfig responseData)
|
private void PopulateCommodityConfig(Model_Commodity model, AjaxResponse_CommodityConfig responseData)
|
||||||
{
|
{
|
||||||
// Configuration.
|
// Configuration.
|
||||||
model.PopulateListConfig(responseData.Config);
|
model.PopulateListConfig(responseData.Data.CfgList);
|
||||||
model.PopulateItemConfig(responseData.ConfigItemNew, null, Sbm.CommodityType.Unknown);
|
model.PopulateItemConfig(responseData.Data.CfgItemNew, null, Sbm.CommodityType.Unknown);
|
||||||
|
|
||||||
// Commodity types.
|
// Commodity types.
|
||||||
List<TypeCodeDesc> commodityTypes = GetSystemCodes(Sbm.SystemCode.CommodityType);
|
List<TypeCodeDesc> commodityTypes = GetSystemCodes(Sbm.SystemCode.CommodityType);
|
||||||
@@ -183,7 +184,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Commodities
|
|||||||
Id = $"{SysId.ToLong(uom.Id)}",
|
Id = $"{SysId.ToLong(uom.Id)}",
|
||||||
Category = uomCategories.GetCodeForType(uom.Category),
|
Category = uomCategories.GetCodeForType(uom.Category),
|
||||||
Type = uomTypes.GetCodeForType(uom.UnitType),
|
Type = uomTypes.GetCodeForType(uom.UnitType),
|
||||||
Caption = uom.Multiple,
|
Caption = uom.GetCaption()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
responseData.Data.uomTypeDefault = uomTypes.GetCodeForType(Internals.GetDefaultUomType());
|
responseData.Data.uomTypeDefault = uomTypes.GetCodeForType(Internals.GetDefaultUomType());
|
||||||
@@ -220,7 +221,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Commodities
|
|||||||
public IActionResult Ajax_CommodityList(Model_Commodity model)
|
public IActionResult Ajax_CommodityList(Model_Commodity model)
|
||||||
{
|
{
|
||||||
AjaxResponse_CommodityList responseData = new AjaxResponse_CommodityList(model);
|
AjaxResponse_CommodityList responseData = new AjaxResponse_CommodityList(model);
|
||||||
String messageTitle = Localiser["caption.commodities"];
|
String messageTitle = Localiser["label.commodities"];
|
||||||
|
|
||||||
// Validate session and referrer.
|
// Validate session and referrer.
|
||||||
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
|
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
|
||||||
@@ -338,7 +339,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Commodities
|
|||||||
[Route("Commodity/Ajax/GetItem")]
|
[Route("Commodity/Ajax/GetItem")]
|
||||||
public IActionResult Ajax_GetItem(Model_Commodity model)
|
public IActionResult Ajax_GetItem(Model_Commodity model)
|
||||||
{
|
{
|
||||||
String messageTitle = Localiser["caption.commodity"];
|
String messageTitle = Localiser["label.commodity"];
|
||||||
AjaxResponse_Commodity responseData = new AjaxResponse_Commodity(model);
|
AjaxResponse_Commodity responseData = new AjaxResponse_Commodity(model);
|
||||||
|
|
||||||
// Validate session and referrer.
|
// Validate session and referrer.
|
||||||
@@ -380,7 +381,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Commodities
|
|||||||
[Route("Commodity/Ajax/StoreItem")]
|
[Route("Commodity/Ajax/StoreItem")]
|
||||||
public IActionResult Ajax_StoreItem(Model_Commodity model)
|
public IActionResult Ajax_StoreItem(Model_Commodity model)
|
||||||
{
|
{
|
||||||
String messageTitle = Localiser["caption.commodity"];
|
String messageTitle = Localiser["label.commodity"];
|
||||||
AjaxResponse_Commodity responseData = new AjaxResponse_Commodity(model);
|
AjaxResponse_Commodity responseData = new AjaxResponse_Commodity(model);
|
||||||
|
|
||||||
// Validate session and referrer.
|
// Validate session and referrer.
|
||||||
|
|||||||
+19
-24
@@ -94,16 +94,19 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Contacts
|
|||||||
{
|
{
|
||||||
// Construction.
|
// Construction.
|
||||||
public AjaxResponse_AssociationConfig(SbmModel_Portal model) : base(model) { }
|
public AjaxResponse_AssociationConfig(SbmModel_Portal model) : base(model) { }
|
||||||
// Page caption.
|
// Configuration data - object copied directly to env.datain script.
|
||||||
public String Caption { get; set; }
|
public class ConfigData
|
||||||
// Configuration.
|
{
|
||||||
public Model_Association.ListConfigData Config { get; } = new Model_Association.ListConfigData();
|
// Configuration.
|
||||||
public Model_Association.ItemConfigData ConfigCust { get; } = new Model_Association.ItemConfigData();
|
public Model_Association.ListConfigData CfgList { get; } = new Model_Association.ListConfigData();
|
||||||
public Model_Association.ItemConfigData ConfigSupp { get; } = new Model_Association.ItemConfigData();
|
public Model_Association.ItemConfigData CfgCust { get; } = new Model_Association.ItemConfigData();
|
||||||
// Reference data.
|
public Model_Association.ItemConfigData CfgSupp { get; } = new Model_Association.ItemConfigData();
|
||||||
public List<ItemCodeDesc> AssociationTypes { get; } = new List<ItemCodeDesc>();
|
// Reference data.
|
||||||
public List<ItemCodeDesc> Statuses { get; } = new List<ItemCodeDesc>();
|
public List<ItemCodeDesc> AssociationTypes { get; } = new List<ItemCodeDesc>();
|
||||||
public String DefaultStatusCode { get; set; }
|
public List<ItemCodeDesc> Statuses { get; } = new List<ItemCodeDesc>();
|
||||||
|
public String DefaultStatusCode { get; set; }
|
||||||
|
}
|
||||||
|
public ConfigData Data { get; set; } = new ConfigData();
|
||||||
}
|
}
|
||||||
// Ajax request.
|
// Ajax request.
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
@@ -128,18 +131,10 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Contacts
|
|||||||
}
|
}
|
||||||
private void PopulateAssociationConfig(Model_Association model, AjaxResponse_AssociationConfig responseData)
|
private void PopulateAssociationConfig(Model_Association model, AjaxResponse_AssociationConfig responseData)
|
||||||
{
|
{
|
||||||
// Page caption.
|
|
||||||
Sbm.AssociationType associationType = model.GetFilterAssociationType();
|
|
||||||
if (associationType == Sbm.AssociationType.Customer)
|
|
||||||
responseData.Caption = Localiser["label.customers"];
|
|
||||||
else if (associationType == Sbm.AssociationType.Supplier)
|
|
||||||
responseData.Caption = Localiser["label.suppliers"];
|
|
||||||
responseData.Caption = StringUtil.OnBlank(responseData.Caption, Localiser["label.associations"]);
|
|
||||||
|
|
||||||
// Configuration.
|
// Configuration.
|
||||||
model.PopulateListConfig(responseData.Config);
|
model.PopulateListConfig(responseData.Data.CfgList);
|
||||||
model.PopulateItemConfig(responseData.ConfigCust, null, SessionData_Portal.Organisation.AffiliateId, Sbm.AssociationType.Customer);
|
model.PopulateItemConfig(responseData.Data.CfgCust, null, SessionData_Portal.Organisation.AffiliateId, Sbm.AssociationType.Customer);
|
||||||
model.PopulateItemConfig(responseData.ConfigSupp, null, SessionData_Portal.Organisation.AffiliateId, Sbm.AssociationType.Supplier);
|
model.PopulateItemConfig(responseData.Data.CfgSupp, null, SessionData_Portal.Organisation.AffiliateId, Sbm.AssociationType.Supplier);
|
||||||
|
|
||||||
// Reference data - types.
|
// Reference data - types.
|
||||||
List<TypeCodeDesc> associationTypes = Internals.AssociationTypeCodes;
|
List<TypeCodeDesc> associationTypes = Internals.AssociationTypeCodes;
|
||||||
@@ -147,13 +142,13 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Contacts
|
|||||||
{
|
{
|
||||||
if (type <= 0 || type == Sbm.AssociationType.Internal) continue;
|
if (type <= 0 || type == Sbm.AssociationType.Internal) continue;
|
||||||
if (!SessionConsole.AllowAssociationType(type)) continue;
|
if (!SessionConsole.AllowAssociationType(type)) continue;
|
||||||
responseData.AssociationTypes.Add(new AjaxResponse_Data.ItemCodeDesc(associationTypes.GetCodeForType(type), Localiser.GetAssociationTypeCaption(type)));
|
responseData.Data.AssociationTypes.Add(new AjaxResponse_Data.ItemCodeDesc(associationTypes.GetCodeForType(type), Localiser.GetAssociationTypeCaption(type)));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reference data - statuses.
|
// Reference data - statuses.
|
||||||
foreach (SaStatus status in SbmAssociation.ValidStatuses.FindAll(item => item != SaStatus.Deleted))
|
foreach (SaStatus status in SbmAssociation.ValidStatuses.FindAll(item => item != SaStatus.Deleted))
|
||||||
responseData.Statuses.Add(new AjaxResponse_Data.ItemCodeDesc(SacsSystem.GetStatusCode(status), Localiser.GetStatusCaption(status)));
|
responseData.Data.Statuses.Add(new AjaxResponse_Data.ItemCodeDesc(SacsSystem.GetStatusCode(status), Localiser.GetStatusCaption(status)));
|
||||||
responseData.DefaultStatusCode = SacsSystem.GetStatusCode(SbmAssociation.DefaultStatus);
|
responseData.Data.DefaultStatusCode = SacsSystem.GetStatusCode(SbmAssociation.DefaultStatus);
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ using System.Collections.Generic;
|
|||||||
using System.Collections.Specialized;
|
using System.Collections.Specialized;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Web;
|
using System.Web;
|
||||||
using static Sarand.BusinessMgr.Net.Standard.Base.Data.SbmRepositoryPopulationData;
|
|
||||||
|
|
||||||
namespace Sarand.BusinessMgr.Web.Portal.Controllers.Home
|
namespace Sarand.BusinessMgr.Web.Portal.Controllers.Home
|
||||||
{
|
{
|
||||||
@@ -190,7 +189,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Home
|
|||||||
|
|
||||||
|
|
||||||
// Check that User Account doesn't already exist.
|
// Check that User Account doesn't already exist.
|
||||||
SbmRepositoryPopulationData.UserAccount userAccount = new UserAccount()
|
SbmRepositoryPopulationData.UserAccount userAccount = new SbmRepositoryPopulationData.UserAccount()
|
||||||
{
|
{
|
||||||
AffiliateIdOwner = demoData.AffiliateIdOrganisation,
|
AffiliateIdOwner = demoData.AffiliateIdOrganisation,
|
||||||
FirstName = model.FirstName,
|
FirstName = model.FirstName,
|
||||||
|
|||||||
+71
-31
@@ -1,4 +1,5 @@
|
|||||||
using Microsoft.AspNetCore.Mvc;
|
using DocumentFormat.OpenXml.EMMA;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Sarand.BusinessMgr.Net.Standard.Base.App;
|
using Sarand.BusinessMgr.Net.Standard.Base.App;
|
||||||
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
|
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
|
||||||
using Sarand.BusinessMgr.Web.Portal.Components;
|
using Sarand.BusinessMgr.Web.Portal.Components;
|
||||||
@@ -40,24 +41,40 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
|
|||||||
public String TypeCode { get; set; }
|
public String TypeCode { get; set; }
|
||||||
public String TypeDesc { get; set; }
|
public String TypeDesc { get; set; }
|
||||||
}
|
}
|
||||||
private void PopulateTransactionResponseListData(SbmTransaction transaction, TransactionListData data)
|
private void PopulateTransactionResponseListData(SbmModel_Portal model, SbmTransaction transaction, TransactionListData data)
|
||||||
{
|
{
|
||||||
data.Id = SysId.ToString(transaction.Id);
|
data.Id = SysId.ToString(transaction.Id);
|
||||||
|
// Derived values for list refresh.
|
||||||
|
long itemCount = TransactionMgr.GetTransactionRequirementCount(transaction.Id);
|
||||||
|
if (itemCount > 0)
|
||||||
|
data.Field.Value.Add($"{Model_Transaction.ItemField.ItemCount}", $"{itemCount}");
|
||||||
|
// Status dates for list refresh.
|
||||||
|
data.Field.Value.Add($"{Model_Transaction.ItemField.RaisedFmt}", model.FormatDateForDisplay(transaction.Raised));
|
||||||
|
data.Field.Value.Add($"{Model_Transaction.ItemField.InProgressFmt}", model.FormatDateForDisplay(transaction.InProgress));
|
||||||
|
data.Field.Value.Add($"{Model_Transaction.ItemField.ClosedFmt}", model.FormatDateForDisplay(transaction.Closed));
|
||||||
}
|
}
|
||||||
private void PopulateTransactionResponseItemData(SbmTransaction transaction, TransactionItemData data, HashSet<TransactionDataGroup> dataGroups = null)
|
private void PopulateTransactionResponseItemData(SbmModel_Portal model, SbmTransaction transaction, TransactionItemData data, HashSet<TransactionDataGroup> dataGroups = null)
|
||||||
{
|
{
|
||||||
PopulateTransactionResponseListData(transaction, data as TransactionListData);
|
PopulateTransactionResponseListData(model, transaction, data as TransactionListData);
|
||||||
// Prominent properties for selecting and editing.
|
// Prominent properties for selecting and editing.
|
||||||
data.Reference = transaction.Ref;
|
data.Reference = transaction.Ref;
|
||||||
data.Narrative = transaction.DescBrief;
|
data.Narrative = transaction.DescBrief;
|
||||||
// Affiliate type - populate for list ('Type' property populated with desc) and form (Type Code & Desc).
|
// Affiliate type - populate for list ('Type' property populated with desc) and form (Type Code & Desc).
|
||||||
data.TypeCode = Internals.TransactionTypeCodes.GetCodeForType(transaction.TransactionType);
|
data.TypeCode = Internals.TransactionTypeCodes.GetCodeForType(transaction.TransactionType);
|
||||||
data.TypeDesc = Internals.TransactionTypeCodes.GetDescForType(transaction.TransactionType);
|
data.TypeDesc = Internals.TransactionTypeCodes.GetDescForType(transaction.TransactionType);
|
||||||
data.Field.Value.Add($"{Model_Transaction.ItemField.Type}", Internals.TransactionTypeCodes.GetDescForType(transaction.TransactionType));
|
|
||||||
// Transaction properties.
|
// Transaction properties.
|
||||||
|
data.Field.Value.Add($"{Model_Transaction.ItemField.Type}", Internals.TransactionTypeCodes.GetDescForType(transaction.TransactionType));
|
||||||
|
data.Field.Value.Add($"{Model_Transaction.ItemField.AssociationId}", $"{SysId.ToInt(transaction.AssociationId)}");
|
||||||
|
data.Field.Value.Add($"{Model_Transaction.ItemField.AssociationName}", AccountMgr.GetAssociationTargetName(transaction.AssociationId));
|
||||||
data.Field.Value.Add($"{Model_Transaction.ItemField.Reference}", transaction.Ref);
|
data.Field.Value.Add($"{Model_Transaction.ItemField.Reference}", transaction.Ref);
|
||||||
data.Field.Value.Add($"{Model_Transaction.ItemField.ReferenceExt}", transaction.RefExt);
|
data.Field.Value.Add($"{Model_Transaction.ItemField.ReferenceExt}", transaction.RefExt);
|
||||||
data.Field.Value.Add($"{Model_Transaction.ItemField.DescBrief}", transaction.DescBrief);
|
data.Field.Value.Add($"{Model_Transaction.ItemField.DescBrief}", transaction.DescBrief);
|
||||||
|
data.Field.Value.Add($"{Model_Transaction.ItemField.ContactName}", transaction.ContactName);
|
||||||
|
data.Field.Value.Add($"{Model_Transaction.ItemField.RaisedBy}", transaction.RaisedBy);
|
||||||
|
// Status dates.
|
||||||
|
data.Field.Value.Add($"{Model_Transaction.ItemField.Raised}", model.FormatDateForForm(transaction.Raised));
|
||||||
|
data.Field.Value.Add($"{Model_Transaction.ItemField.InProgress}", model.FormatDateForForm(transaction.InProgress));
|
||||||
|
data.Field.Value.Add($"{Model_Transaction.ItemField.Closed}", model.FormatDateForForm(transaction.Closed));
|
||||||
if (dataGroups != null && dataGroups.Contains(TransactionDataGroup.Core))
|
if (dataGroups != null && dataGroups.Contains(TransactionDataGroup.Core))
|
||||||
{
|
{
|
||||||
// Core.
|
// Core.
|
||||||
@@ -88,13 +105,18 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
|
|||||||
{
|
{
|
||||||
// Construction.
|
// Construction.
|
||||||
public AjaxResponse_TransactionConfig(SbmModel_Portal model) : base(model) { }
|
public AjaxResponse_TransactionConfig(SbmModel_Portal model) : base(model) { }
|
||||||
// Configuration.
|
// Configuration data - object copied directly to env.datain script.
|
||||||
public Model_Transaction.ListConfigData Config { get; } = new Model_Transaction.ListConfigData();
|
public class ConfigData
|
||||||
public Model_Transaction.ItemConfigData ConfigItemNew { get; } = new Model_Transaction.ItemConfigData();
|
{
|
||||||
// Reference data.
|
// Configurations.
|
||||||
public List<ItemCodeDesc> TransactionTypes { get; } = new List<ItemCodeDesc>();
|
public Model_Transaction.ListConfigData CfgList { get; } = new Model_Transaction.ListConfigData();
|
||||||
public List<ItemCodeDesc> Statuses { get; } = new List<ItemCodeDesc>();
|
public Model_Transaction.ItemConfigData CfgItemNew { get; } = new Model_Transaction.ItemConfigData();
|
||||||
public String DefaultStatusCode { get; set; }
|
// Reference data.
|
||||||
|
public List<ItemCodeDesc> TransactionTypes { get; } = new List<ItemCodeDesc>();
|
||||||
|
public List<ItemCodeDesc> Statuses { get; } = new List<ItemCodeDesc>();
|
||||||
|
public String DefaultStatusCode { get; set; }
|
||||||
|
}
|
||||||
|
public ConfigData Data { get; set; } = new ConfigData();
|
||||||
}
|
}
|
||||||
// Ajax request.
|
// Ajax request.
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
@@ -103,7 +125,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
|
|||||||
public IActionResult Ajax_TransactionConfig(Model_Transaction model)
|
public IActionResult Ajax_TransactionConfig(Model_Transaction model)
|
||||||
{
|
{
|
||||||
AjaxResponse_TransactionConfig responseData = new AjaxResponse_TransactionConfig(model);
|
AjaxResponse_TransactionConfig responseData = new AjaxResponse_TransactionConfig(model);
|
||||||
String messageTitle = Localiser["caption.transactions"];
|
String messageTitle = Localiser["label.transactions"];
|
||||||
|
|
||||||
// Validate session and referrer.
|
// Validate session and referrer.
|
||||||
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
|
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
|
||||||
@@ -120,17 +142,17 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
|
|||||||
private void PopulateTransactionConfig(Model_Transaction model, AjaxResponse_TransactionConfig responseData)
|
private void PopulateTransactionConfig(Model_Transaction model, AjaxResponse_TransactionConfig responseData)
|
||||||
{
|
{
|
||||||
// Configuration.
|
// Configuration.
|
||||||
model.PopulateListConfig(responseData.Config);
|
model.PopulateListConfig(responseData.Data.CfgList);
|
||||||
model.PopulateItemConfig(responseData.ConfigItemNew, null, Sbm.TransactionType.Unknown);
|
model.PopulateItemConfig(responseData.Data.CfgItemNew, null, Sbm.TransactionType.Unknown);
|
||||||
|
|
||||||
// Reference data - transaction types.
|
// Reference data - transaction types.
|
||||||
foreach (TypeCodeDesc transactionType in GetSystemCodes(Sbm.SystemCode.TransactionType))
|
foreach (TypeCodeDesc transactionType in GetSystemCodes(Sbm.SystemCode.TransactionType))
|
||||||
responseData.TransactionTypes.Add(new AjaxResponse_Data.ItemCodeDesc(transactionType.Code, transactionType.Desc));
|
responseData.Data.TransactionTypes.Add(new AjaxResponse_Data.ItemCodeDesc(transactionType.Code, transactionType.Desc));
|
||||||
|
|
||||||
// Reference data - statuses.
|
// Reference data - statuses.
|
||||||
foreach (SaStatus status in SbmTransaction.ValidStatuses().FindAll(item => item != SaStatus.Deleted))
|
foreach (SaStatus status in SbmTransaction.ValidStatuses().FindAll(item => item != SaStatus.Deleted))
|
||||||
responseData.Statuses.Add(new AjaxResponse_Data.ItemCodeDesc(SacsSystem.GetStatusCode(status), Localiser.GetStatusCaption(status)));
|
responseData.Data.Statuses.Add(new AjaxResponse_Data.ItemCodeDesc(SacsSystem.GetStatusCode(status), Localiser.GetStatusCaption(status)));
|
||||||
responseData.DefaultStatusCode = SacsSystem.GetStatusCode(SbmTransaction.DefaultStatus);
|
responseData.Data.DefaultStatusCode = SacsSystem.GetStatusCode(SbmTransaction.DefaultStatus);
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
||||||
@@ -161,7 +183,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
|
|||||||
public IActionResult Ajax_TransactionList(Model_Transaction model)
|
public IActionResult Ajax_TransactionList(Model_Transaction model)
|
||||||
{
|
{
|
||||||
AjaxResponse_TransactionList responseData = new AjaxResponse_TransactionList(model);
|
AjaxResponse_TransactionList responseData = new AjaxResponse_TransactionList(model);
|
||||||
String messageTitle = Localiser["caption.transactions"];
|
String messageTitle = Localiser["label.transactions"];
|
||||||
|
|
||||||
// Validate session and referrer.
|
// Validate session and referrer.
|
||||||
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
|
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
|
||||||
@@ -173,16 +195,16 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
|
|||||||
|
|
||||||
// View mode.
|
// View mode.
|
||||||
responseData.Mode = new AjaxResponse_TransactionList.ModeData();
|
responseData.Mode = new AjaxResponse_TransactionList.ModeData();
|
||||||
Model_Transaction.TransactionViewMode viewMode = model.GetFilterMode();
|
Model_Transaction.ViewMode viewMode = model.GetFilterMode();
|
||||||
if (viewMode == Model_Transaction.TransactionViewMode.Maintain)
|
if (viewMode == Model_Transaction.ViewMode.Maintain)
|
||||||
responseData.Mode.Maintain = true;
|
responseData.Mode.Maintain = true;
|
||||||
else if (viewMode == Model_Transaction.TransactionViewMode.SearchRequirement)
|
else if (viewMode == Model_Transaction.ViewMode.SearchRequirement)
|
||||||
responseData.Mode.SearchRequirement = true;
|
responseData.Mode.SearchRequirement = true;
|
||||||
else if (viewMode == Model_Transaction.TransactionViewMode.DeliveryPlanning)
|
else if (viewMode == Model_Transaction.ViewMode.DeliveryPlanning)
|
||||||
responseData.Mode.DeliveryPlanning = true;
|
responseData.Mode.DeliveryPlanning = true;
|
||||||
else if (viewMode == Model_Transaction.TransactionViewMode.TransactionsForSourceTrans)
|
else if (viewMode == Model_Transaction.ViewMode.TransactionsForSourceTrans)
|
||||||
responseData.Mode.TransactionsForSourceTrans = true;
|
responseData.Mode.TransactionsForSourceTrans = true;
|
||||||
else if (viewMode == Model_Transaction.TransactionViewMode.TransactionsForAssociation)
|
else if (viewMode == Model_Transaction.ViewMode.TransactionsForAssociation)
|
||||||
responseData.Mode.TransactionsForAssociation = true;
|
responseData.Mode.TransactionsForAssociation = true;
|
||||||
else
|
else
|
||||||
responseData.Mode.Search = true;
|
responseData.Mode.Search = true;
|
||||||
@@ -191,7 +213,9 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
|
|||||||
SbmTransaction.Params prmTransaction = new SbmTransaction.Params();
|
SbmTransaction.Params prmTransaction = new SbmTransaction.Params();
|
||||||
prmTransaction.Search = model.Filter.Search;
|
prmTransaction.Search = model.Filter.Search;
|
||||||
prmTransaction.TransactionType = model.GetFilterTransactionType();
|
prmTransaction.TransactionType = model.GetFilterTransactionType();
|
||||||
prmTransaction.StatusCat = SbmTransaction.StatusCat.NotDeleted;
|
if (model.GetFilterTransactionStatusCat() > 0)
|
||||||
|
prmTransaction.StatusCat = model.GetFilterTransactionStatusCat();
|
||||||
|
else prmTransaction.StatusCat = SbmTransaction.StatusCat.NotDeleted;
|
||||||
if (model.GetFilterTransactionType() <= 0)
|
if (model.GetFilterTransactionType() <= 0)
|
||||||
prmTransaction.SortColumns.Add(TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.Type_Desc));
|
prmTransaction.SortColumns.Add(TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.Type_Desc));
|
||||||
prmTransaction.SortColumns.Add(TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.Ref));
|
prmTransaction.SortColumns.Add(TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.Ref));
|
||||||
@@ -200,10 +224,16 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
|
|||||||
|
|
||||||
// Item columns.
|
// Item columns.
|
||||||
ColumnDfn colId = TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.Id);
|
ColumnDfn colId = TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.Id);
|
||||||
|
ColumnDfn colTargetName = TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.AssocTarget_Name);
|
||||||
ColumnDfn colType = TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.Type_Desc);
|
ColumnDfn colType = TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.Type_Desc);
|
||||||
ColumnDfn colRef = TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.Ref);
|
ColumnDfn colRef = TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.Ref);
|
||||||
ColumnDfn colRefExt = TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.RefExt);
|
ColumnDfn colRefExt = TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.RefExt);
|
||||||
ColumnDfn colDescBrief = TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.DescBrief);
|
ColumnDfn colDescBrief = TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.DescBrief);
|
||||||
|
ColumnDfn colItemCount = TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.ReqntCount);
|
||||||
|
ColumnDfn colRaisedOn = TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.RaisedOn);
|
||||||
|
ColumnDfn colRequiredOn = TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.RequiredOn);
|
||||||
|
ColumnDfn colInProgressOn = TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.InProgressOn);
|
||||||
|
ColumnDfn colClosedOn = TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.ClosedOn);
|
||||||
ColumnDfn colAmountNet = TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.AmountNet);
|
ColumnDfn colAmountNet = TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.AmountNet);
|
||||||
ColumnDfn colAmountTax = TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.AmountTax);
|
ColumnDfn colAmountTax = TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.AmountTax);
|
||||||
ColumnDfn colAmountTot = TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.AmountTot);
|
ColumnDfn colAmountTot = TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.AmountTot);
|
||||||
@@ -213,7 +243,8 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
|
|||||||
ColumnDfn colUpdatedOn = TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.UpdateOn_Date);
|
ColumnDfn colUpdatedOn = TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.UpdateOn_Date);
|
||||||
List<ColumnDfn> columns = new List<ColumnDfn>()
|
List<ColumnDfn> columns = new List<ColumnDfn>()
|
||||||
{
|
{
|
||||||
colId, colType, colRef, colRefExt, colDescBrief,
|
colId, colTargetName, colType, colRef, colRefExt, colDescBrief, colItemCount,
|
||||||
|
colRaisedOn, colRequiredOn, colInProgressOn, colClosedOn,
|
||||||
colNotes, colStatus, colCreatedOn, colUpdatedOn
|
colNotes, colStatus, colCreatedOn, colUpdatedOn
|
||||||
};
|
};
|
||||||
if (model.UserCanViewFinancials())
|
if (model.UserCanViewFinancials())
|
||||||
@@ -233,10 +264,19 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
|
|||||||
Narrative = values.GetString(colDescBrief.DataName),
|
Narrative = values.GetString(colDescBrief.DataName),
|
||||||
StatusCode = values.GetString(colStatus.DataName),
|
StatusCode = values.GetString(colStatus.DataName),
|
||||||
};
|
};
|
||||||
|
transactionData.Field.Value.Add($"{Model_Transaction.ItemField.AssociationName}", values.GetString(colTargetName.DataName));
|
||||||
transactionData.Field.Value.Add($"{Model_Transaction.ItemField.Type}", Internals.TransactionTypeCodes.GetDescForType(transactionType));
|
transactionData.Field.Value.Add($"{Model_Transaction.ItemField.Type}", Internals.TransactionTypeCodes.GetDescForType(transactionType));
|
||||||
transactionData.Field.Value.Add($"{Model_Transaction.ItemField.Reference}", values.GetString(colRef.DataName));
|
transactionData.Field.Value.Add($"{Model_Transaction.ItemField.Reference}", values.GetString(colRef.DataName));
|
||||||
transactionData.Field.Value.Add($"{Model_Transaction.ItemField.ReferenceExt}", values.GetString(colRefExt.DataName));
|
transactionData.Field.Value.Add($"{Model_Transaction.ItemField.ReferenceExt}", values.GetString(colRefExt.DataName));
|
||||||
transactionData.Field.Value.Add($"{Model_Transaction.ItemField.DescBrief}", values.GetString(colDescBrief.DataName));
|
transactionData.Field.Value.Add($"{Model_Transaction.ItemField.DescBrief}", values.GetString(colDescBrief.DataName));
|
||||||
|
long itemCount = values.GetLong(colItemCount.DataName);
|
||||||
|
if (itemCount > 0)
|
||||||
|
transactionData.Field.Value.Add($"{Model_Transaction.ItemField.ItemCount}", $"{itemCount}");
|
||||||
|
// Status dates.
|
||||||
|
transactionData.Field.Value.Add($"{Model_Transaction.ItemField.RaisedFmt}", model.FormatDateForDisplay(values.GetDate(colRaisedOn.DataName)));
|
||||||
|
transactionData.Field.Value.Add($"{Model_Transaction.ItemField.RequiredFmt}", model.FormatDateForDisplay(values.GetDate(colRequiredOn.DataName)));
|
||||||
|
transactionData.Field.Value.Add($"{Model_Transaction.ItemField.InProgressFmt}", model.FormatDateForDisplay(values.GetDate(colInProgressOn.DataName)));
|
||||||
|
transactionData.Field.Value.Add($"{Model_Transaction.ItemField.ClosedFmt}", model.FormatDateForDisplay(values.GetDate(colClosedOn.DataName)));
|
||||||
if (model.UserCanViewFinancials())
|
if (model.UserCanViewFinancials())
|
||||||
{
|
{
|
||||||
transactionData.Field.Value.Add($"{Model_Transaction.ItemField.AmountNet}", colAmountNet.FormatValue(values));
|
transactionData.Field.Value.Add($"{Model_Transaction.ItemField.AmountNet}", colAmountNet.FormatValue(values));
|
||||||
@@ -283,7 +323,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
|
|||||||
[Route("Transaction/Ajax/GetItem")]
|
[Route("Transaction/Ajax/GetItem")]
|
||||||
public IActionResult Ajax_GetItem(Model_Transaction model)
|
public IActionResult Ajax_GetItem(Model_Transaction model)
|
||||||
{
|
{
|
||||||
String messageTitle = Localiser["caption.transaction"];
|
String messageTitle = Localiser["label.transaction"];
|
||||||
AjaxResponse_Transaction responseData = new AjaxResponse_Transaction(model);
|
AjaxResponse_Transaction responseData = new AjaxResponse_Transaction(model);
|
||||||
|
|
||||||
// Validate session and referrer.
|
// Validate session and referrer.
|
||||||
@@ -306,7 +346,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
|
|||||||
|
|
||||||
// Construct response.
|
// Construct response.
|
||||||
model.PopulateItemConfig(responseData.Config, transaction);
|
model.PopulateItemConfig(responseData.Config, transaction);
|
||||||
PopulateTransactionResponseItemData(transaction, responseData.transaction);
|
PopulateTransactionResponseItemData(model, transaction, responseData.transaction);
|
||||||
|
|
||||||
// Complete response.
|
// Complete response.
|
||||||
responseData.Success = true;
|
responseData.Success = true;
|
||||||
@@ -322,7 +362,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
|
|||||||
[Route("Transaction/Ajax/StoreItem")]
|
[Route("Transaction/Ajax/StoreItem")]
|
||||||
public IActionResult Ajax_StoreItem(Model_Transaction model)
|
public IActionResult Ajax_StoreItem(Model_Transaction model)
|
||||||
{
|
{
|
||||||
String messageTitle = Localiser["caption.transaction"];
|
String messageTitle = Localiser["label.transaction"];
|
||||||
AjaxResponse_Transaction responseData = new AjaxResponse_Transaction(model);
|
AjaxResponse_Transaction responseData = new AjaxResponse_Transaction(model);
|
||||||
|
|
||||||
// Validate session and referrer.
|
// Validate session and referrer.
|
||||||
@@ -405,7 +445,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
|
|||||||
|
|
||||||
// Construct response.
|
// Construct response.
|
||||||
model.PopulateItemConfig(responseData.Config, transaction);
|
model.PopulateItemConfig(responseData.Config, transaction);
|
||||||
PopulateTransactionResponseItemData(transaction, responseData.transaction);
|
PopulateTransactionResponseItemData(model, transaction, responseData.transaction);
|
||||||
|
|
||||||
// Complete response.
|
// Complete response.
|
||||||
responseData.Success = true;
|
responseData.Success = true;
|
||||||
|
|||||||
+10
-2
@@ -16,6 +16,7 @@ using System.Linq;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Sarand.BusinessMgr.Web.Portal.Models.Transactions;
|
using Sarand.BusinessMgr.Web.Portal.Models.Transactions;
|
||||||
using Sarand.BusinessMgr.Web.Portal.Components;
|
using Sarand.BusinessMgr.Web.Portal.Components;
|
||||||
|
using Sarand.Net.Standard.Base.Core;
|
||||||
|
|
||||||
namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
|
namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
|
||||||
{
|
{
|
||||||
@@ -34,7 +35,8 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
|
|||||||
|
|
||||||
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
public IActionResult Index(Model_Transaction model)
|
[Route("Transactions/{transactionTypeName=}")]
|
||||||
|
public IActionResult Index(String transactionTypeName)
|
||||||
{
|
{
|
||||||
if (!ValidUserSession)
|
if (!ValidUserSession)
|
||||||
AutoLoginUser();
|
AutoLoginUser();
|
||||||
@@ -46,11 +48,17 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
|
|||||||
return RedirectToAction("", "Security");
|
return RedirectToAction("", "Security");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Interpret transaction type, default to 'Sales Order'.
|
||||||
|
List<TypeCodeDesc> transactionTypes = GetSystemCodes(Sbm.SystemCode.TransactionType);
|
||||||
|
Sbm.TransactionType transactionType = EnumUtil.ParseEnum(transactionTypeName, Sbm.TransactionType.SalesOrder);
|
||||||
|
|
||||||
// Transaction page.
|
// Transaction page.
|
||||||
|
Model_Transaction model = new Model_Transaction(Localiser);
|
||||||
RefreshModel(model);
|
RefreshModel(model);
|
||||||
model.PopulateListConfig();
|
model.Filter.TransactionType = transactionTypes.GetCodeForType(transactionType);
|
||||||
model.Paging.PageNo = SessionData_Portal.Profile.Transaction.Filter.PageNo;
|
model.Paging.PageNo = SessionData_Portal.Profile.Transaction.Filter.PageNo;
|
||||||
model.Paging.PageLength = SessionData_Portal.Profile.Transaction.Filter.PageLength;
|
model.Paging.PageLength = SessionData_Portal.Profile.Transaction.Filter.PageLength;
|
||||||
|
model.PopulateListConfig();
|
||||||
return View(model);
|
return View(model);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -228,7 +228,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Commodities
|
|||||||
commodity = CommodityMgr.GetCommodityById(SysId.ToSysId(Commodity.Id));
|
commodity = CommodityMgr.GetCommodityById(SysId.ToSysId(Commodity.Id));
|
||||||
disposables.Add(commodity);
|
disposables.Add(commodity);
|
||||||
if (commodity == null)
|
if (commodity == null)
|
||||||
responseData.SetMessage(Localiser["caption.commodity"], Localiser["msg.something.gone.wrong"]);
|
responseData.SetMessage(Localiser["label.commodity"], Localiser["msg.something.gone.wrong"]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!responseData.HasControlErrors())
|
if (!responseData.HasControlErrors())
|
||||||
@@ -285,7 +285,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Commodities
|
|||||||
if (CommodityMgr.GetCommodityCount(prmCommodity) > 0)
|
if (CommodityMgr.GetCommodityCount(prmCommodity) > 0)
|
||||||
{
|
{
|
||||||
String msg = "There are no other Commodities for this code\nwith a status of 'Current'.\n\nAre you sure that this commodity should be set to 'Superseded'?";
|
String msg = "There are no other Commodities for this code\nwith a status of 'Current'.\n\nAre you sure that this commodity should be set to 'Superseded'?";
|
||||||
responseData.SetConfirmMessage(Localiser["caption.commodity"], msg);
|
responseData.SetConfirmMessage(Localiser["label.commodity"], msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -96,6 +96,8 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Contacts
|
|||||||
// List configuration.
|
// List configuration.
|
||||||
public class ListConfigData
|
public class ListConfigData
|
||||||
{
|
{
|
||||||
|
// List caption.
|
||||||
|
public String Caption { get; set; }
|
||||||
// Actions.
|
// Actions.
|
||||||
public class ActionData
|
public class ActionData
|
||||||
{
|
{
|
||||||
@@ -137,11 +139,19 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Contacts
|
|||||||
ViewMode pageMode = GetFilterMode();
|
ViewMode pageMode = GetFilterMode();
|
||||||
bool modeIsRelationships = pageMode == ViewMode.Relationships;
|
bool modeIsRelationships = pageMode == ViewMode.Relationships;
|
||||||
bool modeIsMaintain = pageMode == ViewMode.Maintain;
|
bool modeIsMaintain = pageMode == ViewMode.Maintain;
|
||||||
|
|
||||||
Sbm.AssociationType associationType = GetFilterAssociationType();
|
Sbm.AssociationType associationType = GetFilterAssociationType();
|
||||||
bool typeIsCustomer = associationType == Sbm.AssociationType.Customer;
|
bool typeIsCustomer = associationType == Sbm.AssociationType.Customer;
|
||||||
bool typeIsSupplier = associationType == Sbm.AssociationType.Supplier;
|
bool typeIsSupplier = associationType == Sbm.AssociationType.Supplier;
|
||||||
bool typeIsMember = associationType == Sbm.AssociationType.Member;
|
bool typeIsMember = associationType == Sbm.AssociationType.Member;
|
||||||
|
|
||||||
|
// Page caption.
|
||||||
|
if (associationType == Sbm.AssociationType.Customer)
|
||||||
|
config.Caption = Localiser["label.customers"];
|
||||||
|
else if (associationType == Sbm.AssociationType.Supplier)
|
||||||
|
config.Caption = Localiser["label.suppliers"];
|
||||||
|
config.Caption = StringUtil.OnBlank(config.Caption, Localiser["label.associations"]);
|
||||||
|
|
||||||
// Actions.
|
// Actions.
|
||||||
|
|
||||||
if (typeIsCustomer)
|
if (typeIsCustomer)
|
||||||
@@ -337,7 +347,10 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Contacts
|
|||||||
// Item Fields.
|
// Item Fields.
|
||||||
|
|
||||||
// Type.
|
// Type.
|
||||||
config.Field.Readonly.Add($"{ItemField.Type}");
|
// Disabled for existing associations.
|
||||||
|
// Dropdown should only include a single item if Association type is preselecedt (in the list filter).
|
||||||
|
if (ItemId.IsValid(associationItemId))
|
||||||
|
config.Field.Readonly.Add($"{ItemField.Type}");
|
||||||
|
|
||||||
// Owner.
|
// Owner.
|
||||||
if (!ItemId.IsValid(associationItemId) || ownerIsInternal)
|
if (!ItemId.IsValid(associationItemId) || ownerIsInternal)
|
||||||
|
|||||||
@@ -19,8 +19,11 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Home
|
|||||||
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
||||||
// Home page statictics.
|
// Home page statictics.
|
||||||
|
|
||||||
|
// Contacts.
|
||||||
|
|
||||||
public long GetContactCount()
|
public long GetContactCount()
|
||||||
{
|
{
|
||||||
|
if (!ValidUserSession) return 0;
|
||||||
SbmAffiliate.Params prmAffiliate = new SbmAffiliate.Params();
|
SbmAffiliate.Params prmAffiliate = new SbmAffiliate.Params();
|
||||||
prmAffiliate.StatusCat = SbmAffiliate.StatusCat.NotDeleted;
|
prmAffiliate.StatusCat = SbmAffiliate.StatusCat.NotDeleted;
|
||||||
return AccountMgr.GetAffiliateCount(prmAffiliate);
|
return AccountMgr.GetAffiliateCount(prmAffiliate);
|
||||||
@@ -28,6 +31,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Home
|
|||||||
|
|
||||||
public long GetCustomerCount()
|
public long GetCustomerCount()
|
||||||
{
|
{
|
||||||
|
if (!ValidUserSession) return 0;
|
||||||
SbmAssociation.Params prmAssociation = new SbmAssociation.Params();
|
SbmAssociation.Params prmAssociation = new SbmAssociation.Params();
|
||||||
prmAssociation.AssociationType = Sbm.AssociationType.Customer;
|
prmAssociation.AssociationType = Sbm.AssociationType.Customer;
|
||||||
prmAssociation.StatusCat = SbmAssociation.StatusCat.NotDeleted;
|
prmAssociation.StatusCat = SbmAssociation.StatusCat.NotDeleted;
|
||||||
@@ -36,14 +40,18 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Home
|
|||||||
|
|
||||||
public long GetSupplierCount()
|
public long GetSupplierCount()
|
||||||
{
|
{
|
||||||
|
if (!ValidUserSession) return 0;
|
||||||
SbmAssociation.Params prmAssociation = new SbmAssociation.Params();
|
SbmAssociation.Params prmAssociation = new SbmAssociation.Params();
|
||||||
prmAssociation.AssociationType = Sbm.AssociationType.Supplier;
|
prmAssociation.AssociationType = Sbm.AssociationType.Supplier;
|
||||||
prmAssociation.StatusCat = SbmAssociation.StatusCat.NotDeleted;
|
prmAssociation.StatusCat = SbmAssociation.StatusCat.NotDeleted;
|
||||||
return AccountMgr.GetAssociationCount(prmAssociation);
|
return AccountMgr.GetAssociationCount(prmAssociation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Commodities.
|
||||||
|
|
||||||
public long GetCommodityCount()
|
public long GetCommodityCount()
|
||||||
{
|
{
|
||||||
|
if (!ValidUserSession) return 0;
|
||||||
SbmCommodity.Params prmCommodity = new SbmCommodity.Params();
|
SbmCommodity.Params prmCommodity = new SbmCommodity.Params();
|
||||||
prmCommodity.StatusCat = SbmCommodity.StatusCat.NotDeleted;
|
prmCommodity.StatusCat = SbmCommodity.StatusCat.NotDeleted;
|
||||||
return CommodityMgr.GetCommodityCount(prmCommodity);
|
return CommodityMgr.GetCommodityCount(prmCommodity);
|
||||||
@@ -51,6 +59,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Home
|
|||||||
|
|
||||||
public long GetAssetCount()
|
public long GetAssetCount()
|
||||||
{
|
{
|
||||||
|
if (!ValidUserSession) return 0;
|
||||||
SbmAsset.Params prmAsset = new SbmAsset.Params();
|
SbmAsset.Params prmAsset = new SbmAsset.Params();
|
||||||
prmAsset.StatusCat = SbmAsset.StatusCat.NotDeleted;
|
prmAsset.StatusCat = SbmAsset.StatusCat.NotDeleted;
|
||||||
return AssetMgr.GetAssetCount(prmAsset);
|
return AssetMgr.GetAssetCount(prmAsset);
|
||||||
@@ -58,11 +67,23 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Home
|
|||||||
|
|
||||||
public long GetVehicleCount()
|
public long GetVehicleCount()
|
||||||
{
|
{
|
||||||
|
if (!ValidUserSession) return 0;
|
||||||
SbmVehicle.Params prmVehicle = new SbmVehicle.Params();
|
SbmVehicle.Params prmVehicle = new SbmVehicle.Params();
|
||||||
prmVehicle.StatusCat = SbmVehicle.StatusCat.NotDeleted;
|
prmVehicle.StatusCat = SbmVehicle.StatusCat.NotDeleted;
|
||||||
return AssetMgr.GetVehicleCount(prmVehicle);
|
return AssetMgr.GetVehicleCount(prmVehicle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Transactions.
|
||||||
|
|
||||||
|
public long GetSalesOrderCount()
|
||||||
|
{
|
||||||
|
if (!ValidUserSession) return 0;
|
||||||
|
SbmTransaction.Params prmTransaction = new SbmTransaction.Params();
|
||||||
|
prmTransaction.TransactionType = Sbm.TransactionType.SalesOrder;
|
||||||
|
prmTransaction.StatusCat = SbmTransaction.StatusCat.NotDeleted;
|
||||||
|
return TransactionMgr.GetTransactionCount(prmTransaction);
|
||||||
|
}
|
||||||
|
|
||||||
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
||||||
}
|
}
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
using Sarand.BusinessMgr.Net.Standard.Base.App;
|
using Sarand.BusinessMgr.Net.Standard.Base.App;
|
||||||
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
|
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
|
||||||
using Sarand.Net.Standard.Base.Bus;
|
using Sarand.Net.Standard.Base.Bus;
|
||||||
|
using Sarand.Net.Standard.Base.Utils;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
@@ -19,18 +20,6 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
|
|||||||
/// <summary>Prefix for field names.</summary>
|
/// <summary>Prefix for field names.</summary>
|
||||||
public const String FieldNamePrefix = "Transaction";
|
public const String FieldNamePrefix = "Transaction";
|
||||||
|
|
||||||
//-------------------------------------------------------------------
|
|
||||||
// Legacy Transaction dialog tabs and panels.
|
|
||||||
// - Transaction.
|
|
||||||
// - Tab 1:
|
|
||||||
// - Tab 2:
|
|
||||||
// - Tab 3:
|
|
||||||
// - Tab 4:
|
|
||||||
// - Tab 5:
|
|
||||||
// - Tab 6:
|
|
||||||
// - Tab 7:
|
|
||||||
// - Other.
|
|
||||||
|
|
||||||
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
||||||
/// <summary>Item fields.</summary>
|
/// <summary>Item fields.</summary>
|
||||||
public enum ItemField
|
public enum ItemField
|
||||||
@@ -39,8 +28,8 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
|
|||||||
// Transaction.
|
// Transaction.
|
||||||
Pos,
|
Pos,
|
||||||
Id,
|
Id,
|
||||||
AssociationTarget,
|
AssociationName,
|
||||||
AssociationIdTarget,
|
AssociationId,
|
||||||
Type,
|
Type,
|
||||||
Reference,
|
Reference,
|
||||||
ReferenceExt,
|
ReferenceExt,
|
||||||
@@ -68,11 +57,16 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
|
|||||||
//---------------------------------------------------------------
|
//---------------------------------------------------------------
|
||||||
// Status dates.
|
// Status dates.
|
||||||
Raised,
|
Raised,
|
||||||
|
RaisedFmt,
|
||||||
Required,
|
Required,
|
||||||
|
RequiredFmt,
|
||||||
InProgress,
|
InProgress,
|
||||||
|
InProgressFmt,
|
||||||
DeliveredEst,
|
DeliveredEst,
|
||||||
DeliveredAct,
|
DeliveredAct,
|
||||||
Closed,
|
Closed,
|
||||||
|
ClosedFmt,
|
||||||
|
//---------------------------------------------------------------
|
||||||
Department,
|
Department,
|
||||||
DescBrief,
|
DescBrief,
|
||||||
DescIntro,
|
DescIntro,
|
||||||
@@ -161,6 +155,19 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
|
|||||||
// List configuration.
|
// List configuration.
|
||||||
public class ListConfigData
|
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.
|
// List columns.
|
||||||
public class ColumnData
|
public class ColumnData
|
||||||
{
|
{
|
||||||
@@ -190,13 +197,13 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
|
|||||||
public void PopulateListConfig(ListConfigData config)
|
public void PopulateListConfig(ListConfigData config)
|
||||||
{
|
{
|
||||||
// View properties.
|
// View properties.
|
||||||
TransactionViewMode viewMode = GetFilterMode();
|
ViewMode viewMode = GetFilterMode();
|
||||||
bool modeIsSearch = viewMode == TransactionViewMode.Search;
|
bool modeIsSearch = viewMode == ViewMode.Search;
|
||||||
bool modeIsMaintain = viewMode == TransactionViewMode.Maintain;
|
bool modeIsMaintain = viewMode == ViewMode.Maintain;
|
||||||
bool modeIsRequirementSearch = viewMode == TransactionViewMode.SearchRequirement;
|
bool modeIsRequirementSearch = viewMode == ViewMode.SearchRequirement;
|
||||||
bool modeIsDeliveryPlanning = viewMode == TransactionViewMode.DeliveryPlanning;
|
bool modeIsDeliveryPlanning = viewMode == ViewMode.DeliveryPlanning;
|
||||||
bool modeIsTransactionsForSourceTrans = viewMode == TransactionViewMode.TransactionsForSourceTrans;
|
bool modeIsTransactionsForSourceTrans = viewMode == ViewMode.TransactionsForSourceTrans;
|
||||||
bool modeIsTransactionsForAssociation = viewMode == TransactionViewMode.TransactionsForAssociation;
|
bool modeIsTransactionsForAssociation = viewMode == ViewMode.TransactionsForAssociation;
|
||||||
|
|
||||||
// Item type.
|
// Item type.
|
||||||
Sbm.TransactionType transactionType = GetFilterTransactionType();
|
Sbm.TransactionType transactionType = GetFilterTransactionType();
|
||||||
@@ -219,9 +226,23 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
|
|||||||
SbmTransaction.StatusCat transactionStatusCat = GetFilterTransactionStatusCat();
|
SbmTransaction.StatusCat transactionStatusCat = GetFilterTransactionStatusCat();
|
||||||
|
|
||||||
// Options.
|
// Options.
|
||||||
|
bool userCanCreateTransactions = SessionData_Portal.SecurityProfile.UserCanCreateItemType(Sbm.ItemType.Transaction);
|
||||||
|
bool userCanUpdateTransactions = SessionData_Portal.SecurityProfile.UserCanUpdateItemType(Sbm.ItemType.Transaction);
|
||||||
bool allowTimeRecording = SessionConsole.AllowOption(Sbm.ConfigOption.TimeRecording);
|
bool allowTimeRecording = SessionConsole.AllowOption(Sbm.ConfigOption.TimeRecording);
|
||||||
bool allowJobCosting = SessionConsole.GetRequirementCostingConfig().AllowRequirementCosting(transactionType) && TransactionMgr.CostColumnsAreAvailable() && UserCanViewFinancials();
|
bool allowJobCosting = SessionConsole.GetRequirementCostingConfig().AllowRequirementCosting(transactionType) && TransactionMgr.CostColumnsAreAvailable() && UserCanViewFinancials();
|
||||||
|
|
||||||
|
//---------------------------------------------------------------
|
||||||
|
// List Caption.
|
||||||
|
config.Caption = StringUtil.OnBlank(GetListCaptionByTransactionType(transactionType),Localiser["label.transactions"]);
|
||||||
|
|
||||||
|
//---------------------------------------------------------------
|
||||||
|
// Actions.
|
||||||
|
|
||||||
|
if (userCanCreateTransactions)
|
||||||
|
config.Action.Allow.Create = true;
|
||||||
|
if (userCanUpdateTransactions)
|
||||||
|
config.Action.Allow.Update = true;
|
||||||
|
|
||||||
//---------------------------------------------------------------
|
//---------------------------------------------------------------
|
||||||
// Transaction list columns.
|
// Transaction list columns.
|
||||||
|
|
||||||
@@ -254,9 +275,9 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
|
|||||||
String associationLabel = Localiser["label.target"];
|
String associationLabel = Localiser["label.target"];
|
||||||
if (isSales) associationLabel = Localiser["label.customer"];
|
if (isSales) associationLabel = Localiser["label.customer"];
|
||||||
else if (isPurchase) associationLabel = Localiser["label.supplier"];
|
else if (isPurchase) associationLabel = Localiser["label.supplier"];
|
||||||
config.Column.Label.Add($"{ItemField.AssociationTarget}", associationLabel);
|
config.Column.Label.Add($"{ItemField.AssociationName}", associationLabel);
|
||||||
}
|
}
|
||||||
config.Column.Hide.Add($"{ItemField.AssociationTarget}");
|
else config.Column.Hide.Add($"{ItemField.AssociationName}");
|
||||||
|
|
||||||
// Narrative.
|
// Narrative.
|
||||||
config.Column.Label.Add($"{ItemField.DescBrief}", SessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Transaction_DescBrief, Localiser["label.narrative"]));
|
config.Column.Label.Add($"{ItemField.DescBrief}", SessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Transaction_DescBrief, Localiser["label.narrative"]));
|
||||||
@@ -313,18 +334,24 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
|
|||||||
// Raised date.
|
// Raised date.
|
||||||
if (!modeIsDeliveryPlanning)
|
if (!modeIsDeliveryPlanning)
|
||||||
{
|
{
|
||||||
config.Column.Label.Add($"{ItemField.Raised}", Localiser["label.raised"]);
|
//config.Column.Label.Add($"{ItemField.Raised}", Localiser["label.raised"]);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
config.Column.Hide.Add($"{ItemField.Raised}");
|
config.Column.Hide.Add($"{ItemField.Raised}");
|
||||||
|
config.Column.Hide.Add($"{ItemField.RaisedFmt}");
|
||||||
|
}
|
||||||
|
|
||||||
// In Progress date.
|
// In Progress date.
|
||||||
if (!modeIsDeliveryPlanning && !isSalesLead && !isSalesDispatch && transactionStatusCat != SbmTransaction.StatusCat.Pending)
|
if (!modeIsDeliveryPlanning && !isSalesLead && !isSalesDispatch && transactionStatusCat != SbmTransaction.StatusCat.Pending)
|
||||||
{
|
{
|
||||||
config.Column.Label.Add($"{ItemField.InProgress}", Localiser["label.in.progress"]);
|
//config.Column.Label.Add($"{ItemField.InProgress}", Localiser["label.in.progress"]);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
config.Column.Hide.Add($"{ItemField.InProgress}");
|
config.Column.Hide.Add($"{ItemField.InProgress}");
|
||||||
|
config.Column.Hide.Add($"{ItemField.InProgressFmt}");
|
||||||
|
}
|
||||||
|
|
||||||
// Required date.
|
// Required date.
|
||||||
if (modeIsDeliveryPlanning && !isSalesLead && !isSalesDispatch || transactionStatusCat != SbmTransaction.StatusCat.Closed)
|
if (modeIsDeliveryPlanning && !isSalesLead && !isSalesDispatch || transactionStatusCat != SbmTransaction.StatusCat.Closed)
|
||||||
@@ -334,15 +361,21 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
|
|||||||
config.Column.Label.Add($"{ItemField.Required}", requiredLabel);
|
config.Column.Label.Add($"{ItemField.Required}", requiredLabel);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
config.Column.Hide.Add($"{ItemField.Required}");
|
config.Column.Hide.Add($"{ItemField.Required}");
|
||||||
|
config.Column.Hide.Add($"{ItemField.RequiredFmt}");
|
||||||
|
}
|
||||||
|
|
||||||
// Closed date.
|
// Closed date.
|
||||||
if (modeIsDeliveryPlanning || transactionStatusCat != SbmTransaction.StatusCat.Open)
|
if (modeIsDeliveryPlanning || transactionStatusCat != SbmTransaction.StatusCat.Open)
|
||||||
{
|
{
|
||||||
config.Column.Label.Add($"{ItemField.Closed}", Localiser["label.closed"]);
|
//config.Column.Label.Add($"{ItemField.Closed}", Localiser["label.closed"]);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
config.Column.Hide.Add($"{ItemField.Closed}");
|
config.Column.Hide.Add($"{ItemField.Closed}");
|
||||||
|
config.Column.Hide.Add($"{ItemField.ClosedFmt}");
|
||||||
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------
|
//---------------------------------------------------------------
|
||||||
// Amounts.
|
// Amounts.
|
||||||
@@ -502,6 +535,31 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
|
|||||||
config.Column.Hide.Add($"{ItemField.Actions}");
|
config.Column.Hide.Add($"{ItemField.Actions}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------
|
||||||
|
private String GetListCaptionByTransactionType(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 Localiser["label.transactions"];
|
||||||
|
}
|
||||||
|
|
||||||
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
||||||
// Item configuration.
|
// Item configuration.
|
||||||
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
||||||
@@ -563,8 +621,12 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
|
|||||||
config.Field.Label.Add($"{ItemField.Type}", SessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Transaction_Type, Localiser["label.type"]));
|
config.Field.Label.Add($"{ItemField.Type}", SessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Transaction_Type, Localiser["label.type"]));
|
||||||
config.Field.Readonly.Add($"{ItemField.Type}");
|
config.Field.Readonly.Add($"{ItemField.Type}");
|
||||||
|
|
||||||
|
// Association.
|
||||||
|
config.Field.Readonly.Add($"{ItemField.AssociationName}");
|
||||||
|
|
||||||
// Reference.
|
// Reference.
|
||||||
config.Field.Label.Add($"{ItemField.Reference}", SessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Transaction_Ref, Localiser["label.reference"]));
|
config.Field.Label.Add($"{ItemField.Reference}", SessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Transaction_Ref, Localiser["label.reference"]));
|
||||||
|
config.Field.Readonly.Add($"{ItemField.Reference}");
|
||||||
|
|
||||||
// External Reference.
|
// External Reference.
|
||||||
if (transactionType != Sbm.TransactionType.SalesLead)
|
if (transactionType != Sbm.TransactionType.SalesLead)
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using Sarand.BusinessMgr.Net.Core.Web.App;
|
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.App;
|
||||||
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
|
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
|
||||||
using Sarand.BusinessMgr.Web.Portal.Components;
|
using Sarand.BusinessMgr.Web.Portal.Components;
|
||||||
@@ -7,6 +8,8 @@ using Sarand.Net.Standard.Base.Bus;
|
|||||||
using Sarand.Net.Standard.Base.Core;
|
using Sarand.Net.Standard.Base.Core;
|
||||||
using Sarand.Net.Standard.Base.Utils;
|
using Sarand.Net.Standard.Base.Utils;
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
|
namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
|
||||||
{
|
{
|
||||||
@@ -20,7 +23,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
|
|||||||
{
|
{
|
||||||
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
||||||
// Definitions.
|
// Definitions.
|
||||||
public enum TransactionViewMode
|
public enum ViewMode
|
||||||
{
|
{
|
||||||
Search, Maintain, SearchRequirement, DeliveryPlanning, TransactionsForSourceTrans, TransactionsForAssociation
|
Search, Maintain, SearchRequirement, DeliveryPlanning, TransactionsForSourceTrans, TransactionsForAssociation
|
||||||
}
|
}
|
||||||
@@ -42,9 +45,9 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
|
|||||||
public String StatusCat { get; set; }
|
public String StatusCat { get; set; }
|
||||||
}
|
}
|
||||||
public FilterData Filter { get; } = new FilterData();
|
public FilterData Filter { get; } = new FilterData();
|
||||||
public TransactionViewMode GetFilterMode()
|
public ViewMode GetFilterMode()
|
||||||
{
|
{
|
||||||
return EnumUtil.ParseEnum(Filter.Mode, TransactionViewMode.Search);
|
return EnumUtil.ParseEnum(Filter.Mode, ViewMode.Search);
|
||||||
}
|
}
|
||||||
public Sbm.TransactionType GetFilterTransactionType()
|
public Sbm.TransactionType GetFilterTransactionType()
|
||||||
{
|
{
|
||||||
@@ -53,11 +56,25 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
|
|||||||
transactionType = (Sbm.TransactionType)StringUtil.ToInt(Filter.TransactionType);
|
transactionType = (Sbm.TransactionType)StringUtil.ToInt(Filter.TransactionType);
|
||||||
return transactionType;
|
return transactionType;
|
||||||
}
|
}
|
||||||
|
public String GetFilterAssociationTypeCode()
|
||||||
|
{
|
||||||
|
List<TypeCodeDesc> associationTypes = Internals.GetSystemCodes(Sbm.SystemCode.AssociationType);
|
||||||
|
return SbmTransaction.GetAssociationTypes(GetFilterTransactionType())
|
||||||
|
.Select(item => associationTypes.GetCodeForType(item))
|
||||||
|
.Where(item => !StringUtil.IsBlank(item))
|
||||||
|
.FirstOrDefault();
|
||||||
|
}
|
||||||
public SbmTransaction.StatusCat GetFilterTransactionStatusCat()
|
public SbmTransaction.StatusCat GetFilterTransactionStatusCat()
|
||||||
{
|
{
|
||||||
return (SbmTransaction.StatusCat)StringUtil.ToInt(Filter.StatusCat);
|
return (SbmTransaction.StatusCat)StringUtil.ToInt(Filter.StatusCat);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>Transaction Status Cats for filter dropdown.</summary>
|
||||||
|
public IEnumerable<SelectListItem> GetTransactionStatusCatsForFilterDropdown()
|
||||||
|
{
|
||||||
|
return new SelectList(SbmTransaction.GetTransactionStatusCats(GetFilterTransactionType()), "Code", "Desc");
|
||||||
|
}
|
||||||
|
|
||||||
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
||||||
// Transaction properties.
|
// Transaction properties.
|
||||||
public class TransactionData
|
public class TransactionData
|
||||||
@@ -83,6 +100,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
|
|||||||
public String Raised { get; set; }
|
public String Raised { get; set; }
|
||||||
public String Required { get; set; }
|
public String Required { get; set; }
|
||||||
public String InProgress { get; set; }
|
public String InProgress { get; set; }
|
||||||
|
// Delivery.
|
||||||
public String DeliveredEst { get; set; }
|
public String DeliveredEst { get; set; }
|
||||||
public String DeliveredAct { get; set; }
|
public String DeliveredAct { get; set; }
|
||||||
public String Closed { get; set; }
|
public String Closed { get; set; }
|
||||||
@@ -160,7 +178,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
|
|||||||
// Association.
|
// Association.
|
||||||
if (Transaction.AssociationId != null)
|
if (Transaction.AssociationId != null)
|
||||||
{
|
{
|
||||||
String controlName = Model_Transaction.GetFieldName(Model_Transaction.ItemField.AssociationTarget);
|
String controlName = Model_Transaction.GetFieldName(Model_Transaction.ItemField.AssociationName);
|
||||||
SysId associationId = SysId.ToSysId(Transaction.AssociationId);
|
SysId associationId = SysId.ToSysId(Transaction.AssociationId);
|
||||||
if (!SysId.IsValid(associationId))
|
if (!SysId.IsValid(associationId))
|
||||||
responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]);
|
responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]);
|
||||||
|
|||||||
@@ -52,10 +52,26 @@
|
|||||||
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
|
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
|
||||||
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
</ItemGroup>
|
<Content Update="Views\Transaction\Index.cshtml">
|
||||||
|
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
|
||||||
<ItemGroup>
|
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
||||||
<Folder Include="Views\Transaction\" />
|
</Content>
|
||||||
|
<Content Update="Views\Transaction\Panel-TransactionDialog.cshtml">
|
||||||
|
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
|
||||||
|
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
||||||
|
</Content>
|
||||||
|
<Content Update="Views\Transaction\Panel-TransactionList.cshtml">
|
||||||
|
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
|
||||||
|
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
||||||
|
</Content>
|
||||||
|
<Content Update="Views\Transaction\Panel-TransactionMaintain.cshtml">
|
||||||
|
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
|
||||||
|
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
||||||
|
</Content>
|
||||||
|
<Content Update="Views\Transaction\Panel-TransactionSelect.cshtml">
|
||||||
|
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
|
||||||
|
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
||||||
|
</Content>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -62,7 +62,7 @@
|
|||||||
<div class="col-sm-4 row pb4">
|
<div class="col-sm-4 row pb4">
|
||||||
<div class="col-5 sbm-label text-right">@Localiser["label.search"]</div>
|
<div class="col-5 sbm-label text-right">@Localiser["label.search"]</div>
|
||||||
<div class="col-7">
|
<div class="col-7">
|
||||||
@Html.TextBox("Filter.Search", "", new { @id = "", @class = "FilterSearch", @maxlength = "32" })
|
@Html.TextBox("Filter.Search", "", new { @type = "search", @id = "", @class = "FilterSearch", @maxlength = "32" })
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
@* Asset filter - name etc. *@
|
@* Asset filter - name etc. *@
|
||||||
<div class="col-4 col-sm-4 sbm-label text-left text-sm-right">@Localiser["label.search"]</div>
|
<div class="col-4 col-sm-4 sbm-label text-left text-sm-right">@Localiser["label.search"]</div>
|
||||||
<div class="col-8 col-sm-8">
|
<div class="col-8 col-sm-8">
|
||||||
@Html.TextBox("Filter.Search", "", new { @id = "", @class = "FilterSearch sbm-input", @maxlength = "32" })
|
@Html.TextBox("Filter.Search", "", new { @type = "search", @id = "", @class = "FilterSearch sbm-input", @maxlength = "32" })
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+1
-1
@@ -53,7 +53,7 @@
|
|||||||
<div class="col-sm-4 row pb4">
|
<div class="col-sm-4 row pb4">
|
||||||
<div class="col-sm-5 sbm-label text-left text-sm-right">@Localiser["label.search"]</div>
|
<div class="col-sm-5 sbm-label text-left text-sm-right">@Localiser["label.search"]</div>
|
||||||
<div class="col-sm-7">
|
<div class="col-sm-7">
|
||||||
@Html.TextBox("Filter.Search", "", new { @id = "", @class = "FilterSearch", @maxlength = "32" })
|
@Html.TextBox("Filter.Search", "", new { @type = "search", @id = "", @class = "FilterSearch", @maxlength = "32" })
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+1
-1
@@ -31,7 +31,7 @@
|
|||||||
@* AssetCategory filter - name etc. *@
|
@* AssetCategory filter - name etc. *@
|
||||||
<div class="col-4 col-sm-4 sbm-label text-left text-sm-right">@Localiser["label.search"]</div>
|
<div class="col-4 col-sm-4 sbm-label text-left text-sm-right">@Localiser["label.search"]</div>
|
||||||
<div class="col-8 col-sm-8">
|
<div class="col-8 col-sm-8">
|
||||||
@Html.TextBox("Filter.Search", "", new { @id = "", @class = "FilterSearch sbm-input", @maxlength = "32" })
|
@Html.TextBox("Filter.Search", "", new { @type = "search", @id = "", @class = "FilterSearch sbm-input", @maxlength = "32" })
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -55,7 +55,7 @@
|
|||||||
@* Association filter - name etc. *@
|
@* Association filter - name etc. *@
|
||||||
<div class="col-4 col-sm-4 sbm-label text-left text-sm-right">@Localiser["label.search"]</div>
|
<div class="col-4 col-sm-4 sbm-label text-left text-sm-right">@Localiser["label.search"]</div>
|
||||||
<div class="col-7 col-sm-8">
|
<div class="col-7 col-sm-8">
|
||||||
@Html.TextBox("Filter.Search", "", new { @id = "", @class = "FilterSearch sbm-input", @maxlength = "32" })
|
@Html.TextBox("Filter.Search", "", new { @type = "search", @id = "", @class = "FilterSearch sbm-input", @maxlength = "32" })
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
// Ensure view is only included once in page.
|
// Ensure view is only included once in page.
|
||||||
if (!Model.RegisterView("Views/Association/Panel-AssociationSelect")) return;
|
if (!Model.RegisterView("Views/Association/Panel-AssociationSelect")) return;
|
||||||
Model.AdditionalFiles_JS.Add("js/sbm-assoc.js");
|
Model.AdditionalFiles_JS.Add("js/sbm-assoc.js");
|
||||||
|
Model_Association ModelAssociation = Model as Model_Association;
|
||||||
}
|
}
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
@@ -26,14 +27,15 @@
|
|||||||
@* Association type *@
|
@* Association type *@
|
||||||
<div class="col-4 col-sm-4 sbm-label text-left text-sm-right">@Localiser["label.type"]</div>
|
<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">
|
<div class="col-8 col-sm-8">
|
||||||
@Html.DropDownList("Filter.AssociationType", Model.GetAssociationTypeCodesForFilterDropdown(), @Localiser["label.any"], new { @id = "", @class = "FilterAssociationType sbm-select" })
|
@Html.Hidden("Filter.AssociationType", ModelAssociation?.Filter.AssociationType, new { @id = "", @class = "FilterAssociationType sbm-input" })
|
||||||
|
@Html.DropDownList("Filter.AssociationType", Model.GetAssociationTypeCodesForFilterDropdown(), null, new { @id = "", @class = "FilterAssociationType sbm-select" })
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-4 row pb4">
|
<div class="col-sm-4 row pb4">
|
||||||
@* Association filter - name etc. *@
|
@* Association filter - name etc. *@
|
||||||
<div class="col-4 col-sm-4 sbm-label text-left text-sm-right">@Localiser["label.search"]</div>
|
<div class="col-4 col-sm-4 sbm-label text-left text-sm-right">@Localiser["label.search"]</div>
|
||||||
<div class="col-8 col-sm-8">
|
<div class="col-8 col-sm-8">
|
||||||
@Html.TextBox("Filter.Search", "", new { @id = "", @class = "FilterSearch sbm-input", @maxlength = "32" })
|
@Html.TextBox("Filter.Search", "", new { @type = "search", @id = "", @class = "FilterSearch sbm-input", @maxlength = "32" })
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -49,7 +49,7 @@
|
|||||||
<div class="col-md-6 row">
|
<div class="col-md-6 row">
|
||||||
<div class="col-sm-5 sbm-label text-left text-sm-right">@Localiser["label.search"]</div>
|
<div class="col-sm-5 sbm-label text-left text-sm-right">@Localiser["label.search"]</div>
|
||||||
<div class="col-sm-7">
|
<div class="col-sm-7">
|
||||||
@Html.TextBoxFor(model => model.Filter.Search, new { @id = "", @class = "FilterSearch", @maxlength = "32" })
|
@Html.TextBoxFor(model => model.Filter.Search, new { @type = "search", @id = "", @class = "FilterSearch", @maxlength = "32" })
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -42,7 +42,7 @@
|
|||||||
<div class="row pb4">
|
<div class="row pb4">
|
||||||
<div class="col-sm-5 sbm-label text-left text-sm-right">@Localiser["label.search"]</div>
|
<div class="col-sm-5 sbm-label text-left text-sm-right">@Localiser["label.search"]</div>
|
||||||
<div class="col-sm-7">
|
<div class="col-sm-7">
|
||||||
@Html.TextBoxFor(model => model.Filter.Search, new { @id = "", @class = "FilterSearch", @maxlength = "32" })
|
@Html.TextBoxFor(model => model.Filter.Search, new { @type = "search", @id = "", @class = "FilterSearch", @maxlength = "32" })
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
/* Commodity - Maintain panel */
|
/* Commodity - Maintain panel */
|
||||||
// Ensure view is only included once in page.
|
// Ensure view is only included once in page.
|
||||||
if (!Model.RegisterView("Views/Commodity/Panel-CommodityMaintain")) return;
|
if (!Model.RegisterView("Views/Commodity/Panel-CommodityMaintain")) return;
|
||||||
Model.AdditionalFiles_JS.Add("js/sbm-commodity.js");
|
Model.AdditionalFiles_JS.Add("js/sbm-cmd.js");
|
||||||
}
|
}
|
||||||
|
|
||||||
<div class="sbm-panel Commodities fullheight">
|
<div class="sbm-panel Commodities fullheight">
|
||||||
@@ -24,7 +24,7 @@
|
|||||||
<div class="sbm-panel-header">
|
<div class="sbm-panel-header">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col"><partial name="~/Views/Common/ResultsPaging.cshtml" /></div>
|
<div class="col"><partial name="~/Views/Common/ResultsPaging.cshtml" /></div>
|
||||||
<div class="fixed center"><div class="sbm-panel-caption">@Localiser["caption.commodities"]</div></div>
|
<div class="fixed center"><div class="sbm-panel-caption">@Localiser["label.commodities"]</div></div>
|
||||||
<div class="col right">
|
<div class="col right">
|
||||||
@* Burger menu *@
|
@* Burger menu *@
|
||||||
<ul class="nav navbar-nav navbar-dark navbar-right sbm-burger">
|
<ul class="nav navbar-nav navbar-dark navbar-right sbm-burger">
|
||||||
@@ -51,7 +51,7 @@
|
|||||||
@* Commodity filter - code, description etc *@
|
@* Commodity filter - code, description etc *@
|
||||||
<div class="col-4 col-sm-4 sbm-label text-left text-sm-right">@Localiser["label.search"]</div>
|
<div class="col-4 col-sm-4 sbm-label text-left text-sm-right">@Localiser["label.search"]</div>
|
||||||
<div class="col-7 col-sm-8">
|
<div class="col-7 col-sm-8">
|
||||||
@Html.TextBox("Filter.Search", "", new { @id = "", @class = "FilterSearch sbm-input", @maxlength = "32" })
|
@Html.TextBox("Filter.Search", "", new { @type = "search", @id = "", @class = "FilterSearch sbm-input", @maxlength = "32" })
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-4 row pb4">
|
<div class="col-sm-4 row pb4">
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
/* Commodity - Select panel */
|
/* Commodity - Select panel */
|
||||||
// Ensure view is only included once in page.
|
// Ensure view is only included once in page.
|
||||||
if (!Model.RegisterView("Views/Commodity/Panel-CommoditySelect")) return;
|
if (!Model.RegisterView("Views/Commodity/Panel-CommoditySelect")) return;
|
||||||
Model.AdditionalFiles_JS.Add("js/sbm-commodity.js");
|
Model.AdditionalFiles_JS.Add("js/sbm-cmd.js");
|
||||||
}
|
}
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
@@ -31,7 +31,7 @@
|
|||||||
@* Commodity filter - name etc. *@
|
@* Commodity filter - name etc. *@
|
||||||
<div class="col-4 col-sm-4 sbm-label text-left text-sm-right">@Localiser["label.search"]</div>
|
<div class="col-4 col-sm-4 sbm-label text-left text-sm-right">@Localiser["label.search"]</div>
|
||||||
<div class="col-8 col-sm-8">
|
<div class="col-8 col-sm-8">
|
||||||
@Html.TextBox("Filter.Search", "", new { @id = "", @class = "FilterSearch sbm-input", @maxlength = "32" })
|
@Html.TextBox("Filter.Search", "", new { @type = "search", @id = "", @class = "FilterSearch sbm-input", @maxlength = "32" })
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -54,7 +54,7 @@
|
|||||||
@* Contact filter - name etc. *@
|
@* Contact filter - name etc. *@
|
||||||
<div class="col-4 col-sm-4 sbm-label text-left text-sm-right">@Localiser["label.search"]</div>
|
<div class="col-4 col-sm-4 sbm-label text-left text-sm-right">@Localiser["label.search"]</div>
|
||||||
<div class="col-7 col-sm-8">
|
<div class="col-7 col-sm-8">
|
||||||
@Html.TextBox("Filter.Search", "", new { @id = "", @class = "FilterSearch sbm-input", @maxlength = "32" })
|
@Html.TextBox("Filter.Search", "", new { @type = "search", @id = "", @class = "FilterSearch sbm-input", @maxlength = "32" })
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
@* Contact filter - name etc. *@
|
@* Contact filter - name etc. *@
|
||||||
<div class="col-4 col-sm-4 sbm-label text-left text-sm-right">@Localiser["label.search"]</div>
|
<div class="col-4 col-sm-4 sbm-label text-left text-sm-right">@Localiser["label.search"]</div>
|
||||||
<div class="col-8 col-sm-8">
|
<div class="col-8 col-sm-8">
|
||||||
@Html.TextBox("Filter.Search", "", new { @id = "", @class = "FilterSearch sbm-input", @maxlength = "32" })
|
@Html.TextBox("Filter.Search", "", new { @type = "search", @id = "", @class = "FilterSearch sbm-input", @maxlength = "32" })
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -136,6 +136,10 @@ else
|
|||||||
<td class="">@Localiser["label.commodities"]</td>
|
<td class="">@Localiser["label.commodities"]</td>
|
||||||
<td class="center">@Model.GetCommodityCount()</td>
|
<td class="center">@Model.GetCommodityCount()</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr class="sbm-action-text" onclick="sbm.goToPage('Transactions/SalesOrder')">
|
||||||
|
<td class="">@Localiser["label.sales.orders"]</td>
|
||||||
|
<td class="center">@Model.GetSalesOrderCount()</td>
|
||||||
|
</tr>
|
||||||
@if (Model.GetInternals().SessionConsole.AllowOption(Sbm.ConfigOption.Assets))
|
@if (Model.GetInternals().SessionConsole.AllowOption(Sbm.ConfigOption.Assets))
|
||||||
{
|
{
|
||||||
<tr class="sbm-action-text" onclick="sbm.goToPage('Assets/Asset')">
|
<tr class="sbm-action-text" onclick="sbm.goToPage('Assets/Asset')">
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
@model Model_Transaction
|
||||||
|
@inject SbmLocaliser Localiser
|
||||||
|
@{
|
||||||
|
/* Transaction page. */
|
||||||
|
ViewData["Title"] = "Transactions";
|
||||||
|
}
|
||||||
|
|
||||||
|
<partial name="Panel-TransactionMaintain.cshtml" />
|
||||||
@@ -0,0 +1,265 @@
|
|||||||
|
@* View is decoupled from Transaction model as it may be included in other views, eg. Associations. *@
|
||||||
|
@model SbmModel_Portal
|
||||||
|
@inject SbmLocaliser Localiser
|
||||||
|
@{
|
||||||
|
/* Transaction - Dialog panel */
|
||||||
|
// Ensure view is only included once in page.
|
||||||
|
if (!Model.RegisterView("Views/Transaction/Panel-TransactionDialog")) return;
|
||||||
|
}
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
sbm.dlg.title.createTransaction = '@Localiser.GetJavascriptText("caption.transaction.create")';
|
||||||
|
sbm.dlg.title.updateTransaction = '@Localiser.GetJavascriptText("caption.transaction.update")';
|
||||||
|
</script>
|
||||||
|
|
||||||
|
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmTransactionId", @class = "sbm-form" }))
|
||||||
|
{
|
||||||
|
@Html.Hidden("Transaction.Id", "", new { @id = "", @class = "TransactionId" })
|
||||||
|
@Html.Hidden("Transaction.DataGroups", "", new { @id = "", @class = "TransactionDataGroups" })
|
||||||
|
}
|
||||||
|
|
||||||
|
<div id="dlgTransaction" class="sbm-dialog" title="">
|
||||||
|
|
||||||
|
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmTransaction", @class = "sbm-form", @onSubmit = "return false;" }))
|
||||||
|
{
|
||||||
|
@Html.Hidden("Transaction.Id", "", new { @id = "", @class = "TransactionId sbm-input" })
|
||||||
|
@Html.Hidden("Transaction.Exists", "", new { @id = "", @class = "TransactionExists sbm-input" })
|
||||||
|
<div class="spacer2"></div>
|
||||||
|
|
||||||
|
@* Association *@
|
||||||
|
<div class="sbm-form-control @Model_Transaction.GetFieldName(Model_Transaction.ItemField.AssociationName)">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-2">
|
||||||
|
<div class="sbm-label">
|
||||||
|
<label for="ifTransactionAssociationTarget"><span>@Localiser["label.association"]</span><span class="required"> *</span></label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm">
|
||||||
|
<div class="sbm-control row">
|
||||||
|
<div class="col">
|
||||||
|
@Html.Hidden("Transaction.AssociationId", "", new { @id = "", @class = "TransactionAssociationId sbm-input" })
|
||||||
|
<input type="text" name="Transaction.Association" id="ifTransactionAssociation" readonly="readonly" class="TransactionAssociation sbm-input sbm-auto-val" maxlength=@Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.Affiliate_Name) />
|
||||||
|
</div>
|
||||||
|
<div class="fixed">
|
||||||
|
<div class="sbm-action AssociationTargetSearch"><img src="~/img/action/search24.png" alt="" title="" /></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="sbm-message"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-6">
|
||||||
|
|
||||||
|
@* Reference *@
|
||||||
|
<div class="sbm-form-control @Model_Transaction.GetFieldName(Model_Transaction.ItemField.Reference)">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-4">
|
||||||
|
<div class="sbm-label">
|
||||||
|
<label for="ifTransactionReference"><span>@Localiser["label.reference"]</span></label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm">
|
||||||
|
<div class="sbm-control">
|
||||||
|
@Html.TextBox("Transaction.Reference", "", new { @id = "ifTransactionReference", @class = "TransactionReference sbm-input upper sbm-auto-val", @readonly = true, @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_Ref) })
|
||||||
|
</div>
|
||||||
|
<div class="sbm-message"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="col-6">
|
||||||
|
|
||||||
|
@* External Reference *@
|
||||||
|
<div class="sbm-form-control @Model_Transaction.GetFieldName(Model_Transaction.ItemField.ReferenceExt)">
|
||||||
|
<div class="row pl-3">
|
||||||
|
<div class="col-sm-4">
|
||||||
|
<div class="sbm-label">
|
||||||
|
<label for="ifTransactionReferenceExt"><span>@Localiser["label.reference.external"]</span></label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm">
|
||||||
|
<div class="sbm-control">
|
||||||
|
@Html.TextBox("Transaction.TransactionReferenceExt", "", new { @id = "ifTransactionReferenceExt", @class = "TransactionReferenceExt sbm-input upper sbm-auto-val" })
|
||||||
|
</div>
|
||||||
|
<div class="sbm-message"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@* Narrative *@
|
||||||
|
<div class="sbm-form-control @Model_Transaction.GetFieldName(Model_Transaction.ItemField.DescBrief)">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-2">
|
||||||
|
<div class="sbm-label">
|
||||||
|
<label for="ifTransactionDesc"><span>@Localiser["label.narrative"]</span><span class="required"> *</span></label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm">
|
||||||
|
<div class="sbm-control">
|
||||||
|
@Html.TextBox("Transaction.DescBrief", "", new { @id = "ifTransactionDesc", @class = "TransactionDesc sbm-input sbm-auto-val", @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_DescBrief) })
|
||||||
|
</div>
|
||||||
|
<div class="sbm-message"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-6">
|
||||||
|
|
||||||
|
@* Transaction status *@
|
||||||
|
<div class="sbm-form-control @Model_Transaction.GetFieldName(Model_Transaction.ItemField.Status)">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-4">
|
||||||
|
<div class="sbm-label">
|
||||||
|
<label for="cbTransactionStatus"><span>@Localiser["label.status"]</span><span class="required"> *</span></label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm">
|
||||||
|
<div class="sbm-control">
|
||||||
|
<select id="cbTransactionStatus" class="TransactionStatus sbm-select sbm-auto-val" name="Transaction.StatusCode"></select>
|
||||||
|
</div>
|
||||||
|
<div class="sbm-message"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="col-6">
|
||||||
|
|
||||||
|
@* Contact *@
|
||||||
|
<div class="sbm-form-control @Model_Transaction.GetFieldName(Model_Transaction.ItemField.ContactName)">
|
||||||
|
<div class="row pl-3">
|
||||||
|
<div class="col-sm-4">
|
||||||
|
<div class="sbm-label">
|
||||||
|
<label for="ifTransactionContactName"><span>@Localiser["label.contact"]</span></label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm">
|
||||||
|
<div class="sbm-control">
|
||||||
|
@Html.TextBox("Transaction.ContactName", "", new { @id = "ifTransactionContactName", @class = "TransactionContactName sbm-input sbm-auto-val", @maxlen = Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_ContactName) })
|
||||||
|
</div>
|
||||||
|
<div class="sbm-message"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-6">
|
||||||
|
|
||||||
|
@* Raiased date *@
|
||||||
|
<div class="sbm-form-control @Model_Transaction.GetFieldName(Model_Transaction.ItemField.Raised)">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-4">
|
||||||
|
<div class="sbm-label">
|
||||||
|
<label for="ifTransactionRaised"><span>@Localiser["label.raised"]</span><span class="required"> *</span></label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm">
|
||||||
|
<div class="sbm-control">
|
||||||
|
@Html.TextBox("Transaction.Raised", "", new { @id = "ifTransactionRaised", @class = "TransactionRaised sbm-input sbm-calendar sbm-auto-val", @maxlen = 10 })
|
||||||
|
</div>
|
||||||
|
<div class="sbm-message"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="col-6">
|
||||||
|
|
||||||
|
@* Raised by *@
|
||||||
|
<div class="sbm-form-control @Model_Transaction.GetFieldName(Model_Transaction.ItemField.RaisedBy)">
|
||||||
|
<div class="row pl-3">
|
||||||
|
<div class="col-sm-4">
|
||||||
|
<div class="sbm-label">
|
||||||
|
<label for="ifTransactionRaisedBy"><span>@Localiser["label.raised.by"]</span></label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm">
|
||||||
|
<div class="sbm-control">
|
||||||
|
@Html.TextBox("Transaction.RaisedBy", "", new { @id = "ifTransactionRaisedBy", @class = "TransactionRaisedBy sbm-input sbm-auto-val", @maxlen = Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_RaisedBy) })
|
||||||
|
</div>
|
||||||
|
<div class="sbm-message"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-6">
|
||||||
|
|
||||||
|
@* In Progress date *@
|
||||||
|
<div class="sbm-form-control @Model_Transaction.GetFieldName(Model_Transaction.ItemField.InProgress)">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-4">
|
||||||
|
<div class="sbm-label">
|
||||||
|
<label for="ifTransactionInProgress"><span>@Localiser["label.in.progress"]</span></label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm">
|
||||||
|
<div class="sbm-control">
|
||||||
|
@Html.TextBox("Transaction.InProgress", "", new { @id = "ifTransactionInProgress", @class = "TransactionInProgress sbm-input sbm-calendar sbm-auto-val", @maxlen = 10 })
|
||||||
|
</div>
|
||||||
|
<div class="sbm-message"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="col-6">
|
||||||
|
|
||||||
|
@* Raised by *@
|
||||||
|
<div class="sbm-form-control @Model_Transaction.GetFieldName(Model_Transaction.ItemField.Closed)">
|
||||||
|
<div class="row pl-3">
|
||||||
|
<div class="col-sm-4">
|
||||||
|
<div class="sbm-label">
|
||||||
|
<label for="ifTransactionClosed"><span>@Localiser["label.closed"]</span></label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm">
|
||||||
|
<div class="sbm-control">
|
||||||
|
@Html.TextBox("Transaction.Closed", "", new { @id = "ifTransactionClosed", @class = "TransactionClosed sbm-input sbm-calendar sbm-auto-val", @maxlen = 10 })
|
||||||
|
</div>
|
||||||
|
<div class="sbm-message"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@* Transaction Notes *@
|
||||||
|
<div class="sbm-form-control @Model_Transaction.GetFieldName(Model_Transaction.ItemField.Notes)">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-2">
|
||||||
|
<div class="sbm-label">
|
||||||
|
<label for="ifTransactionNotes"><span>@Localiser["label.notes"]</span></label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm">
|
||||||
|
<div class="sbm-control">
|
||||||
|
@Html.TextArea("Transaction.Notes", "", new { @id = "ifTransactionNotes", @class = "TransactionNotes sbm-textarea sbm-auto-val", @rows = "3", @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.Transaction_Notes) })
|
||||||
|
</div>
|
||||||
|
<div class="sbm-message"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
@* Association panels. *@
|
||||||
|
<partial name="~/Views/Association/Panel-AssociationSelect.cshtml" />
|
||||||
|
<partial name="~/Views/Association/Panel-AssociationDialog.cshtml" />
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
@* View is decoupled from Transaction model as it may be included in other views, eg. Associations. *@
|
||||||
|
@model SbmModel_Portal
|
||||||
|
@inject SbmLocaliser Localiser
|
||||||
|
@{
|
||||||
|
/* Transaction - List panel */
|
||||||
|
/* NB Can potentially appear more than once on a page. */
|
||||||
|
}
|
||||||
|
|
||||||
|
@* Item list *@
|
||||||
|
<div class="sbm-panel-item-table sbm-flex">
|
||||||
|
<table class="sbm-item-list">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="@Model_Transaction.GetFieldName(Model_Transaction.ItemField.Reference) width5pc center">@Localiser["label.reference"]</th>
|
||||||
|
<th class="@Model_Transaction.GetFieldName(Model_Transaction.ItemField.Type) width5pc center">@Localiser["label.type"]</th>
|
||||||
|
<th class="@Model_Transaction.GetFieldName(Model_Transaction.ItemField.AssociationName) width15pc">@Localiser["label.association"]</th>
|
||||||
|
<th class="@Model_Transaction.GetFieldName(Model_Transaction.ItemField.DescBrief) width10pc d-none d-lg-table-cell">@Localiser["label.narrative"]</th>
|
||||||
|
<th class="@Model_Transaction.GetFieldName(Model_Transaction.ItemField.RaisedFmt) width5pc center nowrap">@Localiser["label.items"]</th>
|
||||||
|
@* Status dates. *@
|
||||||
|
<th class="@Model_Transaction.GetFieldName(Model_Transaction.ItemField.RaisedFmt) width5pc center nowrap">@Localiser["label.raised"]</th>
|
||||||
|
<th class="@Model_Transaction.GetFieldName(Model_Transaction.ItemField.RequiredFmt) width5pc center nowrap">@Localiser["label.required"]</th>
|
||||||
|
<th class="@Model_Transaction.GetFieldName(Model_Transaction.ItemField.InProgressFmt) width5pc center nowrap">@Localiser["label.in.progress"]</th>
|
||||||
|
<th class="@Model_Transaction.GetFieldName(Model_Transaction.ItemField.ClosedFmt) width5pc center nowrap">@Localiser["label.closed"]</th>
|
||||||
|
@if (Model.UserCanViewFinancials())
|
||||||
|
{
|
||||||
|
<th class="@Model_Transaction.GetFieldName(Model_Transaction.ItemField.AmountNet) width5pc right">@Localiser["label.amount.net"]</th>
|
||||||
|
<th class="@Model_Transaction.GetFieldName(Model_Transaction.ItemField.AmountTax) width5pc right">@Localiser["label.amount.tax"]</th>
|
||||||
|
}
|
||||||
|
<th class="@Model_Transaction.GetFieldName(Model_Transaction.ItemField.Notes) width15pc d-none d-lg-table-cell">@Localiser["label.notes"]</th>
|
||||||
|
<th class="@Model_Transaction.GetFieldName(Model_Transaction.ItemField.Status) width5pc center">@Localiser["label.status"]</th>
|
||||||
|
<th class="@Model_Transaction.GetFieldName(Model_Transaction.ItemField.Actions) width5pc right" style="width:2%;"></th>
|
||||||
|
</tr>
|
||||||
|
<tr><td colspan="6"><div class="sbm-panel-messages"></div></td></tr>
|
||||||
|
</thead>
|
||||||
|
<tbody></tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@* Element templates *@
|
||||||
|
<div class="sbm-panel-item-template">
|
||||||
|
|
||||||
|
@* List burger dropdown template - ul is ignored *@
|
||||||
|
<ul class="sbm-dropdown-menu TransactionList">
|
||||||
|
<li class="sbm-dropdown-item sbm-action"><div class="sbm-label">XXX</div></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
@* Item row template - table is ignored. *@
|
||||||
|
<table>
|
||||||
|
<tr class="sbm-row-item Transaction">
|
||||||
|
<td class="@Model_Transaction.GetFieldName(Model_Transaction.ItemField.Reference) center nowrap"></td>
|
||||||
|
<td class="@Model_Transaction.GetFieldName(Model_Transaction.ItemField.Type) center nowrap"></td>
|
||||||
|
<td class="@Model_Transaction.GetFieldName(Model_Transaction.ItemField.AssociationName)"></td>
|
||||||
|
<td class="@Model_Transaction.GetFieldName(Model_Transaction.ItemField.DescBrief) d-none d-lg-table-cell"></td>
|
||||||
|
<td class="@Model_Transaction.GetFieldName(Model_Transaction.ItemField.ItemCount) center nowrap"></td>
|
||||||
|
@* Status dates. *@
|
||||||
|
<td class="@Model_Transaction.GetFieldName(Model_Transaction.ItemField.RaisedFmt) center nowrap"></td>
|
||||||
|
<td class="@Model_Transaction.GetFieldName(Model_Transaction.ItemField.RequiredFmt) center nowrap"></td>
|
||||||
|
<td class="@Model_Transaction.GetFieldName(Model_Transaction.ItemField.InProgressFmt) center nowrap"></td>
|
||||||
|
<td class="@Model_Transaction.GetFieldName(Model_Transaction.ItemField.ClosedFmt) center nowrap"></td>
|
||||||
|
@if (Model.UserCanViewFinancials())
|
||||||
|
{
|
||||||
|
<td class="@Model_Transaction.GetFieldName(Model_Transaction.ItemField.AmountNet) right nowrap"></td>
|
||||||
|
<td class="@Model_Transaction.GetFieldName(Model_Transaction.ItemField.AmountTax) right nowrap"></td>
|
||||||
|
}
|
||||||
|
<td class="@Model_Transaction.GetFieldName(Model_Transaction.ItemField.Notes) d-none d-lg-table-cell"></td>
|
||||||
|
<td class="@Model_Transaction.GetFieldName(Model_Transaction.ItemField.Status) center nowrap"></td>
|
||||||
|
<td class="@Model_Transaction.GetFieldName(Model_Transaction.ItemField.Actions)">
|
||||||
|
<div class="right">
|
||||||
|
@* Burger menu *@
|
||||||
|
<ul class="nav navbar-nav navbar-light navbar-right sbm-burger">
|
||||||
|
<li class="dropdown-toggle caret-off">
|
||||||
|
<a href="#" class="dropdown" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><span class="sbm-ellipsis-dot"></span><span class="sbm-ellipsis-dot"></span><span class="sbm-ellipsis-dot"></span></a>
|
||||||
|
<ul class="dropdown-menu dropdown-menu-right sbm-dropdown-menu">@* Menu items will be inserted here. *@</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
@* Item burger dropdown template - ul is ignored *@
|
||||||
|
<ul class="sbm-dropdown-menu Transaction">
|
||||||
|
<li class="sbm-dropdown-item sbm-action"><div class="sbm-label">XXX</div></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
@* View is decoupled from Transaction model as it may be included in other views, eg. Associations. *@
|
||||||
|
@model SbmModel_Portal
|
||||||
|
@inject SbmLocaliser Localiser
|
||||||
|
@{
|
||||||
|
/* Transaction - Maintain panel */
|
||||||
|
// Ensure view is only included once in page.
|
||||||
|
if (!Model.RegisterView("Views/Transaction/Panel-TransactionMaintain")) return;
|
||||||
|
Model.AdditionalFiles_JS.Add("js/sbm-trn.js");
|
||||||
|
Model_Transaction ModelTransaction = Model as Model_Transaction;
|
||||||
|
}
|
||||||
|
|
||||||
|
<div class="sbm-panel Transactions fullheight">
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="sbm-panel-data sbm-flex">
|
||||||
|
|
||||||
|
@* Filter form - wrap header to include paging controls. *@
|
||||||
|
@using (@Html.BeginForm(FormMethod.Post, new { @id = "", @class = "frmTransactionFilter sbm-form", @onSubmit = "return false;" }))
|
||||||
|
{
|
||||||
|
@Html.Hidden("Filter.Mode", Model_Transaction.ViewMode.Maintain, new { @id = "" })
|
||||||
|
|
||||||
|
@* Header - Page caption, paging controls, actions. *@
|
||||||
|
<div class="sbm-panel-header">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col"><partial name="~/Views/Common/ResultsPaging.cshtml" /></div>
|
||||||
|
<div class="fixed center"><div class="sbm-panel-caption">@Localiser["label.transactions"]</div></div>
|
||||||
|
<div class="col right">
|
||||||
|
@* Burger menu *@
|
||||||
|
<ul class="nav navbar-nav navbar-dark navbar-right sbm-burger">
|
||||||
|
<li class="dropdown-toggle caret-off">
|
||||||
|
<a href="#" class="dropdown" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><span class="navbar-toggler-icon"></span></a>
|
||||||
|
<ul class="dropdown-menu dropdown-menu-right sbm-dropdown-menu">@* Menu items will be inserted here. *@</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@* Filter Panel *@
|
||||||
|
<div class="sbm-panel-filter">
|
||||||
|
<div class="row">
|
||||||
|
@if (ModelTransaction?.GetFilterTransactionType() > 0)
|
||||||
|
{
|
||||||
|
@Html.Hidden("Filter.TransactionType", ModelTransaction.Filter.TransactionType, new { @id = "", @class = "FilterTransactionType" })
|
||||||
|
<input type="hidden" class="FilterAssociationType" value="@ModelTransaction.GetFilterAssociationTypeCode()" />
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<div class="col-sm-4 row pb4">
|
||||||
|
@* 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" })
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
<div class="col-sm-4 row pb4">
|
||||||
|
@* 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" })
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-4 row pb4">
|
||||||
|
@* Transaction filter - code, description etc *@
|
||||||
|
<div class="col-4 col-sm-4 sbm-label text-left text-sm-right">@Localiser["label.search"]</div>
|
||||||
|
<div class="col-7 col-sm-8">
|
||||||
|
@Html.TextBox("Filter.Search", "", new { @type = "search", @id = "", @class = "FilterSearch sbm-input", @maxlength = "32" })
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-4 row pb4">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
<partial name="Panel-TransactionList.cshtml" />
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<partial name="Panel-TransactionDialog.cshtml" />
|
||||||
|
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
@* View is decoupled from Transaction model as it may be included in other views, eg. Associations. *@
|
||||||
|
@model SbmModel_Portal
|
||||||
|
@inject SbmLocaliser Localiser
|
||||||
|
@{
|
||||||
|
/* Transaction - Select panel */
|
||||||
|
// Ensure view is only included once in page.
|
||||||
|
if (!Model.RegisterView("Views/Transaction/Panel-TransactionSelect")) return;
|
||||||
|
Model.AdditionalFiles_JS.Add("js/sbm-trn.js");
|
||||||
|
}
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div id="dlgTransactionSelect" class="sbm-dialog sbm-flex sbm-no-padding" title="@Localiser["caption.contact.select"]">
|
||||||
|
|
||||||
|
@using (@Html.BeginForm(FormMethod.Post, new { @id = "", @class = "frmTransactionFilter sbm-form", @onSubmit = "return false;" }))
|
||||||
|
{
|
||||||
|
@Html.Hidden("Filter.Mode", Model_Transaction.ViewMode.Search, new { @id = "" })
|
||||||
|
|
||||||
|
@* Filter Panel *@
|
||||||
|
<div class="sbm-panel-filter">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-4 row pb4">
|
||||||
|
@* 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" })
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-4 row pb4">
|
||||||
|
@* Transaction filter - name etc. *@
|
||||||
|
<div class="col-4 col-sm-4 sbm-label text-left text-sm-right">@Localiser["label.search"]</div>
|
||||||
|
<div class="col-8 col-sm-8">
|
||||||
|
@Html.TextBox("Filter.Search", "", new { @type = "search", @id = "", @class = "FilterSearch sbm-input", @maxlength = "32" })
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
<partial name="Panel-TransactionList.cshtml" />
|
||||||
|
|
||||||
|
</div>
|
||||||
@@ -43,7 +43,7 @@
|
|||||||
<div class="row pb4">
|
<div class="row pb4">
|
||||||
<div class="col-sm-5 sbm-label text-left text-sm-right">@Localiser["label.search"]</div>
|
<div class="col-sm-5 sbm-label text-left text-sm-right">@Localiser["label.search"]</div>
|
||||||
<div class="col-sm-7">
|
<div class="col-sm-7">
|
||||||
@Html.TextBoxFor(model => model.Filter.Search, new { @id = "", @class = "FilterSearch", @maxlength = "32" })
|
@Html.TextBoxFor(model => model.Filter.Search, new { @type = "search", @id = "", @class = "FilterSearch", @maxlength = "32" })
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -42,7 +42,7 @@
|
|||||||
<div class="row pb4">
|
<div class="row pb4">
|
||||||
<div class="col-sm-5 sbm-label text-left text-sm-right">@Localiser["label.search"]</div>
|
<div class="col-sm-5 sbm-label text-left text-sm-right">@Localiser["label.search"]</div>
|
||||||
<div class="col-sm-7">
|
<div class="col-sm-7">
|
||||||
@Html.TextBoxFor(model => model.Filter.Search, new { @id = "", @class = "FilterSearch", @maxlength = "32" })
|
@Html.TextBoxFor(model => model.Filter.Search, new { @type = "search", @id = "", @class = "FilterSearch", @maxlength = "32" })
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
@using Sarand.BusinessMgr.Web.Portal.Models.Security
|
@using Sarand.BusinessMgr.Web.Portal.Models.Security
|
||||||
@using Sarand.BusinessMgr.Web.Portal.Models.Contacts
|
@using Sarand.BusinessMgr.Web.Portal.Models.Contacts
|
||||||
@using Sarand.BusinessMgr.Web.Portal.Models.Commodities
|
@using Sarand.BusinessMgr.Web.Portal.Models.Commodities
|
||||||
|
@using Sarand.BusinessMgr.Web.Portal.Models.Transactions
|
||||||
@using Sarand.BusinessMgr.Web.Portal.Models.Assets
|
@using Sarand.BusinessMgr.Web.Portal.Models.Assets
|
||||||
@using Sarand.BusinessMgr.Web.Portal.Models.Vehicles
|
@using Sarand.BusinessMgr.Web.Portal.Models.Vehicles
|
||||||
@using Sarand.BusinessMgr.Web.Portal.Models.Codes
|
@using Sarand.BusinessMgr.Web.Portal.Models.Codes
|
||||||
|
|||||||
@@ -33,12 +33,12 @@
|
|||||||
|
|
||||||
.Contacts .sbm-panel-data
|
.Contacts .sbm-panel-data
|
||||||
{
|
{
|
||||||
--color-panel-data: var(--color-ForestGreen);
|
--color-panel-data: var(--color-KellyGreen);
|
||||||
}
|
}
|
||||||
|
|
||||||
.Associations .sbm-panel-data
|
.Associations .sbm-panel-data
|
||||||
{
|
{
|
||||||
--color-panel-data: var(--color-Iris);
|
--color-panel-data: var(--color-ForestGreen);
|
||||||
}
|
}
|
||||||
|
|
||||||
.Commodities .sbm-panel-data
|
.Commodities .sbm-panel-data
|
||||||
@@ -56,6 +56,11 @@
|
|||||||
--color-panel-data: var(--color-Iris);
|
--color-panel-data: var(--color-Iris);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.Transactions .sbm-panel-data
|
||||||
|
{
|
||||||
|
--color-panel-data: var(--color-RoyalBlue);
|
||||||
|
}
|
||||||
|
|
||||||
/* Dialogs */
|
/* Dialogs */
|
||||||
|
|
||||||
:root
|
:root
|
||||||
@@ -70,12 +75,12 @@
|
|||||||
|
|
||||||
.ui-dialog.sbm-Contact
|
.ui-dialog.sbm-Contact
|
||||||
{
|
{
|
||||||
--color-dialog: var(--color-ForestGreen);
|
--color-dialog: var(--color-KellyGreen);
|
||||||
}
|
}
|
||||||
|
|
||||||
.ui-dialog.sbm-Association
|
.ui-dialog.sbm-Association
|
||||||
{
|
{
|
||||||
--color-dialog: var(--color-Iris);
|
--color-dialog: var(--color-ForestGreen);
|
||||||
}
|
}
|
||||||
|
|
||||||
.ui-dialog.sbm-Commodity
|
.ui-dialog.sbm-Commodity
|
||||||
@@ -93,4 +98,9 @@
|
|||||||
--color-dialog: var(--color-Iris);
|
--color-dialog: var(--color-Iris);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.ui-dialog.sbm-Transaction
|
||||||
|
{
|
||||||
|
--color-dialog: var(--color-RoyalBlue);
|
||||||
|
}
|
||||||
|
|
||||||
/* The End */
|
/* The End */
|
||||||
|
|||||||
@@ -72,6 +72,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.sbm-panel-filter input[type="text"],
|
.sbm-panel-filter input[type="text"],
|
||||||
|
.sbm-panel-filter input[type="email"],
|
||||||
|
.sbm-panel-filter input[type="search"],
|
||||||
.sbm-panel-filter textarea,
|
.sbm-panel-filter textarea,
|
||||||
.sbm-panel-filter select
|
.sbm-panel-filter select
|
||||||
{
|
{
|
||||||
@@ -100,6 +102,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.sbm-panel-data .sbm-content input[type="text"],
|
.sbm-panel-data .sbm-content input[type="text"],
|
||||||
|
.sbm-panel-data .sbm-content input[type="email"],
|
||||||
|
.sbm-panel-data .sbm-content input[type="search"],
|
||||||
.sbm-panel-data .sbm-content select
|
.sbm-panel-data .sbm-content select
|
||||||
{
|
{
|
||||||
min-width: 75%;
|
min-width: 75%;
|
||||||
|
|||||||
@@ -412,13 +412,13 @@ a:focus
|
|||||||
{
|
{
|
||||||
border-color: var(--color-dialog);
|
border-color: var(--color-dialog);
|
||||||
margin-top: 0;
|
margin-top: 0;
|
||||||
padding: .2em 1em .2em .5em;
|
padding: .25em .5em .25em .5em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ui-dialog .ui-dialog-buttonpane button
|
.ui-dialog .ui-dialog-buttonpane button
|
||||||
{
|
{
|
||||||
min-width: 80px;
|
min-width: 80px;
|
||||||
margin: .5em .25em .5em .5em;
|
margin: .2em .25em .2em 1em;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
background-color: var(--color-dialog);
|
background-color: var(--color-dialog);
|
||||||
border-color: var(--color-dialog);
|
border-color: var(--color-dialog);
|
||||||
|
|||||||
@@ -211,8 +211,9 @@
|
|||||||
$item = ac.getItemTemplate(env);
|
$item = ac.getItemTemplate(env);
|
||||||
$('table tbody', env.$pnl.table).prepend($item).show();
|
$('table tbody', env.$pnl.table).prepend($item).show();
|
||||||
}
|
}
|
||||||
|
ac.populateItem(env, $item, item);
|
||||||
|
sbm.configureItemTable(env.data.cfgList, env.$pnl.table);
|
||||||
}
|
}
|
||||||
ac.populateItem(env, $item, item);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------
|
//--------------------------------------------------------------
|
||||||
|
|||||||
@@ -231,8 +231,9 @@
|
|||||||
$item = as.getItemTemplate(env);
|
$item = as.getItemTemplate(env);
|
||||||
$('table tbody', env.$pnl.table).prepend($item).show();
|
$('table tbody', env.$pnl.table).prepend($item).show();
|
||||||
}
|
}
|
||||||
|
as.populateItem(env, $item, item);
|
||||||
|
sbm.configureItemTable(env.data.cfgList, env.$pnl.table);
|
||||||
}
|
}
|
||||||
as.populateItem(env, $item, item);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------
|
//--------------------------------------------------------------
|
||||||
|
|||||||
@@ -10,21 +10,11 @@
|
|||||||
//--------------------------------------------------------------
|
//--------------------------------------------------------------
|
||||||
as.refreshConfig = function (env, delay)
|
as.refreshConfig = function (env, delay)
|
||||||
{
|
{
|
||||||
env.ajax.refreshConfig = env.ajax.refreshConfig || { url: sbm.url.base + 'Association/Ajax/Config', formSel: env.$frm.filter, callbackFn: function (response) { as.doRefreshConfig(env, response); } };
|
sbm.doAjaxRequest(env.ajax.refreshConfig = env.ajax.refreshConfig || { url: sbm.url.base + 'Association/Ajax/Config', formSel: env.$frm.filter, callbackFn: function (response) { as.storeConfig(env, response); } }, delay || 50);
|
||||||
sbm.doAjaxRequest(env.ajax.refreshConfig, delay || 50);
|
|
||||||
}
|
}
|
||||||
as.doRefreshConfig = function (env, response)
|
as.storeConfig = function (env, response)
|
||||||
{
|
{
|
||||||
//sbm.debug('doRefreshConfig', env, response);
|
Object.assign(env.data, response.data);
|
||||||
if (!response.success) return;
|
|
||||||
// Config.
|
|
||||||
env.mode = response.mode;
|
|
||||||
env.config = response.config;
|
|
||||||
env.configCust = response.configCust;
|
|
||||||
env.configSupp = response.configSupp;
|
|
||||||
env.data.associationTypes = response.associationTypes;
|
|
||||||
env.data.statuses = response.statuses;
|
|
||||||
env.data.defaultStatusCode = response.defaultStatusCode;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------
|
//--------------------------------------------------------------
|
||||||
@@ -36,8 +26,7 @@
|
|||||||
env.$pnl.table.find('tbody tr').remove();
|
env.$pnl.table.find('tbody tr').remove();
|
||||||
env.$pnl.msgs.hide().empty().append($('<div class="sbm-message">' + sbm.msg.dataQuerying + '</div>')).fadeIn(200);
|
env.$pnl.msgs.hide().empty().append($('<div class="sbm-message">' + sbm.msg.dataQuerying + '</div>')).fadeIn(200);
|
||||||
}
|
}
|
||||||
env.ajax.refreshResults = env.ajax.refreshResults || { url: sbm.url.base + 'Association/Ajax/List', formSel: env.$frm.filter, callbackFn: function (response) { as.doRefreshResults(env, response); } };
|
sbm.doAjaxRequest(env.ajax.refreshResults = env.ajax.refreshResults || { url: sbm.url.base + 'Association/Ajax/List', formSel: env.$frm.filter, callbackFn: function (response) { as.doRefreshResults(env, response); } }, delay || 50);
|
||||||
sbm.doAjaxRequest(env.ajax.refreshResults, delay || 50);
|
|
||||||
as.awaitingRefreshResponse = true;
|
as.awaitingRefreshResponse = true;
|
||||||
}
|
}
|
||||||
as.doRefreshResults = function (env, response)
|
as.doRefreshResults = function (env, response)
|
||||||
@@ -48,8 +37,10 @@
|
|||||||
let $table = $('table', env.$pnl.table).find('tbody tr').remove().end();
|
let $table = $('table', env.$pnl.table).find('tbody tr').remove().end();
|
||||||
sbm.refreshPaging(response, env.$frm.filter, function () { as.refreshResults(env); });
|
sbm.refreshPaging(response, env.$frm.filter, function () { as.refreshResults(env); });
|
||||||
if (!response.success) return;
|
if (!response.success) return;
|
||||||
as.doRefreshConfig(env, response);
|
as.storeConfig(env, response);
|
||||||
if (response.caption) env.$pnl.items.find('.sbm-panel-caption').text(response.caption);
|
let cfg = env.data.cfgList;
|
||||||
|
env.mode = response.mode;
|
||||||
|
if (cfg.caption) env.$pnl.items.find('.sbm-panel-caption').text(cfg.caption);
|
||||||
|
|
||||||
// Menu.
|
// Menu.
|
||||||
if (env.$pnl.bgr.length)
|
if (env.$pnl.bgr.length)
|
||||||
@@ -57,10 +48,10 @@
|
|||||||
env.$pnl.bgr.invisible();
|
env.$pnl.bgr.invisible();
|
||||||
env.$pnl.mnu.empty();
|
env.$pnl.mnu.empty();
|
||||||
env.$pnl.mnu.append(as.getFilterMenuOption(env, sbm.lbl.refresh, function () { as.refreshResults(env); }, 'sbm-refresh'));
|
env.$pnl.mnu.append(as.getFilterMenuOption(env, sbm.lbl.refresh, function () { as.refreshResults(env); }, 'sbm-refresh'));
|
||||||
if (env.config.action.allow.createCust)
|
if (env.data.cfgList.action.allow.createCust)
|
||||||
env.$pnl.mnu.append(as.getFilterMenuOption(env, sbm.lbl.createCust, function () { as.createItem(env, env.configCust, sbm.lbl.createCust); }, 'sbm-add'));
|
env.$pnl.mnu.append(as.getFilterMenuOption(env, sbm.lbl.createCust, function () { as.createItem(env, env.data.cfgCust, sbm.lbl.createCust); }, 'sbm-add'));
|
||||||
if (env.config.action.allow.createSupp)
|
if (env.data.cfgList.action.allow.createSupp)
|
||||||
env.$pnl.mnu.append(as.getFilterMenuOption(env, sbm.lbl.createSupp, function () { as.createItem(env, env.configSupp, sbm.lbl.createSupp); }, 'sbm-add'));
|
env.$pnl.mnu.append(as.getFilterMenuOption(env, sbm.lbl.createSupp, function () { as.createItem(env, env.data.cfgSupp, sbm.lbl.createSupp); }, 'sbm-add'));
|
||||||
env.$pnl.bgr.toggleVisibility(!!$('.sbm-dropdown-item', env.$pnl.mnu).length);
|
env.$pnl.bgr.toggleVisibility(!!$('.sbm-dropdown-item', env.$pnl.mnu).length);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -68,15 +59,15 @@
|
|||||||
var items = response.associations || [];
|
var items = response.associations || [];
|
||||||
if (!items.length)
|
if (!items.length)
|
||||||
return env.$pnl.msgs.append($('<div class="sbm-message">' + sbm.msg.dataNoneFound + '</div>')).fadeIn(500);
|
return env.$pnl.msgs.append($('<div class="sbm-message">' + sbm.msg.dataNoneFound + '</div>')).fadeIn(500);
|
||||||
for (let itemIdx = 0; itemIdx < items.length; itemIdx++)
|
for (const item of items)
|
||||||
$table.append(as.populateItem(env, as.getItemTemplate(env), items[itemIdx]));
|
$table.append(as.populateItem(env, as.getItemTemplate(env), item));
|
||||||
sbm.configureItemTable(env.config, $table);
|
sbm.configureItemTable(env.data.cfgList, $table);
|
||||||
}
|
}
|
||||||
as.populateItem = function (env, $item, item)
|
as.populateItem = function (env, $item, item)
|
||||||
{
|
{
|
||||||
if (!item) return $item;
|
if (!item) return $item;
|
||||||
$item.prop('id', as.getItemId(item));
|
$item.prop('id', as.getItemId(item));
|
||||||
let cfg = env.config;
|
let cfg = env.data.cfgList;
|
||||||
sbm.populateItemValues(cfg, $item, item.field.value);
|
sbm.populateItemValues(cfg, $item, item.field.value);
|
||||||
let prefix = cfg.column.prefix;
|
let prefix = cfg.column.prefix;
|
||||||
if (!env.mode.search)
|
if (!env.mode.search)
|
||||||
@@ -140,7 +131,7 @@
|
|||||||
as.clearItem(env, cfg);
|
as.clearItem(env, cfg);
|
||||||
let prefix = cfg.field.prefix;
|
let prefix = cfg.field.prefix;
|
||||||
let $ctrls = $('.sbm-input,.sbm-textarea,.sbm-select', env.$frm.item);
|
let $ctrls = $('.sbm-input,.sbm-textarea,.sbm-select', env.$frm.item);
|
||||||
if (cfg.type) sbm.selectOrAdd($ctrls.filter('.AssociationType'), cfg.type.code, cfg.type.desc)
|
if (cfg.type) sbm.populateSelectCodeDesc('#cbAssociationType', [{ code: cfg.type.code, desc: cfg.type.desc }])
|
||||||
env.$ctrl.targetActions.filter('.AssocTargetSearch').show();
|
env.$ctrl.targetActions.filter('.AssocTargetSearch').show();
|
||||||
$ctrls.filter('.AssociationTarget').off('dblclick').on('dblclick', function () { as.selectTarget(env); });
|
$ctrls.filter('.AssociationTarget').off('dblclick').on('dblclick', function () { as.selectTarget(env); });
|
||||||
$ctrls.filter('.AssociationStatus').val(env.data.defaultStatusCode);
|
$ctrls.filter('.AssociationStatus').val(env.data.defaultStatusCode);
|
||||||
@@ -178,7 +169,7 @@
|
|||||||
//sbm.debug('onSelectTarget', env, item);
|
//sbm.debug('onSelectTarget', env, item);
|
||||||
let $ctrls = $('.sbm-input,.sbm-textarea,.sbm-select', env.$frm.item);
|
let $ctrls = $('.sbm-input,.sbm-textarea,.sbm-select', env.$frm.item);
|
||||||
$ctrls.filter('.AssociationTargetId').val(item.id);
|
$ctrls.filter('.AssociationTargetId').val(item.id);
|
||||||
$ctrls.filter('.AssociationTarget').val(item.Name);
|
$ctrls.filter('.AssociationTarget').val(item.name);
|
||||||
}
|
}
|
||||||
as.editTarget = function (env)
|
as.editTarget = function (env)
|
||||||
{
|
{
|
||||||
@@ -200,8 +191,7 @@
|
|||||||
{
|
{
|
||||||
let $frm = env.$frm.itemId;
|
let $frm = env.$frm.itemId;
|
||||||
$('.AssociationId', $frm).val(id);
|
$('.AssociationId', $frm).val(id);
|
||||||
env.ajax.updateItem = env.ajax.updateItem || { url: sbm.url.base + 'Association/Ajax/GetItem', formSel: $frm, callbackFn: function (response) { as.onUpdateItem(env, response); } };
|
sbm.doAjaxRequest(env.ajax.updateItem = env.ajax.updateItem || { url: sbm.url.base + 'Association/Ajax/GetItem', formSel: $frm, callbackFn: function (response) { as.onUpdateItem(env, response); } }, 50);
|
||||||
sbm.doAjaxRequest(env.ajax.updateItem, 50);
|
|
||||||
}
|
}
|
||||||
as.onUpdateItem = function (env, response)
|
as.onUpdateItem = function (env, response)
|
||||||
{
|
{
|
||||||
@@ -228,8 +218,7 @@
|
|||||||
//--------------------------------------------------------------
|
//--------------------------------------------------------------
|
||||||
as.storeItem = function (env)
|
as.storeItem = function (env)
|
||||||
{
|
{
|
||||||
env.ajax.storeItem = env.ajax.storeItem || { url: sbm.url.base + 'Association/Ajax/StoreItem', formSel: env.$frm.item, callbackFn: function (response) { as.onStoreItem(env, response); } };
|
sbm.doAjaxRequest(env.ajax.storeItem = env.ajax.storeItem || { url: sbm.url.base + 'Association/Ajax/StoreItem', formSel: env.$frm.item, callbackFn: function (response) { as.onStoreItem(env, response); } }, 50);
|
||||||
sbm.doAjaxRequest(env.ajax.storeItem, 50);
|
|
||||||
}
|
}
|
||||||
as.onStoreItem = function (env, response)
|
as.onStoreItem = function (env, response)
|
||||||
{
|
{
|
||||||
@@ -252,6 +241,7 @@
|
|||||||
$('table tbody', env.$pnl.table).prepend($item).show();
|
$('table tbody', env.$pnl.table).prepend($item).show();
|
||||||
}
|
}
|
||||||
as.populateItem(env, $item, item);
|
as.populateItem(env, $item, item);
|
||||||
|
sbm.configureItemTable(env.data.cfgList, env.$pnl.table);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -280,11 +270,12 @@
|
|||||||
sbm.fn.selectAssociation = function (prm)
|
sbm.fn.selectAssociation = function (prm)
|
||||||
{
|
{
|
||||||
let env = as.env.select;
|
let env = as.env.select;
|
||||||
//sbm.debug('listAssociations', env, prm);
|
//sbm.debug('selectAssociation', env, prm);
|
||||||
env.prmSelect = prm;
|
env.prmSelect = prm;
|
||||||
let $frm = env.$frm.filter;
|
let $frm = env.$frm.filter;
|
||||||
$frm.find('.FilterOwnerId,.FilterTargetId').val('');
|
$frm.find('.FilterOwnerId,.FilterTargetId').val('');
|
||||||
$frm.find('.FilterContactType').val(prm.type || '');
|
env.$frm.filter.find('.sbm-input.FilterAssociationType').val(prm.type);
|
||||||
|
env.$ctrl.filterAssocType.val(prm.type || '').prop('disabled', env.$ctrl.filterAssocType.val());
|
||||||
$frm.find('.FilterSearch').val(prm.search || '');
|
$frm.find('.FilterSearch').val(prm.search || '');
|
||||||
env.$pnl.table.find('tbody tr').remove();
|
env.$pnl.table.find('tbody tr').remove();
|
||||||
let $dlg = env.$dlg.select;
|
let $dlg = env.$dlg.select;
|
||||||
@@ -300,7 +291,7 @@
|
|||||||
//sbm.debug('selectItemRow', env, $item, item);
|
//sbm.debug('selectItemRow', env, $item, item);
|
||||||
env.$pnl.table.find('tr').removeClass('sbm-sel');
|
env.$pnl.table.find('tr').removeClass('sbm-sel');
|
||||||
$item.addClass('sbm-sel');
|
$item.addClass('sbm-sel');
|
||||||
env.prmSelect.item = item;
|
env.prmSelect.item = { id: item.id, name: item.field.value.Target };
|
||||||
}
|
}
|
||||||
as.selectItem = function (env)
|
as.selectItem = function (env)
|
||||||
{
|
{
|
||||||
@@ -324,7 +315,8 @@
|
|||||||
env.$pnl.tmpls = env.$pnl.items.find('.sbm-panel-item-template');
|
env.$pnl.tmpls = env.$pnl.items.find('.sbm-panel-item-template');
|
||||||
|
|
||||||
env.$frm.filter = env.$pnl.items.find('.frmAssociationFilter');
|
env.$frm.filter = env.$pnl.items.find('.frmAssociationFilter');
|
||||||
env.$frm.filter.on('input', '.FilterSearch', function () { as.refreshResults(env, 250); }).on('change', '.FilterAssociationType', function () { as.refreshResults(env, 50); });
|
env.$frm.filter.on('input', '.FilterSearch', function () { as.refreshResults(env, 250); });
|
||||||
|
env.$ctrl.filterAssocType = env.$frm.filter.find('.sbm-select.FilterAssociationType').on('change', function () { env.$frm.filter.find('.sbm-input.FilterAssociationType').val(env.$frm.filter.find('.sbm-select.FilterAssociationType').val()); as.refreshResults(env, 50); });
|
||||||
var opt = sbm.dlgOpts();
|
var opt = sbm.dlgOpts();
|
||||||
opt.dialogClass += " sbm-Association";
|
opt.dialogClass += " sbm-Association";
|
||||||
env.$dlg.item = $('#dlgAssociation').dialog(opt);
|
env.$dlg.item = $('#dlgAssociation').dialog(opt);
|
||||||
|
|||||||
+5
-6
@@ -17,9 +17,6 @@
|
|||||||
{
|
{
|
||||||
//sbm.debug('doRefreshConfig', env, response);
|
//sbm.debug('doRefreshConfig', env, response);
|
||||||
if (!response.success) return;
|
if (!response.success) return;
|
||||||
// Config.
|
|
||||||
env.config = response.config;
|
|
||||||
env.configItemNew = response.configItemNew;
|
|
||||||
Object.assign(env.data, response.data);
|
Object.assign(env.data, response.data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -53,7 +50,7 @@
|
|||||||
env.$pnl.bgr.invisible();
|
env.$pnl.bgr.invisible();
|
||||||
env.$pnl.mnu.empty();
|
env.$pnl.mnu.empty();
|
||||||
env.$pnl.mnu.append(co.getFilterMenuOption(env, sbm.lbl.refresh, function () { co.refreshResults(env); }, 'sbm-refresh'));
|
env.$pnl.mnu.append(co.getFilterMenuOption(env, sbm.lbl.refresh, function () { co.refreshResults(env); }, 'sbm-refresh'));
|
||||||
if (env.config.action.allow.create) env.$pnl.mnu.append(co.getFilterMenuOption(env, sbm.lbl.create, function () { co.createItem(env, env.configItemNew); }, 'sbm-add'));
|
if (env.data.cfgList.action.allow.create) env.$pnl.mnu.append(co.getFilterMenuOption(env, sbm.lbl.create, function () { co.createItem(env, env.data.cfgItemNew); }, 'sbm-add'));
|
||||||
env.$pnl.bgr.toggleVisibility(!!$('.sbm-dropdown-item', env.$pnl.mnu).length);
|
env.$pnl.bgr.toggleVisibility(!!$('.sbm-dropdown-item', env.$pnl.mnu).length);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -63,12 +60,13 @@
|
|||||||
return env.$pnl.msgs.append($('<div class="sbm-message">' + sbm.msg.dataNoneFound + '</div>')).fadeIn(500);
|
return env.$pnl.msgs.append($('<div class="sbm-message">' + sbm.msg.dataNoneFound + '</div>')).fadeIn(500);
|
||||||
for (const item of items)
|
for (const item of items)
|
||||||
$table.append(co.populateItem(env, co.getItemTemplate(env), item));
|
$table.append(co.populateItem(env, co.getItemTemplate(env), item));
|
||||||
|
sbm.configureItemTable(env.data.cfgList, $table);
|
||||||
}
|
}
|
||||||
co.populateItem = function (env, $item, item)
|
co.populateItem = function (env, $item, item)
|
||||||
{
|
{
|
||||||
if (!item) return $item;
|
if (!item) return $item;
|
||||||
$item.prop('id', co.getItemId(item));
|
$item.prop('id', co.getItemId(item));
|
||||||
let cfg = env.config;
|
let cfg = env.data.cfgList;
|
||||||
if (cfg) sbm.populateItemValues(cfg, $item, item.field.value);
|
if (cfg) sbm.populateItemValues(cfg, $item, item.field.value);
|
||||||
let prefix = cfg.column.prefix;
|
let prefix = cfg.column.prefix;
|
||||||
$('.' + prefix + 'Status', $item).text(item.statusDesc).removeStatusClasses().addClass('sbm-status-' + item.statusCode.toLowerCase());
|
$('.' + prefix + 'Status', $item).text(item.statusDesc).removeStatusClasses().addClass('sbm-status-' + item.statusCode.toLowerCase());
|
||||||
@@ -253,6 +251,7 @@
|
|||||||
$('table tbody', env.$pnl.table).prepend($item).show();
|
$('table tbody', env.$pnl.table).prepend($item).show();
|
||||||
}
|
}
|
||||||
co.populateItem(env, $item, item);
|
co.populateItem(env, $item, item);
|
||||||
|
sbm.configureItemTable(env.data.cfgList, env.$pnl.table);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -340,7 +339,7 @@
|
|||||||
co.env.maint = co.initEnv('.sbm-panel.Commodities');
|
co.env.maint = co.initEnv('.sbm-panel.Commodities');
|
||||||
if (co.env.maint.$pnl.items.length)
|
if (co.env.maint.$pnl.items.length)
|
||||||
{
|
{
|
||||||
$('body').on('keydown', function (e) { let env = co.env.maint; if (e.which == 45/*Insert*/ && env.config.action.allow.create) co.createItem(env, env.configItemNew); });
|
$('body').on('keydown', function (e) { let env = co.env.maint; if (e.which == 45/*Insert*/ && env.data.cfgList.action.allow.create) co.createItem(env, env.data.cfgItemNew); });
|
||||||
setTimeout(function () { co.refreshResults(co.env.maint); }, 250);
|
setTimeout(function () { co.refreshResults(co.env.maint); }, 250);
|
||||||
}
|
}
|
||||||
co.env.select = co.initEnv('#dlgCommoditySelect');
|
co.env.select = co.initEnv('#dlgCommoditySelect');
|
||||||
@@ -69,8 +69,8 @@
|
|||||||
var items = response.contacts || [];
|
var items = response.contacts || [];
|
||||||
if (!items.length)
|
if (!items.length)
|
||||||
return env.$pnl.msgs.append($('<div class="sbm-message">' + sbm.msg.dataNoneFound + '</div>')).fadeIn(500);
|
return env.$pnl.msgs.append($('<div class="sbm-message">' + sbm.msg.dataNoneFound + '</div>')).fadeIn(500);
|
||||||
for (let itemIdx = 0; itemIdx < items.length; itemIdx++)
|
for (const item of items)
|
||||||
$table.append(co.populateItem(env, co.getItemTemplate(env), items[itemIdx]));
|
$table.append(co.populateItem(env, co.getItemTemplate(env), item));
|
||||||
sbm.configureItemTable(env.config, $table);
|
sbm.configureItemTable(env.config, $table);
|
||||||
}
|
}
|
||||||
co.populateItem = function (env, $item, item)
|
co.populateItem = function (env, $item, item)
|
||||||
@@ -223,6 +223,7 @@
|
|||||||
$('table tbody', env.$pnl.table).prepend($item).show();
|
$('table tbody', env.$pnl.table).prepend($item).show();
|
||||||
}
|
}
|
||||||
co.populateItem(env, $item, item);
|
co.populateItem(env, $item, item);
|
||||||
|
sbm.configureItemTable(env.data.cfgList, env.$pnl.table);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -252,7 +253,7 @@
|
|||||||
//sbm.debug('selectItemRow', env, $item, item);
|
//sbm.debug('selectItemRow', env, $item, item);
|
||||||
env.$pnl.table.find('tr').removeClass('sbm-sel');
|
env.$pnl.table.find('tr').removeClass('sbm-sel');
|
||||||
$item.addClass('sbm-sel');
|
$item.addClass('sbm-sel');
|
||||||
env.prmSelect.item = item;
|
env.prmSelect.item = { id: item.id, name: item.name };
|
||||||
}
|
}
|
||||||
co.selectItem = function (env)
|
co.selectItem = function (env)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -170,8 +170,8 @@
|
|||||||
sbm.clearItemForm = function ($frm)
|
sbm.clearItemForm = function ($frm)
|
||||||
{
|
{
|
||||||
sbm.clearControlErrors($frm);
|
sbm.clearControlErrors($frm);
|
||||||
$('.sbm-input,.sbm-textarea,.sbm-select', $frm).val('').prop('readonly', false).prop('disabled', false);
|
$frm.find('.sbm-input,.sbm-textarea,.sbm-select').val('').prop('readonly', false).prop('disabled', false);
|
||||||
$('.sbm-checkbox', $frm).prop('readonly', false).prop('disabled', false).removeAttr('checked');
|
$frm.find('.sbm-checkbox').prop('readonly', false).prop('disabled', false).removeAttr('checked');
|
||||||
}
|
}
|
||||||
sbm.configureItemControls = function (cfg, $frm)
|
sbm.configureItemControls = function (cfg, $frm)
|
||||||
{
|
{
|
||||||
@@ -179,8 +179,8 @@
|
|||||||
let fld = cfg.field || {};
|
let fld = cfg.field || {};
|
||||||
let $ctrl = $('.sbm-form-control', $frm).show();
|
let $ctrl = $('.sbm-form-control', $frm).show();
|
||||||
for (var name in fld.label || {}) { /* ... */ };
|
for (var name in fld.label || {}) { /* ... */ };
|
||||||
(fld.hide || []).forEach(function (v, i, a) { $ctrl.filter('.' + fld.prefix + v).hide().find('.sbm-input,.sbm-textarea,.sbm-select,.sbm-checkbox').prop('disabled', true); });
|
(fld.hide || []).forEach(function (v, i, a) { $ctrl.filter('.' + fld.prefix + v).hide().find('.sbm-input,.sbm-textarea,.sbm-select,.sbm-checkbox').filter('.sbm-auto-val').prop('disabled', true); });
|
||||||
(fld.readonly || []).forEach(function (v, i, a) { $ctrl.filter('.' + fld.prefix + v).find('.sbm-input,.sbm.textarea,.sbm-select,.sbm-checkbox').prop('readonly', true).prop('disabled', true); });
|
(fld.readonly || []).forEach(function (v, i, a) { $ctrl.filter('.' + fld.prefix + v).find('.sbm-input,.sbm.textarea,.sbm-select,.sbm-checkbox').filter('.sbm-auto-val').prop('readonly', true).prop('disabled', true); });
|
||||||
}
|
}
|
||||||
sbm.populateFormValues = function (cfg, $frm, val)
|
sbm.populateFormValues = function (cfg, $frm, val)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,321 @@
|
|||||||
|
/*
|
||||||
|
* Transaction page scripts.
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function (win, doc, undef)
|
||||||
|
{
|
||||||
|
"use strict";
|
||||||
|
let co = sbm.mdl.Transactions = { env: {} };
|
||||||
|
|
||||||
|
//--------------------------------------------------------------
|
||||||
|
co.refreshConfig = function (env, delay)
|
||||||
|
{
|
||||||
|
sbm.doAjaxRequest(env.ajax.refreshConfig = env.ajax.refreshConfig || { url: sbm.url.base + 'Transaction/Ajax/Config', formSel: env.$frm.filter, callbackFn: function (response) { co.storeConfig(env, response); } }, delay || 50);
|
||||||
|
}
|
||||||
|
co.storeConfig = function (env, response)
|
||||||
|
{
|
||||||
|
Object.assign(env.data, response.data);
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------
|
||||||
|
co.refreshItems = function (env, delay)
|
||||||
|
{
|
||||||
|
if (!co.awaitingRefreshResponse)
|
||||||
|
{
|
||||||
|
env.$pnl.bgr.invisible();
|
||||||
|
env.$pnl.table.find('tbody tr').remove();
|
||||||
|
env.$pnl.msgs.hide().empty().append($('<div class="sbm-message">' + sbm.msg.dataQuerying + '</div>')).fadeIn(200);
|
||||||
|
}
|
||||||
|
sbm.doAjaxRequest(env.ajax.refreshResults = env.ajax.refreshResults || { url: sbm.url.base + 'Transaction/Ajax/List', formSel: env.$frm.filter, callbackFn: function (response) { co.displayItems(env, response); } }, delay || 50);
|
||||||
|
co.awaitingRefreshResponse = true;
|
||||||
|
}
|
||||||
|
co.displayItems = function (env, response)
|
||||||
|
{
|
||||||
|
//sbm.debug('doRefreshResults', env, response);
|
||||||
|
delete co.awaitingRefreshResponse;
|
||||||
|
env.$pnl.msgs.hide().empty();
|
||||||
|
let $table = $('table', env.$pnl.table).find('tbody tr').remove().end();
|
||||||
|
sbm.refreshPaging(response, env.$frm.filter, function () { co.refreshItems(env); });
|
||||||
|
if (!response.success) return;
|
||||||
|
co.storeConfig(env, response);
|
||||||
|
let cfg = env.data.cfgList;
|
||||||
|
env.mode = response.mode;
|
||||||
|
if (cfg.caption) env.$pnl.items.find('.sbm-panel-caption').text(cfg.caption);
|
||||||
|
|
||||||
|
// Menu.
|
||||||
|
if (env.$pnl.bgr.length)
|
||||||
|
{
|
||||||
|
env.$pnl.bgr.invisible();
|
||||||
|
env.$pnl.mnu.empty();
|
||||||
|
env.$pnl.mnu.append(co.getFilterMenuOption(env, sbm.lbl.refresh, function () { co.refreshItems(env); }, 'sbm-refresh'));
|
||||||
|
if (cfg.action.allow.create) env.$pnl.mnu.append(co.getFilterMenuOption(env, sbm.lbl.create, function () { co.createItem(env, env.data.cfgItemNew); }, 'sbm-add'));
|
||||||
|
env.$pnl.bgr.toggleVisibility(!!$('.sbm-dropdown-item', env.$pnl.mnu).length);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Items.
|
||||||
|
var items = response.transactions || [];
|
||||||
|
if (!items.length)
|
||||||
|
return env.$pnl.msgs.append($('<div class="sbm-message">' + sbm.msg.dataNoneFound + '</div>')).fadeIn(500);
|
||||||
|
for (const item of items)
|
||||||
|
$table.append(co.populateItem(env, co.getItemTemplate(env), item));
|
||||||
|
sbm.configureItemTable(cfg, $table);
|
||||||
|
}
|
||||||
|
co.populateItem = function (env, $item, item)
|
||||||
|
{
|
||||||
|
if (!item) return $item;
|
||||||
|
$item.prop('id', co.getItemId(item));
|
||||||
|
let cfg = env.data.cfgList;
|
||||||
|
if (cfg) sbm.populateItemValues(cfg, $item, item.field.value);
|
||||||
|
let prefix = cfg.column.prefix;
|
||||||
|
$('.' + prefix + 'Status', $item).text(item.statusDesc).removeStatusClasses().addClass('sbm-status-' + item.statusCode.toLowerCase());
|
||||||
|
if (!env.mode.search)
|
||||||
|
{
|
||||||
|
// Actions.
|
||||||
|
var $bgr = $('.sbm-burger', $item).hide();
|
||||||
|
let $mnu = $('ul.sbm-dropdown-menu', $bgr).empty();
|
||||||
|
if (!item.deleted)
|
||||||
|
{
|
||||||
|
let fnUpd = function () { co.updateItem(env, item.id) };
|
||||||
|
$mnu.append(co.getItemMenuOption(env, sbm.lbl.edit, fnUpd, 'sbm-edit'));
|
||||||
|
$('.TransactionCode,.TransactionDesc', $item).off('click').on('click', fnUpd).addClass('sbm-action-text');
|
||||||
|
$item.off('dblclick').on('dblclick', fnUpd);
|
||||||
|
}
|
||||||
|
$bgr.toggle(!!$('.sbm-dropdown-item', $mnu).length);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$item.off('click').on('click', function () { co.selectItemRow(env, $item, item); });
|
||||||
|
$item.off('dblclick').on('dblclick', function () { co.selectItem(env); });
|
||||||
|
}
|
||||||
|
return $item;
|
||||||
|
}
|
||||||
|
co.getItemId = function (item)
|
||||||
|
{
|
||||||
|
return 'Cmd_' + (item || {}).id;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------
|
||||||
|
co.getFilterDropdownTemplate = function (env)
|
||||||
|
{
|
||||||
|
return $('.sbm-dropdown-menu.TransactionList li.sbm-dropdown-item', env.$pnl.tmpl).clone();
|
||||||
|
}
|
||||||
|
co.getItemTemplate = function (env)
|
||||||
|
{
|
||||||
|
return $('table tr.sbm-row-item.Transaction', env.$pnl.tmpl).clone();
|
||||||
|
}
|
||||||
|
co.getItemDropdownTemplate = function (env)
|
||||||
|
{
|
||||||
|
return $('.sbm-dropdown-menu.Transaction li.sbm-dropdown-item', env.$pnl.tmpl).clone();
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------
|
||||||
|
co.getFilterMenuOption = function (env, lbl, fn, cls)
|
||||||
|
{
|
||||||
|
return co.getMenuOption(co.getFilterDropdownTemplate(env), lbl, fn, cls);
|
||||||
|
}
|
||||||
|
co.getItemMenuOption = function (env, lbl, fn, cls)
|
||||||
|
{
|
||||||
|
return co.getMenuOption(co.getItemDropdownTemplate(env), lbl, fn, cls);
|
||||||
|
}
|
||||||
|
co.getMenuOption = function ($opt, lbl, fn, cls)
|
||||||
|
{
|
||||||
|
return $opt.find('div.sbm-label').text(lbl).end().on('click', fn).addClass(cls);
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------
|
||||||
|
co.createItem = function (env, cfg)
|
||||||
|
{
|
||||||
|
co.clearItem(env, cfg);
|
||||||
|
let $frm = env.$frm.item;
|
||||||
|
$frm.find('.TransactionType').val(env.data.transactionTypeDefault);
|
||||||
|
env.$ctrl.searchTgtAssoc.show();
|
||||||
|
$frm.find('.TransactionStatus').val(env.data.defaultStatusCode);
|
||||||
|
co.openItemDlg(env, cfg, sbm.dlg.title.createTransaction);
|
||||||
|
}
|
||||||
|
co.clearItem = function (env, cfg)
|
||||||
|
{
|
||||||
|
sbm.clearItemForm(env.$frm.item);
|
||||||
|
sbm.populateSelectCodeDesc('#cbTransactionStatus', env.data.statuses);
|
||||||
|
}
|
||||||
|
co.openItemDlg = function (env, cfg, title)
|
||||||
|
{
|
||||||
|
let $dlg = env.$dlg.item;
|
||||||
|
let $frm = env.$frm.item;
|
||||||
|
sbm.configureItemControls(cfg, $frm);
|
||||||
|
var btns = {};
|
||||||
|
btns[sbm.lbl.ok] = function () { co.storeItem(env); };
|
||||||
|
btns[sbm.lbl.cancel] = function () { delete env.prmEdit; $(this).dialog('close'); };
|
||||||
|
$dlg.dialog('option', 'buttons', btns);
|
||||||
|
if (title) $dlg.dialog('option', 'title', title);
|
||||||
|
sbm.openDialog($dlg, 720, 640);
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------
|
||||||
|
co.updateItem = function (env, id)
|
||||||
|
{
|
||||||
|
let $frm = env.$frm.itemId;
|
||||||
|
$('.TransactionId', $frm).val(id);
|
||||||
|
$('.TransactionDataGroups', $frm).val('Sales');
|
||||||
|
env.ajax.updateItem = env.ajax.updateItem || { url: sbm.url.base + 'Transaction/Ajax/GetItem', formSel: $frm, callbackFn: function (response) { co.onUpdateItem(env, response); } };
|
||||||
|
sbm.doAjaxRequest(env.ajax.updateItem, 50);
|
||||||
|
}
|
||||||
|
co.onUpdateItem = function (env, response)
|
||||||
|
{
|
||||||
|
sbm.debug('onUpdateItem', env, response);
|
||||||
|
if (!response.success) return;
|
||||||
|
let cfg = response.config || {};
|
||||||
|
co.clearItem(env, cfg);
|
||||||
|
let item = response.transaction;
|
||||||
|
let $frm = env.$frm.item;
|
||||||
|
sbm.populateFormValues(cfg, $frm, item.field.value);
|
||||||
|
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);
|
||||||
|
co.openItemDlg(env, cfg, sbm.dlg.title.updateTransaction);
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------
|
||||||
|
co.selectAssocTarget = function (env)
|
||||||
|
{
|
||||||
|
if (!!env.$frm.item.find('.sbm-input.TransactionId').val()) return;
|
||||||
|
sbm.fn.selectAssociation({ type: env.$frm.filter.find('.FilterAssociationType').val(), fnSuccess: function (item) { co.onSelectAssocTarget(env, item); } });
|
||||||
|
}
|
||||||
|
co.onSelectAssocTarget = function (env, item)
|
||||||
|
{
|
||||||
|
sbm.debug('onSelectAssocTarget', env, item);
|
||||||
|
env.$frm.item.find('.TransactionAssociationId').val(item.id);
|
||||||
|
env.$frm.item.find('.TransactionAssociation').val(item.name);
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------
|
||||||
|
co.storeItem = function (env)
|
||||||
|
{
|
||||||
|
env.ajax.storeItem = env.ajax.storeItem || { url: sbm.url.base + 'Transaction/Ajax/StoreItem', formSel: env.$frm.item, callbackFn: function (response) { co.onStoreItem(env, response); } };
|
||||||
|
sbm.doAjaxRequest(env.ajax.storeItem, 50);
|
||||||
|
}
|
||||||
|
co.onStoreItem = function (env, response)
|
||||||
|
{
|
||||||
|
//sbm.debug('onStoreItem', env, response);
|
||||||
|
sbm.refreshControlValues(response.controlValues);
|
||||||
|
if (!response.success) return;
|
||||||
|
env.$dlg.item.dialog('close');
|
||||||
|
var item = response.transaction;
|
||||||
|
if (env.prmEdit)
|
||||||
|
{
|
||||||
|
co.onItemEdited(env, item);
|
||||||
|
}
|
||||||
|
else if (env.$pnl.table.length)
|
||||||
|
{
|
||||||
|
env.$pnl.msgs.hide().empty();
|
||||||
|
var $item = $('#' + co.getItemId(item), env.$pnl.table);
|
||||||
|
if (!$item.length)
|
||||||
|
{
|
||||||
|
$item = co.getItemTemplate(env);
|
||||||
|
$('table tbody', env.$pnl.table).prepend($item).show();
|
||||||
|
}
|
||||||
|
co.populateItem(env, $item, item);
|
||||||
|
sbm.configureItemTable(env.data.cfgList, env.$pnl.table);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------
|
||||||
|
/* Params: type, search, fnSuccess. */
|
||||||
|
sbm.fn.selectTransaction = function (prm)
|
||||||
|
{
|
||||||
|
//sbm.debug('selectTransaction', prm);
|
||||||
|
let env = co.env.select;
|
||||||
|
env.prmSelect = prm;
|
||||||
|
env.$frm.filter.find('.FilterTransactionType').val('');
|
||||||
|
env.$frm.filter.find('.FilterSearch').val(prm.search || '');
|
||||||
|
env.$pnl.table.find('tbody tr').remove();
|
||||||
|
sbm.openDialog(env.$dlg.select, 1000, 800);
|
||||||
|
if (env.$pnl.items.length) setTimeout(function () { co.refreshItems(env); }, 250);
|
||||||
|
}
|
||||||
|
co.selectItemRow = function (env, $item, item)
|
||||||
|
{
|
||||||
|
//sbm.debug('selectItemRow', env, $item, item);
|
||||||
|
env.$pnl.table.find('tr').removeClass('sbm-sel');
|
||||||
|
$item.addClass('sbm-sel');
|
||||||
|
env.prmSelect.item = item;
|
||||||
|
}
|
||||||
|
co.selectItem = function (env)
|
||||||
|
{
|
||||||
|
//sbm.debug('selectItem', env, env.prmSelect.item);
|
||||||
|
env.$dlg.select.dialog('close');
|
||||||
|
env.prmSelect.fnSuccess(env.prmSelect.item);
|
||||||
|
delete env.prmSelect;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Params: id, fnSuccess. */
|
||||||
|
sbm.fn.editTransaction = function (prm)
|
||||||
|
{
|
||||||
|
//sbm.debug('editTransaction', prm);
|
||||||
|
let env = co.env.select;
|
||||||
|
env.prmEdit = prm;
|
||||||
|
//sbm.debug(env, prm);
|
||||||
|
co.updateItem(env, prm.id);
|
||||||
|
}
|
||||||
|
co.onItemEdited = function (env, item)
|
||||||
|
{
|
||||||
|
//sbm.debug('co.onItemEdited', env, item);
|
||||||
|
env.prmEdit.fnSuccess(item);
|
||||||
|
delete env.prmEdit;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------
|
||||||
|
co.initEnv = function ($pnlItems)
|
||||||
|
{
|
||||||
|
let env = { data: {}, ajax: {}, $pnl: {}, $frm: {}, $ctrl: {}, $dlg: {} };
|
||||||
|
|
||||||
|
let $items = env.$pnl.items = $($pnlItems);
|
||||||
|
env.$pnl.header = $items.find('.sbm-panel-header');
|
||||||
|
env.$pnl.bgr = env.$pnl.header.find('.sbm-burger');
|
||||||
|
env.$pnl.mnu = env.$pnl.bgr.find('ul.sbm-dropdown-menu');
|
||||||
|
env.$pnl.table = $items.find('.sbm-panel-item-table');
|
||||||
|
env.$pnl.msgs = env.$pnl.table.find('.sbm-panel-messages');
|
||||||
|
env.$pnl.tmpl = $items.find('.sbm-panel-item-template');
|
||||||
|
|
||||||
|
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.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); });
|
||||||
|
|
||||||
|
var opt = sbm.dlgOpts();
|
||||||
|
opt.dialogClass += " sbm-Transaction";
|
||||||
|
opt.buttons[sbm.lbl.ok] = function () { co.selectItem(env); };
|
||||||
|
opt.buttons[sbm.lbl.cancel] = function () { delete env.prmSelect; $(this).dialog('close'); };
|
||||||
|
env.$dlg.select = $('#dlgTransactionSelect').dialog(opt);
|
||||||
|
|
||||||
|
return env;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------
|
||||||
|
$(function ()
|
||||||
|
{
|
||||||
|
co.env.maint = co.initEnv('.sbm-panel.Transactions');
|
||||||
|
if (co.env.maint.$pnl.items.length)
|
||||||
|
{
|
||||||
|
$('body').on('keydown', function (e) { let env = co.env.maint; if (e.which == 45/*Insert*/ && env.data.cfgList.action.allow.create) co.createItem(env, env.data.cfgItemNew); });
|
||||||
|
setTimeout(function () { co.refreshItems(co.env.maint); }, 250);
|
||||||
|
}
|
||||||
|
co.env.select = co.initEnv('#dlgTransactionSelect');
|
||||||
|
if (co.env.select.$pnl.items.length) setTimeout(function () { co.refreshConfig(co.env.select); }, 250);
|
||||||
|
});
|
||||||
|
|
||||||
|
//--------------------------------------------------------------
|
||||||
|
}(window, window.document));
|
||||||
|
|
||||||
|
/* The End */
|
||||||
Reference in New Issue
Block a user