From 66cbf38e05418c2f642603328b39623621a1a8b3 Mon Sep 17 00:00:00 2001 From: pbardy2000 <146740183+pbardy2000@users.noreply.github.com> Date: Thu, 2 May 2024 09:20:09 +0100 Subject: [PATCH] feat(cb2-11930): ensure certificate number is sent to backend if it exists on MVSA IVA tests (#1481) * feat(cb2-11930): ensure certificate number is sent to backend if its exists on MVSA IVA tests * feat(cb2-11930): fix linting issue --- .../test-records/test-records.service.ts | 21 +++++++++++++++- .../effects/test-records.effects.ts | 25 +++++++++++++++---- .../selectors/test-records.selectors.ts | 6 +++-- 3 files changed, 44 insertions(+), 8 deletions(-) diff --git a/src/app/services/test-records/test-records.service.ts b/src/app/services/test-records/test-records.service.ts index fd97ea027..dc44c4bb4 100644 --- a/src/app/services/test-records/test-records.service.ts +++ b/src/app/services/test-records/test-records.service.ts @@ -2,7 +2,7 @@ import { Injectable } from '@angular/core'; import { CompleteTestResults, DefaultService as CreateTestResultsService, GetTestResultsService, UpdateTestResultsService, } from '@api/test-results'; -import { TEST_TYPES } from '@forms/models/testTypeId.enum'; +import { TEST_TYPES, TEST_TYPES_GROUP1_SPEC_TEST, TEST_TYPES_GROUP5_SPEC_TEST } from '@forms/models/testTypeId.enum'; import { FormNode } from '@forms/services/dynamic-form.types'; import { contingencyTestTemplates } from '@forms/templates/test-records/create-master.template'; import { masterTpl } from '@forms/templates/test-records/master.template'; @@ -139,6 +139,25 @@ export class TestRecordsService { return this.store.dispatch(cleanTestResult()); } + prepareTestResultForAmendment(testResults: TestResultModel[], testResult: TestResultModel): TestResultModel { + const lastIvaOrMsvaTest = testResults.find((test) => { + const testType = test?.testTypes[0]; + const testTypeId = testType?.testTypeId ?? ''; + const isIVAorMSVATest = TEST_TYPES_GROUP1_SPEC_TEST.includes(testTypeId) || TEST_TYPES_GROUP5_SPEC_TEST.includes(testTypeId); + + return isIVAorMSVATest; + }); + + if (!lastIvaOrMsvaTest) { + return testResult; + } + + // If certificateNumber is falsy, then use the last IVA or MSVA test certificate number + testResult.testTypes[0].certificateNumber ??= lastIvaOrMsvaTest.testTypes[0].certificateNumber; + + return testResult; + } + static getTestTypeGroup(testTypeId: string): string | undefined { // eslint-disable-next-line no-restricted-syntax for (const groupName in TEST_TYPES) { diff --git a/src/app/store/test-records/effects/test-records.effects.ts b/src/app/store/test-records/effects/test-records.effects.ts index 7d1a9de43..e06701675 100644 --- a/src/app/store/test-records/effects/test-records.effects.ts +++ b/src/app/store/test-records/effects/test-records.effects.ts @@ -11,6 +11,7 @@ import { TestStationType } from '@models/test-stations/test-station-type.enum'; import { StatusCodes } from '@models/vehicle-tech-record.model'; import { Actions, createEffect, ofType } from '@ngrx/effects'; import { Store, select } from '@ngrx/store'; +import { FeatureToggleService } from '@services/feature-toggle-service/feature-toggle-service'; import { TechnicalRecordHttpService } from '@services/technical-record-http/technical-record-http.service'; import { TestRecordsService } from '@services/test-records/test-records.service'; import { UserService } from '@services/user-service/user-service'; @@ -24,7 +25,6 @@ import { catchError, concatMap, delay, filter, map, mergeMap, of, switchMap, take, withLatestFrom, } from 'rxjs'; -import { FeatureToggleService } from '@services/feature-toggle-service/feature-toggle-service'; import { contingencyTestTypeSelected, createTestResult, @@ -43,7 +43,12 @@ import { updateTestResultFailed, updateTestResultSuccess, } from '../actions/test-records.actions'; -import { isTestTypeOldIvaOrMsva, selectedTestResultState, testResultInEdit } from '../selectors/test-records.selectors'; +import { + isTestTypeOldIvaOrMsva, + selectAllTestResultsInDateOrder, + selectedTestResultState, + testResultInEdit, +} from '../selectors/test-records.selectors'; @Injectable() export class TestResultsEffects { @@ -127,11 +132,21 @@ export class TestResultsEffects { ofType(updateTestResult), mergeMap((action) => of(action.value).pipe( - withLatestFrom(this.userService.name$, this.userService.id$, this.userService.userEmail$, this.store.pipe(select(selectRouteNestedParams))), + withLatestFrom( + this.userService.name$, + this.userService.id$, + this.userService.userEmail$, + this.store.select(selectRouteNestedParams), + this.store.select(selectAllTestResultsInDateOrder), + ), take(1), )), - mergeMap(([testResult, name, id, userEmail, { systemNumber }]) => { - return this.testRecordsService.saveTestResult(systemNumber, { name, id, userEmail }, testResult).pipe( + mergeMap(([testResult, name, id, userEmail, { systemNumber }, testResults]) => { + return this.testRecordsService.saveTestResult( + systemNumber, + { name, id, userEmail }, + this.testRecordsService.prepareTestResultForAmendment(testResults, testResult), + ).pipe( take(1), map((responseBody) => updateTestResultSuccess({ payload: { id: responseBody.testResultId, changes: responseBody } })), catchError((e) => { diff --git a/src/app/store/test-records/selectors/test-records.selectors.ts b/src/app/store/test-records/selectors/test-records.selectors.ts index da738f88f..11d2dd674 100644 --- a/src/app/store/test-records/selectors/test-records.selectors.ts +++ b/src/app/store/test-records/selectors/test-records.selectors.ts @@ -19,6 +19,9 @@ export const selectTestResultsEntities = createSelector(testResultsFeatureState, // select the array of tests result export const selectAllTestResults = createSelector(testResultsFeatureState, (state) => selectAll(state)); +// select the array of tests results in order of createdAt (most recent to oldest) +export const selectAllTestResultsInDateOrder = createSelector(selectAllTestResults, (testResults) => testResults.sort(byDate)); + // select the total test results count export const selectTestResultsTotal = createSelector(testResultsFeatureState, (state) => selectTotal(state)); @@ -53,8 +56,7 @@ export const testResultLoadingState = createSelector(testResultsFeatureState, (s export const selectDefectData = createSelector(selectedTestResultState, (testResult) => getDefectFromTestResult(testResult)); export const isTestTypeOldIvaOrMsva = createSelector(toEditOrNotToEdit, (testResult) => { - return !!testResult?.testTypes[0]?.customDefects?.length - && !!testResult?.testTypes[0]?.customDefects?.every((defect) => !!defect.referenceNumber); + return !!testResult?.testTypes[0]?.customDefects?.length && !!testResult?.testTypes[0]?.customDefects?.every((defect) => !!defect.referenceNumber); }); export const selectedTestSortedAmendmentHistory = createSelector(selectedTestResultState, (testResult) => {