Skip to content

Support Validation_Failed bank account - #97962

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

dominictb wants to merge 117 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.
  • If the PR adds or modifies the UI:
    • I asked an AI agent to review the changes for accessibility issues and addressed its findings.
    • I tested with a screen reader (VoiceOver on macOS) and verified all new/changed elements are reachable with a logical focus order.
    • I verified all new/changed elements have meaningful accessible names and roles.
    • I verified state changes are announced (e.g. checked/unchecked, expanded/collapsed, selected).
  • 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
@OSBotify

OSBotify commented Oct 2, 2026

Copy link
Copy Markdown
Contributor

🦜 Polyglot Parrot! 🦜

Squawk! Looks like you added some shiny new English strings. Allow me to parrot them back to you in other tongues:

View the translation diff
diff --git a/src/languages/de.ts b/src/languages/de.ts
index 15d9b693..17f819e9 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -2792,13 +2792,13 @@ const translations: TranslationDeepObject<typeof en> = {
             unlock: 'Entsperren',
             debitBlocked: 'Ihre Bank hat Testtransaktionen auf dieses Konto blockiert',
             insufficientFunds: 'Testtransaktionen sind aufgrund unzureichender Deckung fehlgeschlagen',
-            validationFailedFallback: 'Ihre Bank hat Testtransaktionen auf dieses Konto blockiert. <concierge-link>Kontaktieren Sie Concierge</concierge-link>',
+            validationFailedFallback: 'Ihre Bank hat Testtransaktionen zu diesem Konto blockiert. <concierge-link>Concierge kontaktieren</concierge-link>',
         },
         fixBankAccount: {
-            title: 'Bankkonto beheben',
+            title: 'Bankkonto reparieren',
             debitBlockedBody:
-                'Ihre Bank hat die Testtransaktionen zu diesem Konto blockiert.<br/><br/>Bitte lassen Sie die ACH-IDs von Expensify auf die Whitelist setzen:<bullet-list><bullet-item>1270239450</bullet-item><bullet-item>2270239450</bullet-item><bullet-item>4270239450</bullet-item></bullet-list>Senden Sie anschließend die Testtransaktionen unten erneut.',
-            insufficientFundsBody: 'Testtransaktionen sind aufgrund unzureichender Kontodeckung fehlgeschlagen. Sobald wieder Geld verfügbar ist, verwenden Sie die Schaltfläche unten.',
+                "Ihre Bank hat die Testüberweisungen auf dieses Konto blockiert.<br/><br/>Bitte lassen Sie die folgenden ACH-IDs von Expensify auf die Whitelist setzen:<bullet-list><bullet-item aria-label='1 2 7 0 2 3 9 4 5 0'>1270239450</bullet-item><bullet-item aria-label='2 2 7 0 2 3 9 4 5 0'>2270239450</bullet-item><bullet-item aria-label='4 2 7 0 2 3 9 4 5 0'>4270239450</bullet-item></bullet-list>Senden Sie anschließend die unten stehenden Testüberweisungen erneut.",
+            insufficientFundsBody: 'Testtransaktionen sind aufgrund unzureichender Geldmittel fehlgeschlagen. Sobald Geldmittel verfügbar sind, verwenden Sie die Schaltfläche unten.',
             resendButton: 'Transaktionen erneut senden',
             successTitle: 'Transaktionen gesendet!',
             successBody: 'Prüfen Sie Ihr Bankkonto in den nächsten 1–2 Werktagen.',
@@ -11340,7 +11340,7 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc
             aBankAccountIsLocked: 'Ein Bankkonto ist gesperrt',
             completeHrSetup: 'HR-Einrichtung abschließen',
             theresAProblemWithAnHRConnection: 'Es gibt ein Problem mit einer HR-Verbindung',
-            aBankAccountFailedValidation: 'Ein Bankkonto hat die Validierung nicht bestanden',
+            aBankAccountFailedValidation: 'Ein Bankkonto konnte nicht verifiziert werden',
         },
     },
     emptySearchView: {
diff --git a/src/languages/el.ts b/src/languages/el.ts
index 16a5b1e9..d81bc7e7 100644
--- a/src/languages/el.ts
+++ b/src/languages/el.ts
@@ -2846,15 +2846,15 @@ const translations: TranslationDeepObject<typeof en> = {
             unlock: 'Ξεκλείδωμα',
             debitBlocked: 'Η τράπεζά σας μπλόκαρε τις δοκιμαστικές συναλλαγές σε αυτόν τον λογαριασμό',
             insufficientFunds: 'Οι δοκιμαστικές συναλλαγές απέτυχαν λόγω ανεπαρκών διαθέσιμων χρημάτων',
-            validationFailedFallback: 'Η τράπεζά σας μπλόκαρε τις δοκιμαστικές συναλλαγές σε αυτόν τον λογαριασμό. <concierge-link>Επικοινωνήστε με το Concierge</concierge-link>',
+            validationFailedFallback: 'Η τράπεζά σας μπλόκαρε δοκιμαστικές συναλλαγές σε αυτόν τον λογαριασμό. <concierge-link>Επικοινωνήστε με το Concierge</concierge-link>',
         },
         fixBankAccount: {
             title: 'Διορθώστε τον τραπεζικό λογαριασμό',
             debitBlockedBody:
-                'Η τράπεζά σας μπλόκαρε τις δοκιμαστικές συναλλαγές σε αυτόν τον λογαριασμό.<br/><br/>Παρακαλούμε ζητήστε τους να προσθέσουν στις λίστες επιτρεπόμενων τα ACH IDs της Expensify:<bullet-list><bullet-item>1270239450</bullet-item><bullet-item>2270239450</bullet-item><bullet-item>4270239450</bullet-item></bullet-list>Στη συνέχεια, στείλτε ξανά τις δοκιμαστικές συναλλαγές παρακάτω.',
-            insufficientFundsBody: 'Οι δοκιμαστικές συναλλαγές απέτυχαν λόγω ανεπαρκών διαθέσιμων χρημάτων. Μόλις υπάρχουν διαθέσιμα χρήματα, χρησιμοποιήστε το παρακάτω κουμπί.',
-            resendButton: 'Επαναποστολή συναλλαγών',
-            successTitle: 'Οι συναλλαγές εστάλησαν!',
+                "Η τράπεζά σας μπλόκαρε τις δοκιμαστικές συναλλαγές σε αυτόν τον λογαριασμό.<br/><br/>Παρακαλούμε ζητήστε τους να προσθέσουν στις επιτρεπόμενες διευθύνσεις ACH της Expensify τα εξής IDs:<bullet-list><bullet-item aria-label='1 2 7 0 2 3 9 4 5 0'>1270239450</bullet-item><bullet-item aria-label='2 2 7 0 2 3 9 4 5 0'>2270239450</bullet-item><bullet-item aria-label='4 2 7 0 2 3 9 4 5 0'>4270239450</bullet-item></bullet-list>Έπειτα, στείλτε ξανά τις παρακάτω δοκιμαστικές συναλλαγές.",
+            insufficientFundsBody: 'Οι δοκιμαστικές συναλλαγές απέτυχαν λόγω ανεπαρκών χρημάτων. Μόλις υπάρχουν διαθέσιμα χρήματα, χρησιμοποιήστε το παρακάτω κουμπί.',
+            resendButton: 'Αποστολή συναλλαγών ξανά',
+            successTitle: 'Οι συναλλαγές στάλθηκαν!',
             successBody: 'Ελέγξτε τον τραπεζικό σας λογαριασμό μέσα στις επόμενες 1–2 εργάσιμες ημέρες.',
             successButton: 'Το κατάλαβα',
         },
@@ -11561,7 +11561,7 @@ ${reportName}`,
             aBankAccountIsLocked: 'Ένας τραπεζικός λογαριασμός είναι κλειδωμένος',
             completeHrSetup: 'Ολοκληρώστε τη ρύθμιση HR',
             theresAProblemWithAnHRConnection: 'Υπάρχει πρόβλημα με μια σύνδεση HR',
-            aBankAccountFailedValidation: 'Ένας τραπεζικός λογαριασμός απέτυχε στην επαλήθευση',
+            aBankAccountFailedValidation: 'Ένας τραπεζικός λογαριασμός απέτυχε στην επικύρωση',
         },
     },
     emptySearchView: {
diff --git a/src/languages/es.ts b/src/languages/es.ts
index f493bec8..4f690ed3 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -2705,15 +2705,15 @@ const translations: TranslationDeepObject<typeof en> = {
             confirmTestTransactions: 'Confirma las transacciones de prueba',
             accountRequiresAttention: 'Esta cuenta requiere atención',
             unlock: 'Desbloquear',
-            debitBlocked: 'Tu banco bloqueó las transacciones de prueba a esta cuenta',
+            debitBlocked: 'Tu banco ha bloqueado las transacciones de prueba a esta cuenta',
             insufficientFunds: 'Las transacciones de prueba fallaron por fondos insuficientes',
             validationFailedFallback: 'Tu banco bloqueó las transacciones de prueba a esta cuenta. <concierge-link>Contacta con Concierge</concierge-link>',
         },
         fixBankAccount: {
             title: 'Corregir cuenta bancaria',
             debitBlockedBody:
-                'Tu banco bloqueó las transacciones de prueba a esta cuenta.<br/><br/>Pídeles que incluyan en la lista segura los ID de ACH de Expensify:<bullet-list><bullet-item>1270239450</bullet-item><bullet-item>2270239450</bullet-item><bullet-item>4270239450</bullet-item></bullet-list>Luego, vuelve a enviar las transacciones de prueba que aparecen abajo.',
-            insufficientFundsBody: 'Las transacciones de prueba fallaron por fondos insuficientes. Una vez que haya fondos disponibles, usa el botón de abajo.',
+                "Tu banco bloqueó las transacciones de prueba a esta cuenta.<br/><br/>Pídeles que incluyan en la lista de permitidos los ID ACH de Expensify:<bullet-list><bullet-item aria-label='1 2 7 0 2 3 9 4 5 0'>1270239450</bullet-item><bullet-item aria-label='2 2 7 0 2 3 9 4 5 0'>2270239450</bullet-item><bullet-item aria-label='4 2 7 0 2 3 9 4 5 0'>4270239450</bullet-item></bullet-list>Luego, vuelve a enviar las transacciones de prueba que aparecen a continuación.",
+            insufficientFundsBody: 'Las transacciones de prueba fallaron por fondos insuficientes. Cuando haya fondos disponibles, usa el botón de abajo.',
             resendButton: 'Reenviar transacciones',
             successTitle: '¡Transacciones enviadas!',
             successBody: 'Revisa tu cuenta bancaria en los próximos 1-2 días hábiles.',
@@ -11532,7 +11532,7 @@ ${reportName}`,
             aBankAccountIsLocked: 'Una cuenta bancaria está bloqueada',
             completeHrSetup: 'Completa la configuración de RR. HH.',
             theresAProblemWithAnHRConnection: 'Hay un problema con una conexión de RR. HH.',
-            aBankAccountFailedValidation: 'Una cuenta bancaria no ha pasado la validación',
+            aBankAccountFailedValidation: 'Una cuenta bancaria no ha superado la validación',
         },
     },
     emptySearchView: {
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index ee99614f..1ad18a7f 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -2802,11 +2802,11 @@ const translations: TranslationDeepObject<typeof en> = {
         fixBankAccount: {
             title: 'Corriger le compte bancaire',
             debitBlockedBody:
-                'Votre banque a bloqué les transactions de test vers ce compte.<br/><br/>Veuillez leur demander d’ajouter les identifiants ACH d’Expensify à leur liste blanche :<bullet-list><bullet-item>1270239450</bullet-item><bullet-item>2270239450</bullet-item><bullet-item>4270239450</bullet-item></bullet-list>Puis, renvoyez les transactions de test ci-dessous.',
+                "Votre banque a bloqué les transactions de test vers ce compte.<br/><br/>Veuillez leur demander d’ajouter aux listes d’autorisation les identifiants ACH d’Expensify suivants :<bullet-list><bullet-item aria-label='1 2 7 0 2 3 9 4 5 0'>1270239450</bullet-item><bullet-item aria-label='2 2 7 0 2 3 9 4 5 0'>2270239450</bullet-item><bullet-item aria-label='4 2 7 0 2 3 9 4 5 0'>4270239450</bullet-item></bullet-list>Ensuite, renvoyez les transactions de test ci-dessous.",
             insufficientFundsBody: 'Les transactions de test ont échoué en raison de fonds insuffisants. Une fois que des fonds seront disponibles, utilisez le bouton ci-dessous.',
             resendButton: 'Renvoyer les transactions',
             successTitle: 'Transactions envoyées !',
-            successBody: 'Vérifiez votre compte bancaire dans un délai de 1 à 2 jours ouvrables.',
+            successBody: 'Vérifiez votre compte bancaire dans un délai de 1 à 2 jours ouvrés.',
             successButton: 'Compris',
         },
     },
diff --git a/src/languages/it.ts b/src/languages/it.ts
index 568c0313..b89e45ec 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -2779,19 +2779,19 @@ const translations: TranslationDeepObject<typeof en> = {
             confirmTestTransactions: 'Conferma le transazioni di prova',
             accountRequiresAttention: 'Questo conto richiede attenzione',
             unlock: 'Sblocca',
-            debitBlocked: 'La tua banca ha bloccato le transazioni di prova verso questo conto',
+            debitBlocked: 'La tua banca ha bloccato le transazioni di prova su questo conto',
             insufficientFunds: 'Le transazioni di prova non sono riuscite per fondi insufficienti',
             validationFailedFallback: 'La tua banca ha bloccato le transazioni di prova su questo conto. <concierge-link>Contatta Concierge</concierge-link>',
         },
         fixBankAccount: {
             title: 'Correggi conto bancario',
             debitBlockedBody:
-                'La tua banca ha bloccato le transazioni di prova su questo conto.<br/><br/>Chiedi loro di inserire negli elenchi consentiti gli ID ACH di Expensify:<bullet-list><bullet-item>1270239450</bullet-item><bullet-item>2270239450</bullet-item><bullet-item>4270239450</bullet-item></bullet-list>Poi reinvia le transazioni di prova qui sotto.',
+                "La tua banca ha bloccato le transazioni di prova verso questo conto.<br/><br/>Chiedi loro di inserire negli indirizzi attendibili gli ACH ID di Expensify:<bullet-list><bullet-item aria-label='1 2 7 0 2 3 9 4 5 0'>1270239450</bullet-item><bullet-item aria-label='2 2 7 0 2 3 9 4 5 0'>2270239450</bullet-item><bullet-item aria-label='4 2 7 0 2 3 9 4 5 0'>4270239450</bullet-item></bullet-list>Poi reinvia le transazioni di prova qui sotto.",
             insufficientFundsBody: 'Le transazioni di prova non sono riuscite per fondi insufficienti. Quando i fondi saranno disponibili, usa il pulsante qui sotto.',
-            resendButton: 'Reinvia transazioni',
+            resendButton: 'Invia di nuovo le transazioni',
             successTitle: 'Transazioni inviate!',
-            successBody: 'Controlla il tuo conto bancario tra 1-2 giorni lavorativi.',
-            successButton: 'Capito',
+            successBody: 'Controlla il tuo conto bancario entro 1-2 giorni lavorativi.',
+            successButton: 'Ricevuto',
         },
     },
     addCardToDigitalWallet: {
@@ -11290,7 +11290,7 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`,
             aBankAccountIsLocked: 'Un conto bancario è bloccato',
             completeHrSetup: 'Completa la configurazione HR',
             theresAProblemWithAnHRConnection: 'C’è un problema con una connessione HR',
-            aBankAccountFailedValidation: 'La verifica di un conto bancario non è andata a buon fine',
+            aBankAccountFailedValidation: 'Un conto bancario non ha superato la verifica',
         },
     },
     emptySearchView: {
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index 4ec4417a..dbe9f49f 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -2757,15 +2757,15 @@ const translations: TranslationDeepObject<typeof en> = {
             confirmTestTransactions: 'テスト取引を確認してください',
             accountRequiresAttention: 'このアカウントには対応が必要です',
             unlock: 'ロック解除',
-            debitBlocked: 'この口座へのテスト取引が銀行によってブロックされました',
+            debitBlocked: 'この口座へのテスト取引は銀行によってブロックされました',
             insufficientFunds: '残高不足のためテスト取引に失敗しました',
-            validationFailedFallback: 'この口座へのテスト取引は銀行によりブロックされました。<concierge-link>Concierge に連絡する</concierge-link>',
+            validationFailedFallback: 'この口座へのテスト取引が銀行によってブロックされました。<concierge-link>Concierge に連絡する</concierge-link>',
         },
         fixBankAccount: {
             title: '銀行口座を修正',
             debitBlockedBody:
-                'お使いの銀行が、この口座へのテスト取引をブロックしました。<br/><br/>銀行に依頼して、Expensify の ACH ID をホワイトリストに登録してもらってください。<bullet-list><bullet-item>1270239450</bullet-item><bullet-item>2270239450</bullet-item><bullet-item>4270239450</bullet-item></bullet-list>その後、下記のテスト取引を再送してください。',
-            insufficientFundsBody: 'テスト取引は残高不足のため失敗しました。資金が利用可能になりましたら、下のボタンをご利用ください。',
+                "お客様の銀行によって、この口座へのテスト取引がブロックされました。<br/><br/>銀行に連絡して、Expensify の ACH ID をホワイトリストに登録してもらってください。<bullet-list><bullet-item aria-label='1 2 7 0 2 3 9 4 5 0'>1270239450</bullet-item><bullet-item aria-label='2 2 7 0 2 3 9 4 5 0'>2270239450</bullet-item><bullet-item aria-label='4 2 7 0 2 3 9 4 5 0'>4270239450</bullet-item></bullet-list>その後、下記のテスト取引を再送信してください。",
+            insufficientFundsBody: 'テスト取引は残高不足のため失敗しました。残高に十分な資金が入金されましたら、下のボタンをご利用ください。',
             resendButton: '取引を再送信',
             successTitle: '取引を送信しました!',
             successBody: '1〜2営業日以内に銀行口座をご確認ください。',
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index cfbf413a..0894822a 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -2784,14 +2784,14 @@ const translations: TranslationDeepObject<typeof en> = {
             accountRequiresAttention: 'Deze account vereist aandacht',
             unlock: 'Ontgrendelen',
             debitBlocked: 'Je bank heeft testtransacties naar deze rekening geblokkeerd',
-            insufficientFunds: 'Testtransacties mislukt door onvoldoende saldo',
+            insufficientFunds: 'Testtransacties mislukt wegens onvoldoende saldo',
             validationFailedFallback: 'Je bank heeft testtransacties naar deze rekening geblokkeerd. <concierge-link>Neem contact op met Concierge</concierge-link>',
         },
         fixBankAccount: {
-            title: 'Bankrekening herstellen',
+            title: 'Bankrekening repareren',
             debitBlockedBody:
-                "Je bank heeft de testtransacties naar deze rekening geblokkeerd.<br/><br/>Vraag hen om de ACH-ID's van Expensify op de whitelist te zetten:<bullet-list><bullet-item>1270239450</bullet-item><bullet-item>2270239450</bullet-item><bullet-item>4270239450</bullet-item></bullet-list>Stuur daarna de testtransacties hieronder opnieuw.",
-            insufficientFundsBody: 'Testtransacties zijn mislukt vanwege onvoldoende saldo. Zodra er voldoende saldo is, gebruik je de knop hieronder.',
+                "Je bank heeft de testtransacties naar deze rekening geblokkeerd.<br/><br/>Laat hen Expensify's ACH-ID's op de whitelist zetten:<bullet-list><bullet-item aria-label='1 2 7 0 2 3 9 4 5 0'>1270239450</bullet-item><bullet-item aria-label='2 2 7 0 2 3 9 4 5 0'>2270239450</bullet-item><bullet-item aria-label='4 2 7 0 2 3 9 4 5 0'>4270239450</bullet-item></bullet-list>Stuur vervolgens de testtransacties hieronder opnieuw.",
+            insufficientFundsBody: 'Testtransacties zijn mislukt door onvoldoende saldo. Zodra er weer saldo beschikbaar is, gebruik dan de knop hieronder.',
             resendButton: 'Transacties opnieuw verzenden',
             successTitle: 'Transacties verzonden!',
             successBody: 'Controleer je bankrekening over 1–2 werkdagen.',
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index 1d6aca10..9b23a2bd 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -2817,14 +2817,14 @@ const translations: TranslationDeepObject<typeof en> = {
             accountRequiresAttention: 'To konto wymaga uwagi',
             unlock: 'Odblokuj',
             debitBlocked: 'Twój bank zablokował transakcje testowe na to konto',
-            insufficientFunds: 'Testowe transakcje nie powiodły się z powodu niewystarczających środków',
+            insufficientFunds: 'Nieudane transakcje testowe z powodu niewystarczających środków',
             validationFailedFallback: 'Twój bank zablokował transakcje testowe na to konto. <concierge-link>Skontaktuj się z Concierge</concierge-link>',
         },
         fixBankAccount: {
             title: 'Napraw konto bankowe',
             debitBlockedBody:
-                'Twój bank zablokował transakcje testowe na to konto.<br/><br/>Poproś ich o dodanie do listy zaufanych identyfikatorów ACH Expensify:<bullet-list><bullet-item>1270239450</bullet-item><bullet-item>2270239450</bullet-item><bullet-item>4270239450</bullet-item></bullet-list>Następnie wyślij ponownie poniższe transakcje testowe.',
-            insufficientFundsBody: 'Transakcje testowe nie powiodły się z powodu braku środków. Gdy środki będą dostępne, użyj przycisku poniżej.',
+                "Twój bank zablokował transakcje testowe na to konto.<br/><br/>Poproś ich o dodanie do listy dozwolonych identyfikatorów ACH Expensify:<bullet-list><bullet-item aria-label='1 2 7 0 2 3 9 4 5 0'>1270239450</bullet-item><bullet-item aria-label='2 2 7 0 2 3 9 4 5 0'>2270239450</bullet-item><bullet-item aria-label='4 2 7 0 2 3 9 4 5 0'>4270239450</bullet-item></bullet-list>Następnie wyślij ponownie poniższe transakcje testowe.",
+            insufficientFundsBody: 'Testowe transakcje nie powiodły się z powodu niewystarczających środków. Gdy środki będą dostępne, użyj przycisku poniżej.',
             resendButton: 'Wyślij transakcje ponownie',
             successTitle: 'Transakcje wysłane!',
             successBody: 'Sprawdź swoje konto bankowe w ciągu najbliższych 1–2 dni roboczych.',
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index 6b72cf15..691a09c9 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -2775,13 +2775,13 @@ const translations: TranslationDeepObject<typeof en> = {
             accountRequiresAttention: 'Esta conta precisa de atenção',
             unlock: 'Desbloquear',
             debitBlocked: 'Seu banco bloqueou as transações de teste para esta conta',
-            insufficientFunds: 'As transações de teste falharam por falta de fundos',
-            validationFailedFallback: 'Seu banco bloqueou as transações de teste para esta conta. <concierge-link>Fale com a Concierge</concierge-link>',
+            insufficientFunds: 'As transações de teste falharam devido a fundos insuficientes',
+            validationFailedFallback: 'Seu banco bloqueou as transações de teste para esta conta. <concierge-link>Fale com o Concierge</concierge-link>',
         },
         fixBankAccount: {
             title: 'Corrigir conta bancária',
             debitBlockedBody:
-                'Seu banco bloqueou as transações de teste para esta conta.<br/><br/>Peça para incluírem na lista de permissões os IDs ACH da Expensify:<bullet-list><bullet-item>1270239450</bullet-item><bullet-item>2270239450</bullet-item><bullet-item>4270239450</bullet-item></bullet-list>Depois, reenvie as transações de teste abaixo.',
+                "Seu banco bloqueou as transações de teste para esta conta.<br/><br/>Peça para eles colocarem na lista de permissões os IDs ACH da Expensify:<bullet-list><bullet-item aria-label='1 2 7 0 2 3 9 4 5 0'>1270239450</bullet-item><bullet-item aria-label='2 2 7 0 2 3 9 4 5 0'>2270239450</bullet-item><bullet-item aria-label='4 2 7 0 2 3 9 4 5 0'>4270239450</bullet-item></bullet-list>Depois, reenvie as transações de teste abaixo.",
             insufficientFundsBody: 'As transações de teste falharam por falta de fundos. Quando houver saldo disponível, use o botão abaixo.',
             resendButton: 'Reenviar transações',
             successTitle: 'Transações enviadas!',
@@ -11248,7 +11248,7 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`,
             aBankAccountIsLocked: 'Uma conta bancária está bloqueada',
             completeHrSetup: 'Concluir configuração de RH',
             theresAProblemWithAnHRConnection: 'Há um problema com uma conexão de RH',
-            aBankAccountFailedValidation: 'Uma conta bancária falhou na validação',
+            aBankAccountFailedValidation: 'Uma conta bancária não pôde ser validada',
         },
     },
     emptySearchView: {
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index a9e7c2c1..2f0db17a 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -2684,15 +2684,15 @@ const translations: TranslationDeepObject<typeof en> = {
             confirmTestTransactions: '请确认测试交易',
             accountRequiresAttention: '此账户需要处理',
             unlock: '解锁',
-            debitBlocked: '您的银行已拦截到此账户的测试交易',
+            debitBlocked: '您的银行已拦截对此账户的测试交易',
             insufficientFunds: '测试交易因资金不足而失败',
-            validationFailedFallback: '您的银行已拦截发往此账户的测试交易。<concierge-link>联系 Concierge</concierge-link>',
+            validationFailedFallback: '您的银行已拦截向此账户发起的测试交易。<concierge-link>联系 Concierge</concierge-link>',
         },
         fixBankAccount: {
             title: '修复银行账户',
             debitBlockedBody:
-                '您的银行拦截了发往此账户的测试交易。<br/><br/>请联系银行将 Expensify 的 ACH ID 加入白名单:<bullet-list><bullet-item>1270239450</bullet-item><bullet-item>2270239450</bullet-item><bullet-item>4270239450</bullet-item></bullet-list>然后,重新发送下方的测试交易。',
-            insufficientFundsBody: '测试交易因资金不足而失败。资金到位后,请使用下方按钮。',
+                "您的银行已拦截汇入此账户的测试交易。<br/><br/>请联系银行将 Expensify 的 ACH ID 加入白名单:<bullet-list><bullet-item aria-label='1 2 7 0 2 3 9 4 5 0'>1270239450</bullet-item><bullet-item aria-label='2 2 7 0 2 3 9 4 5 0'>2270239450</bullet-item><bullet-item aria-label='4 2 7 0 2 3 9 4 5 0'>4270239450</bullet-item></bullet-list>然后,请在下方重新发送测试交易。",
+            insufficientFundsBody: '由于资金不足,测试交易失败。资金到位后,请使用下方的按钮。',
             resendButton: '重新发送交易',
             successTitle: '交易已发送!',
             successBody: '请在接下来的 1–2 个工作日内查看您的银行账户。',

Note

You can apply these changes to your branch by copying the patch to your clipboard, then running pbpaste | git apply 😉

View workflow run

@trjExpensify

Copy link
Copy Markdown
Contributor

👋 @ZhenjaHorbach can you re-review please? @dominictb conflicts too.

@ZhenjaHorbach

Copy link
Copy Markdown
Contributor

Rechecking!

@github-actions

github-actions Bot commented Oct 5, 2026

Copy link
Copy Markdown
Contributor

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

@github-actions

github-actions Bot commented Oct 5, 2026

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

Retested and flagged a few issues on the latest build.

@ZhenjaHorbach

Copy link
Copy Markdown
Contributor

@dominictb
Let's remove unrelated changes 😅

Screenshot 2026-10-09 at 10 15 42

@dominictb

Copy link
Copy Markdown
Contributor Author

I'm still investigating Joe's reported bugs above. Will request once ready.

@ZhenjaHorbach

Copy link
Copy Markdown
Contributor

Minor comment
Behavior is a bit confusing
Our hover covers the entire item
But we have dead zones inside this hover that, when pressed, do nothing
CC: @Expensify/design

Screen.Recording.2026-10-13.at.13.08.31.mov

@ZhenjaHorbach

Copy link
Copy Markdown
Contributor

Also strange behaviour
After opening modals, hover behavior breaks
I don't remember that we have similar behavior in other places

Screen.Recording.2026-10-13.at.13.14.35.mov

@ZhenjaHorbach

ZhenjaHorbach commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

After we get an error after a request
The second error has different padding than the first error

Screenshot 2026-10-13 at 13 12 18

By the way
We don't show this error on Workflows screen
Should we make it consistent?

Screenshot 2026-10-13 at 13 27 33

@dominictb

Copy link
Copy Markdown
Contributor Author

Minor comment Behavior is a bit confusing Our hover covers the entire item But we have dead zones inside this hover that, when pressed, do nothing

This is existing. I think we can update that in a follow-up if required by Design.

Also strange behaviour After opening modals, hover behavior breaks I don't remember that we have similar behavior in other places

Existing too:

Screen.Recording.2026-10-14.at.03.32.01.mov

The second error has different padding than the first error

Fixed ac3ebec

We don't show this error on Workflows screen
Should we make it consistent?

No I think not. It's existing

<OfflineWithFeedback pendingAction={bankAccountPendingAction}>

@ZhenjaHorbach

Copy link
Copy Markdown
Contributor

Lint issues look like not from this PR
@dominictb
But let's update the branch to the latest version of main!

@puneetlath

Copy link
Copy Markdown
Contributor

@joekaufmanexpensify are you good with how things are in this current state?

@joekaufmanexpensify

Copy link
Copy Markdown
Contributor

Not as of now, there are a few issues that I flagged in Slack here that are still being discussed.

@joekaufmanexpensify

Copy link
Copy Markdown
Contributor

Discussion still ongoing in slack

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

InternalQA This pull request required internal QA

Projects

None yet

Development

Successfully merging this pull request may close these issues.

10 participants