Skip to content

Commit 70f25f8

Browse files
committed
Merge branch 'main' into feat/simplify-getReportName-for-formula-computation
2 parents 504a570 + eed8391 commit 70f25f8

416 files changed

Lines changed: 6514 additions & 3881 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/workflows/deploy.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -305,9 +305,10 @@ jobs:
305305
with:
306306
python-version: '3.12'
307307
cache: 'pip'
308+
cache-dependency-path: desktop/requirements.txt
308309

309310
- name: Ensure setuptools for node-gyp
310-
run: python -m pip install --upgrade pip setuptools
311+
run: pip install --upgrade -r desktop/requirements.txt
311312

312313
- name: Load Desktop credentials from 1Password
313314
id: load-credentials
@@ -332,7 +333,6 @@ jobs:
332333
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
333334
GCP_GEOLOCATION_API_KEY: ${{ secrets.GCP_GEOLOCATION_API_KEY_PRODUCTION }}
334335
S3_BUCKET: ${{ github.ref == 'refs/heads/production' && vars.PRODUCTION_S3_BUCKET || vars.STAGING_S3_BUCKET }}
335-
PYTHON: ${{ steps.setup-python.outputs.python-path }}
336336

337337
- name: Upload desktop sourcemaps artifact
338338
# v4

.github/workflows/reassurePerformanceTests.yml

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -50,20 +50,17 @@ jobs:
5050
set -e
5151
BASELINE_BRANCH=${BASELINE_BRANCH:="main"}
5252
git fetch origin "$BASELINE_BRANCH" --no-tags --depth=1
53-
git switch "$BASELINE_BRANCH"
54-
cd Mobile-Expensify
55-
git checkout "$(git rev-parse HEAD)"
56-
cd ..
57-
git add Mobile-Expensify
58-
npm install --force || (rm -rf node_modules && npm install --force)
53+
54+
git checkout --force --detach "origin/$BASELINE_BRANCH" --no-recurse-submodules
55+
npm install --force || (rm -rf node_modules && npm install --force)
5956
NODE_OPTIONS=--experimental-vm-modules npx reassure --baseline
60-
git switch --force --detach "${PR_SHA:-${GITHUB_SHA}}"
61-
cd Mobile-Expensify
62-
git checkout "$(git rev-parse HEAD)"
63-
cd ..
64-
git add Mobile-Expensify
65-
git merge --no-commit --allow-unrelated-histories "$BASELINE_BRANCH" -X ours
66-
git checkout --ours .
57+
58+
git checkout --force --detach "${PR_SHA:-${GITHUB_SHA}}" --no-recurse-submodules
59+
60+
if ! git merge --no-commit --allow-unrelated-histories "$BASELINE_BRANCH" -X ours; then
61+
git checkout --ours .
62+
fi
63+
6764
npm install --force || (rm -rf node_modules && npm install --force)
6865
NODE_OPTIONS=--experimental-vm-modules npx reassure --branch
6966

.github/workflows/testBuild.yml

Lines changed: 63 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -192,9 +192,10 @@ jobs:
192192
with:
193193
python-version: '3.12'
194194
cache: 'pip'
195+
cache-dependency-path: desktop/requirements.txt
195196

196197
- name: Ensure setuptools for node-gyp
197-
run: python -m pip install --upgrade pip setuptools
198+
run: pip install --upgrade -r desktop/requirements.txt
198199

199200
- name: Load Desktop credentials from 1Password
200201
id: load-credentials
@@ -226,7 +227,6 @@ jobs:
226227
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
227228
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
228229
GCP_GEOLOCATION_API_KEY: ${{ secrets.GCP_GEOLOCATION_API_KEY_STAGING }}
229-
PYTHON: ${{ steps.setup-python.outputs.python-path }}
230230

