From 5db8943f6f0ef99dc53eae1dc26d0725e7f799f4 Mon Sep 17 00:00:00 2001 From: allgandaf Date: Fri, 17 Jul 2026 20:22:27 +0530 Subject: [PATCH 1/7] Add report action types for the 30-day broken card connection messages --- src/CONST/index.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/CONST/index.ts b/src/CONST/index.ts index 08ce0532614d..201bca888e64 100644 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -1579,6 +1579,7 @@ const CONST = { CARD_UNFROZEN: 'CARDUNFROZEN', CARD_DEACTIVATED: 'CARDDEACTIVATED', PERSONAL_CARD_CONNECTION_BROKEN: 'PERSONALCARDCONNECTIONBROKEN', + PERSONAL_CARD_CONNECTION_BROKEN_30_DAYS: 'PERSONALCARDCONNECTIONBROKEN30DAYS', CHANGE_FIELD: 'CHANGEFIELD', // OldDot Action CHANGE_POLICY: 'CHANGEPOLICY', CREATED_REPORT_FOR_UNAPPROVED_TRANSACTIONS: 'CREATEDREPORTFORUNAPPROVEDTRANSACTIONS', @@ -1603,6 +1604,7 @@ const CONST = { HOLD_COMMENT: 'HOLDCOMMENT', INTEGRATION_SYNC_FAILED: 'INTEGRATIONSYNCFAILED', COMPANY_CARD_CONNECTION_BROKEN: 'COMPANYCARDCONNECTIONBROKEN', + COMPANY_CARD_CONNECTION_BROKEN_30_DAYS: 'COMPANYCARDCONNECTIONBROKEN30DAYS', PLAID_BALANCE_FAILURE: 'PLAIDBALANCEFAILURE', IOU: 'IOU', INTEGRATIONS_MESSAGE: 'INTEGRATIONSMESSAGE', // OldDot Action From 826ae2a876a0a23911f2e7c7d9356042afd80eaf Mon Sep 17 00:00:00 2001 From: allgandaf Date: Fri, 17 Jul 2026 20:22:27 +0530 Subject: [PATCH 2/7] Map the 30-day broken connection actions to their original message types --- src/types/onyx/OriginalMessage.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/types/onyx/OriginalMessage.ts b/src/types/onyx/OriginalMessage.ts index e666e9690f4f..9f36983cf406 100644 --- a/src/types/onyx/OriginalMessage.ts +++ b/src/types/onyx/OriginalMessage.ts @@ -1554,7 +1554,7 @@ type OriginalMessageCardDeactivated = { }; /** - * Model of PERSONAL_CARD_CONNECTION_BROKEN action + * Model of PERSONAL_CARD_CONNECTION_BROKEN and PERSONAL_CARD_CONNECTION_BROKEN_30_DAYS actions */ type OriginalPersonalCard = { /** The id of the user the card was assigned to */ @@ -1737,6 +1737,7 @@ type OriginalMessageMap = { [CONST.REPORT.ACTIONS.TYPE.CARD_UNFROZEN]: OriginalMessageCardFrozen; [CONST.REPORT.ACTIONS.TYPE.CARD_DEACTIVATED]: OriginalMessageCardDeactivated; [CONST.REPORT.ACTIONS.TYPE.PERSONAL_CARD_CONNECTION_BROKEN]: OriginalPersonalCard; + [CONST.REPORT.ACTIONS.TYPE.PERSONAL_CARD_CONNECTION_BROKEN_30_DAYS]: OriginalPersonalCard; [CONST.REPORT.ACTIONS.TYPE.INTEGRATION_SYNC_FAILED]: OriginalMessageIntegrationSyncFailed; [CONST.REPORT.ACTIONS.TYPE.DELETED_TRANSACTION]: OriginalMessageDeletedTransaction; [CONST.REPORT.ACTIONS.TYPE.DEW_SUBMIT_FAILED]: OriginalMessageDEWFailed; @@ -1745,6 +1746,7 @@ type OriginalMessageMap = { [CONST.REPORT.ACTIONS.TYPE.CONCIERGE_DESCRIPTION_OPTIONS]: OriginalMessageConciergeDescriptionOptions; [CONST.REPORT.ACTIONS.TYPE.CONCIERGE_AUTO_MAP_MCC_GROUPS]: OriginalMessageConciergeAutoMapMccGroups; [CONST.REPORT.ACTIONS.TYPE.COMPANY_CARD_CONNECTION_BROKEN]: OriginalMessageCompanyCardConnectionBroken; + [CONST.REPORT.ACTIONS.TYPE.COMPANY_CARD_CONNECTION_BROKEN_30_DAYS]: OriginalMessageCompanyCardConnectionBroken; [CONST.REPORT.ACTIONS.TYPE.PLAID_BALANCE_FAILURE]: OriginalMessagePlaidBalanceFailure; [CONST.REPORT.ACTIONS.TYPE.RETRACTED]: never; [CONST.REPORT.ACTIONS.TYPE.REOPENED]: never; From f7f8dbc1f79b4ca5f1ec4ed8e34efa05a116466b Mon Sep 17 00:00:00 2001 From: allgandaf Date: Fri, 17 Jul 2026 20:22:28 +0530 Subject: [PATCH 3/7] Add copy for the 30-day broken card connection messages --- src/languages/de.ts | 6 ++++++ src/languages/en.ts | 6 ++++++ src/languages/es.ts | 6 ++++++ src/languages/fr.ts | 6 ++++++ src/languages/it.ts | 6 ++++++ src/languages/ja.ts | 6 ++++++ src/languages/nl.ts | 6 ++++++ src/languages/pl.ts | 6 ++++++ src/languages/pt-BR.ts | 6 ++++++ src/languages/zh-hans.ts | 6 ++++++ 10 files changed, 60 insertions(+) diff --git a/src/languages/de.ts b/src/languages/de.ts index 7df279c52bb7..997e9e6c2a78 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -2516,6 +2516,10 @@ const translations: TranslationDeepObject = { connectionLink ? `Die Verbindung Ihrer ${cardName}-Karte ist unterbrochen. Melden Sie sich bei Ihrer Bank an, um die Karte zu reparieren.` : `Die Verbindung Ihrer ${cardName}-Karte ist unterbrochen. Melden Sie sich bei Ihrer Bank an, um die Karte zu reparieren.`, + conciergeBrokenConnection30Days: ({cardName, connectionLink}: ConciergeBrokenCardConnectionParams) => + connectionLink + ? `Die Verbindung Ihrer ${cardName}-Karte ist seit 30 Tagen unterbrochen. Melden Sie sich bei Ihrer Bank an, um sie zu reparieren, oder entfernen Sie die Karte, wenn sie nicht mehr verwendet wird. Sie verlieren keine eingereichten Ausgaben, wenn Sie sie entfernen.` + : `Die Verbindung Ihrer ${cardName}-Karte ist seit 30 Tagen unterbrochen. Melden Sie sich bei Ihrer Bank an, um sie zu reparieren, oder entfernen Sie die Karte, wenn sie nicht mehr verwendet wird. Sie verlieren keine eingereichten Ausgaben, wenn Sie sie entfernen.`, fixCard: 'Karte reparieren', addAdditionalCards: 'Weitere Karten hinzufügen', upgradeDescription: 'Müssen Sie weitere Karten hinzufügen? Erstellen Sie einen Workspace, um weitere persönliche Karten hinzuzufügen oder Firmenkarten dem gesamten Team zuzuweisen.', @@ -9096,6 +9100,8 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc integrationSyncFailedRecurrence: ({count}: {count: number}) => `(${count} Mal wiederholt.)`, companyCardConnectionBroken: ({feedName, workspaceCompanyCardRoute}: {feedName: string; workspaceCompanyCardRoute: string}) => `Die Verbindung für ${feedName} ist unterbrochen. Um Kartenimporte wiederherzustellen, melden Sie sich bei Ihrer Bank an.`, + companyCardConnectionBroken30Days: ({feedName, workspaceCompanyCardRoute}: {feedName: string; workspaceCompanyCardRoute: string}) => + `Die Verbindung für ${feedName} ist seit 30 Tagen unterbrochen. Melden Sie sich bei Ihrer Bank an, um sie zu reparieren, oder entfernen Sie die Verbindung, wenn sie nicht mehr verwendet wird. Sie verlieren keine eingereichten Ausgaben, wenn Sie sie entfernen.`, plaidBalanceFailure: ({maskedAccountNumber, walletRoute}: {maskedAccountNumber: string; walletRoute: string}) => `Die Plaid-Verbindung zu Ihrem Geschäftskonto ist unterbrochen. Bitte verbinden Sie Ihr Bankkonto ${maskedAccountNumber} erneut, damit Sie Ihre Expensify Karten weiterhin verwenden können.`, addEmployee: (email: string, role: string, didJoinPolicy?: boolean) => { diff --git a/src/languages/en.ts b/src/languages/en.ts index de76bc16c162..fe5a1f3be93b 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -2603,6 +2603,10 @@ const translations = { connectionLink ? `Your ${cardName} card connection is broken. Log into your bank to fix the card.` : `Your ${cardName} card connection is broken. Log into your bank to fix the card.`, + conciergeBrokenConnection30Days: ({cardName, connectionLink}: ConciergeBrokenCardConnectionParams) => + connectionLink + ? `Your ${cardName} connection has been broken for 30 days. Log into your bank to fix it or remove the card if it's no longer in use. You won't lose any submitted expenses if you remove it.` + : `Your ${cardName} connection has been broken for 30 days. Log into your bank to fix it or remove the card if it's no longer in use. You won't lose any submitted expenses if you remove it.`, addAdditionalCards: 'Add additional cards', upgradeDescription: 'Need to add more cards? Create a workspace to add additional personal cards or assign company cards to the entire team.', onlyAvailableOnPlan: ({formattedPrice}: {formattedPrice: string}) => @@ -9204,6 +9208,8 @@ const translations = { integrationSyncFailedRecurrence: ({count}: {count: number}) => `(Repeated ${count} times.)`, companyCardConnectionBroken: ({feedName, workspaceCompanyCardRoute}: {feedName: string; workspaceCompanyCardRoute: string}) => `The ${feedName} connection is broken. To restore card imports, log into your bank.`, + companyCardConnectionBroken30Days: ({feedName, workspaceCompanyCardRoute}: {feedName: string; workspaceCompanyCardRoute: string}) => + `The ${feedName} connection has been broken for 30 days. Log into your bank to fix it or remove the connection if it's no longer in use. You won't lose any submitted expenses if you remove it.`, plaidBalanceFailure: ({maskedAccountNumber, walletRoute}: {maskedAccountNumber: string; walletRoute: string}) => `the Plaid connection to your business bank account is broken. Please reconnect your bank account ${maskedAccountNumber} so you can continue to use your Expensify Cards.`, addEmployee: (email: string, role: string, didJoinPolicy?: boolean) => { diff --git a/src/languages/es.ts b/src/languages/es.ts index 599b4c59aeb6..4f01a84dd0a1 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -2393,6 +2393,10 @@ const translations: TranslationDeepObject = { connectionLink ? `La conexión de tu tarjeta ${cardName} se ha interrumpido. Inicia sesión en tu banco para arreglarla.` : `La conexión de tu tarjeta ${cardName} se ha interrumpido. Inicia sesión en tu banco para arreglarla.`, + conciergeBrokenConnection30Days: ({cardName, connectionLink}: ConciergeBrokenCardConnectionParams) => + connectionLink + ? `La conexión de tu tarjeta ${cardName} lleva 30 días interrumpida. Inicia sesión en tu banco para arreglarla o elimina la tarjeta si ya no la usas. No perderás ningún gasto enviado si la eliminas.` + : `La conexión de tu tarjeta ${cardName} lleva 30 días interrumpida. Inicia sesión en tu banco para arreglarla o elimina la tarjeta si ya no la usas. No perderás ningún gasto enviado si la eliminas.`, addAdditionalCards: 'Añadir más tarjetas', upgradeDescription: '¿Necesitas añadir más tarjetas? Crea un espacio de trabajo para añadir tarjetas personales o asignar tarjetas de empresa a todo el equipo.', onlyAvailableOnPlan: ({formattedPrice}: {formattedPrice: string}) => @@ -8876,6 +8880,8 @@ El plan Controlar empieza en 9 $ por miembro activo al mes.`, integrationSyncFailedRecurrence: ({count}: {count: number}) => `(Repetido ${count} veces.)`, companyCardConnectionBroken: ({feedName, workspaceCompanyCardRoute}: {feedName: string; workspaceCompanyCardRoute: string}) => `La conexión ${feedName} está rota. Para restaurar las importaciones de tarjetas, inicia sesión en tu banco.`, + companyCardConnectionBroken30Days: ({feedName, workspaceCompanyCardRoute}: {feedName: string; workspaceCompanyCardRoute: string}) => + `La conexión ${feedName} lleva 30 días rota. Inicia sesión en tu banco para arreglarla o elimina la conexión si ya no la usas. No perderás ningún gasto enviado si la eliminas.`, plaidBalanceFailure: ({maskedAccountNumber, walletRoute}: {maskedAccountNumber: string; walletRoute: string}) => `la conexión Plaid con tu cuenta bancaria de empresa está rota. Por favor, reconecta tu cuenta bancaria ${maskedAccountNumber} para poder seguir usando tus Tarjetas Expensify.`, addEmployee: (email: string, role: string, didJoinPolicy?: boolean) => { diff --git a/src/languages/fr.ts b/src/languages/fr.ts index 3fa2bff144b5..79994c6d175c 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -2522,6 +2522,10 @@ const translations: TranslationDeepObject = { connectionLink ? `La connexion de votre carte ${cardName} est rompue. Connectez-vous à votre banque pour corriger la carte.` : `La connexion de votre carte ${cardName} est rompue. Connectez-vous à votre banque pour corriger la carte.`, + conciergeBrokenConnection30Days: ({cardName, connectionLink}: ConciergeBrokenCardConnectionParams) => + connectionLink + ? `La connexion de votre carte ${cardName} est rompue depuis 30 jours. Connectez-vous à votre banque pour la rétablir ou supprimez la carte si elle n’est plus utilisée. Vous ne perdrez aucune dépense soumise si vous la supprimez.` + : `La connexion de votre carte ${cardName} est rompue depuis 30 jours. Connectez-vous à votre banque pour la rétablir ou supprimez la carte si elle n’est plus utilisée. Vous ne perdrez aucune dépense soumise si vous la supprimez.`, addAdditionalCards: "Ajouter d'autres cartes", upgradeDescription: "Vous devez ajouter plus de cartes ? Créez un espace de travail pour ajouter des cartes personnelles ou assigner des cartes d'entreprise à toute l'équipe.", onlyAvailableOnPlan: ({formattedPrice}: {formattedPrice: string}) => @@ -9133,6 +9137,8 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e integrationSyncFailedRecurrence: ({count}: {count: number}) => `(Répété ${count} fois.)`, companyCardConnectionBroken: ({feedName, workspaceCompanyCardRoute}: {feedName: string; workspaceCompanyCardRoute: string}) => `La connexion ${feedName} est interrompue. Pour rétablir l’importation des cartes, connectez-vous à votre banque.`, + companyCardConnectionBroken30Days: ({feedName, workspaceCompanyCardRoute}: {feedName: string; workspaceCompanyCardRoute: string}) => + `La connexion ${feedName} est interrompue depuis 30 jours. Connectez-vous à votre banque pour la rétablir ou supprimez la connexion si elle n’est plus utilisée. Vous ne perdrez aucune dépense soumise si vous la supprimez.`, plaidBalanceFailure: ({maskedAccountNumber, walletRoute}: {maskedAccountNumber: string; walletRoute: string}) => `la connexion Plaid à votre compte bancaire professionnel est rompue. Veuillez reconnecter votre compte bancaire ${maskedAccountNumber} afin de pouvoir continuer à utiliser vos Cartes Expensify.`, addEmployee: (email: string, role: string, didJoinPolicy?: boolean) => { diff --git a/src/languages/it.ts b/src/languages/it.ts index c56c77becd0a..1bb79c4e08b1 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -2513,6 +2513,10 @@ const translations: TranslationDeepObject = { connectionLink ? `La connessione della tua carta ${cardName} non funziona. Accedi alla tua banca per sistemare la carta.` : `La connessione della tua carta ${cardName} non funziona. Accedi alla tua banca per sistemare la carta.`, + conciergeBrokenConnection30Days: ({cardName, connectionLink}: ConciergeBrokenCardConnectionParams) => + connectionLink + ? `La connessione della tua carta ${cardName} è interrotta da 30 giorni. Accedi alla tua banca per sistemarla o rimuovi la carta se non è più in uso. Non perderai nessuna spesa inviata se la rimuovi.` + : `La connessione della tua carta ${cardName} è interrotta da 30 giorni. Accedi alla tua banca per sistemarla o rimuovi la carta se non è più in uso. Non perderai nessuna spesa inviata se la rimuovi.`, addAdditionalCards: 'Aggiungi altre carte', upgradeDescription: 'Devi aggiungere altre carte? Crea uno spazio di lavoro per aggiungere carte personali o assegnare carte aziendali a tutto il team.', onlyAvailableOnPlan: ({formattedPrice}: {formattedPrice: string}) => `Disponibile nel piano Collect, ${formattedPrice} per membro al mese.`, @@ -9085,6 +9089,8 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, integrationSyncFailedRecurrence: ({count}: {count: number}) => `(Ripetuto ${count} volte.)`, companyCardConnectionBroken: ({feedName, workspaceCompanyCardRoute}: {feedName: string; workspaceCompanyCardRoute: string}) => `La connessione ${feedName} è interrotta. Per ripristinare le importazioni della carta, accedi alla tua banca.`, + companyCardConnectionBroken30Days: ({feedName, workspaceCompanyCardRoute}: {feedName: string; workspaceCompanyCardRoute: string}) => + `La connessione ${feedName} è interrotta da 30 giorni. Accedi alla tua banca per sistemarla o rimuovi la connessione se non è più in uso. Non perderai nessuna spesa inviata se la rimuovi.`, plaidBalanceFailure: ({maskedAccountNumber, walletRoute}: {maskedAccountNumber: string; walletRoute: string}) => `la connessione Plaid al conto bancario della tua azienda non funziona. Per favore, ricollega il conto bancario ${maskedAccountNumber} così puoi continuare a usare le tue Carte Expensify.`, addEmployee: (email: string, role: string, didJoinPolicy?: boolean) => { diff --git a/src/languages/ja.ts b/src/languages/ja.ts index 54d3597ae441..d3ee8c58b595 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -2491,6 +2491,10 @@ const translations: TranslationDeepObject = { connectionLink ? `${cardName}カードとの接続が切れています。カードを修正するには、銀行にログインしてください。` : `${cardName}カードとの接続が切れています。カードを修正するには、銀行にログインしてください。`, + conciergeBrokenConnection30Days: ({cardName, connectionLink}: ConciergeBrokenCardConnectionParams) => + connectionLink + ? `${cardName}カードとの接続が30日間切れています。銀行にログインして修復するか、使用していない場合はカードを削除してください。削除しても、提出済みの経費が失われることはありません。` + : `${cardName}カードとの接続が30日間切れています。銀行にログインして修復するか、使用していない場合はカードを削除してください。削除しても、提出済みの経費が失われることはありません。`, addAdditionalCards: '他のカードを追加', upgradeDescription: 'さらにカードを追加しますか?ワークスペースを作成して、個人カードを追加するか、会社カードをチーム全体に割り当てることができます。', onlyAvailableOnPlan: ({formattedPrice}: {formattedPrice: string}) => @@ -8956,6 +8960,8 @@ ${reportName}`, integrationSyncFailedRecurrence: ({count}: {count: number}) => `(${count} 回繰り返し)`, companyCardConnectionBroken: ({feedName, workspaceCompanyCardRoute}: {feedName: string; workspaceCompanyCardRoute: string}) => `${feedName} との接続が切断されています。カードの取引明細の取込を再開するには、銀行にログインしてください。`, + companyCardConnectionBroken30Days: ({feedName, workspaceCompanyCardRoute}: {feedName: string; workspaceCompanyCardRoute: string}) => + `${feedName} との接続が30日間切断されています。銀行にログインして修復するか、使用していない場合は接続を削除してください。削除しても、提出済みの経費が失われることはありません。`, plaidBalanceFailure: ({maskedAccountNumber, walletRoute}: {maskedAccountNumber: string; walletRoute: string}) => `Plaid によるビジネス銀行口座との接続が切断されています。Expensify カードを引き続きご利用いただくために、銀行口座 ${maskedAccountNumber} を再接続してください。`, addEmployee: (email: string, role: string, didJoinPolicy?: boolean) => { diff --git a/src/languages/nl.ts b/src/languages/nl.ts index 822129182504..0ed402fbd44b 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -2510,6 +2510,10 @@ const translations: TranslationDeepObject = { connectionLink ? `Je verbinding met de kaart ${cardName} is verbroken. Log in bij je bank om de kaart te herstellen.` : `Je verbinding met de kaart ${cardName} is verbroken. Log in bij je bank om de kaart te herstellen.`, + conciergeBrokenConnection30Days: ({cardName, connectionLink}: ConciergeBrokenCardConnectionParams) => + connectionLink + ? `Je verbinding met de kaart ${cardName} is al 30 dagen verbroken. Log in bij je bank om deze te herstellen of verwijder de kaart als je die niet meer gebruikt. Je verliest geen ingediende uitgaven als je die verwijdert.` + : `Je verbinding met de kaart ${cardName} is al 30 dagen verbroken. Log in bij je bank om deze te herstellen of verwijder de kaart als je die niet meer gebruikt. Je verliest geen ingediende uitgaven als je die verwijdert.`, addAdditionalCards: 'Extra kaarten toevoegen', upgradeDescription: 'Meer kaarten toevoegen? Maak een werkruimte om extra persoonlijke kaarten toe te voegen of bedrijfskaarten aan het hele team toe te wijzen.', onlyAvailableOnPlan: ({formattedPrice}: {formattedPrice: string}) => @@ -9054,6 +9058,8 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`, integrationSyncFailedRecurrence: ({count}: {count: number}) => `(${count} keer herhaald.)`, companyCardConnectionBroken: ({feedName, workspaceCompanyCardRoute}: {feedName: string; workspaceCompanyCardRoute: string}) => `De verbinding met ${feedName} is verbroken. Log in bij je bank om kaartimports te herstellen.`, + companyCardConnectionBroken30Days: ({feedName, workspaceCompanyCardRoute}: {feedName: string; workspaceCompanyCardRoute: string}) => + `De verbinding met ${feedName} is al 30 dagen verbroken. Log in bij je bank om deze te herstellen of verwijder de verbinding als je die niet meer gebruikt. Je verliest geen ingediende uitgaven als je die verwijdert.`, plaidBalanceFailure: ({maskedAccountNumber, walletRoute}: {maskedAccountNumber: string; walletRoute: string}) => `de Plaid-verbinding met je zakelijke bankrekening is verbroken. Verbind je bankrekening ${maskedAccountNumber} opnieuw zodat je je Expensify Kaarten kunt blijven gebruiken.`, addEmployee: (email: string, role: string, didJoinPolicy?: boolean) => { diff --git a/src/languages/pl.ts b/src/languages/pl.ts index 0fb3ebda9bfa..fc1e2b9b8ece 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -2506,6 +2506,10 @@ const translations: TranslationDeepObject = { connectionLink ? `Połączenie Twojej karty ${cardName} jest przerwane. Zaloguj się do swojego banku, aby naprawić kartę.` : `Połączenie Twojej karty ${cardName} jest przerwane. Zaloguj się do swojego banku, aby naprawić kartę.`, + conciergeBrokenConnection30Days: ({cardName, connectionLink}: ConciergeBrokenCardConnectionParams) => + connectionLink + ? `Połączenie Twojej karty ${cardName} jest przerwane od 30 dni. Zaloguj się do swojego banku, aby je naprawić, lub usuń kartę, jeśli nie jest już używana. Nie stracisz żadnych przesłanych wydatków, jeśli ją usuniesz.` + : `Połączenie Twojej karty ${cardName} jest przerwane od 30 dni. Zaloguj się do swojego banku, aby je naprawić, lub usuń kartę, jeśli nie jest już używana. Nie stracisz żadnych przesłanych wydatków, jeśli ją usuniesz.`, addAdditionalCards: 'Dodaj kolejne karty', upgradeDescription: 'Potrzebujesz dodać więcej kart? Utwórz obszar roboczy, aby dodać kolejne karty osobiste lub przypisać karty firmowe całemu zespołowi.', onlyAvailableOnPlan: ({formattedPrice}: {formattedPrice: string}) => @@ -9033,6 +9037,8 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, integrationSyncFailedRecurrence: ({count}: {count: number}) => `(Powtórzono ${count} razy.)`, companyCardConnectionBroken: ({feedName, workspaceCompanyCardRoute}: {feedName: string; workspaceCompanyCardRoute: string}) => `Połączenie ${feedName} jest przerwane. Aby przywrócić importy kart, zaloguj się do swojego banku.`, + companyCardConnectionBroken30Days: ({feedName, workspaceCompanyCardRoute}: {feedName: string; workspaceCompanyCardRoute: string}) => + `Połączenie ${feedName} jest przerwane od 30 dni. Zaloguj się do swojego banku, aby je naprawić, lub usuń połączenie, jeśli nie jest już używane. Nie stracisz żadnych przesłanych wydatków, jeśli je usuniesz.`, plaidBalanceFailure: ({maskedAccountNumber, walletRoute}: {maskedAccountNumber: string; walletRoute: string}) => `połączenie Plaid z twoim firmowym kontem bankowym jest przerwane. Proszę, połącz ponownie swoje konto bankowe ${maskedAccountNumber}, aby móc dalej używać Kart Expensify.`, addEmployee: (email: string, role: string, didJoinPolicy?: boolean) => { diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index 2d3490633fd8..54fd52bc5f10 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -2503,6 +2503,10 @@ const translations: TranslationDeepObject = { connectionLink ? `A conexão do seu cartão ${cardName} está com problemas. Acesse seu banco para corrigir o cartão.` : `A conexão do seu cartão ${cardName} está com problemas. Acesse seu banco para corrigir o cartão.`, + conciergeBrokenConnection30Days: ({cardName, connectionLink}: ConciergeBrokenCardConnectionParams) => + connectionLink + ? `A conexão do seu cartão ${cardName} está interrompida há 30 dias. Acesse seu banco para corrigi-la ou remova o cartão se ele não estiver mais em uso. Você não perderá nenhuma despesa enviada se removê-lo.` + : `A conexão do seu cartão ${cardName} está interrompida há 30 dias. Acesse seu banco para corrigi-la ou remova o cartão se ele não estiver mais em uso. Você não perderá nenhuma despesa enviada se removê-lo.`, addAdditionalCards: 'Adicionar outros cartões', upgradeDescription: 'Precisa adicionar mais cartões? Crie um espaço de trabalho para adicionar cartões pessoais ou atribuir cartões corporativos a toda a equipe.', onlyAvailableOnPlan: ({formattedPrice}: {formattedPrice: string}) => @@ -9042,6 +9046,8 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, integrationSyncFailedRecurrence: ({count}: {count: number}) => `(Repetido ${count} vezes.)`, companyCardConnectionBroken: ({feedName, workspaceCompanyCardRoute}: {feedName: string; workspaceCompanyCardRoute: string}) => `A conexão de ${feedName} está interrompida. Para restaurar as importações do cartão, faça login no seu banco.`, + companyCardConnectionBroken30Days: ({feedName, workspaceCompanyCardRoute}: {feedName: string; workspaceCompanyCardRoute: string}) => + `A conexão de ${feedName} está interrompida há 30 dias. Faça login no seu banco para corrigi-la ou remova a conexão se ela não estiver mais em uso. Você não perderá nenhuma despesa enviada se removê-la.`, plaidBalanceFailure: ({maskedAccountNumber, walletRoute}: {maskedAccountNumber: string; walletRoute: string}) => `a conexão Plaid com a sua conta bancária empresarial foi interrompida. Por favor, reconecte sua conta bancária ${maskedAccountNumber} para continuar usando seus Cartões Expensify.`, addEmployee: (email: string, role: string, didJoinPolicy?: boolean) => { diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 3c319b12f849..8ce69578322a 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -2433,6 +2433,10 @@ const translations: TranslationDeepObject = { brokenConnection: '您的银行卡连接已断开。', conciergeBrokenConnection: ({cardName, connectionLink}: ConciergeBrokenCardConnectionParams) => connectionLink ? `您的 ${cardName} 卡连接已中断。登录您的网上银行以修复该卡。` : `您的 ${cardName} 卡连接已中断。登录您的网上银行以修复该卡。`, + conciergeBrokenConnection30Days: ({cardName, connectionLink}: ConciergeBrokenCardConnectionParams) => + connectionLink + ? `您的 ${cardName} 卡连接已中断 30 天。请登录您的网上银行修复该连接,如果不再使用,也可以移除该卡。移除后,您不会丢失任何已提交的支出。` + : `您的 ${cardName} 卡连接已中断 30 天。请登录您的网上银行修复该连接,如果不再使用,也可以移除该卡。移除后,您不会丢失任何已提交的支出。`, addAdditionalCards: '添加其他卡片', upgradeDescription: '需要添加更多卡片吗?创建工作区以添加其他个人卡片或将公司卡片分配给整个团队。', onlyAvailableOnPlan: ({formattedPrice}: {formattedPrice: string}) => `此功能在 Collect 套餐中可用,每位成员每月费用为 ${formattedPrice}`, @@ -8768,6 +8772,8 @@ ${reportName}`, integrationSyncFailedRecurrence: ({count}: {count: number}) => `(重复 ${count} 次。)`, companyCardConnectionBroken: ({feedName, workspaceCompanyCardRoute}: {feedName: string; workspaceCompanyCardRoute: string}) => `${feedName} 连接已中断。要恢复银行卡导入,请登录您的银行账户。`, + companyCardConnectionBroken30Days: ({feedName, workspaceCompanyCardRoute}: {feedName: string; workspaceCompanyCardRoute: string}) => + `${feedName} 连接已中断 30 天。请登录您的银行账户修复该连接,如果不再使用,也可以将其移除。移除后,您不会丢失任何已提交的支出。`, plaidBalanceFailure: ({maskedAccountNumber, walletRoute}: {maskedAccountNumber: string; walletRoute: string}) => `您与企业银行账户的 Plaid 连接已中断。请重新连接您的银行账户 ${maskedAccountNumber},以便继续使用 Expensify 卡。`, addEmployee: (email: string, role: string, didJoinPolicy?: boolean) => { From 0bf3cf7c13ff7e5a4e7f4248d1b83d5556910767 Mon Sep 17 00:00:00 2001 From: allgandaf Date: Fri, 17 Jul 2026 20:22:28 +0530 Subject: [PATCH 4/7] Build the 30-day broken connection messages and detect the personal action --- src/libs/ReportActionsUtils.ts | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/src/libs/ReportActionsUtils.ts b/src/libs/ReportActionsUtils.ts index faec58899658..0e2e40cf4dd9 100644 --- a/src/libs/ReportActionsUtils.ts +++ b/src/libs/ReportActionsUtils.ts @@ -439,8 +439,13 @@ function isActionOfType(action: OnyxInputOrEntry): reportAction is ReportAction { - return isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.PERSONAL_CARD_CONNECTION_BROKEN); +function isCardBrokenConnectionAction( + reportAction: OnyxInputOrEntry, +): reportAction is ReportAction { + return ( + isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.PERSONAL_CARD_CONNECTION_BROKEN) || + isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.PERSONAL_CARD_CONNECTION_BROKEN_30_DAYS) + ); } function getOriginalMessage(reportAction: OnyxInputOrEntry>): OriginalMessage | undefined { @@ -456,9 +461,16 @@ function getOriginalMessage(reportAction: OnyxInputO return candidate as OriginalMessage; } +function getPersonalCardName(card: Card | undefined, originalCardName: string | undefined): string { + return originalCardName ?? card?.cardName ?? getBankName(card?.bank as CompanyCardFeed); +} + function getCardConnectionBrokenMessage(card: Card | undefined, originalCardName: string | undefined, translate: LocaleContextProps['translate'], connectionLink?: string) { - const personalCardName = originalCardName ?? card?.cardName ?? getBankName(card?.bank as CompanyCardFeed); - return translate('personalCard.conciergeBrokenConnection', {cardName: personalCardName, connectionLink}); + return translate('personalCard.conciergeBrokenConnection', {cardName: getPersonalCardName(card, originalCardName), connectionLink}); +} + +function getCardConnectionBroken30DaysMessage(card: Card | undefined, originalCardName: string | undefined, translate: LocaleContextProps['translate'], connectionLink?: string) { + return translate('personalCard.conciergeBrokenConnection30Days', {cardName: getPersonalCardName(card, originalCardName), connectionLink}); } function getElsewherePaymentReportActionMessage(translate: LocalizedTranslate, originalMessage: OriginalMessageIOU | undefined, payer?: string): string { @@ -4668,6 +4680,15 @@ function getCompanyCardConnectionBrokenMessage(translate: LocalizedTranslate, ac }); } +function getCompanyCardConnectionBroken30DaysMessage(translate: LocalizedTranslate, action: OnyxEntry): string { + const {feedName, policyID} = getOriginalMessage(action as ReportAction) ?? {feedName: '', policyID: ''}; + const workspaceCompanyCardRoute = `${environmentURL}/${ROUTES.WORKSPACE_COMPANY_CARDS.getRoute(policyID)}`; + return translate('report.actions.type.companyCardConnectionBroken30Days', { + feedName, + workspaceCompanyCardRoute, + }); +} + function getPlaidBalanceFailureMessage(translate: LocalizedTranslate, action: OnyxEntry): string { const {maskedAccountNumber} = getOriginalMessage(action as ReportAction) ?? {maskedAccountNumber: ''}; const walletRoute = `${environmentURL}/${ROUTES.SETTINGS_WALLET}`; @@ -4782,6 +4803,7 @@ export { getSortedReportActionsForDisplay, isCardBrokenConnectionAction, getCardConnectionBrokenMessage, + getCardConnectionBroken30DaysMessage, getTextFromHtml, getTrackExpenseActionableWhisper, getWhisperedTo, @@ -4961,6 +4983,7 @@ export { isRetractedAction, getIntegrationSyncFailedMessage, getCompanyCardConnectionBrokenMessage, + getCompanyCardConnectionBroken30DaysMessage, getPlaidBalanceFailureMessage, getPolicyChangeLogDefaultReimbursableMessage, getManagerOnVacation, From 5af9fa37dce5484d7142d1ce5facc2fcd224a65c Mon Sep 17 00:00:00 2001 From: allgandaf Date: Fri, 17 Jul 2026 20:22:29 +0530 Subject: [PATCH 5/7] Render the 30-day broken card connection actions in the report --- .../report/actionContents/ActionContentRouter.tsx | 8 ++++++++ .../actionContents/CardBrokenConnectionContent.tsx | 13 +++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/pages/inbox/report/actionContents/ActionContentRouter.tsx b/src/pages/inbox/report/actionContents/ActionContentRouter.tsx index ed2eb4ba9015..f881a1bdfb54 100644 --- a/src/pages/inbox/report/actionContents/ActionContentRouter.tsx +++ b/src/pages/inbox/report/actionContents/ActionContentRouter.tsx @@ -16,6 +16,7 @@ import useThemeStyles from '@hooks/useThemeStyles'; import { getChangedApproverActionMessage, + getCompanyCardConnectionBroken30DaysMessage, getCompanyCardConnectionBrokenMessage, getForwardedReportActionMessage, getIOUReportIDFromReportActionPreview, @@ -461,6 +462,13 @@ function ActionContentRouter({ ); } + if (isActionOfType(action, CONST.REPORT.ACTIONS.TYPE.COMPANY_CARD_CONNECTION_BROKEN_30_DAYS)) { + return ( + + ${getCompanyCardConnectionBroken30DaysMessage(translate, action)}`} /> + + ); + } if (isActionOfType(action, CONST.REPORT.ACTIONS.TYPE.PLAID_BALANCE_FAILURE)) { return ( diff --git a/src/pages/inbox/report/actionContents/CardBrokenConnectionContent.tsx b/src/pages/inbox/report/actionContents/CardBrokenConnectionContent.tsx index fcbb7244eecd..afda3dabebeb 100644 --- a/src/pages/inbox/report/actionContents/CardBrokenConnectionContent.tsx +++ b/src/pages/inbox/report/actionContents/CardBrokenConnectionContent.tsx @@ -5,11 +5,11 @@ import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; import {isPersonalCardBrokenConnection} from '@libs/CardUtils'; -import {getCardConnectionBrokenMessage, getOriginalMessage} from '@libs/ReportActionsUtils'; +import {getCardConnectionBroken30DaysMessage, getCardConnectionBrokenMessage, getOriginalMessage} from '@libs/ReportActionsUtils'; import ReportActionItemBasicMessage from '@pages/inbox/report/ReportActionItemBasicMessage'; -import type CONST from '@src/CONST'; +import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import type {ReportAction} from '@src/types/onyx'; @@ -18,7 +18,7 @@ import {cardByIdSelector} from '@selectors/Card'; import React from 'react'; type CardBrokenConnectionContentProps = { - action: ReportAction; + action: ReportAction; }; function CardBrokenConnectionContent({action}: CardBrokenConnectionContentProps) { @@ -33,9 +33,14 @@ function CardBrokenConnectionContent({action}: CardBrokenConnectionContentProps) const connectionLink = cardID && isPersonalCardBrokenConnection(card) ? `${environmentURL}/${ROUTES.SETTINGS_WALLET_PERSONAL_CARD_DETAILS.getRoute(String(cardID))}` : undefined; + const brokenConnectionMessage = + action.actionName === CONST.REPORT.ACTIONS.TYPE.PERSONAL_CARD_CONNECTION_BROKEN_30_DAYS + ? getCardConnectionBroken30DaysMessage(card, cardName, translate, connectionLink) + : getCardConnectionBrokenMessage(card, cardName, translate, connectionLink); + return ( - ${getCardConnectionBrokenMessage(card, cardName, translate, connectionLink)}`} /> + ${brokenConnectionMessage}`} /> ); } From 440960ed25ebe85ebf4b240b989724fc39f7da34 Mon Sep 17 00:00:00 2001 From: allgandaf Date: Fri, 17 Jul 2026 20:22:29 +0530 Subject: [PATCH 6/7] Surface the company card 30-day action in report names, LHN, and context menu --- src/libs/ReportNameUtils.ts | 5 +++++ src/libs/SidebarUtils.ts | 3 +++ src/pages/inbox/report/ContextMenu/ContextMenuActions.tsx | 3 +++ 3 files changed, 11 insertions(+) diff --git a/src/libs/ReportNameUtils.ts b/src/libs/ReportNameUtils.ts index 554243bc18af..93f132078dc7 100644 --- a/src/libs/ReportNameUtils.ts +++ b/src/libs/ReportNameUtils.ts @@ -45,6 +45,7 @@ import { getCategoryTaxRateMessage, getChangedApproverActionMessage, getCompanyAddressUpdateMessage, + getCompanyCardConnectionBroken30DaysMessage, getCompanyCardConnectionBrokenMessage, getCreatedReportForUnapprovedTransactionsMessage, getCurrencyDefaultTaxUpdateMessage, @@ -766,6 +767,10 @@ function computeReportNameBasedOnReportAction( return Parser.htmlToText(getCompanyCardConnectionBrokenMessage(translate, parentReportAction)); } + if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.COMPANY_CARD_CONNECTION_BROKEN_30_DAYS)) { + return Parser.htmlToText(getCompanyCardConnectionBroken30DaysMessage(translate, parentReportAction)); + } + if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.PLAID_BALANCE_FAILURE)) { return Parser.htmlToText(getPlaidBalanceFailureMessage(translate, parentReportAction)); } diff --git a/src/libs/SidebarUtils.ts b/src/libs/SidebarUtils.ts index 19f18df9e927..f9682c6bce56 100644 --- a/src/libs/SidebarUtils.ts +++ b/src/libs/SidebarUtils.ts @@ -58,6 +58,7 @@ import { getCategoryTaxRateMessage, getChangedApproverActionMessage, getCompanyAddressUpdateMessage, + getCompanyCardConnectionBroken30DaysMessage, getCompanyCardConnectionBrokenMessage, getCurrencyDefaultTaxUpdateMessage, getCustomTaxNameUpdateMessage, @@ -1090,6 +1091,8 @@ function getOptionData({ result.alternateText = Parser.htmlToText(getIntegrationSyncFailedMessage(translate, lastAction, report?.policyID)); } else if (isActionOfType(lastAction, CONST.REPORT.ACTIONS.TYPE.COMPANY_CARD_CONNECTION_BROKEN)) { result.alternateText = Parser.htmlToText(getCompanyCardConnectionBrokenMessage(translate, lastAction)); + } else if (isActionOfType(lastAction, CONST.REPORT.ACTIONS.TYPE.COMPANY_CARD_CONNECTION_BROKEN_30_DAYS)) { + result.alternateText = Parser.htmlToText(getCompanyCardConnectionBroken30DaysMessage(translate, lastAction)); } else if (isActionOfType(lastAction, CONST.REPORT.ACTIONS.TYPE.PLAID_BALANCE_FAILURE)) { result.alternateText = Parser.htmlToText(getPlaidBalanceFailureMessage(translate, lastAction)); } else if ( diff --git a/src/pages/inbox/report/ContextMenu/ContextMenuActions.tsx b/src/pages/inbox/report/ContextMenu/ContextMenuActions.tsx index 60057d56e321..d31ef9932ecd 100644 --- a/src/pages/inbox/report/ContextMenu/ContextMenuActions.tsx +++ b/src/pages/inbox/report/ContextMenu/ContextMenuActions.tsx @@ -39,6 +39,7 @@ import { getCategoryTaxRateMessage, getChangedApproverActionMessage, getCompanyAddressUpdateMessage, + getCompanyCardConnectionBroken30DaysMessage, getCompanyCardConnectionBrokenMessage, getCreatedReportForUnapprovedTransactionsMessage, getCurrencyDefaultTaxUpdateMessage, @@ -1224,6 +1225,8 @@ const ContextMenuActions: ContextMenuAction[] = [ setClipboardMessage(getIntegrationSyncFailedMessage(translate, reportAction, report?.policyID, isTryNewDotNVPDismissed)); } else if (isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.COMPANY_CARD_CONNECTION_BROKEN)) { setClipboardMessage(getCompanyCardConnectionBrokenMessage(translate, reportAction)); + } else if (isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.COMPANY_CARD_CONNECTION_BROKEN_30_DAYS)) { + setClipboardMessage(getCompanyCardConnectionBroken30DaysMessage(translate, reportAction)); } else if (isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.PLAID_BALANCE_FAILURE)) { setClipboardMessage(getPlaidBalanceFailureMessage(translate, reportAction)); } else if (isCardIssuedAction(reportAction)) { From dd764eb3faa47dd47614071fc1c827086cbeaf9c Mon Sep 17 00:00:00 2001 From: allgandaf Date: Fri, 17 Jul 2026 20:22:29 +0530 Subject: [PATCH 7/7] Test rendering of the 30-day broken card connection actions --- tests/ui/ReportActionItemTest.tsx | 41 +++++++++++++++++++++++++++++++ tests/unit/ReportUtilsTest.ts | 29 ++++++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/tests/ui/ReportActionItemTest.tsx b/tests/ui/ReportActionItemTest.tsx index 97aa17ba74e9..88e280be6b2b 100644 --- a/tests/ui/ReportActionItemTest.tsx +++ b/tests/ui/ReportActionItemTest.tsx @@ -1626,6 +1626,17 @@ describe('ReportActionItem', () => { expect(screen.getByText(/Chase Visa/)).toBeOnTheScreen(); }); + it('COMPANY_CARD_CONNECTION_BROKEN_30_DAYS action', async () => { + const action = createReportAction(CONST.REPORT.ACTIONS.TYPE.COMPANY_CARD_CONNECTION_BROKEN_30_DAYS, { + feedName: 'Chase Visa', + policyID: 'pol123', + }); + renderItemWithAction(action); + await waitForBatchedUpdatesWithAct(); + + expect(screen.getByText(/Chase Visa connection has been broken for 30 days/)).toBeOnTheScreen(); + }); + it('PLAID_BALANCE_FAILURE action', async () => { const action = createReportAction(CONST.REPORT.ACTIONS.TYPE.PLAID_BALANCE_FAILURE, { maskedAccountNumber: '***1234', @@ -2600,6 +2611,12 @@ describe('ReportActionItem', () => { originalMessage: {cardID: 100, cardName: 'My Card'}, assertion: /My Card/, }, + { + testTitle: 'isCardBrokenConnectionAction 30 days', + actionName: CONST.REPORT.ACTIONS.TYPE.PERSONAL_CARD_CONNECTION_BROKEN_30_DAYS, + originalMessage: {cardID: 100, cardName: 'My Card'}, + assertion: /My Card connection has been broken for 30 days/, + }, { testTitle: 'INDIVIDUAL_BUDGET_NOTIFICATION', actionName: CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.INDIVIDUAL_BUDGET_NOTIFICATION, @@ -2682,6 +2699,30 @@ describe('ReportActionItem', () => { expect(openLink).toHaveBeenCalledWith(expect.stringContaining('settings/wallet/personal-card/100'), expect.anything(), expect.anything()); }); + it('isCardBrokenConnectionAction renders tappable bank login link for personal broken connection 30 days', async () => { + const CARD_ID_KEY = '100'; + + (openLink as jest.Mock).mockClear(); + await act(async () => { + await Onyx.merge(ONYXKEYS.CARD_LIST, { + [CARD_ID_KEY]: {cardID: 100, cardName: 'Broken Card', lastScrapeResult: 401}, + }); + }); + await waitForBatchedUpdatesWithAct(); + + const action = createReportAction(CONST.REPORT.ACTIONS.TYPE.PERSONAL_CARD_CONNECTION_BROKEN_30_DAYS, {cardID: 100, cardName: 'Broken Card'}); + renderItemWithAction(action); + await waitForBatchedUpdatesWithAct(); + + expect(screen.getByText(/Broken Card connection has been broken for 30 days/)).toBeOnTheScreen(); + + const bankLoginLink = screen.getByText('Log into your bank'); + fireEvent.press(bankLoginLink); + + expect(openLink).toHaveBeenCalledTimes(1); + expect(openLink).toHaveBeenCalledWith(expect.stringContaining('settings/wallet/personal-card/100'), expect.anything(), expect.anything()); + }); + it('isCardBrokenConnectionAction renders no tappable link when card connection is not broken', async () => { const CARD_ID_KEY = '100'; diff --git a/tests/unit/ReportUtilsTest.ts b/tests/unit/ReportUtilsTest.ts index 9ee0f6bf22de..e93bb7e78d91 100644 --- a/tests/unit/ReportUtilsTest.ts +++ b/tests/unit/ReportUtilsTest.ts @@ -2909,6 +2909,35 @@ describe('ReportUtils', () => { expect(reportName).toBe('The Regions Bank cards connection is broken. To restore card imports, log into your bank.'); }); + test('should handle concierge company card connection broken for 30 days action', () => { + const companyCardConnectionBroken30DaysAction: ReportAction = { + ...baseParentReportAction, + actionName: CONST.REPORT.ACTIONS.TYPE.COMPANY_CARD_CONNECTION_BROKEN_30_DAYS, + originalMessage: { + feedName: 'Regions Bank cards', + policyID: '1', + }, + }; + + const threadReport: Report = { + ...baseExpenseReport, + parentReportID: baseChatReport.reportID, + parentReportActionID: companyCardConnectionBroken30DaysAction.reportActionID, + }; + + const reportActions = { + [`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${threadReport.parentReportID}`]: { + [companyCardConnectionBroken30DaysAction.reportActionID]: companyCardConnectionBroken30DaysAction, + }, + }; + const reportName = computeReportName(threadReport, undefined, undefined, undefined, undefined, participantsPersonalDetails, reportActions); + + // Note: computeReportName returns the text version, not HTML + expect(reportName).toBe( + "The Regions Bank cards connection has been broken for 30 days. Log into your bank to fix it or remove the connection if it's no longer in use. You won't lose any submitted expenses if you remove it.", + ); + }); + test('should handle automatically paid with Expensify action', () => { const expensifyPayAction: ReportAction = { ...baseParentReportAction,