[Payment due @Krishna2323] Align QBO and Xero Default vendor rows with the shared Intacct pattern - #99867
Conversation
- QBO card/debit-card export: render the shared two-state default-vendor helper text below the Default vendor row. - QBO Vendor Bill export: replace the legacy toggle + accordion with a single always-visible navigable Default vendor row that opens the existing bill default-vendor selector. Underlying setting values and the Advanced-page autoCreateVendor flow are unchanged. - QBO and Xero default-vendor select pages: render the shared 'Choose a default vendor...' header. - Xero: standardize on 'Default vendor' terminology and add the shared helper text. - workspace.accounting.defaultVendorSelectHeader no longer interpolates the connection name, matching the design-approved copy. - Subscribe the QBO export row to the default-vendor key matching the active export destination; autoCreateVendor stays subscribed under Advanced. Co-authored-by: Alex Beaman <Beamanator@users.noreply.github.com>
This comment has been minimized.
This comment has been minimized.
Codecov Report✅ Changes either increased or maintained existing code coverage, great job!
|
|
There's nothing to fix — no code check is failing. The single failing check is Check independent approval, and it fails on the Everything else on the branch is green, including the two perf jobs that were still running when you asked:
Next step: get a reviewer to approve the PR. Note the body still has the |
Android test: blocked — no accounting integration could be connectedResult: partial (0 of 5 UI steps verified). Every change in this PR lives behind a connected QuickBooks Online, Xero, or Sage Intacct integration. On the Android build I got as far as Workspace → Accounting → Connections for all three, and each hit a different hard gate that needs real third-party credentials:
Also worth flagging: the PR has no test steps.
Evidence (5)Workspace > Accounting > Connections list (QBO, Xero, Sage Intacct all unconnected)
QuickBooks Online Connect opens the real Intuit OAuth sign-in WebView
Xero Connect blocked by the 'Please enable two-factor authentication' gate
Sage Intacct Connect blocked by the Control-plan paywall
Sage Intacct credentials entry (Company ID / User ID / Password) after upgrading the trial workspace to Control
What would unblock this: a test account with QBO / Xero / Sage Intacct already connected (plus the |
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: e89adae730
ℹ️ About Codex in GitHub
Your team has set up Codex to 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 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
The shared default-vendor helper text hardcoded "Credit Card Misc." in its no-default state. That fallback is created by QuickBooks Online and Sage Intacct on their card export paths only, so the Xero row told admins their expenses would export as a vendor Xero never creates, and QBO's debit-card path named the credit-card vendor instead of "Debit Card Misc.". - workspace.accounting.defaultVendorHelperText now takes an optional fallbackVendorName and only appends the fallback sentence when one is passed (all 11 locales). - QBO passes the name matching the active card destination; Intacct passes the credit-card one; Xero passes none, so it renders the accurate first sentence in both states. - Add CONST.NON_REIMBURSABLE_FALLBACK_VENDOR_NAME for the two vendor names. - Correct the stale "default-supplier row" comment after the vendor rename. Co-authored-by: Alex Beaman <Beamanator@users.noreply.github.com>
This comment has been minimized.
This comment has been minimized.
|
🤖 Posted by Codex, an AI coding agent acting for @Beamanator. The Polyglot Parrot feedback is valid: the new optional fallback-vendor argument changed the English source copy and parameter signature, while 10 locale entries still used the prior wording/signature. I applied the check’s proposed translation updates to de, el, es, fr, it, ja, nl, pl, pt-BR, and zh-hans. Validation: |
No fix pushed — all 5 failing checks are broken on
|
| Check | Failure | Source |
|---|---|---|
typecheck |
TS2552 ×6 in BulkEditTest.ts |
A |
typecheck |
TS2345 src/libs/TransactionUtils/index.ts:2461 |
B |
typecheck |
TS2353 isPolicyExpenseChatEnabled at tests/unit/ReportUtilsTest.ts:16971 |
B (added by e33c4887; not a Policy field) |
typecheck |
TS2307 Cannot find module '@components/Avatar' |
C |
ESLint check |
no-unsafe-assignment ×6 in BulkEditTest.ts |
A |
test (job 5) |
ReferenceError: getCurrencyDecimals is not defined ×3 |
A |
test (job 6) |
TransactionUtils › hasNoticeTypeViolation › should hide RECEIPT_NOT_SMART_SCANNED from the submitter — expected false, got true |
B |
test (job 2) |
ReportUtils › getViolatingReportIDForRBRInLHN › should return null for a processing report whose remaining notice is RECEIPT_NOT_SMART_SCANNED |
B |
Cross-check that A and C predate this PR's run: the unrelated branch krishna2323/issue-99410 typecheck run 33423708142 at 18:12 UTC shows the identical @components/Avatar, getCurrencyDecimals, and getCurrencySymbol errors — but not the TransactionUtils TS2345, which only appears after e33c4887 landed at 18:16. The chronology matches exactly.
Ignored per policy: checklist and Check independent approval (expected on a draft PR awaiting a human author/reviewer).
The 3 error-line pairs in BulkEditTest.ts (2385/2386, 2475/2476, 2557/2558) correspond one-to-one with the 3 failing tests in job 5, confirming the runtime failure and the type error share one cause.
Still no fix pushed —
|
| Merged (UTC) | PR | What it broke |
|---|---|---|
| 18:02 | #99571 | Deleted the getCurrencyDecimals/getCurrencySymbol import from BulkEditTest.ts and rewrote call sites to the …Local variants — but missed the three attendees blocks added on 08-29. Those bare references are now undefined. |
| 18:08 | #99553 | Removed src/components/Avatar/index.tsx, but HeaderWithBackButton.tsx (added 12:42 by #98160) still imports the @components/Avatar barrel. |
| 18:16 | #99303 | Added a shouldShowViolation(...) call that skips the currentUserAccountID argument, so true lands in the number slot. |
The #99571 miss alone accounts for 3 of the 4 failing checks, because the same 6 lines fail three different ways: typecheck (TS2552 ×6), ESLint check (no-unsafe-assignment ×6), and test (job 5) (ReferenceError: getCurrencyDecimals is not defined ×3).
What needs to happen: these are three separate main fixes owned by shubham1206agra, the Avatar decomposition authors, and nkdengineer respectively — not changes that belong in a QBO/Xero vendor-row PR. Once main is green, merge main into this branch and these checks should clear. Happy to file a deploy blocker for the red main if you want — just say so.
Per-check mapping and evidence (permalinks at f6a4920)
| Check | Failure | Cause |
|---|---|---|
typecheck |
TS2552 ×6 at BulkEditTest.ts:2385 (+2475, 2557) vs the import at line 18 |
#99571 |
ESLint check |
no-unsafe-assignment ×6, same lines |
#99571 |
test (job 5) |
ReferenceError: getCurrencyDecimals is not defined ×3 in actions/IOU/BulkEdit › updateMultipleMoneyRequests |
#99571 |
typecheck |
TS2307 Cannot find module '@components/Avatar' at HeaderWithBackButton.tsx:1 |
#99553 |
typecheck |
TS2345 at src/libs/TransactionUtils/index.ts:2461 vs the signature |
#99303 |
typecheck |
TS2353 isPolicyExpenseChatEnabled at ReportUtilsTest.ts:16971 — not a Policy field |
#99303 |
test (job 6) |
TransactionUtils › hasNoticeTypeViolation › should hide RECEIPT_NOT_SMART_SCANNED from the submitter — expected false, got true |
#99303 |
test (job 2) |
ReportUtils › getViolatingReportIDForRBRInLHN › should return null for a processing report whose remaining notice is RECEIPT_NOT_SMART_SCANNED |
#99303 |
On #99303: shouldShowViolation takes (iouReport, policy, violationName, currentUserEmail, currentUserAccountID: number, shouldShowRterForSettledReport = true, transaction?), but the new call passes (iouReport, policy, violation.name, currentUserEmail, true, transaction). currentUserAccountID is skipped, so isCurrentUserSubmitter(iouReport, true) can never match an accountID and the violation is never hidden from the submitter — which is exactly what both failing tests assert.
Independent confirmation these aren't from this branch: the unrelated branch krishna2323/issue-99410 typecheck run 33423708142 at 18:12 UTC shows the identical @components/Avatar and getCurrencyDecimals/getCurrencySymbol errors, but not the TransactionUtils TS2345 — which appears only after #99303 landed at 18:16. The chronology lines up exactly with the table above.
This branch is 319 commits behind main, so its checks build a merge against current main and inherit all of its breakage. The 22 changed files here are confined to src/pages/workspace/accounting/**, src/languages/*.ts, src/CONST/index.ts, and two accounting tests — zero overlap with any failure location.
Still nothing to fix here —
|
| # | Breakage | Landed | Owning PR | Fix status |
|---|---|---|---|---|
| A | BulkEditTest.ts:2385 (+2475, 2557) calls bare getCurrencyDecimals / getCurrencySymbol; line 18 imports only the …Local variants |
18:02 (3e7b4291) |
#99571 | ✅ fix already open: #99952 |
| C | #99553 deleted src/components/Avatar/index.tsx, but HeaderWithBackButton.tsx:1 still imports @components/Avatar |
18:08 (e5d439d0) |
#99553 | ❌ no fix open |
| B | TransactionUtils/index.ts:2461 calls shouldShowViolation without currentUserAccountID, so true lands in the number slot (signature) |
18:16 (e33c4887) |
#99303 | ❌ no fix open |
What unblocks you: #99952 clears A. Someone needs to own B and C — nkdengineer for #99303 and software-mansion-labs for #99553. Once main is green, merge it into this branch and these checks go green with it. I'm not pushing anything, because all three fixes belong in files far outside this PR's scope and A is already being fixed elsewhere.
Your PR itself looks healthy: both of its test files pass — tests/unit/pages/workspace/accounting/qbo/defaultVendorSubscriptionsTest.ts and tests/unit/TranslateTest.ts — and all three perf checks now pass.
Per-check mapping and evidence
| Check | Failure | Cause |
|---|---|---|
typecheck |
TS2552 ×6 in BulkEditTest.ts |
A |
typecheck |
TS2307 Cannot find module '@components/Avatar' |
C |
typecheck |
TS2345 at src/libs/TransactionUtils/index.ts:2461 |
B |
typecheck |
TS2353 isPolicyExpenseChatEnabled at tests/unit/ReportUtilsTest.ts:16971 |
B |
test (job 5) |
ReferenceError: getCurrencyDecimals is not defined ×3 |
A |
test (job 2) |
ReportUtils › getViolatingReportIDForRBRInLHN › should return null for a processing report whose remaining notice is RECEIPT_NOT_SMART_SCANNED |
B |
test (job 6) |
TransactionUtils › hasNoticeTypeViolation › should hide RECEIPT_NOT_SMART_SCANNED from the submitter — expected false, got true |
B |
ESLint check |
no-unsafe-assignment ×6 in BulkEditTest.ts (was failing last run; still running now) |
A |
Verified directly against main HEAD f6a49200, not the merge ref:
tsconfig.jsonmaps@components/*→./src/components/*; the git tree forsrc/components/Avatarcontains noindex.tsxorindex.ts, andsrc/components/Avatar.tsxdoes not exist either.e5d439d0showsremoved src/components/Avatar/index.tsx.- Line 2461 reads
shouldShowViolation(iouReport, policy, violation.name, currentUserEmail, true, transaction)against a signature of(iouReport, policy, violationName, currentUserEmail, currentUserAccountID: number, shouldShowRterForSettledReport = true, transaction?). BecauseisCurrentUserSubmitter(iouReport, true)can never match an accountID, the violation is never hidden from the submitter — which is exactly what both failing tests assert.
Chronology cross-check: the unrelated branch krishna2323/issue-99410 failed at 18:12 with A and C errors but not B — matching B landing at 18:16. An earlier run on ionatan_linkhomeaddress at 17:59 passed cleanly, before any of the three merged.
Ignored per policy: checklist and Check independent approval.
|
🤖 Posted by Codex, an AI coding agent acting for @Beamanator. Confirmed: the code failures came from the GitHub Actions synthetic merge of the prior PR head with current
Validation passed: Pushed as |
|
🤖 Posted by Codex, an AI coding agent acting for @Beamanator. Correction to my previous update: the checklist workflow runs with The actionable source/test fixes remain in |
Nothing to push — the checks are green nowYou'd already fixed them yourself before this run started. On the current head ( Your
The two still-red checks are both expected and not code problems:
One thing worth knowing about the
|
Nothing left for me to fix — the code checks are green
Current tally: 30 pass, 2 skipping, 2 fail. Both failures are human-gated and can't be fixed by a commit:
|
|
@Krishna2323 Your feedback was valid. I independently confirmed that QBO honors a Vendor Bill default vendor while autoCreateVendor is off; the exporter uses the configured default before the fallback creation path. The issue was in App: toggling Create new entities also overwrote nonReimbursableBillDefaultVendor with vendors[0] or NONE, despite the settings being independent. Changed in b47ec34:
No backend PR is required: the backend already treats the two settings independently and continues to own the literal QBO vendor names. Checks passed: targeted Jest TranslateTest (12/12), npm run lint-changed, npm run typecheck, npm run spell-changed, oxfmt check, and React Compiler compliance. 🤖 Posted by Codex, an AI coding agent acting for @Beamanator. |
🦜 Polyglot Parrot! 🦜Squawk! Looks like you added some shiny new English strings. Allow me to parrot them back to you in other tongues: View the translation diffdiff --git a/src/languages/de.ts b/src/languages/de.ts
index 87aaa970..618d1e49 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -7255,8 +7255,8 @@ Der Control-Tarif beginnt bei 9 $ pro aktivem Mitglied und Monat.`,
defaultVendor: 'Standardanbieter',
defaultVendorHelperText: (isSet: boolean, fallbackVendorName?: string) =>
isSet || !fallbackVendorName
- ? `Ausgaben, die nicht automatisch zugeordnet werden, werden standardmäßig diesem Lieferanten zugewiesen.`
- : `Ausgaben, die nicht automatisch abgeglichen werden, werden standardmäßig diesem Lieferanten zugeordnet. Andernfalls werden sie als „${fallbackVendorName}.“ exportiert.`,
+ ? `Ausgaben, die nicht automatisch abgeglichen werden, werden standardmäßig diesem Lieferanten zugeordnet.`
+ : `Ausgaben, die nicht automatisch zugeordnet werden, werden standardmäßig diesem Lieferanten zugewiesen. Andernfalls werden sie als ${fallbackVendorName} exportiert.`,
defaultVendorSelectHeader: `Wählen Sie einen Standardanbieter für Ausgaben, die nicht automatisch zugeordnet werden.`,
defaultAccount: 'Standardkonto',
autoSync: 'Automatische Synchronisierung',
diff --git a/src/languages/el.ts b/src/languages/el.ts
index 477f40fc..14d10711 100644
--- a/src/languages/el.ts
+++ b/src/languages/el.ts
@@ -7412,9 +7412,9 @@ _Για πιο αναλυτικές οδηγίες, [επισκεφθείτε τ
},
defaultVendorHelperText: (isSet: boolean, fallbackVendorName?: string) =>
isSet || !fallbackVendorName
- ? `Οι δαπάνες που δεν αντιστοιχίζονται αυτόματα θα αντιστοιχίζονται σε αυτόν τον προμηθευτή από προεπιλογή.`
- : `Οι δαπάνες που δεν θα αντιστοιχίζονται αυτόματα θα αντιστοιχίζονται από προεπιλογή σε αυτόν τον προμηθευτή. Διαφορετικά, θα εξαχθούν ως ${fallbackVendorName}.`,
- defaultVendorSelectHeader: `Επιλέξτε έναν προεπιλεγμένο προμηθευτή για δαπάνες που δεν ταιριάζουν αυτόματα.`,
+ ? `Οι δαπάνες που δεν αντιστοιχίζονται αυτόματα θα αντιστοιχίζονται από προεπιλογή σε αυτόν τον προμηθευτή.`
+ : `Οι δαπάνες που δεν αντιστοιχίζονται αυτόματα θα αντιστοιχίζονται σε αυτόν τον προμηθευτή από προεπιλογή. Διαφορετικά, θα εξαχθούν ως ${fallbackVendorName}.`,
+ defaultVendorSelectHeader: `Επιλέξτε έναν προεπιλεγμένο προμηθευτή για δαπάνες που δεν αντιστοιχίζονται αυτόματα.`,
},
hr: {
title: 'HR',
diff --git a/src/languages/es.ts b/src/languages/es.ts
index 118769cf..e7c2bdcd 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -7071,8 +7071,8 @@ El plan Controlar empieza en 9 $ por miembro activo al mes.`,
defaultVendor: 'Proveedor predeterminado',
defaultVendorHelperText: (isSet: boolean, fallbackVendorName?: string) =>
isSet || !fallbackVendorName
- ? `Los gastos que no se asignen automáticamente se asociarán por defecto a este proveedor.`
- : `Los gastos que no se emparejen automáticamente se asociarán a este proveedor de forma predeterminada. De lo contrario, se exportarán como ${fallbackVendorName}.`,
+ ? `Los gastos que no se concilien automáticamente se asignarán por defecto a este proveedor.`
+ : `Los gastos que no se concilien automáticamente se asignarán a este proveedor de forma predeterminada. En caso contrario, se exportarán como ${fallbackVendorName}.`,
defaultVendorSelectHeader: `Elige un proveedor predeterminado para los gastos que no se asignen automáticamente.`,
defaultAccount: 'Cuenta predeterminada',
autoSync: 'Autosincronización',
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index 07c32099..4f29400a 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -7276,7 +7276,7 @@ Le forfait Control commence à 9 $ par Membre actif et par mois.`,
defaultVendorHelperText: (isSet: boolean, fallbackVendorName?: string) =>
isSet || !fallbackVendorName
? `Les dépenses qui ne correspondent pas automatiquement seront par défaut associées à ce fournisseur.`
- : `Les dépenses qui ne sont pas appariées automatiquement seront associées par défaut à ce fournisseur. Sinon, elles seront exportées comme ${fallbackVendorName}.`,
+ : `Les dépenses qui ne se rapprochent pas automatiquement utiliseront par défaut ce fournisseur. Sinon, elles seront exportées sous ${fallbackVendorName}.`,
defaultVendorSelectHeader: `Choisissez un fournisseur par défaut pour les dépenses qui ne correspondent pas automatiquement.`,
defaultAccount: 'Compte par défaut',
autoSync: 'Synchronisation automatique',
diff --git a/src/languages/it.ts b/src/languages/it.ts
index e1efa6d5..8ecefeab 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -7220,8 +7220,8 @@ Il piano Control parte da 9 $ al mese per ogni membro attivo.`,
defaultVendor: 'Fornitore predefinito',
defaultVendorHelperText: (isSet: boolean, fallbackVendorName?: string) =>
isSet || !fallbackVendorName
- ? `Le spese che non vengono abbinate automaticamente verranno assegnate a questo fornitore per impostazione predefinita.`
- : `Le spese che non vengono abbinate automaticamente useranno questo fornitore per impostazione predefinita. In caso contrario, verranno esportate come ${fallbackVendorName}.`,
+ ? `Le spese che non vengono abbinate automaticamente verranno associate per impostazione predefinita a questo fornitore.`
+ : `Le spese che non vengono abbinate automaticamente avranno questo fornitore predefinito. In caso contrario, verranno esportate come ${fallbackVendorName}.`,
defaultVendorSelectHeader: `Scegli un fornitore predefinito per le spese che non vengono abbinate automaticamente.`,
defaultAccount: 'Conto predefinito',
autoSync: 'Sincronizzazione automatica',
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index e060eebf..6556844a 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -7130,8 +7130,8 @@ Control プランは、アクティブメンバー1人あたり月額 $9 から
defaultVendorHelperText: (isSet: boolean, fallbackVendorName?: string) =>
isSet || !fallbackVendorName
? `自動照合されない経費は、デフォルトでこのベンダーに割り当てられます。`
- : `自動照合されない経費はデフォルトでこのベンダーに割り当てられます。それ以外は「${fallbackVendorName}.」としてエクスポートされます。`,
- defaultVendorSelectHeader: `自動的に一致しない経費に使用するデフォルトの取引先を選択します。`,
+ : `自動で照合されない経費は既定でこのベンダーになります。それ以外は ${fallbackVendorName} としてエクスポートされます。`,
+ defaultVendorSelectHeader: `自動的に一致しない経費のためのデフォルトの取引先を選択します。`,
defaultAccount: 'デフォルトのアカウント',
autoSync: '自動同期',
autoSyncDescription: 'NetSuite と Expensify を毎日自動で同期。確定したレポートをリアルタイムでエクスポート',
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index 5c5e0d2c..c3dc5cff 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -7203,9 +7203,9 @@ Het Control-abonnement begint bij $9 per actieve deelnemer per maand.`,
defaultVendor: 'Standaardleverancier',
defaultVendorHelperText: (isSet: boolean, fallbackVendorName?: string) =>
isSet || !fallbackVendorName
- ? `Uitgaven die niet automatisch worden gekoppeld, worden standaard aan deze leverancier toegewezen.`
+ ? `Declaraties die niet automatisch worden gematcht, worden standaard aan deze leverancier gekoppeld.`
: `Declaraties die niet automatisch worden gekoppeld, worden standaard aan deze leverancier toegewezen. Anders worden ze geëxporteerd als ${fallbackVendorName}.`,
- defaultVendorSelectHeader: `Kies een standaardleverancier voor uitgaven die niet automatisch worden gekoppeld.`,
+ defaultVendorSelectHeader: `Kies een standaardleverancier voor uitgaven die niet automatisch worden herkend.`,
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 95ed67a5..5e2b4f12 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -7226,8 +7226,8 @@ Plan Control zaczyna się od 9 USD za aktywnego członka miesięcznie.`,
defaultVendor: 'Domyślny dostawca',
defaultVendorHelperText: (isSet: boolean, fallbackVendorName?: string) =>
isSet || !fallbackVendorName
- ? `Wydatki, które nie zostaną automatycznie dopasowane, będą domyślnie przypisywane temu kontrahentowi.`
- : `Wydatki, które nie zostaną automatycznie dopasowane, zostaną domyślnie przypisane do tego dostawcy. W przeciwnym razie będą eksportowane jako ${fallbackVendorName}.`,
+ ? `Wydatki, które nie zostaną automatycznie dopasowane, zostaną domyślnie przypisane do tego dostawcy.`
+ : `Wydatki, które nie zostaną dopasowane automatycznie, będą domyślnie przypisane do tego dostawcy. W przeciwnym razie zostaną wyeksportowane jako ${fallbackVendorName}.`,
defaultVendorSelectHeader: `Wybierz domyślnego dostawcę dla wydatków, które nie dopasują się automatycznie.`,
defaultAccount: 'Domyślne konto',
autoSync: 'Automatyczna synchronizacja',
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index 8b38a7b5..df4dcd68 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -7207,9 +7207,9 @@ O plano Control começa em US$ 9 por membro ativo por mês.`,
defaultVendor: 'Fornecedor padrão',
defaultVendorHelperText: (isSet: boolean, fallbackVendorName?: string) =>
isSet || !fallbackVendorName
- ? `Despesas que não forem conciliadas automaticamente serão atribuídas a este fornecedor por padrão.`
- : `Despesas que não tiverem correspondência automática serão atribuídas a este fornecedor por padrão. Caso contrário, serão exportadas como ${fallbackVendorName}.`,
- defaultVendorSelectHeader: `Escolha um fornecedor padrão para despesas que não sejam correspondidas automaticamente.`,
+ ? `Despesas que não tiverem correspondência automática serão associadas a este fornecedor por padrão.`
+ : `Despesas que não forem conciliadas automaticamente serão atribuídas a este fornecedor por padrão. Caso contrário, serão exportadas como ${fallbackVendorName}.`,
+ defaultVendorSelectHeader: `Escolha um fornecedor padrão para as 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 5e832496..d1a11d17 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -6952,8 +6952,8 @@ _如需更详细的说明,请[访问我们的帮助网站](${CONST.NETSUITE_IM
exportDate: '导出日期',
defaultVendor: '默认供应商',
defaultVendorHelperText: (isSet: boolean, fallbackVendorName?: string) =>
- isSet || !fallbackVendorName ? `无法自动匹配的报销将默认归属为此供应商。` : `未自动匹配的报销将默认归属于此供应商。否则,它们将按“${fallbackVendorName}.”导出。`,
- defaultVendorSelectHeader: `为未能自动匹配的报销选择一个默认供应商。`,
+ isSet || !fallbackVendorName ? `未自动匹配的报销将默认归属为此供应商。` : `无法自动匹配的报销将默认使用此供应商。否则,它们将以 ${fallbackVendorName} 导出。`,
+ defaultVendorSelectHeader: `为未自动匹配的费用选择一个默认供应商。`,
defaultAccount: '默认账户',
autoSync: '自动同步',
autoSyncDescription: '每天自动同步 NetSuite 和 Expensify。实时导出已完成报表',
Note You can apply these changes to your branch by copying the patch to your clipboard, then running |
|
@OSBotify Applied the non-conflicting language updates from your suggested diff in 84bc3eb. I intentionally retained the fallback branches in de, ja, and zh-hans: the suggested versions remove the German/Japanese/Chinese quotes and reintroduce the missing terminal punctuation identified by Krishna. The remaining helper-text and selector-header translations were applied. Validation passed: npm test -- tests/unit/TranslateTest.ts --runInBand (12/12), npm run lint-changed, npm run typecheck, npm run spell-changed, and oxfmt check. 🤖 Posted by Codex, an AI coding agent acting for @Beamanator. |
|
back to you @Krishna2323 🙏 |
|
No code fix is needed — every automated check passes on the current head ( Because I authored this PR, it needs an approval from an Expensify employee other than me. That check will stay red until someone approves. What actually failed earlier, and where it was fixedThe real failures were on the Aug 31 commits, and they were already resolved before this request:
Everything after that is green. Latest run status on
The |
Reviewer Checklist
Screenshots/VideosAndroid: HybridAppandroid_hybrid.mp4Android: mWeb Chromeandroid_mWeb.mp4iOS: HybridAppios_hybrid.mp4iOS: mWeb Safariios_mWeb.mp4MacOS: Chrome / Safariweb_chrom_QBO.mp4web_chrom_sage_inttact.mp4web_chrom_xero.mp4 |
|
🎯 @Krishna2323, thanks for reviewing and testing this PR! 🎉 A payment issue will be created for your review once this PR is deployed to production. If payment is not needed (e.g., regression PR review fix etc), react with 👎 to this comment to prevent the payment issue from being created. |
…endor-fixes # Conflicts: # src/languages/el.ts
|
Merged current main into this PR and pushed d5a6e48. There was one conflict in src/languages/el.ts. I retained this PR's parameterized default-vendor helper and standardized header, and also preserved main's two newly added travel-billing tooltip translations. No QBO behavior or the Krishna punctuation fix was changed by the resolution. Validation passed: TranslateTest (12/12), typecheck, changed-file lint, merge pre-commit formatting/action build, and React Compiler compliance. 🤖 Posted by Codex, an AI coding agent acting for @Beamanator. |
|
Fixed the failing Verify check in 4b409a5. Cause: this worktree's node_modules is a symlink to /Users/alexbeaman/Expensidev/App/node_modules. Rebuilding the authorChecklist action through that symlink emitted absolute local paths into its generated index.js. CI uses a clean install and emits repository-relative paths, so Verify detected a generated-file diff. The authorChecklist action source is identical to current main; only its generated bundle differed. I restored the clean-build bundle from main and verified the resulting file is byte-identical to main's version. No product or QBO code changed. 🤖 Posted by Codex, an AI coding agent acting for @Beamanator. |
|
Follow-up cleanup in 5e542c8: I removed 24 unrelated generated JavaScript Action bundle diffs that were retained by the merge. Their Action sources are identical to main, so they were restored to main's generated versions. The net PR diff is now 23 relevant QBO/Xero/default-vendor files (238 additions / 154 deletions); no generated Action bundles remain. This also retains the authorChecklist clean-build fix needed by Verify. 🤖 Posted by Codex, an AI coding agent acting for @Beamanator. |
|
The The bundles contained: // ../../../Users/alexbeaman/Expensidev/App/node_modules/tunnel/lib/tunnel.jswhere a rebuild from the repo root produces: // node_modules/tunnel/lib/tunnel.js
This is now fixed. You pushed the same fix yourself while I was working on it — All checks now pass on VerificationConfirmed locally on
CI on
|
|
Still nothing for me to fix — all automated checks pass on the current head ( I authored this PR, so it needs an approval from a different Expensify employee. No commit can clear it, and it's what's holding Full check status on
|
| Check | Result |
|---|---|
| ESLint, Oxfmt, TypeScript, Spell check, Check unused styles | pass |
| Jest Unit Tests, Bun tests, Reassure Performance Tests | pass |
| Generate static translations, Knip, React Compiler Compliance | pass |
| Validate GitHub Actions and Workflows, Check validateCode terminology | pass |
| Verify signed commits, CLA Assistant, Onyx.connectWithoutView reviewers | pass |
| PR Author Checklist | pass |
Check independent approval |
fail — needs a human approval |
|
✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release. |
|
🚧 Beamanator has triggered a test Expensify/App build. You can view the workflow run here. |
|
🧪🧪 Use the links below to test this adhoc build on Android, iOS, and Web. Happy testing! 🧪🧪
|
|
🚀 Deployed to staging by https://github.com/Beamanator in version: 9.4.70-0 🚀
|
|
Yes — help site changes were required. Draft PR: #100344 Three user-visible changes in this PR weren't reflected in
What changed, and why
Documents the Xero Default vendor setting, the None option that clears it, and the fact that Xero applies no stand-in supplier when nothing is set — there's no Filed under It also explains why the field on an expense reads Supplier while the workspace setting reads Default vendor — that split is the most likely confusion the rename creates for a Xero admin.
Fixed a stray period in the fallback-vendor list. Left otherwise untouched — its Not changed: Verification note: the workspace Accounting navigation labels were confirmed against dev NewDot on web. The QuickBooks Online and Xero Export configuration pages sit behind a real OAuth connection that the test account can't establish, so those labels were verified against @Beamanator, please review the linked help site PR and confirm it reflects the current behavior. Then mark the linked help site PR |
|
🚀 Deployed to staging by https://github.com/Beamanator in version: 9.4.72-0 🚀
|







Explanation of Change
Aligns the QBO and Xero Default vendor rows with the pattern Sage Intacct adopted in #97016, so all three integrations render the same navigable arrow row and reuse the same
workspace.accountingcopy.QuickBooks Online —
DynamicQuickbooksCompanyCardExpenseAccountPage.tsxdefaultVendorHelperTextbelow the existing Default vendor row. The "Otherwise, they'll export as Credit Card Misc." fallback is specific to this branch, so the helper is scoped here only.ToggleSettingOptionRow+Accordionwith a single always-visible Default vendor row that opens the existing bill default-vendor selector. The underlying setting values are untouched — the Advanced page's Create new entities (autoCreateVendor) toggle and its API action are unchanged.Xero
defaultVendorHelperTextbelow the row.Shared select-page header
workspace.accounting.defaultVendorSelectHeader, matching Intacct.defaultVendorSelectHeaderno longer interpolates the connection name. The design-approved copy (and the Xero R4 QA acceptance copy) isChoose a default vendor for expenses that don't match automatically.— the merged string readChoose a default QuickBooks Online vendor…, which would have failed the same QA check again. This also affects the Intacct picker, which is the intent of standardizing.Pending / error subscriptions
autoCreateVendorand only subscribed tononReimbursableBillDefaultVendorwhenautoCreateVendorwas on. Both the Export configuration page and the Accounting page now subscribe to whichever default-vendor key matches the active export destination, so a pending or failed default-vendor change on the card/debit path (nonReimbursableCreditCardDefaultVendor, which was subscribed nowhere before) surfaces its pending state and error dot on the parent rows.autoCreateVendorstays subscribed under the Advanced settings, where it is now edited.Fixed Issues
$ https://github.com/Expensify/Expensify/issues/664722
Tests
Prerequisites: use the PR build; use a QBO workspace with at least two vendors and access to Credit Card, Debit Card, and Vendor Bill company-card export destinations; use a Xero workspace with Vendor Matching enabled and at least two contacts.
Expenses that don't auto-match will default to this vendor. Otherwise, they'll export as Credit Card Misc.Choose a default vendor for expenses that don't match automatically.Select Vendor A, return, and verify Vendor A displays with the one-sentence helper:Expenses that don't auto-match will default to this vendor.Debit Card Misc.; once Vendor A is selected, the helper must be the same one-sentence copy.autoCreateVendorbehavior unchanged.Expenses that don't auto-match will default to this vendor.It must not mention a Credit Card Misc. fallback.Offline tests
QA Steps
ping alex & @heyjennahay to test
For complete integration confidence, also export a non-matching company-card expense for each configured QBO destination and confirm existing fallback/export behavior is preserved; for Xero with no default vendor, confirm no fabricated fallback vendor is created.
Acceptance decisions: this PR is complete only if QBO's existing Create new entities semantics are intentionally left unchanged, and Jenna confirms Xero's accurate no-fallback helper copy. If QBO-setting decoupling is required, it is a separate follow-up rather than behavior delivered by this PR.
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectionAvatar, I verified the components usingAvatarare working as expected)StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))npm run compress-svg)Avataris modified, I verified thatAvataris working as expected in all cases)Designlabel and/or tagged@Expensify/designso the design team can review the changes.mainbranch was merged into this PR after a review, I tested again and verified the outcome was still expected according to theTeststeps.Screenshots/Videos
Android: Native
Android: mWeb Chrome
iOS: Native
iOS: mWeb Safari
MacOS: Chrome / Safari