Show temporary retry-later message for 531 broken card connection - #98672
Show temporary retry-later message for 531 broken card connection#98672tgolen wants to merge 4 commits into
Conversation
Map the new brokenCardConnection531 RTER violation type to its own copy telling the user this is a temporary bank issue to retry later, instead of the generic broken-connection message.
This comment has been minimized.
This comment has been minimized.
The main expense violation message comes from the violations.rter translation (via ViolationsUtils.getViolationTranslation), not only from BrokenConnectionDescription. Add a 531 branch there in every language so the temporary retry-later copy shows instead of falling through to the wrong message, and cover it with a getViolationTranslation unit test.
This comment has been minimized.
This comment has been minimized.
Use the same 'Can't auto-match receipt due to a temporary bank issue. Please try again later.' wording for both the rter violation message and the brokenConnection531Error header copy, so the two surfaces show one consistent message.
🦜 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 diffdiff --git a/src/languages/de.ts b/src/languages/de.ts
index a66bf900..c49d0f61 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -9816,31 +9816,31 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc
isMarkAsCash?: boolean,
) => {
if (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_530) {
- return 'Beleg kann wegen unterbrochener Bankverbindung nicht automatisch zugeordnet werden.';
+ return 'Beleg kann aufgrund einer unterbrochenen 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.';
+ return 'Beleg kann aufgrund 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.';
+ return 'Beleg kann aufgrund einer unterbrochenen Bankverbindung nicht automatisch zugeordnet werden.';
}
return isMarkAsCash
- ? `Beleg kann wegen einer unterbrochenen Kartenverbindung nicht automatisch zugeordnet werden. Markiere ihn als Barzahlung, um ihn zu ignorieren, oder <a href="${connectionLink}">repariere die Karte</a>, um den Beleg zuzuordnen.`
- : `Quittung kann aufgrund einer unterbrochenen Kartenverbindung nicht automatisch zugeordnet werden. <a href="${connectionLink}">Karte reparieren</a>, um die Quittung zuzuordnen.`;
+ ? `Beleg kann wegen unterbrochener Kartenverbindung nicht automatisch zugeordnet werden. Markieren Sie ihn als Barzahlung, um ihn zu ignorieren, oder <a href="${connectionLink}">reparieren Sie die Karte</a>, um den Beleg zuzuordnen.`
+ : `Beleg kann aufgrund einer unterbrochenen Kartenverbindung nicht automatisch zugeordnet werden. <a href="${connectionLink}">Karte reparieren</a>, um den Beleg zuzuordnen.`;
}
if (brokenBankConnection || rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION) {
return isAdmin
- ? `Bankverbindung unterbrochen. <a href="${companyCardPageURL}">Erneut verbinden, um Beleg zuzuordnen</a>`
- : 'Bankverbindung unterbrochen. Bitte eine:n Admin bitten, die Verbindung wiederherzustellen, um den Beleg abzugleichen.';
+ ? `Bankverbindung unterbrochen. <a href="${companyCardPageURL}">Erneut verbinden, um Beleg abzugleichen</a>`
+ : 'Bankverbindung unterbrochen. Bitten Sie eine:n Admin, sie neu zu verbinden, um die Quittung abzugleichen.';
}
if (!isTransactionOlderThan7Days) {
- return isAdmin ? `Bitte ${member} darum, es als Barzahlung zu markieren, oder warte 7 Tage und versuche es dann erneut` : 'Wartet auf Abgleich mit Kartentransaktion.';
+ return isAdmin ? `Bitten Sie ${member}, dies als Barzahlung zu markieren, oder warten Sie 7 Tage und versuchen Sie es erneut` : 'Wartet auf Abgleich mit Kartentransaktion.';
}
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.',
+ brokenConnection531Error: 'Beleg kann aufgrund eines vorübergehenden Bankproblems nicht automatisch zugeordnet werden. Bitte versuchen Sie es später erneut.',
adminBrokenConnectionError: ({workspaceCompanyCardRoute}: {workspaceCompanyCardRoute: string}) =>
`<muted-text-label>Beleg ausstehend wegen unterbrochener Bankverbindung. Bitte in <a href="${workspaceCompanyCardRoute}">Firmenkarten</a> beheben.</muted-text-label>`,
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 ebc0c605..4998685b 100644
--- a/src/languages/el.ts
+++ b/src/languages/el.ts
@@ -10047,23 +10047,23 @@ ${reportName}`,
isMarkAsCash?: boolean,
) => {
if (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_530) {
- return 'Δεν είναι δυνατή η αυτόματη αντιστοίχιση της απόδειξης λόγω σπασμένης σύνδεσης με την τράπεζα.';
+ return 'Αδυναμία αυτόματης αντιστοίχισης της απόδειξης λόγω προβλήματος σύνδεσης με την τράπεζα.';
}
if (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_531) {
- return 'Δεν είναι δυνατή η αυτόματη αντιστοίχιση της απόδειξης λόγω προσωρινού προβλήματος της τράπεζας. Δοκιμάστε ξανά αργότερα.';
+ return 'Δεν είναι δυνατή η αυτόματη αντιστοίχιση της απόδειξης λόγω προσωρινού προβλήματος της τράπεζας. Παρακαλούμε δοκιμάστε ξανά αργότερα.';
}
if (isPersonalCard && (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION || brokenBankConnection)) {
if (!connectionLink) {
- return 'Δεν είναι δυνατή η αυτόματη αντιστοίχιση της απόδειξης λόγω σπασμένης σύνδεσης με την τράπεζα.';
+ return 'Αδυναμία αυτόματης αντιστοίχισης της απόδειξης λόγω προβλήματος σύνδεσης με την τράπεζα.';
}
return isMarkAsCash
- ? `Δεν είναι δυνατή η αυτόματη αντιστοίχιση της απόδειξης λόγω χαλασμένης σύνδεσης κάρτας. Σημειώστε την ως μετρητά για να την αγνοήσετε ή <a href="${connectionLink}">διορθώστε την κάρτα</a> για να αντιστοιχίσετε την απόδειξη.`
- : `Δεν είναι δυνατή η αυτόματη αντιστοίχιση της απόδειξης λόγω χαλασμένης σύνδεσης της κάρτας. <a href="${connectionLink}">Διορθώστε την κάρτα</a> για να αντιστοιχίσετε την απόδειξη.`;
+ ? `Δεν είναι δυνατή η αυτόματη αντιστοίχιση της απόδειξης λόγω μη λειτουργικής σύνδεσης της κάρτας. Σημειώστε την ως μετρητά για να την αγνοήσετε ή <a href="${connectionLink}">διορθώστε την κάρτα</a> για να αντιστοιχίσετε την απόδειξη.`
+ : `Δεν είναι δυνατή η αυτόματη αντιστοίχιση της απόδειξης λόγω κατεστραμμένης σύνδεσης της κάρτας. <a href="${connectionLink}">Επιδιορθώστε την κάρτα</a> για να γίνει αντιστοίχιση της απόδειξης.`;
}
if (brokenBankConnection || rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION) {
return isAdmin
- ? `Η σύνδεση με την τράπεζα διακόπηκε. <a href="${companyCardPageURL}">Επανασυνδέστε για να αντιστοιχίσετε την απόδειξη</a>`
- : 'Η σύνδεση με την τράπεζα διακόπηκε. Ζητήστε από ένα διαχειριστή να την επανασυνδέσει για να γίνει αντιστοίχιση της απόδειξης.';
+ ? `Η σύνδεση με την τράπεζα διακόπηκε. <a href="${companyCardPageURL}">Επανασυνδεθείτε για να αντιστοιχίσετε την απόδειξη</a>`
+ : 'Η σύνδεση με την τράπεζα διακόπηκε. Ζητήστε από έναν διαχειριστή να την επανασυνδέσει για να αντιστοιχίσετε την απόδειξη.';
}
if (!isTransactionOlderThan7Days) {
return isAdmin ? `Ζητήστε από τον/την ${member} να το σημειώσει ως μετρητά ή περιμένετε 7 ημέρες και δοκιμάστε ξανά` : 'Αναμονή για συγχώνευση με συναλλαγή κάρτας.';
@@ -10071,7 +10071,7 @@ ${reportName}`,
return '';
},
brokenConnection530Error: 'Η απόδειξη εκκρεμεί λόγω αποσυνδεδεμένου τραπεζικού λογαριασμού',
- brokenConnection531Error: 'Δεν είναι δυνατή η αυτόματη αντιστοίχιση της απόδειξης λόγω προσωρινού προβλήματος της τράπεζας. Δοκιμάστε ξανά αργότερα.',
+ brokenConnection531Error: 'Δεν είναι δυνατή η αυτόματη αντιστοίχιση της απόδειξης λόγω προσωρινού προβλήματος της τράπεζας. Παρακαλούμε δοκιμάστε ξανά αργότερα.',
adminBrokenConnectionError: ({workspaceCompanyCardRoute}: {workspaceCompanyCardRoute: string}) =>
`<muted-text-label>Η απόδειξη εκκρεμεί λόγω κατεστραμμένης σύνδεσης τράπεζας. Παρακαλώ επιλύστε το στις <a href="${workspaceCompanyCardRoute}">εταιρικές κάρτες</a>.</muted-text-label>`,
memberBrokenConnectionError: 'Η απόδειξη εκκρεμεί λόγω προβλήματος στη σύνδεση με την τράπεζα. Παρακαλείστε να ζητήσετε από έναν διαχειριστή χώρου εργασίας να το επιλύσει.',
diff --git a/src/languages/es.ts b/src/languages/es.ts
index 5edf0174..147f7f8f 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -10015,35 +10015,43 @@ El plan Controlar empieza en 9 $ por miembro activo al mes.`,
},
customRules: (message) => message,
reviewRequired: 'Revisión requerida',
- rter: (brokenBankConnection, isAdmin, isTransactionOlderThan7Days, member, rterType, companyCardPageURL, connectionLink, isPersonalCard, isMarkAsCash) => {
+ rter: (
+ brokenBankConnection: boolean,
+ isAdmin: boolean,
+ isTransactionOlderThan7Days: boolean,
+ member?: string,
+ rterType?: ValueOf<typeof CONST.RTER_VIOLATION_TYPES>,
+ companyCardPageURL?: string,
+ connectionLink?: string,
+ isPersonalCard?: boolean,
+ isMarkAsCash?: boolean,
+ ) => {
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.';
+ return 'No se puede conciliar automáticamente el recibo debido a una conexión bancaria rota.';
}
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.';
+ return 'No se puede conciliar automáticamente el recibo debido a un problema temporal con el banco. Por favor, inténtalo de nuevo 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.';
+ return 'No se puede conciliar automáticamente el recibo debido a una conexión bancaria rota.';
}
return isMarkAsCash
- ? `No se puede vincular automáticamente el recibo debido a un problema de conexión de la tarjeta. Márcalo como efectivo para ignorarlo o <a href="${connectionLink}">soluciona la conexión de la tarjeta</a> para asociar el recibo.`
- : `No se puede vincular automáticamente el recibo debido a un problema de conexión de la tarjeta. <a href="${connectionLink}">Soluciona la conexión de la tarjeta</a> para asociar el recibo.`;
+ ? `No se puede conciliar automáticamente el recibo debido a una conexión rota de la tarjeta. Márcalo como efectivo para ignorarlo o <a href="${connectionLink}">repara la tarjeta</a> para conciliar el recibo.`
+ : `No se puede conciliar automáticamente el recibo debido a una conexión de tarjeta rota. <a href="${connectionLink}">Repara la tarjeta</a> para conciliar el recibo.`;
}
if (brokenBankConnection || rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION) {
return isAdmin
- ? `Conexión bancaria interrumpida. <a href="${companyCardPageURL}">Vuelve a conectarte para emparejar el recibo</a>`
- : 'Conexión bancaria interrumpida. Pide a un administrador que la vuelva a conectar para emparejar el recibo.';
+ ? `Conexión bancaria interrumpida. <a href="${companyCardPageURL}">Vuelve a conectar para hacer coincidir el recibo</a>`
+ : 'Conexión bancaria interrumpida. Pídele a un administrador que la vuelva a conectar para que coincida con el recibo.';
}
if (!isTransactionOlderThan7Days) {
- return isAdmin
- ? `Pide a ${member} que marque la transacción como efectivo o espera 7 días e inténtalo de nuevo`
- : 'Esperando a adjuntar automáticamente la transacción de tarjeta de crédito';
+ return isAdmin ? `Pídele a ${member} que lo marque como efectivo o espera 7 días e inténtalo de nuevo` : 'Esperando a que se fusione con la transacción de tarjeta.';
}
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.',
+ brokenConnection531Error: 'No se puede conciliar automáticamente el recibo debido a un problema temporal con el banco. Por favor, inténtalo de nuevo más tarde.',
adminBrokenConnectionError: ({workspaceCompanyCardRoute}) =>
`<muted-text-label>Recibo pendiente debido a una conexión bancaria rota. Por favor, resuélvelo en <a href="${workspaceCompanyCardRoute}">Tarjetas de empresa</a>.</muted-text-label>`,
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 5b81514b..627e65bb 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -9852,31 +9852,31 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e
isMarkAsCash?: boolean,
) => {
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.';
+ return 'Impossible d’associer 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.';
+ return 'Impossible d’associer automatiquement le reçu en raison d’un problème temporaire avec 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.';
+ return 'Impossible d’associer automatiquement le reçu en raison d’une connexion bancaire rompue.';
}
return isMarkAsCash
- ? `Impossible d'associer automatiquement le reçu en raison d'une connexion de carte défectueuse. Marquez-le comme paiement en espèces pour l'ignorer, ou <a href="${connectionLink}">corrigez la carte</a> pour associer le reçu.`
- : `Impossible d'associer automatiquement le reçu en raison d'une connexion de carte rompue. <a href="${connectionLink}">Réparez la carte</a> pour faire correspondre le reçu.`;
+ ? `Impossible d’associer automatiquement le reçu en raison d’une connexion carte défectueuse. Marquez-le comme espèces pour l’ignorer, ou <a href="${connectionLink}">réparez la carte</a> pour faire correspondre le reçu.`
+ : `Impossible d’associer automatiquement le reçu en raison d’une connexion carte défectueuse. <a href="${connectionLink}">Réparer la carte</a> pour associer le reçu.`;
}
if (brokenBankConnection || rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION) {
return isAdmin
- ? `Connexion bancaire rompue. <a href="${companyCardPageURL}">Reconnectez-vous pour faire correspondre le reçu</a>`
- : 'Connexion bancaire interrompue. Demandez à un administrateur de la reconnecter pour faire correspondre le reçu.';
+ ? `Connexion bancaire rompue. <a href="${companyCardPageURL}">Reconnecter pour rapprocher le reçu</a>`
+ : 'Connexion bancaire rompue. Demandez à un administrateur de la reconnecter pour faire correspondre le reçu.';
}
if (!isTransactionOlderThan7Days) {
- return isAdmin ? `Demandez à ${member} de marquer comme paiement en espèces ou attendez 7 jours et réessayez` : 'En attente de fusion avec la transaction par carte.';
+ return isAdmin ? `Demandez à ${member} de le marquer comme espèce, ou attendez 7 jours et réessayez` : 'En attente de fusion avec la transaction de carte.';
}
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.',
+ brokenConnection531Error: 'Impossible d’associer automatiquement le reçu en raison d’un problème temporaire avec la banque. Veuillez réessayer plus tard.',
adminBrokenConnectionError: ({workspaceCompanyCardRoute}: {workspaceCompanyCardRoute: string}) =>
`<muted-text-label>Reçu en attente en raison d’une connexion bancaire rompue. Veuillez résoudre le problème dans les <a href="${workspaceCompanyCardRoute}">Cartes d’entreprise</a>.</muted-text-label>`,
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 0eb14ea3..1ba94fae 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -9789,26 +9789,26 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`,
isMarkAsCash?: boolean,
) => {
if (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_530) {
- return 'Impossibile abbinare automaticamente la ricevuta a causa di un problema di connessione bancaria.';
+ return 'Impossibile abbinare automaticamente la ricevuta a causa di un problema di connessione con la banca.';
}
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.';
+ return 'Impossibile abbinare automaticamente la ricevuta a causa di un problema di connessione con la banca.';
}
return isMarkAsCash
- ? `Impossibile abbinare automaticamente la ricevuta a causa di un problema di connessione della carta. Contrassegna come contanti per ignorare oppure <a href="${connectionLink}">sistema la carta</a> per abbinare la ricevuta.`
- : `Impossibile abbinare automaticamente la ricevuta a causa di un problema di connessione con la carta. <a href="${connectionLink}">Correggi la carta</a> per abbinarla alla ricevuta.`;
+ ? `Impossibile abbinare automaticamente la ricevuta a causa di un problema di connessione della carta. Contrassegna come contanti per ignorare oppure <a href="${connectionLink}">ripara la carta</a> per abbinare la ricevuta.`
+ : `Impossibile abbinare automaticamente la ricevuta a causa di un problema di connessione della carta. <a href="${connectionLink}">Ripara la carta</a> per abbinarla alla ricevuta.`;
}
if (brokenBankConnection || rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION) {
return isAdmin
? `Connessione bancaria interrotta. <a href="${companyCardPageURL}">Riconnetti per abbinare la ricevuta</a>`
- : 'Connessione bancaria interrotta. Chiedi a un amministratore di riconnetterla per abbinare la ricevuta.';
+ : 'Collegamento bancario interrotto. Chiedi a un amministratore di ricollegarlo per abbinarlo alla ricevuta.';
}
if (!isTransactionOlderThan7Days) {
- return isAdmin ? `Chiedi a ${member} di contrassegnarla come contante oppure attendi 7 giorni e riprova` : 'In attesa di abbinamento con la transazione della carta.';
+ return isAdmin ? `Chiedi a ${member} di contrassegnarlo come contante oppure attendi 7 giorni e riprova` : 'In attesa di unione con la transazione della carta.';
}
return '';
},
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index b09fb6a8..2fb653b3 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -9660,31 +9660,31 @@ ${reportName}`,
isMarkAsCash?: boolean,
) => {
if (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_530) {
- return '銀行連携の不具合により、領収書を自動照合できません。';
+ return '銀行連携が切断されているため、領収書を自動照合できません。';
}
if (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_531) {
- return '銀行側の一時的な問題により、領収書を自動照合できません。後でもう一度お試しください。';
+ return '一時的な銀行の問題により、領収書を自動照合できません。後でもう一度お試しください。';
}
if (isPersonalCard && (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION || brokenBankConnection)) {
if (!connectionLink) {
- return '銀行連携の不具合により、領収書を自動照合できません。';
+ return '銀行連携が切断されているため、領収書を自動照合できません。';
}
return isMarkAsCash
- ? `カード連携の不具合により領収書を自動照合できません。無視するには現金としてマークするか、<a href="${connectionLink}">カードを修正</a>して領収書と照合してください。`
- : `カード連携が壊れているため、領収書を自動照合できません。領収書を照合するには、<a href="${connectionLink}">カードの問題を解決</a>してください。`;
+ ? `カード接続の不具合により、レシートを自動照合できません。無視するには現金としてマークするか、レシートを照合するには<a href="${connectionLink}">カード接続を修正</a>してください。`
+ : `カード接続の不具合により、領収書を自動照合できません。領収書を照合するには、<a href="${connectionLink}">カード接続を修正</a>してください。`;
}
if (brokenBankConnection || rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION) {
return isAdmin
- ? `銀行連携が切断されました。<a href="${companyCardPageURL}">レシートと照合するために再接続</a>`
- : '銀行連携が切断されています。管理者に依頼して再接続し、領収書と照合してください。';
+ ? `銀行連携が切断されました。<a href="${companyCardPageURL}">再接続してレシートを照合する</a>`
+ : '銀行との接続が切れています。管理者に依頼して再接続し、レシートと照合してください。';
}
if (!isTransactionOlderThan7Days) {
- return isAdmin ? `${member} に現金としてマークするよう依頼するか、7日待ってから再試行してください` : 'カード取引との照合待ちです。';
+ return isAdmin ? `${member} に現金としてマークするよう依頼するか、7日待ってから再度お試しください` : 'カード取引との統合待ちです。';
}
return '';
},
brokenConnection530Error: '銀行連携の不具合により領収書が保留されています',
- brokenConnection531Error: '銀行側の一時的な問題により、領収書を自動照合できません。後でもう一度お試しください。',
+ brokenConnection531Error: '一時的な銀行の問題により、領収書を自動照合できません。後でもう一度お試しください。',
adminBrokenConnectionError: ({workspaceCompanyCardRoute}: {workspaceCompanyCardRoute: string}) =>
`<muted-text-label>銀行接続の不具合により領収書が保留されています。<a href="${workspaceCompanyCardRoute}">会社カード</a>で解決してください。</muted-text-label>`,
memberBrokenConnectionError: '銀行連携の不具合により領収書が保留されています。ワークスペース管理者に対応を依頼してください。',
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index f2b65c84..a3470767 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -9752,38 +9752,38 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`,
isAdmin: boolean,
isTransactionOlderThan7Days: boolean,
member?: string,
- rterType?: string,
+ rterType?: ValueOf<typeof CONST.RTER_VIOLATION_TYPES>,
companyCardPageURL?: string,
connectionLink?: string,
isPersonalCard?: boolean,
isMarkAsCash?: boolean,
) => {
if (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_530) {
- return 'Bon kan automatisch aan bon koppelen vanwege verbroken bankverbinding.';
+ return 'Kan bon niet automatisch koppelen vanwege een 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.';
+ return 'Kan bon niet automatisch koppelen vanwege een tijdelijk bankprobleem. 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.';
+ return 'Kan bon niet automatisch koppelen vanwege een verbroken bankverbinding.';
}
return isMarkAsCash
? `Kan bon niet automatisch koppelen vanwege een verbroken kaartverbinding. Markeer als contant om te negeren, of <a href="${connectionLink}">repareer de kaart</a> om de bon te koppelen.`
- : `Kan bon automatisch koppelen aan bon vanwege verbroken kaartverbinding. <a href="${connectionLink}">Herstel de kaart</a> om de bon te koppelen.`;
+ : `Kan bon niet automatisch koppelen door een verbroken kaartverbinding. <a href="${connectionLink}">Herstel de kaart</a> om de bon te koppelen.`;
}
if (brokenBankConnection || rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION) {
return isAdmin
- ? `Bankkoppeling verbroken. <a href="${companyCardPageURL}">Opnieuw verbinden om bon te koppelen</a>`
- : 'Bankkoppeling verbroken. Vraag een beheerder om de verbinding opnieuw te maken om de bon te laten overeenkomen.';
+ ? `Bankkoppeling verbroken. <a href="${companyCardPageURL}">Opnieuw verbinden om bon te matchen</a>`
+ : 'Bankkoppeling verbroken. Vraag een beheerder om opnieuw te koppelen om de bon te laten overeenkomen.';
}
if (!isTransactionOlderThan7Days) {
- return isAdmin ? `Vraag ${member} om het als contant te markeren of wacht 7 dagen en probeer het opnieuw` : 'In afwachting van koppeling met kaarttransactie.';
+ return isAdmin ? `Vraag ${member} om deze als contant te markeren of wacht 7 dagen en probeer het opnieuw` : 'In afwachting van samenvoeging met kaarttransactie.';
}
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.',
+ brokenConnection531Error: 'Kan bon niet automatisch koppelen vanwege een tijdelijk bankprobleem. Probeer het later opnieuw.',
adminBrokenConnectionError: ({workspaceCompanyCardRoute}: {workspaceCompanyCardRoute: string}) =>
`<muted-text-label>Bon in behandeling vanwege een verbroken bankverbinding. Los dit op in <a href="${workspaceCompanyCardRoute}">Bedrijfspassen</a>.</muted-text-label>`,
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 10ab61d5..2a0cae4b 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -9724,7 +9724,7 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`,
isAdmin: boolean,
isTransactionOlderThan7Days: boolean,
member?: string,
- rterType?: string,
+ rterType?: ValueOf<typeof CONST.RTER_VIOLATION_TYPES>,
companyCardPageURL?: string,
connectionLink?: string,
isPersonalCard?: boolean,
@@ -9741,16 +9741,16 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`,
return 'Nie można automatycznie dopasować paragonu z powodu zerwanego połączenia z bankiem.';
}
return isMarkAsCash
- ? `Nie można automatycznie dopasować paragonu z powodu zerwanego połączenia z kartą. Oznacz jako gotówkę, aby zignorować, lub <a href="${connectionLink}">napraw kartę</a>, aby dopasować paragon.`
- : `Nie można automatycznie dopasować paragonu z powodu przerwanego połączenia karty. <a href="${connectionLink}">Napraw kartę</a>, aby dopasować paragon.`;
+ ? `Nie można automatycznie dopasować paragonu z powodu przerwanego połączenia karty. Oznacz jako gotówka, żeby zignorować, albo <a href="${connectionLink}">napraw kartę</a>, żeby dopasować paragon.`
+ : `Nie można automatycznie dopasować paragonu z powodu zerwanego połączenia z kartą. <a href="${connectionLink}">Napraw kartę</a>, aby dopasować paragon.`;
}
if (brokenBankConnection || rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION) {
return isAdmin
? `Połączenie z bankiem przerwane. <a href="${companyCardPageURL}">Połącz ponownie, aby dopasować paragon</a>`
- : 'Połączenie z bankiem zostało przerwane. Poproś administratora o ponowne połączenie, aby dopasować paragon.';
+ : 'Połączenie z bankiem zostało zerwane. Poproś administratora o ponowne połączenie, aby dopasować paragon.';
}
if (!isTransactionOlderThan7Days) {
- return isAdmin ? `Poproś ${member}, aby oznaczył to jako gotówkę, albo poczekaj 7 dni i spróbuj ponownie` : 'Oczekiwanie na połączenie z transakcją kartową.';
+ return isAdmin ? `Poproś ${member}, żeby oznaczył to jako gotówkę albo poczekaj 7 dni i spróbuj ponownie` : 'Oczekiwanie na połączenie z transakcją z karty.';
}
return '';
},
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index 07715659..6cccc2e3 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -9747,38 +9747,38 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`,
isAdmin: boolean,
isTransactionOlderThan7Days: boolean,
member?: string,
- rterType?: string,
+ rterType?: ValueOf<typeof CONST.RTER_VIOLATION_TYPES>,
companyCardPageURL?: string,
connectionLink?: string,
isPersonalCard?: boolean,
isMarkAsCash?: boolean,
) => {
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.';
+ return 'Não é possível associar automaticamente o recibo devido a uma conexão bancária quebrada.';
}
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.';
+ return 'Não é possível corresponder 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.';
+ return 'Não é possível associar automaticamente o recibo devido a uma conexão bancária quebrada.';
}
return isMarkAsCash
- ? `Não é possível corresponder automaticamente o recibo devido a uma conexão de cartão com problema. Marque como dinheiro para ignorar ou <a href="${connectionLink}">corrija o cartão</a> para corresponder o recibo.`
- : `Não é possível corresponder automaticamente o recibo devido a uma conexão quebrada com o cartão. <a href="${connectionLink}">Corrigir o cartão</a> para corresponder o recibo.`;
+ ? `Não é possível corresponder automaticamente o recibo devido a uma conexão quebrada do cartão. Marque como dinheiro para ignorar ou <a href="${connectionLink}">corrija o cartão</a> para corresponder o recibo.`
+ : `Não é possível associar automaticamente o recibo devido a uma conexão quebrada do cartão. <a href="${connectionLink}">Corrija o cartão</a> para associar o recibo.`;
}
if (brokenBankConnection || rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION) {
return isAdmin
- ? `Conexão bancária interrompida. <a href="${companyCardPageURL}">Reconectar para corresponder ao recibo</a>`
- : 'Conexão bancária interrompida. Peça para um administrador reconectar para corresponder ao recibo.';
+ ? `Conexão com o banco interrompida. <a href="${companyCardPageURL}">Reconectar para corresponder ao recibo</a>`
+ : 'Conexão com o banco interrompida. Peça para um administrador reconectar para corresponder ao recibo.';
}
if (!isTransactionOlderThan7Days) {
- return isAdmin ? `Peça para ${member} marcar como dinheiro ou aguarde 7 dias e tente novamente` : 'Aguardando associação com a transação do cartão.';
+ return isAdmin ? `Peça para ${member} marcar como dinheiro ou espere 7 dias e tente novamente` : 'Aguardando combinação com a transação do cartão.';
}
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.',
+ brokenConnection531Error: 'Não é possível corresponder automaticamente o recibo devido a um problema temporário no banco. Tente novamente mais tarde.',
adminBrokenConnectionError: ({workspaceCompanyCardRoute}: {workspaceCompanyCardRoute: string}) =>
`<muted-text-label>Recibo pendente devido a uma conexão bancária interrompida. Resolva em <a href="${workspaceCompanyCardRoute}">Cartões corporativos</a>.</muted-text-label>`,
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 6c714aa4..e579b74c 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -9406,7 +9406,7 @@ ${reportName}`,
isAdmin: boolean,
isTransactionOlderThan7Days: boolean,
member?: string,
- rterType?: string,
+ rterType?: ValueOf<typeof CONST.RTER_VIOLATION_TYPES>,
companyCardPageURL?: string,
connectionLink?: string,
isPersonalCard?: boolean,
@@ -9416,26 +9416,26 @@ ${reportName}`,
return '由于银行连接中断,无法自动匹配收据。';
}
if (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_531) {
- return '由于银行出现暂时性问题,无法自动匹配收据。请稍后重试。';
+ return '由于银行暂时故障,无法自动匹配收据。请稍后再试。';
}
if (isPersonalCard && (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION || brokenBankConnection)) {
if (!connectionLink) {
return '由于银行连接中断,无法自动匹配收据。';
}
return isMarkAsCash
- ? `由于银行卡连接异常,无法自动匹配收据。标记为现金以忽略,或<a href="${connectionLink}">修复银行卡</a>以匹配收据。`
- : `由于银行卡连接异常,无法自动匹配收据。请<a href="${connectionLink}">修复银行卡</a>以匹配该收据。`;
+ ? `由于卡片连接中断,无法自动匹配收据。标记为现金即可忽略,或<a href="${connectionLink}">修复卡片</a>以匹配收据。`
+ : `由于银行卡连接中断,无法自动匹配收据。<a href="${connectionLink}">修复银行卡连接</a>以匹配收据。`;
}
if (brokenBankConnection || rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION) {
- return isAdmin ? `银行连接已断开。<a href="${companyCardPageURL}">重新连接以匹配收据</a>` : '银行连接已断开。请让管理员重新连接以匹配收据。';
+ return isAdmin ? `银行连接已中断。<a href="${companyCardPageURL}">重新连接以匹配收据</a>` : '银行连接已中断。请让管理员重新连接以匹配收据。';
}
if (!isTransactionOlderThan7Days) {
- return isAdmin ? `请让 ${member} 将其标记为现金,或等待 7 天后再试` : '正在等待与信用卡交易合并。';
+ return isAdmin ? `请让 ${member} 将其标记为现金,或等待 7 天后再试` : '等待与卡片交易合并。';
}
return '';
},
brokenConnection530Error: '由于银行连接中断,收据待处理',
- brokenConnection531Error: '由于银行出现暂时性问题,无法自动匹配收据。请稍后重试。',
+ brokenConnection531Error: '由于银行暂时故障,无法自动匹配收据。请稍后再试。',
adminBrokenConnectionError: ({workspaceCompanyCardRoute}: {workspaceCompanyCardRoute: string}) =>
`<muted-text-label>由于银行连接中断,收据暂时待处理。请前往<a href="${workspaceCompanyCardRoute}">公司卡</a>中解决。</muted-text-label>`,
memberBrokenConnectionError: '由于银行连接中断,收据处于待处理状态。请联系工作区管理员解决。',
Note You can apply these changes to your branch by copying the patch to your clipboard, then running |
531 was missing from the broken-connection classifiers, so a 531 violation was treated as a generic pending RTER (showing 'Awaiting merge with card transaction.') instead of a broken connection. Add 531 alongside 530 in isBrokenConnectionViolation and hasPendingRTERViolation, and in the MoneyRequestHeader and report status bar broken-connection lookups, so shouldShowBrokenConnectionViolation is true and the 531 copy shows. Covered by a shouldShowBrokenConnectionViolation unit test.
Codecov Report✅ Changes either increased or maintained existing code coverage, great job!
|
|
@abzokhattab Please copy/paste the Reviewer Checklist from here into a new comment on this PR and complete it. If you have the K2 extension, you can simply click: [this button] |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 4456a9f543
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| 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, |
There was a problem hiding this comment.
Preserve a status type for multi-expense 531 reports
When a multi-expense report has pendingPattern 531 violations on all its transactions, this exclusion makes hasAllPendingRTERViolations false. Although shouldShowBrokenConnectionViolationForMultipleTransactions then makes shouldShowStatusBar true, the broken-connection branch in useMoneyReportHeaderStatusBar.ts requires the single-report transaction, which is undefined when there is more than one visible transaction; consequently statusBarType remains undefined, no retry-later message is rendered, and the normal next-step content is also suppressed. The report-level broken-connection path needs to select a violating transaction from the report collection (or otherwise retain a renderable status) before 531 is removed from the pending-RTER path.
Useful? React with 👍 / 👎.
Explanation of Change
When a company-card connection returns scrape code
531("expected but unusable response, retry later"), the expense previously showed the generic broken-connection RTER message telling the user to fix their card. Code531is temporary and resolves on its own, so that message is misleading.This PR maps the new backend RTER violation type
brokenCardConnection531to its own copy inBrokenConnectionDescription: "Receipt pending due to a temporary bank issue. Please try again later." The message is added to all languages.This depends on the backend emitting
brokenCardConnection531, which ships in the companion Auth PR: https://github.com/Expensify/Auth/pull/23728Fixed Issues
$ https://github.com/Expensify/Expensify/issues/671466
PROPOSAL:
Tests
The
brokenCardConnection531violation is emitted by the companion Auth PR (not yet deployed), so use Debug mode to inject the violation and verify the copy renders:Account > Troubleshootand enable Debug mode.{ "type": "violation", "name": "rter", "data": { "rterType": "brokenCardConnection531" } }rterTypeback tobrokenCardConnectionand verify the existing broken-bank-connection copy renders instead (no regression).You can also run the automated tests:
npx jest tests/unit/ViolationUtilsTest.ts -t getViolationTranslationnpx jest tests/ui/BrokenConnectionDescriptionTest.tsxOffline tests
The violation copy is rendered from local Onyx data with no network dependency. With the device offline, repeat the Tests steps above and verify the 531 copy still renders correctly.
QA Steps
Same as tests — the Debug-mode steps above can be run on staging. The new copy is otherwise dormant until the linked Auth change is deployed, at which point cards with scrape code 531 surface it in the normal flow.
You can ping @tgolen to QA this.
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectionAvatar, I verified the components usingAvatarare working as expected)StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))npm run compress-svg)Avataris modified, I verified thatAvataris working as expected in all cases)Designlabel and/or tagged@Expensify/designso the design team can review the changes.mainbranch was merged into this PR after a review, I tested again and verified the outcome was still expected according to theTeststeps.Screenshots/Videos
Android: Native
Android: mWeb Chrome
iOS: Native
iOS: mWeb Safari
MacOS: Chrome / Safari