Skip to content

Commit a9e02c7

Browse files
authored
Merge pull request #2504 from sam-warren/DEVOPS-43
DEVOPS-43: Responder Portal Support Limits
2 parents f106930 + c1b14ca commit a9e02c7

File tree

11 files changed

+248
-30
lines changed

11 files changed

+248
-30
lines changed

ess/src/API/EMBC.ESS/Resources/Tasks/Contract.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,15 @@ public record EssTask : Task
4747
public bool RemoteExtensionsEnabled { get; set; }
4848
public bool SelfServeEnabled { get; set; }
4949
public IEnumerable<SupportConfiguration> EnabledSupports { get; set; } = [];
50+
public IEnumerable<SupportConfiguration> SupportLimits { get; set; } = [];
5051
}
5152

5253
public record SupportConfiguration
5354
{
5455
public SupportType SupportType { get; set; }
56+
public DateTime SupportLimitStartDate { get; set; }
57+
public DateTime SupportLimitEndDate { get; set; }
58+
public bool ExtensionAvailable { get; set; }
5559
}
5660

5761
public enum SupportType

ess/src/API/EMBC.ESS/Resources/Tasks/Mappings.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,28 @@ public Mappings()
2020
.ForMember(d => d.SelfServeEnabled, opts => opts.MapFrom(s => s.era_selfservetoggle))
2121
.ForMember(d => d.AutoApprovedEnabled, opts => opts.Ignore())
2222
.ForMember(d => d.EnabledSupports, opts => opts.MapFrom(s => s.era_era_task_era_selfservesupportlimits_Task.Where(sl => sl.statuscode == 1)))
23+
.ForMember(d => d.SupportLimits, opts => opts.MapFrom(s => s.era_era_task_era_supportlimit_Task.Where(sl => sl.statuscode == 1)))
2324
;
2425

2526
CreateMap<era_selfservesupportlimits, SupportConfiguration>()
2627
.ForMember(d => d.SupportType, opts => opts.MapFrom(s => s.era_supporttypeoption))
28+
.ForMember(d => d.ExtensionAvailable, opts => opts.MapFrom(s => s.era_extensionavailable))
29+
.ForMember(d => d.SupportLimitStartDate, opts => opts.MapFrom(s => s.era_supportlimitstartdate.HasValue ? s.era_supportlimitstartdate.Value.UtcDateTime : (DateTime?)null))
30+
.ForMember(d => d.SupportLimitEndDate, opts => opts.MapFrom(s => s.era_supportlimitenddate.HasValue ? s.era_supportlimitenddate.Value.UtcDateTime : (DateTime?)null))
2731
;
32+
33+
CreateMap<era_supportlimit, SupportConfiguration>()
34+
.ForMember(d => d.SupportType, opts => opts.MapFrom(s => s.era_supporttypeoption))
35+
.ForMember(d => d.ExtensionAvailable, opts => opts.MapFrom(s => s.era_extensionavailable))
36+
.ForMember(d => d.SupportLimitStartDate, opts => opts.MapFrom(s => s.era_supportlimitstartdate.HasValue ? s.era_supportlimitstartdate.Value.UtcDateTime : (DateTime?)null))
37+
.ForMember(d => d.SupportLimitEndDate, opts => opts.MapFrom(s => s.era_supportlimitenddate.HasValue ? s.era_supportlimitenddate.Value.UtcDateTime : (DateTime?)null))
38+
;
39+
40+
CreateMap<EMBC.ESS.Resources.Tasks.SupportConfiguration, EMBC.ESS.Shared.Contracts.Events.SupportLimits>()
41+
.ForMember(dest => dest.SupportType, opts => opts.MapFrom(src => src.SupportType))
42+
.ForMember(dest => dest.SupportLimitStartDate, opts => opts.MapFrom(src => src.SupportLimitStartDate))
43+
.ForMember(dest => dest.SupportLimitEndDate, opts => opts.MapFrom(src => src.SupportLimitEndDate))
44+
.ForMember(dest => dest.ExtensionAvailable, opts => opts.MapFrom(src => src.ExtensionAvailable))
45+
;
2846
}
2947
}

ess/src/API/EMBC.ESS/Resources/Tasks/TaskRepository.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,17 @@ private async Task<IEnumerable<era_task>> QueryTasks(TaskQuery query, Cancellati
6565
essContext.era_tasks
6666
.Expand(t => t.era_JurisdictionID)
6767
.Expand(t => t.era_era_task_era_selfservesupportlimits_Task)
68+
.Expand(t => t.era_era_task_era_supportlimit_Task)
6869
.Where(t => t.era_name == query.ById)
6970
.GetAllPagesAsync(ct)).ToList();
7071

