Skip to content

Commit 9ed4d7b

Browse files
committed
Merge branch 'main' into VickyStash/bugfix/88238-fix-new-message-indication
2 parents 54f9665 + 4c62e96 commit 9ed4d7b

304 files changed

Lines changed: 6088 additions & 3633 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.
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
name: Is Contributor+
2+
description: Check whether a GitHub user is a member of the Expensify/contributor-plus team. Sets IS_CPLUS=true when the user is a member, IS_CPLUS=false otherwise.
3+
4+
inputs:
5+
USERNAME:
6+
description: The GitHub login of the user to check.
7+
required: true
8+
OS_BOTIFY_TOKEN:
9+
description: OSBotify token. Needed to read team memberships (the default GITHUB_TOKEN lacks the read:org scope).
10+
required: true
11+
12+
outputs:
13+
IS_CPLUS:
14+
description: "'true' if the user is a member of Expensify/contributor-plus, 'false' otherwise."
15+
value: ${{ steps.check.outputs.IS_CPLUS }}
16+
17+
runs:
18+
using: composite
19+
steps:
20+
- name: Check Contributor+ membership
21+
id: check
22+
shell: bash
23+
env:
24+
GH_TOKEN: ${{ inputs.OS_BOTIFY_TOKEN }}
25+
USERNAME: ${{ inputs.USERNAME }}
26+
run: |
27+
if gh api "/orgs/Expensify/teams/contributor-plus/memberships/$USERNAME" --silent; then
28+
echo "::notice::✅ $USERNAME is a Contributor+ member"
29+
echo "IS_CPLUS=true" >> "$GITHUB_OUTPUT"
30+
else
31+
echo "::notice::$USERNAME is not a Contributor+ member"
32+
echo "IS_CPLUS=false" >> "$GITHUB_OUTPUT"
33+
fi

.github/workflows/claude-review.yml

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,25 +7,50 @@ permissions:
77
on:
88
pull_request_target:
99
types: [opened, ready_for_review]
10+
pull_request_review:
11+
types: [submitted]
1012

1113
concurrency:
1214
group: claude-review-${{ github.event.pull_request.html_url }}
1315
cancel-in-progress: true
1416

1517
jobs:
1618
validate:
19+
if: github.event_name == 'pull_request_target'
1720
uses: ./.github/workflows/contributorValidationGate.yml
1821
with:
1922
PR_NUMBER: ${{ github.event.pull_request.number }}
2023
PR_AUTHOR: ${{ github.event.pull_request.user.login }}
2124
AUTHOR_ASSOCIATION: ${{ github.event.pull_request.author_association }}
2225

26+
checkCPlusApproval:
27+
if: github.event_name == 'pull_request_review' && github.event.review.state == 'approved'
28+
runs-on: blacksmith-2vcpu-ubuntu-2404
29+
outputs:
30+
IS_CPLUS: ${{ steps.check.outputs.IS_CPLUS }}
31+
steps:
32+
- name: Checkout repository
33+
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
34+
with:
35+
fetch-depth: 1
36+
37+
- name: Check Contributor+ membership
38+
id: check
39+
uses: ./.github/actions/composite/isContributorPlus
40+
with:
41+
USERNAME: ${{ github.event.review.user.login }}
42+
OS_BOTIFY_TOKEN: ${{ secrets.OS_BOTIFY_TOKEN }}
43+
2344
review:
24-
needs: [validate]
45+
needs: [validate, checkCPlusApproval]
2546
if: |
26-
needs.validate.outputs.IS_AUTHORIZED == 'true'
47+
!cancelled()
2748
&& github.event.pull_request.draft != true
2849
&& !contains(github.event.pull_request.title, 'Revert')
50+
&& (
51+
(github.event_name == 'pull_request_target' && needs.validate.outputs.IS_AUTHORIZED == 'true')
52+
|| (github.event_name == 'pull_request_review' && needs.checkCPlusApproval.outputs.IS_CPLUS == 'true')
53+
)
2954
runs-on: blacksmith-2vcpu-ubuntu-2404
3055
env:
3156
PR_NUMBER: ${{ github.event.pull_request.number }}

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 1009036102
115-
versionName "9.3.61-2"
114+
versionCode 1009036201
115+
versionName "9.3.62-1"
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"
Lines changed: 1 addition & 0 deletions
Loading

