Skip to content

Commit d725c14

Browse files
authored
Merge pull request #58422 from Expensify/andrew-main-to-staging
Manually update `staging` branch with `main`
2 parents a8af1e1 + e6f4a57 commit d725c14

File tree

228 files changed

+5620
-1776
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

228 files changed

+5620
-1776
lines changed

.github/workflows/e2ePerformanceTests.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ jobs:
113113

114114
- name: Setup Node
115115
uses: ./.github/actions/composite/setupNode
116+
with:
117+
IS_DESKTOP_BUILD: 'true'
116118

117119
- name: Make zip directory for everything to send to AWS Device Farm
118120
run: mkdir zip

Mobile-Expensify

android/app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,8 @@ android {
114114
minSdkVersion rootProject.ext.minSdkVersion
115115
targetSdkVersion rootProject.ext.targetSdkVersion
116116
multiDexEnabled rootProject.ext.multiDexEnabled
117-
versionCode 1009011207
118-
versionName "9.1.12-7"
117+
versionCode 1009011300
118+
versionName "9.1.13-0"
119119
// Supported language variants must be declared here to avoid from being removed during the compilation.
120120
// This also helps us to not include unnecessary language variants in the APK.
121121
resConfigs "en", "es"

android/app/src/main/java/com/expensify/chat/navbar/NavBarManagerModule.kt

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package com.expensify.chat.navbar
22

3+
import android.content.res.Resources
34
import androidx.core.view.WindowInsetsControllerCompat
5+
import com.expensify.chat.R
46
import com.facebook.react.bridge.ReactApplicationContext
57
import com.facebook.react.bridge.ReactContextBaseJavaModule
68
import com.facebook.react.bridge.ReactMethod
7-
import com.facebook.react.bridge.UiThreadUtil;
9+
import com.facebook.react.bridge.UiThreadUtil
810

911
class NavBarManagerModule(
1012
private val mReactContext: ReactApplicationContext,
@@ -24,4 +26,18 @@ class NavBarManagerModule(
2426
}
2527
}
2628
}
29+
30+
@ReactMethod
31+
fun getType(): String {
32+
val resources = mReactContext.resources
33+
val resourceId = resources.getIdentifier("config_navBarInteractionMode", "integer", "android");
34+
if (resourceId > 0) {
35+
val navBarInteractionMode = resources.getInteger(resourceId)
36+
when (navBarInteractionMode) {
37+
0, 1 -> return "soft-keys"
38+
2 -> return "gesture-bar"
39+
}
40+
}
41+
return "soft-keys";
42+
}
2743
}

assets/images/product-illustrations/emptystate__receiptfairy.svg

Lines changed: 154 additions & 0 deletions
Loading

contributingGuides/FORMS.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ Browsers use the name prop to autofill information into the input. Here's a [ref
6868

6969
```jsx
7070
<InputWrapper
71-
InputComponent={TextInput}
71+
InputComponent={TextInput}
7272
name="fname"
7373
/>
7474
```
@@ -118,7 +118,7 @@ Once a user has “touched” an input, i.e. blurred the input, we will also sta
118118

119119
All form fields will additionally be validated when the form is submitted. Although we are validating on blur this additional step is necessary to cover edge cases where forms are auto-filled or when a form is submitted by pressing enter (i.e. there will be only a ‘submit’ event and no ‘blur’ event to hook into).
120120

121-
The Form component takes care of validation internally and the only requirement is that we pass a validate callback prop. The validate callback takes in the input values as argument and should return an object with shape `{[inputID]: errorMessage}`.
121+
The Form component takes care of validation internally and the only requirement is that we pass a validate callback prop. The validate callback takes in the input values as argument and should return an object with shape `{[inputID]: errorMessage}`.
122122

123123
Here's an example for a form that has two inputs, `routingNumber` and `accountNumber`:
124124

