diff --git a/src/libs/CardUtils.ts b/src/libs/CardUtils.ts index 0c2d5ff3921ec..f1e97dc1fe2b8 100644 --- a/src/libs/CardUtils.ts +++ b/src/libs/CardUtils.ts @@ -1,5 +1,5 @@ import type {FeedKeysWithAssignedCards} from '@selectors/Card'; -import {fromUnixTime, isBefore} from 'date-fns'; +import {format, fromUnixTime, isBefore} from 'date-fns'; import groupBy from 'lodash/groupBy'; import type {OnyxCollection, OnyxEntry} from 'react-native-onyx'; import type {TupleToUnion, ValueOf} from 'type-fest'; @@ -840,6 +840,19 @@ function getDefaultCardName(cardholder?: string) { return `${cardholder}'s card`; } +/** + * Gets the start date for a card assignment. + * When not editing, always returns the current date. + * When editing, returns the existing start date or current date as fallback. + * + * @param isEditing - Whether the card assignment is being edited + * @param existingStartDate - The existing start date from previous assignment + * @returns Formatted start date string in yyyy-MM-dd format + */ +function getCardAssignmentStartDate(isEditing: boolean | undefined, existingStartDate?: string): string { + return isEditing ? (existingStartDate ?? format(new Date(), CONST.DATE.FNS_FORMAT_STRING)) : format(new Date(), CONST.DATE.FNS_FORMAT_STRING); +} + function checkIfNewFeedConnected(prevFeedsData: CompanyFeeds, currentFeedsData: CompanyFeeds, plaidBank?: string) { const prevFeeds = Object.keys(prevFeedsData); const currentFeeds = Object.keys(currentFeedsData); @@ -1196,6 +1209,7 @@ export { hasOnlyOneCardToAssign, checkIfNewFeedConnected, getDefaultCardName, + getCardAssignmentStartDate, getDomainOrWorkspaceAccountID, mergeCardListWithWorkspaceFeeds, isCard, diff --git a/src/pages/workspace/companyCards/assignCard/AssigneeStep.tsx b/src/pages/workspace/companyCards/assignCard/AssigneeStep.tsx index 646c17b2a04b5..a55201316e514 100644 --- a/src/pages/workspace/companyCards/assignCard/AssigneeStep.tsx +++ b/src/pages/workspace/companyCards/assignCard/AssigneeStep.tsx @@ -1,4 +1,3 @@ -import {format} from 'date-fns'; import {Str} from 'expensify-common'; import React, {useEffect, useMemo, useState} from 'react'; import {Keyboard} from 'react-native'; @@ -16,7 +15,7 @@ import useSearchSelector from '@hooks/useSearchSelector'; import useThemeStyles from '@hooks/useThemeStyles'; import {setDraftInviteAccountID} from '@libs/actions/Card'; import {searchInServer} from '@libs/actions/Report'; -import {getDefaultCardName} from '@libs/CardUtils'; +import {getCardAssignmentStartDate, getDefaultCardName} from '@libs/CardUtils'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import type {SettingsNavigatorParamList} from '@libs/Navigation/types'; import {getHeaderMessage, getSearchValueForPhoneOrEmail, sortAlphabetically} from '@libs/OptionsListUtils'; @@ -92,9 +91,7 @@ function AssigneeStep({route}: AssigneeStepProps) { cardToAssign.encryptedCardNumber = assignCard.cardToAssign.encryptedCardNumber; cardToAssign.cardName = assignCard.cardToAssign.cardName; cardToAssign.customCardName = assignCard.cardToAssign.customCardName ?? defaultCardName; - cardToAssign.startDate = !isEditing - ? format(new Date(), CONST.DATE.FNS_FORMAT_STRING) - : (assignCard?.cardToAssign?.startDate ?? format(new Date(), CONST.DATE.FNS_FORMAT_STRING)); + cardToAssign.startDate = getCardAssignmentStartDate(isEditing, assignCard?.cardToAssign?.startDate); cardToAssign.dateOption = !isEditing ? CONST.COMPANY_CARD.TRANSACTION_START_DATE_OPTIONS.CUSTOM : (assignCard?.cardToAssign?.dateOption ?? CONST.COMPANY_CARD.TRANSACTION_START_DATE_OPTIONS.CUSTOM); @@ -129,9 +126,7 @@ function AssigneeStep({route}: AssigneeStepProps) { cardToAssign.encryptedCardNumber = assignCard.cardToAssign.encryptedCardNumber; cardToAssign.cardName = assignCard.cardToAssign.cardName; cardToAssign.customCardName = assignCard.cardToAssign.customCardName ?? defaultCardName; - cardToAssign.startDate = !isEditing - ? format(new Date(), CONST.DATE.FNS_FORMAT_STRING) - : (assignCard?.cardToAssign?.startDate ?? format(new Date(), CONST.DATE.FNS_FORMAT_STRING)); + cardToAssign.startDate = getCardAssignmentStartDate(isEditing, assignCard?.cardToAssign?.startDate); cardToAssign.dateOption = !isEditing ? CONST.COMPANY_CARD.TRANSACTION_START_DATE_OPTIONS.CUSTOM : (assignCard?.cardToAssign?.dateOption ?? CONST.COMPANY_CARD.TRANSACTION_START_DATE_OPTIONS.CUSTOM); diff --git a/src/pages/workspace/companyCards/assignCard/InviteNewMemberStep.tsx b/src/pages/workspace/companyCards/assignCard/InviteNewMemberStep.tsx index 6494fd2a0c5d2..4377fcd4b6631 100644 --- a/src/pages/workspace/companyCards/assignCard/InviteNewMemberStep.tsx +++ b/src/pages/workspace/companyCards/assignCard/InviteNewMemberStep.tsx @@ -7,7 +7,7 @@ import useCardsList from '@hooks/useCardsList'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; import {setDraftInviteAccountID} from '@libs/actions/Card'; -import {getDefaultCardName, getFilteredCardList, hasOnlyOneCardToAssign} from '@libs/CardUtils'; +import {getCardAssignmentStartDate, getDefaultCardName, getFilteredCardList, hasOnlyOneCardToAssign} from '@libs/CardUtils'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import type {SettingsNavigatorParamList} from '@libs/Navigation/types'; import Navigation from '@navigation/Navigation'; @@ -63,7 +63,7 @@ function InviteNewMemberStep({route, currentUserPersonalDetails}: InviteeNewMemb cardToAssign.encryptedCardNumber = assignCard.cardToAssign.encryptedCardNumber; cardToAssign.cardName = assignCard.cardToAssign.cardName; cardToAssign.customCardName = assignCard.cardToAssign.customCardName ?? defaultCardName; - cardToAssign.startDate = assignCard?.cardToAssign?.startDate ?? new Date().toISOString().split('T').at(0); + cardToAssign.startDate = getCardAssignmentStartDate(true, assignCard?.cardToAssign?.startDate); cardToAssign.dateOption = assignCard?.cardToAssign?.dateOption ?? CONST.COMPANY_CARD.TRANSACTION_START_DATE_OPTIONS.CUSTOM; setAssignCardStepAndData({ currentStep: CONST.COMPANY_CARD.STEP.CONFIRMATION, @@ -75,7 +75,7 @@ function InviteNewMemberStep({route, currentUserPersonalDetails}: InviteeNewMemb const onlyCard = filteredCardList.at(0); cardToAssign.cardName = onlyCard?.cardName; cardToAssign.encryptedCardNumber = onlyCard?.cardID; - cardToAssign.startDate = assignCard?.cardToAssign?.startDate ?? new Date().toISOString().split('T').at(0); + cardToAssign.startDate = getCardAssignmentStartDate(true, assignCard?.cardToAssign?.startDate); cardToAssign.dateOption = assignCard?.cardToAssign?.dateOption ?? CONST.COMPANY_CARD.TRANSACTION_START_DATE_OPTIONS.CUSTOM; setAssignCardStepAndData({ currentStep: CONST.COMPANY_CARD.STEP.CONFIRMATION,