Skip to content

Commit ae46810

Browse files
authored
Merge branch 'Expensify:main' into fixInputDisplayForWorkflows
2 parents 1fefdd4 + 6cbd35e commit ae46810

167 files changed

Lines changed: 1595 additions & 1540 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.

.eslintrc.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ const restrictedImportPaths = [
1414
'Text',
1515
'ScrollView',
1616
'Animated',
17+
'findNodeHandle',
1718
],
1819
message: [
1920
'',
@@ -105,6 +106,10 @@ const restrictedImportPaths = [
105106
importNames: ['useOnyx'],
106107
message: "Please use '@hooks/useOnyx' instead.",
107108
},
109+
{
110+
name: '@src/utils/findNodeHandle',
111+
message: "Do not use 'findNodeHandle' as it is no longer supported on web.",
112+
},
108113
];
109114

110115
const restrictedImportPatterns = [

.github/workflows/createNewVersion.yml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,12 @@ jobs:
124124
git commit -m "Update Mobile-Expensify submodule version to ${{ steps.bumpVersion.outputs.NEW_VERSION }}"
125125
if ! git push origin main; then
126126
echo "Race condition! E/App main was updated while this workflow was running, so push failed. Fetching remote, rebasing, and retrying push once."
127-
git fetch origin main
127+
if ! git fetch origin main; then
128+
echo "::error:: ❌ Unable to fetch main"
129+
echo "::error:: This can happen when Mobile-Expensify and E/App repos got out of sync."
130+
echo "::error:: We likely need to manually bump the version in E/App to match Mobile-Expensify."
131+
exit 1
132+
fi
128133
if ! git rebase origin/main; then
129134
echo "::error:: Rebase failed while retrying E/App push"
130135
exit 1

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 1009019303
118-
versionName "9.1.93-3"
117+
versionCode 1009019400
118+
versionName "9.1.94-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"

docs/articles/expensify-classic/expenses/Edit-expenses.md

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
title: Edit Expenses
3-
description: Learn how to edit expenses in Expensify, including restrictions and permissions.
4-
keywords: [Expensify Classic, edit expenses, merge expenses, split expenses, delete expenses]
3+
description: Learn how to edit, split, merge, or delete expenses in Expensify, including permissions, limitations, and helpful tips for SmartScan or company cards.
4+
keywords: edit expenses, split expenses, merge expenses, delete expenses, Expensify Classic, expense permissions, company card, SmartScan, Workspace Admin
55
---
66

77
<div id="expensify-classic" markdown="1">
@@ -97,7 +97,7 @@ Each split becomes its own expense, and the image of the same receipt is attache
9797
You can merge two duplicate expenses into one consolidated entry. This is useful when the same purchase appears twice—once as a SmartScanned receipt and once as an imported credit card transaction.
9898

9999
💡 **Things to know before merging expenses:** 💡
100-
- Merging expenses cannot be undone
100+
- Merging expenses cannot be undone.
101101
- You cannot merge two credit card expenses.
102102
- Ideally, credit card expenses also include a SmartScanned receipt. If your admin has enabled eReceipts (U.S. only), low-value expenses may show a QR code as the receipt image.
103103

@@ -166,29 +166,37 @@ Yes. The same image will appear on all the split expenses for easy reference and
166166
## Can I apply different categories or tags to each split?
167167
Absolutely! That's one of the main benefits of splitting an expense — you can customize each part individually.
168168

169-
## Can Expensify automatically merge a cash expense with a credit card expense?
169+
## Can Expensify automatically merge cash and card expenses?
170170

171-
Yes! When a SmartScanned receipt matches an imported credit card transaction by date and amount, Expensify merges them automatically.
171+
Yes. Expensify auto-merges SmartScanned receipts with matching card transactions by date and amount.
172172

173-
- If the SmartScan comes first, the card import will merge.
174-
- If the card transaction comes first, the SmartScan will merge once complete.
175-
- Expensify uses the SmartScanned merchant name over the one from the card feed.
173+
- If the receipt comes first, the card transaction merges into the receipt.
174+
- If the card comes first, the receipt merges into the card.
175+
- Merchant names from SmartScan will override merchant names from the card.
176+
- Merging can occur even after reports are submitted, approved, or reimbursed.
176177

177178
**Merging won't happen automatically:**
178-
- If you manually stop SmartScan.
179-
- If the expenses were created via the [Expense Importer API](https://integrations.expensify.com/Integration-Server/doc/#expense-creator).
179+
- SmartScan is skipped.
180+
- Expenses were created via the [Expense Importer API](https://integrations.expensify.com/Integration-Server/doc/#expense-creator).
181+
- Currencies differ and the report is submitted.
182+
183+
## Should I wait for merging before submitting reports?
184+
No need to wait. Matching expenses can still merge post-submission.
185+
186+
- **Personal cards**: Will merge if reimbursable status matches, or only when the report is Open.
187+
- **Company cards**: Merge regardless of status, unless it changes the reimbursable total of a submitted report. To prevent issues, default cash expenses to non-reimbursable.
180188

181189
## Why didn’t my expenses merge automatically?
182190

183191
**Here are some common reasons:**
184-
- The cash receipt was not SmartScanned.
185-
- The transaction dates are different.
186-
- Amounts differ (in the same currency).
187-
- Amounts exceed a 5% difference in foreign exchange (FX) rates.
188-
- The transaction is over 90 days old.
189-
- One of the duplicates already merged with a third entry.
190-
- The cash expense was already submitted, reimbursed, or exported before the card import.
191-
- The card and receipt are in different Expensify accounts.
192+
- Receipt wasn’t SmartScanned.
193+
- Transaction dates don’t closely match.
194+
- Amounts differ (for expenses in the same currency).
195+
- Foreign exchange difference exceeds 5% (for expenses in different currencies)
196+
- The transaction is older than 90 days.
197+
- One of the expenses was already merged with another expense.
198+
- Receipt is reimbursable and report is submitted.
199+
- Expenses are in different Expensify accounts.
192200

193201
You can still merge expenses manually if both are **Unreported** or **Open** and exist in the same account.
194202

ios/NewExpensify/Info.plist

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
<key>CFBundlePackageType</key>
2424
<string>APPL</string>
2525
<key>CFBundleShortVersionString</key>
26-
<string>9.1.93</string>
26+
<string>9.1.94</string>
2727
<key>CFBundleSignature</key>
2828
<string>????</string>
2929
<key>CFBundleURLTypes</key>
@@ -44,7 +44,7 @@
4444
</dict>
4545
</array>
4646
<key>CFBundleVersion</key>
47-
<string>9.1.93.3</string>
47+
<string>9.1.94.0</string>
4848
<key>FullStory</key>
4949
<dict>
5050
<key>OrgId</key>

ios/NotificationServiceExtension/Info.plist

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111
<key>CFBundleName</key>
1212
<string>$(PRODUCT_NAME)</string>
1313
<key>CFBundleShortVersionString</key>
14-
<string>9.1.93</string>
14+
<string>9.1.94</string>
1515
<key>CFBundleVersion</key>
16-
<string>9.1.93.3</string>
16+
<string>9.1.94.0</string>
1717
<key>NSExtension</key>
1818
<dict>
1919
<key>NSExtensionPointIdentifier</key>

ios/ShareViewController/Info.plist

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111
<key>CFBundleName</key>
1212
<string>$(PRODUCT_NAME)</string>
1313
<key>CFBundleShortVersionString</key>
14-
<string>9.1.93</string>
14+
<string>9.1.94</string>
1515
<key>CFBundleVersion</key>
16-
<string>9.1.93.3</string>
16+
<string>9.1.94.0</string>
1717
<key>NSExtension</key>
1818
<dict>
1919
<key>NSExtensionAttributes</key>

jest/setupMockFullstoryLib.ts

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,27 @@
1-
type FSPageInterface = {
2-
start: jest.Mock<void, []>;
3-
};
1+
import type {Fullstory, FSPageLike as mockFSPageLike} from '@libs/Fullstory/types';
42

53
export default function mockFSLibrary() {
64
jest.mock('@fullstory/react-native', () => {
7-
class Fullstory {
8-
consent = jest.fn();
9-
10-
anonymize = jest.fn();
5+
return {
6+
FSPage: jest.fn(),
7+
default: jest.fn(),
8+
};
9+
});
1110

12-
identify = jest.fn();
11+
jest.mock<Fullstory>('@libs/Fullstory', () => {
12+
class FSPage implements mockFSPageLike {
13+
start() {}
1314
}
1415

1516
return {
16-
FSPage(): FSPageInterface {
17-
return {
18-
start: jest.fn(() => {}),
19-
};
20-
},
21-
default: Fullstory,
17+
Page: FSPage,
18+
getChatFSClass: jest.fn(),
19+
init: jest.fn(),
20+
onReady: jest.fn(),
21+
consent: jest.fn(),
22+
identify: jest.fn(),
23+
consentAndIdentify: jest.fn(),
24+
anonymize: jest.fn(),
2225
};
2326
});
2427
}

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)