Skip to content

Commit 1007f36

Browse files
committed
added guards to prevent user from submitting multiple draft eligibilities when their application was submitted. Refreshed dynamics entities and added mappers for a new status. Fixed unit tests for IcraEligibility and added ability to mark old eligibility applications as ineligible. Refreshed openAPI and added front end route guard
1 parent 0906909 commit 1007f36

File tree

15 files changed

+1485
-189
lines changed

15 files changed

+1485
-189
lines changed

src/ECER.Clients.RegistryPortal/ECER.Clients.RegistryPortal.Server/ICRA/ICRAEligibilitiesEndpoints.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,8 @@ public enum ICRAStatus
157157
Ineligible,
158158
InReview,
159159
ReadyforReview,
160-
Submitted
160+
Submitted,
161+
ReadyforAssessment
161162
}
162163

163164
public record ICRAEligibilitySubmissionRequest(string Id);

src/ECER.Clients.RegistryPortal/ecer.clients.registryportal.client/src/router.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { useFormStore } from "./store/form";
88
import { useMessageStore } from "./store/message";
99
import { useWizardStore } from "./store/wizard";
1010
import { useConfigStore } from "./store/config";
11+
import { useIcraStore } from "./store/icra";
1112

1213
const router = createRouter({
1314
history: createWebHistory(),
@@ -294,6 +295,16 @@ const router = createRouter({
294295
path: "/icra-eligibility",
295296
component: () => import("./components/pages/IcraEligibility.vue"),
296297
meta: { requiresAuth: true, requiresVerification: true, requiresICRAFeature: true },
298+
beforeEnter: (to, from, next) => {
299+
//guard to prevent users from coming here if they have a submitted in-progress ICRA Eligibility application
300+
const icraStore = useIcraStore();
301+
if (icraStore.hasSubmittedIcraEligibility) {
302+
console.warn("User has a submitted ICRA Eligibility application, redirecting to home page.");
303+
next({ path: "/" });
304+
} else {
305+
next();
306+
}
307+
},
297308
},
298309
{
299310
path: "/icra-eligibility/check",

src/ECER.Clients.RegistryPortal/ecer.clients.registryportal.client/src/store/icra.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,14 @@ export const useIcraStore = defineStore("icra", {
3636
icraEligibilityStatus(state): Components.Schemas.ICRAStatus | undefined {
3737
return state.icraEligibility?.status;
3838
},
39+
hasSubmittedIcraEligibility(state): boolean {
40+
return (
41+
state.icraEligibility?.status === "Submitted" ||
42+
state.icraEligibility?.status === "InReview" ||
43+
state.icraEligibility?.status === "ReadyforReview" ||
44+
state.icraEligibility?.status === "ReadyforAssessment"
45+
);
46+
},
3947
},
4048
actions: {
4149
async fetchIcraEligibilities() {

src/ECER.Clients.RegistryPortal/ecer.clients.registryportal.client/src/types/openapi.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,7 @@ declare namespace Components {
330330
export interface ICRAEligibilitySubmissionRequest {
331331
id?: string | null;
332332
}
333-
export type ICRAStatus = "Active" | "Draft" | "Eligible" | "Inactive" | "Ineligible" | "InReview" | "ReadyforReview" | "Submitted";
333+
export type ICRAStatus = "Active" | "Draft" | "Eligible" | "Inactive" | "Ineligible" | "InReview" | "ReadyforReview" | "Submitted" | "ReadyforAssessment";
334334
export interface IdentificationType {
335335
id?: string | null;
336336
name?: string | null;

src/ECER.Managers.Registry.Contract/ICRA/Contract.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ public enum SubmissionError
2929
DraftIcraEligibilityNotFound,
3030
DraftIcraEligibilityValidationFailed
3131
}
32+
3233
public record ICRAEligibility()
3334
{
3435
public string? Id { get; set; }
@@ -86,5 +87,6 @@ public enum ICRAStatus
8687
Ineligible,
8788
InReview,
8889
ReadyforReview,
89-
Submitted
90+
Submitted,
91+
ReadyforAssessment
9092
}

src/ECER.Managers.Registry/ICRAEligibilityHandlers.cs

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
using AutoMapper;
2+
using ECER.Engines.Validation.ICRA;
23
using ECER.Infrastructure.Common;
3-
using ECER.Managers.Registry.Contract.Applications;
44
using ECER.Managers.Registry.Contract.ICRA;
5-
using ECER.Resources.Documents.Applications;
65
using ECER.Resources.Documents.ICRA;
76
using MediatR;
8-
using ECER.Engines.Validation.ICRA;
9-
107

118
namespace ECER.Managers.Registry;
129

@@ -21,7 +18,6 @@ public class ICRAEligibilityHandlers(
2118
IRequestHandler<ICRAEligibilitiesQuery, ICRAEligibilitiesQueryResults>,
2219
IRequestHandler<SubmitICRAEligibilityCommand, SubmitICRAEligibilityResult>
2320
{
24-
2521
public async Task<Contract.ICRA.ICRAEligibility?> Handle(SaveICRAEligibilityCommand request, CancellationToken cancellationToken)
2622
{
2723
ArgumentNullException.ThrowIfNull(request);
@@ -30,14 +26,25 @@ public class ICRAEligibilityHandlers(
3026
var icraEligibilities = await iCRARepository.Query(new ICRAQuery
3127
{
3228
ByApplicantId = request.eligibility.ApplicantId,
33-
ByStatus = [Resources.Documents.ICRA.ICRAStatus.Draft] // IDE0028: already simplified
29+
ByStatus = new Resources.Documents.ICRA.ICRAStatus[] {
30+
Resources.Documents.ICRA.ICRAStatus.Draft,
31+
Resources.Documents.ICRA.ICRAStatus.Submitted,
32+
Resources.Documents.ICRA.ICRAStatus.InReview,
33+
Resources.Documents.ICRA.ICRAStatus.ReadyforReview,
34+
Resources.Documents.ICRA.ICRAStatus.ReadyforAssessment
35+
}
3436
}, cancellationToken);
3537

36-
var existingDraftICRA = icraEligibilities.FirstOrDefault();
37-
if (existingDraftICRA != null)
38+
//this checks for any submitted Icra eligibilities
39+
if (icraEligibilities.Any(e => e.Status != Resources.Documents.ICRA.ICRAStatus.Draft))
40+
{
41+
throw new InvalidOperationException($"Applicant id: {request.eligibility.ApplicantId} has a submitted Icra eligibility assessment in progress. A new draft cannot be created.");
42+
}
43+
44+
if (icraEligibilities.Any(e => e.Status == Resources.Documents.ICRA.ICRAStatus.Draft))
3845
{
3946
// user already has a draft icra eligibility
40-
throw new InvalidOperationException($"User already has a draft ICRA with id '{existingDraftICRA.Id}'");
47+
throw new InvalidOperationException($"Applicant id: {request.eligibility.ApplicantId} has a draft ICRA in progress. A new draft cannot be created");
4148
}
4249
}
4350
var iCRAEligibilityId = await iCRARepository.Save(mapper.Map<Resources.Documents.ICRA.ICRAEligibility>(request.eligibility)!, cancellationToken);
@@ -62,7 +69,8 @@ public async Task<SubmitICRAEligibilityResult> Handle(SubmitICRAEligibilityComma
6269
Resources.Documents.ICRA.ICRAStatus.Draft,
6370
Resources.Documents.ICRA.ICRAStatus.Submitted,
6471
Resources.Documents.ICRA.ICRAStatus.InReview,
65-
Resources.Documents.ICRA.ICRAStatus.ReadyforReview
72+
Resources.Documents.ICRA.ICRAStatus.ReadyforReview,
73+
Resources.Documents.ICRA.ICRAStatus.ReadyforAssessment
6674
}
6775
}, cancellationToken);
6876

@@ -90,7 +98,6 @@ public async Task<SubmitICRAEligibilityResult> Handle(SubmitICRAEligibilityComma
9098
return new SubmitICRAEligibilityResult { Eligibility = mapper.Map<Contract.ICRA.ICRAEligibility>(fresh.SingleOrDefault()) };
9199
}
92100

93-
94101
public async Task<ICRAEligibilitiesQueryResults> Handle(ICRAEligibilitiesQuery request, CancellationToken cancellationToken)
95102
{
96103
ArgumentNullException.ThrowIfNull(request);
@@ -103,5 +110,4 @@ public async Task<ICRAEligibilitiesQueryResults> Handle(ICRAEligibilitiesQuery r
103110
}, cancellationToken);
104111
return new ICRAEligibilitiesQueryResults(mapper.Map<IEnumerable<Contract.ICRA.ICRAEligibility>>(eligibilities)!);
105112
}
106-
107113
}

src/ECER.Resources.Documents/ICRA/ICRARepository.cs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ namespace ECER.Resources.Documents.ICRA;
99

1010
internal sealed partial class ICRARepository : IICRARepository
1111
{
12-
1312
private readonly EcerContext context;
1413
private readonly IMapper mapper;
1514
private readonly IObjecStorageProvider objectStorageProvider;
@@ -74,7 +73,7 @@ public async Task<string> Save(ICRAEligibility iCRAEligibility, CancellationToke
7473
else
7574
{
7675
var existingIcraEligibility = context.ecer_ICRAEligibilityAssessmentSet.SingleOrDefault(c => c.ecer_ICRAEligibilityAssessmentId == icraEligibility.ecer_ICRAEligibilityAssessmentId);
77-
if (existingIcraEligibility == null || existingIcraEligibility.StatusCode!=ecer_ICRAEligibilityAssessment_StatusCode.Draft) throw new InvalidOperationException($"ecer_ICRAEligibilityAssessmentId '{icraEligibility.ecer_ICRAEligibilityAssessmentId}' not found or is not draft!");
76+
if (existingIcraEligibility == null || existingIcraEligibility.StatusCode != ecer_ICRAEligibilityAssessment_StatusCode.Draft) throw new InvalidOperationException($"ecer_ICRAEligibilityAssessmentId '{icraEligibility.ecer_ICRAEligibilityAssessmentId}' not found or is not draft!");
7877

7978
if (icraEligibility.ecer_DateSigned.HasValue && existingIcraEligibility.ecer_DateSigned.HasValue) icraEligibility.ecer_DateSigned = existingIcraEligibility.ecer_DateSigned;
8079

@@ -102,4 +101,17 @@ public async Task<string> Submit(string icraEligibilityId, CancellationToken can
102101
context.SaveChanges();
103102
return icraEligibilityId;
104103
}
104+
105+
//This method is used for our unit tests to disable eligibility applications so multiple tests so not conflict
106+
public async Task<string> SetIneligibleForUnitTests(string icraEligibilityId, CancellationToken cancellationToken)
107+
{
108+
await Task.CompletedTask;
109+
var icra = context.ecer_ICRAEligibilityAssessmentSet.FirstOrDefault(d => d.ecer_ICRAEligibilityAssessmentId == Guid.Parse(icraEligibilityId) && d.ecer_ApplicantIdName.Contains("TEST"));
110+
if (icra == null) throw new InvalidOperationException($"ICRA Eligibility '{icraEligibilityId}' not found or this application does not belong to a test account");
111+
112+
icra.StatusCode = ecer_ICRAEligibilityAssessment_StatusCode.Ineligible;
113+
context.UpdateObject(icra);
114+
context.SaveChanges();
115+
return icraEligibilityId;
116+
}
105117
}

src/ECER.Resources.Documents/ICRA/IICRARepository.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ public interface IICRARepository
77
Task<string> Save(ICRAEligibility iCRAEligibility, CancellationToken cancellationToken);
88

99
Task<string> Submit(string icraEligibilityId, CancellationToken cancellationToken);
10+
11+
Task<string> SetIneligibleForUnitTests(string icraEligibilityId, CancellationToken cancellationToken);
1012
}
1113

1214
public record ICRAQuery
@@ -73,5 +75,6 @@ public enum ICRAStatus
7375
Ineligible,
7476
InReview,
7577
ReadyforReview,
76-
Submitted
78+
Submitted,
79+
ReadyforAssessment
7780
}

0 commit comments

Comments
 (0)