using Sarand.BusinessMgr.Net.Standard.Base.App; using Sarand.BusinessMgr.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Dbas; using Sarand.Net.Standard.Base.Utils; using System; using System.Collections.Generic; namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr { //======================================================================= // Asset manager - Vehicles. //======================================================================= partial class SbmAssetMgr { //------------------------------------------------------------------- // Utilities. // Odometer Reading. public abstract bool SetVehicleOdometerReading(SbmVehicle vehicle, Int32 odometer, DbUpdateInfo dbUpdateInfo); // Associated data. public abstract bool VehicleHasAssets(SysId vehicleId); public abstract bool VehicleHasProcesses(SysId vehicleId); public abstract bool VehicleHasEvents(SysId vehicleId); public abstract long GetVehicleFeatureCount(SysId vehicleId); public abstract bool VehicleHasFeatures(SysId vehicleId); public abstract bool VehicleHasInterfaceDataItems(SysId vehicleId); public abstract bool GetVehicleHpiCheckCount(SysId vehicleId); public abstract bool VehicleHasItemData(SysId vehicleId); public abstract bool ClearVehicleDependentData(SbmVehicle vehicle, DbUpdateInfo dbUpdateInfo); //------------------------------------------------------------------- // Retrieve individual vehicles. //------------------------------------------------------------------- // Vehicle exists. public bool VehicleExistsById(SysId id) { ClearErrorState(); if (!SysId.IsValid(id)) return false; SbmVehicle.Params prm = new SbmVehicle.Params(); prm.IdsIncluded.Add(id); prm.StatusCat = SbmVehicle.StatusCat.Any; return GetVehicleCount(prm) == 1; } public bool VehicleExistsByRegNumber(String regNumber) { ClearErrorState(); if (!StringUtil.IsEmpty(regNumber)) return false; SbmVehicle.Params prm = new SbmVehicle.Params { RegNumber = regNumber, StatusCat = SbmVehicle.StatusCat.Any }; return GetVehicleCount(prm) == 1; } //------------------------------------------------------------------- // Get vehicle. public abstract SbmVehicle GetVehicle(SbmVehicle.Params prm); public SbmVehicle GetVehicleById(SysId id) { ClearErrorState(); if (!SysId.IsValid(id)) return null; SbmVehicle.Params prm = new SbmVehicle.Params(); prm.IdsIncluded.Add(id); prm.StatusCat = SbmVehicle.StatusCat.Any; return GetVehicle(prm); } public SbmVehicle GetVehicleByRegNumber(String regNumber) { ClearErrorState(); if (StringUtil.IsEmpty(regNumber)) return null; SbmVehicle.Params prm = new SbmVehicle.Params { RegNumber = regNumber, StatusCat = SbmVehicle.StatusCat.Any }; return GetVehicle(prm); } //------------------------------------------------------------------- // Create vehicle. public abstract SbmVehicle CreateVehicle(); //------------------------------------------------------------------- // Validate vehicle data. public bool IsValidVehicle(SbmVehicle vehicle) { ClearErrorState(); if (vehicle == null) return SetErrorState(ErrorMessage.ItemNotSpecified); return IsValidVehicleData(vehicle.GetData(), new SbmVehicle.ErrField()); } public virtual bool IsValidVehicleData(SbmVehicle.Data data, SbmVehicle.ErrField errField) { ClearErrorState(); // 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; return false; } if (errField.RegNumberPrev != SacsHierarchyItem.ValidValue.Ignore && (IsValidValue(data.RegNumberPrev, "registration Number Previous", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.SaVehicle_RegNumberPrev)))) { errField.RegNumberPrev = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.Vin != SacsHierarchyItem.ValidValue.Ignore && (IsValidValue(data.Vin, "VIN", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.SaVehicle_VIN)))) { 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; return false; } if (errField.TachoId != SacsHierarchyItem.ValidValue.Ignore && (IsValidValue(data.TachoId, "tacho id", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.SaVehicle_TachoId)))) { 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))) { errField.Notes = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.Status != SacsHierarchyItem.ValidValue.Ignore) { if (!IsValidValue(data.StatusCode, "status", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.SaVehicle_Status), true, true)) { errField.Status = SacsHierarchyItem.ValidValue.Invalid; return false; } if (!SbmVehicle.ValidStatuses.Contains(data.Status)) { errField.Status = SacsHierarchyItem.ValidValue.Invalid; return SetErrorState(ErrorMessage.InvalidStatus); } } return true; } //------------------------------------------------------------------- // Vehicle database interface. public abstract bool InsertVehicle(SbmVehicle vehicle, DbUpdateInfo dbUpdateInfo); public abstract bool UpdateVehicle(SbmVehicle vehicle, DbUpdateInfo dbUpdateInfo); public virtual bool VehicleCanBeDeleted(SbmVehicle vehicle) { ClearErrorState(); return true; } public abstract bool DeleteVehicle(SbmVehicle vehicle, DbUpdateInfo dbUpdateInfo); //------------------------------------------------------------------- // Vehicle list. public abstract ColumnDfn GetVehicleColumnDfn(SbmVehicle.Column columnId, String caption = "", int width = 0); public abstract List GetVehicleQueryFilter(SbmVehicle.Params prm); public abstract long GetVehicleCount(SbmVehicle.Params prm); public abstract List GetVehicleList(SbmVehicle.Params prm); public abstract DbResultSet ExecuteVehicleQuery(List columns, SbmVehicle.Params prm); //------------------------------------------------------------------- // D a t a V a l u e s //------------------------------------------------------------------- /// /// Extract and format result set data value where specific handling is required. /// Where response is an invalid data value, format value using column.FormatValue(values). /// public DataValue GetVehicleDataValue(ColumnDfn column, NamedValue.Map values) { DataValue value = new DataValue(); switch ((SbmVehicle.Column)column.Id) { //----------------------------------------------------------- // Notes. case SbmVehicle.Column.Notes: value = new DataValue(SacsHierarchyItem.FormatForDisplay(values.GetValue(column.DataName).ToString(), 200)); break; // Status. case SbmVehicle.Column.Status_Desc: case SbmVehicle.Column.Status_Ind: { String statusCode = values.GetValue(column.DataName).ToString(); SaStatus status = SacsSystem.GetStatusForCode(statusCode); if (column.Id == (int)SbmVehicle.Column.Status_Desc) value = new DataValue(SacsSystem.GetStatusDescForCode(statusCode)); else if (column.Id == (int)SbmVehicle.Column.Status_Ind) value = new DataValue(SbmVehicle.GetStatusTriState(status)); } break; //----------------------------------------------------------- default: value = values.GetValue(column.DataName); break; } return value; } } //======================================================================= }