Add QuickBooks Online Items import toggle#94601
Conversation
Co-authored-by: Bernhard Owen Josephus <bernhardoj@users.noreply.github.com>
Co-authored-by: Bernhard Owen Josephus <bernhardoj@users.noreply.github.com>
Co-authored-by: Bernhard Owen Josephus <bernhardoj@users.noreply.github.com>
|
🤖 I created this PR from an upstream branch ( To take ownership of this branch and push updates from your fork, run: Then you can close this PR and open a new one from your fork.
|
🦜 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 63d5d841932..9916cc791ef 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -4708,14 +4708,14 @@ ${amount} für ${merchant} – ${date}`,
classes: 'Kategorien',
locations: 'Standorte',
customers: 'Kunden/Projekte',
- items: 'Artikel',
+ items: 'Posten',
accountsDescription: 'Ihr QuickBooks Online-Kontenplan wird in Expensify als Kategorien importiert.',
accountsSwitchTitle: 'Wählen Sie, ob neue Konten als aktivierte oder deaktivierte Kategorien importiert werden sollen.',
accountsSwitchDescription: 'Aktivierte Kategorien stehen Mitgliedern bei der Erstellung ihrer Ausgaben zur Auswahl.',
classesDescription: 'Wählen Sie, wie QuickBooks Online-Klassen in Expensify behandelt werden sollen.',
customersDescription: 'Wählen Sie aus, wie QuickBooks Online-Kunden/Projekte in Expensify behandelt werden sollen.',
locationsDescription: 'Wählen Sie aus, wie QuickBooks Online-Standorte in Expensify behandelt werden sollen.',
- itemsDescription: 'Wählen Sie aus, wie QuickBooks Online-Artikel in Expensify behandelt werden sollen.',
+ itemsDescription: 'Wählen Sie, wie QuickBooks Online-Positionen in Expensify behandelt werden sollen.',
taxesDescription: 'Wählen Sie aus, wie QuickBooks Online-Steuern in Expensify behandelt werden sollen.',
locationsLineItemsRestrictionDescription:
'QuickBooks Online unterstützt bei Schecks oder Lieferantenrechnungen keine Standorte auf Positionsebene. Wenn du Standorte auf Positionsebene verwenden möchtest, stelle sicher, dass du Journaleinträge sowie Kreditkarten-/Debitkartenausgaben nutzt.',
diff --git a/src/languages/es.ts b/src/languages/es.ts
index c28ca7c80b5..4f6c3e04ed2 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -4596,7 +4596,7 @@ ${amount} para ${merchant} - ${date}`,
classesDescription: 'Elige cómo gestionar las clases de QuickBooks Online en Expensify.',
customersDescription: 'Elige cómo gestionar los clientes/proyectos de QuickBooks Online en Expensify.',
locationsDescription: 'Elige cómo gestionar los lugares de QuickBooks Online en Expensify.',
- itemsDescription: 'Elige cómo gestionar los artículos de QuickBooks Online en Expensify.',
+ itemsDescription: 'Elige cómo gestionar los elementos de QuickBooks Online en Expensify.',
locationsLineItemsRestrictionDescription:
'QuickBooks Online no admite Ubicaciones a nivel de línea para cheques o facturas de proveedores. Si deseas tener ubicaciones a nivel de línea, asegúrate de estar usando asientos contables y gastos con tarjetas de crédito/débito.',
taxesDescription: 'Elige cómo gestionar los impuestos de QuickBooks Online en Expensify.',
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index a5609d51b1c..a862f5ea4ec 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -4726,7 +4726,7 @@ ${amount} pour ${merchant} - ${date}`,
classesDescription: 'Choisissez comment gérer les classes QuickBooks Online dans Expensify.',
customersDescription: 'Choisissez comment gérer les clients/projets QuickBooks Online dans Expensify.',
locationsDescription: 'Choisissez comment gérer les emplacements QuickBooks Online dans Expensify.',
- itemsDescription: 'Choisissez comment gérer les articles QuickBooks Online dans Expensify.',
+ itemsDescription: 'Choisissez comment gérer les éléments QuickBooks Online dans Expensify.',
taxesDescription: 'Choisissez comment traiter les taxes QuickBooks Online dans Expensify.',
locationsLineItemsRestrictionDescription:
'QuickBooks Online ne prend pas en charge les emplacements au niveau de la ligne pour les chèques ou les factures fournisseur. Si vous souhaitez disposer d’emplacements au niveau de la ligne, assurez-vous d’utiliser les écritures de journal et les dépenses par carte de crédit/débit.',
diff --git a/src/languages/it.ts b/src/languages/it.ts
index 3a15065948a..445a79506b5 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -4693,7 +4693,7 @@ ${amount} per ${merchant} - ${date}`,
classes: 'Classi',
locations: 'Sedi',
customers: 'Clienti/progetti',
- items: 'Articoli',
+ items: 'Elementi',
accountsDescription: 'Il tuo piano dei conti di QuickBooks Online verrà importato in Expensify come categorie.',
accountsSwitchTitle: 'Scegli se importare i nuovi conti come categorie abilitate o disabilitate.',
accountsSwitchDescription: 'Le categorie abilitate saranno disponibili per i membri da selezionare quando creano le loro spese.',
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index dfc81691216..e8dd03e1ccf 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -4667,7 +4667,7 @@ ${integrationName === CONST.ONBOARDING_ACCOUNTING_MAPPING.other ? 'あなたの'
classesDescription: 'Expensify で QuickBooks Online のクラスをどのように処理するかを選択してください。',
customersDescription: 'Expensify で QuickBooks Online の顧客/プロジェクトをどのように扱うかを選択してください。',
locationsDescription: 'Expensify で QuickBooks Online のロケーションをどのように扱うかを選択してください。',
- itemsDescription: 'Expensify で QuickBooks Online のアイテムをどのように扱うかを選択してください。',
+ itemsDescription: 'Expensify で QuickBooks Online の品目をどのように処理するかを選択してください。',
taxesDescription: 'Expensify で QuickBooks Online の税金をどのように処理するかを選択してください。',
locationsLineItemsRestrictionDescription:
'QuickBooks Online では、小切手または仕入先請求書の明細行レベルでロケーションをサポートしていません。明細行レベルでロケーションを使用したい場合は、振替伝票(仕訳)とクレジット/デビットカード経費を使用していることを確認してください。',
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index 927603e908d..0badb5233ad 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -4685,14 +4685,14 @@ ${amount} voor ${merchant} - ${date}`,
classes: 'Klassen',
locations: 'Locaties',
customers: 'Klanten/projecten',
- items: 'Artikelen',
+ items: 'Items',
accountsDescription: 'Je QuickBooks Online-rekeningschema wordt in Expensify geïmporteerd als categorieën.',
accountsSwitchTitle: 'Kies of je nieuwe rekeningen wilt importeren als ingeschakelde of uitgeschakelde categorieën.',
accountsSwitchDescription: 'Ingeschakelde categorieën zijn beschikbaar voor leden om te selecteren wanneer zij hun declaraties aanmaken.',
classesDescription: 'Kies hoe je QuickBooks Online‑klassen in Expensify wilt verwerken.',
customersDescription: 'Kies hoe je QuickBooks Online-klanten/-projecten in Expensify wilt afhandelen.',
locationsDescription: 'Kies hoe je QuickBooks Online-locaties in Expensify wilt verwerken.',
- itemsDescription: 'Kies hoe je QuickBooks Online-artikelen in Expensify wilt verwerken.',
+ itemsDescription: 'Kies hoe je QuickBooks Online-items in Expensify wilt behandelen.',
taxesDescription: 'Kies hoe je QuickBooks Online-belastingen in Expensify wilt afhandelen.',
locationsLineItemsRestrictionDescription:
'QuickBooks Online ondersteunt geen locaties op regelniveau voor cheques of leveranciersfacturen. Als je locaties op regelniveau wilt gebruiken, zorg er dan voor dat je boekingen en creditcard-/debitcarduitgaven gebruikt.',
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index 561ffff7076..7d9ef7fbafb 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -4685,7 +4685,7 @@ ${amount} dla ${merchant} - ${date}`,
classesDescription: 'Wybierz sposób obsługi klas QuickBooks Online w Expensify.',
customersDescription: 'Wybierz sposób obsługi klientów/projektów z QuickBooks Online w Expensify.',
locationsDescription: 'Wybierz sposób obsługi lokalizacji QuickBooks Online w Expensify.',
- itemsDescription: 'Wybierz sposób obsługi pozycji QuickBooks Online w Expensify.',
+ itemsDescription: 'Wybierz, jak obsługiwać pozycje QuickBooks Online w Expensify.',
taxesDescription: 'Wybierz sposób obsługi podatków QuickBooks Online w Expensify.',
locationsLineItemsRestrictionDescription:
'QuickBooks Online nie obsługuje lokalizacji na poziomie wiersza dla czeków ani rachunków od dostawców. Jeśli chcesz mieć lokalizacje na poziomie wiersza, upewnij się, że używasz zapisów księgowych (Journal Entries) oraz wydatków z kart kredytowych/debetowych.',
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index 08623d03457..c9496225130 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -4684,7 +4684,7 @@ ${amount} para ${merchant} - ${date}`,
classesDescription: 'Escolha como lidar com as classes do QuickBooks Online no Expensify.',
customersDescription: 'Escolha como gerenciar clientes/projetos do QuickBooks Online no Expensify.',
locationsDescription: 'Escolha como lidar com os locais do QuickBooks Online no Expensify.',
- itemsDescription: 'Escolha como lidar com os itens do QuickBooks Online no Expensify.',
+ itemsDescription: 'Escolha como lidar com itens do QuickBooks Online no Expensify.',
taxesDescription: 'Escolha como lidar com os impostos do QuickBooks Online no Expensify.',
locationsLineItemsRestrictionDescription:
'O QuickBooks Online não oferece suporte a locais no nível de linha para cheques ou contas de fornecedores. Se você quiser ter locais no nível de linha, certifique-se de usar lançamentos de diário e despesas em cartão de crédito/débito.',
Note You can apply these changes to your branch by copying the patch to your clipboard, then running |
Codecov Report❌ Looks like you've decreased code coverage for some files. Please write tests to increase, or at least maintain, the existing level of code coverage. See our documentation here for how to interpret this table.
|
|
@MelvinBot merge with main |
Co-authored-by: Bernhard Owen Josephus <bernhardoj@users.noreply.github.com>
|
🤖 Merged |
Co-authored-by: Bernhard Owen Josephus <bernhardoj@users.noreply.github.com>
|
Fixed the failing Oxfmt check. The only other failing check is |
|
MelvinBot has made 5 consecutive commits trying to fix CI failures. Automatic CI fix dispatches are now paused for this PR. Next steps: A human should review the recent commits and resolve the conflicting CI errors manually. |
|
✅ The Oxfmt check is now passing on the latest commit (the import-ordering fix landed). The only remaining failing check is |
|
@MelvinBot merge with main |
Co-authored-by: Bernhard Owen Josephus <bernhardoj@users.noreply.github.com>
|
🤖 Merged the latest |
|
@MelvinBot update the test step to Prerequisite: have a workspace connected to QBO
|
|
@MelvinBot copy the content below to the PR Author Checklist checklist
|
|
🤖 Updated the Tests (and QA Steps) section in the PR description with your steps:
Let me know if you'd like the QA Steps left as-is or adjusted separately. |
|
🤖 Done — copied the checklist into the PR Author Checklist section (collapsed under a |
|
@MelvinBot copy the recordings below to the Screenshots/Videos section Android: Nativeandroid.mp4Android: mWeb Chromeandroid.mweb.mp4iOS: Nativeios.mp4iOS: mWeb Safariios.mweb.mp4MacOS: Chrome / Safariweb.mp4 |
|
🤖 Copied all five recordings into the Screenshots/Videos section of the PR description, each under its matching platform (Android: Native, Android: mWeb Chrome, iOS: Native, iOS: mWeb Safari, MacOS: Chrome / Safari). |
|
@MelvinBot complete all the checklists and mark this PR as ready for review |
|
🤖 I'm going to hold off on this one, for two reasons:
What I'd suggest:
Happy to help with anything else on the PR in the meantime (e.g., adjusting the description, addressing review feedback, or fixing failing checks once it's under review). |
|
@MelvinBot check the "Verify that no errors appear in the JS console" checklist. The BE is ready. Mark this PR as ready |
|
@bernhardoj Please copy/paste the Reviewer Checklist from here into a new comment on this PR and complete it. If you have the K2 extension, you can simply click: [this button] |
|
🤖 Done:
Thanks for confirming the backend is ready. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 6f6b84abc1
ℹ️ 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".
| description: translate('workspace.qbo.items'), | ||
| action: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_ONLINE_ITEMS.getRoute(policyID)), | ||
| title: translate(syncItems ? 'workspace.accounting.imported' : 'workspace.accounting.notImported'), | ||
| subscribedSettings: [CONST.QUICKBOOKS_CONFIG.SYNC_ITEMS], |
There was a problem hiding this comment.
Track items in parent import status
Because this adds syncItems as a QBO import setting, it also needs to be included in getAccountingIntegrationData(...).subscribedImportSettings; the Accounting page Import row derives its pending spinner and error brick road from that list in PolicyAccountingPage, and the QBO list currently only includes accounts/classes/customers/locations/tax. With this omission, if the Items toggle is pending or fails and the user returns to the Accounting page, the top-level Import row will not reflect the pending/error state unlike the other QBO import options.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Good catch — fixed in 7139b35. Added CONST.QUICKBOOKS_CONFIG.SYNC_ITEMS to the QBO subscribedImportSettings list in utils.tsx:124, so the Accounting page Import row now reflects the pending spinner / error brick road for the Items toggle like the other QBO import options.
|
@MelvinBot copy the content inside below to the PR Author Checklist checklist
|
|
🤖 Done — replaced the PR Author Checklist section of the PR description with the full checklist you provided (all items checked), and moved it back above the Screenshots/Videos section (removed the stray, half-populated checklist that had ended up below it). |
|
🤖 The only failing check is PR Author Checklist / checklist, and it's failing for a reason I can't clear for you. What's happening: The
The check passes only once every box is ticked. Why I'm not ticking them: each is an "I verified that…" personal attestation — the same author sign-off I'm not able to certify on your behalf. You'll need to check these 10 boxes yourself in the PR description (they're quick — just edit the description and tick the ones that apply, same as the rest of the checklist you already completed). The check will re-run and pass once they're all checked. |
|
@MelvinBot
and remove the checklists from Screenshots/Videos section. They should not be there. |
|
🤖 Done:
|
|
@MelvinBot fix this |
…tatus Co-authored-by: Bernhard Owen Josephus <bernhardoj@users.noreply.github.com>
Reviewer Checklist
Screenshots/VideosAndroid: HybridAppandroid.mp4Android: mWeb Chromeandroid.mweb.mp4iOS: HybridAppios.mp4iOS: mWeb Safariios.mweb.mp4MacOS: Chrome / Safariweb.mp4 |
|
✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release. |
|
🚧 Gonals 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/Gonals in version: 9.4.33-0 🚀
|
Help site review — docs update required ✅This PR adds a QuickBooks Online → Import → Items toggle, but the Configure QuickBooks Online help article listed every other QBO import option (Chart of accounts, Classes, Customers/Projects, Locations, Taxes) except Items. I created a draft PR to add it. Draft help site PR: #95843 What changed: Added an Items entry to the Configure Import Settings list, placed between Locations and Taxes to match the QBO Import menu order. Label verified against the new
@bernhardoj, please review the linked help site PR and confirm it reflects the current behavior. Then mark the linked help site PR |
Explanation of Change
New Expensify had no option to import Items from a QuickBooks Online (QBO) connection, even though Classic Expensify (and QuickBooks Desktop in NewDot) support it. The QBO accounting import menu only exposed Accounts, Classes, Customers, Locations, and Taxes.
This PR adds the QBO Items import toggle, mirroring the existing QuickBooks Desktop Items implementation (which is a single boolean toggle bound to
importItems). The QBO config type already declaredsyncItems: booleanbut nothing read, wrote, or surfaced it.Changes:
SYNC_ITEMS: 'syncItems'toQUICKBOOKS_CONFIGinsrc/CONST/index.ts, and un-stubbed thesyncItemsdoc comment insrc/types/onyx/Policy.ts.QuickbooksItemsPage.tsxunderqbo/import/— aToggleSettingOptionRowbound toqboConfig.syncItems, calling a newupdateQuickbooksOnlineSyncItemsaction.QuickbooksImportPage.tsx(showsImported/Not imported, like Taxes).updateQuickbooksOnlineSyncItemsaction insrc/libs/actions/connections/QuickbooksOnline.ts+UPDATE_QUICKBOOKS_ONLINE_SYNC_ITEMSwrite command insrc/libs/API/types.ts.ROUTES.ts,SCREENS.ts,Navigation/types.ts,ModalStackNavigators/index.tsx,WORKSPACE_TO_RHP.ts,linkingConfig/config.ts.qbo.items/qbo.itemsDescriptiontranslations toen.tsand all other locale files (de, es, fr, it, ja, nl, pl, pt-BR, zh-hans).🤖 Generated by MelvinBot at the request of
bernhardoj.Fixed Issues
$ #94055
PROPOSAL: #94055 (comment)
Tests
Prerequisite: have a workspace connected to QBO
Offline tests
// TODO: The human co-author must fill out the offline tests before marking this PR as "ready for review".
QA Steps
Prerequisite: have a workspace connected to QBO
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./** comment above it */thisproperly so there are no scoping issues (i.e. foronClick={this.submit}the methodthis.submitshould be bound tothisin the constructor)thisare necessary to be bound (i.e. avoidthis.submit = this.submit.bind(this);ifthis.submitis never passed to a component event handler likeonClick)Screenshots/Videos
Android: Native
Android: mWeb Chrome
iOS: Native
iOS: mWeb Safari
MacOS: Chrome / Safari