986 lines
46 KiB
C#
986 lines
46 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.BusinessMgr.Net.Standard.Dbas.Internal;
|
|
using Sarand.BusinessMgr.Net.Standard.Dbas.UpdateLog;
|
|
using Sarand.Net.Standard.Base.App;
|
|
using Sarand.Net.Standard.Base.Bus;
|
|
using Sarand.Net.Standard.Base.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.Data.Common;
|
|
using System.Linq;
|
|
|
|
namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
|
{
|
|
//=======================================================================
|
|
// Asset manager - Assets.
|
|
//=======================================================================
|
|
partial class SbmAssetMgr_Dbas
|
|
{
|
|
//-------------------------------------------------------------------
|
|
// Utilities.
|
|
private List<StringPair> GetLogProperties(SbmAsset asset)
|
|
{
|
|
return new List<StringPair>()
|
|
{
|
|
new StringPair("Id",SysId.ToString(asset.Id)),
|
|
new StringPair("DescBrief",asset.DescBrief),
|
|
new StringPair("Status",asset.StatusCode)
|
|
};
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Associated data.
|
|
public override bool AssetHasProcesses(SysId assetId)
|
|
{
|
|
ClearErrorState();
|
|
if (!SysId.IsValid(assetId)) return false;
|
|
return ProcessMgr.ItemHasProcesses(new SbmItemId(Sbm.ItemType.Asset, assetId));
|
|
}
|
|
public override bool AssetHasRequirements(SysId assetId)
|
|
{
|
|
ClearErrorState();
|
|
if (!SysId.IsValid(assetId)) return false;
|
|
String filter = $"{SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Requirement_AssetId)}={assetId}";
|
|
return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement), filter) > 0;
|
|
}
|
|
public override bool AssetHasInterfaceDataItems(SysId assetId)
|
|
{
|
|
ClearErrorState();
|
|
if (!SysId.IsValid(assetId)) return false;
|
|
if (InterfaceConsole == null) return false;
|
|
return InterfaceConsole.ItemHasDataItems(new SbmItemId(Sbm.ItemType.Asset, assetId));
|
|
}
|
|
public override bool AssetHasAssociatedDetails(SysId assetId)
|
|
{
|
|
ClearErrorState();
|
|
if (!SysId.IsValid(assetId)) return false;
|
|
return DataItemMgr.HasItemLinks(Sbm.ItemType.Asset, assetId);
|
|
}
|
|
public override bool ClearAssetDependentData(SbmAsset asset, DbUpdateInfo dbUpdateInfo)
|
|
{
|
|
ClearErrorState();
|
|
if (asset == null || !SysId.IsValid(asset.Id)) return false;
|
|
if (!HasErrorState())
|
|
{
|
|
// Remove document references.
|
|
if (ItemDocConsole != null)
|
|
{
|
|
if (!ItemDocConsole.ClearItemDocs(asset.GetItemId(), dbUpdateInfo))
|
|
SetErrorState(ItemDocConsole.ErrorStateMessage);
|
|
}
|
|
else SetErrorState("Failed to retrieve item document console");
|
|
}
|
|
if (!HasErrorState())
|
|
{
|
|
/* ToDo SaItemDataConsole for Remove Item Data:
|
|
SaItemDataConsole itemDataConsole = SbmGlobals.Application.GetItemDataConsole(SessionContext);
|
|
if (itemDataConsole != null)
|
|
{
|
|
if (!itemDataConsole.ClearItemData(Sbm.ItemType.AssetCategory, Id, ""))
|
|
SetErrorState(itemDataConsole.Exception());
|
|
}
|
|
else SetErrorState("Failed to retrieve item Data Document console");
|
|
itemDataConsole = null;*/ // Do not delete this global object.
|
|
}
|
|
// Remove items data.
|
|
if (!HasErrorState())
|
|
{
|
|
if (DataItemMgr != null)
|
|
{
|
|
if (!DataItemMgr.ClearDataItem(asset.GetItemId(), dbUpdateInfo))
|
|
SetErrorState(DataItemMgr.ErrorStateMessage);
|
|
}
|
|
else SetErrorState("Failed to retrieve Data Item manager");
|
|
}
|
|
if (!HasErrorState())
|
|
{
|
|
// Remove interface data items.
|
|
if (InterfaceConsole != null)
|
|
{
|
|
if (!InterfaceConsole.ClearInterfaceDataItems(asset.GetItemId(), dbUpdateInfo))
|
|
SetErrorState(InterfaceConsole.ErrorStateMessage);
|
|
}
|
|
else SetErrorState("Failed to retrieve interface console");
|
|
}
|
|
return OK;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Asset Processes.
|
|
public override List<SbmItemProcess> GetAssetProcesses(SysId assetId, bool activeOnly)
|
|
{
|
|
ClearErrorState();
|
|
List<SbmItemProcess> itemProcesses = new List<SbmItemProcess>();
|
|
itemProcesses.AddRange(ProcessMgr.GetProcessesForItem(new SbmItemId(Sbm.ItemType.Asset, assetId), activeOnly));
|
|
itemProcesses.Sort();
|
|
return itemProcesses;
|
|
}
|
|
public override bool StoreAssetProcesses(SbmAsset asset, List<SbmItemProcess> itemProcesses)
|
|
{
|
|
ClearErrorState();// Clear the existing list.
|
|
if (ProcessMgr.StoreItemProcesses(asset.GetItemId(), itemProcesses, DbUpdateInfo))
|
|
{
|
|
// Make a note of the 'Next' process.
|
|
SbmItemProcess itemProcessNext = itemProcesses.GetNextProcessInSequence(SaStatus.Awaiting);
|
|
SysId itemProcessIdNext = itemProcessNext?.ProcessId ?? new SysId();
|
|
if (asset.ProcessIdNext != itemProcessIdNext)
|
|
{
|
|
asset.ProcessIdNext = itemProcessIdNext;
|
|
if (!UpdateAsset(asset, DbUpdateInfo))
|
|
SetErrorState("Failed to update next process id - " + ErrorStateMessage);
|
|
}
|
|
}
|
|
SetErrorState(ProcessMgr.ErrorStateMessage);
|
|
return OK;
|
|
}
|
|
public override bool PopulateAssetDefaultProcesses(SbmAsset asset)
|
|
{
|
|
ClearErrorState();
|
|
|
|
// Retrieve processes defined for Asset Category and reset identies for Asset.
|
|
List<SbmItemProcess> itemProcesses = ProcessMgr.GetProcessesForItem(new SbmItemId(Sbm.ItemType.AssetCategory, asset.AssetCategoryId), true);
|
|
foreach (SbmItemProcess itemProcess in itemProcesses)
|
|
itemProcess.ClearItemId(Sbm.ItemType.Asset, true);
|
|
|
|
// Store this list of processes against this asset.
|
|
if (!HasErrorState()) StoreAssetProcesses(asset, itemProcesses);
|
|
return OK;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Asset Payment for transaction.
|
|
public override bool AssetHasPrices(SysId assetId)
|
|
{
|
|
if (!SysId.IsValid(assetId)) return false;
|
|
List<SbmItemLink> itemLinks = new List<SbmItemLink>();
|
|
SbmItemLink.Params prm = new SbmItemLink.Params();
|
|
prm.ItemLinkType = Sbm.ItemLinkType.ItemPrice;
|
|
prm.ItemTypeFrom = Sbm.ItemType.Asset;
|
|
prm.ItemIdFrom = assetId;
|
|
prm.StatusCat = SbmItemLink.StatusCat.NotDeleted;
|
|
return DataItemMgr.GetItemLinkCount(prm) > 0;
|
|
}
|
|
public override List<SbmItemPrice> GetAssetPrices(SysId assetId)
|
|
{
|
|
List<SbmItemPrice> itemPrices = new List<SbmItemPrice>();
|
|
if (!SysId.IsValid(assetId)) return itemPrices;
|
|
|
|
// Query asset prices.
|
|
SbmItemLink.Params prm = new SbmItemLink.Params();
|
|
prm.ItemLinkType = Sbm.ItemLinkType.ItemPrice;
|
|
prm.ItemTypeFrom = Sbm.ItemType.Asset;
|
|
prm.ItemIdFrom = assetId;
|
|
foreach (SbmItemLink itemLink in DataItemMgr.GetItemLinkList(prm))
|
|
{
|
|
SbmItemPrice itemPrice = new SbmItemPrice(itemLink.DataContent);
|
|
itemPrice.Notes = itemLink.Notes;
|
|
itemPrice.Changed = false;
|
|
if (itemPrices == null) itemPrices = new List<SbmItemPrice>();
|
|
itemPrices.Add(itemPrice);
|
|
}
|
|
itemPrices.Sort();
|
|
return itemPrices;
|
|
}
|
|
public override bool StoreAssetPrices(SbmAsset asset, List<SbmItemPrice> itemPrices)
|
|
{
|
|
ClearErrorState();
|
|
// Do not attempt any updates unless the list has been populated:
|
|
if (!SysId.IsValid(asset.Id)) return SetErrorState("Asset has invalid Id");
|
|
|
|
// Build item links corresponding to the list of prices.
|
|
List<SbmItemLink> itemLinks = new List<SbmItemLink>();
|
|
foreach (SbmItemPrice itemPrice in itemPrices)
|
|
{
|
|
SbmItemLink itemLink = DataItemMgr.CreateItemLink(Sbm.ItemLinkType.ItemPrice, Sbm.ItemType.Asset, asset.Id, Sbm.ItemType.Unknown, new SysId(0));
|
|
if (itemLink != null)
|
|
{
|
|
itemLink.Seq = (short)itemPrice.CodeSeq;
|
|
itemLink.DataContent = itemPrice.Serialise();
|
|
itemLink.Notes = itemPrice.Notes;
|
|
itemLinks.Add(itemLink);
|
|
itemLink = null; // Now owned by the list.
|
|
}
|
|
}
|
|
// Store these details.
|
|
if (!DataItemMgr.StoreFromItemLinks(Sbm.ItemLinkType.ItemPrice, asset.GetItemId(), itemLinks, DbUpdateInfo))
|
|
SetErrorState("Failed to save asset price item links - " + DataItemMgr.ErrorStateMessage);
|
|
return OK;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Get Asset.
|
|
public override SbmAsset GetAsset(SbmAsset.Params prm)
|
|
{
|
|
return GetAsset(GetAssetQueryFilter(prm).Concat(" AND ", "(", ")"));
|
|
}
|
|
private SbmAsset GetAsset(String filter)
|
|
{
|
|
ClearErrorState();
|
|
long count = GetAssetCount(filter);
|
|
if (count == 0) return null;
|
|
if (count != 1)
|
|
{
|
|
SetErrorState(ErrorMessage.MultipleItemsFound);
|
|
return null;
|
|
}
|
|
SbmAsset asset = null;
|
|
// Query data.
|
|
using (var dbConnection = Database.CreateConnection())
|
|
using (var dbCommand = dbConnection.CreateCommand())
|
|
{
|
|
try
|
|
{
|
|
dbConnection.Open();
|
|
SaAsset_Db dbAsset = new SaAsset_Db(DbInfo);
|
|
dbAsset.PopulateFrom(dbCommand, aliasAsset, filter);
|
|
asset = CreateAsset(dbAsset);
|
|
}
|
|
catch (Exception exc)
|
|
{
|
|
SetErrorState(ErrorMessage.DatabaseQueryException);
|
|
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
|
|
}
|
|
}
|
|
return asset;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Create Asset.
|
|
public override SbmAsset CreateAsset(SysId assetCatId)
|
|
{
|
|
ClearErrorState();
|
|
SbmAsset asset = null;
|
|
if (SysId.IsValid(assetCatId))
|
|
asset = new SbmAsset_Dbas(new SysId(), assetCatId, 0);
|
|
else SetErrorState("Asset Cat Id is not identified");
|
|
return asset;
|
|
}
|
|
private SbmAsset_Dbas CreateAsset(SaAsset_Db dbAsset)
|
|
{
|
|
ClearErrorState();
|
|
SbmAsset_Dbas asset = new SbmAsset_Dbas(new SysId(dbAsset._Id), new SysId(dbAsset._AssetCategoryId), (ushort)dbAsset._Flags);
|
|
PopulateFrom(dbAsset, asset);
|
|
return asset;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Validate Asset.
|
|
public override bool IsValidAssetData(SbmAsset.Data data, SbmAsset.ErrField errField)
|
|
{
|
|
ClearErrorState();
|
|
if (!base.IsValidAssetData(data, errField)) return false;
|
|
return true;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Insert Asset.
|
|
public override bool InsertAsset(SbmAsset asset, DbUpdateInfo dbUpdateInfo)
|
|
{
|
|
ClearErrorState();
|
|
if (!IsValidAsset(asset)) return false;
|
|
if (SysId.IsValid(asset.Id)) return SetErrorState(ErrorMessage.ValidItemId);
|
|
using (var dbConnection = Database.CreateConnection())
|
|
using (var dbCommand = dbConnection.CreateCommand())
|
|
{
|
|
try
|
|
{
|
|
dbConnection.Open();
|
|
SaAsset_Db dbAsset = new SaAsset_Db(DbInfo);
|
|
PopulateTo(dbAsset, asset, dbUpdateInfo);
|
|
if (SaAsset_Db.FieldsNonId.Contains("Id"))
|
|
{
|
|
// Generate next Id.
|
|
dbAsset._Id = SysId.ToInt(Database.GetNextId("SaAsset", dbUpdateInfo));
|
|
}
|
|
dbAsset.ExecuteInsertCommand(dbCommand);
|
|
asset.Id = new SysId(dbAsset._Id);
|
|
asset.Changed = false;
|
|
if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Inserted.{GetLogProperties(asset).Concat(": ").Concat("", "\n\t")}");
|
|
}
|
|
catch (Exception exc) { SetErrorState(exc.Message); }
|
|
}
|
|
return OK;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Update Asset.
|
|
public override bool UpdateAsset(SbmAsset asset, DbUpdateInfo dbUpdateInfo)
|
|
{
|
|
ClearErrorState();
|
|
if (!IsValidAsset(asset)) return false;
|
|
if (!SysId.IsValid(asset.Id)) return SetErrorState(ErrorMessage.InvalidItemId);
|
|
if (!asset.Changed)
|
|
{
|
|
if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Data not changed.{GetLogProperties(asset).Concat(": ").Concat("", "\n\t")}");
|
|
return true;
|
|
}
|
|
using (var dbConnection = Database.CreateConnection())
|
|
using (var dbCommand = dbConnection.CreateCommand())
|
|
{
|
|
try
|
|
{
|
|
// Retrieve Asset.
|
|
dbConnection.Open();
|
|
SaAsset_Db dbAsset = new SaAsset_Db(DbInfo);
|
|
dbAsset.PopulateFrom(dbCommand, aliasAsset, $"Id={SysId.ToString(asset.Id)}");
|
|
SbmUpdateLogItemMonitor_Asset updateLogMonitor = new SbmUpdateLogItemMonitor_Asset(Internals, CreateAsset(dbAsset));
|
|
|
|
// Update properties.
|
|
PopulateTo(dbAsset, asset, dbUpdateInfo);
|
|
dbAsset.ExecuteUpdateCommand(dbCommand);
|
|
asset.Changed = false;
|
|
if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Updated.{GetLogProperties(asset).Concat(": ").Concat("", "\n\t")}");
|
|
|
|
// Record updates.
|
|
updateLogMonitor.RecordUpdatedValues(asset);
|
|
updateLogMonitor.LogUpdates();
|
|
}
|
|
catch (Exception exc) { SetErrorState(exc.Message); }
|
|
}
|
|
return OK;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Delete Asset.
|
|
public override bool AssetCanBeDeleted(SbmAsset asset)
|
|
{
|
|
ClearErrorState();
|
|
if (!base.AssetCanBeDeleted(asset)) return false;
|
|
return true;
|
|
}
|
|
public override bool DeleteAsset(SbmAsset asset, DbUpdateInfo dbUpdateInfo)
|
|
{
|
|
ClearErrorState();
|
|
if (!AssetCanBeDeleted(asset)) return false;
|
|
using (var dbConnection = Database.CreateConnection())
|
|
using (var dbCommand = dbConnection.CreateCommand())
|
|
{
|
|
try
|
|
{
|
|
// Retrieve Asset.
|
|
dbConnection.Open();
|
|
SaAsset_Db dbAsset = new SaAsset_Db(DbInfo);
|
|
dbAsset.PopulateFrom(dbCommand, aliasAsset, $"Id={asset.Id.ToString()}");
|
|
// Delete Asset.
|
|
dbCommand.CommandType = System.Data.CommandType.Text;
|
|
dbCommand.CommandText = $"DELETE FROM {SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaAsset)} WHERE Id={SysId.ToString(asset.Id)};";
|
|
dbCommand.ExecuteNonQuery();
|
|
asset.Changed = false;
|
|
if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Deleted.{GetLogProperties(asset).Concat(": ").Concat("", "\n\t")}");
|
|
}
|
|
catch (Exception exc) { SetErrorState(exc.Message); }
|
|
}
|
|
return OK;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Copy data properties to and from database.
|
|
private void PopulateTo(SaAsset_Db dbAsset, SbmAsset asset, DbUpdateInfo dbUpdateInfo)
|
|
{
|
|
dbAsset._Id = asset.Id.ToInt();
|
|
dbAsset._AssetCategoryId = asset.AssetCategoryId.ToInt();
|
|
dbAsset._SerialNumber = asset.SerialNumber;
|
|
dbAsset._RefExt = asset.RefExt;
|
|
dbAsset._DescBrief = asset.DescBrief;
|
|
dbAsset._ItemType = asset.ItemId.Type;
|
|
dbAsset._ItemId = SysId.ToInt(asset.ItemId.Id);
|
|
dbAsset._PurchaseOn = asset.PurchaseOn;
|
|
dbAsset._AssocIdSupplier = asset.AssocIdSupplier.ToInt();
|
|
dbAsset._PurchaseInvoiceRef = asset.PurchaseInvoiceRef;
|
|
dbAsset._PaymentTerms = asset.PaymentTerms;
|
|
dbAsset._AmountPurchase = asset.AmountPurchase;
|
|
dbAsset._TaxCodeIdPurchase = asset.TaxCodeIdPurchase.ToInt();
|
|
dbAsset._AmountPurchaseGross = asset.AmountPurchaseGross;
|
|
dbAsset._AmountSettlementGross = asset.AmountSettlementGross;
|
|
dbAsset._AmountEnhancementGross = asset.AmountEnhancementGross;
|
|
dbAsset._AssocIdCustomer = asset.AssocIdCustomer.ToInt();
|
|
dbAsset._SellCategoryCode = asset.SellCategoryCode;
|
|
dbAsset._AmountSell = asset.AmountSell;
|
|
dbAsset._TaxCodeIdSell = asset.TaxCodeIdSell.ToInt();
|
|
dbAsset._AmountSellGross = asset.AmountSellGross;
|
|
dbAsset._TaxCodeIdProfit = asset.TaxCodeIdProfit.ToInt();
|
|
dbAsset._SoldOn = asset.SoldOn;
|
|
dbAsset._AmountSold = asset.AmountSold;
|
|
dbAsset._AmountSoldGross = asset.AmountSoldGross;
|
|
dbAsset._DisposeCode = asset.DisposeCode;
|
|
dbAsset._DisposeOn = asset.DisposeOn;
|
|
dbAsset._DueBackOn = asset.DueBackOn;
|
|
dbAsset._AmountRentalCost = asset.AmountRentalCost;
|
|
dbAsset._UomIdRentalCost = asset.UomIdRentalCost.ToInt();
|
|
dbAsset._TaxCodeIdRentalCost = asset.TaxCodeIdRentalCost.ToInt();
|
|
dbAsset._AmountRentalPrice = asset.AmountRentalPrice;
|
|
dbAsset._UomIdRentalPrice = asset.UomIdRentalPrice.ToInt();
|
|
dbAsset._TaxCodeIdRentalPrice = asset.TaxCodeIdRentalPrice.ToInt();
|
|
dbAsset._ProcessIdNext = asset.ProcessIdNext.ToInt();
|
|
// Common properties.
|
|
dbAsset._Notes = asset.Notes;
|
|
dbAsset._Status = SacsSystem.GetStatusCode(asset.Status);
|
|
dbAsset._Flags = (short)asset.Flags;
|
|
if (!SysId.IsValid(asset.Id))
|
|
{
|
|
dbAsset._CreateOn = DateTime.UtcNow;
|
|
dbAsset._CreateBy = dbUpdateInfo.UserId.ToInt();
|
|
dbAsset._CreateHost = dbUpdateInfo.Host;
|
|
}
|
|
dbAsset._UpdateOn = DateTime.UtcNow;
|
|
dbAsset._UpdateBy = dbUpdateInfo.UserId.ToInt();
|
|
dbAsset._UpdateHost = dbUpdateInfo.Host;
|
|
}
|
|
private void PopulateFrom(SaAsset_Db dbAsset, SbmAsset asset)
|
|
{
|
|
asset.AssetCategoryId = new SysId(dbAsset._AssetCategoryId);
|
|
asset.SerialNumber = dbAsset._SerialNumber;
|
|
asset.RefExt = dbAsset._RefExt;
|
|
asset.DescBrief = dbAsset._DescBrief;
|
|
asset.ItemId = new ItemId(dbAsset._ItemType, new SysId(dbAsset._ItemId));
|
|
asset.PurchaseOn = dbAsset._PurchaseOn ?? default(DateTime);
|
|
asset.AssocIdSupplier = new SysId(dbAsset._AssocIdSupplier);
|
|
asset.PurchaseInvoiceRef = dbAsset._PurchaseInvoiceRef;
|
|
asset.PaymentTerms = dbAsset._PaymentTerms ?? 0;
|
|
asset.AmountPurchase = dbAsset._AmountPurchase ?? 0.0m;
|
|
asset.TaxCodeIdPurchase = new SysId(dbAsset._TaxCodeIdPurchase);
|
|
asset.AmountPurchaseGross = dbAsset._AmountPurchaseGross ?? 0.0m;
|
|
asset.AmountSettlementGross = dbAsset._AmountSettlementGross ?? 0.0m;
|
|
asset.AmountEnhancementGross = dbAsset._AmountEnhancementGross ?? 0.0m;
|
|
asset.AssocIdCustomer = new SysId(dbAsset._AssocIdCustomer);
|
|
asset.SellCategoryCode = dbAsset._SellCategoryCode;
|
|
asset.AmountSell = dbAsset._AmountSell ?? 0.0m;
|
|
asset.TaxCodeIdSell = new SysId(dbAsset._TaxCodeIdSell);
|
|
asset.AmountSellGross = dbAsset._AmountSellGross ?? 0.0m;
|
|
asset.TaxCodeIdProfit = new SysId(dbAsset._TaxCodeIdProfit);
|
|
asset.SoldOn = dbAsset._SoldOn ?? default(DateTime);
|
|
asset.AmountSold = dbAsset._AmountSold ?? 0.0m;
|
|
asset.AmountSoldGross = dbAsset._AmountSoldGross ?? 0.0m;
|
|
asset.DisposeCode = dbAsset._DisposeCode;
|
|
asset.DisposeOn = dbAsset._DisposeOn ?? default(DateTime);
|
|
asset.DueBackOn = dbAsset._DueBackOn ?? default(DateTime);
|
|
asset.AmountRentalCost = dbAsset._AmountRentalCost ?? 0.0m;
|
|
asset.UomIdRentalCost = new SysId(dbAsset._UomIdRentalCost);
|
|
asset.TaxCodeIdRentalCost = new SysId(dbAsset._TaxCodeIdRentalCost);
|
|
asset.AmountRentalPrice = dbAsset._AmountRentalPrice ?? 0.0m;
|
|
asset.UomIdRentalPrice = new SysId(dbAsset._UomIdRentalPrice);
|
|
asset.TaxCodeIdRentalPrice = new SysId(dbAsset._TaxCodeIdRentalPrice);
|
|
asset.ProcessIdNext = new SysId(dbAsset._ProcessIdNext);
|
|
// Common properties.
|
|
asset.Notes = dbAsset._Notes;
|
|
asset.Status = SacsSystem.GetStatusForCode(dbAsset._Status);
|
|
asset.SetCreateStamp(dbAsset._CreateOn, new SysId(dbAsset._CreateBy), dbAsset._CreateHost);
|
|
asset.SetUpdateStamp(dbAsset._UpdateOn, new SysId(dbAsset._UpdateBy), dbAsset._UpdateHost);
|
|
asset.AcceptChanges();
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Asset column definitions.
|
|
private static readonly String aliasAsset = "aAst";
|
|
// AssetCategory Alias&Prefix.
|
|
private static readonly String aliasAsset_AssetCategory = "aAst_AstCat";
|
|
private static readonly String prefixAsset_AssetCategory = "Ast_AstCat_";
|
|
// AssetProcess Alias&Prefix.
|
|
private static readonly String aliasAsset_AssetProcess = "aAst_AstPrc";
|
|
private static readonly String prefixAsset_AssetProcess = "Ast_AstPrc_";
|
|
// ItemProcess Alias&Prefix.
|
|
private static readonly String aliasAsset_ItemProcess = "aAst_ItmPrc";
|
|
private static readonly String prefixAsset_ItemProcess = "Ast_ItmPrc_";
|
|
// Vehicle Alias&Prefix.
|
|
private static readonly String aliasAsset_Vehicle = "aAst_Veh";
|
|
private static readonly String prefixAsset_Vehicle = "Ast_Veh_";
|
|
// VehicleClass Alias&Prefix.
|
|
private static readonly String aliasAsset_VehicleClass = "aAst_VehCls";
|
|
private static readonly String prefixAsset_VehicleClass = "Ast_VehCls_";
|
|
|
|
private void SetAssetColDfn
|
|
(ColumnDfn col, String caption, int width, SbmDbDfn.ColumnIdx dbCol,
|
|
ColumnAlignment align = ColumnAlignment.Default, DataValue.DataType dataCategoryId = DataValue.DataType.String,
|
|
String alias = "", String prefix = "")
|
|
{
|
|
if (String.IsNullOrEmpty(alias) && SbmDbDfn.GetTableForColumn(dbCol) == SbmDbDfn.TableIdx.SaAsset)
|
|
alias = aliasAsset;
|
|
col.Set(caption, width, (int)dbCol, prefix + SbmDbDfn.GetColumnName(dbCol, false), SbmDbDfn.GetColumnNameQual(dbCol, alias), dataCategoryId, align);
|
|
if (dataCategoryId == DataValue.DataType.String && dbCol != SbmDbDfn.ColumnIdx.Unknown)
|
|
col.MaxLength = (int)Internals.GetColTextLen(dbCol);
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Getting Asset column definition.
|
|
public override ColumnDfn GetAssetColumnDfn(SbmAsset.Column columnId, string caption = "", int width = 0)
|
|
{
|
|
ColumnDfn columnDfn = new ColumnDfn((int)columnId, caption, width);
|
|
switch (columnId)
|
|
{
|
|
case SbmAsset.Column.Pos:
|
|
SetAssetColDfn(columnDfn, "Pos", 45, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right);
|
|
columnDfn.SortMode = ColumnDfn.ColumnSortMode.Off;
|
|
columnDfn.ReadOnly = true;
|
|
columnDfn.Resizable = false;
|
|
break;
|
|
case SbmAsset.Column.Id:
|
|
SetAssetColDfn(columnDfn, "Id", 60, SbmDbDfn.ColumnIdx.SaAsset_Id, ColumnAlignment.Right, DataValue.DataType.Long);
|
|
columnDfn.ReadOnly = true;
|
|
break;
|
|
|
|
// Asset Properties.
|
|
case SbmAsset.Column.AssetCategoryId:
|
|
SetAssetColDfn(columnDfn, "Cat Id", 45, SbmDbDfn.ColumnIdx.SaAsset_AssetCategoryId, ColumnAlignment.Right, DataValue.DataType.Long);
|
|
break;
|
|
case SbmAsset.Column.Category_Type_Desc:
|
|
SetAssetColDfn(columnDfn, "Category type", 70, SbmDbDfn.ColumnIdx.SaAssetCategory_AssetType, ColumnAlignment.Center, DataValue.DataType.String, aliasAsset_AssetCategory, prefixAsset_AssetCategory);
|
|
break;
|
|
case SbmAsset.Column.Category_Code:
|
|
SetAssetColDfn(columnDfn, "Category code", 80, SbmDbDfn.ColumnIdx.SaAssetCategory_Code, ColumnAlignment.Center, DataValue.DataType.String, aliasAsset_AssetCategory, prefixAsset_AssetCategory);
|
|
break;
|
|
case SbmAsset.Column.Category_DescBrief:
|
|
SetAssetColDfn(columnDfn, "Category", 100, SbmDbDfn.ColumnIdx.SaAsset_DescBrief, ColumnAlignment.Default, DataValue.DataType.String, aliasAsset_AssetCategory, prefixAsset_AssetCategory);
|
|
break;
|
|
case SbmAsset.Column.SerialNumber:
|
|
SetAssetColDfn(columnDfn, "Serial", 80, SbmDbDfn.ColumnIdx.SaAsset_SerialNumber);
|
|
break;
|
|
case SbmAsset.Column.DescBrief:
|
|
SetAssetColDfn(columnDfn, "Desc", 140, SbmDbDfn.ColumnIdx.SaAsset_DescBrief);
|
|
break;
|
|
case SbmAsset.Column.PurchaseOn:
|
|
break;
|
|
case SbmAsset.Column.AmountPurchase:
|
|
SetAssetColDfn(columnDfn, "Purchase (net)", 80, SbmDbDfn.ColumnIdx.SaAsset_AmountPurchase, ColumnAlignment.Right, DataValue.DataType.Double);
|
|
columnDfn.NumDecimals = 2;
|
|
break;
|
|
case SbmAsset.Column.AmountPurchaseGross:
|
|
SetAssetColDfn(columnDfn, "Purchase", 80, SbmDbDfn.ColumnIdx.SaAsset_AmountPurchaseGross, ColumnAlignment.Right, DataValue.DataType.Double);
|
|
columnDfn.NumDecimals = 2;
|
|
break;
|
|
case SbmAsset.Column.SellCategoryDesc:
|
|
SetAssetColDfn(columnDfn, "Sale category", 90, SbmDbDfn.ColumnIdx.SaAsset_SellCategoryCode);
|
|
break;
|
|
case SbmAsset.Column.AmountSell:
|
|
SetAssetColDfn(columnDfn, "Sell (net)", 80, SbmDbDfn.ColumnIdx.SaAsset_AmountSell, ColumnAlignment.Right, DataValue.DataType.Double);
|
|
columnDfn.NumDecimals = 2;
|
|
break;
|
|
case SbmAsset.Column.AmountSellGross:
|
|
SetAssetColDfn(columnDfn, "Sell", 80, SbmDbDfn.ColumnIdx.SaAsset_AmountSellGross, ColumnAlignment.Right, DataValue.DataType.Double);
|
|
columnDfn.NumDecimals = 2;
|
|
break;
|
|
case SbmAsset.Column.SoldOn:
|
|
break;
|
|
case SbmAsset.Column.AmountSold:
|
|
SetAssetColDfn(columnDfn, "Amount sold", 80, SbmDbDfn.ColumnIdx.SaAsset_AmountSold, ColumnAlignment.Right, DataValue.DataType.Double);
|
|
columnDfn.NumDecimals = 2;
|
|
break;
|
|
case SbmAsset.Column.DisposeCode:
|
|
break;
|
|
case SbmAsset.Column.DisposeOn:
|
|
break;
|
|
case SbmAsset.Column.DueBackOn:
|
|
break;
|
|
case SbmAsset.Column.AmountRentalCost:
|
|
SetAssetColDfn(columnDfn, "Rental cost", 80, SbmDbDfn.ColumnIdx.SaAsset_AmountRentalCost, ColumnAlignment.Right, DataValue.DataType.Double);
|
|
columnDfn.NumDecimals = 2;
|
|
break;
|
|
case SbmAsset.Column.UomRentalCost_Id:
|
|
SetAssetColDfn(columnDfn, "Rental cost unit#", 80, SbmDbDfn.ColumnIdx.SaAsset_UomIdRentalCost, ColumnAlignment.Right, DataValue.DataType.Long);
|
|
break;
|
|
case SbmAsset.Column.UomRentalCost_Desc:
|
|
break;
|
|
case SbmAsset.Column.AmountRentalPrice:
|
|
SetAssetColDfn(columnDfn, "Rental price", 80, SbmDbDfn.ColumnIdx.SaAsset_AmountRentalPrice, ColumnAlignment.Right, DataValue.DataType.Double);
|
|
columnDfn.NumDecimals = 2;
|
|
break;
|
|
case SbmAsset.Column.UomRentalPrice_Id:
|
|
SetAssetColDfn(columnDfn, "Rental price unit#", 80, SbmDbDfn.ColumnIdx.SaAsset_UomIdRentalPrice, ColumnAlignment.Right, DataValue.DataType.Long);
|
|
break;
|
|
case SbmAsset.Column.UomRentalPrice_Desc:
|
|
break;
|
|
case SbmAsset.Column.ProcessIdNext:
|
|
SetAssetColDfn(columnDfn, "Next Process #", 80, SbmDbDfn.ColumnIdx.SaAsset_ProcessIdNext, ColumnAlignment.Center, DataValue.DataType.Long);
|
|
break;
|
|
case SbmAsset.Column.NextProcess_DescBrief:
|
|
SetAssetColDfn(columnDfn, "Next Process", 100, SbmDbDfn.ColumnIdx.Process_DescBrief, ColumnAlignment.Left, DataValue.DataType.String, aliasAsset_AssetProcess, prefixAsset_AssetProcess);
|
|
break;
|
|
case SbmAsset.Column.NextProcess_Expected:
|
|
SetAssetColDfn(columnDfn, "Next Process due", 100, SbmDbDfn.ColumnIdx.ItemLink_Completed, ColumnAlignment.Center, DataValue.DataType.Date, aliasAsset_ItemProcess, prefixAsset_ItemProcess);
|
|
break;
|
|
|
|
// Common properties.
|
|
case SbmAsset.Column.Notes:
|
|
SetAssetColDfn(columnDfn, "Notes", 200, SbmDbDfn.ColumnIdx.SaAsset_Notes);
|
|
break;
|
|
case SbmAsset.Column.Flag:
|
|
SetAssetColDfn(columnDfn, "Flags", 40, SbmDbDfn.ColumnIdx.SaAsset_Flags, ColumnAlignment.Center, DataValue.DataType.Long);
|
|
break;
|
|
case SbmAsset.Column.Status:
|
|
SetAssetColDfn(columnDfn, "Status", 50, SbmDbDfn.ColumnIdx.SaAsset_Status, ColumnAlignment.Center);
|
|
break;
|
|
case SbmAsset.Column.Status_Desc:
|
|
SetAssetColDfn(columnDfn, "Status", 50, SbmDbDfn.ColumnIdx.SaAsset_Status);
|
|
break;
|
|
case SbmAsset.Column.Status_Ind:
|
|
SetAssetColDfn(columnDfn, "Status", 50, SbmDbDfn.ColumnIdx.SaAsset_Status, ColumnAlignment.Center, DataValue.DataType.TriState);
|
|
columnDfn.TriStateFormat = ColumnTriStateFormat.Lights;
|
|
break;
|
|
case SbmAsset.Column.CreateOn_Date:
|
|
SetAssetColDfn(columnDfn, "Created", 65, SbmDbDfn.ColumnIdx.SaAsset_CreateOn, ColumnAlignment.Center, DataValue.DataType.Date);
|
|
columnDfn.DateFormat = "d-MMM-yy";
|
|
columnDfn.ReadOnly = true;
|
|
break;
|
|
case SbmAsset.Column.UpdateOn_Date:
|
|
SetAssetColDfn(columnDfn, "Updated", 65, SbmDbDfn.ColumnIdx.SaAsset_UpdateOn, ColumnAlignment.Center, DataValue.DataType.Date);
|
|
columnDfn.DateFormat = "d-MMM-yy";
|
|
columnDfn.ReadOnly = true;
|
|
break;
|
|
case SbmAsset.Column.Warnings:
|
|
SetAssetColDfn(columnDfn, "Warnings", 200, SbmDbDfn.ColumnIdx.Unknown);
|
|
break;
|
|
}
|
|
|
|
if (!String.IsNullOrEmpty(caption))
|
|
columnDfn.Caption = caption;
|
|
if (width > 0)
|
|
columnDfn.Width = width;
|
|
return columnDfn;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Asset query filter.
|
|
public override List<string> GetAssetQueryFilter(SbmAsset.Params prm)
|
|
{
|
|
List<String> filter = new List<String>();
|
|
|
|
// Asset Id.
|
|
String includedIds = prm.IdsIncluded.Concat(",");
|
|
String colAsset_Id = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_Id, aliasAsset);
|
|
if (!includedIds.IsEmpty())
|
|
filter.Add($"{colAsset_Id} IN ({includedIds})");
|
|
String excludedIds = prm.IdsExcluded.Concat(",");
|
|
if (!excludedIds.IsEmpty())
|
|
filter.Add($"{colAsset_Id} NOT IN ({excludedIds})");
|
|
|
|
// Asset CategoryId.
|
|
String colSaAsset_CategoryId = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_AssetCategoryId, aliasAsset);
|
|
if (SysId.IsValid(prm.AssetCategoryId))
|
|
filter.Add($"{colSaAsset_CategoryId}={prm.AssetCategoryId.ToString()}");
|
|
|
|
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
// Item Type & Id.
|
|
String colAsset_ItemType = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_ItemType, aliasAsset);
|
|
if (prm.ItemType > 0)
|
|
filter.Add($"{colAsset_ItemType}={(int)prm.ItemType}");
|
|
String colAsset_ItemId = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_ItemId, aliasAsset);
|
|
if (ItemId.IsValid(prm.ItemId))
|
|
filter.Add($"{colAsset_ItemId}={prm.ItemId.ToString()}");
|
|
|
|
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
// Partial SerialNumber.
|
|
String serialNumberFull = DbQuery.FormatForCondition(prm.SerialNumber);
|
|
String serialNumberPartial = DbQuery.FormatForCondition(prm.SerialNumberPartial);
|
|
String colAsset_SerialNumber = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_SerialNumber, aliasAsset);
|
|
if (!StringUtil.IsEmpty(serialNumberFull))
|
|
filter.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_SerialNumber, aliasAsset)}='{serialNumberFull}'");
|
|
else if (!StringUtil.IsEmpty(serialNumberPartial))
|
|
filter.Add($"{DbQuery.FormatFn_Left(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_SerialNumber, aliasAsset), prm.SerialNumberPartial.Length)}='{serialNumberPartial}'");
|
|
// Partial Description.
|
|
String description = DbQuery.FormatForCondition(prm.DescBriefPartial);
|
|
String colAsset_DescBrief = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_DescBrief, aliasAsset);
|
|
if (!StringUtil.IsEmpty(description))
|
|
filter.Add($"{DbQuery.FormatFn_Left(colAsset_DescBrief, prm.DescBriefPartial.Length)}='{description}'");
|
|
|
|
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
// Next Process Id.
|
|
String colAsset_ProcessIdNext = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_ProcessIdNext, aliasAsset);
|
|
if (SysId.IsValid(prm.ProcessIdNext))
|
|
filter.Add($"{colAsset_ProcessIdNext}={prm.ProcessIdNext.ToString()}");
|
|
|
|
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
// Active Process Id.
|
|
if (SysId.IsValid(prm.ProcessIdActive))
|
|
{
|
|
String aliasItemLink = "aAstItemLnk";
|
|
DbQuery qryProc = new DbQuery(Database.DbmsType);
|
|
qryProc.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ItemLink), aliasItemLink));
|
|
qryProc.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemIdFrom, aliasItemLink));
|
|
qryProc.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemTypeFrom, aliasItemLink) + "=" + ((int)Sbm.ItemType.Asset).ToString());
|
|
qryProc.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemIdFrom, aliasItemLink) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_Id, aliasAsset));
|
|
qryProc.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemTypeTo, aliasItemLink) + "=" + ((int)Sbm.ItemType.Process).ToString());
|
|
qryProc.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemIdTo, aliasItemLink) + "=" + prm.ProcessIdActive.ToString());
|
|
qryProc.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_Status, aliasItemLink) + "='" + StatusAwaiting + "'");
|
|
filter.Add("EXISTS(" + qryProc.BuildQuery() + ")");
|
|
}
|
|
|
|
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
// Status.
|
|
String colAsset_Status = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_Status, aliasAsset);
|
|
if (prm.StatusCat == SbmAsset.StatusCat.ActiveOnly)
|
|
filter.Add(colAsset_Status + "='" + StatusActive + "'");
|
|
|
|
if (filter.Count < 1 && prm.IncludeDefaultFilter) filter.Add("1=1");
|
|
return filter;
|
|
}
|
|
|
|
// Asset sort columns.
|
|
public List<String> GetAssetSortColumns(SbmAsset.Params prm)
|
|
{
|
|
// Sort sequence:
|
|
List<String> sortColumnCodes = new List<String>();
|
|
foreach (var columnDfn in prm.SortColumns)
|
|
{
|
|
// Need to ensure correct alias used for Asset columns in case of conflict.
|
|
String sortCol = String.Empty;
|
|
if (SbmDbDfn.GetTableForColumn((SbmDbDfn.ColumnIdx)columnDfn.DbColumn) == SbmDbDfn.TableIdx.SaAsset)
|
|
{
|
|
sortCol = SbmDbDfn.GetColumnNameQual((SbmDbDfn.ColumnIdx)columnDfn.DbColumn, aliasAsset);
|
|
}
|
|
else
|
|
{
|
|
sortCol = columnDfn.DataName;
|
|
if (!StringUtil.IsEmpty(columnDfn.SortDataName))
|
|
sortCol = columnDfn.SortDataName;
|
|
}
|
|
if (!sortCol.IsEmpty())
|
|
{
|
|
DbOrderByNullMode orderByNullMode = DbOrderByNullMode.Default; // eSaOrderByDemoteNulls, eSaOrderByPromoteNulls
|
|
sortColumnCodes.Add(DbQuery.FormatForOrderBy(sortCol, columnDfn.SortAscending, orderByNullMode).Concat(", "));
|
|
}
|
|
}
|
|
sortColumnCodes.RemoveBlanks();
|
|
if (sortColumnCodes.IsEmpty())
|
|
{
|
|
// Default sort columns:
|
|
sortColumnCodes.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_AssetCategoryId, aliasAsset) + " ASC");
|
|
}
|
|
return sortColumnCodes;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Asset count.
|
|
private long GetAssetCount(String filter)
|
|
{
|
|
ClearErrorState();
|
|
return Database.GetRowCount($"{SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaAsset)} As {aliasAsset}", filter);
|
|
}
|
|
public override long GetAssetCount(SbmAsset.Params prm)
|
|
{
|
|
ClearErrorState();
|
|
return GetAssetCount(GetAssetQueryFilter(prm).Concat(" AND ", "(", ")"));
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Asset list.
|
|
public override List<SbmAsset> GetAssetList(SbmAsset.Params prm)
|
|
{
|
|
ClearErrorState();
|
|
List<SbmAsset> assets = new List<SbmAsset>();
|
|
DbQuery qry = new DbQuery(Database.DbmsType);
|
|
qry.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaAsset), aliasAsset);
|
|
SaAsset_Db dbAsset = new SaAsset_Db(DbInfo);
|
|
qry.Columns.AddRange(dbAsset.ExistingColumnNames);
|
|
qry.Filters.AddRange(GetAssetQueryFilter(prm));
|
|
qry.OrderBy.AddRange(GetAssetSortColumns(prm));
|
|
// Query data.
|
|
using (var dbConnection = Database.CreateConnection())
|
|
using (var dbCommand = dbConnection.CreateCommand())
|
|
{
|
|
try
|
|
{
|
|
dbConnection.Open();
|
|
dbCommand.CommandText = qry.BuildQuery(prm.ResultsPaging);
|
|
using (DbDataReader dbDataReader = dbCommand.ExecuteReader())
|
|
{
|
|
while (dbDataReader.Read())
|
|
{
|
|
dbAsset = new SaAsset_Db(DbInfo);
|
|
dbAsset.PopulateFrom(dbDataReader);
|
|
assets.Add(CreateAsset(dbAsset));
|
|
}
|
|
}
|
|
}
|
|
catch (Exception exc)
|
|
{
|
|
SetErrorState(ErrorMessage.DatabaseQueryException);
|
|
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
|
|
}
|
|
}
|
|
return assets;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Asset query execution.
|
|
public override DbResultSet ExecuteAssetQuery(List<ColumnDfn> columns, SbmAsset.Params prm)
|
|
{
|
|
ClearErrorState();
|
|
//---------------------------------------------------------------------
|
|
// Construct build database query.
|
|
DbQuery query = new DbQuery(Database.DbmsType);
|
|
query.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaAsset), aliasAsset);
|
|
|
|
// Asset Properties - add columns as defined in query list.
|
|
if (columns.HasId(SbmAsset.Column.Id))
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_Id, aliasAsset));
|
|
if (columns.HasId(SbmAsset.Column.SerialNumber))
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_SerialNumber, aliasAsset));
|
|
if (columns.HasId(SbmAsset.Column.DescBrief))
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_DescBrief, aliasAsset));
|
|
if (columns.HasId(SbmAsset.Column.PurchaseOn))
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_PurchaseOn, aliasAsset));
|
|
if (columns.HasId(SbmAsset.Column.AmountPurchase))
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_AmountPurchase, aliasAsset));
|
|
if (columns.HasId(SbmAsset.Column.AmountPurchaseGross))
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_AmountPurchaseGross, aliasAsset));
|
|
if (columns.HasId(SbmAsset.Column.SellCategoryDesc))
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_SellCategoryCode, aliasAsset));
|
|
if (columns.HasId(SbmAsset.Column.AmountSell))
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_AmountSell, aliasAsset));
|
|
if (columns.HasId(SbmAsset.Column.AmountSellGross))
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_AmountSellGross, aliasAsset));
|
|
if (columns.HasId(SbmAsset.Column.SoldOn))
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_SoldOn, aliasAsset));
|
|
if (columns.HasId(SbmAsset.Column.AmountSold))
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_AmountSold, aliasAsset));
|
|
if (columns.HasId(SbmAsset.Column.DisposeCode))
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_DisposeCode, aliasAsset));
|
|
if (columns.HasId(SbmAsset.Column.DisposeOn))
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_DisposeOn, aliasAsset));
|
|
if (columns.HasId(SbmAsset.Column.DueBackOn))
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_DueBackOn, aliasAsset));
|
|
if (columns.HasId(SbmAsset.Column.AmountRentalCost))
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_AmountRentalCost, aliasAsset));
|
|
if (columns.HasId(SbmAsset.Column.AmountRentalPrice))
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_AmountRentalPrice, aliasAsset));
|
|
// Common Properties
|
|
if (columns.HasId(SbmAsset.Column.Notes))
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_Notes, aliasAsset));
|
|
if (columns.HasId(SbmAsset.Column.Flag))
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_Flags, aliasAsset));
|
|
if (columns.HasId(SbmAsset.Column.Status) || columns.HasId(SbmAsset.Column.Status_Desc) || columns.HasId(SbmAsset.Column.Status_Ind))
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_Status, aliasAsset));
|
|
if (columns.HasId(SbmAsset.Column.CreateOn_Date))
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_CreateOn, aliasAsset));
|
|
if (columns.HasId(SbmAsset.Column.UpdateOn_Date))
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_UpdateOn, aliasAsset));
|
|
|
|
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
// Asset category.
|
|
bool hasAssetCategoryCols = false;
|
|
if (!hasAssetCategoryCols) hasAssetCategoryCols = columns.HasId(SbmAsset.Column.Category_Type_Desc);
|
|
if (!hasAssetCategoryCols) hasAssetCategoryCols = columns.HasId(SbmAsset.Column.Category_Code);
|
|
if (!hasAssetCategoryCols) hasAssetCategoryCols = columns.HasId(SbmAsset.Column.Category_DescBrief);
|
|
if (hasAssetCategoryCols)
|
|
{
|
|
DbQueryJoin joinAssetCat = new DbQueryJoin(DbJoinType.LeftOuter);
|
|
joinAssetCat.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaAssetCategory), aliasAsset_AssetCategory);
|
|
joinAssetCat.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAssetCategory_Id, aliasAsset_AssetCategory) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_AssetCategoryId, aliasAsset));
|
|
query.Joins.Add(joinAssetCat);
|
|
// Add the Asset Category columns:
|
|
List<SbmDbDfn.ColumnIdx> dbColumns = new List<SbmDbDfn.ColumnIdx>()
|
|
{
|
|
SbmDbDfn.ColumnIdx.SaAssetCategory_AssetType,
|
|
SbmDbDfn.ColumnIdx.SaAssetCategory_Code,
|
|
SbmDbDfn.ColumnIdx.SaAssetCategory_DescBrief,
|
|
};
|
|
foreach (SbmDbDfn.ColumnIdx dbColumn in dbColumns)
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasAsset_AssetCategory), prefixAsset_AssetCategory + SbmDbDfn.GetColumnName(dbColumn, false));
|
|
}
|
|
|
|
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
// Vehicle & Vehicle Class.
|
|
bool hasVehicleCols = false;
|
|
bool hasVehClassCols = false;
|
|
if (!hasVehicleCols) hasVehicleCols = columns.HasId(SbmAsset.Column.Vehicle_RegNumber);
|
|
if (!hasVehicleCols) hasVehicleCols = columns.HasId(SbmAsset.Column.Vehicle_Vin);
|
|
if (!hasVehicleCols) hasVehicleCols = columns.HasId(SbmAsset.Column.Vehicle_KeyLocation);
|
|
if (!hasVehicleCols) hasVehicleCols = columns.HasId(SbmAsset.Column.Vehicle_Flags);
|
|
if (!hasVehicleCols) hasVehicleCols = columns.HasId(SbmAsset.Column.Vehicle_HpiAlert);
|
|
if (!hasVehClassCols) hasVehClassCols = columns.HasId(SbmAsset.Column.VehicleClass_MakeDesc);
|
|
if (!hasVehClassCols) hasVehClassCols = columns.HasId(SbmAsset.Column.VehicleClass_Model);
|
|
if (!hasVehClassCols) hasVehClassCols = columns.HasId(SbmAsset.Column.VehicleClass_Derivative);
|
|
if (!hasVehClassCols) hasVehClassCols = columns.HasId(SbmAsset.Column.VehicleClass_DescBrief);
|
|
if (hasVehicleCols || hasVehClassCols)
|
|
{
|
|
// Join to the vehicle table.
|
|
DbQueryJoin joinVehicle = new DbQueryJoin(DbJoinType.LeftOuter);
|
|
joinVehicle.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaVehicle), aliasAsset_Vehicle);
|
|
joinVehicle.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_Id, aliasAsset_Vehicle) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_ItemId, aliasAsset));
|
|
query.Joins.Add(joinVehicle);
|
|
// Add the Vehicle columns.
|
|
List<SbmDbDfn.ColumnIdx> dbVehicleColumns = new List<SbmDbDfn.ColumnIdx>();
|
|
dbVehicleColumns.Add(SbmDbDfn.ColumnIdx.SaVehicle_Id);
|
|
if (columns.HasId(SbmAsset.Column.Vehicle_RegNumber)) dbVehicleColumns.Add(SbmDbDfn.ColumnIdx.SaVehicle_RegNumber);
|
|
if (columns.HasId(SbmAsset.Column.Vehicle_Vin)) dbVehicleColumns.Add(SbmDbDfn.ColumnIdx.SaVehicle_VIN);
|
|
if (columns.HasId(SbmAsset.Column.Vehicle_KeyLocation)) dbVehicleColumns.Add(SbmDbDfn.ColumnIdx.SaVehicle_KeyLocation);
|
|
dbVehicleColumns.Add(SbmDbDfn.ColumnIdx.SaVehicle_Flags);
|
|
foreach (SbmDbDfn.ColumnIdx dbColumn in dbVehicleColumns)
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasAsset_Vehicle), prefixAsset_Vehicle + SbmDbDfn.GetColumnName(dbColumn, false));
|
|
if (hasVehClassCols)
|
|
{
|
|
// Join to the vehicle class table.
|
|
DbQueryJoin joinVehicleClass = new DbQueryJoin(DbJoinType.LeftOuter);
|
|
joinVehicleClass.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaVehicleClass), aliasAsset_VehicleClass);
|
|
joinVehicleClass.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicleClass_Id, aliasAsset_VehicleClass) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_VehicleClassId, aliasAsset_Vehicle));
|
|
query.Joins.Add(joinVehicleClass);
|
|
// Add the Vehicle Class columns.
|
|
List<SbmDbDfn.ColumnIdx> dbVehicleClassColumns = new List<SbmDbDfn.ColumnIdx>();
|
|
dbVehicleClassColumns.Add(SbmDbDfn.ColumnIdx.SaVehicleClass_Id);
|
|
if (columns.HasId(SbmAsset.Column.VehicleClass_MakeDesc)) dbVehicleClassColumns.Add(SbmDbDfn.ColumnIdx.SaVehicleClass_MakeCode);
|
|
if (columns.HasId(SbmAsset.Column.VehicleClass_Model)) dbVehicleClassColumns.Add(SbmDbDfn.ColumnIdx.SaVehicleClass_Model);
|
|
if (columns.HasId(SbmAsset.Column.VehicleClass_Derivative)) dbVehicleClassColumns.Add(SbmDbDfn.ColumnIdx.SaVehicleClass_Derivative);
|
|
if (columns.HasId(SbmAsset.Column.VehicleClass_DescBrief)) dbVehicleClassColumns.Add(SbmDbDfn.ColumnIdx.SaVehicleClass_DescBrief);
|
|
//lCol.Insert (eSaDbColSaVehicleClass_Flags);
|
|
foreach (SbmDbDfn.ColumnIdx dbColumn in dbVehicleClassColumns)
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasAsset_VehicleClass), prefixAsset_VehicleClass + SbmDbDfn.GetColumnName(dbColumn, false));
|
|
}
|
|
}
|
|
|
|
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
// Next process.
|
|
if (columns.HasId(SbmAsset.Column.NextProcess_DescBrief))
|
|
{
|
|
// Join to the process table (for the definition of the asset category process):
|
|
DbQueryJoin joinProcess = new DbQueryJoin(DbJoinType.LeftOuter);
|
|
joinProcess.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Process), aliasAsset_AssetProcess);
|
|
joinProcess.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Process_Id, aliasAsset_AssetProcess) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_ProcessIdNext, aliasAsset));
|
|
query.Joins.Add(joinProcess);
|
|
// Add the Process columns:
|
|
List<SbmDbDfn.ColumnIdx> dbProcessColumns = new List<SbmDbDfn.ColumnIdx>();
|
|
dbProcessColumns.Add(SbmDbDfn.ColumnIdx.Process_DescBrief);
|
|
foreach (SbmDbDfn.ColumnIdx dbColumn in dbProcessColumns)
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasAsset_AssetProcess), prefixAsset_AssetProcess + SbmDbDfn.GetColumnName(dbColumn, false));
|
|
}
|
|
if (columns.HasId(SbmAsset.Column.NextProcess_Expected))
|
|
{
|
|
// Join to the Item Link table to get information about this asset's process:
|
|
DbQueryJoin joinItemLink = new DbQueryJoin(DbJoinType.LeftOuter);
|
|
joinItemLink.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ItemLink), aliasAsset_ItemProcess);
|
|
joinItemLink.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemTypeFrom, aliasAsset_ItemProcess) + "=" + ((int)Sbm.ItemType.Asset).ToString());
|
|
joinItemLink.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemIdFrom, aliasAsset_ItemProcess) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_Id, aliasAsset));
|
|
joinItemLink.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemTypeTo, aliasAsset_ItemProcess) + "=" + ((int)Sbm.ItemType.Process).ToString());
|
|
joinItemLink.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemIdTo, aliasAsset_ItemProcess) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_ProcessIdNext, aliasAsset));
|
|
query.Joins.Add(joinItemLink);
|
|
// Add the ItemLink columns:
|
|
List<SbmDbDfn.ColumnIdx> dbItemLinkColumns = new List<SbmDbDfn.ColumnIdx>();
|
|
dbItemLinkColumns.Add(SbmDbDfn.ColumnIdx.ItemLink_Completed);
|
|
foreach (SbmDbDfn.ColumnIdx dbColumn in dbItemLinkColumns)
|
|
query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasAsset_ItemProcess), prefixAsset_ItemProcess + SbmDbDfn.GetColumnName(dbColumn, false));
|
|
}
|
|
|
|
|
|
//---------------------------------------------------------------------
|
|
// Populate filter.
|
|
query.Filters.AddRange(GetAssetQueryFilter(prm));
|
|
|
|
if (prm.IdsIncluded.Count != 1)
|
|
{
|
|
// Configure sort sequence.
|
|
foreach (String sortColumn in GetAssetSortColumns(prm))
|
|
query.OrderBy.Add(sortColumn);
|
|
}
|
|
|
|
//---------------------------------------------------------------------
|
|
//return new DbResultSet_DataTableReader(Database, query.BuildQuery());
|
|
return DbResultSet_DataReader.ExecuteQuery(Database, query.BuildQuery(prm.ResultsPaging));
|
|
}
|
|
//-------------------------------------------------------------------
|
|
}
|
|
//=======================================================================
|
|
}
|