7172
await Parallel.ForEachAsync(tasks, ct, async (t, ct1) =>
7273
{
7374
var selfServeSupports = (await essContext.era_selfservesupportlimitses.Expand(sl => sl.era_SupportType).Where(sl => sl._era_task_value == t.era_taskid).GetAllPagesAsync(ct1)).ToList();
7475
t.era_era_task_era_selfservesupportlimits_Task = new System.Collections.ObjectModel.Collection<era_selfservesupportlimits>(selfServeSupports);
76+
77+
var supportLimits = (await essContext.era_supportlimits.Expand(sl => sl.era_SupportType).Where(sl => sl._era_task_value == t.era_taskid).GetAllPagesAsync(ct1)).ToList();
78+
t.era_era_task_era_supportlimit_Task = new System.Collections.ObjectModel.Collection<era_supportlimit>(supportLimits);
7579
});
7680

7781
return tasks;

responders/src/API/EMBC.Responders.API/Controllers/TasksController.cs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ public async Task<ActionResult<ESSTask>> GetTask(string taskId)
4545
if (task == null) return NotFound(taskId);
4646
var mappedTask = mapper.Map<ESSTask>(task);
4747
mappedTask.Workflows = GetTaskWorkflows(task);
48+
mappedTask.SupportLimits = GetTaskSupportLimits(task);
4849
return Ok(mappedTask);
4950
}
5051

@@ -60,6 +61,24 @@ private static IEnumerable<TaskWorkflow> GetTaskWorkflows(IncidentTask incidentT
6061
return workflows;
6162
}
6263

64+
private static IEnumerable<SupportLimits> GetTaskSupportLimits(IncidentTask incidentTask)
65+
{
66+
if (incidentTask.SupportLimits == null || !incidentTask.SupportLimits.Any())
67+
{
68+
return Enumerable.Empty<SupportLimits>();
69+
}
70+
71+
var supportLimits = incidentTask.SupportLimits.Select(sl => new SupportLimits
72+
{
73+
SupportType = sl.SupportType,
74+
SupportLimitStartDate = sl.SupportLimitStartDate,
75+
SupportLimitEndDate = sl.SupportLimitEndDate,
76+
ExtensionAvailable = sl.ExtensionAvailable
77+
});
78+
79+
return supportLimits;
80+
}
81+
6382
[HttpGet("{taskId}/suppliers")]
6483
[ProducesResponseType(StatusCodes.Status404NotFound)]
6584
[ProducesResponseType(StatusCodes.Status200OK)]
@@ -96,6 +115,7 @@ public class ESSTask
96115
public string Description { get; set; }
97116
public string Status { get; set; }
98117
public IEnumerable<TaskWorkflow> Workflows { get; set; } = Array.Empty<TaskWorkflow>();
118+
public IEnumerable<SupportLimits> SupportLimits { get; set; } = Array.Empty<SupportLimits>();
99119
}
100120

101121
public class TaskWorkflow
@@ -125,7 +145,8 @@ public class TaskMapping : Profile
125145
public TaskMapping()
126146
{
127147
CreateMap<IncidentTask, ESSTask>()
128-
.ForMember(d => d.Workflows, opts => opts.Ignore());
148+
.ForMember(d => d.Workflows, opts => opts.Ignore())
149+
.ForMember(d => d.SupportLimits, opts => opts.MapFrom(s => s.SupportLimits));
129150
CreateMap<SupplierDetails, SuppliersListItem>();
130151
}
131152
}