231231
web:
232232
name: Build and deploy Web
@@ -269,7 +269,7 @@ jobs:
269269
needs: [prep, getMobileExpensifyPR, getMobileExpensifyRef]
270270
runs-on: ubuntu-latest-xl
271271
outputs:
272-
ROCK_APK_PATH: ${{ steps.rock-remote-build-android.outputs.artifact-url }}
272+
S3_APK_PATH: ${{ steps.exportAndroidS3Path.outputs.S3_APK_PATH }}
273273
steps:
274274
- name: Checkout
275275
# v4
@@ -346,25 +346,37 @@ jobs:
346346
ANDROID_UPLOAD_KEYSTORE_ALIAS: op://${{ vars.OP_VAULT }}/Repository-Secrets/ANDROID_UPLOAD_KEYSTORE_ALIAS
347347
ANDROID_UPLOAD_KEY_PASSWORD: op://${{ vars.OP_VAULT }}/Repository-Secrets/ANDROID_UPLOAD_KEY_PASSWORD
348348

349-
- name: Rock Remote Build - Android
350-
id: rock-remote-build-android
351-
uses: callstackincubator/android@1585a4a0b32801c26d2dae67a09f0df530df25c0 # v3
349+
- name: Build Android app
350+
id: build
352351
env:
353-
IS_HYBRID_APP: true
352+
ANDROID_UPLOAD_KEYSTORE_PASSWORD: ${{ steps.load-credentials.outputs.ANDROID_UPLOAD_KEYSTORE_PASSWORD }}
353+
ANDROID_UPLOAD_KEYSTORE_ALIAS: ${{ steps.load-credentials.outputs.ANDROID_UPLOAD_KEYSTORE_ALIAS }}
354+
ANDROID_UPLOAD_KEY_PASSWORD: ${{ steps.load-credentials.outputs.ANDROID_UPLOAD_KEY_PASSWORD }}
355+
GITHUB_ACTOR: ${{ github.actor }}
354356
GITHUB_TOKEN: ${{ github.token }}
357+
run: bundle exec fastlane android build_adhoc_hybrid
358+
359+
- name: Configure AWS Credentials
360+
# v4
361+
uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722
355362
with:
356-
variant: 'Adhoc'
357-
sign: true
358-
re-sign: true
359-
keystore-file: './upload-key.keystore'
360-
keystore-store-file: 'upload-key.keystore'
361-
keystore-store-password: ${{ steps.load-credentials.outputs.ANDROID_UPLOAD_KEYSTORE_PASSWORD }}
362-
keystore-key-alias: ${{ steps.load-credentials.outputs.ANDROID_UPLOAD_KEYSTORE_ALIAS }}
363-
keystore-key-password: ${{ steps.load-credentials.outputs.ANDROID_UPLOAD_KEY_PASSWORD }}
364-
# Specify the path (relative to the Android source directory) where the keystore should be placed.
365-
keystore-path: '../tools/buildtools/upload-key.keystore'
366-
comment-bot: false
367-
rock-build-extra-params: '--extra-params -PreactNativeArchitectures=arm64-v8a,x86_64'
363+
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
364+
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
365+
aws-region: us-east-1
366+
367+
- name: Upload Android AdHoc build to S3
368+
run: bundle exec fastlane android upload_s3
369+
env:
370+
S3_ACCESS_KEY: ${{ secrets.AWS_ACCESS_KEY_ID }}
371+
S3_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
372+
S3_BUCKET: ad-hoc-expensify-cash
373+
S3_REGION: us-east-1
374+
375+
- name: Export S3 path
376+
id: exportAndroidS3Path
377+
run: |
378+
# $s3APKPath is set from within the Fastfile, android upload_s3 lane
379+
echo "S3_APK_PATH=$s3APKPath" >> "$GITHUB_OUTPUT"
368380
369381
iosHybrid:
370382
name: Build and deploy iOS for testing
@@ -374,7 +386,7 @@ jobs:
374386
DEVELOPER_DIR: /Applications/Xcode_26.0.app/Contents/Developer
375387
runs-on: macos-15-xlarge
376388
outputs:
377-
ROCK_IOS_PATH: ${{ steps.rock-remote-build-ios.outputs.artifact-url }}
389+
IOS_PATH: ${{ steps.export-ios-path.outputs.IOS_PATH }}
378390
steps:
379391
- name: Checkout
380392
# v4
@@ -440,7 +452,6 @@ jobs:
440452
# v1
441453
uses: 1password/install-cli-action@143a85f84a90555d121cde2ff5872e393a47ab9f
442454

