Vehicles - interim

This commit is contained in:
Andy Howard
2026-07-03 14:55:40 +01:00
parent 166fa3a352
commit c277e06eea
24 changed files with 2042 additions and 444 deletions
+20
View File
@@ -0,0 +1,20 @@
# Atlas Copilot Instructions
Use this top-level file as routing guidance for repository-specific instructions. Before making changes, read the nearest applicable instruction document for the area and task type.
## Tool Output Hygiene
- Large build and test warning streams consume chat context. Prefer concise command output, focused filters, and summary/tail reads when validating changes.
- Do not repeatedly read full build or test logs when the repo emits known unrelated warnings. Capture the final success/failure summary and only inspect detailed warning/error output when it is needed to fix the current task.
- In final responses, summarize unrelated pre-existing warnings briefly instead of pasting warning lists.
## Code Review Guidelines
- During reviews, ensure each class has a brief description of its purpose.
- Comments should describe intention rather than implementation details and only be added when intent is not already clear from the code.
## General Rules
- @azure Rule - Use Azure Tools - When handling requests related to Azure, always use your tools.
- @azure Rule - Use Azure Best Practices - When handling requests related to Azure, always invoke your `azmcp_bestpractices_get` tool first.
- @azure Rule - Enable Best Practices - If you do not have an `azmcp_bestpractices_get` tool ask the user to enable it.
+2 -1
View File
@@ -13,7 +13,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App
//------------------------------------------------------------------- //-------------------------------------------------------------------
public static class Version public static class Version
{ {
private static String version { get; } = "3.0.2.1"; private static String version { get; } = "3.0.2.2";
// Retrieve version. // Retrieve version.
public static String GetFullVersion() { return version; } public static String GetFullVersion() { return version; }
public static String GetAppVersion() public static String GetAppVersion()
@@ -37,6 +37,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App
//------------------------------------------------------------------- //-------------------------------------------------------------------
// 3.0.2 20-Nov-25 .Net 8. // 3.0.2 20-Nov-25 .Net 8.
// 3.0.2.1 29-Nov-25 Vehicle Classes. // 3.0.2.1 29-Nov-25 Vehicle Classes.
// 3.0.2.2 ??
//------------------------------------------------------------------- //-------------------------------------------------------------------
// 3.0.1 19-Feb-25 Portal Transactions. // 3.0.1 19-Feb-25 Portal Transactions.
// 3.0.1.1 19-Feb-25 Portal tidy. // 3.0.1.1 19-Feb-25 Portal tidy.
+5 -3
View File
@@ -1,5 +1,4 @@
using Newtonsoft.Json.Serialization; using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Dbas; using Sarand.Net.Standard.Base.Dbas;
using System; using System;
@@ -140,7 +139,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App
Demo, Demo,
} }
public const String RepositoryContext_Template = "Template"; public const String RepositoryContext_Template = "Template";
public const String RepositoryContext_Demo= "Demo"; public const String RepositoryContext_Demo = "Demo";
//------------------------------------------------------------------- //-------------------------------------------------------------------
// Configuration console. // Configuration console.
@@ -1167,6 +1166,9 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App
Asset_Sale, Asset_Sale,
Asset_Rental, Asset_Rental,
Asset_Disposal, Asset_Disposal,
Vehicle_Assets,
Vehicle_Events,
Vehicle_Features,
} }
//------------------------------------------------------------------- //-------------------------------------------------------------------
@@ -107,7 +107,6 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App
return true; return true;
case Sbm.View.VehicleClasses: case Sbm.View.VehicleClasses:
case Sbm.View.Vehicles: case Sbm.View.Vehicles:
if (!sessionConsole.AllowOption(Sbm.ConfigOption.Assets)) return false;
if (!sessionConsole.AllowOption(Sbm.ConfigOption.Vehicles)) return false; if (!sessionConsole.AllowOption(Sbm.ConfigOption.Vehicles)) return false;
return true; return true;
//----------------------------------------------------------- //-----------------------------------------------------------
+72 -20
View File
@@ -1,8 +1,6 @@
using Sarand.BusinessMgr.Net.Standard.Base.App; using Sarand.BusinessMgr.Net.Standard.Base.App;
using Sarand.BusinessMgr.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Utils; using Sarand.Net.Standard.Base.Utils;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@@ -19,7 +17,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
{ {
Pos, Pos,
Id, Id,
// Vehicle - vehicleClass props. // Vehicle Class.
VehicleClass_Id, VehicleClass_Id,
VehicleClass_MakeCode, VehicleClass_MakeDesc, VehicleClass_MakeCode, VehicleClass_MakeDesc,
VehicleClass_Model, VehicleClass_Model,
@@ -30,10 +28,11 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
VehicleClass_Seats, VehicleClass_Seats,
VehicleClass_InsuranceCode, VehicleClass_InsuranceDesc, VehicleClass_InsuranceCode, VehicleClass_InsuranceDesc,
VehicleClass_Notes, VehicleClass_Notes,
// Vehicle own props. // Identity.
RegNumber, RegNumber,
RegNumberPrev, RegNumberPrev,
Vin, Vin,
// Model.
CapCode, CapCode,
KeyNumber, KeyNumber,
KeyLocation, KeyLocation,
@@ -79,25 +78,27 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
public String KeyNumber { get; set; } = ""; public String KeyNumber { get; set; } = "";
public String KeyLocation { get; set; } = ""; public String KeyLocation { get; set; } = "";
public String EngineNumber { get; set; } = ""; public String EngineNumber { get; set; } = "";
public short EngineCapacity { get; set; } = 0; // Specification.
public short Seats { get; set; } = 0; public Int16 EngineCapacity { get; set; } = 0;
public short Weight { get; set; } = 0; public Int16 Seats { get; set; } = 0;
public short ManufactureYear { get; set; } = 0; public Int16 Weight { get; set; } = 0;
public Int16 ManufactureYear { get; set; } = 0;
public DateTime BuildOn { get; set; } = DateTime.MinValue; public DateTime BuildOn { get; set; } = DateTime.MinValue;
public DateTime FirstRegisterOn { get; set; } = DateTime.MinValue; public DateTime FirstRegisterOn { get; set; } = DateTime.MinValue;
public DateTime RegisterOn { get; set; } = DateTime.MinValue; public DateTime RegisterOn { get; set; } = DateTime.MinValue;
public String RegNumberPrev { get; set; } = ""; public String RegNumberPrev { get; set; } = "";
public decimal PurchaseOdo { get; set; } = 0.0m; public Int32 PurchaseOdo { get; set; } = 0;
public String TachoCode { get; set; } = ""; public String TachoCode { get; set; } = "";
public String TachoId { get; set; } = ""; public String TachoId { get; set; } = "";
public decimal LastServiceOdo { get; set; } = 0.0m; // Service.
public Int32 LastServiceOdo { get; set; } = 0;
public DateTime LastServiceOn { get; set; } = DateTime.MinValue; public DateTime LastServiceOn { get; set; } = DateTime.MinValue;
public decimal NextServiceOdo { get; set; } = 0.0m; public Int32 NextServiceOdo { get; set; } = 0;
public DateTime NextServiceOn { get; set; } = DateTime.MinValue; public DateTime NextServiceOn { get; set; } = DateTime.MinValue;
public DateTime MotOn { get; set; } = DateTime.MinValue; public DateTime MotOn { get; set; } = DateTime.MinValue;
public String MotNo { get; set; } = ""; public String MotNo { get; set; } = "";
public DateTime NextTaxOn { get; set; } = DateTime.MinValue; public DateTime NextTaxOn { get; set; } = DateTime.MinValue;
public decimal LatestOdo { get; set; } = 0.0m; public Int32 LatestOdo { get; set; } = 0;
public DateTime LatestOdoOn { get; set; } = DateTime.MinValue; public DateTime LatestOdoOn { get; set; } = DateTime.MinValue;
} }
@@ -193,7 +194,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
get { return data.RegNumberPrev; } get { return data.RegNumberPrev; }
set { CheckChanged(data.RegNumberPrev, value); data.RegNumberPrev = value; } set { CheckChanged(data.RegNumberPrev, value); data.RegNumberPrev = value; }
} }
public decimal PurchaseOdo public Int32 PurchaseOdo
{ {
get { return data.PurchaseOdo; } get { return data.PurchaseOdo; }
set { CheckChanged(data.PurchaseOdo, value); data.PurchaseOdo = value; } set { CheckChanged(data.PurchaseOdo, value); data.PurchaseOdo = value; }
@@ -208,7 +209,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
get { return data.TachoId; } get { return data.TachoId; }
set { CheckChanged(data.TachoId, value); data.TachoId = value; } set { CheckChanged(data.TachoId, value); data.TachoId = value; }
} }
public decimal LastServiceOdo public Int32 LastServiceOdo
{ {
get { return data.LastServiceOdo; } get { return data.LastServiceOdo; }
set { CheckChanged(data.LastServiceOdo, value); data.LastServiceOdo = value; } set { CheckChanged(data.LastServiceOdo, value); data.LastServiceOdo = value; }
@@ -218,7 +219,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
get { return data.LastServiceOn; } get { return data.LastServiceOn; }
set { CheckChanged(data.LastServiceOn, value); data.LastServiceOn = value; } set { CheckChanged(data.LastServiceOn, value); data.LastServiceOn = value; }
} }
public decimal NextServiceOdo public Int32 NextServiceOdo
{ {
get { return data.NextServiceOdo; } get { return data.NextServiceOdo; }
set { CheckChanged(data.NextServiceOdo, value); data.NextServiceOdo = value; } set { CheckChanged(data.NextServiceOdo, value); data.NextServiceOdo = value; }
@@ -244,7 +245,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
get { return data.NextTaxOn; } get { return data.NextTaxOn; }
set { CheckChanged(data.NextTaxOn, value); data.NextTaxOn = value; } set { CheckChanged(data.NextTaxOn, value); data.NextTaxOn = value; }
} }
public decimal LatestOdo public Int32 LatestOdo
{ {
get { return data.LatestOdo; } get { return data.LatestOdo; }
set { CheckChanged(data.LatestOdo, value); data.LatestOdo = value; } set { CheckChanged(data.LatestOdo, value); data.LatestOdo = value; }
@@ -376,6 +377,44 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
return new SbmItemId(Sbm.ItemType.Vehicle, Id); return new SbmItemId(Sbm.ItemType.Vehicle, Id);
} }
public static bool IsValidRegistration(string value)
{
if (StringUtil.IsBlank(value)) return false;
if (!StringUtil.IsAlphaNumeric(value)) return false;
if (value.Length < 2 || value.Length > 7) return false; /* 'A1', 'ABC123', 'A123XYZ', 'AB12XYZ' */
// Registration must contain at least one letter and one number.
int letterCount = 0, numberCount = 0;
foreach (char c in value)
{
if (char.IsLetter(c)) letterCount++;
if (char.IsDigit(c)) numberCount++;
}
if (letterCount == 0 || numberCount == 0) return false;
// No more than 3 numbers and all together.
if (numberCount > 3) return false;
return true;
}
public static bool IsValidVin(string value)
{
if (StringUtil.IsBlank(value)) return false;
if (!StringUtil.IsAlphaNumeric(value)) return false;
if (value.Length != 17) return false;
// At least the first character must be an upper case letter.
if (!char.IsLetter(value[0])) return false;
// VIN must contain at least one letter and one number.
int letterCount = 0, numberCount = 0;
foreach (char c in value)
{
if (char.IsLetter(c)) letterCount++;
if (char.IsDigit(c)) numberCount++;
}
if (letterCount == 0 || numberCount == 0) return false;
// The last 5 characters must be numeric.
if (!StringUtil.IsNumeric(value.Right(5))) return false;
return true;
}
//------------------------------------------------------------------- //-------------------------------------------------------------------
// Properties. // Properties.
public Data GetData() { return data.Clone(); } public Data GetData() { return data.Clone(); }
@@ -388,6 +427,16 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
this.data.PopulateFrom(data); this.data.PopulateFrom(data);
} }
// Value ranges.
public static Int16 MaxEngineCapacity { get { return 9999; } }
public static Int16 MaxSeats { get { return 99; } }
public static Int16 MaxWeight { get { return 10000; } }
public static Int32 MaxOdo { get { return 1000000; } }
public static Int16 MinYear { get { return 1960; } }
public static Int16 MaxYear { get { return (Int16)(DateTime.Today.Year + 1); } }
public static DateTime MinDate { get { return new DateTime(MinYear, 1, 1); } }
public static DateTime MaxDate { get { return new DateTime(MaxYear, 12, 31); } }
//------------------------------------------------------------------- //-------------------------------------------------------------------
// Attributes. // Attributes.
public String AssetSerial public String AssetSerial
@@ -471,7 +520,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
get { return data.RegNumberPrev; } get { return data.RegNumberPrev; }
set { data.RegNumberPrev = value; } set { data.RegNumberPrev = value; }
} }
public decimal PurchaseOdo public Int32 PurchaseOdo
{ {
get { return data.PurchaseOdo; } get { return data.PurchaseOdo; }
set { data.PurchaseOdo = value; } set { data.PurchaseOdo = value; }
@@ -486,7 +535,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
get { return data.TachoId; } get { return data.TachoId; }
set { data.TachoId = value; } set { data.TachoId = value; }
} }
public decimal LastServiceOdo public Int32 LastServiceOdo
{ {
get { return data.LastServiceOdo; } get { return data.LastServiceOdo; }
set { data.LastServiceOdo = value; } set { data.LastServiceOdo = value; }
@@ -496,7 +545,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
get { return data.LastServiceOn; } get { return data.LastServiceOn; }
set { data.LastServiceOn = value; } set { data.LastServiceOn = value; }
} }
public decimal NextServiceOdo public Int32 NextServiceOdo
{ {
get { return data.NextServiceOdo; } get { return data.NextServiceOdo; }
set { data.NextServiceOdo = value; } set { data.NextServiceOdo = value; }
@@ -522,7 +571,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
get { return data.NextTaxOn; } get { return data.NextTaxOn; }
set { data.NextTaxOn = value; } set { data.NextTaxOn = value; }
} }
public decimal LatestOdo public Int32 LatestOdo
{ {
get { return data.LatestOdo; } get { return data.LatestOdo; }
set { data.LatestOdo = value; } set { data.LatestOdo = value; }
@@ -561,6 +610,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
public HashSet<SysId> IdsIncluded { get; } = new HashSet<SysId>(); public HashSet<SysId> IdsIncluded { get; } = new HashSet<SysId>();
public HashSet<SysId> IdsExcluded { get; } = new HashSet<SysId>(); public HashSet<SysId> IdsExcluded { get; } = new HashSet<SysId>();
// Vehicle. // Vehicle.
public string Search { get; set; }
public SysId VehicleClassId { get; set; } public SysId VehicleClassId { get; set; }
public SysId AssetCatIdInclude { get; set; } public SysId AssetCatIdInclude { get; set; }
public SysId AssetCatIdExclude { get; set; } public SysId AssetCatIdExclude { get; set; }
@@ -572,6 +622,8 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
public String ClassDescPartial { get; set; } public String ClassDescPartial { get; set; }
/// <summary>Vehicle status.</summary> /// <summary>Vehicle status.</summary>
public StatusCat StatusCat { get; set; } = StatusCat.Any; public StatusCat StatusCat { get; set; } = StatusCat.Any;
// Linked table aliases.
public string TableAlias_VehicleClasss { get; set; }
} }
//------------------------------------------------------------------- //-------------------------------------------------------------------
@@ -19,7 +19,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr
// Utilities. // Utilities.
// Odometer Reading. // Odometer Reading.
public abstract bool SetVehicleOdometerReading(SbmVehicle vehicle, decimal odometer, DbUpdateInfo dbUpdateInfo); public abstract bool SetVehicleOdometerReading(SbmVehicle vehicle, Int32 odometer, DbUpdateInfo dbUpdateInfo);
// Associated data. // Associated data.
public abstract bool VehicleHasAssets(SysId vehicleId); public abstract bool VehicleHasAssets(SysId vehicleId);
@@ -97,12 +97,16 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr
public virtual bool IsValidVehicleData(SbmVehicle.Data data, SbmVehicle.ErrField errField) public virtual bool IsValidVehicleData(SbmVehicle.Data data, SbmVehicle.ErrField errField)
{ {
ClearErrorState(); ClearErrorState();
// Vehicle properties.
// Vehicle Class.
if (errField.VehicleClassId != SacsHierarchyItem.ValidValue.Ignore && SysId.ToInt(data.VehicleClassId) < 1) if (errField.VehicleClassId != SacsHierarchyItem.ValidValue.Ignore && SysId.ToInt(data.VehicleClassId) < 1)
{ {
errField.VehicleClassId = SacsHierarchyItem.ValidValue.Invalid; errField.VehicleClassId = SacsHierarchyItem.ValidValue.Invalid;
return SetErrorState("Aff Id Owner must be supplied"); return SetErrorState("Aff Id Owner must be supplied");
} }
// Registration and VIN.
if (errField.RegNumber != SacsHierarchyItem.ValidValue.Ignore && (IsValidValue(data.RegNumber, "registration Number", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.SaVehicle_RegNumber)))) if (errField.RegNumber != SacsHierarchyItem.ValidValue.Ignore && (IsValidValue(data.RegNumber, "registration Number", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.SaVehicle_RegNumber))))
{ {
errField.RegNumber = SacsHierarchyItem.ValidValue.Invalid; errField.RegNumber = SacsHierarchyItem.ValidValue.Invalid;
@@ -118,6 +122,81 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr
errField.Vin = SacsHierarchyItem.ValidValue.Invalid; errField.Vin = SacsHierarchyItem.ValidValue.Invalid;
return false; return false;
} }
if (errField.CapCode != SacsHierarchyItem.ValidValue.Ignore && (IsValidValue(data.CapCode, "CAP code", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.SaVehicle_CapCode))))
{
errField.CapCode = SacsHierarchyItem.ValidValue.Invalid;
return false;
}
if (errField.KeyNumber != SacsHierarchyItem.ValidValue.Ignore && (IsValidValue(data.KeyNumber, "key number", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.SaVehicle_KeyNumber))))
{
errField.KeyNumber = SacsHierarchyItem.ValidValue.Invalid;
return false;
}
if (errField.KeyLocation != SacsHierarchyItem.ValidValue.Ignore && (IsValidValue(data.KeyLocation, "key location", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.SaVehicle_KeyLocation))))
{
errField.KeyLocation = SacsHierarchyItem.ValidValue.Invalid;
return false;
}
if (errField.LatestOdo != SacsHierarchyItem.ValidValue.Ignore && (data.LatestOdo < 0 || data.LatestOdo > SbmVehicle.MaxOdo))
{
errField.LatestOdo = SacsHierarchyItem.ValidValue.Invalid;
return SetErrorState("Invalid latest odometer");
}
if (errField.LatestOdoOn != SacsHierarchyItem.ValidValue.Ignore && DateUtil.IsValid(data.LatestOdoOn) && (data.LatestOdoOn < SbmVehicle.MinDate || data.LatestOdoOn > SbmVehicle.MaxDate))
{
errField.LatestOdoOn = SacsHierarchyItem.ValidValue.Invalid;
return SetErrorState("Invalid latest odometer date");
}
if (errField.EngineNumber != SacsHierarchyItem.ValidValue.Ignore && (IsValidValue(data.EngineNumber, "engine number", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.SaVehicle_EngineNumber))))
{
errField.EngineNumber = SacsHierarchyItem.ValidValue.Invalid;
return false;
}
if (errField.EngineCapacity != SacsHierarchyItem.ValidValue.Ignore && (data.EngineCapacity < 0 || data.EngineCapacity > SbmVehicle.MaxEngineCapacity))
{
errField.EngineCapacity = SacsHierarchyItem.ValidValue.Invalid;
return SetErrorState("Invalid engine capacity");
}
if (errField.Seats != SacsHierarchyItem.ValidValue.Ignore && (data.Seats < 0 || data.Seats > SbmVehicle.MaxSeats))
{
errField.Seats = SacsHierarchyItem.ValidValue.Invalid;
return SetErrorState("Invalid seats");
}
if (errField.Weight != SacsHierarchyItem.ValidValue.Ignore && (data.Weight < 0 || data.Weight > SbmVehicle.MaxWeight))
{
errField.Weight = SacsHierarchyItem.ValidValue.Invalid;
return SetErrorState("Invalid weight");
}
if (errField.ManufactureYear != SacsHierarchyItem.ValidValue.Ignore && data.ManufactureYear != 0 && (data.ManufactureYear < SbmVehicle.MinYear || data.ManufactureYear > SbmVehicle.MaxYear))
{
errField.ManufactureYear = SacsHierarchyItem.ValidValue.Invalid;
return SetErrorState("Invalid manufacture year");
}
if (errField.BuildOn != SacsHierarchyItem.ValidValue.Ignore && DateUtil.IsValid(data.BuildOn) && (data.BuildOn < SbmVehicle.MinDate || data.BuildOn > SbmVehicle.MaxDate))
{
errField.BuildOn = SacsHierarchyItem.ValidValue.Invalid;
return SetErrorState("Invalid build date");
}
if (errField.RegisterOn != SacsHierarchyItem.ValidValue.Ignore && DateUtil.IsValid(data.RegisterOn) && (data.RegisterOn < SbmVehicle.MinDate || data.RegisterOn > SbmVehicle.MaxDate))
{
errField.RegisterOn = SacsHierarchyItem.ValidValue.Invalid;
return SetErrorState("Invalid registration date");
}
if (errField.FirstRegisterOn != SacsHierarchyItem.ValidValue.Ignore && DateUtil.IsValid(data.FirstRegisterOn) && (data.FirstRegisterOn < SbmVehicle.MinDate || data.FirstRegisterOn > SbmVehicle.MaxDate))
{
errField.FirstRegisterOn = SacsHierarchyItem.ValidValue.Invalid;
return SetErrorState("Invalid first registration date");
}
if (errField.PurchaseOdo != SacsHierarchyItem.ValidValue.Ignore && (data.PurchaseOdo < 0 || data.PurchaseOdo > SbmVehicle.MaxOdo))
{
errField.PurchaseOdo = SacsHierarchyItem.ValidValue.Invalid;
return SetErrorState("Invalid purchase odoometer");
}
if (errField.TachoCode != SacsHierarchyItem.ValidValue.Ignore && (IsValidValue(data.TachoCode, "tacho code", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.SaVehicle_TachoCode)))) if (errField.TachoCode != SacsHierarchyItem.ValidValue.Ignore && (IsValidValue(data.TachoCode, "tacho code", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.SaVehicle_TachoCode))))
{ {
errField.TachoCode = SacsHierarchyItem.ValidValue.Invalid; errField.TachoCode = SacsHierarchyItem.ValidValue.Invalid;
@@ -128,11 +207,44 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr
errField.TachoId = SacsHierarchyItem.ValidValue.Invalid; errField.TachoId = SacsHierarchyItem.ValidValue.Invalid;
return false; return false;
} }
if (errField.LastServiceOdo != SacsHierarchyItem.ValidValue.Ignore && (data.LastServiceOdo < 0 || data.LastServiceOdo > SbmVehicle.MaxOdo))
{
errField.LastServiceOdo = SacsHierarchyItem.ValidValue.Invalid;
return SetErrorState("Invalid last service odometer");
}
if (errField.LastServiceOn != SacsHierarchyItem.ValidValue.Ignore && DateUtil.IsValid(data.LastServiceOn) && (data.LastServiceOn < SbmVehicle.MinDate || data.LastServiceOn > SbmVehicle.MaxDate))
{
errField.LastServiceOn = SacsHierarchyItem.ValidValue.Invalid;
return SetErrorState("Invalid last service date");
}
if (errField.NextServiceOdo != SacsHierarchyItem.ValidValue.Ignore && (data.NextServiceOdo < 0 || data.NextServiceOdo > SbmVehicle.MaxOdo))
{
errField.NextServiceOdo = SacsHierarchyItem.ValidValue.Invalid;
return SetErrorState("Invalid next service odometer");
}
if (errField.NextServiceOn != SacsHierarchyItem.ValidValue.Ignore && DateUtil.IsValid(data.NextServiceOn) && (data.NextServiceOn < SbmVehicle.MinDate || data.NextServiceOn > SbmVehicle.MaxDate))
{
errField.NextServiceOn = SacsHierarchyItem.ValidValue.Invalid;
return SetErrorState("Invalid next service date");
}
if (errField.MotOn != SacsHierarchyItem.ValidValue.Ignore && DateUtil.IsValid(data.MotOn) && (data.MotOn < SbmVehicle.MinDate || data.MotOn > SbmVehicle.MaxDate))
{
errField.MotOn = SacsHierarchyItem.ValidValue.Invalid;
return SetErrorState("Invalid MOT date");
}
if (errField.MotNo != SacsHierarchyItem.ValidValue.Ignore && (IsValidValue(data.MotNo, "MOT", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.SaVehicle_MotNo)))) if (errField.MotNo != SacsHierarchyItem.ValidValue.Ignore && (IsValidValue(data.MotNo, "MOT", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.SaVehicle_MotNo))))
{ {
errField.MotNo = SacsHierarchyItem.ValidValue.Invalid; errField.MotNo = SacsHierarchyItem.ValidValue.Invalid;
return false; return false;
} }
if (errField.NextTaxOn != SacsHierarchyItem.ValidValue.Ignore && DateUtil.IsValid(data.NextTaxOn) && (data.NextTaxOn < SbmVehicle.MinDate || data.NextTaxOn > SbmVehicle.MaxDate))
{
errField.NextTaxOn = SacsHierarchyItem.ValidValue.Invalid;
return SetErrorState("Invalid next tax date");
}
// Common properties. // Common properties.
if (!IsValidValue(data.Notes, "notes", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.SaVehicle_Notes))) if (!IsValidValue(data.Notes, "notes", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.SaVehicle_Notes)))
{ {
@@ -36,7 +36,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
//------------------------------------------------------------------- //-------------------------------------------------------------------
// Odometer Reading. // Odometer Reading.
public override bool SetVehicleOdometerReading(SbmVehicle vehicle, decimal odometer, DbUpdateInfo dbUpdateInfo) public override bool SetVehicleOdometerReading(SbmVehicle vehicle, Int32 odometer, DbUpdateInfo dbUpdateInfo)
{ {
if (vehicle == null || !SysId.IsValid(vehicle.Id) || odometer < 1) return false; if (vehicle == null || !SysId.IsValid(vehicle.Id) || odometer < 1) return false;
DateTime todayDate = DateTime.MinValue; DateTime todayDate = DateTime.MinValue;
@@ -180,7 +180,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
List<TypeCodeDesc> itemDataTypes = SbmSystem.GetSystemCodes(Sbm.SystemCode.ItemDataType); List<TypeCodeDesc> itemDataTypes = SbmSystem.GetSystemCodes(Sbm.SystemCode.ItemDataType);
prmData.lDataType.Add(itemDataTypes.GetCodeForType(Sbm.ItemData.Vehicle_HpiResponse)); prmData.lDataType.Add(itemDataTypes.GetCodeForType(Sbm.ItemData.Vehicle_HpiResponse));
prmData.lDataType.RemoveEmpty(); prmData.lDataType.RemoveEmpty();
if (!StringUtil.IsEmpty(prmData.lDataType)) if (!StringUtil.IsBlank(prmData.lDataType))
itemDataConsole.GetItemDataCount(prmData); itemDataConsole.GetItemDataCount(prmData);
}*/ }*/
return false; return false;
@@ -680,31 +680,81 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
if (prm.IdsExcluded.HasValidIds()) if (prm.IdsExcluded.HasValidIds())
filter.Add($"{colVehicle_Id} NOT IN ({prm.IdsExcluded.Concat(",")})"); filter.Add($"{colVehicle_Id} NOT IN ({prm.IdsExcluded.Concat(",")})");
//---------------------------------------------------------------
// Generic search.
String colName_RegNumber = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_RegNumber, aliasVehicle);
String colName_Vin = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_VIN, aliasVehicle);
String colName_CapCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_CapCode, aliasVehicle);
String colName_EngineNumber = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_EngineNumber, aliasVehicle);
if (!StringUtil.IsBlank(prm.Search))
{
if (StringUtil.IsBlank(prm.TableAlias_VehicleClasss))
SaLogger.Warn("Vehicle search term specified without linked VehicleClass table.");
List<String> searchFilter = new List<string>();
foreach (String rawSearchValue in prm.Search.Split(new char[] { ' ', ',', ';' }))
{
String searchValue = DbQuery.FormatForLike(StringUtil.TrimAll(rawSearchValue));
if (StringUtil.IsBlank(searchValue)) continue;
List<String> searchValueFilter = new List<string>();
searchFilter.Add($"{colName_RegNumber} Like '%{searchValue}%'");
searchFilter.Add($"{colName_Vin} Like '%{searchValue}%'");
searchFilter.Add($"{colName_CapCode} Like '%{searchValue}%'");
searchFilter.Add($"{colName_EngineNumber} Like '%{searchValue}%'");
if (!StringUtil.IsBlank(prm.TableAlias_VehicleClasss))
{
searchFilter.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicleClass_DescBrief, prm.TableAlias_VehicleClasss)} Like '%{searchValue}%'");
searchFilter.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicleClass_Derivative, prm.TableAlias_VehicleClasss)} Like '%{searchValue}%'");
}
else
{
DbQuery qryVehicleClass = new DbQuery(Database.DbmsType);
qryVehicleClass.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaVehicleClass), aliasVehicle_VehicleClass);
qryVehicleClass.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicleClass_Id, aliasVehicle_VehicleClass));
qryVehicleClass.Filters.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicleClass_DescBrief, aliasVehicle_VehicleClass)} Like '%{searchValue}%'");
qryVehicleClass.Filters.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicleClass_Derivative, aliasVehicle_VehicleClass)} Like '%{searchValue}%'");
filter.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_VehicleClassId, aliasVehicle)} IN ({qryVehicleClass.BuildQuery()})");
}
searchFilter.Add(searchValueFilter.Concat(" OR ", "(", ")"));
}
filter.AddRange(searchFilter);
}
//--------------------------------------------------------------- //---------------------------------------------------------------
// Vehicle Class. // Vehicle Class.
String colVehicle_VehicleClassId = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_VehicleClassId, aliasVehicle); String colVehicle_VehicleClassId = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_VehicleClassId, aliasVehicle);
if (SysId.IsValid(prm.VehicleClassId)) if (SysId.IsValid(prm.VehicleClassId))
filter.Add($"{colVehicle_VehicleClassId}={prm.VehicleClassId.ToString()}"); filter.Add($"{colVehicle_VehicleClassId}={prm.VehicleClassId.ToString()}");
String classDesc = DbQuery.FormatForCondition(prm.ClassDescPartial); String classDesc = DbQuery.FormatForCondition(prm.ClassDescPartial);
if (!StringUtil.IsEmpty(prm.MakeCode) || !classDesc.IsEmpty()) if (!StringUtil.IsBlank(prm.MakeCode) || !StringUtil.IsBlank(classDesc))
{ {
DbQuery qryVehicleClass = new DbQuery(Database.DbmsType); if (StringUtil.IsBlank(prm.TableAlias_VehicleClasss))
qryVehicleClass.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaVehicleClass), aliasVehicle_VehicleClass); {
qryVehicleClass.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicleClass_Id, aliasVehicle_VehicleClass)); DbQuery qryVehicleClass = new DbQuery(Database.DbmsType);
if (!StringUtil.IsEmpty(prm.MakeCode)) qryVehicleClass.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaVehicleClass), aliasVehicle_VehicleClass);
qryVehicleClass.Filters.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicleClass_MakeCode, aliasVehicle_VehicleClass)}='{prm.MakeCode}'"); qryVehicleClass.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicleClass_Id, aliasVehicle_VehicleClass));
if (!StringUtil.IsEmpty(classDesc)) if (!StringUtil.IsBlank(prm.MakeCode))
qryVehicleClass.Filters.Add($"{DbQuery.FormatFn_Left(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicleClass_DescBrief, aliasVehicle_VehicleClass), prm.ClassDescPartial.Length)}='{classDesc}'"); qryVehicleClass.Filters.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicleClass_MakeCode, aliasVehicle_VehicleClass)}='{prm.MakeCode}'");
filter.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_VehicleClassId, aliasVehicle)} IN ({qryVehicleClass.BuildQuery()})"); if (!StringUtil.IsBlank(classDesc))
qryVehicleClass.Filters.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicleClass_DescBrief, aliasVehicle_VehicleClass)} Like '%{classDesc}%'");
filter.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_VehicleClassId, aliasVehicle)} IN ({qryVehicleClass.BuildQuery()})");
}
else
{
if (!StringUtil.IsBlank(prm.MakeCode))
filter.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicleClass_MakeCode, prm.TableAlias_VehicleClasss)}='{prm.MakeCode}'");
if (!StringUtil.IsBlank(classDesc))
filter.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicleClass_DescBrief, prm.TableAlias_VehicleClasss)} Like '%{classDesc}%'");
}
} }
//--------------------------------------------------------------- //---------------------------------------------------------------
// Partial Registration. // Partial Registration.
if (!StringUtil.IsBlank(prm.RegNumberPartial)) if (!StringUtil.IsBlank(prm.RegNumberPartial))
filter.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_RegNumber, aliasVehicle)} Like '%{DbQuery.FormatForLike(prm.RegNumberPartial)}%'"); filter.Add($"{colName_RegNumber} Like '%{DbQuery.FormatForLike(prm.RegNumberPartial)}%'");
// Partial VIN: // Partial VIN:
if (!StringUtil.IsBlank(prm.VinPartial)) if (!StringUtil.IsBlank(prm.VinPartial))
filter.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_VIN, aliasVehicle)} Like '%{DbQuery.FormatForLike(prm.VinPartial)}%'"); filter.Add($"{colName_Vin} Like '%{DbQuery.FormatForLike(prm.VinPartial)}%'");
//--------------------------------------------------------------- //---------------------------------------------------------------
// Associated Assets. // Associated Assets.
@@ -765,10 +815,10 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
else else
{ {
sortCol = columnDfn.DataName; sortCol = columnDfn.DataName;
if (!StringUtil.IsEmpty(columnDfn.SortDataName)) if (!StringUtil.IsBlank(columnDfn.SortDataName))
sortCol = columnDfn.SortDataName; sortCol = columnDfn.SortDataName;
} }
if (!sortCol.IsEmpty()) if (!StringUtil.IsBlank(sortCol))
{ {
DbOrderByNullMode orderByNullMode = DbOrderByNullMode.Default; // eSaOrderByDemoteNulls, eSaOrderByPromoteNulls DbOrderByNullMode orderByNullMode = DbOrderByNullMode.Default; // eSaOrderByDemoteNulls, eSaOrderByPromoteNulls
sortColumnCodes.Add(DbQuery.FormatForOrderBy(sortCol, columnDfn.SortAscending, orderByNullMode).Concat(", ")); sortColumnCodes.Add(DbQuery.FormatForOrderBy(sortCol, columnDfn.SortAscending, orderByNullMode).Concat(", "));
@@ -859,8 +909,20 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
if (columns.HasId(SbmVehicle.Column.KeyLocation)) if (columns.HasId(SbmVehicle.Column.KeyLocation))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_KeyLocation, aliasVehicle)); query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_KeyLocation, aliasVehicle));
// Common Properties
if (columns.HasId(SbmVehicle.Column.Notes))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_Notes, aliasVehicle));
if (columns.HasId(SbmVehicle.Column.Flag))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_Flags, aliasVehicle));
if (columns.HasId(SbmVehicle.Column.Status) || columns.HasId(SbmVehicle.Column.Status_Desc) || columns.HasId(SbmVehicle.Column.Status_Ind))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_Status, aliasVehicle));
if (columns.HasId(SbmVehicle.Column.CreateOn_Date))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_CreateOn, aliasVehicle));
if (columns.HasId(SbmVehicle.Column.UpdateOn_Date))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_UpdateOn, aliasVehicle));
//--------------------------------------------------------------- //---------------------------------------------------------------
// Vehicle Category. // Vehicle Class.
bool hasVehicleClassCols = false; bool hasVehicleClassCols = false;
if (!hasVehicleClassCols) hasVehicleClassCols = columns.HasId(SbmVehicle.Column.VehicleClass_MakeCode); if (!hasVehicleClassCols) hasVehicleClassCols = columns.HasId(SbmVehicle.Column.VehicleClass_MakeCode);
if (!hasVehicleClassCols) hasVehicleClassCols = columns.HasId(SbmVehicle.Column.VehicleClass_MakeDesc); if (!hasVehicleClassCols) hasVehicleClassCols = columns.HasId(SbmVehicle.Column.VehicleClass_MakeDesc);
@@ -876,6 +938,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
if (!hasVehicleClassCols) hasVehicleClassCols = columns.HasId(SbmVehicle.Column.VehicleClass_Notes); if (!hasVehicleClassCols) hasVehicleClassCols = columns.HasId(SbmVehicle.Column.VehicleClass_Notes);
if (hasVehicleClassCols) if (hasVehicleClassCols)
{ {
prm.TableAlias_VehicleClasss = aliasVehicle_VehicleClass;
DbQueryJoin joinVehCat = new DbQueryJoin(DbJoinType.LeftOuter); DbQueryJoin joinVehCat = new DbQueryJoin(DbJoinType.LeftOuter);
joinVehCat.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaVehicleClass), aliasVehicle_VehicleClass); joinVehCat.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaVehicleClass), aliasVehicle_VehicleClass);
joinVehCat.Filters.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicleClass_Id, aliasVehicle_VehicleClass)}={SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_VehicleClassId, aliasVehicle)}"); joinVehCat.Filters.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicleClass_Id, aliasVehicle_VehicleClass)}={SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_VehicleClassId, aliasVehicle)}");
@@ -912,6 +975,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
query.Columns.Add($"({qryEvent.BuildQuery()})", dataNameVehEventCount); query.Columns.Add($"({qryEvent.BuildQuery()})", dataNameVehEventCount);
} }
} }
//--------------------------------------------------------------- //---------------------------------------------------------------
// Feature count. // Feature count.
bool bCountFeatures = columns.HasId(SbmVehicle.Column.FeatureCount); bool bCountFeatures = columns.HasId(SbmVehicle.Column.FeatureCount);
@@ -949,17 +1013,6 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
query.Columns.Add($"({qryItemData.BuildQuery()})", dataNameHpiCheckCount); query.Columns.Add($"({qryItemData.BuildQuery()})", dataNameHpiCheckCount);
} }
} }
// Common Properties
if (columns.HasId(SbmVehicle.Column.Notes))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_Notes, aliasVehicle));
if (columns.HasId(SbmVehicle.Column.Flag))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_Flags, aliasVehicle));
if (columns.HasId(SbmVehicle.Column.Status) || columns.HasId(SbmVehicle.Column.Status_Desc) || columns.HasId(SbmVehicle.Column.Status_Ind))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_Status, aliasVehicle));
if (columns.HasId(SbmVehicle.Column.CreateOn_Date))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_CreateOn, aliasVehicle));
if (columns.HasId(SbmVehicle.Column.UpdateOn_Date))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_UpdateOn, aliasVehicle));
//--------------------------------------------------------------- //---------------------------------------------------------------
// Populate filter. // Populate filter.
@@ -66,7 +66,6 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
public override bool VehicleDatabaseIsValid() public override bool VehicleDatabaseIsValid()
{ {
if (!AssetDatabaseIsValid()) return false;
ClearErrorState(); ClearErrorState();
if (Database == null) return SetErrorState("Database not specified"); if (Database == null) return SetErrorState("Database not specified");
if (!Database.TableExists(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaVehicleClass))) return SetErrorState("Vehicle Class table does not exist"); if (!Database.TableExists(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaVehicleClass))) return SetErrorState("Vehicle Class table does not exist");
@@ -340,7 +340,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
// Commodity identity column. // Commodity identity column.
String commodityIdCol = prm.commodityIdCol; String commodityIdCol = prm.commodityIdCol;
if (StringUtil.IsEmpty(commodityIdCol)) commodityIdCol = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Id, prm.tableAliasCommodity); if (StringUtil.IsBlank(commodityIdCol)) commodityIdCol = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Id, prm.tableAliasCommodity);
// Stock locations. // Stock locations.
SysId locStockId = prm.prmCmd.LocationIdStock; SysId locStockId = prm.prmCmd.LocationIdStock;
@@ -480,7 +480,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
// If the movement date is requested, union the commodity and container movement queries to return a single list of dates. // If the movement date is requested, union the commodity and container movement queries to return a single list of dates.
if (prm.moveCol == PlannedStockMovements_Params.PlanStockMoveCol.MovementDate) if (prm.moveCol == PlannedStockMovements_Params.PlanStockMoveCol.MovementDate)
{ {
if (!StringUtil.IsEmpty(qryMov2a) && !StringUtil.IsEmpty(qryMov2b)) if (!StringUtil.IsBlank(qryMov2a) && !StringUtil.IsBlank(qryMov2b))
return "(" + qryMov1b + ") UNION (" + qryMov2b + ")"; return "(" + qryMov1b + ") UNION (" + qryMov2b + ")";
else else
return qryMov1b; return qryMov1b;
@@ -2320,9 +2320,9 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
//--------------------------------------------------------------- //---------------------------------------------------------------
// Code. // Code.
if (!StringUtil.IsEmpty(prm.CodeFull)) if (!StringUtil.IsBlank(prm.CodeFull))
filter.Add(colCommodity_Code + "='" + DbQuery.FormatForCondition(prm.CodeFull) + "'"); filter.Add(colCommodity_Code + "='" + DbQuery.FormatForCondition(prm.CodeFull) + "'");
else if (!StringUtil.IsEmpty(prm.CodePartial)) else if (!StringUtil.IsBlank(prm.CodePartial))
{ {
if (SessionConsole != null && AllowConfigOption(Sbm.ConfigOption.CommodityPartialCodeFilter)) if (SessionConsole != null && AllowConfigOption(Sbm.ConfigOption.CommodityPartialCodeFilter))
filter.Add(colCommodity_Code + " LIKE '%" + DbQuery.FormatForLike(prm.CodePartial) + "%'"); filter.Add(colCommodity_Code + " LIKE '%" + DbQuery.FormatForLike(prm.CodePartial) + "%'");
@@ -2333,9 +2333,9 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
// Brief Desc. // Brief Desc.
bool allowEmbeddedTextSearch = true; bool allowEmbeddedTextSearch = true;
bool allowFullTextSearch = true; bool allowFullTextSearch = true;
if (!StringUtil.IsEmpty(prm.DescBriefFull)) if (!StringUtil.IsBlank(prm.DescBriefFull))
filter.Add(colCommodity_DescBrief + "='" + DbQuery.FormatForCondition(prm.DescBriefFull) + "'"); filter.Add(colCommodity_DescBrief + "='" + DbQuery.FormatForCondition(prm.DescBriefFull) + "'");
else if (!StringUtil.IsEmpty(prm.DescBriefPartial)) else if (!StringUtil.IsBlank(prm.DescBriefPartial))
{ {
List<String> filterDesc = new List<String>(); List<String> filterDesc = new List<String>();
filterDesc.Add(DbQuery.FormatFn_Left(colCommodity_DescBrief, prm.DescBriefPartial.Length) + "='" + DbQuery.FormatForLike(prm.DescBriefPartial) + "'"); filterDesc.Add(DbQuery.FormatFn_Left(colCommodity_DescBrief, prm.DescBriefPartial.Length) + "='" + DbQuery.FormatForLike(prm.DescBriefPartial) + "'");
@@ -2352,30 +2352,30 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
//--------------------------------------------------------------- //---------------------------------------------------------------
// DrawingNumber. // DrawingNumber.
if (!StringUtil.IsEmpty(prm.DrawingNoFull)) if (!StringUtil.IsBlank(prm.DrawingNoFull))
{ {
filter.Add(colCommodity_DrawingNo + "='" + DbQuery.FormatForCondition(prm.DrawingNoFull) + "'"); filter.Add(colCommodity_DrawingNo + "='" + DbQuery.FormatForCondition(prm.DrawingNoFull) + "'");
} }
else if (!StringUtil.IsEmpty(prm.DrawingNoPartial)) else if (!StringUtil.IsBlank(prm.DrawingNoPartial))
{ {
filter.Add(DbQuery.FormatFn_Left(colCommodity_DrawingNo, prm.DrawingNoPartial.Length) + "='" + DbQuery.FormatForCondition(prm.DrawingNoPartial) + "'"); filter.Add(DbQuery.FormatFn_Left(colCommodity_DrawingNo, prm.DrawingNoPartial.Length) + "='" + DbQuery.FormatForCondition(prm.DrawingNoPartial) + "'");
} }
// DrawingIssue. // DrawingIssue.
if (!StringUtil.IsEmpty(prm.DrawingIssueFull)) if (!StringUtil.IsBlank(prm.DrawingIssueFull))
filter.Add(colCommodity_DrawingIssue + "='" + DbQuery.FormatForCondition(prm.DrawingIssueFull) + "'"); filter.Add(colCommodity_DrawingIssue + "='" + DbQuery.FormatForCondition(prm.DrawingIssueFull) + "'");
else if (!StringUtil.IsEmpty(prm.DrawingIssuePartial)) else if (!StringUtil.IsBlank(prm.DrawingIssuePartial))
filter.Add(DbQuery.FormatFn_Left(colCommodity_DrawingIssue, prm.DrawingIssuePartial.Length) + "='" + DbQuery.FormatForCondition(prm.DrawingIssuePartial) + "'"); filter.Add(DbQuery.FormatFn_Left(colCommodity_DrawingIssue, prm.DrawingIssuePartial.Length) + "='" + DbQuery.FormatForCondition(prm.DrawingIssuePartial) + "'");
//--------------------------------------------------------------- //---------------------------------------------------------------
// Generic search. // Generic search.
if (!StringUtil.IsEmpty(prm.Search)) if (!StringUtil.IsBlank(prm.Search))
{ {
List<String> searchFilter = new List<string>(); List<String> searchFilter = new List<string>();
foreach (String rawSearchValue in prm.Search.Split(new char[] { ' ', ',', ';' })) foreach (String rawSearchValue in prm.Search.Split(new char[] { ' ', ',', ';' }))
{ {
String searchValue = DbQuery.FormatForLike(StringUtil.TrimAll(rawSearchValue)); String searchValue = DbQuery.FormatForLike(StringUtil.TrimAll(rawSearchValue));
if (StringUtil.IsEmpty(searchValue)) continue; if (StringUtil.IsBlank(searchValue)) continue;
List<String> searchValueFilter = new List<string>(); List<String> searchValueFilter = new List<string>();
searchValueFilter.Add(colCommodity_Code + " LIKE '%" + searchValue + "%'"); searchValueFilter.Add(colCommodity_Code + " LIKE '%" + searchValue + "%'");
searchValueFilter.Add(colCommodity_DescBrief + " LIKE '%" + searchValue + "%'"); searchValueFilter.Add(colCommodity_DescBrief + " LIKE '%" + searchValue + "%'");
@@ -2390,13 +2390,13 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
//--------------------------------------------------------------- //---------------------------------------------------------------
// Catalog. // Catalog.
String colCommodity_CatalogRef = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_CatalogRef, aliasCommodity); String colCommodity_CatalogRef = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_CatalogRef, aliasCommodity);
if (!StringUtil.IsEmpty(prm.CatalogRefPartial)) if (!StringUtil.IsBlank(prm.CatalogRefPartial))
filter.Add(DbQuery.FormatFn_Left(colCommodity_CatalogRef, prm.CatalogRefPartial.Length) + "='" + DbQuery.FormatForCondition(prm.CatalogRefPartial) + "'"); filter.Add(DbQuery.FormatFn_Left(colCommodity_CatalogRef, prm.CatalogRefPartial.Length) + "='" + DbQuery.FormatForCondition(prm.CatalogRefPartial) + "'");
//--------------------------------------------------------------- //---------------------------------------------------------------
// Category. // Category.
String categoryList = prm.Categories.Concat(",", "'", "'", true, true); String categoryList = prm.Categories.Concat(",", "'", "'", true, true);
if (!StringUtil.IsEmpty(categoryList)) if (!StringUtil.IsBlank(categoryList))
{ {
List<String> filterCategory = new List<String>(); List<String> filterCategory = new List<String>();
filterCategory.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Category, aliasCommodity) + " IN(" + categoryList + ")"); filterCategory.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Category, aliasCommodity) + " IN(" + categoryList + ")");
@@ -2410,31 +2410,31 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
//--------------------------------------------------------------- //---------------------------------------------------------------
// Coding. // Coding.
String Commodity_RangeCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_RangeCode, aliasCommodity); String Commodity_RangeCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_RangeCode, aliasCommodity);
if (!StringUtil.IsEmpty(prm.RangeCode)) if (!StringUtil.IsBlank(prm.RangeCode))
filter.Add(Commodity_RangeCode + "='" + DbQuery.FormatForCondition(prm.RangeCode) + "'"); filter.Add(Commodity_RangeCode + "='" + DbQuery.FormatForCondition(prm.RangeCode) + "'");
String colCommodity_ColourCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_ColourCode, aliasCommodity); String colCommodity_ColourCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_ColourCode, aliasCommodity);
if (!StringUtil.IsEmpty(prm.ColourCode)) if (!StringUtil.IsBlank(prm.ColourCode))
filter.Add(colCommodity_ColourCode + "='" + DbQuery.FormatForCondition(prm.ColourCode) + "'"); filter.Add(colCommodity_ColourCode + "='" + DbQuery.FormatForCondition(prm.ColourCode) + "'");
String colCommodity_SourceCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_SourceCode, aliasCommodity); String colCommodity_SourceCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_SourceCode, aliasCommodity);
if (!StringUtil.IsEmpty(prm.SourceCode)) if (!StringUtil.IsBlank(prm.SourceCode))
filter.Add(colCommodity_SourceCode + "='" + DbQuery.FormatForCondition(prm.SourceCode) + "'"); filter.Add(colCommodity_SourceCode + "='" + DbQuery.FormatForCondition(prm.SourceCode) + "'");
String colCommodity_SupplyMethodCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_SupplyMethodCode, aliasCommodity); String colCommodity_SupplyMethodCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_SupplyMethodCode, aliasCommodity);
if (!StringUtil.IsEmpty(prm.SupplyMethodCode)) if (!StringUtil.IsBlank(prm.SupplyMethodCode))
filter.Add(colCommodity_SupplyMethodCode + "='" + DbQuery.FormatForCondition(prm.SupplyMethodCode) + "'"); filter.Add(colCommodity_SupplyMethodCode + "='" + DbQuery.FormatForCondition(prm.SupplyMethodCode) + "'");
String colCommodity_HandlingCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_HandlingCode, aliasCommodity); String colCommodity_HandlingCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_HandlingCode, aliasCommodity);
if (!StringUtil.IsEmpty(prm.HandlingCode)) if (!StringUtil.IsBlank(prm.HandlingCode))
filter.Add(colCommodity_HandlingCode + "='" + DbQuery.FormatForCondition(prm.HandlingCode) + "'"); filter.Add(colCommodity_HandlingCode + "='" + DbQuery.FormatForCondition(prm.HandlingCode) + "'");
String colCommodity_DeliveryCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_DeliveryCode, aliasCommodity); String colCommodity_DeliveryCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_DeliveryCode, aliasCommodity);
if (!StringUtil.IsEmpty(prm.DeliveryCode)) if (!StringUtil.IsBlank(prm.DeliveryCode))
filter.Add(colCommodity_DeliveryCode + "='" + DbQuery.FormatForCondition(prm.DeliveryCode) + "'"); filter.Add(colCommodity_DeliveryCode + "='" + DbQuery.FormatForCondition(prm.DeliveryCode) + "'");
String colCommodity_MaterialCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_MaterialCode, aliasCommodity); String colCommodity_MaterialCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_MaterialCode, aliasCommodity);
if (!StringUtil.IsEmpty(prm.MaterialCode)) if (!StringUtil.IsBlank(prm.MaterialCode))
filter.Add(colCommodity_MaterialCode + "='" + DbQuery.FormatForCondition(prm.MaterialCode) + "'"); filter.Add(colCommodity_MaterialCode + "='" + DbQuery.FormatForCondition(prm.MaterialCode) + "'");
String colCommodity_FinishCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_FinishCode, aliasCommodity); String colCommodity_FinishCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_FinishCode, aliasCommodity);
if (!StringUtil.IsEmpty(prm.FinishCode)) if (!StringUtil.IsBlank(prm.FinishCode))
filter.Add(colCommodity_FinishCode + "='" + DbQuery.FormatForCondition(prm.FinishCode) + "'"); filter.Add(colCommodity_FinishCode + "='" + DbQuery.FormatForCondition(prm.FinishCode) + "'");
String colCommodity_PromotionCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_PromotionCode, aliasCommodity); String colCommodity_PromotionCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_PromotionCode, aliasCommodity);
if (!StringUtil.IsEmpty(prm.PromotionCode)) if (!StringUtil.IsBlank(prm.PromotionCode))
filter.Add(colCommodity_PromotionCode + "='" + DbQuery.FormatForCondition(prm.PromotionCode) + "'"); filter.Add(colCommodity_PromotionCode + "='" + DbQuery.FormatForCondition(prm.PromotionCode) + "'");
//--------------------------------------------------------------- //---------------------------------------------------------------
@@ -2502,7 +2502,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
filterCustId.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_AssIdCustomer, aliasCommodity) + "=" + prm.AssociationIdCustomer.ToString()); filterCustId.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_AssIdCustomer, aliasCommodity) + "=" + prm.AssociationIdCustomer.ToString());
filter.Add(filterCustId.Concat(" OR ")); filter.Add(filterCustId.Concat(" OR "));
} }
else if (!StringUtil.IsEmpty(prm.CustomerName)) else if (!StringUtil.IsBlank(prm.CustomerName))
{ {
// Partial or complete match on customer name: // Partial or complete match on customer name:
String filterAffiliate_CustomerName = "FltCustNameAff"; String filterAffiliate_CustomerName = "FltCustNameAff";
@@ -2525,7 +2525,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
//--------------------------------------------------------------- //---------------------------------------------------------------
// Supplier. // Supplier.
if (!StringUtil.IsEmpty(prm.SupplierName)) if (!StringUtil.IsBlank(prm.SupplierName))
{ {
// Partial or complete match on Supplier name. // Partial or complete match on Supplier name.
String filterAffiliate_SupplierName = "FltSuppNameAff"; String filterAffiliate_SupplierName = "FltSuppNameAff";
@@ -2549,7 +2549,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
//--------------------------------------------------------------- //---------------------------------------------------------------
// Transaction. // Transaction.
bool linkRequirement = false; bool linkRequirement = false;
bool linkTransaction = !StringUtil.IsEmpty(prm.OrderRef); bool linkTransaction = !StringUtil.IsBlank(prm.OrderRef);
if (linkRequirement || linkTransaction) if (linkRequirement || linkTransaction)
{ {
String aliasCommodity_Transaction = "aCmdTrn"; String aliasCommodity_Transaction = "aCmdTrn";
@@ -2564,7 +2564,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
qryReqnt.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction), aliasCommodity_Transaction)); qryReqnt.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction), aliasCommodity_Transaction));
qryReqnt.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_TransId, aliasCommodity_Requirement) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, aliasCommodity_Transaction)); qryReqnt.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_TransId, aliasCommodity_Requirement) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, aliasCommodity_Transaction));
qryReqnt.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Type, aliasCommodity_Transaction) + "=" + Sbm.TransactionType.SalesOrder.ToString()); qryReqnt.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Type, aliasCommodity_Transaction) + "=" + Sbm.TransactionType.SalesOrder.ToString());
if (!StringUtil.IsEmpty(prm.OrderRef)) if (!StringUtil.IsBlank(prm.OrderRef))
qryReqnt.Filters.Add(DbQuery.FormatFn_Left(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Ref, aliasCommodity_Transaction), prm.OrderRef.Length) + "='" + DbQuery.FormatForCondition(prm.OrderRef) + "'"); qryReqnt.Filters.Add(DbQuery.FormatFn_Left(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Ref, aliasCommodity_Transaction), prm.OrderRef.Length) + "='" + DbQuery.FormatForCondition(prm.OrderRef) + "'");
} }
filter.Add("EXISTS(" + qryReqnt.BuildQuery() + ")"); filter.Add("EXISTS(" + qryReqnt.BuildQuery() + ")");
@@ -2572,7 +2572,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
//--------------------------------------------------------------- //---------------------------------------------------------------
// Commodities defined by Customer. // Commodities defined by Customer.
if (SysId.IsValid(prm.AssociationIdCommodityCustomer) || !StringUtil.IsEmpty(prm.AccountCodeCommodityCustomer)) if (SysId.IsValid(prm.AssociationIdCommodityCustomer) || !StringUtil.IsBlank(prm.AccountCodeCommodityCustomer))
{ {
if (CanManageCommodityCustomers()) if (CanManageCommodityCustomers())
{ {
@@ -2583,7 +2583,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
{ {
qryCmdCust.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.CommodityCustomer_AssocIdCustomer, aliasCommodity_CmdCustomer) + "=" + prm.AssociationIdCommodityCustomer.ToString()); qryCmdCust.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.CommodityCustomer_AssocIdCustomer, aliasCommodity_CmdCustomer) + "=" + prm.AssociationIdCommodityCustomer.ToString());
} }
if (!StringUtil.IsEmpty(prm.AccountCodeCommodityCustomer)) if (!StringUtil.IsBlank(prm.AccountCodeCommodityCustomer))
{ {
// To match the customer account code, must also join to the association table: // To match the customer account code, must also join to the association table:
String aliasCommodity_CmdCustAssoc = "aCmdCmdCustAss"; String aliasCommodity_CmdCustAssoc = "aCmdCmdCustAss";
@@ -2627,7 +2627,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
else else
{ {
sortCol = columnDfn.DataName; sortCol = columnDfn.DataName;
if (!StringUtil.IsEmpty(columnDfn.SortDataName)) if (!StringUtil.IsBlank(columnDfn.SortDataName))
sortCol = columnDfn.SortDataName; sortCol = columnDfn.SortDataName;
} }
if (!sortCol.IsEmpty()) if (!sortCol.IsEmpty())
@@ -2917,7 +2917,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
if (!hasCmdCustField) hasCmdCustField = columns.HasId(SbmCommodity.Column.Cust_CurrencyIdRetail_Symbol); if (!hasCmdCustField) hasCmdCustField = columns.HasId(SbmCommodity.Column.Cust_CurrencyIdRetail_Symbol);
if (!hasCmdCustField) hasCmdCustField = columns.HasId(SbmCommodity.Column.Cust_PromotionCode); if (!hasCmdCustField) hasCmdCustField = columns.HasId(SbmCommodity.Column.Cust_PromotionCode);
if (!hasCmdCustField) hasCmdCustField = columns.HasId(SbmCommodity.Column.Cust_PromotionDesc); if (!hasCmdCustField) hasCmdCustField = columns.HasId(SbmCommodity.Column.Cust_PromotionDesc);
if (hasCmdCustField && (SysId.IsValid(prm.AssociationIdCommodityCustomer) || !StringUtil.IsEmpty(prm.AccountCodeCommodityCustomer))) if (hasCmdCustField && (SysId.IsValid(prm.AssociationIdCommodityCustomer) || !StringUtil.IsBlank(prm.AccountCodeCommodityCustomer)))
{ {
// Join to the commodity customer. // Join to the commodity customer.
DbQueryJoin joinCmdCust = new DbQueryJoin(DbJoinType.LeftOuter); DbQueryJoin joinCmdCust = new DbQueryJoin(DbJoinType.LeftOuter);
@@ -2929,7 +2929,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
joinCmdCust.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.CommodityCustomer_AssocIdCustomer, aliasCommodity_CmdCustomer) + "=" + prm.AssociationIdCommodityCustomer.ToString()); joinCmdCust.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.CommodityCustomer_AssocIdCustomer, aliasCommodity_CmdCustomer) + "=" + prm.AssociationIdCommodityCustomer.ToString());
} }
query.Joins.Add(joinCmdCust); query.Joins.Add(joinCmdCust);
if (!StringUtil.IsEmpty(prm.AccountCodeCommodityCustomer)) if (!StringUtil.IsBlank(prm.AccountCodeCommodityCustomer))
{ {
// Join to the Association to filter by the Customer's account code. // Join to the Association to filter by the Customer's account code.
} }
@@ -3368,7 +3368,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
//--------------------------------------------------------------- //---------------------------------------------------------------
// Stock movements // Stock movements
if (SysId.IsValid(locationStockId) || !StringUtil.IsEmpty(stringLocactionStockId)) if (SysId.IsValid(locationStockId) || !StringUtil.IsBlank(stringLocactionStockId))
{ {
// Stock due in by future weeks. // Stock due in by future weeks.
if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Week1)) if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Week1))
@@ -193,11 +193,11 @@ namespace Sarand.BusinessMgr.Web.Portal.Components
{ {
commoditiesItem.Options.Add(new MenuOptionData() { Caption = @Localiser["caption.asset.categories"], Page = "Assets/AssetCategory" }); commoditiesItem.Options.Add(new MenuOptionData() { Caption = @Localiser["caption.asset.categories"], Page = "Assets/AssetCategory" });
commoditiesItem.Options.Add(new MenuOptionData() { Caption = @Localiser["label.assets"], Page = "Assets/Asset" }); commoditiesItem.Options.Add(new MenuOptionData() { Caption = @Localiser["label.assets"], Page = "Assets/Asset" });
if (AllowOption(Sbm.ConfigOption.Vehicles)) }
{ if (AllowOption(Sbm.ConfigOption.Vehicles))
commoditiesItem.Options.Add(new MenuOptionData() { Caption = @Localiser["caption.vehicle.classes"], Page = "Vehicles/VehicleClass" }); {
commoditiesItem.Options.Add(new MenuOptionData() { Caption = @Localiser["caption.vehicles"], Page = "Vehicles/Vehicle" }); commoditiesItem.Options.Add(new MenuOptionData() { Caption = @Localiser["caption.vehicle.classes"], Page = "Vehicles/VehicleClass" });
} commoditiesItem.Options.Add(new MenuOptionData() { Caption = @Localiser["caption.vehicles"], Page = "Vehicles/Vehicle" });
} }
if (commoditiesItem.Options.Any()) if (commoditiesItem.Options.Any())
Menu.Items.Add(commoditiesItem); Menu.Items.Add(commoditiesItem);
@@ -1,6 +1,7 @@
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Sarand.BusinessMgr.Net.Core.Web.App; using Sarand.BusinessMgr.Net.Core.Web.App;
using Sarand.BusinessMgr.Net.Standard.Base.App;
using Sarand.BusinessMgr.Web.Portal.Components; using Sarand.BusinessMgr.Web.Portal.Components;
using Sarand.BusinessMgr.Web.Portal.Models.Assets; using Sarand.BusinessMgr.Web.Portal.Models.Assets;
@@ -34,7 +35,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Assets
} }
RefreshModel(model); RefreshModel(model);
if (!model.AllowOption(Net.Standard.Base.App.Sbm.ConfigOption.Assets)) if (!model.AllowOption(Sbm.ConfigOption.Assets))
return RedirectToAction("", ""); return RedirectToAction("", "");
// Asset Category page. // Asset Category page.
@@ -1,6 +1,7 @@
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Sarand.BusinessMgr.Net.Core.Web.App; using Sarand.BusinessMgr.Net.Core.Web.App;
using Sarand.BusinessMgr.Net.Standard.Base.App;
using Sarand.BusinessMgr.Web.Portal.Components; using Sarand.BusinessMgr.Web.Portal.Components;
using Sarand.BusinessMgr.Web.Portal.Models.Assets; using Sarand.BusinessMgr.Web.Portal.Models.Assets;
@@ -35,7 +36,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Assets
Model_Asset model = new Model_Asset(Localiser); Model_Asset model = new Model_Asset(Localiser);
RefreshModel(model); RefreshModel(model);
if (!model.AllowOption(Net.Standard.Base.App.Sbm.ConfigOption.Assets)) if (!model.AllowOption(Sbm.ConfigOption.Assets))
return RedirectToAction("", ""); return RedirectToAction("", "");
// Asset page. // Asset page.
@@ -1,6 +1,7 @@
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Sarand.BusinessMgr.Net.Core.Web.App; using Sarand.BusinessMgr.Net.Core.Web.App;
using Sarand.BusinessMgr.Net.Standard.Base.App;
using Sarand.BusinessMgr.Web.Portal.Components; using Sarand.BusinessMgr.Web.Portal.Components;
using Sarand.BusinessMgr.Web.Portal.Models.Vehicles; using Sarand.BusinessMgr.Web.Portal.Models.Vehicles;
@@ -35,7 +36,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Vehicles
RefreshModel(model); RefreshModel(model);
// Redirect Home if no access to Vehicles. // Redirect Home if no access to Vehicles.
if (!model.AllowOption(Net.Standard.Base.App.Sbm.ConfigOption.Vehicles)) if (!model.AllowOption(Sbm.ConfigOption.Vehicles))
return RedirectToAction("", ""); return RedirectToAction("", "");
// VehicleClass page. // VehicleClass page.
@@ -0,0 +1,480 @@
using Microsoft.AspNetCore.Mvc;
using Sarand.BusinessMgr.Net.Standard.Base.App;
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
using Sarand.BusinessMgr.Web.Portal.Components;
using Sarand.BusinessMgr.Web.Portal.Models.Vehicles;
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 System;
using System.Collections.Generic;
namespace Sarand.BusinessMgr.Web.Portal.Controllers.Vehicles
{
//=======================================================================
// Portal Vehicle Controller - Ajax actions.
//=======================================================================
partial class VehicleController
{
//-------------------------------------------------------------------
// Item data.
private class VehicleListData : AjaxResponse_Data.ItemData_Base
{
public String ClassCaption { get; set; }
public String Registration { get; set; }
// Field values.
public AjaxResponse_Data.FieldValuesData Field { get; } = new AjaxResponse_Data.FieldValuesData();
}
private class VehicleItemData : VehicleListData
{
public String ClassId { get; set; }
}
private void PopulateVehicleResponseListData(SbmModel_Portal model, VehicleListData data, SbmVehicleClass vehicleClass, SbmVehicle vehicle)
{
// Prominent properties for selecting and editing.
data.Id = SysId.ToString(vehicle.Id);
data.Field.Value.Add($"{Model_Vehicle.ItemField.Id}", data.Id);
data.Field.Value.Add($"{Model_Vehicle.ItemField.Exists}", "1");
data.Field.Value.Add($"{Model_Vehicle.ItemField.ClassId}", $"{vehicle.VehicleClassId}");
data.Field.Value.Add($"{Model_Vehicle.ItemField.ClassCaption}", vehicleClass.DescBrief);
data.Field.Value.Add($"{Model_Vehicle.ItemField.Derivative}", vehicleClass.Derivative);
data.Field.Value.Add($"{Model_Vehicle.ItemField.Make}", Internals.GetCodeTypeDesc(Sbm.ApplCodeType.VehicleMake, vehicleClass.MakeCode));
data.Field.Value.Add($"{Model_Vehicle.ItemField.Model}", vehicleClass.Model);
data.Registration = vehicle.RegNumber;
data.Field.Value.Add($"{Model_Vehicle.ItemField.Registration}", data.Registration);
data.Field.Value.Add($"{Model_Vehicle.ItemField.Vin}", vehicle.Vin);
data.Field.Value.RemoveAll(item => StringUtil.IsBlank(item.Value));
}
private void PopulateVehicleResponseItemData(SbmModel_Portal model, VehicleItemData data, SbmVehicleClass vehicleClass, SbmVehicle vehicle)
{
PopulateVehicleResponseListData(model, data, vehicleClass, vehicle);
data.ClassId = SysId.ToString(vehicle.VehicleClassId);
data.Field.Value.Add($"{Model_Vehicle.ItemField.RegistrationPrev}", vehicle.RegNumberPrev);
data.Field.Value.Add($"{Model_Vehicle.ItemField.AssetSerial}", vehicle.AssetSerial);
// Properties.
data.Field.Value.Add($"{Model_Vehicle.ItemField.CapCode}", vehicle.CapCode);
data.Field.Value.Add($"{Model_Vehicle.ItemField.KeyNumber}", vehicle.KeyNumber);
data.Field.Value.Add($"{Model_Vehicle.ItemField.KeyLocation}", vehicle.KeyLocation);
data.Field.Value.Add($"{Model_Vehicle.ItemField.EngineNumber}", vehicle.EngineNumber);
data.Field.Value.Add($"{Model_Vehicle.ItemField.TachoCode}", vehicle.TachoCode);
data.Field.Value.Add($"{Model_Vehicle.ItemField.TachoId}", vehicle.TachoId);
data.Field.Value.Add($"{Model_Vehicle.ItemField.LatestOdo}", $"{vehicle.LatestOdo}");
data.Field.Value.Add($"{Model_Vehicle.ItemField.LatestOdoOn}", model.FormatDateForForm(vehicle.LatestOdoOn));
// Specification.
data.Field.Value.Add($"{Model_Vehicle.ItemField.EngineCapacity}", $"{vehicle.EngineCapacity}");
data.Field.Value.Add($"{Model_Vehicle.ItemField.Seats}", $"{vehicle.Seats}");
data.Field.Value.Add($"{Model_Vehicle.ItemField.Weight}", $"{vehicle.Weight}");
data.Field.Value.Add($"{Model_Vehicle.ItemField.ManufactureYear}", $"{vehicle.ManufactureYear}");
data.Field.Value.Add($"{Model_Vehicle.ItemField.BuildOn}", model.FormatDateForForm(vehicle.BuildOn));
data.Field.Value.Add($"{Model_Vehicle.ItemField.PurchaseOdo}", $"{vehicle.PurchaseOdo}");
data.Field.Value.Add($"{Model_Vehicle.ItemField.RegisterOn}", model.FormatDateForForm(vehicle.RegisterOn));
data.Field.Value.Add($"{Model_Vehicle.ItemField.FirstRegisterOn}", model.FormatDateForForm(vehicle.FirstRegisterOn));
// Serice.
data.Field.Value.Add($"{Model_Vehicle.ItemField.LastServiceOdo}", $"{vehicle.LastServiceOdo}");
data.Field.Value.Add($"{Model_Vehicle.ItemField.LastServiceOn}", model.FormatDateForForm(vehicle.LastServiceOn));
data.Field.Value.Add($"{Model_Vehicle.ItemField.NextServiceOdo}", $"{vehicle.NextServiceOdo}");
data.Field.Value.Add($"{Model_Vehicle.ItemField.NextServiceOn}", model.FormatDateForForm(vehicle.NextServiceOn));
data.Field.Value.Add($"{Model_Vehicle.ItemField.MotOn}", model.FormatDateForForm(vehicle.MotOn));
data.Field.Value.Add($"{Model_Vehicle.ItemField.MotNo}", vehicle.MotNo);
data.Field.Value.Add($"{Model_Vehicle.ItemField.NextTaxOn}", model.FormatDateForForm(vehicle.NextTaxOn));
// Common properties.
data.StatusCode = vehicle.StatusCode;
data.StatusDesc = vehicle.StatusDesc;
// Cleanse field values.
data.Field.Value.RemoveAll(item => StringUtil.IsBlank(item.Value));
// Populate item list values that might be cleared during update after removing blank values to ensure that blank values are published.
data.Field.Value.Add($"{Model_Vehicle.ItemField.Notes}", vehicle.Notes);
data.Field.Value.Add($"{Model_Vehicle.ItemField.UpdatedOn}", Localiser.FormatDate(vehicle.UpdateStamp.On));
}
//-------------------------------------------------------------------
// Vehicle configuration ajax request.
//-------------------------------------------------------------------
private class AjaxResponse_VehicleConfig : AjaxResponse_Data
{
// Construction.
public AjaxResponse_VehicleConfig(SbmModel_Portal model) : base(model) { }
// Configuration data - object copied directly to env.datain script.
public class ConfigData
{
// Configuration.
public Model_Vehicle.ListConfigData CfgList { get; } = new Model_Vehicle.ListConfigData();
public Model_Vehicle.ItemConfigData CfgItemNew { get; } = new Model_Vehicle.ItemConfigData();
// Reference data.
public List<ItemCodeDesc> Statuses { get; } = new List<ItemCodeDesc>();
public List<ItemCodeDesc> StatusesCreate { get; } = new List<ItemCodeDesc>();
public String StatusCodeDefault { get; set; }
}
public ConfigData Data { get; set; } = new ConfigData();
}
//-------------------------------------------------------------------
[HttpPost]
[Route("Vehicles/Vehicle/Ajax/Config")]
[Route("Vehicles/Vehicle/Ajax/GetConfig")]
public IActionResult Ajax_GetVehicleConfig(Model_Vehicle model)
{
String messageTitle = Localiser["label.vehicles"];
AjaxResponse_VehicleConfig responseData = new AjaxResponse_VehicleConfig(model);
// Validate session and referrer.
if (!ValidReferer) return Forbid();
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
RefreshModel(model);
// Populate configuration data.
PopulateVehicleConfig(model, responseData);
// Complete response.
responseData.Success = true;
return Json(responseData);
}
private void PopulateVehicleConfig(Model_Vehicle model, AjaxResponse_VehicleConfig responseData)
{
// Configuration.
model.PopulateListConfig(responseData.Data.CfgList);
model.PopulateItemConfig(responseData.Data.CfgItemNew, new SbmItemId(Sbm.ItemType.Vehicle, new SysId()), new Model_Vehicle.ItemParamsData());
// Reference data - statuses.
foreach (SaStatus status in SbmVehicle.ValidStatuses)
{
responseData.Data.Statuses.Add(new AjaxResponse_Data.ItemCodeDesc(SacsSystem.GetStatusCode(status), Localiser.GetStatusCaption(status)));
if (status != SaStatus.Deleted)
responseData.Data.StatusesCreate.Add(new AjaxResponse_Data.ItemCodeDesc(SacsSystem.GetStatusCode(status), Localiser.GetStatusCaption(status)));
}
responseData.Data.StatusCodeDefault = SacsSystem.GetStatusCode(SbmVehicle.DefaultStatus);
}
//-------------------------------------------------------------------
// Vehicle list ajax request.
//-------------------------------------------------------------------
private class AjaxResponse_VehicleList : AjaxResponse_VehicleConfig
{
// Construction.
public AjaxResponse_VehicleList(SbmModel_Portal model) : base(model) { }
// View mode.
public class ModeData
{
public ushort? Search { get; set; }
public ushort? Maintain { get; set; }
}
public ModeData Mode { get; set; }
// Vehicle list.
public List<VehicleListData> Vehicles { get; } = new List<VehicleListData>();
}
//-------------------------------------------------------------------
[HttpPost]
[Route("Vehicles/Vehicle/Ajax/GetList")]
[Route("Vehicles/Vehicle/Ajax/GetVehicles")]
[Route("Vehicles/Vehicle/Ajax/GetVehicleList")]
public IActionResult Ajax_GetVehicleList(Model_Vehicle model)
{
String messageTitle = Localiser["label.vehicles"];
AjaxResponse_VehicleList responseData = new AjaxResponse_VehicleList(model);
// Validate session and referrer.
if (!ValidReferer) return Forbid();
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
RefreshModel(model);
// Populate configuration data.
PopulateVehicleConfig(model, responseData);
// View mode.
responseData.Mode = new AjaxResponse_VehicleList.ModeData();
Model_Vehicle.ViewMode viewMode = model.GetFilterMode();
if (viewMode == Model_Vehicle.ViewMode.Maintain)
responseData.Mode.Maintain = 1;
else
responseData.Mode.Search = 1;
// Item filter.
SbmVehicle.Params prmVehicle = new SbmVehicle.Params();
prmVehicle.VehicleClassId = model.GetFilterVehicleClassId();
prmVehicle.Search = model.Filter.Search;
prmVehicle.StatusCat = model.GetFilterStatusCat();
model.Paging.ItemTotal = (ulong)AssetMgr.GetVehicleCount(prmVehicle);
model.PopulatePagingTo(prmVehicle.ResultsPaging);
// Item columns.
ColumnDfn colId = AssetMgr.GetVehicleColumnDfn(SbmVehicle.Column.Id);
ColumnDfn colClassCaption = AssetMgr.GetVehicleColumnDfn(SbmVehicle.Column.VehicleClass_DescBrief);
ColumnDfn colDerivative = AssetMgr.GetVehicleColumnDfn(SbmVehicle.Column.VehicleClass_Derivative);
ColumnDfn colMake = AssetMgr.GetVehicleColumnDfn(SbmVehicle.Column.VehicleClass_MakeDesc);
ColumnDfn colModel = AssetMgr.GetVehicleColumnDfn(SbmVehicle.Column.VehicleClass_Model);
ColumnDfn colRegistration = AssetMgr.GetVehicleColumnDfn(SbmVehicle.Column.RegNumber);
ColumnDfn colVin = AssetMgr.GetVehicleColumnDfn(SbmVehicle.Column.Vin);
ColumnDfn colNotes = AssetMgr.GetVehicleColumnDfn(SbmVehicle.Column.Notes);
ColumnDfn colStatus = AssetMgr.GetVehicleColumnDfn(SbmVehicle.Column.Status);
List<ColumnDfn> columns = new List<ColumnDfn>()
{
colId, colClassCaption, colDerivative, colMake,colModel,
colRegistration, colVin, colNotes, colStatus
};
// Query items.
using (DbResultSet resultSet = AssetMgr.ExecuteVehicleQuery(columns, prmVehicle))
{
while (resultSet != null && resultSet.HasRows && resultSet.NextRecord())
{
NamedValue.Map values = resultSet.GetRecordValues();
string statusCode = values.GetString(colStatus.DataName);
VehicleListData vehicleData = new VehicleListData()
{
Id = values.GetLong(colId.DataName).ToString(),
ClassCaption = values.GetString(colClassCaption.DataName),
Registration = values.GetString(colRegistration.DataName),
StatusCode = statusCode,
StatusDesc = SacsSystem.GetStatusDescForCode(statusCode)
};
vehicleData.Field.Value.Add($"{Model_Vehicle.ItemField.ClassCaption}", vehicleData.ClassCaption);
vehicleData.Field.Value.Add($"{Model_Vehicle.ItemField.Derivative}", values.GetString(colDerivative.DataName));
vehicleData.Field.Value.Add($"{Model_Vehicle.ItemField.Make}", values.GetString(colMake.DataName));
vehicleData.Field.Value.Add($"{Model_Vehicle.ItemField.Model}", values.GetString(colModel.DataName));
vehicleData.Field.Value.Add($"{Model_Vehicle.ItemField.Registration}", vehicleData.Registration);
vehicleData.Field.Value.Add($"{Model_Vehicle.ItemField.Notes}", AssetMgr.GetVehicleDataValue(colNotes, values).ToString());
vehicleData.Field.Value.Add($"{Model_Vehicle.ItemField.Status}", SacsSystem.GetStatusDescForCode(statusCode));
// Cleanse item values.
vehicleData.Field.Value.RemoveAll(item => StringUtil.IsBlank(item.Value));
responseData.Vehicles.Add(vehicleData);
}
}
if (model.Paging.IsPaged)
model.Paging.ItemCount = (ushort)responseData.Vehicles.Count;
// Complete response.
responseData.SetPaging(model);
responseData.Success = true;
return Json(responseData);
}
//-------------------------------------------------------------------
// Vehicle ajax request.
//-------------------------------------------------------------------
private class AjaxResponse_Vehicle : AjaxResponse_Data
{
// Construction.
public AjaxResponse_Vehicle(SbmModel_Portal model) : base(model) { }
// Configuration.
public Model_Vehicle.ItemConfigData Config { get; } = new Model_Vehicle.ItemConfigData();
// Vehicle details.
public VehicleItemData vehicle { get; } = new VehicleItemData();
}
//-------------------------------------------------------------------
[HttpPost]
[Route("Vehicles/Vehicle/Ajax/GetItem")]
[Route("Vehicles/Vehicle/Ajax/GetVehicle")]
public IActionResult Ajax_GetVehicle(Model_Vehicle model)
{
String messageTitle = Localiser["label.vehicle"];
AjaxResponse_Vehicle responseData = new AjaxResponse_Vehicle(model);
// Validate session and referrer.
if (!ValidReferer) return Forbid();
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
RefreshModel(model);
// Record disposable items as they are created so all can be disposed when needed.
using (DisposableCollection<ISacsDisposable> disposables = new DisposableCollection<ISacsDisposable>())
{
// Identify item.
SysId vehicleId = SysId.ToSysId(model.Vehicle.Id);
if (!SysId.IsValid(vehicleId))
return Json(responseData.SetPopupMessage(messageTitle, Localiser["msg.error.item.id.not.specified"]));
// Retrieve item.
SbmVehicle vehicle = AssetMgr.GetVehicleById(vehicleId);
if (vehicle == null)
{
SaLogger.Warn($"{SysUtil.Fn} Failed to retrieve vehicle for Id: '" + vehicleId + "'");
return Json(responseData.SetPopupMessage(messageTitle, Localiser["msg.error.item.id.not.found"]));
}
// Retrieve Class.
SbmVehicleClass vehicleClass = AssetMgr.GetVehicleClassById(vehicle.VehicleClassId);
if (vehicleClass == null)
{
SaLogger.Warn($"{SysUtil.Fn} Failed to retrieve vehicle category for Id: '" + vehicle.VehicleClassId + "'");
return Json(responseData.SetPopupMessage(messageTitle, Localiser["msg.error.system"]));
}
// Construct response.
model.PopulateItemConfig(responseData.Config, vehicle, new Model_Vehicle.ItemParamsData());
PopulateVehicleResponseItemData(model, responseData.vehicle, vehicleClass, vehicle);
responseData.Success = true;
}
return Json(responseData);
}
//-------------------------------------------------------------------
// Store Vehicle ajax request.
//-------------------------------------------------------------------
[HttpPost]
[Route("Vehicles/Vehicle/Ajax/StoreItem")]
[Route("Vehicles/Vehicle/Ajax/StoreVehicle")]
public IActionResult Ajax_StoreVehicle(Model_Vehicle model)
{
String messageTitle = Localiser["label.vehicle"];
AjaxResponse_Vehicle responseData = new AjaxResponse_Vehicle(model);
// Validate session and referrer.
if (!ValidReferer) return Forbid();
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
RefreshModel(model);
// Validate item Id.
SysId vehicleId = SysId.ToSysId(model.Vehicle.Id);
if (StringUtil.ToBool(model.Vehicle.Exists) && !SysId.IsValid(vehicleId))
{
SaLogger.Warn($"{SysUtil.Fn} Vehicle Id not supplied for existing item.");
return Json(responseData.SetPopupMessage(messageTitle, Localiser["msg.error.system"]));
}
if (!StringUtil.ToBool(model.Vehicle.Exists) && SysId.IsValid(vehicleId))
{
SaLogger.Warn($"{SysUtil.Fn} Vehicle Id supplied for new item.");
return Json(responseData.SetPopupMessage(messageTitle, Localiser["msg.error.system"]));
}
// Validate item properties.
model.ValidateVehicleData(responseData);
if (responseData.HasControlErrors())
return Json(responseData);
// Record disposable items as they are created so all can be disposed when needed.
using (DisposableCollection<ISacsDisposable> disposables = new DisposableCollection<ISacsDisposable>())
{
// Retrieve existing item.
SbmVehicle vehicle = AssetMgr.GetVehicleById(vehicleId);
if (vehicle == null && SysId.IsValid(vehicleId))
{
SaLogger.Warn($"{SysUtil.Fn} Failed to retrieve Vehicle for Id: '{model.Vehicle.Id}'");
return Json(responseData.SetPopupMessage(messageTitle, Localiser["msg.error.item.id.not.found"]));
}
// Retrieve category.
SbmVehicleClass vehicleClass = null;
if (vehicle != null)
{
vehicleClass = AssetMgr.GetVehicleClassById(vehicle.VehicleClassId);
if (vehicleClass == null)
{
SaLogger.Warn($"{SysUtil.Fn} Failed to retrieve Vehicle Category for existing Vehicle. Id: '{vehicle.VehicleClassId} '");
return Json(responseData.SetPopupMessage(messageTitle, Localiser["msg.error.system"]));
}
}
else
{
vehicleClass = AssetMgr.GetVehicleClassById(SysId.ToSysId(model.Vehicle.ClassId));
if (vehicleClass == null)
{
SaLogger.Warn($"{SysUtil.Fn} Failed to retrieve Vehicle Category for new Vehicle. Id: '{model.Vehicle.ClassId}'");
return Json(responseData.SetPopupMessage(messageTitle, Localiser["msg.error.system"]));
}
}
// Create new item if required.
if (vehicle == null)
{
vehicle = AssetMgr.CreateVehicle();
}
// Populate item properties.
if (model.Vehicle.Registration != null)
vehicle.RegNumber = model.Vehicle.Registration;
if (model.Vehicle.Vin != null)
vehicle.Vin = model.Vehicle.Vin;
if (model.Vehicle.CapCode != null)
vehicle.CapCode = model.Vehicle.CapCode;
if (model.Vehicle.KeyNumber != null)
vehicle.KeyNumber = model.Vehicle.KeyNumber;
if (model.Vehicle.KeyLocation != null)
vehicle.KeyLocation = model.Vehicle.KeyLocation;
if (model.Vehicle.EngineNumber != null)
vehicle.EngineNumber = model.Vehicle.EngineNumber;
// Specification.
if (model.Vehicle.EngineCapacity != null)
vehicle.EngineCapacity = model.GetVehicleEngineCapacity();
if (model.Vehicle.Seats != null)
vehicle.Seats = model.GetVehicleSeats();
if (model.Vehicle.Weight != null)
vehicle.Weight = model.GetVehicleWeight();
if (model.Vehicle.ManufactureYear != null)
vehicle.ManufactureYear = model.GetVehicleManufactureYear();
if (model.Vehicle.BuildOn != null)
vehicle.BuildOn = model.GetVehicleBuildOn();
if (model.Vehicle.FirstRegisterOn != null)
vehicle.FirstRegisterOn = model.GetVehicleFirstRegisterOn();
if (model.Vehicle.RegisterOn != null)
vehicle.RegisterOn = model.GetVehicleRegisterOn();
if (model.Vehicle.RegNumberPrev != null)
vehicle.RegNumberPrev = model.Vehicle.RegNumberPrev;
if (model.Vehicle.PurchaseOdo != null)
vehicle.PurchaseOdo = model.GetVehiclePurchaseOdo();
if (model.Vehicle.TachoCode != null)
vehicle.TachoCode = model.Vehicle.TachoCode;
if (model.Vehicle.TachoId != null)
vehicle.TachoId = model.Vehicle.TachoId;
// Service.
if (model.Vehicle.LastServiceOdo != null)
vehicle.LastServiceOdo = model.GetVehicleLastServiceOdo();
if (model.Vehicle.LastServiceOn != null)
vehicle.LastServiceOn = model.GetVehicleLastServiceOn();
if (model.Vehicle.NextServiceOdo != null)
vehicle.NextServiceOdo = model.GetVehicleNextServiceOdo();
if (model.Vehicle.NextServiceOn != null)
vehicle.NextServiceOn = model.GetVehicleNextServiceOn();
if (model.Vehicle.MotOn != null)
vehicle.MotOn = model.GetVehicleMotOn();
if (model.Vehicle.MotNo != null)
vehicle.MotNo = model.Vehicle.MotNo;
if (model.Vehicle.NextTaxOn != null)
vehicle.NextTaxOn = model.GetVehicleNextTaxOn();
if (model.Vehicle.LatestOdo != null)
vehicle.LatestOdo = model.GetVehicleLatestOdo();
if (model.Vehicle.LatestOdoOn != null)
vehicle.LatestOdoOn = model.GetVehicleLatestOdoOn();
// Common properties.
if (model.Vehicle.StatusCode != null)
vehicle.Status = model.Vehicle.GetStatus();
if (model.Vehicle.Notes != null)
vehicle.Notes = model.Vehicle.Notes;
// Store item.
if (!SysId.IsValid(vehicle.Id))
{
if (!AssetMgr.InsertVehicle(vehicle, DbUpdateInfo))
{
SaLogger.Warn($"{SysUtil.Fn} Failed to insert Vehicle: " + AssetMgr.ErrorStateMessage);
return Json(responseData.SetPopupMessage(messageTitle, Localiser["msg.error.item.insert.failed"]));
}
responseData.SetNotifyMessage(messageTitle, Localiser["msg.item.created"]);
}
else
{
if (!AssetMgr.UpdateVehicle(vehicle, DbUpdateInfo))
{
SaLogger.Warn($"{SysUtil.Fn} Failed to update Vehicle [Id:" + SysId.ToString(vehicle.Id) + "]: " + AssetMgr.ErrorStateMessage);
return Json(responseData.SetPopupMessage(messageTitle, Localiser["msg.error.item.update.failed"]));
}
responseData.SetNotifyMessage(messageTitle, Localiser["msg.item.updated"]);
}
// Construct response.
model.PopulateItemConfig(responseData.Config, vehicle, new Model_Vehicle.ItemParamsData());
PopulateVehicleResponseItemData(model, responseData.vehicle, vehicleClass, vehicle);
responseData.Success = true;
}
return Json(responseData);
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,49 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Sarand.BusinessMgr.Net.Core.Web.App;
using Sarand.BusinessMgr.Net.Standard.Base.App;
using Sarand.BusinessMgr.Web.Portal.Components;
using Sarand.BusinessMgr.Web.Portal.Models.Vehicles;
namespace Sarand.BusinessMgr.Web.Portal.Controllers.Vehicles
{
//======================================================================
public partial class VehicleController : SbmController_Portal
{
//-------------------------------------------------------------------
// Data members.
//-------------------------------------------------------------------
// Construction.
public VehicleController(SbmLocaliser localiser, ILogger<VehicleController> logger) :
base(localiser, logger)
{
}
//-------------------------------------------------------------------
[Route("Vehicles/Vehicle")]
public IActionResult Index()
{
if (!ValidUserSession)
AutoLoginUser();
// Redirect to sign-in if not signed-in.
if (!ValidUserSession)
{
ClearKeepLoggedInCookie();
return RedirectToAction("", "Security");
}
Model_Vehicle model = new Model_Vehicle(Localiser);
RefreshModel(model);
if (!model.AllowOption(Sbm.ConfigOption.Vehicles))
return RedirectToAction("", "");
// Vehicle page.
return View("Views/Vehicles/Vehicle/Index.cshtml", model);
}
//-------------------------------------------------------------------
}
//======================================================================
}
@@ -1,6 +1,7 @@
using Sarand.BusinessMgr.Net.Standard.Base.App; using Sarand.BusinessMgr.Net.Standard.Base.App;
using Sarand.BusinessMgr.Net.Standard.Base.Bus; using Sarand.BusinessMgr.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Core;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@@ -21,29 +22,52 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Vehicles
{ {
// Vehicle properties. // Vehicle properties.
Id, Id,
Exists,
// Identity. // Identity.
Registration, Registration,
RegistrationPrev,
Vin, Vin,
// Model. AssetSerial,
// Vehicle Class.
Class,
ClassId,
ClassCaption,
Derivative,
Make, Make,
Model, Model,
Class, // Properties.
// Defaults.
CapCode, CapCode,
KeyNumber, KeyNumber,
KeyLocation, KeyLocation,
EngineNumber,
TachoCode,
TachoId,
LatestOdo,
LatestOdoOn,
// Specification.
EngineCapacity,
Seats,
Weight, Weight,
// Spec. ManufactureYear,
BuildOn, BuildOn,
PurchaseOdo, PurchaseOdo,
RegisterOn, RegisterOn,
FirstRegisterOn, FirstRegisterOn,
EngineNumber, // Serice.
RegistrationPrevious, LastServiceOdo,
LatestOdo, LastServiceOn,
LatestOdoOn, NextServiceOdo,
NextServiceOn,
MotOn,
MotNo,
NextTaxOn,
// HPI interface.
HpiCheckCount,
HpiAlert,
// Associated properties. // Associated properties.
AssetCount, AssetCount,
EventCount,
FeatureCount,
// Common. // Common.
Notes, Notes,
Status, Status,
@@ -115,13 +139,28 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Vehicles
// List columns. // List columns.
if (SysId.IsValid(SysId.ToSysId(Filter.VehicleClassId))) if (SysId.IsValid(GetFilterVehicleClassId()))
config.Column.Hide.Add($"{ItemField.Class}"); config.Column.Hide.Add($"{ItemField.Class}");
// Vehicle Assets. // Vehicle Assets.
if (!modeIsMaintain || !AllowOption(Sbm.ConfigOption.Assets)) if (!modeIsMaintain || !AllowOption(Sbm.ConfigOption.Assets) || !Internals.GetOwnerOption_AllowOption(Sbm.OrgOption_AllowOption.Vehicle_Assets))
config.Column.Hide.Add($"{ItemField.AssetCount}"); config.Column.Hide.Add($"{ItemField.AssetCount}");
// Vehicle Features.
if (!Internals.GetOwnerOption_AllowOption(Sbm.OrgOption_AllowOption.Vehicle_Features) || !AssetMgr.TableExists(SbmDbDfn.TableIdx.SaVehicleFeature))
config.Column.Hide.Add($"{ItemField.FeatureCount}");
// Vehicle Events.
if (!Internals.GetOwnerOption_AllowOption(Sbm.OrgOption_AllowOption.Vehicle_Events) || !AssetMgr.TableExists(SbmDbDfn.TableIdx.SaVehicleEvent))
config.Column.Hide.Add($"{ItemField.EventCount}");
if (!SysId.IsValid(InterfaceConsole.GetInterfaceIdForContextCategoryType(Internals.UserContext.OrganisationInterfaceContext, SaInterfaceCategory.System, (short)Sbm.InterfaceType_System.Hpi)))
{
config.Column.Hide.Add($"{ItemField.HpiCheckCount}");
config.Column.Hide.Add($"{ItemField.HpiAlert}");
}
// Actions. // Actions.
if (!modeIsMaintain) if (!modeIsMaintain)
config.Column.Hide.Add($"{ItemField.Actions}"); config.Column.Hide.Add($"{ItemField.Actions}");
@@ -130,43 +169,36 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Vehicles
//------------------------------------------------------------------- //-------------------------------------------------------------------
// Item configuration. // Item configuration.
//------------------------------------------------------------------- //-------------------------------------------------------------------
// Legacy Vehicle dialog tabs and panels. // Legacy dialog tabs and panels.
// Tab 1 'Properties': // Dialog:
// Model // - Registration, VIN.
// Defaults // Panels:
// Spec // Model - Make, Model, Class (search/update).
// HPI // Defaults - CAP code, Key number, & location, Weight.
// Service // Specification - Built on, Purchase Odo, Register On, First Register On, Engine Number, Previous Registration, Latest Odo & date, Tacho type & Id.
// Notes // HPI - HPI information (view only).
// Tab 2 'Features': // Service - Last service date & odo, Next service date & odo, MOT date & number, Next tax date.
// Features // Features - Vehicle features.
// History - Vehicle history.
// Events - Vehicle events.
// Assets - Assets for item.
// Documents - Item docs.
// Item Data - Item data.
// Notes.
//------------------------------------------------------------------- //-------------------------------------------------------------------
public class ItemParamsData
{
public bool IdentityReadOnly { get; set; }
}
public class ItemConfigData public class ItemConfigData
{ {
// Update dialog title.
public String Title { get; set; } public String Title { get; set; }
// Pre-select Vehicle type.
public class TypeData
{
public TypeData(string code, String desc)
{
Code = code;
Desc = desc;
}
public String Code { get; set; }
public String Desc { get; set; }
}
public TypeData Type { get; set; }
// Field name prefix.
public String Prefix { get; } = Model_Vehicle.FieldNamePrefix; public String Prefix { get; } = Model_Vehicle.FieldNamePrefix;
// Control flags. public bool Readonly { get; set; }
public bool? ManagedByAccounts { get; set; }
public bool? LocalPricing { get; set; }
// Allowed actions. // Allowed actions.
public class AllowData public class AllowData
{ {
public bool? UpdateCode { get; set; }
} }
public AllowData Allow { get; } = new AllowData(); public AllowData Allow { get; } = new AllowData();
// Item fields. // Item fields.
@@ -186,14 +218,14 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Vehicles
/// <summary> /// <summary>
/// Populate item configuration for existing vehicle. /// Populate item configuration for existing vehicle.
/// </summary> /// </summary>
public void PopulateItemConfig(ItemConfigData config, SbmVehicle vehicle) public void PopulateItemConfig(ItemConfigData config, SbmVehicle vehicle, ItemParamsData itemParams)
{ {
PopulateItemConfig(config, vehicle.GetItemId()); PopulateItemConfig(config, vehicle.GetItemId(), itemParams);
} }
/// <summary> /// <summary>
/// Populate item configuration for new or existing vehicle. /// Populate item configuration for new or existing vehicle.
/// </summary> /// </summary>
public void PopulateItemConfig(ItemConfigData config, SbmItemId vehicleItemId) public void PopulateItemConfig(ItemConfigData config, SbmItemId vehicleItemId, ItemParamsData itemParams)
{ {
// Session configuration. // Session configuration.
bool userCanCreateVehicles = SessionData_Portal.SecurityProfile.UserCanCreateItemType(Sbm.ItemType.Vehicle); bool userCanCreateVehicles = SessionData_Portal.SecurityProfile.UserCanCreateItemType(Sbm.ItemType.Vehicle);
@@ -201,101 +233,21 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Vehicles
// Update dialog title. // Update dialog title.
config.Title = Localiser["caption.vehicle.update"]; config.Title = Localiser["caption.vehicle.update"];
if (!userCanUpdateVehicles) config.Readonly = true;
//--------------------------------------------------------------- //---------------------------------------------------------------
// Identity. // Identity.
// Registration. // Registration.
if (!userCanUpdateVehicles) if (itemParams.IdentityReadOnly)
{
config.Field.Readonly.Add($"{ItemField.Registration}"); config.Field.Readonly.Add($"{ItemField.Registration}");
// VIN.
if (!userCanUpdateVehicles)
config.Field.Readonly.Add($"{ItemField.Vin}"); config.Field.Readonly.Add($"{ItemField.Vin}");
}
//---------------------------------------------------------------
// Model.
// Make.
if (!userCanUpdateVehicles)
config.Field.Readonly.Add($"{ItemField.Make}");
// Model.
if (!userCanUpdateVehicles)
config.Field.Readonly.Add($"{ItemField.Model}");
// Class.
if (!userCanUpdateVehicles)
config.Field.Readonly.Add($"{ItemField.Class}");
//---------------------------------------------------------------
// Defaults.
// CAP code.
if (!userCanUpdateVehicles)
config.Field.Readonly.Add($"{ItemField.CapCode}");
// Key Number.
if (!userCanUpdateVehicles)
config.Field.Readonly.Add($"{ItemField.KeyNumber}");
// Key Location.
if (!userCanUpdateVehicles)
config.Field.Readonly.Add($"{ItemField.KeyLocation}");
// Weight.
if (!userCanUpdateVehicles)
config.Field.Readonly.Add($"{ItemField.Weight}");
//---------------------------------------------------------------
// Spec.
// Build On.
if (!userCanUpdateVehicles)
config.Field.Readonly.Add($"{ItemField.BuildOn}");
// Purchase Odomoeter.
if (!userCanUpdateVehicles)
config.Field.Readonly.Add($"{ItemField.PurchaseOdo}");
// Register On.
if (!userCanUpdateVehicles)
config.Field.Readonly.Add($"{ItemField.RegisterOn}");
// First Register On.
if (!userCanUpdateVehicles)
config.Field.Readonly.Add($"{ItemField.FirstRegisterOn}");
// Engine Number.
if (!userCanUpdateVehicles)
config.Field.Readonly.Add($"{ItemField.EngineNumber}");
// Previous Registration.
if (!userCanUpdateVehicles)
config.Field.Readonly.Add($"{ItemField.RegistrationPrevious}");
// Latest Odomoeter.
if (!userCanUpdateVehicles)
config.Field.Readonly.Add($"{ItemField.LatestOdo}");
// Latest Odomoeter.
if (!userCanUpdateVehicles)
config.Field.Readonly.Add($"{ItemField.LatestOdoOn}");
//---------------------------------------------------------------
// Service.
//--------------------------------------------------------------- //---------------------------------------------------------------
// Common properties. // Common properties.
// Status.
if (!userCanUpdateVehicles)
config.Field.Readonly.Add($"{ItemField.Status}");
// Notes.
if (!userCanUpdateVehicles)
config.Field.Readonly.Add($"{ItemField.Notes}");
//--------------------------------------------------------------- //---------------------------------------------------------------
} }
@@ -1,14 +1,11 @@
using DocumentFormat.OpenXml.Spreadsheet; using Sarand.BusinessMgr.Net.Core.Web.App;
using Sarand.BusinessMgr.Net.Core.Web.App;
using Sarand.BusinessMgr.Net.Core.Web.Components; using Sarand.BusinessMgr.Net.Core.Web.Components;
using Sarand.BusinessMgr.Net.Standard.Base.App; using Sarand.BusinessMgr.Net.Standard.Base.App;
using Sarand.BusinessMgr.Net.Standard.Base.Bus; using Sarand.BusinessMgr.Net.Standard.Base.Bus;
using Sarand.BusinessMgr.Net.Standard.Base.Bus.Control;
using Sarand.BusinessMgr.Web.Portal.Components; using Sarand.BusinessMgr.Web.Portal.Components;
using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Helpers;
using Sarand.Net.Standard.Base.Utils; using Sarand.Net.Standard.Base.Utils;
using System; using System;
@@ -47,6 +44,10 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Vehicles
{ {
return EnumUtil.ParseEnum(Filter.Mode, ViewMode.Search); return EnumUtil.ParseEnum(Filter.Mode, ViewMode.Search);
} }
public SysId GetFilterVehicleClassId()
{
return SysId.ToSysId(Filter.VehicleClassId);
}
public SbmVehicle.StatusCat GetFilterStatusCat() public SbmVehicle.StatusCat GetFilterStatusCat()
{ {
return EnumUtil.ParseEnum(Filter.StatusCat, SbmVehicle.StatusCat.NotDeleted); return EnumUtil.ParseEnum(Filter.StatusCat, SbmVehicle.StatusCat.NotDeleted);
@@ -60,20 +61,63 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Vehicles
public String Id { get; set; } public String Id { get; set; }
public String ClassId { get; set; } public String ClassId { get; set; }
public String Registration { get; set; } public String Registration { get; set; }
public String RegistrationPrev { get; set; }
public String Vin { get; set; } public String Vin { get; set; }
public String CapCode { get; set; } public String CapCode { get; set; }
public String KeyNumber { get; set; } public String KeyNumber { get; set; }
public String KeyLocation { get; set; } public String KeyLocation { get; set; }
public String EngineNumber { get; set; } public String EngineNumber { get; set; }
// Specification.
public String EngineCapacity { get; set; } public String EngineCapacity { get; set; }
public String Seats { get; set; } public String Seats { get; set; }
public String Weight { get; set; } public String Weight { get; set; }
public String ManufactureYear { get; set; } public String ManufactureYear { get; set; }
public String BuildOn { get; set; }
public String FirstRegisterOn { get; set; }
public String RegisterOn { get; set; }
public String RegNumberPrev { get; set; }
public String PurchaseOdo { get; set; }
public String TachoCode { get; set; }
public String TachoId { get; set; }
public String LastServiceOdo { get; set; }
public String LastServiceOn { get; set; }
public String NextServiceOdo { get; set; }
public String NextServiceOn { get; set; }
public String MotOn { get; set; }
public String MotNo { get; set; }
public String NextTaxOn { get; set; }
public String LatestOdo { get; set; }
public String LatestOdoOn { get; set; }
// Common.
public String Notes { get; set; } public String Notes { get; set; }
public String StatusCode { get; set; } public String StatusCode { get; set; }
public SaStatus GetStatus() { return SacsSystem.GetStatusForCode(StatusCode); } public SaStatus GetStatus() { return SacsSystem.GetStatusForCode(StatusCode); }
} }
public VehicleData Vehicle { get; } = new VehicleData(); public VehicleData Vehicle { get; } = new VehicleData();
public SysId GetVehicleId()
{
return SysId.ToSysId(Vehicle.Id);
}
public SysId GetVehicleClassId()
{
return SysId.ToSysId(Vehicle.ClassId);
}
public Int16 GetVehicleEngineCapacity() { return StringUtil.ToShort(Vehicle.EngineCapacity); }
public Int16 GetVehicleSeats() { return StringUtil.ToShort(Vehicle.Seats); }
public Int16 GetVehicleWeight() { return StringUtil.ToShort(Vehicle.Weight); }
public Int16 GetVehicleManufactureYear() { return StringUtil.ToShort(Vehicle.ManufactureYear); }
public DateTime GetVehicleBuildOn() { return ParseDateFromForm(Vehicle.BuildOn); }
public DateTime GetVehicleFirstRegisterOn() { return ParseDateFromForm(Vehicle.FirstRegisterOn); }
public DateTime GetVehicleRegisterOn() { return ParseDateFromForm(Vehicle.RegisterOn); }
public Int32 GetVehiclePurchaseOdo() { return StringUtil.ToInt(Vehicle.PurchaseOdo); }
public Int32 GetVehicleLastServiceOdo() { return StringUtil.ToInt(Vehicle.LastServiceOdo); }
public DateTime GetVehicleLastServiceOn() { return ParseDateFromForm(Vehicle.LastServiceOn); }
public Int32 GetVehicleNextServiceOdo() { return StringUtil.ToInt(Vehicle.NextServiceOdo); }
public DateTime GetVehicleNextServiceOn() { return ParseDateFromForm(Vehicle.NextServiceOn); }
public DateTime GetVehicleMotOn() { return ParseDateFromForm(Vehicle.MotOn); }
public DateTime GetVehicleNextTaxOn() { return ParseDateFromForm(Vehicle.NextTaxOn); }
public Int32 GetVehicleLatestOdo() { return StringUtil.ToInt(Vehicle.LatestOdo); }
public DateTime GetVehicleLatestOdoOn() { return ParseDateFromForm(Vehicle.LatestOdoOn); }
//------------------------------------------------------------------- //-------------------------------------------------------------------
// Validation. // Validation.
@@ -88,17 +132,15 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Vehicles
// Vehicle Class. // Vehicle Class.
if (Vehicle.ClassId != null) if (Vehicle.ClassId != null)
{ {
String controlName = "VehicleClass"; String controlName = GetFieldName(ItemField.Class);
if (StringUtil.IsBlank(Vehicle.ClassId)) if (!AssetMgr.VehicleClassExistsById(SysId.ToSysId(Vehicle.ClassId)))
responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]);
else if (!AssetMgr.VehicleClassExistsById(SysId.ToSysId(Vehicle.ClassId)))
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]); responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
} }
// Registration. // Registration.
if (Vehicle.Registration != null) if (Vehicle.Registration != null)
{ {
String controlName = "VehicleRegistration"; String controlName = GetFieldName(ItemField.Registration);
Vehicle.Registration = Vehicle.Registration.ToUpper(); Vehicle.Registration = Vehicle.Registration.ToUpper();
responseData.SetControlValue(controlName, Vehicle.Registration); responseData.SetControlValue(controlName, Vehicle.Registration);
if (StringUtil.IsBlank(Vehicle.Registration)) if (StringUtil.IsBlank(Vehicle.Registration))
@@ -107,20 +149,262 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Vehicles
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicle_RegNumber)]); responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicle_RegNumber)]);
} }
// Previous Registration.
if (Vehicle.RegistrationPrev != null)
{
String controlName = GetFieldName(ItemField.RegistrationPrev);
Vehicle.RegistrationPrev = Vehicle.RegistrationPrev.ToUpper();
responseData.SetControlValue(controlName, Vehicle.RegistrationPrev);
if (StringUtil.IsBlank(Vehicle.RegistrationPrev))
responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]);
else if (StringUtil.GetLength(Vehicle.RegistrationPrev) > GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicle_RegNumberPrev))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicle_RegNumberPrev)]);
}
// Vin. // Vin.
if (Vehicle.Vin != null) if (Vehicle.Vin != null)
{ {
String controlName = "VehicleVin"; String controlName = GetFieldName(ItemField.Vin);
Vehicle.Vin = Vehicle.Vin.ToUpper(); Vehicle.Vin = Vehicle.Vin.ToUpper();
responseData.SetControlValue(controlName, Vehicle.Vin); responseData.SetControlValue(controlName, Vehicle.Vin);
if (StringUtil.GetLength(Vehicle.Vin) > GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicle_VIN)) if (StringUtil.GetLength(Vehicle.Vin) > GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicle_VIN))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicle_VIN)]); responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicle_VIN)]);
} }
// CAP Code.
if (Vehicle.CapCode != null)
{
String controlName = GetFieldName(ItemField.CapCode);
Vehicle.CapCode = Vehicle.CapCode.ToUpper();
responseData.SetControlValue(controlName, Vehicle.CapCode);
if (StringUtil.GetLength(Vehicle.CapCode) > GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicle_CapCode))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicle_CapCode)]);
}
// Key Number.
if (Vehicle.KeyNumber != null)
{
String controlName = GetFieldName(ItemField.KeyNumber);
Vehicle.KeyNumber = Vehicle.KeyNumber.ToUpper();
responseData.SetControlValue(controlName, Vehicle.KeyNumber);
if (StringUtil.GetLength(Vehicle.KeyNumber) > GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicle_KeyNumber))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicle_KeyNumber)]);
}
// Key Location.
if (Vehicle.KeyLocation != null)
{
String controlName = GetFieldName(ItemField.KeyLocation);
Vehicle.KeyLocation = Vehicle.KeyLocation.ToUpper();
responseData.SetControlValue(controlName, Vehicle.KeyLocation);
if (StringUtil.GetLength(Vehicle.KeyLocation) > GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicle_KeyLocation))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicle_KeyLocation)]);
}
// Engine Number.
if (Vehicle.EngineNumber != null)
{
String controlName = GetFieldName(ItemField.EngineNumber);
Vehicle.EngineNumber = Vehicle.EngineNumber.ToUpper();
responseData.SetControlValue(controlName, Vehicle.EngineNumber);
if (StringUtil.GetLength(Vehicle.EngineNumber) > GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicle_EngineNumber))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicle_EngineNumber)]);
}
// Engine Capacity.
if (Vehicle.EngineCapacity != null)
{
String controlName = GetFieldName(ItemField.EngineCapacity);
responseData.SetControlValue(controlName, Vehicle.EngineCapacity);
Int16 engineCapacity = GetVehicleEngineCapacity();
if (!StringUtil.IsEmpty(Vehicle.EngineCapacity) && (!StringUtil.IsNumeric(Vehicle.EngineCapacity) || engineCapacity < 1))
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
}
// Seats.
if (Vehicle.Seats != null)
{
String controlName = GetFieldName(ItemField.Seats);
responseData.SetControlValue(controlName, Vehicle.Seats);
Int16 seats = GetVehicleSeats();
if (!StringUtil.IsEmpty(Vehicle.Seats) && (!StringUtil.IsNumeric(Vehicle.Seats) || seats < 1 || seats > SbmVehicle.MaxSeats))
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
}
// Weight.
if (Vehicle.Weight != null)
{
String controlName = GetFieldName(ItemField.Weight);
responseData.SetControlValue(controlName, Vehicle.Weight);
Int16 weight = GetVehicleWeight();
if (!StringUtil.IsEmpty(Vehicle.Weight) && (!StringUtil.IsNumeric(Vehicle.Weight) || weight < 1 || weight > SbmVehicle.MaxWeight))
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
}
// Manufacture Year.
if (Vehicle.ManufactureYear != null)
{
String controlName = GetFieldName(ItemField.ManufactureYear);
responseData.SetControlValue(controlName, Vehicle.ManufactureYear);
Int16 manufactureYear = GetVehicleManufactureYear();
if (!StringUtil.IsEmpty(Vehicle.ManufactureYear) && (!StringUtil.IsNumeric(Vehicle.ManufactureYear) || manufactureYear < SbmVehicle.MinYear || manufactureYear > SbmVehicle.MaxYear))
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
}
// Build On.
if (Vehicle.BuildOn != null)
{
String controlName = GetFieldName(ItemField.BuildOn);
responseData.SetControlValue(controlName, Vehicle.BuildOn);
DateTime buildOn = GetVehicleBuildOn();
if (!StringUtil.IsEmpty(Vehicle.BuildOn) && (!DateUtil.IsValid(buildOn) || buildOn < SbmVehicle.MinDate || buildOn > SbmVehicle.MaxDate))
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
}
// Register On.
if (Vehicle.RegisterOn != null)
{
String controlName = GetFieldName(ItemField.RegisterOn);
responseData.SetControlValue(controlName, Vehicle.RegisterOn);
DateTime buildOn = GetVehicleRegisterOn();
if (!StringUtil.IsEmpty(Vehicle.RegisterOn) && (!DateUtil.IsValid(buildOn) || buildOn < SbmVehicle.MinDate || buildOn > SbmVehicle.MaxDate))
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
}
// First Register On.
if (Vehicle.FirstRegisterOn != null)
{
String controlName = GetFieldName(ItemField.FirstRegisterOn);
responseData.SetControlValue(controlName, Vehicle.FirstRegisterOn);
DateTime buildOn = GetVehicleFirstRegisterOn();
if (!StringUtil.IsEmpty(Vehicle.FirstRegisterOn) && (!DateUtil.IsValid(buildOn) || buildOn < SbmVehicle.MinDate || buildOn > SbmVehicle.MaxDate))
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
}
// Purchase Odometer.
if (Vehicle.PurchaseOdo != null)
{
String controlName = GetFieldName(ItemField.PurchaseOdo);
responseData.SetControlValue(controlName, Vehicle.PurchaseOdo);
Int32 purchaseOdo = GetVehiclePurchaseOdo();
if (!StringUtil.IsEmpty(Vehicle.PurchaseOdo) && (!StringUtil.IsNumeric(Vehicle.PurchaseOdo) || purchaseOdo < 1 || purchaseOdo > SbmVehicle.MaxOdo))
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
}
// Tacho Code.
if (Vehicle.TachoCode != null)
{
String controlName = GetFieldName(ItemField.TachoCode);
Vehicle.TachoCode = Vehicle.TachoCode.ToUpper();
responseData.SetControlValue(controlName, Vehicle.TachoCode);
if (StringUtil.GetLength(Vehicle.TachoCode) > GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicle_TachoCode))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicle_TachoCode)]);
}
// Tacho Id.
if (Vehicle.TachoId != null)
{
String controlName = GetFieldName(ItemField.TachoId);
Vehicle.TachoId = Vehicle.TachoId.ToUpper();
responseData.SetControlValue(controlName, Vehicle.TachoId);
if (StringUtil.GetLength(Vehicle.TachoId) > GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicle_TachoId))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicle_TachoId)]);
}
// Last Service Odometer.
if (Vehicle.LastServiceOdo != null)
{
String controlName = GetFieldName(ItemField.LastServiceOdo);
responseData.SetControlValue(controlName, Vehicle.LastServiceOdo);
Int32 purchaseOdo = GetVehicleLastServiceOdo();
if (!StringUtil.IsEmpty(Vehicle.LastServiceOdo) && (!StringUtil.IsNumeric(Vehicle.LastServiceOdo) || purchaseOdo < 1 || purchaseOdo > SbmVehicle.MaxOdo))
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
}
// Last Service On.
if (Vehicle.LastServiceOn != null)
{
String controlName = GetFieldName(ItemField.LastServiceOn);
responseData.SetControlValue(controlName, Vehicle.LastServiceOn);
DateTime buildOn = GetVehicleLastServiceOn();
if (!StringUtil.IsEmpty(Vehicle.LastServiceOn) && (!DateUtil.IsValid(buildOn) || buildOn < SbmVehicle.MinDate || buildOn > SbmVehicle.MaxDate))
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
}
// Next Service Odometer.
if (Vehicle.NextServiceOdo != null)
{
String controlName = GetFieldName(ItemField.NextServiceOdo);
responseData.SetControlValue(controlName, Vehicle.NextServiceOdo);
Int32 purchaseOdo = GetVehicleNextServiceOdo();
if (!StringUtil.IsEmpty(Vehicle.NextServiceOdo) && (!StringUtil.IsNumeric(Vehicle.NextServiceOdo) || purchaseOdo < 1 || purchaseOdo > SbmVehicle.MaxOdo))
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
}
// Next Service On.
if (Vehicle.NextServiceOn != null)
{
String controlName = GetFieldName(ItemField.NextServiceOn);
responseData.SetControlValue(controlName, Vehicle.NextServiceOn);
DateTime buildOn = GetVehicleNextServiceOn();
if (!StringUtil.IsEmpty(Vehicle.NextServiceOn) && (!DateUtil.IsValid(buildOn) || buildOn < SbmVehicle.MinDate || buildOn > SbmVehicle.MaxDate))
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
}
// Mot On.
if (Vehicle.MotOn != null)
{
String controlName = GetFieldName(ItemField.MotOn);
responseData.SetControlValue(controlName, Vehicle.MotOn);
DateTime buildOn = GetVehicleMotOn();
if (!StringUtil.IsEmpty(Vehicle.MotOn) && (!DateUtil.IsValid(buildOn) || buildOn < SbmVehicle.MinDate || buildOn > SbmVehicle.MaxDate))
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
}
// MOT Number.
if (Vehicle.MotNo != null)
{
String controlName = GetFieldName(ItemField.MotNo);
Vehicle.MotNo = Vehicle.MotNo.ToUpper();
responseData.SetControlValue(controlName, Vehicle.MotNo);
if (StringUtil.GetLength(Vehicle.MotNo) > GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicle_MotNo))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicle_MotNo)]);
}
// Next Tax On.
if (Vehicle.NextTaxOn != null)
{
String controlName = GetFieldName(ItemField.NextTaxOn);
responseData.SetControlValue(controlName, Vehicle.NextTaxOn);
DateTime buildOn = GetVehicleNextTaxOn();
if (!StringUtil.IsEmpty(Vehicle.NextTaxOn) && (!DateUtil.IsValid(buildOn) || buildOn < SbmVehicle.MinDate || buildOn > SbmVehicle.MaxDate))
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
}
// Next Service Odometer.
if (Vehicle.LatestOdo != null)
{
String controlName = GetFieldName(ItemField.LatestOdo);
responseData.SetControlValue(controlName, Vehicle.LatestOdo);
Int32 purchaseOdo = GetVehicleLatestOdo();
if (!StringUtil.IsEmpty(Vehicle.LatestOdo) && (!StringUtil.IsNumeric(Vehicle.LatestOdo) || purchaseOdo < 1 || purchaseOdo > SbmVehicle.MaxOdo))
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
}
// Next Service On.
if (Vehicle.LatestOdoOn != null)
{
String controlName = GetFieldName(ItemField.LatestOdoOn);
responseData.SetControlValue(controlName, Vehicle.LatestOdoOn);
DateTime buildOn = GetVehicleLatestOdoOn();
if (!StringUtil.IsEmpty(Vehicle.LatestOdoOn) && (!DateUtil.IsValid(buildOn) || buildOn < SbmVehicle.MinDate || buildOn > SbmVehicle.MaxDate))
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
}
// Notes. // Notes.
if (Vehicle.Notes != null) if (Vehicle.Notes != null)
{ {
String controlName = "VehicleNotes"; String controlName = GetFieldName(ItemField.Notes);
responseData.SetControlValue(controlName, Vehicle.Notes); responseData.SetControlValue(controlName, Vehicle.Notes);
if (StringUtil.GetLength(Vehicle.Notes) > GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicle_Notes)) if (StringUtil.GetLength(Vehicle.Notes) > GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicle_Notes))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicle_Notes)]); responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicle_Notes)]);
@@ -129,7 +413,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Vehicles
// Vehicle status. // Vehicle status.
if (Vehicle.StatusCode != null) if (Vehicle.StatusCode != null)
{ {
String controlName = "VehicleStatus"; String controlName = GetFieldName(ItemField.Status);
if (StringUtil.IsBlank(Vehicle.StatusCode)) if (StringUtil.IsBlank(Vehicle.StatusCode))
responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]); responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]);
else if (!SbmVehicle.ValidStatuses.Contains(Vehicle.GetStatus())) else if (!SbmVehicle.ValidStatuses.Contains(Vehicle.GetStatus()))
@@ -0,0 +1,215 @@
@* Assets - Asset *@
@model Model_Asset
@inject SbmLocaliser Localiser
@{
ViewData["Title"] = "Assets";
Model.AdditionalFiles_JS.Add("js/sbm-asset.js");
}
<div class="sbm-panel Assets fullheight">
<script type="text/javascript">
sbm.dlg.title.createItem = '@(Localiser.GetJavascriptText("caption.asset.create"))';
sbm.dlg.title.updateItem = '@(Localiser.GetJavascriptText("caption.asset.update"))';
sbm.lbl.selectCategory = '@(Localiser.GetJavascriptText("caption.category.select"))';
</script>
<div class="sbm-panel-data sbm-flex">
@* Filter form - wrap header to include paging controls. *@
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmAssetFilter", @class = "sbm-form", @onSubmit = "return false;" }))
{
<div class="sbm-panel-header">
<div class="row">
<div class="fixed">
<partial name="~/Views/Common/ResultsPaging.cshtml" />
</div>
<div class="col center"><div class="sbm-panel-caption">@Localiser["label.assets"]</div></div>
<div class="fixed">
@* Burger menu *@
<ul class="nav navbar-nav navbar-dark navbar-right sbm-burger">
<li class="dropdown-toggle caret-off">
<a href="#" class="dropdown" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><span class="navbar-toggler-icon"></span></a>
<ul class="dropdown-menu dropdown-menu-right sbm-dropdown-menu">@* Menu items will be inserted here. *@</ul>
</li>
</ul>
</div>
</div>
</div>
@* Filter Panel *@
<div class="sbm-panel-filter">
<div class="row pb4">
<div class="col-sm-5 sbm-label text-left text-sm-right">@Localiser["label.search"]</div>
<div class="col-sm-7">
@Html.TextBoxFor(model => model.Filter.Search, new { @type = "search", @id = "", @class = "FilterSearch", @maxlength = "32" })
</div>
</div>
</div>
}
<div class="sbm-panel-item-table sbm-flex">
<table class="sbm-item-list">
<thead>
<tr>
<th class="pl-2">@Localiser["label.category"]</th>
<th class="">@Localiser["label.serial"]</th>
<th class="">@Localiser["label.description"]</th>
<th class="center">@Localiser["label.status"]</th>
<th class="right" style="width:2%;"></th>
</tr>
<tr><td colspan="6"><div class="sbm-panel-messages"></div></td></tr>
</thead>
<tbody></tbody>
</table>
</div>
@* Element templates *@
<div class="sbm-panel-item-template">
@* Filter Burger option template - ul is ignored *@
<ul class="sbm-dropdown-menu AssetFilter">
<li class="sbm-dropdown-item sbm-action"><div class="sbm-label">XXX</div></li>
</ul>
@* Asset row template - table is ignored. *@
<table class="">
<tr class="sbm-row-item Asset">
<td><div class="AssetCategory pl-1"></div></td>
<td><div class="AssetSerial"></div></td>
<td><div class="AssetDescription"></div></td>
<td><div class="AssetStatusDesc center"></div></td>
<td>
<div class="right">
@* Burger menu *@
<ul class="nav navbar-nav navbar-light navbar-right sbm-burger">
<li class="dropdown-toggle caret-off">
<a href="#" class="dropdown" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><span class="sbm-ellipsis-dot"></span><span class="sbm-ellipsis-dot"></span><span class="sbm-ellipsis-dot"></span></a>
<ul class="dropdown-menu dropdown-menu-right sbm-dropdown-menu">@* Menu items will be inserted here. *@</ul>
</li>
</ul>
</div>
</td>
</tr>
</table>
@* Item Burger option template - ul is ignored *@
<ul class="sbm-dropdown-menu Asset">
<li class="sbm-dropdown-item sbm-action"><div class="sbm-label">XXX</div></li>
</ul>
</div>
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmAssetId", @onSubmit = "return false;" }))
{
@Html.HiddenFor(model => model.Asset.Id, new { @id = "", @class = "AssetId" })
}
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmCategories", @onSubmit = "return false;" }))
{
}
<div id="dlgAsset" class="sbm-dialog">
<div class="spacer2"></div>
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmAsset", @class = "sbm-form", @onSubmit = "return false;" }))
{
@Html.HiddenFor(model => model.Asset.Exists, new { @id = "", @class = "AssetExists" })
@Html.HiddenFor(model => model.Asset.Id, new { @id = "", @class = "AssetId" })
@* Type *@
<div class="sbm-form-control AssetCategory">
<div class="row">
<div class="col-sm-3">
<div class="sbm-label">
<label for=""><span>@Localiser["label.category"]</span><span class="required">&nbsp;*</span></label>
</div>
</div>
<div class="col-sm-9">
<div class="sbm-control row">
<div class="col">
@Html.HiddenFor(model => model.Asset.CategoryId, new { @id = "", @class = "AssetCategoryId" })
<input type="text" class="AssetCategory sbm-input" readonly="readonly" />
</div>
<div class="fixed">
<div class="sbm-action AssetCategorySearch"><img src="~/img/action/search24.png" alt="" title="" /></div>
</div>
</div>
<div class="sbm-message"></div>
</div>
</div>
</div>
@* Serial Number*@
<div class="sbm-form-control AssetSerialNumber">
<div class="row">
<div class="col-sm-3">
<div class="sbm-label">
<label for="ifAssetSerialNumber"><span>@Localiser["label.serial"]</span><span class="required">&nbsp;*</span></label>
</div>
</div>
<div class="col-sm-9">
<div class="sbm-control">
@Html.TextBoxFor(model => model.Asset.SerialNumber, new { @id = "ifAssetSerialNumber", @class = "AssetSerialNumber sbm-input upper", @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.SaAsset_SerialNumber) })
</div>
<div class="sbm-message"></div>
</div>
</div>
</div>
@* Description *@
<div class="sbm-form-control AssetDescription">
<div class="row">
<div class="col-sm-3">
<div class="sbm-label">
<label for="ifAssetDescription"><span>@Localiser["label.description"]</span></label>
</div>
</div>
<div class="col-sm-9">
<div class="sbm-control">
@Html.TextBoxFor(model => model.Asset.DescBrief, new { @id = "ifAssetDescription", @class = "AssetDescription sbm-input", @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.SaAsset_DescBrief) })
</div>
<div class="sbm-message"></div>
</div>
</div>
</div>
@* Status *@
<div class="sbm-form-control AssetStatus">
<div class="row">
<div class="col-sm-3">
<div class="sbm-label">
<label for="cbAssetStatus"><span>@Localiser["label.status"]</span><span class="required">&nbsp;*</span></label>
</div>
</div>
<div class="col-sm-9">
<div class="sbm-control">
<select id="cbAssetStatus" class="sbm-select AssetStatus" name="Asset.StatusCode"></select>
</div>
<div class="sbm-message"></div>
</div>
</div>
</div>
@* Notes *@
<div class="sbm-form-control AssetNotes">
<div class="row">
<div class="col-sm-3">
<div class="sbm-label">
<label for="ifAssetNotes"><span>@Localiser["label.notes"]</span></label>
</div>
</div>
<div class="col-sm">
<div class="sbm-control">
@Html.TextAreaFor(model => model.Asset.Notes, new { @id = "ifAssetNotes", @class = "AssetNotes sbm-textarea", @rows = 3, @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.SaAsset_Notes) })
</div>
<div class="sbm-message"></div>
</div>
</div>
</div>
}
<div class="spacer2"></div>
</div>
@* Select Item dialog and script *@
<partial name="~/Views/Common/SelectItem.cshtml" />
</div>
</div>
@@ -1,215 +1,8 @@
@* Assets - Asset *@ @* Vehicles - Vehicle *@
@model Model_Asset @model Model_Vehicle
@inject SbmLocaliser Localiser @inject SbmLocaliser Localiser
@{ @{
ViewData["Title"] = "Assets"; ViewData["Title"] = "Vehicles";
Model.AdditionalFiles_JS.Add("js/sbm-asset.js");
} }
<div class="sbm-panel Assets fullheight"> <partial name="Panel-VehicleMaintain.cshtml" />
<script type="text/javascript">
sbm.dlg.title.createItem = '@(Localiser.GetJavascriptText("caption.asset.create"))';
sbm.dlg.title.updateItem = '@(Localiser.GetJavascriptText("caption.asset.update"))';
sbm.lbl.selectCategory = '@(Localiser.GetJavascriptText("caption.category.select"))';
</script>
<div class="sbm-panel-data sbm-flex">
@* Filter form - wrap header to include paging controls. *@
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmAssetFilter", @class = "sbm-form", @onSubmit = "return false;" }))
{
<div class="sbm-panel-header">
<div class="row">
<div class="fixed">
<partial name="~/Views/Common/ResultsPaging.cshtml" />
</div>
<div class="col center"><div class="sbm-panel-caption">@Localiser["label.assets"]</div></div>
<div class="fixed">
@* Burger menu *@
<ul class="nav navbar-nav navbar-dark navbar-right sbm-burger">
<li class="dropdown-toggle caret-off">
<a href="#" class="dropdown" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><span class="navbar-toggler-icon"></span></a>
<ul class="dropdown-menu dropdown-menu-right sbm-dropdown-menu">@* Menu items will be inserted here. *@</ul>
</li>
</ul>
</div>
</div>
</div>
@* Filter Panel *@
<div class="sbm-panel-filter">
<div class="row pb4">
<div class="col-sm-5 sbm-label text-left text-sm-right">@Localiser["label.search"]</div>
<div class="col-sm-7">
@Html.TextBoxFor(model => model.Filter.Search, new { @type = "search", @id = "", @class = "FilterSearch", @maxlength = "32" })
</div>
</div>
</div>
}
<div class="sbm-panel-item-table sbm-flex">
<table class="sbm-item-list">
<thead>
<tr>
<th class="pl-2">@Localiser["label.category"]</th>
<th class="">@Localiser["label.serial"]</th>
<th class="">@Localiser["label.description"]</th>
<th class="center">@Localiser["label.status"]</th>
<th class="right" style="width:2%;"></th>
</tr>
<tr><td colspan="6"><div class="sbm-panel-messages"></div></td></tr>
</thead>
<tbody></tbody>
</table>
</div>
@* Element templates *@
<div class="sbm-panel-item-template">
@* Filter Burger option template - ul is ignored *@
<ul class="sbm-dropdown-menu AssetFilter">
<li class="sbm-dropdown-item sbm-action"><div class="sbm-label">XXX</div></li>
</ul>
@* Asset row template - table is ignored. *@
<table class="">
<tr class="sbm-row-item Asset">
<td><div class="AssetCategory pl-1"></div></td>
<td><div class="AssetSerial"></div></td>
<td><div class="AssetDescription"></div></td>
<td><div class="AssetStatusDesc center"></div></td>
<td>
<div class="right">
@* Burger menu *@
<ul class="nav navbar-nav navbar-light navbar-right sbm-burger">
<li class="dropdown-toggle caret-off">
<a href="#" class="dropdown" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><span class="sbm-ellipsis-dot"></span><span class="sbm-ellipsis-dot"></span><span class="sbm-ellipsis-dot"></span></a>
<ul class="dropdown-menu dropdown-menu-right sbm-dropdown-menu">@* Menu items will be inserted here. *@</ul>
</li>
</ul>
</div>
</td>
</tr>
</table>
@* Item Burger option template - ul is ignored *@
<ul class="sbm-dropdown-menu Asset">
<li class="sbm-dropdown-item sbm-action"><div class="sbm-label">XXX</div></li>
</ul>
</div>
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmAssetId", @onSubmit = "return false;" }))
{
@Html.HiddenFor(model => model.Asset.Id, new { @id = "", @class = "AssetId" })
}
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmCategories", @onSubmit = "return false;" }))
{
}
<div id="dlgAsset" class="sbm-dialog">
<div class="spacer2"></div>
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmAsset", @class = "sbm-form", @onSubmit = "return false;" }))
{
@Html.HiddenFor(model => model.Asset.Exists, new { @id = "", @class = "AssetExists" })
@Html.HiddenFor(model => model.Asset.Id, new { @id = "", @class = "AssetId" })
@* Type *@
<div class="sbm-form-control AssetCategory">
<div class="row">
<div class="col-sm-3">
<div class="sbm-label">
<label for=""><span>@Localiser["label.category"]</span><span class="required">&nbsp;*</span></label>
</div>
</div>
<div class="col-sm-9">
<div class="sbm-control row">
<div class="col">
@Html.HiddenFor(model => model.Asset.CategoryId, new { @id = "", @class = "AssetCategoryId" })
<input type="text" class="AssetCategory sbm-input" readonly="readonly" />
</div>
<div class="fixed">
<div class="sbm-action AssetCategorySearch"><img src="~/img/action/search24.png" alt="" title="" /></div>
</div>
</div>
<div class="sbm-message"></div>
</div>
</div>
</div>
@* Serial Number*@
<div class="sbm-form-control AssetSerialNumber">
<div class="row">
<div class="col-sm-3">
<div class="sbm-label">
<label for="ifAssetSerialNumber"><span>@Localiser["label.serial"]</span><span class="required">&nbsp;*</span></label>
</div>
</div>
<div class="col-sm-9">
<div class="sbm-control">
@Html.TextBoxFor(model => model.Asset.SerialNumber, new { @id = "ifAssetSerialNumber", @class = "AssetSerialNumber sbm-input upper", @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.SaAsset_SerialNumber) })
</div>
<div class="sbm-message"></div>
</div>
</div>
</div>
@* Description *@
<div class="sbm-form-control AssetDescription">
<div class="row">
<div class="col-sm-3">
<div class="sbm-label">
<label for="ifAssetDescription"><span>@Localiser["label.description"]</span></label>
</div>
</div>
<div class="col-sm-9">
<div class="sbm-control">
@Html.TextBoxFor(model => model.Asset.DescBrief, new { @id = "ifAssetDescription", @class = "AssetDescription sbm-input", @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.SaAsset_DescBrief) })
</div>
<div class="sbm-message"></div>
</div>
</div>
</div>
@* Status *@
<div class="sbm-form-control AssetStatus">
<div class="row">
<div class="col-sm-3">
<div class="sbm-label">
<label for="cbAssetStatus"><span>@Localiser["label.status"]</span><span class="required">&nbsp;*</span></label>
</div>
</div>
<div class="col-sm-9">
<div class="sbm-control">
<select id="cbAssetStatus" class="sbm-select AssetStatus" name="Asset.StatusCode"></select>
</div>
<div class="sbm-message"></div>
</div>
</div>
</div>
@* Notes *@
<div class="sbm-form-control AssetNotes">
<div class="row">
<div class="col-sm-3">
<div class="sbm-label">
<label for="ifAssetNotes"><span>@Localiser["label.notes"]</span></label>
</div>
</div>
<div class="col-sm">
<div class="sbm-control">
@Html.TextAreaFor(model => model.Asset.Notes, new { @id = "ifAssetNotes", @class = "AssetNotes sbm-textarea", @rows = 3, @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.SaAsset_Notes) })
</div>
<div class="sbm-message"></div>
</div>
</div>
</div>
}
<div class="spacer2"></div>
</div>
@* Select Item dialog and script *@
<partial name="~/Views/Common/SelectItem.cshtml" />
</div>
</div>
@@ -0,0 +1,76 @@
@* Vehicle - Dialog Panel *@
@* View is decoupled from Vehicle model as it may be included in other views, eg. Vehicles. *@
@model SbmModel_Portal
@inject SbmLocaliser Localiser
@{
// Ensure view is only included once in page.
if (!Model.RegisterView(Html.ViewContext)) return;
Model.AdditionalFiles_JS.Add("js/sbm-veh.js");
string NamePrefix = Model_Vehicle.FieldNamePrefix;
}
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmVehicleId", @onSubmit = "return false;" }))
{
@Html.Hidden("Vehicle.Id", "", new { @id = "", @class = $"{Model_Vehicle.GetFieldName(Model_Vehicle.ItemField.Id)}" })
}
<div id="dlgVehicle" class="sbm-dialog">
<div class="spacer2"></div>
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmVehicle", @class = "sbm-form", @onSubmit = "return false;" }))
{
@Html.Hidden("Vehicle.Exists", "", new { @id = "", @class = $"{Model_Vehicle.GetFieldName(Model_Vehicle.ItemField.Exists)} sbm-input sbm-auto-val" })
@Html.Hidden("Vehicle.Id", "", new { @id = "", @class = $"{Model_Vehicle.GetFieldName(Model_Vehicle.ItemField.Id)} sbm-input sbm-auto-val" })
@* Registration *@
<sbm-form-control label="@Localiser["label.registration"]" required="true"
name-prefix="@NamePrefix" control-name-suffix="Registration"
control-type="input" binding-name="Vehicle.Registration" max-length="@Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicle_RegNumber)">
</sbm-form-control>
@* VIN *@
<sbm-form-control label="@Localiser["label.vin"]" required="true"
name-prefix="@NamePrefix" control-name-suffix="Vin"
control-type="input" binding-name="Vehicle.Vin" max-length="@Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicle_VIN)">
</sbm-form-control>
@* Class *@
<div class="sbm-form-control @Model_Vehicle.GetFieldName(Model_Vehicle.ItemField.Class)">
<div class="row">
<div class="col-sm-3">
<div class="sbm-label">
<label for=""><span>@Localiser["label.class"]</span><span class="required">&nbsp;*</span></label>
</div>
</div>
<div class="col-sm-9">
<div class="sbm-control row">
<div class="col">
@Html.Hidden("Vehicle.ClassId", "", new { @id = "", @class = $"{Model_Vehicle.GetFieldName(Model_Vehicle.ItemField.ClassId)} sbm-input sbm-auto-val" })
<input type="text" class="@Model_Vehicle.GetFieldName(Model_Vehicle.ItemField.Class) sbm-input sbm-auto-val" autocomplete="off" readonly="readonly" />
</div>
<div class="fixed">
<div class="sbm-action VehicleClassSearch"><img src="~/img/action/search24.png" alt="" title="" /></div>
</div>
</div>
<div class="sbm-message"></div>
</div>
</div>
</div>
@* Status *@
<sbm-form-control label="@Localiser["label.status"]" required="true"
name-prefix="@NamePrefix" form-control-name-suffix="Status" control-name-suffix="StatusCode"
control-type="select" binding-name="Vehicle.StatusCode">
</sbm-form-control>
@* Notes *@
<sbm-form-control label="@Localiser["label.notes"]"
name-prefix="@NamePrefix" control-name-suffix="Notes"
control-type="input" binding-name="Vehicle.Notes"
input-type="textarea" max-length="@Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.SaVehicle_Notes)">
</sbm-form-control>
}
<div class="spacer2"></div>
</div>
@* Select Item dialog and script *@
<partial name="~/Views/Common/SelectItem.cshtml" />
@@ -0,0 +1,67 @@
@* Vehicle - Maintain Panel *@
@* View is decoupled from Vehicle model as it may be included in other views, eg. Vehicles. *@
@model SbmModel_Portal
@inject SbmLocaliser Localiser
@{
/* NB Can potentially appear more than once on a page. */
}
<div class="sbm-panel-item-table sbm-flex">
<table class="sbm-item-list">
<thead>
<tr>
<th class="@Model_Vehicle.GetFieldName(Model_Vehicle.ItemField.Registration) width15pc">@Localiser["label.registration"]</th>
<th class="@Model_Vehicle.GetFieldName(Model_Vehicle.ItemField.Make) width10pc">@Localiser["label.make"]</th>
<th class="@Model_Vehicle.GetFieldName(Model_Vehicle.ItemField.Model) width10pc">@Localiser["label.model"]</th>
<th class="@Model_Vehicle.GetFieldName(Model_Vehicle.ItemField.Class) width15pc">@Localiser["label.class"]</th>
<th class="@Model_Vehicle.GetFieldName(Model_Vehicle.ItemField.EventCount) width5pc">@Localiser["label.events"]</th>
<th class="@Model_Vehicle.GetFieldName(Model_Vehicle.ItemField.FeatureCount) width5pc">@Localiser["label.features"]</th>
<th class="@Model_Vehicle.GetFieldName(Model_Vehicle.ItemField.HpiCheckCount) width5pc">@Localiser["label.hpi.check.count"]</th>
<th class="@Model_Vehicle.GetFieldName(Model_Vehicle.ItemField.HpiAlert) width5pc">@Localiser["label.hpi.alert"]</th>
<th class="@Model_Vehicle.GetFieldName(Model_Vehicle.ItemField.Notes) width25pc d-none d-md-table-cell">@Localiser["label.notes"]</th>
<th class="@Model_Vehicle.GetFieldName(Model_Vehicle.ItemField.Status) width10pc center">@Localiser["label.status"]</th>
<th class="@Model_Vehicle.GetFieldName(Model_Vehicle.ItemField.Actions) width2pc right"></th>
</tr>
<tr><td colspan="6"><div class="sbm-panel-messages"></div></td></tr>
</thead>
<tbody></tbody>
</table>
</div>
@* Element templates *@
<div class="sbm-panel-item-template">
@* Filter Burger option template - ul is ignored *@
<ul class="sbm-dropdown-menu VehicleFilter">
<li class="sbm-dropdown-item sbm-action"><div class="sbm-label">XXX</div></li>
</ul>
@* Vehicle row template - table is ignored. *@
<table class="">
<tr class="sbm-row-item Vehicle">
<td class="@Model_Vehicle.GetFieldName(Model_Vehicle.ItemField.Registration)"></td>
<td class="@Model_Vehicle.GetFieldName(Model_Vehicle.ItemField.Make)"></td>
<td class="@Model_Vehicle.GetFieldName(Model_Vehicle.ItemField.Model)"></td>
<td class="@Model_Vehicle.GetFieldName(Model_Vehicle.ItemField.Class)"></td>
<td class="@Model_Vehicle.GetFieldName(Model_Vehicle.ItemField.EventCount)"></td>
<td class="@Model_Vehicle.GetFieldName(Model_Vehicle.ItemField.FeatureCount)"></td>
<td class="@Model_Vehicle.GetFieldName(Model_Vehicle.ItemField.HpiCheckCount)"></td>
<td class="@Model_Vehicle.GetFieldName(Model_Vehicle.ItemField.HpiAlert)"></td>
<td class="@Model_Vehicle.GetFieldName(Model_Vehicle.ItemField.Notes) d-none d-md-table-cell"></td>
<td class="@Model_Vehicle.GetFieldName(Model_Vehicle.ItemField.Status)"></td>
<td class="@Model_Vehicle.GetFieldName(Model_Vehicle.ItemField.Actions)">
<div class="right">
@* Burger menu *@
<ul class="nav navbar-nav navbar-light navbar-right sbm-burger">
<li class="dropdown-toggle caret-off">
<a href="#" class="dropdown" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><span class="sbm-ellipsis-dot"></span><span class="sbm-ellipsis-dot"></span><span class="sbm-ellipsis-dot"></span></a>
<ul class="dropdown-menu dropdown-menu-right sbm-dropdown-menu">@* Menu items will be inserted here. *@</ul>
</li>
</ul>
</div>
</td>
</tr>
</table>
@* Item Burger option template - ul is ignored *@
<ul class="sbm-dropdown-menu Vehicle">
<li class="sbm-dropdown-item sbm-action"><div class="sbm-label">XXX</div></li>
</ul>
</div>
@@ -0,0 +1,79 @@
@* Vehicle - Maintain Panel *@
@* View is decoupled from Vehicle model as it may be included in other views, eg. Assets. *@
@model SbmModel_Portal
@inject SbmLocaliser Localiser
@{
// Ensure view is only included once in page.
if (!Model.RegisterView(Html.ViewContext)) return;
Model.AdditionalFiles_JS.Add("js/sbm-veh.js");
}
<div class="sbm-panel Vehicles fullheight">
<script type="text/javascript">
sbm.dlg.title.createItem = '@(Localiser.GetJavascriptText("caption.vehicle.create"))';
sbm.dlg.title.updateItem = '@(Localiser.GetJavascriptText("caption.vehicle.update"))';
sbm.lbl.selectClass = '@(Localiser.GetJavascriptText("caption.class.select"))';
</script>
<div class="sbm-panel-data sbm-flex">
@* Filter form - wrap header to include paging controls. *@
@using (@Html.BeginForm(FormMethod.Post, new { @id = "", @class = "frmVehicleFilter sbm-form", @onSubmit = "return false;" }))
{
@Html.Hidden("Filter.Mode", Model_Vehicle.ViewMode.Maintain, new { @id = "" })
<div class="sbm-panel-header">
<div class="row">
<div class="fixed">
<partial name="~/Views/Common/ResultsPaging.cshtml" />
</div>
<div class="col center"><div class="sbm-panel-caption">@Localiser["label.vehicles"]</div></div>
<div class="fixed">
@* Burger menu *@
<ul class="nav navbar-nav navbar-dark navbar-right sbm-burger">
<li class="dropdown-toggle caret-off">
<a href="#" class="dropdown" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><span class="navbar-toggler-icon"></span></a>
<ul class="dropdown-menu dropdown-menu-right sbm-dropdown-menu">@* Menu items will be inserted here. *@</ul>
</li>
</ul>
</div>
</div>
</div>
@* Filter Panel *@
<div class="sbm-panel-filter">
<div class="row">
<div class="col-sm-4 row pb4">
<div class="col-5 sbm-label text-right">@Localiser["label.class"]</div>
<div class="col-7 row">
<div class="col">
@Html.Hidden("Filter.VehicleClassId", "", new { @id = "", @class = "FilterVehicleClassId" })
<input type="text" id="" class="FilterVehicleClass fullwidth" readonly="readonly" />
</div>
<div class="fixed">
<div class="sbm-action VehicleClassSearch"><img src="~/img/action/search24.png" alt="" title="" /></div>
</div>
<div class="fixed">
<div class="sbm-action VehicleClassClear pt-1 pl-2"><img src="~/img/action/delete16.png" alt="" title="" /></div>
</div>
</div>
</div>
<div class="col-sm-4 row pb4">
<div class="col-5 sbm-label text-right">@Localiser["label.search"]</div>
<div class="col-7">
@Html.TextBox("Filter.Search", "", new { @type = "search", @id = "", @class = "FilterSearch", @maxlength = "32" })
</div>
</div>
</div>
</div>
}
<partial name="Panel-VehicleList.cshtml" />
</div>
</div>
<partial name="Panel-VehicleDialog.cshtml" />
<partial name="~/Views/Vehicles/VehicleClass/Panel-VehicleClassSelect.cshtml" />
@@ -0,0 +1,43 @@
@* Vehicle - Maintain Panel *@
@* View is decoupled from Vehicle model as it may be included in other views, eg. Vehicles. *@
@model SbmModel_Portal
@inject SbmLocaliser Localiser
@{
// Ensure view is only included once in page.
if (!Model.RegisterView(Html.ViewContext)) return;
Model.AdditionalFiles_JS.Add("js/sbm-veh.js");
}
<script type="text/javascript">
</script>
<div id="dlgVehicleSelect" class="sbm-dialog sbm-flex sbm-no-padding" title="@Localiser["caption.contact.select"]">
@using (@Html.BeginForm(FormMethod.Post, new { @id = "", @class = "frmVehicleFilter sbm-form", @onSubmit = "return false;" }))
{
@Html.Hidden("Filter.Mode", Model_Vehicle.ViewMode.Search, new { @id = "" })
@* Filter Panel *@
<div class="sbm-panel-filter">
<div class="row">
<div class="col-sm-4 row pb4">
@* Vehicle type *@
<div class="col-4 col-sm-4 sbm-label text-left text-sm-right">@Localiser["label.type"]</div>
<div class="col-8 col-sm-8">
@Html.DropDownList("Filter.VehicleType", Model.GetVehicleTypeCodesForFilterDropdown(), Localiser["label.any"], new { @id = "", @class = "FilterVehicleType sbm-select" })
</div>
</div>
<div class="col-sm-4 row pb4">
@* Vehicle filter - name etc. *@
<div class="col-4 col-sm-4 sbm-label text-left text-sm-right">@Localiser["label.search"]</div>
<div class="col-8 col-sm-8">
@Html.TextBox("Filter.Search", "", new { @type = "search", @id = "", @class = "FilterSearch sbm-input", @maxlength = "32" })
</div>
</div>
</div>
</div>
}
<partial name="Panel-VehicleList.cshtml" />
</div>
@@ -0,0 +1,319 @@
/*
* SBM - Portal - Vehicles - Vehicle.
*/
(function (win, doc, undef)
{
"use strict";
let ve = sbm.vehicles = { env: {} };
//--------------------------------------------------------------
ve.refreshConfig = function (env, delay)
{
env.ajax.refreshConfig = env.ajax.refreshConfig || { url: sbm.url.base + 'Vehicles/Vehicle/Ajax/Config', formSel: env.$frm.filter, callbackFn: function (response) { ve.doRefreshConfig(env, response); } };
sbm.doAjaxRequest(env.ajax.refreshConfig, delay || 50);
}
ve.doRefreshConfig = function (env, response)
{
//sbm.debug('doRefreshConfig', env, response);
if (!response.success) return;
Object.assign(env.data, response.data);
}
//--------------------------------------------------------------
ve.refreshResults = function (env, delay)
{
if (!env.data.awaitingRefreshResponse)
{
$('.sbm-burger', env.$pnl.hdr).invisible();
env.$pnl.table.find('tbody tr').remove();
env.$pnl.msgs.hide().empty().append($('<div class="sbm-message">' + sbm.msg.dataQuerying + '</div>')).fadeIn(200);
}
env.ajax.vehicles = env.ajax.vehicles || { url: sbm.url.base + 'Vehicles/Vehicle/Ajax/GetVehicles', formSel: env.$frm.filter, $msgs: env.$pnl.msgs, callbackFn: function (response) { ve.doRefreshResults(env, response); } };
sbm.doAjaxRequest(env.ajax.vehicles, delay || 50);
env.data.awaitingRefreshResponse = true;
}
ve.doRefreshResults = function (env, response)
{
//sbm.debug('doRefreshResults', env, response);
delete env.data.awaitingRefreshResponse;
env.$pnl.msgs.hide().empty();
let $table = $('table', env.$pnl.table).find('tbody tr').remove().end();
sbm.refreshPaging(response, env.$frm.filter, function () { ve.refreshResults(env); });
if (!response.success) return;
ve.doRefreshConfig(env, response);
env.mode = response.mode;
// Menu.
if (env.$pnl.bgr.length)
{
env.$pnl.bgr.invisible();
env.$pnl.mnu.empty();
env.$pnl.mnu.append(ve.getFilterMenuOption(env, sbm.lbl.refresh, function () { ve.refreshResults(env); }, 'sbm-refresh'));
env.$pnl.mnu.append(ve.getFilterMenuOption(env, sbm.lbl.create, function () { ve.createItem(env, env.data.cfgItemNew); }, 'sbm-add'));
env.$pnl.bgr.toggleVisibility(!!$('.sbm-dropdown-item', env.$pnl.mnu).length);
}
// Items.
var items = response.vehicles || [];
if (!items.length)
return env.$pnl.msgs.append($('<div class="sbm-message">' + sbm.msg.dataNoneFound + '</div>')).fadeIn(500);
for (const item of items)
$table.append(ve.populateItem(env, ve.getItemTemplate(env), item));
sbm.configureItemTable(env.data.cfgList, $table);
}
ve.populateItem = function (env, $item, item)
{
//sbm.debug('populateItem', env, $item, item)
if (!item) return $item;
$item.prop('id', ve.getItemId(item));
let cfg = env.data.cfgList;
if (cfg) sbm.populateItemValues(cfg, $item, item.field.value);
let prefix = cfg.column.prefix;
$('.' + prefix + 'Status', $item).text(item.statusDesc).removeStatusClasses().addClass('sbm-status-' + item.statusCode.toLowerCase());
if (!env.mode.search)
{
// Actions.
let fnUpd = function () { ve.updateItem(env, item.id) };
var $bgr = $('.sbm-burger', $item).invisible();
let $mnu = $('ul.sbm-dropdown-menu', $bgr).empty();
if (!item.deleted)
{
$mnu.append(ve.getItemMenuOption(env, sbm.lbl.edit, fnUpd, 'sbm-edit'));
$('.' + prefix + 'SerialNumber', $item).off('click').on('click', fnUpd).addClass('sbm-action-text');
$item.off('dblclick').on('dblclick', fnUpd);
}
$bgr.toggleVisibility(!!$('.sbm-dropdown-item', $mnu).length);
}
else
{
$item.off('click').on('click', function () { ve.selectItemRow(env, $item, item); });
$item.off('dblclick').on('dblclick', function () { ve.selectItem(env); });
}
return $item;
}
ve.getItemId = function (item)
{
return 'Ast_' + (item || {}).id;
}
//--------------------------------------------------------------
ve.getFilterDropdownTemplate = function (env)
{
return $('.sbm-dropdown-menu.VehicleFilter li.sbm-dropdown-item', env.$pnl.tmpls).clone();
}
ve.getItemTemplate = function (env)
{
return $('table tr.sbm-row-item.Vehicle', env.$pnl.tmpls).clone();
}
ve.getItemDropdownTemplate = function (env)
{
return $('.sbm-dropdown-menu.Vehicle li.sbm-dropdown-item', env.$pnl.tmpls).clone();
}
//--------------------------------------------------------------
ve.getFilterMenuOption = function (env, lbl, fn, cls)
{
return ve.getMenuOption(ve.getFilterDropdownTemplate(env), lbl, fn, cls);
}
ve.getItemMenuOption = function (env, lbl, fn, cls)
{
return ve.getMenuOption(ve.getItemDropdownTemplate(env), lbl, fn, cls);
}
ve.getMenuOption = function ($opt, lbl, fn, cls)
{
return $opt.find('div.sbm-label').text(lbl).end().on('click', fn).addClass(cls);
}
//--------------------------------------------------------------
ve.createItem = function (env, cfg)
{
ve.clearItem(env, cfg);
sbm.populateSelectCodeDesc('#cbVehicleStatus', env.data.statusesCreate);
$('#cbVehicleStatus').val(env.data.statusCodeDefault).prop('readonly', false);
ve.openItemDlg(env, cfg, sbm.dlg.title.createItem);
}
ve.clearItem = function (env, cfg)
{
sbm.clearItemForm(env.$frm.item);
sbm.populateSelectCodeDesc(env.$frm.item.find('#cbVehicleStatus'), env.data.statusesCreate);
}
ve.openItemDlg = function (env, cfg, title)
{
let $dlg = env.$dlg.item;
let $frm = env.$frm.item;
sbm.configureItemControls(cfg, $frm);
env.$frm.item.off('dblclick').on('dblclick', '.sbm-input.VehicleClass', function () { ve.selectItemVehicleClass(env); }).off('click').on('click', '.sbm-action.VehicleClassSearch', function () { ve.selectItemVehicleClass(env); });
var btns = {};
btns[sbm.lbl.ok] = function () { ve.storeItem(env); };
btns[sbm.lbl.cancel] = function () { delete env.prmEdit; $(this).dialog('close'); };
$dlg.dialog('option', 'buttons', btns);
if (title) $dlg.dialog('option', 'title', title);
sbm.openDialog($dlg, 600, 600);
}
//--------------------------------------------------------------
ve.updateItem = function (env, id)
{
let $frm = env.$frm.itemId;
$('.VehicleId', $frm).val(id);
env.ajax.updateItem = env.ajax.updateItem || { url: sbm.url.base + 'Vehicles/Vehicle/Ajax/GetItem', formSel: $frm, callbackFn: function (response) { ve.onUpdateItem(env, response); } };
sbm.doAjaxRequest(env.ajax.updateItem, 50);
}
ve.onUpdateItem = function (env, response)
{
//sbm.debug('onUpdateItem', response);
if (!response.success) return;
let cfg = response.config || {};
ve.clearItem(env, cfg);
let item = response.vehicle;
let $frm = env.$frm.item;
sbm.populateFormValues(cfg, $frm, item.field.value);
let $ctrls = $('.sbm-input,.sbm-textarea,.sbm-select', $frm);
sbm.selectOrAdd($ctrls.filter('.VehicleStatus'), item.statusCode, item.field.value.Status);
ve.openItemDlg(env, cfg, sbm.dlg.title.updateItem);
}
//--------------------------------------------------------------
ve.selectFilterVehicleClass = function (env)
{
sbm.fn.selectVehicleClass({ fnSuccess: function (item) { ve.onSelectFilterVehicleClass(env, item); } });
}
ve.onSelectFilterVehicleClass = function (env, item)
{
//sbm.debug('onSelectFilterVehicleClass', env, item);
env.$frm.filter.find('.FilterVehicleClassId').val(item.id);
env.$frm.filter.find('.FilterVehicleClass').val(item.caption);
ve.refreshResults(env, 250);
}
ve.selectItemVehicleClass = function (env)
{
sbm.fn.selectVehicleClass({ fnSuccess: function (item) { ve.onSelectItemVehicleClass(env, item); } });
}
ve.onSelectItemVehicleClass = function (env, item)
{
//sbm.debug('onSelectItemVehicleClass', env, item);
env.$frm.item.find('.VehicleClassId').val(item.id);
env.$frm.item.find('.VehicleClass').val(item.caption);
}
//--------------------------------------------------------------
ve.storeItem = function (env)
{
env.ajax.storeItem = env.ajax.storeItem || { url: sbm.url.base + 'Vehicles/Vehicle/Ajax/StoreItem', formSel: env.$frm.item, callbackFn: function (response) { ve.onStoreItem(env, response); } };
sbm.doAjaxRequest(env.ajax.storeItem, 50);
}
ve.onStoreItem = function (env, response)
{
//sbm.debug('onStoreItem', env, response);
sbm.refreshControlValues(response.controlValues);
if (!response.success) return;
env.$dlg.item.dialog('close');
var item = response.vehicle;
if (env.prmEdit)
{
ve.onItemEdited(env, item);
}
else if (env.$pnl.table.length)
{
env.$pnl.msgs.hide().empty();
var $item = $('#' + ve.getItemId(item), env.$pnl.table);
if (!$item.length)
{
$item = ve.getItemTemplate(env);
$('table tbody', env.$pnl.table).prepend($item).show();
}
ve.populateItem(env, $item, item);
sbm.configureItemTable(env.data.cfgList, env.$pnl.table);
}
}
//--------------------------------------------------------------
/* Params: type, search, fnSuccess. */
sbm.fn.selectVehicle = function (prm)
{
//sbm.debug('selectVehicle', prm);
let env = ve.env.select;
if (!env.$pnl.items.length) return;
env.prmSelect = prm;
env.$frm.filter.find('.FilterVehicleType').val('');
env.$frm.filter.find('.FilterSearch').val(prm.search || '');
env.$pnl.table.find('tbody tr').remove();
sbm.openDialog(env.$dlg.select, 1000, 800);
setTimeout(function () { ve.refreshResults(env); }, 250);
}
ve.selectItemRow = function (env, $item, item)
{
//sbm.debug('selectItemRow', env, $item, item);
env.$pnl.table.find('tr').removeClass('sbm-sel');
$item.addClass('sbm-sel');
env.prmSelect.item = item;
}
ve.selectItem = function (env)
{
//sbm.debug('selectItem', env, env.prmSelect.item);
env.$dlg.select.dialog('close');
if (env.prmSelect.fnSuccess) env.prmSelect.fnSuccess(env.prmSelect.item);
delete env.prmSelect;
}
/* Params: id, fnSuccess. */
sbm.fn.editVehicle = function (prm)
{
//sbm.debug('editVehicle', prm);
let env = ve.env.select;
env.prmEdit = prm;
//sbm.debug(env, prm);
ve.updateItem(env, prm.id);
}
ve.onItemEdited = function (env, item)
{
//sbm.debug('ve.onItemEdited', env, item);
if (env.prmEdit.fnSuccess) env.prmEdit.fnSuccess(item);
delete env.prmEdit;
}
//--------------------------------------------------------------
ve.initEnv = function ($pnlItems)
{
let env = { mode: { search: 1 }, data: {}, ajax: {}, $pnl: {}, $frm: {}, $ctrl: {}, $dlg: {} };
let $items = env.$pnl.items = $($pnlItems);
if (!$items.length) return env;
env.$pnl.hdr = $items.find('.sbm-panel-header');
env.$pnl.bgr = env.$pnl.hdr.find('.sbm-burger').invisible();
env.$pnl.mnu = env.$pnl.bgr.find('ul.sbm-dropdown-menu');
env.$pnl.table = $items.find('.sbm-panel-item-table');
env.$pnl.msgs = $items.find('.sbm-panel-messages');
env.$pnl.tmpls = $items.find('.sbm-panel-item-template');
env.$frm.filter = $items.find('.frmVehicleFilter');
env.$frm.filter.on('input', '.FilterSearch', function () { ve.refreshResults(env, 250); });
env.$frm.filter.on('click', '.VehicleClassSearch', function () { ve.selectFilterVehicleClass(env); }).on('dblclick', '.FilterVehicleClass', function () { ve.selectFilterVehicleClass(env); });
env.$frm.filter.on('click', '.VehicleClassClear', function () { ve.onSelectFilterVehicleClass(env, {}) });
env.$frm.itemId = $('#frmVehicleId');
var opt = sbm.dlgOpts();
opt.dialogClass += " sbm-Vehicle";
env.$dlg.item = $('#dlgVehicle').dialog(opt);
env.$frm.item = env.$dlg.item.find('#frmVehicle');
env.$frm.item.off('input').on('input', '.sbm-input, .sbm-textarea', function () { sbm.clearControlError(this); }).off('change').on('change', '.sbm-select', function () { sbm.clearControlError(this); });
return env;
}
//--------------------------------------------------------------
$(function ()
{
ve.env.maint = ve.initEnv('.sbm-panel.Vehicles');
if (ve.env.maint.$pnl.items.length) ve.refreshResults(ve.env.maint, 250);
ve.env.select = ve.initEnv('#dlgVehicleSelect');
if (ve.env.select.$pnl.items.length) ve.refreshConfig(ve.env.select, 250);
});
//--------------------------------------------------------------
}(window, window.document));
/* The End */