diff --git a/src/CONST/index.ts b/src/CONST/index.ts index f3f1ce77b402..47293f981aee 100644 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -6574,6 +6574,7 @@ const CONST = { RTER_VIOLATION_TYPES: { BROKEN_CARD_CONNECTION: 'brokenCardConnection', BROKEN_CARD_CONNECTION_530: 'brokenCardConnection530', + BROKEN_CARD_CONNECTION_531: 'brokenCardConnection531', SEVEN_DAY_HOLD: 'sevenDayHold', }, REVIEW_DUPLICATES_ORDER: ['merchant', 'category', 'tag', 'description', 'taxCode', 'billable', 'reimbursable'], diff --git a/src/components/BrokenConnectionDescription.tsx b/src/components/BrokenConnectionDescription.tsx index 6699ddc1b190..861e060c6b8f 100644 --- a/src/components/BrokenConnectionDescription.tsx +++ b/src/components/BrokenConnectionDescription.tsx @@ -32,11 +32,12 @@ function BrokenConnectionDescription({transactionID, policy, report}: BrokenConn const {environmentURL} = useEnvironment(); const brokenConnection530Error = transactionViolations?.find((violation) => violation.data?.rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_530); + const brokenConnection531Error = transactionViolations?.find((violation) => violation.data?.rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_531); const brokenConnectionError = transactionViolations?.find((violation) => violation.data?.rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION); const isPolicyAdmin = isPolicyAdminPolicyUtils(policy); const workspaceCompanyCardRoute = `${environmentURL}/${ROUTES.WORKSPACE_COMPANY_CARDS.getRoute(policy?.id)}`; - if (!brokenConnection530Error && !brokenConnectionError) { + if (!brokenConnection530Error && !brokenConnection531Error && !brokenConnectionError) { return ''; } @@ -44,6 +45,10 @@ function BrokenConnectionDescription({transactionID, policy, report}: BrokenConn return translate('violations.brokenConnection530Error'); } + if (brokenConnection531Error) { + return translate('violations.brokenConnection531Error'); + } + if (isPolicyAdmin && !isCurrentUserSubmitter(report)) { return ; } diff --git a/src/components/MoneyRequestHeader.tsx b/src/components/MoneyRequestHeader.tsx index 0dadca3f4edf..849f83d886c2 100644 --- a/src/components/MoneyRequestHeader.tsx +++ b/src/components/MoneyRequestHeader.tsx @@ -128,7 +128,10 @@ function MoneyRequestHeader({reportID: reportIDProp, onBackButtonPress}: MoneyRe return {icon: getStatusIcon(icons.CreditCardHourglass), description: translate('iou.transactionPendingDescription')}; } if (!!transaction?.transactionID && !!transactionViolations.length && shouldShowBrokenConnectionViolation) { - const brokenConnectionError = transactionViolations?.find((violation) => violation.data?.rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION); + const brokenConnectionError = transactionViolations?.find( + (violation) => + violation.data?.rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION || violation.data?.rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_531, + ); const cardID = brokenConnectionError?.data?.cardID; const card = cardID ? cardList?.[cardID] : undefined; const isBrokenPersonalCard = isPersonalCard(card); diff --git a/src/hooks/useMoneyReportHeaderStatusBar.ts b/src/hooks/useMoneyReportHeaderStatusBar.ts index 2f45d7a3d185..1e2bd3bfa61f 100644 --- a/src/hooks/useMoneyReportHeaderStatusBar.ts +++ b/src/hooks/useMoneyReportHeaderStatusBar.ts @@ -122,7 +122,10 @@ function useMoneyReportHeaderStatusBar(reportID: string | undefined, chatReportI return CONST.REPORT.STATUS_BAR_TYPE.DUPLICATES; } if (!!transaction?.transactionID && !!transactionViolations.length && shouldShowBrokenConnectionViolation) { - const brokenConnectionError = transactionViolations.find((violation) => violation.data?.rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION); + const brokenConnectionError = transactionViolations.find( + (violation) => + violation.data?.rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION || violation.data?.rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_531, + ); const cardID = brokenConnectionError?.data?.cardID; const card = cardID ? cardList?.[cardID] : undefined; if (isPersonalCard(card) && brokenConnectionError) { diff --git a/src/languages/de.ts b/src/languages/de.ts index e339cc766d65..a66bf9000915 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -9818,6 +9818,9 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc if (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_530) { return 'Beleg kann wegen unterbrochener Bankverbindung nicht automatisch zugeordnet werden.'; } + if (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_531) { + return 'Beleg kann wegen eines vorübergehenden Bankproblems nicht automatisch zugeordnet werden. Bitte versuchen Sie es später erneut.'; + } if (isPersonalCard && (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION || brokenBankConnection)) { if (!connectionLink) { return 'Beleg kann wegen unterbrochener Bankverbindung nicht automatisch zugeordnet werden.'; @@ -9837,6 +9840,7 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc return ''; }, brokenConnection530Error: 'Beleg ausstehend wegen unterbrochener Bankverbindung', + brokenConnection531Error: 'Beleg kann wegen eines vorübergehenden Bankproblems nicht automatisch zugeordnet werden. Bitte versuchen Sie es später erneut.', adminBrokenConnectionError: ({workspaceCompanyCardRoute}: {workspaceCompanyCardRoute: string}) => `Beleg ausstehend wegen unterbrochener Bankverbindung. Bitte in Firmenkarten beheben.`, memberBrokenConnectionError: 'Beleg ausstehend aufgrund einer unterbrochenen Bankverbindung. Bitte wende dich an eine Workspace-Admin, um das Problem zu beheben.', diff --git a/src/languages/el.ts b/src/languages/el.ts index eca129a70a5d..ebc0c6056179 100644 --- a/src/languages/el.ts +++ b/src/languages/el.ts @@ -10049,6 +10049,9 @@ ${reportName}`, if (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_530) { return 'Δεν είναι δυνατή η αυτόματη αντιστοίχιση της απόδειξης λόγω σπασμένης σύνδεσης με την τράπεζα.'; } + if (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_531) { + return 'Δεν είναι δυνατή η αυτόματη αντιστοίχιση της απόδειξης λόγω προσωρινού προβλήματος της τράπεζας. Δοκιμάστε ξανά αργότερα.'; + } if (isPersonalCard && (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION || brokenBankConnection)) { if (!connectionLink) { return 'Δεν είναι δυνατή η αυτόματη αντιστοίχιση της απόδειξης λόγω σπασμένης σύνδεσης με την τράπεζα.'; @@ -10068,6 +10071,7 @@ ${reportName}`, return ''; }, brokenConnection530Error: 'Η απόδειξη εκκρεμεί λόγω αποσυνδεδεμένου τραπεζικού λογαριασμού', + brokenConnection531Error: 'Δεν είναι δυνατή η αυτόματη αντιστοίχιση της απόδειξης λόγω προσωρινού προβλήματος της τράπεζας. Δοκιμάστε ξανά αργότερα.', adminBrokenConnectionError: ({workspaceCompanyCardRoute}: {workspaceCompanyCardRoute: string}) => `Η απόδειξη εκκρεμεί λόγω κατεστραμμένης σύνδεσης τράπεζας. Παρακαλώ επιλύστε το στις εταιρικές κάρτες.`, memberBrokenConnectionError: 'Η απόδειξη εκκρεμεί λόγω προβλήματος στη σύνδεση με την τράπεζα. Παρακαλείστε να ζητήσετε από έναν διαχειριστή χώρου εργασίας να το επιλύσει.', diff --git a/src/languages/en.ts b/src/languages/en.ts index e83404432758..325e78b764f9 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -9961,6 +9961,9 @@ const translations = { if (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_530) { return "Can't auto-match receipt due to broken bank connection."; } + if (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_531) { + return "Can't auto-match receipt due to a temporary bank issue. Please try again later."; + } if (isPersonalCard && (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION || brokenBankConnection)) { if (!connectionLink) { return "Can't auto-match receipt due to broken bank connection."; @@ -9981,6 +9984,7 @@ const translations = { return ''; }, brokenConnection530Error: 'Receipt pending due to broken bank connection', + brokenConnection531Error: "Can't auto-match receipt due to a temporary bank issue. Please try again later.", adminBrokenConnectionError: ({workspaceCompanyCardRoute}: {workspaceCompanyCardRoute: string}) => `Receipt pending due to broken bank connection. Please resolve in Company cards.`, memberBrokenConnectionError: 'Receipt pending due to broken bank connection. Please ask a workspace admin to resolve.', diff --git a/src/languages/es.ts b/src/languages/es.ts index 8550a36aad84..5edf0174a2ad 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -10019,6 +10019,9 @@ El plan Controlar empieza en 9 $ por miembro activo al mes.`, if (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_530) { return 'No se puede emparejar automáticamente el recibo debido a una conexión bancaria interrumpida.'; } + if (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_531) { + return 'No se puede emparejar automáticamente el recibo debido a un problema temporal del banco. Vuelve a intentarlo más tarde.'; + } if (isPersonalCard && (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION || brokenBankConnection)) { if (!connectionLink) { return 'No se puede emparejar automáticamente el recibo debido a una conexión bancaria interrumpida.'; @@ -10040,6 +10043,7 @@ El plan Controlar empieza en 9 $ por miembro activo al mes.`, return ''; }, brokenConnection530Error: 'Recibo pendiente debido a una conexión bancaria rota', + brokenConnection531Error: 'No se puede emparejar automáticamente el recibo debido a un problema temporal del banco. Vuelve a intentarlo más tarde.', adminBrokenConnectionError: ({workspaceCompanyCardRoute}) => `Recibo pendiente debido a una conexión bancaria rota. Por favor, resuélvelo en Tarjetas de empresa.`, memberBrokenConnectionError: 'Recibo pendiente debido a una conexión bancaria rota. Por favor, pide a un administrador del espacio de trabajo que lo resuelva.', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index 341f6e276551..5b81514bff86 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -9854,6 +9854,9 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e if (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_530) { return 'Impossible d’apparier automatiquement le reçu en raison d’une connexion bancaire rompue.'; } + if (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_531) { + return 'Impossible d’apparier automatiquement le reçu en raison d’un problème temporaire de la banque. Veuillez réessayer plus tard.'; + } if (isPersonalCard && (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION || brokenBankConnection)) { if (!connectionLink) { return 'Impossible d’apparier automatiquement le reçu en raison d’une connexion bancaire rompue.'; @@ -9873,6 +9876,7 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e return ''; }, brokenConnection530Error: 'Reçu en attente en raison d’une connexion bancaire rompue', + brokenConnection531Error: 'Impossible d’apparier automatiquement le reçu en raison d’un problème temporaire de la banque. Veuillez réessayer plus tard.', adminBrokenConnectionError: ({workspaceCompanyCardRoute}: {workspaceCompanyCardRoute: string}) => `Reçu en attente en raison d’une connexion bancaire rompue. Veuillez résoudre le problème dans les Cartes d’entreprise.`, memberBrokenConnectionError: 'Reçu en attente en raison d’une connexion bancaire rompue. Veuillez demander à un administrateur de l’espace de travail de résoudre le problème.', diff --git a/src/languages/it.ts b/src/languages/it.ts index e5732ddb33a1..0eb14ea3ecd1 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -9791,6 +9791,9 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, if (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_530) { return 'Impossibile abbinare automaticamente la ricevuta a causa di un problema di connessione bancaria.'; } + if (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_531) { + return 'Impossibile abbinare automaticamente la ricevuta a causa di un problema temporaneo della banca. Riprova più tardi.'; + } if (isPersonalCard && (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION || brokenBankConnection)) { if (!connectionLink) { return 'Impossibile abbinare automaticamente la ricevuta a causa di un problema di connessione bancaria.'; @@ -9810,6 +9813,7 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, return ''; }, brokenConnection530Error: 'Ricevuta in sospeso a causa di connessione bancaria interrotta', + brokenConnection531Error: 'Impossibile abbinare automaticamente la ricevuta a causa di un problema temporaneo della banca. Riprova più tardi.', adminBrokenConnectionError: ({workspaceCompanyCardRoute}: {workspaceCompanyCardRoute: string}) => `Ricevuta in sospeso a causa di un collegamento bancario interrotto. Risolvi il problema in Carte aziendali.`, memberBrokenConnectionError: 'Ricevuta in sospeso a causa di un collegamento bancario interrotto. Chiedi a un amministratore dello spazio di lavoro di risolvere il problema.', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index 5eaddd3c4e04..b09fb6a827b0 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -9662,6 +9662,9 @@ ${reportName}`, if (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_530) { return '銀行連携の不具合により、領収書を自動照合できません。'; } + if (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_531) { + return '銀行側の一時的な問題により、領収書を自動照合できません。後でもう一度お試しください。'; + } if (isPersonalCard && (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION || brokenBankConnection)) { if (!connectionLink) { return '銀行連携の不具合により、領収書を自動照合できません。'; @@ -9681,6 +9684,7 @@ ${reportName}`, return ''; }, brokenConnection530Error: '銀行連携の不具合により領収書が保留されています', + brokenConnection531Error: '銀行側の一時的な問題により、領収書を自動照合できません。後でもう一度お試しください。', adminBrokenConnectionError: ({workspaceCompanyCardRoute}: {workspaceCompanyCardRoute: string}) => `銀行接続の不具合により領収書が保留されています。会社カードで解決してください。`, memberBrokenConnectionError: '銀行連携の不具合により領収書が保留されています。ワークスペース管理者に対応を依頼してください。', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index 5cfc17a78608..f2b65c8492e4 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -9761,6 +9761,9 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`, if (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_530) { return 'Bon kan automatisch aan bon koppelen vanwege verbroken bankverbinding.'; } + if (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_531) { + return 'Bon kan niet automatisch worden gekoppeld vanwege een tijdelijk probleem bij de bank. Probeer het later opnieuw.'; + } if (isPersonalCard && (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION || brokenBankConnection)) { if (!connectionLink) { return 'Bon kan automatisch aan bon koppelen vanwege verbroken bankverbinding.'; @@ -9780,6 +9783,7 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`, return ''; }, brokenConnection530Error: 'Bonnetje in behandeling vanwege verbroken bankverbinding', + brokenConnection531Error: 'Bon kan niet automatisch worden gekoppeld vanwege een tijdelijk probleem bij de bank. Probeer het later opnieuw.', adminBrokenConnectionError: ({workspaceCompanyCardRoute}: {workspaceCompanyCardRoute: string}) => `Bon in behandeling vanwege een verbroken bankverbinding. Los dit op in Bedrijfspassen.`, memberBrokenConnectionError: 'Bon wordt vastgehouden vanwege een verbroken bankkoppeling. Vraag een werkruimtebeheerder om dit op te lossen.', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index e3f085645e06..10ab61d5497b 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -9733,6 +9733,9 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, if (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_530) { return 'Nie można automatycznie dopasować paragonu z powodu zerwanego połączenia z bankiem.'; } + if (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_531) { + return 'Nie można automatycznie dopasować paragonu z powodu tymczasowego problemu z bankiem. Spróbuj ponownie później.'; + } if (isPersonalCard && (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION || brokenBankConnection)) { if (!connectionLink) { return 'Nie można automatycznie dopasować paragonu z powodu zerwanego połączenia z bankiem.'; @@ -9752,6 +9755,7 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, return ''; }, brokenConnection530Error: 'Paragon oczekuje z powodu przerwanego połączenia z bankiem', + brokenConnection531Error: 'Nie można automatycznie dopasować paragonu z powodu tymczasowego problemu z bankiem. Spróbuj ponownie później.', adminBrokenConnectionError: ({workspaceCompanyCardRoute}: {workspaceCompanyCardRoute: string}) => `Oczekuje na rachunek z powodu przerwanego połączenia z bankiem. Rozwiąż problem w sekcji Karty firmowe.`, memberBrokenConnectionError: 'Paragon oczekuje z powodu zerwanego połączenia z bankiem. Poproś administratora przestrzeni roboczej o rozwiązanie problemu.', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index 1fc515162525..07715659c176 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -9756,6 +9756,9 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, if (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_530) { return 'Não é possível conciliar automaticamente o recibo devido a uma conexão bancária com erro.'; } + if (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_531) { + return 'Não é possível conciliar automaticamente o recibo devido a um problema temporário no banco. Tente novamente mais tarde.'; + } if (isPersonalCard && (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION || brokenBankConnection)) { if (!connectionLink) { return 'Não é possível conciliar automaticamente o recibo devido a uma conexão bancária com erro.'; @@ -9775,6 +9778,7 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, return ''; }, brokenConnection530Error: 'Recibo pendente devido à conexão bancária interrompida', + brokenConnection531Error: 'Não é possível conciliar automaticamente o recibo devido a um problema temporário no banco. Tente novamente mais tarde.', adminBrokenConnectionError: ({workspaceCompanyCardRoute}: {workspaceCompanyCardRoute: string}) => `Recibo pendente devido a uma conexão bancária interrompida. Resolva em Cartões corporativos.`, memberBrokenConnectionError: 'Recibo pendente devido à conexão bancária com problemas. Peça a um administrador do workspace para resolver.', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 283097d61a33..6c714aa40826 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -9415,6 +9415,9 @@ ${reportName}`, if (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_530) { return '由于银行连接中断,无法自动匹配收据。'; } + if (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_531) { + return '由于银行出现暂时性问题,无法自动匹配收据。请稍后重试。'; + } if (isPersonalCard && (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION || brokenBankConnection)) { if (!connectionLink) { return '由于银行连接中断,无法自动匹配收据。'; @@ -9432,6 +9435,7 @@ ${reportName}`, return ''; }, brokenConnection530Error: '由于银行连接中断,收据待处理', + brokenConnection531Error: '由于银行出现暂时性问题,无法自动匹配收据。请稍后重试。', adminBrokenConnectionError: ({workspaceCompanyCardRoute}: {workspaceCompanyCardRoute: string}) => `由于银行连接中断,收据暂时待处理。请前往公司卡中解决。`, memberBrokenConnectionError: '由于银行连接中断,收据处于待处理状态。请联系工作区管理员解决。', diff --git a/src/libs/TransactionUtils/index.ts b/src/libs/TransactionUtils/index.ts index 9be380e29052..2335b96564ab 100644 --- a/src/libs/TransactionUtils/index.ts +++ b/src/libs/TransactionUtils/index.ts @@ -1862,7 +1862,8 @@ function hasPendingRTERViolation(transactionViolations?: TransactionViolations | transactionViolation.name === CONST.VIOLATIONS.RTER && transactionViolation.data?.pendingPattern && transactionViolation.data?.rterType !== CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION && - transactionViolation.data?.rterType !== CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_530, + transactionViolation.data?.rterType !== CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_530 && + transactionViolation.data?.rterType !== CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_531, ); } @@ -1910,7 +1911,9 @@ function hasBrokenConnectionViolation( function isBrokenConnectionViolation(violation: TransactionViolation) { return ( violation.name === CONST.VIOLATIONS.RTER && - (violation.data?.rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION || violation.data?.rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_530) + (violation.data?.rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION || + violation.data?.rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_530 || + violation.data?.rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_531) ); } diff --git a/tests/ui/BrokenConnectionDescriptionTest.tsx b/tests/ui/BrokenConnectionDescriptionTest.tsx new file mode 100644 index 000000000000..5acadb199f58 --- /dev/null +++ b/tests/ui/BrokenConnectionDescriptionTest.tsx @@ -0,0 +1,63 @@ +import {render, screen} from '@testing-library/react-native'; + +import BrokenConnectionDescription from '@components/BrokenConnectionDescription'; +import ComposeProviders from '@components/ComposeProviders'; +import HTMLEngineProvider from '@components/HTMLEngineProvider'; +import {LocaleContextProvider} from '@components/LocaleContextProvider'; +import OnyxListItemProvider from '@components/OnyxListItemProvider'; + +import CONST from '@src/CONST'; +import IntlStore from '@src/languages/IntlStore'; +import ONYXKEYS from '@src/ONYXKEYS'; +import type {TransactionViolations} from '@src/types/onyx'; + +import React from 'react'; +import {Text} from 'react-native'; +import Onyx from 'react-native-onyx'; + +import waitForBatchedUpdatesWithAct from '../utils/waitForBatchedUpdatesWithAct'; + +const mockUseTransactionViolations = jest.fn(); +jest.mock('@hooks/useTransactionViolations', () => ({ + __esModule: true, + default: (...args: unknown[]) => mockUseTransactionViolations(...args), +})); + +const renderDescription = () => + render( + + + + + , + ); + +describe('BrokenConnectionDescription', () => { + beforeAll(() => { + Onyx.init({keys: ONYXKEYS}); + return IntlStore.load(CONST.LOCALES.EN); + }); + + afterEach(() => { + mockUseTransactionViolations.mockReset(); + }); + + it('shows the temporary retry-later message for a 531 broken card connection', async () => { + mockUseTransactionViolations.mockReturnValue([ + { + name: 'rter', + type: 'violation', + data: {rterType: CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_531}, + }, + ] as TransactionViolations); + + renderDescription(); + await waitForBatchedUpdatesWithAct(); + + expect(screen.getByText("Can't auto-match receipt due to a temporary bank issue. Please try again later.")).toBeTruthy(); + }); +}); diff --git a/tests/unit/TransactionUtilsTest.ts b/tests/unit/TransactionUtilsTest.ts index 865ea3d412fe..04864f31bcb8 100644 --- a/tests/unit/TransactionUtilsTest.ts +++ b/tests/unit/TransactionUtilsTest.ts @@ -1293,6 +1293,14 @@ describe('TransactionUtils', () => { expect(showBrokenConnectionViolation).toBe(true); }); + it('should return true for a 531 (temporary, retry later) broken connection violation', () => { + const policy = createMock({role: CONST.POLICY.ROLE.USER}); + const transactionViolations = [{type: CONST.VIOLATION_TYPES.VIOLATION, name: CONST.VIOLATIONS.RTER, data: {rterType: CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_531}}]; + const showBrokenConnectionViolation = shouldShowBrokenConnectionViolation(undefined, policy, transactionViolations); + + expect(showBrokenConnectionViolation).toBe(true); + }); + it('should return true when a broken connection violation exists for any of the provided transactions and the user is the policy member', () => { const policy = createMock({ role: CONST.POLICY.ROLE.USER, diff --git a/tests/unit/ViolationUtilsTest.ts b/tests/unit/ViolationUtilsTest.ts index 1e7cf440f632..fc3182c88bee 100644 --- a/tests/unit/ViolationUtilsTest.ts +++ b/tests/unit/ViolationUtilsTest.ts @@ -3421,6 +3421,14 @@ const brokenCardConnection530Violation: TransactionViolation = { }, }; +const brokenCardConnection531Violation: TransactionViolation = { + name: CONST.VIOLATIONS.RTER, + type: CONST.VIOLATION_TYPES.VIOLATION, + data: { + rterType: CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_531, + }, +}; + describe('getViolationTranslation', () => { it('should return the correct message for broken card connection violation', () => { const testPolicyID = 'test-policy-123'; @@ -3443,6 +3451,14 @@ describe('getViolationTranslation', () => { ); }); + it('should return the temporary retry-later message for a 531 broken card connection', async () => { + IntlStore.load(CONST.LOCALES.EN); + await waitForBatchedUpdates(); + expect(ViolationsUtils.getViolationTranslation({dateFnsLocale: undefined, violation: brokenCardConnection531Violation, translate: translateLocal, convertToDisplayString})).toBe( + "Can't auto-match receipt due to a temporary bank issue. Please try again later.", + ); + }); + describe('increasedDistance violation', () => { const increasedDistanceViolation: TransactionViolation = { name: CONST.VIOLATIONS.INCREASED_DISTANCE,