Skip to content

[HOLD 91300] Support Validation_Failed bank account - #97962

Open
dominictb wants to merge 55 commits into
Expensify:mainfrom
dominictb:feat/support-validation-failed-bank-account
Open

[HOLD 91300] Support Validation_Failed bank account#97962
dominictb wants to merge 55 commits into
Expensify:mainfrom
dominictb:feat/support-validation-failed-bank-account

Conversation

@dominictb

@dominictb dominictb commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Explanation of Change

Show the right RBR and action for Validation_Failed bank accounts with either insufficient funds or blocked debit error.

Fixed Issues

$ #90830
PROPOSAL:

Tests

Precondition:

  • Has a VALIDATION_FAILED state bank account with insufficient funds/debit blocked NOC code (TODO)
  • It is the workspace's payment account
  1. Go to Wallet page
  2. Verify that account has Pending badge
  3. Verify that account has Test transactions failed due to insufficient funds RBR
  4. Tap Fix
  5. Verify Fix bank account RHP opens saying Test transactions failed due to insufficient funds...
  6. Verify Resend transactions button is disabled in offline
  7. Tap Resend transactions
  8. Verify success page shows
  9. Tap Got it
  10. Verify RHP closes
  11. Verify that account has Please confirm test transactions RBR and Confirm button
  12. Verify Concierge messages and emails you In the next 1-2 business days, "Expensify Inc" will send 3 small test transactions to your bank account

  1. Repeat all steps on debit blocked account: Your bank blocked test transactions to this account RBR and Your bank blocked the test transactions to this account. Please have them whitelist Expensify's ACH IDs in Fix bank account RHP

  1. Repeat all steps in workspace's Workflows page

  1. Submit and approve a report
  2. Tap Pay with business bank account
  3. Verify steps 5 - 12 above
  • Verify that no errors appear in the JS console

Offline tests

None

QA Steps

Same as Tests

  • Verify that no errors appear in the JS console

PR Author Checklist

  • I linked the correct issue in the ### Fixed Issues section above
  • I wrote clear testing steps that cover the changes made in this PR
    • I added steps for local testing in the Tests section
    • I added steps for the expected offline behavior in the Offline steps section
    • I added steps for Staging and/or Production testing in the QA steps section
    • I added steps to cover failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
    • I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
    • I tested this PR with a High Traffic account against the staging or production API to ensure there are no regressions (e.g. long loading states that impact usability).
  • I included screenshots or videos for tests on all platforms
  • I ran the tests on all platforms & verified they passed on:
    • Android: Native
    • Android: mWeb Chrome
    • iOS: Native
    • iOS: mWeb Safari
    • MacOS: Chrome / Safari
  • I verified there are no console errors (if there's a console error not related to the PR, report it or open an issue for it to be fixed)
  • I followed proper code patterns (see Reviewing the code)
    • I verified that comments were added to code that is not self explanatory
    • I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
    • I verified any copy / text that was added to the app is grammatically correct in English. It adheres to proper capitalization guidelines (note: only the first word of header/labels should be capitalized), and is either coming verbatim from figma or has been approved by marketing (in order to get marketing approval, ask the Bug Zero team member to add the Waiting for copy label to the issue)
  • If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
  • I followed the guidelines as stated in the Review Guidelines
  • I tested other components that can be impacted by my changes (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar are working as expected)
  • If a new CSS style is added I verified that:
    • A similar style doesn't already exist
    • The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))
  • If new assets were added or existing ones were modified, I verified that:
    • The assets are optimized and compressed (for SVG files, run npm run compress-svg)
    • The assets load correctly across all supported platforms.
  • If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
  • If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
  • If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
  • If the PR modifies a component or page that can be accessed by a direct deeplink, I verified that the code functions as expected when the deeplink is used - from a logged in and logged out account.
  • If the PR modifies the UI (e.g. new buttons, new UI components, changing the padding/spacing/sizing, moving components, etc) or modifies the form input styles:
    • I verified that all the inputs inside a form are aligned with each other.
    • I added Design label and/or tagged @Expensify/design so the design team can review the changes.
  • I added unit tests for any new feature or bug fix in this PR to help automatically prevent regressions in this user flow.
  • If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.