@@ -332,10 +332,10 @@ An example of this can be seen in the [ACHContractStep](https://github.com/Expen
332332
### Safe Area Padding
333333

334334
Any `FormProvider.tsx` that has a button at the bottom. If the `<FormProvider>` is inside a `<ScreenWrapper>`, the bottom safe area inset is handled automatically (`includeSafeAreaPaddingBottom` needs to be set to `true`, but its the default).
335-
If you have custom requirements and can't use `<ScreenWrapper includeSafeAreaPaddingBottom={true}>`, you can use the `useStyledSafeAreaInsets()` hook:
335+
If you have custom requirements and can't use `<ScreenWrapper includeSafeAreaPaddingBottom={true}>`, you can use the `useSafeAreaPaddings()` hook:
336336

337337
```jsx
338-
const { paddingTop, paddingBottom, safeAreaPaddingBottomStyle } = useStyledSafeAreaInsets();
338+
const { paddingTop, paddingBottom, safeAreaPaddingBottomStyle } = useSafeAreaPaddings();
339339

340340
<View styles={[safeAreaPaddingBottomStyle, styles.pb5]}>
341341
<FormProvider>

docs/articles/expensify-classic/bank-accounts-and-payments/Third-Party-Payments.md

Lines changed: 0 additions & 29 deletions
This file was deleted.
Lines changed: 153 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,81 +1,192 @@
11
---
22
title: Enable Global Reimbursements
33
description: Send international payments
4+
keywords: Expensify Classic, foreign bank validation, global reimbursement, Canada, Europe, Singapore, Australia, United Kingdom, international reimbursements
45
---
5-
<div id="expensify-classic" markdown="1">
66

7-
Enabling global reimbursements allows you to send direct reimbursements to countries worldwide if your company’s bank account is in the US, UK, Canada, Europe, or Australia.
7+
If your company’s business bank account is in the US, Canada, the UK, Europe, Australia, or Singapore, you can send direct reimbursements to nearly any country worldwide!
88

9-
# For USD accounts
9+
The process to enable international reimbursements depends on the currency of your reimbursement bank account, so be sure to review the corresponding instructions below.
1010

11-
{% include info.html %}
12-
Before you can complete this process, you must first connect a **verified** U.S. bank account, and your employees receiving payments from this account must also connect their **deposit-only** U.S. bank account.
13-
{% include end-info.html %}
11+
---
12+
13+
# If the Reimbursement Account is in the U.S. (USD)
14+
15+
Before you begin, ensure you have a verified U.S. business bank account connected. Once global reimbursement is enabled on your account, employees receiving payments will connect their **non-USD bank account**.
1416

15-
## Step 1: Request global reimbursements
17+
## Step 1: Connect a U.S Business Bank Account
1618

17-
Once your verified U.S. bank account has been added and verified, you can request that global reimbursements be enabled on your account.
19+
If you haven't already, follow the instructions to [Connect a US Business Bank Account](https://help.expensify.com/articles/expensify-classic/bank-accounts-and-payments/bank-accounts/Connect-US-Business-Bank-Account).
1820

19-
## Step 2: Re-verify the bank account
21+
## Step 2: Verify the Bank Account for Global Reimbursements
2022

2123
1. Hover over **Settings**, then click **Workspaces**.
22-
2. Select the workspace.
2324
3. Click the **Reports** tab on the left.
2425
4. Ensure that the workspace currency is set to **USD**.
2526
5. Click the **Reimbursements** tab on the left.
26-
6. Ensure that the reimbursement method is set to **Direct** and that the right bank account is selected.
27+
6. Ensure that the reimbursement method is set to **Direct** and that the correct bank account is selected.
2728
7. Click the **Payments** tab on the left.
2829
8. Click **Enable Global Reimbursement** next to the bank account.
29-
9. Complete the International Reimbursement DocuSign form.
30+
9. Complete the Global Reimbursement DocuSign form.
31+
10. Once the form is complete, it is automatically sent to our Compliance Team for review.
3032

31-
Once the form is complete, it is automatically sent to our Compliance Team for review. Our Support Team will contact you with more details if additional information is required, which may include:
33+
**Our Support Team will contact you with more details if additional information is required, which may include:**
3234
- An authorization letter
3335
- Proof of address and ID for the reimburser and/or company directors
3436
- Independently certified documentation, such as a shareholder agreement from a lawyer, notary, or public accountant if an individual owns more than 25% of the company
3537

36-
# For AUD, CAD, GBP, and EUR accounts
38+
## Step 3: Start Reimbursing Internationally
39+
40+
After the bank account is verified for international payments, set the correct bank account as the reimbursement account:
41+
42+
1. Under **Settings** > **Workspaces** > **Group** > **[Workspace Name]** > **Reimbursements**
43+
2. Select the reimbursement account as the default account.
44+
3. Ask your employees to add their deposit-only bank account.
45+
- They can do this by logging into their Expensify accounts, heading to **Settings** > **Account** > **Payments**, and clicking **Add Deposit-Only Bank Account**.
46+
47+
---
48+
49+
# If the Bank Account is Outside of the U.S (AUD, CAD, GBP, EUR, and SGD Currencies)
50+
51+
**Overview of the International Bank Account Setup:**
52+
1. Connect the reimbursement account to Expensify.
53+
2. Complete DocuSign Form.
54+
3. Expensify's Compliance Team Reviews the Application: Depending on the country, the team approves the request or requests additional documentation.
55+
4. Expensify sends test deposits to the provided bank account: Expensify asks the customer to confirm test deposit amounts.
56+
5. Admin Actions Required:
57+
- Set the reimbursement account under **Settings > Workspaces > [Workspace Name] > Reimbursements**.
58+
- Ensure employees add their deposit-only bank accounts under **Settings > Account > Payments > Add Deposit-Only Bank Account**.
3759

38-
## Step 1: Add the bank account
60+
## Step 1: Connect the Bank Account
3961

4062
1. Hover over **Settings**, then click **Workspaces**.
41-
2. Select the workspace.
42-
3. Click the **Reports** tab on the left.
43-
4. Ensure that the selected workspace currency matches your reimbursement bank account currency.
44-
5. Click the **Reimbursements** tab on the left.
45-
6. Set the reimbursement method to **Direct**.
46-
7. Click **Add Business Bank Account**.
47-
8. If necessary, click **Switch Country** to select the correct country if not automatically selected.
48-
9. Enter the bank account details, then click **Save & Continue**.
49-
10. Complete the International Reimbursement DocuSign form.
63+
2. Click the **Reports** tab on the left.
64+
3. Ensure that the selected workspace currency matches your reimbursement bank account currency.
65+
4. Click the **Reimbursements** tab on the left.
66+
5. Set the reimbursement method to **Direct**.
67+
6. Click **Add Business Bank Account**.
68+
7. Click **Switch Country** and adjust the **Currency** so the information is correct.
69+
8. Click **Save & Continue**.
70+
9. Enter the details of your bank account and click **Save & Continue**.
5071

51-
Once the form is complete, it is automatically sent to our Compliance Team for review. Our Support Team will contact you with more details if additional information is required, which may include:
52-
- An authorization letter
53-
- Proof of address and ID for the reimburser and/or company directors
54-
- Independently certified documentation, such as a shareholder agreement from a lawyer, notary, or public accountant if an individual owns more than 25% of the company
72+
## Step 2: Verify the Bank Account for Global Reimbursements
73+
74+
1. Complete the Global Reimbursement DocuSign form.
75+
2. Once the form is complete, it is automatically sent to our Compliance Team for review.
76+
3. See the **Requirements for Global Reimbursement** section below to determine which additional information is required to set up international reimbursements for your entity.
77+
4. If prompted, upload one of the following:
78+
- **Voided check** with business name and account details
79+
- **Bank statement** showing the business name and account information
80+
- **Bank letter** confirming the account details
81+
82+
**Our Support Team will contact you via Concierge with more details if additional information is required.**
83+
84+
85+
## Step 3: Start Reimbursing Internationally
5586

56-
{% include faq-begin.md %}
87+
After the bank account is verified for international payments, set the correct bank account as the reimbursement account:
5788

58-
**Can multiple people send reimbursements internationally?**
89+
1. Under **Settings** > **Workspaces** > **Group** > **[Workspace Name]** > **Reimbursements**
90+
2. Select the reimbursement account as the default account.
91+
3. Ask your employees to add their deposit-only bank account.
92+
- They can do this by logging into their Expensify accounts, heading to **Settings** > **Account** > **Payments**, and clicking **Add Deposit-Only Bank Account**.
93+
94+
---
95+
96+
# Requirements for International Reimbursement
97+
98+
## U.S.
99+
**Requirements:**
100+
- ✅ Partner Application Form
101+
- ✅ Address Verification Document (e.g., utility bill, lease agreement)
102+
- ✅ Bank Statement for Direct Debit Setup
103+
104+
**Direct Debit Timeline:**
105+
⏳ Takes 1 day to set up once onboarding is complete and the bank account is verified.
106+
107+
## Canada
108+
**Requirements:**
109+
- ✅ Partner Application Form
110+
- ✅ Address Verification Document
111+
- ✅ Bank Statement for Direct Debit Setup
112+
- ✅ Proof of Beneficial Ownership
113+
114+
**Direct Debit Timeline:**
115+
⏳ Takes 1 day to set up once onboarding is complete and the bank account is verified.
116+
117+
## United Kingdom
118+
**Requirements:**
119+
- ✅ Partner Application Form
120+
- ✅ Address Verification Document
121+
- ✅ Bank Statement for Direct Debit Setup
122+
- ✅ Proof of Beneficial Ownership
123+
- ✅ Copy of ID and Proof of Address for Signatories
124+
125+
**Direct Debit Timeline:**
126+
⏳ Can only be set up after onboarding is complete.
127+
128+
## European Union
129+
**Requirements:**
130+
- ✅ Partner Application Form
131+
- ✅ Address Verification Document
132+
- ✅ Bank Statement for Direct Debit Setup
133+
- ✅ Proof of Beneficial Ownership
134+
- ✅ Certified Copies of ID & Address for UBOs (Only if the company is in Jersey)
135+
136+
**Special Notes:**
137+
🇮🇹 Italy: Requires "Codice Fiscale" (Tax Identification Number).
138+
🇪🇸 Spain: Driver's license not accepted as ID.
139+
140+
**Direct Debit Timeline:**
141+
⏳ Can only be set up after onboarding is complete.
142+
143+
## Australia
144+
**Requirements:**
145+
- ✅ Partner Application Form
146+
- ✅ Address Verification Document
147+
- ✅ Bank Statement for Direct Debit Setup
148+
- ✅ Proof of Beneficial Ownership
149+
- ✅ Copy of ID & Proof of Address for all Signatories
150+
151+
**Special Notes:**
152+
Expensify's Compliance Team must send a PDS FSG to company directors before onboarding.
153+
154+
**Direct Debit Timeline:**
155+
⏳ Takes 1 day to set up once onboarding is complete and the bank account is verified.
156+
157+
## Singapore
158+
**Requirements:**
159+
- ✅ Partner Application Form
160+
- ✅ Address Verification Document
161+
- ✅ Proof of Beneficial Ownership
162+
- ✅ Director/Board Resolution
163+
- ✅ Memorandum & Articles of Association
164+
- ✅ Certified Copies of ID & Address for UBOs
165+
166+
**Direct Debit Timeline:**
167+
⏳ Takes 3 weeks to set up. Clients are encouraged to pre-fund the account while waiting.
168+
169+
---
59170

60-
Once your company is authorized to send global payments, the individual who verified the bank account can share it with additional admins on the workspace. This will enable them to be able to send global reimbursements.
171+
# FAQ
61172

62-
**How long does it take to verify an account for global payments?**
173+
## Can multiple people send reimbursements internationally?
63174

64-
The verification process can take anywhere from a few business days to several weeks depending on the information provided in the DocuSign form, if additional information is required for compliance.
175+
Yes, once your company is authorized to send international payments, the individual who verified the bank account can share it with additional admins on the workspace, enabling them to send global reimbursements.
65176

66-
**My employee doesn’t have the option to add their non-USD bank account as a deposit account. What should they do?**
177+
## How long does it take to verify an account for global payments?
67178

68-
Have the employee double-check that their [default workspace](https://help.expensify.com/articles/expensify-classic/workspaces/Navigate-multiple-workspaces) is set as the workspace that’s connected to the bank you’re using to send global payments.
179+
The verification process can take anywhere from a few business days to several weeks, depending on the information provided in the DocuSign form and if additional information is required for compliance.
69180

70-
**Who is the “Authorized User” and the “User” on the International Reimbursement DocuSign form?**
181+
## Why can't my employee add a non-USD bank account?
71182

72-
- **Authorized User**: The person who will process global reimbursements. The Authorized User should be the same person who manages the bank account connection in Expensify.
73-
- **User**: You can leave this section blank because the “User” is Expensify.
183+
Make sure your employee's default workspace is set to the one linked to the bank you're using for global payments. They can confirm their default workspace by following [these steps](https://help.expensify.com/articles/expensify-classic/workspaces/Navigate-multiple-workspaces).
74184

75-
**Does Global Reimbursement support Sepa in the EU?**
185+
## Who are the “Authorized User” and the “User” on the International Reimbursement DocuSign form?
76186

77-
Global Reimbursement uses Sepa B2B to facilitate payments from EU-based accounts. Sepa Core is not supported.
187+
- **Authorized User**: The person who will process international reimbursements. The Authorized User should be the same person who manages the bank account connection in Expensify.
188+
- **User**: Expensify (leave blank).
78189

79-
{% include faq-end.md %}
190+
## Does Global Reimbursement in Expensify support SEPA (Single Euro Payments Area) in the EU?
80191

81-
</div>
192+
Global Reimbursement uses SEPA B2B to facilitate payments from EU-based accounts. SEPA Core is not supported.

0 commit comments

Comments
 (0)