responders/src/UI/embc-responder/src/app/core/api/models/ess-task.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/* tslint:disable */
22
/* eslint-disable */
33
import { TaskWorkflow } from '../models/task-workflow';
4+
import { SupportLimit } from './support-limit';
45
export interface EssTask {
56
communityCode?: string | null;
67
description?: string | null;
@@ -9,4 +10,5 @@ export interface EssTask {
910
startDate?: string;
1011
status?: string | null;
1112
workflows?: Array<TaskWorkflow> | null;
13+
supportLimits?: Array<SupportLimit> | null;
1214
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
/* tslint:disable */
2+
/* eslint-disable */
3+
import { SupportSubCategory } from './support-sub-category';
4+
export interface SupportLimit {
5+
supportLimitStartDate: Date;
6+
supportLimitEndDate: Date;
7+
extensionAvailable: boolean;
8+
supportType: SupportSubCategory
9+
}

responders/src/UI/embc-responder/src/app/feature-components/wizard/step-supports/step-supports.service.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import { DateConversionService } from 'src/app/core/services/utility/dateConvers
3131
import { ComputeRulesService } from 'src/app/core/services/computeRules.service';
3232
import { AppBaseService } from 'src/app/core/services/helper/appBase.service';
3333
import { EvacueeSessionService } from 'src/app/core/services/evacuee-session.service';
34+
import { SupportLimit } from 'src/app/core/api/models/support-limit';
3435

3536
@Injectable({ providedIn: 'root' })
3637
export class StepSupportsService {
@@ -41,6 +42,8 @@ export class StepSupportsService {
4142
private supportDetailsVal: SupportDetailsModel;
4243
private supportDeliveryVal: SupportDeliveryModel;
4344
private selectedSupportDetailVal: Support;
45+
private supportLimitsVal: BehaviorSubject<SupportLimit[]> = new BehaviorSubject<SupportLimit[]>([]);
46+
private supportLimitsVal$: Observable<SupportLimit[]> = this.supportLimitsVal.asObservable();
4447

4548
constructor(
4649
private essFileService: EssFileService,
@@ -89,6 +92,36 @@ export class StepSupportsService {
8992
return this.existingSupportListVal$;
9093
}
9194

95+
setStoredSupportLimits(supportLimits: SupportLimit[]): void {
96+
this.supportLimitsVal.next(supportLimits);
97+
}
98+
99+
getStoredSupportLimits(): Observable<SupportLimit[]> {
100+
return this.supportLimitsVal$;
101+
}
102+
103+
fetchSupportLimits(): Observable<SupportLimit[]> {
104+
return this.taskService
105+
.tasksGetTask({
106+
taskId: this.userService?.currentProfile?.taskNumber
107+
})
108+
.pipe(
109+
map((task) => {
110+
const supportLimits: SupportLimit[] = task.supportLimits.map((supportLimit) => {
111+
return {
112+
supportLimitStartDate: supportLimit.supportLimitStartDate,
113+
supportLimitEndDate: supportLimit.supportLimitEndDate,
114+
extensionAvailable: supportLimit.extensionAvailable,
115+
supportType: supportLimit.supportType
116+
};
117+
});
118+
119+
this.setStoredSupportLimits(supportLimits);
120+
return supportLimits;
121+
})
122+
);
123+
}
124+
92125
set supportTypeToAdd(supportTypeToAddVal: Code) {
93126
this.supportTypeToAddVal = supportTypeToAddVal;
94127
this.cacheService.set('supportType', JSON.stringify(supportTypeToAddVal));

responders/src/UI/embc-responder/src/app/feature-components/wizard/support-components/support-details/support-details.component.html

Lines changed: 37 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -377,38 +377,50 @@
377377
</p>
378378
</div>
379379
</div>
380-
381-
<div class="row">
382-
<div class="col-md-12">
383-
<mat-checkbox
384-
id="allMembers"
385-
[checked]="isChecked()"
386-
[indeterminate]="isIndeterminate()"
387-
(change)="$event ? selectAll($event) : null"
388-
><span class="bold">All household members</span></mat-checkbox
389-
>
390-
</div>
380+
<div class="col-md-4" *ngIf="showLoader">
381+
<app-loader [strokeWidth]="3" [diameter]="25" [showLoader]="showLoader" [color]="color">
382+
</app-loader>
391383
</div>
392-
@for (member of evacueeSessionService?.evacFile?.needsAssessment?.householdMembers; track member) {
384+
<div *ngIf="!showLoader">
393385
<div class="row">
394386
<div class="col-md-12">
395387
<mat-checkbox
396-
(click)="$event.stopPropagation()"
397-
(change)="$event ? onChange($event, member) : null"
398-
[checked]="exists(member)"
399-
>
400-
{{ member.lastName | uppercase }}, {{ member.firstName | titlecase }}</mat-checkbox
388+
id="allMembers"
389+
[checked]="isChecked()"
390+
[indeterminate]="isIndeterminate()"
391+
(change)="selectAll($event)"
392+
><span class="bold">All household members</span></mat-checkbox
401393
>
402394
</div>
403395
</div>
404-
}
405-
@if (
406-
supportDetailsFormControl.members.invalid &&
407-
supportDetailsFormControl.members.hasError('noSelection')
408-
) {
409-
<mat-error class="custom-mat-error"> Required</mat-error>
410-
}
411-
396+
@for (member of evacueeSessionService?.evacFile?.needsAssessment?.householdMembers; track member) {
397+
<div class="row">
398+
<div class="col-md-12">
399+
<mat-checkbox
400+
(click)="$event.stopPropagation()"
401+
(change)="$event ? onChange($event, member) : null"
402+
[disabled]="!isHouseholdMemberEligibleForSupport(member)"
403+
[checked]="exists(member)"
404+
>
405+
{{ member.lastName | uppercase }}, {{ member.firstName | titlecase }}
406+
</mat-checkbox>
407+
<!-- Display error message if the checkbox is disabled -->
408+
@if (!isHouseholdMemberEligibleForSupport(member)) {
409+
<mat-error class="custom-mat-info">
410+
{{ member.firstName | titlecase }} {{ member.lastName | titlecase }} has already received
411+
this support. Extensions for this support are not available at this time.
412+
</mat-error>
413+
}
414+
</div>
415+
</div>
416+
}
417+
@if (
418+
supportDetailsFormControl.members.invalid &&
419+
supportDetailsFormControl.members.hasError('noSelection')
420+
) {
421+
<mat-error class="custom-mat-error"> Required</mat-error>
422+
}
423+
</div>
412424
<div>
413425
@switch (stepSupportsService?.supportTypeToAdd?.value) {
414426
<!-- Shelter-Allowance -->

0 commit comments

Comments
 (0)