Skip to content

Commit 3385a1f

Browse files
authored
Merge pull request #39017 from Expensify/rodrigo-use-reimburser-from-achAcconut
Replaces usage of reimburserEmail with achAccount.reimburser
2 parents 838b2dd + 951bcc6 commit 3385a1f

File tree

7 files changed

+37
-68
lines changed

7 files changed

+37
-68
lines changed

src/CONST.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1526,7 +1526,7 @@ const CONST = {
15261526
},
15271527
COLLECTION_KEYS: {
15281528
DESCRIPTION: 'description',
1529-
REIMBURSER_EMAIL: 'reimburserEmail',
1529+
REIMBURSER: 'reimburser',
15301530
REIMBURSEMENT_CHOICE: 'reimbursementChoice',
15311531
APPROVAL_MODE: 'approvalMode',
15321532
AUTOREPORTING: 'autoReporting',

src/libs/ReportUtils.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1336,8 +1336,8 @@ function isPayer(session: OnyxEntry<Session>, iouReport: OnyxEntry<Report>) {
13361336
const isManager = iouReport?.managerID === session?.accountID;
13371337
if (isPaidGroupPolicy(iouReport)) {
13381338
if (policy?.reimbursementChoice === CONST.POLICY.REIMBURSEMENT_CHOICES.REIMBURSEMENT_YES) {
1339-
const isReimburser = session?.email === policy?.reimburserEmail;
1340-
return (!policy?.reimburserEmail || isReimburser) && (isApproved || isManager);
1339+
const isReimburser = session?.email === policy?.achAccount?.reimburser;
1340+
return (!policy?.achAccount?.reimburser || isReimburser) && (isApproved || isManager);
13411341
}
13421342
if (policy?.reimbursementChoice === CONST.POLICY.REIMBURSEMENT_CHOICES.REIMBURSEMENT_MANUAL) {
13431343
return isAdmin && (isApproved || isManager);

src/libs/actions/Policy.ts

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -675,18 +675,17 @@ function setWorkspaceApprovalMode(policyID: string, approver: string, approvalMo
675675
API.write(WRITE_COMMANDS.SET_WORKSPACE_APPROVAL_MODE, params, {optimisticData, failureData, successData});
676676
}
677677

678-
function setWorkspacePayer(policyID: string, reimburserEmail: string, reimburserAccountID: number) {
678+
function setWorkspacePayer(policyID: string, reimburserEmail: string) {
679679
const policy = getPolicy(policyID);
680680

681681
const optimisticData: OnyxUpdate[] = [
682682
{
683683
onyxMethod: Onyx.METHOD.MERGE,
684684
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
685685
value: {
686-
reimburserEmail,
687-
reimburserAccountID,
688-
errorFields: {reimburserEmail: null},
689-
pendingFields: {reimburserEmail: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE},
686+
achAccount: {reimburser: reimburserEmail},
687+
errorFields: {reimburser: null},
688+
pendingFields: {reimburser: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE},
690689
},
691690
},
692691
];
@@ -696,8 +695,8 @@ function setWorkspacePayer(policyID: string, reimburserEmail: string, reimburser
696695
onyxMethod: Onyx.METHOD.MERGE,
697696
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
698697
value: {
699-
errorFields: {reimburserEmail: null},
700-
pendingFields: {reimburserEmail: null},
698+
errorFields: {reimburser: null},
699+
pendingFields: {reimburser: null},
701700
},
702701
},
703702
];
@@ -707,10 +706,9 @@ function setWorkspacePayer(policyID: string, reimburserEmail: string, reimburser
707706
onyxMethod: Onyx.METHOD.MERGE,
708707
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
709708
value: {
710-
reimburserEmail: policy.reimburserEmail ?? null,
711-
reimburserAccountID: policy.reimburserAccountID ?? null,
712-
errorFields: {reimburserEmail: ErrorUtils.getMicroSecondOnyxError('workflowsPayerPage.genericErrorMessage')},
713-
pendingFields: {reimburserEmail: null},
709+
achAccount: {reimburser: policy.achAccount?.reimburser ?? null},
710+
errorFields: {reimburser: ErrorUtils.getMicroSecondOnyxError('workflowsPayerPage.genericErrorMessage')},
711+
pendingFields: {reimburser: null},
714712
},
715713
},
716714
];
@@ -724,7 +722,7 @@ function clearPolicyErrorField(policyID: string, fieldName: string) {
724722
Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {errorFields: {[fieldName]: null}});
725723
}
726724

727-
function setWorkspaceReimbursement(policyID: string, reimbursementChoice: ValueOf<typeof CONST.POLICY.REIMBURSEMENT_CHOICES>, reimburserAccountID: number, reimburserEmail: string) {
725+
function setWorkspaceReimbursement(policyID: string, reimbursementChoice: ValueOf<typeof CONST.POLICY.REIMBURSEMENT_CHOICES>, reimburserEmail: string) {
728726
const policy = getPolicy(policyID);
729727

730728
const optimisticData: OnyxUpdate[] = [
@@ -733,8 +731,7 @@ function setWorkspaceReimbursement(policyID: string, reimbursementChoice: ValueO
733731
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
734732
value: {
735733
reimbursementChoice,
736-
reimburserAccountID,
737-
reimburserEmail,
734+
achAccount: {reimburser: reimburserEmail},
738735
errorFields: {reimbursementChoice: null},
739736
pendingFields: {reimbursementChoice: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE},
740737
},
@@ -758,8 +755,7 @@ function setWorkspaceReimbursement(policyID: string, reimbursementChoice: ValueO
758755
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
759756
value: {
760757
reimbursementChoice: policy.reimbursementChoice ?? null,
761-
reimburserAccountID: policy.reimburserAccountID ?? null,
762-
reimburserEmail: policy.reimburserEmail ?? null,
758+
achAccount: {reimburser: policy.achAccount?.reimburser ?? null},
763759
errorFields: {reimbursementChoice: ErrorUtils.getMicroSecondOnyxError('common.genericErrorMessage')},
764760
pendingFields: {reimbursementChoice: null},
765761
},

src/pages/workspace/WorkspaceInitialPage.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ function WorkspaceInitialPage({policyDraft, policy: policyProp, policyMembers, r
165165
icon: Expensicons.Workflows,
166166
action: singleExecution(waitForNavigate(() => Navigation.navigate(ROUTES.WORKSPACE_WORKFLOWS.getRoute(policyID)))),
167167
routeName: SCREENS.WORKSPACE.WORKFLOWS,
168-
brickRoadIndicator: !isEmptyObject(policy?.errorFields?.reimburserEmail ?? {}) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined,
168+
brickRoadIndicator: !isEmptyObject(policy?.errorFields?.reimburser ?? {}) ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined,
169169
});
170170
}
171171

src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import CONST from '@src/CONST';
3030
import ONYXKEYS from '@src/ONYXKEYS';
3131
import ROUTES from '@src/ROUTES';
3232
import type SCREENS from '@src/SCREENS';
33-
import type {Beta, Session} from '@src/types/onyx';
33+
import type {Beta} from '@src/types/onyx';
3434
import ToggleSettingOptionRow from './ToggleSettingsOptionRow';
3535
import type {ToggleSettingOptionRowProps} from './ToggleSettingsOptionRow';
3636
import {getAutoReportingFrequencyDisplayNames} from './WorkspaceAutoReportingFrequencyPage';
@@ -39,12 +39,10 @@ import type {AutoReportingFrequencyKey} from './WorkspaceAutoReportingFrequencyP
3939
type WorkspaceWorkflowsPageOnyxProps = {
4040
/** Beta features list */
4141
betas: OnyxEntry<Beta[]>;
42-
/** Policy details */
43-
session: OnyxEntry<Session>;
4442
};
4543
type WorkspaceWorkflowsPageProps = WithPolicyProps & WorkspaceWorkflowsPageOnyxProps & StackScreenProps<WorkspacesCentralPaneNavigatorParamList, typeof SCREENS.WORKSPACE.WORKFLOWS>;
4644

47-
function WorkspaceWorkflowsPage({policy, betas, route, session}: WorkspaceWorkflowsPageProps) {
45+
function WorkspaceWorkflowsPage({policy, betas, route}: WorkspaceWorkflowsPageProps) {
4846
const {translate, preferredLocale} = useLocalize();
4947
const styles = useThemeStyles();
5048
const {isSmallScreenWidth} = useWindowDimensions();
@@ -55,11 +53,10 @@ function WorkspaceWorkflowsPage({policy, betas, route, session}: WorkspaceWorkfl
5553
const canUseDelayedSubmission = Permissions.canUseWorkflowsDelayedSubmission(betas);
5654
const [isCurrencyModalOpen, setIsCurrencyModalOpen] = useState(false);
5755

58-
const displayNameForAuthorizedPayer = useMemo(() => {
59-
const personalDetails = PersonalDetailsUtils.getPersonalDetailsByIDs([policy?.reimburserAccountID ?? 0], session?.accountID ?? 0);
60-
const displayNameFromReimburserEmail = PersonalDetailsUtils.getPersonalDetailByEmail(policy?.reimburserEmail ?? '')?.displayName ?? policy?.reimburserEmail;
61-
return displayNameFromReimburserEmail ?? personalDetails?.[0]?.displayName;
62-
}, [policy?.reimburserAccountID, policy?.reimburserEmail, session?.accountID]);
56+
const displayNameForAuthorizedPayer = useMemo(
57+
() => PersonalDetailsUtils.getPersonalDetailByEmail(policy?.achAccount?.reimburser ?? '')?.displayName ?? policy?.achAccount?.reimburser,
58+
[policy?.achAccount?.reimburser],
59+
);
6360

6461
const onPressAutoReportingFrequency = useCallback(() => Navigation.navigate(ROUTES.WORKSPACE_WORKFLOWS_AUTOREPORTING_FREQUENCY.getRoute(policy?.id ?? '')), [policy?.id]);
6562

@@ -92,7 +89,7 @@ function WorkspaceWorkflowsPage({policy, betas, route, session}: WorkspaceWorkfl
9289
if (accountNumber && bankDisplayName !== accountNumber) {
9390
bankDisplayName += ` ${accountNumber.slice(-5)}`;
9491
}
95-
const hasReimburserEmailError = !!policy?.errorFields?.reimburserEmail;
92+
const hasReimburserError = !!policy?.errorFields?.reimburser;
9693
const hasApprovalError = !!policy?.errorFields?.approvalMode;
9794
const hasDelayedSubmissionError = !!policy?.errorFields?.autoReporting;
9895

@@ -174,11 +171,8 @@ function WorkspaceWorkflowsPage({policy, betas, route, session}: WorkspaceWorkfl
174171
newReimbursementChoice = hasVBA ? CONST.POLICY.REIMBURSEMENT_CHOICES.REIMBURSEMENT_YES : CONST.POLICY.REIMBURSEMENT_CHOICES.REIMBURSEMENT_MANUAL;
175172
}
176173

177-
const newReimburserAccountID =
178-
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
179-
PersonalDetailsUtils.getPersonalDetailByEmail(policy?.reimburserEmail ?? '')?.accountID || policy?.reimburserAccountID || policy?.ownerAccountID;
180-
const newReimburserEmail = PersonalDetailsUtils.getPersonalDetailsByIDs([newReimburserAccountID ?? 0], session?.accountID ?? 0)?.[0]?.login;
181-
Policy.setWorkspaceReimbursement(policy?.id ?? '', newReimbursementChoice, newReimburserAccountID ?? 0, newReimburserEmail ?? '');
174+
const newReimburserEmail = policy?.achAccount?.reimburser ?? policy?.owner;
175+
Policy.setWorkspaceReimbursement(policy?.id ?? '', newReimbursementChoice, newReimburserEmail ?? '');
182176
},
183177
subMenuItems: (
184178
<>
@@ -205,9 +199,9 @@ function WorkspaceWorkflowsPage({policy, betas, route, session}: WorkspaceWorkfl
205199
/>
206200
{hasVBA && policy?.reimbursementChoice === CONST.POLICY.REIMBURSEMENT_CHOICES.REIMBURSEMENT_YES && (
207201
<OfflineWithFeedback
208-
pendingAction={policy?.pendingFields?.reimburserEmail}
209-
errors={ErrorUtils.getLatestErrorField(policy ?? {}, CONST.POLICY.COLLECTION_KEYS.REIMBURSER_EMAIL)}
210-
onClose={() => Policy.clearPolicyErrorField(policy?.id ?? '', CONST.POLICY.COLLECTION_KEYS.REIMBURSER_EMAIL)}
202+
pendingAction={policy?.pendingFields?.reimburser}
203+
errors={ErrorUtils.getLatestErrorField(policy ?? {}, CONST.POLICY.COLLECTION_KEYS.REIMBURSER)}
204+
onClose={() => Policy.clearPolicyErrorField(policy?.id ?? '', CONST.POLICY.COLLECTION_KEYS.REIMBURSER)}
211205
errorRowStyles={[styles.ml7]}
212206
>
213207
<MenuItem
@@ -219,7 +213,7 @@ function WorkspaceWorkflowsPage({policy, betas, route, session}: WorkspaceWorkfl
219213
shouldShowRightIcon
220214
wrapperStyle={containerStyle}
221215
hoverAndPressStyle={[styles.mr0, styles.br2]}
222-
brickRoadIndicator={hasReimburserEmailError ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined}
216+
brickRoadIndicator={hasReimburserError ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined}
223217
/>
224218
</OfflineWithFeedback>
225219
)}
@@ -243,7 +237,6 @@ function WorkspaceWorkflowsPage({policy, betas, route, session}: WorkspaceWorkfl
243237
preferredLocale,
244238
canUseDelayedSubmission,
245239
displayNameForAuthorizedPayer,
246-
session?.accountID,
247240
isOffline,
248241
isPolicyAdmin,
249242
]);
@@ -321,8 +314,5 @@ export default withPolicy(
321314
betas: {
322315
key: ONYXKEYS.BETAS,
323316
},
324-
session: {
325-
key: ONYXKEYS.SESSION,
326-
},
327317
})(WorkspaceWorkflowsPage),
328318
);

src/pages/workspace/workflows/WorkspaceWorkflowsPayerPage.tsx

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ function WorkspaceWorkflowsPayerPage({route, policy, policyMembers, personalDeta
8787
/>
8888
);
8989

90-
const isAuthorizedPayer = policy?.reimburserEmail === details?.login ?? policy?.reimburserAccountID === accountID;
90+
const isAuthorizedPayer = policy?.achAccount?.reimburser === details?.login;
9191

9292
const formattedMember = {
9393
keyForList: accountIDKey,
@@ -106,28 +106,17 @@ function WorkspaceWorkflowsPayerPage({route, policy, policyMembers, personalDeta
106106
},
107107
],
108108
errors: policyMember.errors,
109-
pendingAction: policyMember.pendingAction ?? isAuthorizedPayer ? policy?.pendingFields?.reimburserEmail : null,
109+
pendingAction: policyMember.pendingAction ?? isAuthorizedPayer ? policy?.pendingFields?.reimburser : null,
110110
};
111111

112-
if (policy?.reimburserEmail === details?.login ?? policy?.reimburserAccountID === accountID) {
112+
if (isAuthorizedPayer) {
113113
authorizedPayerDetails.push(formattedMember);
114114
} else {
115115
policyAdminDetails.push(formattedMember);
116116
}
117117
});
118118
return [policyAdminDetails, authorizedPayerDetails];
119-
}, [
120-
personalDetails,
121-
policyMembers,
122-
translate,
123-
policy?.reimburserEmail,
124-
isDeletedPolicyMember,
125-
policy?.owner,
126-
styles,
127-
StyleUtils,
128-
policy?.reimburserAccountID,
129-
policy?.pendingFields?.reimburserEmail,
130-
]);
119+
}, [personalDetails, policyMembers, translate, policy?.achAccount?.reimburser, isDeletedPolicyMember, policy?.owner, styles, StyleUtils, policy?.pendingFields?.reimburser]);
131120

132121
const sections: MembersSection[] = useMemo(() => {
133122
const sectionsArray: MembersSection[] = [];
@@ -169,13 +158,12 @@ function WorkspaceWorkflowsPayerPage({route, policy, policyMembers, personalDeta
169158
const setPolicyAuthorizedPayer = (member: MemberOption) => {
170159
const authorizedPayerEmail = personalDetails?.[member.accountID]?.login ?? '';
171160

172-
if (policy?.reimburserEmail === authorizedPayerEmail || policy?.reimbursementChoice !== CONST.POLICY.REIMBURSEMENT_CHOICES.REIMBURSEMENT_YES) {
161+
if (policy?.achAccount?.reimburser === authorizedPayerEmail || policy?.reimbursementChoice !== CONST.POLICY.REIMBURSEMENT_CHOICES.REIMBURSEMENT_YES) {
173162
Navigation.goBack();
174163
return;
175164
}
176165

177-
const authorizedPayerAccountID = member.accountID;
178-
Policy.setWorkspacePayer(policy?.id ?? '', authorizedPayerEmail, authorizedPayerAccountID);
166+
Policy.setWorkspacePayer(policy?.id ?? '', authorizedPayerEmail);
179167
Navigation.goBack();
180168
};
181169

src/types/onyx/Policy.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ type ACHAccount = {
190190
routingNumber: string;
191191
addressName: string;
192192
bankName: string;
193+
reimburser: string;
193194
};
194195

195196
type AutoReportingOffset = number | ValueOf<typeof CONST.POLICY.AUTO_REPORTING_OFFSET>;
@@ -391,12 +392,6 @@ type Policy = OnyxCommon.OnyxValueWithOfflineFeedback<
391392
/** Collection of tax rates attached to a policy */
392393
taxRates?: TaxRatesWithDefault;
393394

394-
/** Email of the reimburser when reimbursement is set direct */
395-
reimburserEmail?: string;
396-
397-
/** AccountID of the reimburser when reimbursement is set direct */
398-
reimburserAccountID?: number;
399-
400395
/** ReportID of the admins room for this workspace */
401396
chatReportIDAdmins?: number;
402397

@@ -439,7 +434,7 @@ type Policy = OnyxCommon.OnyxValueWithOfflineFeedback<
439434
/** Indicates if the Policy ownership change is failed */
440435
isChangeOwnerFailed?: boolean;
441436
} & Partial<PendingJoinRequestPolicy>,
442-
'generalSettings' | 'addWorkspaceRoom'
437+
'generalSettings' | 'addWorkspaceRoom' | keyof ACHAccount
443438
>;
444439

445440
export default Policy;

0 commit comments

Comments
 (0)