Screenshots/Videos

Android: Native
Android: mWeb Chrome
iOS: Native
iOS: mWeb Safari
MacOS: Chrome / Safari
Screen.Recording.2026-08-07.at.02.19.33.mov
Screen.Recording.2026-08-07.at.02.54.25.mov

@melvin-bot

melvin-bot Bot commented Aug 6, 2026

Copy link
Copy Markdown

Hey, I noticed you changed src/languages/en.ts in a PR from a fork. For security reasons, translations are not generated automatically for PRs from forks.

If you want to automatically generate translations for other locales, an Expensify employee will have to:

  1. Look at the code and make sure there are no malicious changes.
  2. Run the Generate static translations GitHub workflow. If you have write access and the K2 extension, you can simply click: [this button]

Alternatively, if you are an external contributor, you can run the translation script locally with your own OpenAI API key. To learn more, try running:

npx ts-node ./scripts/generateTranslations.ts --help

Typically, you'd want to translate only what you changed by running npx ts-node ./scripts/generateTranslations.ts --compare-ref main

@dominictb dominictb changed the title Feat/support validation failed bank account Support Validation_Failed bank account Aug 6, 2026
@shawnborton

Copy link
Copy Markdown
Contributor

I'm pretty sure that we usually render errors above the buttons, not below the buttons 😅

Yeah, I think you are right.

@dominictb

Copy link
Copy Markdown
Contributor Author

But should the hoverable zone be fully pressable?

I think that's out of scope of this PR and also not a blocker

@trjExpensify

Copy link
Copy Markdown
Contributor

I'm pretty sure that we usually render errors above the buttons, not below the buttons 😅

Yeah, I think you are right.

Agreed. 👍

@ZhenjaHorbach

Copy link
Copy Markdown
Contributor

I'm not sure that the main content should change position when the error appears

2026-08-12.15.55.15.mov

@quinthar quinthar removed the #migrate label Aug 13, 2026
@github-actions

Copy link
Copy Markdown
Contributor

🚧 joekaufmanexpensify has triggered a test Expensify/App build. You can view the workflow run here.

@github-actions

Copy link
Copy Markdown
Contributor

🧪🧪 Use the links below to test this adhoc build on Android, iOS, and Web. Happy testing! 🧪🧪
Built from App PR #97962.

Android 🤖 iOS 🍎
⏩ SKIPPED ⏩ ⏩ SKIPPED ⏩
The build for Android was skipped The build for iOS was skipped
Web 🕸️
https://97962.pr-testing.expensify.com
Web

👀 View the workflow run that generated this build 👀

@joekaufmanexpensify

Copy link
Copy Markdown
Contributor

I found two accounts in the correct state. I tried to view them on the ad hoc build, but not seeing the action message on the bank account row on wallet in either case. I think the issue might be that the new front end error pattern added in #93852 is still gated behind the walletconnectionstatus beta, and these two customer accounts aren't on it. Therefore, we don't show the error at all. Does that track @dominictb?

@joekaufmanexpensify

Copy link
Copy Markdown
Contributor

Normally, we have a tool we can use to add accounts to a beta, but I'm not seeing this one even listed there.

@trjExpensify

Copy link
Copy Markdown
Contributor

Can we kill walletconnectionstatus?

@dominictb

dominictb commented Aug 14, 2026

Copy link
Copy Markdown
Contributor Author

That beta is frontend only so we can't provision via the beta tool. Asking here

Update: They are removing it soon after the followup bugs are addressed

@dominictb dominictb changed the title Support Validation_Failed bank account [HOLD 91300] Support Validation_Failed bank account Aug 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants