Files
BusinessMgr-2019/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas-Association-Utils.cs
T
2025-02-19 16:01:05 +00:00

267 lines
12 KiB
C#

using Sarand.BusinessMgr.Net.Standard.Base.App;
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.CodeTypes;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Utils;
using Sarand.Net.Standard.Dbas.Data;
using System;
using System.Collections.Generic;
using System.Linq;
using static Sarand.BusinessMgr.Net.Standard.Base.App.Sbm;
namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
{
//=======================================================================
// Account manager - Associations - Utilities.
//=======================================================================
partial class SbmAccountMgr_Dbas
{
//-------------------------------------------------------------------
// Utilities.
private List<StringPair> GetLogProperties(SbmAssociation association)
{
return new List<StringPair>()
{
new StringPair("Id",SysId.ToString(association.Id)),
new StringPair("Code",association.Code),
new StringPair("Status",association.StatusCode)
};
}
//-------------------------------------------------------------------
// Association types in use.
public override List<Sbm.AssociationType> GetAssociationTypesInUse()
{
List<Sbm.AssociationType> types = new List<Sbm.AssociationType>();
String colAssociation_Type = SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Association_Type);
// Construct the query.
DbQuery qry = new DbQuery(Database.DbmsType);
qry.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Association));
qry.Columns.Add("DISTINCT " + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Type), colAssociation_Type);
qry.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_AffIdOwner) + "=" + AffiliateId_Owner.ToString());
using (DbResultSet dbResultSet = DbResultSet_DataReader.ExecuteQuery(Database, qry.BuildQuery()))
{
while (dbResultSet != null && dbResultSet.NextRecord())
{
NamedValue.Map values = dbResultSet.GetRecordValues();
types.Add((Sbm.AssociationType)values.GetValue(colAssociation_Type).AsLong());
}
}
return types;
}
//-------------------------------------------------------------------
// Internal associations.
public override HashSet<SysId> GetInternalAssociationAffiliateIdsOwner()
{
ClearErrorState();
HashSet<SysId> affiliateIdsOwner = new HashSet<SysId>();
String colAffIdOwner = SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Association_AffIdOwner);
SbmAssociation.Params prmAssociation = new SbmAssociation.Params();
prmAssociation.AssociationType = Sbm.AssociationType.Internal;
prmAssociation.StatusCat = SbmAssociation.StatusCat.Active;
// Construct the query.
DbQuery qry = new DbQuery(Database.DbmsType);
qry.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Association), aliasAssociation);
qry.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Type, aliasAssociation), colAffIdOwner);
qry.Filters.AddRange(GetAssociationQueryFilter(prmAssociation));
using (DbResultSet dbResultSet = DbResultSet_DataReader.ExecuteQuery(Database, qry.BuildQuery()))
{
while (dbResultSet != null && dbResultSet.NextRecord())
{
NamedValue.Map values = dbResultSet.GetRecordValues();
SysId affiliteIdOwner = new SysId(values.GetValue(colAffIdOwner).AsLong());
if (SysId.IsValid(affiliteIdOwner))
affiliateIdsOwner.Add(affiliteIdOwner);
}
}
return affiliateIdsOwner;
}
public override HashSet<SysId> GetMemberTargetIds(SysId affiliateIdOwner)
{
HashSet<SysId> affiliateIncludeIds = new HashSet<SysId>();
HashSet<SysId> affiliateExcludeIds = new HashSet<SysId>();
return GetTargetIds(affiliateIdOwner, Sbm.AssociationType.Member, affiliateIncludeIds, affiliateExcludeIds);
}
public override HashSet<SysId> GetCustomerTargetIds(HashSet<SysId> affiliateIncludeIds, HashSet<SysId> affiliateExcludeIds)
{
return GetTargetIds(AffiliateId_Owner, Sbm.AssociationType.Customer, affiliateIncludeIds, affiliateExcludeIds);
}
public HashSet<SysId> GetTargetIds(SysId affiliateIdOwner, Sbm.AssociationType associationType, HashSet<SysId> affiliateIncludeIds, HashSet<SysId> affiliateExcludeIds)
{
HashSet<SysId> affiliateIdsTarget = new HashSet<SysId>();
if (Database == null) return affiliateIdsTarget;
if (!SysId.IsValid(affiliateIdOwner) || (int)associationType < 1)
{
SaLogger.Debug($"{SysUtil.Fn} Invalid owner or association type.");
return affiliateIdsTarget;
}
else if (associationType == Sbm.AssociationType.Customer || associationType == Sbm.AssociationType.Supplier)
{
if (affiliateIdOwner != AffiliateId_Owner)
{
SaLogger.Debug($"{SysUtil.Fn} Invalid customer/supplier owner.");
return affiliateIdsTarget;
}
}
String colAffiliateIdTarget = "AffIdTgt";
DbQuery qry = new DbQuery(Database.DbmsType);
qry.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Association));
qry.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_AffIdTarget), colAffiliateIdTarget);
qry.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_AffIdOwner) + "=" + affiliateIdOwner.ToString());
qry.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Type) + "=" + ((int)associationType).ToString());
if (affiliateIncludeIds.Count > 0)
qry.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_AffIdTarget) + " IN(" + affiliateIncludeIds.Concat(",") + ")");
if (affiliateExcludeIds.Count > 0)
qry.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_AffIdTarget) + " NOT IN(" + affiliateExcludeIds.Concat(",") + ")");
using (DbResultSet dbResultSet = DbResultSet_DataReader.ExecuteQuery(Database, qry.BuildQuery()))
{
while (dbResultSet != null && dbResultSet.NextRecord())
{
NamedValue.Map values = dbResultSet.GetRecordValues();
affiliateIdsTarget.Add(new SysId(StringUtil.ToInt(values.GetValue(colAffiliateIdTarget))));
}
}
return affiliateIdsTarget;
}
public override HashSet<SysId> GetCustomerAssocIdsForTargets(HashSet<SysId> affiliateIdsTarget)
{
return GetAssocIdsForTargets(AffiliateId_Owner, Sbm.AssociationType.Customer, affiliateIdsTarget);
}
public override HashSet<SysId> GetAssocIdsForTargets(SysId affiliateIdOwner, Sbm.AssociationType associationType, HashSet<SysId> affiliateIdsTarget)
{
HashSet<SysId> associations = new HashSet<SysId>();
if (Database == null) return associations;
if (!SysId.IsValid(affiliateIdOwner) || (int)associationType < 1)
{
SaLogger.Debug($"{SysUtil.Fn} Invalid owner or association type.");
return associations;
}
else if (associationType == Sbm.AssociationType.Customer || associationType == Sbm.AssociationType.Supplier)
{
if (affiliateIdOwner != AffiliateId_Owner)
{
SaLogger.Debug($"{SysUtil.Fn} Invalid customer/supplier owner.");
return associations;
}
}
String colAssociationId = "AssocId";
DbQuery qry = new DbQuery(Database.DbmsType);
qry.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Association));
qry.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Id), colAssociationId);
qry.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_AffIdOwner) + "=" + affiliateIdOwner.ToString());
qry.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Type) + "=" + ((int)associationType).ToString());
qry.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_AffIdTarget) + " IN " + affiliateIdsTarget.Concat(","));
using (DbResultSet dbResultSet = DbResultSet_DataReader.ExecuteQuery(Database, qry.BuildQuery()))
{
while (dbResultSet != null && dbResultSet.NextRecord())
{
NamedValue.Map values = dbResultSet.GetRecordValues();
associations.Add(new SysId(StringUtil.ToInt(values.GetValue(colAssociationId))));
}
}
return associations;
}
public override HashSet<Sbm.AssociationType> GetAssociationTypesForTarget(SysId affiliateIdTarget)
{
HashSet<Sbm.AssociationType> associationTypes = new HashSet<Sbm.AssociationType>();
if (Database == null) return associationTypes;
if (!SysId.IsValid(affiliateIdTarget))
{
SaLogger.Debug($"{SysUtil.Fn} Invalid target.");
return associationTypes;
}
String colAssociationType = "AssocType";
DbQuery qry = new DbQuery(Database.DbmsType);
qry.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Association));
qry.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Type), colAssociationType);
qry.Filters.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_AffIdOwner)}={SysId.ToLong(AffiliateId_Owner)}");
qry.Filters.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_AffIdTarget)}={SysId.ToLong(affiliateIdTarget)}");
using (DbResultSet dbResultSet = DbResultSet_DataReader.ExecuteQuery(Database, qry.BuildQuery()))
{
while (dbResultSet != null && dbResultSet.NextRecord())
{
NamedValue.Map values = dbResultSet.GetRecordValues();
associationTypes.Add((Sbm.AssociationType)(values.GetLong(colAssociationType)));
}
}
return associationTypes;
}
//-------------------------------------------------------------------
// Associated data.
public override bool AssociationHasTransactions(SysId associationId)
{
if (!SysId.IsValid(associationId)) return false;
String filter = $"{SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Transaction_AssocId)}={associationId}";
return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction), filter) > 0;
}
public override bool AssociationHasRequirements(SysId associationId)
{
if (!SysId.IsValid(associationId)) return false;
String filter = $"{SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Requirement_AssocId)}={associationId}";
return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement), filter) > 0;
}
public override bool AssociationHasConstituents(SysId associationId)
{
if (!SysId.IsValid(associationId)) return false;
String filter = $"{SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Constituent_AssocId)}={associationId}";
return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Constituent), filter) > 0;
}
public override bool AssociationIsDeliveryContractor(SysId associationId)
{
// Is associated with transaction for delivery.
if (!SysId.IsValid(associationId)) return false;
String filter = $"{SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Transaction_AssIdDeliver)}={associationId}";
return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction), filter) > 0;
}
public override bool ClearAssociationDependentData(SbmAssociation association, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (association == null || !SysId.IsValid(association.Id)) return false;
// Delete interface data items.
if (!HasErrorState())
{
if (InterfaceConsole != null)
{
if (!InterfaceConsole.ClearInterfaceDataItems(association.GetItemId(), dbUpdateInfo))
SetErrorState("Failed to clear interface data items - " + InterfaceConsole.ErrorStateMessage);
}
else SetErrorState("failed to initialise interface console");
}
// Remove document references
if (!HasErrorState())
{
if (ItemDocConsole != null)
{
if (!ItemDocConsole.ClearItemDocs(association.GetItemId(), dbUpdateInfo))
SetErrorState(ItemDocConsole.ErrorStateMessage);
}
else SetErrorState("Failed to retrieve item document console");
}
// Remove data item references.
if (!HasErrorState())
{
if (!DataItemMgr.ClearDataItem(association.GetItemId(), dbUpdateInfo))
SetErrorState(DataItemMgr.ErrorStateMessage);
}
return OK;
}
//-------------------------------------------------------------------
}
//=======================================================================
}