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 { //======================================================================= partial class SbmAssetMgr_Dbas { //******************************************************************* // A s s e t //******************************************************************* // Utilities. private List GetLogProperties(SbmAsset asset) { return new List() { new StringPair("Id",SysId.ToString(asset.Id)), new StringPair("DescBrief",asset.DescBrief), new StringPair("Status",asset.StatusCode) }; } //------------------------------------------------------------------- // Data members. //------------------------------------------------------------------- // 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("Multiple Assets found"); 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("Database query exception"); 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(Internals, 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(Internals, new SysId(dbAsset._Id), new SysId(dbAsset._AssetCategoryId ?? 0), (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("Asset", 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 !HasErrorState(); } //------------------------------------------------------------------- // 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 !HasErrorState(); } //------------------------------------------------------------------- // 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 !HasErrorState(); } //------------------------------------------------------------------- // 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 ?? 0); asset.SerialNumber = dbAsset._SerialNumber; asset.RefExt = dbAsset._RefExt; asset.DescBrief = dbAsset._DescBrief; asset.ItemId = new ItemId(dbAsset._ItemType ?? 0, new SysId(dbAsset._ItemId ?? 0)); asset.PurchaseOn = dbAsset._PurchaseOn ?? default(DateTime); asset.AssocIdSupplier = new SysId(dbAsset._AssocIdSupplier ?? 0); asset.PurchaseInvoiceRef = dbAsset._PurchaseInvoiceRef; asset.PaymentTerms = dbAsset._PaymentTerms ?? 0; asset.AmountPurchase = dbAsset._AmountPurchase ?? 0.0m; asset.TaxCodeIdPurchase = new SysId(dbAsset._TaxCodeIdPurchase ?? 0); asset.AmountPurchaseGross = dbAsset._AmountPurchaseGross ?? 0.0m; asset.AmountSettlementGross = dbAsset._AmountSettlementGross ?? 0.0m; asset.AmountEnhancementGross = dbAsset._AmountEnhancementGross ?? 0.0m; asset.AssocIdCustomer = new SysId(dbAsset._AssocIdCustomer ?? 0); asset.SellCategoryCode = dbAsset._SellCategoryCode; asset.AmountSell = dbAsset._AmountSell ?? 0.0m; asset.TaxCodeIdSell = new SysId(dbAsset._TaxCodeIdSell ?? 0); asset.AmountSellGross = dbAsset._AmountSellGross ?? 0.0m; asset.TaxCodeIdProfit = new SysId(dbAsset._TaxCodeIdProfit ?? 0); 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 ?? 0); asset.TaxCodeIdRentalCost = new SysId(dbAsset._TaxCodeIdRentalCost ?? 0); asset.AmountRentalPrice = dbAsset._AmountRentalPrice ?? 0.0m; asset.UomIdRentalPrice = new SysId(dbAsset._UomIdRentalPrice ?? 0); asset.TaxCodeIdRentalPrice = new SysId(dbAsset._TaxCodeIdRentalPrice ?? 0); asset.ProcessIdNext = new SysId(dbAsset._ProcessIdNext ?? 0); // Common properties. asset.Notes = dbAsset._Notes; asset.Status = SacsSystem.GetStatusForCode(dbAsset._Status); asset.SetCreateStamp(dbAsset._CreateOn ?? default(DateTime), new SysId(dbAsset._CreateBy ?? 0), dbAsset._CreateHost); asset.SetUpdateStamp(dbAsset._UpdateOn ?? default(DateTime), new SysId(dbAsset._UpdateBy ?? 0), 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)SbmDbDfn.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 GetAssetQueryFilter(SbmAsset.Params prm) { List filter = new List(); // 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.AssetCatId)) filter.Add($"{colSaAsset_CategoryId}={prm.AssetCatId.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 GetAssetSortColumns(SbmAsset.Params prm) { // Sort sequence: List sortColumnCodes = new List(); 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 GetAssetList(SbmAsset.Params prm) { ClearErrorState(); List assets = new List(); 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("Database query exception"); SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}"); } } return assets; } //------------------------------------------------------------------- // Asset query execution. public override DbResultSet ExecuteAssetQuery(List 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((int)SbmAsset.Column.Id)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_Id, aliasAsset)); if (columns.HasId((int)SbmAsset.Column.SerialNumber)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_SerialNumber, aliasAsset)); if (columns.HasId((int)SbmAsset.Column.DescBrief)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_DescBrief, aliasAsset)); if (columns.HasId((int)SbmAsset.Column.PurchaseOn)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_PurchaseOn, aliasAsset)); if (columns.HasId((int)SbmAsset.Column.AmountPurchase)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_AmountPurchase, aliasAsset)); if (columns.HasId((int)SbmAsset.Column.AmountPurchaseGross)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_AmountPurchaseGross, aliasAsset)); if (columns.HasId((int)SbmAsset.Column.SellCategoryDesc)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_SellCategoryCode, aliasAsset)); if (columns.HasId((int)SbmAsset.Column.AmountSell)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_AmountSell, aliasAsset)); if (columns.HasId((int)SbmAsset.Column.AmountSellGross)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_AmountSellGross, aliasAsset)); if (columns.HasId((int)SbmAsset.Column.SoldOn)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_SoldOn, aliasAsset)); if (columns.HasId((int)SbmAsset.Column.AmountSold)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_AmountSold, aliasAsset)); if (columns.HasId((int)SbmAsset.Column.DisposeCode)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_DisposeCode, aliasAsset)); if (columns.HasId((int)SbmAsset.Column.DisposeOn)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_DisposeOn, aliasAsset)); if (columns.HasId((int)SbmAsset.Column.DueBackOn)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_DueBackOn, aliasAsset)); if (columns.HasId((int)SbmAsset.Column.AmountRentalCost)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_AmountRentalCost, aliasAsset)); if (columns.HasId((int)SbmAsset.Column.AmountRentalPrice)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_AmountRentalPrice, aliasAsset)); // Common Properties if (columns.HasId((int)SbmAsset.Column.Notes)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_Notes, aliasAsset)); if (columns.HasId((int)SbmAsset.Column.Flag)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_Flags, aliasAsset)); if (columns.HasId((int)SbmAsset.Column.Status) || columns.HasId((int)SbmAsset.Column.Status_Desc) || columns.HasId((int)SbmAsset.Column.Status_Ind)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_Status, aliasAsset)); if (columns.HasId((int)SbmAsset.Column.CreateOn_Date)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_CreateOn, aliasAsset)); if (columns.HasId((int)SbmAsset.Column.UpdateOn_Date)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_UpdateOn, aliasAsset)); //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Asset category. bool hasAssetCategoryCols = false; if (!hasAssetCategoryCols) hasAssetCategoryCols = columns.HasId((int)SbmAsset.Column.Category_Type_Desc); if (!hasAssetCategoryCols) hasAssetCategoryCols = columns.HasId((int)SbmAsset.Column.Category_Code); if (!hasAssetCategoryCols) hasAssetCategoryCols = columns.HasId((int)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 dbColumns = new List() { 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((int)SbmAsset.Column.Vehicle_RegNumber); if (!hasVehicleCols) hasVehicleCols = columns.HasId((int)SbmAsset.Column.Vehicle_Vin); if (!hasVehicleCols) hasVehicleCols = columns.HasId((int)SbmAsset.Column.Vehicle_KeyLocation); if (!hasVehicleCols) hasVehicleCols = columns.HasId((int)SbmAsset.Column.Vehicle_Flags); if (!hasVehicleCols) hasVehicleCols = columns.HasId((int)SbmAsset.Column.Vehicle_HpiAlert); if (!hasVehClassCols) hasVehClassCols = columns.HasId((int)SbmAsset.Column.VehicleClass_MakeDesc); if (!hasVehClassCols) hasVehClassCols = columns.HasId((int)SbmAsset.Column.VehicleClass_Model); if (!hasVehClassCols) hasVehClassCols = columns.HasId((int)SbmAsset.Column.VehicleClass_Derivative); if (!hasVehClassCols) hasVehClassCols = columns.HasId((int)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 dbVehicleColumns = new List(); dbVehicleColumns.Add(SbmDbDfn.ColumnIdx.SaVehicle_Id); if (columns.HasId((int)SbmAsset.Column.Vehicle_RegNumber)) dbVehicleColumns.Add(SbmDbDfn.ColumnIdx.SaVehicle_RegNumber); if (columns.HasId((int)SbmAsset.Column.Vehicle_Vin)) dbVehicleColumns.Add(SbmDbDfn.ColumnIdx.SaVehicle_VIN); if (columns.HasId((int)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 dbVehicleClassColumns = new List(); dbVehicleClassColumns.Add(SbmDbDfn.ColumnIdx.SaVehicleClass_Id); if (columns.HasId((int)SbmAsset.Column.VehicleClass_MakeDesc)) dbVehicleClassColumns.Add(SbmDbDfn.ColumnIdx.SaVehicleClass_MakeCode); if (columns.HasId((int)SbmAsset.Column.VehicleClass_Model)) dbVehicleClassColumns.Add(SbmDbDfn.ColumnIdx.SaVehicleClass_Model); if (columns.HasId((int)SbmAsset.Column.VehicleClass_Derivative)) dbVehicleClassColumns.Add(SbmDbDfn.ColumnIdx.SaVehicleClass_Derivative); if (columns.HasId((int)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((int)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 dbProcessColumns = new List(); 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((int)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 dbItemLinkColumns = new List(); 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)); } //------------------------------------------------------------------- } //======================================================================= }