From 52c93d8146f7bf0959e8e238733a3b8517c40545 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20Muzyk?= <mimuzyk@gmail.com>
Date: Fri, 25 Jul 2025 16:04:59 +0200
Subject: [PATCH 01/18] feat: Enable Globalreimbursements for USD accounts

---
 src/CONST/index.ts                            |   7 +
 src/ONYXKEYS.ts                               |   3 +
 src/ROUTES.ts                                 |   4 +
 src/SCREENS.ts                                |   1 +
 .../SubStepForms/AgreementsFullStep/index.tsx | 109 +++++++++++++
 .../subSteps/Confirmation.tsx                 | 143 ++++++++++++++++++
 .../DocusignFullStep/Docusign.tsx             | 104 +++++++++++++
 .../subSteps/UploadPowerform.tsx              | 122 +++++++++++++++
 src/languages/en.ts                           |   1 +
 ...alReimbursementsForUSDBankAccountParams.ts |   9 ++
 src/libs/API/parameters/index.ts              |   1 +
 src/libs/API/types.ts                         |   5 +-
 .../ModalStackNavigators/index.tsx            |   1 +
 .../RELATIONS/SETTINGS_TO_RHP.ts              |   1 +
 src/libs/Navigation/linkingConfig/config.ts   |   4 +
 src/libs/Navigation/types.ts                  |   3 +
 src/libs/actions/BankAccounts.ts              |  39 +++++
 .../Agreements/index.tsx                      |  35 +++++
 .../Docusign/index.tsx                        |  53 +++++++
 .../EnableGlobalReimbursements/index.tsx      |  54 +++++++
 .../settings/Wallet/WalletPage/WalletPage.tsx |  20 +++
 .../form/EnableGlobalReimbursementsForm.ts    |  28 ++++
 src/types/form/index.ts                       |   1 +
 src/types/onyx/BankAccount.ts                 |   3 +
 24 files changed, 750 insertions(+), 1 deletion(-)
 create mode 100644 src/components/SubStepForms/AgreementsFullStep/index.tsx
 create mode 100644 src/components/SubStepForms/AgreementsFullStep/subSteps/Confirmation.tsx
 create mode 100644 src/components/SubStepForms/DocusignFullStep/Docusign.tsx
 create mode 100644 src/components/SubStepForms/DocusignFullStep/subSteps/UploadPowerform.tsx
 create mode 100644 src/libs/API/parameters/EnableGlobalReimbursementsForUSDBankAccountParams.ts
 create mode 100644 src/pages/settings/Wallet/EnableGlobalReimbursements/Agreements/index.tsx
 create mode 100644 src/pages/settings/Wallet/EnableGlobalReimbursements/Docusign/index.tsx
 create mode 100644 src/pages/settings/Wallet/EnableGlobalReimbursements/index.tsx
 create mode 100644 src/types/form/EnableGlobalReimbursementsForm.ts

diff --git a/src/CONST/index.ts b/src/CONST/index.ts
index 4edcd477c26b..c887a8a858da 100755
--- a/src/CONST/index.ts
+++ b/src/CONST/index.ts
@@ -628,6 +628,13 @@ const CONST = {
         },
         BANK_INFO_STEP_ACCOUNT_HOLDER_KEY_PREFIX: 'accountHolder',
     },
