Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/components/Announcements/Announcements.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ import React, {
} from 'react';
import { getApolloContext } from '@apollo/client';
import { DateTime } from 'luxon';
import { DisplayMethodEnum } from 'pages/api/graphql-rest.page.generated';
import { AlertBanner } from 'src/components/Shared/alertBanner/AlertBanner';
import {
ActionEnum,
ContactFilterStatusEnum,
DisplayMethodEnum,
} from 'src/graphql/types.generated';
import { useAccountListId } from 'src/hooks/useAccountListId';
import { useContactPartnershipStatuses } from 'src/hooks/useContactPartnershipStatuses';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ import {
import { styled } from '@mui/material/styles';
import { FormikErrors, getIn } from 'formik';
import { useTranslation } from 'react-i18next';
import { InputMaybe } from 'pages/api/graphql-rest.page.generated';
import {
InputMaybe,
PersonCreateInput,
PersonEmailAddressInput,
PersonUpdateInput,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ fragment AdditionalSalaryRequestDetailsFields on AdditionalSalaryRequest {
approver
approvalTimeframe
}
progressiveApprovalTierReason
calculations {
currentSalaryCap
combinedCap
Expand All @@ -62,7 +63,6 @@ query AdditionalSalaryRequest($isSpouse: Boolean) {
isSpouse: $isSpouse
) {
...AdditionalSalaryRequestDetailsFields
createdAt
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ const accountListId = 'account-list-1';

const mockRequest = {
id: 'request-1',
createdAt: '2024-01-01T00:00:00Z',
status: AsrStatusEnum.InProgress,
totalAdditionalSalaryRequested: 5000,
currentYearSalaryNotReceived: 1000,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import React from 'react';
import { ThemeProvider } from '@mui/material/styles';
import { render } from '@testing-library/react';
import { FormikProvider, useFormik } from 'formik';
import { ProgressiveApprovalTierReasonEnum } from 'src/graphql/types.generated';
import theme from 'src/theme';
import { CompleteFormValues } from '../../AdditionalSalaryRequest';
import { useAdditionalSalaryRequest } from '../../Shared/AdditionalSalaryRequestContext';
Expand Down Expand Up @@ -44,15 +45,16 @@ describe('CapSubContent', () => {
jest.clearAllMocks();
});

it('renders Progressive Approvals messaging when hasBoardCapException is false', () => {
it('renders Progressive Approvals messaging when reason is not board cap exception', () => {
mockUseAdditionalSalaryRequest.mockReturnValue({
hasBoardCapException: false,
requestData: {
latestAdditionalSalaryRequest: {
progressiveApprovalTier: {
approver: 'Division Head',
approvalTimeframe: '1-2 weeks',
},
progressiveApprovalTierReason:
ProgressiveApprovalTierReasonEnum.OverUserCap,
},
},
} as unknown as ReturnType<typeof useAdditionalSalaryRequest>);
Expand All @@ -67,12 +69,13 @@ describe('CapSubContent', () => {
).not.toBeInTheDocument();
});

it('renders nothing when hasBoardCapException is true (message is carried by getCapOverrides)', () => {
it('renders nothing when reason is board cap exception (message is carried by getCapOverrides)', () => {
mockUseAdditionalSalaryRequest.mockReturnValue({
hasBoardCapException: true,
requestData: {
latestAdditionalSalaryRequest: {
progressiveApprovalTier: null,
progressiveApprovalTierReason:
ProgressiveApprovalTierReasonEnum.BoardCapException,
},
},
} as unknown as ReturnType<typeof useAdditionalSalaryRequest>);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { Box, List, ListItemText } from '@mui/material';
import { useFormikContext } from 'formik';
import { Trans, useTranslation } from 'react-i18next';
import { StyledListItem } from 'src/components/HrTools/SavingsFundTransfer/styledComponents/StyledListItem';
import { ProgressiveApprovalTierReasonEnum } from 'src/graphql/types.generated';
import { useLocale } from 'src/hooks/useLocale';
import { currencyFormat } from 'src/lib/intlFormat';
import theme from 'src/theme';
Expand All @@ -14,13 +15,14 @@ export const CapSubContent: React.FC = () => {
const { t } = useTranslation();
const locale = useLocale();
const currency = 'USD';
const { requestData, hasBoardCapException } = useAdditionalSalaryRequest();
const progressiveApprovalTier =
requestData?.latestAdditionalSalaryRequest?.progressiveApprovalTier;
const { requestData } = useAdditionalSalaryRequest();
const latestRequest = requestData?.latestAdditionalSalaryRequest;
const progressiveApprovalTier = latestRequest?.progressiveApprovalTier;
const reason = latestRequest?.progressiveApprovalTierReason;

const { values } = useFormikContext<CompleteFormValues>();

if (hasBoardCapException) {
if (reason === ProgressiveApprovalTierReasonEnum.BoardCapException) {
return null;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { ProgressiveApprovalTierReasonEnum } from 'src/graphql/types.generated';
import { getCapOverrides } from './getCapOverrides';

const t = ((key: string) => key) as unknown as Parameters<
Expand All @@ -9,8 +10,7 @@
const result = getCapOverrides(
{
splitAsr: false,
additionalApproval: false,
hasBoardCapException: false,
reason: null,
},
t,
);
Expand All @@ -22,53 +22,77 @@
const result = getCapOverrides(
{
splitAsr: true,
additionalApproval: false,
hasBoardCapException: false,
reason: null,
},
t,
);
expect(result.title).toMatch(/exceeds your remaining allowable salary/);
});

it('returns Progressive Approvals messaging when additionalApproval without board exception', () => {
it('returns Progressive Approvals messaging when over user cap', () => {
const result = getCapOverrides(
{
splitAsr: false,
additionalApproval: true,
hasBoardCapException: false,
reason: ProgressiveApprovalTierReasonEnum.OverUserCap,

Check warning on line 36 in src/components/HrTools/AdditionalSalaryRequest/RequestPage/Helper/getCapOverrides.test.ts

View check run for this annotation

CodeScene Delta Analysis / CodeScene Code Health Review (main)

❌ New issue: Code Duplication

The module contains 4 functions with similar structure: 'returns Progressive Approvals messaging when over spouse cap','returns Progressive Approvals messaging when over user cap','returns Progressive Approvals messaging with overlapping requests','returns combined-cap messaging when over combined cap'. Avoid duplicated, aka copy-pasted, code inside the module. More duplication lowers the code health.
},
t,
);
expect(result.title).toMatch(/requires additional approval/);
expect(result.content).toMatch(/exceed your Maximum Allowable Salary/);
});

it('returns board-approval messaging when approval required with board exception', () => {
it('returns Progressive Approvals messaging when over spouse cap', () => {
const result = getCapOverrides(
{
splitAsr: false,
additionalApproval: true,
hasBoardCapException: true,
reason: ProgressiveApprovalTierReasonEnum.OverSpouseCap,
},
t,
);
expect(result.title).toMatch(/Board approval/);
expect(result.title).toMatch(/requires additional approval/);
expect(result.content).toMatch(/exceed your Maximum Allowable Salary/);
});

it('returns Progressive Approvals messaging with overlapping requests', () => {
const result = getCapOverrides(
{
splitAsr: false,
reason: ProgressiveApprovalTierReasonEnum.OverlappingRequests,
},
t,
);
expect(result.title).toMatch(/requires additional approval/);
expect(result.content).toMatch(
/You have a Board approved Maximum Allowable Salary/,
/pending Additional Salary Request or Salary Request/,
);
expect(result.content).toMatch(/Additional Salary Request exceeds/);
});

it('board exception does not apply when no approval required', () => {
it('returns combined-cap messaging when over combined cap', () => {
const result = getCapOverrides(
{
splitAsr: false,
additionalApproval: false,
hasBoardCapException: true,
reason: ProgressiveApprovalTierReasonEnum.OverCombinedCap,
},
t,
);
expect(result.title).toBeUndefined();
expect(result.content).toBeUndefined();
expect(result.title).toMatch(/requires additional approval/);
expect(result.content).toMatch(
/combined Total Requested Salary to exceed your combined Maximum Allowable Salary/,
);
});

it('returns board-approval messaging with board cap exception', () => {
const result = getCapOverrides(
{
splitAsr: false,
reason: ProgressiveApprovalTierReasonEnum.BoardCapException,
},
t,
);
expect(result.title).toMatch(/Board approval/);
expect(result.content).toMatch(
/You have a Board approved Maximum Allowable Salary/,
);
expect(result.content).toMatch(/Additional Salary Request exceeds/);
});
});
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import { TFunction } from 'i18next';
import { ProgressiveApprovalTierReasonEnum } from 'src/graphql/types.generated';

interface CapOverridesOptions {
splitAsr: boolean;
additionalApproval: boolean;
hasBoardCapException: boolean;
reason: ProgressiveApprovalTierReasonEnum | null | undefined;
}

export const getCapOverrides = (
{ splitAsr, additionalApproval, hasBoardCapException }: CapOverridesOptions,
{ splitAsr, reason }: CapOverridesOptions,
t: TFunction,
) => {
if (splitAsr) {
Expand All @@ -19,27 +19,49 @@ export const getCapOverrides = (
};
}

if (additionalApproval) {
if (hasBoardCapException) {
return {
title: t(
'Your request requires Board approval. Please review the information below to continue.',
),
content: t(
"You have a Board approved Maximum Allowable Salary (CAP) and your Additional Salary Request exceeds that amount. As a result we need to get their approval for this request. We'll forward your request to them and get back to you with their decision.",
),
};
}
if (!reason) {
return { title: undefined, content: undefined };
}

if (reason === ProgressiveApprovalTierReasonEnum.BoardCapException) {
return {
title: t(
'Your request requires Board approval. Please review the information below to continue.',
),
content: t(
"You have a Board approved Maximum Allowable Salary (CAP) and your Additional Salary Request exceeds that amount. As a result we need to get their approval for this request. We'll forward your request to them and get back to you with their decision.",
),
};
}

if (reason === ProgressiveApprovalTierReasonEnum.OverlappingRequests) {
Comment thread
canac marked this conversation as resolved.
return {
title: t(
'Your request requires additional approval. Please fill in the information below to continue.',
),
content: t(
'Your request causes your Total Requested Salary to exceed your Maximum Allowable Salary.',
'Your spouse has a pending Additional Salary Request or Salary Request, so this request needs additional approval.',
),
};
}

const title = t(
'Your request requires additional approval. Please fill in the information below to continue.',
);

if (reason === ProgressiveApprovalTierReasonEnum.OverCombinedCap) {
return {
title,
content: t(
'Your request causes your combined Total Requested Salary to exceed your combined Maximum Allowable Salary.',
),
};
}

return { title: undefined, content: undefined };
return {
title,
content: t(
'Your request causes your Total Requested Salary to exceed your Maximum Allowable Salary.',
),
};
};
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import React from 'react';

Check notice on line 1 in src/components/HrTools/AdditionalSalaryRequest/RequestPage/RequestPage.test.tsx

View check run for this annotation

CodeScene Delta Analysis / CodeScene Code Health Review (main)

✅ Getting better: Lines of Code in a Single File

The lines of code decreases from 576 to 566, improve code health by reducing it to 500. The number of Lines of Code in a single file. More Lines of Code lowers the code health.

Check notice on line 1 in src/components/HrTools/AdditionalSalaryRequest/RequestPage/RequestPage.test.tsx

View check run for this annotation

CodeScene Delta Analysis / CodeScene Code Health Review (main)

✅ Getting better: Code Duplication

reduced similar code in: 'shows submit modal when submit clicked with married user exceeding cap and spouse under cap'. Avoid duplicated, aka copy-pasted, code inside the module. More duplication lowers the code health.
import { ThemeProvider } from '@mui/material/styles';
import { render, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
Expand All @@ -10,6 +10,7 @@
import {
AsrStatusEnum,
ElectionType403bEnum,
ProgressiveApprovalTierReasonEnum,
} from 'src/graphql/types.generated';
import i18n from 'src/lib/i18n';
import { amount, phoneNumber } from 'src/lib/yupHelpers';
Expand Down Expand Up @@ -104,7 +105,6 @@
setIsNewAsr: jest.fn(),
isSpouse: false,
hasSpouse: false,
hasBoardCapException: false,
fieldConfig: getFieldConfig(i18n.t),
};

Expand Down Expand Up @@ -408,10 +408,10 @@
pageType: PageEnum.New,
requestData: {
latestAdditionalSalaryRequest: {
calculations: {
currentSalaryCap: 50,
},
calculations: {},
progressiveApprovalTier: { id: 'tier-1' },
progressiveApprovalTierReason:
ProgressiveApprovalTierReasonEnum.OverUserCap,
},
},
} as unknown as ReturnType<typeof useAdditionalSalaryRequest>);
Expand Down Expand Up @@ -452,24 +452,11 @@
currentStep: AdditionalSalaryRequestSectionEnum.CompleteForm,
pageType: PageEnum.New,
spouse: {
currentSalary: { grossSalaryAmount: 40000 },
staffInfo: {
preferredName: 'Jane',
lastName: 'Doe',
},
},
requestData: {
latestAdditionalSalaryRequest: {
calculations: {
currentSalaryCap: 500,
combinedCap: 100000,
},
spouseCalculations: {
currentSalaryCap: 50000,
pendingAsrAmount: 100,
},
},
},
} as unknown as ReturnType<typeof useAdditionalSalaryRequest>);

const validFormValues: CompleteFormValues = {
Expand Down Expand Up @@ -526,6 +513,8 @@
pendingAsrAmount: 600,
},
progressiveApprovalTier: { id: 'tier-1' },
progressiveApprovalTierReason:
ProgressiveApprovalTierReasonEnum.OverUserCap,
},
},
} as unknown as ReturnType<typeof useAdditionalSalaryRequest>);
Expand Down Expand Up @@ -718,7 +707,6 @@
...defaultMockContextValue,
currentIndex: mockSteps.length - 2,
currentStep: AdditionalSalaryRequestSectionEnum.CompleteForm,
hasBoardCapException: true,
requestData: {
latestAdditionalSalaryRequest: {
id: 'asr-1',
Expand All @@ -730,6 +718,8 @@
pendingAsrAmount: 0,
},
progressiveApprovalTier: { id: 'tier-1' },
progressiveApprovalTierReason:
ProgressiveApprovalTierReasonEnum.BoardCapException,
},
},
};
Expand Down Expand Up @@ -792,6 +782,7 @@
currentSalaryCap: 100000,
},
progressiveApprovalTier: null,
progressiveApprovalTierReason: null,
},
},
} as unknown as ReturnType<typeof useAdditionalSalaryRequest>);
Expand Down
Loading
Loading