Skip to content

Commit 4ef0f29

Browse files
committed
Merge branch 'main' into @OlGierd03/reanimated-travel-upgrade-modal
2 parents 69e0363 + dfa504a commit 4ef0f29

91 files changed

Lines changed: 1930 additions & 823 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

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 1009018300
118-
versionName "9.1.83-0"
117+
versionCode 1009018304
118+
versionName "9.1.83-4"
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/PR_REVIEW_GUIDELINES.md

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ This document lists specific guidelines for all PR reviews and aims to clarify i
3838
## Good code patterns to require
3939

4040
1. Check that functions have comments when appropriate.
41-
- If the function has params or returns something, use [JSDocs syntax]((https://github.com/Expensify/App/blob/main/contributingGuides/STYLE.md#jsdocs)) to describe them.
41+
- If the function has params or returns something, use [JSDocs syntax](https://github.com/Expensify/App/blob/main/contributingGuides/STYLE.md#jsdocs) to describe them.
4242
- Indicate the param name(s), data type passed and / or returned, and purpose if not immediately obvious.
4343
- Obvious functions (with no params / return value) should not have comments.
4444
- **In short: _Add comments & docs, only when useful._**
@@ -66,8 +66,27 @@ Here are some guidelines we use in order to make the best decisions:
6666
1. Specialization
6767
- When one component is a special case of another, we should opt for the technique of composition. Here are the [React docs](https://reactjs.org/docs/composition-vs-inheritance.html#specialization) on Specialization. The idea is that it’s better to establish a pattern of creating increasingly specific components, instead of adding dozens of use cases to a single component.
6868
- You might consider this when a component is being reused because the new use case is “close enough” to the original. Rather than adding functionality to that component with subtle additions, it may be better to create a new, more specialized version of that component.
69-
1. Refactors
69+
2. Refactors
7070
- During a code review it often becomes apparent that a refactor is needed. In this case, we recommend following these steps:
7171
1. Identify the refactor and confirm with others that it’s needed.
7272
2. Do that refactor first (as a separate job, if it qualifies), merge it, test for regressions.
7373
3. Proceed with the original issue & job.
74+
75+
# C+ Best Practices
76+
77+
To reduce delays and improve PR turnaround, reviewers should follow these additional practices:
78+
79+
1. **Continue reviewing the full PR even after spotting a bug.**
80+
- Always complete a full review pass. Finding an issue early on shouldn’t stop you from checking the rest of the code. This helps the author address all feedback in one go, rather than dealing with staggered comments across days.
81+
82+
2. **Don’t let minor merge conflicts block your review.**
83+
- You can still review logic, structure, and tests while conflicts are being resolved.
84+
85+
3. **If you find a bug, test if it exists on `main`.**
86+
- If the issue also appears on `main`, **do not block the PR** — it likely wasn’t introduced by the current changes.
87+
- Report such bug in `#expensify-bugs` Slack channel following the bug template to make sure its addressed.
88+
89+
4. **Don’t block or delay review due to unrelated failing workflows or test flakes.**
90+
- If failures are clearly not introduced by the PR, don’t treat them as blockers. These can be resolved when syncing with `main` later.
91+
92+
These practices help minimize asynchronous lag and keep development moving smoothly across time zones.

docs/articles/travel/getting-started/Common-Travel-Terms-and-Abbreviations.md

Lines changed: 477 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
---
2+
title: Expensify Travel Walkthrough
3+
description: Learn the most common terms and abbreviations used in the travel industry to better understand your bookings and travel policies.
4+
keywords: [travel terms, travel abbreviations, business travel glossary, common travel lingo, travel vocabulary, industry jargon]
5+
---
6+
7+
<div id="new-expensify" markdown="1">
8+
9+
Check out a video of how Expensify Travel works below:
10+
11+
<iframe src="https://drive.google.com/file/d/125j1iFdce9VP6VkDZ609TrfaaSMzdc8M/preview" allowfullscreen width="560" height="315" allow="autoplay"></iframe>
12+
13+
</div>

docs/articles/travel/getting-started/How-Expensify-And-Expensify-Travel-Connect.md renamed to docs/articles/travel/getting-started/How-Expensify-and-Expensify-Travel-Connect.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
title: how-expensify-and-expensify-travel-connect.md
2+
title: How Expensify and Expensify Travel Connect
33
description: Learn how Expensify Travel integrates with your Expensify account to automate business travel booking and expense reporting.
44
keywords: [Expensify Travel, travel booking, automatic expense creation, flight expense, hotel booking, car rental, SmartScan, travel integration, trip automation, book business travel]
55

@@ -74,4 +74,4 @@ Nope! Expensify Travel is part of your existing Expensify account.
7474

7575
Updated booking details automatically sync with your expenses. If something looks off, you can always edit the expense manually.
7676

77-
</div>
77+
</div>
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
---
2+
title: Approving Travel
3+
description: Learn how to review, approve, or deny travel requests in Expensify Travel and configure approval workflows to fit your organization.
4+
keywords: [approve travel, deny travel request, soft approval, hard approval, travel policy approval, manager approval, designated approver, secondary approver, travel workflows]
5+
---
6+
7+
<div id="new-expensify" markdown="1">
8+
9+
Approving travel is easy and flexible, giving approvers full control over how and when travel requests get reviewed. With customizable approval flows, mobile-friendly access, and even email-based actions, approving travel happens wherever you are.
10+
11+
---
12+
13+
## How to access Expensify Travel
14+
15+
- **In New Expensify:** Click the green **+** button in the bottom-left corner of your screen, then select **Book travel**.
16+
- **In Classic Expensify:** Click **Travel** in the left-hand menu, then select **Book or manage travel**.
17+
18+
**Need to enable travel still?** Reach out to your Account Manager or Concierge to schedule a travel demo and get it enabled for your account.
19+
20+
---
21+
22+
# Review and approve travel requests
23+
24+
All trip requests that require approval can be found under:
25+
26+
- **Trips > Approvals** (on both mobile and desktop)
27+
- All users responsible for approving trips will receive an email notification when a trip is awaiting their approval.
28+
29+
Here, approvers can filter by:
30+
- _Out of policy_ approval requests
31+
- Booking type (Air, Hotel, Car, Rail)
32+
- Their own approvals or Organization approvals
33+
- Traveler name
34+
35+
Each trip will display relevant details and action buttons to **Approve** or **Deny**, based on whether the travel policy uses soft or hard approval.
36+
37+
---
38+
39+
# Approval actions
40+
41+
Approvers will see the following options for each trip:
42+
43+
- **Approve:** With hard approval, this confirms the travel booking can proceed. The booking is finalized, and the payment card is charged with the booking receipt automatically added to the traveler's Expensify account.
44+
- **Deny:** With soft approval, this rejects the travel booking request. The booking is canceled, and the traveler will be notified.
45+
46+
Approvals can also be done via email. When a trip requires approval, approvers will receive a notification with **Approve** or **Deny** buttons directly embedded.
47+
48+
---
49+
50+
# Understanding soft vs. hard approval
51+
52+
- **Soft approval:** Travel can be booked and processed before the approver reviews it. Approvers are still notified and have 24 hours to deny the booking and cancel it before the fare processes.
53+
- **Hard approval:** The traveler creates the booking in a pending state. The travel approver has 24 hours to approve the booking request, if the booking is not approved, the travel plans are canceled and no transaction is processed.
54+
55+
These settings are configured within each travel policy under **Program** > **Policies** > select a policy > **General** > **Policy group actions** tab.
56+
57+
---
58+
59+
## Secondary Approvers
60+
61+
A secondary approver acts as a fallback if the primary approver is unavailable. For example, if a manager is on vacation, a secondary approver ensures there’s no delay in getting trips approved. This is especially important when timely approvals are needed with a hard approval setup.
62+
63+
Set this up under:
64+
65+
- Approvers can set their own secondary approver under **User icon** > **My profile** > **Configuration** > **Approval Settings**. Click Add Approver to designate a secondary approver who can approve on your behalf. You may add multiple secondary approvers.
66+
- Travel admins can set secondary approvers in a traveler's profile. Head to **Program** > **Users** > **Travelers** > select traveler > **Configuration** tab. Click Add approver to search for another travel member to approve on their behalf.
67+
68+
---
69+
70+
# FAQ
71+
72+
## Can I approve travel from my phone?
73+
74+
Yes! The approval dashboard is identical on web and mobile. You can also approve or deny directly from email notifications.
75+
76+
---
77+
78+
## What happens if no one approves the trip?
79+
80+
If no action is taken:
81+
- With **soft approval**, the trip is already booked and proceeds as normal.
82+
- With **hard approval**, the booking is canceled, and if a refundable fare was booked, a refund will be issued to the payment card.
83+
84+
---
85+
86+
## Can multiple people approve the same request?
87+
88+
Only the designated approver, the employee's manager, a default approver, or a secondary approver can approve a specific trip. This will depend on your approval method in the travel policy.
89+
90+
---
91+
92+
## How do I get notified when I need to approve?
93+
94+
Approvers receive email notifications and can view pending approvals under **Trips** > **Approvals** in the Travel dashboard. You can configure your notification settings in your profile under **User icon** > **My profile** > **Notifications**.
95+
96+
Optionally, admins can manage approver notifications and create custom notifications for travel requests and approvals by heading to **Program** > **Company** > **Configuration** > **Email notifications**.
97+
98+
</div>
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
---
2+
title: Configuring Car Settings
3+
description: Learn how to manage car rental booking settings in a Spotnana travel policy.
4+
keywords: [car rental policy, car booking rules, rental car settings, expensify travel policy, spotnana car settings]
5+
---
6+
7+
Set rental car preferences that balance traveler convenience with company policy. Fine-tune everything from vehicle type to price limits for smarter, controlled bookings.
8+
9+
## How to access Expensify Travel
10+
11+
- **In New Expensify:** Click the green **+** button in the bottom-left corner of your screen, then select **Book travel**.
12+
- **In Classic Expensify:** Click **Travel** in the left-hand menu, then select **Book or manage travel**.
13+
14+
**Need to enable travel still?** Reach out to your Account Manager or Concierge to schedule a travel demo and get it enabled for your account.
15+
16+
---
17+
18+
# Configuring Car settings
19+
20+
To configure your car booking policy:
21+
22+
1. Open Expensify Travel.
23+
2. Go to **Program** > **Policies**.
24+
3. Select an existing policy or click **Add new** to create one.
25+
4. Expand the **Car** tab.
26+
27+
**Note:** Settings with a chain link icon indicate that the value is inherited from a parent policy. To override and customize the value, click the link icon.
28+
29+
# Car policy settings
30+
31+
**Car categories not allowed**
32+
Prevent travelers from booking specific car types. This overrides all other car booking rules.
33+
- Examples: Economy, Premium, Mid-size, Luxury.
34+
35+
**Car categories in policy**
36+
Define which car types are considered in policy.
37+
- Examples: Mini, Full-size, Convertible, Van.
38+
39+
**Car engine types not allowed**
40+
Block travelers from booking certain engine types. This overrides other car rules.
41+
- Examples: Hybrid, Electric, Gas.
42+
43+
**Maximum price**
44+
Set a maximum daily rate for rental cars.
45+
- Taxes and fees are **not included** in the price cap.
46+
47+
**Out of policy reason codes**
48+
Enable travelers to submit a reason when booking a car that’s out of policy.
49+
- Click **Manage Reason Codes** to create, edit, or delete the options travelers can choose from.
50+
51+
# FAQ
52+
53+
**What happens if a traveler tries to book a restricted car type?**
54+
They won’t be able to complete the booking and will see an error or custom message depending on whether or not you're blocked out of policy bookings or allow them with explicit approval (hard approval).
55+
56+
**Can admins customize car booking rules by region or traveler group?**
57+
Not within the Car tab, but different travel policies can be assigned to specific departments, legal entities, or user groups to achieve that flexibility.
58+
59+
**Is there a way to enforce electric vehicle bookings for sustainability efforts?**
60+
Yes, admins can encourage sustainable travel by disallowing all engine types except electric under **Car engine types not allowed** setting.
61+

0 commit comments

Comments
 (0)