+    ENABLE_GLOBAL_REIMBURSEMENTS: {
+        STEP_NAMES: ['1', '2'],
+        STEP: {
+            AGREEMENTS: 'AgreementsStep',
+            DOCUSIGN: 'DocusignStep',
+        },
+    },
     INCORPORATION_TYPES: {
         LLC: 'LLC',
         CORPORATION: 'Corp',
diff --git a/src/ONYXKEYS.ts b/src/ONYXKEYS.ts
index d550a3bf6993..ee0cc4bbaada 100755
--- a/src/ONYXKEYS.ts
+++ b/src/ONYXKEYS.ts
@@ -847,6 +847,8 @@ const ONYXKEYS = {
         MERGE_ACCOUNT_DETAILS_FORM_DRAFT: 'mergeAccountDetailsFormDraft',
         WORKSPACE_PER_DIEM_FORM: 'workspacePerDiemForm',
         WORKSPACE_PER_DIEM_FORM_DRAFT: 'workspacePerDiemFormDraft',
+        ENABLE_GLOBAL_REIMBURSEMENTS: 'enableGlobalReimbursementsForm',
+        ENABLE_GLOBAL_REIMBURSEMENTS_DRAFT: 'enableGlobalReimbursementsFormDraft',
     },
     DERIVED: {
         REPORT_ATTRIBUTES: 'reportAttributes',
@@ -956,6 +958,7 @@ type OnyxFormValuesMapping = {
     [ONYXKEYS.FORMS.MERGE_ACCOUNT_DETAILS_FORM]: FormTypes.MergeAccountDetailsForm;
     [ONYXKEYS.FORMS.INTERNATIONAL_BANK_ACCOUNT_FORM]: FormTypes.InternationalBankAccountForm;
     [ONYXKEYS.FORMS.WORKSPACE_PER_DIEM_FORM]: FormTypes.WorkspacePerDiemForm;
+    [ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS]: FormTypes.EnableGlobalReimbursementsForm;
 };
 
 type OnyxFormDraftValuesMapping = {
diff --git a/src/ROUTES.ts b/src/ROUTES.ts
index 6da5dadba9cc..f8549fc28d10 100644
--- a/src/ROUTES.ts
+++ b/src/ROUTES.ts
@@ -272,6 +272,10 @@ const ROUTES = {
     },
     SETTINGS_ADD_US_BANK_ACCOUNT: 'settings/wallet/add-us-bank-account',
     SETTINGS_ENABLE_PAYMENTS: 'settings/wallet/enable-payments',
+    SETTINGS_WALLET_ENABLE_GLOBAL_REIMBURSEMENTS: {
+        route: 'settings/wallet/:policyID/enable-global-reimbursements',
+        getRoute: (policyID: string | undefined) => `settings/wallet/${policyID}/enable-global-reimbursements` as const,
+    },
     SETTINGS_WALLET_CARD_DIGITAL_DETAILS_UPDATE_ADDRESS: {
         route: 'settings/wallet/card/:domain/digital-details/update-address',
         getRoute: (domain: string) => `settings/wallet/card/${domain}/digital-details/update-address` as const,
diff --git a/src/SCREENS.ts b/src/SCREENS.ts
index b14fdfdf1615..98388fcbbb35 100644
--- a/src/SCREENS.ts
+++ b/src/SCREENS.ts
@@ -132,6 +132,7 @@ const SCREENS = {
             REPORT_VIRTUAL_CARD_FRAUD: 'Settings_Wallet_ReportVirtualCardFraud',
             REPORT_VIRTUAL_CARD_FRAUD_CONFIRMATION: 'Settings_Wallet_ReportVirtualCardFraudConfirmation',
             CARDS_DIGITAL_DETAILS_UPDATE_ADDRESS: 'Settings_Wallet_Cards_Digital_Details_Update_Address',
+            ENABLE_GLOBAL_REIMBURSEMENTS: 'Settings_Wallet_Enable_Global_Reimbursements',
         },
 
         EXIT_SURVEY: {
diff --git a/src/components/SubStepForms/AgreementsFullStep/index.tsx b/src/components/SubStepForms/AgreementsFullStep/index.tsx
new file mode 100644
index 000000000000..c8e72017d155
--- /dev/null
+++ b/src/components/SubStepForms/AgreementsFullStep/index.tsx
@@ -0,0 +1,109 @@
+import type {ComponentType} from 'react';
+import React from 'react';
+import type {FormOnyxKeys} from '@components/Form/types';
+import InteractiveStepWrapper from '@components/InteractiveStepWrapper';
+import useLocalize from '@hooks/useLocalize';
+import useSubStep from '@hooks/useSubStep';
+import type {SubStepProps} from '@hooks/useSubStep/types';
+import {clearErrors} from '@userActions/FormActions';
+import type {OnyxFormValuesMapping} from '@src/ONYXKEYS';
+import Confirmation from './subSteps/Confirmation';
+
+type AgreementsFullStepProps<TFormID extends keyof OnyxFormValuesMapping> = {
+    /** The ID of the form */
+    formID: TFormID;
+
+    /** Input IDs for field in the form */
+    inputIDs: {
+        provideTruthfulInformation: FormOnyxKeys<TFormID>;
+        agreeToTermsAndConditions: FormOnyxKeys<TFormID>;
+        consentToPrivacyNotice: FormOnyxKeys<TFormID>;
+        authorizedToBindClientToAgreement: FormOnyxKeys<TFormID>;
+    };
+
+    /** Handles back button press */
+    onBackButtonPress: () => void;
+
+    /** Handles submit button press */
+    onSubmit: () => void;
+
+    /** Array of step names */
+    stepNames?: readonly string[];
+
+    /** Index of currently active step in header */
+    startStepIndex: number;
+
+    /** Currency of the policy */
+    policyCurrency: string | undefined;
+};
+
+type AgreementsFullStepSubStepProps<TFormID extends keyof OnyxFormValuesMapping> = SubStepProps & {
+    policyCurrency: string | undefined;
+
+    /** The ID of the form */
+    formID: TFormID;
+
+    /** Input IDs for field in the form */
+    inputIDs: AgreementsFullStepProps<TFormID>['inputIDs'];
+};
+
+function AgreementsFullStep<TFormID extends keyof OnyxFormValuesMapping>({
+    formID,
+    inputIDs,
+    onBackButtonPress,
+    onSubmit,
+    stepNames,
+    startStepIndex,
+    policyCurrency,
+}: AgreementsFullStepProps<TFormID>) {
+    const {translate} = useLocalize();
+
+    const bodyContent: Array<ComponentType<AgreementsFullStepSubStepProps<TFormID>>> = [Confirmation];
+
+    const {
+        componentToRender: SubStep,
+        isEditing,
+        screenIndex,
+        nextScreen,
+        prevScreen,
+        moveTo,
+        goToTheLastStep,
+    } = useSubStep<AgreementsFullStepSubStepProps<TFormID>>({bodyContent, startFrom: 0, onFinished: onSubmit});
+
+    const handleBackButtonPress = () => {
+        clearErrors(formID);
+        if (isEditing) {
+            goToTheLastStep();
+            return;
+        }
+
+        if (screenIndex === 0) {
+            onBackButtonPress();
+        } else {
+            prevScreen();
+        }
+    };
+
+    return (
+        <InteractiveStepWrapper
+            wrapperID={AgreementsFullStep.displayName}
+            handleBackButtonPress={handleBackButtonPress}
+            headerTitle={translate('agreementsStep.agreements')}
+            stepNames={stepNames}
+            startStepIndex={startStepIndex}
+        >
+            <SubStep
+                formID={formID}
+                inputIDs={inputIDs}
+                isEditing={isEditing}
+                onNext={nextScreen}
+                onMove={moveTo}
+                policyCurrency={policyCurrency}
+            />
+        </InteractiveStepWrapper>
+    );
+}
+
+AgreementsFullStep.displayName = 'AgreementsFullStep';
+
+export default AgreementsFullStep;
diff --git a/src/components/SubStepForms/AgreementsFullStep/subSteps/Confirmation.tsx b/src/components/SubStepForms/AgreementsFullStep/subSteps/Confirmation.tsx
new file mode 100644
index 000000000000..2cb0c9ffca9e
--- /dev/null
+++ b/src/components/SubStepForms/AgreementsFullStep/subSteps/Confirmation.tsx
@@ -0,0 +1,143 @@
+import React, {useCallback, useMemo} from 'react';
+import CheckboxWithLabel from '@components/CheckboxWithLabel';
+import FormProvider from '@components/Form/FormProvider';
+import InputWrapper from '@components/Form/InputWrapper';
+import type {FormInputErrors, FormOnyxKeys, FormOnyxValues} from '@components/Form/types';
+import Text from '@components/Text';
+import TextLink from '@components/TextLink';
+import useLocalize from '@hooks/useLocalize';
+import type {SubStepProps} from '@hooks/useSubStep/types';
+import useThemeStyles from '@hooks/useThemeStyles';
+import {getFieldRequiredErrors, isRequiredFulfilled} from '@libs/ValidationUtils';
+import requiresDocusignStep from '@pages/ReimbursementAccount/NonUSD/utils/requiresDocusignStep';
+import type {OnyxFormValuesMapping} from '@src/ONYXKEYS';
+
+function IsAuthorizedToUseBankAccountLabel() {
+    const {translate} = useLocalize();
+    return <Text>{translate('agreementsStep.iAmAuthorized')}</Text>;
+}
+
+function CertifyTrueAndAccurateLabel() {
+    const {translate} = useLocalize();
+    return <Text>{translate('agreementsStep.iCertify')}</Text>;
+}
+
+function TermsAndConditionsLabel() {
+    const {translate} = useLocalize();
+    return (
+        <Text>
+            {translate('common.iAcceptThe')}
+            <TextLink href="https://cross-border.corpay.com/tc/">{`${translate('agreementsStep.termsAndConditions')}`}</TextLink>.
+        </Text>
+    );
+}
+
+function ConsentToPrivacyNoticeLabel() {
+    const {translate} = useLocalize();
+    return (
+        <Text>
+            {translate('agreementsStep.iConsentToThe')} <TextLink href="https://payments.corpay.com/compliance">{`${translate('agreementsStep.privacyNotice')}`}</TextLink>.
+        </Text>
+    );
+}
+
+type ConfirmationProps<TFormID extends keyof OnyxFormValuesMapping> = SubStepProps & {
+    policyCurrency: string | undefined;
+
+    /** The ID of the form */
+    formID: TFormID;
+
+    /** Input IDs for field in the form */
+    inputIDs: {
+        provideTruthfulInformation: FormOnyxKeys<TFormID>;
+        agreeToTermsAndConditions: FormOnyxKeys<TFormID>;
+        consentToPrivacyNotice: FormOnyxKeys<TFormID>;
+        authorizedToBindClientToAgreement: FormOnyxKeys<TFormID>;
+    };
+};
+
+function Confirmation<TFormID extends keyof OnyxFormValuesMapping>({onNext, policyCurrency, formID, inputIDs}: ConfirmationProps<TFormID>) {
+    const {translate} = useLocalize();
+    const styles = useThemeStyles();
+
+    const isDocusignStepRequired = requiresDocusignStep(policyCurrency);
+
+    const stepFields = useMemo(
+        () => [inputIDs.authorizedToBindClientToAgreement, inputIDs.provideTruthfulInformation, inputIDs.agreeToTermsAndConditions, inputIDs.consentToPrivacyNotice],
+        [inputIDs],
+    );
+
+    const validate = useCallback(
+        (values: FormOnyxValues<TFormID>): FormInputErrors<TFormID> => {
+            const errors = getFieldRequiredErrors(values, stepFields);
+
+            if (!isRequiredFulfilled(values[inputIDs.authorizedToBindClientToAgreement] as string)) {
+                errors[inputIDs.authorizedToBindClientToAgreement] = translate('agreementsStep.error.authorized');
+            }
+
+            if (!isRequiredFulfilled(values[inputIDs.provideTruthfulInformation] as string)) {
+                errors[inputIDs.provideTruthfulInformation] = translate('agreementsStep.error.certify');
+            }
+
+            if (!isRequiredFulfilled(values[inputIDs.agreeToTermsAndConditions] as string)) {
+                errors[inputIDs.agreeToTermsAndConditions] = translate('common.error.acceptTerms');
+            }
+
+            if (!isRequiredFulfilled(values[inputIDs.consentToPrivacyNotice] as string)) {
+                errors[inputIDs.consentToPrivacyNotice] = translate('agreementsStep.error.consent');
+            }
+
+            return errors;
+        },
+        [inputIDs.agreeToTermsAndConditions, inputIDs.authorizedToBindClientToAgreement, inputIDs.consentToPrivacyNotice, inputIDs.provideTruthfulInformation, stepFields, translate],
+    );
+
+    return (
+        <FormProvider
+            formID={formID}
+            onSubmit={onNext}
+            validate={validate}
+            submitButtonText={isDocusignStepRequired ? translate('common.confirm') : translate('agreementsStep.accept')}
+            style={[styles.mh5, styles.flexGrow1]}
+        >
+            <Text style={[styles.textHeadlineLineHeightXXL]}>{translate('agreementsStep.pleaseConfirm')}</Text>
+            {!isDocusignStepRequired && <Text style={[styles.pv3, styles.textSupporting]}>{translate('agreementsStep.regulationRequiresUs')}</Text>}
+            <InputWrapper
+                InputComponent={CheckboxWithLabel}
+                accessibilityLabel={translate('agreementsStep.iAmAuthorized')}
+                inputID={inputIDs.authorizedToBindClientToAgreement as string}
+                style={styles.mt6}
+                LabelComponent={IsAuthorizedToUseBankAccountLabel}
+                shouldSaveDraft
+            />
+            <InputWrapper
+                InputComponent={CheckboxWithLabel}
+                accessibilityLabel={translate('agreementsStep.iCertify')}
+                inputID={inputIDs.provideTruthfulInformation as string}
+                style={styles.mt6}
+                LabelComponent={CertifyTrueAndAccurateLabel}
+                shouldSaveDraft
+            />
+            <InputWrapper
+                InputComponent={CheckboxWithLabel}
+                accessibilityLabel={`${translate('common.iAcceptThe')} ${translate('agreementsStep.termsAndConditions')}.`}
+                inputID={inputIDs.agreeToTermsAndConditions as string}
+                style={styles.mt6}
+                LabelComponent={TermsAndConditionsLabel}
+                shouldSaveDraft
+            />
+            <InputWrapper
+                InputComponent={CheckboxWithLabel}
+                accessibilityLabel={`${translate('agreementsStep.iConsentToThe')} ${translate('agreementsStep.privacyNotice')}.`}
+                inputID={inputIDs.consentToPrivacyNotice as string}
+                style={styles.mt6}
+                LabelComponent={ConsentToPrivacyNoticeLabel}
+                shouldSaveDraft
+            />
+        </FormProvider>
+    );
+}
+
+Confirmation.displayName = 'Confirmation';
+
+export default Confirmation;
diff --git a/src/components/SubStepForms/DocusignFullStep/Docusign.tsx b/src/components/SubStepForms/DocusignFullStep/Docusign.tsx
new file mode 100644
index 000000000000..50b8d4996a87
--- /dev/null
+++ b/src/components/SubStepForms/DocusignFullStep/Docusign.tsx
@@ -0,0 +1,104 @@
+import type {ComponentType} from 'react';
+import React from 'react';
+import type {FormOnyxKeys} from '@components/Form/types';
+import InteractiveStepWrapper from '@components/InteractiveStepWrapper';
+import useLocalize from '@hooks/useLocalize';
+import useSubStep from '@hooks/useSubStep';
+import type {SubStepProps} from '@hooks/useSubStep/types';
+import {clearErrors} from '@userActions/FormActions';
+import type {OnyxFormValuesMapping} from '@src/ONYXKEYS';
+import UploadPowerform from './subSteps/UploadPowerform';
+
+type DocusignFullStepProps<TFormID extends keyof OnyxFormValuesMapping> = {
+    /** The ID of the form */
+    formID: TFormID;
+
+    /** ID of the input in the form */
+    inputID: FormOnyxKeys<TFormID>;
+
+    /** Handles back button press */
+    onBackButtonPress: () => void;
+
+    /** Handles submit button press */
+    onSubmit: () => void;
+
+    /** Array of step names */
+    stepNames?: readonly string[];
+
+    /** Index of currently active step in header */
+    startStepIndex: number;
+
+    /** Currency of the policy */
+    policyCurrency: string | undefined;
+};
+
+type DocusignFullStepStepProps<TFormID extends keyof OnyxFormValuesMapping> = SubStepProps & {
+    policyCurrency: string | undefined;
+
+    /** The ID of the form */
+    formID: TFormID;
+
+    /** ID of the input in the form */
+    inputID: FormOnyxKeys<TFormID>;
+};
+
+function DocusignFullStep<TFormID extends keyof OnyxFormValuesMapping>({
+    onBackButtonPress,
+    onSubmit,
+    stepNames,
+    formID,
+    startStepIndex,
+    policyCurrency,
+    inputID,
+}: DocusignFullStepProps<TFormID>) {
+    const {translate} = useLocalize();
+
+    const bodyContent: Array<ComponentType<DocusignFullStepStepProps<TFormID>>> = [UploadPowerform];
+
+    const {
+        componentToRender: SubStep,
+        isEditing,
+        screenIndex,
+        nextScreen,
+        prevScreen,
+        moveTo,
+        goToTheLastStep,
+    } = useSubStep<DocusignFullStepStepProps<TFormID>>({bodyContent, startFrom: 0, onFinished: onSubmit});
+
+    const handleBackButtonPress = () => {
+        clearErrors(formID);
+        if (isEditing) {
+            goToTheLastStep();
+            return;
+        }
+
+        if (screenIndex === 0) {
+            onBackButtonPress();
+        } else {
+            prevScreen();
+        }
+    };
+
+    return (
+        <InteractiveStepWrapper
+            wrapperID={DocusignFullStep.displayName}
+            handleBackButtonPress={handleBackButtonPress}
+            headerTitle={translate('docusignStep.subheader')}
+            stepNames={stepNames}
+            startStepIndex={startStepIndex}
+        >
+            <SubStep
+                formID={formID}
+                inputID={inputID}
+                isEditing={isEditing}
+                onNext={nextScreen}
+                onMove={moveTo}
+                policyCurrency={policyCurrency}
+            />
+        </InteractiveStepWrapper>
+    );
+}
+
+DocusignFullStep.displayName = 'DocusignFullStep';
+
+export default DocusignFullStep;
diff --git a/src/components/SubStepForms/DocusignFullStep/subSteps/UploadPowerform.tsx b/src/components/SubStepForms/DocusignFullStep/subSteps/UploadPowerform.tsx
new file mode 100644
index 000000000000..375dad73e46c
--- /dev/null
+++ b/src/components/SubStepForms/DocusignFullStep/subSteps/UploadPowerform.tsx
@@ -0,0 +1,122 @@
+import React, {useCallback, useState} from 'react';
+import Button from '@components/Button';
+import FormProvider from '@components/Form/FormProvider';
+import InputWrapper from '@components/Form/InputWrapper';
+import type {FormInputErrors, FormOnyxKeys, FormOnyxValues} from '@components/Form/types';
+import Text from '@components/Text';
+import UploadFile from '@components/UploadFile';
+import useEnvironment from '@hooks/useEnvironment';
+import useLocalize from '@hooks/useLocalize';
+import useOnyx from '@hooks/useOnyx';
+import useReimbursementAccountStepFormSubmit from '@hooks/useReimbursementAccountStepFormSubmit';
+import type {SubStepProps} from '@hooks/useSubStep/types';
+import useThemeStyles from '@hooks/useThemeStyles';
+import {getFieldRequiredErrors} from '@libs/ValidationUtils';
+import type {FileObject} from '@pages/media/AttachmentModalScreen/types';
+import {clearErrorFields, setDraftValues, setErrorFields} from '@userActions/FormActions';
+import {openLink} from '@userActions/Link';
+import CONST from '@src/CONST';
+import ONYXKEYS from '@src/ONYXKEYS';
+import type {OnyxFormValuesMapping} from '@src/ONYXKEYS';
+
+type UploadPowerformProps<TFormID extends keyof OnyxFormValuesMapping> = SubStepProps & {
+    policyCurrency: string | undefined;
+
+    /** The ID of the form */
+    formID: TFormID;
+
+    /** ID of the input in the form */
+    inputID: FormOnyxKeys<TFormID>;
+};
+function UploadPowerform<TFormID extends keyof OnyxFormValuesMapping>({onNext, isEditing, policyCurrency, formID, inputID}: UploadPowerformProps<TFormID>) {
+    const {translate} = useLocalize();
+    const styles = useThemeStyles();
+    const {environmentURL} = useEnvironment();
+
+    const [uploadedFiles, setUploadedFiles] = useState<FileObject[]>(defaultValue);
+
+    const validate = useCallback((values: FormOnyxValues<typeof ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM>): FormInputErrors<typeof ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM> => {
+        return getFieldRequiredErrors(values, STEP_FIELDS);
+    }, []);
+
+    const handleSubmit = useReimbursementAccountStepFormSubmit({
+        fieldIds: STEP_FIELDS,
+        onNext,
+        shouldSaveDraft: isEditing,
+    });
+
+    const handleSelectFile = (files: FileObject[]) => {
+        setDraftValues(ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM, {[ACH_AUTHORIZATION_FORM]: [...uploadedFiles, ...files]});
+        setUploadedFiles((prev) => [...prev, ...files]);
+    };
+
+    const handleRemoveFile = (fileName: string) => {
+        const newUploadedFiles = uploadedFiles.filter((file) => file.name !== fileName);
+        setDraftValues(ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM, {[ACH_AUTHORIZATION_FORM]: newUploadedFiles});
+        setUploadedFiles(newUploadedFiles);
+    };
+
+    const setUploadError = (error: string) => {
+        if (!error) {
+            clearErrorFields(ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM);
+            return;
+        }
+
+        setErrorFields(ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM, {[ACH_AUTHORIZATION_FORM]: {onUpload: error}});
+    };
+
+    return (
+        <FormProvider
+            formID={ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM}
+            submitButtonText={translate('common.submit')}
+            onSubmit={handleSubmit}
+            validate={validate}
+            style={[styles.mh5, styles.flexGrow1]}
+            submitButtonStyles={[styles.mb0]}
+            enabledWhenOffline={false}
+            isLoading={reimbursementAccount?.isFinishingCorpayBankAccountOnboarding}
+        >
+            {countryStepCountryValue === CONST.COUNTRY.CA && <Text style={[styles.textHeadlineLineHeightXXL, styles.mb10]}>{translate('docusignStep.pleaseComplete')}</Text>}
+            {countryStepCountryValue === CONST.COUNTRY.AU && (
+                <>
+                    <Text style={[styles.textHeadlineLineHeightXXL, styles.mb3]}>{translate('docusignStep.pleaseCompleteTheBusinessAccount')}</Text>
+                    <Text style={[styles.textSupporting, styles.mb10]}>{translate('docusignStep.pleaseCompleteTheDirect')}</Text>
+                </>
+            )}
+            <Button
+                success
+                large
+                style={[styles.w100, styles.mb15]}
+                onPress={() => {
+                    openLink(CONST.DOCUSIGN_POWERFORM_LINK[countryStepCountryValue as 'CA' | 'AU'], environmentURL);
+                }}
+                text={translate('docusignStep.takeMeTo')}
+            />
+            {countryStepCountryValue === CONST.COUNTRY.CA && <Text style={[styles.textHeadlineLineHeightXXL, styles.mb5]}>{translate('docusignStep.uploadAdditional')}</Text>}
+            {countryStepCountryValue === CONST.COUNTRY.AU && <Text style={[styles.textHeadlineLineHeightXXL, styles.mb5]}>{translate('docusignStep.pleaseUploadTheDirect')}</Text>}
+            <Text style={[styles.textHeadlineH2, styles.colorMuted, styles.mb10]}>{translate('docusignStep.pleaseUpload')}</Text>
+            <InputWrapper
+                InputComponent={UploadFile}
+                buttonText={translate('common.chooseFile')}
+                uploadedFiles={uploadedFiles}
+                onUpload={(files) => {
+                    handleSelectFile(files);
+                }}
+                onRemove={(fileName) => {
+                    handleRemoveFile(fileName);
+                }}
+                acceptedFileTypes={[...CONST.NON_USD_BANK_ACCOUNT.ALLOWED_FILE_TYPES]}
+                value={uploadedFiles}
+                inputID={ACH_AUTHORIZATION_FORM}
+                setError={(error) => {
+                    setUploadError(error);
+                }}
+                fileLimit={1}
+            />
+        </FormProvider>
+    );
+}
+
+UploadPowerform.displayName = 'UploadPowerform';
+
+export default UploadPowerform;
diff --git a/src/languages/en.ts b/src/languages/en.ts
index 583c5b9c0187..7f3aafefbb57 100755
--- a/src/languages/en.ts
+++ b/src/languages/en.ts
@@ -616,6 +616,7 @@ const translations = {
         getTheApp: 'Get the app',
         scanReceiptsOnTheGo: 'Scan receipts from your phone',
         headsUp: 'Heads up!',
+        enableGlobalReimbursements: 'Enable Global Reimbursements',
     },
     supportalNoAccess: {
         title: 'Not so fast',
diff --git a/src/libs/API/parameters/EnableGlobalReimbursementsForUSDBankAccountParams.ts b/src/libs/API/parameters/EnableGlobalReimbursementsForUSDBankAccountParams.ts
new file mode 100644
index 000000000000..2022cc094128
--- /dev/null
+++ b/src/libs/API/parameters/EnableGlobalReimbursementsForUSDBankAccountParams.ts
@@ -0,0 +1,9 @@
+import type {FileObject} from '@pages/media/AttachmentModalScreen/types';
+
+type EnableGlobalReimbursementsForUSDBankAccountParams = {
+    inputs: string;
+    achAuthorizationForm?: FileObject;
+    bankAccountID: number;
+};
+
+export default EnableGlobalReimbursementsForUSDBankAccountParams;
diff --git a/src/libs/API/parameters/index.ts b/src/libs/API/parameters/index.ts
index 1627158a2f6b..548da4396f36 100644
--- a/src/libs/API/parameters/index.ts
+++ b/src/libs/API/parameters/index.ts
@@ -408,3 +408,4 @@ export type {default as ExportMultiLevelTagsSpreadSheetParams} from './ExportMul
 export type {default as ReopenReportParams} from './ReopenReportParams';
 export type {default as OpenUnreportedExpensesPageParams} from './OpenUnreportedExpensesPageParams';
 export type {default as VerifyTestDriveRecipientParams} from './VerifyTestDriveRecipientParams';
+export type {default as EnableGlobalReimbursementsForUSDBankAccountParams} from './EnableGlobalReimbursementsForUSDBankAccountParams';
diff --git a/src/libs/API/types.ts b/src/libs/API/types.ts
index 480e753087fc..4810b5db755e 100644
--- a/src/libs/API/types.ts
+++ b/src/libs/API/types.ts
@@ -2,9 +2,10 @@ import type {ValueOf} from 'type-fest';
 import type CONST from '@src/CONST';
 import type {SageIntacctMappingValue} from '@src/types/onyx/Policy';
 import type {EmptyObject} from '@src/types/utils/EmptyObject';
+import type * as Parameters from './parameters';
 // We have to disable eslint for this import because otherwise the import will be 300 lines long
 // eslint-disable-next-line no-restricted-syntax
-import type * as Parameters from './parameters';
+import EnableGlobalReimbursementsForUSDBankAccountParams from './parameters/EnableGlobalReimbursementsForUSDBankAccountParams';
 import type SignInUserParams from './parameters/SignInUserParams';
 import type UpdateBeneficialOwnersForBankAccountParams from './parameters/UpdateBeneficialOwnersForBankAccountParams';
 
@@ -486,6 +487,7 @@ const WRITE_COMMANDS = {
     PAY_AND_DOWNGRADE: 'PayAndDowngrade',
     COMPLETE_CONCIERGE_CALL: 'CompleteConciergeCall',
     FINISH_CORPAY_BANK_ACCOUNT_ONBOARDING: 'FinishCorpayBankAccountOnboarding',
+    ENABLE_GLOBAL_REIMBURSEMENTS_FOR_USD_BANK_ACCOUNT: 'EnableGlobalReimbursementsForUSDBankAccount',
     REOPEN_REPORT: 'ReopenReport',
     TRAVEL_SIGNUP_REQUEST: 'RequestTravelAccess',
     IMPORT_PLAID_ACCOUNTS: 'ImportPlaidAccounts',
@@ -841,6 +843,7 @@ type WriteCommandParameters = {
     [WRITE_COMMANDS.RETRACT_REPORT]: Parameters.RetractReportParams;
     [WRITE_COMMANDS.COMPLETE_CONCIERGE_CALL]: Parameters.CompleteConciergeCallParams;
     [WRITE_COMMANDS.FINISH_CORPAY_BANK_ACCOUNT_ONBOARDING]: Parameters.FinishCorpayBankAccountOnboardingParams;
+    [WRITE_COMMANDS.ENABLE_GLOBAL_REIMBURSEMENTS_FOR_USD_BANK_ACCOUNT]: Parameters.EnableGlobalReimbursementsForUSDBankAccountParams;
     [WRITE_COMMANDS.REOPEN_REPORT]: Parameters.ReopenReportParams;
 
     [WRITE_COMMANDS.DELETE_MONEY_REQUEST_ON_SEARCH]: Parameters.DeleteMoneyRequestOnSearchParams;
diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx
index 52d18d0f1b36..6c5ea0596380 100644
--- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx
+++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx
@@ -294,6 +294,7 @@ const SettingsModalStackNavigator = createModalStackNavigator<SettingsNavigatorP
     [SCREENS.SETTINGS.WALLET.TRANSFER_BALANCE]: () => require<ReactComponentModule>('../../../../pages/settings/Wallet/TransferBalancePage').default,
     [SCREENS.SETTINGS.WALLET.CHOOSE_TRANSFER_ACCOUNT]: () => require<ReactComponentModule>('../../../../pages/settings/Wallet/ChooseTransferAccountPage').default,
     [SCREENS.SETTINGS.WALLET.ENABLE_PAYMENTS]: () => require<ReactComponentModule>('../../../../pages/EnablePayments/EnablePayments').default,
+    [SCREENS.SETTINGS.WALLET.ENABLE_GLOBAL_REIMBURSEMENTS]: () => require<ReactComponentModule>('../../../../pages/settings/Wallet/EnableGlobalReimbursements').default,
     [SCREENS.SETTINGS.ADD_DEBIT_CARD]: () => require<ReactComponentModule>('../../../../pages/settings/Wallet/AddDebitCardPage').default,
     [SCREENS.SETTINGS.ADD_BANK_ACCOUNT]: () => require<ReactComponentModule>('../../../../pages/settings/Wallet/InternationalDepositAccount').default,
     [SCREENS.SETTINGS.ADD_US_BANK_ACCOUNT]: () => require<ReactComponentModule>('../../../../pages/AddPersonalBankAccountPage').default,
diff --git a/src/libs/Navigation/linkingConfig/RELATIONS/SETTINGS_TO_RHP.ts b/src/libs/Navigation/linkingConfig/RELATIONS/SETTINGS_TO_RHP.ts
index 8cbc615646a8..23a1adf097cd 100755
--- a/src/libs/Navigation/linkingConfig/RELATIONS/SETTINGS_TO_RHP.ts
+++ b/src/libs/Navigation/linkingConfig/RELATIONS/SETTINGS_TO_RHP.ts
@@ -36,6 +36,7 @@ const SETTINGS_TO_RHP: Partial<Record<keyof SettingsSplitNavigatorParamList, str
         SCREENS.SETTINGS.WALLET.TRANSFER_BALANCE,
         SCREENS.SETTINGS.WALLET.CHOOSE_TRANSFER_ACCOUNT,
         SCREENS.SETTINGS.WALLET.ENABLE_PAYMENTS,
+        SCREENS.SETTINGS.WALLET.ENABLE_GLOBAL_REIMBURSEMENTS,
         SCREENS.SETTINGS.WALLET.CARD_ACTIVATE,
         SCREENS.SETTINGS.WALLET.REPORT_VIRTUAL_CARD_FRAUD,
         SCREENS.SETTINGS.WALLET.REPORT_VIRTUAL_CARD_FRAUD_CONFIRMATION,
diff --git a/src/libs/Navigation/linkingConfig/config.ts b/src/libs/Navigation/linkingConfig/config.ts
index 785808c6cc05..41cdd620225f 100644
--- a/src/libs/Navigation/linkingConfig/config.ts
+++ b/src/libs/Navigation/linkingConfig/config.ts
@@ -245,6 +245,10 @@ const config: LinkingOptions<RootNavigatorParamList>['config'] = {
                             path: ROUTES.SETTINGS_ENABLE_PAYMENTS,
                             exact: true,
                         },
+                        [SCREENS.SETTINGS.WALLET.ENABLE_GLOBAL_REIMBURSEMENTS]: {
+                            path: ROUTES.SETTINGS_WALLET_ENABLE_GLOBAL_REIMBURSEMENTS.route,
+                            exact: true,
+                        },
                         [SCREENS.SETTINGS.WALLET.TRANSFER_BALANCE]: {
                             path: ROUTES.SETTINGS_WALLET_TRANSFER_BALANCE,
                             exact: true,
diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts
index a7ddb1cc1ed9..3cb32ede4412 100644
--- a/src/libs/Navigation/types.ts
+++ b/src/libs/Navigation/types.ts
@@ -162,6 +162,9 @@ type SettingsNavigatorParamList = {
     [SCREENS.SETTINGS.WALLET.TRANSFER_BALANCE]: undefined;
     [SCREENS.SETTINGS.WALLET.CHOOSE_TRANSFER_ACCOUNT]: undefined;
     [SCREENS.SETTINGS.WALLET.ENABLE_PAYMENTS]: undefined;
+    [SCREENS.SETTINGS.WALLET.ENABLE_GLOBAL_REIMBURSEMENTS]: {
+        policyID: string;
+    };
     [SCREENS.SETTINGS.ADD_DEBIT_CARD]: undefined;
     [SCREENS.SETTINGS.ADD_BANK_ACCOUNT]: undefined;
     [SCREENS.SETTINGS.ADD_US_BANK_ACCOUNT]: undefined;
diff --git a/src/libs/actions/BankAccounts.ts b/src/libs/actions/BankAccounts.ts
index d0065afc5f5a..30757b0265ab 100644
--- a/src/libs/actions/BankAccounts.ts
+++ b/src/libs/actions/BankAccounts.ts
@@ -8,6 +8,7 @@ import type {
     BankAccountHandlePlaidErrorParams,
     ConnectBankAccountParams,
     DeletePaymentBankAccountParams,
+    EnableGlobalReimbursementsForUSDBankAccountParams,
     FinishCorpayBankAccountOnboardingParams,
     OpenReimbursementAccountPageParams,
     SaveCorpayOnboardingBeneficialOwnerParams,
@@ -649,6 +650,44 @@ function finishCorpayBankAccountOnboarding(parameters: FinishCorpayBankAccountOn
     return API.write(WRITE_COMMANDS.FINISH_CORPAY_BANK_ACCOUNT_ONBOARDING, parameters, onyxData);
 }
 
+function enableGlobalReimbursementsForUSDBankAccount(parameters: EnableGlobalReimbursementsForUSDBankAccountParams) {
+    const onyxData: OnyxData = {
+        optimisticData: [
+            {
+                onyxMethod: Onyx.METHOD.MERGE,
+                key: ONYXKEYS.REIMBURSEMENT_ACCOUNT,
+                value: {
+                    isFinishingCorpayBankAccountOnboarding: true,
+                    errors: null,
+                },
+            },
+        ],
+        successData: [
+            {
+                onyxMethod: Onyx.METHOD.MERGE,
+                key: ONYXKEYS.REIMBURSEMENT_ACCOUNT,
+                value: {
+                    isFinishingCorpayBankAccountOnboarding: false,
+                    isSuccess: true,
+                },
+            },
+        ],
+        failureData: [
+            {
+                onyxMethod: Onyx.METHOD.MERGE,
+                key: ONYXKEYS.REIMBURSEMENT_ACCOUNT,
+                value: {
+                    isFinishingCorpayBankAccountOnboarding: false,
+                    isSuccess: false,
+                    errors: getMicroSecondOnyxErrorWithTranslationKey('common.genericErrorMessage'),
+                },
+            },
+        ],
+    };
+
+    return API.write(WRITE_COMMANDS.ENABLE_GLOBAL_REIMBURSEMENTS_FOR_USD_BANK_ACCOUNT, parameters, onyxData);
+}
+
 function clearCorpayBankAccountFields() {
     Onyx.set(ONYXKEYS.CORPAY_FIELDS, null);
 }
diff --git a/src/pages/settings/Wallet/EnableGlobalReimbursements/Agreements/index.tsx b/src/pages/settings/Wallet/EnableGlobalReimbursements/Agreements/index.tsx
new file mode 100644
index 000000000000..f835c9594be8
--- /dev/null
+++ b/src/pages/settings/Wallet/EnableGlobalReimbursements/Agreements/index.tsx
@@ -0,0 +1,35 @@
+import React from 'react';
+import AgreementsFullStep from '@components/SubStepForms/AgreementsFullStep';
+import CONST from '@src/CONST';
+import ONYXKEYS from '@src/ONYXKEYS';
+import INPUT_IDS from '@src/types/form/EnableGlobalReimbursementsForm';
+
+type AgreementsProps = {
+    onSubmit: () => void;
+    onBackButtonPress: () => void;
+};
+
+const inputIDs = {
+    provideTruthfulInformation: INPUT_IDS.PROVIDE_TRUTHFUL_INFORMATION,
+    agreeToTermsAndConditions: INPUT_IDS.AGREE_TO_TERMS_AND_CONDITIONS,
+    consentToPrivacyNotice: INPUT_IDS.CONSENT_TO_PRIVACY_NOTICE,
+    authorizedToBindClientToAgreement: INPUT_IDS.AUTHORIZED_TO_BIND_CLIENT_TO_AGREEMENT,
+};
+
+function Agreements({onSubmit, onBackButtonPress}: AgreementsProps) {
+    return (
+        <AgreementsFullStep
+            stepNames={CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP_NAMES}
+            formID={ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS}
+            onSubmit={onSubmit}
+            inputIDs={inputIDs}
+            onBackButtonPress={onBackButtonPress}
+            policyCurrency="USD"
+            startStepIndex={0}
+        />
+    );
+}
+
+Agreements.displayName = 'Agreements';
+
+export default Agreements;
diff --git a/src/pages/settings/Wallet/EnableGlobalReimbursements/Docusign/index.tsx b/src/pages/settings/Wallet/EnableGlobalReimbursements/Docusign/index.tsx
new file mode 100644
index 000000000000..6a064cdd7dfa
--- /dev/null
+++ b/src/pages/settings/Wallet/EnableGlobalReimbursements/Docusign/index.tsx
@@ -0,0 +1,53 @@
+import React, {useEffect, useMemo} from 'react';
+import DocusignFullStep from '@components/SubStepForms/DocusignFullStep/Docusign';
+import useOnyx from '@hooks/useOnyx';
+import getSubStepValues from '@pages/ReimbursementAccount/utils/getSubStepValues';
+import {clearReimbursementAccountFinishCorpayBankAccountOnboarding, finishCorpayBankAccountOnboarding} from '@userActions/BankAccounts';
+import CONST from '@src/CONST';
+import ONYXKEYS from '@src/ONYXKEYS';
+
+type DocusignProps = {
+    onSubmit: () => void;
+};
+
+function Docusign({onSubmit}: DocusignProps) {
+    const [reimbursementAccount] = useOnyx(ONYXKEYS.REIMBURSEMENT_ACCOUNT, {canBeMissing: false});
+    const [reimbursementAccountDraft] = useOnyx(ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM_DRAFT, {canBeMissing: false});
+    const finalStepValues = useMemo(() => getSubStepValues(INPUT_KEYS, reimbursementAccountDraft, reimbursementAccount), [reimbursementAccount, reimbursementAccountDraft]);
+    const bankAccountID = reimbursementAccount?.achData?.bankAccountID ?? CONST.DEFAULT_NUMBER_ID;
+
+    const submit = () => {
+        finishCorpayBankAccountOnboarding({
+            inputs: JSON.stringify({
+                provideTruthfulInformation: finalStepValues.provideTruthfulInformation,
+                agreeToTermsAndConditions: finalStepValues.agreeToTermsAndConditions,
+                consentToPrivacyNotice: finalStepValues.consentToPrivacyNotice,
+                authorizedToBindClientToAgreement: finalStepValues.authorizedToBindClientToAgreement,
+            }),
+            achAuthorizationForm: finalStepValues.achAuthorizationForm.at(0),
+            bankAccountID,
+        });
+    };
+
+    useEffect(() => {
+        // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
+        if (reimbursementAccount?.errors || reimbursementAccount?.isFinishingCorpayBankAccountOnboarding || !reimbursementAccount?.isSuccess) {
+            return;
+        }
+
+        if (reimbursementAccount?.isSuccess) {
+            onSubmit();
+            clearReimbursementAccountFinishCorpayBankAccountOnboarding();
+        }
+
+        return () => {
+            clearReimbursementAccountFinishCorpayBankAccountOnboarding();
+        };
+    }, [reimbursementAccount, onSubmit]);
+
+    return <DocusignFullStep />;
+}
+
+Docusign.displayName = 'Docusign';
+
+export default Docusign;
diff --git a/src/pages/settings/Wallet/EnableGlobalReimbursements/index.tsx b/src/pages/settings/Wallet/EnableGlobalReimbursements/index.tsx
new file mode 100644
index 000000000000..cc1c089ecb60
--- /dev/null
+++ b/src/pages/settings/Wallet/EnableGlobalReimbursements/index.tsx
@@ -0,0 +1,54 @@
+import React, {useState} from 'react';
+import type {ValueOf} from 'type-fest';
+import Navigation from '@navigation/Navigation';
+import {clearErrors} from '@userActions/FormActions';
+import CONST from '@src/CONST';
+import ONYXKEYS from '@src/ONYXKEYS';
+import Agreements from './Agreements';
+import Docusign from './Docusign';
+
+function EnableGlobalReimbursements() {
+    const [enableGlobalReimbursementsStep, setEnableGlobalReimbursementsStep] = useState<ValueOf<typeof CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP>>(
+        CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP.AGREEMENTS,
+    );
+
+    const handleNextEnableGlobalReimbursementsStep = () => {
+        if (enableGlobalReimbursementsStep === CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP.AGREEMENTS) {
+            setEnableGlobalReimbursementsStep(CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP.DOCUSIGN);
+        } else {
+            /* empty */
+        }
+    };
+
+    const handleEnableGlobalReimbursementGoBack = () => {
+        clearErrors(ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS);
+        switch (enableGlobalReimbursementsStep) {
+            case CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP.AGREEMENTS:
+                Navigation.goBack();
+                break;
+            case CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP.DOCUSIGN:
+                setEnableGlobalReimbursementsStep(CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP.AGREEMENTS);
+                break;
+            default:
+                return null;
+        }
+    };
+
+    switch (enableGlobalReimbursementsStep) {
+        case CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP.AGREEMENTS:
+            return (
+                <Agreements
+                    onSubmit={handleNextEnableGlobalReimbursementsStep}
+                    onBackButtonPress={handleEnableGlobalReimbursementGoBack}
+                />
+            );
+        case CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP.DOCUSIGN:
+            return <Docusign onSubmit={handleNextEnableGlobalReimbursementsStep} />;
+        default:
+            return null;
+    }
+}
+
+EnableGlobalReimbursements.displayName = 'EnableGlobalReimbursements';
+
+export default EnableGlobalReimbursements;
diff --git a/src/pages/settings/Wallet/WalletPage/WalletPage.tsx b/src/pages/settings/Wallet/WalletPage/WalletPage.tsx
index 5011f4601570..f3314e80d624 100644
--- a/src/pages/settings/Wallet/WalletPage/WalletPage.tsx
+++ b/src/pages/settings/Wallet/WalletPage/WalletPage.tsx
@@ -684,6 +684,26 @@ function WalletPage({shouldListenForResize = false}: WalletPageProps) {
                                 }}
                                 wrapperStyle={[styles.pv3, styles.ph5, !shouldUseNarrowLayout ? styles.sidebarPopover : {}]}
                             />
+                            <MenuItem
+                                title={translate('common.enableGlobalReimbursements')}
+                                icon={Expensicons.Globe}
+                                onPress={() => {
+                                    if (isActingAsDelegate) {
+                                        closeModal(() => {
+                                            showDelegateNoAccessModal();
+                                        });
+                                        return;
+                                    }
+                                    if (isAccountLocked) {
+                                        closeModal(() => showLockedAccountModal());
+                                        return;
+                                    }
+                                    closeModal(() =>
+                                        Navigation.navigate(ROUTES.SETTINGS_WALLET_ENABLE_GLOBAL_REIMBURSEMENTS.getRoute(paymentMethod.selectedPaymentMethod.additionalData?.policyID)),
+                                    );
+                                }}
+                                wrapperStyle={[styles.pv3, styles.ph5, !shouldUseNarrowLayout ? styles.sidebarPopover : {}]}
+                            />
                         </View>
                     )}
                 </Popover>
diff --git a/src/types/form/EnableGlobalReimbursementsForm.ts b/src/types/form/EnableGlobalReimbursementsForm.ts
new file mode 100644
index 000000000000..7d64377f9f58
--- /dev/null
+++ b/src/types/form/EnableGlobalReimbursementsForm.ts
@@ -0,0 +1,28 @@
+import type {ValueOf} from 'type-fest';
+import type {FileObject} from '@pages/media/AttachmentModalScreen/types';
+import type Form from './Form';
+
+const INPUT_IDS = {
+    PROVIDE_TRUTHFUL_INFORMATION: 'provideTruthfulInformation',
+    AGREE_TO_TERMS_AND_CONDITIONS: 'agreeToTermsAndConditions',
+    CONSENT_TO_PRIVACY_NOTICE: 'consentToPrivacyNotice',
+    AUTHORIZED_TO_BIND_CLIENT_TO_AGREEMENT: 'authorizedToBindClientToAgreement',
+    ACH_AUTHORIZATION_FORM: 'achAuthorizationForm',
+} as const;
+
+type InputID = ValueOf<typeof INPUT_IDS>;
+
+type EnableGlobalReimbursementsForm = Form<
+    InputID,
+    {
+        [INPUT_IDS.PROVIDE_TRUTHFUL_INFORMATION]: boolean;
+        [INPUT_IDS.AGREE_TO_TERMS_AND_CONDITIONS]: boolean;
+        [INPUT_IDS.CONSENT_TO_PRIVACY_NOTICE]: boolean;
+        [INPUT_IDS.AUTHORIZED_TO_BIND_CLIENT_TO_AGREEMENT]: boolean;
+        [INPUT_IDS.ACH_AUTHORIZATION_FORM]: FileObject[];
+
+    }
+>;
+
+export type {EnableGlobalReimbursementsForm};
+export default INPUT_IDS;
diff --git a/src/types/form/index.ts b/src/types/form/index.ts
index ff6cc4883537..6170c3ca2c6b 100644
--- a/src/types/form/index.ts
+++ b/src/types/form/index.ts
@@ -95,3 +95,4 @@ export type {MoneyRequestTimeForm} from './MoneyRequestTimeForm';
 export type {MoneyRequestSubrateForm} from './MoneyRequestSubrateForm';
 export type {InternationalBankAccountForm} from './InternationalBankAccountForm';
 export type {WorkspacePerDiemForm} from './WorkspacePerDiemForm';
+export type {EnableGlobalReimbursementsForm} from './EnableGlobalReimbursementsForm';
diff --git a/src/types/onyx/BankAccount.ts b/src/types/onyx/BankAccount.ts
index f71969db4709..0493cbe519e8 100644
--- a/src/types/onyx/BankAccount.ts
+++ b/src/types/onyx/BankAccount.ts
@@ -28,6 +28,9 @@ type BankAccountAdditionalData = {
 
     /** Is billing card */
     isBillingCard?: boolean;
+
+    /** ID of related policy */
+    policyID?: string;
 };
 
 /** Model of bank account */

From ddd661ba34d135a3a45ffe295ffd726effe4dd18 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20Muzyk?= <mimuzyk@gmail.com>
Date: Mon, 28 Jul 2025 16:04:22 +0200
Subject: [PATCH 02/18] feat: sorted out DocusignFullStep and some basic
 cleanup

---
 src/CONST/index.ts                            |  1 +
 .../SubStepForms/AgreementsFullStep/index.tsx | 15 ++--
 .../subSteps/Confirmation.tsx                 |  7 +-
 .../{Docusign.tsx => index.tsx}               | 35 +++++++---
 .../subSteps/UploadPowerform.tsx              | 62 +++++++++--------
 src/libs/actions/BankAccounts.ts              | 18 +++--
 .../Agreements/index.tsx                      | 16 +++--
 .../Docusign/index.tsx                        | 68 ++++++++-----------
 .../EnableGlobalReimbursements/index.tsx      | 57 ++++++++++++++--
 .../form/EnableGlobalReimbursementsForm.ts    |  3 +-
 10 files changed, 178 insertions(+), 104 deletions(-)
 rename src/components/SubStepForms/DocusignFullStep/{Docusign.tsx => index.tsx} (84%)

diff --git a/src/CONST/index.ts b/src/CONST/index.ts
index 6abad6d2e701..3621cfee3f56 100755
--- a/src/CONST/index.ts
+++ b/src/CONST/index.ts
@@ -634,6 +634,7 @@ const CONST = {
             AGREEMENTS: 'AgreementsStep',
             DOCUSIGN: 'DocusignStep',
         },
+        ALLOWED_FILE_TYPES: ['pdf', 'jpg', 'jpeg', 'png'],
     },
     INCORPORATION_TYPES: {
         LLC: 'LLC',
diff --git a/src/components/SubStepForms/AgreementsFullStep/index.tsx b/src/components/SubStepForms/AgreementsFullStep/index.tsx
index c8e72017d155..041fdced7fd1 100644
--- a/src/components/SubStepForms/AgreementsFullStep/index.tsx
+++ b/src/components/SubStepForms/AgreementsFullStep/index.tsx
@@ -27,24 +27,25 @@ type AgreementsFullStepProps<TFormID extends keyof OnyxFormValuesMapping> = {
     /** Handles submit button press */
     onSubmit: () => void;
 
+    /** Currency of the policy */
+    policyCurrency: string;
+
     /** Array of step names */
     stepNames?: readonly string[];
 
     /** Index of currently active step in header */
     startStepIndex: number;
-
-    /** Currency of the policy */
-    policyCurrency: string | undefined;
 };
 
 type AgreementsFullStepSubStepProps<TFormID extends keyof OnyxFormValuesMapping> = SubStepProps & {
-    policyCurrency: string | undefined;
-
     /** The ID of the form */
     formID: TFormID;
 
     /** Input IDs for field in the form */
     inputIDs: AgreementsFullStepProps<TFormID>['inputIDs'];
+
+    /** Currency of affiliated policy */
+    policyCurrency: string;
 };
 
 function AgreementsFullStep<TFormID extends keyof OnyxFormValuesMapping>({
@@ -52,9 +53,9 @@ function AgreementsFullStep<TFormID extends keyof OnyxFormValuesMapping>({
     inputIDs,
     onBackButtonPress,
     onSubmit,
+    policyCurrency,
     stepNames,
     startStepIndex,
-    policyCurrency,
 }: AgreementsFullStepProps<TFormID>) {
     const {translate} = useLocalize();
 
@@ -96,8 +97,8 @@ function AgreementsFullStep<TFormID extends keyof OnyxFormValuesMapping>({
                 formID={formID}
                 inputIDs={inputIDs}
                 isEditing={isEditing}
-                onNext={nextScreen}
                 onMove={moveTo}
+                onNext={nextScreen}
                 policyCurrency={policyCurrency}
             />
         </InteractiveStepWrapper>
diff --git a/src/components/SubStepForms/AgreementsFullStep/subSteps/Confirmation.tsx b/src/components/SubStepForms/AgreementsFullStep/subSteps/Confirmation.tsx
index 2cb0c9ffca9e..fcafcebfd1bf 100644
--- a/src/components/SubStepForms/AgreementsFullStep/subSteps/Confirmation.tsx
+++ b/src/components/SubStepForms/AgreementsFullStep/subSteps/Confirmation.tsx
@@ -42,8 +42,6 @@ function ConsentToPrivacyNoticeLabel() {
 }
 
 type ConfirmationProps<TFormID extends keyof OnyxFormValuesMapping> = SubStepProps & {
-    policyCurrency: string | undefined;
-
     /** The ID of the form */
     formID: TFormID;
 
@@ -54,9 +52,12 @@ type ConfirmationProps<TFormID extends keyof OnyxFormValuesMapping> = SubStepPro
         consentToPrivacyNotice: FormOnyxKeys<TFormID>;
         authorizedToBindClientToAgreement: FormOnyxKeys<TFormID>;
     };
+
+    /** Currency of affiliated policy */
+    policyCurrency: string;
 };
 
-function Confirmation<TFormID extends keyof OnyxFormValuesMapping>({onNext, policyCurrency, formID, inputIDs}: ConfirmationProps<TFormID>) {
+function Confirmation<TFormID extends keyof OnyxFormValuesMapping>({formID, inputIDs, onNext, policyCurrency}: ConfirmationProps<TFormID>) {
     const {translate} = useLocalize();
     const styles = useThemeStyles();
 
diff --git a/src/components/SubStepForms/DocusignFullStep/Docusign.tsx b/src/components/SubStepForms/DocusignFullStep/index.tsx
similarity index 84%
rename from src/components/SubStepForms/DocusignFullStep/Docusign.tsx
rename to src/components/SubStepForms/DocusignFullStep/index.tsx
index 50b8d4996a87..be4b0b97b87f 100644
--- a/src/components/SubStepForms/DocusignFullStep/Docusign.tsx
+++ b/src/components/SubStepForms/DocusignFullStep/index.tsx
@@ -5,51 +5,66 @@ import InteractiveStepWrapper from '@components/InteractiveStepWrapper';
 import useLocalize from '@hooks/useLocalize';
 import useSubStep from '@hooks/useSubStep';
 import type {SubStepProps} from '@hooks/useSubStep/types';
+import type {FileObject} from '@pages/media/AttachmentModalScreen/types';
 import {clearErrors} from '@userActions/FormActions';
 import type {OnyxFormValuesMapping} from '@src/ONYXKEYS';
 import UploadPowerform from './subSteps/UploadPowerform';
 
 type DocusignFullStepProps<TFormID extends keyof OnyxFormValuesMapping> = {
+    /** Default value for file upload input */
+    defaultValue: FileObject[];
+
     /** The ID of the form */
     formID: TFormID;
 
     /** ID of the input in the form */
     inputID: FormOnyxKeys<TFormID>;
 
+    /** Indicates that action is being processed */
+    isLoading: boolean;
+
     /** Handles back button press */
     onBackButtonPress: () => void;
 
     /** Handles submit button press */
     onSubmit: () => void;
 
+    /** Currency of the policy */
+    policyCurrency: string;
+
     /** Array of step names */
     stepNames?: readonly string[];
 
     /** Index of currently active step in header */
     startStepIndex: number;
-
-    /** Currency of the policy */
-    policyCurrency: string | undefined;
 };
 
 type DocusignFullStepStepProps<TFormID extends keyof OnyxFormValuesMapping> = SubStepProps & {
-    policyCurrency: string | undefined;
+    defaultValue: FileObject[];
 
     /** The ID of the form */
     formID: TFormID;
 
     /** ID of the input in the form */
     inputID: FormOnyxKeys<TFormID>;
+
+    /** Indicates that action is being processed */
+    isLoading: boolean;
+
+    /** Currency of the policy */
+    policyCurrency: string;
 };
 
 function DocusignFullStep<TFormID extends keyof OnyxFormValuesMapping>({
+    defaultValue,
+    formID,
+    inputID,
+    isLoading,
     onBackButtonPress,
     onSubmit,
-    stepNames,
-    formID,
-    startStepIndex,
     policyCurrency,
-    inputID,
+    startStepIndex,
+    stepNames,
 }: DocusignFullStepProps<TFormID>) {
     const {translate} = useLocalize();
 
@@ -88,11 +103,13 @@ function DocusignFullStep<TFormID extends keyof OnyxFormValuesMapping>({
             startStepIndex={startStepIndex}
         >
             <SubStep
+                defaultValue={defaultValue}
                 formID={formID}
                 inputID={inputID}
+                isLoading={isLoading}
                 isEditing={isEditing}
-                onNext={nextScreen}
                 onMove={moveTo}
+                onNext={nextScreen}
                 policyCurrency={policyCurrency}
             />
         </InteractiveStepWrapper>
diff --git a/src/components/SubStepForms/DocusignFullStep/subSteps/UploadPowerform.tsx b/src/components/SubStepForms/DocusignFullStep/subSteps/UploadPowerform.tsx
index 375dad73e46c..e25caa0a55ae 100644
--- a/src/components/SubStepForms/DocusignFullStep/subSteps/UploadPowerform.tsx
+++ b/src/components/SubStepForms/DocusignFullStep/subSteps/UploadPowerform.tsx
@@ -7,77 +7,83 @@ import Text from '@components/Text';
 import UploadFile from '@components/UploadFile';
 import useEnvironment from '@hooks/useEnvironment';
 import useLocalize from '@hooks/useLocalize';
-import useOnyx from '@hooks/useOnyx';
-import useReimbursementAccountStepFormSubmit from '@hooks/useReimbursementAccountStepFormSubmit';
 import type {SubStepProps} from '@hooks/useSubStep/types';
 import useThemeStyles from '@hooks/useThemeStyles';
 import {getFieldRequiredErrors} from '@libs/ValidationUtils';
 import type {FileObject} from '@pages/media/AttachmentModalScreen/types';
+import mapCurrencyToCountry from '@pages/ReimbursementAccount/utils/mapCurrencyToCountry';
 import {clearErrorFields, setDraftValues, setErrorFields} from '@userActions/FormActions';
 import {openLink} from '@userActions/Link';
 import CONST from '@src/CONST';
-import ONYXKEYS from '@src/ONYXKEYS';
 import type {OnyxFormValuesMapping} from '@src/ONYXKEYS';
 
 type UploadPowerformProps<TFormID extends keyof OnyxFormValuesMapping> = SubStepProps & {
-    policyCurrency: string | undefined;
+    /** Default value for file upload input */
+    defaultValue: FileObject[];
 
     /** The ID of the form */
     formID: TFormID;
 
     /** ID of the input in the form */
     inputID: FormOnyxKeys<TFormID>;
+
+    /** Indicates that action is being processed */
+    isLoading: boolean;
+
+    /** Currency of affiliated policy */
+    policyCurrency: string;
 };
-function UploadPowerform<TFormID extends keyof OnyxFormValuesMapping>({onNext, isEditing, policyCurrency, formID, inputID}: UploadPowerformProps<TFormID>) {
+function UploadPowerform<TFormID extends keyof OnyxFormValuesMapping>({defaultValue, formID, inputID, isLoading, onNext, policyCurrency}: UploadPowerformProps<TFormID>) {
     const {translate} = useLocalize();
     const styles = useThemeStyles();
     const {environmentURL} = useEnvironment();
 
     const [uploadedFiles, setUploadedFiles] = useState<FileObject[]>(defaultValue);
 
-    const validate = useCallback((values: FormOnyxValues<typeof ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM>): FormInputErrors<typeof ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM> => {
-        return getFieldRequiredErrors(values, STEP_FIELDS);
-    }, []);
-
-    const handleSubmit = useReimbursementAccountStepFormSubmit({
-        fieldIds: STEP_FIELDS,
-        onNext,
-        shouldSaveDraft: isEditing,
-    });
+    const validate = useCallback(
+        (values: FormOnyxValues<TFormID>): FormInputErrors<TFormID> => {
+            return getFieldRequiredErrors(values, [inputID]);
+        },
+        [inputID],
+    );
 
     const handleSelectFile = (files: FileObject[]) => {
-        setDraftValues(ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM, {[ACH_AUTHORIZATION_FORM]: [...uploadedFiles, ...files]});
+        setDraftValues(formID, {[inputID]: [...uploadedFiles, ...files]});
         setUploadedFiles((prev) => [...prev, ...files]);
     };
 
     const handleRemoveFile = (fileName: string) => {
         const newUploadedFiles = uploadedFiles.filter((file) => file.name !== fileName);
-        setDraftValues(ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM, {[ACH_AUTHORIZATION_FORM]: newUploadedFiles});
+        setDraftValues(formID, {[inputID]: newUploadedFiles});
         setUploadedFiles(newUploadedFiles);
     };
 
     const setUploadError = (error: string) => {
         if (!error) {
-            clearErrorFields(ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM);
+            clearErrorFields(formID);
             return;
         }
 
-        setErrorFields(ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM, {[ACH_AUTHORIZATION_FORM]: {onUpload: error}});
+        setErrorFields(formID, {[inputID]: {onUpload: error}});
     };
 
+    const country = mapCurrencyToCountry(policyCurrency ?? '');
+
     return (
         <FormProvider
-            formID={ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM}
+            formID={formID}
             submitButtonText={translate('common.submit')}
-            onSubmit={handleSubmit}
+            onSubmit={onNext}
             validate={validate}
             style={[styles.mh5, styles.flexGrow1]}
             submitButtonStyles={[styles.mb0]}
             enabledWhenOffline={false}
-            isLoading={reimbursementAccount?.isFinishingCorpayBankAccountOnboarding}
+            isLoading={isLoading}
         >
-            {countryStepCountryValue === CONST.COUNTRY.CA && <Text style={[styles.textHeadlineLineHeightXXL, styles.mb10]}>{translate('docusignStep.pleaseComplete')}</Text>}
-            {countryStepCountryValue === CONST.COUNTRY.AU && (
+            {(country === CONST.COUNTRY.CA || country === CONST.COUNTRY.US) && (
+                <Text style={[styles.textHeadlineLineHeightXXL, styles.mb10]}>{translate('docusignStep.pleaseComplete')}</Text>
+            )}
+            {country === CONST.COUNTRY.AU && (
                 <>
                     <Text style={[styles.textHeadlineLineHeightXXL, styles.mb3]}>{translate('docusignStep.pleaseCompleteTheBusinessAccount')}</Text>
                     <Text style={[styles.textSupporting, styles.mb10]}>{translate('docusignStep.pleaseCompleteTheDirect')}</Text>
@@ -88,12 +94,14 @@ function UploadPowerform<TFormID extends keyof OnyxFormValuesMapping>({onNext, i
                 large
                 style={[styles.w100, styles.mb15]}
                 onPress={() => {
-                    openLink(CONST.DOCUSIGN_POWERFORM_LINK[countryStepCountryValue as 'CA' | 'AU'], environmentURL);
+                    openLink(CONST.DOCUSIGN_POWERFORM_LINK[country as 'CA' | 'AU' | 'US'], environmentURL);
                 }}
                 text={translate('docusignStep.takeMeTo')}
             />
-            {countryStepCountryValue === CONST.COUNTRY.CA && <Text style={[styles.textHeadlineLineHeightXXL, styles.mb5]}>{translate('docusignStep.uploadAdditional')}</Text>}
-            {countryStepCountryValue === CONST.COUNTRY.AU && <Text style={[styles.textHeadlineLineHeightXXL, styles.mb5]}>{translate('docusignStep.pleaseUploadTheDirect')}</Text>}
+            {(country === CONST.COUNTRY.CA || country === CONST.COUNTRY.US) && (
+                <Text style={[styles.textHeadlineLineHeightXXL, styles.mb5]}>{translate('docusignStep.uploadAdditional')}</Text>
+            )}
+            {country === CONST.COUNTRY.AU && <Text style={[styles.textHeadlineLineHeightXXL, styles.mb5]}>{translate('docusignStep.pleaseUploadTheDirect')}</Text>}
             <Text style={[styles.textHeadlineH2, styles.colorMuted, styles.mb10]}>{translate('docusignStep.pleaseUpload')}</Text>
             <InputWrapper
                 InputComponent={UploadFile}
@@ -107,7 +115,7 @@ function UploadPowerform<TFormID extends keyof OnyxFormValuesMapping>({onNext, i
                 }}
                 acceptedFileTypes={[...CONST.NON_USD_BANK_ACCOUNT.ALLOWED_FILE_TYPES]}
                 value={uploadedFiles}
-                inputID={ACH_AUTHORIZATION_FORM}
+                inputID={inputID as string}
                 setError={(error) => {
                     setUploadError(error);
                 }}
diff --git a/src/libs/actions/BankAccounts.ts b/src/libs/actions/BankAccounts.ts
index 30757b0265ab..0fbe6ec830f0 100644
--- a/src/libs/actions/BankAccounts.ts
+++ b/src/libs/actions/BankAccounts.ts
@@ -655,9 +655,9 @@ function enableGlobalReimbursementsForUSDBankAccount(parameters: EnableGlobalRei
         optimisticData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
-                key: ONYXKEYS.REIMBURSEMENT_ACCOUNT,
+                key: ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS,
                 value: {
-                    isFinishingCorpayBankAccountOnboarding: true,
+                    isEnablingGlobalReimbursements: true,
                     errors: null,
                 },
             },
@@ -665,9 +665,9 @@ function enableGlobalReimbursementsForUSDBankAccount(parameters: EnableGlobalRei
         successData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
-                key: ONYXKEYS.REIMBURSEMENT_ACCOUNT,
+                key: ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS,
                 value: {
-                    isFinishingCorpayBankAccountOnboarding: false,
+                    isEnablingGlobalReimbursements: false,
                     isSuccess: true,
                 },
             },
@@ -675,9 +675,9 @@ function enableGlobalReimbursementsForUSDBankAccount(parameters: EnableGlobalRei
         failureData: [
             {
                 onyxMethod: Onyx.METHOD.MERGE,
-                key: ONYXKEYS.REIMBURSEMENT_ACCOUNT,
+                key: ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS,
                 value: {
-                    isFinishingCorpayBankAccountOnboarding: false,
+                    isEnablingGlobalReimbursements: false,
                     isSuccess: false,
                     errors: getMicroSecondOnyxErrorWithTranslationKey('common.genericErrorMessage'),
                 },
@@ -688,6 +688,10 @@ function enableGlobalReimbursementsForUSDBankAccount(parameters: EnableGlobalRei
     return API.write(WRITE_COMMANDS.ENABLE_GLOBAL_REIMBURSEMENTS_FOR_USD_BANK_ACCOUNT, parameters, onyxData);
 }
 
+function clearEnableGlobalReimbursementsForUSDBankAccount() {
+    Onyx.merge(ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS, {isSuccess: null, isEnablingGlobalReimbursements: null});
+}
+
 function clearCorpayBankAccountFields() {
     Onyx.set(ONYXKEYS.CORPAY_FIELDS, null);
 }
@@ -1043,4 +1047,6 @@ export {
     clearCorpayBankAccountFields,
     finishCorpayBankAccountOnboarding,
     clearReimbursementAccountFinishCorpayBankAccountOnboarding,
+    enableGlobalReimbursementsForUSDBankAccount,
+    clearEnableGlobalReimbursementsForUSDBankAccount,
 };
diff --git a/src/pages/settings/Wallet/EnableGlobalReimbursements/Agreements/index.tsx b/src/pages/settings/Wallet/EnableGlobalReimbursements/Agreements/index.tsx
index f835c9594be8..5c45b58ee85d 100644
--- a/src/pages/settings/Wallet/EnableGlobalReimbursements/Agreements/index.tsx
+++ b/src/pages/settings/Wallet/EnableGlobalReimbursements/Agreements/index.tsx
@@ -5,8 +5,14 @@ import ONYXKEYS from '@src/ONYXKEYS';
 import INPUT_IDS from '@src/types/form/EnableGlobalReimbursementsForm';
 
 type AgreementsProps = {
-    onSubmit: () => void;
+    /** Handles back button press */
     onBackButtonPress: () => void;
+
+    /** Handles submit button press */
+    onSubmit: () => void;
+
+    /** Currency of affiliated policy */
+    policyCurrency: string;
 };
 
 const inputIDs = {
@@ -16,16 +22,16 @@ const inputIDs = {
     authorizedToBindClientToAgreement: INPUT_IDS.AUTHORIZED_TO_BIND_CLIENT_TO_AGREEMENT,
 };
 
-function Agreements({onSubmit, onBackButtonPress}: AgreementsProps) {
+function Agreements({onBackButtonPress, onSubmit, policyCurrency}: AgreementsProps) {
     return (
         <AgreementsFullStep
-            stepNames={CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP_NAMES}
             formID={ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS}
-            onSubmit={onSubmit}
             inputIDs={inputIDs}
             onBackButtonPress={onBackButtonPress}
-            policyCurrency="USD"
+            onSubmit={onSubmit}
+            policyCurrency={policyCurrency}
             startStepIndex={0}
+            stepNames={CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP_NAMES}
         />
     );
 }
diff --git a/src/pages/settings/Wallet/EnableGlobalReimbursements/Docusign/index.tsx b/src/pages/settings/Wallet/EnableGlobalReimbursements/Docusign/index.tsx
index 6a064cdd7dfa..643c1480e255 100644
--- a/src/pages/settings/Wallet/EnableGlobalReimbursements/Docusign/index.tsx
+++ b/src/pages/settings/Wallet/EnableGlobalReimbursements/Docusign/index.tsx
@@ -1,51 +1,39 @@
-import React, {useEffect, useMemo} from 'react';
-import DocusignFullStep from '@components/SubStepForms/DocusignFullStep/Docusign';
+import React from 'react';
+import DocusignFullStep from '@components/SubStepForms/DocusignFullStep';
 import useOnyx from '@hooks/useOnyx';
-import getSubStepValues from '@pages/ReimbursementAccount/utils/getSubStepValues';
-import {clearReimbursementAccountFinishCorpayBankAccountOnboarding, finishCorpayBankAccountOnboarding} from '@userActions/BankAccounts';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
+import INPUT_IDS from '@src/types/form/EnableGlobalReimbursementsForm';
 
 type DocusignProps = {
-    onSubmit: () => void;
-};
-
-function Docusign({onSubmit}: DocusignProps) {
-    const [reimbursementAccount] = useOnyx(ONYXKEYS.REIMBURSEMENT_ACCOUNT, {canBeMissing: false});
-    const [reimbursementAccountDraft] = useOnyx(ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM_DRAFT, {canBeMissing: false});
-    const finalStepValues = useMemo(() => getSubStepValues(INPUT_KEYS, reimbursementAccountDraft, reimbursementAccount), [reimbursementAccount, reimbursementAccountDraft]);
-    const bankAccountID = reimbursementAccount?.achData?.bankAccountID ?? CONST.DEFAULT_NUMBER_ID;
-
-    const submit = () => {
-        finishCorpayBankAccountOnboarding({
-            inputs: JSON.stringify({
-                provideTruthfulInformation: finalStepValues.provideTruthfulInformation,
-                agreeToTermsAndConditions: finalStepValues.agreeToTermsAndConditions,
-                consentToPrivacyNotice: finalStepValues.consentToPrivacyNotice,
-                authorizedToBindClientToAgreement: finalStepValues.authorizedToBindClientToAgreement,
-            }),
-            achAuthorizationForm: finalStepValues.achAuthorizationForm.at(0),
-            bankAccountID,
-        });
-    };
+    /** Handles back button press */
+    onBackButtonPress: () => void;
 
-    useEffect(() => {
-        // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
-        if (reimbursementAccount?.errors || reimbursementAccount?.isFinishingCorpayBankAccountOnboarding || !reimbursementAccount?.isSuccess) {
-            return;
-        }
-
-        if (reimbursementAccount?.isSuccess) {
-            onSubmit();
-            clearReimbursementAccountFinishCorpayBankAccountOnboarding();
-        }
+    /** Handles submit button press */
+    onSubmit: () => void;
 
-        return () => {
-            clearReimbursementAccountFinishCorpayBankAccountOnboarding();
-        };
-    }, [reimbursementAccount, onSubmit]);
+    /** Currency of affiliated policy */
+    policyCurrency: string;
+};
 
-    return <DocusignFullStep />;
+function Docusign({onBackButtonPress, onSubmit, policyCurrency}: DocusignProps) {
+    const [enableGlobalReimbursements] = useOnyx(ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS, {canBeMissing: true});
+    const [enableGlobalReimbursementsDraft] = useOnyx(ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS_DRAFT, {canBeMissing: true});
+    const defaultValue = enableGlobalReimbursementsDraft?.[INPUT_IDS.ACH_AUTHORIZATION_FORM] ?? [];
+
+    return (
+        <DocusignFullStep
+            defaultValue={defaultValue}
+            formID={ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS}
+            inputID={INPUT_IDS.ACH_AUTHORIZATION_FORM}
+            isLoading={enableGlobalReimbursements?.isEnablingGlobalReimbursements ?? false}
+            onBackButtonPress={onBackButtonPress}
+            onSubmit={onSubmit}
+            policyCurrency={policyCurrency}
+            startStepIndex={1}
+            stepNames={CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP_NAMES}
+        />
+    );
 }
 
 Docusign.displayName = 'Docusign';
diff --git a/src/pages/settings/Wallet/EnableGlobalReimbursements/index.tsx b/src/pages/settings/Wallet/EnableGlobalReimbursements/index.tsx
index cc1c089ecb60..7e4f48bf46f0 100644
--- a/src/pages/settings/Wallet/EnableGlobalReimbursements/index.tsx
+++ b/src/pages/settings/Wallet/EnableGlobalReimbursements/index.tsx
@@ -1,13 +1,28 @@
-import React, {useState} from 'react';
+import React, {useEffect, useState} from 'react';
 import type {ValueOf} from 'type-fest';
+import useOnyx from '@hooks/useOnyx';
 import Navigation from '@navigation/Navigation';
+import type {PlatformStackScreenProps} from '@navigation/PlatformStackNavigation/types';
+import type {SettingsNavigatorParamList} from '@navigation/types';
+import {clearEnableGlobalReimbursementsForUSDBankAccount, enableGlobalReimbursementsForUSDBankAccount} from '@userActions/BankAccounts';
 import {clearErrors} from '@userActions/FormActions';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
+import type SCREENS from '@src/SCREENS';
+import INPUT_IDS from '@src/types/form/EnableGlobalReimbursementsForm';
 import Agreements from './Agreements';
 import Docusign from './Docusign';
 
-function EnableGlobalReimbursements() {
+type EnableGlobalReimbursementsProps = PlatformStackScreenProps<SettingsNavigatorParamList, typeof SCREENS.SETTINGS.WALLET.ENABLE_GLOBAL_REIMBURSEMENTS>;
+
+function EnableGlobalReimbursements({route}: EnableGlobalReimbursementsProps) {
+    const policyID = route.params?.policyID;
+    const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {canBeMissing: false});
+    const policyCurrency = policy?.outputCurrency ?? '';
+    const [reimbursementAccount] = useOnyx(ONYXKEYS.REIMBURSEMENT_ACCOUNT, {canBeMissing: false});
+    const [enableGlobalReimbursements] = useOnyx(ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS, {canBeMissing: true});
+    const [enableGlobalReimbursementsDraft] = useOnyx(ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS_DRAFT, {canBeMissing: true});
+    const bankAccountID = reimbursementAccount?.achData?.bankAccountID ?? CONST.DEFAULT_NUMBER_ID;
     const [enableGlobalReimbursementsStep, setEnableGlobalReimbursementsStep] = useState<ValueOf<typeof CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP>>(
         CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP.AGREEMENTS,
     );
@@ -16,7 +31,16 @@ function EnableGlobalReimbursements() {
         if (enableGlobalReimbursementsStep === CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP.AGREEMENTS) {
             setEnableGlobalReimbursementsStep(CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP.DOCUSIGN);
         } else {
-            /* empty */
+            enableGlobalReimbursementsForUSDBankAccount({
+                inputs: JSON.stringify({
+                    provideTruthfulInformation: enableGlobalReimbursementsDraft?.[INPUT_IDS.PROVIDE_TRUTHFUL_INFORMATION],
+                    agreeToTermsAndConditions: enableGlobalReimbursementsDraft?.[INPUT_IDS.AGREE_TO_TERMS_AND_CONDITIONS],
+                    consentToPrivacyNotice: enableGlobalReimbursementsDraft?.[INPUT_IDS.CONSENT_TO_PRIVACY_NOTICE],
+                    authorizedToBindClientToAgreement: enableGlobalReimbursementsDraft?.[INPUT_IDS.AUTHORIZED_TO_BIND_CLIENT_TO_AGREEMENT],
+                }),
+                achAuthorizationForm: enableGlobalReimbursementsDraft?.[INPUT_IDS.ACH_AUTHORIZATION_FORM].at(0),
+                bankAccountID,
+            });
         }
     };
 
@@ -34,16 +58,39 @@ function EnableGlobalReimbursements() {
         }
     };
 
+    useEffect(() => {
+        // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
+        if (enableGlobalReimbursements?.errors || enableGlobalReimbursements?.isEnablingGlobalReimbursements || !enableGlobalReimbursements?.isSuccess) {
+            return;
+        }
+
+        if (enableGlobalReimbursements?.isSuccess) {
+            clearEnableGlobalReimbursementsForUSDBankAccount();
+            Navigation.goBack();
+        }
+
+        return () => {
+            clearEnableGlobalReimbursementsForUSDBankAccount();
+        };
+    }, [enableGlobalReimbursements?.errors, enableGlobalReimbursements?.isEnablingGlobalReimbursements, enableGlobalReimbursements?.isSuccess]);
+
     switch (enableGlobalReimbursementsStep) {
         case CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP.AGREEMENTS:
             return (
                 <Agreements
-                    onSubmit={handleNextEnableGlobalReimbursementsStep}
                     onBackButtonPress={handleEnableGlobalReimbursementGoBack}
+                    onSubmit={handleNextEnableGlobalReimbursementsStep}
+                    policyCurrency={policyCurrency}
                 />
             );
         case CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP.DOCUSIGN:
-            return <Docusign onSubmit={handleNextEnableGlobalReimbursementsStep} />;
+            return (
+                <Docusign
+                    onBackButtonPress={handleEnableGlobalReimbursementGoBack}
+                    onSubmit={handleNextEnableGlobalReimbursementsStep}
+                    policyCurrency={policyCurrency}
+                />
+            );
         default:
             return null;
     }
diff --git a/src/types/form/EnableGlobalReimbursementsForm.ts b/src/types/form/EnableGlobalReimbursementsForm.ts
index 7d64377f9f58..4b63093b916c 100644
--- a/src/types/form/EnableGlobalReimbursementsForm.ts
+++ b/src/types/form/EnableGlobalReimbursementsForm.ts
@@ -20,9 +20,8 @@ type EnableGlobalReimbursementsForm = Form<
         [INPUT_IDS.CONSENT_TO_PRIVACY_NOTICE]: boolean;
         [INPUT_IDS.AUTHORIZED_TO_BIND_CLIENT_TO_AGREEMENT]: boolean;
         [INPUT_IDS.ACH_AUTHORIZATION_FORM]: FileObject[];
-
     }
->;
+> & {isEnablingGlobalReimbursements?: boolean; isSuccess?: boolean};
 
 export type {EnableGlobalReimbursementsForm};
 export default INPUT_IDS;

From 53f3c8eaa49defd7e786d7830fbdd679bd1a40dc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20Muzyk?= <mimuzyk@gmail.com>
Date: Tue, 29 Jul 2025 13:22:13 +0200
Subject: [PATCH 03/18] feat: somewhat done

---
 .../SubStepForms/AgreementsFullStep/index.tsx |   8 +
 .../subSteps/Confirmation.tsx                 |   9 +-
 src/languages/de.ts                           |   1 +
 src/languages/es.ts                           |   1 +
 src/languages/fr.ts                           |   1 +
 src/languages/it.ts                           |   1 +
 src/languages/ja.ts                           |   1 +
 src/languages/nl.ts                           |   1 +
 src/languages/pl.ts                           |   1 +
 src/languages/pt-BR.ts                        |   1 +
 src/languages/zh-hans.ts                      |   1 +
 src/libs/API/types.ts                         |   1 -
 .../NonUSD/Agreements/index.tsx               |  67 ++------
 .../Agreements/subSteps/Confirmation.tsx      | 147 ------------------
 .../Docusign/{Docusign.tsx => index.tsx}      |  68 ++------
 .../Docusign/subSteps/UploadPowerform.tsx     | 124 ---------------
 .../NonUSD/NonUSDVerifiedBankAccountFlow.tsx  |   8 +-
 .../utils/getSubStepValues.ts                 |   2 +-
 .../Agreements/index.tsx                      |  10 ++
 .../settings/Wallet/WalletPage/WalletPage.tsx |  45 +++---
 src/types/onyx/AccountData.ts                 |   4 +
 21 files changed, 101 insertions(+), 401 deletions(-)
 delete mode 100644 src/pages/ReimbursementAccount/NonUSD/Agreements/subSteps/Confirmation.tsx
 rename src/pages/ReimbursementAccount/NonUSD/Docusign/{Docusign.tsx => index.tsx} (66%)
 delete mode 100644 src/pages/ReimbursementAccount/NonUSD/Docusign/subSteps/UploadPowerform.tsx

diff --git a/src/components/SubStepForms/AgreementsFullStep/index.tsx b/src/components/SubStepForms/AgreementsFullStep/index.tsx
index 041fdced7fd1..03687f0021a8 100644
--- a/src/components/SubStepForms/AgreementsFullStep/index.tsx
+++ b/src/components/SubStepForms/AgreementsFullStep/index.tsx
@@ -10,6 +10,9 @@ import type {OnyxFormValuesMapping} from '@src/ONYXKEYS';
 import Confirmation from './subSteps/Confirmation';
 
 type AgreementsFullStepProps<TFormID extends keyof OnyxFormValuesMapping> = {
+    /** Default values for inputs */
+    defaultValues: Partial<Record<FormOnyxKeys<TFormID>, boolean>>;
+
     /** The ID of the form */
     formID: TFormID;
 
@@ -38,6 +41,9 @@ type AgreementsFullStepProps<TFormID extends keyof OnyxFormValuesMapping> = {
 };
 
 type AgreementsFullStepSubStepProps<TFormID extends keyof OnyxFormValuesMapping> = SubStepProps & {
+    /** Default values for inputs */
+    defaultValues: AgreementsFullStepProps<TFormID>['defaultValues'];
+
     /** The ID of the form */
     formID: TFormID;
 
@@ -49,6 +55,7 @@ type AgreementsFullStepSubStepProps<TFormID extends keyof OnyxFormValuesMapping>
 };
 
 function AgreementsFullStep<TFormID extends keyof OnyxFormValuesMapping>({
+    defaultValues,
     formID,
     inputIDs,
     onBackButtonPress,
@@ -94,6 +101,7 @@ function AgreementsFullStep<TFormID extends keyof OnyxFormValuesMapping>({
             startStepIndex={startStepIndex}
         >
             <SubStep
+                defaultValues={defaultValues}
                 formID={formID}
                 inputIDs={inputIDs}
                 isEditing={isEditing}
diff --git a/src/components/SubStepForms/AgreementsFullStep/subSteps/Confirmation.tsx b/src/components/SubStepForms/AgreementsFullStep/subSteps/Confirmation.tsx
index fcafcebfd1bf..a85b2b4ea2c5 100644
--- a/src/components/SubStepForms/AgreementsFullStep/subSteps/Confirmation.tsx
+++ b/src/components/SubStepForms/AgreementsFullStep/subSteps/Confirmation.tsx
@@ -42,6 +42,9 @@ function ConsentToPrivacyNoticeLabel() {
 }
 
 type ConfirmationProps<TFormID extends keyof OnyxFormValuesMapping> = SubStepProps & {
+    /** Default values for inputs */
+    defaultValues: Partial<Record<FormOnyxKeys<TFormID>, boolean>>;
+
     /** The ID of the form */
     formID: TFormID;
 
@@ -57,7 +60,7 @@ type ConfirmationProps<TFormID extends keyof OnyxFormValuesMapping> = SubStepPro
     policyCurrency: string;
 };
 
-function Confirmation<TFormID extends keyof OnyxFormValuesMapping>({formID, inputIDs, onNext, policyCurrency}: ConfirmationProps<TFormID>) {
+function Confirmation<TFormID extends keyof OnyxFormValuesMapping>({defaultValues, formID, inputIDs, onNext, policyCurrency}: ConfirmationProps<TFormID>) {
     const {translate} = useLocalize();
     const styles = useThemeStyles();
 
@@ -109,6 +112,7 @@ function Confirmation<TFormID extends keyof OnyxFormValuesMapping>({formID, inpu
                 inputID={inputIDs.authorizedToBindClientToAgreement as string}
                 style={styles.mt6}
                 LabelComponent={IsAuthorizedToUseBankAccountLabel}
+                defaultValue={defaultValues[inputIDs.authorizedToBindClientToAgreement]}
                 shouldSaveDraft
             />
             <InputWrapper
@@ -117,6 +121,7 @@ function Confirmation<TFormID extends keyof OnyxFormValuesMapping>({formID, inpu
                 inputID={inputIDs.provideTruthfulInformation as string}
                 style={styles.mt6}
                 LabelComponent={CertifyTrueAndAccurateLabel}
+                defaultValue={defaultValues[inputIDs.provideTruthfulInformation]}
                 shouldSaveDraft
             />
             <InputWrapper
@@ -125,6 +130,7 @@ function Confirmation<TFormID extends keyof OnyxFormValuesMapping>({formID, inpu
                 inputID={inputIDs.agreeToTermsAndConditions as string}
                 style={styles.mt6}
                 LabelComponent={TermsAndConditionsLabel}
+                defaultValue={defaultValues[inputIDs.agreeToTermsAndConditions]}
                 shouldSaveDraft
             />
             <InputWrapper
@@ -133,6 +139,7 @@ function Confirmation<TFormID extends keyof OnyxFormValuesMapping>({formID, inpu
                 inputID={inputIDs.consentToPrivacyNotice as string}
                 style={styles.mt6}
                 LabelComponent={ConsentToPrivacyNoticeLabel}
+                defaultValue={defaultValues[inputIDs.consentToPrivacyNotice]}
                 shouldSaveDraft
             />
         </FormProvider>
diff --git a/src/languages/de.ts b/src/languages/de.ts
index ed4081ab710b..fe618ad7c320 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -626,6 +626,7 @@ const translations = {
         getTheApp: 'Hole dir die App',
         scanReceiptsOnTheGo: 'Scannen Sie Belege von Ihrem Telefon aus',
         headsUp: 'Achtung!',
+        enableGlobalReimbursements: 'Globale Rückerstattungen aktivieren',
     },
     supportalNoAccess: {
         title: 'Nicht so schnell',
diff --git a/src/languages/es.ts b/src/languages/es.ts
index 42c5b55255cc..2911d4abfef5 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -607,6 +607,7 @@ const translations = {
         getTheApp: 'Descarga la app',
         scanReceiptsOnTheGo: 'Escanea recibos desde tu teléfono',
         headsUp: '¡Atención!',
+        enableGlobalReimbursements: 'Habilitar reembolsos globales',
     },
     supportalNoAccess: {
         title: 'No tan rápido',
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index e93da84b8655..b60d87e1c14f 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -626,6 +626,7 @@ const translations = {
         getTheApp: "Obtenez l'application",
         scanReceiptsOnTheGo: 'Numérisez les reçus depuis votre téléphone',
         headsUp: 'Attention !',
+        enableGlobalReimbursements: 'Activer les remboursements globaux',
     },
     supportalNoAccess: {
         title: 'Pas si vite',
diff --git a/src/languages/it.ts b/src/languages/it.ts
index 6d22281d0f04..31b385dae550 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -626,6 +626,7 @@ const translations = {
         getTheApp: "Scarica l'app",
         scanReceiptsOnTheGo: 'Scansiona le ricevute dal tuo telefono',
         headsUp: 'Attenzione!',
+        enableGlobalReimbursements: 'Abilita i rimborsi globali',
     },
     supportalNoAccess: {
         title: 'Non così in fretta',
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index 764686555fa6..85fc62303252 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -626,6 +626,7 @@ const translations = {
         getTheApp: 'アプリを入手',
         scanReceiptsOnTheGo: '携帯電話から領収書をスキャンする',
         headsUp: 'ご注意ください！',
+        enableGlobalReimbursements: 'グローバル払い戻しを有効にする',
     },
     supportalNoAccess: {
         title: 'ちょっと待ってください',
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index 4b5358ff6292..b07e58ccafc4 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -625,6 +625,7 @@ const translations = {
         getTheApp: 'Download de app',
         scanReceiptsOnTheGo: 'Scan bonnetjes vanaf je telefoon',
         headsUp: 'Let op!',
+        enableGlobalReimbursements: 'Wereldwijde terugbetalingen inschakelen',
     },
     supportalNoAccess: {
         title: 'Niet zo snel',
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index 78dcb39732f3..7a22b259f651 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -626,6 +626,7 @@ const translations = {
         getTheApp: 'Pobierz aplikację',
         scanReceiptsOnTheGo: 'Skanuj paragony za pomocą telefonu',
         headsUp: 'Uwaga!',
+        enableGlobalReimbursements: 'Włącz globalne zwroty',
     },
     supportalNoAccess: {
         title: 'Nie tak szybko',
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index 6ae53b3e0341..1847974d9f25 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -625,6 +625,7 @@ const translations = {
         getTheApp: 'Obtenha o aplicativo',
         scanReceiptsOnTheGo: 'Digitalize recibos com seu celular',
         headsUp: 'Atenção!',
+        enableGlobalReimbursements: 'Ativar reembolsos globais',
     },
     supportalNoAccess: {
         title: 'Não tão rápido',
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index 73f4ea2eb508..cf8483d0f112 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -625,6 +625,7 @@ const translations = {
         getTheApp: '获取应用程序',
         scanReceiptsOnTheGo: '用手机扫描收据',
         headsUp: '\u6CE8\u610F\uFF01',
+        enableGlobalReimbursements: '启用全球报销',
     },
     supportalNoAccess: {
         title: '慢一点',
diff --git a/src/libs/API/types.ts b/src/libs/API/types.ts
index 4810b5db755e..cf6bcf7945bf 100644
--- a/src/libs/API/types.ts
+++ b/src/libs/API/types.ts
@@ -5,7 +5,6 @@ import type {EmptyObject} from '@src/types/utils/EmptyObject';
 import type * as Parameters from './parameters';
 // We have to disable eslint for this import because otherwise the import will be 300 lines long
 // eslint-disable-next-line no-restricted-syntax
-import EnableGlobalReimbursementsForUSDBankAccountParams from './parameters/EnableGlobalReimbursementsForUSDBankAccountParams';
 import type SignInUserParams from './parameters/SignInUserParams';
 import type UpdateBeneficialOwnersForBankAccountParams from './parameters/UpdateBeneficialOwnersForBankAccountParams';
 
diff --git a/src/pages/ReimbursementAccount/NonUSD/Agreements/index.tsx b/src/pages/ReimbursementAccount/NonUSD/Agreements/index.tsx
index 55369475a522..18d560bfb1a8 100644
--- a/src/pages/ReimbursementAccount/NonUSD/Agreements/index.tsx
+++ b/src/pages/ReimbursementAccount/NonUSD/Agreements/index.tsx
@@ -1,10 +1,6 @@
-import type {ComponentType} from 'react';
 import React, {useEffect, useMemo} from 'react';
-import InteractiveStepWrapper from '@components/InteractiveStepWrapper';
-import useLocalize from '@hooks/useLocalize';
+import AgreementsFullStep from '@components/SubStepForms/AgreementsFullStep';
 import useOnyx from '@hooks/useOnyx';
-import useSubStep from '@hooks/useSubStep';
-import type {SubStepProps} from '@hooks/useSubStep/types';
 import requiresDocusignStep from '@pages/ReimbursementAccount/NonUSD/utils/requiresDocusignStep';
 import getSubStepValues from '@pages/ReimbursementAccount/utils/getSubStepValues';
 import {clearReimbursementAccountFinishCorpayBankAccountOnboarding, finishCorpayBankAccountOnboarding} from '@userActions/BankAccounts';
@@ -12,7 +8,6 @@ import {clearErrors} from '@userActions/FormActions';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import INPUT_IDS from '@src/types/form/ReimbursementAccountForm';
-import Confirmation from './subSteps/Confirmation';
 
 type AgreementsProps = {
     /** Handles back button press */
@@ -25,24 +20,17 @@ type AgreementsProps = {
     stepNames?: readonly string[];
 
     /** Currency of the policy */
-    policyCurrency: string | undefined;
+    policyCurrency: string;
 };
 
-type AgreementsSubStepProps = SubStepProps & {
-    policyCurrency: string | undefined;
-};
-
-const bodyContent: Array<ComponentType<AgreementsSubStepProps>> = [Confirmation];
-
 const INPUT_KEYS = {
-    PROVIDE_TRUTHFUL_INFORMATION: INPUT_IDS.ADDITIONAL_DATA.CORPAY.PROVIDE_TRUTHFUL_INFORMATION,
-    AGREE_TO_TERMS_AND_CONDITIONS: INPUT_IDS.ADDITIONAL_DATA.CORPAY.AGREE_TO_TERMS_AND_CONDITIONS,
-    CONSENT_TO_PRIVACY_NOTICE: INPUT_IDS.ADDITIONAL_DATA.CORPAY.CONSENT_TO_PRIVACY_NOTICE,
-    AUTHORIZED_TO_BIND_CLIENT_TO_AGREEMENT: INPUT_IDS.ADDITIONAL_DATA.CORPAY.AUTHORIZED_TO_BIND_CLIENT_TO_AGREEMENT,
+    provideTruthfulInformation: INPUT_IDS.ADDITIONAL_DATA.CORPAY.PROVIDE_TRUTHFUL_INFORMATION,
+    agreeToTermsAndConditions: INPUT_IDS.ADDITIONAL_DATA.CORPAY.AGREE_TO_TERMS_AND_CONDITIONS,
+    consentToPrivacyNotice: INPUT_IDS.ADDITIONAL_DATA.CORPAY.CONSENT_TO_PRIVACY_NOTICE,
+    authorizedToBindClientToAgreement: INPUT_IDS.ADDITIONAL_DATA.CORPAY.AUTHORIZED_TO_BIND_CLIENT_TO_AGREEMENT,
 };
 
 function Agreements({onBackButtonPress, onSubmit, stepNames, policyCurrency}: AgreementsProps) {
-    const {translate} = useLocalize();
     const [reimbursementAccount] = useOnyx(ONYXKEYS.REIMBURSEMENT_ACCOUNT, {canBeMissing: false});
     const [reimbursementAccountDraft] = useOnyx(ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM_DRAFT, {canBeMissing: false});
     const agreementsStepValues = useMemo(() => getSubStepValues(INPUT_KEYS, reimbursementAccountDraft, reimbursementAccount), [reimbursementAccount, reimbursementAccountDraft]);
@@ -86,45 +74,22 @@ function Agreements({onBackButtonPress, onSubmit, stepNames, policyCurrency}: Ag
         };
     }, [reimbursementAccount, onSubmit, policyCurrency, isDocusignStepRequired]);
 
-    const {
-        componentToRender: SubStep,
-        isEditing,
-        screenIndex,
-        nextScreen,
-        prevScreen,
-        moveTo,
-        goToTheLastStep,
-    } = useSubStep<AgreementsSubStepProps>({bodyContent, startFrom: 0, onFinished: submit});
-
     const handleBackButtonPress = () => {
         clearErrors(ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM);
-        if (isEditing) {
-            goToTheLastStep();
-            return;
-        }
-
-        if (screenIndex === 0) {
-            onBackButtonPress();
-        } else {
-            prevScreen();
-        }
+        onBackButtonPress();
     };
 
     return (
-        <InteractiveStepWrapper
-            wrapperID={Agreements.displayName}
-            handleBackButtonPress={handleBackButtonPress}
-            headerTitle={translate('agreementsStep.agreements')}
-            stepNames={stepNames}
+        <AgreementsFullStep
+            defaultValues={agreementsStepValues}
+            formID={ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM}
+            inputIDs={INPUT_KEYS}
+            onBackButtonPress={handleBackButtonPress}
+            onSubmit={submit}
+            policyCurrency={policyCurrency ?? ''}
             startStepIndex={5}
-        >
-            <SubStep
-                isEditing={isEditing}
-                onNext={nextScreen}
-                onMove={moveTo}
-                policyCurrency={policyCurrency}
-            />
-        </InteractiveStepWrapper>
+            stepNames={stepNames}
+        />
     );
 }
 
diff --git a/src/pages/ReimbursementAccount/NonUSD/Agreements/subSteps/Confirmation.tsx b/src/pages/ReimbursementAccount/NonUSD/Agreements/subSteps/Confirmation.tsx
deleted file mode 100644
index 856a67934fd2..000000000000
--- a/src/pages/ReimbursementAccount/NonUSD/Agreements/subSteps/Confirmation.tsx
+++ /dev/null
@@ -1,147 +0,0 @@
-import React, {useCallback, useMemo} from 'react';
-import CheckboxWithLabel from '@components/CheckboxWithLabel';
-import FormProvider from '@components/Form/FormProvider';
-import InputWrapper from '@components/Form/InputWrapper';
-import type {FormInputErrors, FormOnyxValues} from '@components/Form/types';
-import Text from '@components/Text';
-import TextLink from '@components/TextLink';
-import useLocalize from '@hooks/useLocalize';
-import useOnyx from '@hooks/useOnyx';
-import type {SubStepProps} from '@hooks/useSubStep/types';
-import useThemeStyles from '@hooks/useThemeStyles';
-import {getFieldRequiredErrors, isRequiredFulfilled} from '@libs/ValidationUtils';
-import requiresDocusignStep from '@pages/ReimbursementAccount/NonUSD/utils/requiresDocusignStep';
-import getSubStepValues from '@pages/ReimbursementAccount/utils/getSubStepValues';
-import ONYXKEYS from '@src/ONYXKEYS';
-import INPUT_IDS from '@src/types/form/ReimbursementAccountForm';
-
-const {AUTHORIZED_TO_BIND_CLIENT_TO_AGREEMENT, PROVIDE_TRUTHFUL_INFORMATION, AGREE_TO_TERMS_AND_CONDITIONS, CONSENT_TO_PRIVACY_NOTICE} = INPUT_IDS.ADDITIONAL_DATA.CORPAY;
-const STEP_FIELDS = [AUTHORIZED_TO_BIND_CLIENT_TO_AGREEMENT, PROVIDE_TRUTHFUL_INFORMATION, AGREE_TO_TERMS_AND_CONDITIONS, CONSENT_TO_PRIVACY_NOTICE];
-
-function IsAuthorizedToUseBankAccountLabel() {
-    const {translate} = useLocalize();
-    return <Text>{translate('agreementsStep.iAmAuthorized')}</Text>;
-}
-
-function CertifyTrueAndAccurateLabel() {
-    const {translate} = useLocalize();
-    return <Text>{translate('agreementsStep.iCertify')}</Text>;
-}
-
-function TermsAndConditionsLabel() {
-    const {translate} = useLocalize();
-    return (
-        <Text>
-            {translate('common.iAcceptThe')}
-            <TextLink href="https://cross-border.corpay.com/tc/">{`${translate('agreementsStep.termsAndConditions')}`}</TextLink>.
-        </Text>
-    );
-}
-
-function ConsentToPrivacyNoticeLabel() {
-    const {translate} = useLocalize();
-    return (
-        <Text>
-            {translate('agreementsStep.iConsentToThe')} <TextLink href="https://payments.corpay.com/compliance">{`${translate('agreementsStep.privacyNotice')}`}</TextLink>.
-        </Text>
-    );
-}
-
-const INPUT_KEYS = {
-    PROVIDE_TRUTHFUL_INFORMATION: INPUT_IDS.ADDITIONAL_DATA.CORPAY.PROVIDE_TRUTHFUL_INFORMATION,
-    AGREE_TO_TERMS_AND_CONDITIONS: INPUT_IDS.ADDITIONAL_DATA.CORPAY.AGREE_TO_TERMS_AND_CONDITIONS,
-    CONSENT_TO_PRIVACY_NOTICE: INPUT_IDS.ADDITIONAL_DATA.CORPAY.CONSENT_TO_PRIVACY_NOTICE,
-    AUTHORIZED_TO_BIND_CLIENT_TO_AGREEMENT: INPUT_IDS.ADDITIONAL_DATA.CORPAY.AUTHORIZED_TO_BIND_CLIENT_TO_AGREEMENT,
-};
-
-type ConfirmationProps = SubStepProps & {
-    policyCurrency: string | undefined;
-};
-
-function Confirmation({onNext, policyCurrency}: ConfirmationProps) {
-    const {translate} = useLocalize();
-    const styles = useThemeStyles();
-
-    const [reimbursementAccount] = useOnyx(ONYXKEYS.REIMBURSEMENT_ACCOUNT, {canBeMissing: false});
-    const [reimbursementAccountDraft] = useOnyx(ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM_DRAFT, {canBeMissing: false});
-    const agreementsStepValues = useMemo(() => getSubStepValues(INPUT_KEYS, reimbursementAccountDraft, reimbursementAccount), [reimbursementAccount, reimbursementAccountDraft]);
-    const isDocusignStepRequired = requiresDocusignStep(policyCurrency);
-
-    const validate = useCallback(
-        (values: FormOnyxValues<typeof ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM>): FormInputErrors<typeof ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM> => {
-            const errors = getFieldRequiredErrors(values, STEP_FIELDS);
-
-            if (!isRequiredFulfilled(values[AUTHORIZED_TO_BIND_CLIENT_TO_AGREEMENT])) {
-                errors[AUTHORIZED_TO_BIND_CLIENT_TO_AGREEMENT] = translate('agreementsStep.error.authorized');
-            }
-
-            if (!isRequiredFulfilled(values[PROVIDE_TRUTHFUL_INFORMATION])) {
-                errors[PROVIDE_TRUTHFUL_INFORMATION] = translate('agreementsStep.error.certify');
-            }
-
-            if (!isRequiredFulfilled(values[AGREE_TO_TERMS_AND_CONDITIONS])) {
-                errors[AGREE_TO_TERMS_AND_CONDITIONS] = translate('common.error.acceptTerms');
-            }
-
-            if (!isRequiredFulfilled(values[CONSENT_TO_PRIVACY_NOTICE])) {
-                errors[CONSENT_TO_PRIVACY_NOTICE] = translate('agreementsStep.error.consent');
-            }
-
-            return errors;
-        },
-        [translate],
-    );
-
-    return (
-        <FormProvider
-            formID={ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM}
-            onSubmit={onNext}
-            validate={validate}
-            submitButtonText={isDocusignStepRequired ? translate('common.confirm') : translate('agreementsStep.accept')}
-            style={[styles.mh5, styles.flexGrow1]}
-        >
-            <Text style={[styles.textHeadlineLineHeightXXL]}>{translate('agreementsStep.pleaseConfirm')}</Text>
-            {!isDocusignStepRequired && <Text style={[styles.pv3, styles.textSupporting]}>{translate('agreementsStep.regulationRequiresUs')}</Text>}
-            <InputWrapper
-                InputComponent={CheckboxWithLabel}
-                accessibilityLabel={translate('agreementsStep.iAmAuthorized')}
-                inputID={AUTHORIZED_TO_BIND_CLIENT_TO_AGREEMENT}
-                style={styles.mt6}
-                LabelComponent={IsAuthorizedToUseBankAccountLabel}
-                defaultValue={agreementsStepValues[AUTHORIZED_TO_BIND_CLIENT_TO_AGREEMENT]}
-                shouldSaveDraft
-            />
-            <InputWrapper
-                InputComponent={CheckboxWithLabel}
-                accessibilityLabel={translate('agreementsStep.iCertify')}
-                inputID={PROVIDE_TRUTHFUL_INFORMATION}
-                style={styles.mt6}
-                LabelComponent={CertifyTrueAndAccurateLabel}
-                defaultValue={agreementsStepValues[PROVIDE_TRUTHFUL_INFORMATION]}
-                shouldSaveDraft
-            />
-            <InputWrapper
-                InputComponent={CheckboxWithLabel}
-                accessibilityLabel={`${translate('common.iAcceptThe')} ${translate('agreementsStep.termsAndConditions')}.`}
-                inputID={AGREE_TO_TERMS_AND_CONDITIONS}
-                style={styles.mt6}
-                LabelComponent={TermsAndConditionsLabel}
-                defaultValue={agreementsStepValues[AGREE_TO_TERMS_AND_CONDITIONS]}
-                shouldSaveDraft
-            />
-            <InputWrapper
-                InputComponent={CheckboxWithLabel}
-                accessibilityLabel={`${translate('agreementsStep.iConsentToThe')} ${translate('agreementsStep.privacyNotice')}.`}
-                inputID={CONSENT_TO_PRIVACY_NOTICE}
-                style={styles.mt6}
-                LabelComponent={ConsentToPrivacyNoticeLabel}
-                defaultValue={agreementsStepValues[CONSENT_TO_PRIVACY_NOTICE]}
-                shouldSaveDraft
-            />
-        </FormProvider>
-    );
-}
-
-Confirmation.displayName = 'Confirmation';
-
-export default Confirmation;
diff --git a/src/pages/ReimbursementAccount/NonUSD/Docusign/Docusign.tsx b/src/pages/ReimbursementAccount/NonUSD/Docusign/index.tsx
similarity index 66%
rename from src/pages/ReimbursementAccount/NonUSD/Docusign/Docusign.tsx
rename to src/pages/ReimbursementAccount/NonUSD/Docusign/index.tsx
index 81f8beff94d2..2bc33749d50b 100644
--- a/src/pages/ReimbursementAccount/NonUSD/Docusign/Docusign.tsx
+++ b/src/pages/ReimbursementAccount/NonUSD/Docusign/index.tsx
@@ -1,17 +1,12 @@
-import type {ComponentType} from 'react';
 import React, {useEffect, useMemo} from 'react';
-import InteractiveStepWrapper from '@components/InteractiveStepWrapper';
-import useLocalize from '@hooks/useLocalize';
+import DocusignFullStep from '@components/SubStepForms/DocusignFullStep';
 import useOnyx from '@hooks/useOnyx';
-import useSubStep from '@hooks/useSubStep';
-import type {SubStepProps} from '@hooks/useSubStep/types';
 import getSubStepValues from '@pages/ReimbursementAccount/utils/getSubStepValues';
 import {clearReimbursementAccountFinishCorpayBankAccountOnboarding, finishCorpayBankAccountOnboarding} from '@userActions/BankAccounts';
 import {clearErrors} from '@userActions/FormActions';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import INPUT_IDS from '@src/types/form/ReimbursementAccountForm';
-import UploadPowerform from './subSteps/UploadPowerform';
 
 type DocusignProps = {
     /** Handles back button press */
@@ -20,19 +15,12 @@ type DocusignProps = {
     /** Handles submit button press */
     onSubmit: () => void;
 
-    /** ID of current policy */
-    policyID: string | undefined;
-
     /** Array of step names */
     stepNames?: readonly string[];
-};
-
-type DocusignStepProps = {
-    /** ID of current policy */
-    policyID: string | undefined;
-} & SubStepProps;
 
-const bodyContent: Array<ComponentType<DocusignStepProps>> = [UploadPowerform];
+    /** Currency of the policy */
+    policyCurrency: string;
+};
 
 const INPUT_KEYS = {
     PROVIDE_TRUTHFUL_INFORMATION: INPUT_IDS.ADDITIONAL_DATA.CORPAY.PROVIDE_TRUTHFUL_INFORMATION,
@@ -42,9 +30,7 @@ const INPUT_KEYS = {
     ACH_AUTHORIZATION_FORM: INPUT_IDS.ADDITIONAL_DATA.CORPAY.ACH_AUTHORIZATION_FORM,
 };
 
-function Docusign({onBackButtonPress, onSubmit, policyID, stepNames}: DocusignProps) {
-    const {translate} = useLocalize();
-
+function Docusign({onBackButtonPress, onSubmit, stepNames, policyCurrency}: DocusignProps) {
     const [reimbursementAccount] = useOnyx(ONYXKEYS.REIMBURSEMENT_ACCOUNT, {canBeMissing: false});
     const [reimbursementAccountDraft] = useOnyx(ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM_DRAFT, {canBeMissing: false});
     const finalStepValues = useMemo(() => getSubStepValues(INPUT_KEYS, reimbursementAccountDraft, reimbursementAccount), [reimbursementAccount, reimbursementAccountDraft]);
@@ -79,45 +65,23 @@ function Docusign({onBackButtonPress, onSubmit, policyID, stepNames}: DocusignPr
         };
     }, [reimbursementAccount, onSubmit]);
 
-    const {
-        componentToRender: SubStep,
-        isEditing,
-        screenIndex,
-        nextScreen,
-        prevScreen,
-        moveTo,
-        goToTheLastStep,
-    } = useSubStep<DocusignStepProps>({bodyContent, startFrom: 0, onFinished: submit});
-
     const handleBackButtonPress = () => {
         clearErrors(ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM);
-        if (isEditing) {
-            goToTheLastStep();
-            return;
-        }
-
-        if (screenIndex === 0) {
-            onBackButtonPress();
-        } else {
-            prevScreen();
-        }
+        onBackButtonPress();
     };
 
     return (
-        <InteractiveStepWrapper
-            wrapperID={Docusign.displayName}
-            handleBackButtonPress={handleBackButtonPress}
-            headerTitle={translate('docusignStep.subheader')}
-            stepNames={stepNames}
+        <DocusignFullStep
+            defaultValue={finalStepValues.achAuthorizationForm}
+            formID={ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM}
+            inputID={INPUT_KEYS.ACH_AUTHORIZATION_FORM}
+            isLoading={reimbursementAccount?.isFinishingCorpayBankAccountOnboarding ?? false}
+            onBackButtonPress={handleBackButtonPress}
+            onSubmit={submit}
+            policyCurrency={policyCurrency}
             startStepIndex={6}
-        >
-            <SubStep
-                isEditing={isEditing}
-                onNext={nextScreen}
-                onMove={moveTo}
-                policyID={policyID}
-            />
-        </InteractiveStepWrapper>
+            stepNames={stepNames}
+        />
     );
 }
 
diff --git a/src/pages/ReimbursementAccount/NonUSD/Docusign/subSteps/UploadPowerform.tsx b/src/pages/ReimbursementAccount/NonUSD/Docusign/subSteps/UploadPowerform.tsx
deleted file mode 100644
index f2905f5c3213..000000000000
--- a/src/pages/ReimbursementAccount/NonUSD/Docusign/subSteps/UploadPowerform.tsx
+++ /dev/null
@@ -1,124 +0,0 @@
-import React, {useCallback, useState} from 'react';
-import Button from '@components/Button';
-import FormProvider from '@components/Form/FormProvider';
-import InputWrapper from '@components/Form/InputWrapper';
-import type {FormInputErrors, FormOnyxValues} from '@components/Form/types';
-import Text from '@components/Text';
-import UploadFile from '@components/UploadFile';
-import useEnvironment from '@hooks/useEnvironment';
-import useLocalize from '@hooks/useLocalize';
-import useOnyx from '@hooks/useOnyx';
-import useReimbursementAccountStepFormSubmit from '@hooks/useReimbursementAccountStepFormSubmit';
-import type {SubStepProps} from '@hooks/useSubStep/types';
-import useThemeStyles from '@hooks/useThemeStyles';
-import {getFieldRequiredErrors} from '@libs/ValidationUtils';
-import type {FileObject} from '@pages/media/AttachmentModalScreen/types';
-import {clearErrorFields, setDraftValues, setErrorFields} from '@userActions/FormActions';
-import {openLink} from '@userActions/Link';
-import CONST from '@src/CONST';
-import ONYXKEYS from '@src/ONYXKEYS';
-import INPUT_IDS from '@src/types/form/ReimbursementAccountForm';
-
-type UploadPowerformProps = SubStepProps;
-
-const {ACH_AUTHORIZATION_FORM} = INPUT_IDS.ADDITIONAL_DATA.CORPAY;
-const STEP_FIELDS = [ACH_AUTHORIZATION_FORM];
-
-function UploadPowerform({onNext, isEditing}: UploadPowerformProps) {
-    const {translate} = useLocalize();
-    const styles = useThemeStyles();
-    const {environmentURL} = useEnvironment();
-
-    const [reimbursementAccount] = useOnyx(ONYXKEYS.REIMBURSEMENT_ACCOUNT, {canBeMissing: false});
-    const [reimbursementAccountDraft] = useOnyx(ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM_DRAFT, {canBeMissing: false});
-    const countryStepCountryValue = reimbursementAccount?.achData?.[INPUT_IDS.ADDITIONAL_DATA.COUNTRY] ?? '';
-
-    const defaultValue: FileObject[] = Array.isArray(reimbursementAccountDraft?.[ACH_AUTHORIZATION_FORM]) ? (reimbursementAccountDraft?.[ACH_AUTHORIZATION_FORM] ?? []) : [];
-
-    const [uploadedFiles, setUploadedFiles] = useState<FileObject[]>(defaultValue);
-
-    const validate = useCallback((values: FormOnyxValues<typeof ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM>): FormInputErrors<typeof ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM> => {
-        return getFieldRequiredErrors(values, STEP_FIELDS);
-    }, []);
-
-    const handleSubmit = useReimbursementAccountStepFormSubmit({
-        fieldIds: STEP_FIELDS,
-        onNext,
-        shouldSaveDraft: isEditing,
-    });
-
-    const handleSelectFile = (files: FileObject[]) => {
-        setDraftValues(ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM, {[ACH_AUTHORIZATION_FORM]: [...uploadedFiles, ...files]});
-        setUploadedFiles((prev) => [...prev, ...files]);
-    };
-
-    const handleRemoveFile = (fileName: string) => {
-        const newUploadedFiles = uploadedFiles.filter((file) => file.name !== fileName);
-        setDraftValues(ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM, {[ACH_AUTHORIZATION_FORM]: newUploadedFiles});
-        setUploadedFiles(newUploadedFiles);
-    };
-
-    const setUploadError = (error: string) => {
-        if (!error) {
-            clearErrorFields(ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM);
-            return;
-        }
-
-        setErrorFields(ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM, {[ACH_AUTHORIZATION_FORM]: {onUpload: error}});
-    };
-
-    return (
-        <FormProvider
-            formID={ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM}
-            submitButtonText={translate('common.submit')}
-            onSubmit={handleSubmit}
-            validate={validate}
-            style={[styles.mh5, styles.flexGrow1]}
-            submitButtonStyles={[styles.mb0]}
-            enabledWhenOffline={false}
-            isLoading={reimbursementAccount?.isFinishingCorpayBankAccountOnboarding}
-        >
-            {countryStepCountryValue === CONST.COUNTRY.CA && <Text style={[styles.textHeadlineLineHeightXXL, styles.mb10]}>{translate('docusignStep.pleaseComplete')}</Text>}
-            {countryStepCountryValue === CONST.COUNTRY.AU && (
-                <>
-                    <Text style={[styles.textHeadlineLineHeightXXL, styles.mb3]}>{translate('docusignStep.pleaseCompleteTheBusinessAccount')}</Text>
-                    <Text style={[styles.textSupporting, styles.mb10]}>{translate('docusignStep.pleaseCompleteTheDirect')}</Text>
-                </>
-            )}
-            <Button
-                success
-                large
-                style={[styles.w100, styles.mb15]}
-                onPress={() => {
-                    openLink(CONST.DOCUSIGN_POWERFORM_LINK[countryStepCountryValue as 'CA' | 'AU'], environmentURL);
-                }}
-                text={translate('docusignStep.takeMeTo')}
-            />
-            {countryStepCountryValue === CONST.COUNTRY.CA && <Text style={[styles.textHeadlineLineHeightXXL, styles.mb5]}>{translate('docusignStep.uploadAdditional')}</Text>}
-            {countryStepCountryValue === CONST.COUNTRY.AU && <Text style={[styles.textHeadlineLineHeightXXL, styles.mb5]}>{translate('docusignStep.pleaseUploadTheDirect')}</Text>}
-            <Text style={[styles.textHeadlineH2, styles.colorMuted, styles.mb10]}>{translate('docusignStep.pleaseUpload')}</Text>
-            <InputWrapper
-                InputComponent={UploadFile}
-                buttonText={translate('common.chooseFile')}
-                uploadedFiles={uploadedFiles}
-                onUpload={(files) => {
-                    handleSelectFile(files);
-                }}
-                onRemove={(fileName) => {
-                    handleRemoveFile(fileName);
-                }}
-                acceptedFileTypes={[...CONST.NON_USD_BANK_ACCOUNT.ALLOWED_FILE_TYPES]}
-                value={uploadedFiles}
-                inputID={ACH_AUTHORIZATION_FORM}
-                setError={(error) => {
-                    setUploadError(error);
-                }}
-                fileLimit={1}
-            />
-        </FormProvider>
-    );
-}
-
-UploadPowerform.displayName = 'UploadPowerform';
-
-export default UploadPowerform;
diff --git a/src/pages/ReimbursementAccount/NonUSD/NonUSDVerifiedBankAccountFlow.tsx b/src/pages/ReimbursementAccount/NonUSD/NonUSDVerifiedBankAccountFlow.tsx
index 8d9d5a7da80a..214912fb9f74 100644
--- a/src/pages/ReimbursementAccount/NonUSD/NonUSDVerifiedBankAccountFlow.tsx
+++ b/src/pages/ReimbursementAccount/NonUSD/NonUSDVerifiedBankAccountFlow.tsx
@@ -7,7 +7,7 @@ import BankInfo from './BankInfo/BankInfo';
 import BeneficialOwnerInfo from './BeneficialOwnerInfo/BeneficialOwnerInfo';
 import BusinessInfo from './BusinessInfo/BusinessInfo';
 import Country from './Country/Country';
-import Docusign from './Docusign/Docusign';
+import Docusign from './Docusign';
 import Finish from './Finish';
 import SignerInfo from './SignerInfo';
 import requiresDocusignStep from './utils/requiresDocusignStep';
@@ -18,7 +18,7 @@ type NonUSDVerifiedBankAccountFlowProps = {
     setShouldShowContinueSetupButton: (shouldShowConnectedVerifiedBankAccount: boolean) => void;
     policyID: string | undefined;
     shouldShowContinueSetupButtonValue: boolean;
-    policyCurrency: string | undefined;
+    policyCurrency: string;
 };
 
 function NonUSDVerifiedBankAccountFlow({
@@ -142,8 +142,8 @@ function NonUSDVerifiedBankAccountFlow({
                 <Agreements
                     onBackButtonPress={nonUSDBankAccountsGoBack}
                     onSubmit={handleNextNonUSDBankAccountStep}
-                    stepNames={stepNames}
                     policyCurrency={policyCurrency}
+                    stepNames={stepNames}
                 />
             );
         case CONST.NON_USD_BANK_ACCOUNT.STEP.DOCUSIGN:
@@ -151,7 +151,7 @@ function NonUSDVerifiedBankAccountFlow({
                 <Docusign
                     onBackButtonPress={nonUSDBankAccountsGoBack}
                     onSubmit={handleNextNonUSDBankAccountStep}
-                    policyID={policyID}
+                    policyCurrency={policyCurrency}
                     stepNames={stepNames}
                 />
             );
diff --git a/src/pages/ReimbursementAccount/utils/getSubStepValues.ts b/src/pages/ReimbursementAccount/utils/getSubStepValues.ts
index 2a73546075c9..5a63df414bdc 100644
--- a/src/pages/ReimbursementAccount/utils/getSubStepValues.ts
+++ b/src/pages/ReimbursementAccount/utils/getSubStepValues.ts
@@ -16,7 +16,7 @@ function getSubStepValues<TProps extends keyof ReimbursementAccountForm>(
         acc[value] = (reimbursementAccountDraft?.[value] ??
             reimbursementAccount?.achData?.[value as keyof ACHData] ??
             reimbursementAccount?.achData?.corpay?.[value as keyof Corpay] ??
-            '') as ReimbursementAccountForm[TProps];
+            (value === 'achAuthorizationForm' ? [] : '')) as ReimbursementAccountForm[TProps];
         return acc;
     }, {} as SubStepValues<TProps>);
 }
diff --git a/src/pages/settings/Wallet/EnableGlobalReimbursements/Agreements/index.tsx b/src/pages/settings/Wallet/EnableGlobalReimbursements/Agreements/index.tsx
index 5c45b58ee85d..afb2c227f7b2 100644
--- a/src/pages/settings/Wallet/EnableGlobalReimbursements/Agreements/index.tsx
+++ b/src/pages/settings/Wallet/EnableGlobalReimbursements/Agreements/index.tsx
@@ -1,5 +1,6 @@
 import React from 'react';
 import AgreementsFullStep from '@components/SubStepForms/AgreementsFullStep';
+import useOnyx from '@hooks/useOnyx';
 import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import INPUT_IDS from '@src/types/form/EnableGlobalReimbursementsForm';
@@ -23,8 +24,17 @@ const inputIDs = {
 };
 
 function Agreements({onBackButtonPress, onSubmit, policyCurrency}: AgreementsProps) {
+    const [enableGlobalReimbursementsDraft] = useOnyx(ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS_DRAFT, {canBeMissing: true});
+    const defaultValues: Record<keyof typeof inputIDs, boolean> = Object.fromEntries(
+        Object.keys(inputIDs).map((key) => {
+            const typedKey = key as keyof typeof inputIDs;
+            return [typedKey, enableGlobalReimbursementsDraft?.[typedKey] ?? false];
+        }),
+    ) as Record<keyof typeof inputIDs, boolean>;
+
     return (
         <AgreementsFullStep
+            defaultValues={defaultValues}
             formID={ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS}
             inputIDs={inputIDs}
             onBackButtonPress={onBackButtonPress}
diff --git a/src/pages/settings/Wallet/WalletPage/WalletPage.tsx b/src/pages/settings/Wallet/WalletPage/WalletPage.tsx
index f3314e80d624..e103b01ae0d6 100644
--- a/src/pages/settings/Wallet/WalletPage/WalletPage.tsx
+++ b/src/pages/settings/Wallet/WalletPage/WalletPage.tsx
@@ -377,6 +377,9 @@ function WalletPage({shouldListenForResize = false}: WalletPageProps) {
         !isCurrentPaymentMethodDefault() &&
         !(paymentMethod.formattedSelectedPaymentMethod.type === CONST.PAYMENT_METHODS.PERSONAL_BANK_ACCOUNT && paymentMethod.selectedPaymentMethod.type === CONST.BANK_ACCOUNT.TYPE.BUSINESS);
 
+    const shouldShowEnableGlobalReimbursementsButton =
+        paymentMethod.selectedPaymentMethod.type === CONST.BANK_ACCOUNT.TYPE.BUSINESS && !paymentMethod.selectedPaymentMethod?.corpay?.achAuthorizationForm;
+
     // Determines whether or not the modal popup is mounted from the bottom of the screen instead of the side mount on Web or Desktop screens
     const isPopoverBottomMount = anchorPosition.anchorPositionTop === 0 || shouldUseNarrowLayout;
     const alertTextStyle = [styles.inlineSystemMessage, styles.flexShrink1];
@@ -684,26 +687,28 @@ function WalletPage({shouldListenForResize = false}: WalletPageProps) {
                                 }}
                                 wrapperStyle={[styles.pv3, styles.ph5, !shouldUseNarrowLayout ? styles.sidebarPopover : {}]}
                             />
-                            <MenuItem
-                                title={translate('common.enableGlobalReimbursements')}
-                                icon={Expensicons.Globe}
-                                onPress={() => {
-                                    if (isActingAsDelegate) {
-                                        closeModal(() => {
-                                            showDelegateNoAccessModal();
-                                        });
-                                        return;
-                                    }
-                                    if (isAccountLocked) {
-                                        closeModal(() => showLockedAccountModal());
-                                        return;
-                                    }
-                                    closeModal(() =>
-                                        Navigation.navigate(ROUTES.SETTINGS_WALLET_ENABLE_GLOBAL_REIMBURSEMENTS.getRoute(paymentMethod.selectedPaymentMethod.additionalData?.policyID)),
-                                    );
-                                }}
-                                wrapperStyle={[styles.pv3, styles.ph5, !shouldUseNarrowLayout ? styles.sidebarPopover : {}]}
-                            />
+                            {shouldShowEnableGlobalReimbursementsButton && (
+                                <MenuItem
+                                    title={translate('common.enableGlobalReimbursements')}
+                                    icon={Expensicons.Globe}
+                                    onPress={() => {
+                                        if (isActingAsDelegate) {
+                                            closeModal(() => {
+                                                showDelegateNoAccessModal();
+                                            });
+                                            return;
+                                        }
+                                        if (isAccountLocked) {
+                                            closeModal(() => showLockedAccountModal());
+                                            return;
+                                        }
+                                        closeModal(() =>
+                                            Navigation.navigate(ROUTES.SETTINGS_WALLET_ENABLE_GLOBAL_REIMBURSEMENTS.getRoute(paymentMethod.selectedPaymentMethod.additionalData?.policyID)),
+                                        );
+                                    }}
+                                    wrapperStyle={[styles.pv3, styles.ph5, !shouldUseNarrowLayout ? styles.sidebarPopover : {}]}
+                                />
+                            )}
                         </View>
                     )}
                 </Popover>
diff --git a/src/types/onyx/AccountData.ts b/src/types/onyx/AccountData.ts
index 6bb69cd78dc4..7cb835175979 100644
--- a/src/types/onyx/AccountData.ts
+++ b/src/types/onyx/AccountData.ts
@@ -1,5 +1,6 @@
 import type {BankAccountAdditionalData} from './BankAccount';
 import type * as OnyxCommon from './OnyxCommon';
+import type {Corpay} from './ReimbursementAccount';
 
 /** Model of bank account data */
 type AccountData = {
@@ -50,6 +51,9 @@ type AccountData = {
 
     /** The debit card ID */
     fundID?: number;
+
+    /** Corpay fields */
+    corpay?: Corpay;
 };
 
 export default AccountData;

From 15387454e7d870e5a733303a4d7b985e36aba73a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20Muzyk?= <mimuzyk@gmail.com>
Date: Thu, 31 Jul 2025 12:35:36 +0200
Subject: [PATCH 04/18] fix: minor type fxies

---
 Mobile-Expensify                                           | 2 +-
 .../DocusignFullStep/subSteps/UploadPowerform.tsx          | 2 +-
 src/pages/settings/Wallet/WalletPage/WalletPage.tsx        | 2 +-
 src/types/onyx/AccountData.ts                              | 4 ----
 src/types/onyx/BankAccount.ts                              | 7 +++++++
 5 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/Mobile-Expensify b/Mobile-Expensify
index 5f936ecbb44b..d5e3302c174b 160000
--- a/Mobile-Expensify
+++ b/Mobile-Expensify
@@ -1 +1 @@
-Subproject commit 5f936ecbb44bed64265bac764473d253cd17f83d
+Subproject commit d5e3302c174b87207aa2cde2f7b37f9be771e4d2
diff --git a/src/components/SubStepForms/DocusignFullStep/subSteps/UploadPowerform.tsx b/src/components/SubStepForms/DocusignFullStep/subSteps/UploadPowerform.tsx
index e25caa0a55ae..8950cd6ea562 100644
--- a/src/components/SubStepForms/DocusignFullStep/subSteps/UploadPowerform.tsx
+++ b/src/components/SubStepForms/DocusignFullStep/subSteps/UploadPowerform.tsx
@@ -9,9 +9,9 @@ import useEnvironment from '@hooks/useEnvironment';
 import useLocalize from '@hooks/useLocalize';
 import type {SubStepProps} from '@hooks/useSubStep/types';
 import useThemeStyles from '@hooks/useThemeStyles';
+import mapCurrencyToCountry from '@libs/mapCurrencyToCountry';
 import {getFieldRequiredErrors} from '@libs/ValidationUtils';
 import type {FileObject} from '@pages/media/AttachmentModalScreen/types';
-import mapCurrencyToCountry from '@pages/ReimbursementAccount/utils/mapCurrencyToCountry';
 import {clearErrorFields, setDraftValues, setErrorFields} from '@userActions/FormActions';
 import {openLink} from '@userActions/Link';
 import CONST from '@src/CONST';
diff --git a/src/pages/settings/Wallet/WalletPage/WalletPage.tsx b/src/pages/settings/Wallet/WalletPage/WalletPage.tsx
index a11f956140b4..9108c355bb02 100644
--- a/src/pages/settings/Wallet/WalletPage/WalletPage.tsx
+++ b/src/pages/settings/Wallet/WalletPage/WalletPage.tsx
@@ -378,7 +378,7 @@ function WalletPage({shouldListenForResize = false}: WalletPageProps) {
         !(paymentMethod.formattedSelectedPaymentMethod.type === CONST.PAYMENT_METHODS.PERSONAL_BANK_ACCOUNT && paymentMethod.selectedPaymentMethod.type === CONST.BANK_ACCOUNT.TYPE.BUSINESS);
 
     const shouldShowEnableGlobalReimbursementsButton =
-        paymentMethod.selectedPaymentMethod.type === CONST.BANK_ACCOUNT.TYPE.BUSINESS && !paymentMethod.selectedPaymentMethod?.corpay?.achAuthorizationForm;
+        paymentMethod.selectedPaymentMethod.type === CONST.BANK_ACCOUNT.TYPE.BUSINESS && !paymentMethod.selectedPaymentMethod?.additionalData?.corpay?.achAuthorizationForm;
 
     // Determines whether or not the modal popup is mounted from the bottom of the screen instead of the side mount on Web or Desktop screens
     const isPopoverBottomMount = anchorPosition.anchorPositionTop === 0 || shouldUseNarrowLayout;
diff --git a/src/types/onyx/AccountData.ts b/src/types/onyx/AccountData.ts
index 7cb835175979..6bb69cd78dc4 100644
--- a/src/types/onyx/AccountData.ts
+++ b/src/types/onyx/AccountData.ts
@@ -1,6 +1,5 @@
 import type {BankAccountAdditionalData} from './BankAccount';
 import type * as OnyxCommon from './OnyxCommon';
-import type {Corpay} from './ReimbursementAccount';
 
 /** Model of bank account data */
 type AccountData = {
@@ -51,9 +50,6 @@ type AccountData = {
 
     /** The debit card ID */
     fundID?: number;
-
-    /** Corpay fields */
-    corpay?: Corpay;
 };
 
 export default AccountData;
diff --git a/src/types/onyx/BankAccount.ts b/src/types/onyx/BankAccount.ts
index 0493cbe519e8..43008aff07ed 100644
--- a/src/types/onyx/BankAccount.ts
+++ b/src/types/onyx/BankAccount.ts
@@ -1,3 +1,4 @@
+import type {FileObject} from '@pages/media/AttachmentModalScreen/types';
 import type CONST from '@src/CONST';
 import type AccountData from './AccountData';
 import type {BankName} from './Bank';
@@ -31,6 +32,12 @@ type BankAccountAdditionalData = {
 
     /** ID of related policy */
     policyID?: string;
+
+    /** Corpay fields */
+    corpay?: {
+        /** Powerform files */
+        achAuthorizationForm?: FileObject[];
+    };
 };
 
 /** Model of bank account */

From 7f48ad39a79f6176337557d652c8092c69297564 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20Muzyk?= <mimuzyk@gmail.com>
Date: Tue, 12 Aug 2025 13:32:55 +0200
Subject: [PATCH 05/18] feat: Add one more step to enabling GRs for USD

---
 src/CONST/index.ts                            |   3 +-
 .../SubStepForms/PushRowFieldsStep.tsx        |  76 ++++++++++
 .../SubStepForms/RegistrationNumberStep.tsx   | 133 ++++++++++++++++++
 ...nableGlobalReimbursementsStepFormSubmit.ts |  27 ++++
 .../subSteps/AverageReimbursement.tsx         |  61 ++++----
 .../BusinessInfo/subSteps/BusinessType.tsx    |  77 +++++-----
 .../BusinessInfo/subSteps/PaymentVolume.tsx   |  59 ++++----
 .../subSteps/RegistrationNumber.tsx           |  80 ++---------
 .../Agreements/index.tsx                      |   2 +-
 .../BusinessInfo/index.tsx                    |  84 +++++++++++
 .../subSteps/AverageReimbursement.tsx         |  62 ++++++++
 .../BusinessInfo/subSteps/BusinessType.tsx    |  69 +++++++++
 .../BusinessInfo/subSteps/Confirmation.tsx    | 101 +++++++++++++
 .../BusinessInfo/subSteps/PaymentVolume.tsx   |  62 ++++++++
 .../subSteps/RegistrationNumber.tsx           |  40 ++++++
 .../Docusign/index.tsx                        |   2 +-
 .../EnableGlobalReimbursements/index.tsx      |  69 ++++++---
 .../form/EnableGlobalReimbursementsForm.ts    |  10 ++
 18 files changed, 822 insertions(+), 195 deletions(-)
 create mode 100644 src/components/SubStepForms/PushRowFieldsStep.tsx
 create mode 100644 src/components/SubStepForms/RegistrationNumberStep.tsx
 create mode 100644 src/hooks/useEnableGlobalReimbursementsStepFormSubmit.ts
 create mode 100644 src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/index.tsx
 create mode 100644 src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/AverageReimbursement.tsx
 create mode 100644 src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/BusinessType.tsx
 create mode 100644 src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/Confirmation.tsx
 create mode 100644 src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/PaymentVolume.tsx
 create mode 100644 src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/RegistrationNumber.tsx

diff --git a/src/CONST/index.ts b/src/CONST/index.ts
index 132319fb8d66..6cbd740e1d20 100755
--- a/src/CONST/index.ts
+++ b/src/CONST/index.ts
@@ -651,8 +651,9 @@ const CONST = {
         BANK_INFO_STEP_ACCOUNT_HOLDER_KEY_PREFIX: 'accountHolder',
     },
     ENABLE_GLOBAL_REIMBURSEMENTS: {
-        STEP_NAMES: ['1', '2'],
+        STEP_NAMES: ['1', '2', '3'],
         STEP: {
+            BUSINESS_INFO: 'BusinessInfoStep',
             AGREEMENTS: 'AgreementsStep',
             DOCUSIGN: 'DocusignStep',
         },
diff --git a/src/components/SubStepForms/PushRowFieldsStep.tsx b/src/components/SubStepForms/PushRowFieldsStep.tsx
new file mode 100644
index 000000000000..74098e1a1bab
--- /dev/null
+++ b/src/components/SubStepForms/PushRowFieldsStep.tsx
@@ -0,0 +1,76 @@
+import React, {useCallback} from 'react';
+import FormProvider from '@components/Form/FormProvider';
+import InputWrapper from '@components/Form/InputWrapper';
+import type {FormInputErrors, FormOnyxKeys, FormOnyxValues} from '@components/Form/types';
+import PushRowWithModal from '@components/PushRowWithModal';
+import Text from '@components/Text';
+import useLocalize from '@hooks/useLocalize';
+import type {SubStepProps} from '@hooks/useSubStep/types';
+import useThemeStyles from '@hooks/useThemeStyles';
+import {getFieldRequiredErrors} from '@libs/ValidationUtils';
+import type {OnyxFormValuesMapping} from '@src/ONYXKEYS';
+
+type PushRowField<TFormID extends keyof OnyxFormValuesMapping> = {
+    inputID: FormOnyxKeys<TFormID>;
+    defaultValue: string;
+    options: Record<string, string>;
+    description: string;
+    modalHeaderTitle: string;
+    searchInputTitle: string;
+};
+
+type PushRowFieldsStepProps<TFormID extends keyof OnyxFormValuesMapping> = SubStepProps & {
+    /** The ID of the form */
+    formID: TFormID;
+
+    /** Title of the form */
+    formTitle: string;
+
+    /** A function to call when the form is submitted */
+    onSubmit: (values: FormOnyxValues<TFormID>) => void;
+
+    pushRowFields: Array<PushRowField<TFormID>>;
+};
+
+function PushRowFieldsStep<TFormID extends keyof OnyxFormValuesMapping>({formID, formTitle, pushRowFields, onSubmit, isEditing}: PushRowFieldsStepProps<TFormID>) {
+    const {translate} = useLocalize();
+    const styles = useThemeStyles();
+    const pushRowFieldsIDs = pushRowFields.map((field) => field.inputID);
+
+    const validate = useCallback(
+        (values: FormOnyxValues<TFormID>): FormInputErrors<TFormID> => {
+            return getFieldRequiredErrors(values, pushRowFieldsIDs);
+        },
+        [pushRowFieldsIDs],
+    );
+
+    return (
+        <FormProvider
+            formID={formID}
+            submitButtonText={translate(isEditing ? 'common.confirm' : 'common.next')}
+            onSubmit={onSubmit}
+            style={[styles.flexGrow1]}
+            submitButtonStyles={[styles.mh5]}
+            validate={validate}
+        >
+            <Text style={[styles.textHeadlineLineHeightXXL, styles.mh5, styles.mb3]}>{formTitle}</Text>
+            {pushRowFields.map((pushRowField: PushRowField<TFormID>) => (
+                <InputWrapper
+                    key={pushRowField.inputID as string}
+                    InputComponent={PushRowWithModal}
+                    optionsList={pushRowField.options}
+                    description={pushRowField.description}
+                    modalHeaderTitle={pushRowField.modalHeaderTitle}
+                    searchInputTitle={pushRowField.searchInputTitle}
+                    inputID={pushRowField.inputID as string}
+                    shouldSaveDraft={!isEditing}
+                    defaultValue={pushRowField.defaultValue}
+                />
+            ))}
+        </FormProvider>
+    );
+}
+
+PushRowFieldsStep.displayName = 'PushRowFieldsStep';
+
+export default PushRowFieldsStep;
diff --git a/src/components/SubStepForms/RegistrationNumberStep.tsx b/src/components/SubStepForms/RegistrationNumberStep.tsx
new file mode 100644
index 000000000000..992e7f8dd50c
--- /dev/null
+++ b/src/components/SubStepForms/RegistrationNumberStep.tsx
@@ -0,0 +1,133 @@
+import {useFocusEffect} from '@react-navigation/native';
+import React, {useCallback, useRef} from 'react';
+import {View} from 'react-native';
+import FormProvider from '@components/Form/FormProvider';
+import InputWrapper from '@components/Form/InputWrapper';
+import type {FormInputErrors, FormOnyxKeys, FormOnyxValues} from '@components/Form/types';
+import Icon from '@components/Icon';
+import * as Expensicons from '@components/Icon/Expensicons';
+import type {AnimatedTextInputRef} from '@components/RNTextInput';
+import Text from '@components/Text';
+import TextInput from '@components/TextInput';
+import TextLink from '@components/TextLink';
+import useLocalize from '@hooks/useLocalize';
+import type {SubStepProps} from '@hooks/useSubStep/types';
+import useTheme from '@hooks/useTheme';
+import useThemeStyles from '@hooks/useThemeStyles';
+import {getFieldRequiredErrors, isValidRegistrationNumber} from '@libs/ValidationUtils';
+import CONST from '@src/CONST';
+import type {Country} from '@src/CONST';
+import type {OnyxFormValuesMapping} from '@src/ONYXKEYS';
+
+type RegistrationNumberStepProps<TFormID extends keyof OnyxFormValuesMapping> = SubStepProps & {
+    /** The ID of the form */
+    formID: TFormID;
+
+    /** A function to call when the form is submitted */
+    onSubmit: (values: FormOnyxValues<TFormID>) => void;
+
+    /** The ID of the form input */
+    inputID: FormOnyxKeys<TFormID>;
+
+    /** The default values for the input */
+    defaultValue: string;
+
+    /** Country of affiliated policy */
+    country: Country | '';
+
+    /** Whether to delay autoFocus to avoid conflicts with navigation animations */
+    shouldDelayAutoFocus?: boolean;
+};
+
+function RegistrationNumberStep<TFormID extends keyof OnyxFormValuesMapping>({
+    formID,
+    onSubmit,
+    inputID,
+    defaultValue,
+    isEditing,
+    country,
+    shouldDelayAutoFocus = false,
+}: RegistrationNumberStepProps<TFormID>) {
+    const {translate} = useLocalize();
+    const styles = useThemeStyles();
+    const theme = useTheme();
+
+    const internalInputRef = useRef<AnimatedTextInputRef>(null);
+    const focusTimeoutRef = useRef<NodeJS.Timeout | null>(null);
+
+    useFocusEffect(
+        useCallback(() => {
+            if (!shouldDelayAutoFocus) {
+                return;
+            }
+
+            focusTimeoutRef.current = setTimeout(() => {
+                internalInputRef.current?.focus();
+            }, CONST.ANIMATED_TRANSITION);
+
+            return () => {
+                if (!focusTimeoutRef.current) {
+                    return;
+                }
+                clearTimeout(focusTimeoutRef.current);
+            };
+        }, [shouldDelayAutoFocus]),
+    );
+
+    const validate = useCallback(
+        (values: FormOnyxValues<TFormID>): FormInputErrors<TFormID> => {
+            const errors = getFieldRequiredErrors(values, [inputID]);
+
+            if (values[inputID] && !isValidRegistrationNumber(values[inputID] as string, country)) {
+                errors[inputID] = translate('businessInfoStep.error.registrationNumber');
+            }
+
+            return errors;
+        },
+        [country, inputID, translate],
+    );
+    return (
+        <FormProvider
+            formID={formID}
+            submitButtonText={translate(isEditing ? 'common.confirm' : 'common.next')}
+            onSubmit={onSubmit}
+            validate={validate}
+            style={[styles.mh5, styles.flexGrow1]}
+            shouldHideFixErrorsAlert
+        >
+            <Text style={[styles.textHeadlineLineHeightXXL]}>{translate('businessInfoStep.whatsTheBusinessRegistrationNumber')}</Text>
+            <InputWrapper
+                InputComponent={TextInput}
+                label={translate('businessInfoStep.registrationNumber')}
+                aria-label={translate('businessInfoStep.registrationNumber')}
+                role={CONST.ROLE.PRESENTATION}
+                inputID={inputID as string}
+                containerStyles={[styles.mt6]}
+                defaultValue={defaultValue}
+                shouldSaveDraft={!isEditing}
+                autoFocus={!shouldDelayAutoFocus}
+                ref={internalInputRef}
+            />
+            <View style={[styles.flexRow, styles.alignItemsCenter, styles.mt6]}>
+                <Icon
+                    src={Expensicons.QuestionMark}
+                    width={12}
+                    height={12}
+                    fill={theme.icon}
+                />
+                <View style={[styles.ml2, styles.dFlex, styles.flexRow]}>
+                    <TextLink
+                        style={[styles.textMicro]}
+                        href={CONST.HELP_LINK_URL}
+                    >
+                        {translate('businessInfoStep.whatsThisNumber')}
+                    </TextLink>
+                </View>
+            </View>
+        </FormProvider>
+    );
+}
+
+RegistrationNumberStep.displayName = 'RegistrationNumberStep';
+
+export default RegistrationNumberStep;
diff --git a/src/hooks/useEnableGlobalReimbursementsStepFormSubmit.ts b/src/hooks/useEnableGlobalReimbursementsStepFormSubmit.ts
new file mode 100644
index 000000000000..3b5d89f0630a
--- /dev/null
+++ b/src/hooks/useEnableGlobalReimbursementsStepFormSubmit.ts
@@ -0,0 +1,27 @@
+import type {FormOnyxKeys} from '@components/Form/types';
+import type {OnyxFormKey} from '@src/ONYXKEYS';
+import ONYXKEYS from '@src/ONYXKEYS';
+import useStepFormSubmit from './useStepFormSubmit';
+import type {SubStepProps} from './useSubStep/types';
+
+type UseEnableGlobalReimbursementsStepFormSubmit = Pick<SubStepProps, 'onNext'> & {
+    formId?: OnyxFormKey;
+    fieldIds: Array<FormOnyxKeys<typeof ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS>>;
+    shouldSaveDraft: boolean;
+};
+
+/**
+ * Hook for handling submit method in EnterSignerInfo substeps.
+ * When user is in editing mode, we should save values only when user confirms the change
+ * @param onNext - callback
+ * @param fieldIds - field IDs for particular step
+ * @param shouldSaveDraft - if we should save draft values
+ */
+export default function useEnableGlobalReimbursementsStepFormSubmit({onNext, fieldIds, shouldSaveDraft}: UseEnableGlobalReimbursementsStepFormSubmit) {
+    return useStepFormSubmit<typeof ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS>({
+        formId: ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS,
+        onNext,
+        fieldIds,
+        shouldSaveDraft,
+    });
+}
diff --git a/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/AverageReimbursement.tsx b/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/AverageReimbursement.tsx
index fd9c3e8d1b04..005645e62a3d 100644
--- a/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/AverageReimbursement.tsx
+++ b/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/AverageReimbursement.tsx
@@ -1,15 +1,9 @@
-import React, {useCallback, useMemo} from 'react';
-import FormProvider from '@components/Form/FormProvider';
-import InputWrapper from '@components/Form/InputWrapper';
-import type {FormInputErrors, FormOnyxValues} from '@components/Form/types';
-import PushRowWithModal from '@components/PushRowWithModal';
-import Text from '@components/Text';
+import React, {useMemo} from 'react';
+import PushRowFieldsStep from '@components/SubStepForms/PushRowFieldsStep';
 import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
 import useReimbursementAccountStepFormSubmit from '@hooks/useReimbursementAccountStepFormSubmit';
 import type {SubStepProps} from '@hooks/useSubStep/types';
-import useThemeStyles from '@hooks/useThemeStyles';
-import {getFieldRequiredErrors} from '@libs/ValidationUtils';
 import getListOptionsFromCorpayPicklist from '@pages/ReimbursementAccount/NonUSD/utils/getListOptionsFromCorpayPicklist';
 import ONYXKEYS from '@src/ONYXKEYS';
 import INPUT_IDS from '@src/types/form/ReimbursementAccountForm';
@@ -19,9 +13,8 @@ type AverageReimbursementProps = SubStepProps;
 const {TRADE_VOLUME} = INPUT_IDS.ADDITIONAL_DATA.CORPAY;
 const STEP_FIELDS = [TRADE_VOLUME];
 
-function AverageReimbursement({onNext, isEditing}: AverageReimbursementProps) {
+function AverageReimbursement({onNext, onMove, isEditing}: AverageReimbursementProps) {
     const {translate} = useLocalize();
-    const styles = useThemeStyles();
     const [reimbursementAccount] = useOnyx(ONYXKEYS.REIMBURSEMENT_ACCOUNT, {canBeMissing: false});
     const [corpayOnboardingFields] = useOnyx(ONYXKEYS.CORPAY_ONBOARDING_FIELDS, {canBeMissing: false});
     const policyID = reimbursementAccount?.achData?.policyID;
@@ -30,11 +23,19 @@ function AverageReimbursement({onNext, isEditing}: AverageReimbursementProps) {
 
     const tradeVolumeRangeListOptions = useMemo(() => getListOptionsFromCorpayPicklist(corpayOnboardingFields?.picklists.TradeVolumeRange), [corpayOnboardingFields]);
 
-    const tradeVolumeDefaultValue = reimbursementAccount?.achData?.corpay?.[TRADE_VOLUME] ?? '';
-
-    const validate = useCallback((values: FormOnyxValues<typeof ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM>): FormInputErrors<typeof ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM> => {
-        return getFieldRequiredErrors(values, STEP_FIELDS);
-    }, []);
+    const pushRowFields = useMemo(
+        () => [
+            {
+                inputID: TRADE_VOLUME,
+                defaultValue: reimbursementAccount?.achData?.corpay?.[TRADE_VOLUME] ?? '',
+                options: tradeVolumeRangeListOptions,
+                description: translate('businessInfoStep.averageReimbursementAmountInCurrency', {currencyCode: currency}),
+                modalHeaderTitle: translate('businessInfoStep.selectAverageReimbursement'),
+                searchInputTitle: translate('businessInfoStep.findAverageReimbursement'),
+            },
+        ],
+        [reimbursementAccount, currency, tradeVolumeRangeListOptions, translate],
+    );
 
     const handleSubmit = useReimbursementAccountStepFormSubmit({
         fieldIds: STEP_FIELDS,
@@ -42,28 +43,20 @@ function AverageReimbursement({onNext, isEditing}: AverageReimbursementProps) {
         shouldSaveDraft: isEditing,
     });
 
+    if (corpayOnboardingFields === undefined) {
+        return null;
+    }
+
     return (
-        <FormProvider
+        <PushRowFieldsStep
+            isEditing={isEditing}
+            onNext={onNext}
+            onMove={onMove}
             formID={ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM}
-            submitButtonText={translate(isEditing ? 'common.confirm' : 'common.next')}
+            formTitle={translate('businessInfoStep.whatsYourExpectedAverageReimbursements')}
             onSubmit={handleSubmit}
-            validate={validate}
-            style={[styles.flexGrow1]}
-            submitButtonStyles={[styles.mh5]}
-            shouldHideFixErrorsAlert
-        >
-            <Text style={[styles.textHeadlineLineHeightXXL, styles.mh5, styles.mb3]}>{translate('businessInfoStep.whatsYourExpectedAverageReimbursements')}</Text>
-            <InputWrapper
-                InputComponent={PushRowWithModal}
-                optionsList={tradeVolumeRangeListOptions}
-                description={translate('businessInfoStep.averageReimbursementAmountInCurrency', {currencyCode: currency})}
-                modalHeaderTitle={translate('businessInfoStep.selectAverageReimbursement')}
-                searchInputTitle={translate('businessInfoStep.findAverageReimbursement')}
-                inputID={TRADE_VOLUME}
-                shouldSaveDraft={!isEditing}
-                defaultValue={tradeVolumeDefaultValue}
-            />
-        </FormProvider>
+            pushRowFields={pushRowFields}
+        />
     );
 }
 
diff --git a/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/BusinessType.tsx b/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/BusinessType.tsx
index f3f4f8328960..41d5b7c9b077 100644
--- a/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/BusinessType.tsx
+++ b/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/BusinessType.tsx
@@ -1,15 +1,9 @@
-import React, {useCallback, useMemo} from 'react';
-import FormProvider from '@components/Form/FormProvider';
-import InputWrapper from '@components/Form/InputWrapper';
-import type {FormInputErrors, FormOnyxValues} from '@components/Form/types';
-import PushRowWithModal from '@components/PushRowWithModal';
-import Text from '@components/Text';
+import React, {useMemo} from 'react';
+import PushRowFieldsStep from '@components/SubStepForms/PushRowFieldsStep';
 import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
 import useReimbursementAccountStepFormSubmit from '@hooks/useReimbursementAccountStepFormSubmit';
 import type {SubStepProps} from '@hooks/useSubStep/types';
-import useThemeStyles from '@hooks/useThemeStyles';
-import {getFieldRequiredErrors} from '@libs/ValidationUtils';
 import getListOptionsFromCorpayPicklist from '@pages/ReimbursementAccount/NonUSD/utils/getListOptionsFromCorpayPicklist';
 import ONYXKEYS from '@src/ONYXKEYS';
 import INPUT_IDS from '@src/types/form/ReimbursementAccountForm';
@@ -19,10 +13,8 @@ type BusinessTypeProps = SubStepProps;
 const {BUSINESS_CATEGORY, APPLICANT_TYPE_ID} = INPUT_IDS.ADDITIONAL_DATA.CORPAY;
 const STEP_FIELDS = [BUSINESS_CATEGORY, APPLICANT_TYPE_ID];
 
-function BusinessType({onNext, isEditing}: BusinessTypeProps) {
+function BusinessType({onNext, isEditing, onMove}: BusinessTypeProps) {
     const {translate} = useLocalize();
-    const styles = useThemeStyles();
-
     const [reimbursementAccount] = useOnyx(ONYXKEYS.REIMBURSEMENT_ACCOUNT, {canBeMissing: false});
     const [corpayOnboardingFields] = useOnyx(ONYXKEYS.CORPAY_ONBOARDING_FIELDS, {canBeMissing: false});
 
@@ -32,9 +24,27 @@ function BusinessType({onNext, isEditing}: BusinessTypeProps) {
     const incorporationTypeDefaultValue = reimbursementAccount?.achData?.corpay?.[APPLICANT_TYPE_ID] ?? '';
     const businessCategoryDefaultValue = reimbursementAccount?.achData?.corpay?.[BUSINESS_CATEGORY] ?? '';
 
-    const validate = useCallback((values: FormOnyxValues<typeof ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM>): FormInputErrors<typeof ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM> => {
-        return getFieldRequiredErrors(values, STEP_FIELDS);
-    }, []);
+    const pushRowFields = useMemo(
+        () => [
+            {
+                inputID: APPLICANT_TYPE_ID,
+                defaultValue: incorporationTypeDefaultValue,
+                options: incorporationTypeListOptions,
+                description: translate('businessInfoStep.incorporationTypeName'),
+                modalHeaderTitle: translate('businessInfoStep.selectIncorporationType'),
+                searchInputTitle: translate('businessInfoStep.findIncorporationType'),
+            },
+            {
+                inputID: BUSINESS_CATEGORY,
+                defaultValue: businessCategoryDefaultValue,
+                options: natureOfBusinessListOptions,
+                description: translate('businessInfoStep.businessCategory'),
+                modalHeaderTitle: translate('businessInfoStep.selectBusinessCategory'),
+                searchInputTitle: translate('businessInfoStep.findBusinessCategory'),
+            },
+        ],
+        [businessCategoryDefaultValue, incorporationTypeDefaultValue, incorporationTypeListOptions, natureOfBusinessListOptions, translate],
+    );
 
     const handleSubmit = useReimbursementAccountStepFormSubmit({
         fieldIds: STEP_FIELDS,
@@ -42,37 +52,20 @@ function BusinessType({onNext, isEditing}: BusinessTypeProps) {
         shouldSaveDraft: isEditing,
     });
 
+    if (corpayOnboardingFields === undefined) {
+        return null;
+    }
+
     return (
-        <FormProvider
+        <PushRowFieldsStep
+            isEditing={isEditing}
+            onNext={onNext}
+            onMove={onMove}
             formID={ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM}
-            submitButtonText={translate(isEditing ? 'common.confirm' : 'common.next')}
+            formTitle={translate('businessInfoStep.whatTypeOfBusinessIsIt')}
             onSubmit={handleSubmit}
-            style={[styles.flexGrow1]}
-            submitButtonStyles={[styles.mh5]}
-            validate={validate}
-        >
-            <Text style={[styles.textHeadlineLineHeightXXL, styles.mh5, styles.mb3]}>{translate('businessInfoStep.whatTypeOfBusinessIsIt')}</Text>
-            <InputWrapper
-                InputComponent={PushRowWithModal}
-                optionsList={incorporationTypeListOptions}
-                description={translate('businessInfoStep.incorporationTypeName')}
-                modalHeaderTitle={translate('businessInfoStep.selectIncorporationType')}
-                searchInputTitle={translate('businessInfoStep.findIncorporationType')}
-                inputID={APPLICANT_TYPE_ID}
-                shouldSaveDraft={!isEditing}
-                defaultValue={incorporationTypeDefaultValue}
-            />
-            <InputWrapper
-                InputComponent={PushRowWithModal}
-                optionsList={natureOfBusinessListOptions}
-                description={translate('businessInfoStep.businessCategory')}
-                modalHeaderTitle={translate('businessInfoStep.selectBusinessCategory')}
-                searchInputTitle={translate('businessInfoStep.findBusinessCategory')}
-                inputID={BUSINESS_CATEGORY}
-                shouldSaveDraft={!isEditing}
-                defaultValue={businessCategoryDefaultValue}
-            />
-        </FormProvider>
+            pushRowFields={pushRowFields}
+        />
     );
 }
 
diff --git a/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/PaymentVolume.tsx b/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/PaymentVolume.tsx
index c461a97502e5..cf7fe3654429 100644
--- a/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/PaymentVolume.tsx
+++ b/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/PaymentVolume.tsx
@@ -1,15 +1,9 @@
-import React, {useCallback, useMemo} from 'react';
-import FormProvider from '@components/Form/FormProvider';
-import InputWrapper from '@components/Form/InputWrapper';
-import type {FormInputErrors, FormOnyxValues} from '@components/Form/types';
-import PushRowWithModal from '@components/PushRowWithModal';
-import Text from '@components/Text';
+import React, {useMemo} from 'react';
+import PushRowFieldsStep from '@components/SubStepForms/PushRowFieldsStep';
 import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
 import useReimbursementAccountStepFormSubmit from '@hooks/useReimbursementAccountStepFormSubmit';
 import type {SubStepProps} from '@hooks/useSubStep/types';
-import useThemeStyles from '@hooks/useThemeStyles';
-import {getFieldRequiredErrors} from '@libs/ValidationUtils';
 import getListOptionsFromCorpayPicklist from '@pages/ReimbursementAccount/NonUSD/utils/getListOptionsFromCorpayPicklist';
 import ONYXKEYS from '@src/ONYXKEYS';
 import INPUT_IDS from '@src/types/form/ReimbursementAccountForm';
@@ -19,9 +13,8 @@ type PaymentVolumeProps = SubStepProps;
 const {ANNUAL_VOLUME} = INPUT_IDS.ADDITIONAL_DATA.CORPAY;
 const STEP_FIELDS = [ANNUAL_VOLUME];
 
-function PaymentVolume({onNext, isEditing}: PaymentVolumeProps) {
+function PaymentVolume({onNext, onMove, isEditing}: PaymentVolumeProps) {
     const {translate} = useLocalize();
-    const styles = useThemeStyles();
     const [reimbursementAccount] = useOnyx(ONYXKEYS.REIMBURSEMENT_ACCOUNT, {canBeMissing: false});
     const [corpayOnboardingFields] = useOnyx(ONYXKEYS.CORPAY_ONBOARDING_FIELDS, {canBeMissing: false});
     const policyID = reimbursementAccount?.achData?.policyID;
@@ -32,9 +25,19 @@ function PaymentVolume({onNext, isEditing}: PaymentVolumeProps) {
 
     const annualVolumeDefaultValue = reimbursementAccount?.achData?.corpay?.[ANNUAL_VOLUME] ?? '';
 
-    const validate = useCallback((values: FormOnyxValues<typeof ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM>): FormInputErrors<typeof ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM> => {
-        return getFieldRequiredErrors(values, STEP_FIELDS);
-    }, []);
+    const pushRowFields = useMemo(
+        () => [
+            {
+                inputID: ANNUAL_VOLUME,
+                defaultValue: annualVolumeDefaultValue,
+                options: annualVolumeRangeListOptions,
+                description: translate('businessInfoStep.annualPaymentVolumeInCurrency', {currencyCode: currency}),
+                modalHeaderTitle: translate('businessInfoStep.selectAnnualPaymentVolume'),
+                searchInputTitle: translate('businessInfoStep.findAnnualPaymentVolume'),
+            },
+        ],
+        [annualVolumeDefaultValue, annualVolumeRangeListOptions, translate, currency],
+    );
 
     const handleSubmit = useReimbursementAccountStepFormSubmit({
         fieldIds: STEP_FIELDS,
@@ -42,28 +45,20 @@ function PaymentVolume({onNext, isEditing}: PaymentVolumeProps) {
         shouldSaveDraft: isEditing,
     });
 
+    if (corpayOnboardingFields === undefined) {
+        return null;
+    }
+
     return (
-        <FormProvider
+        <PushRowFieldsStep
+            isEditing={isEditing}
+            onNext={onNext}
+            onMove={onMove}
             formID={ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM}
-            submitButtonText={translate(isEditing ? 'common.confirm' : 'common.next')}
+            formTitle={translate('businessInfoStep.whatsTheBusinessAnnualPayment')}
             onSubmit={handleSubmit}
-            validate={validate}
-            style={[styles.flexGrow1]}
-            submitButtonStyles={[styles.mh5]}
-            shouldHideFixErrorsAlert
-        >
-            <Text style={[styles.textHeadlineLineHeightXXL, styles.mh5, styles.mb3]}>{translate('businessInfoStep.whatsTheBusinessAnnualPayment')}</Text>
-            <InputWrapper
-                InputComponent={PushRowWithModal}
-                optionsList={annualVolumeRangeListOptions}
-                description={translate('businessInfoStep.annualPaymentVolumeInCurrency', {currencyCode: currency})}
-                modalHeaderTitle={translate('businessInfoStep.selectAnnualPaymentVolume')}
-                searchInputTitle={translate('businessInfoStep.findAnnualPaymentVolume')}
-                inputID={ANNUAL_VOLUME}
-                shouldSaveDraft={!isEditing}
-                defaultValue={annualVolumeDefaultValue}
-            />
-        </FormProvider>
+            pushRowFields={pushRowFields}
+        />
     );
 }
 
diff --git a/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/RegistrationNumber.tsx b/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/RegistrationNumber.tsx
index adf291c03fde..94f8205b5099 100644
--- a/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/RegistrationNumber.tsx
+++ b/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/RegistrationNumber.tsx
@@ -1,21 +1,8 @@
-import React, {useCallback} from 'react';
-import {View} from 'react-native';
-import FormProvider from '@components/Form/FormProvider';
-import InputWrapper from '@components/Form/InputWrapper';
-import type {FormInputErrors, FormOnyxValues} from '@components/Form/types';
-import Icon from '@components/Icon';
-import * as Expensicons from '@components/Icon/Expensicons';
-import Text from '@components/Text';
-import TextInput from '@components/TextInput';
-import TextLink from '@components/TextLink';
-import useLocalize from '@hooks/useLocalize';
+import React from 'react';
+import RegistrationNumberStep from '@components/SubStepForms/RegistrationNumberStep';
 import useOnyx from '@hooks/useOnyx';
 import useReimbursementAccountStepFormSubmit from '@hooks/useReimbursementAccountStepFormSubmit';
 import type {SubStepProps} from '@hooks/useSubStep/types';
-import useTheme from '@hooks/useTheme';
-import useThemeStyles from '@hooks/useThemeStyles';
-import {getFieldRequiredErrors, isValidRegistrationNumber} from '@libs/ValidationUtils';
-import CONST from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import INPUT_IDS from '@src/types/form/ReimbursementAccountForm';
 
@@ -24,29 +11,12 @@ type RegistrationNumberProps = SubStepProps;
 const {BUSINESS_REGISTRATION_INCORPORATION_NUMBER, COMPANY_COUNTRY_CODE} = INPUT_IDS.ADDITIONAL_DATA.CORPAY;
 const STEP_FIELDS = [BUSINESS_REGISTRATION_INCORPORATION_NUMBER];
 
-function RegistrationNumber({onNext, isEditing}: RegistrationNumberProps) {
-    const {translate} = useLocalize();
-    const styles = useThemeStyles();
-    const theme = useTheme();
-
+function RegistrationNumber({onNext, onMove, isEditing}: RegistrationNumberProps) {
     const [reimbursementAccount] = useOnyx(ONYXKEYS.REIMBURSEMENT_ACCOUNT);
     const [reimbursementAccountDraft] = useOnyx(ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM_DRAFT);
     const defaultValue = reimbursementAccount?.achData?.corpay?.[BUSINESS_REGISTRATION_INCORPORATION_NUMBER] ?? '';
     const businessStepCountryDraftValue = reimbursementAccount?.achData?.corpay?.[COMPANY_COUNTRY_CODE] ?? reimbursementAccountDraft?.[COMPANY_COUNTRY_CODE] ?? '';
 
-    const validate = useCallback(
-        (values: FormOnyxValues<typeof ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM>): FormInputErrors<typeof ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM> => {
-            const errors = getFieldRequiredErrors(values, STEP_FIELDS);
-
-            if (values[BUSINESS_REGISTRATION_INCORPORATION_NUMBER] && !isValidRegistrationNumber(values[BUSINESS_REGISTRATION_INCORPORATION_NUMBER], businessStepCountryDraftValue)) {
-                errors[BUSINESS_REGISTRATION_INCORPORATION_NUMBER] = translate('businessInfoStep.error.registrationNumber');
-            }
-
-            return errors;
-        },
-        [businessStepCountryDraftValue, translate],
-    );
-
     const handleSubmit = useReimbursementAccountStepFormSubmit({
         fieldIds: STEP_FIELDS,
         onNext,
@@ -54,43 +24,17 @@ function RegistrationNumber({onNext, isEditing}: RegistrationNumberProps) {
     });
 
     return (
-        <FormProvider
+        <RegistrationNumberStep
+            isEditing={isEditing}
+            onNext={onNext}
+            onMove={onMove}
             formID={ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM}
-            submitButtonText={translate(isEditing ? 'common.confirm' : 'common.next')}
             onSubmit={handleSubmit}
-            validate={validate}
-            style={[styles.mh5, styles.flexGrow1]}
-            shouldHideFixErrorsAlert
-        >
-            <Text style={[styles.textHeadlineLineHeightXXL]}>{translate('businessInfoStep.whatsTheBusinessRegistrationNumber')}</Text>
-            <InputWrapper
-                InputComponent={TextInput}
-                label={translate('businessInfoStep.registrationNumber')}
-                aria-label={translate('businessInfoStep.registrationNumber')}
-                role={CONST.ROLE.PRESENTATION}
-                inputID={BUSINESS_REGISTRATION_INCORPORATION_NUMBER}
-                containerStyles={[styles.mt6]}
-                defaultValue={defaultValue}
-                shouldSaveDraft={!isEditing}
-                autoFocus
-            />
-            <View style={[styles.flexRow, styles.alignItemsCenter, styles.mt6]}>
-                <Icon
-                    src={Expensicons.QuestionMark}
-                    width={12}
-                    height={12}
-                    fill={theme.icon}
-                />
-                <View style={[styles.ml2, styles.dFlex, styles.flexRow]}>
-                    <TextLink
-                        style={[styles.textMicro]}
-                        href={CONST.HELP_LINK_URL}
-                    >
-                        {translate('businessInfoStep.whatsThisNumber')}
-                    </TextLink>
-                </View>
-            </View>
-        </FormProvider>
+            inputID={BUSINESS_REGISTRATION_INCORPORATION_NUMBER}
+            defaultValue={defaultValue}
+            country={businessStepCountryDraftValue}
+            shouldDelayAutoFocus
+        />
     );
 }
 
diff --git a/src/pages/settings/Wallet/EnableGlobalReimbursements/Agreements/index.tsx b/src/pages/settings/Wallet/EnableGlobalReimbursements/Agreements/index.tsx
index afb2c227f7b2..08a5ef79ddb5 100644
--- a/src/pages/settings/Wallet/EnableGlobalReimbursements/Agreements/index.tsx
+++ b/src/pages/settings/Wallet/EnableGlobalReimbursements/Agreements/index.tsx
@@ -40,7 +40,7 @@ function Agreements({onBackButtonPress, onSubmit, policyCurrency}: AgreementsPro
             onBackButtonPress={onBackButtonPress}
             onSubmit={onSubmit}
             policyCurrency={policyCurrency}
-            startStepIndex={0}
+            startStepIndex={1}
             stepNames={CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP_NAMES}
         />
     );
diff --git a/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/index.tsx b/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/index.tsx
new file mode 100644
index 000000000000..4a8eefbd9e98
--- /dev/null
+++ b/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/index.tsx
@@ -0,0 +1,84 @@
+import type {ComponentType} from 'react';
+import React from 'react';
+import InteractiveStepWrapper from '@components/InteractiveStepWrapper';
+import useLocalize from '@hooks/useLocalize';
+import useSubStep from '@hooks/useSubStep';
+import type {SubStepProps} from '@hooks/useSubStep/types';
+import {clearErrors} from '@userActions/FormActions';
+import CONST from '@src/CONST';
+import type {Country} from '@src/CONST';
+import ONYXKEYS from '@src/ONYXKEYS';
+import AverageReimbursement from './subSteps/AverageReimbursement';
+import BusinessType from './subSteps/BusinessType';
+import Confirmation from './subSteps/Confirmation';
+import PaymentVolume from './subSteps/PaymentVolume';
+import RegistrationNumber from './subSteps/RegistrationNumber';
+
+type BusinessInfoProps = {
+    /** Handles back button press */
+    onBackButtonPress: () => void;
+
+    /** Handles submit button press */
+    onSubmit: () => void;
+
+    /** Currency of affiliated policy */
+    policyCurrency: string;
+
+    /** Country of affiliated policy */
+    country: Country | '';
+};
+
+type BusinessInfoSubStepProps = SubStepProps & {policyCurrency: string; country: Country | ''};
+
+const bodyContent: Array<ComponentType<BusinessInfoSubStepProps>> = [RegistrationNumber, BusinessType, PaymentVolume, AverageReimbursement, Confirmation];
+
+function BusinessInfo({onBackButtonPress, onSubmit, policyCurrency, country}: BusinessInfoProps) {
+    const {translate} = useLocalize();
+
+    const {
+        componentToRender: SubStep,
+        isEditing,
+        screenIndex,
+        nextScreen,
+        prevScreen,
+        moveTo,
+        goToTheLastStep,
+    } = useSubStep<BusinessInfoSubStepProps>({bodyContent, startFrom: 0, onFinished: onSubmit});
+
+    const handleBackButtonPress = () => {
+        clearErrors(ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS);
+        if (isEditing) {
+            goToTheLastStep();
+            return;
+        }
+
+        if (screenIndex === 0) {
+            onBackButtonPress();
+        } else {
+            prevScreen();
+        }
+    };
+
+    return (
+        <InteractiveStepWrapper
+            wrapperID={BusinessInfo.displayName}
+            handleBackButtonPress={handleBackButtonPress}
+            headerTitle={translate('businessInfoStep.businessInfoTitle')}
+            stepNames={CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP_NAMES}
+            startStepIndex={0}
+        >
+            <SubStep
+                isEditing={isEditing}
+                onNext={nextScreen}
+                onMove={moveTo}
+                screenIndex={screenIndex}
+                country={country}
+                policyCurrency={policyCurrency}
+            />
+        </InteractiveStepWrapper>
+    );
+}
+
+BusinessInfo.displayName = 'BusinessInfo';
+
+export default BusinessInfo;
diff --git a/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/AverageReimbursement.tsx b/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/AverageReimbursement.tsx
new file mode 100644
index 000000000000..2e2b185d3f84
--- /dev/null
+++ b/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/AverageReimbursement.tsx
@@ -0,0 +1,62 @@
+import React, {useMemo} from 'react';
+import PushRowFieldsStep from '@components/SubStepForms/PushRowFieldsStep';
+import useEnableGlobalReimbursementsStepFormSubmit from '@hooks/useEnableGlobalReimbursementsStepFormSubmit';
+import useLocalize from '@hooks/useLocalize';
+import useOnyx from '@hooks/useOnyx';
+import type {SubStepProps} from '@hooks/useSubStep/types';
+import getListOptionsFromCorpayPicklist from '@pages/ReimbursementAccount/NonUSD/utils/getListOptionsFromCorpayPicklist';
+import ONYXKEYS from '@src/ONYXKEYS';
+import INPUT_IDS from '@src/types/form/EnableGlobalReimbursementsForm';
+
+type AverageReimbursementsProps = SubStepProps & {policyCurrency: string};
+
+const {TRADE_VOLUME} = INPUT_IDS;
+const STEP_FIELDS = [TRADE_VOLUME];
+
+function AverageReimbursements({onNext, onMove, isEditing, policyCurrency}: AverageReimbursementsProps) {
+    const {translate} = useLocalize();
+    const [enableGlobalReimbursementsDraft] = useOnyx(ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS_DRAFT, {canBeMissing: true});
+    const [corpayOnboardingFields] = useOnyx(ONYXKEYS.CORPAY_ONBOARDING_FIELDS, {canBeMissing: true});
+
+    const tradeVolumeRangeListOptions = useMemo(() => getListOptionsFromCorpayPicklist(corpayOnboardingFields?.picklists.TradeVolumeRange), [corpayOnboardingFields]);
+
+    const pushRowFields = useMemo(
+        () => [
+            {
+                inputID: TRADE_VOLUME,
+                defaultValue: enableGlobalReimbursementsDraft?.[TRADE_VOLUME] ?? '',
+                options: tradeVolumeRangeListOptions,
+                description: translate('businessInfoStep.averageReimbursementAmountInCurrency', {currencyCode: policyCurrency}),
+                modalHeaderTitle: translate('businessInfoStep.selectAverageReimbursement'),
+                searchInputTitle: translate('businessInfoStep.findAverageReimbursement'),
+            },
+        ],
+        [enableGlobalReimbursementsDraft, policyCurrency, tradeVolumeRangeListOptions, translate],
+    );
+
+    const handleSubmit = useEnableGlobalReimbursementsStepFormSubmit({
+        fieldIds: STEP_FIELDS,
+        onNext,
+        shouldSaveDraft: isEditing,
+    });
+
+    if (corpayOnboardingFields === undefined) {
+        return null;
+    }
+
+    return (
+        <PushRowFieldsStep
+            isEditing={isEditing}
+            onNext={onNext}
+            onMove={onMove}
+            formID={ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS}
+            formTitle={translate('businessInfoStep.whatsYourExpectedAverageReimbursements')}
+            onSubmit={handleSubmit}
+            pushRowFields={pushRowFields}
+        />
+    );
+}
+
+AverageReimbursements.displayName = 'AverageReimbursements';
+
+export default AverageReimbursements;
diff --git a/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/BusinessType.tsx b/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/BusinessType.tsx
new file mode 100644
index 000000000000..27a3b1c3a9d1
--- /dev/null
+++ b/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/BusinessType.tsx
@@ -0,0 +1,69 @@
+import React, {useMemo} from 'react';
+import PushRowFieldsStep from '@components/SubStepForms/PushRowFieldsStep';
+import useEnableGlobalReimbursementsStepFormSubmit from '@hooks/useEnableGlobalReimbursementsStepFormSubmit';
+import useLocalize from '@hooks/useLocalize';
+import useOnyx from '@hooks/useOnyx';
+import type {SubStepProps} from '@hooks/useSubStep/types';
+import getListOptionsFromCorpayPicklist from '@pages/ReimbursementAccount/NonUSD/utils/getListOptionsFromCorpayPicklist';
+import ONYXKEYS from '@src/ONYXKEYS';
+import INPUT_IDS from '@src/types/form/EnableGlobalReimbursementsForm';
+
+const {APPLICANT_TYPE_ID, BUSINESS_CATEGORY} = INPUT_IDS;
+const STEP_FIELDS = [APPLICANT_TYPE_ID, BUSINESS_CATEGORY];
+
+function BusinessType({onNext, onMove, isEditing}: SubStepProps) {
+    const {translate} = useLocalize();
+    const [enableGlobalReimbursementsDraft] = useOnyx(ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS_DRAFT, {canBeMissing: true});
+    const [corpayOnboardingFields] = useOnyx(ONYXKEYS.CORPAY_ONBOARDING_FIELDS, {canBeMissing: true});
+
+    const incorporationTypeListOptions = useMemo(() => getListOptionsFromCorpayPicklist(corpayOnboardingFields?.picklists.ApplicantType), [corpayOnboardingFields]);
+    const natureOfBusinessListOptions = useMemo(() => getListOptionsFromCorpayPicklist(corpayOnboardingFields?.picklists.NatureOfBusiness), [corpayOnboardingFields]);
+
+    const pushRowFields = useMemo(
+        () => [
+            {
+                inputID: APPLICANT_TYPE_ID,
+                defaultValue: enableGlobalReimbursementsDraft?.[APPLICANT_TYPE_ID] ?? '',
+                options: incorporationTypeListOptions,
+                description: translate('businessInfoStep.incorporationTypeName'),
+                modalHeaderTitle: translate('businessInfoStep.selectIncorporationType'),
+                searchInputTitle: translate('businessInfoStep.findIncorporationType'),
+            },
+            {
+                inputID: BUSINESS_CATEGORY,
+                defaultValue: enableGlobalReimbursementsDraft?.[BUSINESS_CATEGORY] ?? '',
+                options: natureOfBusinessListOptions,
+                description: translate('businessInfoStep.businessCategory'),
+                modalHeaderTitle: translate('businessInfoStep.selectBusinessCategory'),
+                searchInputTitle: translate('businessInfoStep.findBusinessCategory'),
+            },
+        ],
+        [enableGlobalReimbursementsDraft, incorporationTypeListOptions, natureOfBusinessListOptions, translate],
+    );
+
+    const handleSubmit = useEnableGlobalReimbursementsStepFormSubmit({
+        fieldIds: STEP_FIELDS,
+        onNext,
+        shouldSaveDraft: isEditing,
+    });
+
+    if (corpayOnboardingFields === undefined) {
+        return null;
+    }
+
+    return (
+        <PushRowFieldsStep
+            isEditing={isEditing}
+            onNext={onNext}
+            onMove={onMove}
+            formID={ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS}
+            formTitle={translate('businessInfoStep.whatTypeOfBusinessIsIt')}
+            onSubmit={handleSubmit}
+            pushRowFields={pushRowFields}
+        />
+    );
+}
+
+BusinessType.displayName = 'BusinessType';
+
+export default BusinessType;
diff --git a/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/Confirmation.tsx b/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/Confirmation.tsx
new file mode 100644
index 000000000000..04aee0217e1d
--- /dev/null
+++ b/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/Confirmation.tsx
@@ -0,0 +1,101 @@
+import React, {useMemo} from 'react';
+import ConfirmationStep from '@components/SubStepForms/ConfirmationStep';
+import useLocalize from '@hooks/useLocalize';
+import useOnyx from '@hooks/useOnyx';
+import type {SubStepProps} from '@hooks/useSubStep/types';
+import {getLatestErrorMessage} from '@libs/ErrorUtils';
+import ONYXKEYS from '@src/ONYXKEYS';
+import INPUT_IDS from '@src/types/form/EnableGlobalReimbursementsForm';
+
+const {BUSINESS_REGISTRATION_INCORPORATION_NUMBER, ANNUAL_VOLUME, APPLICANT_TYPE_ID, TRADE_VOLUME, BUSINESS_CATEGORY} = INPUT_IDS;
+
+const displayStringValue = (list: Array<{id: string; name: string; stringValue: string}>, matchingName: string) => {
+    return list.find((item) => item.name === matchingName)?.stringValue ?? '';
+};
+
+function Confirmation({onNext, onMove, isEditing}: SubStepProps) {
+    const {translate} = useLocalize();
+
+    const [enableGlobalReimbursementsDraft] = useOnyx(ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS_DRAFT, {canBeMissing: false});
+    const [corpayOnboardingFields] = useOnyx(ONYXKEYS.CORPAY_ONBOARDING_FIELDS, {canBeMissing: false});
+    const error = getLatestErrorMessage(enableGlobalReimbursementsDraft);
+
+    const paymentVolume = useMemo(
+        () => displayStringValue(corpayOnboardingFields?.picklists.AnnualVolumeRange ?? [], enableGlobalReimbursementsDraft?.[ANNUAL_VOLUME] ?? ''),
+        [corpayOnboardingFields?.picklists.AnnualVolumeRange, enableGlobalReimbursementsDraft],
+    );
+    const businessCategory = useMemo(
+        () => displayStringValue(corpayOnboardingFields?.picklists.NatureOfBusiness ?? [], enableGlobalReimbursementsDraft?.[BUSINESS_CATEGORY] ?? ''),
+        [corpayOnboardingFields?.picklists.NatureOfBusiness, enableGlobalReimbursementsDraft],
+    );
+    const businessType = useMemo(
+        () => displayStringValue(corpayOnboardingFields?.picklists.ApplicantType ?? [], enableGlobalReimbursementsDraft?.[APPLICANT_TYPE_ID] ?? ''),
+        [corpayOnboardingFields?.picklists.ApplicantType, enableGlobalReimbursementsDraft],
+    );
+    const tradeVolumeRange = useMemo(
+        () => displayStringValue(corpayOnboardingFields?.picklists.TradeVolumeRange ?? [], enableGlobalReimbursementsDraft?.[TRADE_VOLUME] ?? ''),
+        [corpayOnboardingFields?.picklists.TradeVolumeRange, enableGlobalReimbursementsDraft],
+    );
+
+    const summaryItems = useMemo(
+        () => [
+            {
+                title: enableGlobalReimbursementsDraft?.[BUSINESS_REGISTRATION_INCORPORATION_NUMBER] ?? '',
+                description: translate('businessInfoStep.registrationNumber'),
+                shouldShowRightIcon: true,
+                onPress: () => {
+                    onMove(0);
+                },
+            },
+            {
+                title: businessType,
+                description: translate('businessInfoStep.businessType'),
+                shouldShowRightIcon: true,
+                onPress: () => {
+                    onMove(1);
+                },
+            },
+            {
+                title: businessCategory,
+                description: translate('businessInfoStep.businessCategory'),
+                shouldShowRightIcon: true,
+                onPress: () => {
+                    onMove(1);
+                },
+            },
+            {
+                title: paymentVolume,
+                description: translate('businessInfoStep.annualPaymentVolume'),
+                shouldShowRightIcon: true,
+                onPress: () => {
+                    onMove(2);
+                },
+            },
+            {
+                title: tradeVolumeRange,
+                description: translate('businessInfoStep.averageReimbursementAmount'),
+                shouldShowRightIcon: true,
+                onPress: () => {
+                    onMove(3);
+                },
+            },
+        ],
+        [businessCategory, businessType, enableGlobalReimbursementsDraft, onMove, paymentVolume, tradeVolumeRange, translate],
+    );
+
+    return (
+        <ConfirmationStep
+            isEditing={isEditing}
+            error={error}
+            onNext={onNext}
+            onMove={onMove}
+            pageTitle={translate('businessInfoStep.letsDoubleCheck')}
+            summaryItems={summaryItems}
+            showOnfidoLinks={false}
+        />
+    );
+}
+
+Confirmation.displayName = 'Confirmation';
+
+export default Confirmation;
diff --git a/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/PaymentVolume.tsx b/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/PaymentVolume.tsx
new file mode 100644
index 000000000000..63616d5ede44
--- /dev/null
+++ b/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/PaymentVolume.tsx
@@ -0,0 +1,62 @@
+import React, {useMemo} from 'react';
+import PushRowFieldsStep from '@components/SubStepForms/PushRowFieldsStep';
+import useEnableGlobalReimbursementsStepFormSubmit from '@hooks/useEnableGlobalReimbursementsStepFormSubmit';
+import useLocalize from '@hooks/useLocalize';
+import useOnyx from '@hooks/useOnyx';
+import type {SubStepProps} from '@hooks/useSubStep/types';
+import getListOptionsFromCorpayPicklist from '@pages/ReimbursementAccount/NonUSD/utils/getListOptionsFromCorpayPicklist';
+import ONYXKEYS from '@src/ONYXKEYS';
+import INPUT_IDS from '@src/types/form/EnableGlobalReimbursementsForm';
+
+type PaymentVolumeProps = SubStepProps & {policyCurrency: string};
+
+const {ANNUAL_VOLUME} = INPUT_IDS;
+const STEP_FIELDS = [ANNUAL_VOLUME];
+
+function PaymentVolume({onNext, onMove, isEditing, policyCurrency}: PaymentVolumeProps) {
+    const {translate} = useLocalize();
+    const [enableGlobalReimbursementsDraft] = useOnyx(ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS_DRAFT, {canBeMissing: true});
+    const [corpayOnboardingFields] = useOnyx(ONYXKEYS.CORPAY_ONBOARDING_FIELDS, {canBeMissing: true});
+
+    const annualVolumeRangeListOptions = useMemo(() => getListOptionsFromCorpayPicklist(corpayOnboardingFields?.picklists.AnnualVolumeRange), [corpayOnboardingFields]);
+
+    const pushRowFields = useMemo(
+        () => [
+            {
+                inputID: ANNUAL_VOLUME,
+                defaultValue: enableGlobalReimbursementsDraft?.[ANNUAL_VOLUME] ?? '',
+                options: annualVolumeRangeListOptions,
+                description: translate('businessInfoStep.annualPaymentVolumeInCurrency', {currencyCode: policyCurrency}),
+                modalHeaderTitle: translate('businessInfoStep.selectAnnualPaymentVolume'),
+                searchInputTitle: translate('businessInfoStep.findAnnualPaymentVolume'),
+            },
+        ],
+        [enableGlobalReimbursementsDraft, policyCurrency, annualVolumeRangeListOptions, translate],
+    );
+
+    const handleSubmit = useEnableGlobalReimbursementsStepFormSubmit({
+        fieldIds: STEP_FIELDS,
+        onNext,
+        shouldSaveDraft: isEditing,
+    });
+
+    if (corpayOnboardingFields === undefined) {
+        return null;
+    }
+
+    return (
+        <PushRowFieldsStep
+            isEditing={isEditing}
+            onNext={onNext}
+            onMove={onMove}
+            formID={ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS}
+            formTitle={translate('businessInfoStep.whatsTheBusinessAnnualPayment')}
+            onSubmit={handleSubmit}
+            pushRowFields={pushRowFields}
+        />
+    );
+}
+
+PaymentVolume.displayName = 'PaymentVolume';
+
+export default PaymentVolume;
diff --git a/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/RegistrationNumber.tsx b/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/RegistrationNumber.tsx
new file mode 100644
index 000000000000..b145ea6b8fcc
--- /dev/null
+++ b/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/RegistrationNumber.tsx
@@ -0,0 +1,40 @@
+import React from 'react';
+import RegistrationNumberStep from '@components/SubStepForms/RegistrationNumberStep';
+import useEnableGlobalReimbursementsStepFormSubmit from '@hooks/useEnableGlobalReimbursementsStepFormSubmit';
+import useOnyx from '@hooks/useOnyx';
+import type {SubStepProps} from '@hooks/useSubStep/types';
+import type {Country} from '@src/CONST';
+import ONYXKEYS from '@src/ONYXKEYS';
+import INPUT_IDS from '@src/types/form/EnableGlobalReimbursementsForm';
+
+type RegistrationNumberProps = SubStepProps & {country: Country | ''};
+
+const {BUSINESS_REGISTRATION_INCORPORATION_NUMBER} = INPUT_IDS;
+const STEP_FIELDS = [BUSINESS_REGISTRATION_INCORPORATION_NUMBER];
+
+function RegistrationNumber({onNext, onMove, isEditing, country}: RegistrationNumberProps) {
+    const [enableGlobalReimbursementsDraft] = useOnyx(ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS_DRAFT, {canBeMissing: true});
+    const handleSubmit = useEnableGlobalReimbursementsStepFormSubmit({
+        fieldIds: STEP_FIELDS,
+        onNext,
+        shouldSaveDraft: isEditing,
+    });
+
+    return (
+        <RegistrationNumberStep
+            isEditing={isEditing}
+            onNext={onNext}
+            onMove={onMove}
+            formID={ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS}
+            onSubmit={handleSubmit}
+            inputID={BUSINESS_REGISTRATION_INCORPORATION_NUMBER}
+            defaultValue={enableGlobalReimbursementsDraft?.[BUSINESS_REGISTRATION_INCORPORATION_NUMBER] ?? ''}
+            country={country}
+            shouldDelayAutoFocus
+        />
+    );
+}
+
+RegistrationNumber.displayName = 'RegistrationNumber';
+
+export default RegistrationNumber;
diff --git a/src/pages/settings/Wallet/EnableGlobalReimbursements/Docusign/index.tsx b/src/pages/settings/Wallet/EnableGlobalReimbursements/Docusign/index.tsx
index 643c1480e255..c0b092d790f4 100644
--- a/src/pages/settings/Wallet/EnableGlobalReimbursements/Docusign/index.tsx
+++ b/src/pages/settings/Wallet/EnableGlobalReimbursements/Docusign/index.tsx
@@ -30,7 +30,7 @@ function Docusign({onBackButtonPress, onSubmit, policyCurrency}: DocusignProps)
             onBackButtonPress={onBackButtonPress}
             onSubmit={onSubmit}
             policyCurrency={policyCurrency}
-            startStepIndex={1}
+            startStepIndex={2}
             stepNames={CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP_NAMES}
         />
     );
diff --git a/src/pages/settings/Wallet/EnableGlobalReimbursements/index.tsx b/src/pages/settings/Wallet/EnableGlobalReimbursements/index.tsx
index 7e4f48bf46f0..15f86994d19b 100644
--- a/src/pages/settings/Wallet/EnableGlobalReimbursements/index.tsx
+++ b/src/pages/settings/Wallet/EnableGlobalReimbursements/index.tsx
@@ -1,16 +1,19 @@
 import React, {useEffect, useState} from 'react';
 import type {ValueOf} from 'type-fest';
 import useOnyx from '@hooks/useOnyx';
+import mapCurrencyToCountry from '@libs/mapCurrencyToCountry';
 import Navigation from '@navigation/Navigation';
 import type {PlatformStackScreenProps} from '@navigation/PlatformStackNavigation/types';
 import type {SettingsNavigatorParamList} from '@navigation/types';
-import {clearEnableGlobalReimbursementsForUSDBankAccount, enableGlobalReimbursementsForUSDBankAccount} from '@userActions/BankAccounts';
+import {clearEnableGlobalReimbursementsForUSDBankAccount, enableGlobalReimbursementsForUSDBankAccount, getCorpayOnboardingFields} from '@userActions/BankAccounts';
 import {clearErrors} from '@userActions/FormActions';
 import CONST from '@src/CONST';
+import type {Country} from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import type SCREENS from '@src/SCREENS';
 import INPUT_IDS from '@src/types/form/EnableGlobalReimbursementsForm';
 import Agreements from './Agreements';
+import BusinessInfo from './BusinessInfo';
 import Docusign from './Docusign';
 
 type EnableGlobalReimbursementsProps = PlatformStackScreenProps<SettingsNavigatorParamList, typeof SCREENS.SETTINGS.WALLET.ENABLE_GLOBAL_REIMBURSEMENTS>;
@@ -22,34 +25,59 @@ function EnableGlobalReimbursements({route}: EnableGlobalReimbursementsProps) {
     const [reimbursementAccount] = useOnyx(ONYXKEYS.REIMBURSEMENT_ACCOUNT, {canBeMissing: false});
     const [enableGlobalReimbursements] = useOnyx(ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS, {canBeMissing: true});
     const [enableGlobalReimbursementsDraft] = useOnyx(ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS_DRAFT, {canBeMissing: true});
+
+    const country = mapCurrencyToCountry(policyCurrency);
     const bankAccountID = reimbursementAccount?.achData?.bankAccountID ?? CONST.DEFAULT_NUMBER_ID;
     const [enableGlobalReimbursementsStep, setEnableGlobalReimbursementsStep] = useState<ValueOf<typeof CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP>>(
-        CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP.AGREEMENTS,
+        CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP.BUSINESS_INFO,
     );
 
+    useEffect(() => {
+        getCorpayOnboardingFields(country as Country);
+    }, [country]);
+
     const handleNextEnableGlobalReimbursementsStep = () => {
-        if (enableGlobalReimbursementsStep === CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP.AGREEMENTS) {
-            setEnableGlobalReimbursementsStep(CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP.DOCUSIGN);
-        } else {
-            enableGlobalReimbursementsForUSDBankAccount({
-                inputs: JSON.stringify({
-                    provideTruthfulInformation: enableGlobalReimbursementsDraft?.[INPUT_IDS.PROVIDE_TRUTHFUL_INFORMATION],
-                    agreeToTermsAndConditions: enableGlobalReimbursementsDraft?.[INPUT_IDS.AGREE_TO_TERMS_AND_CONDITIONS],
-                    consentToPrivacyNotice: enableGlobalReimbursementsDraft?.[INPUT_IDS.CONSENT_TO_PRIVACY_NOTICE],
-                    authorizedToBindClientToAgreement: enableGlobalReimbursementsDraft?.[INPUT_IDS.AUTHORIZED_TO_BIND_CLIENT_TO_AGREEMENT],
-                }),
-                achAuthorizationForm: enableGlobalReimbursementsDraft?.[INPUT_IDS.ACH_AUTHORIZATION_FORM].at(0),
-                bankAccountID,
-            });
+        switch (enableGlobalReimbursementsStep) {
+            case CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP.BUSINESS_INFO:
+                setEnableGlobalReimbursementsStep(CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP.AGREEMENTS);
+                break;
+
+            case CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP.AGREEMENTS:
+                setEnableGlobalReimbursementsStep(CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP.DOCUSIGN);
+                break;
+
+            default:
+                enableGlobalReimbursementsForUSDBankAccount({
+                    inputs: JSON.stringify({
+                        provideTruthfulInformation: enableGlobalReimbursementsDraft?.[INPUT_IDS.PROVIDE_TRUTHFUL_INFORMATION],
+                        agreeToTermsAndConditions: enableGlobalReimbursementsDraft?.[INPUT_IDS.AGREE_TO_TERMS_AND_CONDITIONS],
+                        consentToPrivacyNotice: enableGlobalReimbursementsDraft?.[INPUT_IDS.CONSENT_TO_PRIVACY_NOTICE],
+                        authorizedToBindClientToAgreement: enableGlobalReimbursementsDraft?.[INPUT_IDS.AUTHORIZED_TO_BIND_CLIENT_TO_AGREEMENT],
+                        natureOfBusiness: enableGlobalReimbursementsDraft?.[INPUT_IDS.BUSINESS_CATEGORY],
+                        applicantTypeId: enableGlobalReimbursementsDraft?.[INPUT_IDS.APPLICANT_TYPE_ID],
+                        tradeVolume: enableGlobalReimbursementsDraft?.[INPUT_IDS.TRADE_VOLUME],
+                        annualVolume: enableGlobalReimbursementsDraft?.[INPUT_IDS.ANNUAL_VOLUME],
+                        businessRegistrationIncorporationNumber: enableGlobalReimbursementsDraft?.[INPUT_IDS.BUSINESS_REGISTRATION_INCORPORATION_NUMBER],
+                        fundSourceCountries: country,
+                        fundDestinationCountries: country,
+                        currencyNeeded: policyCurrency,
+                        purposeOfTransactionId: CONST.NON_USD_BANK_ACCOUNT.PURPOSE_OF_TRANSACTION_ID,
+                    }),
+                    achAuthorizationForm: enableGlobalReimbursementsDraft?.[INPUT_IDS.ACH_AUTHORIZATION_FORM].at(0),
+                    bankAccountID,
+                });
         }
     };
 
     const handleEnableGlobalReimbursementGoBack = () => {
         clearErrors(ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS);
         switch (enableGlobalReimbursementsStep) {
-            case CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP.AGREEMENTS:
+            case CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP.BUSINESS_INFO:
                 Navigation.goBack();
                 break;
+            case CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP.AGREEMENTS:
+                setEnableGlobalReimbursementsStep(CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP.BUSINESS_INFO);
+                break;
             case CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP.DOCUSIGN:
                 setEnableGlobalReimbursementsStep(CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP.AGREEMENTS);
                 break;
@@ -75,6 +103,15 @@ function EnableGlobalReimbursements({route}: EnableGlobalReimbursementsProps) {
     }, [enableGlobalReimbursements?.errors, enableGlobalReimbursements?.isEnablingGlobalReimbursements, enableGlobalReimbursements?.isSuccess]);
 
     switch (enableGlobalReimbursementsStep) {
+        case CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP.BUSINESS_INFO:
+            return (
+                <BusinessInfo
+                    onBackButtonPress={handleEnableGlobalReimbursementGoBack}
+                    onSubmit={handleNextEnableGlobalReimbursementsStep}
+                    policyCurrency={policyCurrency}
+                    country={country as Country}
+                />
+            );
         case CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP.AGREEMENTS:
             return (
                 <Agreements
diff --git a/src/types/form/EnableGlobalReimbursementsForm.ts b/src/types/form/EnableGlobalReimbursementsForm.ts
index 4b63093b916c..162e066248d2 100644
--- a/src/types/form/EnableGlobalReimbursementsForm.ts
+++ b/src/types/form/EnableGlobalReimbursementsForm.ts
@@ -3,6 +3,11 @@ import type {FileObject} from '@pages/media/AttachmentModalScreen/types';
 import type Form from './Form';
 
 const INPUT_IDS = {
+    BUSINESS_REGISTRATION_INCORPORATION_NUMBER: 'businessRegistrationIncorporationNumber',
+    BUSINESS_CATEGORY: 'natureOfBusiness',
+    APPLICANT_TYPE_ID: 'applicantTypeId',
+    TRADE_VOLUME: 'tradeVolume',
+    ANNUAL_VOLUME: 'annualVolume',
     PROVIDE_TRUTHFUL_INFORMATION: 'provideTruthfulInformation',
     AGREE_TO_TERMS_AND_CONDITIONS: 'agreeToTermsAndConditions',
     CONSENT_TO_PRIVACY_NOTICE: 'consentToPrivacyNotice',
@@ -15,6 +20,11 @@ type InputID = ValueOf<typeof INPUT_IDS>;
 type EnableGlobalReimbursementsForm = Form<
     InputID,
     {
+        [INPUT_IDS.BUSINESS_REGISTRATION_INCORPORATION_NUMBER]: string;
+        [INPUT_IDS.BUSINESS_CATEGORY]: string;
+        [INPUT_IDS.APPLICANT_TYPE_ID]: string;
+        [INPUT_IDS.TRADE_VOLUME]: string;
+        [INPUT_IDS.ANNUAL_VOLUME]: string;
         [INPUT_IDS.PROVIDE_TRUTHFUL_INFORMATION]: boolean;
         [INPUT_IDS.AGREE_TO_TERMS_AND_CONDITIONS]: boolean;
         [INPUT_IDS.CONSENT_TO_PRIVACY_NOTICE]: boolean;

From 1b11d59f9cbc023a78cf40f8b4a7bb1db30e59af Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20Muzyk?= <mimuzyk@gmail.com>
Date: Wed, 13 Aug 2025 12:29:53 +0200
Subject: [PATCH 06/18] fix: replace policyID with bankAccountID

---
 src/ROUTES.ts                                 |  4 ++--
 .../SubStepForms/AgreementsFullStep/index.tsx | 12 +++++-----
 .../subSteps/Confirmation.tsx                 |  8 +++----
 .../SubStepForms/DocusignFullStep/index.tsx   | 12 +++++-----
 .../subSteps/UploadPowerform.tsx              |  8 +++----
 src/libs/Navigation/types.ts                  |  2 +-
 .../NonUSD/Agreements/index.tsx               |  2 +-
 .../NonUSD/Docusign/index.tsx                 |  2 +-
 .../Agreements/index.tsx                      |  9 +++----
 .../BusinessInfo/index.tsx                    | 12 +++++-----
 .../subSteps/AverageReimbursement.tsx         |  8 +++----
 .../BusinessInfo/subSteps/PaymentVolume.tsx   |  8 +++----
 .../Docusign/index.tsx                        |  6 ++---
 .../EnableGlobalReimbursements/index.tsx      | 24 +++++++++----------
 .../settings/Wallet/WalletPage/WalletPage.tsx |  2 +-
 15 files changed, 60 insertions(+), 59 deletions(-)

diff --git a/src/ROUTES.ts b/src/ROUTES.ts
index 28f4dffc996a..5b15e62f1adc 100644
--- a/src/ROUTES.ts
+++ b/src/ROUTES.ts
@@ -279,8 +279,8 @@ const ROUTES = {
     SETTINGS_ADD_US_BANK_ACCOUNT: 'settings/wallet/add-us-bank-account',
     SETTINGS_ENABLE_PAYMENTS: 'settings/wallet/enable-payments',
     SETTINGS_WALLET_ENABLE_GLOBAL_REIMBURSEMENTS: {
-        route: 'settings/wallet/:policyID/enable-global-reimbursements',
-        getRoute: (policyID: string | undefined) => `settings/wallet/${policyID}/enable-global-reimbursements` as const,
+        route: 'settings/wallet/:bankAccountID/enable-global-reimbursements',
+        getRoute: (bankAccountID: number | undefined) => `settings/wallet/${bankAccountID}/enable-global-reimbursements` as const,
     },
     SETTINGS_WALLET_CARD_DIGITAL_DETAILS_UPDATE_ADDRESS: {
         route: 'settings/wallet/card/:domain/digital-details/update-address',
diff --git a/src/components/SubStepForms/AgreementsFullStep/index.tsx b/src/components/SubStepForms/AgreementsFullStep/index.tsx
index 03687f0021a8..b6d873eda799 100644
--- a/src/components/SubStepForms/AgreementsFullStep/index.tsx
+++ b/src/components/SubStepForms/AgreementsFullStep/index.tsx
@@ -30,8 +30,8 @@ type AgreementsFullStepProps<TFormID extends keyof OnyxFormValuesMapping> = {
     /** Handles submit button press */
     onSubmit: () => void;
 
-    /** Currency of the policy */
-    policyCurrency: string;
+    /** Currency of related account */
+    currency: string;
 
     /** Array of step names */
     stepNames?: readonly string[];
@@ -50,8 +50,8 @@ type AgreementsFullStepSubStepProps<TFormID extends keyof OnyxFormValuesMapping>
     /** Input IDs for field in the form */
     inputIDs: AgreementsFullStepProps<TFormID>['inputIDs'];
 
-    /** Currency of affiliated policy */
-    policyCurrency: string;
+    /** Currency of related account */
+    currency: string;
 };
 
 function AgreementsFullStep<TFormID extends keyof OnyxFormValuesMapping>({
@@ -60,7 +60,7 @@ function AgreementsFullStep<TFormID extends keyof OnyxFormValuesMapping>({
     inputIDs,
     onBackButtonPress,
     onSubmit,
-    policyCurrency,
+    currency,
     stepNames,
     startStepIndex,
 }: AgreementsFullStepProps<TFormID>) {
@@ -107,7 +107,7 @@ function AgreementsFullStep<TFormID extends keyof OnyxFormValuesMapping>({
                 isEditing={isEditing}
                 onMove={moveTo}
                 onNext={nextScreen}
-                policyCurrency={policyCurrency}
+                currency={currency}
             />
         </InteractiveStepWrapper>
     );
diff --git a/src/components/SubStepForms/AgreementsFullStep/subSteps/Confirmation.tsx b/src/components/SubStepForms/AgreementsFullStep/subSteps/Confirmation.tsx
index a85b2b4ea2c5..250f16a28647 100644
--- a/src/components/SubStepForms/AgreementsFullStep/subSteps/Confirmation.tsx
+++ b/src/components/SubStepForms/AgreementsFullStep/subSteps/Confirmation.tsx
@@ -56,15 +56,15 @@ type ConfirmationProps<TFormID extends keyof OnyxFormValuesMapping> = SubStepPro
         authorizedToBindClientToAgreement: FormOnyxKeys<TFormID>;
     };
 
-    /** Currency of affiliated policy */
-    policyCurrency: string;
+    /** Currency of related account */
+    currency: string;
 };
 
-function Confirmation<TFormID extends keyof OnyxFormValuesMapping>({defaultValues, formID, inputIDs, onNext, policyCurrency}: ConfirmationProps<TFormID>) {
+function Confirmation<TFormID extends keyof OnyxFormValuesMapping>({defaultValues, formID, inputIDs, onNext, currency}: ConfirmationProps<TFormID>) {
     const {translate} = useLocalize();
     const styles = useThemeStyles();
 
-    const isDocusignStepRequired = requiresDocusignStep(policyCurrency);
+    const isDocusignStepRequired = requiresDocusignStep(currency);
 
     const stepFields = useMemo(
         () => [inputIDs.authorizedToBindClientToAgreement, inputIDs.provideTruthfulInformation, inputIDs.agreeToTermsAndConditions, inputIDs.consentToPrivacyNotice],
diff --git a/src/components/SubStepForms/DocusignFullStep/index.tsx b/src/components/SubStepForms/DocusignFullStep/index.tsx
index be4b0b97b87f..36a7a31458f0 100644
--- a/src/components/SubStepForms/DocusignFullStep/index.tsx
+++ b/src/components/SubStepForms/DocusignFullStep/index.tsx
@@ -29,8 +29,8 @@ type DocusignFullStepProps<TFormID extends keyof OnyxFormValuesMapping> = {
     /** Handles submit button press */
     onSubmit: () => void;
 
-    /** Currency of the policy */
-    policyCurrency: string;
+    /** Currency of related account */
+    currency: string;
 
     /** Array of step names */
     stepNames?: readonly string[];
@@ -51,8 +51,8 @@ type DocusignFullStepStepProps<TFormID extends keyof OnyxFormValuesMapping> = Su
     /** Indicates that action is being processed */
     isLoading: boolean;
 
-    /** Currency of the policy */
-    policyCurrency: string;
+    /** Currency of related account */
+    currency: string;
 };
 
 function DocusignFullStep<TFormID extends keyof OnyxFormValuesMapping>({
@@ -62,7 +62,7 @@ function DocusignFullStep<TFormID extends keyof OnyxFormValuesMapping>({
     isLoading,
     onBackButtonPress,
     onSubmit,
-    policyCurrency,
+    currency,
     startStepIndex,
     stepNames,
 }: DocusignFullStepProps<TFormID>) {
@@ -110,7 +110,7 @@ function DocusignFullStep<TFormID extends keyof OnyxFormValuesMapping>({
                 isEditing={isEditing}
                 onMove={moveTo}
                 onNext={nextScreen}
-                policyCurrency={policyCurrency}
+                currency={currency}
             />
         </InteractiveStepWrapper>
     );
diff --git a/src/components/SubStepForms/DocusignFullStep/subSteps/UploadPowerform.tsx b/src/components/SubStepForms/DocusignFullStep/subSteps/UploadPowerform.tsx
index 8950cd6ea562..43b57aae5798 100644
--- a/src/components/SubStepForms/DocusignFullStep/subSteps/UploadPowerform.tsx
+++ b/src/components/SubStepForms/DocusignFullStep/subSteps/UploadPowerform.tsx
@@ -30,10 +30,10 @@ type UploadPowerformProps<TFormID extends keyof OnyxFormValuesMapping> = SubStep
     /** Indicates that action is being processed */
     isLoading: boolean;
 
-    /** Currency of affiliated policy */
-    policyCurrency: string;
+    /** Currency of related account */
+    currency: string;
 };
-function UploadPowerform<TFormID extends keyof OnyxFormValuesMapping>({defaultValue, formID, inputID, isLoading, onNext, policyCurrency}: UploadPowerformProps<TFormID>) {
+function UploadPowerform<TFormID extends keyof OnyxFormValuesMapping>({defaultValue, formID, inputID, isLoading, onNext, currency}: UploadPowerformProps<TFormID>) {
     const {translate} = useLocalize();
     const styles = useThemeStyles();
     const {environmentURL} = useEnvironment();
@@ -67,7 +67,7 @@ function UploadPowerform<TFormID extends keyof OnyxFormValuesMapping>({defaultVa
         setErrorFields(formID, {[inputID]: {onUpload: error}});
     };
 
-    const country = mapCurrencyToCountry(policyCurrency ?? '');
+    const country = mapCurrencyToCountry(currency ?? '');
 
     return (
         <FormProvider
diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts
index 165837f3d8a7..0c69b4ea9ed6 100644
--- a/src/libs/Navigation/types.ts
+++ b/src/libs/Navigation/types.ts
@@ -163,7 +163,7 @@ type SettingsNavigatorParamList = {
     [SCREENS.SETTINGS.WALLET.CHOOSE_TRANSFER_ACCOUNT]: undefined;
     [SCREENS.SETTINGS.WALLET.ENABLE_PAYMENTS]: undefined;
     [SCREENS.SETTINGS.WALLET.ENABLE_GLOBAL_REIMBURSEMENTS]: {
-        policyID: string;
+        bankAccountID: string;
     };
     [SCREENS.SETTINGS.ADD_DEBIT_CARD]: undefined;
     [SCREENS.SETTINGS.ADD_BANK_ACCOUNT]: undefined;
diff --git a/src/pages/ReimbursementAccount/NonUSD/Agreements/index.tsx b/src/pages/ReimbursementAccount/NonUSD/Agreements/index.tsx
index 18d560bfb1a8..456b0a484ce3 100644
--- a/src/pages/ReimbursementAccount/NonUSD/Agreements/index.tsx
+++ b/src/pages/ReimbursementAccount/NonUSD/Agreements/index.tsx
@@ -86,7 +86,7 @@ function Agreements({onBackButtonPress, onSubmit, stepNames, policyCurrency}: Ag
             inputIDs={INPUT_KEYS}
             onBackButtonPress={handleBackButtonPress}
             onSubmit={submit}
-            policyCurrency={policyCurrency ?? ''}
+            currency={policyCurrency ?? ''}
             startStepIndex={5}
             stepNames={stepNames}
         />
diff --git a/src/pages/ReimbursementAccount/NonUSD/Docusign/index.tsx b/src/pages/ReimbursementAccount/NonUSD/Docusign/index.tsx
index 2bc33749d50b..32b6c2e85622 100644
--- a/src/pages/ReimbursementAccount/NonUSD/Docusign/index.tsx
+++ b/src/pages/ReimbursementAccount/NonUSD/Docusign/index.tsx
@@ -78,7 +78,7 @@ function Docusign({onBackButtonPress, onSubmit, stepNames, policyCurrency}: Docu
             isLoading={reimbursementAccount?.isFinishingCorpayBankAccountOnboarding ?? false}
             onBackButtonPress={handleBackButtonPress}
             onSubmit={submit}
-            policyCurrency={policyCurrency}
+            currency={policyCurrency}
             startStepIndex={6}
             stepNames={stepNames}
         />
diff --git a/src/pages/settings/Wallet/EnableGlobalReimbursements/Agreements/index.tsx b/src/pages/settings/Wallet/EnableGlobalReimbursements/Agreements/index.tsx
index 08a5ef79ddb5..f08cf9cf7754 100644
--- a/src/pages/settings/Wallet/EnableGlobalReimbursements/Agreements/index.tsx
+++ b/src/pages/settings/Wallet/EnableGlobalReimbursements/Agreements/index.tsx
@@ -2,6 +2,7 @@ import React from 'react';
 import AgreementsFullStep from '@components/SubStepForms/AgreementsFullStep';
 import useOnyx from '@hooks/useOnyx';
 import CONST from '@src/CONST';
+import type {Country} from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import INPUT_IDS from '@src/types/form/EnableGlobalReimbursementsForm';
 
@@ -12,8 +13,8 @@ type AgreementsProps = {
     /** Handles submit button press */
     onSubmit: () => void;
 
-    /** Currency of affiliated policy */
-    policyCurrency: string;
+    /** Currency of bank account */
+    currency: string;
 };
 
 const inputIDs = {
@@ -23,7 +24,7 @@ const inputIDs = {
     authorizedToBindClientToAgreement: INPUT_IDS.AUTHORIZED_TO_BIND_CLIENT_TO_AGREEMENT,
 };
 
-function Agreements({onBackButtonPress, onSubmit, policyCurrency}: AgreementsProps) {
+function Agreements({onBackButtonPress, onSubmit, currency}: AgreementsProps) {
     const [enableGlobalReimbursementsDraft] = useOnyx(ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS_DRAFT, {canBeMissing: true});
     const defaultValues: Record<keyof typeof inputIDs, boolean> = Object.fromEntries(
         Object.keys(inputIDs).map((key) => {
@@ -39,7 +40,7 @@ function Agreements({onBackButtonPress, onSubmit, policyCurrency}: AgreementsPro
             inputIDs={inputIDs}
             onBackButtonPress={onBackButtonPress}
             onSubmit={onSubmit}
-            policyCurrency={policyCurrency}
+            currency={currency}
             startStepIndex={1}
             stepNames={CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP_NAMES}
         />
diff --git a/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/index.tsx b/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/index.tsx
index 4a8eefbd9e98..c28744223f43 100644
--- a/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/index.tsx
+++ b/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/index.tsx
@@ -21,18 +21,18 @@ type BusinessInfoProps = {
     /** Handles submit button press */
     onSubmit: () => void;
 
-    /** Currency of affiliated policy */
-    policyCurrency: string;
+    /** Currency of bank account */
+    currency: string;
 
-    /** Country of affiliated policy */
+    /** Country of bank account */
     country: Country | '';
 };
 
-type BusinessInfoSubStepProps = SubStepProps & {policyCurrency: string; country: Country | ''};
+type BusinessInfoSubStepProps = SubStepProps & {currency: string; country: Country | ''};
 
 const bodyContent: Array<ComponentType<BusinessInfoSubStepProps>> = [RegistrationNumber, BusinessType, PaymentVolume, AverageReimbursement, Confirmation];
 
-function BusinessInfo({onBackButtonPress, onSubmit, policyCurrency, country}: BusinessInfoProps) {
+function BusinessInfo({onBackButtonPress, onSubmit, currency, country}: BusinessInfoProps) {
     const {translate} = useLocalize();
 
     const {
@@ -73,7 +73,7 @@ function BusinessInfo({onBackButtonPress, onSubmit, policyCurrency, country}: Bu
                 onMove={moveTo}
                 screenIndex={screenIndex}
                 country={country}
-                policyCurrency={policyCurrency}
+                currency={currency}
             />
         </InteractiveStepWrapper>
     );
diff --git a/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/AverageReimbursement.tsx b/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/AverageReimbursement.tsx
index 2e2b185d3f84..587f12d66881 100644
--- a/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/AverageReimbursement.tsx
+++ b/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/AverageReimbursement.tsx
@@ -8,12 +8,12 @@ import getListOptionsFromCorpayPicklist from '@pages/ReimbursementAccount/NonUSD
 import ONYXKEYS from '@src/ONYXKEYS';
 import INPUT_IDS from '@src/types/form/EnableGlobalReimbursementsForm';
 
-type AverageReimbursementsProps = SubStepProps & {policyCurrency: string};
+type AverageReimbursementsProps = SubStepProps & {currency: string};
 
 const {TRADE_VOLUME} = INPUT_IDS;
 const STEP_FIELDS = [TRADE_VOLUME];
 
-function AverageReimbursements({onNext, onMove, isEditing, policyCurrency}: AverageReimbursementsProps) {
+function AverageReimbursements({onNext, onMove, isEditing, currency}: AverageReimbursementsProps) {
     const {translate} = useLocalize();
     const [enableGlobalReimbursementsDraft] = useOnyx(ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS_DRAFT, {canBeMissing: true});
     const [corpayOnboardingFields] = useOnyx(ONYXKEYS.CORPAY_ONBOARDING_FIELDS, {canBeMissing: true});
@@ -26,12 +26,12 @@ function AverageReimbursements({onNext, onMove, isEditing, policyCurrency}: Aver
                 inputID: TRADE_VOLUME,
                 defaultValue: enableGlobalReimbursementsDraft?.[TRADE_VOLUME] ?? '',
                 options: tradeVolumeRangeListOptions,
-                description: translate('businessInfoStep.averageReimbursementAmountInCurrency', {currencyCode: policyCurrency}),
+                description: translate('businessInfoStep.averageReimbursementAmountInCurrency', {currencyCode: currency}),
                 modalHeaderTitle: translate('businessInfoStep.selectAverageReimbursement'),
                 searchInputTitle: translate('businessInfoStep.findAverageReimbursement'),
             },
         ],
-        [enableGlobalReimbursementsDraft, policyCurrency, tradeVolumeRangeListOptions, translate],
+        [enableGlobalReimbursementsDraft, currency, tradeVolumeRangeListOptions, translate],
     );
 
     const handleSubmit = useEnableGlobalReimbursementsStepFormSubmit({
diff --git a/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/PaymentVolume.tsx b/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/PaymentVolume.tsx
index 63616d5ede44..1052d8e44106 100644
--- a/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/PaymentVolume.tsx
+++ b/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/PaymentVolume.tsx
@@ -8,12 +8,12 @@ import getListOptionsFromCorpayPicklist from '@pages/ReimbursementAccount/NonUSD
 import ONYXKEYS from '@src/ONYXKEYS';
 import INPUT_IDS from '@src/types/form/EnableGlobalReimbursementsForm';
 
-type PaymentVolumeProps = SubStepProps & {policyCurrency: string};
+type PaymentVolumeProps = SubStepProps & {currency: string};
 
 const {ANNUAL_VOLUME} = INPUT_IDS;
 const STEP_FIELDS = [ANNUAL_VOLUME];
 
-function PaymentVolume({onNext, onMove, isEditing, policyCurrency}: PaymentVolumeProps) {
+function PaymentVolume({onNext, onMove, isEditing, currency}: PaymentVolumeProps) {
     const {translate} = useLocalize();
     const [enableGlobalReimbursementsDraft] = useOnyx(ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS_DRAFT, {canBeMissing: true});
     const [corpayOnboardingFields] = useOnyx(ONYXKEYS.CORPAY_ONBOARDING_FIELDS, {canBeMissing: true});
@@ -26,12 +26,12 @@ function PaymentVolume({onNext, onMove, isEditing, policyCurrency}: PaymentVolum
                 inputID: ANNUAL_VOLUME,
                 defaultValue: enableGlobalReimbursementsDraft?.[ANNUAL_VOLUME] ?? '',
                 options: annualVolumeRangeListOptions,
-                description: translate('businessInfoStep.annualPaymentVolumeInCurrency', {currencyCode: policyCurrency}),
+                description: translate('businessInfoStep.annualPaymentVolumeInCurrency', {currencyCode: currency}),
                 modalHeaderTitle: translate('businessInfoStep.selectAnnualPaymentVolume'),
                 searchInputTitle: translate('businessInfoStep.findAnnualPaymentVolume'),
             },
         ],
-        [enableGlobalReimbursementsDraft, policyCurrency, annualVolumeRangeListOptions, translate],
+        [enableGlobalReimbursementsDraft, currency, annualVolumeRangeListOptions, translate],
     );
 
     const handleSubmit = useEnableGlobalReimbursementsStepFormSubmit({
diff --git a/src/pages/settings/Wallet/EnableGlobalReimbursements/Docusign/index.tsx b/src/pages/settings/Wallet/EnableGlobalReimbursements/Docusign/index.tsx
index c0b092d790f4..e1e94b9de98d 100644
--- a/src/pages/settings/Wallet/EnableGlobalReimbursements/Docusign/index.tsx
+++ b/src/pages/settings/Wallet/EnableGlobalReimbursements/Docusign/index.tsx
@@ -13,10 +13,10 @@ type DocusignProps = {
     onSubmit: () => void;
 
     /** Currency of affiliated policy */
-    policyCurrency: string;
+    currency: string;
 };
 
-function Docusign({onBackButtonPress, onSubmit, policyCurrency}: DocusignProps) {
+function Docusign({onBackButtonPress, onSubmit, currency}: DocusignProps) {
     const [enableGlobalReimbursements] = useOnyx(ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS, {canBeMissing: true});
     const [enableGlobalReimbursementsDraft] = useOnyx(ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS_DRAFT, {canBeMissing: true});
     const defaultValue = enableGlobalReimbursementsDraft?.[INPUT_IDS.ACH_AUTHORIZATION_FORM] ?? [];
@@ -29,7 +29,7 @@ function Docusign({onBackButtonPress, onSubmit, policyCurrency}: DocusignProps)
             isLoading={enableGlobalReimbursements?.isEnablingGlobalReimbursements ?? false}
             onBackButtonPress={onBackButtonPress}
             onSubmit={onSubmit}
-            policyCurrency={policyCurrency}
+            currency={currency}
             startStepIndex={2}
             stepNames={CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP_NAMES}
         />
diff --git a/src/pages/settings/Wallet/EnableGlobalReimbursements/index.tsx b/src/pages/settings/Wallet/EnableGlobalReimbursements/index.tsx
index 15f86994d19b..245884197c18 100644
--- a/src/pages/settings/Wallet/EnableGlobalReimbursements/index.tsx
+++ b/src/pages/settings/Wallet/EnableGlobalReimbursements/index.tsx
@@ -1,7 +1,6 @@
 import React, {useEffect, useState} from 'react';
 import type {ValueOf} from 'type-fest';
 import useOnyx from '@hooks/useOnyx';
-import mapCurrencyToCountry from '@libs/mapCurrencyToCountry';
 import Navigation from '@navigation/Navigation';
 import type {PlatformStackScreenProps} from '@navigation/PlatformStackNavigation/types';
 import type {SettingsNavigatorParamList} from '@navigation/types';
@@ -19,15 +18,16 @@ import Docusign from './Docusign';
 type EnableGlobalReimbursementsProps = PlatformStackScreenProps<SettingsNavigatorParamList, typeof SCREENS.SETTINGS.WALLET.ENABLE_GLOBAL_REIMBURSEMENTS>;
 
 function EnableGlobalReimbursements({route}: EnableGlobalReimbursementsProps) {
-    const policyID = route.params?.policyID;
-    const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {canBeMissing: false});
-    const policyCurrency = policy?.outputCurrency ?? '';
-    const [reimbursementAccount] = useOnyx(ONYXKEYS.REIMBURSEMENT_ACCOUNT, {canBeMissing: false});
+    const bankAccountID = route.params?.bankAccountID;
+    const [bankAccountList] = useOnyx(ONYXKEYS.BANK_ACCOUNT_LIST, {canBeMissing: false});
     const [enableGlobalReimbursements] = useOnyx(ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS, {canBeMissing: true});
     const [enableGlobalReimbursementsDraft] = useOnyx(ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS_DRAFT, {canBeMissing: true});
+    const currency = bankAccountList?.[bankAccountID]?.bankCurrency ?? '';
+    const country = bankAccountList?.[bankAccountID]?.bankCountry;
 
-    const country = mapCurrencyToCountry(policyCurrency);
-    const bankAccountID = reimbursementAccount?.achData?.bankAccountID ?? CONST.DEFAULT_NUMBER_ID;
+    console.log(route);
+    console.log(bankAccountList?.[bankAccountID]);
+    console.log(currency, 'currency');
     const [enableGlobalReimbursementsStep, setEnableGlobalReimbursementsStep] = useState<ValueOf<typeof CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP>>(
         CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP.BUSINESS_INFO,
     );
@@ -60,11 +60,11 @@ function EnableGlobalReimbursements({route}: EnableGlobalReimbursementsProps) {
                         businessRegistrationIncorporationNumber: enableGlobalReimbursementsDraft?.[INPUT_IDS.BUSINESS_REGISTRATION_INCORPORATION_NUMBER],
                         fundSourceCountries: country,
                         fundDestinationCountries: country,
-                        currencyNeeded: policyCurrency,
+                        currencyNeeded: currency,
                         purposeOfTransactionId: CONST.NON_USD_BANK_ACCOUNT.PURPOSE_OF_TRANSACTION_ID,
                     }),
                     achAuthorizationForm: enableGlobalReimbursementsDraft?.[INPUT_IDS.ACH_AUTHORIZATION_FORM].at(0),
-                    bankAccountID,
+                    bankAccountID: Number(bankAccountID),
                 });
         }
     };
@@ -108,7 +108,7 @@ function EnableGlobalReimbursements({route}: EnableGlobalReimbursementsProps) {
                 <BusinessInfo
                     onBackButtonPress={handleEnableGlobalReimbursementGoBack}
                     onSubmit={handleNextEnableGlobalReimbursementsStep}
-                    policyCurrency={policyCurrency}
+                    currency={currency}
                     country={country as Country}
                 />
             );
@@ -117,7 +117,7 @@ function EnableGlobalReimbursements({route}: EnableGlobalReimbursementsProps) {
                 <Agreements
                     onBackButtonPress={handleEnableGlobalReimbursementGoBack}
                     onSubmit={handleNextEnableGlobalReimbursementsStep}
-                    policyCurrency={policyCurrency}
+                    currency={currency}
                 />
             );
         case CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP.DOCUSIGN:
@@ -125,7 +125,7 @@ function EnableGlobalReimbursements({route}: EnableGlobalReimbursementsProps) {
                 <Docusign
                     onBackButtonPress={handleEnableGlobalReimbursementGoBack}
                     onSubmit={handleNextEnableGlobalReimbursementsStep}
-                    policyCurrency={policyCurrency}
+                    currency={currency}
                 />
             );
         default:
diff --git a/src/pages/settings/Wallet/WalletPage/WalletPage.tsx b/src/pages/settings/Wallet/WalletPage/WalletPage.tsx
index 18c7537688cb..a69098a8d02e 100644
--- a/src/pages/settings/Wallet/WalletPage/WalletPage.tsx
+++ b/src/pages/settings/Wallet/WalletPage/WalletPage.tsx
@@ -712,7 +712,7 @@ function WalletPage({shouldListenForResize = false}: WalletPageProps) {
                                             return;
                                         }
                                         closeModal(() =>
-                                            Navigation.navigate(ROUTES.SETTINGS_WALLET_ENABLE_GLOBAL_REIMBURSEMENTS.getRoute(paymentMethod.selectedPaymentMethod.additionalData?.policyID)),
+                                            Navigation.navigate(ROUTES.SETTINGS_WALLET_ENABLE_GLOBAL_REIMBURSEMENTS.getRoute(paymentMethod.selectedPaymentMethod.bankAccountID)),
                                         );
                                     }}
                                     wrapperStyle={[styles.pv3, styles.ph5, !shouldUseNarrowLayout ? styles.sidebarPopover : {}]}

From 59374fa03515ae215bd47e5a4bd91be987e67027 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20Muzyk?= <mimuzyk@gmail.com>
Date: Wed, 13 Aug 2025 13:10:05 +0200
Subject: [PATCH 07/18] fix: cleanup

---
 .../settings/Wallet/EnableGlobalReimbursements/index.tsx     | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/src/pages/settings/Wallet/EnableGlobalReimbursements/index.tsx b/src/pages/settings/Wallet/EnableGlobalReimbursements/index.tsx
index 245884197c18..88e2db9d5871 100644
--- a/src/pages/settings/Wallet/EnableGlobalReimbursements/index.tsx
+++ b/src/pages/settings/Wallet/EnableGlobalReimbursements/index.tsx
@@ -25,9 +25,6 @@ function EnableGlobalReimbursements({route}: EnableGlobalReimbursementsProps) {
     const currency = bankAccountList?.[bankAccountID]?.bankCurrency ?? '';
     const country = bankAccountList?.[bankAccountID]?.bankCountry;
 
-    console.log(route);
-    console.log(bankAccountList?.[bankAccountID]);
-    console.log(currency, 'currency');
     const [enableGlobalReimbursementsStep, setEnableGlobalReimbursementsStep] = useState<ValueOf<typeof CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP>>(
         CONST.ENABLE_GLOBAL_REIMBURSEMENTS.STEP.BUSINESS_INFO,
     );
@@ -94,7 +91,7 @@ function EnableGlobalReimbursements({route}: EnableGlobalReimbursementsProps) {
 
         if (enableGlobalReimbursements?.isSuccess) {
             clearEnableGlobalReimbursementsForUSDBankAccount();
-            Navigation.goBack();
+            Navigation.closeRHPFlow();
         }
 
         return () => {

From 4cab875207f6194743f4a95bfce2860a6f1303a4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20Muzyk?= <mimuzyk@gmail.com>
Date: Wed, 13 Aug 2025 13:22:42 +0200
Subject: [PATCH 08/18] fix: linter

---
 src/libs/API/types.ts                                         | 2 +-
 .../NonUSD/BusinessInfo/subSteps/RegistrationNumber.tsx       | 4 ++--
 .../Wallet/EnableGlobalReimbursements/Agreements/index.tsx    | 1 -
 3 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/src/libs/API/types.ts b/src/libs/API/types.ts
index ab4e1d5f118f..d08df2cdd0bb 100644
--- a/src/libs/API/types.ts
+++ b/src/libs/API/types.ts
@@ -2,9 +2,9 @@ import type {ValueOf} from 'type-fest';
 import type CONST from '@src/CONST';
 import type {SageIntacctMappingValue} from '@src/types/onyx/Policy';
 import type {EmptyObject} from '@src/types/utils/EmptyObject';
-import type * as Parameters from './parameters';
 // We have to disable eslint for this import because otherwise the import will be 300 lines long
 // eslint-disable-next-line no-restricted-syntax
+import type * as Parameters from './parameters';
 import type SignInUserParams from './parameters/SignInUserParams';
 import type UpdateBeneficialOwnersForBankAccountParams from './parameters/UpdateBeneficialOwnersForBankAccountParams';
 
diff --git a/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/RegistrationNumber.tsx b/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/RegistrationNumber.tsx
index 94f8205b5099..8c7ca75f7430 100644
--- a/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/RegistrationNumber.tsx
+++ b/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/RegistrationNumber.tsx
@@ -12,8 +12,8 @@ const {BUSINESS_REGISTRATION_INCORPORATION_NUMBER, COMPANY_COUNTRY_CODE} = INPUT
 const STEP_FIELDS = [BUSINESS_REGISTRATION_INCORPORATION_NUMBER];
 
 function RegistrationNumber({onNext, onMove, isEditing}: RegistrationNumberProps) {
-    const [reimbursementAccount] = useOnyx(ONYXKEYS.REIMBURSEMENT_ACCOUNT);
-    const [reimbursementAccountDraft] = useOnyx(ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM_DRAFT);
+    const [reimbursementAccount] = useOnyx(ONYXKEYS.REIMBURSEMENT_ACCOUNT, {canBeMissing: false});
+    const [reimbursementAccountDraft] = useOnyx(ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM_DRAFT, {canBeMissing: true});
     const defaultValue = reimbursementAccount?.achData?.corpay?.[BUSINESS_REGISTRATION_INCORPORATION_NUMBER] ?? '';
     const businessStepCountryDraftValue = reimbursementAccount?.achData?.corpay?.[COMPANY_COUNTRY_CODE] ?? reimbursementAccountDraft?.[COMPANY_COUNTRY_CODE] ?? '';
 
diff --git a/src/pages/settings/Wallet/EnableGlobalReimbursements/Agreements/index.tsx b/src/pages/settings/Wallet/EnableGlobalReimbursements/Agreements/index.tsx
index f08cf9cf7754..2617f5c1158b 100644
--- a/src/pages/settings/Wallet/EnableGlobalReimbursements/Agreements/index.tsx
+++ b/src/pages/settings/Wallet/EnableGlobalReimbursements/Agreements/index.tsx
@@ -2,7 +2,6 @@ import React from 'react';
 import AgreementsFullStep from '@components/SubStepForms/AgreementsFullStep';
 import useOnyx from '@hooks/useOnyx';
 import CONST from '@src/CONST';
-import type {Country} from '@src/CONST';
 import ONYXKEYS from '@src/ONYXKEYS';
 import INPUT_IDS from '@src/types/form/EnableGlobalReimbursementsForm';
 

From d77f3a214881495e6e34b0c936831a5b8c0ecbea Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20Muzyk?= <mimuzyk@gmail.com>
Date: Wed, 13 Aug 2025 14:02:25 +0200
Subject: [PATCH 09/18] fix: spanish translation

---
 src/languages/es.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/languages/es.ts b/src/languages/es.ts
index 6d48fea04abe..90d4e8e180b7 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -620,7 +620,7 @@ const translations = {
         headsUp: '¡Atención!',
         merge: 'Fusionar',
         unstableInternetConnection: 'Conexión a internet inestable. Por favor, revisa tu red e inténtalo de nuevo.',
-        enableGlobalReimbursements: 'Habilitar reembolsos globales',
+        enableGlobalReimbursements: 'Habilitar Reembolsos Globales',
     },
     supportalNoAccess: {
         title: 'No tan rápido',

From 4db015b1200a902676669e2cc7d5bccacb76a979 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20Muzyk?= <mimuzyk@gmail.com>
Date: Mon, 18 Aug 2025 10:08:53 +0200
Subject: [PATCH 10/18] fix: CR fixes

---
 Mobile-Expensify                              |  2 +-
 .../SubStepForms/RegistrationNumberStep.tsx   | 22 ++------------
 src/hooks/useDelayedAutoFocus.ts              | 30 +++++++++++++++++++
 .../utils/getSubStepValues.ts                 |  2 +-
 4 files changed, 34 insertions(+), 22 deletions(-)
 create mode 100644 src/hooks/useDelayedAutoFocus.ts

diff --git a/Mobile-Expensify b/Mobile-Expensify
index 80d9172f6834..cf1b9e864aa7 160000
--- a/Mobile-Expensify
+++ b/Mobile-Expensify
@@ -1 +1 @@
-Subproject commit 80d9172f68347c7413f8acd26322906506cac5a4
+Subproject commit cf1b9e864aa7900a46b23f15bcc06a1e654d7a33
diff --git a/src/components/SubStepForms/RegistrationNumberStep.tsx b/src/components/SubStepForms/RegistrationNumberStep.tsx
index 992e7f8dd50c..acf97669baa9 100644
--- a/src/components/SubStepForms/RegistrationNumberStep.tsx
+++ b/src/components/SubStepForms/RegistrationNumberStep.tsx
@@ -10,6 +10,7 @@ import type {AnimatedTextInputRef} from '@components/RNTextInput';
 import Text from '@components/Text';
 import TextInput from '@components/TextInput';
 import TextLink from '@components/TextLink';
+import useDelayedAutoFocus from '@hooks/useDelayedAutoFocus';
 import useLocalize from '@hooks/useLocalize';
 import type {SubStepProps} from '@hooks/useSubStep/types';
 import useTheme from '@hooks/useTheme';
@@ -53,26 +54,7 @@ function RegistrationNumberStep<TFormID extends keyof OnyxFormValuesMapping>({
     const theme = useTheme();
 
     const internalInputRef = useRef<AnimatedTextInputRef>(null);
-    const focusTimeoutRef = useRef<NodeJS.Timeout | null>(null);
-
-    useFocusEffect(
-        useCallback(() => {
-            if (!shouldDelayAutoFocus) {
-                return;
-            }
-
-            focusTimeoutRef.current = setTimeout(() => {
-                internalInputRef.current?.focus();
-            }, CONST.ANIMATED_TRANSITION);
-
-            return () => {
-                if (!focusTimeoutRef.current) {
-                    return;
-                }
-                clearTimeout(focusTimeoutRef.current);
-            };
-        }, [shouldDelayAutoFocus]),
-    );
+    useDelayedAutoFocus(internalInputRef, shouldDelayAutoFocus);
 
     const validate = useCallback(
         (values: FormOnyxValues<TFormID>): FormInputErrors<TFormID> => {
diff --git a/src/hooks/useDelayedAutoFocus.ts b/src/hooks/useDelayedAutoFocus.ts
new file mode 100644
index 000000000000..a3988df11cf5
--- /dev/null
+++ b/src/hooks/useDelayedAutoFocus.ts
@@ -0,0 +1,30 @@
+import {useFocusEffect} from '@react-navigation/native';
+import type {RefObject} from 'react';
+import {useCallback, useRef} from 'react';
+import CONST from '@src/CONST';
+
+function useDelayedAutoFocus(ref: RefObject<{focus: () => void} | null>, shouldDelayAutoFocus: boolean) {
+    const focusTimeoutRef = useRef<NodeJS.Timeout | null>(null);
+
+    useFocusEffect(
+        useCallback(() => {
+            if (!shouldDelayAutoFocus) {
+                return undefined;
+            }
+
+            focusTimeoutRef.current = setTimeout(() => {
+                ref.current?.focus();
+            }, CONST.ANIMATED_TRANSITION);
+
+            return () => {
+                const timeout = focusTimeoutRef.current;
+                if (timeout) {
+                    clearTimeout(timeout);
+                    focusTimeoutRef.current = null;
+                }
+            };
+        }, [shouldDelayAutoFocus, ref]),
+    );
+}
+
+export default useDelayedAutoFocus;
diff --git a/src/pages/ReimbursementAccount/utils/getSubStepValues.ts b/src/pages/ReimbursementAccount/utils/getSubStepValues.ts
index 5a63df414bdc..2a73546075c9 100644
--- a/src/pages/ReimbursementAccount/utils/getSubStepValues.ts
+++ b/src/pages/ReimbursementAccount/utils/getSubStepValues.ts
@@ -16,7 +16,7 @@ function getSubStepValues<TProps extends keyof ReimbursementAccountForm>(
         acc[value] = (reimbursementAccountDraft?.[value] ??
             reimbursementAccount?.achData?.[value as keyof ACHData] ??
             reimbursementAccount?.achData?.corpay?.[value as keyof Corpay] ??
-            (value === 'achAuthorizationForm' ? [] : '')) as ReimbursementAccountForm[TProps];
+            '') as ReimbursementAccountForm[TProps];
         return acc;
     }, {} as SubStepValues<TProps>);
 }

From 07404e3f3e76794097a711392e4ce6f6f3101595 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20Muzyk?= <mimuzyk@gmail.com>
Date: Mon, 18 Aug 2025 10:11:20 +0200
Subject: [PATCH 11/18] fix: linter

---
 src/components/SubStepForms/RegistrationNumberStep.tsx | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/components/SubStepForms/RegistrationNumberStep.tsx b/src/components/SubStepForms/RegistrationNumberStep.tsx
index acf97669baa9..eea62da28bfc 100644
--- a/src/components/SubStepForms/RegistrationNumberStep.tsx
+++ b/src/components/SubStepForms/RegistrationNumberStep.tsx
@@ -1,4 +1,3 @@
-import {useFocusEffect} from '@react-navigation/native';
 import React, {useCallback, useRef} from 'react';
 import {View} from 'react-native';
 import FormProvider from '@components/Form/FormProvider';

From 1492224f661cc62e784caac61a4b8b7efbcda6da Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20Muzyk?= <mimuzyk@gmail.com>
Date: Mon, 18 Aug 2025 15:49:00 +0200
Subject: [PATCH 12/18] fix: clear errors on component unmounting

---
 .../settings/Wallet/EnableGlobalReimbursements/index.tsx     | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/src/pages/settings/Wallet/EnableGlobalReimbursements/index.tsx b/src/pages/settings/Wallet/EnableGlobalReimbursements/index.tsx
index 88e2db9d5871..63e85917bd1c 100644
--- a/src/pages/settings/Wallet/EnableGlobalReimbursements/index.tsx
+++ b/src/pages/settings/Wallet/EnableGlobalReimbursements/index.tsx
@@ -83,6 +83,10 @@ function EnableGlobalReimbursements({route}: EnableGlobalReimbursementsProps) {
         }
     };
 
+    useEffect(() => {
+        return clearErrors(ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS);
+    }, []);
+
     useEffect(() => {
         // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
         if (enableGlobalReimbursements?.errors || enableGlobalReimbursements?.isEnablingGlobalReimbursements || !enableGlobalReimbursements?.isSuccess) {
@@ -95,6 +99,7 @@ function EnableGlobalReimbursements({route}: EnableGlobalReimbursementsProps) {
         }
 
         return () => {
+            clearErrors(ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS);
             clearEnableGlobalReimbursementsForUSDBankAccount();
         };
     }, [enableGlobalReimbursements?.errors, enableGlobalReimbursements?.isEnablingGlobalReimbursements, enableGlobalReimbursements?.isSuccess]);

From 4687bbe27951e37483536a09d4efc0c5c9a40ec4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20Muzyk?= <mimuzyk@gmail.com>
Date: Mon, 18 Aug 2025 15:49:41 +0200
Subject: [PATCH 13/18] fix: small correction

---
 src/pages/settings/Wallet/EnableGlobalReimbursements/index.tsx | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/pages/settings/Wallet/EnableGlobalReimbursements/index.tsx b/src/pages/settings/Wallet/EnableGlobalReimbursements/index.tsx
index 63e85917bd1c..d0be360f8c6b 100644
--- a/src/pages/settings/Wallet/EnableGlobalReimbursements/index.tsx
+++ b/src/pages/settings/Wallet/EnableGlobalReimbursements/index.tsx
@@ -99,7 +99,6 @@ function EnableGlobalReimbursements({route}: EnableGlobalReimbursementsProps) {
         }
 
         return () => {
-            clearErrors(ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS);
             clearEnableGlobalReimbursementsForUSDBankAccount();
         };
     }, [enableGlobalReimbursements?.errors, enableGlobalReimbursements?.isEnablingGlobalReimbursements, enableGlobalReimbursements?.isSuccess]);

From 0fc4857743518a3306c88765732bc4480dfdfcab Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20Muzyk?= <mimuzyk@gmail.com>
Date: Tue, 19 Aug 2025 15:39:54 +0200
Subject: [PATCH 14/18] fix: add spinner to the agreements step

---
 src/components/SubStepForms/AgreementsFullStep/index.tsx  | 8 ++++++++
 .../AgreementsFullStep/subSteps/Confirmation.tsx          | 7 ++++++-
 .../ReimbursementAccount/NonUSD/Agreements/index.tsx      | 1 +
 3 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/src/components/SubStepForms/AgreementsFullStep/index.tsx b/src/components/SubStepForms/AgreementsFullStep/index.tsx
index b6d873eda799..ab8fe9fc445b 100644
--- a/src/components/SubStepForms/AgreementsFullStep/index.tsx
+++ b/src/components/SubStepForms/AgreementsFullStep/index.tsx
@@ -24,6 +24,9 @@ type AgreementsFullStepProps<TFormID extends keyof OnyxFormValuesMapping> = {
         authorizedToBindClientToAgreement: FormOnyxKeys<TFormID>;
     };
 
+    /** Indicates that action is being processed */
+    isLoading: boolean;
+
     /** Handles back button press */
     onBackButtonPress: () => void;
 
@@ -50,6 +53,9 @@ type AgreementsFullStepSubStepProps<TFormID extends keyof OnyxFormValuesMapping>
     /** Input IDs for field in the form */
     inputIDs: AgreementsFullStepProps<TFormID>['inputIDs'];
 
+    /** Indicates that action is being processed */
+    isLoading: boolean;
+
     /** Currency of related account */
     currency: string;
 };
@@ -58,6 +64,7 @@ function AgreementsFullStep<TFormID extends keyof OnyxFormValuesMapping>({
     defaultValues,
     formID,
     inputIDs,
+    isLoading,
     onBackButtonPress,
     onSubmit,
     currency,
@@ -105,6 +112,7 @@ function AgreementsFullStep<TFormID extends keyof OnyxFormValuesMapping>({
                 formID={formID}
                 inputIDs={inputIDs}
                 isEditing={isEditing}
+                isLoading={isLoading}
                 onMove={moveTo}
                 onNext={nextScreen}
                 currency={currency}
diff --git a/src/components/SubStepForms/AgreementsFullStep/subSteps/Confirmation.tsx b/src/components/SubStepForms/AgreementsFullStep/subSteps/Confirmation.tsx
index 250f16a28647..380b56d4bdf0 100644
--- a/src/components/SubStepForms/AgreementsFullStep/subSteps/Confirmation.tsx
+++ b/src/components/SubStepForms/AgreementsFullStep/subSteps/Confirmation.tsx
@@ -56,11 +56,14 @@ type ConfirmationProps<TFormID extends keyof OnyxFormValuesMapping> = SubStepPro
         authorizedToBindClientToAgreement: FormOnyxKeys<TFormID>;
     };
 
+    /** Indicates that action is being processed */
+    isLoading: boolean;
+
     /** Currency of related account */
     currency: string;
 };
 
-function Confirmation<TFormID extends keyof OnyxFormValuesMapping>({defaultValues, formID, inputIDs, onNext, currency}: ConfirmationProps<TFormID>) {
+function Confirmation<TFormID extends keyof OnyxFormValuesMapping>({defaultValues, formID, inputIDs, isLoading, onNext, currency}: ConfirmationProps<TFormID>) {
     const {translate} = useLocalize();
     const styles = useThemeStyles();
 
@@ -103,6 +106,8 @@ function Confirmation<TFormID extends keyof OnyxFormValuesMapping>({defaultValue
             validate={validate}
             submitButtonText={isDocusignStepRequired ? translate('common.confirm') : translate('agreementsStep.accept')}
             style={[styles.mh5, styles.flexGrow1]}
+            enabledWhenOffline={false}
+            isLoading={isLoading}
         >
             <Text style={[styles.textHeadlineLineHeightXXL]}>{translate('agreementsStep.pleaseConfirm')}</Text>
             {!isDocusignStepRequired && <Text style={[styles.pv3, styles.textSupporting]}>{translate('agreementsStep.regulationRequiresUs')}</Text>}
diff --git a/src/pages/ReimbursementAccount/NonUSD/Agreements/index.tsx b/src/pages/ReimbursementAccount/NonUSD/Agreements/index.tsx
index 456b0a484ce3..4da01d34528e 100644
--- a/src/pages/ReimbursementAccount/NonUSD/Agreements/index.tsx
+++ b/src/pages/ReimbursementAccount/NonUSD/Agreements/index.tsx
@@ -84,6 +84,7 @@ function Agreements({onBackButtonPress, onSubmit, stepNames, policyCurrency}: Ag
             defaultValues={agreementsStepValues}
             formID={ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM}
             inputIDs={INPUT_KEYS}
+            isLoading={reimbursementAccount?.isFinishingCorpayBankAccountOnboarding ?? false}
             onBackButtonPress={handleBackButtonPress}
             onSubmit={submit}
             currency={policyCurrency ?? ''}

From 83c96f9683f6f17da747d9929f13c7d67eed7967 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20Muzyk?= <mimuzyk@gmail.com>
Date: Wed, 20 Aug 2025 07:48:52 +0200
Subject: [PATCH 15/18] fix: typecheck and crash

---
 .../ReimbursementAccountPage.tsx                     | 12 +-----------
 .../ReimbursementAccount/utils/getSubStepValues.ts   |  3 ++-
 .../EnableGlobalReimbursements/Agreements/index.tsx  |  1 +
 3 files changed, 4 insertions(+), 12 deletions(-)

diff --git a/src/pages/ReimbursementAccount/ReimbursementAccountPage.tsx b/src/pages/ReimbursementAccount/ReimbursementAccountPage.tsx
index 69dc05fe6fbb..7cf9de728929 100644
--- a/src/pages/ReimbursementAccount/ReimbursementAccountPage.tsx
+++ b/src/pages/ReimbursementAccount/ReimbursementAccountPage.tsx
@@ -264,11 +264,6 @@ function ReimbursementAccountPage({route, policy, isLoadingPolicy}: Reimbursemen
 
     const continueNonUSDVBBASetup = () => {
         const isPastSignerStep = achData?.corpay?.signerFullName && achData?.corpay?.authorizedToBindClientToAgreement === undefined;
-        const allAgreementsChecked =
-            reimbursementAccountDraft?.authorizedToBindClientToAgreement === true &&
-            reimbursementAccountDraft?.agreeToTermsAndConditions === true &&
-            reimbursementAccountDraft?.consentToPrivacyNotice === true &&
-            reimbursementAccountDraft?.provideTruthfulInformation === true;
 
         setShouldShowContinueSetupButton(false);
         if (nonUSDCountryDraftValue !== '' && achData?.created === undefined) {
@@ -291,16 +286,11 @@ function ReimbursementAccountPage({route, policy, isLoadingPolicy}: Reimbursemen
             return;
         }
 
-        if (isPastSignerStep && !allAgreementsChecked) {
+        if (isPastSignerStep) {
             setNonUSDBankAccountStep(CONST.NON_USD_BANK_ACCOUNT.STEP.AGREEMENTS);
             return;
         }
 
-        if (isPastSignerStep && allAgreementsChecked) {
-            setNonUSDBankAccountStep(CONST.NON_USD_BANK_ACCOUNT.STEP.DOCUSIGN);
-            return;
-        }
-
         if (achData?.state === CONST.BANK_ACCOUNT.STATE.VERIFYING) {
             setNonUSDBankAccountStep(CONST.NON_USD_BANK_ACCOUNT.STEP.FINISH);
         }
diff --git a/src/pages/ReimbursementAccount/utils/getSubStepValues.ts b/src/pages/ReimbursementAccount/utils/getSubStepValues.ts
index 2a73546075c9..d0918b5441da 100644
--- a/src/pages/ReimbursementAccount/utils/getSubStepValues.ts
+++ b/src/pages/ReimbursementAccount/utils/getSubStepValues.ts
@@ -1,5 +1,6 @@
 import type {OnyxEntry} from 'react-native-onyx';
 import type {ReimbursementAccountForm} from '@src/types/form';
+import INPUT_IDS from '@src/types/form/ReimbursementAccountForm';
 import type {ReimbursementAccount} from '@src/types/onyx';
 import type {ACHData, Corpay} from '@src/types/onyx/ReimbursementAccount';
 
@@ -16,7 +17,7 @@ function getSubStepValues<TProps extends keyof ReimbursementAccountForm>(
         acc[value] = (reimbursementAccountDraft?.[value] ??
             reimbursementAccount?.achData?.[value as keyof ACHData] ??
             reimbursementAccount?.achData?.corpay?.[value as keyof Corpay] ??
-            '') as ReimbursementAccountForm[TProps];
+            (value === INPUT_IDS.ADDITIONAL_DATA.CORPAY.ACH_AUTHORIZATION_FORM ? [] : '')) as ReimbursementAccountForm[TProps];
         return acc;
     }, {} as SubStepValues<TProps>);
 }
diff --git a/src/pages/settings/Wallet/EnableGlobalReimbursements/Agreements/index.tsx b/src/pages/settings/Wallet/EnableGlobalReimbursements/Agreements/index.tsx
index 2617f5c1158b..1161f736073c 100644
--- a/src/pages/settings/Wallet/EnableGlobalReimbursements/Agreements/index.tsx
+++ b/src/pages/settings/Wallet/EnableGlobalReimbursements/Agreements/index.tsx
@@ -37,6 +37,7 @@ function Agreements({onBackButtonPress, onSubmit, currency}: AgreementsProps) {
             defaultValues={defaultValues}
             formID={ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS}
             inputIDs={inputIDs}
+            isLoading={false}
             onBackButtonPress={onBackButtonPress}
             onSubmit={onSubmit}
             currency={currency}

From 2ee7a99c5bc3c75db256d85f8693aac756d33028 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20Muzyk?= <mimuzyk@gmail.com>
Date: Wed, 20 Aug 2025 09:02:46 +0200
Subject: [PATCH 16/18] align validation with corpays

---
 Mobile-Expensify                                       |  2 +-
 src/libs/ValidationUtils.ts                            |  5 ++---
 .../NonUSD/BusinessInfo/BusinessInfo.tsx               |  7 ++++++-
 .../ReimbursementAccount/NonUSD/SignerInfo/index.tsx   | 10 ++++++++--
 4 files changed, 17 insertions(+), 7 deletions(-)

diff --git a/Mobile-Expensify b/Mobile-Expensify
index 9b52ac7b0ba2..6db359196b62 160000
--- a/Mobile-Expensify
+++ b/Mobile-Expensify
@@ -1 +1 @@
-Subproject commit 9b52ac7b0ba20731fa8bd56a9b2f6b9f97199429
+Subproject commit 6db359196b62d470925cfd8a70e41820a67e9179
diff --git a/src/libs/ValidationUtils.ts b/src/libs/ValidationUtils.ts
index 0f511b16233f..b98a6ebe952c 100644
--- a/src/libs/ValidationUtils.ts
+++ b/src/libs/ValidationUtils.ts
@@ -11,7 +11,7 @@ import type {Report, TaxRates} from '@src/types/onyx';
 import {getMonthFromExpirationDateString, getYearFromExpirationDateString} from './CardUtils';
 import DateUtils from './DateUtils';
 import {translateLocal} from './Localize';
-import {appendCountryCode, getPhoneNumberWithoutSpecialChars} from './LoginUtils';
+import {getPhoneNumberWithoutSpecialChars} from './LoginUtils';
 import {parsePhoneNumber} from './PhoneNumber';
 import StringUtils from './StringUtils';
 
@@ -542,8 +542,7 @@ function isValidEmail(email: string): boolean {
  * @param phoneNumber
  */
 function isValidPhoneInternational(phoneNumber: string): boolean {
-    const phoneNumberWithCountryCode = appendCountryCode(phoneNumber);
-    const parsedPhoneNumber = parsePhoneNumber(phoneNumberWithCountryCode);
+    const parsedPhoneNumber = parsePhoneNumber(phoneNumber);
 
     return parsedPhoneNumber.possible && Str.isValidE164Phone(parsedPhoneNumber.number?.e164 ?? '');
 }
diff --git a/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/BusinessInfo.tsx b/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/BusinessInfo.tsx
index 29e51beaef57..93dd039275a6 100644
--- a/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/BusinessInfo.tsx
+++ b/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/BusinessInfo.tsx
@@ -1,6 +1,8 @@
+import {Str} from 'expensify-common';
 import type {ComponentType} from 'react';
 import React, {useCallback, useEffect, useMemo} from 'react';
 import InteractiveStepWrapper from '@components/InteractiveStepWrapper';
+import useEnvironment from '@hooks/useEnvironment';
 import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
 import useSubStep from '@hooks/useSubStep';
@@ -72,6 +74,7 @@ const INPUT_KEYS = {
 function BusinessInfo({onBackButtonPress, onSubmit, stepNames}: BusinessInfoProps) {
     const {translate} = useLocalize();
 
+    const {isDevelopment} = useEnvironment();
     const [reimbursementAccount] = useOnyx(ONYXKEYS.REIMBURSEMENT_ACCOUNT, {canBeMissing: false});
     const [reimbursementAccountDraft] = useOnyx(ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM_DRAFT, {canBeMissing: true});
     const policyID = reimbursementAccount?.achData?.policyID;
@@ -92,6 +95,8 @@ function BusinessInfo({onBackButtonPress, onSubmit, stepNames}: BusinessInfoProp
         saveCorpayOnboardingCompanyDetails(
             {
                 ...businessInfoStepValues,
+                // Corpay does not accept emails with a "+" character and will not let us connect account at the end of whole flow
+                businessConfirmationEmail: isDevelopment ? Str.replaceAll(businessInfoStepValues.businessConfirmationEmail, '+', '') : businessInfoStepValues.businessConfirmationEmail,
                 fundSourceCountries: country,
                 fundDestinationCountries: country,
                 currencyNeeded: currency,
@@ -99,7 +104,7 @@ function BusinessInfo({onBackButtonPress, onSubmit, stepNames}: BusinessInfoProp
             },
             bankAccountID,
         );
-    }, [country, currency, bankAccountID, businessInfoStepValues]);
+    }, [businessInfoStepValues, isDevelopment, country, currency, bankAccountID]);
 
     useEffect(() => {
         // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
diff --git a/src/pages/ReimbursementAccount/NonUSD/SignerInfo/index.tsx b/src/pages/ReimbursementAccount/NonUSD/SignerInfo/index.tsx
index 0a5eee194141..779765d85bd9 100644
--- a/src/pages/ReimbursementAccount/NonUSD/SignerInfo/index.tsx
+++ b/src/pages/ReimbursementAccount/NonUSD/SignerInfo/index.tsx
@@ -1,7 +1,9 @@
+import {Str} from 'expensify-common';
 import type {ComponentType} from 'react';
 import React, {useCallback, useEffect, useMemo, useState} from 'react';
 import InteractiveStepWrapper from '@components/InteractiveStepWrapper';
 import YesNoStep from '@components/SubStepForms/YesNoStep';
+import useEnvironment from '@hooks/useEnvironment';
 import useLocalize from '@hooks/useLocalize';
 import useOnyx from '@hooks/useOnyx';
 import useSubStep from '@hooks/useSubStep';
@@ -44,6 +46,7 @@ const userIsOwnerBodyContent: Array<ComponentType<SignerDetailsFormProps>> = [Jo
 
 function SignerInfo({onBackButtonPress, onSubmit, stepNames}: SignerInfoProps) {
     const {translate} = useLocalize();
+    const {isDevelopment} = useEnvironment();
 
     const [reimbursementAccount] = useOnyx(ONYXKEYS.REIMBURSEMENT_ACCOUNT, {canBeMissing: false});
     const [reimbursementAccountDraft] = useOnyx(ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM_DRAFT, {canBeMissing: true});
@@ -56,16 +59,19 @@ function SignerInfo({onBackButtonPress, onSubmit, stepNames}: SignerInfoProps) {
     const bankAccountID = reimbursementAccount?.achData?.bankAccountID ?? CONST.DEFAULT_NUMBER_ID;
     const [currentSubStep, setCurrentSubStep] = useState<number>(SUBSTEP.IS_DIRECTOR);
     const [isUserDirector, setIsUserDirector] = useState(false);
+    const primaryLogin = account?.primaryLogin ?? '';
+    // Corpay does not accept emails with a "+" character and will not let us connect account at the end of whole flow
+    const signerEmail = isDevelopment ? Str.replaceAll(primaryLogin, '+', '') : primaryLogin;
 
     const submit = useCallback(() => {
-        const {signerDetails, signerFiles} = getSignerDetailsAndSignerFilesForSignerInfo(reimbursementAccountDraft, account?.primaryLogin ?? '', isUserOwner);
+        const {signerDetails, signerFiles} = getSignerDetailsAndSignerFilesForSignerInfo(reimbursementAccountDraft, signerEmail, isUserOwner);
 
         saveCorpayOnboardingDirectorInformation({
             inputs: JSON.stringify(signerDetails),
             ...signerFiles,
             bankAccountID,
         });
-    }, [account?.primaryLogin, bankAccountID, isUserOwner, reimbursementAccountDraft]);
+    }, [bankAccountID, isUserOwner, reimbursementAccountDraft, signerEmail]);
 
     useEffect(() => {
         // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing

From 3924e59dbc0c8747b1cb32a9a0178764a2bb46a3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20Muzyk?= <mimuzyk@gmail.com>
Date: Wed, 20 Aug 2025 11:20:24 +0200
Subject: [PATCH 17/18] fix: improved continue step

---
 .../ReimbursementAccountPage.tsx              | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/src/pages/ReimbursementAccount/ReimbursementAccountPage.tsx b/src/pages/ReimbursementAccount/ReimbursementAccountPage.tsx
index 7cf9de728929..dc6e87264474 100644
--- a/src/pages/ReimbursementAccount/ReimbursementAccountPage.tsx
+++ b/src/pages/ReimbursementAccount/ReimbursementAccountPage.tsx
@@ -51,6 +51,7 @@ import type {ACHDataReimbursementAccount} from '@src/types/onyx/ReimbursementAcc
 import {isEmptyObject} from '@src/types/utils/EmptyObject';
 import ConnectedVerifiedBankAccount from './ConnectedVerifiedBankAccount';
 import NonUSDVerifiedBankAccountFlow from './NonUSD/NonUSDVerifiedBankAccountFlow';
+import requiresDocusignStep from './NonUSD/utils/requiresDocusignStep';
 import USDVerifiedBankAccountFlow from './USD/USDVerifiedBankAccountFlow';
 import getFieldsForStep from './USD/utils/getFieldsForStep';
 import getStepToOpenFromRouteParams from './USD/utils/getStepToOpenFromRouteParams';
@@ -95,6 +96,7 @@ function ReimbursementAccountPage({route, policy, isLoadingPolicy}: Reimbursemen
     const achData = reimbursementAccount?.achData;
     const isPreviousPolicy = policyIDParam === achData?.policyID;
     const hasConfirmedUSDCurrency = (reimbursementAccountDraft?.[INPUT_IDS.ADDITIONAL_DATA.COUNTRY] ?? '') !== '' || (achData?.accountNumber ?? '') !== '';
+    const isDocusignStepRequired = requiresDocusignStep(policyCurrency);
 
     /**
      We main rely on `achData.currentStep` to determine the step to display in USD flow.
@@ -264,6 +266,11 @@ function ReimbursementAccountPage({route, policy, isLoadingPolicy}: Reimbursemen
 
     const continueNonUSDVBBASetup = () => {
         const isPastSignerStep = achData?.corpay?.signerFullName && achData?.corpay?.authorizedToBindClientToAgreement === undefined;
+        const allAgreementsChecked =
+            reimbursementAccountDraft?.authorizedToBindClientToAgreement === true &&
+            reimbursementAccountDraft?.agreeToTermsAndConditions === true &&
+            reimbursementAccountDraft?.consentToPrivacyNotice === true &&
+            reimbursementAccountDraft?.provideTruthfulInformation === true;
 
         setShouldShowContinueSetupButton(false);
         if (nonUSDCountryDraftValue !== '' && achData?.created === undefined) {
@@ -286,11 +293,21 @@ function ReimbursementAccountPage({route, policy, isLoadingPolicy}: Reimbursemen
             return;
         }
 
-        if (isPastSignerStep) {
+        if (isPastSignerStep && !allAgreementsChecked) {
             setNonUSDBankAccountStep(CONST.NON_USD_BANK_ACCOUNT.STEP.AGREEMENTS);
             return;
         }
 
+        if (isPastSignerStep && allAgreementsChecked && !isDocusignStepRequired) {
+            setNonUSDBankAccountStep(CONST.NON_USD_BANK_ACCOUNT.STEP.AGREEMENTS);
+            return;
+        }
+
+        if (isPastSignerStep && allAgreementsChecked && isDocusignStepRequired) {
+            setNonUSDBankAccountStep(CONST.NON_USD_BANK_ACCOUNT.STEP.DOCUSIGN);
+            return;
+        }
+
         if (achData?.state === CONST.BANK_ACCOUNT.STATE.VERIFYING) {
             setNonUSDBankAccountStep(CONST.NON_USD_BANK_ACCOUNT.STEP.FINISH);
         }

From 9d3ac5a8f2f8acce295ab096c0894405501d58c7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20Muzyk?= <mimuzyk@gmail.com>
Date: Mon, 25 Aug 2025 16:10:55 +0200
Subject: [PATCH 18/18] feat: Hide behind beta

---
 src/pages/settings/Wallet/WalletPage/WalletPage.tsx | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/pages/settings/Wallet/WalletPage/WalletPage.tsx b/src/pages/settings/Wallet/WalletPage/WalletPage.tsx
index a69098a8d02e..632c99b37db3 100644
--- a/src/pages/settings/Wallet/WalletPage/WalletPage.tsx
+++ b/src/pages/settings/Wallet/WalletPage/WalletPage.tsx
@@ -29,6 +29,7 @@ import useNetwork from '@hooks/useNetwork';
 import useOnyx from '@hooks/useOnyx';
 import usePaymentMethodState from '@hooks/usePaymentMethodState';
 import type {FormattedSelectedPaymentMethod, FormattedSelectedPaymentMethodIcon} from '@hooks/usePaymentMethodState/types';
+import usePermissions from '@hooks/usePermissions';
 import useResponsiveLayout from '@hooks/useResponsiveLayout';
 import useTheme from '@hooks/useTheme';
 import useThemeStyles from '@hooks/useThemeStyles';
@@ -69,6 +70,7 @@ function WalletPage({shouldListenForResize = false}: WalletPageProps) {
     const isUserValidated = userAccount?.validated ?? false;
     const {isActingAsDelegate, showDelegateNoAccessModal} = useContext(DelegateNoAccessContext);
     const {isAccountLocked, showLockedAccountModal} = useContext(LockedAccountContext);
+    const {isBetaEnabled} = usePermissions();
 
     const theme = useTheme();
     const styles = useThemeStyles();
@@ -386,7 +388,9 @@ function WalletPage({shouldListenForResize = false}: WalletPageProps) {
         !(paymentMethod.formattedSelectedPaymentMethod.type === CONST.PAYMENT_METHODS.PERSONAL_BANK_ACCOUNT && paymentMethod.selectedPaymentMethod.type === CONST.BANK_ACCOUNT.TYPE.BUSINESS);
 
     const shouldShowEnableGlobalReimbursementsButton =
-        paymentMethod.selectedPaymentMethod.type === CONST.BANK_ACCOUNT.TYPE.BUSINESS && !paymentMethod.selectedPaymentMethod?.additionalData?.corpay?.achAuthorizationForm;
+        isBetaEnabled(CONST.BETAS.GLOBAL_REIMBURSEMENTS_ON_ND) &&
+        paymentMethod.selectedPaymentMethod.type === CONST.BANK_ACCOUNT.TYPE.BUSINESS &&
+        !paymentMethod.selectedPaymentMethod?.additionalData?.corpay?.achAuthorizationForm;
 
     // Determines whether or not the modal popup is mounted from the bottom of the screen instead of the side mount on Web or Desktop screens
     const isPopoverBottomMount = anchorPosition.anchorPositionTop === 0 || shouldUseNarrowLayout;
