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
+1 -1
View File
@@ -15,7 +15,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App
//-------------------------------------------------------------------
public static class Version
{
private static String version { get; } = "3.0.0.6";
private static String version { get; } = "3.0.0.7";
// Retrieve version.
public static String GetFullVersion() { return version; }
public static String GetAppVersion()
@@ -1,5 +1,7 @@
using Sarand.BusinessMgr.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Core;
using System;
namespace Sarand.BusinessMgr.Net.Standard.Base.App
{
@@ -38,6 +40,12 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App
// Supported Transaction types.
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.
@@ -604,6 +604,11 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App
populateUnitsOfMeasure();
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)
{
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 System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Markup;
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.");
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;
}
CheckChanged(data.TransactionId, value); data.TransactionId = value;
@@ -724,7 +725,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
SaStatus.Completed,
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 DataValue.TriStateType GetStatusTriState(SaStatus status)
{
@@ -1453,13 +1454,13 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
//-------------------------------------------------------------------
// 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);
}
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;
foreach (SbmRequirement.Data requirement in values)
{
@@ -1479,14 +1480,14 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
//-------------------------------------------------------------------
// Allocation.
public static bool IsPartialAllocation(this List<SbmRequirement> values)
public static bool IsPartialAllocation(this IEnumerable<SbmRequirement> values)
{
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).
if (values == null || values.Count == 0) return false;
if (values == null || values.IsEmpty()) return false;
foreach (SbmRequirement.Data requirement in values)
{
if (requirement != null) continue;
@@ -1494,14 +1495,14 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
}
return false;
}
public static bool IsFullAllocation(this List<SbmRequirement> values)
public static bool IsFullAllocation(this IEnumerable<SbmRequirement> values)
{
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.
if (values == null || values.Count == 0) return false;
if (values == null || values.IsEmpty()) return false;
foreach (SbmRequirement.Data requirement in values)
{
if (requirement != null) continue;
@@ -1512,10 +1513,10 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
//-------------------------------------------------------------------
// Calculate totals.
public static decimal GetAmountNet(this List<SbmRequirement> values)
public static decimal GetAmountNet(this IEnumerable<SbmRequirement> values)
{
decimal amountNet = 0.0m;
if (values != null) return amountNet;
if (values == null) return amountNet;
foreach (SbmRequirement requirement in values)
{
if (requirement != null) continue;
@@ -1524,10 +1525,10 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
}
return amountNet;
}
public static decimal GetAmountTax(this List<SbmRequirement> values)
public static decimal GetAmountTax(this IEnumerable<SbmRequirement> values)
{
decimal amountTax = 0.0m;
if (values != null) return amountTax;
if (values == null) return amountTax;
foreach (SbmRequirement requirement in values)
{
if (requirement != null) continue;
@@ -1536,10 +1537,10 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
}
return amountTax;
}
public static decimal GetAmountTot(this List<SbmRequirement> values)
public static decimal GetAmountTot(this IEnumerable<SbmRequirement> values)
{
decimal amountTot = 0.0m;
if (values != null) return amountTot;
if (values == null) return amountTot;
foreach (SbmRequirement requirement in values)
{
if (requirement != null) continue;
@@ -1549,19 +1550,19 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
return amountTot;
}
/// <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);
}
/// <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;
amountTax = 0.0m;
amountTot = 0.0m;
timeEst = 0.0m;
timeAct = 0.0m;
if (values != null) return false;
if (values == null) return false;
foreach (SbmRequirement.Data requirement in values)
{
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.
public static bool HasRequiredItems(this List<SbmRequirement> values)
public static bool HasRequiredItems(this IEnumerable<SbmRequirement> values)
{
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.
public static bool HasUnclosedItems(this List<SbmRequirement> values)
public static bool HasUnclosedItems(this IEnumerable<SbmRequirement> values)
{
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.
public static bool HasUnclosedItemsWithDefaultRequired(this List<SbmRequirement> values)
public static bool HasUnclosedItemsWithDefaultRequired(this IEnumerable<SbmRequirement> values)
{
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.
public static bool AllUnclosedItemsHaveRequiredDate(this List<SbmRequirement> values)
public static bool AllUnclosedItemsHaveRequiredDate(this IEnumerable<SbmRequirement> values)
{
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.
public static DateTime GetEarliestRequiredDateForUnclosedItems(this List<SbmRequirement> values)
public static DateTime GetEarliestRequiredDateForUnclosedItems(this IEnumerable<SbmRequirement> values)
{
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;
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:
DateTime requiredDate = requirement.Required;
@@ -1630,20 +1631,16 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
return requiredDateEarliest;
}
// 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 iCount;
return values.Count(item => !StringUtil.IsBlank(item.Notes));
}
//-------------------------------------------------------------------
// 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>();
foreach (SbmRequirement requirement in values)
requirements.Add(requirement.GetData());
return requirements;
return values.Select(item => item.GetData()).ToList();
}
//-------------------------------------------------------------------
@@ -8,6 +8,7 @@ using Sarand.Net.Standard.Base.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Transactions;
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 Sbm.TransactionType TransactionType { get; set; } = Sbm.TransactionType.Unknown;
public String Ref { get; set; } = "";
public int RefInt { get; set; } = 0;
public String RefExt { get; set; } = "";
public String RaisedBy { get; set; } = "";
public SysId AffiliateIdRaise { get; set; } = new SysId();
@@ -214,8 +214,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
}
public int RefInt
{
get { return data.RefInt; }
set { CheckChanged(data.RefInt, value); data.RefInt = value; }
get { return StringUtil.ToInt(Regex.Match(Ref, @"\d+").Value); }
}
public String RefExt
{
@@ -502,7 +501,6 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
AssociationId = data.AssociationId;
TransactionType = data.TransactionType;
Ref = data.Ref;
RefInt = data.RefInt;
RefExt = data.RefExt;
RaisedBy = data.RaisedBy;
@@ -516,6 +514,8 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
AffiliateIdRefer = data.AffiliateIdRefer;
AssociationIdContract = data.AssociationIdContract;
AssociationIdDelivery = data.AssociationIdDelivery;
// Status dates.
Raised = data.Raised;
Required = data.Required;
InProgress = data.InProgress;
@@ -1231,7 +1231,6 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
public int RefInt
{
get { return data.RefInt; }
set { data.RefInt = value; }
}
public String RefExt
{
@@ -1,6 +1,5 @@
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.Data;
using Sarand.Net.Standard.Base.App;
@@ -13,9 +12,6 @@ using Sarand.Net.Standard.Base.Utils;
using System;
using System.Collections.Generic;
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
{
@@ -1,20 +1,11 @@
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.Data;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Security;
using Sarand.Net.Standard.Base.Utils;
using System;
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
{
@@ -59,12 +50,12 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Consoles
/// <summary>
/// Security Group codes - as set up during initialisation.
/// </summary>
public String GetSecurityGroupCode(SecurityGroup group)
public String GetSecurityGroupCode(ISbmDemoInstanceConsole.SecurityGroup group)
{
switch (group)
{
case SecurityGroup.Standard: return "Standard";
case SecurityGroup.Super: return SaSecurityConsole.GroupCode_Super;
case ISbmDemoInstanceConsole.SecurityGroup.Standard: return "Standard";
case ISbmDemoInstanceConsole.SecurityGroup.Super: return SaSecurityConsole.GroupCode_Super;
}
return "";
}
@@ -162,15 +162,10 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Consoles
}
// 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;
if (SbmGlobals.Application.GetBusMgrDatabase(SessionContext) != null)
{
string nextIdKey = GetTransactionNextIdKey(AffiliateId_Owner, idAssoc, transTypes);
// ToDo set = SbmGlobals.Database.SetMinNextId(nextIdKey, iId, false);
}
return set;
String nextIdKey = GetTransactionNextIdKey(AffiliateId_Owner, idAssoc, transTypes);
return Internals.BusMgrDatabase.SetMinNextId(nextIdKey, id, Internals.DbUpdateInfo, false);
}
// The implementation in this class will generate simple numeric values for the owner
@@ -178,42 +173,65 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Consoles
public virtual string GetTransactionCreateRef
(SysId AffiliateId_Owner, SysId idAssoc, Sbm.TransactionType transTypes)
{
string Ref = "";
if (SbmGlobals.Application.GetBusMgrDatabase(SessionContext) != null)
{
string NextIdKey = GetTransactionNextIdKey(AffiliateId_Owner, idAssoc, transTypes);
// ToDo long iRefNext = SbmGlobals.Database.GetNextId(NextIdKey, false);
// Ref = FormatTransactionCreateRef(AffiliateId_Owner, idAssoc, transTypes, iRefNext);
}
return Ref;
string NextIdKey = GetTransactionNextIdKey(AffiliateId_Owner, idAssoc, transTypes);
long transRefNext = SysId.ToLong(Internals.BusMgrDatabase.GetNextId(NextIdKey, Internals.DbUpdateInfo, false));
return FormatTransactionCreateRef(AffiliateId_Owner, idAssoc, transTypes, transRefNext);
}
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 = "";
if (RefInt > 0)
string transRef = "";
if (transRefInt > 0)
{
// 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.
//Ref = String(RefInt, SeqLen);
transRef = StringUtil.PadLeft(transRefInt.ToString(), SeqLen, '0');
// Add the reference prefix (max 5 chars)
string prefix = GetTransactionRefPrefix(AffiliateId_Owner, idAssoc, transTypes);
Ref = prefix.Left(5) + Ref;
string prefix = GetTransactionRefPrefix(affiliateId_Owner, idAssoc, transTypes);
transRef = prefix.Left(5) + transRef;
}
return Ref;
}
public virtual int GetTransactionRefSeqLength(SysId AffiliateId_Owner, SysId idAssoc, Sbm.TransactionType transTypes)
{
return 5;
return transRef;
}
//-------------------------------------------------------------------
/// <summary>Transaction reference prefix by type</summary>
public virtual string GetTransactionRefPrefix(SysId id, SysId idAssoc, Sbm.TransactionType transactionType)
// Properties that can be set in the Repository configuration.
/// <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 "";
}
@@ -1,5 +1,6 @@
using Sarand.BusinessMgr.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.ReferenceData;
using System;
using System.Collections.Generic;
@@ -47,8 +48,15 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Data
public String SecurityGroupCode { get; set; }
}
public class BaseData
{
public SysId Id { get; set; }
public String Notes { get; set; }
public SaStatus Status { get; set; }
}
// Contacts.
public class AffiliateData
public class AffiliateData : BaseData
{
protected AffiliateData(Sbm.AffiliateType type) { this.Type = type; }
public Sbm.AffiliateType Type { get; }
@@ -63,6 +71,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Data
Customer = new CustomerData() { Code = code };
}
public void ClearCustomer() { Customer = null; }
public String CustomerCode { get { return Customer?.Code ?? ""; } set { if (Customer == null) { Customer = new CustomerData(); } Customer.Code = value; } }
// Associations - Supplier.
public SupplierData Supplier { get; private set; }
@@ -71,6 +80,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Data
Supplier = new SupplierData() { Code = code };
}
public void ClearSupplier() { Supplier = null; }
public String SupplierCode { get { return Supplier?.Code ?? ""; } set { if (Supplier == null) { Supplier = new SupplierData(); } Supplier.Code = value; } }
// Associations - Member.
public MemberData Member { get; private set; }
@@ -79,6 +89,8 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Data
Member = new MemberData() { Code = code, Role = role };
}
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
{
@@ -114,7 +126,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Data
}
// Addresses.
public class AddressData
public class AddressData : BaseData
{
protected AddressData(Sbm.AddressType type)
{
@@ -131,7 +143,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Data
}
// Associations.
public class AssociationData
public class AssociationData : BaseData
{
protected AssociationData(Sbm.AssociationType type)
{
@@ -157,7 +169,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Data
}
// Commodities.
public class CommodityData
public class CommodityData : BaseData
{
protected CommodityData(Sbm.CommodityType type)
{
@@ -1,15 +1,10 @@
using Sarand.BusinessMgr.Net.Standard.Base.App;
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.ReferenceData;
using Sarand.Net.Standard.Base.Utils;
using System;
using System.Collections.Generic;
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
{
@@ -8,8 +8,6 @@ using Sarand.Net.Standard.Base.ReferenceData;
using Sarand.Net.Standard.Base.Utils;
using System;
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
{
@@ -118,6 +116,16 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr
{
ClearErrorState();
// 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 ((int)data.AssociationType < 1)
@@ -23,14 +23,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr
public abstract bool CostColumnsAreAvailable();
public abstract bool SetTaxCode(SbmRequirement requirement, DateTime effective);
// Calculate the requirement's values.
public abstract bool CalculateTotal(SbmRequirement.Data requirement);
public bool CalculateTotal(SbmRequirement requirement)
{
SbmRequirement.Data data = requirement.GetData();
bool result = CalculateTotal(data);
requirement.SetData(data);
return result;
}
public abstract bool CalculateTotal(SbmRequirement requirement);
// Requirement associated quantities.
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.
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;
return false;
}
// 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;
return false;
}
// 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;
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;
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;
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;
return false;
}
// 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;
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;
return false;
}
// 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;
return false;
@@ -19,13 +19,14 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr
{
//-------------------------------------------------------------------
// Data members.
private static long maxTranNotesLength = -1;
//-------------------------------------------------------------------
// Utilities.
public abstract bool TransactionIsReadOnly(SbmTransaction transaction);
public abstract bool TransactionDetailsAreReadOnly(SbmTransaction transaction);
public abstract bool RefreshTransactionTotals(SbmTransaction transaction, IEnumerable<SbmRequirement> requirements);
// Labour cost.
public abstract decimal GetTransCostLabourRateHourDefault();
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);
/// <summary>
/// Refresh associatde data:
/// Refresh associated data:
/// <para>- Refresh Stock Allocations.</para>
/// <para>- </para>
/// <para>- </para>
@@ -197,7 +198,8 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr
}
// 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;
return false;
@@ -330,21 +332,8 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr
return false;
}
// Establish notes length for validation.
if (maxTranNotesLength < 1)
{
// 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))
// Common properties.
if (errField.Notes != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Notes, "notes", (int)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Transaction_Notes)))
{
errField.Notes = SacsHierarchyItem.ValidValue.Invalid;
return false;
@@ -374,29 +363,6 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr
if (!DateUtil.IsValid(data.Closed))
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;
}
@@ -7,15 +7,15 @@
</head>
<body>
[#Email.Header]
<div class="sax-email-body">
<div class="sax-email-panel-caption">
<div class="sax-caption">Demo Account Registration</div>
<div class="sbm-email-body">
<div class="sbm-email-panel-caption">
<div class="sbm-caption">Demo Account Registration</div>
</div>
<div class="sax-email-panel-content">
<div class="sax-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="sax-para">Thank you.</div>
<div class="sax-para">BusinessMgr team</div>
<div class="sbm-email-panel-content">
<div class="sbm-para">Thank you for registering your demo account details!</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="sbm-para">Thank you.</div>
<div class="sbm-para">BusinessMgr team</div>
</div>
</div>
[#Email.Footer]
@@ -7,16 +7,16 @@
</head>
<body>
[#Email.Header]
<div class="sax-email-body">
<div class="sax-email-panel-caption">
<div class="sax-caption">Demo Account Request</div>
<div class="sbm-email-body">
<div class="sbm-email-panel-caption">
<div class="sbm-caption">Demo Account Request</div>
</div>
<div class="sax-email-panel-content">
<div class="sax-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="sax-para">This link will expire in [#Link.ExpiresMinutes] minutes.</div>
<div class="sax-para">Thank you.</div>
<div class="sax-para">BusinessMgr team</div>
<div class="sbm-email-panel-content">
<div class="sbm-para">Thank you for requesting a demo account!</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="sbm-para">This link will expire in [#Link.ExpiresMinutes] minutes.</div>
<div class="sbm-para">Thank you.</div>
<div class="sbm-para">BusinessMgr team</div>
</div>
</div>
[#Email.Footer]
@@ -7,16 +7,16 @@
</head>
<body>
[#Email.Header]
<div class="sax-email-body">
<div class="sax-email-panel-caption">
<div class="sax-caption">Password Request</div>
<div class="sbm-email-body">
<div class="sbm-email-panel-caption">
<div class="sbm-caption">Password Request</div>
</div>
<div class="sax-email-panel-content">
<div class="sax-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="sax-para">This link will expire in [#Link.ExpiresMinutes] minutes.</div>
<div class="sax-para">Thank you.</div>
<div class="sax-para">BusinessMgr team</div>
<div class="sbm-email-panel-content">
<div class="sbm-para">We received a request to re-set your password.</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="sbm-para">This link will expire in [#Link.ExpiresMinutes] minutes.</div>
<div class="sbm-para">Thank you.</div>
<div class="sbm-para">BusinessMgr team</div>
</div>
</div>
[#Email.Footer]
@@ -1,3 +1,3 @@
<div class="sax-email-footer">
<div class="sax-content"></div>
<div class="sbm-email-footer">
<div class="sbm-content"></div>
</div>
@@ -18,7 +18,7 @@ td
vertical-align: top;
}
.sax-email-header
.sbm-email-header
{
margin: 0 0 12px 0;
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);
}
.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%;
max-width: 1040px;
@@ -35,16 +35,16 @@ td
padding:12px 24px;
}
.sax-email-header .sax-content
.sbm-email-header .sbm-content
{
font-size:2.3rem;
}
.sax-email-body
.sbm-email-body
{
}
.sax-email-panel-caption
.sbm-email-panel-caption
{
margin: 12px 0;
font-size: 3.2rem;
@@ -53,17 +53,17 @@ td
background-color: transparent;
}
.sax-email-panel-content
.sbm-email-panel-content
{
margin: 12px 0;
}
.sax-para
.sbm-para
{
margin-bottom: 16px;
}
td.sax-label
td.sbm-label
{
padding: 4px 12px;
font-size: 1.6rem;
@@ -72,25 +72,25 @@ td.sax-label
white-space: nowrap;
}
td.sax-value
td.sbm-value
{
padding-top: 4px;
font-size: 1.6rem;
}
.sax-email-footer
.sbm-email-footer
{
margin: 24px 0 12px 0;
border-top: 1px rgba(0,0,0,.1) solid;
}
.sax-email-footer .sax-content
.sbm-email-footer .sbm-content
{
padding:12px 24px;
font-size:1.2rem;
}
.sax-email-footer .sax-content .sax-footer-lower
.sbm-email-footer .sbm-content .sbm-footer-lower
{
background-color: #f9f9f9;
}