From a1328b6510a5af884ffedbae493b573207366bf1 Mon Sep 17 00:00:00 2001
From: zachery with an e <45150570+zweatshirt@users.noreply.github.com>
Date: Wed, 3 Jun 2026 13:57:42 -0500
Subject: [PATCH 1/2] Add transfer date validation and editing functionality in
TransferModal
---
.../TransferModal/TransferModal.test.tsx | 35 +++++++++++++++++--
.../TransferModal/TransferModal.tsx | 28 +++++++++++----
.../TransferMutations.graphql | 2 ++
3 files changed, 56 insertions(+), 9 deletions(-)
diff --git a/src/components/HrTools/SavingsFundTransfer/TransferModal/TransferModal.test.tsx b/src/components/HrTools/SavingsFundTransfer/TransferModal/TransferModal.test.tsx
index a86a405f1c..4a94759469 100644
--- a/src/components/HrTools/SavingsFundTransfer/TransferModal/TransferModal.test.tsx
+++ b/src/components/HrTools/SavingsFundTransfer/TransferModal/TransferModal.test.tsx
@@ -379,6 +379,30 @@ describe('TransferModal', () => {
).toBeInTheDocument();
});
+ it('should allow editing the transfer date for one-time transfers', async () => {
+ const { getByLabelText } = render();
+
+ const transferDate = getByLabelText(/transfer date/i);
+ expect(transferDate).toBeEnabled();
+
+ userEvent.clear(transferDate);
+ userEvent.type(transferDate, '12/01/2099');
+ expect(transferDate).toHaveValue('12/01/2099');
+ });
+
+ it('should reject a past transfer date for one-time transfers', async () => {
+ const { getByLabelText, findByText } = render();
+
+ const transferDate = getByLabelText(/transfer date/i);
+ userEvent.clear(transferDate);
+ userEvent.type(transferDate, '12/31/2019');
+ userEvent.tab();
+
+ expect(
+ await findByText('Transfer start date cannot be in the past'),
+ ).toBeInTheDocument();
+ });
+
it('should show error message when monthly schedule is selected', async () => {
const { getByRole, getByLabelText, findByText } = render();
@@ -464,8 +488,8 @@ describe('TransferModal', () => {
});
describe('Mutations', () => {
- it('should create a one-time transfer', async () => {
- const { getByRole } = render();
+ it('should create a one-time transfer with the selected transfer date', async () => {
+ const { getByRole, getByLabelText } = render();
const amountField = getByRole('spinbutton', { name: /amount/i });
@@ -475,6 +499,12 @@ describe('TransferModal', () => {
userEvent.clear(amountField);
userEvent.type(amountField, '100');
+ const transferDate = getByLabelText(/transfer date/i);
+ userEvent.clear(transferDate);
+ userEvent.type(transferDate, '12/01/2099');
+ expect(transferDate).toHaveValue('12/01/2099');
+ userEvent.tab();
+
userEvent.click(getByRole('button', { name: /submit/i }));
await waitFor(() => {
@@ -487,6 +517,7 @@ describe('TransferModal', () => {
sourceFundTypeName: 'Staff Account',
destinationFundTypeName: 'Staff Savings',
description: '',
+ transactedAt: '2099-12-01T00:00:00.000+00:00',
}),
}),
}),
diff --git a/src/components/HrTools/SavingsFundTransfer/TransferModal/TransferModal.tsx b/src/components/HrTools/SavingsFundTransfer/TransferModal/TransferModal.tsx
index d09fd8bd40..bbc6817403 100644
--- a/src/components/HrTools/SavingsFundTransfer/TransferModal/TransferModal.tsx
+++ b/src/components/HrTools/SavingsFundTransfer/TransferModal/TransferModal.tsx
@@ -104,9 +104,12 @@ const transferSchema = (locale: string) =>
}
return this.createError({
- message: i18n.t(
- 'Recurring transfers must start at least one day in the future',
- ),
+ message:
+ schedule === ScheduleEnum.OneTime
+ ? i18n.t('Transfer start date cannot be in the past')
+ : i18n.t(
+ 'Recurring transfers must start at least one day in the future',
+ ),
});
}),
endDate: yup
@@ -216,6 +219,7 @@ export const TransferModal: React.FC = ({
sourceFundTypeName: transferFrom,
destinationFundTypeName: transferTo,
description: note,
+ transactedAt: convertedTransferDate,
},
});
} else {
@@ -429,11 +433,21 @@ export const TransferModal: React.FC = ({
{schedule === ScheduleEnum.OneTime ? (
- {
+ setFieldValue('transferDate', date);
+ setFieldTouched('transferDate', true, false);
+ }}
+ error={
+ touched.transferDate && Boolean(errors.transferDate)
+ }
+ helperText={
+ touched.transferDate &&
+ (errors.transferDate as string)
+ }
+ required
/>
) : (
diff --git a/src/components/HrTools/SavingsFundTransfer/TransferMutations.graphql b/src/components/HrTools/SavingsFundTransfer/TransferMutations.graphql
index 45b79e69d0..ddc3b29447 100644
--- a/src/components/HrTools/SavingsFundTransfer/TransferMutations.graphql
+++ b/src/components/HrTools/SavingsFundTransfer/TransferMutations.graphql
@@ -47,6 +47,7 @@ mutation CreateTransfer(
$destinationFundTypeName: String!
$description: String!
$amount: Float!
+ $transactedAt: ISO8601DateTime
) {
createTransfer(
input: {
@@ -54,6 +55,7 @@ mutation CreateTransfer(
destinationFundTypeName: $destinationFundTypeName
description: $description
amount: $amount
+ transactedAt: $transactedAt
}
) {
message
From 51c5183a9ceb84a3d617586b950e6753b55b87cb Mon Sep 17 00:00:00 2001
From: zachery with an e <45150570+zweatshirt@users.noreply.github.com>
Date: Wed, 3 Jun 2026 15:06:23 -0500
Subject: [PATCH 2/2] Make transactedAt field required in CreateTransfer
mutation
---
.../HrTools/SavingsFundTransfer/TransferMutations.graphql | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/components/HrTools/SavingsFundTransfer/TransferMutations.graphql b/src/components/HrTools/SavingsFundTransfer/TransferMutations.graphql
index ddc3b29447..7b35296797 100644
--- a/src/components/HrTools/SavingsFundTransfer/TransferMutations.graphql
+++ b/src/components/HrTools/SavingsFundTransfer/TransferMutations.graphql
@@ -47,7 +47,7 @@ mutation CreateTransfer(
$destinationFundTypeName: String!
$description: String!
$amount: Float!
- $transactedAt: ISO8601DateTime
+ $transactedAt: ISO8601DateTime!
) {
createTransfer(
input: {