diff --git a/SaBusMgrStandardBase/Base/App/Sbm-Version.cs b/SaBusMgrStandardBase/Base/App/Sbm-Version.cs index 7aa3020..f2de82c 100644 --- a/SaBusMgrStandardBase/Base/App/Sbm-Version.cs +++ b/SaBusMgrStandardBase/Base/App/Sbm-Version.cs @@ -15,7 +15,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App //------------------------------------------------------------------- public static class Version { - private static String version { get; } = "3.0.1.5"; + private static String version { get; } = "3.0.1.6"; // Retrieve version. public static String GetFullVersion() { return version; } public static String GetAppVersion() @@ -43,6 +43,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App // 3.0.1.3 02-Mar-25 Requirements. // 3.0.1.4 02-Mar-25 Fix pre-login crash on GetCurrencyDecimals(). // 3.0.1.5 03-Mar-25 Refresh Transaction. Assets tidy. + // 3.0.1.6 05-May-25 Addresses. //------------------------------------------------------------------- // 3.0.0 Jul-2021 Initial demo test version. // 02-Feb-25 Initial live deployment. diff --git a/SaBusMgrStandardBase/Base/App/SbmInternals.cs b/SaBusMgrStandardBase/Base/App/SbmInternals.cs index 6b92ede..0f8de4e 100644 --- a/SaBusMgrStandardBase/Base/App/SbmInternals.cs +++ b/SaBusMgrStandardBase/Base/App/SbmInternals.cs @@ -258,7 +258,9 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App return new List(systemCodeCache.GetValueOrDefault(systemCode, new List())); } // Selection of specific system code types. + public List ItemTypeCodes { get { return GetSystemCodes(Sbm.SystemCode.ItemType); } } public List AffiliateTypeCodes { get { return GetSystemCodes(Sbm.SystemCode.AffiliateType); } } + public List AddressTypeCodes { get { return GetSystemCodes(Sbm.SystemCode.AddressType); } } public List AssociationTypeCodes { get { return GetSystemCodes(Sbm.SystemCode.AssociationType); } } public List CommodityTypeCodes { get { return GetSystemCodes(Sbm.SystemCode.CommodityType); } } public List AssetTypeCodes { get { return GetSystemCodes(Sbm.SystemCode.AssetType); } } diff --git a/SaBusMgrStandardBase/Base/Bus/SbmAddress.cs b/SaBusMgrStandardBase/Base/Bus/SbmAddress.cs index b297f07..a7ae3c9 100644 --- a/SaBusMgrStandardBase/Base/Bus/SbmAddress.cs +++ b/SaBusMgrStandardBase/Base/Bus/SbmAddress.cs @@ -24,6 +24,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus RefExt, Name, DescBrief, + Caption, Summary, Line1, Line2, @@ -41,7 +42,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus IsPrimary, // Common properties. Notes, - Flag, + Flags, Status, Status_Ind, Status_Desc, @@ -373,7 +374,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus SaStatus.Current, }; public static SaStatus DefaultStatus { get { return SaStatus.Current; } } - public static List AddressStatuses { get { return new List(addressStatuses); } } + public static List ValidStatuses { get { return new List(addressStatuses); } } public static DataValue.TriStateType GetStatusTriState(SaStatus status) { addressStatuses.Add(SaStatus.Current); @@ -700,8 +701,9 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus public HashSet IdsIncluded { get; } = new HashSet(); public HashSet IdsExcluded { get; } = new HashSet(); // Address. + public String Search { get; set; } public Sbm.AddressType AddressType { get; set; } - public ItemId ItemId { get; set; } + public SbmItemId ItemId { get; set; } public SysId AffiliateIdOwner { get; set; } public SysId AddressIdRef { get; set; } public String RefExt { get; set; } diff --git a/SaBusMgrStandardBase/Base/Mgr/SbmAccountMgr_Address.cs b/SaBusMgrStandardBase/Base/Mgr/SbmAccountMgr_Address.cs index 69d336c..d14c315 100644 --- a/SaBusMgrStandardBase/Base/Mgr/SbmAccountMgr_Address.cs +++ b/SaBusMgrStandardBase/Base/Mgr/SbmAccountMgr_Address.cs @@ -7,6 +7,7 @@ using Sarand.Net.Standard.Base.Dbas; using Sarand.Net.Standard.Base.Utils; using System; using System.Collections.Generic; +using System.Linq; namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr { @@ -212,7 +213,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr errField.Status = SacsHierarchyItem.ValidValue.Invalid; return false; } - if (!SbmAddress.AddressStatuses.Contains(data.Status)) + if (!SbmAddress.ValidStatuses.Contains(data.Status)) { errField.Status = SacsHierarchyItem.ValidValue.Invalid; return SetErrorState(ErrorMessage.InvalidStatus); @@ -260,13 +261,13 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr public abstract List GetAddressQueryFilter(SbmAddress.Params prm); public abstract long GetAddressCount(SbmAddress.Params prm); public abstract List GetAddressList(SbmAddress.Params prm); - public abstract DbResultSet AddressExecuteQuery(List columns, SbmAddress.Params prm); + public abstract DbResultSet ExecuteAddressQuery(List columns, SbmAddress.Params prm); //------------------------------------------------------------------- // Item addresses. - public bool HasItemAddresses(ItemId itemId, Sbm.AddressType addressType = Sbm.AddressType.Any, SbmAddress.StatusCat statusCat = SbmAddress.StatusCat.NotDeleted) + public bool HasItemAddresses(SbmItemId itemId, Sbm.AddressType addressType = Sbm.AddressType.Any, SbmAddress.StatusCat statusCat = SbmAddress.StatusCat.NotDeleted) { - if (itemId.Type < 1 || !SysId.IsValid(itemId.Id)) return false; + if (!SbmItemId.IsValid(itemId)) return false; SbmAddress.Params prm = new SbmAddress.Params { ItemId = itemId, @@ -275,9 +276,9 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr }; return (GetAddressCount(prm) > 0); } - public List GetItemAddresses(ItemId itemId, Sbm.AddressType addressType = Sbm.AddressType.Any, SbmAddress.StatusCat statusCat = SbmAddress.StatusCat.NotDeleted) + public List GetItemAddresses(SbmItemId itemId, Sbm.AddressType addressType = Sbm.AddressType.Any, SbmAddress.StatusCat statusCat = SbmAddress.StatusCat.NotDeleted) { - if (addressType > 0 || !SysId.IsValid(itemId.Id)) return new List(); + if (!SbmItemId.IsValid(itemId)) return new List(); SbmAddress.Params prm = new SbmAddress.Params { ItemId = itemId, @@ -286,37 +287,57 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr }; return GetAddressList(prm); } + + //------------------------------------------------------------------- + // Primary address. + public SbmAddress GetPrimaryAddress(SbmItemId itemId) + { + if (!SbmItemId.IsValid(itemId)) return null; + SbmAddress.Params prm = new SbmAddress.Params + { + ItemId = itemId, + PrimaryOnly = true, + StatusCat = SbmAddress.StatusCat.NotDeleted + }; + return GetAddress(prm); + } + + /// + /// Return the summary for the most appropriate address for this item. + ///
- Prioritise Primary, Office addresses and by Id (earliest created). + ///
- Specify address type to restrict. + ///
+ public String GetItemAddressSummary(SbmItemId itemId, Sbm.AddressType addressType = Sbm.AddressType.Any) + { + // More efficient cloning logic used in Affiliate/Association/Transaction query execution. + List addresses = + GetItemAddresses(itemId, addressType, SbmAddress.StatusCat.NotDeleted) + .Where(add => (addressType <= 0 || add.AddressType == addressType) && !add.IsStatusDeleted) + .OrderBy(add => SysId.ToLong(add.Id)) + .ToList(); + SbmAddress address = addresses.FirstOrDefault(add => add.IsPrimary); + if (address == null) + address = addresses.FirstOrDefault(add => add.AddressType == Sbm.AddressType.Office); + return address?.GetSummary() ?? ""; + } + //------------------------------------------------------------------- // Utilities. public List GetAddressesFor(SbmAddress.Params prm) { - GetAddressCount(prm); - return GetAddresses(); - } - public List GetAddresses() - { - List addresses = new List(); - while (true) - { - SbmAddress address = null; - if (address == null) break; - addresses.Add(address); - address = null; // Do not delete - it is now owned by the list. - } - return addresses; + return GetAddressList(prm); } - public List GetAddressesFor(Sbm.ItemType itemType, ItemId itemId) + public List GetAddressesFor(SbmItemId itemId) { - if ((int)itemType < 1 || !ItemId.IsValid(itemId)) return null; + if (!ItemId.IsValid(itemId)) return null; SbmAddress.Params prmAddress = new SbmAddress.Params(); prmAddress.ItemId = itemId; - GetAddressCount(prmAddress); - return GetAddresses(); + return GetAddressList(prmAddress); } - public bool ClearAddressesFor(Sbm.ItemType itemType, ItemId itemId) + public bool ClearAddressesFor(SbmItemId itemId) { - List addresses = GetAddressesFor(itemType, itemId); + List addresses = GetAddressesFor(itemId); bool bClear = ClearAddresses(addresses); if (addresses != null) addresses.Clear(); return bClear; @@ -361,6 +382,19 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr } break; + //----------------------------------------------------------- + // Address caption. + case SbmAddress.Column.Caption: + { + String line1 = values.GetValue(GetAddressColumnDfn(SbmAddress.Column.Line1).DataName).AsString(); + String city = values.GetValue(GetAddressColumnDfn(SbmAddress.Column.City).DataName).AsString(); + String province = values.GetValue(GetAddressColumnDfn(SbmAddress.Column.Province).DataName).AsString(); + String postcode = values.GetValue(GetAddressColumnDfn(SbmAddress.Column.Postcode).DataName).AsString(); + String country = values.GetValue(GetAddressColumnDfn(SbmAddress.Column.Country).DataName).AsString(); + value = new DataValue(SbmAddress.GetSummary(line1, city, province, postcode, country)); + } + break; + //----------------------------------------------------------- // Address summary. case SbmAddress.Column.Summary: diff --git a/SaBusMgrStandardBase/Base/Mgr/SbmCoreMgr.cs b/SaBusMgrStandardBase/Base/Mgr/SbmCoreMgr.cs index 8156c0c..7fa61a2 100644 --- a/SaBusMgrStandardBase/Base/Mgr/SbmCoreMgr.cs +++ b/SaBusMgrStandardBase/Base/Mgr/SbmCoreMgr.cs @@ -160,7 +160,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr foreach (Sbm.ApplCodeType codeType in SupportedCodeTypes) prmCode.CodeTypeCodes.Add(SbmSystem.GetCodeTypeCode(codeType)); prmCode.StatusCat = SaCode.StatusCat.Any; - codeTypeCache = new CodeTypeCache(await CodeTypeConsole.GetCodesByCodeTypeAsync(prmCode)); + codeTypeCache = new CodeTypeCache(await CodeTypeConsole.GetCodesAsync(prmCode)); } //------------------------------------------------------------------- @@ -338,7 +338,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr foreach (Sbm.ApplCodeType codeType in SupportedCodeTypes) prmCode.CodeTypeCodes.Add(SbmSystem.GetCodeTypeCode(codeType)); prmCode.StatusCat = SaCode.StatusCat.Any; - Dictionary> codesByCodeType = CodeTypeConsole.GetCodesByCodeType(prmCode); + Dictionary> codesByCodeType = CodeTypeConsole.GetCodes(prmCode); // Populate any supported code types without codes. foreach (Sbm.ApplCodeType codeType in SupportedCodeTypes) { diff --git a/SaBusMgrStandardBase/SaBusMgrStandardBase.csproj b/SaBusMgrStandardBase/SaBusMgrStandardBase.csproj index 7bdaff0..05323d0 100644 --- a/SaBusMgrStandardBase/SaBusMgrStandardBase.csproj +++ b/SaBusMgrStandardBase/SaBusMgrStandardBase.csproj @@ -6,7 +6,7 @@ - + diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas-Address.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas-Address.cs index 7496e99..aad7ee4 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas-Address.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas-Address.cs @@ -15,6 +15,7 @@ using System; using System.Collections.Generic; using System.Data.Common; using System.Linq; +using System.Text.RegularExpressions; namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr { @@ -53,10 +54,10 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr DbQuery qry = new DbQuery(Database.DbmsType); qry.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Address)); qry.Columns.Add(colAddress_Id); - qry.Filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Address_ItemType) + "=" + ((int)addressPrimary.ItemType).ToString()); - qry.Filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Address_ItemId) + "=" + addressPrimary.ItemId.ToString()); - qry.Filters.Add(colAddress_Id + "<>" + addressPrimaryId.ToString()); - qry.Filters.Add(GetPrimaryAddressFilter(true, aliasAddress)); + qry.Filters.Add($"{SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Address_ItemType)}={(int)addressPrimary.ItemType}"); + qry.Filters.Add($"{SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Address_ItemId)}={SysId.ToLong(addressPrimary.ItemId)}"); + qry.Filters.Add($"{colAddress_Id}<>{SysId.ToLong(addressPrimaryId)}"); + qry.Filters.Add(GetPrimaryAddressFilter(true, "")); using (DbResultSet dbResultSet = DbResultSet_DataReader.ExecuteQuery(Database, qry.BuildQuery())) { @@ -67,7 +68,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr if (address != null && address.Id != addressPrimaryId && address.IsPrimary) { address.IsPrimary = false; - if (!UpdateAddress(address, dbUpdateInfo)) SetErrorState("failed to update adress - " + ErrorState); + if (!UpdateAddress(address, dbUpdateInfo)) SetErrorState($"failed to update adress - {ErrorState}"); } } } @@ -426,6 +427,9 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr SetAddressColDfn(columnDfn, "Desc Brief", 120, SbmDbDfn.ColumnIdx.Address_DescBrief); break; /*------------------------------------*/ + case SbmAddress.Column.Caption: + SetAddressColDfn(columnDfn, "Address", 240, SbmDbDfn.ColumnIdx.Unknown); + break; case SbmAddress.Column.Summary: SetAddressColDfn(columnDfn, "Address", 240, SbmDbDfn.ColumnIdx.Unknown); break; @@ -481,6 +485,9 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr case SbmAddress.Column.Notes: SetAddressColDfn(columnDfn, "Notes", 200, SbmDbDfn.ColumnIdx.Address_Notes); break; + case SbmAddress.Column.Flags: + SetAddressColDfn(columnDfn, "Flags", 50, SbmDbDfn.ColumnIdx.Address_Flags, ColumnAlignment.Center, DataValue.DataType.Long); + break; case SbmAddress.Column.Status: SetAddressColDfn(columnDfn, "Status", 50, SbmDbDfn.ColumnIdx.Address_Status, ColumnAlignment.Center); break; @@ -520,14 +527,36 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr if (prm.IdsExcluded.HasValidIds()) filter.Add($"{colId} NOT IN ({prm.IdsExcluded.Concat(",")})"); - //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + //--------------------------------------------------------------- + String colRefExt = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_RefExt, aliasAddress); + String colName = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Name, aliasAddress); + String colDescBrief = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_DescBrief, aliasAddress); + String colLine1 = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Line1, aliasAddress); + String colLine2 = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Line2, aliasAddress); + String colLine3 = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Line3, aliasAddress); + String colCity = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_City, aliasAddress); + String colProvince = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Province, aliasAddress); + String colPostcode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Postcode, aliasAddress); + if (!StringUtil.IsBlank(prm.Search)) + { + foreach (String search in Regex.Split(prm.Search, "[\\s,;\\-+]+")) + { + if (StringUtil.IsBlank(search)) continue; + String searchForLike = DbQuery.FormatForLike(search, true); + List searchFilter = new List(); + foreach (String col in new String[] { colRefExt, colName, colDescBrief, colLine1, colLine2, colLine3, colCity, colProvince, colPostcode }) + searchFilter.Add($"{col} LIKE '%{searchForLike}%'"); + filter.Add(searchFilter.Concat(" OR ", "(", ")")); + } + } + + //--------------------------------------------------------------- // Address Type. String colAddress_Type = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Type, aliasAddress); if (prm.AddressType > 0) filter.Add(colAddress_Type + "='" + ((int)prm.AddressType).ToString()); - //--------------------------------------------------------------- - - // ItemType & ItemId. + // Item Id. if (ItemId.IsValid(prm.ItemId)) { List filterItemTypes = new List(); @@ -547,11 +576,12 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr } //--------------------------------------------------------------- - // AffIdOwner. + // Affiliate Id Owner. String colAddress_AffIdOwner = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_AffIdOwner, aliasAddress); if (SysId.IsValid(prm.AffiliateIdOwner)) filter.Add(colAddress_AffIdOwner + "=" + SysId.ToString(prm.AffiliateIdOwner)); - // AddIdRef. + + // Address Id Ref. String colAddress_AddIdRef = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_AddIdRef, aliasAddress); if (SysId.IsValid(prm.AddressIdRef)) filter.Add(colAddress_AddIdRef + "=" + SysId.ToString(prm.AddressIdRef)); @@ -668,7 +698,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr public String GetPrimaryAddressFilter(bool match, String aliasTable) { DbQuery qry = new DbQuery(Database.DbmsType); - return DbQuery.BuildBitMappedFilter(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Flags, aliasAddress), SbmAddress.Flag_Primary, match); + return DbQuery.BuildBitMappedFilter(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Flags, aliasTable), SbmAddress.Flag_Primary, match); } // Address sort columns. @@ -710,7 +740,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr private long GetAddressCount(String filter) { ClearErrorState(); - return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Address) + " As " + aliasAddress, filter); + return Database.GetRowCount($"{SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Address)} As {aliasAddress}", filter); } public override long GetAddressCount(SbmAddress.Params prm) { @@ -759,7 +789,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr //------------------------------------------------------------------- // Address query execution. - public override DbResultSet AddressExecuteQuery(List columns, SbmAddress.Params prm) + public override DbResultSet ExecuteAddressQuery(List columns, SbmAddress.Params prm) { ClearErrorState(); @@ -780,19 +810,19 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr if (columns.HasId(SbmAddress.Column.DescBrief)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_DescBrief, aliasAddress)); - if (columns.HasId(SbmAddress.Column.Line1) || columns.HasId(SbmAddress.Column.Summary)) + if (columns.HasId(SbmAddress.Column.Line1) || columns.HasId(SbmAddress.Column.Caption) || columns.HasId(SbmAddress.Column.Summary)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Line1, aliasAddress)); - if (columns.HasId(SbmAddress.Column.Line2) || columns.HasId(SbmAddress.Column.Summary)) + if (columns.HasId(SbmAddress.Column.Line2) || columns.HasId(SbmAddress.Column.Caption) || columns.HasId(SbmAddress.Column.Summary)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Line2, aliasAddress)); - if (columns.HasId(SbmAddress.Column.Line3) || columns.HasId(SbmAddress.Column.Summary)) + if (columns.HasId(SbmAddress.Column.Line3) || columns.HasId(SbmAddress.Column.Caption) || columns.HasId(SbmAddress.Column.Summary)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Line3, aliasAddress)); - if (columns.HasId(SbmAddress.Column.City) || columns.HasId(SbmAddress.Column.Summary)) + if (columns.HasId(SbmAddress.Column.City) || columns.HasId(SbmAddress.Column.Caption) || columns.HasId(SbmAddress.Column.Summary)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_City, aliasAddress)); - if (columns.HasId(SbmAddress.Column.Province) || columns.HasId(SbmAddress.Column.Summary)) + if (columns.HasId(SbmAddress.Column.Province) || columns.HasId(SbmAddress.Column.Caption) || columns.HasId(SbmAddress.Column.Summary)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Province, aliasAddress)); - if (columns.HasId(SbmAddress.Column.Postcode) || columns.HasId(SbmAddress.Column.Summary)) + if (columns.HasId(SbmAddress.Column.Postcode) || columns.HasId(SbmAddress.Column.Caption) || columns.HasId(SbmAddress.Column.Summary)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Postcode, aliasAddress)); - if (columns.HasId(SbmAddress.Column.Country) || columns.HasId(SbmAddress.Column.Summary)) + if (columns.HasId(SbmAddress.Column.Country) || columns.HasId(SbmAddress.Column.Caption) || columns.HasId(SbmAddress.Column.Summary)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Country, aliasAddress)); if (columns.HasId(SbmAddress.Column.Contact)) @@ -811,6 +841,8 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr // Common Properties if (columns.HasId(SbmAddress.Column.Notes)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Notes, aliasAddress)); + if (columns.HasId(SbmAddress.Column.Flags)) + query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Flags, aliasAddress)); if (columns.HasId(SbmAddress.Column.Status) || columns.HasId(SbmAddress.Column.Status_Desc) || columns.HasId(SbmAddress.Column.Status_Ind)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Status, aliasAddress)); if (columns.HasId(SbmAddress.Column.CreateOn_Date)) diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas-Affiliate.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas-Affiliate.cs index e0ab5fd..0891cf1 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas-Affiliate.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas-Affiliate.cs @@ -46,7 +46,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr public override long GetAffiliateOwnerAssociationCount(SysId affiliateIdOwner, Sbm.AssociationType associationType = Sbm.AssociationType.Any, bool activeOnly = true) { ClearErrorState(); - if (!SysId.IsValid(affiliateIdOwner) || (int)associationType < 1) return 0; + if (!SysId.IsValid(affiliateIdOwner)) return 0; if (Database != null) { SbmAssociation.Params prmAssociation = new SbmAssociation.Params @@ -56,7 +56,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr StatusCat = activeOnly ? SbmAssociation.StatusCat.Active : SbmAssociation.StatusCat.NotDeleted }; String filter = GetAssociationQueryFilter(prmAssociation).Concat(" AND ", "(", ")"); - Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Association), filter); + return Database.GetRowCount($"{SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Association)} As {aliasAssociation}", filter); } return 0; } @@ -77,7 +77,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr StatusCat = activeOnly ? SbmAssociation.StatusCat.Active : SbmAssociation.StatusCat.NotDeleted }; String filter = GetAssociationQueryFilter(prmAssociation).Concat(" AND ", "(", ")"); - Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Association), filter); + return Database.GetRowCount($"{SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Association)} As {aliasAssociation}", filter); } return 0; } @@ -88,7 +88,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr public override long GetAffiliateTargetAssociationCount(SysId affiliateIdTarget, Sbm.AssociationType associationType = Sbm.AssociationType.Any, bool activeOnly = true) { ClearErrorState(); - if (!SysId.IsValid(affiliateIdTarget) || (int)associationType < 1) return 0; + if (!SysId.IsValid(affiliateIdTarget)) return 0; if (Database != null) { SbmAssociation.Params prmAssociation = new SbmAssociation.Params @@ -98,7 +98,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr StatusCat = activeOnly ? SbmAssociation.StatusCat.Active : SbmAssociation.StatusCat.NotDeleted }; String filter = GetAssociationQueryFilter(prmAssociation).Concat(" AND ", "(", ")"); - Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Association), filter); + return Database.GetRowCount($"{SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Association)} As {aliasAssociation}", filter); } return 0; } @@ -485,8 +485,8 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr //------------------------------------------------------------------- // Column definitions. private const String aliasAffiliate = "aAffil"; - private const String aliasAffiliate_AddPrim = "Aff_AddPrim"; - private const String prefixAffiliate_AddPrim = aliasAffiliate_AddPrim + "_"; + private const String aliasAffiliate_Address = "Aff_Add"; + private const String prefixAffiliate_Address = aliasAffiliate_Address + "_"; private const String colNameAffiliate_GroupMembers = "GroupMembers"; private const String colNameAffiliate_AssociationOwnerCount = "AssocOwnerCount"; private const String colNameAffiliate_AssociationTargetCount = "AssocTargetCount"; @@ -594,28 +594,28 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr //--------------------------------------------------------------- // Addresses Summary. case SbmAffiliate.Column.Address_Summary: - SetAffiliateColDfn(columnDfn, "Address", 220, SbmDbDfn.ColumnIdx.Address_Postcode, ColumnAlignment.Default, DataValue.DataType.String, aliasAffiliate_AddPrim); + SetAffiliateColDfn(columnDfn, "Address", 220, SbmDbDfn.ColumnIdx.Address_Postcode, ColumnAlignment.Default, DataValue.DataType.String, aliasAffiliate_Address); break; case SbmAffiliate.Column.Address_Line1: - SetAffiliateColDfn(columnDfn, "Address", 120, SbmDbDfn.ColumnIdx.Address_Line1, ColumnAlignment.Default, DataValue.DataType.String, aliasAffiliate_AddPrim, prefixAffiliate_AddPrim); + SetAffiliateColDfn(columnDfn, "Address", 120, SbmDbDfn.ColumnIdx.Address_Line1, ColumnAlignment.Default, DataValue.DataType.String, aliasAffiliate_Address, prefixAffiliate_Address); break; case SbmAffiliate.Column.Address_Line2: - SetAffiliateColDfn(columnDfn, "Line 2", 120, SbmDbDfn.ColumnIdx.Address_Line2, ColumnAlignment.Default, DataValue.DataType.String, aliasAffiliate_AddPrim, prefixAffiliate_AddPrim); + SetAffiliateColDfn(columnDfn, "Line 2", 120, SbmDbDfn.ColumnIdx.Address_Line2, ColumnAlignment.Default, DataValue.DataType.String, aliasAffiliate_Address, prefixAffiliate_Address); break; case SbmAffiliate.Column.Address_Line3: - SetAffiliateColDfn(columnDfn, "Line 3", 120, SbmDbDfn.ColumnIdx.Address_Line3, ColumnAlignment.Default, DataValue.DataType.String, aliasAffiliate_AddPrim, prefixAffiliate_AddPrim); + SetAffiliateColDfn(columnDfn, "Line 3", 120, SbmDbDfn.ColumnIdx.Address_Line3, ColumnAlignment.Default, DataValue.DataType.String, aliasAffiliate_Address, prefixAffiliate_Address); break; case SbmAffiliate.Column.Address_City: - SetAffiliateColDfn(columnDfn, "City", 80, SbmDbDfn.ColumnIdx.Address_City, ColumnAlignment.Default, DataValue.DataType.String, aliasAffiliate_AddPrim, prefixAffiliate_AddPrim); + SetAffiliateColDfn(columnDfn, "City", 80, SbmDbDfn.ColumnIdx.Address_City, ColumnAlignment.Default, DataValue.DataType.String, aliasAffiliate_Address, prefixAffiliate_Address); break; case SbmAffiliate.Column.Address_Province: - SetAffiliateColDfn(columnDfn, "Province", 80, SbmDbDfn.ColumnIdx.Address_Province, ColumnAlignment.Default, DataValue.DataType.String, aliasAffiliate_AddPrim, prefixAffiliate_AddPrim); + SetAffiliateColDfn(columnDfn, "Province", 80, SbmDbDfn.ColumnIdx.Address_Province, ColumnAlignment.Default, DataValue.DataType.String, aliasAffiliate_Address, prefixAffiliate_Address); break; case SbmAffiliate.Column.Address_Country: - SetAffiliateColDfn(columnDfn, "Country", 80, SbmDbDfn.ColumnIdx.Address_Country, ColumnAlignment.Default, DataValue.DataType.String, aliasAffiliate_AddPrim, prefixAffiliate_AddPrim); + SetAffiliateColDfn(columnDfn, "Country", 80, SbmDbDfn.ColumnIdx.Address_Country, ColumnAlignment.Default, DataValue.DataType.String, aliasAffiliate_Address, prefixAffiliate_Address); break; case SbmAffiliate.Column.Address_Postcode: - SetAffiliateColDfn(columnDfn, "Postcode", 65, SbmDbDfn.ColumnIdx.Address_Postcode, ColumnAlignment.Center, DataValue.DataType.String, aliasAffiliate_AddPrim, prefixAffiliate_AddPrim); + SetAffiliateColDfn(columnDfn, "Postcode", 65, SbmDbDfn.ColumnIdx.Address_Postcode, ColumnAlignment.Center, DataValue.DataType.String, aliasAffiliate_Address, prefixAffiliate_Address); break; //----------------------------------------------------------------- @@ -998,7 +998,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr private long GetAffiliateCount(String filter) { ClearErrorState(); - return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Affiliate) + " As " + aliasAffiliate, filter); + return Database.GetRowCount($"{SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Affiliate)} As {aliasAffiliate}", filter); } public override long GetAffiliateCount(SbmAffiliate.Params prm) { @@ -1123,7 +1123,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_UpdateOn, aliasAffiliate)); //--------------------------------------------------------------- - // Primary address. + // Address - prioritising primary and office addresses. bool hasColsAddPrim = false; if (!hasColsAddPrim) hasColsAddPrim = columns.HasId(SbmAffiliate.Column.Address_Summary); if (!hasColsAddPrim) hasColsAddPrim = columns.HasId(SbmAffiliate.Column.Address_Line1); @@ -1135,30 +1135,27 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr if (!hasColsAddPrim) hasColsAddPrim = columns.HasId(SbmAffiliate.Column.Address_Country); if (hasColsAddPrim) { - // Sub-query to identify primary address with lowest Id for each affiliate. - DbQuery qryAddPrimMinId = new DbQuery(Database.DbmsType); - qryAddPrimMinId.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Address)); - qryAddPrimMinId.Filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Address_ItemType) + "=" + ((int)Sbm.ItemType.Affiliate).ToString()); - qryAddPrimMinId.Filters.Add(DbQuery.BuildBitMappedFilter(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Address_Flags), SbmAddress.Flag_Primary, true)); - qryAddPrimMinId.Columns.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Address_ItemType)); - qryAddPrimMinId.Columns.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Address_ItemId)); - qryAddPrimMinId.Columns.Add("Min(" + SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Address_Id) + ")", SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Address_Id, false)); - qryAddPrimMinId.GroupBy.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Address_ItemType)); - qryAddPrimMinId.GroupBy.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Address_ItemId)); + // Identify the most suitable Address to display for this Item. + // Preferred is the 'Primary' address, but in its absence, the address with the lowest Id. + // Sub-query for use in 'Outer Apply' + // Select Top 1 * From Address Where [ItemType & ItemId = parent] Order By [Primary flag, type=office etc] + DbQuery qryAddrSub = new DbQuery(Database.DbmsType); + String aliasAddrSubQuery = "addrSub"; + qryAddrSub.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Address), aliasAddrSubQuery); + qryAddrSub.Columns.Add($"Top 1 *"); + qryAddrSub.Filters.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_ItemType, aliasAddrSubQuery)}={(int)Sbm.ItemType.Affiliate}"); + qryAddrSub.Filters.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_ItemId, aliasAddrSubQuery)}={SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Id, aliasAffiliate)}"); + qryAddrSub.Filters.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Status, aliasAddrSubQuery)}!='{StatusDeleted}'"); + // Prioritise Primary, Office and lower Id. + String colAddrPrimaryFlag = DbQuery.BuildBitMappedValue($"{aliasAddrSubQuery}.{SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Address_Flags)}", SbmAddress.Flag_Primary, true); + qryAddrSub.OrderBy.Add($"{colAddrPrimaryFlag} Desc"); + qryAddrSub.OrderBy.Add($"Case When {SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Type, aliasAddrSubQuery)}={(int)Sbm.AddressType.Office} Then 0 Else 1 End"); + qryAddrSub.OrderBy.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Id, aliasAddrSubQuery)}"); - // Join to primary address with lowest Id. - String aliasAffiliate_AddPrimId = "AddPrimId"; - DbQueryJoin joinAddPrimId = new DbQueryJoin(DbJoinType.LeftOuter); - joinAddPrimId.Table = new StringPair("(" + qryAddPrimMinId.BuildQuery() + ")", aliasAffiliate_AddPrimId); - joinAddPrimId.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_ItemType, aliasAffiliate_AddPrimId) + "=" + ((int)Sbm.ItemType.Affiliate).ToString()); - joinAddPrimId.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_ItemId, aliasAffiliate_AddPrimId) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Id, aliasAffiliate)); - query.Joins.Add(joinAddPrimId); - - // Join to the primary address with lowest Id. - DbQueryJoin joinAddPrim = new DbQueryJoin(DbJoinType.LeftOuter); - joinAddPrim.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Address), aliasAffiliate_AddPrim); - joinAddPrim.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Id, aliasAffiliate_AddPrim) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Id, aliasAffiliate_AddPrimId)); - query.Joins.Add(joinAddPrim); + // Join to the Address with lowest Id, prioritising Primary Addresses and office addresses. + DbQueryJoin joinAddr = new DbQueryJoin(DbJoinType.OuterApply); + joinAddr.Table = new StringPair($"({qryAddrSub.BuildQuery()})", aliasAffiliate_Address); + query.Joins.Add(joinAddr); // Add the Address columns. List addprimaryCols = new List() { @@ -1176,7 +1173,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr SbmDbDfn.ColumnIdx.Address_Email, }; foreach (SbmDbDfn.ColumnIdx dbColumn in addprimaryCols) - query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasAffiliate_AddPrim), prefixAffiliate_AddPrim + SbmDbDfn.GetColumnName(dbColumn, false)); + query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasAffiliate_Address), prefixAffiliate_Address + SbmDbDfn.GetColumnName(dbColumn, false)); } //--------------------------------------------------------------- diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas-Association.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas-Association.cs index dd8d869..8b88505 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas-Association.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas-Association.cs @@ -430,12 +430,12 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr case SbmAssociation.Column.Status_Desc: return SbmDbDfn.ColumnIdx.Association_Status; case SbmAssociation.Column.Status_Ind: return SbmDbDfn.ColumnIdx.Unknown; //------------------------------------------------------------------- Association's owner details - case SbmAssociation.Column.AffIdOwner: return SbmDbDfn.ColumnIdx.Unknown; - case SbmAssociation.Column.Owner_Name: return SbmDbDfn.ColumnIdx.Unknown; + case SbmAssociation.Column.AffIdOwner: return SbmDbDfn.ColumnIdx.Association_AffIdOwner; + case SbmAssociation.Column.Owner_Name: return SbmDbDfn.ColumnIdx.Affiliate_Name; //------------------------------------------------------------------- Association's target details - case SbmAssociation.Column.AffIdTarget: return SbmDbDfn.ColumnIdx.Unknown; + case SbmAssociation.Column.AffIdTarget: return SbmDbDfn.ColumnIdx.Association_AffIdTarget; case SbmAssociation.Column.Target_Type: return SbmDbDfn.ColumnIdx.Affiliate_Type; - case SbmAssociation.Column.Target_TypeDesc: return SbmDbDfn.ColumnIdx.Unknown; + case SbmAssociation.Column.Target_TypeDesc: return SbmDbDfn.ColumnIdx.Affiliate_Name; case SbmAssociation.Column.Target_Name: return SbmDbDfn.ColumnIdx.Affiliate_Name; case SbmAssociation.Column.Target_Nature: return SbmDbDfn.ColumnIdx.Affiliate_Nature; case SbmAssociation.Column.Target_PhoneMain: return SbmDbDfn.ColumnIdx.Affiliate_PhoneMain; @@ -810,7 +810,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr //----------------------------------------------------------- // Target details. case SbmAssociation.Column.AffIdTarget: - SetAssociationColDfn(columnDfn, "Target Id", 60, SbmDbDfn.ColumnIdx.Association_AffIdOwner, ColumnAlignment.Right, DataValue.DataType.Long); + SetAssociationColDfn(columnDfn, "Target Id", 60, SbmDbDfn.ColumnIdx.Association_AffIdTarget, ColumnAlignment.Right, DataValue.DataType.Long); break; case SbmAssociation.Column.Target_Type: SetAssociationColDfn(columnDfn, "Type", 40, SbmDbDfn.ColumnIdx.Affiliate_Type, ColumnAlignment.Center, DataValue.DataType.Long, aliasAssociation_Affiliate_Target, prefixAssociation_Affiliate_Target); @@ -1732,7 +1732,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr private long GetAssociationCount(String filter) { ClearErrorState(); - return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Association) + " As " + aliasAssociation, filter); + return Database.GetRowCount($"{SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Association)} As {aliasAssociation}", filter); } public override long GetAssociationCount(SbmAssociation.Params prm) { @@ -1938,33 +1938,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr if (!hasColsAffTarget) hasColsAffTarget = columns.HasId(SbmAssociation.Column.Target_Website); if (!hasColsAffTarget) hasColsAffTarget = columns.HasId(SbmAssociation.Column.Target_Notes); - bool hasColsAffTargetAddress = false; - if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_Type) || columns.HasId(SbmAssociation.Column.Target_Address_TypeDesc); - if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_RefExt); - if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_Name); - if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_DescBrief); - if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_Summary); - if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_Line1); - if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_Line2); - if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_City); - if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_Province); - if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_Postcode); - if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_Country); - if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_Contact); - if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_Phone); - if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_Email); - if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_AccountManagerCode); - if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_AccountManagerDesc); - if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_AccountHandlerCode); - if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_AccountHandlerDesc); - if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_ContactAreaCode); - if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_ContactAreaDesc); - if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_ContactHandlerCode); - if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_ContactHandlerDesc); - if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_LastVisitOn); - if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_NextVisitOn); - - if (hasColsAffTarget || hasColsAffTargetAddress) + if (hasColsAffTarget) { // Join to the target affiliate - NB Use an alias to avoid clashing with the owner affiliate. prm.Alias_Affiliate_Target = aliasAssociation_Affiliate_Target; @@ -1995,96 +1969,122 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr affiliateTargetCols.Add(SbmDbDfn.ColumnIdx.Affiliate_Notes); foreach (SbmDbDfn.ColumnIdx dbColumn in affiliateTargetCols) query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasAssociation_Affiliate_Target), prefixAssociation_Affiliate_Target + SbmDbDfn.GetColumnName(dbColumn, false)); - - // Target affiliate address columns. - if (hasColsAffTargetAddress) - { - // Join to the target contact's primary address. - prm.Alias_Address_Target = aliasAssociation_Target_Address; - DbQueryJoin joinTargetAddress = new DbQueryJoin(DbJoinType.LeftOuter); - joinTargetAddress.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Address), aliasAssociation_Target_Address); - // Address context. - if (prm.AddressContext == SbmAssociation.Params.AddressContextType.All) - { - // Return all addresses for target contact - as separate rows, eg. for export. - joinTargetAddress.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_ItemType, aliasAssociation_Target_Address) + "=" + ((int)Sbm.ItemType.Affiliate).ToString()); - joinTargetAddress.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_ItemId, aliasAssociation_Target_Address) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Id, aliasAssociation_Affiliate_Target)); - } - else - { - // Sub-query to identify primary address with lowest Id for each affiliate. - DbQuery qryAddPrimMinId = new DbQuery(Database.DbmsType); - qryAddPrimMinId.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Address)); - qryAddPrimMinId.Filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Address_ItemType) + "=" + ((int)Sbm.ItemType.Affiliate).ToString()); - if (prm.AddressContext == SbmAssociation.Params.AddressContextType.Delivery) - qryAddPrimMinId.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Type) + "=" + ((int)Sbm.AddressType.Delivery).ToString()); - else - qryAddPrimMinId.Filters.Add(DbQuery.BuildBitMappedFilter(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Address_Flags), SbmAddress.Flag_Primary, true)); - qryAddPrimMinId.Columns.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Address_ItemType)); - qryAddPrimMinId.Columns.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Address_ItemId)); - qryAddPrimMinId.Columns.Add("Min(" + SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Address_Id) + ")", SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Address_Id, false)); - qryAddPrimMinId.GroupBy.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Address_ItemType)); - qryAddPrimMinId.GroupBy.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Address_ItemId)); - - // Join to target contact's primary address with lowest Id. - String aliasAddressMinId = "AssAddMinId"; - DbQueryJoin joinAddPrimId = new DbQueryJoin(DbJoinType.LeftOuter); - joinAddPrimId.Table = new StringPair("(" + qryAddPrimMinId.BuildQuery() + ")", aliasAddressMinId); - joinAddPrimId.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_ItemType, aliasAddressMinId) + "=" + ((int)Sbm.ItemType.Affiliate).ToString()); - joinAddPrimId.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_ItemId, aliasAddressMinId) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Id, aliasAssociation_Affiliate_Target)); - query.Joins.Add(joinAddPrimId); - - // Join to target address with lowest Id. - joinTargetAddress.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Id, aliasAssociation_Target_Address) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Id, aliasAddressMinId)); - } - query.Joins.Add(joinTargetAddress); - // Add the address columns. - List addressTargetCols = new List(); - if (columns.HasId(SbmAssociation.Column.Target_Address_Type) || columns.HasId(SbmAssociation.Column.Target_Address_TypeDesc)) - addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Type); - if (columns.HasId(SbmAssociation.Column.Target_Address_RefExt)) - addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_RefExt); - if (columns.HasId(SbmAssociation.Column.Target_Address_Name)) - addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Name); - if (columns.HasId(SbmAssociation.Column.Target_Address_DescBrief)) - addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_DescBrief); - if (columns.HasId(SbmAssociation.Column.Target_Address_Summary) || columns.HasId(SbmAssociation.Column.Target_Address_Line1)) - addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Line1); - if (columns.HasId(SbmAssociation.Column.Target_Address_Summary) || columns.HasId(SbmAssociation.Column.Target_Address_Line2)) - addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Line2); - if (columns.HasId(SbmAssociation.Column.Target_Address_Summary) || columns.HasId(SbmAssociation.Column.Target_Address_Line3)) - addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Line3); - if (columns.HasId(SbmAssociation.Column.Target_Address_Summary) || columns.HasId(SbmAssociation.Column.Target_Address_City)) - addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_City); - if (columns.HasId(SbmAssociation.Column.Target_Address_Summary) || columns.HasId(SbmAssociation.Column.Target_Address_Province)) - addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Province); - if (columns.HasId(SbmAssociation.Column.Target_Address_Summary) || columns.HasId(SbmAssociation.Column.Target_Address_Postcode)) - addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Postcode); - if (columns.HasId(SbmAssociation.Column.Target_Address_Summary) || columns.HasId(SbmAssociation.Column.Target_Address_Country)) - addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Country); - if (columns.HasId(SbmAssociation.Column.Target_Address_Summary) || columns.HasId(SbmAssociation.Column.Target_Address_Contact)) - addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Contact); - if (columns.HasId(SbmAssociation.Column.Target_Address_Summary) || columns.HasId(SbmAssociation.Column.Target_Address_Phone)) - addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Phone); - //addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Fax)); - if (columns.HasId(SbmAssociation.Column.Target_Address_Summary) || columns.HasId(SbmAssociation.Column.Target_Address_Email)) - addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Email); - if (columns.HasId(SbmAssociation.Column.Target_Address_AccountManagerCode) || columns.HasId(SbmAssociation.Column.Target_Address_AccountManagerDesc)) - addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_AccountManagerCode); - if (columns.HasId(SbmAssociation.Column.Target_Address_AccountHandlerCode) || columns.HasId(SbmAssociation.Column.Target_Address_AccountHandlerDesc)) - addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_AccountHandlerCode); - if (columns.HasId(SbmAssociation.Column.Target_Address_ContactAreaCode) || columns.HasId(SbmAssociation.Column.Target_Address_ContactAreaDesc)) - addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_ContactAreaCode); - if (columns.HasId(SbmAssociation.Column.Target_Address_ContactHandlerCode) || columns.HasId(SbmAssociation.Column.Target_Address_ContactHandlerDesc)) - addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_ContactHandlerCode); - if (columns.HasId(SbmAssociation.Column.Target_Address_LastVisitOn)) - addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_LastVisitOn); - if (columns.HasId(SbmAssociation.Column.Target_Address_NextVisitOn)) - addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_NextVisitOn); - foreach (SbmDbDfn.ColumnIdx dbColumn in addressTargetCols) - query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasAssociation_Target_Address), prefixAssociation_Target_Address + SbmDbDfn.GetColumnName(dbColumn, false)); - } } + + //--------------------------------------------------------------- + // Target address. + + bool hasColsAffTargetAddress = false; + if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_Type) || columns.HasId(SbmAssociation.Column.Target_Address_TypeDesc); + if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_RefExt); + if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_Name); + if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_DescBrief); + if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_Summary); + if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_Line1); + if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_Line2); + if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_City); + if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_Province); + if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_Postcode); + if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_Country); + if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_Contact); + if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_Phone); + if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_Email); + if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_AccountManagerCode); + if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_AccountManagerDesc); + if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_AccountHandlerCode); + if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_AccountHandlerDesc); + if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_ContactAreaCode); + if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_ContactAreaDesc); + if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_ContactHandlerCode); + if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_ContactHandlerDesc); + if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_LastVisitOn); + if (!hasColsAffTargetAddress) hasColsAffTargetAddress = columns.HasId(SbmAssociation.Column.Target_Address_NextVisitOn); + + // Target affiliate address columns. + if (hasColsAffTargetAddress) + { + // Join to the target's address(es). + prm.Alias_Address_Target = aliasAssociation_Target_Address; + DbQueryJoin joinTargetAddress = null; + // Address context. + if (prm.AddressContext == SbmAssociation.Params.AddressContextType.All) + { + // Return all addresses for target contact - as separate rows, eg. for export. + joinTargetAddress = new DbQueryJoin(DbJoinType.LeftOuter); + joinTargetAddress.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Address), aliasAssociation_Target_Address); + joinTargetAddress.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_ItemType, aliasAssociation_Target_Address) + "=" + ((int)Sbm.ItemType.Affiliate).ToString()); + joinTargetAddress.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_ItemId, aliasAssociation_Target_Address) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Id, aliasAssociation_Affiliate_Target)); + } + else + { + // Sub-query to identify suitable address for the Association. + String aliasAddrSub = "addrSub"; + DbQuery qryAddrSub = new DbQuery(Database.DbmsType); + qryAddrSub.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Address), aliasAddrSub); + qryAddrSub.Columns.Add($"Top 1 *"); + qryAddrSub.Filters.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_ItemType, aliasAddrSub)}={(int)Sbm.ItemType.Affiliate}"); + qryAddrSub.Filters.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_ItemId, aliasAddrSub)}={SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Id, aliasAssociation_Affiliate_Target)}"); + if (prm.AddressContext == SbmAssociation.Params.AddressContextType.Delivery) + qryAddrSub.Filters.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Type, aliasAddrSub)}={(int)Sbm.AddressType.Delivery}"); + qryAddrSub.Filters.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Status, aliasAddrSub)}!='{StatusDeleted}'"); + // Prioritise Primary, Office and lower Id. + String colAddrPrimaryFlag = DbQuery.BuildBitMappedValue($"{aliasAddrSub}.{SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Address_Flags)}", SbmAddress.Flag_Primary, true); + qryAddrSub.OrderBy.Add($"{colAddrPrimaryFlag} Desc"); + qryAddrSub.OrderBy.Add($"Case When {SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Type, aliasAddrSub)}={(int)Sbm.AddressType.Office} Then 0 Else 1 End"); + qryAddrSub.OrderBy.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Id, aliasAddrSub)}"); + + // Join to target address with lowest Id. + joinTargetAddress = new DbQueryJoin(DbJoinType.OuterApply); + joinTargetAddress.Table = new StringPair($"({qryAddrSub.BuildQuery()})", aliasAssociation_Target_Address); + } + query.Joins.Add(joinTargetAddress); + // Add the address columns. + List addressTargetCols = new List(); + if (columns.HasId(SbmAssociation.Column.Target_Address_Type) || columns.HasId(SbmAssociation.Column.Target_Address_TypeDesc)) + addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Type); + if (columns.HasId(SbmAssociation.Column.Target_Address_RefExt)) + addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_RefExt); + if (columns.HasId(SbmAssociation.Column.Target_Address_Name)) + addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Name); + if (columns.HasId(SbmAssociation.Column.Target_Address_DescBrief)) + addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_DescBrief); + if (columns.HasId(SbmAssociation.Column.Target_Address_Summary) || columns.HasId(SbmAssociation.Column.Target_Address_Line1)) + addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Line1); + if (columns.HasId(SbmAssociation.Column.Target_Address_Summary) || columns.HasId(SbmAssociation.Column.Target_Address_Line2)) + addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Line2); + if (columns.HasId(SbmAssociation.Column.Target_Address_Summary) || columns.HasId(SbmAssociation.Column.Target_Address_Line3)) + addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Line3); + if (columns.HasId(SbmAssociation.Column.Target_Address_Summary) || columns.HasId(SbmAssociation.Column.Target_Address_City)) + addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_City); + if (columns.HasId(SbmAssociation.Column.Target_Address_Summary) || columns.HasId(SbmAssociation.Column.Target_Address_Province)) + addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Province); + if (columns.HasId(SbmAssociation.Column.Target_Address_Summary) || columns.HasId(SbmAssociation.Column.Target_Address_Postcode)) + addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Postcode); + if (columns.HasId(SbmAssociation.Column.Target_Address_Summary) || columns.HasId(SbmAssociation.Column.Target_Address_Country)) + addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Country); + if (columns.HasId(SbmAssociation.Column.Target_Address_Summary) || columns.HasId(SbmAssociation.Column.Target_Address_Contact)) + addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Contact); + if (columns.HasId(SbmAssociation.Column.Target_Address_Summary) || columns.HasId(SbmAssociation.Column.Target_Address_Phone)) + addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Phone); + //addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Fax)); + if (columns.HasId(SbmAssociation.Column.Target_Address_Summary) || columns.HasId(SbmAssociation.Column.Target_Address_Email)) + addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Email); + if (columns.HasId(SbmAssociation.Column.Target_Address_AccountManagerCode) || columns.HasId(SbmAssociation.Column.Target_Address_AccountManagerDesc)) + addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_AccountManagerCode); + if (columns.HasId(SbmAssociation.Column.Target_Address_AccountHandlerCode) || columns.HasId(SbmAssociation.Column.Target_Address_AccountHandlerDesc)) + addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_AccountHandlerCode); + if (columns.HasId(SbmAssociation.Column.Target_Address_ContactAreaCode) || columns.HasId(SbmAssociation.Column.Target_Address_ContactAreaDesc)) + addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_ContactAreaCode); + if (columns.HasId(SbmAssociation.Column.Target_Address_ContactHandlerCode) || columns.HasId(SbmAssociation.Column.Target_Address_ContactHandlerDesc)) + addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_ContactHandlerCode); + if (columns.HasId(SbmAssociation.Column.Target_Address_LastVisitOn)) + addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_LastVisitOn); + if (columns.HasId(SbmAssociation.Column.Target_Address_NextVisitOn)) + addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_NextVisitOn); + foreach (SbmDbDfn.ColumnIdx dbColumn in addressTargetCols) + query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasAssociation_Target_Address), prefixAssociation_Target_Address + SbmDbDfn.GetColumnName(dbColumn, false)); + } + //--------------------------------------------------------------- // Member columns bool hasColsMember = false; diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas-SysParam.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas-SysParam.cs index 552e9f1..010aec8 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas-SysParam.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas-SysParam.cs @@ -415,7 +415,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr private long GetSysParamCount(String filter) { ClearErrorState(); - return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SysParam) + " As " + aliasSysParam, filter); + return Database.GetRowCount($"{SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SysParam)} As {aliasSysParam}", filter); } public override long GetSysParamCount(SbmSysParam.Params prm) { diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas-SystemAccount.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas-SystemAccount.cs index 9b572b0..63e7579 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas-SystemAccount.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas-SystemAccount.cs @@ -464,7 +464,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr private long GetSystemAccountCount(String filter) { ClearErrorState(); - return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SystemAccount) + " As " + aliasSystemAccount, filter); + return Database.GetRowCount($"{SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SystemAccount)} As {aliasSystemAccount}", filter); } public override long GetSystemAccountCount(SbmSystemAccount.Params prm) { diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas-SystemAccountUser.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas-SystemAccountUser.cs index 7ebafa2..547409b 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas-SystemAccountUser.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas-SystemAccountUser.cs @@ -435,7 +435,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr private long GetSystemAccountUserCount(String filter) { ClearErrorState(); - return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SystemAccountUser) + " As " + aliasSystemAccountUser, filter); + return Database.GetRowCount($"{SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SystemAccountUser)} As {aliasSystemAccountUser}", filter); } public override long GetSystemAccountUserCount(SbmSystemAccountUser.Params prm) { diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas-SystemUser.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas-SystemUser.cs index 193123d..aa4788a 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas-SystemUser.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas-SystemUser.cs @@ -445,7 +445,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr private long GetSystemUserCount(String filter) { ClearErrorState(); - return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SystemUser) + " As " + aliasSystemUser, filter); + return Database.GetRowCount($"{SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SystemUser)} As {aliasSystemUser}", filter); } public override long GetSystemUserCount(SbmSystemUser.Params prm) { diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-Asset.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-Asset.cs index d7c1ac7..2d615fc 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-Asset.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-Asset.cs @@ -758,7 +758,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr private long GetAssetCount(String filter) { ClearErrorState(); - return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaAsset) + " As " + aliasAsset, filter); + return Database.GetRowCount($"{SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaAsset)} As {aliasAsset}", filter); } public override long GetAssetCount(SbmAsset.Params prm) { diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-AssetProcess.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-AssetProcess.cs index 0770e94..fbacf1b 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-AssetProcess.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-AssetProcess.cs @@ -388,7 +388,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr private long GetAssetProcessCount(String filter) { ClearErrorState(); - return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaAssetProcess) + " As " + aliasAssetProcess, filter); + return Database.GetRowCount($"{SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaAssetProcess)} As {aliasAssetProcess}", filter); } public override long GetAssetProcessCount(SbmAssetProcess.Params prm) { diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-Vehicle.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-Vehicle.cs index ab53e0d..77507b8 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-Vehicle.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-Vehicle.cs @@ -151,7 +151,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr { List filter = new List(); filter.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.SaVehicleFeature_VehicleId) + "=" + vehicleId.ToString()); - Database.GetRowCount(tableVehicleFeature, filter.Concat(" AND ", "(", ")")); + return Database.GetRowCount(tableVehicleFeature, filter.Concat(" AND ", "(", ")")); } return 0; } diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-VehicleClass.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-VehicleClass.cs index 5b19f64..a389517 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-VehicleClass.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-VehicleClass.cs @@ -54,7 +54,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr { List filter = new List(); filter.Add($"{SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.SaVehicleFeature_VehicleId)}={SysId.ToLong(vehicleClassId)}"); - Database.GetRowCount(tableVehicle, filter.Concat(" AND ", "(", ")")); + return Database.GetRowCount(tableVehicle, filter.Concat(" AND ", "(", ")")); } return 0; } @@ -672,7 +672,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr private long GetVehicleClassCount(String filter) { ClearErrorState(); - return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaVehicleClass) + " As " + aliasVehicleClass, filter); + return Database.GetRowCount($"{SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaVehicleClass)} As {aliasVehicleClass}", filter); } public override long GetVehicleClassCount(SbmVehicleClass.Params prm) { diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-VehicleEvent.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-VehicleEvent.cs index 392cc48..02da0fd 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-VehicleEvent.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-VehicleEvent.cs @@ -459,7 +459,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr private long GetVehicleEventCount(String filter) { ClearErrorState(); - return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaVehicleEvent) + " As " + aliasVehicleEvent, filter); + return Database.GetRowCount($"{SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaVehicleEvent)} As {aliasVehicleEvent}", filter); } public override long GetVehicleEventCount(SbmVehicleEvent.Params prm) { diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-VehicleFeature.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-VehicleFeature.cs index bbb02ff..d4edc6b 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-VehicleFeature.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-VehicleFeature.cs @@ -508,7 +508,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr private long GetVehicleFeatureCount(String filter) { ClearErrorState(); - return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaVehicleFeature) + " As " + aliasVehicleFeature, filter); + return Database.GetRowCount($"{SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaVehicleFeature)} As {aliasVehicleFeature}", filter); } public override long GetVehicleFeatureCount(SbmVehicleFeature.Params prm) { diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmCommodityMgr_Dbas-Commodity.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmCommodityMgr_Dbas-Commodity.cs index 6a11277..d3cc919 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmCommodityMgr_Dbas-Commodity.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmCommodityMgr_Dbas-Commodity.cs @@ -2651,7 +2651,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr private long GetCommodityCount(String filter) { ClearErrorState(); - return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Commodity) + " As " + aliasCommodity, filter); + return Database.GetRowCount($"{SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Commodity)} As {aliasCommodity}", filter); } public override long GetCommodityCount(SbmCommodity.Params prm) { diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmCommodityMgr_Dbas-CommodityCustomer.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmCommodityMgr_Dbas-CommodityCustomer.cs index c7ae3ba..a380e39 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmCommodityMgr_Dbas-CommodityCustomer.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmCommodityMgr_Dbas-CommodityCustomer.cs @@ -574,7 +574,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr private long GetCommodityCustomerCount(String filter) { ClearErrorState(); - return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.CommodityCustomer) + " As " + aliasCommodityCustomer, filter); + return Database.GetRowCount($"{SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.CommodityCustomer)} As {aliasCommodityCustomer}", filter); } public override long GetCommodityCustomerCount(SbmCommodityCustomer.Params prm) { diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmCommodityMgr_Dbas-CommoditySupplier.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmCommodityMgr_Dbas-CommoditySupplier.cs index 2a42ee6..e2c0149 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmCommodityMgr_Dbas-CommoditySupplier.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmCommodityMgr_Dbas-CommoditySupplier.cs @@ -475,7 +475,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr private long GetCommoditySupplierCount(String filter) { ClearErrorState(); - return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.CommoditySupplier) + " As " + aliasCommoditySupplier, filter); + return Database.GetRowCount($"{SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.CommoditySupplier)} As {aliasCommoditySupplier}", filter); } public override long GetCommoditySupplierCount(SbmCommoditySupplier.Params prm) { diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmCommodityMgr_Dbas-Container.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmCommodityMgr_Dbas-Container.cs index 655813c..e6cee5c 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmCommodityMgr_Dbas-Container.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmCommodityMgr_Dbas-Container.cs @@ -562,7 +562,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr private long GetContainerCount(String filter) { ClearErrorState(); - return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Container) + " As " + aliasContainer, filter); + return Database.GetRowCount($"{SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Container)} As {aliasContainer}", filter); } public override long GetContainerCount(SbmContainer.Params prm) { diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmCommodityMgr_Dbas-ContainerItem.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmCommodityMgr_Dbas-ContainerItem.cs index bf5b549..11e3b23 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmCommodityMgr_Dbas-ContainerItem.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmCommodityMgr_Dbas-ContainerItem.cs @@ -644,7 +644,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr private long GetContainerItemCount(String filter) { ClearErrorState(); - return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ContainerItem) + " As " + aliasContainerItem, filter); + return Database.GetRowCount($"{SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ContainerItem)} As {aliasContainerItem}", filter); } public override long GetContainerItemCount(SbmContainerItem.Params prm) { diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmCommodityMgr_Dbas-PortfolioItem.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmCommodityMgr_Dbas-PortfolioItem.cs index ba348be..4e48256 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmCommodityMgr_Dbas-PortfolioItem.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmCommodityMgr_Dbas-PortfolioItem.cs @@ -944,7 +944,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr private long GetPortfolioItemCount(String filter) { ClearErrorState(); - return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.PortfolioItem) + " As " + aliasPortfolioItem, filter); + return Database.GetRowCount($"{SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.PortfolioItem)} As {aliasPortfolioItem}", filter); } public override long GetPortfolioItemCount(SbmPortfolioItem.Params prm) { diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmDataItemMgr_Dbas-ItemBatch.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmDataItemMgr_Dbas-ItemBatch.cs index 51c210f..872044f 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmDataItemMgr_Dbas-ItemBatch.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmDataItemMgr_Dbas-ItemBatch.cs @@ -403,7 +403,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr private long GetItemBatchCount(String filter) { ClearErrorState(); - return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ItemBatch) + " As " + aliasItemBatch, filter); + return Database.GetRowCount($"{SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ItemBatch)} As {aliasItemBatch}", filter); } public override long GetItemBatchCount(SbmItemBatch.Params prm) { diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmDataItemMgr_Dbas-ItemLink.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmDataItemMgr_Dbas-ItemLink.cs index 79aae08..398535c 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmDataItemMgr_Dbas-ItemLink.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmDataItemMgr_Dbas-ItemLink.cs @@ -527,7 +527,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr private long GetItemLinkCount(String filter) { ClearErrorState(); - return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ItemLink) + " As " + aliasItemLink, filter); + return Database.GetRowCount($"{SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ItemLink)} As " + aliasItemLink, filter); } public override long GetItemLinkCount(SbmItemLink.Params prm) { diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmPriceMgr_Dbas-Price.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmPriceMgr_Dbas-Price.cs index 98dbb55..949138e 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmPriceMgr_Dbas-Price.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmPriceMgr_Dbas-Price.cs @@ -465,7 +465,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr private long GetPriceCount(String filter) { ClearErrorState(); - return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaPrice) + " As " + aliasPrice, filter); + return Database.GetRowCount($"{SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaPrice)} As {aliasPrice}", filter); } public override long GetPriceCount(SbmPrice.Params prm) { diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmPriceMgr_Dbas-PriceSet.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmPriceMgr_Dbas-PriceSet.cs index e58b935..09cbaa1 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmPriceMgr_Dbas-PriceSet.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmPriceMgr_Dbas-PriceSet.cs @@ -437,7 +437,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr private long GetPriceSetCount(String filter) { ClearErrorState(); - return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaPriceSet) + " As " + aliasPriceSet, filter); + return Database.GetRowCount($"{SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaPriceSet)} As {aliasPriceSet}", filter); } public override long GetPriceSetCount(SbmPriceSet.Params prm) { diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmProcessMgr_Dbas-Process.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmProcessMgr_Dbas-Process.cs index 178a989..b8562ed 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmProcessMgr_Dbas-Process.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmProcessMgr_Dbas-Process.cs @@ -601,7 +601,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr private long GetProcessCount(String filter) { ClearErrorState(); - return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Process) + " As " + aliasProcess, filter); + return Database.GetRowCount($"{SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Process)} As {aliasProcess}", filter); } public override long GetProcessCount(SbmProcess.Params prm) { diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmStockMgr_Dbas-Location.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmStockMgr_Dbas-Location.cs index a2f5893..6f1e393 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmStockMgr_Dbas-Location.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmStockMgr_Dbas-Location.cs @@ -458,7 +458,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr private long GetLocationCount(String filter) { ClearErrorState(); - return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Location) + " As " + aliasLocation, filter); + return Database.GetRowCount($"{SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Location)} As {aliasLocation}", filter); } public override long GetLocationCount(SbmLocation.Params prm) { diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmStockMgr_Dbas-Movement.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmStockMgr_Dbas-Movement.cs index dd70906..85fabf9 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmStockMgr_Dbas-Movement.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmStockMgr_Dbas-Movement.cs @@ -793,7 +793,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr private long GetMovementCount(String filter) { ClearErrorState(); - return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Movement) + " As " + aliasMovement, filter); + return Database.GetRowCount($"{SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Movement)} As {aliasMovement}", filter); } public override long GetMovementCount(SbmMovement.Params prm) { diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmStockMgr_Dbas-StockLevel.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmStockMgr_Dbas-StockLevel.cs index f676024..55b9454 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmStockMgr_Dbas-StockLevel.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmStockMgr_Dbas-StockLevel.cs @@ -524,7 +524,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr private long GetStockLevelCount(String filter) { ClearErrorState(); - return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.StockLevel) + " As " + aliasStockLevel, filter); + return Database.GetRowCount($"{SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.StockLevel)} As {aliasStockLevel}", filter); } public override long GetStockLevelCount(SbmStockLevel.Params prm) { diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmTransactionMgr_Dbas-Constituent.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmTransactionMgr_Dbas-Constituent.cs index 52ac523..dbe845b 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmTransactionMgr_Dbas-Constituent.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmTransactionMgr_Dbas-Constituent.cs @@ -923,7 +923,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr private long GetConstituentCount(String filter) { ClearErrorState(); - return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Constituent) + " As " + aliasConstituent, filter); + return Database.GetRowCount($"{SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Constituent)} As {aliasConstituent}", filter); } public override long GetConstituentCount(SbmConstituent.Params prm) { diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmTransactionMgr_Dbas-Requirement.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmTransactionMgr_Dbas-Requirement.cs index b0c077b..557f40a 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmTransactionMgr_Dbas-Requirement.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmTransactionMgr_Dbas-Requirement.cs @@ -2323,7 +2323,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr private long GetRequirementCount(String filter) { ClearErrorState(); - return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement) + " As " + aliasRequirement, filter); + return Database.GetRowCount($"{SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement)} As {aliasRequirement}", filter); } public override long GetRequirementCount(SbmRequirement.Params prm) { diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmTransactionMgr_Dbas-Transaction.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmTransactionMgr_Dbas-Transaction.cs index bd36ecd..f75ab9e 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmTransactionMgr_Dbas-Transaction.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmTransactionMgr_Dbas-Transaction.cs @@ -466,7 +466,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr // Clear addresses. if (!HasErrorState()) { - if (!AccountMgr.ClearAddressesFor(Sbm.ItemType.Transaction, new ItemId())) + if (!AccountMgr.ClearAddressesFor(transaction.GetItemId())) SetErrorState("failed to clear addresses - " + AccountMgr.ErrorStateMessage); } // Clear any references to this transaction from other transactions: @@ -1855,7 +1855,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr private long GetTransactionCount(String filter) { ClearErrorState(); - return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction) + " As " + aliasTransaction, filter); + return Database.GetRowCount($"{SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction)} As {aliasTransaction}", filter); } public override long GetTransactionCount(SbmTransaction.Params prm) { @@ -2052,30 +2052,43 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr affiliateTargetCols.Add(SbmDbDfn.ColumnIdx.Affiliate_PhoneAlt); foreach (SbmDbDfn.ColumnIdx dbColumn in affiliateTargetCols) query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasTransaction_AffiliateTarget), prefixTransaction_AffiliateTarget + SbmDbDfn.GetColumnName(dbColumn, false)); - //--------------------------------------------------------------------- - // Target Address. - if (hasTgtAddrCols) - { - // Join to the Primary Target Address. - prm.TableAlias_AddressTarget = aliasTransaction_AddressTarget; - DbQueryJoin joinAddr = new DbQueryJoin(DbJoinType.LeftOuter); - joinAddr.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Address), aliasTransaction_AddressTarget); - joinAddr.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_ItemType, aliasTransaction_AddressTarget, false) + "=" + Sbm.ItemType.Affiliate.ToString()); - joinAddr.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_ItemId, aliasTransaction_AddressTarget, false) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Id, aliasTransaction_AffiliateTarget, false)); - joinAddr.Filters.Add(DbQuery.BuildBitMappedFilter(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Flags, aliasTransaction_AddressTarget, false), SbmAddress.Flag_Primary, true)); - query.Joins.Add(joinAddr); - // Add the address columns. - List addressTargetCols = new List(); - addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Name); - addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Line1); - addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Line2); - addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Line3); - addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_City); - addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Province); - addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Postcode); - foreach (SbmDbDfn.ColumnIdx dbColumn in addressTargetCols) - query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasTransaction_AddressTarget), prefixTransaction_AddressTarget + SbmDbDfn.GetColumnName(dbColumn, false)); - } + } + //--------------------------------------------------------------------- + // Target Address. + if (hasTgtAddrCols) + { + // Identify the most suitable Address to display for this Item. + // Preferred is the 'Primary' address, but in its absence, the address with the lowest Id. + // Sub-query for use in 'Outer Apply' + // Select Top 1 * From Address Where [ItemType & ItemId = parent] Order By [Primary flag, type=office etc] + DbQuery qryAddrSub = new DbQuery(Database.DbmsType); + String aliasAddrSubQuery = "addrSub"; + qryAddrSub.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Address), aliasAddrSubQuery); + qryAddrSub.Columns.Add($"Top 1 *"); + qryAddrSub.Filters.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_ItemType, aliasAddrSubQuery)}={(int)Sbm.ItemType.Affiliate}"); + qryAddrSub.Filters.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_ItemId, aliasAddrSubQuery)}={SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_AffIdTarget, aliasTransaction_Association)}"); + qryAddrSub.Filters.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Status, aliasAddrSubQuery)}!='{StatusDeleted}'"); + // Prioritise Primary, Office and lower Id. + String colAddrPrimaryFlag = DbQuery.BuildBitMappedValue($"{aliasAddrSubQuery}.{SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Address_Flags)}", SbmAddress.Flag_Primary, true); + qryAddrSub.OrderBy.Add($"{colAddrPrimaryFlag} Desc"); + qryAddrSub.OrderBy.Add($"Case When {SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Type, aliasAddrSubQuery)}={(int)Sbm.AddressType.Office} Then 0 Else 1 End"); + qryAddrSub.OrderBy.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Address_Id, aliasAddrSubQuery)}"); + + // Join to the Address with lowest Id, prioritising Primary Addresses and office addresses. + DbQueryJoin joinAddr = new DbQueryJoin(DbJoinType.OuterApply); + joinAddr.Table = new StringPair($"({qryAddrSub.BuildQuery()})", aliasTransaction_AddressTarget); + query.Joins.Add(joinAddr); + // Add the address columns. + List addressTargetCols = new List(); + addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Name); + addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Line1); + addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Line2); + addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Line3); + addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_City); + addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Province); + addressTargetCols.Add(SbmDbDfn.ColumnIdx.Address_Postcode); + foreach (SbmDbDfn.ColumnIdx dbColumn in addressTargetCols) + query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasTransaction_AddressTarget), prefixTransaction_AddressTarget + SbmDbDfn.GetColumnName(dbColumn, false)); } } diff --git a/SaBusMgrTest_Control/SaBusMgrTest_Control.csproj b/SaBusMgrTest_Control/SaBusMgrTest_Control.csproj index ac555be..16aea1a 100644 --- a/SaBusMgrTest_Control/SaBusMgrTest_Control.csproj +++ b/SaBusMgrTest_Control/SaBusMgrTest_Control.csproj @@ -11,14 +11,14 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + - - + + diff --git a/SaBusMgrTest_Portal/SaBusMgrTest_Portal.csproj b/SaBusMgrTest_Portal/SaBusMgrTest_Portal.csproj index a70b898..af77de6 100644 --- a/SaBusMgrTest_Portal/SaBusMgrTest_Portal.csproj +++ b/SaBusMgrTest_Portal/SaBusMgrTest_Portal.csproj @@ -14,11 +14,11 @@ Sarand.BusinessMgr.Test - + - - - + + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/SaBusinessMgrCoreWebControl/wwwroot/css/sbc-base.css b/SaBusinessMgrCoreWebControl/wwwroot/css/sbc-base.css index 5e18438..fffe30b 100644 --- a/SaBusinessMgrCoreWebControl/wwwroot/css/sbc-base.css +++ b/SaBusinessMgrCoreWebControl/wwwroot/css/sbc-base.css @@ -215,6 +215,16 @@ td.action text-align: center; } +.width1pc +{ + width: 1%; +} + +.width2pc +{ + width: 2%; +} + .width5pc { width: 5%; diff --git a/SaBusinessMgrCoreWebPortal/Localisation/SbmPortalProperties.resx b/SaBusinessMgrCoreWebPortal/Localisation/SbmPortalProperties.resx index d457d48..eb59f51 100644 --- a/SaBusinessMgrCoreWebPortal/Localisation/SbmPortalProperties.resx +++ b/SaBusinessMgrCoreWebPortal/Localisation/SbmPortalProperties.resx @@ -897,4 +897,49 @@ Create Requirement + + Last visit + + + Next visit + + + Number and street + + + Addresses + + + Postcode + + + Postal code + + + Ref + + + Create Address + + + Update Address + + + Country + + + City + + + Province + + + Primary + + + Set primary + + + Prim. + \ No newline at end of file diff --git a/SaBusinessMgrCoreWebPortal/Portal/Components/SbmModel_Portal.cs b/SaBusinessMgrCoreWebPortal/Portal/Components/SbmModel_Portal.cs index 602dc2e..1f32d7b 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Components/SbmModel_Portal.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Components/SbmModel_Portal.cs @@ -240,15 +240,48 @@ namespace Sarand.BusinessMgr.Web.Portal.Components /// List of Affiliate Types for filter dropdown. /// - Contact model cannot define this as contact list/dialog may be included in other views with their own model, eg. Association page. /// - public IEnumerable GetAffiliateTypeCodesForFilterDropdown() + public IEnumerable GetAffiliateTypeCodesForFilterDropdown(Sbm.AffiliateType typeExcluded) + { + IEnumerable typesExcluded = new Sbm.AffiliateType[] { typeExcluded }; + return GetAffiliateTypeCodesForFilterDropdown(typesExcluded); + } + + /// + /// List of Affiliate Types for filter dropdown. + /// - Contact model cannot define this as contact list/dialog may be included in other views with their own model, eg. Association page. + /// + public IEnumerable GetAffiliateTypeCodesForFilterDropdown(IEnumerable typesExcluded = null) { List affiliateTypes = GetSystemCodes(Sbm.SystemCode.AffiliateType); + if (typesExcluded?.Any() ?? false) + affiliateTypes.RemoveAll(item => typesExcluded.Contains((Sbm.AffiliateType)item.Type)); if (!affiliateTypes.Any(item => item.Type == (int)Sbm.AffiliateType.AnyOrganisation)) affiliateTypes.Insert(0, new TypeCodeDesc((int)Sbm.AffiliateType.AnyOrganisation, ((short)Sbm.AffiliateType.AnyOrganisation).ToString(), Localiser["label.organisation"])); affiliateTypes.Insert(0, Sbm.AffiliateType.Any, "", Localiser["label.any"]); return new SelectList(affiliateTypes, "Code", "Desc"); } + /// + /// List of Address Types for filter dropdown. + /// - Address model cannot define this as contact list/dialog may be included in other views with their own model, eg. Association page. + /// + public IEnumerable GetAddressTypeCodesForFilterDropdown() + { + List affiliateTypes = GetSystemCodes(Sbm.SystemCode.AddressType); + affiliateTypes.Insert(0, Sbm.AddressType.Any, "", Localiser["label.any"]); + return new SelectList(affiliateTypes, "Code", "Desc"); + } + + /// + /// List of Address Types for filter dropdown. + /// - Address model cannot define this as contact list/dialog may be included in other views with their own model, eg. Association page. + /// + public IEnumerable GetAddressTypeCodesForDropdown() + { + List affiliateTypes = GetSystemCodes(Sbm.SystemCode.AddressType); + return new SelectList(affiliateTypes, "Code", "Desc"); + } + /// /// List of Association Types for filter dropdown. /// - Association model cannot define this as association list/dialog may be included in other views with their own model, eg. Commodity page. diff --git a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Addresses/AddressController-Ajax.cs b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Addresses/AddressController-Ajax.cs new file mode 100644 index 0000000..e79543d --- /dev/null +++ b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Addresses/AddressController-Ajax.cs @@ -0,0 +1,578 @@ +using Microsoft.AspNetCore.Mvc; +using Sarand.BusinessMgr.Net.Standard.Base.App; +using Sarand.BusinessMgr.Net.Standard.Base.Bus; +using Sarand.BusinessMgr.Web.Portal.Components; +using Sarand.BusinessMgr.Web.Portal.Models.Addresses; +using Sarand.BusinessMgr.Web.Portal.Models.Contacts; +using Sarand.Net.Standard.Base.App; +using Sarand.Net.Standard.Base.Bus; +using Sarand.Net.Standard.Base.CodeTypes; +using Sarand.Net.Standard.Base.Core; +using Sarand.Net.Standard.Base.Dbas; +using Sarand.Net.Standard.Base.ReferenceData; +using Sarand.Net.Standard.Base.Security; +using Sarand.Net.Standard.Base.Utils; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; + +namespace Sarand.BusinessMgr.Web.Portal.Controllers.Addresses +{ + //======================================================================= + // Portal Address Controller - Ajax actions. + //======================================================================= + partial class AddressController + { + //------------------------------------------------------------------- + // Item data. + private class AddressListData : AjaxResponse_Data.ItemData_Base + { + // Item properties with specific handling. + public String Caption { get; set; } + public bool? Primary { get; set; } + // Field values. + public AjaxResponse_Data.FieldValuesData Field { get; } = new AjaxResponse_Data.FieldValuesData(); + } + private class AddressItemData : AddressListData + { + // Item properties with specific handling. + public String TypeCode { get; set; } + public String TypeDesc { get; set; } + } + private void PopulateAddressResponseListData(SbmModel_Portal model, SbmAddress address, AddressListData data) + { + data.Id = SysId.ToString(address.Id); + data.Caption = address.GetSummary(); + if (address.IsPrimary) data.Primary = true; + } + private void PopulateAddressResponseItemData(SbmModel_Portal model, SbmAddress address, AddressItemData data) + { + PopulateAddressResponseListData(model, address, data as AddressListData); + + // Address type - populate for list ('Type' property populated with desc) and form (Type Code & Desc). + data.TypeCode = Internals.AddressTypeCodes.GetCodeForType(address.AddressType); + data.TypeDesc = Internals.AddressTypeCodes.GetDescForType(address.AddressType); + data.Field.Value.Add($"{Model_Address.ItemField.Type}", data.TypeCode); + data.Field.Value.Add($"{Model_Address.ItemField.TypeDesc}", data.TypeDesc); + + // Address properties. + data.Field.Value.Add($"{Model_Address.ItemField.RefExt}", address.RefExt); + data.Field.Value.Add($"{Model_Address.ItemField.Name}", address.Name); + data.Field.Value.Add($"{Model_Address.ItemField.DescBrief}", address.DescBrief); + data.Field.Value.Add($"{Model_Address.ItemField.Caption}", address.GetSummary()); + data.Field.Value.Add($"{Model_Address.ItemField.Line1}", address.Line1); + data.Field.Value.Add($"{Model_Address.ItemField.Line2}", address.Line2); + data.Field.Value.Add($"{Model_Address.ItemField.Line3}", address.Line3); + data.Field.Value.Add($"{Model_Address.ItemField.City}", address.City); + data.Field.Value.Add($"{Model_Address.ItemField.Province}", address.Province); + data.Field.Value.Add($"{Model_Address.ItemField.Postcode}", address.Postcode); + data.Field.Value.Add($"{Model_Address.ItemField.Country}", address.Country); + data.Field.Value.Add($"{Model_Address.ItemField.RegionIdCity}", SysId.ToString(address.RegionIdCity)); + data.Field.Value.Add($"{Model_Address.ItemField.RegionIdProvince}", SysId.ToString(address.RegionIdProvince)); + data.Field.Value.Add($"{Model_Address.ItemField.RegionIdCountry}", SysId.ToString(address.RegionIdCountry)); + data.Field.Value.Add($"{Model_Address.ItemField.Contact}", address.Contact); + data.Field.Value.Add($"{Model_Address.ItemField.Phone}", address.Phone); + data.Field.Value.Add($"{Model_Address.ItemField.Fax}", address.Fax); + data.Field.Value.Add($"{Model_Address.ItemField.Email}", address.Email); + + // Codes. + data.Field.Value.Add($"{Model_Address.ItemField.AccountManager}", address.AccountManagerCode); + data.Field.Value.Add($"{Model_Address.ItemField.AccountHandler}", address.AccountHandlerCode); + data.Field.Value.Add($"{Model_Address.ItemField.ContactArea}", address.ContactAreaCode); + data.Field.Value.Add($"{Model_Address.ItemField.ContactHandler}", address.ContactHandlerCode); + data.Field.Value.Add($"{Model_Address.ItemField.DeliveryType}", address.DeliveryTypeCode); + data.Field.Value.Add($"{Model_Address.ItemField.DeliveryMethod}", address.DeliveryMethodCode); + data.Field.Value.Add($"{Model_Address.ItemField.DeliveryBookIn}", address.DeliveryBookInCode); + data.Field.Value.Add($"{Model_Address.ItemField.LastVisitOn}", model.FormatDateForForm(address.LastVisitOn)); + data.Field.Value.Add($"{Model_Address.ItemField.NextVisitOn}", model.FormatDateForForm(address.NextVisitOn)); + + // Common properties. + data.StatusCode = address.StatusCode; + data.StatusDesc = address.StatusDesc; + data.Field.Value.Add($"{Model_Contact.ItemField.Status}", address.StatusDesc); + + // Cleanse field values. + data.Field.Value.RemoveAll(item => StringUtil.IsBlank(item.Value)); + + // Populate item list values that might be cleared during update after removing blank values to ensure that blank values are published. + data.Field.Value.Add($"{Model_Address.ItemField.Notes}", address.Notes); + data.Field.Value.Add($"{Model_Address.ItemField.UpdatedOn}", Localiser.FormatDate(address.UpdateStamp.On)); + } + + //------------------------------------------------------------------- + // Address configuration. + //------------------------------------------------------------------- + private class AjaxResponse_AddressConfig : AjaxResponse_Data + { + // Construction. + public AjaxResponse_AddressConfig(SbmModel_Portal model) : base(model) { } + // Configuration data - object copied directly to env.datain script. + public class ConfigData + { + // Configurations. + public Model_Address.ListConfigData CfgList { get; } = new Model_Address.ListConfigData(); + public Model_Address.ItemConfigData CfgItemNew { get; } = new Model_Address.ItemConfigData(); + // Reference data. + public List AddressTypes { get; } = new List(); + public String AddressTypeDefault { get; set; } + public List AccountManagerCodes { get; set; } + public List AccountHandlerCodes { get; set; } + public List ContactAreaCodes { get; set; } + public List ContactHandlerCodes { get; set; } + public List DeliveryTypeCodes { get; set; } + public List DeliveryMethodCodes { get; set; } + public List DeliveryBookInCodes { get; set; } + public List Statuses { get; } = new List(); + public String DefaultStatusCode { get; set; } + } + public ConfigData Data { get; set; } = new ConfigData(); + } + // Ajax request. + [HttpPost] + [Route("Address/Ajax/Config")] + [Route("Address/Ajax/GetConfig")] + public IActionResult Ajax_AddressConfig(Model_Address model) + { + AjaxResponse_AddressConfig responseData = new AjaxResponse_AddressConfig(model); + String messageTitle = Localiser["label.addresses"]; + + // Validate session and referrer. + if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData); + if (!ValidReferer) return Forbid(); + RefreshModel(model); + + // Populate configuration data. + PopulateAddressConfig(model, responseData); + + // Complete response. + responseData.Success = true; + return Json(responseData); + } + private void PopulateAddressConfig(Model_Address model, AjaxResponse_AddressConfig responseData) + { + // Configuration. + model.PopulateListConfig(responseData.Data.CfgList); + model.PopulateItemConfig(responseData.Data.CfgItemNew, null, Sbm.AddressType.Any); + + // Address types. + List addressTypes = GetSystemCodes(Sbm.SystemCode.AddressType); + foreach (TypeCodeDesc addressType in addressTypes.Where(addr => addr.Type > 0)) + responseData.Data.AddressTypes.Add(new AjaxResponse_Data.ItemCodeDesc(addressType.Code, addressType.Desc)); + responseData.Data.AddressTypeDefault = addressTypes.GetCodeForType(Sbm.AddressType.Office); + + // Codes. + List accountManagerCodes = CodeTypeConsole.GetCodesForCodeType(SbmSystem.GetCodeTypeCode(Sbm.ApplCodeType.AccountManager)); + if (accountManagerCodes.Any()) + responseData.Data.AccountManagerCodes = accountManagerCodes.Select(item => new AjaxResponse_Data.ItemCodeDesc(item.Code, item.Description)).ToList(); + List accountHandlerCodes = CodeTypeConsole.GetCodesForCodeType(SbmSystem.GetCodeTypeCode(Sbm.ApplCodeType.AccountHandler)); + if (accountHandlerCodes.Any()) + responseData.Data.AccountHandlerCodes = accountHandlerCodes.Select(item => new AjaxResponse_Data.ItemCodeDesc(item.Code, item.Description)).ToList(); + List contactAreaCodes = CodeTypeConsole.GetCodesForCodeType(SbmSystem.GetCodeTypeCode(Sbm.ApplCodeType.ContactArea)); + if (contactAreaCodes.Any()) + responseData.Data.ContactAreaCodes = contactAreaCodes.Select(item => new AjaxResponse_Data.ItemCodeDesc(item.Code, item.Description)).ToList(); + List contactHandlerCodes = CodeTypeConsole.GetCodesForCodeType(SbmSystem.GetCodeTypeCode(Sbm.ApplCodeType.ContactHandler)); + if (contactHandlerCodes.Any()) + responseData.Data.ContactHandlerCodes = contactHandlerCodes.Select(item => new AjaxResponse_Data.ItemCodeDesc(item.Code, item.Description)).ToList(); + List deliveryTypeCodes = CodeTypeConsole.GetCodesForCodeType(SbmSystem.GetCodeTypeCode(Sbm.ApplCodeType.DeliveryType)); + if (deliveryTypeCodes.Any()) + responseData.Data.DeliveryTypeCodes = deliveryTypeCodes.Select(item => new AjaxResponse_Data.ItemCodeDesc(item.Code, item.Description)).ToList(); + List deliveryMethodCodes = CodeTypeConsole.GetCodesForCodeType(SbmSystem.GetCodeTypeCode(Sbm.ApplCodeType.DeliveryMethod)); + if (deliveryMethodCodes.Any()) + responseData.Data.DeliveryMethodCodes = deliveryMethodCodes.Select(item => new AjaxResponse_Data.ItemCodeDesc(item.Code, item.Description)).ToList(); + List deliveryBookInCodes = CodeTypeConsole.GetCodesForCodeType(SbmSystem.GetCodeTypeCode(Sbm.ApplCodeType.DeliveryBookIn)); + if (deliveryBookInCodes.Any()) + responseData.Data.DeliveryBookInCodes = deliveryBookInCodes.Select(item => new AjaxResponse_Data.ItemCodeDesc(item.Code, item.Description)).ToList(); + + // Reference data - statuses. + foreach (SaStatus status in SbmAddress.ValidStatuses.FindAll(item => item != SaStatus.Deleted)) + responseData.Data.Statuses.Add(new AjaxResponse_Data.ItemCodeDesc(SacsSystem.GetStatusCode(status), Localiser.GetStatusCaption(status))); + responseData.Data.DefaultStatusCode = SacsSystem.GetStatusCode(SbmAddress.DefaultStatus); + } + + //------------------------------------------------------------------- + // Address list. + //------------------------------------------------------------------- + private class AjaxResponse_AddressList : AjaxResponse_AddressConfig + { + // Construction. + public AjaxResponse_AddressList(SbmModel_Portal model) : base(model) { } + // View mode. + public class ModeData + { + public ushort? Search { get; set; } + public ushort? Maintain { get; set; } + public ushort? StockControl { get; set; } + public ushort? StockTake { get; set; } + } + public ModeData Mode { get; set; } + // Address list. + public List Addresses { get; } = new List(); + } + // Ajax request. + [HttpPost] + [Route("Address/Ajax/List")] + [Route("Address/Ajax/GetList")] + public IActionResult Ajax_AddressList(Model_Address model) + { + AjaxResponse_AddressList responseData = new AjaxResponse_AddressList(model); + String messageTitle = Localiser["label.addresses"]; + + // Validate session and referrer. + if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData); + if (!ValidReferer) return Forbid(); + RefreshModel(model); + + // Populate configuration data. + PopulateAddressConfig(model, responseData); + + // View mode. + responseData.Mode = new AjaxResponse_AddressList.ModeData(); + Model_Address.ViewMode viewMode = model.GetFilterMode(); + if (viewMode == Model_Address.ViewMode.Maintain) + responseData.Mode.Maintain = 1; + else + responseData.Mode.Search = 1; + + // Item filter. + SbmAddress.Params prmAddress = new SbmAddress.Params(); + prmAddress.ItemId = model.GetFilterItemId(); + prmAddress.Search = model.Filter.Search; + prmAddress.AddressType = model.GetFilterAddressType(); + prmAddress.StatusCat = SbmAddress.StatusCat.NotDeleted; + prmAddress.SortColumns.Add(AccountMgr.GetAddressColumnDfn(SbmAddress.Column.Type_Desc)); + prmAddress.SortColumns.Add(AccountMgr.GetAddressColumnDfn(SbmAddress.Column.Line1)); + model.Paging.ItemTotal = (ulong)AccountMgr.GetAddressCount(prmAddress); + model.PopulatePagingTo(prmAddress.ResultsPaging); + + // Item columns. + ColumnDfn colId = AccountMgr.GetAddressColumnDfn(SbmAddress.Column.Id); + ColumnDfn colType = AccountMgr.GetAddressColumnDfn(SbmAddress.Column.Type_Desc); + ColumnDfn colRefExt = AccountMgr.GetAddressColumnDfn(SbmAddress.Column.RefExt); + ColumnDfn colName = AccountMgr.GetAddressColumnDfn(SbmAddress.Column.Name); + ColumnDfn colDescBrief = AccountMgr.GetAddressColumnDfn(SbmAddress.Column.DescBrief); + ColumnDfn colCaption = AccountMgr.GetAddressColumnDfn(SbmAddress.Column.Caption); + ColumnDfn colPostcode = AccountMgr.GetAddressColumnDfn(SbmAddress.Column.Postcode); + ColumnDfn colContact = AccountMgr.GetAddressColumnDfn(SbmAddress.Column.Contact); + ColumnDfn colPhone = AccountMgr.GetAddressColumnDfn(SbmAddress.Column.Phone); + ColumnDfn colNotes = AccountMgr.GetAddressColumnDfn(SbmAddress.Column.Notes); + ColumnDfn colFlags = AccountMgr.GetAddressColumnDfn(SbmAddress.Column.Flags); + ColumnDfn colStatus = AccountMgr.GetAddressColumnDfn(SbmAddress.Column.Status); + ColumnDfn colCreatedOn = AccountMgr.GetAddressColumnDfn(SbmAddress.Column.CreateOn_Date); + ColumnDfn colUpdatedOn = AccountMgr.GetAddressColumnDfn(SbmAddress.Column.UpdateOn_Date); + List columns = new List() + { + colId, colType, colRefExt, colName, colDescBrief, + colCaption, colPostcode, colContact, colPhone, + colNotes, colFlags, colStatus, colCreatedOn, colUpdatedOn + }; + + // Query items. + using (DbResultSet resultSet = AccountMgr.ExecuteAddressQuery(columns, prmAddress)) + { + while (resultSet != null && resultSet.HasRows && resultSet.NextRecord()) + { + NamedValue.Map values = resultSet.GetRecordValues(); + Sbm.AddressType addressType = (Sbm.AddressType)values.GetLong(colType.DataName); + ushort flags = (ushort)values.GetLong(colFlags.DataName); + AddressListData addressData = new AddressListData() + { + Id = values.GetString(colId.DataName), + Caption = values.GetString(colCaption.DataName), + StatusCode = values.GetString(colStatus.DataName), + }; + if (SbmAddress.GetFlag(flags, SbmAddress.Flag_Primary)) addressData.Primary = true; + addressData.Field.Value.Add($"{Model_Address.ItemField.TypeDesc}", Internals.AddressTypeCodes.GetDescForType(addressType)); + addressData.Field.Value.Add($"{Model_Address.ItemField.RefExt}", values.GetString(colRefExt.DataName)); + addressData.Field.Value.Add($"{Model_Address.ItemField.Name}", values.GetString(colName.DataName)); + addressData.Field.Value.Add($"{Model_Address.ItemField.DescBrief}", values.GetString(colDescBrief.DataName)); + addressData.Field.Value.Add($"{Model_Address.ItemField.Caption}", AccountMgr.GetAddressDataValue(colCaption, values).ToString()); + addressData.Field.Value.Add($"{Model_Address.ItemField.Postcode}", values.GetString(colPostcode.DataName)); + addressData.Field.Value.Add($"{Model_Address.ItemField.Contact}", values.GetString(colContact.DataName)); + addressData.Field.Value.Add($"{Model_Address.ItemField.Phone}", values.GetString(colPhone.DataName)); + addressData.Field.Value.Add($"{Model_Address.ItemField.Notes}", AccountMgr.GetAddressDataValue(colNotes, values).ToString()); + addressData.Field.Value.Add($"{Model_Address.ItemField.Status}", SacsSystem.GetStatusDescForCode(values.GetString(colStatus.DataName))); + addressData.Field.Value.Add($"{Model_Address.ItemField.CreatedOn}", Localiser.FormatDate(values.GetDate(colCreatedOn.DataName))); + addressData.Field.Value.Add($"{Model_Address.ItemField.UpdatedOn}", Localiser.FormatDate(values.GetDate(colUpdatedOn.DataName))); + // Cleanse item values. + addressData.Field.Value.RemoveAll(item => StringUtil.IsBlank(item.Value)); + responseData.Addresses.Add(addressData); + } + } + + // Refresh paging info. + if (model.Paging.IsPaged) + model.Paging.ItemCount = (ushort)responseData.Addresses.Count; + responseData.SetPaging(model); + + // Complete response. + responseData.Success = true; + return Json(responseData); + } + + //------------------------------------------------------------------- + // Get Address ajax request. + //------------------------------------------------------------------- + private class AjaxResponse_Address : AjaxResponse_Data + { + // Construction. + public AjaxResponse_Address(SbmModel_Portal model) : base(model) { } + // Configuration. + public Model_Address.ItemConfigData Config { get; } = new Model_Address.ItemConfigData(); + // Address details. + public AddressItemData address { get; } = new AddressItemData(); + } + //------------------------------------------------------------------- + [HttpPost] + [Route("Address/Ajax/Item")] + [Route("Address/Ajax/GetItem")] + public IActionResult Ajax_GetItem(Model_Address model) + { + String messageTitle = Localiser["label.address"]; + AjaxResponse_Address responseData = new AjaxResponse_Address(model); + + // Validate session and referrer. + if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData); + if (!ValidReferer) return Forbid(); + RefreshModel(model); + + // Record disposable items as they are created so all can be disposed when needed. + using (DisposableCollection disposables = new DisposableCollection()) + { + + // Identify item. + SysId addressId = SysId.ToSysId(model.Address.Id); + if (!SysId.IsValid(addressId)) + return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.specified"])); + + // Retrieve item. + SbmAddress address = AccountMgr.GetAddressById(addressId); + disposables.Add(address); + if (address == null) + { + SaLogger.Warn($"{SysUtil.Fn} Failed to retrieve address for Id: '{model.Address.Id}'"); + return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.found"])); + } + + // Construct response. + model.PopulateItemConfig(responseData.Config, address); + PopulateAddressResponseItemData(model, address, responseData.address); + responseData.Success = true; + } + return Json(responseData); + } + + //------------------------------------------------------------------- + // Store Address ajax request. + //------------------------------------------------------------------- + [HttpPost] + [Route("Address/Ajax/Store")] + [Route("Address/Ajax/StoreItem")] + public IActionResult Ajax_StoreItem(Model_Address model) + { + String messageTitle = Localiser["label.address"]; + AjaxResponse_Address responseData = new AjaxResponse_Address(model); + + // Validate session and referrer. + if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData); + if (!ValidReferer) return Forbid(); + RefreshModel(model); + + // Validate item properties. + model.ValidateAddressData(responseData); + if (responseData.HasControlErrors()) + return Json(responseData); + + // Validate item Id against 'Exists' flag. + SysId addressId = SysId.ToSysId(model.Address.Id); + bool addressExists = StringUtil.ToBool(model.Address.Exists); + if (addressExists && !SysId.IsValid(addressId)) + { + SaLogger.Warn($"{SysUtil.Fn} Id not specified for existing Address."); + return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"])); + } + if (!addressExists && SysId.IsValid(addressId)) + { + SaLogger.Warn($"{SysUtil.Fn} Id specified for new Address: '{model.Address.Id}'"); + return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"])); + } + + // Record disposable items as they are created so all can be disposed when needed. + using (DisposableCollection disposables = new DisposableCollection()) + { + + // Retrieve existing item. + SbmAddress address = AccountMgr.GetAddressById(addressId); + disposables.Add(address); + if (address == null && SysId.IsValid(addressId)) + { + SaLogger.Warn($"{SysUtil.Fn} Failed to retrieve address for Id: '{model.Address.Id}'"); + return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.found"])); + } + + // Address item. + SbmItemId addressItemId = address?.GetItemId() ?? model.GetAddressItemId(); + if (!ItemId.IsValid(addressItemId)) + { + if (address != null) + { + SaLogger.Warn($"{SysUtil.Fn} Item not found for existing Address: '{model.Address.Id}'"); + return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"])); + } + else + { + SaLogger.Warn($"{SysUtil.Fn} Item not specified for new Address."); + return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"])); + } + } + + // Create new item if required. + if (address == null) + { + address = AccountMgr.CreateAddress((Sbm.ItemType)addressItemId.Type, addressItemId.Id, model.GetAddressType()); + disposables.Add(address); + } + + // Populate item properties. + if (model.Address.Type != null) + address.AddressType = model.GetAddressType(); + if (model.Address.RefExt != null) + address.RefExt = model.Address.RefExt; + if (model.Address.Name != null) + address.Name = model.Address.Name; + if (model.Address.DescBrief != null) + address.DescBrief = model.Address.DescBrief; + // Address. + if (model.Address.Line1 != null) + address.Line1 = model.Address.Line1; + if (model.Address.Line2 != null) + address.Line2 = model.Address.Line2; + if (model.Address.Line3 != null) + address.Line3 = model.Address.Line3; + if (model.Address.City != null) + address.City = model.Address.City; + if (model.Address.Province != null) + address.Province = model.Address.Province; + if (model.Address.Postcode != null) + address.Postcode = model.Address.Postcode; + if (model.Address.Country != null) + address.Country = model.Address.Country; + // Regions. + if (model.Address.RegionIdCity != null) + address.RegionIdCity = model.GetAddressRegionIdCity(); + if (model.Address.RegionIdProvince != null) + address.RegionIdProvince = model.GetAddressRegionIdProvince(); + if (model.Address.RegionIdCountry != null) + address.RegionIdCountry = model.GetAddressRegionIdCountry(); + // Codes. + if (model.Address.AccountManager != null) + address.AccountManagerCode = model.Address.AccountManager; + if (model.Address.AccountHandler != null) + address.AccountHandlerCode = model.Address.AccountHandler; + if (model.Address.ContactArea != null) + address.ContactAreaCode = model.Address.ContactArea; + if (model.Address.ContactHandler != null) + address.ContactHandlerCode = model.Address.ContactHandler; + if (model.Address.DeliveryType != null) + address.DeliveryTypeCode = model.Address.DeliveryType; + if (model.Address.DeliveryMethod != null) + address.DeliveryMethodCode = model.Address.DeliveryMethod; + if (model.Address.DeliveryBookIn != null) + address.DeliveryBookInCode = model.Address.DeliveryBookIn; + // Contact Management dates. + if (model.Address.LastVisitOn != null) + address.LastVisitOn = model.GetAddressLastVisitOn(); + if (model.Address.NextVisitOn != null) + address.NextVisitOn = model.GetAddressNextVisitOn(); + // Common properties. + if (model.Address.Notes != null) + address.Notes = model.Address.Notes; + if (model.Address.StatusCode != null) + address.Status = model.GetAddressStatus(); + + // Store item. + if (!SysId.IsValid(address.Id)) + { + if (!AccountMgr.InsertAddress(address, DbUpdateInfo)) + { + SaLogger.Warn($"{SysUtil.Fn} Failed to insert address: {AccountMgr.ErrorStateMessage}"); + return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.insert.failed"])); + } + responseData.SetNotification(messageTitle, Localiser["msg.item.created"]); + } + else + { + if (!AccountMgr.UpdateAddress(address, DbUpdateInfo)) + { + SaLogger.Warn($"{SysUtil.Fn} Failed to update address [Id:{SysId.ToLong(address.Id)}]: {AccountMgr.ErrorStateMessage}"); + return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.update.failed"])); + } + responseData.SetNotification(messageTitle, Localiser["msg.item.updated"]); + } + if (address.IsPrimary) AccountMgr.VerifyAsPrimaryAddress(address, DbUpdateInfo); + + // Construct response. + model.PopulateItemConfig(responseData.Config, address); + PopulateAddressResponseItemData(model, address, responseData.address); + responseData.Success = true; + } + return Json(responseData); + } + + //------------------------------------------------------------------- + // Set Primary ajax request. + //------------------------------------------------------------------- + [HttpPost] + [Route("Address/Ajax/SetPrimary")] + public IActionResult Ajax_Setprimary(Model_Address model) + { + String messageTitle = Localiser["label.address"]; + AjaxResponse_Address responseData = new AjaxResponse_Address(model); + + + // Validate session and referrer. + if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData); + if (!ValidReferer) return Forbid(); + RefreshModel(model); + + // Record disposable items as they are created so all can be disposed when needed. + using (DisposableCollection disposables = new DisposableCollection()) + { + + // Identify item. + SysId addressId = SysId.ToSysId(model.Address.Id); + if (!SysId.IsValid(addressId)) + return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.specified"])); + + // Retrieve item. + SbmAddress address = AccountMgr.GetAddressById(addressId); + disposables.Add(address); + if (address == null) + { + SaLogger.Warn($"{SysUtil.Fn} Failed to retrieve address for Id: '{model.Address.Id}'"); + return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.found"])); + } + + // Set this address as primary and clear primary against othe addresses for the same item. + address.IsPrimary = true; + if (!AccountMgr.UpdateAddress(address, DbUpdateInfo)) + { + SaLogger.Warn($"{SysUtil.Fn} Failed to update address [Id:{SysId.ToLong(address.Id)}]: {AccountMgr.ErrorStateMessage}"); + return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.update.failed"])); + } + AccountMgr.VerifyAsPrimaryAddress(address, DbUpdateInfo); + responseData.SetNotification(messageTitle, Localiser["msg.item.updated"]); + + // Construct response. + model.PopulateItemConfig(responseData.Config, address); + PopulateAddressResponseItemData(model, address, responseData.address); + responseData.Success = true; + } + + return Json(responseData); + } + + //------------------------------------------------------------------- + } + //======================================================================= +} diff --git a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Addresses/AddressController.cs b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Addresses/AddressController.cs new file mode 100644 index 0000000..42c4c3c --- /dev/null +++ b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Addresses/AddressController.cs @@ -0,0 +1,64 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using Sarand.BusinessMgr.Net.Core.Web.App; +using Sarand.BusinessMgr.Net.Core.Web.Helpers; +using Sarand.BusinessMgr.Net.Standard.Base.App; +using Sarand.BusinessMgr.Net.Standard.Base.Bus; +using Sarand.BusinessMgr.Net.Standard.Base.Mgr; +using Sarand.Net.Standard.Base.App; +using Sarand.Net.Standard.Base.Bus; +using Sarand.Net.Standard.Base.Security; +using Sarand.Net.Standard.Base.Utils; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Threading.Tasks; +using Sarand.BusinessMgr.Web.Portal.Models.Addresses; +using Sarand.BusinessMgr.Web.Portal.Components; + +namespace Sarand.BusinessMgr.Web.Portal.Controllers.Addresses +{ + //======================================================================= + // Portal Address Controller. + //======================================================================= + public partial class AddressController : SbmController_Portal + { + //------------------------------------------------------------------- + // Data members. + + //------------------------------------------------------------------- + // Construction. + public AddressController(SbmLocaliser localiser, ILogger logger) : + base(localiser, logger) + { + } + + //------------------------------------------------------------------- + [HttpGet] + [Route("Address")] + [Route("Addresses")] + public IActionResult Index(Model_Address model) + { + if (!ValidUserSession) + AutoLoginUser(); + + // Redirect to sign-in if not signed-in. + if (!ValidUserSession) + { + ClearKeepLoggedInCookie(); + return RedirectToAction("", "Security"); + } + + // Address page. + RefreshModel(model); + model.PopulateListConfig(); + model.Paging.PageNo = 1; + model.Paging.PageLength = 20; + return View(model); + } + + //------------------------------------------------------------------- + } + //======================================================================= +} diff --git a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Commodities/CommodityController.cs b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Commodities/CommodityController.cs index 8395ec7..1f7cfd4 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Commodities/CommodityController.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Commodities/CommodityController.cs @@ -1,21 +1,8 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Sarand.BusinessMgr.Net.Core.Web.App; -using Sarand.BusinessMgr.Net.Core.Web.Helpers; -using Sarand.BusinessMgr.Net.Standard.Base.App; -using Sarand.BusinessMgr.Net.Standard.Base.Bus; -using Sarand.BusinessMgr.Net.Standard.Base.Mgr; -using Sarand.Net.Standard.Base.App; -using Sarand.Net.Standard.Base.Bus; -using Sarand.Net.Standard.Base.Security; -using Sarand.Net.Standard.Base.Utils; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Threading.Tasks; -using Sarand.BusinessMgr.Web.Portal.Models.Commodities; using Sarand.BusinessMgr.Web.Portal.Components; +using Sarand.BusinessMgr.Web.Portal.Models.Commodities; namespace Sarand.BusinessMgr.Web.Portal.Controllers.Commodities { diff --git a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Contacts/AssociationController-Ajax.cs b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Contacts/AssociationController-Ajax.cs index 60978ef..667431e 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Contacts/AssociationController-Ajax.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Contacts/AssociationController-Ajax.cs @@ -25,6 +25,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Contacts // Association data. private class AssociationListData : AjaxResponse_Data.ItemData_Base { + public String TargetId { get; set; } public String TargetName { get; set; } public String TypeDesc { get; set; } public String Code { get; set; } @@ -38,12 +39,14 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Contacts // Association properties. public String OwnerId { get; set; } public String OwnerName { get; set; } - public String TargetId { get; set; } public String TypeCode { get; set; } } private void PopulateAssociationResponseListData(SbmAssociation association, SbmAffiliate affiliateTarget, AssociationListData data) { data.Id = SysId.ToString(association.Id); + data.TargetId = SysId.ToString(association.AffiliateIdTarget); + data.TargetName = affiliateTarget.GetDisplayName(); + data.TypeDesc = Internals.AssociationTypeCodes.GetDescForType(association.AssociationType); } private void PopulateAssociationResponseItemData(SbmAssociation association, SbmAffiliate affiliateTarget, AssociationItemData data) { @@ -51,15 +54,13 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Contacts PopulateAssociationResponseListData(association, affiliateTarget, data as AssociationListData); // Association properties. data.OwnerId = SysId.ToString(association.AffiliateIdOwner); - data.TargetId = SysId.ToString(association.AffiliateIdTarget); data.TypeCode = Internals.AssociationTypeCodes.GetCodeForType(association.AssociationType); - data.TypeDesc = Internals.AssociationTypeCodes.GetDescForType(association.AssociationType); // Owner - Check if current organisation. if (association.AffiliateIdOwner.Equals(SessionData_Portal.Organisation.AffiliateId)) data.Field.Value.Add($"{Model_Association.ItemField.Owner}", SessionData_Portal.Organisation.DisplayName); else { - // REtrieve owner contact details. + // Retrieve owner contact details. using (SbmAffiliate affiliateOwner = AccountMgr.GetAffiliateById(association.AffiliateIdOwner)) { if (affiliateOwner != null) @@ -83,6 +84,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Contacts data.Field.Value.RemoveAll(item => StringUtil.IsBlank(item.Value)); // Populate item list values that might be cleared during update after removing blank values to ensure that blank values are published. data.Field.Value.Add($"{Model_Association.ItemField.Code}", association.Code); + data.Field.Value.Add($"{Model_Association.ItemField.Address}", AccountMgr.GetItemAddressSummary(affiliateTarget.GetItemId())); data.Field.Value.Add($"{Model_Association.ItemField.Notes}", association.Notes); data.Field.Value.Add($"{Model_Contact.ItemField.UpdatedOn}", Localiser.FormatDate(association.UpdateStamp.On)); } @@ -217,6 +219,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Contacts // Item columns. ColumnDfn colId = AccountMgr.GetAssociationColumnDfn(SbmAssociation.Column.Id); + ColumnDfn colTargetId = AccountMgr.GetAssociationColumnDfn(SbmAssociation.Column.AffIdTarget); ColumnDfn colTargetName = AccountMgr.GetAssociationColumnDfn(SbmAssociation.Column.Target_Name); ColumnDfn colAssociationType = AccountMgr.GetAssociationColumnDfn(SbmAssociation.Column.Type_Desc); ColumnDfn colCode = AccountMgr.GetAssociationColumnDfn(SbmAssociation.Column.Code); @@ -227,7 +230,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Contacts ColumnDfn colUpdatedOn = AccountMgr.GetAssociationColumnDfn(SbmAssociation.Column.UpdateOn_Date); List columns = new List() { - colId, colTargetName, colAssociationType, colCode, colAddress, + colId, colTargetId, colTargetName, colAssociationType, colCode, colAddress, colNotes, colStatus, colCreatedOn, colUpdatedOn }; @@ -241,6 +244,8 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Contacts AssociationListData associationData = new AssociationListData() { Id = values.GetString(colId.DataName), + TargetId = $"{values.GetLong(colTargetId.DataName)}", + TargetName = values.GetString(colTargetName.DataName), StatusCode = values.GetString(colStatus.DataName), }; associationData.Field.Value.Add($"{Model_Association.ItemField.Type}", Internals.AssociationTypeCodes.GetDescForType(associationType)); diff --git a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Contacts/ContactController-Ajax.cs b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Contacts/ContactController-Ajax.cs index 4588e22..499c20f 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Contacts/ContactController-Ajax.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Contacts/ContactController-Ajax.cs @@ -48,7 +48,8 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Contacts data.Id = SysId.ToString(affiliate.Id); if (affiliate.Id.Equals(model.GetAffiliateIdOwner())) data.IsOwner = true; // Associations. - data.AssociationCount = AccountMgr.GetAffiliateTargetAssociationCount(affiliate.Id, Sbm.AssociationType.NotInternal); + long associationCount = AccountMgr.GetAffiliateTargetAssociationCount(affiliate.Id, Sbm.AssociationType.NotInternal); + if (associationCount > 0) data.AssociationCount = associationCount; HashSet associationTypes = AccountMgr.GetAssociationTypesForTarget(affiliate.Id); if (associationTypes.Contains(Sbm.AssociationType.Customer)) data.IsCust = true; @@ -64,6 +65,8 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Contacts data.TypeCode = Internals.AffiliateTypeCodes.GetCodeForType(affiliate.AffiliateType); data.TypeDesc = Internals.AffiliateTypeCodes.GetDescForType(affiliate.AffiliateType); data.Field.Value.Add($"{Model_Contact.ItemField.Type}", Internals.AffiliateTypeCodes.GetDescForType(affiliate.AffiliateType)); + // Address. + data.Field.Value.Add($"{Model_Contact.ItemField.Address}", AccountMgr.GetItemAddressSummary(affiliate.GetItemId())); // Ogranisation. data.Field.Value.Add($"{Model_Contact.ItemField.Parent}", SysId.ToString(affiliate.AffiliateIdParent)); data.Field.Value.Add($"{Model_Contact.ItemField.Name}", affiliate.Name); diff --git a/SaBusinessMgrCoreWebPortal/Portal/Models/Addreses/Model_Address-Config.cs b/SaBusinessMgrCoreWebPortal/Portal/Models/Addreses/Model_Address-Config.cs new file mode 100644 index 0000000..e065cd1 --- /dev/null +++ b/SaBusinessMgrCoreWebPortal/Portal/Models/Addreses/Model_Address-Config.cs @@ -0,0 +1,459 @@ +using Sarand.BusinessMgr.Net.Standard.Base.App; +using Sarand.BusinessMgr.Net.Standard.Base.Bus; +using Sarand.Net.Standard.Base.Bus; +using System; +using System.Collections.Generic; +using System.Drawing; + +namespace Sarand.BusinessMgr.Web.Portal.Models.Addresses +{ + //======================================================================= + // Address model - Configuration. + //======================================================================= + partial class Model_Address + { + //------------------------------------------------------------------- + // Address fields. + //------------------------------------------------------------------- + + /// Prefix for field names. + public const String FieldNamePrefix = "Addr"; + + //------------------------------------------------------------------- + // Legacy Address dialog tabs and panels. + // - Address. + // - Tab 1: + // - ???. + // - Tab 2: + // - ???. + + //------------------------------------------------------------------- + /// Item fields. + public enum ItemField + { + //--------------------------------------------------------------- + // Address. + Pos, + Id, + Exists, + Item, + ItemType, + ItemId, + ItemCaption, + AddressIdRef, + AddressRef, + Type, + TypeDesc, + RefExt, + Name, + Caption, + DescBrief, + Primary, + // Address. + Line1, + Line2, + Line3, + City, + Province, + Postcode, + Country, + RegionIdCity, + RegionIdProvince, + RegionIdCountry, + // Contact. + Contact, + Phone, + Fax, + Email, + // Codes. + AccountManager, + AccountHandler, + ContactArea, + ContactHandler, + DeliveryType, + DeliveryMethod, + DeliveryBookIn, + // Visit dates. + LastVisitOn, + NextVisitOn, + // Common. + Notes, + Status, + CreatedOn, + UpdatedOn, + Actions, + } + + /// + /// Identifier used by form fields to show control specific messages generated by model validation etc. + /// - Both page and model should use this method to consistently generate the field name. + /// + public static String GetFieldName(ItemField field) + { + return $"{FieldNamePrefix}{field}"; + } + + //------------------------------------------------------------------- + + // List configuration. + public class ListConfigData + { + // Actions. + public class ActionData + { + public class AllowData + { + public bool? Create { get; set; } + public bool? Update { get; set; } + } + public AllowData Allow { get; } = new AllowData(); + } + public ActionData Action { get; } = new ActionData(); + // List columns. + public class ColumnData + { + // Column name prefix. + public String Prefix { get; } = Model_Address.FieldNamePrefix; + // Hide column. + public HashSet Hide { get; } = new HashSet(StringComparer.InvariantCultureIgnoreCase); + // Column labels. + public Dictionary Label { get; } = new Dictionary(StringComparer.InvariantCultureIgnoreCase); + } + public ColumnData Column { get; } = new ColumnData(); + } + public ListConfigData ListConfig { get; private set; } + + //------------------------------------------------------------------- + /// + /// Populate Address list configuration data in this model - only required on initial page construction. + /// + public void PopulateListConfig() + { + ListConfig = new ListConfigData(); + PopulateListConfig(ListConfig); + } + /// + /// Populate Address list configuration data. + /// + public void PopulateListConfig(ListConfigData config) + { + // View properties. + ViewMode viewMode = GetFilterMode(); + bool modeIsMaintain = viewMode == ViewMode.Maintain; + bool modeIsSearch = viewMode == ViewMode.Search; + bool userCanCreateAddresses = SessionData_Portal.SecurityProfile.UserCanCreateItemType(Sbm.ItemType.Address); + bool userCanUpdateAddresses = SessionData_Portal.SecurityProfile.UserCanUpdateItemType(Sbm.ItemType.Address); + Sbm.AddressType addressType = GetFilterAddressType(); + + //--------------------------------------------------------------- + // Actions. + + if (userCanCreateAddresses) + config.Action.Allow.Create = true; + if (userCanUpdateAddresses) + config.Action.Allow.Update = true; + + //--------------------------------------------------------------- + // Address list columns. + // - Pos. + // - Item (if not selected). + // - Type (if not selected). + // - External reference. + // - Name + // - Description + // - Summary + // - Postcode + // - Contact + // - Phone + // - Last visit on (if column exists). + // - Next visit on (if column exists). + // - Notes + // - Create On, Id (debug only). + //--------------------------------------------------------------- + + // Position. + + // Item. + if (!SbmItemId.IsValid(GetFilterItemId())) + { + // Item is shown. + } + else + config.Column.Hide.Add($"{ItemField.ItemCaption}"); + + // Address type. + if (addressType <= 0) + { + // Address type is shown. + } + else + config.Column.Hide.Add($"{ItemField.TypeDesc}"); + + // Id + if (!SbmSystem.DebugMode) + config.Column.Hide.Add($"{ItemField.Id}"); + + // Created. + if (!SbmSystem.DebugMode) + config.Column.Hide.Add($"{ItemField.CreatedOn}"); + + // Actions. + if (!modeIsMaintain) + config.Column.Hide.Add($"{ItemField.Actions}"); + } + + //------------------------------------------------------------------- + // Item configuration. + //------------------------------------------------------------------- + + // Contact item configuration. + public class ItemConfigData + { + // Item type. + public bool? IsOrganisation { get; set; } + public bool? IsIndividual { get; set; } + public bool? IsGroup { get; set; } + // Decimals. + public class DecimalsData + { + public int? PackQty { get; set; } = 0; + } + public DecimalsData Decimals { get; } = new DecimalsData(); + // Item fields. + public class FieldData + { + // Field name prefix. + public String Prefix { get; } = Model_Address.FieldNamePrefix; + // Hide field. + public HashSet Hide { get; } = new HashSet(StringComparer.InvariantCultureIgnoreCase); + // Read-only field. + public HashSet Readonly { get; } = new HashSet(StringComparer.InvariantCultureIgnoreCase); + // Field labels. + public Dictionary Label { get; } = new Dictionary(StringComparer.InvariantCultureIgnoreCase); + } + public FieldData Field { get; } = new FieldData(); + } + + //------------------------------------------------------------------- + /// + /// Populate item configuration for existing association. + /// + public void PopulateItemConfig(ItemConfigData config, SbmAddress address) + { + PopulateItemConfig(config, address.GetItemId(), address.AddressType); + } + + /// + /// Populate item configuration for new or existing association. + /// + public void PopulateItemConfig(ItemConfigData config, SbmItemId addressItemId, Sbm.AddressType addressType) + { + // Item configuration. + bool itemKnown = SbmItemId.IsValid(addressItemId); + bool importedFromAccounts = Internals.AccountsConsole.ItemIsImportedFromAccounts(addressItemId); + bool managedByAccounts = Internals.AccountsConsole.IsItemTypeManagedByAccounts(Sbm.ItemType.Address); + bool showNotes = true; + + //--------------------------------------------------------------- + // Address. + + // Id. + if (SbmSystem.DebugMode) + config.Field.Readonly.Add($"{ItemField.Id}"); + else + config.Field.Hide.Add($"{ItemField.Id}"); + + // Item. Always Readonly. + config.Field.Readonly.Add($"{ItemField.Item}"); + + // Address type. + if (!managedByAccounts) + { + // Type is editable. + } + else config.Field.Readonly.Add($"{ItemField.Type}"); + + // Name. + if (!managedByAccounts) + { + // Name is editable. + } + else config.Field.Readonly.Add($"{ItemField.Name}"); + + // RefExt. + if (!managedByAccounts) + { + // RefExt is editable. + } + else config.Field.Readonly.Add($"{ItemField.RefExt}"); + + // Desc Brief. + if (!managedByAccounts) + { + // DescBrief is editable. + } + else config.Field.Readonly.Add($"{ItemField.DescBrief}"); + + //--------------------------------------------------------------- + + // Line1. + if (!managedByAccounts) + { + // Line1 is editable. + } + else config.Field.Readonly.Add($"{ItemField.Line1}"); + + // Line2. + if (!managedByAccounts) + { + // Line2 is editable. + } + else config.Field.Readonly.Add($"{ItemField.Line2}"); + + // Line3. + if (!managedByAccounts) + { + // Line3 is editable. + } + else config.Field.Readonly.Add($"{ItemField.Line3}"); + + // City. + if (!managedByAccounts) + { + // City is editable. + } + else config.Field.Readonly.Add($"{ItemField.City}"); + + // Province. + if (!managedByAccounts) + { + // Province is editable. + } + else config.Field.Readonly.Add($"{ItemField.Province}"); + + // Postcode. + if (!managedByAccounts) + { + // Postcode is editable. + } + else config.Field.Readonly.Add($"{ItemField.Postcode}"); + + // Country. + if (!managedByAccounts) + { + // Country is editable. + } + else config.Field.Readonly.Add($"{ItemField.Country}"); + + //--------------------------------------------------------------- + + // Contact. + if (!managedByAccounts) + { + // Contact is editable. + } + else config.Field.Readonly.Add($"{ItemField.Contact}"); + + // Phone. + if (!managedByAccounts) + { + // Phone is editable. + } + else config.Field.Readonly.Add($"{ItemField.Phone}"); + + // Fax. + if (!managedByAccounts) + { + // Fax is editable. + } + else config.Field.Readonly.Add($"{ItemField.Fax}"); + + // Email. + if (!managedByAccounts) + { + // Email is editable. + } + else config.Field.Readonly.Add($"{ItemField.Email}"); + + //--------------------------------------------------------------- + // Codes. + + // AccountManagerCode. + if (Internals.CodeTypeConsole.CodeTypeHasCodes(Internals.GetCodeTypeCode(Sbm.ApplCodeType.AccountManager)) && AccountMgr.ColumnExists(SbmDbDfn.ColumnIdx.Address_AccountManagerCode)) + { + // AccountManagerCode is visible. + } + else config.Field.Hide.Add($"{ItemField.AccountManager}"); + + // AccountHandlerCode. + if (Internals.CodeTypeConsole.CodeTypeHasCodes(Internals.GetCodeTypeCode(Sbm.ApplCodeType.AccountHandler)) && AccountMgr.ColumnExists(SbmDbDfn.ColumnIdx.Address_AccountHandlerCode)) + { + // AccountHandlerCode is visible. + } + else config.Field.Hide.Add($"{ItemField.AccountHandler}"); + + // ContactAreaCode. + if (Internals.CodeTypeConsole.CodeTypeHasCodes(Internals.GetCodeTypeCode(Sbm.ApplCodeType.ContactArea)) && AccountMgr.ColumnExists(SbmDbDfn.ColumnIdx.Address_ContactAreaCode)) + { + // ContactAreaCode is visible. + } + else config.Field.Hide.Add($"{ItemField.ContactArea}"); + + // ContactHandlerCode. + if (Internals.CodeTypeConsole.CodeTypeHasCodes(Internals.GetCodeTypeCode(Sbm.ApplCodeType.ContactHandler)) && AccountMgr.ColumnExists(SbmDbDfn.ColumnIdx.Address_ContactHandlerCode)) + { + // ContactHandlerCode is visible. + } + else config.Field.Hide.Add($"{ItemField.ContactHandler}"); + + // DeliveryTypeCode. + if (Internals.CodeTypeConsole.CodeTypeHasCodes(Internals.GetCodeTypeCode(Sbm.ApplCodeType.DeliveryType)) && AccountMgr.ColumnExists(SbmDbDfn.ColumnIdx.Address_DeliveryTypeCode)) + { + // DeliveryTypeCode is visible. + } + else config.Field.Hide.Add($"{ItemField.DeliveryType}"); + + // DeliveryMethodCode. + if (Internals.CodeTypeConsole.CodeTypeHasCodes(Internals.GetCodeTypeCode(Sbm.ApplCodeType.DeliveryMethod)) && AccountMgr.ColumnExists(SbmDbDfn.ColumnIdx.Address_DeliveryMethodCode)) + { + // DeliveryMethodCode is visible. + } + else config.Field.Hide.Add($"{ItemField.DeliveryMethod}"); + + // DeliveryBookInCode. + if (Internals.CodeTypeConsole.CodeTypeHasCodes(Internals.GetCodeTypeCode(Sbm.ApplCodeType.DeliveryBookIn)) && AccountMgr.ColumnExists(SbmDbDfn.ColumnIdx.Address_DeliveryBookInCode)) + { + // DeliveryBookInCode is visible. + } + else config.Field.Hide.Add($"{ItemField.DeliveryBookIn}"); + + // LastVisitOn. + if (AccountMgr.ColumnExists(SbmDbDfn.ColumnIdx.Address_LastVisitOn)) + { + // LastVisitOn is visible. + } + else config.Field.Hide.Add($"{ItemField.LastVisitOn}"); + + // NextVisitOn. + if (AccountMgr.ColumnExists(SbmDbDfn.ColumnIdx.Address_NextVisitOn)) + { + // NextVisitOn is visible. + } + else config.Field.Hide.Add($"{ItemField.NextVisitOn}"); + + //--------------------------------------------------------------- + // Common. + + // Notes. + if (!showNotes) + config.Field.Hide.Add($"{ItemField.Notes}"); + + // Status. + if (managedByAccounts) + config.Field.Readonly.Add($"{ItemField.Status}"); + + } + + //------------------------------------------------------------------- + } +} diff --git a/SaBusinessMgrCoreWebPortal/Portal/Models/Addreses/Model_Address.cs b/SaBusinessMgrCoreWebPortal/Portal/Models/Addreses/Model_Address.cs new file mode 100644 index 0000000..71137d6 --- /dev/null +++ b/SaBusinessMgrCoreWebPortal/Portal/Models/Addreses/Model_Address.cs @@ -0,0 +1,389 @@ +using DocumentFormat.OpenXml.Office2016.Excel; +using NPOI.SS.Util; +using Sarand.BusinessMgr.Net.Core.Web.App; +using Sarand.BusinessMgr.Net.Standard.Base.App; +using Sarand.BusinessMgr.Net.Standard.Base.Bus; +using Sarand.BusinessMgr.Web.Portal.Components; +using Sarand.BusinessMgr.Web.Portal.Controllers.Addresses; +using Sarand.Net.Standard.Base.App; +using Sarand.Net.Standard.Base.Bus; +using Sarand.Net.Standard.Base.Core; +using Sarand.Net.Standard.Base.ReferenceData; +using Sarand.Net.Standard.Base.Utils; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.RegularExpressions; +using static Sarand.BusinessMgr.Net.Standard.Base.App.Sbm; + +namespace Sarand.BusinessMgr.Web.Portal.Models.Addresses +{ + //======================================================================= + // Address model. + //======================================================================= + /// + /// Address model - Filter, Form, validation and configuration. + /// + public partial class Model_Address : SbmModel_Portal + { + //------------------------------------------------------------------- + // Definitions. + public enum ViewMode + { + Search, Maintain + } + + //------------------------------------------------------------------- + // Construction. + public Model_Address(SbmLocaliser localiser) : + base(localiser) + { + } + + //------------------------------------------------------------------- + // Filter properties. + public class FilterData + { + public String Mode { get; set; } + public String ItemType { get; set; } + public String ItemId { get; set; } + public String AddressType { get; set; } + public String Search { get; set; } + } + public FilterData Filter { get; } = new FilterData(); + public ViewMode GetFilterMode() + { + return EnumUtil.ParseEnum(Filter.Mode, ViewMode.Search); + } + public Sbm.ItemType GetFilterItemType() + { + Sbm.ItemType addressType = (Sbm.ItemType)Internals.ItemTypeCodes.GetTypeForCode(Filter.ItemType); + if (addressType == 0 && !StringUtil.IsBlank(Filter.ItemType) && StringUtil.IsNumeric(Filter.ItemType, true)) + addressType = (Sbm.ItemType)StringUtil.ToInt(Filter.ItemType); + return addressType; + } + public SbmItemId GetFilterItemId() + { + return new SbmItemId(GetFilterItemType(), SysId.ToSysId(Filter.ItemId)); + } + public Sbm.AddressType GetFilterAddressType() + { + Sbm.AddressType addressType = (Sbm.AddressType)Internals.AddressTypeCodes.GetTypeForCode(Filter.AddressType); + if (addressType == 0 && !StringUtil.IsBlank(Filter.AddressType) && StringUtil.IsNumeric(Filter.AddressType, true)) + addressType = (Sbm.AddressType)StringUtil.ToInt(Filter.AddressType); + return addressType; + } + + //------------------------------------------------------------------- + // Address properties. + public class AddressData + { + public String Id { get; set; } + public String Exists { get; set; } + public String Caption { get; set; } + public String ItemType { get; set; } + public String ItemId { get; set; } + public String ItemCaption { get; set; } + public String Type { get; set; } + public String AddressIdRef { get; set; } + public String RefExt { get; set; } + public String Name { get; set; } + public String DescBrief { get; set; } + public String Line1 { get; set; } + public String Line2 { get; set; } + public String Line3 { get; set; } + public String City { get; set; } + public String Province { get; set; } + public String Postcode { get; set; } + public String Country { get; set; } + public String RegionIdCity { get; set; } + public String RegionIdProvince { get; set; } + public String RegionIdCountry { get; set; } + public String Contact { get; set; } + public String Phone { get; set; } + public String Fax { get; set; } + public String Email { get; set; } + public String AccountManager { get; set; } + public String AccountHandler { get; set; } + public String ContactArea { get; set; } + public String ContactHandler { get; set; } + public String DeliveryType { get; set; } + public String DeliveryMethod { get; set; } + public String DeliveryBookIn { get; set; } + public String LastVisitOn { get; set; } + public String NextVisitOn { get; set; } + // Common properties. + public String Notes { get; set; } + public String StatusCode { get; set; } + } + public AddressData Address { get; } = new AddressData(); + + // Extract properties. + public Sbm.AddressType GetAddressType() + { + return (Sbm.AddressType)Internals.AddressTypeCodes.GetTypeForCode(Address.Type); + } + public Sbm.ItemType GetAddressItemType() + { + return (Sbm.ItemType)StringUtil.ToLong(Address.ItemType); + } + public SbmItemId GetAddressItemId() + { + return new SbmItemId(GetAddressItemType(), SysId.ToSysId(Address.ItemId)); + } + public SysId GetAddressIdRef() + { + return SysId.ToSysId(Address.AddressIdRef); + } + + // Regions. + public SysId GetAddressRegionIdCity() + { + return SysId.ToSysId(Address.RegionIdCity); + } + public SysId GetAddressRegionIdProvince() + { + return SysId.ToSysId(Address.RegionIdProvince); + } + public SysId GetAddressRegionIdCountry() + { + return SysId.ToSysId(Address.RegionIdCountry); + } + + // Contact Management. + public DateTime GetAddressLastVisitOn() + { + return ParseDateFromForm(Address.LastVisitOn); + } + public DateTime GetAddressNextVisitOn() + { + return ParseDateFromForm(Address.NextVisitOn); + } + + // Common properties. + public SaStatus GetAddressStatus() + { + return SacsSystem.GetStatusForCode(Address.StatusCode); + } + + //------------------------------------------------------------------- + // Validation. + //------------------------------------------------------------------- + // Address validation. + public bool ValidateAddressData(Sacs.Web.Components.SaController.AjaxResponse_Data responseData) + { + // Item. + if (Address.ItemType != null || Address.ItemId != null) + { + String controlName = GetFieldName(Model_Address.ItemField.Item); + SbmItemId itemIdAddress = GetAddressItemId(); + if (!ItemId.IsValid(GetAddressItemId())) + responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]); + } + + // Address Type. + if (Address.Type != null) + { + String controlName = GetFieldName(Model_Address.ItemField.Type); + if (Address.Type.IsEmpty() || GetAddressType() <= 0) + responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]); + } + + // Reference. + if (Address.RefExt != null) + { + String controlName = GetFieldName(Model_Address.ItemField.RefExt); + Address.RefExt = Address.RefExt.ToUpperInvariant(); + responseData.SetControlValue(controlName, Address.RefExt); + if (!StringUtil.IsEmpty(Address.RefExt) && StringUtil.GetLength(Address.RefExt) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_RefExt)) + responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_RefExt)]); + } + + // Reference Address. + if (Address.AddressIdRef != null) + { + String controlName = GetFieldName(Model_Address.ItemField.AddressRef); + if (!SysId.IsValid(GetAddressIdRef())) + responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]); + } + + // Name. + if (Address.Name != null) + { + String controlName = GetFieldName(Model_Address.ItemField.Name); + responseData.SetControlValue(controlName, Address.Name); + if (!Address.Name.IsEmpty() && StringUtil.GetLength(Address.Name) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Name)) + responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Name)]); + } + + // Description. + if (Address.DescBrief != null) + { + String controlName = GetFieldName(Model_Address.ItemField.DescBrief); + responseData.SetControlValue(controlName, Address.DescBrief); + if (!Address.DescBrief.IsEmpty() && StringUtil.GetLength(Address.DescBrief) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_DescBrief)) + responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_DescBrief)]); + } + + // Line 1. + if (Address.Line1 != null) + { + String controlName = GetFieldName(Model_Address.ItemField.Line1); + responseData.SetControlValue(controlName, Address.Line1); + if (Address.Line1.IsBlank()) + responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]); + else if (!Address.Line1.IsEmpty() && StringUtil.GetLength(Address.Line1) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Line1)) + responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Line1)]); + } + + // Line 2. + if (Address.Line2 != null) + { + String controlName = GetFieldName(Model_Address.ItemField.Line2); + responseData.SetControlValue(controlName, Address.Line2); + if (!Address.Line2.IsEmpty() && StringUtil.GetLength(Address.Line2) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Line2)) + responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Line2)]); + } + + // Line 3. + if (Address.Line3 != null) + { + String controlName = GetFieldName(Model_Address.ItemField.Line3); + responseData.SetControlValue(controlName, Address.Line3); + if (!Address.Line3.IsEmpty() && StringUtil.GetLength(Address.Line3) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Line3)) + responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Line3)]); + } + + // City. + if (Address.City != null) + { + String controlName = GetFieldName(Model_Address.ItemField.City); + responseData.SetControlValue(controlName, Address.City); + if (!Address.City.IsEmpty() && StringUtil.GetLength(Address.City) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_City)) + responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_City)]); + } + + // City Region. + + // Province. + if (Address.Province != null) + { + String controlName = GetFieldName(Model_Address.ItemField.Province); + responseData.SetControlValue(controlName, Address.Province); + if (!Address.Province.IsEmpty() && StringUtil.GetLength(Address.Province) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Province)) + responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Province)]); + } + + // Province Region. + + // Postcode. + if (Address.Postcode != null) + { + String controlName = GetFieldName(Model_Address.ItemField.Postcode); + Address.Postcode = Address.Postcode.ToUpperInvariant(); + responseData.SetControlValue(controlName, Address.Postcode); + if (!Address.Postcode.IsEmpty() && StringUtil.GetLength(Address.Postcode) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Postcode)) + responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Postcode)]); + } + + // Country. + if (Address.Country != null) + { + String controlName = GetFieldName(Model_Address.ItemField.Country); + responseData.SetControlValue(controlName, Address.Country); + if (!Address.Country.IsEmpty() && StringUtil.GetLength(Address.Country) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Country)) + responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Country)]); + } + + // Country Region. + + // Contact. + if (Address.Contact != null) + { + String controlName = GetFieldName(Model_Address.ItemField.Contact); + responseData.SetControlValue(controlName, Address.Contact); + if (!Address.Contact.IsEmpty() && StringUtil.GetLength(Address.Contact) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Contact)) + responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Contact)]); + } + + // Phone. + if (Address.Phone != null) + { + String controlName = GetFieldName(Model_Address.ItemField.Phone); + responseData.SetControlValue(controlName, Address.Phone); + if (!Address.Phone.IsEmpty() && StringUtil.GetLength(Address.Phone) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Phone)) + responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Phone)]); + } + + // Fax. + if (Address.Fax != null) + { + String controlName = GetFieldName(Model_Address.ItemField.Fax); + responseData.SetControlValue(controlName, Address.Fax); + if (!Address.Fax.IsEmpty() && StringUtil.GetLength(Address.Fax) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Fax)) + responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Fax)]); + } + + // Email. + if (Address.Email != null) + { + String controlName = GetFieldName(Model_Address.ItemField.Email); + responseData.SetControlValue(controlName, Address.Email); + if (!Address.Email.IsEmpty() && StringUtil.GetLength(Address.Email) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Email)) + responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Email)]); + } + + // Last Visit On. + if (Address.LastVisitOn != null) + { + String controlName = GetFieldName(Model_Address.ItemField.LastVisitOn); + DateTime lastVisitOn = GetAddressLastVisitOn(); + if (!StringUtil.IsBlank(Address.LastVisitOn)) + { + if (!DateUtil.IsValid(GetAddressLastVisitOn())) + responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]); + else if (GetAddressLastVisitOn().CompareTo(DateTime.Today) > 0) + responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]); + } + } + + // Next Visit On. + if (Address.NextVisitOn != null) + { + String controlName = GetFieldName(Model_Address.ItemField.NextVisitOn); + DateTime lastVisitOn = GetAddressNextVisitOn(); + if (!StringUtil.IsBlank(Address.NextVisitOn)) + { + if (!DateUtil.IsValid(GetAddressNextVisitOn())) + responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]); + else if (DateUtil.IsValid(GetAddressLastVisitOn()) && GetAddressNextVisitOn().CompareTo(GetAddressLastVisitOn()) < 0) + responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]); + } + } + + // Address Notes. + if (Address.Notes != null) + { + String controlName = "AddressNotes"; + responseData.SetControlValue(controlName, Address.Notes); + if (!Address.Notes.IsEmpty() && StringUtil.GetLength(Address.Notes) > GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Notes)) + responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Notes)]); + } + + // Address status. + if (Address.StatusCode != null) + { + String controlName = "AddressStatusCode"; + if (Address.StatusCode.IsEmpty()) + responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]); + else if (!SbmAddress.ValidStatuses.Contains(GetAddressStatus())) + responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]); + } + + return !responseData.HasControlErrors(); + } + + //------------------------------------------------------------------- + } + //======================================================================= +} diff --git a/SaBusinessMgrCoreWebPortal/Portal/Models/Assets/Model_Asset-Config.cs b/SaBusinessMgrCoreWebPortal/Portal/Models/Assets/Model_Asset-Config.cs index 7ce6f01..7d13cf2 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Models/Assets/Model_Asset-Config.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Models/Assets/Model_Asset-Config.cs @@ -203,7 +203,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Assets /// /// Populate item configuration for new or existing vehicle. /// - public void PopulateItemConfig(ItemConfigData config, ItemId assetId, Sbm.AssetType assetType) + public void PopulateItemConfig(ItemConfigData config, SbmItemId assetId, Sbm.AssetType assetType) { // Session configuration. bool assetPurchaseAllowed = SessionConsole.GetOwnerOption_AllowOption(Sbm.OrgOption_AllowOption.Asset_Purchase); @@ -236,7 +236,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Assets // Purchase. // Purchase net price. - if (!assetPurchaseAllowed||!userCanUpdateAssets) + if (!assetPurchaseAllowed || !userCanUpdateAssets) config.Field.Readonly.Add($"{ItemField.PurchaseAmount}"); // Purchase tax code. diff --git a/SaBusinessMgrCoreWebPortal/Portal/Models/Assets/Model_AssetCategory-Config.cs b/SaBusinessMgrCoreWebPortal/Portal/Models/Assets/Model_AssetCategory-Config.cs index e8b7896..38084be 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Models/Assets/Model_AssetCategory-Config.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Models/Assets/Model_AssetCategory-Config.cs @@ -185,7 +185,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Assets /// /// Populate item configuration for new or existing vehicle. /// - public void PopulateItemConfig(ItemConfigData config, ItemId assetCategoryId, Sbm.AssetType assetType) + public void PopulateItemConfig(ItemConfigData config, SbmItemId assetCategoryId, Sbm.AssetType assetType) { // Session configuration. bool userCanCreateAssetCategories = SessionData_Portal.SecurityProfile.UserCanCreateItemType(Sbm.ItemType.AssetCategory); diff --git a/SaBusinessMgrCoreWebPortal/Portal/Models/Commodities/Model_Commodity-Config.cs b/SaBusinessMgrCoreWebPortal/Portal/Models/Commodities/Model_Commodity-Config.cs index 66fa1ad..bdab761 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Models/Commodities/Model_Commodity-Config.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Models/Commodities/Model_Commodity-Config.cs @@ -413,7 +413,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Commodities /// /// Populate item configuration for new or existing association. /// - public void PopulateItemConfig(ItemConfigData config, ItemId commodityItemId, Sbm.CommodityType commodityType) + public void PopulateItemConfig(ItemConfigData config, SbmItemId commodityItemId, Sbm.CommodityType commodityType) { // Item type. bool isProduct = commodityType != Sbm.CommodityType.Service; diff --git a/SaBusinessMgrCoreWebPortal/Portal/Models/Contacts/Model_Association-Config.cs b/SaBusinessMgrCoreWebPortal/Portal/Models/Contacts/Model_Association-Config.cs index 65a53a7..16a3c47 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Models/Contacts/Model_Association-Config.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Models/Contacts/Model_Association-Config.cs @@ -309,7 +309,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Contacts /// /// Populate item configuration for new or existing association. /// - public void PopulateItemConfig(ItemConfigData config, ItemId associationItemId, SysId ownerId, Sbm.AssociationType associationType) + public void PopulateItemConfig(ItemConfigData config, SbmItemId associationItemId, SysId ownerId, Sbm.AssociationType associationType) { bool ownerIsInternal = SessionData_Portal.Organisation.AffiliateId.Equals(ownerId); bool isCustomer = SbmAssociation.IsCustomer(associationType); diff --git a/SaBusinessMgrCoreWebPortal/Portal/Models/Contacts/Model_Contact-Config.cs b/SaBusinessMgrCoreWebPortal/Portal/Models/Contacts/Model_Contact-Config.cs index 68261b2..f4c6b8f 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Models/Contacts/Model_Contact-Config.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Models/Contacts/Model_Contact-Config.cs @@ -234,7 +234,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Contacts /// /// Populate item configuration for new or existing association. /// - public void PopulateItemConfig(ItemConfigData config, ItemId affiliateItemId, Sbm.AffiliateType affiliateType) + public void PopulateItemConfig(ItemConfigData config, SbmItemId affiliateItemId, Sbm.AffiliateType affiliateType) { // Item type. bool isIndividual = SbmAffiliate.IsIndividual(affiliateType); diff --git a/SaBusinessMgrCoreWebPortal/Portal/Models/Requirements/Model_Requirement-Config.cs b/SaBusinessMgrCoreWebPortal/Portal/Models/Requirements/Model_Requirement-Config.cs index aa554de..850c1fb 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Models/Requirements/Model_Requirement-Config.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Models/Requirements/Model_Requirement-Config.cs @@ -479,7 +479,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Requirements /// /// Populate item configuration for new or existing requirement. /// - public void PopulateItemConfig(ItemConfigData config, ItemId requirementItemId, Sbm.TransactionType transactionType, SbmTransaction.StatusCat transactionStatusCat, Sbm.RequirementType requirementType) + public void PopulateItemConfig(ItemConfigData config, SbmItemId requirementItemId, Sbm.TransactionType transactionType, SbmTransaction.StatusCat transactionStatusCat, Sbm.RequirementType requirementType) { // Item type. bool isSales = SbmTransaction.IsSalesType(transactionType); diff --git a/SaBusinessMgrCoreWebPortal/Portal/Models/Transactions/Model_Transaction-Config.cs b/SaBusinessMgrCoreWebPortal/Portal/Models/Transactions/Model_Transaction-Config.cs index 754391e..18e393f 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Models/Transactions/Model_Transaction-Config.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Models/Transactions/Model_Transaction-Config.cs @@ -603,7 +603,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions /// /// Populate item configuration for new or existing transaction. /// - public void PopulateItemConfig(ItemConfigData config, ItemId transactionItemId, Sbm.TransactionType transactionType) + public void PopulateItemConfig(ItemConfigData config, SbmItemId transactionItemId, Sbm.TransactionType transactionType) { // Item type. bool isSales = SbmTransaction.IsSalesType(transactionType); diff --git a/SaBusinessMgrCoreWebPortal/Portal/Models/Vehicles/Model_Vehicle-Config.cs b/SaBusinessMgrCoreWebPortal/Portal/Models/Vehicles/Model_Vehicle-Config.cs index 1f44e64..1267c61 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Models/Vehicles/Model_Vehicle-Config.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Models/Vehicles/Model_Vehicle-Config.cs @@ -193,7 +193,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Vehicles /// /// Populate item configuration for new or existing vehicle. /// - public void PopulateItemConfig(ItemConfigData config, ItemId vehicleItemId) + public void PopulateItemConfig(ItemConfigData config, SbmItemId vehicleItemId) { // Session configuration. bool userCanCreateVehicles = SessionData_Portal.SecurityProfile.UserCanCreateItemType(Sbm.ItemType.Vehicle); diff --git a/SaBusinessMgrCoreWebPortal/Views/Address/Index.cshtml b/SaBusinessMgrCoreWebPortal/Views/Address/Index.cshtml new file mode 100644 index 0000000..be524f8 --- /dev/null +++ b/SaBusinessMgrCoreWebPortal/Views/Address/Index.cshtml @@ -0,0 +1,8 @@ +@model SbmModel_Portal +@inject SbmLocaliser Localiser +@{ + /* Address page. */ + ViewData["Title"] = "Addresses"; +} + + diff --git a/SaBusinessMgrCoreWebPortal/Views/Address/Panel-AddressDialog.cshtml b/SaBusinessMgrCoreWebPortal/Views/Address/Panel-AddressDialog.cshtml new file mode 100644 index 0000000..c463c27 --- /dev/null +++ b/SaBusinessMgrCoreWebPortal/Views/Address/Panel-AddressDialog.cshtml @@ -0,0 +1,522 @@ +@* View is decoupled from Address model as it may be included in other views, eg. Contacts. *@ +@model SbmModel_Portal +@inject SbmLocaliser Localiser +@{ + /* Address - Dialog panel */ + // Ensure view is only included once in page. + if (!Model.RegisterView(Html.ViewContext)) return; +} + + + +@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmAddressId", @class = "sbm-form" })) +{ + @Html.Hidden("Address.Id", "", new { @id = "", @class = "AddressId" }) + @Html.Hidden("Address.DataGroups", "", new { @id = "", @class = "AddressDataGroups" }) +} + +
+ + @using (@Html.BeginForm(FormMethod.Post, new { @id = "frmAddress", @class = "sbm-form", @onSubmit = "return false;" })) + { + @Html.Hidden("Address.Id", "", new { @id = "", @class = "AddressId sbm-input" }) + @Html.Hidden("Address.Exists", "", new { @id = "", @class = "AddressExists sbm-input" }) + @Html.Hidden("Address.SupersededStatusConfirmed", "", new { @id = "", @class = "SupersededStatusConfirmed sbm-input" }) +
+ + @* Address Owner *@ +
+
+
+
+ +
+
+
+
+ @Html.Hidden("Address.ItemType", "", new { @id = "", @class = $"{Model_Address.GetFieldName(Model_Address.ItemField.ItemType)} sbm-input sbm-auto-val" }) + @Html.Hidden("Address.ItemId", "", new { @id = "", @class = $"{Model_Address.GetFieldName(Model_Address.ItemField.ItemId)} sbm-input sbm-auto-val" }) + +
+
+
+
+
+ +
+
+ + @* Address Type *@ +
+
+
+
+ +
+
+
+
+ @Html.DropDownList("Address.Type", Model.GetEmptyListForSelect(), Localiser["label.select"], new { @id = "cbAddressType", @class = $"{Model_Address.GetFieldName(Model_Address.ItemField.Type)} sbm-select sbm-auto-val" }) +
+
+
+
+
+ +
+
+ + @* Address Reference External *@ +
+
+
+
+ +
+
+
+
+ @Html.TextBox("Address.RefExt", "", new { @id = "ifAddressRefExt", @class = $"{Model_Address.GetFieldName(Model_Address.ItemField.RefExt)} sbm-input upper sbm-auto-val", @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_RefExt) }) +
+
+
+
+
+ +
+
+ + @* Address Name *@ +
+
+
+
+ +
+
+
+
+ @Html.TextBox("Address.Name", "", new { @id = "ifAddressName", @class = $"{Model_Address.GetFieldName(Model_Address.ItemField.Name)} sbm-input sbm-auto-val", @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Name) }) +
+
+
+
+
+ + @* Address Description *@ +
+
+
+
+ +
+
+
+
+ @Html.TextBox("Address.DescBrief", "", new { @id = "ifAddressDesc", @class = $"{Model_Address.GetFieldName(Model_Address.ItemField.DescBrief)} sbm-input sbm-auto-val", @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_DescBrief) }) +
+
+
+
+
+ + @* Address lines *@ +
+
+
+
+ +
+
+
+
+ @Html.TextBox("Address.Line1", "", new { @id = "ifAddressLine1", @class = $"{Model_Address.GetFieldName(Model_Address.ItemField.Line1)} sbm-input sbm-auto-val", @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Line1) }) +
+
+
+
+
+
+
+
+
+
+
+
+
+ @Html.TextBox("Address.Line2", "", new { @id = "ifAddressLine2", @class = $"{Model_Address.GetFieldName(Model_Address.ItemField.Line2)} sbm-input sbm-auto-val", @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Line2) }) +
+
+
+
+
+
+
+
+
+
+
+
+
+ @Html.TextBox("Address.Line3", "", new { @id = "ifAddressLine3", @class = $"{Model_Address.GetFieldName(Model_Address.ItemField.Line3)} sbm-input sbm-auto-val", @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Line3) }) +
+
+
+
+
+ +
+
+ + @* Address City *@ +
+
+
+
+ +
+
+
+
+ @Html.TextBox("Address.City", "", new { @id = "ifAddressCity", @class = $"{Model_Address.GetFieldName(Model_Address.ItemField.City)} sbm-input sbm-auto-val", @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_City) }) +
+
+
+
+
+ +
+
+ + @* Address Province *@ +
+
+
+
+ +
+
+
+
+ @Html.TextBox("Address.Province", "", new { @id = "ifAddressProvince", @class = $"{Model_Address.GetFieldName(Model_Address.ItemField.Province)} sbm-input sbm-auto-val", @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Province) }) +
+
+
+
+
+ +
+
+ +
+
+ + @* Address Postcode *@ +
+
+
+
+ +
+
+
+
+ @Html.TextBox("Address.Postcode", "", new { @id = "ifAddressPostcode", @class = $"{Model_Address.GetFieldName(Model_Address.ItemField.Postcode)} sbm-input upper sbm-auto-val", @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Postcode) }) +
+
+
+
+
+ +
+
+ + @* Address Country *@ +
+
+
+
+ +
+
+
+
+ @Html.TextBox("Address.Country", "", new { @id = "ifAddressCountry", @class = $"{Model_Address.GetFieldName(Model_Address.ItemField.Country)} sbm-input sbm-auto-val", @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Country) }) +
+
+
+
+
+ +
+
+ +
+
+ + @* Address Contact *@ +
+
+
+
+ +
+
+
+
+ @Html.TextBox("Address.Contact", "", new { @id = "ifAddressContact", @class = $"{Model_Address.GetFieldName(Model_Address.ItemField.Contact)} sbm-input sbm-auto-val", @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Contact) }) +
+
+
+
+
+ +
+
+ + @* Address Phone *@ +
+
+
+
+ +
+
+
+
+ @Html.TextBox("Address.Phone", "", new { @id = "ifAddressPhone", @class = $"{Model_Address.GetFieldName(Model_Address.ItemField.Phone)} sbm-input sbm-auto-val", @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Phone) }) +
+
+
+
+
+ +
+
+ + @* Address Email *@ +
+
+
+
+ +
+
+
+
+ @Html.TextBox("Address.Email", "", new { @id = "ifAddressEmail", @class = $"{Model_Address.GetFieldName(Model_Address.ItemField.Email)} sbm-input sbm-auto-val", @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Email) }) +
+
+
+
+
+ +
+
+ + @* Address Account Manager *@ +
+
+
+
+ +
+
+
+
+ @Html.DropDownList("Address.AccountManager", Model.GetEmptyListForSelect(), "", new { @id = "cbAddressAccountManager", @class = $"{Model_Address.GetFieldName(Model_Address.ItemField.AccountManager)} sbm-select sbm-auto-val" }) +
+
+
+
+
+ +
+
+ + @* Address Account Handler *@ +
+
+
+
+ +
+
+
+
+ @Html.DropDownList("Address.AccountHandler", Model.GetEmptyListForSelect(), "", new { @id = "cbAddressAccountHandler", @class = $"{Model_Address.GetFieldName(Model_Address.ItemField.AccountHandler)} sbm-select sbm-auto-val" }) +
+
+
+
+
+ +
+
+ + @* Address Contact Area *@ +
+
+
+
+ +
+
+
+
+ @Html.DropDownList("Address.ContactArea", Model.GetEmptyListForSelect(), "", new { @id = "cbAddressContactArea", @class = $"{Model_Address.GetFieldName(Model_Address.ItemField.ContactArea)} sbm-select sbm-auto-val" }) +
+
+
+
+
+ +
+
+ + @* Address Contact Handler *@ +
+
+
+
+ +
+
+
+
+ @Html.DropDownList("Address.ContactHandler", Model.GetEmptyListForSelect(), "", new { @id = "cbAddressContactHandler", @class = $"{Model_Address.GetFieldName(Model_Address.ItemField.ContactHandler)} sbm-select sbm-auto-val" }) +
+
+
+
+
+ +
+
+ + @* Address Delivery Type *@ +
+
+
+
+ +
+
+
+
+ @Html.DropDownList("Address.DeliveryType", Model.GetEmptyListForSelect(), "", new { @id = "cbAddressDeliveryType", @class = $"{Model_Address.GetFieldName(Model_Address.ItemField.DeliveryType)} sbm-select sbm-auto-val" }) +
+
+
+
+
+ +
+
+ + @* Address Delivery Method *@ +
+
+
+
+ +
+
+
+
+ @Html.DropDownList("Address.DeliveryMethod", Model.GetEmptyListForSelect(), "", new { @id = "cbAddressDeliveryMethod", @class = $"{Model_Address.GetFieldName(Model_Address.ItemField.DeliveryMethod)} sbm-select sbm-auto-val" }) +
+
+
+
+
+ +
+
+ + @* Address Delivery Book-In *@ +
+
+
+
+ +
+
+
+
+ @Html.DropDownList("Address.DeliveryBookIn", Model.GetEmptyListForSelect(), "", new { @id = "cbAddressDeliveryBookIn", @class = $"{Model_Address.GetFieldName(Model_Address.ItemField.DeliveryBookIn)} sbm-select sbm-auto-val" }) +
+
+
+
+
+ +
+
+ +
+
+ + @* Address Last Visit On *@ +
+
+
+
+ +
+
+
+
+ @Html.TextBox("Address.LastVisitOn", "", new { @id = "ifAddressLastVisitOn", @class = $"{Model_Address.GetFieldName(Model_Address.ItemField.LastVisitOn)} sbm-input sbm-calendar upper sbm-auto-val" }) +
+
+
+
+
+ +
+
+ + @* Address Next Visit On *@ +
+
+
+
+ +
+
+
+
+ @Html.TextBox("Address.NextVisitOn", "", new { @id = "ifAddressNextVisitOn", @class = $"{Model_Address.GetFieldName(Model_Address.ItemField.NextVisitOn)} sbm-input sbm-calendar upper sbm-auto-val" }) +
+
+
+
+
+ +
+
+ + @* Address Notes *@ +
+
+
+
+ +
+
+
+
+ @Html.TextArea("Address.Notes", "", new { @id = "ifAddressNotes", @class = $"{Model_Address.GetFieldName(Model_Address.ItemField.Notes)} sbm-textarea sbm-auto-val", @rows = "3", @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.Address_Notes) }) +
+
+
+
+
+ + } + +
diff --git a/SaBusinessMgrCoreWebPortal/Views/Address/Panel-AddressList.cshtml b/SaBusinessMgrCoreWebPortal/Views/Address/Panel-AddressList.cshtml new file mode 100644 index 0000000..71cdd0d --- /dev/null +++ b/SaBusinessMgrCoreWebPortal/Views/Address/Panel-AddressList.cshtml @@ -0,0 +1,82 @@ +@* View is decoupled from Address model as it may be included in other views, eg. Contacts. *@ +@model SbmModel_Portal +@inject SbmLocaliser Localiser +@{ + /* Address - List panel */ + /* NB Can potentially appear more than once on a page. */ +} + + + +@* Item list *@ +
+ + + + + + + @**@ + + + + + @**@ + @**@ + + + + + + + + +
@Localiser["label.type"]@Localiser["label.ref"]@Localiser["label.name"]@Localiser["label.description"]@Localiser["label.address"]@Localiser["label.postcode"]@Localiser["label.contact"]@Localiser["label.phone"]@Localiser["label.visit.last"]@Localiser["label.visit.next"]@Localiser["label.notes"]@Localiser["label.prim."]@Localiser["label.status"]
+
+ +@* Element templates *@ +
+ + @* List burger dropdown template - ul is ignored *@ +
    +
  • XXX
  • +
