Skip to content

Commit 4c3eef3

Browse files
committed
Merge branch 'main' into snyk-fix-d4b5669ca76951e1fd2fab3e4130c806
2 parents 09a8c5f + 6ec3d55 commit 4c3eef3

167 files changed

Lines changed: 3395 additions & 1398 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.

Mobile-Expensify

README.md

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -443,15 +443,7 @@ Files should be named after the component/function/constants they export, respec
443443
- All React components should be PascalCase (a.k.a. UpperCamelCase 🐫).
444444

445445
## Platform-Specific File Extensions
446-
In most cases, the code written for this repo should be platform-independent. In such cases, each module should have a single file, `index.js`, which defines the module's exports. There are, however, some cases in which a feature is intrinsically tied to the underlying platform. In such cases, the following file extensions can be used to export platform-specific code from a module:
447-
- Mobile => `index.native.js`
448-
- iOS Native App/Android Native App => `index.ios.js`/`index.android.js`
449-
- Web => `index.website.js`
450-
- Desktop => `index.desktop.js`
451-
452-
**Note:** `index.js` should be the default and only platform-specific implementations should be done in their respective files. i.e: If you have mobile-specific implementation in `index.native.js`, then the desktop/web implementation can be contained in a shared `index.js`.
453-
454-
`index.ios.js` and `index.android.js` are used when the app is running natively on respective platforms. These files are not used when users access the app through mobile browsers, but `index.website.js` is used instead. `index.native.js` are for both iOS and Android native apps. `index.native.js` should not be included in the same module as `index.ios.js` or `index.android.js`.
446+
This section has moved [here](contributingGuides/philosophies/CROSS-PLATFORM.md).
455447

456448
## API building
457449
When adding new API commands (and preferably when starting using a new one that was not yet used in this codebase) always
@@ -659,10 +651,7 @@ This application is built with the following principles.
659651
5. UI updates with data from the server
660652

