From c60c7d53824c2cd06d93494fd03b2c2feaac3821 Mon Sep 17 00:00:00 2001 From: "Fitsum Abebe (via MelvinBot)" Date: Tue, 26 May 2026 16:49:04 +0000 Subject: [PATCH 1/7] Fix NetSuite default card display when no workspace default vendor configured Remove the defaultAccount precondition from isDefaultTitle in both VENDOR_BILL and JOURNAL_ENTRY branches of getExportMenuItem. The card's own nameValuePairs value determines whether "Default Card" should display, regardless of whether the workspace has a default vendor/payable account configured. This aligns with the existing Sage Intacct pattern. Co-authored-by: Fitsum Abebe --- src/pages/workspace/companyCards/utils.tsx | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/pages/workspace/companyCards/utils.tsx b/src/pages/workspace/companyCards/utils.tsx index e6527e00cd98..5718c253111b 100644 --- a/src/pages/workspace/companyCards/utils.tsx +++ b/src/pages/workspace/companyCards/utils.tsx @@ -165,10 +165,9 @@ function getExportMenuItem( case CONST.NETSUITE_EXPORT_DESTINATION.VENDOR_BILL: { const vendors = policy?.connections?.netsuite?.options.data.vendors; defaultAccount = config?.defaultVendor; - isDefaultTitle = !!( - defaultAccount && - (!companyCard?.nameValuePairs?.netsuite_export_vendor || companyCard?.nameValuePairs?.netsuite_export_vendor === CONST.COMPANY_CARDS.DEFAULT_EXPORT_TYPE) - ); + isDefaultTitle = + companyCard?.nameValuePairs?.netsuite_export_vendor === CONST.COMPANY_CARDS.DEFAULT_EXPORT_TYPE || + !companyCard?.nameValuePairs?.netsuite_export_vendor; const selectedVendor = vendors?.find(({id}) => id === (companyCard?.nameValuePairs?.netsuite_export_vendor ?? defaultAccount)); title = isDefaultTitle ? defaultCard : selectedVendor?.name; const resultData = (vendors ?? []).length > 0 ? [defaultMenuItem, ...(vendors ?? [])] : vendors; @@ -186,11 +185,9 @@ function getExportMenuItem( case CONST.NETSUITE_EXPORT_DESTINATION.JOURNAL_ENTRY: { const payableAccounts = policy?.connections?.netsuite?.options.data.payableList; defaultAccount = config?.payableAcct; - isDefaultTitle = !!( - defaultAccount && - (!companyCard?.nameValuePairs?.netsuite_export_payable_account || - companyCard?.nameValuePairs?.netsuite_export_payable_account === CONST.COMPANY_CARDS.DEFAULT_EXPORT_TYPE) - ); + isDefaultTitle = + companyCard?.nameValuePairs?.netsuite_export_payable_account === CONST.COMPANY_CARDS.DEFAULT_EXPORT_TYPE || + !companyCard?.nameValuePairs?.netsuite_export_payable_account; const selectedPayableAccount = payableAccounts?.find(({id}) => id === (companyCard?.nameValuePairs?.netsuite_export_payable_account ?? defaultAccount)); title = isDefaultTitle ? defaultCard : selectedPayableAccount?.name; const resultData = (payableAccounts ?? []).length > 0 ? [defaultMenuItem, ...(payableAccounts ?? [])] : payableAccounts; From 0d420c38b067b050e95535f6e534ae5443313620 Mon Sep 17 00:00:00 2001 From: "Fitsum Abebe (via MelvinBot)" Date: Tue, 26 May 2026 16:58:50 +0000 Subject: [PATCH 2/7] Apply prettier formatting Co-authored-by: Fitsum Abebe --- src/pages/workspace/companyCards/utils.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/pages/workspace/companyCards/utils.tsx b/src/pages/workspace/companyCards/utils.tsx index 5718c253111b..b94c72ea71b0 100644 --- a/src/pages/workspace/companyCards/utils.tsx +++ b/src/pages/workspace/companyCards/utils.tsx @@ -165,9 +165,7 @@ function getExportMenuItem( case CONST.NETSUITE_EXPORT_DESTINATION.VENDOR_BILL: { const vendors = policy?.connections?.netsuite?.options.data.vendors; defaultAccount = config?.defaultVendor; - isDefaultTitle = - companyCard?.nameValuePairs?.netsuite_export_vendor === CONST.COMPANY_CARDS.DEFAULT_EXPORT_TYPE || - !companyCard?.nameValuePairs?.netsuite_export_vendor; + isDefaultTitle = companyCard?.nameValuePairs?.netsuite_export_vendor === CONST.COMPANY_CARDS.DEFAULT_EXPORT_TYPE || !companyCard?.nameValuePairs?.netsuite_export_vendor; const selectedVendor = vendors?.find(({id}) => id === (companyCard?.nameValuePairs?.netsuite_export_vendor ?? defaultAccount)); title = isDefaultTitle ? defaultCard : selectedVendor?.name; const resultData = (vendors ?? []).length > 0 ? [defaultMenuItem, ...(vendors ?? [])] : vendors; From d1adc50c87c9c467e1942c6abd4928ef62cb6ed4 Mon Sep 17 00:00:00 2001 From: "Fitsum Abebe (via MelvinBot)" Date: Thu, 28 May 2026 20:52:11 +0000 Subject: [PATCH 3/7] Preserve original OR condition ordering Co-authored-by: Fitsum Abebe --- src/pages/workspace/companyCards/utils.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pages/workspace/companyCards/utils.tsx b/src/pages/workspace/companyCards/utils.tsx index b94c72ea71b0..e0be4d916a63 100644 --- a/src/pages/workspace/companyCards/utils.tsx +++ b/src/pages/workspace/companyCards/utils.tsx @@ -165,7 +165,7 @@ function getExportMenuItem( case CONST.NETSUITE_EXPORT_DESTINATION.VENDOR_BILL: { const vendors = policy?.connections?.netsuite?.options.data.vendors; defaultAccount = config?.defaultVendor; - isDefaultTitle = companyCard?.nameValuePairs?.netsuite_export_vendor === CONST.COMPANY_CARDS.DEFAULT_EXPORT_TYPE || !companyCard?.nameValuePairs?.netsuite_export_vendor; + isDefaultTitle = !companyCard?.nameValuePairs?.netsuite_export_vendor || companyCard?.nameValuePairs?.netsuite_export_vendor === CONST.COMPANY_CARDS.DEFAULT_EXPORT_TYPE; const selectedVendor = vendors?.find(({id}) => id === (companyCard?.nameValuePairs?.netsuite_export_vendor ?? defaultAccount)); title = isDefaultTitle ? defaultCard : selectedVendor?.name; const resultData = (vendors ?? []).length > 0 ? [defaultMenuItem, ...(vendors ?? [])] : vendors; @@ -184,8 +184,8 @@ function getExportMenuItem( const payableAccounts = policy?.connections?.netsuite?.options.data.payableList; defaultAccount = config?.payableAcct; isDefaultTitle = - companyCard?.nameValuePairs?.netsuite_export_payable_account === CONST.COMPANY_CARDS.DEFAULT_EXPORT_TYPE || - !companyCard?.nameValuePairs?.netsuite_export_payable_account; + !companyCard?.nameValuePairs?.netsuite_export_payable_account || + companyCard?.nameValuePairs?.netsuite_export_payable_account === CONST.COMPANY_CARDS.DEFAULT_EXPORT_TYPE; const selectedPayableAccount = payableAccounts?.find(({id}) => id === (companyCard?.nameValuePairs?.netsuite_export_payable_account ?? defaultAccount)); title = isDefaultTitle ? defaultCard : selectedPayableAccount?.name; const resultData = (payableAccounts ?? []).length > 0 ? [defaultMenuItem, ...(payableAccounts ?? [])] : payableAccounts; From 8cafa24c054f5dcfc0259b2ac5ff0343190f46b3 Mon Sep 17 00:00:00 2001 From: "Fitsum Abebe (via MelvinBot)" Date: Thu, 4 Jun 2026 12:10:13 +0000 Subject: [PATCH 4/7] Match NetSuite default export label to export method Use "Default vendor" for vendor bill export and "Default account" for journal entry export instead of "Default card", matching the accounts shown in each dropdown. Co-authored-by: Fitsum Abebe --- src/languages/de.ts | 1 + src/languages/en.ts | 1 + src/languages/es.ts | 1 + src/languages/fr.ts | 1 + src/languages/it.ts | 1 + src/languages/ja.ts | 1 + src/languages/nl.ts | 1 + src/languages/pl.ts | 1 + src/languages/pt-BR.ts | 1 + src/languages/zh-hans.ts | 1 + src/pages/workspace/companyCards/utils.tsx | 30 ++++++++++++++-------- 11 files changed, 29 insertions(+), 11 deletions(-) diff --git a/src/languages/de.ts b/src/languages/de.ts index a1428306253a..07e9dd06f86f 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -6471,6 +6471,7 @@ _Für ausführlichere Anweisungen [besuchen Sie unsere Hilfeseite](${CONST.NETSU exportCompanyCard: 'Firmenkartenausgaben exportieren als', exportDate: 'Exportdatum', defaultVendor: 'Standardanbieter', + defaultAccount: 'Standardkonto', autoSync: 'Automatische Synchronisierung', autoSyncDescription: 'NetSuite und Expensify automatisch jeden Tag synchronisieren. Finalisierte Berichte in Echtzeit exportieren', reimbursedReports: 'Erstattete Berichte synchronisieren', diff --git a/src/languages/en.ts b/src/languages/en.ts index b37663c2ee86..0c73a2dfa3b4 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -6502,6 +6502,7 @@ const translations = { exportCompanyCard: 'Export company card expenses as', exportDate: 'Export date', defaultVendor: 'Default vendor', + defaultAccount: 'Default account', autoSync: 'Auto-sync', autoSyncDescription: 'Sync NetSuite and Expensify automatically, every day. Export finalized report in realtime', reimbursedReports: 'Sync reimbursed reports', diff --git a/src/languages/es.ts b/src/languages/es.ts index 49c6c41c3537..0db4a36e2938 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -6252,6 +6252,7 @@ ${amount} para ${merchant} - ${date}`, exportCompanyCard: 'Exportar gastos de la tarjeta de empresa como', exportDate: 'Fecha de exportación', defaultVendor: 'Proveedor predeterminado', + defaultAccount: 'Cuenta predeterminada', autoSync: 'Autosincronización', autoSyncDescription: 'Sincroniza NetSuite y Expensify automáticamente, todos los días. Exporta el informe finalizado en tiempo real', reimbursedReports: 'Sincronizar informes reembolsados', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index 28fa0270c5ca..ff0ffa0c34d9 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -6494,6 +6494,7 @@ _Pour des instructions plus détaillées, [visitez notre site d’aide](${CONST. exportCompanyCard: 'Exporter les dépenses de carte d’entreprise en tant que', exportDate: 'Date d’exportation', defaultVendor: 'Fournisseur par défaut', + defaultAccount: 'Compte par défaut', autoSync: 'Synchronisation automatique', autoSyncDescription: 'Synchronisez automatiquement NetSuite et Expensify, chaque jour. Exportez les notes de frais finalisées en temps réel', reimbursedReports: 'Synchroniser les notes de frais remboursées', diff --git a/src/languages/it.ts b/src/languages/it.ts index 8ab6b4ea1ee0..44014cf6100d 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -6459,6 +6459,7 @@ _Per istruzioni più dettagliate, [visita il nostro sito di assistenza](${CONST. exportCompanyCard: 'Esporta le spese con carta aziendale come', exportDate: 'Data di esportazione', defaultVendor: 'Fornitore predefinito', + defaultAccount: 'Conto predefinito', autoSync: 'Sincronizzazione automatica', autoSyncDescription: 'Sincronizza automaticamente NetSuite ed Expensify ogni giorno. Esporta i report finalizzati in tempo reale', reimbursedReports: 'Sincronizza i report rimborsati', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index c2cd656b7a3c..aa393515f4ce 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -6393,6 +6393,7 @@ _詳しい手順については、[ヘルプサイトをご覧ください](${CO exportCompanyCard: '法人カード経費のエクスポート形式', exportDate: 'エクスポート日', defaultVendor: 'デフォルトのベンダー', + defaultAccount: 'デフォルトのアカウント', autoSync: '自動同期', autoSyncDescription: 'NetSuite と Expensify を毎日自動で同期。確定したレポートをリアルタイムでエクスポート', reimbursedReports: '精算済みレポートを同期', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index 6a1181594d1a..8292e2ee6e42 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -6437,6 +6437,7 @@ _Voor meer gedetailleerde instructies, [bezoek onze help-site](${CONST.NETSUITE_ exportCompanyCard: 'Bedrijfspaskosten exporteren als', exportDate: 'Exportdatum', defaultVendor: 'Standaardleverancier', + defaultAccount: 'Standaardrekening', autoSync: 'Automatisch synchroniseren', autoSyncDescription: 'Synchroniseer NetSuite en Expensify automatisch, elke dag. Exporteer een afgerond rapport in realtime', reimbursedReports: 'Geverifieerde rapporten synchroniseren', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index a7140cf7275f..bf45a94342a6 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -6432,6 +6432,7 @@ _Aby uzyskać bardziej szczegółowe instrukcje, [odwiedź naszą stronę pomocy exportCompanyCard: 'Eksportuj wydatki z firmowej karty jako', exportDate: 'Data eksportu', defaultVendor: 'Domyślny dostawca', + defaultAccount: 'Domyślne konto', autoSync: 'Automatyczna synchronizacja', autoSyncDescription: 'Synchronizuj NetSuite i Expensify automatycznie, każdego dnia. Eksportuj sfinalizowany raport w czasie rzeczywistym', reimbursedReports: 'Synchronizuj rozliczone raporty', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index d513966555f1..79a251683435 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -6437,6 +6437,7 @@ _Para instruções mais detalhadas, [visite nossa central de ajuda](${CONST.NETS exportCompanyCard: 'Exportar despesas de cartão corporativo como', exportDate: 'Data de exportação', defaultVendor: 'Fornecedor padrão', + defaultAccount: 'Conta padrão', autoSync: 'Sincronização automática', autoSyncDescription: 'Sincronize NetSuite e Expensify automaticamente, todos os dias. Exporte relatórios finalizados em tempo real', reimbursedReports: 'Sincronizar relatórios reembolsados', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 882adf310116..e79bd7d4860b 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -6278,6 +6278,7 @@ _如需更详细的说明,请[访问我们的帮助网站](${CONST.NETSUITE_IM exportCompanyCard: '导出公司卡费用为', exportDate: '导出日期', defaultVendor: '默认供应商', + defaultAccount: '默认账户', autoSync: '自动同步', autoSyncDescription: '每天自动同步 NetSuite 和 Expensify。实时导出已完成报表', reimbursedReports: '同步已报销报表', diff --git a/src/pages/workspace/companyCards/utils.tsx b/src/pages/workspace/companyCards/utils.tsx index e0be4d916a63..c7fdcce18931 100644 --- a/src/pages/workspace/companyCards/utils.tsx +++ b/src/pages/workspace/companyCards/utils.tsx @@ -29,6 +29,7 @@ function getExportMenuItem( const currentConnectionName = getCurrentConnectionName(policy); const defaultCard = translate('workspace.moreFeatures.companyCards.defaultCard'); const defaultVendor = translate('workspace.accounting.defaultVendor'); + const defaultAccount = translate('workspace.accounting.defaultAccount'); const defaultMenuItem: Account & {value?: string} = { name: defaultCard, @@ -44,6 +45,13 @@ function getExportMenuItem( currency: '', }; + const defaultAccountMenuItem: Account & {value?: string} = { + name: defaultAccount, + value: defaultAccount, + id: defaultAccount, + currency: '', + }; + const {nonReimbursableExpensesExportDestination, nonReimbursableExpensesAccount, reimbursableExpensesExportDestination, reimbursableExpensesAccount} = policy?.connections?.quickbooksOnline?.config ?? {}; const {export: exportConfig} = policy?.connections?.intacct?.config ?? {}; @@ -156,7 +164,7 @@ function getExportMenuItem( let shouldShowMenuItem = true; const description = currentConnectionName && type ? translate('workspace.moreFeatures.companyCards.integrationExport', currentConnectionName, type) : undefined; let data: SelectorType[]; - let defaultAccount: string | undefined = ''; + let defaultExportAccount: string | undefined = ''; let isDefaultTitle = false; const netSuiteConfig = config?.nonreimbursableExpensesExportDestination ?? config?.reimbursableExpensesExportDestination; @@ -164,17 +172,17 @@ function getExportMenuItem( switch (netSuiteConfig) { case CONST.NETSUITE_EXPORT_DESTINATION.VENDOR_BILL: { const vendors = policy?.connections?.netsuite?.options.data.vendors; - defaultAccount = config?.defaultVendor; + defaultExportAccount = config?.defaultVendor; isDefaultTitle = !companyCard?.nameValuePairs?.netsuite_export_vendor || companyCard?.nameValuePairs?.netsuite_export_vendor === CONST.COMPANY_CARDS.DEFAULT_EXPORT_TYPE; - const selectedVendor = vendors?.find(({id}) => id === (companyCard?.nameValuePairs?.netsuite_export_vendor ?? defaultAccount)); - title = isDefaultTitle ? defaultCard : selectedVendor?.name; - const resultData = (vendors ?? []).length > 0 ? [defaultMenuItem, ...(vendors ?? [])] : vendors; + const selectedVendor = vendors?.find(({id}) => id === (companyCard?.nameValuePairs?.netsuite_export_vendor ?? defaultExportAccount)); + title = isDefaultTitle ? defaultVendor : selectedVendor?.name; + const resultData = (vendors ?? []).length > 0 ? [defaultVendorMenuItem, ...(vendors ?? [])] : vendors; data = (resultData ?? []).map(({id, name}) => { return { value: id, text: name, keyForList: id, - isSelected: isDefaultTitle ? name === defaultCard : selectedVendor?.id === id, + isSelected: isDefaultTitle ? name === defaultVendor : selectedVendor?.id === id, }; }); exportType = CONST.COMPANY_CARDS.EXPORT_CARD_TYPES.NVP_NETSUITE_EXPORT_VENDOR; @@ -182,19 +190,19 @@ function getExportMenuItem( } case CONST.NETSUITE_EXPORT_DESTINATION.JOURNAL_ENTRY: { const payableAccounts = policy?.connections?.netsuite?.options.data.payableList; - defaultAccount = config?.payableAcct; + defaultExportAccount = config?.payableAcct; isDefaultTitle = !companyCard?.nameValuePairs?.netsuite_export_payable_account || companyCard?.nameValuePairs?.netsuite_export_payable_account === CONST.COMPANY_CARDS.DEFAULT_EXPORT_TYPE; - const selectedPayableAccount = payableAccounts?.find(({id}) => id === (companyCard?.nameValuePairs?.netsuite_export_payable_account ?? defaultAccount)); - title = isDefaultTitle ? defaultCard : selectedPayableAccount?.name; - const resultData = (payableAccounts ?? []).length > 0 ? [defaultMenuItem, ...(payableAccounts ?? [])] : payableAccounts; + const selectedPayableAccount = payableAccounts?.find(({id}) => id === (companyCard?.nameValuePairs?.netsuite_export_payable_account ?? defaultExportAccount)); + title = isDefaultTitle ? defaultAccount : selectedPayableAccount?.name; + const resultData = (payableAccounts ?? []).length > 0 ? [defaultAccountMenuItem, ...(payableAccounts ?? [])] : payableAccounts; data = (resultData ?? []).map(({id, name}) => { return { value: id, text: name, keyForList: id, - isSelected: isDefaultTitle ? name === defaultCard : selectedPayableAccount?.id === id, + isSelected: isDefaultTitle ? name === defaultAccount : selectedPayableAccount?.id === id, }; }); exportType = CONST.COMPANY_CARDS.EXPORT_CARD_TYPES.NVP_NETSUITE_EXPORT_ACCOUNT; From 6bf53b66c8b321882a0fe2149138b10f4ac9bed9 Mon Sep 17 00:00:00 2001 From: "Fitsum Abebe (via MelvinBot)" Date: Fri, 5 Jun 2026 15:07:50 +0000 Subject: [PATCH 5/7] Apply default-label fix to QBO, Xero, and QBD company card export Show the default option label even when no workspace-level default account/vendor is configured (previously the row rendered blank), and match the default label to the export method (vendor bill -> Default vendor, journal entry/check -> Default account, card -> Default card) via a shared getDefaultExportLabel helper. Sage Intacct already followed this principle; its inner locals were renamed to satisfy no-shadow. Co-authored-by: Fitsum Abebe --- src/pages/workspace/companyCards/utils.tsx | 82 ++++++++++++---------- tests/unit/CompanyCardExportTest.ts | 34 +++++++++ 2 files changed, 80 insertions(+), 36 deletions(-) diff --git a/src/pages/workspace/companyCards/utils.tsx b/src/pages/workspace/companyCards/utils.tsx index c7fdcce18931..aec8600b345b 100644 --- a/src/pages/workspace/companyCards/utils.tsx +++ b/src/pages/workspace/companyCards/utils.tsx @@ -52,6 +52,22 @@ function getExportMenuItem( currency: '', }; + // The default option label matches the export method: a vendor bill exports to a vendor, a journal entry/check to an account, and a card to a card. + const getDefaultExportLabel = (exportDestination: string | undefined): {defaultLabel: string; defaultLabelMenuItem: Account & {value?: string}} => { + switch (exportDestination) { + case CONST.QUICKBOOKS_NON_REIMBURSABLE_EXPORT_ACCOUNT_TYPE.VENDOR_BILL: + case CONST.QUICKBOOKS_DESKTOP_REIMBURSABLE_ACCOUNT_TYPE.VENDOR_BILL: + return {defaultLabel: defaultVendor, defaultLabelMenuItem: defaultVendorMenuItem}; + case CONST.QUICKBOOKS_REIMBURSABLE_ACCOUNT_TYPE.JOURNAL_ENTRY: + case CONST.QUICKBOOKS_REIMBURSABLE_ACCOUNT_TYPE.CHECK: + case CONST.QUICKBOOKS_DESKTOP_REIMBURSABLE_ACCOUNT_TYPE.JOURNAL_ENTRY: + case CONST.QUICKBOOKS_DESKTOP_REIMBURSABLE_ACCOUNT_TYPE.CHECK: + return {defaultLabel: defaultAccount, defaultLabelMenuItem: defaultAccountMenuItem}; + default: + return {defaultLabel: defaultCard, defaultLabelMenuItem: defaultMenuItem}; + } + }; + const {nonReimbursableExpensesExportDestination, nonReimbursableExpensesAccount, reimbursableExpensesExportDestination, reimbursableExpensesAccount} = policy?.connections?.quickbooksOnline?.config ?? {}; const {export: exportConfig} = policy?.connections?.intacct?.config ?? {}; @@ -71,7 +87,7 @@ function getExportMenuItem( let data: Account[]; let shouldShowMenuItem = nonReimbursableExpensesExportDestination !== CONST.QUICKBOOKS_NON_REIMBURSABLE_EXPORT_ACCOUNT_TYPE.VENDOR_BILL; let selectedAccount: Account | undefined; - const defaultAccount = nonReimbursableExpensesAccount?.name ?? reimbursableExpensesAccount?.name; + const defaultExportAccount = nonReimbursableExpensesAccount?.name ?? reimbursableExpensesAccount?.name; let isDefaultTitle = false; let exportType: ValueOf | undefined; const qboConfig = nonReimbursableExpensesExportDestination ?? reimbursableExpensesExportDestination; @@ -81,24 +97,20 @@ function getExportMenuItem( case CONST.QUICKBOOKS_REIMBURSABLE_ACCOUNT_TYPE.VENDOR_BILL: case CONST.QUICKBOOKS_NON_REIMBURSABLE_EXPORT_ACCOUNT_TYPE.CREDIT_CARD: { data = creditCards ?? []; - isDefaultTitle = !!( - defaultAccount && - (!companyCard?.nameValuePairs?.quickbooks_online_export_account || - companyCard?.nameValuePairs?.quickbooks_online_export_account === CONST.COMPANY_CARDS.DEFAULT_EXPORT_TYPE) - ); - selectedAccount = (creditCards ?? []).find((currentCard) => currentCard.id === (companyCard?.nameValuePairs?.quickbooks_online_export_account ?? defaultAccount)); + isDefaultTitle = + !companyCard?.nameValuePairs?.quickbooks_online_export_account || + companyCard?.nameValuePairs?.quickbooks_online_export_account === CONST.COMPANY_CARDS.DEFAULT_EXPORT_TYPE; + selectedAccount = (creditCards ?? []).find((currentCard) => currentCard.id === (companyCard?.nameValuePairs?.quickbooks_online_export_account ?? defaultExportAccount)); exportType = CONST.COMPANY_CARDS.EXPORT_CARD_TYPES.NVP_QUICKBOOKS_ONLINE_EXPORT_ACCOUNT; break; } case CONST.QUICKBOOKS_NON_REIMBURSABLE_EXPORT_ACCOUNT_TYPE.DEBIT_CARD: { data = quickbooksOnlineBankAccounts ?? []; - isDefaultTitle = !!( - defaultAccount && - (!companyCard?.nameValuePairs?.quickbooks_online_export_account_debit || - companyCard?.nameValuePairs?.quickbooks_online_export_account_debit === CONST.COMPANY_CARDS.DEFAULT_EXPORT_TYPE) - ); + isDefaultTitle = + !companyCard?.nameValuePairs?.quickbooks_online_export_account_debit || + companyCard?.nameValuePairs?.quickbooks_online_export_account_debit === CONST.COMPANY_CARDS.DEFAULT_EXPORT_TYPE; selectedAccount = (quickbooksOnlineBankAccounts ?? []).find( - (bank) => bank.id === (companyCard?.nameValuePairs?.quickbooks_online_export_account_debit ?? defaultAccount), + (bank) => bank.id === (companyCard?.nameValuePairs?.quickbooks_online_export_account_debit ?? defaultExportAccount), ); exportType = CONST.COMPANY_CARDS.EXPORT_CARD_TYPES.NVP_QUICKBOOKS_ONLINE_EXPORT_ACCOUNT_DEBIT; break; @@ -107,11 +119,12 @@ function getExportMenuItem( shouldShowMenuItem = false; data = []; } - const resultData = data.length > 0 ? [defaultMenuItem, ...data] : data; + const {defaultLabel, defaultLabelMenuItem} = getDefaultExportLabel(qboConfig); + const resultData = data.length > 0 ? [defaultLabelMenuItem, ...data] : data; return { description, - title: isDefaultTitle ? defaultCard : selectedAccount?.name, + title: isDefaultTitle ? defaultLabel : selectedAccount?.name, exportType, shouldShowMenuItem, exportPageLink: createDynamicRoute(DYNAMIC_ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_ONLINE_EXPORT.path, backTo ?? basePath), @@ -119,7 +132,7 @@ function getExportMenuItem( value: card.id, text: card.name, keyForList: card.name, - isSelected: isDefaultTitle ? card.name === defaultCard : card.id === selectedAccount?.id, + isSelected: isDefaultTitle ? card.name === defaultLabel : card.id === selectedAccount?.id, })), }; } @@ -127,26 +140,24 @@ function getExportMenuItem( const type = translate('workspace.xero.xeroBankAccount'); const description = currentConnectionName && type ? translate('workspace.moreFeatures.companyCards.integrationExport', currentConnectionName, type) : undefined; const exportType = CONST.COMPANY_CARDS.EXPORT_CARD_TYPES.NVP_XERO_EXPORT_BANK_ACCOUNT; - const defaultAccount = exportConfiguration?.nonReimbursableAccount; - const isDefaultTitle = !!( - defaultAccount && - (!companyCard?.nameValuePairs?.xero_export_bank_account || companyCard?.nameValuePairs?.xero_export_bank_account === CONST.COMPANY_CARDS.DEFAULT_EXPORT_TYPE) - ); - const selectedAccount = (bankAccounts ?? []).find((bank) => bank.id === (companyCard?.nameValuePairs?.xero_export_bank_account ?? defaultAccount)); - const resultData = (bankAccounts ?? [])?.length > 0 ? [defaultMenuItem, ...(bankAccounts ?? [])] : bankAccounts; + const defaultExportAccount = exportConfiguration?.nonReimbursableAccount; + const isDefaultTitle = + !companyCard?.nameValuePairs?.xero_export_bank_account || companyCard?.nameValuePairs?.xero_export_bank_account === CONST.COMPANY_CARDS.DEFAULT_EXPORT_TYPE; + const selectedAccount = (bankAccounts ?? []).find((bank) => bank.id === (companyCard?.nameValuePairs?.xero_export_bank_account ?? defaultExportAccount)); + const resultData = (bankAccounts ?? [])?.length > 0 ? [defaultAccountMenuItem, ...(bankAccounts ?? [])] : bankAccounts; return { description, exportType, shouldShowMenuItem: !!exportConfiguration?.nonReimbursableAccount, - title: isDefaultTitle ? defaultCard : selectedAccount?.name, + title: isDefaultTitle ? defaultAccount : selectedAccount?.name, exportPageLink: createDynamicRoute(DYNAMIC_ROUTES.POLICY_ACCOUNTING_XERO_EXPORT.path, basePath), data: (resultData ?? []).map((card) => { return { value: card.id, text: card.name, keyForList: card.id, - isSelected: isDefaultTitle ? card.name === defaultCard : selectedAccount?.id === card.id, + isSelected: isDefaultTitle ? card.name === defaultAccount : selectedAccount?.id === card.id, }; }), }; @@ -240,12 +251,12 @@ function getExportMenuItem( switch (sageConfig) { case CONST.SAGE_INTACCT_NON_REIMBURSABLE_EXPENSE_TYPE.VENDOR_BILL: case CONST.SAGE_INTACCT_REIMBURSABLE_EXPENSE_TYPE.VENDOR_BILL: { - const defaultAccount = isNonReimbursable ? getSageIntacctNonReimbursableActiveDefaultVendor(policy) : exportConfig?.reimbursableExpenseReportDefaultVendor; + const defaultExportAccount = isNonReimbursable ? getSageIntacctNonReimbursableActiveDefaultVendor(policy) : exportConfig?.reimbursableExpenseReportDefaultVendor; isDefaultTitle = !!( companyCard?.nameValuePairs?.intacct_export_vendor === CONST.COMPANY_CARDS.DEFAULT_EXPORT_TYPE || !companyCard?.nameValuePairs?.intacct_export_vendor ); const vendors = policy?.connections?.intacct?.data?.vendors ?? []; - const selectedVendorID = companyCard?.nameValuePairs?.intacct_export_vendor ?? defaultAccount; + const selectedVendorID = companyCard?.nameValuePairs?.intacct_export_vendor ?? defaultExportAccount; const selectedVendor = (vendors ?? []).find(({id}) => id === selectedVendorID); title = isDefaultTitle ? defaultVendor : selectedVendor?.value; const resultData = (vendors ?? []).length > 0 ? [defaultVendorMenuItem, ...(vendors ?? [])] : vendors; @@ -266,11 +277,11 @@ function getExportMenuItem( const defaultVendorAccount = (policy?.connections?.intacct?.data?.vendors ?? []).find((vendor) => vendor.id === activeDefaultVendor); // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing - const defaultAccount = exportConfig?.nonReimbursableAccount || defaultVendorAccount; + const defaultExportAccount = exportConfig?.nonReimbursableAccount || defaultVendorAccount; isDefaultTitle = !!( companyCard?.nameValuePairs?.intacct_export_charge_card === CONST.COMPANY_CARDS.DEFAULT_EXPORT_TYPE || !companyCard?.nameValuePairs?.intacct_export_charge_card ); - const selectedVendorID = companyCard?.nameValuePairs?.intacct_export_charge_card ?? defaultAccount; + const selectedVendorID = companyCard?.nameValuePairs?.intacct_export_charge_card ?? defaultExportAccount; const selectedCard = (intacctCreditCards ?? []).find(({id}) => id === selectedVendorID); title = isDefaultTitle ? defaultCard : selectedCard?.name; const resultData = (intacctCreditCards ?? []).length > 0 ? [defaultMenuItem, ...(intacctCreditCards ?? [])] : intacctCreditCards; @@ -313,10 +324,10 @@ function getExportMenuItem( nonReimbursableExpenses !== CONST.QUICKBOOKS_DESKTOP_NON_REIMBURSABLE_EXPORT_ACCOUNT_TYPE.VENDOR_BILL; let title: string | undefined = ''; let selectedAccount: Account | undefined; - const defaultAccount = exportQBD?.nonReimbursableAccount ?? exportQBD?.reimbursableAccount; let isDefaultTitle = false; let exportType: ValueOf | undefined; const qbdConfig = nonReimbursableExpenses ?? reimbursableExpenses; + const {defaultLabel, defaultLabelMenuItem} = getDefaultExportLabel(qbdConfig); switch (qbdConfig) { case CONST.QUICKBOOKS_DESKTOP_REIMBURSABLE_ACCOUNT_TYPE.JOURNAL_ENTRY: case CONST.QUICKBOOKS_DESKTOP_REIMBURSABLE_ACCOUNT_TYPE.CHECK: @@ -326,11 +337,10 @@ function getExportMenuItem( selectedAccount = (creditCardAccounts ?? []).find((account) => account.id === companyCard?.nameValuePairs?.quickbooks_desktop_export_account_credit) ?? (creditCardAccounts ?? []).find((account) => account.name === companyCard?.nameValuePairs?.quickbooks_desktop_export_account_credit); - isDefaultTitle = !!( + isDefaultTitle = companyCard?.nameValuePairs?.quickbooks_desktop_export_account_credit === CONST.COMPANY_CARDS.DEFAULT_EXPORT_TYPE || - (defaultAccount && !companyCard?.nameValuePairs?.quickbooks_desktop_export_account_credit) - ); - title = isDefaultTitle ? defaultCard : selectedAccount?.name; + !companyCard?.nameValuePairs?.quickbooks_desktop_export_account_credit; + title = isDefaultTitle ? defaultLabel : selectedAccount?.name; exportType = CONST.COMPANY_CARDS.EXPORT_CARD_TYPES.NVP_QUICKBOOKS_DESKTOP_EXPORT_ACCOUNT_CREDIT; break; } @@ -339,7 +349,7 @@ function getExportMenuItem( data = []; } - const resultData = data.length > 0 ? [defaultMenuItem, ...data] : data; + const resultData = data.length > 0 ? [defaultLabelMenuItem, ...data] : data; return { description, @@ -351,7 +361,7 @@ function getExportMenuItem( value: card.id, text: card.name, keyForList: card.name, - isSelected: isDefaultTitle ? card.name === defaultCard : card.id === selectedAccount?.id, + isSelected: isDefaultTitle ? card.name === defaultLabel : card.id === selectedAccount?.id, })), }; } diff --git a/tests/unit/CompanyCardExportTest.ts b/tests/unit/CompanyCardExportTest.ts index 613df9e5164b..83bacad4c447 100644 --- a/tests/unit/CompanyCardExportTest.ts +++ b/tests/unit/CompanyCardExportTest.ts @@ -120,6 +120,40 @@ describe('getExportMenuItem - QBD credit card account resolution', () => { expect(result?.title).toBe(defaultCard); }); + it('shows the default label even when no workspace default account is configured', () => { + const policy = createQBDPolicy({ + connections: { + quickbooksDesktop: { + config: { + export: { + nonReimbursable: CONST.QUICKBOOKS_DESKTOP_NON_REIMBURSABLE_EXPORT_ACCOUNT_TYPE.CREDIT_CARD, + nonReimbursableAccount: '', + reimbursable: CONST.QUICKBOOKS_DESKTOP_REIMBURSABLE_ACCOUNT_TYPE.CHECK, + reimbursableAccount: '', + exportDate: CONST.QUICKBOOKS_EXPORT_DATE.LAST_EXPENSE, + nonReimbursableBillDefaultVendor: '', + accountingMethod: 'accrual', + }, + }, + data: { + creditCardAccounts: QBD_CREDIT_CARD_ACCOUNTS, + }, + }, + }, + } as unknown as Partial); + const card = createCard(); + + const result = getExportMenuItem(CONST.POLICY.CONNECTIONS.NAME.QBD, MOCK_POLICY_ID, translate, policy, card); + + expect(result).toBeDefined(); + + const defaultCard = translateLocal('workspace.moreFeatures.companyCards.defaultCard'); + expect(result?.title).toBe(defaultCard); + + const selectedOption = result?.data?.find((item) => item.isSelected); + expect(selectedOption?.text).toBe(defaultCard); + }); + it('uses card.id (not card.name) as the option value for all items', () => { const policy = createQBDPolicy(); const card = createCard('80000103-1746639410'); From 78d829c67fca4e87d872d35f1dbe67d6395d27ad Mon Sep 17 00:00:00 2001 From: "Fitsum Abebe (via MelvinBot)" Date: Wed, 10 Jun 2026 13:08:50 +0000 Subject: [PATCH 6/7] Fix lint: remove extra unsafe type assertion in CompanyCardExportTest Co-authored-by: Fitsum Abebe --- tests/unit/CompanyCardExportTest.ts | 25 +++---------------------- 1 file changed, 3 insertions(+), 22 deletions(-) diff --git a/tests/unit/CompanyCardExportTest.ts b/tests/unit/CompanyCardExportTest.ts index 83bacad4c447..04549004d368 100644 --- a/tests/unit/CompanyCardExportTest.ts +++ b/tests/unit/CompanyCardExportTest.ts @@ -11,7 +11,7 @@ const QBD_CREDIT_CARD_ACCOUNTS = [ {id: '80000104-1746639411', name: 'Visa Business (92000)', currency: 'USD'}, ]; -function createQBDPolicy(overrides?: Partial): Policy { +function createQBDPolicy(overrides?: Partial, nonReimbursableAccount = '80000103-1746639410'): Policy { return { id: MOCK_POLICY_ID, name: 'Test Policy', @@ -26,7 +26,7 @@ function createQBDPolicy(overrides?: Partial): Policy { config: { export: { nonReimbursable: CONST.QUICKBOOKS_DESKTOP_NON_REIMBURSABLE_EXPORT_ACCOUNT_TYPE.CREDIT_CARD, - nonReimbursableAccount: '80000103-1746639410', + nonReimbursableAccount, reimbursable: CONST.QUICKBOOKS_DESKTOP_REIMBURSABLE_ACCOUNT_TYPE.CHECK, reimbursableAccount: '', exportDate: CONST.QUICKBOOKS_EXPORT_DATE.LAST_EXPENSE, @@ -121,26 +121,7 @@ describe('getExportMenuItem - QBD credit card account resolution', () => { }); it('shows the default label even when no workspace default account is configured', () => { - const policy = createQBDPolicy({ - connections: { - quickbooksDesktop: { - config: { - export: { - nonReimbursable: CONST.QUICKBOOKS_DESKTOP_NON_REIMBURSABLE_EXPORT_ACCOUNT_TYPE.CREDIT_CARD, - nonReimbursableAccount: '', - reimbursable: CONST.QUICKBOOKS_DESKTOP_REIMBURSABLE_ACCOUNT_TYPE.CHECK, - reimbursableAccount: '', - exportDate: CONST.QUICKBOOKS_EXPORT_DATE.LAST_EXPENSE, - nonReimbursableBillDefaultVendor: '', - accountingMethod: 'accrual', - }, - }, - data: { - creditCardAccounts: QBD_CREDIT_CARD_ACCOUNTS, - }, - }, - }, - } as unknown as Partial); + const policy = createQBDPolicy(undefined, ''); const card = createCard(); const result = getExportMenuItem(CONST.POLICY.CONNECTIONS.NAME.QBD, MOCK_POLICY_ID, translate, policy, card); From b4020209b487555a8816b8809c068e351afcd541 Mon Sep 17 00:00:00 2001 From: "Fitsum Abebe (via MelvinBot)" Date: Thu, 11 Jun 2026 12:36:32 +0000 Subject: [PATCH 7/7] Use bank account copy without Xero for company card export description Co-authored-by: Fitsum Abebe --- src/languages/de.ts | 1 + src/languages/en.ts | 1 + src/languages/es.ts | 1 + src/languages/fr.ts | 1 + src/languages/it.ts | 1 + src/languages/ja.ts | 1 + src/languages/nl.ts | 1 + src/languages/pl.ts | 1 + src/languages/pt-BR.ts | 1 + src/languages/zh-hans.ts | 1 + src/pages/workspace/companyCards/utils.tsx | 2 +- 11 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/languages/de.ts b/src/languages/de.ts index 1bb172a31b87..18bed9703d72 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -4801,6 +4801,7 @@ ${amount} für ${merchant} – ${date}`, bankTransactions: 'Banktransaktionen', travelInvoicingDescription: 'Reisekosten werden als Banktransaktionen auf das unten angegebene Xero-Konto exportiert.', xeroBankAccount: 'Xero-Bankkonto', + bankAccount: 'Bankkonto', xeroBankAccountDescription: 'Wählen Sie, wo Spesen als Banktransaktionen verbucht werden.', exportExpensesDescription: 'Berichte werden als Einkaufsrechnung mit dem unten ausgewählten Datum und Status exportiert.', purchaseBillDate: 'Rechnungsdatum des Einkaufs', diff --git a/src/languages/en.ts b/src/languages/en.ts index bc19bcc86904..829c3e087683 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -4893,6 +4893,7 @@ const translations = { bankTransactions: 'Bank transactions', travelInvoicingDescription: 'Travel expenses will export as bank transactions to the Xero account specified below.', xeroBankAccount: 'Xero bank account', + bankAccount: 'Bank account', xeroBankAccountDescription: 'Choose where expenses will post as bank transactions.', exportExpensesDescription: 'Reports will export as a purchase bill with the date and status selected below.', purchaseBillDate: 'Purchase bill date', diff --git a/src/languages/es.ts b/src/languages/es.ts index 347d60fcbbdb..959b7f00998b 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -4689,6 +4689,7 @@ ${amount} para ${merchant} - ${date}`, bankTransactions: 'Transacciones bancarias', travelInvoicingDescription: 'Los gastos de viaje se exportarán como transacciones bancarias a la cuenta de Xero especificada a continuación.', xeroBankAccount: 'Cuenta bancaria de Xero', + bankAccount: 'Cuenta bancaria', xeroBankAccountDescription: 'Elige dónde se contabilizarán los gastos como transacciones bancarias.', exportExpensesDescription: 'Los informes se exportarán como una factura de compra utilizando la fecha y el estado que seleccione a continuación', purchaseBillDate: 'Fecha de la factura de compra', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index 21d74e502ae9..e2e9fea26663 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -4814,6 +4814,7 @@ ${amount} pour ${merchant} - ${date}`, bankTransactions: 'Transactions bancaires', travelInvoicingDescription: 'Les frais de voyage seront exportés sous forme de transactions bancaires vers le compte Xero indiqué ci-dessous.', xeroBankAccount: 'Compte bancaire Xero', + bankAccount: 'Compte bancaire', xeroBankAccountDescription: 'Choisissez où les dépenses seront enregistrées comme transactions bancaires.', exportExpensesDescription: 'Les notes de frais seront exportées sous forme de facture d’achat avec la date et le statut sélectionnés ci-dessous.', purchaseBillDate: 'Date de facture d’achat', diff --git a/src/languages/it.ts b/src/languages/it.ts index 92b897af957e..3d95991e827e 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -4786,6 +4786,7 @@ ${amount} per ${merchant} - ${date}`, bankTransactions: 'Transazioni bancarie', travelInvoicingDescription: 'Le spese di viaggio verranno esportate come transazioni bancarie nel conto Xero specificato di seguito.', xeroBankAccount: 'Conto bancario Xero', + bankAccount: 'Conto bancario', xeroBankAccountDescription: 'Scegli dove registrare le spese come transazioni bancarie.', exportExpensesDescription: 'I report verranno esportati come note di acquisto con la data e lo stato selezionati di seguito.', purchaseBillDate: 'Data fattura di acquisto', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index 8312591675a5..1c0e04ff151b 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -4747,6 +4747,7 @@ ${integrationName === CONST.ONBOARDING_ACCOUNTING_MAPPING.other ? 'あなたの' bankTransactions: '銀行取引', travelInvoicingDescription: '旅費は、以下で指定したXeroアカウントに銀行取引としてエクスポートされます。', xeroBankAccount: 'Xero 銀行口座', + bankAccount: '銀行口座', xeroBankAccountDescription: '経費を銀行取引として計上する先を選択してください。', exportExpensesDescription: 'レポートは、以下で選択された日付とステータスで仕入請求書としてエクスポートされます。', purchaseBillDate: '仕入請求書の日付', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index 89905b4e986b..875c399768e3 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -4776,6 +4776,7 @@ ${amount} voor ${merchant} - ${date}`, bankTransactions: 'Banktransacties', travelInvoicingDescription: 'Reiskosten worden als banktransacties geëxporteerd naar het hieronder opgegeven Xero-account.', xeroBankAccount: 'Xero-bankrekening', + bankAccount: 'Bankrekening', xeroBankAccountDescription: 'Kies waar onkosten als banktransacties worden geboekt.', exportExpensesDescription: 'Rapporten worden geëxporteerd als een inkoopfactuur met de datum en status die hieronder zijn geselecteerd.', purchaseBillDate: 'Aankoopfactuurdatum', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index d70f29c0eb3f..245c1ae8e945 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -4767,6 +4767,7 @@ ${amount} dla ${merchant} - ${date}`, bankTransactions: 'Transakcje bankowe', travelInvoicingDescription: 'Wydatki na podróże zostaną wyeksportowane jako transakcje bankowe na konto Xero wskazane poniżej.', xeroBankAccount: 'Konto bankowe Xero', + bankAccount: 'Konto bankowe', xeroBankAccountDescription: 'Wybierz, gdzie wydatki będą księgowane jako transakcje bankowe.', exportExpensesDescription: 'Raporty zostaną wyeksportowane jako rachunek zakupu z datą i statusem wybranymi poniżej.', purchaseBillDate: 'Data rachunku zakupu', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index b064171ee14d..09c7031cbdfa 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -4771,6 +4771,7 @@ ${amount} para ${merchant} - ${date}`, bankTransactions: 'Transações bancárias', travelInvoicingDescription: 'As despesas de viagem serão exportadas como transações bancárias para a conta do Xero especificada abaixo.', xeroBankAccount: 'Conta bancária Xero', + bankAccount: 'Conta bancária', xeroBankAccountDescription: 'Escolha onde as despesas serão lançadas como transações bancárias.', exportExpensesDescription: 'Os relatórios serão exportados como uma conta de compra com a data e o status selecionados abaixo.', purchaseBillDate: 'Data da fatura de compra', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 35034750152d..b3e8f38d8dc3 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -4661,6 +4661,7 @@ ${amount},商户:${merchant} - 日期:${date}`, bankTransactions: '银行交易', travelInvoicingDescription: '差旅费用将作为银行交易导出到下面指定的 Xero 账户。', xeroBankAccount: 'Xero 银行账户', + bankAccount: '银行账户', xeroBankAccountDescription: '选择报销费用将作为银行交易入账的位置。', exportExpensesDescription: '报表将按照在下方选择的日期和状态导出为采购账单。', purchaseBillDate: '采购账单日期', diff --git a/src/pages/workspace/companyCards/utils.tsx b/src/pages/workspace/companyCards/utils.tsx index aec8600b345b..6d6c515fdd4c 100644 --- a/src/pages/workspace/companyCards/utils.tsx +++ b/src/pages/workspace/companyCards/utils.tsx @@ -137,7 +137,7 @@ function getExportMenuItem( }; } case CONST.POLICY.CONNECTIONS.NAME.XERO: { - const type = translate('workspace.xero.xeroBankAccount'); + const type = translate('workspace.xero.bankAccount'); const description = currentConnectionName && type ? translate('workspace.moreFeatures.companyCards.integrationExport', currentConnectionName, type) : undefined; const exportType = CONST.COMPANY_CARDS.EXPORT_CARD_TYPES.NVP_XERO_EXPORT_BANK_ACCOUNT; const defaultExportAccount = exportConfiguration?.nonReimbursableAccount;