Skip to content

Commit 0ebf4f0

Browse files
committed
lp-1013 - capital contribution validation
- move to application layer - add translation
1 parent 698f557 commit 0ebf4f0

File tree

9 files changed

+53
-61
lines changed

9 files changed

+53
-61
lines changed

locales/cy/errors.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{
22
"errorMessages": {
33
"capitalContribution": {
4+
"valueRequired": "WELSH - Contribution currency type is required",
45
"twoDecimalPlaces": "WELSH - Value must be a number with 2 decimal places",
56
"moreThanZero": "WELSH - Value must be 0.01 or more",
67
"noSymbols": "WELSH - Value must not include currency symbols like £, $ and €",

locales/en/errors.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{
22
"errorMessages": {
33
"capitalContribution": {
4+
"valueRequired": "Contribution currency type is required",
45
"twoDecimalPlaces": "Value must be a number with 2 decimal places",
56
"moreThanZero": "Value must be 0.01 or more",
67
"noSymbols": "Value must not include currency symbols like £, $ and €",

src/application/service/LimitedPartnerService.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { logger } from "../../utils";
44
import UIErrors from "../../domain/entities/UIErrors";
55
import { extractAPIErrors, incompletePartnerErrorList } from "./utils";
66
import { Tokens } from "../../domain/types";
7+
import { capitalContributionValidation } from "./utils/capitalContributionValidation";
78

89
class LimitedPartnerService {
910
i18n: any;
@@ -23,6 +24,10 @@ class LimitedPartnerService {
2324
errors?: UIErrors;
2425
}> {
2526
try {
27+
if (data.contribution_currency_type || data.contribution_currency_value || data.contribution_sub_types) {
28+
capitalContributionValidation(data, this.i18n);
29+
}
30+
2631
const limitedPartnerId = await this.limitedPartnerGateway.createLimitedPartner(opt, transactionId, data);
2732

2833
return { limitedPartnerId };
@@ -88,6 +93,10 @@ class LimitedPartnerService {
8893
errors?: UIErrors;
8994
}> {
9095
try {
96+
if (data.contribution_currency_type || data.contribution_currency_value || data.contribution_sub_types) {
97+
capitalContributionValidation(data, this.i18n);
98+
}
99+
91100
await this.limitedPartnerGateway.sendPageData(opt, transactionId, limitedPartnerId, data);
92101
} catch (errors: any) {
93102
const { apiErrors, isValidationErrors } = extractAPIErrors(errors);

src/application/service/utils/capitalContributionValidation.ts

Lines changed: 17 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,37 @@
11
import UIErrors from "../../../domain/entities/UIErrors";
22
import { symbols } from "./currencies";
33

4-
const capitalContributionValidation = (
5-
data: {
6-
contribution_currency_type: string;
7-
contribution_currency_value: string;
8-
contribution_sub_types: string[];
9-
},
10-
i18n: any
11-
): void => {
4+
const capitalContributionValidation = (data: Record<string, string | string[]>, i18n: any): void => {
125
const uiErrors = new UIErrors();
136

14-
contributionCurrencyValueValidation(data, uiErrors, i18n);
15-
16-
if (!data.contribution_sub_types.length) {
17-
uiErrors.formatValidationErrorToUiErrors({
18-
errors: {
19-
contribution_sub_types: i18n?.errorMessages?.capitalContribution?.atLeastOneType
20-
}
21-
});
7+
if (!data.contribution_currency_type) {
8+
uiErrors.setWebError("contribution_currency_type", i18n?.errorMessages?.capitalContribution?.currencyRequired);
229
}
2310

24-
if (!data.contribution_currency_type) {
25-
uiErrors.formatValidationErrorToUiErrors({
26-
errors: {
27-
contribution_currency_type: i18n?.errorMessages?.capitalContribution?.currencyRequired
28-
}
29-
});
11+
if (!data.contribution_sub_types?.length) {
12+
uiErrors.setWebError("contribution_sub_types", i18n?.errorMessages?.capitalContribution?.atLeastOneType);
3013
}
3114

15+
contributionCurrencyValueValidation(data, uiErrors, i18n);
16+
3217
if (uiErrors.hasErrors()) {
3318
throw uiErrors;
3419
}
3520
};
3621

37-
const contributionCurrencyValueValidation = (
38-
data: { contribution_currency_type: string; contribution_currency_value: string; contribution_sub_types: string[] },
39-
uiErrors: UIErrors,
40-
i18n: any
41-
) => {
42-
if (hasSymbol(data.contribution_currency_value, symbols)) {
43-
uiErrors.formatValidationErrorToUiErrors({
44-
errors: {
45-
contribution_currency_value: i18n?.errorMessages?.capitalContribution?.noSymbols
46-
}
47-
});
22+
const contributionCurrencyValueValidation = (data: Record<string, any>, uiErrors: UIErrors, i18n: any) => {
23+
const field = "contribution_currency_value";
24+
25+
if (!data.contribution_currency_value) {
26+
uiErrors.setWebError(field, i18n?.errorMessages?.capitalContribution?.valueRequired);
27+
} else if (hasSymbol(data.contribution_currency_value, symbols)) {
28+
uiErrors.setWebError(field, i18n?.errorMessages?.capitalContribution?.noSymbols);
4829
} else if (hasComma(data.contribution_currency_value)) {
49-
uiErrors.formatValidationErrorToUiErrors({
50-
errors: {
51-
contribution_currency_value: i18n?.errorMessages?.capitalContribution?.noComma
52-
}
53-
});
30+
uiErrors.setWebError(field, i18n?.errorMessages?.capitalContribution?.noComma);
5431
} else if (!isNumber(data.contribution_currency_value) || !has2Decimal(data.contribution_currency_value)) {
55-
uiErrors.formatValidationErrorToUiErrors({
56-
errors: {
57-
contribution_currency_value: i18n?.errorMessages?.capitalContribution?.twoDecimalPlaces
58-
}
59-
});
32+
uiErrors.setWebError(field, i18n?.errorMessages?.capitalContribution?.twoDecimalPlaces);
6033
} else if (!isGreaterThanZero(data.contribution_currency_value)) {
61-
uiErrors.formatValidationErrorToUiErrors({
62-
errors: {
63-
contribution_currency_value: i18n?.errorMessages?.capitalContribution?.moreThanZero
64-
}
65-
});
34+
uiErrors.setWebError(field, i18n?.errorMessages?.capitalContribution?.moreThanZero);
6635
}
6736
};
6837

src/domain/entities/UIErrors.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class UIErrors {
1515
apiErrors: ApiErrors;
1616
errors: UIValidationErrors = { errorList: [] } as any;
1717

18-
formatValidationErrorToUiErrors(apiErrors: ApiErrors) {
18+
public formatValidationErrorToUiErrors(apiErrors: ApiErrors) {
1919
this.apiErrors = { ...this.apiErrors, ...apiErrors };
2020
const list = apiErrors?.errors ?? {};
2121

@@ -33,6 +33,14 @@ class UIErrors {
3333
}
3434
}
3535

36+
public setWebError(field: string, message: string) {
37+
this.formatValidationErrorToUiErrors({
38+
errors: {
39+
[field]: message
40+
}
41+
});
42+
}
43+
3644
public hasErrors(): boolean {
3745
return this.errors.errorList.length > 0;
3846
}

src/presentation/controller/common/PartnerController.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,9 @@ abstract class PartnerController extends AbstractController {
204204
createPartner(partner: PartnerType) {
205205
return async (request: Request, response: Response, next: NextFunction) => {
206206
try {
207+
this.generalPartnerService.setI18n(response.locals.i18n);
208+
this.limitedPartnerService.setI18n(response.locals.i18n);
209+
207210
const routing = this.getJourneyPageRouting(request.url);
208211
const journeyPageType = this.getJourneyPageTypes(request.url);
209212

@@ -383,6 +386,9 @@ abstract class PartnerController extends AbstractController {
383386
) {
384387
return async (request: Request, response: Response, next: NextFunction) => {
385388
try {
389+
this.generalPartnerService.setI18n(response.locals.i18n);
390+
this.limitedPartnerService.setI18n(response.locals.i18n);
391+
386392
const routing = this.getJourneyPageRouting(request.url);
387393
const journeyPageType = this.getJourneyPageTypes(request.url);
388394

src/presentation/test/unit/registration/capital-contribution-validation.spec.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,12 @@ describe("Gateway capital contribition validation test suite", () => {
4646
dataKeys[1],
4747
"Value must not include a comma"
4848
],
49+
[
50+
"contribution_currency_value empty",
51+
{ ...data, contribution_currency_value: "" },
52+
dataKeys[1],
53+
"Contribution currency type is required"
54+
],
4955
[
5056
"contribution_sub_types empty array",
5157
{ ...data, contribution_sub_types: [] },

src/views/includes/capital-contribution.njk

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
<p class="govuk-hint">{{ i18n.capitalContribution.hint }}</p>
66

7-
{% set contributionCurrencyTypeId = "contribution_currency_type" %}
87
{% set currencyField = props.data.limitedPartner.data.contribution_currency_type %}
98
{% include "includes/currencies.njk" %}
109

@@ -34,10 +33,7 @@
3433
id: "contribution_currency_value",
3534
name: "contribution_currency_value",
3635
value: props.data.limitedPartner.data.contribution_currency_value,
37-
errorMessage: props.errors.contribution_currency_value if props.errors.contribution_currency_value,
38-
attributes: {
39-
required: true
40-
}
36+
errorMessage: props.errors.contribution_currency_value if props.errors.contribution_currency_value
4137
}) }}
4238

4339
{{ govukCheckboxes({

src/views/includes/currencies.njk

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -174,17 +174,13 @@
174174
] %}
175175

176176
{{ govukSelect({
177-
id: contributionCurrencyTypeId,
178-
name: contributionCurrencyTypeId,
179-
value: contributionCurrencyValue,
177+
id: "contribution_currency_type",
178+
name: "contribution_currency_type",
180179
label: {
181180
text: i18n.capitalContribution.currencyTypeLabel,
182181
classes: "govuk-visually-hidden",
183182
isPageHeading: false
184183
},
185-
errorMessage: currencyErrorMessage,
186-
attributes : {
187-
required: "true"
188-
},
184+
errorMessage: props.errors.contribution_currency_type if props.errors.contribution_currency_type,
189185
items: CURRENCIES
190186
}) }}

0 commit comments

Comments
 (0)