443-
444455
- name: Load files from 1Password
445456
env:
446457
OP_SERVICE_ACCOUNT_TOKEN: ${{ secrets.OP_SERVICE_ACCOUNT_TOKEN }}
@@ -450,57 +461,34 @@ jobs:
450461
op read "op://${{ vars.OP_VAULT }}/OldApp_AdHoc_Notification_Service/OldApp_AdHoc_Notification_Service.mobileprovision" --force --out-file ./OldApp_AdHoc_Notification_Service.mobileprovision
451462
op read "op://${{ vars.OP_VAULT }}/New Expensify Distribution Certificate/Certificates.p12" --force --out-file ./Certificates.p12
452463
453-
- name: Create ExportOptions.plist
454-
run: |
455-
cat > Mobile-Expensify/iOS/ExportOptions.plist << 'EOF'
456-
<?xml version="1.0" encoding="UTF-8"?>
457-
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
458-
<plist version="1.0">
459-
<dict>
460-
<key>method</key>
461-
<string>ad-hoc</string>
462-
<key>provisioningProfiles</key>
463-
<dict>
464-
<key>com.expensify.expensifylite.adhoc</key>
465-
<string>(OldApp) AdHoc</string>
466-
<key>com.expensify.expensifylite.adhoc.SmartScanExtension</key>
467-
<string>(OldApp) AdHoc: Share Extension</string>
468-
<key>com.expensify.expensifylite.adhoc.NotificationServiceExtension</key>
469-
<string>(OldApp) AdHoc: Notification Service</string>
470-
</dict>
471-
</dict>
472-
</plist>
473-
EOF
474-
475-
- name: Rock Remote Build - iOS
476-
id: rock-remote-build-ios
477-
uses: callstackincubator/ios@79778c5739839044d2ca5af75ace7ba0467b5366 # v3
478-
env:
479-
GITHUB_TOKEN: ${{ github.token }}
480-
IS_HYBRID_APP: true
464+
- name: Build AdHoc app
465+
run: bundle exec fastlane ios build_adhoc_hybrid
466+
467+
- name: Configure AWS Credentials
468+
# v4
469+
uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722
481470
with:
482-
destination: device
483-
re-sign: true
484-
ad-hoc: true
485-
scheme: 'Expensify AdHoc'
486-
configuration: 'AdHoc'
487-
certificate-file: './Certificates.p12'
488-
provisioning-profiles: |
489-
[
490-
{
491-
"name": "(OldApp) AdHoc",
492-
"file": "./OldApp_AdHoc.mobileprovision"
493-
},
494-
{
495-
"name": "(OldApp) AdHoc: Share Extension",
496-
"file": "./OldApp_AdHoc_Share_Extension.mobileprovision"
497-
},
498-
{
499-
"name": "(OldApp) AdHoc: Notification Service",
500-
"file": "./OldApp_AdHoc_Notification_Service.mobileprovision"
501-
}
502-
]
503-
comment-bot: false
471+
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
472+
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
473+
aws-region: us-east-1
474+
475+
- name: Upload AdHoc build to S3
476+
run: bundle exec fastlane ios upload_s3
477+
env:
478+
S3_ACCESS_KEY: ${{ secrets.AWS_ACCESS_KEY_ID }}
479+
S3_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
480+
S3_BUCKET: ad-hoc-expensify-cash
481+
S3_REGION: us-east-1
482+
483+
- name: Export iOS path
484+
id: export-ios-path
485+
run: |
486+
content_ios="$(cat ./ios_paths.json)"
487+
content_ios="${content_ios//'%'/'%25'}"
488+
content_ios="${content_ios//$'\n'/'%0A'}"
489+
content_ios="${content_ios//$'\r'/'%0D'}"
490+
ios_path=$(echo "$content_ios" | jq -r '.html_path')
491+
echo "IOS_PATH=$ios_path" >> "$GITHUB_OUTPUT"
504492
505493
postGithubComment:
506494
runs-on: ubuntu-latest
@@ -530,9 +518,9 @@ jobs:
530518
DESKTOP: ${{ needs.desktop.result }}
531519
IOS: ${{ needs.iosHybrid.result }}
532520
WEB: ${{ needs.web.result }}
533-
ANDROID_LINK: ${{ needs.androidHybrid.outputs.ROCK_APK_PATH }}
521+
ANDROID_LINK: ${{ needs.androidHybrid.outputs.S3_APK_PATH }}
534522
DESKTOP_LINK: https://ad-hoc-expensify-cash.s3.amazonaws.com/desktop/${{ inputs.APP_PULL_REQUEST_NUMBER }}/NewExpensify.dmg
535-
IOS_LINK: ${{ needs.iosHybrid.outputs.ROCK_IOS_PATH }}
523+
IOS_LINK: ${{ needs.iosHybrid.outputs.IOS_PATH }}
536524
WEB_LINK: https://${{ inputs.APP_PULL_REQUEST_NUMBER }}.pr-testing.expensify.com
537525

