Skip to content

Commit a638e2b

Browse files
committed
Merge branch 'main' into fix/66684
2 parents b84c867 + c31f822 commit a638e2b

19 files changed

Lines changed: 355 additions & 120 deletions

src/CONST/index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3288,9 +3288,9 @@ const CONST = {
32883288
ALLOW: 'personal',
32893289
},
32903290
STATEMENT_CLOSE_DATE: {
3291-
LAST_DAY_OF_MONTH: 'lastDayOfMonth',
3292-
LAST_BUSINESS_DAY_OF_MONTH: 'lastBusinessDayOfMonth',
3293-
CUSTOM_DAY_OF_MONTH: 'customDayOfMonth',
3291+
LAST_DAY_OF_MONTH: 'LAST_DAY_OF_MONTH',
3292+
LAST_BUSINESS_DAY_OF_MONTH: 'LAST_BUSINESS_DAY_OF_MONTH',
3293+
CUSTOM_DAY_OF_MONTH: 'CUSTOM_DAY_OF_MONTH',
32943294
},
32953295
CARD_LIST_THRESHOLD: 8,
32963296
DEFAULT_EXPORT_TYPE: 'default',

src/hooks/useImportPlaidAccounts.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,13 @@ export default function useImportPlaidAccounts(policyID?: string) {
1313
const plaidFeedName = addNewCard?.data?.plaidConnectedFeedName ?? assignCard?.data?.plaidConnectedFeedName;
1414
const plaidAccounts = addNewCard?.data?.plaidAccounts ?? assignCard?.data?.plaidAccounts;
1515
const country = addNewCard?.data?.selectedCountry;
16+
const statementPeriodEnd = addNewCard?.data?.statementPeriodEnd;
17+
const statementPeriodEndDay = addNewCard?.data?.statementPeriodEndDay;
1618

1719
return useCallback(() => {
1820
if (!policyID || !plaidToken || !plaidFeed || !plaidFeedName || !country || !plaidAccounts?.length) {
1921
return;
2022
}
21-
importPlaidAccounts(plaidToken, plaidFeed, plaidFeedName, country, getDomainNameForPolicy(policyID), JSON.stringify(plaidAccounts));
22-
}, [country, plaidAccounts, plaidFeed, plaidFeedName, plaidToken, policyID]);
23+
importPlaidAccounts(plaidToken, plaidFeed, plaidFeedName, country, getDomainNameForPolicy(policyID), JSON.stringify(plaidAccounts), statementPeriodEnd, statementPeriodEndDay);
24+
}, [statementPeriodEnd, statementPeriodEndDay, country, plaidAccounts, plaidFeed, plaidFeedName, plaidToken, policyID]);
2325
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
1+
import type {StatementPeriodEnd, StatementPeriodEndDay} from '@src/types/onyx/CardFeeds';
2+
13
type ImportPlaidAccountsParams = {
24
publicToken: string;
35
feed: string;
46
feedName: string;
57
country: string;
68
domainName: string;
79
plaidAccounts: string;
10+
statementPeriodEnd?: StatementPeriodEnd;
11+
statementPeriodEndDay?: StatementPeriodEndDay;
812
};
913

1014
export default ImportPlaidAccountsParams;
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1+
import type {StatementPeriodEnd, StatementPeriodEndDay} from '@src/types/onyx/CardFeeds';
2+
13
type RequestFeedSetupParams = {
24
authToken: string;
35
policyID: string;
46
feedDetails: string;
57
feedType: string;
8+
statementPeriodEnd?: StatementPeriodEnd;
9+
statementPeriodEndDay?: StatementPeriodEndDay;
610
};
711

812
export default RequestFeedSetupParams;
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import type {StatementPeriodEnd, StatementPeriodEndDay} from '@src/types/onyx/CardFeeds';
2+
3+
type SetFeedStatementPeriodEndDayParams = {
4+
authToken: string | null | undefined;
5+
policyID: string;
6+
bankName: string;
7+
domainAccountID: number;
8+
statementPeriodEnd: StatementPeriodEnd | undefined;
9+
statementPeriodEndDay: StatementPeriodEndDay | undefined;
10+
};
11+
12+
export default SetFeedStatementPeriodEndDayParams;