+ + @* Item row template - table is ignored. *@ + + + + + + @**@ + + + + + @**@ + @**@ + + + + + +
+
+ @* Burger menu *@ + +
+
+ + @* Item burger dropdown template - ul is ignored *@ +
    +
  • XXX
  • +
+ +
\ No newline at end of file diff --git a/SaBusinessMgrCoreWebPortal/Views/Address/Panel-AddressMaintain.cshtml b/SaBusinessMgrCoreWebPortal/Views/Address/Panel-AddressMaintain.cshtml new file mode 100644 index 0000000..88ccb5b --- /dev/null +++ b/SaBusinessMgrCoreWebPortal/Views/Address/Panel-AddressMaintain.cshtml @@ -0,0 +1,69 @@ +@* View is decoupled from Address model as it may be included in other views, eg. Contacts. *@ +@model SbmModel_Portal +@inject SbmLocaliser Localiser +@{ + /* Address - Maintain panel */ + // Ensure view is only included once in page. + if (!Model.RegisterView(Html.ViewContext)) return; + Model.AdditionalFiles_JS.Add("js/sbm-addr.js"); +} + +
+ + + +
+ + @* Filter form - wrap header to include paging controls. *@ + @using (@Html.BeginForm(FormMethod.Post, new { @id = "", @class = "frmAddressFilter sbm-form", @onSubmit = "return false;" })) + { + @Html.Hidden("Filter.Mode", Model_Address.ViewMode.Maintain, new { @id = "" }) + + @* Header - Page caption, paging controls, actions. *@ +
+
+
+
@Localiser["label.addresses"]
+
+ @* Burger menu *@ + +
+
+
+ + @* Filter Panel *@ +
+
+
+ @* Address Category *@ +
@Localiser["label.type"]
+
+ @Html.DropDownList("Filter.AddressType", Model.GetAddressTypeCodesForFilterDropdown(), null, new { @id = "", @class = "FilterAddressType sbm-select" }) +
+
+
+ @* Address filter - code, description etc *@ +
@Localiser["label.search"]
+
+ @Html.TextBox("Filter.Search", "", new { @type = "search", @id = "", @class = "FilterSearch sbm-input", @maxlength = "32" }) +
+
+
+
+
+
+ } + + + +
+ + + +
diff --git a/SaBusinessMgrCoreWebPortal/Views/Address/Panel-AddressSelect.cshtml b/SaBusinessMgrCoreWebPortal/Views/Address/Panel-AddressSelect.cshtml new file mode 100644 index 0000000..8d14ac8 --- /dev/null +++ b/SaBusinessMgrCoreWebPortal/Views/Address/Panel-AddressSelect.cshtml @@ -0,0 +1,81 @@ +@* View is decoupled from Address model as it may be included in other views, eg. Contacts. *@ +@model SbmModel_Portal +@inject SbmLocaliser Localiser +@{ + /* Address - Select panel */ + // Ensure view is only included once in page. + if (!Model.RegisterView(Html.ViewContext)) return; + Model.AdditionalFiles_JS.Add("js/sbm-addr.js"); +} + + + +
+ + @using (@Html.BeginForm(FormMethod.Post, new { @id = "", @class = "frmAddressFilter sbm-form", @onSubmit = "return false;" })) + { + @Html.Hidden("Filter.Mode", Model_Address.ViewMode.Search, new { @id = "", @class = "FilterMode" }) + + @* Filter Panel *@ +
+
+
+ @* Address type *@ +
@Localiser["label.item"]
+
+ @Html.Hidden("Filter.ItemType", "", new { @id = "", @class = "FilterItemType sbm-input" }) + @Html.Hidden("Filter.ItemId", "", new { @id = "", @class = "FilterItemId sbm-input" }) + +
+
+
+ @* Address type *@ +
@Localiser["label.type"]
+
+ @Html.DropDownList("Filter.AddressType", Model.GetAddressTypeCodesForFilterDropdown(), Localiser["label.any"], new { @id = "", @class = "FilterAddressType sbm-select" }) +
+
+
+ @* Address filter - name etc. *@ +
@Localiser["label.search"]
+
+ @Html.TextBox("Filter.Search", "", new { @type = "search", @id = "", @class = "FilterSearch sbm-input", @maxlength = "32" }) +
+
+
+
+ } + + @* Element templates *@ +
+ + @* Select Address Dialog Titlebar content *@ +
+
+
+
@Localiser["label.addresses"]
+
+ @* Burger menu *@ + +
+
+
+ + @* Dialog burger dropdown template is defined in Address List panel. *@ + +
+ + @* Address List panel. *@ + + +
+ +@* Address Dialog. *@ + diff --git a/SaBusinessMgrCoreWebPortal/Views/Assets/Asset/Panel-AssetList.cshtml b/SaBusinessMgrCoreWebPortal/Views/Assets/Asset/Panel-AssetList.cshtml index 4fe9cd8..dc5cf78 100644 --- a/SaBusinessMgrCoreWebPortal/Views/Assets/Asset/Panel-AssetList.cshtml +++ b/SaBusinessMgrCoreWebPortal/Views/Assets/Asset/Panel-AssetList.cshtml @@ -15,7 +15,7 @@ @Localiser["label.description"] @Localiser["label.notes"] @Localiser["label.status"] - +
diff --git a/SaBusinessMgrCoreWebPortal/Views/Association/Panel-AssociationList.cshtml b/SaBusinessMgrCoreWebPortal/Views/Association/Panel-AssociationList.cshtml index 5258bc5..dcfff57 100644 --- a/SaBusinessMgrCoreWebPortal/Views/Association/Panel-AssociationList.cshtml +++ b/SaBusinessMgrCoreWebPortal/Views/Association/Panel-AssociationList.cshtml @@ -6,6 +6,10 @@ /* NB Can potentially appear more than once on a page. */ } + + @* Item list *@
diff --git a/SaBusinessMgrCoreWebPortal/Views/Association/Panel-AssociationMaintain.cshtml b/SaBusinessMgrCoreWebPortal/Views/Association/Panel-AssociationMaintain.cshtml index 9442b10..1bdac9b 100644 --- a/SaBusinessMgrCoreWebPortal/Views/Association/Panel-AssociationMaintain.cshtml +++ b/SaBusinessMgrCoreWebPortal/Views/Association/Panel-AssociationMaintain.cshtml @@ -67,7 +67,10 @@ - @* Contact panels. *@ + +@* Address panels. *@ + + diff --git a/SaBusinessMgrCoreWebPortal/Views/Commodity/Panel-CommodityList.cshtml b/SaBusinessMgrCoreWebPortal/Views/Commodity/Panel-CommodityList.cshtml index aea8028..5a1f004 100644 --- a/SaBusinessMgrCoreWebPortal/Views/Commodity/Panel-CommodityList.cshtml +++ b/SaBusinessMgrCoreWebPortal/Views/Commodity/Panel-CommodityList.cshtml @@ -21,7 +21,7 @@ } - + diff --git a/SaBusinessMgrCoreWebPortal/Views/Contact/Panel-ContactDialog.cshtml b/SaBusinessMgrCoreWebPortal/Views/Contact/Panel-ContactDialog.cshtml index 53234d8..ecb1b7f 100644 --- a/SaBusinessMgrCoreWebPortal/Views/Contact/Panel-ContactDialog.cshtml +++ b/SaBusinessMgrCoreWebPortal/Views/Contact/Panel-ContactDialog.cshtml @@ -47,13 +47,12 @@ -
@* Organisation Abbreviation *@
-
+
@@ -108,13 +107,12 @@
-
@* Organisation Contact *@
-
+
@@ -157,13 +155,12 @@
-
@* Individual Salutation *@
-
+
@@ -201,13 +198,12 @@
-
@* Individual Initials *@
-
+
@@ -262,13 +258,12 @@
-
@* Organisation Alt Phone *@
-
+
@@ -285,7 +280,7 @@ @* Individual Mobile Phone *@
-
+
@@ -323,13 +318,12 @@
-
@* Organisation Fax *@
-
+
@@ -401,13 +395,12 @@
-
@* Organisation VAT registration number *@
-
+
diff --git a/SaBusinessMgrCoreWebPortal/Views/Contact/Panel-ContactList.cshtml b/SaBusinessMgrCoreWebPortal/Views/Contact/Panel-ContactList.cshtml index c1366e3..b8785ca 100644 --- a/SaBusinessMgrCoreWebPortal/Views/Contact/Panel-ContactList.cshtml +++ b/SaBusinessMgrCoreWebPortal/Views/Contact/Panel-ContactList.cshtml @@ -7,6 +7,8 @@ } @* Item list *@ @@ -22,7 +24,7 @@
- + diff --git a/SaBusinessMgrCoreWebPortal/Views/Contact/Panel-ContactMaintain.cshtml b/SaBusinessMgrCoreWebPortal/Views/Contact/Panel-ContactMaintain.cshtml index 0eec0cd..c745841 100644 --- a/SaBusinessMgrCoreWebPortal/Views/Contact/Panel-ContactMaintain.cshtml +++ b/SaBusinessMgrCoreWebPortal/Views/Contact/Panel-ContactMaintain.cshtml @@ -73,3 +73,7 @@ @* Association panels. *@ + +@* Address panels. *@ + + diff --git a/SaBusinessMgrCoreWebPortal/Views/Contact/Panel-ContactSelect.cshtml b/SaBusinessMgrCoreWebPortal/Views/Contact/Panel-ContactSelect.cshtml index 368d191..ffd12f7 100644 --- a/SaBusinessMgrCoreWebPortal/Views/Contact/Panel-ContactSelect.cshtml +++ b/SaBusinessMgrCoreWebPortal/Views/Contact/Panel-ContactSelect.cshtml @@ -25,7 +25,7 @@ @* Contact type *@
@Localiser["label.type"]
- @Html.DropDownList("Filter.ContactType", Model.GetAffiliateTypeCodesForFilterDropdown(), Localiser["label.any"], new { @id = "", @class = "FilterContactType sbm-select" }) + @Html.DropDownList("Filter.ContactType", Model.GetAffiliateTypeCodesForFilterDropdown(Sbm.AffiliateType.ContactGroup), Localiser["label.any"], new { @id = "", @class = "FilterContactType sbm-select" })
diff --git a/SaBusinessMgrCoreWebPortal/Views/Requirement/Panel-RequirementList.cshtml b/SaBusinessMgrCoreWebPortal/Views/Requirement/Panel-RequirementList.cshtml index 4096a96..aa372ea 100644 --- a/SaBusinessMgrCoreWebPortal/Views/Requirement/Panel-RequirementList.cshtml +++ b/SaBusinessMgrCoreWebPortal/Views/Requirement/Panel-RequirementList.cshtml @@ -22,7 +22,7 @@ }
- + diff --git a/SaBusinessMgrCoreWebPortal/Views/Shared/_Layout.cshtml b/SaBusinessMgrCoreWebPortal/Views/Shared/_Layout.cshtml index 3ea8cfe..e108cdc 100644 --- a/SaBusinessMgrCoreWebPortal/Views/Shared/_Layout.cshtml +++ b/SaBusinessMgrCoreWebPortal/Views/Shared/_Layout.cshtml @@ -56,10 +56,12 @@ @* Scripts *@
@Localiser["label.notes"] @Localiser["label.status"]
@Localiser["label.notes"] @Localiser["label.associations"] @Localiser["label.status"]
@Localiser["label.notes"] @Localiser["label.status"]