Skip to content

Commit 4a10883

Browse files
committed
Merge branch 'main' into Rory-BumpPrettier
# Conflicts: # src/libs/SearchUIUtils.ts # src/pages/home/report/PureReportActionItem.tsx
2 parents 1cc8396 + 04e056c commit 4a10883

93 files changed

Lines changed: 1410 additions & 387 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.

.github/scripts/validateActionsAndWorkflows.sh

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,6 @@ done
4141

4242
for ((i=0; i < ${#WORKFLOWS[@]}; i++)); do
4343
WORKFLOW=${WORKFLOWS[$i]}
44-
45-
# Skip linting e2e workflow due to bug here: https://github.com/SchemaStore/schemastore/issues/2579
46-
if [[ "$WORKFLOW" == './workflows/e2ePerformanceTests.yml'
47-
|| "$WORKFLOW" == './workflows/testBuild.yml'
48-
|| "$WORKFLOW" == './workflows/deploy.yml' ]]; then
49-
continue
50-
fi
51-
5244
ajv -s ./tempSchemas/github-workflow.json -d "$WORKFLOW" --strict=false &
5345
ASYNC_PROCESSES[${#ACTIONS[@]} + i]=$!
5446
done

.github/workflows/buildAndroid.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,13 @@ on:
2323

2424
outputs:
2525
AAB_FILE_NAME:
26+
description: Name of the AAB file produced by this workflow.
2627
value: ${{ jobs.build.outputs.AAB_FILE_NAME }}
2728
APK_FILE_NAME:
29+
description: Name of the APK file produced by this workflow.
2830
value: ${{ jobs.build.outputs.APK_FILE_NAME }}
2931
APK_ARTIFACT_NAME:
32+
description: Name of the APK artifact.
3033
value: ${{ jobs.build.outputs.APK_ARTIFACT_NAME }}
3134

3235
workflow_dispatch:

.github/workflows/testBuildHybrid.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,10 @@ on:
4444

4545
outputs:
4646
ANDROID_LINK:
47+
description: The link to the Android build.
4748
value: ${{ jobs.androidHybrid.outputs.S3_APK_PATH }}
4849
IOS_LINK:
50+
description: The link to the iOS build.
4951
value: ${{ jobs.iosHybrid.outputs.IOS_PATH }}
5052

5153
env:

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 1009015402
118-
versionName "9.1.54-2"
117+
versionCode 1009015406
118+
versionName "9.1.54-6"
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/spending-insights/Export-Expenses-And-Reports.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,8 @@ Enter any of the following formulas into the Formula field for each column. Be s
127127
| Expenses Count | Is the number of total expenses on the report of this specific expense.|
128128
| {report:expensescount} | Would output 10 assuming that there were 10 expenses on the given report for this expense.|
129129
| Workspace Name | Is the name of the workspace applied to the report.|
130-
| {report:policyname} | Would output Sales assuming that the given report was under a workspace named Sales.|
130+
| {report:workspaceName} | Would output Sales assuming that the given report was under a workspace named Sales.|
131+
| {report:policyName} | Same as the workspace name. Policy is an older term for workspace.|
131132
| Status | Is the current state of the report when it was exported.|
132133
| {report:status} | Would output Approved assuming that the report has been approved and not yet reimbursed.|
133134
| Custom Fields | |
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
---
2+
title: Configure-QuickBooks-Desktop.md
3+
description: Learn how to connect and configure your QuickBooks Desktop integration with Expensify to manage imports, exports, and advanced accounting settings.
4+
keywords: [QuickBooks Desktop, Expensify integration, accounting settings, import settings, export settings, QBD, configure QuickBooks Desktop]
5+
---
6+
7+
Connecting QuickBooks Desktop to Expensify helps streamline expense reporting, reimbursements, and accounting workflows. This guide walks you through connecting and configuring your import, export, and advanced settings for QuickBooks Desktop.
8+
9+
---
10+
11+
# Step 1: Initial Connection
12+
13+
**Web/Desktop:**
14+
1. Go to **Settings > Workspaces > [Workspace Name] > Accounting**.
15+
2. Find QuickBooks Desktop in the list of integrations and click **Set up**.
16+
3. You'll receive a Codat link URL that must be opened on the computer where QuickBooks Desktop is installed.
17+
4. Open the provided link on your QuickBooks Desktop computer and follow the connection flow.
18+
5. Once connected, you'll see a syncing screen while information imports from QuickBooks Desktop to Expensify.
19+
20+
**Mobile:**
21+
Since QuickBooks Desktop is a desktop application, the connection process must be completed on the device that hosts QuickBooks Desktop. If you attempt to connect from a mobile device, you'll see a blocking screen directing you to complete the setup on your desktop.
22+
23+
---
24+
25+
# Step 2: Configure Import Settings
26+
27+
These steps define how your QuickBooks Desktop data is pulled into Expensify.
28+
29+
1. Go to **Settings > Workspaces > [Workspace Name] > Accounting**.
30+
2. Click the **Import** tab under the QuickBooks Desktop connection.
31+
3. Choose which coding configurations to import from QuickBooks Desktop. For each configuration, you can manage its import status:
32+
- **Chart of accounts**: Always imported and used as categories in Expensify.
33+
- **Classes**: Can be imported as tags or report fields for class-level tracking.
34+
- **Customers/projects**: Can be imported as tags or report fields for expense-level tracking.
35+
- **Items**: Can be imported and used as tags for itemized coding.
36+
37+
**Default Settings:**
38+
- Classes are enabled as tags by default
39+
- Customers/projects and Items are disabled by default
40+
41+
4. **For Classes and Customers/Projects**: Choose whether to import them as:
42+
- **Tags**: Applied at the expense level
43+
- **Report fields**: Applied at the report level
44+
45+
5. **Control your imports**:
46+
- The interface will show the current import status for each item (e.g., "Imported as categories" or "Not imported").
47+
- Use the options provided to change these settings.
48+
49+
---
50+
51+
# Step 3: Configure Export Settings
52+
53+
These settings control how Expensify exports reports and transactions to QuickBooks Desktop.
54+
55+
1. Under the **Accounting** tab, go to the **Export** section.
56+
2. Configure the following settings:
57+
58+
**Basic Export Settings:**
59+
- **Preferred Exporter**: Choose a Workspace Admin to automate report exports (defaults to workspace owner).
60+
- **Note**: If exporting company card transactions, the preferred exporter must also be a Domain Admin.
61+
- **Export Date**: Choose **date of last expense** (default), **export date**, or **submitted date**.
62+
63+
**Out-of-Pocket Expenses:**
64+
- **Export out-of-pocket expenses as**: Choose from:
65+
- **Vendor bill** (default)
66+
- **Check** (includes option to mark as "print later" in QuickBooks Desktop)
67+
- **Journal entry** (not supported if taxes are enabled)
68+
- Select the appropriate bank account for each export type.
69+
70+
**Company Card Expenses:**
71+
- **Export company card expenses as**: Choose from:
72+
- **Credit card** (default)
73+
- **Debit card**
74+
- **Vendor bill**
75+
- Configure accounts based on your selection:
76+
- **Credit card account**: First credit card account in imported list (default)
77+
- **Debit card account**: First bank account in imported list (default)
78+
- **Accounts payable account**: First Accounts Payable account (for vendor bills)
79+
- **Default vendor**: First vendor in imported list (for vendor bills)
80+
81+
**Expensify Card Transactions:**
82+
- **Export Expensify Card transactions as**: Typically set to **Credit card**.
83+
- Expensify Card transactions automatically export to an "Expensify Card Liability Account" created with the integration.
84+
85+
---
86+
87+
# Step 4: Configure Advanced Settings
88+
89+
These options manage syncing behavior, automation preferences, and additional account settings.
90+
91+
1. Still in the **Accounting** section, select the **Advanced** tab.
92+
2. Review and configure each setting (all default to enabled):
93+
- **Auto-sync**: Enable this for Expensify to automatically sync with QuickBooks Desktop every day.
94+
- **Invite employees**: Automatically invite employees to the workspace.
95+
- **Auto-create entities**: Expensify will automatically create vendors in QuickBooks Desktop if they don't exist already.
96+
- **Sync reimbursed reports**: Automatically sync reimbursed reports.
97+
98+
3. **Account Selections:**
99+
- **Bill payment account**: Select the account for bill payments (defaults to first option)
100+
- **Invoice collections account**: Select the account for invoice collections (defaults to first option)
101+
102+
---
103+
104+
# Step 5: Export Process
105+
106+
Due to QuickBooks Desktop being an offline platform, exports are asynchronous:
107+
108+
1. When you export a report, you'll first see an "export in progress" message.
109+
2. Codat stores the exported information until QuickBooks Desktop is next opened.
110+
3. Once successfully exported to QuickBooks Desktop, you'll receive a completion confirmation.
111+
4. Unlike cloud-based integrations, you won't get direct links to expenses in QuickBooks Desktop due to its offline nature.
112+
113+
---
114+
115+
# FAQ
116+
117+
## Can I set up the QuickBooks Desktop integration from my mobile device?
118+
119+
No, the initial connection and most configuration must be done from a desktop/web browser. Since QuickBooks Desktop runs on a desktop computer, the integration setup requires access to that same computer. Mobile users will see a blocking screen directing them to complete setup on desktop.
120+
121+
## What happens if I try to export a report that's already been exported?
122+
123+
Expensify will display an alert to help you avoid duplicates in QuickBooks Desktop.
124+
125+
## Can I use Locations with QuickBooks Desktop?
126+
127+
No, **Locations** are a QuickBooks Online-only feature. For similar tracking in QuickBooks Desktop, use **Classes** or **Customers/Projects**.
128+
129+
## Why can't I export as a journal entry?
130+
131+
If **taxes** are enabled, exporting as a journal entry is not supported. You'll need to switch to exporting as a **check** or **vendor bill**.
132+
133+
## How do I reconnect if my QuickBooks Desktop integration stops working?
134+
135+
If you encounter sync errors, you'll see a **Reinstall connector** option that will take you through the Codat connection flow again. This needs to be done on the computer where QuickBooks Desktop is installed, not on mobile.
136+
137+
## Why don't my exports appear in QuickBooks Desktop immediately?
138+
139+
QuickBooks Desktop is an offline application, so exports are asynchronous. Codat stores your exported data until you next open QuickBooks Desktop and the Web Connector can complete the sync.
140+
141+
## Do I need to upgrade to a certain plan to use the QuickBooks Desktop integration?
142+
143+
Yes. The QuickBooks Desktop integration is available on the **Control** plan.
144+
145+
## What's the difference between tags and report fields for Classes and Customers/Projects?
146+
147+
- **Tags**: Applied at the individual expense level, allowing different expenses on the same report to have different values
148+
- **Report fields**: Applied at the report level, meaning all expenses on a report share the same value
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
---
2+
title: travel-approval-types.md
3+
description: Learn about the different approval types in Expensify Travel powered by Spotnana, and how they impact booking workflows and policy compliance.
4+
keywords: Expensify Travel, approval types, soft approval, hard approval, passive approval, Spotnana, travel policies
5+
---
6+
7+
<div id="new-expensify" markdown="1">
8+
9+
Expensify Travel uses a tiered approval system to help organizations balance booking efficiency with policy oversight. Here's how each approval type works, and when to use them.
10+
11+
# Expensify Travel approval types
12+
13+
Expensify Travel (powered by Spotnana) supports **three types of booking approvals**: **Soft**, **Hard**, and **Passive**. These are set by your workspace's travel policy and determine the level of oversight required before a travel booking is finalized.
14+
15+
---
16+
17+
## How approval types are determined
18+
19+
Each booking (air, hotel, car, etc.) is evaluated **independently** based on the travel policy configured in your workspace.
20+
21+
Admins can define:
22+
- Which bookings require approval
23+
- What type of approval is used for different scenarios
24+
- Who needs to approve based on traveler role or booking type
25+
26+
---
27+
28+
## Booking process overview
29+
30+
No matter the approval type, every booking follows this core process:
31+
32+
1. The system tickets the booking immediately to lock in the fare.
33+
2. The travel policy engine checks the booking against your workspace's rules.
34+
3. If required, the system triggers the appropriate approval workflow.
35+
36+
---
37+
38+
## Soft approval (Opportunity to Deny)
39+
40+
A booking can proceed **unless it's explicitly denied** by the approver within the void window.
41+
42+
### Process:
43+
- The approver gets notified.
44+
- If they **do nothing**, the booking is confirmed.
45+
- If they **deny** within the void window, the ticket is voided.
46+
47+
### Key characteristics:
48+
- No action is required to approve.
49+
- Approver sees language like: *"To approve this request, no action is required."*
50+
- The approval window is tied to the supplier's void window.
51+
- Low-friction process ideal for common bookings.
52+
53+
### Best used for:
54+
- Everyday bookings where delays would risk fare increases.
55+
- Teams with strong, well-followed travel policies.
56+
- Use cases where notification is enough for visibility.
57+
58+
---
59+
60+
## Hard approval
61+
62+
The approver **must take action** for the booking to go through.
63+
64+
### Process:
65+
- Approver must explicitly approve within the void window.
66+
- If denied, the ticket is voided.
67+
- If no action is taken by the deadline, the ticket is automatically voided.
68+
69+
### Key characteristics:
70+
- Action required to proceed.
71+
- Auto-void occurs if approval isn't given in time.
72+
- Approval window is the shorter of:
73+
- 48 hours, or
74+
- The supplier's full-refund void window
75+
- If travel begins within 48 hours, that becomes the approval deadline.
76+
77+
### Downgrade scenarios:
78+
Hard approvals automatically downgrade to **Soft** when:
79+
- The supplier has a 0-hour void window.
80+
- The ticket is non-refundable.
81+
- The booking is made via manual form.
82+
83+
### Best used for:
84+
- High-cost or international bookings.
85+
- Strict policy environments.
86+
- Scenarios where cost control is more important than fare locking.
87+
88+
---
89+
90+
## Passive approval (FYI only)
91+
92+
Used purely for visibility—no action can be taken.
93+
94+
### Process:
95+
- Approver is notified, but cannot approve or deny.
96+
- Booking continues automatically.
97+
98+
### Key characteristics:
99+
- No action options.
100+
- Provides awareness, not oversight.
101+
102+
### Downgrade scenarios:
103+
Both **Soft** and **Hard** approvals downgrade to **Passive** when:
104+
- The booking is made via manual form.
105+
106+
### Best used for:
107+
- Informing managers about team travel.
108+
- Audit trail requirements.
109+
- Reducing booking friction while maintaining transparency.
110+
111+
---
112+
113+
# FAQ
114+
115+
## Can a trip include multiple approval types?
116+
Yes. Air, hotel, and car bookings are evaluated independently and may each follow different approval rules.
117+
118+
## What is a "void window"?
119+
The time frame in which a ticket can be canceled for a full refund—set by the travel supplier.
120+
121+
## What happens if an approver misses the hard approval window?
122+
The booking is **auto-voided** to prevent unapproved charges.
123+
124+
## Can admins customize who receives approval notifications?
125+
Yes. Workspace travel policies can define approvers based on roles, cost, destination, or booking type.
126+
127+
</div>

ios/NewExpensify/Info.plist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
</dict>
4545
</array>
4646
<key>CFBundleVersion</key>
47-
<string>9.1.54.2</string>
47+
<string>9.1.54.6</string>
4848
<key>FullStory</key>
4949
<dict>
5050
<key>OrgId</key>

ios/NotificationServiceExtension/Info.plist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
<key>CFBundleShortVersionString</key>
1414
<string>9.1.54</string>
1515
<key>CFBundleVersion</key>
16-
<string>9.1.54.2</string>
16+
<string>9.1.54.6</string>
1717
<key>NSExtension</key>
1818
<dict>
1919
<key>NSExtensionPointIdentifier</key>

0 commit comments

Comments
 (0)