From 006b9b9d4e0f9f65a0290676425080da2710d9b6 Mon Sep 17 00:00:00 2001 From: Alan Leung Date: Wed, 10 Nov 2021 13:10:17 -0800 Subject: [PATCH] Fix so that no expertise code in PLR record doesn't cause error (#1744) * Broken - Help Marty! * Fix as ExpertiseCode may be null * Catch PLR server errors with a default * Improve responsiveness of Overview page * Added comment * Added sample test file for convenience * Update to net5.0 to be compatible with prime-dotnet-webapi dependency Co-authored-by: Alan Leung Co-authored-by: Martin Pultz --- .../enrollee-overview.component.ts | 43 ++++++++++-------- .../Services/PlrProviderService.cs | 4 +- .../PRIME_Test_Data_PLR_IAT20210617_v2.0.xls | Bin 0 -> 36086 bytes .../PlrIntakeUtility/PlrIntakeUtility.csproj | 2 +- 4 files changed, 27 insertions(+), 22 deletions(-) create mode 100644 utilities/PlrIntakeUtility/PRIME_Test_Data_PLR_IAT20210617_v2.0.xls diff --git a/prime-angular-frontend/src/app/modules/adjudication/pages/enrollee-overview/enrollee-overview.component.ts b/prime-angular-frontend/src/app/modules/adjudication/pages/enrollee-overview/enrollee-overview.component.ts index ecc80c6411..1dc292bdd8 100644 --- a/prime-angular-frontend/src/app/modules/adjudication/pages/enrollee-overview/enrollee-overview.component.ts +++ b/prime-angular-frontend/src/app/modules/adjudication/pages/enrollee-overview/enrollee-overview.component.ts @@ -1,8 +1,8 @@ import { Component, Inject, OnInit } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Router } from '@angular/router'; -import { map } from 'rxjs/operators'; -import { forkJoin } from 'rxjs'; +import { catchError, exhaustMap, map } from 'rxjs/operators'; +import { forkJoin, of } from 'rxjs'; import { PermissionService } from '@auth/shared/services/permission.service'; import { ToastService } from '@core/services/toast.service'; @@ -75,14 +75,10 @@ export class EnrolleeOverviewComponent extends AdjudicationContainerComponent im .subscribe((enrollee: HttpEnrollee) => this.enrollee = enrollee); this.paperEnrolmentResource.getAdjudicationDocuments(+this.route.snapshot.params.id) - .subscribe(documents => { - this.documents = documents - }); + .subscribe(documents => this.documents = documents); this.enrolmentResource.getCurrentEnrolleeAbsence(+this.route.snapshot.params.id) - .subscribe((absence: EnrolleeAbsence) => { - this.absence = absence - }); + .subscribe((absence: EnrolleeAbsence) => this.absence = absence); } private loadEnrollee(enrolleeId: number): void { @@ -97,18 +93,25 @@ export class EnrolleeOverviewComponent extends AdjudicationContainerComponent im })) ), enrolleeNavigation: this.adjudicationResource.getAdjacentEnrolleeId(enrolleeId), - plrInfo: this.adjudicationResource.getPlrInfoByEnrolleeId(enrolleeId) - }) - .subscribe(({ enrollee, enrolleeNavigation, plrInfo }) => { - this.enrollee = enrollee.enrollee; - this.enrollees = [enrollee.enrolleeView]; - this.enrolment = enrollee.enrolment; - this.enrolleeNavigation = enrolleeNavigation; - this.plrInfo = plrInfo; - // hide the adjudication card if enrolment is editable and no 'reason for adjudication' - this.showAdjudication = !(enrollee.enrollee.currentStatus.statusCode === EnrolmentStatusEnum.EDITABLE - && !enrollee.enrollee.currentStatus.enrolmentStatusReasons?.length); - }); + }).pipe( + map( + ({ enrollee, enrolleeNavigation }) => { + // Complete this first before attempting to get PLR info, so user can see information rendered sooner + this.enrollee = enrollee.enrollee; + this.enrollees = [enrollee.enrolleeView]; + this.enrolment = enrollee.enrolment; + this.enrolleeNavigation = enrolleeNavigation; + // hide the adjudication card if enrolment is editable and no 'reason for adjudication' + this.showAdjudication = !(enrollee.enrollee.currentStatus.statusCode === EnrolmentStatusEnum.EDITABLE + && !enrollee.enrollee.currentStatus.enrolmentStatusReasons?.length); + return enrolleeId; + } + ), + exhaustMap((enrolleeId: number) => this.adjudicationResource.getPlrInfoByEnrolleeId(enrolleeId) + .pipe( + map((plrInfo: PlrInfo[]) => this.plrInfo = plrInfo), + catchError(_ => of([])))) + ).subscribe(); } private enrolmentAdapter(enrollee: HttpEnrollee): Enrolment { diff --git a/prime-dotnet-webapi/Services/PlrProviderService.cs b/prime-dotnet-webapi/Services/PlrProviderService.cs index a38f8a75bc..af5a97aebf 100644 --- a/prime-dotnet-webapi/Services/PlrProviderService.cs +++ b/prime-dotnet-webapi/Services/PlrProviderService.cs @@ -72,10 +72,12 @@ public async Task> GetPlrDataByCollegeIdsAsync(IEnumer .ProjectTo(_mapper.ConfigurationProvider, new { plrRoleTypes, plrStatusReasons }) .ToListAsync(); + // If a PlrViewModel has ExpertiseCodes, translate the codes to human-readable text // PlrProvider's Expertise array does not play well with automapper ProjectTo, map manually before return return plr.Select(p => { - p.Expertise = string.Join(", ", _context.Set().Where(e => p.ExpertiseCode.Contains(e.Code)).Select(e => e.Name)); + p.Expertise = string.Join(", ", _context.Set().Where(e => + (p.ExpertiseCode != null && p.ExpertiseCode.Contains(e.Code))).Select(e => e.Name)); return p; }); } diff --git a/utilities/PlrIntakeUtility/PRIME_Test_Data_PLR_IAT20210617_v2.0.xls b/utilities/PlrIntakeUtility/PRIME_Test_Data_PLR_IAT20210617_v2.0.xls new file mode 100644 index 0000000000000000000000000000000000000000..effc55943ae670c5db6621bf023a776fb0836425 GIT binary patch literal 36086 zcmeI*33MIFSugOmwOjkHJK9?NdZoKBlVv1JvaK0Q)<_!9ctWu6*orMIONk_Va0o#O z3Hy?Su)l!A_Si#M0s#UJ`@Zk10|dhMAdrMDWZwV#s_TEdlK? zzV2UFb$4}N&oBLA^Mkj)^O5&?$Ns$3EAu|~LXB4$%0GeMWzj!Po_7+zNcv+hyzqj_ z^gR6fUw{4|+5`WJSjA74av)Y<5%Vf6)mUnJ3}YF=GKysk%Q%(^ER$HKuuNl# zVwu4*izS97jwOL5i6w<4jU|I6izSC8kL6J;FT(O-EHAQnZq)V)79Mhzdoy2U$r!nQAee|(9LV$N8a%9`Tx14t`yS00`v*kZsxQp|~nZ5l(f8%h*e|+!8F3v9( z$ULp&3um*18{0cO+s_xS-t?CW2Zs`0>RCU#mPCB%R18&Q zlgVfTAI9k|6d&p=9b&p8O<%6BV?llQG_k^E+Hj980dEJZ2d^DfT9Od07EYlS;oJ7_@n+Q#xTkWIys=(4E{_8j6p*xU8jw@py! zrMU~z3vzMUQK@VynocGY?%{??O2?Ehxu0yVi76}lX{E4xduzuYa2rb(msYXeaqOr> zCYJCwZ`|I!wzcoi-`PSr?9R2q{>_6s!O@pr^Ak_XNRr8DPtB&I`FuL&9(`J8$tW|i zQc*J3M48i0vA4f%V_aH3du|hlS3D2MvwJ(&wsy@Shpkz>y?eEwgIxZ+pL{Zo(9&@k z2xqd5>?6KUYpIT32vvR34g34o$<P~= zI}|G`xz{pwG;{VEbLBj-vb>0$mX5_@Nj*`lpxLM8++MhaW^ua4+2ia6xZ`x2gkL)xW9czE`~R5Z6Ds)+E>Te<9_Bz`8bYjtV$;_j>R$w9$gPRv#0FE zwxh^g8(0>RKEAcLdmVr4xQdCSIEJMZc7uO@Z+C0wu3l-N>GkcaH*W2jtFz2SKffU3 zb2cFZ8A@a5&*XS?J^WmrvRBw{TsGInl|wvsB+bNesGlk9U?kx6Y;4WXE(w|5m1Hx; zv(Cdu&y>B2cAK`jw&^?$qF}VlWYckfZGY?V(Ch_ttWBJk&6)6G?yR4DLOOmbE;}Ka zNJL}lbn)PM=qWi{^59`EHvPidCJ&xe3{4;d@nQ5me^G|ThNH z;9wiqh4$_!anX;TF&8#^0!-svgF_p>JOQGvlB0OG=1 zILE^0`i4B}IImP~U8Q5PM~H)$wYfGX z8D3Uy-zeO=Rk(&dQ#iKO}B)U&&oknQ;j`aS>e5- z>*uT9JBME}iT4TKD`l$5|3CKUz~6ltpER7tbA|6HFPy+>+ItCpp1>Tk{NAcR-=XnpFpR$vr~VNRy6{1hhM(WQr`hlY@<#|pS=N>_Jb zC61uWf>(;F((x>oH0(EOz);7yptiwvIZNveCQRBv=w{H3KE3<1W zedR6KH<)jctVa(HY;FyncVPcYuGG>lwP=xzjlS|GJmA39xCy~GW!muI0+UGG!}<&M zP6Q7#Fe2J~vtR7WNAQ#bR}z}U=F6V7zvH9*c>aMWCpHIbL!UM~bsCRH#$?}5`dSQS z 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 Exe - netcoreapp3.1 + net5.0