Skip to content

Commit 12926c5

Browse files
committed
merge main
2 parents 82f1357 + fc49cb4 commit 12926c5

306 files changed

Lines changed: 14161 additions & 9717 deletions

File tree

Some content is hidden

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

Gemfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ source "https://rubygems.org"
44
ruby ">= 3.3.4"
55

66
gem "cocoapods", "= 1.16.2"
7-
gem 'activesupport', '>= 6.1.7.5', '!= 7.1.0'
7+
gem 'activesupport', '>= 7.2.3.1'
88
gem 'xcodeproj', '~> 1.27'
99
gem "fastlane", "~> 2", ">= 2.229.0"
1010
gem "xcpretty", "~> 0"

Gemfile.lock

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ GEM
33
specs:
44
CFPropertyList (3.0.8)
55
abbrev (0.1.2)
6-
activesupport (7.2.3)
6+
activesupport (7.2.3.1)
77
base64
88
benchmark (>= 0.3)
99
bigdecimal
@@ -12,7 +12,7 @@ GEM
1212
drb
1313
i18n (>= 1.6, < 2)
1414
logger (>= 1.4.2)
15-
minitest (>= 5.1)
15+
minitest (>= 5.1, < 6)
1616
securerandom (>= 0.3)
1717
tzinfo (~> 2.0, >= 2.0.5)
1818
addressable (2.8.8)
@@ -45,8 +45,8 @@ GEM
4545
aws-eventstream (~> 1, >= 1.0.2)
4646
babosa (1.0.4)
4747
base64 (0.3.0)
48-
benchmark (0.3.0)
49-
bigdecimal (4.0.1)
48+
benchmark (0.5.0)
49+
bigdecimal (4.1.1)
5050
claide (1.1.0)
5151
cocoapods (1.16.2)
5252
addressable (~> 2.8)
@@ -89,8 +89,8 @@ GEM
8989
colored2 (3.1.2)
9090
commander (4.6.0)
9191
highline (~> 2.0.0)
92-
concurrent-ruby (1.3.5)
93-
connection_pool (2.5.4)
92+
concurrent-ruby (1.3.6)
93+
connection_pool (3.0.2)
9494
csv (3.3.5)
9595
declarative (0.0.20)
9696
digest-crc (0.7.0)
@@ -238,7 +238,7 @@ GEM
238238
domain_name (~> 0.5)
239239
httpclient (2.9.0)
240240
mutex_m
241-
i18n (1.14.7)
241+
i18n (1.14.8)
242242
concurrent-ruby (~> 1.0)
243243
jmespath (1.6.2)
244244
json (2.18.0)
@@ -251,7 +251,7 @@ GEM
251251
mime-types-data (3.2025.0924)
252252
mini_magick (4.13.2)
253253
mini_mime (1.1.5)
254-
minitest (5.26.1)
254+
minitest (5.27.0)
255255
molinillo (0.8.0)
256256
multi_json (1.18.0)
257257
multipart-post (2.4.1)
@@ -322,7 +322,7 @@ PLATFORMS
322322
x86_64-linux
323323

324324
DEPENDENCIES
325-
activesupport (>= 6.1.7.5, != 7.1.0)
325+
activesupport (>= 7.2.3.1)
326326
benchmark
327327
bigdecimal
328328
cocoapods (= 1.16.2)

Mobile-Expensify