contributingGuides/SETUP_ANDROID.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,8 @@ If you haven't done any intentional edits outside of `src/` (like adding new dep
7373
- Changes applied to Javascript will be applied automatically, any changes to native code will require a recompile
7474

7575
### Expensify Employees
76-
If you are an Expensify employee and want to point the emulator to your local VM, follow [this](https://stackoverflow.com/c/expensify/questions/7699)
76+
- To point the **Development Emulator** at your local VM, follow [these steps](https://stackoverflow.com/c/expensify/questions/7699).
77+
- You must configure the local dev email account; follow [these instructions](https://stackoverflowteams.com/c/expensify/questions/23537/23538#23538).
7778

7879
## Enabling Prebuilt React Native Artifacts
7980

contributingGuides/SETUP_IOS.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,8 @@ For an M1 Mac, read this [Stack Overflow post](https://stackoverflow.com/questio
8080
If you want to run the app on an actual physical iOS device, please follow the instructions [here](https://github.com/Expensify/App/blob/main/contributingGuides/HOW_TO_BUILD_APP_ON_PHYSICAL_IOS_DEVICE.md).
8181

8282
### Expensify Employees
83-
If you are an Expensify employee and want to point the emulator to your local VM, follow [this](https://stackoverflow.com/c/expensify/questions/7699)
83+
- To point the **Development Simulator** at your local VM, follow [these steps](https://stackoverflow.com/c/expensify/questions/7699).
84+
- You must configure the local dev email account; follow [these instructions](https://stackoverflowteams.com/c/expensify/questions/23537/23538#23538).
8485

8586
## Push Notifications Setup
8687

docs/Hidden/UK-and-EU-Expensify-Card.md

Lines changed: 21 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ REMOVE noindex: true AND sitemap: false FROM YAML HEADER BEFORE PUBLISHING!
1313

1414
# Set up the Expensify Card in the UK and EU
1515

16-
The Expensify Card is available for companies in the United Kingdom and select European countries. This guide walks you through eligibility and how to set up and start using the card in GBP or EUR.
16+
The Expensify Card is available for companies in the United Kingdom and select European countries. This guide walks you through eligibility and how to set up and start using the card in GBP or EUR.
1717

1818
Workspace Admins can issue virtual Expensify Cards to members and manage spending in GBP or EUR. Physical cards will be available soon.
1919

@@ -33,34 +33,27 @@ If your company hasn’t yet connected a GBP or EUR business bank account, [foll
3333

3434
The Expensify Card can be used **anywhere Visa is accepted**.
3535

36-
However, only companies registered in the following 20 UK and EU countries can enable the Expensify Card for their Workspace:
37-
38-
- Belgium
39-
- Denmark
40-
- Estonia
41-
- Finland
42-
- Gibraltar
43-
- Greece
44-
- Ireland
45-
- Latvia
46-
- Liechtenstein
47-
- Lithuania
48-
- Luxembourg
49-
- Malta
50-
- Netherlands
51-
- Poland
52-
- Romania
53-
- Slovakia
54-
- Slovenia
55-
- Spain
56-
- Sweden
36+
Companies registered in the following countries can enable the Expensify Card for their Workspaces:
37+
38+
- Belgium
39+
- Denmark
40+
- Finland
41+
- Gibraltar
42+
- Ireland
43+
- Latvia
44+
- Lithuania
45+
- Luxembourg
46+
- Netherlands
47+
- Poland
48+
- Spain
49+
- Sweden
5750
- United Kingdom
5851

5952
## What are the pre-requisites to set up the Expensify Card in the UK and EU
6053

61-
To set up the Expensify Card in the UK and EU, you must:
54+
To set up the Expensify Card in the UK and EU, you must:
6255

63-
1. Have a GBP or EUR bank account connected. To connect one, [Enable Global Reimbursement](https://help.expensify.com/articles/new-expensify/wallet-and-payments/Enable-Global-Reimbursement).
56+
1. Have a GBP or EUR bank account connected. To connect one, [Enable Global Reimbursement](https://help.expensify.com/articles/new-expensify/wallet-and-payments/Enable-Global-Reimbursement).
6457
2. Complete the **[Know Your Customer (KYC)](https://launch-workflow.trulioo.com/68223577c5dae52a6ec9347f)** and **[Know Your Business (KYB)](https://launch-workflow.trulioo.com/681a7cc4e65d2e48f19de9c3)** forms.
6558
3. Share the last 90 days of statements from your connected GBP or EUR bank account with Concierge so they can assess your eligible limit
6659

@@ -70,9 +63,9 @@ To set up the Expensify Card in the UK and EU, you must:
7063

7164
1. From navigation tabs (on the left on Web, on the bottom on Mobile), choose **Workspaces > [Workspace Name] > More features**.
7265
2. In the **Spend** section, enable **Expensify Card**.
73-
3. So that we can assess your request, reach out to Concierge and provide the last 90 days of statements from the connected UK or EU bank account
66+
3. So that we can assess your request, reach out to Concierge and provide the last 90 days of statements from the connected UK or EU bank account
7467

75-
Once enabled, **Expensify Card** will appear in the navigation tabs.
68+
Once enabled, **Expensify Card** will appear in the navigation tabs.
7669

7770
---
7871

@@ -88,7 +81,7 @@ Once enabled, **Expensify Card** will appear in the navigation tabs.
8881

8982
1. From navigation tabs (on the left on Web, on the bottom on Mobile), choose **Workspaces > [Workspace Name] > Expensify Card**
9083
2. Click **Issue new card**.
91-
3. Select the employee the card should be issued to.
84+
3. Select the employee the card should be issued to.
9285
4. Choose **Virtual**.
9386
5. Pick a limit type:
9487
- **Smart limit** – Spend up to a threshold before needing approval
@@ -110,7 +103,7 @@ We use the [Visa FX calculator](https://www.visa.co.uk/support/consumer/travel-s
110103

111104
## Does the Expensify Card support Visa Secure for online transactions?
112105

113-
Yes, the Expensify Card protects online transactions with Visa Secure. Please review the [Visa Secure FAQs]({{site.url}}/assets/Files/Visa-secure-faq-expensify.pdf) for more information.
106+
Yes, the Expensify Card protects online transactions with Visa Secure. Please review the [Visa Secure FAQs]({{site.url}}/assets/Files/Visa-secure-faq-expensify.pdf) for more information.
114107

115108
## How do I get help with the Expensify Card in the UK and EU?
116109

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
---
2+
title: Troubleshoot SmartScan Issues
3+
description: Fix common SmartScan problems, including failed, stuck and incorrect scans.
4+
keywords: [Expensify Classic, SmartScan, scan failed, receipt not scanning, illegible receipt, blurry receipt, stuck scanning, SmartScan error, scan not working, SmartScan troubleshooting, SCANREADY, wrong amount, wrong merchant, wrong date, SmartScan incorrect]
5+
internalScope: Audience is all Expensify members. Covers troubleshooting SmartScan failures, image quality tips, and what to do when SmartScan returns incorrect data. Does not cover how to attach, replace, or crop receipts.
6+
---
7+
8+
# Troubleshoot SmartScan Issues
9+
10+
SmartScan reads receipt images and automatically fills in expense details like the amount, date, and merchant. If SmartScan fails, gets stuck, or scans incorrectly, use this guide to identify the cause and fix the issue.
11+
12+
[Learn how to SmartScan a receipt](/articles/expensify-classic/expenses/Add-an-expense#add-an-expense-with-smartscan).
13+
14+
---
15+
16+
## Why SmartScan fails to complete a scan
17+
18+
SmartScan requires a readable date and total amount on the receipt. If either of these cannot be detected, the scan will fail.
19+
20+
Common reasons include:
21+
22+
- The receipt does not include a date or total
23+
- The date or total is cut off or cropped out
24+
- The image is blurry or out of focus
25+
- The receipt is faded or low contrast
26+
- The text is obscured by shadows, glare, or folds
27+
28+
If SmartScan cannot confidently read these required fields, the scan will fail and will show the message: "Receipt scanning failed. Enter details manually".
29+
30+
---
31+
32+
## How to fix when SmartScan fails to complete a scan
33+
34+
SmartScan may fail if the receipt image is unreadable, or if the image is missing a clear expense date or amount.
35+
36+
To retry:
37+
38+
**On web:**
39+
40+
1. In the navigation tabs on the left, go to **Expenses**.
41+
2. Click the expense with the failed scan to open it.
42+
3. Drag and drop a receipt image onto the window to replace the existing receipt.
43+
44+
**On mobile:**
45+
46+
1. Tap the hamburger menu in the top-left corner.
47+
2. Tap **Expenses**.
48+
3. Tap the expense with the failed scan to open it.
49+
4. Tap the receipt image.
50+
5. Tap **Retake**.
51+
52+
Once a new receipt image is added, SmartScan will run again.
53+
54+
---
55+
56+
## How to troubleshoot stuck or delayed scans
57+
58+
SmartScan usually completes within a few seconds, but delays can happen.
59+
60+
- **Wait a few minutes**. Scans may take longer during high-traffic periods.
61+
- **Check your internet connection**. SmartScan requires an active connection to process. If you were offline when you took the photo, the scan will begin once you reconnect.
62+
- **Check the photo library on your device**. If SmartScan fails to process the images, it will be saved to the photo library on your device.
63+
64+
If the scan is still stuck after several minutes, you can retry SmartScan with a new photo to trigger a fresh scan.
65+
66+
---
67+
68+
## How to fix incorrect scans
69+
70+
SmartScan extracts data automatically, but it may misread certain receipts — especially handwritten receipts, faded ink, or unusual formats.
71+
72+
To fix an incorrectly scanned merchant name, date or amount you can edit the expense manually. [Learn how to edit expenses](/articles/expensify-classic/expenses/Edit-expenses).
73+
74+
---
75+
76+
## How to take better receipt photos for SmartScan
77+
78+
Improving image quality helps prevent most SmartScan issues.
79+
80+
- Lay the receipt flat on a contrasting surface (e.g., a dark receipt on a light table).
81+
- Capture the full receipt and make sure all edges, the total, date, and merchant name are visible.
82+
- Avoid shadows and glare. Hold your phone directly above the receipt and use even lighting.
83+
- Keep the camera steady - blurry images are the most common cause of scan failures.
84+
- Avoid folded or crumpled receipts. Flatten the receipt before photographing it.
85+
- Use the in-app camera. The Expensify camera is optimized for receipt scanning.
86+
87+
---
88+
89+
# FAQ
90+
91+
## Why does SmartScan keep failing on the same receipt?
92+
93+
The receipt image may be too low quality for SmartScan to process. Try taking a new photo with better lighting and ensure the full receipt is in frame. If it continues to fail, the receipt may be too faded, damaged, or in a non-standard format — in that case, enter the expense details manually instead.
94+
95+
## What file types does SmartScan support?
96+
97+
SmartScan works with common image formats (JPG, PNG) and PDF files. For best results on mobile, use the in-app camera to take a photo directly.
98+
99+
## SmartScan got the currency wrong. How do I fix it?
100+
101+
Open the expense, tap the **Amount** field, and change the currency manually. This can happen with receipts from international merchants or receipts that don't clearly display a currency symbol.

0 commit comments

Comments
 (0)