538526
- name: Publish links to apps for download on Expensify/Mobile-Expensify PR
@@ -544,5 +532,5 @@ jobs:
544532
GITHUB_TOKEN: ${{ secrets.OS_BOTIFY_TOKEN }}
545533
ANDROID: ${{ needs.androidHybrid.result }}
546534
IOS: ${{ needs.iosHybrid.result }}
547-
ANDROID_LINK: ${{ needs.androidHybrid.outputs.ROCK_APK_PATH }}
548-
IOS_LINK: ${{ needs.iosHybrid.outputs.ROCK_IOS_PATH }}
535+
ANDROID_LINK: ${{ needs.androidHybrid.outputs.S3_APK_PATH }}
536+
IOS_LINK: ${{ needs.iosHybrid.outputs.IOS_PATH }}

Gemfile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ ruby ">= 3.3.4"
66
gem "cocoapods", "= 1.15.2"
77
gem 'activesupport', '>= 6.1.7.5', '!= 7.1.0'
88
gem 'xcodeproj', '< 1.26.0'
9-
gem "fastlane", "~> 2", ">= 2.227.1"
9+
gem "fastlane", "~> 2", ">= 2.228.0"
1010
gem "xcpretty", "~> 0"
11+
gem "openssl", ">= 3.3.1"
1112

1213

1314
plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile')

