Vehicles - interim
This commit is contained in:
@@ -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.
|
||||
@@ -13,7 +13,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App
|
||||
//-------------------------------------------------------------------
|
||||
public static class Version
|
||||
{
|
||||
private static String version { get; } = "3.0.2.1";
|
||||
private static String version { get; } = "3.0.2.2";
|
||||
// Retrieve version.
|
||||
public static String GetFullVersion() { return version; }
|
||||
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.1 29-Nov-25 Vehicle Classes.
|
||||
// 3.0.2.2 ??
|
||||
//-------------------------------------------------------------------
|
||||
// 3.0.1 19-Feb-25 Portal Transactions.
|
||||
// 3.0.1.1 19-Feb-25 Portal tidy.
|
||||
|
||||
@@ -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.Dbas;
|
||||
using System;
|
||||
@@ -140,7 +139,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App
|
||||
Demo,
|
||||
}
|
||||
public const String RepositoryContext_Template = "Template";
|
||||
public const String RepositoryContext_Demo= "Demo";
|
||||
public const String RepositoryContext_Demo = "Demo";
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Configuration console.
|
||||
@@ -1167,6 +1166,9 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App
|
||||
Asset_Sale,
|
||||
Asset_Rental,
|
||||
Asset_Disposal,
|
||||
Vehicle_Assets,
|
||||
Vehicle_Events,
|
||||
Vehicle_Features,
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
|
||||
@@ -107,7 +107,6 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App
|
||||
return true;
|
||||
case Sbm.View.VehicleClasses:
|
||||
case Sbm.View.Vehicles:
|
||||
if (!sessionConsole.AllowOption(Sbm.ConfigOption.Assets)) return false;
|
||||
if (!sessionConsole.AllowOption(Sbm.ConfigOption.Vehicles)) return false;
|
||||
return true;
|
||||
//-----------------------------------------------------------
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
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.Core;
|
||||
using Sarand.Net.Standard.Base.Dbas;
|
||||
using Sarand.Net.Standard.Base.Utils;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
@@ -19,7 +17,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
|
||||
{
|
||||
Pos,
|
||||
Id,
|
||||
// Vehicle - vehicleClass props.
|
||||
// Vehicle Class.
|
||||
VehicleClass_Id,
|
||||
VehicleClass_MakeCode, VehicleClass_MakeDesc,
|
||||
VehicleClass_Model,
|
||||
@@ -30,10 +28,11 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
|
||||
VehicleClass_Seats,
|
||||
VehicleClass_InsuranceCode, VehicleClass_InsuranceDesc,
|
||||
VehicleClass_Notes,
|
||||
// Vehicle own props.
|
||||
// Identity.
|
||||
RegNumber,
|
||||
RegNumberPrev,
|
||||
Vin,
|
||||
// Model.
|
||||
CapCode,
|
||||
KeyNumber,
|
||||
KeyLocation,
|
||||
@@ -79,25 +78,27 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
|
||||
public String KeyNumber { get; set; } = "";
|
||||
public String KeyLocation { get; set; } = "";
|
||||
public String EngineNumber { get; set; } = "";
|
||||
public short EngineCapacity { get; set; } = 0;
|
||||
public short Seats { get; set; } = 0;
|
||||
public short Weight { get; set; } = 0;
|
||||
public short ManufactureYear { get; set; } = 0;
|
||||
// Specification.
|
||||
public Int16 EngineCapacity { get; set; } = 0;
|
||||
public Int16 Seats { get; set; } = 0;
|
||||
public Int16 Weight { get; set; } = 0;
|
||||
public Int16 ManufactureYear { get; set; } = 0;
|
||||
public DateTime BuildOn { get; set; } = DateTime.MinValue;
|
||||
public DateTime FirstRegisterOn { get; set; } = DateTime.MinValue;
|
||||
public DateTime RegisterOn { get; set; } = DateTime.MinValue;
|
||||
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 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 decimal NextServiceOdo { get; set; } = 0.0m;
|
||||
public Int32 NextServiceOdo { get; set; } = 0;
|
||||
public DateTime NextServiceOn { get; set; } = DateTime.MinValue;
|
||||
public DateTime MotOn { get; set; } = DateTime.MinValue;
|
||||
public String MotNo { get; set; } = "";
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -193,7 +194,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
|
||||
get { return data.RegNumberPrev; }
|
||||
set { CheckChanged(data.RegNumberPrev, value); data.RegNumberPrev = value; }
|
||||
}
|
||||
public decimal PurchaseOdo
|
||||
public Int32 PurchaseOdo
|
||||
{
|
||||
get { return data.PurchaseOdo; }
|
||||
set { CheckChanged(data.PurchaseOdo, value); data.PurchaseOdo = value; }
|
||||
@@ -208,7 +209,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
|
||||
get { return data.TachoId; }
|
||||
set { CheckChanged(data.TachoId, value); data.TachoId = value; }
|
||||
}
|
||||
public decimal LastServiceOdo
|
||||
public Int32 LastServiceOdo
|
||||
{
|
||||
get { return data.LastServiceOdo; }
|
||||
set { CheckChanged(data.LastServiceOdo, value); data.LastServiceOdo = value; }
|
||||
@@ -218,7 +219,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
|
||||
get { return data.LastServiceOn; }
|
||||
set { CheckChanged(data.LastServiceOn, value); data.LastServiceOn = value; }
|
||||
}
|
||||
public decimal NextServiceOdo
|
||||
public Int32 NextServiceOdo
|
||||
{
|
||||
get { return data.NextServiceOdo; }
|
||||
set { CheckChanged(data.NextServiceOdo, value); data.NextServiceOdo = value; }
|
||||
@@ -244,7 +245,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
|
||||
get { return data.NextTaxOn; }
|
||||
set { CheckChanged(data.NextTaxOn, value); data.NextTaxOn = value; }
|
||||
}
|
||||
public decimal LatestOdo
|
||||
public Int32 LatestOdo
|
||||
{
|
||||
get { return data.LatestOdo; }
|
||||
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);
|
||||
}
|
||||
|
||||
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.
|
||||
public Data GetData() { return data.Clone(); }
|
||||
@@ -388,6 +427,16 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
|
||||
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.
|
||||
public String AssetSerial
|
||||
@@ -471,7 +520,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
|
||||
get { return data.RegNumberPrev; }
|
||||
set { data.RegNumberPrev = value; }
|
||||
}
|
||||
public decimal PurchaseOdo
|
||||
public Int32 PurchaseOdo
|
||||
{
|
||||
get { return data.PurchaseOdo; }
|
||||
set { data.PurchaseOdo = value; }
|
||||
@@ -486,7 +535,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
|
||||
get { return data.TachoId; }
|
||||
set { data.TachoId = value; }
|
||||
}
|
||||
public decimal LastServiceOdo
|
||||
public Int32 LastServiceOdo
|
||||
{
|
||||
get { return data.LastServiceOdo; }
|
||||
set { data.LastServiceOdo = value; }
|
||||
@@ -496,7 +545,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
|
||||
get { return data.LastServiceOn; }
|
||||
set { data.LastServiceOn = value; }
|
||||
}
|
||||
public decimal NextServiceOdo
|
||||
public Int32 NextServiceOdo
|
||||
{
|
||||
get { return data.NextServiceOdo; }
|
||||
set { data.NextServiceOdo = value; }
|
||||
@@ -522,7 +571,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
|
||||
get { return data.NextTaxOn; }
|
||||
set { data.NextTaxOn = value; }
|
||||
}
|
||||
public decimal LatestOdo
|
||||
public Int32 LatestOdo
|
||||
{
|
||||
get { return data.LatestOdo; }
|
||||
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> IdsExcluded { get; } = new HashSet<SysId>();
|
||||
// Vehicle.
|
||||
public string Search { get; set; }
|
||||
public SysId VehicleClassId { get; set; }
|
||||
public SysId AssetCatIdInclude { get; set; }
|
||||
public SysId AssetCatIdExclude { get; set; }
|
||||
@@ -572,6 +622,8 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus
|
||||
public String ClassDescPartial { get; set; }
|
||||
/// <summary>Vehicle status.</summary>
|
||||
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.
|
||||
|
||||
// Odometer Reading.
|
||||
public abstract bool SetVehicleOdometerReading(SbmVehicle vehicle, decimal odometer, DbUpdateInfo dbUpdateInfo);
|
||||
public abstract bool SetVehicleOdometerReading(SbmVehicle vehicle, Int32 odometer, DbUpdateInfo dbUpdateInfo);
|
||||
|
||||
// Associated data.
|
||||
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)
|
||||
{
|
||||
ClearErrorState();
|
||||
// Vehicle properties.
|
||||
|
||||
// Vehicle Class.
|
||||
|
||||
if (errField.VehicleClassId != SacsHierarchyItem.ValidValue.Ignore && SysId.ToInt(data.VehicleClassId) < 1)
|
||||
{
|
||||
errField.VehicleClassId = SacsHierarchyItem.ValidValue.Invalid;
|
||||
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))))
|
||||
{
|
||||
errField.RegNumber = SacsHierarchyItem.ValidValue.Invalid;
|
||||
@@ -118,6 +122,81 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr
|
||||
errField.Vin = SacsHierarchyItem.ValidValue.Invalid;
|
||||
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))))
|
||||
{
|
||||
errField.TachoCode = SacsHierarchyItem.ValidValue.Invalid;
|
||||
@@ -128,11 +207,44 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr
|
||||
errField.TachoId = SacsHierarchyItem.ValidValue.Invalid;
|
||||
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))))
|
||||
{
|
||||
errField.MotNo = SacsHierarchyItem.ValidValue.Invalid;
|
||||
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.
|
||||
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.
|
||||
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;
|
||||
DateTime todayDate = DateTime.MinValue;
|
||||
@@ -180,7 +180,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
||||
List<TypeCodeDesc> itemDataTypes = SbmSystem.GetSystemCodes(Sbm.SystemCode.ItemDataType);
|
||||
prmData.lDataType.Add(itemDataTypes.GetCodeForType(Sbm.ItemData.Vehicle_HpiResponse));
|
||||
prmData.lDataType.RemoveEmpty();
|
||||
if (!StringUtil.IsEmpty(prmData.lDataType))
|
||||
if (!StringUtil.IsBlank(prmData.lDataType))
|
||||
itemDataConsole.GetItemDataCount(prmData);
|
||||
}*/
|
||||
return false;
|
||||
@@ -680,31 +680,81 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
||||
if (prm.IdsExcluded.HasValidIds())
|
||||
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.
|
||||
String colVehicle_VehicleClassId = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_VehicleClassId, aliasVehicle);
|
||||
if (SysId.IsValid(prm.VehicleClassId))
|
||||
filter.Add($"{colVehicle_VehicleClassId}={prm.VehicleClassId.ToString()}");
|
||||
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);
|
||||
qryVehicleClass.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaVehicleClass), aliasVehicle_VehicleClass);
|
||||
qryVehicleClass.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicleClass_Id, aliasVehicle_VehicleClass));
|
||||
if (!StringUtil.IsEmpty(prm.MakeCode))
|
||||
qryVehicleClass.Filters.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicleClass_MakeCode, aliasVehicle_VehicleClass)}='{prm.MakeCode}'");
|
||||
if (!StringUtil.IsEmpty(classDesc))
|
||||
qryVehicleClass.Filters.Add($"{DbQuery.FormatFn_Left(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicleClass_DescBrief, aliasVehicle_VehicleClass), prm.ClassDescPartial.Length)}='{classDesc}'");
|
||||
filter.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_VehicleClassId, aliasVehicle)} IN ({qryVehicleClass.BuildQuery()})");
|
||||
if (StringUtil.IsBlank(prm.TableAlias_VehicleClasss))
|
||||
{
|
||||
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));
|
||||
if (!StringUtil.IsBlank(prm.MakeCode))
|
||||
qryVehicleClass.Filters.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicleClass_MakeCode, aliasVehicle_VehicleClass)}='{prm.MakeCode}'");
|
||||
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.
|
||||
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:
|
||||
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.
|
||||
@@ -765,10 +815,10 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
||||
else
|
||||
{
|
||||
sortCol = columnDfn.DataName;
|
||||
if (!StringUtil.IsEmpty(columnDfn.SortDataName))
|
||||
if (!StringUtil.IsBlank(columnDfn.SortDataName))
|
||||
sortCol = columnDfn.SortDataName;
|
||||
}
|
||||
if (!sortCol.IsEmpty())
|
||||
if (!StringUtil.IsBlank(sortCol))
|
||||
{
|
||||
DbOrderByNullMode orderByNullMode = DbOrderByNullMode.Default; // eSaOrderByDemoteNulls, eSaOrderByPromoteNulls
|
||||
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))
|
||||
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;
|
||||
if (!hasVehicleClassCols) hasVehicleClassCols = columns.HasId(SbmVehicle.Column.VehicleClass_MakeCode);
|
||||
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)
|
||||
{
|
||||
prm.TableAlias_VehicleClasss = aliasVehicle_VehicleClass;
|
||||
DbQueryJoin joinVehCat = new DbQueryJoin(DbJoinType.LeftOuter);
|
||||
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)}");
|
||||
@@ -912,6 +975,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
||||
query.Columns.Add($"({qryEvent.BuildQuery()})", dataNameVehEventCount);
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// Feature count.
|
||||
bool bCountFeatures = columns.HasId(SbmVehicle.Column.FeatureCount);
|
||||
@@ -949,17 +1013,6 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
||||
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.
|
||||
|
||||
@@ -66,7 +66,6 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
||||
|
||||
public override bool VehicleDatabaseIsValid()
|
||||
{
|
||||
if (!AssetDatabaseIsValid()) return false;
|
||||
ClearErrorState();
|
||||
if (Database == null) return SetErrorState("Database not specified");
|
||||
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.
|
||||
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.
|
||||
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 (prm.moveCol == PlannedStockMovements_Params.PlanStockMoveCol.MovementDate)
|
||||
{
|
||||
if (!StringUtil.IsEmpty(qryMov2a) && !StringUtil.IsEmpty(qryMov2b))
|
||||
if (!StringUtil.IsBlank(qryMov2a) && !StringUtil.IsBlank(qryMov2b))
|
||||
return "(" + qryMov1b + ") UNION (" + qryMov2b + ")";
|
||||
else
|
||||
return qryMov1b;
|
||||
@@ -2320,9 +2320,9 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// Code.
|
||||
if (!StringUtil.IsEmpty(prm.CodeFull))
|
||||
if (!StringUtil.IsBlank(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))
|
||||
filter.Add(colCommodity_Code + " LIKE '%" + DbQuery.FormatForLike(prm.CodePartial) + "%'");
|
||||
@@ -2333,9 +2333,9 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
||||
// Brief Desc.
|
||||
bool allowEmbeddedTextSearch = true;
|
||||
bool allowFullTextSearch = true;
|
||||
if (!StringUtil.IsEmpty(prm.DescBriefFull))
|
||||
if (!StringUtil.IsBlank(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>();
|
||||
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.
|
||||
if (!StringUtil.IsEmpty(prm.DrawingNoFull))
|
||||
if (!StringUtil.IsBlank(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) + "'");
|
||||
}
|
||||
|
||||
// DrawingIssue.
|
||||
if (!StringUtil.IsEmpty(prm.DrawingIssueFull))
|
||||
if (!StringUtil.IsBlank(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) + "'");
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// Generic search.
|
||||
if (!StringUtil.IsEmpty(prm.Search))
|
||||
if (!StringUtil.IsBlank(prm.Search))
|
||||
{
|
||||
List<String> searchFilter = new List<string>();
|
||||
foreach (String rawSearchValue in prm.Search.Split(new char[] { ' ', ',', ';' }))
|
||||
{
|
||||
String searchValue = DbQuery.FormatForLike(StringUtil.TrimAll(rawSearchValue));
|
||||
if (StringUtil.IsEmpty(searchValue)) continue;
|
||||
if (StringUtil.IsBlank(searchValue)) continue;
|
||||
List<String> searchValueFilter = new List<string>();
|
||||
searchValueFilter.Add(colCommodity_Code + " LIKE '%" + searchValue + "%'");
|
||||
searchValueFilter.Add(colCommodity_DescBrief + " LIKE '%" + searchValue + "%'");
|
||||
@@ -2390,13 +2390,13 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
||||
//---------------------------------------------------------------
|
||||
// Catalog.
|
||||
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) + "'");
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// Category.
|
||||
String categoryList = prm.Categories.Concat(",", "'", "'", true, true);
|
||||
if (!StringUtil.IsEmpty(categoryList))
|
||||
if (!StringUtil.IsBlank(categoryList))
|
||||
{
|
||||
List<String> filterCategory = new List<String>();
|
||||
filterCategory.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Category, aliasCommodity) + " IN(" + categoryList + ")");
|
||||
@@ -2410,31 +2410,31 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
||||
//---------------------------------------------------------------
|
||||
// Coding.
|
||||
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) + "'");
|
||||
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) + "'");
|
||||
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) + "'");
|
||||
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) + "'");
|
||||
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) + "'");
|
||||
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) + "'");
|
||||
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) + "'");
|
||||
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) + "'");
|
||||
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) + "'");
|
||||
|
||||
//---------------------------------------------------------------
|
||||
@@ -2502,7 +2502,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
||||
filterCustId.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_AssIdCustomer, aliasCommodity) + "=" + prm.AssociationIdCustomer.ToString());
|
||||
filter.Add(filterCustId.Concat(" OR "));
|
||||
}
|
||||
else if (!StringUtil.IsEmpty(prm.CustomerName))
|
||||
else if (!StringUtil.IsBlank(prm.CustomerName))
|
||||
{
|
||||
// Partial or complete match on customer name:
|
||||
String filterAffiliate_CustomerName = "FltCustNameAff";
|
||||
@@ -2525,7 +2525,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// Supplier.
|
||||
if (!StringUtil.IsEmpty(prm.SupplierName))
|
||||
if (!StringUtil.IsBlank(prm.SupplierName))
|
||||
{
|
||||
// Partial or complete match on Supplier name.
|
||||
String filterAffiliate_SupplierName = "FltSuppNameAff";
|
||||
@@ -2549,7 +2549,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
||||
//---------------------------------------------------------------
|
||||
// Transaction.
|
||||
bool linkRequirement = false;
|
||||
bool linkTransaction = !StringUtil.IsEmpty(prm.OrderRef);
|
||||
bool linkTransaction = !StringUtil.IsBlank(prm.OrderRef);
|
||||
if (linkRequirement || linkTransaction)
|
||||
{
|
||||
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.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());
|
||||
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) + "'");
|
||||
}
|
||||
filter.Add("EXISTS(" + qryReqnt.BuildQuery() + ")");
|
||||
@@ -2572,7 +2572,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// Commodities defined by Customer.
|
||||
if (SysId.IsValid(prm.AssociationIdCommodityCustomer) || !StringUtil.IsEmpty(prm.AccountCodeCommodityCustomer))
|
||||
if (SysId.IsValid(prm.AssociationIdCommodityCustomer) || !StringUtil.IsBlank(prm.AccountCodeCommodityCustomer))
|
||||
{
|
||||
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());
|
||||
}
|
||||
if (!StringUtil.IsEmpty(prm.AccountCodeCommodityCustomer))
|
||||
if (!StringUtil.IsBlank(prm.AccountCodeCommodityCustomer))
|
||||
{
|
||||
// To match the customer account code, must also join to the association table:
|
||||
String aliasCommodity_CmdCustAssoc = "aCmdCmdCustAss";
|
||||
@@ -2627,7 +2627,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
||||
else
|
||||
{
|
||||
sortCol = columnDfn.DataName;
|
||||
if (!StringUtil.IsEmpty(columnDfn.SortDataName))
|
||||
if (!StringUtil.IsBlank(columnDfn.SortDataName))
|
||||
sortCol = columnDfn.SortDataName;
|
||||
}
|
||||
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_PromotionCode);
|
||||
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.
|
||||
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());
|
||||
}
|
||||
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.
|
||||
}
|
||||
@@ -3368,7 +3368,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// Stock movements
|
||||
if (SysId.IsValid(locationStockId) || !StringUtil.IsEmpty(stringLocactionStockId))
|
||||
if (SysId.IsValid(locationStockId) || !StringUtil.IsBlank(stringLocactionStockId))
|
||||
{
|
||||
// Stock due in by future weeks.
|
||||
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["label.assets"], Page = "Assets/Asset" });
|
||||
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" });
|
||||
}
|
||||
}
|
||||
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" });
|
||||
}
|
||||
if (commoditiesItem.Options.Any())
|
||||
Menu.Items.Add(commoditiesItem);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
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.Assets;
|
||||
|
||||
@@ -34,7 +35,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Assets
|
||||
}
|
||||
|
||||
RefreshModel(model);
|
||||
if (!model.AllowOption(Net.Standard.Base.App.Sbm.ConfigOption.Assets))
|
||||
if (!model.AllowOption(Sbm.ConfigOption.Assets))
|
||||
return RedirectToAction("", "");
|
||||
|
||||
// Asset Category page.
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
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.Assets;
|
||||
|
||||
@@ -35,7 +36,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Assets
|
||||
|
||||
Model_Asset model = new Model_Asset(Localiser);
|
||||
RefreshModel(model);
|
||||
if (!model.AllowOption(Net.Standard.Base.App.Sbm.ConfigOption.Assets))
|
||||
if (!model.AllowOption(Sbm.ConfigOption.Assets))
|
||||
return RedirectToAction("", "");
|
||||
|
||||
// Asset page.
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
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;
|
||||
|
||||
@@ -35,7 +36,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Vehicles
|
||||
RefreshModel(model);
|
||||
|
||||
// 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("", "");
|
||||
|
||||
// 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.Bus;
|
||||
using Sarand.Net.Standard.Base.Bus;
|
||||
using Sarand.Net.Standard.Base.Core;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
@@ -21,29 +22,52 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Vehicles
|
||||
{
|
||||
// Vehicle properties.
|
||||
Id,
|
||||
Exists,
|
||||
// Identity.
|
||||
Registration,
|
||||
RegistrationPrev,
|
||||
Vin,
|
||||
// Model.
|
||||
AssetSerial,
|
||||
// Vehicle Class.
|
||||
Class,
|
||||
ClassId,
|
||||
ClassCaption,
|
||||
Derivative,
|
||||
Make,
|
||||
Model,
|
||||
Class,
|
||||
// Defaults.
|
||||
// Properties.
|
||||
CapCode,
|
||||
KeyNumber,
|
||||
KeyLocation,
|
||||
EngineNumber,
|
||||
TachoCode,
|
||||
TachoId,
|
||||
LatestOdo,
|
||||
LatestOdoOn,
|
||||
// Specification.
|
||||
EngineCapacity,
|
||||
Seats,
|
||||
Weight,
|
||||
// Spec.
|
||||
ManufactureYear,
|
||||
BuildOn,
|
||||
PurchaseOdo,
|
||||
RegisterOn,
|
||||
FirstRegisterOn,
|
||||
EngineNumber,
|
||||
RegistrationPrevious,
|
||||
LatestOdo,
|
||||
LatestOdoOn,
|
||||
// Serice.
|
||||
LastServiceOdo,
|
||||
LastServiceOn,
|
||||
NextServiceOdo,
|
||||
NextServiceOn,
|
||||
MotOn,
|
||||
MotNo,
|
||||
NextTaxOn,
|
||||
// HPI interface.
|
||||
HpiCheckCount,
|
||||
HpiAlert,
|
||||
// Associated properties.
|
||||
AssetCount,
|
||||
EventCount,
|
||||
FeatureCount,
|
||||
// Common.
|
||||
Notes,
|
||||
Status,
|
||||
@@ -115,13 +139,28 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Vehicles
|
||||
|
||||
// List columns.
|
||||
|
||||
if (SysId.IsValid(SysId.ToSysId(Filter.VehicleClassId)))
|
||||
if (SysId.IsValid(GetFilterVehicleClassId()))
|
||||
config.Column.Hide.Add($"{ItemField.Class}");
|
||||
|
||||
// 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}");
|
||||
|
||||
// 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.
|
||||
if (!modeIsMaintain)
|
||||
config.Column.Hide.Add($"{ItemField.Actions}");
|
||||
@@ -130,43 +169,36 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Vehicles
|
||||
//-------------------------------------------------------------------
|
||||
// Item configuration.
|
||||
//-------------------------------------------------------------------
|
||||
// Legacy Vehicle dialog tabs and panels.
|
||||
// Tab 1 'Properties':
|
||||
// Model
|
||||
// Defaults
|
||||
// Spec
|
||||
// HPI
|
||||
// Service
|
||||
// Notes
|
||||
// Tab 2 'Features':
|
||||
// Features
|
||||
// Legacy dialog tabs and panels.
|
||||
// Dialog:
|
||||
// - Registration, VIN.
|
||||
// Panels:
|
||||
// Model - Make, Model, Class (search/update).
|
||||
// Defaults - CAP code, Key number, & location, Weight.
|
||||
// Specification - Built on, Purchase Odo, Register On, First Register On, Engine Number, Previous Registration, Latest Odo & date, Tacho type & Id.
|
||||
// HPI - HPI information (view only).
|
||||
// Service - Last service date & odo, Next service date & odo, MOT date & number, Next tax date.
|
||||
// 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
|
||||
{
|
||||
// Update dialog title.
|
||||
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;
|
||||
// Control flags.
|
||||
public bool? ManagedByAccounts { get; set; }
|
||||
public bool? LocalPricing { get; set; }
|
||||
public bool Readonly { get; set; }
|
||||
// Allowed actions.
|
||||
public class AllowData
|
||||
{
|
||||
public bool? UpdateCode { get; set; }
|
||||
}
|
||||
public AllowData Allow { get; } = new AllowData();
|
||||
// Item fields.
|
||||
@@ -186,14 +218,14 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Vehicles
|
||||
/// <summary>
|
||||
/// Populate item configuration for existing vehicle.
|
||||
/// </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>
|
||||
/// Populate item configuration for new or existing vehicle.
|
||||
/// </summary>
|
||||
public void PopulateItemConfig(ItemConfigData config, SbmItemId vehicleItemId)
|
||||
public void PopulateItemConfig(ItemConfigData config, SbmItemId vehicleItemId, ItemParamsData itemParams)
|
||||
{
|
||||
// Session configuration.
|
||||
bool userCanCreateVehicles = SessionData_Portal.SecurityProfile.UserCanCreateItemType(Sbm.ItemType.Vehicle);
|
||||
@@ -201,101 +233,21 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Vehicles
|
||||
|
||||
// Update dialog title.
|
||||
config.Title = Localiser["caption.vehicle.update"];
|
||||
if (!userCanUpdateVehicles) config.Readonly = true;
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// Identity.
|
||||
|
||||
// Registration.
|
||||
if (!userCanUpdateVehicles)
|
||||
if (itemParams.IdentityReadOnly)
|
||||
{
|
||||
config.Field.Readonly.Add($"{ItemField.Registration}");
|
||||
|
||||
// VIN.
|
||||
if (!userCanUpdateVehicles)
|
||||
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.
|
||||
|
||||
// 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.Standard.Base.App;
|
||||
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
|
||||
using Sarand.BusinessMgr.Net.Standard.Base.Bus.Control;
|
||||
using Sarand.BusinessMgr.Web.Portal.Components;
|
||||
using Sarand.Net.Standard.Base.App;
|
||||
using Sarand.Net.Standard.Base.Bus;
|
||||
using Sarand.Net.Standard.Base.Core;
|
||||
using Sarand.Net.Standard.Base.Helpers;
|
||||
using Sarand.Net.Standard.Base.Utils;
|
||||
using System;
|
||||
|
||||
@@ -47,6 +44,10 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Vehicles
|
||||
{
|
||||
return EnumUtil.ParseEnum(Filter.Mode, ViewMode.Search);
|
||||
}
|
||||
public SysId GetFilterVehicleClassId()
|
||||
{
|
||||
return SysId.ToSysId(Filter.VehicleClassId);
|
||||
}
|
||||
public SbmVehicle.StatusCat GetFilterStatusCat()
|
||||
{
|
||||
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 ClassId { get; set; }
|
||||
public String Registration { get; set; }
|
||||
public String RegistrationPrev { get; set; }
|
||||
public String Vin { get; set; }
|
||||
public String CapCode { get; set; }
|
||||
public String KeyNumber { get; set; }
|
||||
public String KeyLocation { get; set; }
|
||||
public String EngineNumber { get; set; }
|
||||
// Specification.
|
||||
public String EngineCapacity { get; set; }
|
||||
public String Seats { get; set; }
|
||||
public String Weight { 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 StatusCode { get; set; }
|
||||
public SaStatus GetStatus() { return SacsSystem.GetStatusForCode(StatusCode); }
|
||||
}
|
||||
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.
|
||||
@@ -88,17 +132,15 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Vehicles
|
||||
// Vehicle Class.
|
||||
if (Vehicle.ClassId != null)
|
||||
{
|
||||
String controlName = "VehicleClass";
|
||||
if (StringUtil.IsBlank(Vehicle.ClassId))
|
||||
responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]);
|
||||
else if (!AssetMgr.VehicleClassExistsById(SysId.ToSysId(Vehicle.ClassId)))
|
||||
String controlName = GetFieldName(ItemField.Class);
|
||||
if (!AssetMgr.VehicleClassExistsById(SysId.ToSysId(Vehicle.ClassId)))
|
||||
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
|
||||
}
|
||||
|
||||
// Registration.
|
||||
if (Vehicle.Registration != null)
|
||||
{
|
||||
String controlName = "VehicleRegistration";
|
||||
String controlName = GetFieldName(ItemField.Registration);
|
||||
Vehicle.Registration = Vehicle.Registration.ToUpper();
|
||||
responseData.SetControlValue(controlName, 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)]);
|
||||
}
|
||||
|
||||
// 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.
|
||||
if (Vehicle.Vin != null)
|
||||
{
|
||||
String controlName = "VehicleVin";
|
||||
String controlName = GetFieldName(ItemField.Vin);
|
||||
Vehicle.Vin = Vehicle.Vin.ToUpper();
|
||||
responseData.SetControlValue(controlName, Vehicle.Vin);
|
||||
if (StringUtil.GetLength(Vehicle.Vin) > 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.
|
||||
if (Vehicle.Notes != null)
|
||||
{
|
||||
String controlName = "VehicleNotes";
|
||||
String controlName = GetFieldName(ItemField.Notes);
|
||||
responseData.SetControlValue(controlName, Vehicle.Notes);
|
||||
if (StringUtil.GetLength(Vehicle.Notes) > 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.
|
||||
if (Vehicle.StatusCode != null)
|
||||
{
|
||||
String controlName = "VehicleStatus";
|
||||
String controlName = GetFieldName(ItemField.Status);
|
||||
if (StringUtil.IsBlank(Vehicle.StatusCode))
|
||||
responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]);
|
||||
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"> *</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"> *</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"> *</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 *@
|
||||
@model Model_Asset
|
||||
@* Vehicles - Vehicle *@
|
||||
@model Model_Vehicle
|
||||
@inject SbmLocaliser Localiser
|
||||
@{
|
||||
ViewData["Title"] = "Assets";
|
||||
Model.AdditionalFiles_JS.Add("js/sbm-asset.js");
|
||||
ViewData["Title"] = "Vehicles";
|
||||
}
|
||||
|
||||
<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"> *</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"> *</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"> *</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>
|
||||
<partial name="Panel-VehicleMaintain.cshtml" />
|
||||
|
||||
@@ -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"> *</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 */
|
||||
Reference in New Issue
Block a user