Skip to content

Sage Intacct: Default vendor as navigable arrow row with updated copy#97016

Draft
MelvinBot wants to merge 7 commits into
mainfrom
claude-sageIntacctDefaultVendorRow
Draft

Sage Intacct: Default vendor as navigable arrow row with updated copy#97016
MelvinBot wants to merge 7 commits into
mainfrom
claude-sageIntacctDefaultVendorRow

Conversation

@MelvinBot

Copy link
Copy Markdown
Contributor

Explanation of Change

Design feedback on the Sage Intacct connection's Workspaces > Accounting > Export > Export company card expenses as page: the Default vendor row for the credit-card-charge (non-reimbursable) export path shipped as a toggle that revealed a nested select row inside an accordion. Per the approved plan, this reshapes it into a single, always-visible navigable arrow row.

What changed:

  • Row type — In SageIntacctNonReimbursableExpensesPage.tsx, the ToggleSettingOptionRow + Accordion machinery for the default vendor was removed and replaced with a plain MenuItemWithTopDescription arrow row that navigates directly to the existing default-vendor select page (POLICY_ACCOUNTING_SAGE_INTACCT_DEFAULT_VENDOR). The now-dead toggle/accordion render branches, useAccordionAnimation, and the updateSageIntacctDefaultVendor/clearSageIntacctErrorField/getLatestErrorField imports were dropped.
  • Empty default — Per the confirmed decision on the issue, the vendor now starts empty (not set) instead of seeding the first vendor when the toggle was enabled. When no vendor is chosen, the row title shows "Not set" so admins pick explicitly. New defaultVendorNotSet string added to en.ts/es.ts.
  • Copy — The subtitle now reads Expenses that can't be matched to your Sage Intacct vendors will default to this vendor. It's wired through a muted helperText below the row (only on the credit-card-charge path) via a new helperText field on MenuItemToRender. defaultVendorDescription kept its (isReimbursable) signature (the reimbursable page still uses true); only the non-reimbursable branch text changed, in both en.ts and es.ts.

Behavior preserved: the row stays hidden until a non-reimbursable export type is chosen; the VENDOR_BILL path continues to render its existing arrow row (no subtitle); the vendor list source is unchanged; no Auth/PHP changes.

Fixed Issues

$ https://github.com/Expensify/Expensify/issues/664271
PROPOSAL: https://github.com/Expensify/Expensify/issues/664271#issuecomment-5075633547

Tests

// TODO: The human co-author must fill out the tests you ran before marking this PR as "ready for review". Suggested steps: on a Sage Intacct workspace, set non-reimbursable export = Credit card charge; verify the Default vendor row renders as an arrow row (not a toggle) showing "Not set" with the subtitle Expenses that can't be matched to your Sage Intacct vendors will default to this vendor.; tap it, pick a vendor, and verify the selection persists and shows in the row title; clear it and verify it round-trips back to "Not set" — on web + mobile.

  • Verify that no errors appear in the JS console

Offline tests

QA Steps

// TODO: The human co-author must fill out the QA tests before marking this PR as "ready for review", or the issue title must include "[No QA]."

  • Verify that no errors appear in the JS console

PR Author Checklist

  • I linked the correct issue in the ### Fixed Issues section above
  • I wrote clear testing steps that cover the changes made in this PR
    • I added steps for local testing in the Tests section
    • I added steps for the expected offline behavior in the Offline steps section
    • I added steps for Staging and/or Production testing in the QA steps section
    • I added steps to cover failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
    • I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
    • I tested this PR with a High Traffic account against the staging or production API to ensure there are no regressions (e.g. long loading states that impact usability).
  • I included screenshots or videos for tests on all platforms
  • I ran the tests on all platforms & verified they passed on:
    • Android: Native
    • Android: mWeb Chrome
    • iOS: Native
    • iOS: mWeb Safari
    • MacOS: Chrome / Safari
  • I verified there are no console errors (if there's a console error not related to the PR, report it or open an issue for it to be fixed)
  • I followed proper code patterns (see Reviewing the code)
    • I verified that comments were added to code that is not self explanatory
    • I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
    • I verified any copy / text that was added to the app is grammatically correct in English. It adheres to proper capitalization guidelines (note: only the first word of header/labels should be capitalized), and is either coming verbatim from figma or has been approved by marketing (in order to get marketing approval, ask the Bug Zero team member to add the Waiting for copy label to the issue)
  • If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
  • I followed the guidelines as stated in the Review Guidelines
  • I tested other components that can be impacted by my changes (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar are working as expected)
  • If a new CSS style is added I verified that:
    • A similar style doesn't already exist
    • The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))
  • If new assets were added or existing ones were modified, I verified that:
    • The assets are optimized and compressed (for SVG files, run npm run compress-svg)
    • The assets load correctly across all supported platforms.
  • If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
  • If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
  • If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
  • If the PR modifies a component or page that can be accessed by a direct deeplink, I verified that the code functions as expected when the deeplink is used - from a logged in and logged out account.
  • If the PR modifies the UI (e.g. new buttons, new UI components, changing the padding/spacing/sizing, moving components, etc) or modifies the form input styles:
    • I verified that all the inputs inside a form are aligned with each other.
    • I added Design label and/or tagged @Expensify/design so the design team can review the changes.
  • I added unit tests for any new feature or bug fix in this PR to help automatically prevent regressions in this user flow.
  • If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.