android/app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,8 @@ android {
111111
minSdkVersion rootProject.ext.minSdkVersion
112112
targetSdkVersion rootProject.ext.targetSdkVersion
113113
multiDexEnabled rootProject.ext.multiDexEnabled
114-
versionCode 1009035200
115-
versionName "9.3.52-0"
114+
versionCode 1009035300
115+
versionName "9.3.53-0"
116116
// Supported language variants must be declared here to avoid from being removed during the compilation.
117117
// This also helps us to not include unnecessary language variants in the APK.
118118
resConfigs "en", "es"

config/webpack/webpack.common.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,8 +162,8 @@ const getCommonConfiguration = ({file = '.env', platform = 'web'}: Environment):
162162
{from: 'assets/fonts/web', to: 'fonts'},
163163
{from: 'assets/sounds', to: 'sounds'},
164164
{from: 'assets/pdfs', to: 'pdfs'},
165-
{from: 'node_modules/react-pdf/dist/esm/Page/AnnotationLayer.css', to: 'css/AnnotationLayer.css'},
166-
{from: 'node_modules/react-pdf/dist/esm/Page/TextLayer.css', to: 'css/TextLayer.css'},
165+
{from: 'node_modules/react-pdf/dist/Page/AnnotationLayer.css', to: 'css/AnnotationLayer.css'},
166+
{from: 'node_modules/react-pdf/dist/Page/TextLayer.css', to: 'css/TextLayer.css'},
167167
{from: '.well-known/apple-app-site-association', to: '.well-known/apple-app-site-association', toType: 'file'},
168168
{from: '.well-known/assetlinks.json', to: '.well-known/assetlinks.json'},
169169

@@ -260,7 +260,7 @@ const getCommonConfiguration = ({file = '.env', platform = 'web'}: Environment):
260260
// We are importing this worker as a string by using asset/source otherwise it will default to loading via an HTTPS request later.
261261
// This causes issues if we have gone offline before the pdfjs web worker is set up as we won't be able to load it from the server.
262262
{
263-
test: new RegExp('node_modules/pdfjs-dist/build/pdf.worker.min.mjs'),
263+
test: new RegExp('node_modules/pdfjs-dist/legacy/build/pdf.worker.min.mjs'),
264264
type: 'asset/source',
265265
},
266266

@@ -330,6 +330,8 @@ const getCommonConfiguration = ({file = '.env', platform = 'web'}: Environment):
330330
'victory-native': path.resolve(dirname, '../../node_modules/victory-native/src/index.ts'),
331331
// Required for @shopify/react-native-skia web support
332332
'react-native/Libraries/Image/AssetRegistry': false,
333+
// Use legacy build of pdfjs-dist to support older browsers
334+
'pdfjs-dist$': path.resolve(dirname, '../../node_modules/pdfjs-dist/legacy/build/pdf.mjs'),
333335
// Module alias for web
334336
// https://webpack.js.org/configuration/resolve/#resolvealias
335337
'@assets': path.resolve(dirname, '../../assets'),

contributingGuides/BUGZERO_CHECKLIST.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
# BugZero Checklist:
22

3-
- [ ] **[Contributor]** The offending PR has been commented on, pointing out the bug it caused and why, so the author and reviewers can learn from the mistake.
3+
- [ ] **[Contributor]** The offending PR and associated issue have been commented on, pointing out the bug it caused and why, so the author and reviewers can learn from the mistake.
44

5-
Link to comment:
5+
Link to the comment on the PR:
6+
Link to the comment on the Issue:
67

78
- [ ] **[Contributor]** If the regression was CRITICAL (e.g. interrupts a core flow) A discussion in [#expensify-open-source](https://app.slack.com/client/E047TPA624F/C01GTK53T8Q) has been started about whether any other steps should be taken (e.g. updating the PR review checklist) in order to catch this type of bug sooner.
89

cspell.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -653,6 +653,7 @@
653653
"Salagatan",
654654
"samltool",
655655
"Saqbd",
656+
"sbaiahmed",
656657
"SBFJ",
657658
"Scaleway",
658659
"Scaleway's",
@@ -902,7 +903,9 @@
902903
"Synovus",
903904
"Wallester",
904905
"Wintrust",
905-
"Zürcher"
906+
"Zürcher",
907+
"CARDFROZEN",
908+
"CARDUNFROZEN"
906909
],
907910
"ignorePaths": [
908911
"src/languages/de.ts",

docs/articles/new-expensify/connect-credit-cards/Company-Card-Settings.md

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,41 +2,58 @@
22
title: Company Card Settings
33
description: Learn how to manage third-party company card feeds in Expensify, including commercial and direct feeds, accounting exports, and automated eReceipts.
44
keywords: [New Expensify, company cards, card feed settings, third-party cards, commercial feeds, direct feeds, accounting exports, ereceipts, expense automation, card management]
5+
internalScope: Applies to Workspace Admins. Covers how to manage third-party feeds on the workspace level. Does not cover the Expensify Card outside of plan availability.
56
---
67

8+
# Company Card Settings
9+
710
Workspace Admins can manage company card settings, export logic, and eReceipt functionality at the workspace level. This guide outlines how to configure your company card connection, route expenses to accounting systems, and automate receipt handling.
811

12+
To set up a direct company credit card feed on a Workspace, see [Direct Feeds](/articles/new-expensify/connect-credit-cards/Direct-feeds)).
13+
14+
To set up a commercial card file feed on a Workspace, see [Commercial Feeds](https://help.expensify.com/articles/new-expensify/connect-credit-cards/Commercial-feeds).
15+
916
---
1017

11-
# Manage Company Card Settings for Commercial and Direct Feeds
18+
## Manage company card settings for company card feeds
1219

13-
To adjust your card feed configuration:
20+
To update your Company Card feed settings:
1421

15-
1. Go to **Workspaces > [Workspace Name] > Company Cards**.
16-
2. Click **Settings** in the top-right corner.
22+
1. In the navigation tabs (on the left on web, on the bottom on mobile) navigate to **Workspaces > [Workspace Name]**.
23+
2. Within the Workspace, select **Company Cards** and chose the relevant company card feed.
24+
3. Click **Settings** in the top right corner.
25+
26+
You can manage the following options:
27+
28+
- **Card feed name**
29+
Update the name of the card feed to help identify it.
1730

18-
**Available actions include:**
31+
- **Allow deleting transactions**
32+
Enable this setting to allow cardholders to delete card transactions.
33+
34+
**Note:** This setting only applies to transactions imported after the setting is enabled.
1935

20-
- **Rename the card feed connection**
21-
- **Control whether cardholders can delete transactions:** Applies only to new transactions going forward
22-
- **Remove the card connection:** Unassigns all cards and deletes unsubmitted expenses in draft reports
36+
- **Remove card feed**
37+
Remove the card feed from the workspace and unassign all cards. If the feed is not connected to another workspace, it is permanently deleted.
38+
39+
**Note:** Removing the feed or unassigning a card deletes all imported expenses in the **Unreported** and **Draft** states.
2340

2441
![Tap settings to open the card feed settings page]({{site.url}}/assets/images/Direct Feed HelpDot Images/directfeeds_12.png){:width="100%"}
2542

2643
---
2744

28-
# Export Transactions to Your Accounting System
45+
## How to export transactions to your accounting system
2946

3047
If you’ve connected accounting software (like **QuickBooks**, **NetSuite**, or **Xero**), you can export company card expenses either to a **central account** or **individual accounts**.
3148

32-
## Export to a Central Account
49+
## How to export to a central account
3350

3451
To apply this setting to all card expenses in the workspace:
3552

3653
1. Go to **Workspaces > [Workspace Name] > Accounting > Connections > Export**.
3754
2. Under **Export company card expenses as**, choose **Central account**.
3855

39-
## Export to Individual Accounts
56+
## How to export to individual accounts
4057

4158
To override the central export account per card:
4259

@@ -48,7 +65,7 @@ To override the central export account per card:
4865

4966
---
5067

51-
# Use eReceipts with Third-Party Card Feeds
68+
## How to use eReceipts with third-party card Feeds
5269

5370
**eReceipts** are digital receipts that replace paper ones for many USD transactions of $75 or less on commercial and direct card feeds.
5471

docs/articles/new-expensify/connect-credit-cards/Personal-Cards.md

Lines changed: 70 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
---
22
title: Manage personal cards in New Expensify
3-
description: Learn how to view and manage personal credit cards in New Expensify.
4-
keywords: [personal cards, Wallet, reimbursable, credit card import, Expensify Classic, New Expensify, assigned cards, card details]
5-
internalScope: Audience is members with personal credit cards already connected to their account. Covers viewing and managing existing personal cards in the Wallet, including reimbursable settings. Does not cover adding new personal cards or company card programs.
3+
description: Learn how to view, manage, and fix broken connections for personal credit cards in New Expensify.
4+
keywords: [New Expensify, personal cards, Wallet, reimbursable, credit card import, Expensify Classic, New Expensify, assigned cards, card details, broken connection, fix card]
5+
internalScope: Audience is members with personal credit cards already connected to their account. Covers viewing and managing existing personal cards in the Wallet, including reimbursable settings and fixing broken card connections. Does not cover connecting new personal cards or company card programs.
66
---
77

88
# Manage personal cards in New Expensify
@@ -19,9 +19,9 @@ You can manage personal cards if you have a personal credit card that was alread
1919

2020
---
2121

22-
## Where to find personal cards in the Wallet
22+
## How to view personal cards in Wallet
2323

24-
1. Navigate to **Account > Wallet** on web or mobile.
24+
1. Click the navigation tabs (on the left on web, on the bottom on mobile), then select **Account > Wallet**.
2525
2. Under **Assigned cards**:
2626
- Personal cards imported from Expensify Classic will appear here.
2727
- You'll see the card name, bank icon, and last 4 digits.
@@ -35,18 +35,19 @@ If you have both company and personal cards, you'll see them separated into **Co
3535

3636
## What you can do with personal cards
3737

38-
You can:
38+
You can:
3939
- View all personal cards imported from Expensify Classic
4040
- Automatically import transactions from your linked personal cards
4141
- Generate IRS-compliant eReceipts for eligible USD purchases
4242
- Update personal card settings
43+
- Fix broken card connections
4344
- Filter expenses by card in the **Expenses** tab on the **Reports** page
4445

4546
---
4647

4748
## How to update personal card settings
4849

49-
1. Navigate to **Account > Wallet** on web or mobile.
50+
1. Click the navigation tabs (on the left on web, on the bottom on mobile), then select **Account > Wallet**.
5051
2. Under **Assigned cards**, select a personal card.
5152
3. On the **Card details** page, you can:
5253
- Rename the card
@@ -61,6 +62,54 @@ You can:
6162

6263
---
6364

65+
## Why a personal card connection can break
66+
67+
A personal card connection can break when your bank can no longer authenticate your account. Common causes include:
68+
69+
- Your bank login credentials changed (e.g., you updated your password).
70+
- Your bank requires additional verification (e.g., multi-factor authentication expired).
71+
- Your bank revoked access to the third-party connection.
72+
- A temporary outage at your bank disrupted the connection.
73+
74+
When a connection breaks, Expensify can no longer import new transactions from that card.
75+
76+
---
77+
78+
## How to know when a personal card connection is broken
79+
80+
When a personal card connection breaks, you'll see:
81+
82+
- A notification in the **Time Sensitive** section on **Home**.
83+
- A red dot indicator on **Wallet** in the navigation tabs.
84+
- A red dot indicator on the card in **Wallet** leading to the error.
85+
86+
<!-- SCREENSHOT:
87+
Suggestion: Show broken personal card connection with indicators on Wallet and on the card.
88+
Design request: https://github.com/Expensify/Expensify/issues/620248
89+
-->
90+
91+
92+
## How to fix a broken personal card connection
93+
94+
1. In the navigation tabs (on the left on web, on the bottom on mobile) navigate to **Account > Wallet**.
95+
2. Under **Assigned cards**, select the card with the broken connection.
96+
3. Choose **Fix card**.
97+
4. Log into your bank when prompted to re-authenticate the connection.
98+
99+
If logging into your bank doesn't resolve the issue, tap **Update card** to attempt a manual refresh.
100+
101+
---
102+
103+
## How the broken connection violation works
104+
105+
When you have a broken personal card connection, Expensify adds a **broken connection** violation to receipt-scanned cash expenses across all of your workspaces. This violation holds those expenses back in case they need to be merged with card transactions once the connection is fixed.
106+
107+
To resolve the violation, fix the broken card connection by following the steps above. The violation is automatically removed from affected expenses once the connection is restored.
108+
109+
You can tap the hyperlinked text in the violation to go directly to the **Card details** page in **Wallet** where you can fix the connection.
110+
111+
---
112+
64113
# FAQ
65114

66115
## Can I add another personal card?
@@ -69,9 +118,20 @@ Not yet. Only cards connected to your account in Expensify Classic are available
69118

70119
## Can I change the reimbursable setting for past transactions?
71120

72-
No. Changes to the reimbursable setting only apply to transactions imported after the change.
121+
No. Changes to the reimbursable setting only apply to transactions imported after the change.
122+
123+
## Why don't I see my personal card in the Wallet?
124+
125+
Personal cards appear in the Wallet only if they were previously connected to your account in Expensify Classic. If your card doesn't show up, it means it wasn't connected before and isn't available to manage yet.
126+
127+
## Why do I see a broken connection violation on my expenses?
128+
129+
When a personal card connection breaks, Expensify adds a broken connection violation to receipt-scanned cash expenses. This holds them back in case they need to merge with card transactions once the connection is restored. Fix the card connection to remove the violation automatically.
73130

74-
## Why don’t I see my personal card in the Wallet?
131+
## When is the broken connection error removed?
75132

76-
Personal cards appear in the Wallet only if they were previously connected to your account in Expensify Classic. If your card doesn’t show up, it means it wasn’t connected before and isn’t available to manage yet.
133+
The broken connection error is automatically removed when any of the following occurs:
77134

135+
- Logging into your bank successfully re-authenticates the connection.
136+
- Tapping Update card successfully refreshes the card.
137+
- Expensify's daily automatic card refresh succeeds.

docs/articles/new-expensify/expensify-card/Set-Up-and-Manage-the-Expensify-Card.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
title: Set Up and Manage Expensify Cards
33
description: Learn how Workspace Admins can enable, issue, and manage Expensify Cards for employees, including spending limits, bank connections, and virtual card setup.
44
keywords: [New Expensify, Expensify Card setup, manage virtual card, card limits, Expensify Visa, card settings, Workspace Admin]
5+
internalScope: Applies to Workspace Admins. Covers Expensify Card setup and management. Does not cover troubleshooting or third-party feeds.
56
---
67

78
Workspace Admins can enable and issue Expensify Visa® Commercial Cards to manage company spending with real-time controls and flexibility across employees and subscriptions.
@@ -38,6 +39,8 @@ Link a U.S. business bank account to pay the card balance:
3839
2. Click **Issue new card**
3940
3. Choose an existing account or [add a new bank account](https://help.expensify.com/articles/new-expensify/expenses-and-payments/Connect-a-Business-Bank-Account) as the settlement account.
4041

42+
If you already have an Expensify Card feed on another workspace, you can select that existing feed instead of connecting a new bank account. This links the same card feed to the current workspace, so you can manage cards across multiple workspaces with a single settlement account.
43+
4144
![Click the issue card button]({{site.url}}/assets/images/ExpensifyHelp-ExpensifyCard_02.png){:width="100%"}
4245

4346
---
@@ -102,7 +105,7 @@ You’ll need a U.S. business bank account registered to a U.S.-incorporated bus
102105

103106
## Can I use Expensify Cards across multiple workspaces?
104107

105-
Yes, but each workspace must have its **own settlement account**. For example, using the card in three workspaces requires three separate bank accounts.
108+
Yes. You can link a single Expensify Card feed to multiple workspaces using the same settlement account. When issuing cards on a new workspace, select an existing feed that is already connected to another workspace. Each workspace shows only its own members in the card list, but all workspaces share the same card feed and settlement account.
106109

107110
## Can an employee have multiple cards?
108111

0 commit comments

Comments
 (0)