Gemfile.lock

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ GEM
121121
faraday_middleware (1.2.1)
122122
faraday (~> 1.0)
123123
fastimage (2.4.0)
124-
fastlane (2.227.1)
124+
fastlane (2.228.0)
125125
CFPropertyList (>= 2.3, < 4.0.0)
126126
addressable (>= 2.8, < 3.0.0)
127127
artifactory (~> 3.0)
@@ -242,14 +242,15 @@ GEM
242242
mutex_m (0.2.0)
243243
nanaimo (0.3.0)
244244
nap (1.1.0)
245-
naturally (2.2.1)
245+
naturally (2.3.0)
246246
netrc (0.11.0)
247247
nkf (0.2.0)
248+
openssl (3.3.1)
248249
optparse (0.6.0)
249250
os (1.1.4)
250251
plist (3.7.2)
251252
public_suffix (4.0.7)
252-
rake (13.2.1)
253+
rake (13.3.0)
253254
representable (3.2.0)
254255
declarative (< 0.1.0)
255256
trailblazer-option (>= 0.1.1, < 0.2.0)
@@ -309,11 +310,12 @@ DEPENDENCIES
309310
benchmark
310311
bigdecimal
311312
cocoapods (= 1.15.2)
312-
fastlane (~> 2, >= 2.227.1)
313+
fastlane (~> 2, >= 2.228.0)
313314
fastlane-plugin-aws_s3
314315
fastlane-plugin-firebase_app_distribution
315316
logger
316317
mutex_m
318+
openssl (>= 3.3.1)
317319
xcodeproj (< 1.26.0)
318320
xcpretty (~> 0)
319321

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 1009023300
118-
versionName "9.2.33-0"
117+
versionCode 1009023600
118+
versionName "9.2.36-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"
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# Red Brick Road and Green Brick Road Philosophy
2+
The Red Brick Road (RBR) and Green Brick Road (GBR) are each a method to direct a user down a clear path of actions to take or errors to fix. It is intended to help the user have a clearly defined set of steps to follow in order to resolve something. It can lead you to take an action anywhere in the Inbox, Reports, Workspaces, or Account.
3+
4+
## Terminology
5+
- **Brick Road**: The Brick Road is named after the Yellow Brick Road from the popular movie The Wizard of Oz. In the Wizard of Oz, Dorothy must follow the Yellow Brick Road in order to reach the Emerald City, similar to how the Brick Roads in Expensify lead the user down a certain path to reach the final destination of a resolution.
6+
- **Red Brick Road**: The Red Brick Road (RBR) is the red dot that shows up under certain conditions that will lead the user down a path of errors or violations to fix.
7+
- **The UI Pattern**:
8+
- The Red Brick Road will show up in the UI as a red dot next to an inbox item, expense, report or other specific menu item.
9+
- The goal is to bring the user to some kind of action.
10+
- With the RBR, it usually ends at some kind of error with instructions on how to fix it.
11+
- The dots (or indicators) should be present on the navigation items (eg. links, buttons) that the user needs to click on to take them to where the action item will be.
12+
The dots (or indicators) should be present on the navigation items (eg. links, buttons) that the user needs to click on to take them to where the action item will be
13+
- **Green Brick Road**: The Green Brick Road (GBR) is the red dot that shows up under certain conditions that will lead the user down a path of errors or violations to fix.
14+
- **The UI Pattern**:
15+
- The Green Brick Road will show up in the UI as a green dot next to an inbox item, expense, report, or other specific menu item.
16+
- The goal is to bring the user to some kind of action.
17+
- With GBR, it's usually a big green button to signal they made it to the end of the road.
18+
- The dots (or indicators) should be present on the navigation items (eg. links, buttons) that the user needs to click on to take them to where the action item will be.
19+
- **Both Brick Roads**
20+
- **The UI Pattern**:
21+
- For both Brick Roads, it MUST take the user to something that is actionable. If there is nothing the user can do to resolve the brick road, then the brick road should not exist.-
22+
23+
## Green Brick Road (GBR)
24+
This section is broken down into the rules and examples for each section where the Green Brick Road will appear.
25+
26+
### Rules
27+
The GBR MUST show up when there is a pending action to take or item to review.
28+
29+
### Inbox
30+
Any chats in the left hand navigation (LHN) that require attention will in most cases show up in the highest context chat.
31+
Examples:
32+
- There is a report pending approval by an admin
33+
- There is a report pending submission by an employee
34+
- There is a report waiting to be paid by the admin
35+
- There is a report queued for reimbursement but the employee needs to add a deposit bank account
36+
- An Expensify Card has been issued to an employee but the employee needs to add their shipping details
37+
- A user is mentioned in a report comment
38+
39+
### Workspaces
40+
Examples:
41+
- If the billing owner had to retry billing and the retry was successful
42+
43+
### Account
44+
Examples:
45+
- A user has an unvalidated contact method
46+
47+
48+
## Red Brick Road (RBR)
49+
This section is broken down into rules and examples for each section where the Red Brick Road will appear.
50+
51+
### Rules
52+
The RBR MUST show up when there is an error or violation that needs fixing.
53+
54+
### Inbox
55+
Any chats in the left hand navigation (LHN) that require attention will in most cases show up in the highest context chat.
56+
Examples:
57+
- There are violations on a report that the employee needs to fix
58+
- There is a task that you assigned to an employee waiting to be completed
59+
- There is an expense that the admin put on hold
60+
61+
### Workspaces
62+
Examples:
63+
- The Workspace Admin's accounting integration connection is broken
64+
- The QuickBooks Online export is broken and needs to be re-authenticated
65+
- Your direct connection to your bank or Plaid is broken and needs to be reconnected
66+
- There is an error with your billing subscription
67+
- The Workspace Admin adds a new workspace member but gets an error message
68+
69+
### Account
70+
Examples:
71+
- A third party card assigned to a user has a broken connection
72+
73+
### Other
74+
Examples:
75+
- There is an error that occurred from an action the user took while they were offline
76+

0 commit comments

Comments
 (0)