Screenshots/Videos

Android: Native
Android: mWeb Chrome
iOS: Native
iOS: mWeb Safari
MacOS: Chrome / Safari

…copy

Co-authored-by: Alex Beaman <Beamanator@users.noreply.github.com>
@MelvinBot
MelvinBot requested a review from a team July 25, 2026 00:05
@OSBotify

This comment has been minimized.

@Beamanator

Copy link
Copy Markdown
Contributor

@MelvinBot apply the polyglot parrot fix

@codecov

codecov Bot commented Jul 25, 2026

Copy link
Copy Markdown

Codecov Report

✅ Changes either increased or maintained existing code coverage, great job!

Files with missing lines Coverage Δ
...cct/export/DynamicSageIntacctDefaultVendorPage.tsx 0.00% <0.00%> (ø)
.../export/SageIntacctNonReimbursableExpensesPage.tsx 0.00% <0.00%> (ø)
... and 7 files with indirect coverage changes

Co-authored-by: Alex Beaman <Beamanator@users.noreply.github.com>
@MelvinBot

Copy link
Copy Markdown
Contributor Author

Fixed the failing typecheck check and pushed to this branch (316fc02).

Root cause: The PR added the defaultVendorNotSet string to en.ts and es.ts, but not to the other 8 language files. TranslationDeepObject requires every locale to define the same keys, so tsc failed with TS2741: Property 'defaultVendorNotSet' is missing in de, fr, it, ja, nl, pl, pt-BR, and zh-hans.

