diff --git a/src/languages/de.ts b/src/languages/de.ts index 7928a3efa24b..e1a06b231eaa 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -7924,6 +7924,7 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc reimburseableLink: 'Auslagen', nonReimbursableLink: 'Firmenkarten-Ausgaben', pending: (label: string) => `hat begonnen, diesen Bericht nach ${label} zu exportieren...`, + travelCardLink: 'Reisespesen mit Firmenkarte', }, integrationsMessage: (errorMessage: string, label: string, linkText?: string, linkURL?: string) => `Fehler beim Exportieren dieses Berichts nach ${label} („${errorMessage}${linkText ? `${linkText}` : ''}“)`, diff --git a/src/languages/en.ts b/src/languages/en.ts index 1c3252df3621..9144ed659e55 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -7903,6 +7903,7 @@ const translations = { automaticActionThree: 'and successfully created a record for', reimburseableLink: 'out-of-pocket expenses', nonReimbursableLink: 'company card expenses', + travelCardLink: 'travel card expenses', pending: (label: string) => `started exporting this report to ${label}...`, }, integrationsMessage: (errorMessage: string, label: string, linkText?: string, linkURL?: string) => diff --git a/src/languages/es.ts b/src/languages/es.ts index a607e98aebc3..bdd3cb01432b 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -7750,6 +7750,7 @@ ${amount} para ${merchant} - ${date}`, automaticActionThree: 'y creó un registro con éxito para', reimburseableLink: 'Exportar gastos por cuenta propia como', nonReimbursableLink: 'gastos de la tarjeta de empresa', + travelCardLink: 'gastos de la tarjeta de viaje', pending: (label) => `comenzó a exportar este informe a ${label}...`, }, integrationsMessage: (errorMessage, label, linkText, linkURL) => diff --git a/src/languages/fr.ts b/src/languages/fr.ts index ebffd180d40c..5237eecf0601 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -7946,6 +7946,7 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e reimburseableLink: 'dépenses personnelles', nonReimbursableLink: 'Dépenses de carte d’entreprise', pending: (label: string) => `a commencé à exporter cette note de frais vers ${label}...`, + travelCardLink: 'dépenses par carte de voyage', }, integrationsMessage: (errorMessage: string, label: string, linkText?: string, linkURL?: string) => `échec de l’exportation de cette note de frais vers ${label} (« ${errorMessage}${linkText ? `${linkText}` : ''} »)`, diff --git a/src/languages/it.ts b/src/languages/it.ts index 508ebadbfa17..a711682c206a 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -7913,6 +7913,7 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, reimburseableLink: 'spese vive', nonReimbursableLink: 'spese con carta aziendale', pending: (label: string) => `ha iniziato a esportare questo resoconto su ${label}...`, + travelCardLink: 'spese con carta di viaggio', }, integrationsMessage: (errorMessage: string, label: string, linkText?: string, linkURL?: string) => `esportazione di questo report su ${label} non riuscita ("${errorMessage}${linkText ? `${linkText}` : ''}")`, diff --git a/src/languages/ja.ts b/src/languages/ja.ts index 9b8ae1ae442f..129b04e144db 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -7815,6 +7815,7 @@ ${reportName} reimburseableLink: '立替経費', nonReimbursableLink: '会社カード経費', pending: (label: string) => `このレポートの${label}へのエクスポートを開始しました…`, + travelCardLink: 'トラベルカード経費', }, integrationsMessage: (errorMessage: string, label: string, linkText?: string, linkURL?: string) => `このレポートを${label}にエクスポートできませんでした("${errorMessage}${linkText ? `${linkText}` : ''}")`, diff --git a/src/languages/nl.ts b/src/languages/nl.ts index c58cd2742dcb..6c4be1c32d5b 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -7887,6 +7887,7 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`, reimburseableLink: 'uit eigen zak gemaakte uitgaven', nonReimbursableLink: 'uitgaven met bedrijfskaart', pending: (label: string) => `is begonnen dit rapport te exporteren naar ${label}...`, + travelCardLink: 'reiskartuitgaven', }, integrationsMessage: (errorMessage: string, label: string, linkText?: string, linkURL?: string) => `het exporteren van dit rapport naar ${label} is mislukt ("${errorMessage}${linkText ? `${linkText}` : ''}")`, diff --git a/src/languages/pl.ts b/src/languages/pl.ts index 9599f1c479d7..a2b4203ef1cc 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -7877,6 +7877,7 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, reimburseableLink: 'wydatki z własnej kieszeni', nonReimbursableLink: 'wydatki z firmowej karty', pending: (label: string) => `rozpoczęto eksport tego raportu do ${label}...`, + travelCardLink: 'wydatki z karty podróżnej', }, integrationsMessage: (errorMessage: string, label: string, linkText?: string, linkURL?: string) => `nie udało się wyeksportować tego raportu do ${label} („${errorMessage}${linkText ? `${linkText}` : ''}”)`, diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index 7787e4330f8f..c7b2790441e8 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -7880,6 +7880,7 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, reimburseableLink: 'despesas reembolsáveis', nonReimbursableLink: 'despesas com cartão corporativo', pending: (label: string) => `iniciou a exportação deste relatório para ${label}...`, + travelCardLink: 'despesas do cartão de viagem', }, integrationsMessage: (errorMessage: string, label: string, linkText?: string, linkURL?: string) => `falha ao exportar este relatório para ${label} ("${errorMessage}${linkText ? `${linkText}` : ''}")`, diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 732946f48239..80aaece9c5d0 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -7678,6 +7678,7 @@ ${reportName} reimburseableLink: '自付报销费用', nonReimbursableLink: '公司卡消费', pending: (label: string) => `已开始将此报表导出到 ${label}…`, + travelCardLink: '差旅卡费用', }, integrationsMessage: (errorMessage: string, label: string, linkText?: string, linkURL?: string) => `未能将此报表导出到 ${label}(“${errorMessage}${linkText ? `${linkText}` : ''}”)`, diff --git a/src/libs/ReportActionsUtils.ts b/src/libs/ReportActionsUtils.ts index 5bed9598ed7b..738ab88233c2 100644 --- a/src/libs/ReportActionsUtils.ts +++ b/src/libs/ReportActionsUtils.ts @@ -2717,6 +2717,7 @@ function getExportIntegrationActionFragments(translate: LocalizedTranslate, repo const {label, markedManually, automaticAction} = originalMessage; const reimbursableUrls = originalMessage.reimbursableUrls ?? []; const nonReimbursableUrls = originalMessage.nonReimbursableUrls ?? []; + const travelInvoicingUrls = originalMessage.travelInvoicingUrls ?? []; const reportID = reportAction?.reportID; const wasExportedAfterBase62 = (reportAction?.created ?? '') > '2022-11-14'; const base62ReportID = getBase62ReportID(Number(reportID)); @@ -2748,29 +2749,40 @@ function getExportIntegrationActionFragments(translate: LocalizedTranslate, repo url: '', }); } - if (reimbursableUrls.length || nonReimbursableUrls.length) { + if (reimbursableUrls.length || nonReimbursableUrls.length || travelInvoicingUrls.length) { result.push({ text: translate('report.actions.type.exportedToIntegration.automaticActionThree'), url: '', }); } + const hasReimbursable = reimbursableUrls.length > 0; + const hasNonReimbursable = nonReimbursableUrls.length > 0; + const hasTravelInvoicing = travelInvoicingUrls.length > 0; + const linkItemCount = (hasReimbursable ? 1 : 0) + (hasNonReimbursable ? 1 : 0) + (hasTravelInvoicing ? 1 : 0); + if (reimbursableUrls.length === 1) { - const shouldAddPeriod = nonReimbursableUrls.length === 0; const reimbursableUrl = reimbursableUrls.at(0) ?? ''; + let suffix = ''; + if (linkItemCount === 1) { + suffix = '.'; + } else if (linkItemCount === 3) { + suffix = ','; + } result.push({ - text: translate('report.actions.type.exportedToIntegration.reimburseableLink') + (shouldAddPeriod ? '.' : ''), + text: translate('report.actions.type.exportedToIntegration.reimburseableLink') + suffix, url: reimbursableUrl.startsWith('https://') ? reimbursableUrl : '', }); } - if (reimbursableUrls.length === 1 && nonReimbursableUrls.length) { + if (hasReimbursable && (hasNonReimbursable || hasTravelInvoicing) && linkItemCount === 2) { result.push({ text: translate('common.and'), url: '', }); } if (nonReimbursableUrls.length) { - const text = translate('report.actions.type.exportedToIntegration.nonReimbursableLink'); + const baseText = translate('report.actions.type.exportedToIntegration.nonReimbursableLink'); + const text = linkItemCount === 3 ? `${baseText},` : baseText; let url = ''; if (nonReimbursableUrls.length === 1) { @@ -2797,6 +2809,27 @@ function getExportIntegrationActionFragments(translate: LocalizedTranslate, repo result.push({text, url}); } + if (nonReimbursableUrls.length && travelInvoicingUrls.length) { + result.push({ + text: translate('common.and'), + url: '', + }); + } + if (travelInvoicingUrls.length) { + const text = translate('report.actions.type.exportedToIntegration.travelCardLink'); + let url = ''; + + if (travelInvoicingUrls.length === 1) { + const travelInvoicingUrl = travelInvoicingUrls.at(0) ?? ''; + url = travelInvoicingUrl.startsWith('https://') ? travelInvoicingUrl : ''; + } else if (label === CONST.POLICY.CONNECTIONS.NAME_USER_FRIENDLY.netsuite) { + url = NETSUITE_NON_REIMBURSABLE_EXPENSES_URL_PREFIX; + url += wasExportedAfterBase62 ? base62ReportID : reportID; + } + + result.push({text, url}); + } + return result; } diff --git a/src/types/onyx/OriginalMessage.ts b/src/types/onyx/OriginalMessage.ts index 5083cb28364e..7f78deb33591 100644 --- a/src/types/onyx/OriginalMessage.ts +++ b/src/types/onyx/OriginalMessage.ts @@ -1228,6 +1228,11 @@ type OriginalMessageExportIntegration = { */ reimbursableUrls?: string[]; + /** + * A list of URLs to the Travel Invoicing Journal Entry records + */ + travelInvoicingUrls?: string[]; + /** * The type of the export action */