src/libs/API/parameters/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,7 @@ export type {default as DeleteCompanyCardFeed} from './DeleteCompanyCardFeed';
351351
export type {default as SetCompanyCardTransactionLiability} from './SetCompanyCardTransactionLiability';
352352
export type {default as OpenPolicyCompanyCardsFeedParams} from './OpenPolicyCompanyCardsFeedParams';
353353
export type {default as OpenPolicyAddCardFeedPageParams} from './OpenPolicyAddCardFeedPageParams';
354+
export type {default as SetFeedStatementPeriodEndDayParams} from './SetFeedStatementPeriodEndDayParams';
354355
export type {default as AssignCompanyCardParams} from './AssignCompanyCardParams';
355356
export type {default as UnassignCompanyCard} from './UnassignCompanyCard';
356357
export type {default as UpdateCompanyCard} from './UpdateCompanyCard';

src/libs/API/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,7 @@ const WRITE_COMMANDS = {
455455
DELETE_COMPANY_CARD_FEED: 'RemoveFeed',
456456
SET_COMPANY_CARD_TRANSACTION_LIABILITY: 'SetFeedTransactionLiability',
457457
OPEN_POLICY_ADD_CARD_FEED_PAGE: 'OpenPolicyAddCardFeedPage',
458+
SET_FEED_STATEMENT_PERIOD_END_DAY: 'SetFeedStatementPeriodEndDay',
458459
ASSIGN_COMPANY_CARD: 'AssignCard',
459460
UNASSIGN_COMPANY_CARD: 'UnassignCard',
460461
UPDATE_COMPANY_CARD: 'SyncCard',
@@ -562,6 +563,7 @@ type WriteCommandParameters = {
562563
[WRITE_COMMANDS.SET_CARD_EXPORT_ACCOUNT]: Parameters.SetCompanyCardExportAccountParams;
563564
[WRITE_COMMANDS.SET_COMPANY_CARD_TRANSACTION_LIABILITY]: Parameters.SetCompanyCardTransactionLiability;
564565
[WRITE_COMMANDS.OPEN_POLICY_ADD_CARD_FEED_PAGE]: Parameters.OpenPolicyAddCardFeedPageParams;
566+
[WRITE_COMMANDS.SET_FEED_STATEMENT_PERIOD_END_DAY]: Parameters.SetFeedStatementPeriodEndDayParams;
565567
[WRITE_COMMANDS.VERIFY_IDENTITY]: Parameters.VerifyIdentityParams;
566568
[WRITE_COMMANDS.ACCEPT_WALLET_TERMS]: Parameters.AcceptWalletTermsParams;
567569
[WRITE_COMMANDS.ANSWER_QUESTIONS_FOR_WALLET]: Parameters.AnswerQuestionsForWalletParams;

src/libs/actions/CompanyCards.ts

Lines changed: 116 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type {OnyxEntry, OnyxUpdate} from 'react-native-onyx';
1+
import type {NullishDeep, OnyxEntry, OnyxUpdate} from 'react-native-onyx';
22
import Onyx from 'react-native-onyx';
33
import * as API from '@libs/API';
44
import type {
@@ -8,6 +8,7 @@ import type {
88
OpenPolicyExpensifyCardsPageParams,
99
RequestFeedSetupParams,
1010
SetCompanyCardExportAccountParams,
11+
SetFeedStatementPeriodEndDayParams,
1112
UpdateCompanyCardNameParams,
1213
} from '@libs/API/parameters';
1314
import {READ_COMMANDS, WRITE_COMMANDS} from '@libs/API/types';
@@ -21,7 +22,7 @@ import CONST from '@src/CONST';
2122
import ONYXKEYS from '@src/ONYXKEYS';
2223
import type {Card, CardFeeds} from '@src/types/onyx';
2324
import type {AssignCard, AssignCardData} from '@src/types/onyx/AssignCard';
24-
import type {AddNewCardFeedData, AddNewCardFeedStep, CardFeedDetails, CompanyCardFeed} from '@src/types/onyx/CardFeeds';
25+
import type {AddNewCardFeedData, AddNewCardFeedStep, CardFeedData, CardFeedDetails, CompanyCardFeed, StatementPeriodEnd, StatementPeriodEndDay} from '@src/types/onyx/CardFeeds';
2526
import type {OnyxData} from '@src/types/onyx/Request';
2627

2728
type AddNewCompanyCardFlowData = {
@@ -47,7 +48,7 @@ function clearAssignCardStepAndData() {
4748
Onyx.set(ONYXKEYS.ASSIGN_CARD, {});
4849
}
4950

50-
function setAddNewCompanyCardStepAndData({data, isEditing, step}: AddNewCompanyCardFlowData) {
51+
function setAddNewCompanyCardStepAndData({data, isEditing, step}: NullishDeep<AddNewCompanyCardFlowData>) {
5152
Onyx.merge(ONYXKEYS.ADD_NEW_COMPANY_CARD, {data, isEditing, currentStep: step});
5253
}
5354

@@ -58,7 +59,15 @@ function clearAddNewCardFlow() {
5859
});
5960
}
6061

61-
function addNewCompanyCardsFeed(policyID: string | undefined, cardFeed: CompanyCardFeed, feedDetails: CardFeedDetails, cardFeeds: OnyxEntry<CardFeeds>, lastSelectedFeed?: CompanyCardFeed) {
62+
function addNewCompanyCardsFeed(
63+
policyID: string | undefined,
64+
cardFeed: CompanyCardFeed,
65+
feedDetails: CardFeedDetails,
66+
cardFeeds: OnyxEntry<CardFeeds>,
67+
statementPeriodEnd: StatementPeriodEnd | undefined,
68+
statementPeriodEndDay: StatementPeriodEndDay | undefined,
69+
lastSelectedFeed?: CompanyCardFeed,
70+
) {
6271
const authToken = NetworkStore.getAuthToken();
6372
const workspaceAccountID = PolicyUtils.getWorkspaceAccountID(policyID);
6473

@@ -82,6 +91,7 @@ function addNewCompanyCardsFeed(policyID: string | undefined, cardFeed: CompanyC
8291
settings: {
8392
companyCards: {
8493
[feedType]: {
94+
statementPeriodEndDay: statementPeriodEndDay ?? statementPeriodEnd ?? null,
8595
errors: null,
8696
},
8797
},
@@ -134,6 +144,8 @@ function addNewCompanyCardsFeed(policyID: string | undefined, cardFeed: CompanyC
134144
feedDetails: Object.entries(feedDetails)
135145
.map(([key, value]) => `${key}: ${value}`)
136146
.join(', '),
147+
statementPeriodEnd,
148+
statementPeriodEndDay,
137149
};
138150

139151
API.write(WRITE_COMMANDS.REQUEST_FEED_SETUP, parameters, {optimisticData, failureData, successData, finallyData});
@@ -811,6 +823,104 @@ function openPolicyAddCardFeedPage(policyID: string | undefined) {
811823
API.write(WRITE_COMMANDS.OPEN_POLICY_ADD_CARD_FEED_PAGE, parameters);
812824
}
813825

826+
function setFeedStatementPeriodEndDay(
827+
policyID: string,
828+
bankName: string,
829+
domainAccountID: number,
830+
newStatementPeriodEnd: StatementPeriodEnd | undefined,
831+
newStatementPeriodEndDay: StatementPeriodEndDay | undefined,
832+
oldStatementPeriodEndDay: StatementPeriodEnd | StatementPeriodEndDay | undefined,
833+
) {
834+
const authToken = NetworkStore.getAuthToken();
835+
836+
const optimisticData: OnyxUpdate[] = [
837+
{
838+
onyxMethod: Onyx.METHOD.MERGE,
839+
key: `${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER}${domainAccountID}`,
840+
value: {
841+
settings: {
842+
companyCards: {
843+
[bankName]: {
844+
statementPeriodEndDay: newStatementPeriodEndDay ?? newStatementPeriodEnd ?? null,
845+
pendingFields: {
846+
statementPeriodEndDay: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE,
847+
},
848+
errorFields: {
849+
statementPeriodEndDay: null,
850+
},
851+
},
852+
},
853+
},
854+
},
855+
},
856+
];
857+
858+
const successData: OnyxUpdate[] = [
859+
{
860+
onyxMethod: Onyx.METHOD.MERGE,
861+
key: `${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER}${domainAccountID}`,
862+
value: {
863+
settings: {
864+
companyCards: {
865+
[bankName]: {
866+
pendingFields: {
867+
statementPeriodEndDay: null,
868+
},
869+
},
870+
},
871+
},
872+
},
873+
},
874+
];
875+
876+
const failureData: OnyxUpdate[] = [
877+
{
878+
onyxMethod: Onyx.METHOD.MERGE,
879+
key: `${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER}${domainAccountID}`,
880+
value: {
881+
settings: {
882+
companyCards: {
883+
[bankName]: {
884+
statementPeriodEndDay: oldStatementPeriodEndDay ?? null,
885+
pendingFields: {
886+
statementPeriodEndDay: null,
887+
},
888+
errorFields: {
889+
statementPeriodEndDay: ErrorUtils.getMicroSecondOnyxErrorWithTranslationKey('common.genericErrorMessage'),
890+
},
891+
},
892+
},
893+
},
894+
},
895+
},
896+
];
897+
898+
const parameters: SetFeedStatementPeriodEndDayParams = {
899+
authToken,
900+
policyID,
901+
bankName,
902+
domainAccountID,
903+
statementPeriodEnd: newStatementPeriodEnd,
904+
statementPeriodEndDay: newStatementPeriodEndDay,
905+
};
906+
907+
API.write(WRITE_COMMANDS.SET_FEED_STATEMENT_PERIOD_END_DAY, parameters, {optimisticData, successData, failureData});
908+
}
909+
910+
function clearErrorField(bankName: string, domainAccountID: number, fieldName: keyof CardFeedData) {
911+
Onyx.merge(`${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER}${domainAccountID}`, {
912+
settings: {
913+
companyCards: {
914+
[bankName]: {
915+
errorFields: {
916+
[fieldName]: null,
917+
},
918+
},
919+
},
920+
},
921+
});
922+
}
923+
814924
export {
815925
setWorkspaceCompanyCardFeedName,
816926
deleteWorkspaceCompanyCardFeed,
@@ -831,4 +941,6 @@ export {
831941
openAssignFeedCardPage,
832942
openPolicyAddCardFeedPage,
833943
setTransactionStartDate,
944+
setFeedStatementPeriodEndDay,
945+
clearErrorField,
834946
};

src/libs/actions/Plaid.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {READ_COMMANDS, WRITE_COMMANDS} from '@libs/API/types';
66
import getPlaidLinkTokenParameters from '@libs/getPlaidLinkTokenParameters';
77
import CONST from '@src/CONST';
88
import ONYXKEYS from '@src/ONYXKEYS';
9+
import type {StatementPeriodEnd, StatementPeriodEndDay} from '@src/types/onyx/CardFeeds';
910

1011
/**
1112
* Gets the Plaid Link token used to initialize the Plaid SDK
@@ -116,14 +117,25 @@ function openPlaidBankAccountSelector(publicToken: string, bankName: string, all
116117
});
117118
}
118119

119-
function importPlaidAccounts(publicToken: string, feed: string, feedName: string, country: string, domainName: string, plaidAccounts: string) {
120+
function importPlaidAccounts(
121+
publicToken: string,
122+
feed: string,
123+
feedName: string,
124+
country: string,
125+
domainName: string,
126+
plaidAccounts: string,
127+
statementPeriodEnd: StatementPeriodEnd | undefined,
128+
statementPeriodEndDay: StatementPeriodEndDay | undefined,
129+
) {
120130
const parameters: ImportPlaidAccountsParams = {
121131
publicToken,
122132
feed,
123133
feedName,
124134
country,
125135
domainName,
126136
plaidAccounts,
137+
statementPeriodEnd,
138+
statementPeriodEndDay,
127139
};
128140

129141
API.write(WRITE_COMMANDS.IMPORT_PLAID_ACCOUNTS, parameters);

src/pages/workspace/companyCards/BankConnection/index.native.tsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,15 @@ function BankConnection({policyID: policyIDFromProps, feed, route}: BankConnecti
114114
if (newFeed) {
115115
updateSelectedFeed(newFeed, policyID);
116116
}
117-
Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARDS.getRoute(policyID));
117+
118+
// Direct feeds (except those added via Plaid) are created with default statement period end date.
119+
// Redirect the user to set a custom date.
120+
if (policyID && !isPlaid) {
121+
Navigation.closeRHPFlow();
122+
Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARDS_SETTINGS_STATEMENT_CLOSE_DATE.getRoute(policyID));
123+
} else {
124+
Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARDS.getRoute(policyID));
125+
}
118126
}
119127
if (isPlaid) {
120128
onImportPlaidAccounts();

0 commit comments

Comments
 (0)