diff --git a/portal-frontend/src/app/features/applications/edit-submission/proposal/subd-proposal/subd-proposal.component.html b/portal-frontend/src/app/features/applications/edit-submission/proposal/subd-proposal/subd-proposal.component.html index a6f6417554..1e5f60cba1 100644 --- a/portal-frontend/src/app/features/applications/edit-submission/proposal/subd-proposal/subd-proposal.component.html +++ b/portal-frontend/src/app/features/applications/edit-submission/proposal/subd-proposal/subd-proposal.component.html @@ -109,7 +109,7 @@
Documents needed for this step:
required placeholder="Type size in hectares" [formControlName]="i + '-size'" - (change)="onChangeLotSize()" + (change)="onChangeLotSize(i, $event)" /> ha diff --git a/portal-frontend/src/app/features/applications/edit-submission/proposal/subd-proposal/subd-proposal.component.ts b/portal-frontend/src/app/features/applications/edit-submission/proposal/subd-proposal/subd-proposal.component.ts index 8266d7abe0..2b0330011d 100644 --- a/portal-frontend/src/app/features/applications/edit-submission/proposal/subd-proposal/subd-proposal.component.ts +++ b/portal-frontend/src/app/features/applications/edit-submission/proposal/subd-proposal/subd-proposal.component.ts @@ -168,7 +168,9 @@ export class SubdProposalComponent extends FilesStepComponent implements OnInit, this.calculateLotSize(); } - onChangeLotSize() { + onChangeLotSize(i: number, event: Event) { + const target = event.target as HTMLInputElement; + this.proposedLots[i].size = target.value; this.calculateLotSize(); } diff --git a/portal-frontend/src/app/features/notifications/edit-submission/transferees/transferees.component.scss b/portal-frontend/src/app/features/notifications/edit-submission/transferees/transferees.component.scss index b0180f9d5f..a72b0238a5 100644 --- a/portal-frontend/src/app/features/notifications/edit-submission/transferees/transferees.component.scss +++ b/portal-frontend/src/app/features/notifications/edit-submission/transferees/transferees.component.scss @@ -31,7 +31,8 @@ flex-direction: column; align-items: start; - button { + div, button { + margin-top: rem(4); width: 100%; } } diff --git a/services/apps/alcs/src/alcs/application-decision/application-decision-v1/application-decision-v1.module.ts b/services/apps/alcs/src/alcs/application-decision/application-decision-v1/application-decision-v1.module.ts index 19088783fa..a45749dad1 100644 --- a/services/apps/alcs/src/alcs/application-decision/application-decision-v1/application-decision-v1.module.ts +++ b/services/apps/alcs/src/alcs/application-decision/application-decision-v1/application-decision-v1.module.ts @@ -75,6 +75,7 @@ import { ApplicationDecisionV1Service } from './application-decision/application exports: [ ApplicationModificationService, ApplicationDecisionV1Service, + ApplicationDecisionMeetingService, ApplicationReconsiderationService, ], }) diff --git a/services/apps/alcs/src/alcs/application/application-timeline/application-timeline.module.ts b/services/apps/alcs/src/alcs/application/application-timeline/application-timeline.module.ts index 4ed61a3a95..c81fddf79f 100644 --- a/services/apps/alcs/src/alcs/application/application-timeline/application-timeline.module.ts +++ b/services/apps/alcs/src/alcs/application/application-timeline/application-timeline.module.ts @@ -1,6 +1,7 @@ import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { ApplicationDecision } from '../../application-decision/application-decision.entity'; +import { ApplicationDecisionModule } from '../../application-decision/application-decision.module'; import { ApplicationModification } from '../../application-decision/application-modification/application-modification.entity'; import { ApplicationReconsideration } from '../../application-decision/application-reconsideration/application-reconsideration.entity'; import { ApplicationSubmissionStatusModule } from '../application-submission-status/application-submission-status.module'; @@ -19,6 +20,7 @@ import { ApplicationTimelineService } from './application-timeline.service'; ]), ApplicationModule, ApplicationSubmissionStatusModule, + ApplicationDecisionModule, ], providers: [ApplicationTimelineService], controllers: [ApplicationTimelineController], diff --git a/services/apps/alcs/src/alcs/application/application-timeline/application-timeline.service.spec.ts b/services/apps/alcs/src/alcs/application/application-timeline/application-timeline.service.spec.ts index cf7e7fec5c..dae7f9dad1 100644 --- a/services/apps/alcs/src/alcs/application/application-timeline/application-timeline.service.spec.ts +++ b/services/apps/alcs/src/alcs/application/application-timeline/application-timeline.service.spec.ts @@ -2,6 +2,8 @@ import { createMock, DeepMocked } from '@golevelup/nestjs-testing'; import { Test, TestingModule } from '@nestjs/testing'; import { getRepositoryToken } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; +import { ApplicationDecisionMeeting } from '../../application-decision/application-decision-v1/application-decision-meeting/application-decision-meeting.entity'; +import { ApplicationDecisionMeetingService } from '../../application-decision/application-decision-v1/application-decision-meeting/application-decision-meeting.service'; import { ApplicationDecision } from '../../application-decision/application-decision.entity'; import { ApplicationModificationOutcomeType } from '../../application-decision/application-modification/application-modification-outcome-type/application-modification-outcome-type.entity'; import { ApplicationModification } from '../../application-decision/application-modification/application-modification.entity'; @@ -29,6 +31,7 @@ describe('ApplicationTimelineService', () => { let mockAppService: DeepMocked; let mockAppMeetingService: DeepMocked; let mockAppStatusService: DeepMocked; + let mockAppDecMeetingService: DeepMocked; const mockSameDate = new Date(); beforeEach(async () => { @@ -39,6 +42,7 @@ describe('ApplicationTimelineService', () => { mockAppService = createMock(); mockAppMeetingService = createMock(); mockAppStatusService = createMock(); + mockAppDecMeetingService = createMock(); const module: TestingModule = await Test.createTestingModule({ providers: [ @@ -70,6 +74,10 @@ describe('ApplicationTimelineService', () => { provide: ApplicationSubmissionStatusService, useValue: mockAppStatusService, }, + { + provide: ApplicationDecisionMeetingService, + useValue: mockAppDecMeetingService, + }, ApplicationTimelineService, ], }).compile(); @@ -86,6 +94,7 @@ describe('ApplicationTimelineService', () => { mockAppDecisionRepo.find.mockResolvedValue([]); mockAppMeetingService.getByAppFileNumber.mockResolvedValue([]); mockAppStatusService.getStatusesByFileNumber.mockResolvedValue([]); + mockAppDecMeetingService.getByAppFileNumber.mockResolvedValue([]); }); it('should be defined', () => { @@ -255,6 +264,27 @@ describe('ApplicationTimelineService', () => { expect(res[0].htmlText).toEqual('CATS #2 Report Sent to Applicant'); }); + it('should map Decision Meeting Events', async () => { + const sameDate = new Date(); + mockAppDecMeetingService.getByAppFileNumber.mockResolvedValue([ + new ApplicationDecisionMeeting({ + date: sameDate, + }), + new ApplicationDecisionMeeting({ + date: new Date(sameDate.getTime() + 5), + }), + ]); + + const res = await service.getTimelineEvents('file-number'); + + expect(res).toBeDefined(); + expect(res.length).toEqual(2); + expect(res[1].htmlText).toEqual( + 'Review Discussion #1 - Under Review by ALC', + ); + expect(res[0].htmlText).toEqual('Review Discussion #2'); + }); + it('should map Status Events', async () => { const sameDate = new Date(); mockAppStatusService.getStatusesByFileNumber.mockResolvedValue([ diff --git a/services/apps/alcs/src/alcs/application/application-timeline/application-timeline.service.ts b/services/apps/alcs/src/alcs/application/application-timeline/application-timeline.service.ts index 9e35e6f2d0..43cb1099c5 100644 --- a/services/apps/alcs/src/alcs/application/application-timeline/application-timeline.service.ts +++ b/services/apps/alcs/src/alcs/application/application-timeline/application-timeline.service.ts @@ -1,6 +1,7 @@ import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; +import { ApplicationDecisionMeetingService } from '../../application-decision/application-decision-v1/application-decision-meeting/application-decision-meeting.service'; import { ApplicationDecision } from '../../application-decision/application-decision.entity'; import { ApplicationModification } from '../../application-decision/application-modification/application-modification.entity'; import { ApplicationReconsideration } from '../../application-decision/application-reconsideration/application-reconsideration.entity'; @@ -56,6 +57,7 @@ export class ApplicationTimelineService { private applicationDecisionRepo: Repository, private applicationService: ApplicationService, private applicationMeetingService: ApplicationMeetingService, + private appDecMeetingService: ApplicationDecisionMeetingService, private applicationSubmissionStatusService: ApplicationSubmissionStatusService, ) {} @@ -326,11 +328,11 @@ export class ApplicationTimelineService { } private async addMeetingEvents( - noticeOfIntent: Application, + application: Application, events: TimelineEvent[], ) { const meetings = await this.applicationMeetingService.getByAppFileNumber( - noticeOfIntent.fileNumber, + application.fileNumber, ); meetings.sort( @@ -372,6 +374,28 @@ export class ApplicationTimelineService { typeCount.set(meeting.type.code, count + 1); }); + + const discussionMeetings = + await this.appDecMeetingService.getByAppFileNumber( + application.fileNumber, + ); + + discussionMeetings.sort((a, b) => a.date.getTime() - b.date.getTime()); + + discussionMeetings.forEach((meeting, index) => { + let htmlText = `Review Discussion #${index + 1}`; + + if (index === 0) { + htmlText += ' - Under Review by ALC'; + } + + events.push({ + htmlText, + startDate: meeting.date.getTime() + SORTING_ORDER.VISIT_REPORTS, + fulfilledDate: null, + isFulfilled: true, + }); + }); } private async addStatusEvents( @@ -388,7 +412,7 @@ export class ApplicationTimelineService { ![ SUBMISSION_STATUS.IN_REVIEW_BY_ALC, SUBMISSION_STATUS.ALC_DECISION, - ].includes(status.statusType.code), + ].includes(status.statusType.code), ); for (const status of statusesToInclude) { if (status.effectiveDate) {