661653
1. **Cross Platform 99.9999%**
662-
1. A feature isn't done until it works on all platforms. Accordingly, don't even bother writing a platform-specific code block because you're just going to need to undo it.
663-
1. If the reason you can't write cross-platform code is because there is a bug in ReactNative that is preventing it from working, the correct action is to fix RN and submit a PR upstream -- not to hack around RN bugs with platform-specific code paths.
664-
1. If there is a feature that simply doesn't exist on all platforms and thus doesn't exist in RN, rather than doing if (platform=iOS) { }, instead write a "shim" library that is implemented with NOOPs on the other platforms. For example, rather than injecting platform-specific multi-tab code (which can only work on browsers, because it's the only platform with multiple tabs), write a TabManager class that just is NOOP for non-browser platforms. This encapsulates the platform-specific code into a platform library, rather than sprinkling through the business logic.
665-
1. Put all platform specific code in dedicated files and folders, like /platform, and reject any PR that attempts to put platform-specific code anywhere else. This maintains a strict separation between business logic and platform code.
654+
See details [here](contributingGuides/philosophies/CROSS-PLATFORM.md).
666655

667656
----
668657

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 1009019701
118-
versionName "9.1.97-1"
117+
versionCode 1009019703
118+
versionName "9.1.97-3"
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"

contributingGuides/PERFORMANCE.md

Lines changed: 284 additions & 34 deletions
Large diffs are not rendered by default.
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# Cross Platform Philosophy
2+
Learn how the app supports features across all our different platforms.
3+
4+
Currently supported platforms:
5+
- Web
6+
- Mobile Web
7+
- Desktop
8+
- iOS
9+
- Android
10+
11+
The goal is: **Cross Platform 99.9999%**
12+
13+
## Rules
14+
### - Features MUST be implemented on all supported platforms
15+
A feature isn't done until it works on all platforms. Any platform-specific code blocks will be asked to be undone.
16+
17+
### - React Native bugs MUST be fixed upstream
18+
If the reason cross-platform code cannot be written is because there is a bug in ReactNative that is preventing it from working, the correct action is to fix RN and submit a PR upstream -- not to hack around RN bugs with platform-specific code paths.
19+
20+
While upstream PRs are waiting to be merged, a patch can be used which is managed by the NPM package `patch-package`. Read more about it [here](https://github.com/Expensify/App?tab=readme-ov-file#adding-hybridapp-related-patches).
21+
22+
### - Features that don't exist on all platforms MUST use NOOP shims
23+
If there is a feature that simply doesn't exist on all platforms and thus doesn't exist in RN, rather than doing `if (platform=iOS) { }`, instead write a "shim" library that is implemented with NOOPs on the other platforms. For example, rather than injecting platform-specific multi-tab code (which can only work on browsers, because it's the only platform with multiple tabs), write a TabManager class that just is NOOP for non-browser platforms. This encapsulates the platform-specific code into a platform library, rather than sprinkling through the business logic.
24+
25+
### - Platform specific code MUST be placed in dedicated files and folders
26+
Put all platform specific code in dedicated files and folders (see below) and reject any PR that attempts to put platform-specific code anywhere else. This maintains a strict separation between business logic and platform code.
27+
28+
## Platform-Specific File Extensions
29+
In most cases, the code written for this repo should be platform-independent. In such cases, each module should have a single file, `index.js`, which defines the module's exports. There are, however, some cases in which a feature is intrinsically tied to the underlying platform. In such cases, the following file extensions can be used to export platform-specific code from a module:
30+
- Mobile => `index.native.js`
31+
- iOS Native App/Android Native App => `index.ios.js`/`index.android.js`
32+
- Web => `index.website.js`
33+
- Desktop => `index.desktop.js`
34+
35+
**Note:** `index.js` should be the default and only platform-specific implementations should be done in their respective files. i.e: If you have mobile-specific implementation in `index.native.js`, then the desktop/web implementation can be contained in a shared `index.js`.
36+
37+
`index.ios.js` and `index.android.js` are used when the app is running natively on respective platforms. These files are not used when users access the app through mobile browsers, but `index.website.js` is used instead. `index.native.js` are for both iOS and Android native apps. `index.native.js` should not be included in the same module as `index.ios.js` or `index.android.js`.
38+
39+
### Supporting Mobile Web
40+
The above platform-specific files only work because they are compiled when the app is built for the different platforms. This means that a different mechanism needs to be used for Mobile Web (since "mobile web" and "web" are the same at build time).
41+
42+
It is also well known that different mobile browsers have different quirks and need to use different workarounds at times.
43+
44+
#### - Mobile browser detection SHOULD never be used
45+
If there is absolutely no other way to fix a bug, then the proper way of detecting the browser is using `@libs/Browser`. Use this as an absolute last resort and have the exception approved by several (ie. more than one) internal engineers.

contributingGuides/philosophies/INDEX.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "S
55
"OPTIONAL" are to be interpreted as described in [RFC 2119](https://datatracker.ietf.org/doc/html/rfc2119).
66

77
## Contents
8+
* [Cross-Platform Philosophy](/contributingGuides/philosophies/CROSS-PLATFORM.md)
89
* [Offline Philosophy](/contributingGuides/philosophies/OFFLINE.md)
910
* [Routing Philosophy](/contributingGuides/philosophies/ROUTING.md)

cspell.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,7 @@
306306
"Italiano",
307307
"ITSM",
308308
"Jakub",
309+
"jank",
309310
"janky",
310311
"jarsigner",
311312
"johndoe",
@@ -591,6 +592,7 @@
591592
"Smartscan",
592593
"soloader",
593594
"SONIFICATION",
595+
"Speedscope",
594596
"Spotnana",
595597
"spreadsheetml",
596598
"SSAE",
@@ -622,7 +624,9 @@
622624
"Svmy",
623625
"Swipeable",
624626
"symbolicate",
627+
"symbolicated",
625628
"Symbolicates",
629+
"symbolication",
626630
"systempreferences",
627631
"tabindex",
628632
"Talkspace",
@@ -737,6 +741,8 @@
737741
"zoneinfo",
738742
"zxcv",
739743
"zxldvw",
744+
"inputmethod",
745+
"copyable",
740746
"مثال"
741747
],
742748
"ignorePaths": [
Lines changed: 85 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,94 +1,116 @@
11
---
2-
title: Search and Download Expenses
3-
description: Learn how to find expenses in New Expensify and export them as a CSV or PDF.
4-
keywords: [New Expensify, search expenses, download expenses, export CSV, export PDF, download report, download receipt]
2+
title: Export Expenses and Reports
3+
description: Learn how to export your expenses and reports in CSV or PDF format using default or custom templates in New Expensify.
4+
keywords: [New Expensify, export expenses, export reports, CSV export, PDF export, download reports, accounting integration, report templates]
55
---
6+
67
<div id="new-expensify" markdown="1">
78

8-
You can quickly find and download your expenses in New Expensify—either as a spreadsheet-ready CSV or a printable PDF.
9+
Expensify offers flexible options to search and export expenses and reports in various formats. You can export them directly to an accounting integration, as a CSV, or as a PDF—right from the web or mobile app.
910

10-
---
11+
# Export Options
1112

12-
# Search for Expenses
13+
- **Accounting integration**: Export directly to your connected accounting software.
14+
- **CSV export**: Choose a default or custom template.
15+
- **PDF export**: Download full reports, including receipts and notes.
1316

14-
Use filters to quickly locate the expenses you need.
17+
> **Note:** You can export from both the web and mobile apps.
1518
16-
1. Click **Reports** in the left-hand menu
17-
2. Select **Expenses**
18-
3. Use **Filters** to search for expenses by:
19-
- Credit card
20-
- Category or tag
21-
- Date range
22-
- Keyword
23-
- Expense amount
24-
- And more
25-
4. Click **View results** to display the list of expenses matching your search parameters
19+
# Export as CSV
2620

27-
---
21+
## Web
2822

29-
# Download Expenses as a CSV
30-
31-
Once you’ve filtered the list:
32-
33-
1. Select the checkbox beside each expense, or choose to **select all** above the expense list.
34-
2. Click **Selected > Download**.
35-
3. A CSV file will automatically download to your device (prefixed with “Expensify”).
36-
4. Open it in your spreadsheet tool.
37-
38-
**Included in the CSV:**
39-
- Date
40-
- Merchant
41-
- Description
42-
- From
43-
- To
44-
- Category + GL code
45-
- Tag + GL code
46-
- Tax + Tax code
47-
- Amount
48-
- Currency
49-
- Type (e.g., cash, card, distance)
50-
- Receipt URL
23+
1. In the left-hand menu, select **Reports > Expense Reports**.
24+
2. Check the box next to the expenses or reports you want to export, or use the top checkbox to select all.
25+
3. Click **Selected** at the top.
26+
4. Select **Export** from the dropdown.
27+
5. Choose one of the following templates:
28+
- **Basic Export** – Simplified, essential fields (date, amount, merchant, category, receipt URL).
29+
- **All Data – Expense Level Export** – One row per expense with full data.
30+
- **All Data – Report Level Export** – One row per report with summary data.
31+
- **Custom Templates** – Any template created by you or your Workspace Admin (if available).
5132

52-
---
33+
You’ll receive a message from **Concierge** with the exported file.
5334

54-
# Download a Report (PDF or CSV)
35+
> **Note:** Report-level templates only appear if you select full reports (i.e., all expenses in the report).
5536
56-
1. In the left-hand menu, select **Reports**
57-
2. On the **Reports** tab, click the report you want to download
58-
3. In the upper-right corner, click **More**
59-
4. Choose either:
60-
- **Download as PDF** to generate a printable version
61-
- **Download as CSV** to get a spreadsheet version of the report
37+
## Mobile
6238

63-
**Note:** You can only download one report at a time.
39+
1. In the left-hand menu, select **Reports > Expense Reports**.
40+
2. Tap the three-line icon in the top-right corner.
41+
3. Choose between **Reports** or **Expenses**.
42+
4. Check the box next to the items you want to export, or use the top checkbox to select all.
43+
5. Tap **Selected**, then choose **Export**.
44+
6. Choose a default or custom export template as described above.
6445

65-
---
46+
You’ll receive the export in a Concierge message.
47+
48+
> **Note:** Report-level templates only appear when full reports are selected.
49+
50+
# Export as PDF
51+
52+
1. Open the individual report you want to export.
53+
2. Click **More** in the top-right corner.
54+
3. Select **Download as PDF**.
55+
56+
The PDF will include:
57+
- All expenses
58+
- Attached receipts
59+
- Report notes
6660

6761
# FAQ
6862

63+
## Can I export one line per report?
64+
65+
Yes, use the **All Data – Report Level Export** template. All other templates will export one line per expense.
66+
6967
## Can I export in PDF or XLS format?
7068

71-
You can export:
72-
- CSV for raw expense data
73-
- PDF for full reports
69+
- **CSV/XLS** – Available for raw expense data.
70+
- **PDF** – Available for full reports only.
71+
72+
## Can I download individual expenses as a PDF?
73+
74+
No, PDF export is only available for full reports.
75+
76+
## Can I customize the columns in the CSV export?
77+
78+
No, the columns follow a fixed template.
79+
80+
## How do I export to an accounting integration?
81+
82+
Ensure your workspace is connected to a supported accounting platform. [Click here](https://docs.expensify.com) for connection instructions.
83+
84+
## How do I receive my export?
85+
86+
- **Basic Export**: Downloads immediately to your device.
87+
- **All other templates**: Concierge will send the export file to you via direct message.
88+
89+
## Can I export expenses or reports in bulk?
7490

75-
XLS format is not supported.
91+
- **CSV export**: Yes, select multiple or all items.
92+
- **PDF export**: Must be downloaded one at a time.
7693

77-
## Is it possible to download individual expenses as a PDF?
94+
## Why do I see a 404 error when clicking a receipt URL?
7895

79-
No, you can only download a PDF of full reports.
96+
Make sure you're logged into your Expensify account in the same browser when clicking the receipt link.
8097

81-
## Can I customize the columns in the CSV file?
98+
## The data looks wrong in Excel. How can I fix it?
8299

83-
No, the CSV download uses a fixed template and cannot be customized.
100+
- Long IDs may appear in scientific notation. To avoid this:
101+
1. Open Excel and go to **File > Import**.
102+
2. Select your CSV and follow the prompts.
103+
3. Format the report/transaction ID column as **Text**.
84104

85-
## Can I select expenses or reports in bulk?
105+
## Why do the numbers look incorrect in the export?
86106

87-
Yes! Use **Select multiple** or **Select all** to choose multiple expenses for CSV export.
88-
PDFs must be downloaded one at a time.
107+
Switch your spreadsheet program's formatting to **Plain Text** or **Number format** to prevent scientific notation (e.g., `1.79e+308`).
89108

90-
## Why do I see a 404 error when clicking the receipt URL in the CSV?
109+
## Why are leading zeros missing in my export?
91110

92-
Make sure you're logged into your Expensify account in the same browser. Receipt links only work when you're signed in.
111+
Excel may remove them automatically. To prevent this:
112+
1. Open Excel and go to **File > Import**.
113+
2. Select your CSV.
114+
3. Set columns with leading zeros to **Text format**.
93115

94116
</div>

0 commit comments

Comments
 (0)