using GB5Shared.DTO.Framework.AutoNumber; using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using GB5Shared.GB5Exception; using GB5Shared.GenerateAutoNumber; using GB5Shared.QueryExecutor; using GB5Shared.Resource.Response; using GB5Shared.Validation; using LogisticsDAL.DTO.Vehicle; using LogisticsDAL.Query.Vehicle; using Microsoft.IdentityModel.Tokens; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LogisticsDAL.CustomCode.Vehicle { public class VehicleDAL : IVehicleDAL { private readonly IValidation _Validation; private readonly IQueryExecutor _QueryExecutor; public VehicleDAL(IQueryExecutor queryExecutor, IValidation IValidation) { _QueryExecutor = queryExecutor; _Validation = IValidation; } public async Task GetVehicle(int VehicleId, LoginDTO LoginDTO) { try { string Sql = VehicleQB.GET_VEHICLE; var Parameters = new { vehicleid = VehicleId }; VehicleDTO VehicleDTO = await _QueryExecutor.QuerySingleAsync(LoginDTO, Sql, Parameters); return JsonConvert.SerializeObject(VehicleDTO); } catch (Exception) { throw; } } public async Task SaveVehicle(VehicleDTO VehicleDTO, LoginDTO LoginDTO) { try { string Sql = VehicleQB.SAVE_VEHICLE; return await _QueryExecutor.ExecuteAsync(LoginDTO, Sql, VehicleDTO); } catch (Exception ex) { string Error = await _Validation.HandleException(ex, $"{ErrorResponse.SaveErrorMessage}"); throw new Exception(Error); } } public async Task UpdateVehicle(VehicleDTO VehicleDTO, LoginDTO LoginDTO) { try { string Sql = VehicleQB.UPDATE_VEHICLE; return await _QueryExecutor.ExecuteAsync(LoginDTO, Sql, VehicleDTO); } catch (Exception ex) { throw new Exception("Error while updating Vehicle", ex); } } public async Task DeleteVehicle(int VehicleId, LoginDTO LoginDTO) { try { string Sql = VehicleQB.DELETE_VEHICLE; var Parameters = new { vehicleid = VehicleId }; int result = await _QueryExecutor.ExecuteAsync(LoginDTO, Sql, Parameters); if (result > 0) { return "Vehicle deleted successfully."; } else { return "Vehicle not found or could not be deleted."; } } catch (Exception ex) { throw new Exception("Error while deleting Vehicle", ex); } } public async Task GetSelectListVehicle( int FirstNumber, int MaxResult, CriteriaDTO CriteriaDTO, LoginDTO LoginDTO, bool IsCount = false) { try { string Json = ""; int FilterVehicleNos = 1; // 0 = Login OU, 1 = All vehicles, 2 = OU from FE int OuId = -1; // Extract filtervehiclenos and ouid from CriteriaDTO if (CriteriaDTO?.SectionCriteriaList != null) { foreach (var section in CriteriaDTO.SectionCriteriaList) { foreach (var attr in section.AttributesCriteriaList) { if (attr.FieldName.Equals("filtervehiclenos", StringComparison.OrdinalIgnoreCase)) FilterVehicleNos = Convert.ToInt32(attr.FieldValue); if (attr.FieldName.Equals("ouid", StringComparison.OrdinalIgnoreCase)) OuId = Convert.ToInt32(attr.FieldValue); } } } if (!IsCount) { string SQL = ""; object parameters; // ----------------------------- // FilterVehicleNos == 0 → Login OU // ----------------------------- if (FilterVehicleNos == 0) { SQL = LoginDTO.DatabaseType == 0 ? VehicleQB.GET_VEHICLE_NUMBERS : VehicleQB.GET_VEHICLE_NUMBERS_ORACLE; SQL = ApplySelectListVehicle(SQL, CriteriaDTO); SQL = ApplySelectListVehicle(SQL, LoginDTO.UserCriteriaDTO); parameters = new { loginouid = LoginDTO.WorkOUId, firstnumber = FirstNumber, maxresult = MaxResult }; } // ----------------------------- // FilterVehicleNos == 1 → All vehicles // ----------------------------- else if (FilterVehicleNos == 1) { SQL = VehicleQB.GET_ALL_VEHICLE_NUMBERS; SQL = ApplySelectListVehicle(SQL, CriteriaDTO); SQL = ApplySelectListVehicle(SQL, LoginDTO.UserCriteriaDTO); parameters = new { loginouid = LoginDTO.WorkOUId, firstnumber = FirstNumber, maxresult = MaxResult }; } // ----------------------------- // FilterVehicleNos == 2 → OU from FE // ----------------------------- else if (FilterVehicleNos == 2) { if (OuId == -1) throw new MethodNotAllowedException("Please pass OU to filter."); SQL = LoginDTO.DatabaseType == 0 ? VehicleQB.GET_VEHICLE_NUMBERS : VehicleQB.GET_VEHICLE_NUMBERS_ORACLE; SQL = ApplySelectListVehicle(SQL, CriteriaDTO); SQL = ApplySelectListVehicle(SQL, LoginDTO.UserCriteriaDTO); parameters = new { loginouid = OuId, firstnumber = FirstNumber, maxresult = MaxResult }; } else { throw new MethodNotAllowedException("Type not handled"); } var list = (await _QueryExecutor.QueryAsync(LoginDTO, SQL, parameters)).ToList(); Json = JsonConvert.SerializeObject(list); } else { // Return count = 0 (implement actual count query if needed) Json = "0"; } return Json; } catch (Exception) { throw; } } private string ApplySelectListVehicle(string sql, CriteriaDTO criteriaDTO) { if (criteriaDTO?.SectionCriteriaList == null) return sql; var whereClauses = new List(); foreach (var section in criteriaDTO.SectionCriteriaList) { foreach (var attr in section.AttributesCriteriaList) { string fieldValue = attr.FieldValue?.ToString(); if (string.IsNullOrEmpty(fieldValue)) continue; switch (attr.FieldName.ToLower()) { case "number": whereClauses.Add("a.VEHICLENUMBER LIKE '%' + @VehicleNumber + '%'"); break; case "ownershiptype": whereClauses.Add("a.OWNERSHIPTYPE = @OwnerShipType"); break; case "vehicletype.id": whereClauses.Add("a.VEHICLETYPEID = @VehicleTypeId"); break; case "tenantid": whereClauses.Add("a.TENANTID = @TenantId"); break; } } } if (whereClauses.Count > 0) sql += " AND " + string.Join(" AND ", whereClauses); return sql; } } }