Fix: Added defaultVendorNotSet (the localized equivalent of "Not set", reusing each file's existing notSet translation) to all 8 files, placed right after the Sage Intacct defaultVendor key to mirror en.ts. Verified locally with npm run typecheck-tsgo (passes) and ran npm run fmt.

The checklist check (PR Author Checklist) is still red, but that's the human-only checklist — it stays failing until the co-author fills out the boxes and test steps, so it's expected and not something I fix.

Co-authored-by: Alex Beaman <Beamanator@users.noreply.github.com>
@MelvinBot

Copy link
Copy Markdown
Contributor Author

🦜 Applied the Polyglot Parrot translations in 1dacbf0bb61.

The only remaining un-applied part of the parrot patch was the defaultVendorDescription rewrite (single-template → two-branch form with the corrected reimbursable/non-reimbursable copy) across de, es, fr, it, ja, nl, pl, pt-BR, zh-hans, plus a couple of es corrections (Sin establecerNo establecido and the two description branches).

I intentionally skipped the patch's defaultVendorNotSet additions — those keys were already added (with identical values) in 316fc02, so re-applying them would have created duplicate keys. Verified each language file still has exactly one defaultVendorNotSet.

Note: npm run prettier/typecheck/lint are gated in this environment and couldn't be run locally, but the edits reproduce the parrot bot's already-formatted output verbatim, so CI checks should validate them.

@MelvinBot

Copy link
Copy Markdown
Contributor Author

The only failing check is PR Author Checklist / checklist, and there's nothing in the code to fix — every code-quality check is green.

Why it's failing: the check reports 0 out of 38 checklist items completed. It's a static check that just verifies the boxes in the PR body are ticked; it fails until they are.

Why I'm not "fixing" it by pushing: the PR Author Checklist boxes attest to manual testing (running the flow on all platforms, verifying no console errors, etc.) that a human must actually perform and confirm. The PR body still has the // TODO: The human co-author must fill out... placeholders for the Tests and QA Steps sections. It would be wrong for me to auto-tick them, so this is on you (Beamanator) to complete before marking the PR ready for review.

Check results at time of analysis

All code-related checks passed:

  • typecheck
  • ESLint check ✅ · Oxfmt check ✅ · Compare knip issues against main
  • test (jobs 1–8)
  • build (…) (all variants) ✅
  • React Compiler Compliance, Storybook tests, Bun tests, spellcheck, generateTranslations

Only PR Author Checklist / checklist is fail; baseline-perf-tests / branch-perf-tests were still running (informational, not code-correctness).

Next steps: fill out the Tests/QA Steps sections and tick the PR Author Checklist boxes, then re-run the check — it'll pass.

@MelvinBot

Copy link
Copy Markdown
Contributor Author

Re-checked — the state is unchanged. The only failing check is still PR Author Checklist / checklist, which fails solely because the checklist boxes in the PR body aren't ticked. Every code-quality check is passing (typecheck, ESLint, Oxfmt, knip, all 8 test jobs, all builds, Storybook, Bun/spellcheck/translations, and the perf tests).

There's nothing for me to fix in code, and I won't tick the author-checklist boxes on your behalf — they attest to manual cross-platform testing you (Beamanator) must perform, and the PR body still has the // TODO: The human co-author must fill out... placeholders in the Tests/QA sections.

To clear this check: fill out the Tests/QA Steps sections and tick the PR Author Checklist boxes — the check re-runs on edit and will pass.

@Beamanator

Copy link
Copy Markdown
Contributor

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. 👍

Reviewed commit: 1dacbf0bb6

ℹ️ 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".

@MelvinBot

Copy link
Copy Markdown
Contributor Author

Re-checked after the main merge (70a2c90) re-ran CI — same conclusion: there's no code fix to push. Every code-quality check is green again (typecheck, spellcheck, ESLint, Oxfmt, knip, all 8 test jobs, all build variants, Storybook, React Compiler, generateTranslations).

The only failing check is PR Author Checklist / checklist, which fails purely because the 38 author-checklist boxes in the PR body aren't ticked (0 out of 38 completed). That's a human step — the boxes attest to manual cross-platform testing, and the body still has the // TODO: The human co-author must fill out... placeholders in the Tests and QA Steps sections. I won't auto-tick those.

Next step (yours): fill out the Tests/QA Steps sections, tick the PR Author Checklist boxes, and the check will pass. (baseline-perf-tests / branch-perf-tests were still running — informational, not code-correctness.)

Introduce two connection-agnostic strings under `workspace.accounting`:
- `defaultVendorHelperText({connectionName, isSet})` for the muted description below the "Default vendor" row on export pages.
- `defaultVendorSelectHeader({connectionName})` for the "Choose a default … vendor" header above the vendor select list.

Both take the integration display name as a parameter so QBO, Sage Intacct, Xero, etc. can share the copy while rendering their own name.
- Non-reimbursable default vendor row no longer falls back to a "Not set" title. When no vendor is picked, the row title is empty and the muted helper text carries the meaning.
- The helper text below the row now reads: "Expenses that don't auto-match will default to this Sage Intacct vendor." When no vendor is set, it appends "Otherwise, they'll export as Credit Card Misc." so admins understand the fallback behavior.
- The default vendor select page header (non-reimbursable path) now reads "Choose a default Sage Intacct vendor for expenses that don't match automatically." The reimbursable-path header is unchanged.

Both new strings live under `workspace.accounting` and receive the connection display name as a parameter, so QBO and Xero can reuse them later. Removes the now-unused `defaultVendorNotSet` key from all language files.
@OSBotify

Copy link
Copy Markdown
Contributor

🦜 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 diff
diff --git a/src/languages/de.ts b/src/languages/de.ts
index d4529463136..93de4f1d531 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -5071,8 +5071,8 @@ ${amount} für ${merchant} – ${date}`,
             defaultVendor: 'Standardanbieter',
             defaultVendorDescription: (isReimbursable: boolean) =>
                 isReimbursable
-                    ? `Legen Sie einen Standardlieferanten fest, der auf erstattungsfähige Ausgaben angewendet wird, für die kein übereinstimmender Lieferant in Sage Intacct vorhanden ist.`
-                    : `Spesen, die keinen Ihrer Sage Intacct-Lieferanten zugeordnet werden können, werden standardmäßig diesem Lieferanten zugeordnet.`,
+                    ? `Legen Sie einen Standardlieferanten fest, der auf erstattungsfähige Ausgaben angewendet wird, für die es in Sage Intacct keinen passenden Lieferanten gibt.`
+                    : `Ausgaben, die nicht mit Ihren Sage Intacct-Lieferanten abgeglichen werden können, werden standardmäßig diesem Lieferanten zugeordnet.`,
             exportDescription: 'Konfigurieren Sie, wie Expensify Daten nach Sage Intacct exportiert.',
             exportPreferredExporterNote:
                 'Der bevorzugte Exporteur kann jede Workspace-Adminperson sein, muss jedoch auch Domain-Admin sein, wenn du in den Domaineinstellungen unterschiedliche Exportkonten für einzelne Firmenkarten festlegst.',
@@ -6969,9 +6969,10 @@ Der Control-Tarif beginnt bei 9 $ pro aktivem Mitglied und Monat.`,
             defaultVendor: 'Standardanbieter',
             defaultVendorHelperText: ({connectionName, isSet}: ConnectionDefaultVendorHelperTextParams) =>
                 isSet
-                    ? `Expenses that don't auto-match will default to this ${connectionName} vendor.`
-                    : `Expenses that don't auto-match will default to this ${connectionName} vendor. Otherwise, they'll export as Credit Card Misc.`,
-            defaultVendorSelectHeader: ({connectionName}: ConnectionDisplayNameParams) => `Choose a default ${connectionName} vendor for expenses that don't match automatically.`,
+                    ? `Ausgaben, die nicht automatisch abgeglichen werden, werden standardmäßig diesem ${connectionName}-Lieferanten zugeordnet.`
+                    : `Spesen, die nicht automatisch abgeglichen werden, werden standardmäßig diesem ${connectionName}-Lieferanten zugeordnet. Andernfalls werden sie als „Credit Card Misc.“ exportiert.`,
+            defaultVendorSelectHeader: ({connectionName}: ConnectionDisplayNameParams) =>
+                `Wählen Sie einen Standard-${connectionName}-Anbieter für Ausgaben, die nicht automatisch zugeordnet werden.`,
             defaultAccount: 'Standardkonto',
             autoSync: 'Automatische Synchronisierung',
             autoSyncDescription: 'NetSuite und Expensify automatisch jeden Tag synchronisieren. Finalisierte Berichte in Echtzeit exportieren',
diff --git a/src/languages/es.ts b/src/languages/es.ts
index c8dc6147e71..384b57dc02a 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -4966,7 +4966,7 @@ ${amount} para ${merchant} - ${date}`,
             defaultVendorDescription: (isReimbursable: boolean) =>
                 isReimbursable
                     ? `Establece un proveedor predeterminado que se aplicará a los gastos reembolsables que no tengan un proveedor coincidente en Sage Intacct.`
-                    : `Los gastos que no se puedan asociar con tus proveedores de Sage Intacct se asignarán a este proveedor de forma predeterminada.`,
+                    : `Los gastos que no se puedan asignar a tus proveedores de Sage Intacct se asociarán por defecto a este proveedor.`,
             exportDescription: 'Configure cómo se exportan los datos de Expensify a Sage Intacct.',
             exportPreferredExporterNote:
                 'El exportador preferido puede ser cualquier administrador del área de trabajo, pero también debe ser un administrador del dominio si establece diferentes cuentas de exportación para tarjetas de empresa individuales en Configuración del dominio.',
@@ -6755,9 +6755,10 @@ El plan Controlar empieza en 9 $ por miembro activo al mes.`,
             defaultVendor: 'Proveedor predeterminado',
             defaultVendorHelperText: ({connectionName, isSet}: ConnectionDefaultVendorHelperTextParams) =>
                 isSet
-                    ? `Expenses that don't auto-match will default to this ${connectionName} vendor.`
-                    : `Expenses that don't auto-match will default to this ${connectionName} vendor. Otherwise, they'll export as Credit Card Misc.`,
-            defaultVendorSelectHeader: ({connectionName}: ConnectionDisplayNameParams) => `Choose a default ${connectionName} vendor for expenses that don't match automatically.`,
+                    ? `Los gastos que no se asignen automáticamente se asociarán por defecto a este proveedor de ${connectionName}.`
+                    : `Los gastos que no se concilien automáticamente se asignarán por defecto a este proveedor de ${connectionName}. De lo contrario, se exportarán como Credit Card Misc.`,
+            defaultVendorSelectHeader: ({connectionName}: ConnectionDisplayNameParams) =>
+                `Elige un proveedor predeterminado de ${connectionName} para los gastos que no se asignen automáticamente.`,
             defaultAccount: 'Cuenta predeterminada',
             autoSync: 'Autosincronización',
             autoSyncDescription: 'Sincroniza NetSuite y Expensify automáticamente, todos los días. Exporta el informe finalizado en tiempo real',
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index b7ab143e142..aae1500ef83 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -5081,8 +5081,8 @@ ${amount} pour ${merchant} - ${date}`,
             defaultVendor: 'Fournisseur par défaut',
             defaultVendorDescription: (isReimbursable: boolean) =>
                 isReimbursable
-                    ? `Définissez un fournisseur par défaut qui sera appliqué aux dépenses remboursables n’ayant pas de fournisseur correspondant dans Sage Intacct.`
-                    : `Les dépenses qui ne peuvent pas être rapprochées avec vos fournisseurs Sage Intacct seront, par défaut, associées à ce fournisseur.`,
+                    ? `Définissez un fournisseur par défaut qui s’appliquera aux dépenses remboursables qui n’ont pas de fournisseur correspondant dans Sage Intacct.`
+                    : `Les dépenses qui ne peuvent pas être rapprochées de vos fournisseurs Sage Intacct seront par défaut associées à ce fournisseur.`,
             exportDescription: 'Configurez comment les données Expensify sont exportées vers Sage Intacct.',
             exportPreferredExporterNote:
                 'L’exportateur préféré peut être n’importe quel administrateur d’espace de travail, mais doit également être un administrateur de domaine si vous définissez des comptes d’exportation différents pour chaque carte d’entreprise individuelle dans les paramètres de domaine.',
@@ -6996,9 +6996,10 @@ Le forfait Control commence à 9 $ par Membre actif et par mois.`,
             defaultVendor: 'Fournisseur par défaut',
             defaultVendorHelperText: ({connectionName, isSet}: ConnectionDefaultVendorHelperTextParams) =>
                 isSet
-                    ? `Expenses that don't auto-match will default to this ${connectionName} vendor.`
-                    : `Expenses that don't auto-match will default to this ${connectionName} vendor. Otherwise, they'll export as Credit Card Misc.`,
-            defaultVendorSelectHeader: ({connectionName}: ConnectionDisplayNameParams) => `Choose a default ${connectionName} vendor for expenses that don't match automatically.`,
+                    ? `Les dépenses qui ne sont pas associées automatiquement seront par défaut rattachées à ce fournisseur ${connectionName}.`
+                    : `Les dépenses qui ne sont pas appariées automatiquement seront par défaut associées à ce fournisseur ${connectionName}. Sinon, elles seront exportées en tant que « Credit Card Misc ».`,
+            defaultVendorSelectHeader: ({connectionName}: ConnectionDisplayNameParams) =>
+                `Choisissez un fournisseur ${connectionName} par défaut pour les dépenses qui ne correspondent pas automatiquement.`,
             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',
diff --git a/src/languages/it.ts b/src/languages/it.ts
index caeef78d8fd..28d48d7bc00 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -5051,7 +5051,7 @@ ${amount} per ${merchant} - ${date}`,
             defaultVendorDescription: (isReimbursable: boolean) =>
                 isReimbursable
                     ? `Imposta un fornitore predefinito che verrà applicato alle spese rimborsabili che non hanno un fornitore corrispondente in Sage Intacct.`
-                    : `Le spese che non possono essere abbinate ai tuoi fornitori Sage Intacct verranno associate per impostazione predefinita a questo fornitore.`,
+                    : `Le spese che non possono essere abbinate ai tuoi fornitori Sage Intacct verranno assegnate per impostazione predefinita a questo fornitore.`,
             exportDescription: 'Configura come i dati di Expensify vengono esportati in Sage Intacct.',
             exportPreferredExporterNote:
                 'L’esportatore preferito può essere qualsiasi amministratore dello spazio di lavoro, ma deve anche essere un Amministratore del dominio se imposti conti di esportazione diversi per le singole carte aziendali nelle Impostazioni del dominio.',
@@ -6950,9 +6950,10 @@ Il piano Control parte da 9 $ al mese per ogni membro attivo.`,
             defaultVendor: 'Fornitore predefinito',
             defaultVendorHelperText: ({connectionName, isSet}: ConnectionDefaultVendorHelperTextParams) =>
                 isSet
-                    ? `Expenses that don't auto-match will default to this ${connectionName} vendor.`
-                    : `Expenses that don't auto-match will default to this ${connectionName} vendor. Otherwise, they'll export as Credit Card Misc.`,
-            defaultVendorSelectHeader: ({connectionName}: ConnectionDisplayNameParams) => `Choose a default ${connectionName} vendor for expenses that don't match automatically.`,
+                    ? `Le spese che non corrispondono automaticamente verranno associate per impostazione predefinita a questo fornitore ${connectionName}.`
+                    : `Le spese che non vengono abbinate automaticamente verranno associate per impostazione predefinita a questo fornitore ${connectionName}. In caso contrario, verranno esportate come “Credit Card Misc.”.`,
+            defaultVendorSelectHeader: ({connectionName}: ConnectionDisplayNameParams) =>
+                `Scegli un fornitore predefinito ${connectionName} per le spese che non vengono abbinate automaticamente.`,
             defaultAccount: 'Conto predefinito',
             autoSync: 'Sincronizzazione automatica',
             autoSyncDescription: 'Sincronizza automaticamente NetSuite ed Expensify ogni giorno. Esporta i report finalizzati in tempo reale',
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index 621f53c5a06..366a29671cf 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -5007,7 +5007,7 @@ ${integrationName === CONST.ONBOARDING_ACCOUNTING_MAPPING.other ? 'あなたの'
             defaultVendor: 'デフォルトのベンダー',
             defaultVendorDescription: (isReimbursable: boolean) =>
                 isReimbursable
-                    ? `Sage Intacct で一致する取引先がない経費精算対象の経費に適用する、デフォルトの取引先を設定します。`
+                    ? `Sage Intacct で一致する取引先がない立替経費に適用する、デフォルトの取引先を設定します。`
                     : `Sage Intacct のベンダーに照合できない経費は、デフォルトでこのベンダーに割り当てられます。`,
             exportDescription: 'Expensify のデータを Sage Intacct へエクスポートする方法を設定します。',
             exportPreferredExporterNote:
@@ -6872,9 +6872,9 @@ Control プランは、アクティブメンバー1人あたり月額 $9 から
             defaultVendor: 'デフォルトのベンダー',
             defaultVendorHelperText: ({connectionName, isSet}: ConnectionDefaultVendorHelperTextParams) =>
                 isSet
-                    ? `Expenses that don't auto-match will default to this ${connectionName} vendor.`
-                    : `Expenses that don't auto-match will default to this ${connectionName} vendor. Otherwise, they'll export as Credit Card Misc.`,
-            defaultVendorSelectHeader: ({connectionName}: ConnectionDisplayNameParams) => `Choose a default ${connectionName} vendor for expenses that don't match automatically.`,
+                    ? `自動照合されない経費は、デフォルトでこの ${connectionName} のベンダーに紐づきます。`
+                    : `自動照合されない経費は、デフォルトでこの ${connectionName} の仕入先として処理されます。照合される場合は、「Credit Card Misc」としてエクスポートされます。`,
+            defaultVendorSelectHeader: ({connectionName}: ConnectionDisplayNameParams) => `自動的に照合されない経費に対して使用する、デフォルトの ${connectionName} 仕入先を選択します。`,
             defaultAccount: 'デフォルトのアカウント',
             autoSync: '自動同期',
             autoSyncDescription: 'NetSuite と Expensify を毎日自動で同期。確定したレポートをリアルタイムでエクスポート',
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index d361141298b..034f882f95c 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -5044,8 +5044,8 @@ ${amount} voor ${merchant} - ${date}`,
             defaultVendor: 'Standaardleverancier',
             defaultVendorDescription: (isReimbursable: boolean) =>
                 isReimbursable
-                    ? `Stel een standaardleverancier in die wordt toegepast op vergoedbare uitgaven waarvoor geen overeenkomende leverancier in Sage Intacct bestaat.`
-                    : `Declaraties die niet gekoppeld kunnen worden aan je Sage Intacct-leveranciers, worden standaard aan deze leverancier toegewezen.`,
+                    ? `Stel een standaardleverancier in die wordt toegepast op declarabele uitgaven waarvoor geen overeenkomende leverancier in Sage Intacct is.`
+                    : `Uitgaven die niet kunnen worden gekoppeld aan je Sage Intacct-leveranciers, worden standaard aan deze leverancier toegewezen.`,
             exportDescription: 'Configureer hoe Expensify-gegevens worden geëxporteerd naar Sage Intacct.',
             exportPreferredExporterNote:
                 'De voorkeurs-exporteur kan elke werkruimtebeheerder zijn, maar moet ook een domeinbeheerder zijn als je in Domeininstellingen verschillende exportrekeningen instelt voor individuele bedrijfskaarten.',
@@ -6936,9 +6936,10 @@ Het Control-abonnement begint bij $9 per actieve deelnemer per maand.`,
             defaultVendor: 'Standaardleverancier',
             defaultVendorHelperText: ({connectionName, isSet}: ConnectionDefaultVendorHelperTextParams) =>
                 isSet
-                    ? `Expenses that don't auto-match will default to this ${connectionName} vendor.`
-                    : `Expenses that don't auto-match will default to this ${connectionName} vendor. Otherwise, they'll export as Credit Card Misc.`,
-            defaultVendorSelectHeader: ({connectionName}: ConnectionDisplayNameParams) => `Choose a default ${connectionName} vendor for expenses that don't match automatically.`,
+                    ? `Declaraties die niet automatisch worden gematcht, worden standaard aan deze ${connectionName}-leverancier gekoppeld.`
+                    : `Declaraties die niet automatisch worden gekoppeld, worden standaard aan deze ${connectionName}-leverancier toegewezen. Anders worden ze geëxporteerd als Credit Card Misc.`,
+            defaultVendorSelectHeader: ({connectionName}: ConnectionDisplayNameParams) =>
+                `Kies een standaard ${connectionName}-leverancier voor onkosten die niet automatisch worden gekoppeld.`,
             defaultAccount: 'Standaardrekening',
             autoSync: 'Automatisch synchroniseren',
             autoSyncDescription: 'Synchroniseer NetSuite en Expensify automatisch, elke dag. Exporteer een afgerond rapport in realtime',
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index dfb872d780e..56b1ae69aac 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -5030,8 +5030,8 @@ ${amount} dla ${merchant} - ${date}`,
             defaultVendor: 'Domyślny dostawca',
             defaultVendorDescription: (isReimbursable: boolean) =>
                 isReimbursable
-                    ? `Ustaw domyślnego kontrahenta, który będzie stosowany do wydatków podlegających zwrotowi, nieposiadających pasującego kontrahenta w Sage Intacct.`
-                    : `Wydatki, których nie da się dopasować do Twoich dostawców Sage Intacct, zostaną domyślnie przypisane do tego dostawcy.`,
+                    ? `Ustaw domyślnego dostawcę, który zostanie zastosowany do wydatków podlegających zwrotowi, nieposiadających pasującego dostawcy w Sage Intacct.`
+                    : `Wydatki, których nie da się dopasować do twoich dostawców w Sage Intacct, zostaną domyślnie przypisane do tego dostawcy.`,
             exportDescription: 'Skonfiguruj sposób eksportu danych z Expensify do Sage Intacct.',
             exportPreferredExporterNote:
                 'Preferowanym eksporterem może być dowolny administrator przestrzeni roboczej, ale musi on również być administratorem domeny, jeśli w Ustawieniach domeny ustawisz różne konta eksportu dla poszczególnych kart firmowych.',
@@ -6917,9 +6917,10 @@ Plan Control zaczyna się od 9 USD za aktywnego członka miesięcznie.`,
             defaultVendor: 'Domyślny dostawca',
             defaultVendorHelperText: ({connectionName, isSet}: ConnectionDefaultVendorHelperTextParams) =>
                 isSet
-                    ? `Expenses that don't auto-match will default to this ${connectionName} vendor.`
-                    : `Expenses that don't auto-match will default to this ${connectionName} vendor. Otherwise, they'll export as Credit Card Misc.`,
-            defaultVendorSelectHeader: ({connectionName}: ConnectionDisplayNameParams) => `Choose a default ${connectionName} vendor for expenses that don't match automatically.`,
+                    ? `Wydatki, które nie zostaną automatycznie dopasowane, domyślnie trafią do tego dostawcy ${connectionName}.`
+                    : `Wydatki, które nie zostaną automatycznie dopasowane, domyślnie trafią do tego dostawcy ${connectionName}. W przeciwnym razie zostaną wyeksportowane jako Credit Card Misc.`,
+            defaultVendorSelectHeader: ({connectionName}: ConnectionDisplayNameParams) =>
+                `Wybierz domyślnego dostawcę ${connectionName} dla wydatków, które nie zostaną dopasowane automatycznie.`,
             defaultAccount: 'Domyślne konto',
             autoSync: 'Automatyczna synchronizacja',
             autoSyncDescription: 'Synchronizuj NetSuite i Expensify automatycznie, każdego dnia. Eksportuj sfinalizowany raport w czasie rzeczywistym',
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index 090e877c704..fb5ea3022e9 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -5037,7 +5037,7 @@ ${amount} para ${merchant} - ${date}`,
             defaultVendorDescription: (isReimbursable: boolean) =>
                 isReimbursable
                     ? `Defina um fornecedor padrão que será aplicado às despesas reembolsáveis que não tiverem um fornecedor correspondente no Sage Intacct.`
-                    : `As despesas que não puderem ser conciliadas com seus fornecedores do Sage Intacct serão atribuídas a este fornecedor por padrão.`,
+                    : `Despesas que não puderem ser correspondidas aos seus fornecedores do Sage Intacct serão atribuídas a este fornecedor por padrão.`,
             exportDescription: 'Configure como os dados do Expensify são exportados para o Sage Intacct.',
             exportPreferredExporterNote:
                 'O exportador preferencial pode ser qualquer administrador do espaço de trabalho, mas também deve ser um Administrador de Domínio se você definir diferentes contas de exportação para cartões corporativos individuais em Configurações de Domínio.',
@@ -6929,9 +6929,10 @@ O plano Control começa em US$ 9 por membro ativo por mês.`,
             defaultVendor: 'Fornecedor padrão',
             defaultVendorHelperText: ({connectionName, isSet}: ConnectionDefaultVendorHelperTextParams) =>
                 isSet
-                    ? `Expenses that don't auto-match will default to this ${connectionName} vendor.`
-                    : `Expenses that don't auto-match will default to this ${connectionName} vendor. Otherwise, they'll export as Credit Card Misc.`,
-            defaultVendorSelectHeader: ({connectionName}: ConnectionDisplayNameParams) => `Choose a default ${connectionName} vendor for expenses that don't match automatically.`,
+                    ? `Despesas que não forem conciliadas automaticamente serão atribuídas por padrão a este fornecedor ${connectionName}.`
+                    : `As despesas que não corresponderem automaticamente serão associadas por padrão a este fornecedor ${connectionName}. Caso contrário, serão exportadas como Credit Card Misc.`,
+            defaultVendorSelectHeader: ({connectionName}: ConnectionDisplayNameParams) =>
+                `Escolha um fornecedor padrão do ${connectionName} para despesas que não forem correspondidas automaticamente.`,
             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',
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index c35c41f6c2d..312f626be92 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -4891,7 +4891,7 @@ ${amount},商户:${merchant} - 日期:${date}`,
             creditCardAccount: '信用卡账户',
             defaultVendor: '默认供应商',
             defaultVendorDescription: (isReimbursable: boolean) =>
-                isReimbursable ? `为报销费用设置一个默认供应商,用于在 Sage Intacct 中找不到匹配供应商的情况。` : `无法与 Sage Intacct 供应商匹配的报销将默认归到此供应商名下。`,
+                isReimbursable ? `为可报销但在 Sage Intacct 中没有匹配供应商的费用设置一个默认供应商。` : `无法匹配到 Sage Intacct 供应商的报销将默认归到此供应商名下。`,
             exportDescription: '配置 Expensify 数据导出到 Sage Intacct 的方式。',
             exportPreferredExporterNote: '首选导出人可以是任意工作区管理员,但如果你在“域设置”中为各个公司卡设置了不同的导出账户,则该导出人还必须是域管理员。',
             exportPreferredExporterSubNote: '设置完成后,首选导出人将在其账户中看到可供导出的报表。',
@@ -6715,10 +6715,8 @@ _如需更详细的说明,请[访问我们的帮助网站](${CONST.NETSUITE_IM
             exportDate: '导出日期',
             defaultVendor: '默认供应商',
             defaultVendorHelperText: ({connectionName, isSet}: ConnectionDefaultVendorHelperTextParams) =>
-                isSet
-                    ? `Expenses that don't auto-match will default to this ${connectionName} vendor.`
-                    : `Expenses that don't auto-match will default to this ${connectionName} vendor. Otherwise, they'll export as Credit Card Misc.`,
-            defaultVendorSelectHeader: ({connectionName}: ConnectionDisplayNameParams) => `Choose a default ${connectionName} vendor for expenses that don't match automatically.`,
+                isSet ? `未自动匹配的报销将默认归入此 ${connectionName} 供应商。` : `未自动匹配的报销将默认归到此 ${connectionName} 供应商。否则,它们将以“Credit Card Misc”导出。`,
+            defaultVendorSelectHeader: ({connectionName}: ConnectionDisplayNameParams) => `为未能自动匹配的报销选择一个默认的 ${connectionName} 供应商。`,
             defaultAccount: '默认账户',
             autoSync: '自动同步',
             autoSyncDescription: '每天自动同步 NetSuite 和 Expensify。实时导出已完成报表',

Note

You can apply these changes to your branch by copying the patch to your clipboard, then running pbpaste | git apply 😉

View workflow run

Squawk! Translates the new defaultVendorHelperText and defaultVendorSelectHeader strings into all supported languages, and refines the existing sageIntacct.defaultVendorDescription translations while we are here.
@MelvinBot

Copy link
Copy Markdown
Contributor Author

Still the same situation — nothing to push. Your latest commit (96ea23b) passed every code check (typecheck, ESLint, Oxfmt, all test jobs, all build variants, knip).

The only red check is PR Author Checklist / checklist, which fails with 0 out of 38 checklist items completed. It's a static check that just verifies the PR Author Checklist boxes are ticked; it stays red until they are, and those boxes attest to manual testing that a human must actually do — so I can't tick them for you.

To make it pass: fill out the Tests / QA Steps sections (still have the // TODO: human co-author placeholders) and check the PR Author Checklist boxes. The check re-evaluates on your next push.

@MelvinBot

Copy link
Copy Markdown
Contributor Author

Re-checked — nothing to fix in code. Every check is green except PR Author Checklist / checklist, which fails only because the checklist boxes aren't ticked (0 out of 38 checklist items). The perf tests that were still running earlier have since passed.

This one's on you (Beamanator): fill out the Tests / QA Steps sections (still showing the // TODO: The human co-author must fill out... placeholders) and check the PR Author Checklist boxes. I can't tick them for you — they attest to manual cross-platform testing a human has to actually do. Once they're checked, the check will pass.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants