3.0.0.7 Transactions

This commit is contained in:
Andy Howard
2025-02-17 17:44:30 +00:00
parent 797ad08e5d
commit fa01e0799a
87 changed files with 1865 additions and 549 deletions
@@ -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.
+1 -1
View File
@@ -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;
+41 -44
View File
@@ -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,58 +162,76 @@ 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
// and global options that can be formatted (eg. to fixed length) by overwridden versions. // and global options that can be formatted (eg. to fixed length) by overwridden versions.
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 = "";
if (SbmGlobals.Application.GetBusMgrDatabase(SessionContext) != null)
{ {
string NextIdKey = GetTransactionNextIdKey(AffiliateId_Owner, idAssoc, transTypes); string NextIdKey = GetTransactionNextIdKey(AffiliateId_Owner, idAssoc, transTypes);
// ToDo long iRefNext = SbmGlobals.Database.GetNextId(NextIdKey, false); long transRefNext = SysId.ToLong(Internals.BusMgrDatabase.GetNextId(NextIdKey, Internals.DbUpdateInfo, false));
// Ref = FormatTransactionCreateRef(AffiliateId_Owner, idAssoc, transTypes, iRefNext); return FormatTransactionCreateRef(AffiliateId_Owner, idAssoc, transTypes, transRefNext);
}
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);
@@ -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
{ {
@@ -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;
} }
@@ -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.
@@ -94,17 +94,20 @@ 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. // Configuration.
public Model_Association.ListConfigData Config { get; } = new Model_Association.ListConfigData(); public Model_Association.ListConfigData CfgList { get; } = new Model_Association.ListConfigData();
public Model_Association.ItemConfigData ConfigCust { get; } = new Model_Association.ItemConfigData(); public Model_Association.ItemConfigData CfgCust { get; } = new Model_Association.ItemConfigData();
public Model_Association.ItemConfigData ConfigSupp { get; } = new Model_Association.ItemConfigData(); public Model_Association.ItemConfigData CfgSupp { get; } = new Model_Association.ItemConfigData();
// Reference data. // Reference data.
public List<ItemCodeDesc> AssociationTypes { get; } = new List<ItemCodeDesc>(); public List<ItemCodeDesc> AssociationTypes { get; } = new List<ItemCodeDesc>();
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 ConfigData Data { get; set; } = new ConfigData();
}
// Ajax request. // Ajax request.
[HttpPost] [HttpPost]
[Route("Association/Ajax/Config")] [Route("Association/Ajax/Config")]
@@ -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,
@@ -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,14 +105,19 @@ 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(); {
// Configurations.
public Model_Transaction.ListConfigData CfgList { get; } = new Model_Transaction.ListConfigData();
public Model_Transaction.ItemConfigData CfgItemNew { get; } = new Model_Transaction.ItemConfigData();
// Reference data. // Reference data.
public List<ItemCodeDesc> TransactionTypes { get; } = new List<ItemCodeDesc>(); public List<ItemCodeDesc> TransactionTypes { get; } = new List<ItemCodeDesc>();
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 ConfigData Data { get; set; } = new ConfigData();
}
// Ajax request. // Ajax request.
[HttpPost] [HttpPost]
[Route("Transaction/Ajax/Config")] [Route("Transaction/Ajax/Config")]
@@ -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;
@@ -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,6 +347,9 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Contacts
// Item Fields. // Item Fields.
// Type. // 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}"); config.Field.Readonly.Add($"{ItemField.Type}");
// Owner. // Owner.
@@ -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>
@@ -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>
@@ -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">&nbsp;*</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">&nbsp;*</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">&nbsp;*</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">&nbsp;*</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); ac.populateItem(env, $item, item);
sbm.configureItemTable(env.data.cfgList, env.$pnl.table);
}
} }
//-------------------------------------------------------------- //--------------------------------------------------------------
@@ -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); as.populateItem(env, $item, item);
sbm.configureItemTable(env.data.cfgList, env.$pnl.table);
}
} }
//-------------------------------------------------------------- //--------------------------------------------------------------
@@ -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);
@@ -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 */