diff --git a/source/backend/PimsBackend.sln b/source/backend/PimsBackend.sln
index 8133f3d947..97fe5fe112 100644
--- a/source/backend/PimsBackend.sln
+++ b/source/backend/PimsBackend.sln
@@ -87,6 +87,26 @@ Global
{63CB6B30-E68E-57D8-EC6B-F2399A1A583F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{63CB6B30-E68E-57D8-EC6B-F2399A1A583F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{63CB6B30-E68E-57D8-EC6B-F2399A1A583F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1F4E301C-F03B-4A31-A6F2-6A77384A74DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1F4E301C-F03B-4A31-A6F2-6A77384A74DA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1F4E301C-F03B-4A31-A6F2-6A77384A74DA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1F4E301C-F03B-4A31-A6F2-6A77384A74DA}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5A83C636-741A-4795-8588-70F033E79B5A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {5A83C636-741A-4795-8588-70F033E79B5A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5A83C636-741A-4795-8588-70F033E79B5A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {5A83C636-741A-4795-8588-70F033E79B5A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {412BF533-2759-4FBE-B4C6-B89DB44FB6B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {412BF533-2759-4FBE-B4C6-B89DB44FB6B5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {412BF533-2759-4FBE-B4C6-B89DB44FB6B5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {412BF533-2759-4FBE-B4C6-B89DB44FB6B5}.Release|Any CPU.Build.0 = Release|Any CPU
+ {689DEE2C-025E-0795-C30A-7AE178357DC7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {689DEE2C-025E-0795-C30A-7AE178357DC7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {689DEE2C-025E-0795-C30A-7AE178357DC7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {689DEE2C-025E-0795-C30A-7AE178357DC7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {49D89A8A-5B75-80D3-7A64-C2ABAFBE9A4B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {49D89A8A-5B75-80D3-7A64-C2ABAFBE9A4B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {49D89A8A-5B75-80D3-7A64-C2ABAFBE9A4B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {49D89A8A-5B75-80D3-7A64-C2ABAFBE9A4B}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/source/backend/api/Areas/Acquisition/Models/AcquisitionFilterModel.cs b/source/backend/api/Areas/Acquisition/Models/AcquisitionFilterModel.cs
index 1d7427cd1d..12523295b8 100644
--- a/source/backend/api/Areas/Acquisition/Models/AcquisitionFilterModel.cs
+++ b/source/backend/api/Areas/Acquisition/Models/AcquisitionFilterModel.cs
@@ -59,6 +59,11 @@ public class AcquisitionFilterModel : PageFilter
///
public bool HasNoticeOfClaim { get; set; }
+ ///
+ /// get/set - The region types.
+ ///
+ public IList Regions { get; set; } = new List();
+
#endregion
#region Constructors
@@ -90,6 +95,7 @@ public AcquisitionFilterModel(Dictionary
public long? TeamMemberOrganizationId { get; set; }
+
+ ///
+ /// get/set - The region types.
+ ///
+ public IList Regions { get; set; } = new List();
+
#endregion
#region Constructors
@@ -74,15 +80,16 @@ public DispositionFilterModel(Dictionary(query, StringComparer.OrdinalIgnoreCase);
- this.Pid = filter.GetStringValue(nameof(this.Pid));
- this.Pin = filter.GetStringValue(nameof(this.Pin));
- this.Address = filter.GetStringValue(nameof(this.Address));
- this.FileNameOrNumberOrReference = filter.GetStringValue(nameof(this.FileNameOrNumberOrReference));
- this.DispositionFileStatusCode = filter.GetStringValue(nameof(this.DispositionFileStatusCode));
- this.DispositionStatusCode = filter.GetStringValue(nameof(this.DispositionStatusCode));
- this.DispositionTypeCode = filter.GetStringValue(nameof(this.DispositionTypeCode));
- this.TeamMemberPersonId = filter.GetLongNullValue(nameof(this.TeamMemberPersonId));
- this.TeamMemberOrganizationId = filter.GetLongNullValue(nameof(this.TeamMemberOrganizationId));
+ Pid = filter.GetStringValue(nameof(this.Pid));
+ Pin = filter.GetStringValue(nameof(this.Pin));
+ Address = filter.GetStringValue(nameof(this.Address));
+ FileNameOrNumberOrReference = filter.GetStringValue(nameof(this.FileNameOrNumberOrReference));
+ DispositionFileStatusCode = filter.GetStringValue(nameof(this.DispositionFileStatusCode));
+ DispositionStatusCode = filter.GetStringValue(nameof(this.DispositionStatusCode));
+ DispositionTypeCode = filter.GetStringValue(nameof(this.DispositionTypeCode));
+ TeamMemberPersonId = filter.GetLongNullValue(nameof(this.TeamMemberPersonId));
+ TeamMemberOrganizationId = filter.GetLongNullValue(nameof(this.TeamMemberOrganizationId));
+ Regions = filter.GetIntArrayValue(nameof(Regions));
this.Sort = filter.GetStringArrayValue(nameof(this.Sort));
}
@@ -110,6 +117,7 @@ public static explicit operator DispositionFilter(DispositionFilterModel model)
DispositionTypeCode = model.DispositionTypeCode,
TeamMemberPersonId = model.TeamMemberPersonId,
TeamMemberOrganizationId = model.TeamMemberOrganizationId,
+ Regions = model.Regions,
Sort = model.Sort,
};
diff --git a/source/backend/api/Areas/Leases/Models/LeaseFilterModel.cs b/source/backend/api/Areas/Leases/Models/LeaseFilterModel.cs
index ea59d1545c..1e84f85d36 100644
--- a/source/backend/api/Areas/Leases/Models/LeaseFilterModel.cs
+++ b/source/backend/api/Areas/Leases/Models/LeaseFilterModel.cs
@@ -59,11 +59,6 @@ public class LeaseFilterModel : PageFilter
///
public DateOnly? ExpiryEndDate { get; set; }
- ///
- /// get/set - The region type.
- ///
- public int? RegionType { get; set; }
-
///
/// get/set - Filter for additional lease details.
///
@@ -83,6 +78,12 @@ public class LeaseFilterModel : PageFilter
/// get/set - Filter to return only receivable leases.
///
public bool? IsReceivable { get; set; }
+
+ ///
+ /// get/set - The region types.
+ ///
+ public IList Regions { get; set; } = new List();
+
#endregion
#region Constructors
@@ -104,22 +105,23 @@ public LeaseFilterModel(Dictionary(query, StringComparer.OrdinalIgnoreCase);
- this.Pid = filter.GetStringValue(nameof(this.Pid));
- this.Pin = filter.GetStringValue(nameof(this.Pin));
- this.LFileNo = filter.GetStringValue(nameof(this.LFileNo));
- this.Address = filter.GetStringValue(nameof(this.Address));
- this.Historical = filter.GetStringValue(nameof(this.Historical));
- this.LeaseStatusTypes = filter.GetStringArrayValue(nameof(this.LeaseStatusTypes));
- this.TenantName = filter.GetStringValue(nameof(this.TenantName));
- this.Programs = filter.GetStringArrayValue(nameof(this.Programs));
- this.ExpiryStartDate = filter.GetDateOnlyNullValue(nameof(this.ExpiryStartDate));
- this.ExpiryEndDate = filter.GetDateOnlyNullValue(nameof(this.ExpiryEndDate));
- this.RegionType = filter.GetIntNullValue(nameof(this.RegionType));
- this.Details = filter.GetStringValue(nameof(this.Details));
- this.LeaseTeamPersonId = filter.GetIntNullValue(nameof(this.LeaseTeamPersonId));
- this.LeaseTeamOrganizationId = filter.GetIntNullValue(nameof(this.LeaseTeamOrganizationId));
- this.IsReceivable = filter.GetValue(nameof(this.IsReceivable));
- this.Sort = filter.GetStringArrayValue(nameof(this.Sort));
+ Pid = filter.GetStringValue(nameof(this.Pid));
+ Pin = filter.GetStringValue(nameof(this.Pin));
+ LFileNo = filter.GetStringValue(nameof(this.LFileNo));
+ Address = filter.GetStringValue(nameof(this.Address));
+ Historical = filter.GetStringValue(nameof(this.Historical));
+ LeaseStatusTypes = filter.GetStringArrayValue(nameof(this.LeaseStatusTypes));
+ TenantName = filter.GetStringValue(nameof(this.TenantName));
+ Programs = filter.GetStringArrayValue(nameof(this.Programs));
+ ExpiryStartDate = filter.GetDateOnlyNullValue(nameof(this.ExpiryStartDate));
+ ExpiryEndDate = filter.GetDateOnlyNullValue(nameof(this.ExpiryEndDate));
+ Details = filter.GetStringValue(nameof(this.Details));
+ LeaseTeamPersonId = filter.GetIntNullValue(nameof(this.LeaseTeamPersonId));
+ LeaseTeamOrganizationId = filter.GetIntNullValue(nameof(this.LeaseTeamOrganizationId));
+ IsReceivable = filter.GetValue(nameof(this.IsReceivable));
+ Regions = filter.GetShortArrayValue(nameof(Regions));
+
+ Sort = filter.GetStringArrayValue(nameof(this.Sort));
}
#endregion
@@ -146,11 +148,11 @@ public static explicit operator LeaseFilter(LeaseFilterModel model)
Programs = model.Programs,
ExpiryStartDate = model.ExpiryStartDate,
ExpiryEndDate = model.ExpiryEndDate,
- RegionType = model.RegionType,
Details = model.Details?.Trim(),
LeaseTeamOrganizationId = model.LeaseTeamOrganizationId,
LeaseTeamPersonId = model.LeaseTeamPersonId,
IsReceivable = model.IsReceivable,
+ Regions = model.Regions,
Sort = model.Sort,
};
@@ -180,7 +182,6 @@ public override bool IsValid()
|| (Programs.Count != 0)
|| ExpiryStartDate.HasValue
|| ExpiryEndDate.HasValue
- || RegionType.HasValue
|| LeaseTeamPersonId.HasValue
|| LeaseTeamOrganizationId.HasValue
|| IsReceivable.HasValue
diff --git a/source/backend/api/Areas/Management/Models/ManagementFilterModel.cs b/source/backend/api/Areas/Management/Models/ManagementFilterModel.cs
index dc13226533..7a4904874e 100644
--- a/source/backend/api/Areas/Management/Models/ManagementFilterModel.cs
+++ b/source/backend/api/Areas/Management/Models/ManagementFilterModel.cs
@@ -69,6 +69,11 @@ public class ManagementFilterModel : PageFilter
///
public bool HasNoticeOfClaim { get; set; }
+ ///
+ /// get/set - The region types.
+ ///
+ public IList Regions { get; set; } = new List();
+
#endregion
#region Constructors
@@ -101,6 +106,7 @@ public ManagementFilterModel(Dictionary
+ /// get/set - The region types.
+ ///
+ public IList Regions { get; set; } = new List();
public static explicit operator ProjectFilter(ProjectFilterModel model)
{
@@ -26,7 +30,7 @@ public static explicit operator ProjectFilter(ProjectFilterModel model)
ProjectNumber = model.ProjectNumber?.Trim(),
ProjectName = model.ProjectName?.Trim(),
ProjectStatusCode = model.ProjectStatusCode,
- ProjectRegionCode = model.ProjectRegionCode,
+ Regions = model.Regions,
Sort = model.Sort,
};
diff --git a/source/backend/api/Services/AcquisitionFileService.cs b/source/backend/api/Services/AcquisitionFileService.cs
index 58223d3821..4e4f4c16f5 100644
--- a/source/backend/api/Services/AcquisitionFileService.cs
+++ b/source/backend/api/Services/AcquisitionFileService.cs
@@ -93,12 +93,10 @@ public Paged GetPage(AcquisitionFilter filter)
_user.ThrowIfNotAuthorized(Permissions.AcquisitionFileView);
- // Limit search results to user's assigned region(s)
var pimsUser = _userRepository.GetUserInfoByKeycloakUserId(_user.GetUserKey());
- var userRegions = pimsUser.PimsRegionUsers.Select(r => r.RegionCode).ToHashSet();
long? contractorPersonId = pimsUser.IsContractor ? pimsUser.PersonId : null;
- return _acqFileRepository.GetPageDeep(filter, userRegions, contractorPersonId);
+ return _acqFileRepository.GetPageDeep(filter, contractorPersonId);
}
public List GetAcquisitionFileExport(AcquisitionFilter filter)
@@ -106,12 +104,10 @@ public List GetAcquisitionFileExport(AcquisitionFilt
_logger.LogInformation("Searching all Acquisition Files matching the filter: {filter}", filter);
_user.ThrowIfNotAuthorized(Permissions.AcquisitionFileView);
- // Limit search results to user's assigned region(s)
var pimsUser = _userRepository.GetUserInfoByKeycloakUserId(_user.GetUserKey());
- var userRegions = pimsUser.PimsRegionUsers.Select(r => r.RegionCode).ToHashSet();
long? contractorPersonId = pimsUser.IsContractor ? pimsUser.PersonId : null;
- var acqFiles = _acqFileRepository.GetAcquisitionFileExportDeep(filter, userRegions, contractorPersonId);
+ var acqFiles = _acqFileRepository.GetAcquisitionFileExportDeep(filter, contractorPersonId);
return acqFiles.SelectMany(file => file.PimsPropertyAcquisitionFiles.Where(fp => fp.AcquisitionFileId.Equals(file.AcquisitionFileId)).DefaultIfEmpty(), (file, fp) => (file, fp))
.Select(fileProperty => new AcquisitionFileExportModel
@@ -670,12 +666,10 @@ public List GetAcquisitionSubFiles(long id)
throw new BadRequestException("Acquisition file should not be a sub-file.");
}
- // Limit search results to user's assigned region(s)
var pimsUser = _userRepository.GetUserInfoByKeycloakUserId(_user.GetUserKey());
- var userRegions = pimsUser.PimsRegionUsers.Select(r => r.RegionCode).ToHashSet();
long? contractorPersonId = pimsUser.IsContractor ? pimsUser.PersonId : null;
- return _acqFileRepository.GetAcquisitionSubFiles(id, userRegions, contractorPersonId);
+ return _acqFileRepository.GetAcquisitionSubFiles(id, contractorPersonId);
}
private void CheckFileNumberDuplicate(PimsAcquisitionFile acquisitionFile)
diff --git a/source/backend/api/Services/LeaseReportsService.cs b/source/backend/api/Services/LeaseReportsService.cs
index f41af9765e..d24c5c8ada 100644
--- a/source/backend/api/Services/LeaseReportsService.cs
+++ b/source/backend/api/Services/LeaseReportsService.cs
@@ -1,11 +1,12 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Security.Claims;
+using Pims.Api.Models.CodeTypes;
using Pims.Core.Extensions;
using Pims.Core.Security;
using Pims.Dal.Entities;
using Pims.Dal.Repositories;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Security.Claims;
using static Pims.Dal.Entities.PimsLeaseStatusType;
namespace Pims.Api.Services
@@ -40,9 +41,9 @@ public IEnumerable GetAggregatedLeaseReport(int fiscalYearStart)
{
ExpiryAfterDate = fiscalYearStartDate,
StartBeforeDate = fiscalYearStartDate.AddYears(1).AddDays(-1),
- NotInStatus = new List() { PimsLeaseStatusTypes.DRAFT, PimsLeaseStatusTypes.DISCARD, PimsLeaseStatusTypes.DUPLICATE },
+ NotInStatus = new List() { LeaseStatusTypes.DRAFT.ToString(), LeaseStatusTypes.DISCARD.ToString(), LeaseStatusTypes.DUPLICATE.ToString() },
IsReceivable = true,
- }, pimsUser.PimsRegionUsers.Select(u => u.RegionCode).ToHashSet(),
+ },
true,
contractorPersonId);
}
@@ -60,7 +61,7 @@ public IEnumerable GetLeasePaymentsReport(int fiscalYearStart)
var allPayments = _leasePaymentRepository.GetAllByDateRange(fiscalYearStartDate, fiscalYearEndDate, contractorPersonId).ToList();
var leaseIds = allPayments.Select(payment => payment.LeasePeriod.LeaseId);
- var activeLeases = _leaseService.GetAllByIds(leaseIds).Where(l => l.LeaseStatusTypeCode != PimsLeaseStatusTypes.DUPLICATE && l.LeaseStatusTypeCode != PimsLeaseStatusTypes.DRAFT && l.LeaseStatusTypeCode != PimsLeaseStatusTypes.DISCARD).ToList();
+ var activeLeases = _leaseService.GetAllByIds(leaseIds).Where(l => l.LeaseStatusTypeCode != LeaseStatusTypes.DUPLICATE.ToString() && l.LeaseStatusTypeCode != LeaseStatusTypes.DRAFT.ToString() && l.LeaseStatusTypeCode != LeaseStatusTypes.DISCARD.ToString()).ToList();
var activePayments = allPayments.Where(payment => activeLeases.Any(lease => lease.LeaseId == payment.LeasePeriod.LeaseId)).ToList();
// Required to display the latest payment on the lease, which may not be part of the current date range filter of payments. This ensures that all payments for a lease associated to one of the payments in the date range are included.
diff --git a/source/backend/api/Services/LeaseService.cs b/source/backend/api/Services/LeaseService.cs
index bdf590996d..4186120f45 100644
--- a/source/backend/api/Services/LeaseService.cs
+++ b/source/backend/api/Services/LeaseService.cs
@@ -103,7 +103,7 @@ public IEnumerable GetAllByIds(IEnumerable leaseIds)
var pimsUser = _userRepository.GetUserInfoByKeycloakUserId(_user.GetUserKey());
long? contractorPersonId = pimsUser.IsContractor ? pimsUser.PersonId : null;
- var leases = _leaseRepository.GetAllByIds(leaseIds, pimsUser.PimsRegionUsers.Select(u => u.RegionCode).ToHashSet(), contractorPersonId).ToList();
+ var leases = _leaseRepository.GetAllByIds(leaseIds, contractorPersonId).ToList();
// Ensure we return property information with lat/long coordinates for any properties associated to the returned leases.
foreach (var lease in leases)
@@ -134,13 +134,14 @@ public Paged GetPage(LeaseFilter filter, bool? all = false)
{
_logger.LogInformation("Getting lease page {filter}", filter);
_user.ThrowIfNotAuthorized(Permissions.LeaseView);
+
filter.Page = all.HasValue && all.Value ? 1 : filter.Page;
filter.Quantity = all.HasValue && all.Value ? _leaseRepository.Count() : filter.Quantity;
+
var pimsUser = _userRepository.GetUserInfoByKeycloakUserId(_user.GetUserKey());
long? contractorPersonId = pimsUser.IsContractor ? pimsUser.PersonId : null;
- var leases = _leaseRepository.GetPage(filter, pimsUser.PimsRegionUsers.Select(u => u.RegionCode).ToHashSet(), contractorPersonId);
- return leases;
+ return _leaseRepository.GetPage(filter, contractorPersonId);
}
public IEnumerable GetInsuranceByLeaseId(long leaseId)
@@ -556,7 +557,7 @@ private static void ValidateLeaseAccountTypeChange(PimsLease currentLease, PimsL
private static void ValidateRenewalDates(PimsLease lease, PimsLease currentLease, IEnumerable userOverrides)
{
- if (lease.LeaseStatusTypeCode != PimsLeaseStatusTypes.ACTIVE)
+ if (lease.LeaseStatusTypeCode != LeaseStatusTypes.ACTIVE.ToString())
{
return;
}
diff --git a/source/backend/api/Services/ManagementFileService.cs b/source/backend/api/Services/ManagementFileService.cs
index 56515de9dc..080fd1b983 100644
--- a/source/backend/api/Services/ManagementFileService.cs
+++ b/source/backend/api/Services/ManagementFileService.cs
@@ -21,6 +21,7 @@ public class ManagementFileService : IManagementFileService
{
private readonly ClaimsPrincipal _user;
private readonly ILogger _logger;
+ private readonly IUserRepository _userRepository;
private readonly IManagementFileRepository _managementFileRepository;
private readonly IManagementFilePropertyRepository _managementFilePropertyRepository;
private readonly IPropertyRepository _propertyRepository;
@@ -44,7 +45,8 @@ public ManagementFileService(
IManagementFileStatusSolver managementStatusSolver,
IPropertyOperationService propertyOperationService,
IManagementActivityRepository managementActivityRepository,
- IFilePropertyLocationUpdateSolver propertyLocationSolver)
+ IFilePropertyLocationUpdateSolver propertyLocationSolver,
+ IUserRepository userRepository)
{
_user = user;
_logger = logger;
@@ -58,6 +60,7 @@ public ManagementFileService(
_propertyOperationService = propertyOperationService;
_managementActivityRepository = managementActivityRepository;
_propertyLocationSolver = propertyLocationSolver;
+ _userRepository = userRepository;
}
public PimsManagementFile Add(PimsManagementFile managementFile, IEnumerable userOverrides)
@@ -288,7 +291,10 @@ public Paged GetPage(ManagementFilter filter)
_logger.LogDebug("Management file search with filter: {filter}", filter);
_user.ThrowIfNotAuthorized(Permissions.ManagementView);
- return _managementFileRepository.GetPageDeep(filter);
+ var pimsUser = _userRepository.GetUserInfoByKeycloakUserId(_user.GetUserKey());
+ long? contractorPersonId = pimsUser.IsContractor ? pimsUser.PersonId : null;
+
+ return _managementFileRepository.GetPageDeep(filter, contractorPersonId);
}
public IEnumerable GetContacts(long id)
diff --git a/source/backend/api/Services/ProjectService.cs b/source/backend/api/Services/ProjectService.cs
index afb8e90338..49cbf999f6 100644
--- a/source/backend/api/Services/ProjectService.cs
+++ b/source/backend/api/Services/ProjectService.cs
@@ -64,11 +64,7 @@ public IList SearchProjects(string filter, int maxResult)
_logger.LogInformation("Searching for projects that match {filter}", filter);
_user.ThrowIfNotAuthorized(Permissions.ProjectView);
- // Limit search results to user's assigned region(s), but always include "Cannot determine" region
- var pimsUser = _userRepository.GetUserInfoByKeycloakUserId(_user.GetUserKey());
- var userRegions = pimsUser.PimsRegionUsers.Select(r => r.RegionCode).ToHashSet();
-
- return _projectRepository.SearchProjects(filter, userRegions, maxResult);
+ return _projectRepository.SearchProjects(filter, maxResult);
}
public IList GetAll()
@@ -76,11 +72,7 @@ public IList GetAll()
_logger.LogInformation("Retrieving all PIMS projects");
_user.ThrowIfNotAuthorized(Permissions.ProjectView);
- // Limit search results to user's assigned region(s), but always include "Cannot determine" region
- var pimsUser = _userRepository.GetUserInfoByKeycloakUserId(_user.GetUserKey());
- var userRegions = pimsUser.PimsRegionUsers.Select(r => r.RegionCode).ToHashSet();
-
- return _projectRepository.SearchProjects(string.Empty, userRegions, int.MaxValue);
+ return _projectRepository.SearchProjects(string.Empty, int.MaxValue);
}
public Task> GetPage(ProjectFilter filter)
@@ -90,9 +82,8 @@ public Task> GetPage(ProjectFilter filter)
_logger.LogInformation("Searching for projects ...");
_logger.LogDebug("Project search with filter", filter);
- // Limit search results to user's assigned region(s), but always include "Cannot determine" region
var pimsUser = _userRepository.GetUserInfoByKeycloakUserId(_user.GetUserKey());
- var userRegions = pimsUser.PimsRegionUsers.Select(r => r.RegionCode).ToHashSet();
+ long? contractorPersonId = pimsUser.IsContractor ? pimsUser.PersonId : null;
filter.ThrowIfNull(nameof(filter));
if (!filter.IsValid())
@@ -100,7 +91,7 @@ public Task> GetPage(ProjectFilter filter)
throw new ArgumentException("Argument must have a valid filter", nameof(filter));
}
- return GetPageAsync(filter, userRegions);
+ return GetPageAsync(filter, contractorPersonId);
}
public PimsProject GetById(long projectId)
@@ -258,9 +249,9 @@ private List MatchProducts(PimsProject project)
return externalProducts;
}
- private async Task> GetPageAsync(ProjectFilter filter, IEnumerable userRegions)
+ private async Task> GetPageAsync(ProjectFilter filter, long? contractorPersonId = null)
{
- return await _projectRepository.GetPageAsync(filter, userRegions);
+ return await _projectRepository.GetPageAsync(filter, contractorPersonId);
}
private void AddNoteIfStatusChanged(PimsProject updatedProject)
diff --git a/source/backend/core/Extensions/DictionaryExtensions.cs b/source/backend/core/Extensions/DictionaryExtensions.cs
index 2690f44820..cb0e768722 100644
--- a/source/backend/core/Extensions/DictionaryExtensions.cs
+++ b/source/backend/core/Extensions/DictionaryExtensions.cs
@@ -34,6 +34,18 @@ public static short GetShortValue(this IDictionary
+ /// Get the value from the dictionary for the specified 'key' and return it as an array of short.
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static short[] GetShortArrayValue(this IDictionary dict, string key, string separator = ",")
+ {
+ return dict.TryGetValue(key, out Microsoft.Extensions.Primitives.StringValues value) ? value.ToString().Split(separator).Select(v => { return short.TryParse(v, out short iv) ? (short?)iv : null; }).Where(v => v != null).Select(v => (short)v).ToArray() : Array.Empty();
+ }
+
///
/// Get the value from the dictionary for the specified 'key' and return it as an int.
///
diff --git a/source/backend/dal/Repositories/AcquisitionFileRepository.cs b/source/backend/dal/Repositories/AcquisitionFileRepository.cs
index 66b14d52d5..7ba613acbf 100644
--- a/source/backend/dal/Repositories/AcquisitionFileRepository.cs
+++ b/source/backend/dal/Repositories/AcquisitionFileRepository.cs
@@ -47,7 +47,7 @@ public AcquisitionFileRepository(PimsContext dbContext, ClaimsPrincipal user, IL
///
///
///
- public Paged GetPageDeep(AcquisitionFilter filter, HashSet regions, long? contractorPersonId = null)
+ public Paged GetPageDeep(AcquisitionFilter filter, long? contractorPersonId = null)
{
// RECOMMENDED - use a log scope to group all potential SQL statements generated by EF for this method call
using var scope = Logger.QueryScope();
@@ -58,7 +58,7 @@ public Paged GetPageDeep(AcquisitionFilter filter, HashSet<
throw new ArgumentException("Argument must have a valid filter", nameof(filter));
}
- IQueryable query = GetCommonAcquisitionFileQueryDeep(filter, regions, contractorPersonId);
+ IQueryable query = GetCommonAcquisitionFileQueryDeep(filter, contractorPersonId);
var skip = (filter.Page - 1) * filter.Quantity;
var pageItems = query.Skip(skip).Take(filter.Quantity).ToList();
@@ -70,10 +70,9 @@ public Paged GetPageDeep(AcquisitionFilter filter, HashSet<
/// Get Acquisition Files for Export.
///
///
- ///
///
///
- public List GetAcquisitionFileExportDeep(AcquisitionFilter filter, HashSet regions, long? contractorPersonId = null)
+ public List GetAcquisitionFileExportDeep(AcquisitionFilter filter, long? contractorPersonId = null)
{
// RECOMMENDED - use a log scope to group all potential SQL statements generated by EF for this method call
using var scope = Logger.QueryScope();
@@ -84,7 +83,7 @@ public List GetAcquisitionFileExportDeep(AcquisitionFilter
throw new ArgumentException("Argument must have a valid filter", nameof(filter));
}
- return GetCommonAcquisitionFileQueryDeep(filter, regions, contractorPersonId).ToList();
+ return GetCommonAcquisitionFileQueryDeep(filter, contractorPersonId).ToList();
}
///
@@ -737,8 +736,7 @@ public PimsAcquisitionFile Update(PimsAcquisitionFile acquisitionFile)
// PSP-9268 Changes to Project/Product on the main file need to be propagated to all sub-files
if (existingAcqFile.ProjectId != acquisitionFile.ProjectId || existingAcqFile.ProductId != acquisitionFile.ProductId)
{
- var allRegions = Context.PimsRegions.AsNoTracking().Select(r => r.RegionCode).ToHashSet();
- var subFiles = GetAcquisitionSubFiles(existingAcqFile.Internal_Id, allRegions);
+ var subFiles = GetAcquisitionSubFiles(existingAcqFile.Internal_Id);
foreach (var subFile in subFiles)
{
subFile.ProjectId = acquisitionFile.ProjectId;
@@ -811,14 +809,12 @@ public PimsProperty GetProperty(long acquisitionFilePropertyId)
.FirstOrDefault();
}
- public List GetAcquisitionSubFiles(long acquisitionFileId, HashSet regions, long? contractorPersonId = null)
+ public List GetAcquisitionSubFiles(long acquisitionFileId, long? contractorPersonId = null)
{
var predicate = PredicateBuilder.New(acq => true);
predicate.And(acq => acq.PrntAcquisitionFileId == acquisitionFileId);
- predicate = predicate.And(acq => regions.Contains(acq.RegionCode));
-
if (contractorPersonId is not null)
{
predicate = predicate.And(acq => acq.PimsAcquisitionFileTeams.Any(x => x.PersonId == contractorPersonId));
@@ -876,11 +872,8 @@ private int GetNextAcquisitionFileNumberSequenceValue()
private short GetNextSubFileSuffixValue(long parentAcquisitionFileId)
{
- // To determine the next suffix number we need to grab all sub-files (regardless of any region restriction)
- var allRegions = Context.PimsRegions.AsNoTracking().Select(r => r.RegionCode).ToHashSet();
-
// The suffix numbers for sub-interest files start from "02", and will increment by 1 for sub-sequent file in the order of creation.
- var existingSubFiles = GetAcquisitionSubFiles(parentAcquisitionFileId, allRegions);
+ var existingSubFiles = GetAcquisitionSubFiles(parentAcquisitionFileId);
if (existingSubFiles.Count == 0)
{
return 2;
@@ -897,10 +890,9 @@ private short GetNextSubFileSuffixValue(long parentAcquisitionFileId)
/// Generate a common IQueryable for Acquisition Files.
///
///
- ///
///
///
- private IQueryable GetCommonAcquisitionFileQueryDeep(AcquisitionFilter filter, HashSet regions, long? contractorPersonId = null)
+ private IQueryable GetCommonAcquisitionFileQueryDeep(AcquisitionFilter filter, long? contractorPersonId = null)
{
var predicate = PredicateBuilder.New(acq => true);
@@ -966,8 +958,6 @@ private IQueryable GetCommonAcquisitionFileQueryDeep(Acquis
predicate = predicate.And(ownerBuilder);
}
- predicate = predicate.And(acq => regions.Contains(acq.RegionCode) || acq.RegionCode == 4);
-
if (contractorPersonId is not null)
{
predicate = predicate.And(acq => acq.PimsAcquisitionFileTeams.Any(x => x.PersonId == contractorPersonId) || (acq.Project != null && acq.Project.PimsProjectPeople.Any(x => x.PersonId == contractorPersonId)));
@@ -988,6 +978,11 @@ private IQueryable GetCommonAcquisitionFileQueryDeep(Acquis
predicate = predicate.And(acq => acq.PimsNoticeOfClaims.Any(x => x.ReceivedDt != null || x.Comment != null));
}
+ if (filter.Regions.Any())
+ {
+ predicate = predicate.And(acq => filter.Regions.Any(r => r == acq.RegionCode));
+ }
+
var query = Context.PimsAcquisitionFiles.AsNoTracking()
.Include(r => r.RegionCodeNavigation)
.Include(p => p.Project)
diff --git a/source/backend/dal/Repositories/DispositionFileRepository.cs b/source/backend/dal/Repositories/DispositionFileRepository.cs
index 0fec45c061..12700fa0bb 100644
--- a/source/backend/dal/Repositories/DispositionFileRepository.cs
+++ b/source/backend/dal/Repositories/DispositionFileRepository.cs
@@ -780,6 +780,7 @@ public bool TryDeleteAgreement(long dispositionFileId, long agreementId)
private IQueryable GetCommonDispositionFileQueryDeep(DispositionFilter filter, long? contractorPersonId = null)
{
filter.FileNameOrNumberOrReference = Regex.Replace(filter.FileNameOrNumberOrReference ?? string.Empty, @"^[d,D]-", string.Empty);
+
var predicate = PredicateBuilder.New(disp => true);
if (!string.IsNullOrWhiteSpace(filter.Pid))
{
@@ -841,6 +842,11 @@ private IQueryable GetCommonDispositionFileQueryDeep(Dispos
predicate = predicate.And(disp => disp.PimsDispositionFileTeams.Any(x => x.OrganizationId == filter.TeamMemberOrganizationId.Value));
}
+ if (filter.Regions.Any())
+ {
+ predicate = predicate.And(x => filter.Regions.Any(r => r == x.RegionCode));
+ }
+
var query = Context.PimsDispositionFiles.AsNoTracking()
.Include(d => d.RegionCodeNavigation)
.Include(d => d.DspPhysFileStatusTypeCodeNavigation)
diff --git a/source/backend/dal/Repositories/Interfaces/IAcquisitionFileRepository.cs b/source/backend/dal/Repositories/Interfaces/IAcquisitionFileRepository.cs
index f57f788418..80116e4339 100644
--- a/source/backend/dal/Repositories/Interfaces/IAcquisitionFileRepository.cs
+++ b/source/backend/dal/Repositories/Interfaces/IAcquisitionFileRepository.cs
@@ -7,7 +7,7 @@ namespace Pims.Dal.Repositories
{
public interface IAcquisitionFileRepository : IRepository
{
- Paged GetPageDeep(AcquisitionFilter filter, HashSet regions, long? contractorPersonId = null);
+ Paged GetPageDeep(AcquisitionFilter filter, long? contractorPersonId = null);
PimsAcquisitionFile GetById(long id);
@@ -35,9 +35,9 @@ public interface IAcquisitionFileRepository : IRepository
PimsProperty GetProperty(long acquisitionFilePropertyId);
- List GetAcquisitionFileExportDeep(AcquisitionFilter filter, HashSet regions, long? contractorPersonId = null);
+ List GetAcquisitionFileExportDeep(AcquisitionFilter filter, long? contractorPersonId = null);
- List GetAcquisitionSubFiles(long acquisitionFileId, HashSet regions, long? contractorPersonId = null);
+ List GetAcquisitionSubFiles(long acquisitionFileId, long? contractorPersonId = null);
PimsAcquisitionFile GetAcquisitionAtTime(long acquisitionFileId, DateTime time);
}
diff --git a/source/backend/dal/Repositories/Interfaces/ILeaseRepository.cs b/source/backend/dal/Repositories/Interfaces/ILeaseRepository.cs
index 25f5ae4c14..ef9a13783f 100644
--- a/source/backend/dal/Repositories/Interfaces/ILeaseRepository.cs
+++ b/source/backend/dal/Repositories/Interfaces/ILeaseRepository.cs
@@ -12,19 +12,19 @@ public interface ILeaseRepository : IRepository
{
int Count();
- IEnumerable GetAllByFilter(LeaseFilter filter, HashSet regionCodes, bool loadPayments = false, long? contractorPersonId = null);
+ IEnumerable GetAllByFilter(LeaseFilter filter, bool loadPayments = false, long? contractorPersonId = null);
long GetRowVersion(long id);
PimsLease Get(long id);
- IEnumerable GetAllByIds(IEnumerable leaseIds, HashSet regions, long? contractorPersonId = null);
+ IEnumerable GetAllByIds(IEnumerable leaseIds, long? contractorPersonId = null);
PimsLease GetNoTracking(long id);
LastUpdatedByModel GetLastUpdateBy(long leaseId);
- Paged GetPage(LeaseFilter filter, HashSet regions, long? contractorPersonId = null);
+ Paged GetPage(LeaseFilter filter, long? contractorPersonId = null);
PimsLease Add(PimsLease lease);
diff --git a/source/backend/dal/Repositories/Interfaces/IManagementFileRepository.cs b/source/backend/dal/Repositories/Interfaces/IManagementFileRepository.cs
index 049516625d..e7eaaa1f26 100644
--- a/source/backend/dal/Repositories/Interfaces/IManagementFileRepository.cs
+++ b/source/backend/dal/Repositories/Interfaces/IManagementFileRepository.cs
@@ -20,7 +20,7 @@ public interface IManagementFileRepository : IRepository
long GetRowVersion(long id);
- Paged GetPageDeep(ManagementFilter filter);
+ Paged GetPageDeep(ManagementFilter filter, long? contractorPersonId = null);
List GetContacts(long managementFileId);
diff --git a/source/backend/dal/Repositories/Interfaces/IProjectRepository.cs b/source/backend/dal/Repositories/Interfaces/IProjectRepository.cs
index 6d77e5d789..433cb56101 100644
--- a/source/backend/dal/Repositories/Interfaces/IProjectRepository.cs
+++ b/source/backend/dal/Repositories/Interfaces/IProjectRepository.cs
@@ -11,9 +11,9 @@ namespace Pims.Dal.Repositories
///
public interface IProjectRepository : IRepository
{
- Task> GetPageAsync(ProjectFilter filter, IEnumerable userRegions);
+ Task> GetPageAsync(ProjectFilter filter, long? contractorPersonId = null);
- IList SearchProjects(string filter, HashSet regions, int maxResults);
+ IList SearchProjects(string filter, int maxResults);
PimsProject Add(PimsProject project);
diff --git a/source/backend/dal/Repositories/LeaseRepository.cs b/source/backend/dal/Repositories/LeaseRepository.cs
index f6734fb62a..202ca6dd96 100644
--- a/source/backend/dal/Repositories/LeaseRepository.cs
+++ b/source/backend/dal/Repositories/LeaseRepository.cs
@@ -61,7 +61,7 @@ public int Count()
///
///
///
- public IEnumerable GetAllByFilter(LeaseFilter filter, HashSet regionCodes, bool loadPayments = false, long? contractorPersonId = null)
+ public IEnumerable GetAllByFilter(LeaseFilter filter, bool loadPayments = false, long? contractorPersonId = null)
{
this.User.ThrowIfNotAuthorized(Permissions.LeaseView);
filter.ThrowIfNull(nameof(filter));
@@ -70,7 +70,7 @@ public IEnumerable GetAllByFilter(LeaseFilter filter, HashSet
throw new ArgumentException("Argument must have a valid filter", nameof(filter));
}
- var query = GenerateLeaseQuery(filter, regionCodes, loadPayments, contractorPersonId);
+ var query = GenerateLeaseQuery(filter, loadPayments, contractorPersonId);
// Getting all by the filter will ignore the order by passed and instead use the lease id.
var leases = query.OrderBy(l => l.LeaseId).ToArray();
@@ -133,7 +133,7 @@ public PimsLease Get(long id)
return lease;
}
- public IEnumerable GetAllByIds(IEnumerable leaseIds, HashSet regions, long? contractorPersonId = null)
+ public IEnumerable GetAllByIds(IEnumerable leaseIds, long? contractorPersonId = null)
{
var query = Context.PimsLeases.AsSplitQuery().AsNoTracking()
.Include(l => l.PimsPropertyLeases)
@@ -169,9 +169,6 @@ public IEnumerable GetAllByIds(IEnumerable leaseIds, HashSet r.PimsLeaseLicenseTeams)
.Where(l => leaseIds.Any(leaseId => leaseId == l.LeaseId)) ?? throw new KeyNotFoundException();
- // If the lease has a region, the user must have access to that region to view the lease. If the lease does not have a region, anyone with access to view leases can view it.
- query = query.Where(l => l.RegionCode == null || regions.Contains(l.RegionCode.Value));
-
// Enforce contractor access to only their leases
if (contractorPersonId is not null)
{
@@ -785,20 +782,21 @@ public PimsLease GetNoTracking(long id)
/// Note that the 'leaseFilter' will control the 'page' and 'quantity'.
///
///
- ///
/// The contractor person id to filter by. Only applies if calling user is a Contractor.
///
- public Paged GetPage(LeaseFilter filter, HashSet regions, long? contractorPersonId = null)
+ public Paged GetPage(LeaseFilter filter, long? contractorPersonId = null)
{
- this.User.ThrowIfNotAuthorized(Permissions.LeaseView);
+ User.ThrowIfNotAuthorized(Permissions.LeaseView);
filter.ThrowIfNull(nameof(filter));
+
if (!filter.IsValid())
{
throw new ArgumentException("Argument must have a valid filter", nameof(filter));
}
var skip = (filter.Page - 1) * filter.Quantity;
- var query = GenerateLeaseQuery(filter, regions, contractorPersonId: contractorPersonId);
+ var query = GenerateLeaseQuery(filter, contractorPersonId: contractorPersonId);
+
var items = query
.Skip(skip)
.Take(filter.Quantity)
@@ -890,7 +888,7 @@ public PimsLease UpdateLeaseRenewals(long leaseId, long? rowVersion, ICollection
///
/// The contractor person id to filter by. Only applies if calling user is a Contractor.
///
- public IQueryable GenerateLeaseQuery(LeaseFilter filter, HashSet regionCodes, bool loadPayments = false, long? contractorPersonId = null)
+ public IQueryable GenerateLeaseQuery(LeaseFilter filter, bool loadPayments = false, long? contractorPersonId = null)
{
filter.ThrowIfNull(nameof(filter));
@@ -924,7 +922,7 @@ public IQueryable GenerateLeaseQuery(LeaseFilter filter, HashSet l.PimsLeasePayments);
}
- var predicate = GenerateCommonLeaseQuery(filter, regionCodes, contractorPersonId);
+ var predicate = GenerateCommonLeaseQuery(filter, contractorPersonId);
query = query.Where(predicate);
if (filter.Sort?.Length > 0)
@@ -1094,17 +1092,14 @@ private static string NormalizeLFileNo(string input)
/// Generate an SQL statement for the specified 'region' and 'filter'.
///
///
- ///
/// The contractor person id to filter by. Only applies if calling user is a Contractor.
///
- private static ExpressionStarter GenerateCommonLeaseQuery(LeaseFilter filter, HashSet regions, long? contractorPersonId = null)
+ private static ExpressionStarter GenerateCommonLeaseQuery(LeaseFilter filter, long? contractorPersonId = null)
{
filter.ThrowIfNull(nameof(filter));
var predicateBuilder = PredicateBuilder.New(l => true);
- predicateBuilder = predicateBuilder.And(l => !l.RegionCode.HasValue || regions.Contains(l.RegionCode.Value));
-
// Enforce contractor access to only their leases
if (contractorPersonId is not null)
{
@@ -1222,14 +1217,14 @@ private static ExpressionStarter GenerateCommonLeaseQuery(LeaseFilter
l.OrigExpiryDate <= expiryEndDate);
}
- if (filter.RegionType.HasValue)
+ if (!string.IsNullOrWhiteSpace(filter.Details))
{
- predicateBuilder = predicateBuilder.And(l => l.RegionCode == filter.RegionType);
+ predicateBuilder = predicateBuilder.And(l => EF.Functions.Like(l.LeaseDescription, $"%{filter.Details}%") || EF.Functions.Like(l.LeaseNotes, $"%{filter.Details}%"));
}
- if (!string.IsNullOrWhiteSpace(filter.Details))
+ if (filter.Regions.Any())
{
- predicateBuilder = predicateBuilder.And(l => EF.Functions.Like(l.LeaseDescription, $"%{filter.Details}%") || EF.Functions.Like(l.LeaseNotes, $"%{filter.Details}%"));
+ predicateBuilder = predicateBuilder.And(x => x.RegionCode != null && filter.Regions.Any(r => r == x.RegionCode));
}
return predicateBuilder;
diff --git a/source/backend/dal/Repositories/ManagementFileRepository.cs b/source/backend/dal/Repositories/ManagementFileRepository.cs
index 0a8d7704e8..dde4f1f5b7 100644
--- a/source/backend/dal/Repositories/ManagementFileRepository.cs
+++ b/source/backend/dal/Repositories/ManagementFileRepository.cs
@@ -388,7 +388,7 @@ public void DeleteContact(long managementFileId, long contactId)
///
///
///
- public Paged GetPageDeep(ManagementFilter filter)
+ public Paged GetPageDeep(ManagementFilter filter, long? contractorPersonId = null)
{
using var scope = Logger.QueryScope();
@@ -398,7 +398,7 @@ public Paged GetPageDeep(ManagementFilter filter)
throw new ArgumentException("Argument must have a valid filter", nameof(filter));
}
- var query = GetCommonManagementFileQueryDeep(filter);
+ var query = GetCommonManagementFileQueryDeep(filter, contractorPersonId);
var skip = (filter.Page - 1) * filter.Quantity;
var pageItems = query.Skip(skip).Take(filter.Quantity).ToList();
@@ -411,7 +411,7 @@ public Paged GetPageDeep(ManagementFilter filter)
///
/// The filter to apply.
///
- private IQueryable GetCommonManagementFileQueryDeep(ManagementFilter filter)
+ private IQueryable GetCommonManagementFileQueryDeep(ManagementFilter filter, long? contractorPersonId = null)
{
filter.FileNameOrNumberOrReference = Regex.Replace(filter.FileNameOrNumberOrReference ?? string.Empty, @"^[m,M]-", string.Empty);
var predicate = PredicateBuilder.New(disp => true);
@@ -480,6 +480,16 @@ private IQueryable GetCommonManagementFileQueryDeep(Manageme
predicate = predicate.And(x => x.PimsNoticeOfClaims.Any(y => y.ReceivedDt != null || y.Comment != null));
}
+ if (filter.Regions.Any())
+ {
+ predicate = predicate.And(x => x.RegionCode != null && filter.Regions.Any(r => r == x.RegionCode));
+ }
+
+ if (contractorPersonId is not null)
+ {
+ predicate = predicate.And(mgmt => mgmt.PimsManagementFileTeams.Any(x => x.PersonId == contractorPersonId) || (mgmt.Project != null && mgmt.Project.PimsProjectPeople.Any(x => x.PersonId == contractorPersonId)));
+ }
+
var query = this.Context.PimsManagementFiles.AsNoTracking()
.Include(d => d.ManagementFileStatusTypeCodeNavigation)
.Include(d => d.Project)
diff --git a/source/backend/dal/Repositories/ProjectRepository.cs b/source/backend/dal/Repositories/ProjectRepository.cs
index 12c995d39b..2b52a540ec 100644
--- a/source/backend/dal/Repositories/ProjectRepository.cs
+++ b/source/backend/dal/Repositories/ProjectRepository.cs
@@ -41,12 +41,11 @@ public ProjectRepository(PimsContext dbContext, ClaimsPrincipal user, ILogger
///
///
- public IList SearchProjects(string filter, HashSet regions, int maxResults)
+ public IList SearchProjects(string filter, int maxResults)
{
// business requirement - limit search results to user's assigned region(s)
return this.Context.PimsProjects.AsNoTracking()
.Where(p => EF.Functions.Like(p.Description, $"%{filter}%") || EF.Functions.Like(p.Code, $"%{filter}%") || EF.Functions.Like(p.Code + " " + p.Description, $"%{filter}%"))
- .Where(p => regions.Contains(p.RegionCode))
.OrderBy(a => a.Code)
.Take(maxResults)
.ToArray();
@@ -56,7 +55,7 @@ public IList SearchProjects(string filter, HashSet regions,
/// Returns a Paged Result of Projects based on ProjectFilter params.
///
///
- public Task> GetPageAsync(ProjectFilter filter, IEnumerable userRegions)
+ public Task> GetPageAsync(ProjectFilter filter, long? contractorPersonId = null)
{
User.ThrowIfNotAuthorized(Permissions.ProjectView);
filter.ThrowIfNull(nameof(filter));
@@ -65,7 +64,7 @@ public Task> GetPageAsync(ProjectFilter filter, IEnumerable
@@ -205,10 +204,9 @@ public PimsProject GetProjectAtTime(long projectId, DateTime time)
return project;
}
- private async Task> GetPage(ProjectFilter filter, IEnumerable userRegions)
+ private async Task> GetPage(ProjectFilter filter, long? contractorPersonId = null)
{
- var query = Context.PimsProjects.AsNoTracking()
- .Where(p => userRegions.Contains(p.RegionCode));
+ var query = Context.PimsProjects.AsNoTracking();
if (!string.IsNullOrWhiteSpace(filter.ProjectNumber))
{
@@ -225,9 +223,14 @@ private async Task> GetPage(ProjectFilter filter, IEnumerable
query = query.Where(x => x.ProjectStatusTypeCodeNavigation.ProjectStatusTypeCode == filter.ProjectStatusCode);
}
- if (!string.IsNullOrWhiteSpace(filter.ProjectRegionCode))
+ if (contractorPersonId is not null)
{
- query = query.Where(x => x.RegionCode == short.Parse(filter.ProjectRegionCode));
+ query = query.Where(x => x.PimsProjectPeople.Any(x => x.PersonId == contractorPersonId));
+ }
+
+ if (filter.Regions.Any())
+ {
+ query = query.Where(x => filter.Regions.Any(r => r == x.RegionCode));
}
if (filter.Sort?.Any() == true)
diff --git a/source/backend/entities/Models/AcquisitionFilter.cs b/source/backend/entities/Models/AcquisitionFilter.cs
index c44a55d7ee..3f7022e987 100644
--- a/source/backend/entities/Models/AcquisitionFilter.cs
+++ b/source/backend/entities/Models/AcquisitionFilter.cs
@@ -1,3 +1,5 @@
+using System.Collections.Generic;
+
namespace Pims.Dal.Entities.Models
{
public class AcquisitionFilter : PageFilter
@@ -54,6 +56,11 @@ public class AcquisitionFilter : PageFilter
///
public bool HasNoticeOfClaim { get; set; }
+ ///
+ /// get/set - The region types.
+ ///
+ public IList Regions { get; set; } = new List();
+
#endregion
#region Constructors
diff --git a/source/backend/entities/Models/DispositionFilter.cs b/source/backend/entities/Models/DispositionFilter.cs
index f4191280c3..59bdc758c4 100644
--- a/source/backend/entities/Models/DispositionFilter.cs
+++ b/source/backend/entities/Models/DispositionFilter.cs
@@ -1,3 +1,5 @@
+using System.Collections.Generic;
+
namespace Pims.Dal.Entities.Models
{
public class DispositionFilter : PageFilter
@@ -49,6 +51,11 @@ public class DispositionFilter : PageFilter
///
public long? TeamMemberOrganizationId { get; set; }
+ ///
+ /// get/set - The region types.
+ ///
+ public IList Regions { get; set; } = new List();
+
#endregion
#region Constructors
diff --git a/source/backend/entities/Models/LeaseFilter.cs b/source/backend/entities/Models/LeaseFilter.cs
index fbb85914e9..d0cb023b70 100644
--- a/source/backend/entities/Models/LeaseFilter.cs
+++ b/source/backend/entities/Models/LeaseFilter.cs
@@ -90,22 +90,24 @@ public class LeaseFilter : PageFilter
///
public int? LeaseTeamOrganizationId { get; set; }
- public LeaseFilter(string lFileNo, string tenantName, string pid, string pin, string historical, int? leaseTeamPersonId, int? leaseTeamOrganizationId, string[] sort)
- {
- this.LFileNo = lFileNo;
- this.TenantName = tenantName;
- this.Pid = pid;
- this.Pin = pin;
- this.Historical = historical;
- this.LeaseTeamPersonId = leaseTeamPersonId;
- this.LeaseTeamOrganizationId = leaseTeamOrganizationId;
- this.Sort = sort;
- }
-
///
- /// get/set - The region type.
+ /// get/set - The region types.
///
- public int? RegionType { get; set; }
+ public IList Regions { get; set; } = new List();
+
+ public LeaseFilter(string lFileNo, string tenantName, string pid, string pin, string historical, int? leaseTeamPersonId, int? leaseTeamOrganizationId, short[] regions, string[] sort)
+ {
+ LFileNo = lFileNo;
+ TenantName = tenantName;
+ Pid = pid;
+ Pin = pin;
+ Historical = historical;
+ LeaseTeamPersonId = leaseTeamPersonId;
+ LeaseTeamOrganizationId = leaseTeamOrganizationId;
+ Regions = regions;
+
+ Sort = sort;
+ }
///
/// get/set - Filter for additional lease details.
@@ -147,7 +149,6 @@ public override bool IsValid()
|| (Programs.Count != 0)
|| ExpiryStartDate.HasValue
|| ExpiryEndDate.HasValue
- || RegionType.HasValue
|| !string.IsNullOrWhiteSpace(Details);
}
#endregion
diff --git a/source/backend/entities/Models/ManagementFilter.cs b/source/backend/entities/Models/ManagementFilter.cs
index 2d4a2d6819..cfb219d949 100644
--- a/source/backend/entities/Models/ManagementFilter.cs
+++ b/source/backend/entities/Models/ManagementFilter.cs
@@ -1,3 +1,6 @@
+using System;
+using System.Collections.Generic;
+
namespace Pims.Dal.Entities.Models
{
public class ManagementFilter : PageFilter
@@ -59,6 +62,11 @@ public class ManagementFilter : PageFilter
///
public bool HasNoticeOfClaim { get; set; }
+ ///
+ /// get/set - The region types.
+ ///
+ public IList Regions { get; set; } = new List();
+
#endregion
#region Constructors
diff --git a/source/backend/entities/Models/ProjectFilter.cs b/source/backend/entities/Models/ProjectFilter.cs
index c8571d5fa7..71916dc52f 100644
--- a/source/backend/entities/Models/ProjectFilter.cs
+++ b/source/backend/entities/Models/ProjectFilter.cs
@@ -1,3 +1,5 @@
+using System.Collections.Generic;
+
namespace Pims.Dal.Entities.Models
{
public class ProjectFilter : PageFilter
@@ -6,20 +8,16 @@ public ProjectFilter()
{
}
- public ProjectFilter(string projectNumber, string projectName, string projectStatus, string projectRegion)
- {
- ProjectNumber = projectNumber;
- ProjectName = projectName;
- ProjectStatusCode = projectStatus;
- ProjectRegionCode = projectRegion;
- }
-
public string ProjectNumber { get; set; }
public string ProjectName { get; set; }
public string ProjectStatusCode { get; set; }
- public string ProjectRegionCode { get; set; }
+ ///
+ /// get/set - The region types.
+ ///
+ public IList Regions { get; set; } = new List();
+
}
}
diff --git a/source/backend/entities/Partials/LeaseStatusType.cs b/source/backend/entities/Partials/LeaseStatusType.cs
index 04104801fc..a0ce9db748 100644
--- a/source/backend/entities/Partials/LeaseStatusType.cs
+++ b/source/backend/entities/Partials/LeaseStatusType.cs
@@ -32,15 +32,5 @@ public PimsLeaseStatusType()
{
}
#endregion
-
- public static class PimsLeaseStatusTypes
- {
- public const string ACTIVE = "ACTIVE";
- public const string DISCARD = "DISCARD";
- public const string DRAFT = "DRAFT";
- public const string INACTIVE = "INACTIVE";
- public const string TERMINATED = "TERMINATED";
- public const string DUPLICATE = "DUPLICATE";
- }
}
}
diff --git a/source/backend/tests/api/Services/AcquisitionFileServiceTest.cs b/source/backend/tests/api/Services/AcquisitionFileServiceTest.cs
index 8d6b4330d6..7f5c28ce12 100644
--- a/source/backend/tests/api/Services/AcquisitionFileServiceTest.cs
+++ b/source/backend/tests/api/Services/AcquisitionFileServiceTest.cs
@@ -3510,7 +3510,7 @@ public void GetAcquisitionFileExport_Success()
var filter = new AcquisitionFilter();
var acquisitionFile = EntityHelper.CreateAcquisitionFile(1);
- acqFilerepository.Setup(x => x.GetAcquisitionFileExportDeep(It.IsAny(), It.IsAny>(), It.IsAny()))
+ acqFilerepository.Setup(x => x.GetAcquisitionFileExportDeep(It.IsAny(), It.IsAny()))
.Returns(new List()
{
acquisitionFile,
@@ -3525,7 +3525,7 @@ public void GetAcquisitionFileExport_Success()
// Assert
Assert.NotNull(result);
Assert.Equal(1, result.Count());
- acqFilerepository.Verify(x => x.GetAcquisitionFileExportDeep(It.IsAny(), It.IsAny>(), It.IsAny()), Times.Once);
+ acqFilerepository.Verify(x => x.GetAcquisitionFileExportDeep(It.IsAny(), It.IsAny()), Times.Once);
}
[Fact]
@@ -3564,7 +3564,7 @@ public void GetAcquisitionFileExport_Success_FlatProperties()
},
};
- acqFilerepository.Setup(x => x.GetAcquisitionFileExportDeep(It.IsAny(), It.IsAny>(), It.IsAny()))
+ acqFilerepository.Setup(x => x.GetAcquisitionFileExportDeep(It.IsAny(), It.IsAny()))
.Returns(new List()
{
acquisitionFile,
@@ -3583,7 +3583,7 @@ public void GetAcquisitionFileExport_Success_FlatProperties()
Assert.Equal("01-2023-01", result[1].FileNumber);
Assert.Equal("000-008-000", result[0].Pid);
Assert.Equal("000-009-000", result[1].Pid);
- acqFilerepository.Verify(x => x.GetAcquisitionFileExportDeep(It.IsAny(), It.IsAny>(), It.IsAny()), Times.Once);
+ acqFilerepository.Verify(x => x.GetAcquisitionFileExportDeep(It.IsAny(), It.IsAny()), Times.Once);
}
#endregion
diff --git a/source/backend/tests/api/Services/LeaseReportsServiceTest.cs b/source/backend/tests/api/Services/LeaseReportsServiceTest.cs
index 979052199d..36e391b9f3 100644
--- a/source/backend/tests/api/Services/LeaseReportsServiceTest.cs
+++ b/source/backend/tests/api/Services/LeaseReportsServiceTest.cs
@@ -58,7 +58,7 @@ public void GetAggregatedLeases_NotAuthorized()
var period = new PimsLeasePeriod() { PeriodStartDate = DateTime.Now, PeriodExpiryDate = DateTime.Now.AddDays(10) };
this.MockCommonServices();
- this.leaseRepository.Setup(x => x.GetAllByFilter(It.IsAny(), It.IsAny>(), true, null)).Returns(new List() { lease });
+ this.leaseRepository.Setup(x => x.GetAllByFilter(It.IsAny(), true, null)).Returns(new List() { lease });
// Act
// Assert
@@ -77,7 +77,7 @@ public void GetAggregatedLeases_Success()
var period = new PimsLeasePeriod() { PeriodStartDate = DateTime.Now, PeriodExpiryDate = DateTime.Now.AddDays(10) };
this.MockCommonServices();
- this.leaseRepository.Setup(x => x.GetAllByFilter(It.IsAny(), It.IsAny>(), true, null)).Returns(new List() { lease });
+ this.leaseRepository.Setup(x => x.GetAllByFilter(It.IsAny(), true, null)).Returns(new List() { lease });
this.userRepository.Setup(x => x.GetByKeycloakUserId(It.IsAny())).Returns(new PimsUser() { PimsRegionUsers = new List() });
// Act
@@ -86,7 +86,7 @@ public void GetAggregatedLeases_Success()
// Assert
leases.Should().HaveCount(1);
leases.FirstOrDefault().Should().Be(lease);
- this.leaseRepository.Verify(x => x.GetAllByFilter(It.IsAny(), It.IsAny>(), true, null));
+ this.leaseRepository.Verify(x => x.GetAllByFilter(It.IsAny(), true, null));
this.userRepository.Verify(x => x.GetByKeycloakUserId(It.IsAny()));
}
#endregion
diff --git a/source/backend/tests/api/Services/LeaseServiceTest.cs b/source/backend/tests/api/Services/LeaseServiceTest.cs
index ef31ee730d..2aa0e67b72 100644
--- a/source/backend/tests/api/Services/LeaseServiceTest.cs
+++ b/source/backend/tests/api/Services/LeaseServiceTest.cs
@@ -57,7 +57,7 @@ public void GetPage_Success()
user.PimsRegionUsers.Add(new PimsRegionUser() { RegionCode = lease.RegionCode.Value });
var leaseRepository = this._helper.GetService>();
- leaseRepository.Setup(x => x.GetPage(It.IsAny(), It.IsAny>(), null))
+ leaseRepository.Setup(x => x.GetPage(It.IsAny(), null))
.Returns(new Paged(new List() { lease }, 1, 1, 1));
var userRepository = this._helper.GetService>();
userRepository.Setup(x => x.GetUserInfoByKeycloakUserId(It.IsAny())).Returns(user);
@@ -67,7 +67,7 @@ public void GetPage_Success()
var properties = service.GetPage(filter, false);
// Assert
- leaseRepository.Verify(x => x.GetPage(filter, It.Is>(r => r.Count == 1 && r.Contains(lease.RegionCode.Value)), null), Times.Once);
+ leaseRepository.Verify(x => x.GetPage(filter, null), Times.Once);
}
[Fact]
public void GetPage_Contractor_Success()
@@ -82,7 +82,7 @@ public void GetPage_Contractor_Success()
user.PersonId = 1;
var leaseRepository = this._helper.GetService>();
- leaseRepository.Setup(x => x.GetPage(It.IsAny(), It.IsAny>(), null))
+ leaseRepository.Setup(x => x.GetPage(It.IsAny(), null))
.Returns(new Paged(new List() { lease }, 1, 1, 1));
var userRepository = this._helper.GetService>();
userRepository.Setup(x => x.GetUserInfoByKeycloakUserId(It.IsAny())).Returns(user);
@@ -93,7 +93,7 @@ public void GetPage_Contractor_Success()
// Assert
// PersonId should be passed to ensure contractor only sees leases they are assigned to
- leaseRepository.Verify(x => x.GetPage(filter, It.Is>(r => r.Count == 1 && r.Contains(lease.RegionCode.Value)), user.PersonId), Times.Once);
+ leaseRepository.Verify(x => x.GetPage(filter, user.PersonId), Times.Once);
}
[Fact]
@@ -120,7 +120,7 @@ public void GetPage_All_ShouldIgnorePagination_Success()
// Assert
// Pagination should be ignored and all results should be returned when "all" parameter is true
- leaseRepository.Verify(x => x.GetPage(It.Is(f => f.Page == 1 && f.Quantity == 55), It.IsAny>(), null), Times.Once);
+ leaseRepository.Verify(x => x.GetPage(It.Is(f => f.Page == 1 && f.Quantity == 55), null), Times.Once);
}
#endregion
diff --git a/source/backend/tests/api/Services/ManagementFileServiceTest.cs b/source/backend/tests/api/Services/ManagementFileServiceTest.cs
index d6ce120add..a9829181cc 100644
--- a/source/backend/tests/api/Services/ManagementFileServiceTest.cs
+++ b/source/backend/tests/api/Services/ManagementFileServiceTest.cs
@@ -1,8 +1,5 @@
-using System;
-using System.Collections.Generic;
-using System.Diagnostics.CodeAnalysis;
-using System.Linq;
using FluentAssertions;
+using k8s.KubeConfigModels;
using Moq;
using NetTopologySuite.Geometries;
using Pims.Api.Constants;
@@ -16,6 +13,10 @@
using Pims.Dal.Entities.Models;
using Pims.Dal.Exceptions;
using Pims.Dal.Repositories;
+using System;
+using System.Collections.Generic;
+using System.Diagnostics.CodeAnalysis;
+using System.Linq;
using Xunit;
namespace Pims.Api.Test.Services
@@ -1508,13 +1509,17 @@ public void GetPage_Success()
var managementFile = EntityHelper.CreateManagementFile();
var repository = this._helper.GetService>();
- repository.Setup(x => x.GetPageDeep(It.IsAny())).Returns(new Paged(new[] { managementFile }));
+ repository.Setup(x => x.GetPageDeep(It.IsAny(), null)).Returns(new Paged(new[] { managementFile }));
+
+ var userRepository = _helper.GetService>();
+ var user = EntityHelper.CreateUser("Test");
+ userRepository.Setup(x => x.GetUserInfoByKeycloakUserId(It.IsAny())).Returns(user);
// Act
var result = service.GetPage(new ManagementFilter());
// Assert
- repository.Verify(x => x.GetPageDeep(It.IsAny()), Times.Once);
+ repository.Verify(x => x.GetPageDeep(It.IsAny(), null), Times.Once);
}
[Fact]
diff --git a/source/backend/tests/api/Services/ProjectServiceTest.cs b/source/backend/tests/api/Services/ProjectServiceTest.cs
index 482fb29fe1..6e03866c9d 100644
--- a/source/backend/tests/api/Services/ProjectServiceTest.cs
+++ b/source/backend/tests/api/Services/ProjectServiceTest.cs
@@ -47,7 +47,7 @@ public void Search_Success()
var projectList = new List() { project };
var repository = this._helper.GetService>();
- repository.Setup(x => x.SearchProjects(It.IsAny(), It.IsAny>(), It.IsAny())).Returns(projectList);
+ repository.Setup(x => x.SearchProjects(It.IsAny(), It.IsAny())).Returns(projectList);
var userRepository = this._helper.GetService>();
userRepository.Setup(x => x.GetUserInfoByKeycloakUserId(It.IsAny())).Returns(EntityHelper.CreateUser("Test"));
@@ -56,7 +56,7 @@ public void Search_Success()
var result = service.SearchProjects("query string", 1);
// Assert
- repository.Verify(x => x.SearchProjects(It.IsAny(), It.IsAny>(), It.IsAny()), Times.Once);
+ repository.Verify(x => x.SearchProjects(It.IsAny(), It.IsAny()), Times.Once);
}
[Fact]
@@ -100,7 +100,7 @@ public void Search_GetPage_ShouldFail_Filter_IsNull()
// Assert
act.Should().Throw();
- repository.Verify(x => x.GetPageAsync(It.IsAny(), It.IsAny>()), Times.Never);
+ repository.Verify(x => x.GetPageAsync(It.IsAny(), null), Times.Never);
}
[Fact]
@@ -118,7 +118,7 @@ public void Search_GetPage_ShouldFail_Filter_IsInvalid()
// Assert
act.Should().Throw();
- repository.Verify(x => x.GetPageAsync(It.IsAny(), It.IsAny>()), Times.Never);
+ repository.Verify(x => x.GetPageAsync(It.IsAny(), null), Times.Never);
}
[Fact]
@@ -128,7 +128,7 @@ public async void Search_GetPage_Success()
var service = this.CreateProjectServiceWithPermissions(Permissions.ProjectView);
var repository = this._helper.GetService>();
- repository.Setup(x => x.GetPageAsync(It.IsAny(), It.IsAny>()))
+ repository.Setup(x => x.GetPageAsync(It.IsAny(), null))
.ReturnsAsync(new Paged()
{
Page = 1,
@@ -141,7 +141,7 @@ public async void Search_GetPage_Success()
// Assert
result.Should().NotBeNull();
- repository.Verify(x => x.GetPageAsync(It.IsAny(), It.IsAny>()), Times.Once);
+ repository.Verify(x => x.GetPageAsync(It.IsAny(), null), Times.Once);
}
[Fact]
@@ -155,7 +155,7 @@ public void GetAll_Success()
var projectList = new List() { project };
var repository = this._helper.GetService