Files
BusinessMgr-2019/SaBusMgrStandardDbas/Dbas/Mgr/SbmProcessMgr_Dbas-ItemProcess.cs
T
2021-07-08 20:50:46 +01:00

437 lines
20 KiB
C#

using Sarand.BusinessMgr.Net.Standard.Base.App;
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
using Sarand.BusinessMgr.Net.Standard.Dbas.Bus;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Utils;
using Sarand.Net.Standard.Dbas.Data;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
{
//=======================================================================
partial class SbmProcessMgr_Dbas
{
//*******************************************************************
// I t e m P r o c e s s e s
//*******************************************************************
// Data members.
//-------------------------------------------------------------------
// Utilites.
public override bool StoreItemProcesses(Sbm.ItemType itemType, SysId itemId, List<SbmItemProcess> itemProcesses, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
// Validate parameters.
if (itemType != Sbm.ItemType.Commodity && itemType != Sbm.ItemType.AssetCategory && itemType != Sbm.ItemType.Asset) return SetErrorState("invalid item type");
if (!SysId.IsValid(itemId)) return SetErrorState("invalid item Id");
//---------------------------------------------------------------
// Validate the content of the list.
List<SbmItemProcess> itemProcessesToStore = new List<SbmItemProcess>(itemProcesses);
itemProcessesToStore.Resequence();
foreach (SbmItemProcess itemProcess in itemProcessesToStore)
{
if (itemProcess == null) return SetErrorState("invalid item in list");
if (itemProcess.ItemType > 0 && itemProcess.ItemType != itemType) return SetErrorState("invalid item type in list");
if (SysId.IsValid(itemProcess.ItemId) && itemProcess.ItemId != itemId) return SetErrorState("invalid item id in list");
// Set the item's attributes.
itemProcess.ItemType = itemType;
itemProcess.ItemId = itemId;
}
//---------------------------------------------------------------
// Retrieve all links of this type that already exist.
SbmItemLink.Params prm = new SbmItemLink.Params();
prm.ItemTypeFrom = itemType;
prm.ItemIdFrom = itemId;
prm.ItemTypeTo = Sbm.ItemType.Process;
foreach (SbmItemLink itemLink in DataItemMgr.GetItemLinkList(prm))
{
// Is this process still in the list.
SysId processId = itemLink.ItemIdTo;
SbmItemProcess itemProcess = itemProcessesToStore.Find(item => item.ProcessId.Equals(processId));
if (itemProcess != null)
{
// Process is still in the list - update it.
if (itemProcess.Changed)
{
// Process is still in the list - update the link.
itemLink.ItemLinkType = Sbm.ItemLinkType.ItemProcess;
if (!DataItemMgr.UpdateItemLink(itemLink, dbUpdateInfo))
return SetErrorState("failed to update item link - " + DataItemMgr.ErrorStateMessage);
}
// Remove this Process from the list so that it is not processed again.
itemProcessesToStore.Remove(itemProcess);
}
else
{
// Process is no longer in the list - remove it.
if (!DataItemMgr.DeleteItemLink(itemLink, dbUpdateInfo))
return SetErrorState("failed to remove item link - " + DataItemMgr.ErrorStateMessage);
}
}
//---------------------------------------------------------------------
// Create any process links that remain in the list.
foreach (SbmItemProcess itemProcess in itemProcessesToStore)
{
SbmItemLink itemLink = DataItemMgr.CreateItemLink(prm.ItemLinkType, prm.ItemTypeFrom, prm.ItemIdFrom, prm.ItemTypeTo, prm.ItemIdTo);
{
// Create and insert item link.
itemType = itemProcess.ItemType;
itemLink.ItemLinkType = Sbm.ItemLinkType.ItemProcess; // Nov-08 Was Sbm.ItemLink_ItemCostEstimate
itemLink.ItemTypeFrom = itemType;
itemLink.ItemIdFrom = itemProcess.ItemId;
itemLink.ItemTypeTo = Sbm.ItemType.Process;
itemLink.ItemIdTo = itemProcess.ProcessId;
if (!DataItemMgr.InsertItemLink(itemLink, dbUpdateInfo))
return SetErrorState("failed to insertitem link - " + DataItemMgr.ErrorStateMessage);
}
}
return false;
}
//-------------------------------------------------------------------
// Get ItemProcess.
public override SbmItemProcess GetProcessForItem(Sbm.ItemType itemType, SysId itemId, SysId processId)
{
ClearErrorState();
if ((int)itemType < 1 && !SysId.IsValid(itemId) && !SysId.IsValid(processId)) return null;
SbmItemProcess.Params prmItemProcess = new SbmItemProcess.Params();
prmItemProcess.ItemType = itemType;
prmItemProcess.ItemId = itemId;
prmItemProcess.ProcessId = processId;
List<SbmItemProcess> itemProcesses = GetProcessesForItem(prmItemProcess);
foreach (SbmItemProcess itemProcess in itemProcesses)
{
if (itemProcess.ProcessId.Equals(processId))
return itemProcess;
}
return null;
}
public override List<SbmItemProcess> GetProcessesForItem(Sbm.ItemType itemType, SysId itemId, bool activeOnly)
{
ClearErrorState();
if ((int)itemType < 1 && !SysId.IsValid(itemId) && activeOnly) return null;
SbmItemProcess.Params prmItemProcess = new SbmItemProcess.Params();
prmItemProcess.ItemType = itemType;
prmItemProcess.ItemId = itemId;
prmItemProcess.RestrictToActive = activeOnly;
return GetProcessesForItem(prmItemProcess);
}
public override List<SbmItemProcess> GetProcessesForItem(SbmItemProcess.Params prm)
{
List<SbmItemProcess> itemProcesses = new List<SbmItemProcess>();
ClearErrorState();
if (prm.ItemType != Sbm.ItemType.Commodity && prm.ItemType != Sbm.ItemType.AssetCategory && prm.ItemType != Sbm.ItemType.Asset) SetErrorState("invalid item type");
if (!SysId.IsValid(prm.ItemId)) SetErrorState("invalid item Id");
// Various aliases to distinguish column names.
String aliasCol_ItemType = "ItemType";
String aliasCol_ProcessCategory = "ProcCategory";
String aliasCol_ProcessType = "ProcType";
// Build the query to retrieve item processes and associated process details.
DbQuery qry = new DbQuery(db.DbmsType);
qry.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ItemLink));
qry.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Process));
qry.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemTypeFrom), aliasCol_ItemType);
qry.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemIdFrom));
qry.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemTypeTo));
qry.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemIdTo));
qry.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_Completed));
qry.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_Seq));
qry.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_Notes));
qry.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_Flags));
qry.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_Status));
qry.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Process_Id));
qry.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Process_Category), aliasCol_ProcessCategory);
qry.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Process_Type), aliasCol_ProcessType);
qry.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Process_DescBrief));
qry.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Process_DescOutline));
// Filter the link type - NB 'Sbm.ItemLink_ItemCostEstimate' is included as a valid value as this was used (incorrectly) in versions of the system up to Nov-08.
qry.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_Type) + "=" + ((int)Sbm.ItemLinkType.ItemProcess).ToString() + " OR " + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_Type) + "=" + ((int)Sbm.ItemLinkType.ItemCostEstimate).ToString());
// Filter to the required 'From' item (the data item):
qry.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemTypeFrom) + "=" + ((int)prm.ItemType).ToString());
qry.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemIdFrom) + "=" + prm.ItemId.ToString());
qry.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemTypeTo) + "=" + ((int)Sbm.ItemType.Process).ToString());
qry.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemIdTo) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Process_Id));
if (SysId.IsValid(prm.ProcessId))
qry.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemIdTo) + "=" + prm.ProcessId.ToString());
// 'Active' processes.
if (prm.RestrictToActive)
{
String statusActive = SacsSystem.GetStatusCode(SaStatus.Active);
qry.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_Status) + "='" + statusActive + "'");
}
#if _DEBUG
//qry.Dump (::afxDump);
#endif
// Filter the 'To' item to match the process.
using (DbResultSet dbResultSet = DbResultSet_DataReader.ExecuteQuery(db, qry.ToString()))
{
if (dbResultSet != null && dbResultSet.NextRecord())
{
NamedValue.Map values = dbResultSet.GetRecordValues();
// Create the list if required.
if (itemProcesses.Count == 0) itemProcesses = new List<SbmItemProcess>();
// Create the item process.
Sbm.ItemType itemType = EnumUtil.ParseEnum(values.GetValue(aliasCol_ItemType).ToString(), Sbm.ItemType.Unknown);
SysId itemId = new SysId((int)values.GetValue(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.ItemLink_ItemIdFrom)).AsLong());
SysId processId = new SysId((int)values.GetValue(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.ItemLink_ItemIdTo)).AsLong());
SbmItemProcess_Dbas itemProcess_Dbas = new SbmItemProcess_Dbas(Internals, itemType, itemId, processId, (ushort)values.GetValue(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.ItemLink_Flags)).AsLong());
if (itemProcess_Dbas != null)
{
itemProcess_Dbas.Completed = values.GetValue(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.ItemLink_Completed)).AsDateTime();
itemProcess_Dbas.Seq = (short)values.GetValue(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.ItemLink_Seq)).AsLong();
itemProcess_Dbas.Notes = values.GetValue(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.ItemLink_Notes)).AsString();
itemProcess_Dbas.Status = SbmSystem.GetStatusForCode(values.GetValue(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.ItemLink_Status)).AsString());
itemProcess_Dbas.ProcessCategory = EnumUtil.ParseEnum(values.GetValue(aliasCol_ProcessCategory).AsString(), Sbm.ProcessCategory.Unknown);
//itemProcess_Dbas.ProcessType ((Sbm.ProcessType)values.GetValue(sAliasColProcType)).AsShort();
itemProcess_Dbas.ProcessDescBrief = values.GetValue(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Process_DescBrief)).AsString();
itemProcess_Dbas.ProcessDescOutline = values.GetValue(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Process_DescOutline)).AsString();
}
itemProcess_Dbas.AcceptChanges();
// Ensure that the process is unique:
if (!itemProcesses.FindByProcessId(itemProcess_Dbas.ProcessId))
itemProcesses.Add(itemProcess_Dbas);
itemProcess_Dbas = null; // Item now owned by the list.
}
}
if (itemProcesses.Count > 0) itemProcesses.Sort();
return itemProcesses;
}
//-------------------------------------------------------------------
// Has ItemProcess.
public override bool HasItemProcesses(Sbm.ItemType itemType, SysId itemId)
{
ClearErrorState();
if (itemType != Sbm.ItemType.Commodity && itemType != Sbm.ItemType.AssetCategory && itemType != Sbm.ItemType.Asset) return SetErrorState("invalid item type");
if (!SysId.IsValid(itemId)) return SetErrorState("invalid item Id");
if (db == null) return SetErrorState("database unavailable");
// Query the number of matching links.
List<String> filters = new List<String>();
filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemTypeFrom) + "=" + ((int)itemType).ToString());
filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemIdFrom) + "=" + itemId.ToString());
filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemTypeTo) + "=" + ((int)Sbm.ItemType.Process).ToString());
return db.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ItemLink), filters.Concat(" AND ")) > 0;
}
//-------------------------------------------------------------------
// Create ItemProcess.
public override SbmItemProcess CreateItemProcess(Sbm.ItemType itemType, SysId itemId, SysId processId)
{
ClearErrorState();
SbmItemProcess_Dbas itemProcess_Dbas = null;
if (itemType == Sbm.ItemType.Commodity || itemType == Sbm.ItemType.Requirement || itemType == Sbm.ItemType.AssetCategory || itemType == Sbm.ItemType.Asset)
{
// Retrieve the stated process:
SbmProcess process = GetProcessById(processId);
if (process != null)
{
itemProcess_Dbas = new SbmItemProcess_Dbas(Internals, itemType, itemId, processId, 0);
//itemProcess_Dbas.Status = process.Status;
itemProcess_Dbas.Notes = process.Notes;
itemProcess_Dbas.ProcessCategory = process.ProcessCategory;
//itemProcess_Dbas.ProcessType = process.Type;
itemProcess_Dbas.ProcessDescBrief = process.DescBrief;
itemProcess_Dbas.ProcessDescOutline = process.DescOutline;
}
}
else SetErrorState("invalid item type");
return itemProcess_Dbas;
}
public override SbmItemProcess CreateItemProcessForConstituent(SbmConstituent constituent)
{
ClearErrorState();
SbmItemProcess_Dbas itemProcess_Dbas = null;
if (constituent != null)
{
// Retrieve the stated process.
SbmProcess process = GetProcessById(constituent.ProcessId);
if (process != null)
{
// Create an item process from this constituent. - NB constituent flags should not be relevant.
itemProcess_Dbas = new SbmItemProcess_Dbas(Internals, Sbm.ItemType.Requirement, constituent.RequirementId, constituent.ProcessId, 0);
itemProcess_Dbas.Seq = constituent.Seq;
itemProcess_Dbas.Completed = constituent.Completed;
itemProcess_Dbas.AssocIdContractor = constituent.AssociationIdContractor;
itemProcess_Dbas.AmountNet = constituent.AmountNet;
itemProcess_Dbas.Notes = constituent.Notes;
itemProcess_Dbas.Status = constituent.Status;
// Copy the process details (for reference only).
itemProcess_Dbas.ProcessCategory = process.ProcessCategory;
//itemProcess_Dbas.ProcessType = process.ProcessType;
itemProcess_Dbas.ProcessDescBrief = process.DescBrief;
itemProcess_Dbas.ProcessDescOutline = process.DescOutline;
}
}
else SetErrorState("invalid item type");
return itemProcess_Dbas;
}
//-------------------------------------------------------------------
// Validate ItemProcess.
public override bool IsValidItemProcessData(SbmItemProcess.Data data, SbmItemProcess.ErrField errField)
{
ClearErrorState();
if (!base.IsValidItemProcessData(data, errField)) return false;
return true;
}
//-------------------------------------------------------------------
// Update ItemProcess.
public override bool UpdateProcessesForItem(Sbm.ItemType itemType, SysId itemId, List<SbmItemProcess> itemProcesses)
{
bool update = true;
ClearErrorState();
//---------------------------------------------------------------------
if (itemType != Sbm.ItemType.Commodity && itemType != Sbm.ItemType.AssetCategory && itemType != Sbm.ItemType.Asset) return SetErrorState("invalid item type");
if (!SysId.IsValid(itemId)) return SetErrorState("invalid item Id");
//---------------------------------------------------------------------
// Validate the content of the list.
if (itemProcesses.Count > 0) itemProcesses.Resequence();
if (itemProcesses.Count > 0)
{
foreach (SbmItemProcess itemProcess in itemProcesses)
{
if (itemProcess == null)
{
update = SetErrorState("invalid item in list");
break;
}
if (itemProcess.ItemType > 0 && itemProcess.ItemType != itemType)
{
update = SetErrorState("invalid item type in list");
break;
}
if (SysId.IsValid(itemProcess.ItemId) && itemProcess.ItemId != itemId)
{
update = SetErrorState("invalid item id in list");
break;
}
// Set the item's attributes.
itemProcess.ItemType = itemType;
itemProcess.ItemId = itemId;
}
}
//---------------------------------------------------------------------
// Make a copy of the list of process Ids so that we can keep track of those that have been updated already.
List<SysId> processIds = new List<SysId>();
if (itemProcesses.Count > 0) processIds = itemProcesses.GetProcessIds();
#if _DEBUG
if (itemProcesses.Count > 0)
{
int i = itemProcesses.Len();
String s = i.ToString();
}
#endif
//---------------------------------------------------------------------
// Retrieve all links of this type that already exist.
SbmItemLink.Params prm = new SbmItemLink.Params();
prm.ItemTypeFrom = itemType;
prm.ItemIdFrom = itemId;
prm.ItemTypeTo = Sbm.ItemType.Process;
List<SbmItemLink> itemLinks = DataItemMgr.GetItemLinkList(prm);
if (itemLinks != null)
{
foreach (SbmItemLink itemLink in itemLinks)
{
// Is this process still in the list.
SysId processId = itemLink.ItemIdTo;
if (processIds.Exists(item => item.Id.Equals(processId)) && itemProcesses != null && itemProcesses.FindByProcessId(processId))
{
SbmItemProcess itemProcess = itemProcesses[0];
if (itemProcess != null && itemProcess.Changed)
{
// Process is still in the list - update it.
itemLink.ItemLinkType = Sbm.ItemLinkType.ItemProcess;
CopyFrom(itemProcess, itemLink);
if (!DataItemMgr.UpdateItemLink(itemLink, DbUpdateInfo)) update = SetErrorState("failed to update item link");
}
// Remove this Id from the list so that it is not processed again.
processIds.Clear();
}
else
{
// Process is no longer in the list - remove it.
if (!DataItemMgr.DeleteItemLink(itemLink, DbUpdateInfo))
update = SetErrorState("failed to remove item link");
}
}
}
//---------------------------------------------------------------------
// Create any process links that remain in the list.
if (itemLinks.Count > 0)
{
foreach (SysId processId in processIds)
{
SbmItemProcess itemProcess = itemProcesses[0];
if (itemProcess != null)
{
foreach (SbmItemLink itemLink in itemLinks)
{
// Identify the item and link types.
Sbm.ItemType itemProcessType = itemProcess.ItemType;
// Process is still in the list - update it.
itemLink.ItemLinkType = Sbm.ItemLinkType.ItemProcess; // Nov-08 Was Sbm.ItemLink_ItemCostEstimate
itemLink.ItemTypeFrom = itemProcessType;
itemLink.ItemIdFrom = itemProcess.ItemId;
itemLink.ItemTypeTo = Sbm.ItemType.Process;
itemLink.ItemIdTo = processId;
CopyFrom(itemProcess, itemLink);
if (!DataItemMgr.UpdateItemLink(itemLink, DbUpdateInfo))
update = SetErrorState("failed to update item link");
}
}
}
}
return update;
}
private void CopyFrom(SbmItemProcess itemProcess, SbmItemLink itemLink)
{
itemLink.Seq = itemProcess.Seq;
itemLink.Completed = itemProcess.Completed;
itemLink.Notes = itemProcess.Notes;
//itemLink.Flags = itemProcess.Flags;
itemLink.Status = itemProcess.Status;
/* Time stamp the record.
TimeZone now = TimeZone.CurrentTimeZone;
if (itemLink.CreateOn == 0)
{
itemLink.CreateOn = now;
itemLink.CreateBy = SaSystem::GetUserId();
itemLink.CreateHost = SaSystem::GetComputerName();
}
itemLink.UpdateOn = now;
itemLink.UpdateBy = SaSystem::GetUserId();
itemLink->sUpdateHost = SaSystem::GetComputerName();*/
}
//-------------------------------------------------------------------
}
//=======================================================================
}