[No QA] Add Gusto HR page setup - #88005
Conversation
|
Hey, I noticed you changed If you want to automatically generate translations for other locales, an Expensify employee will have to:
Alternatively, if you are an external contributor, you can run the translation script locally with your own OpenAI API key. To learn more, try running: npx ts-node ./scripts/generateTranslations.ts --helpTypically, you'd want to translate only what you changed by 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.
|
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 99268a817f
ℹ️ 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".
|
@codex review |
This reverts commit 3c9104d.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f4f5566cdc
ℹ️ 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".
|
Updated |
|
TS would fail because of missing translations, but shouldn't be a blocker for review |
|
@yuwenmemon Please trigger polyglot parrot here |
|
@shubham1206agra Hope translations are not blocking the review? |
🦜 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 a635269d..6d1445c7 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -6647,6 +6647,13 @@ Fordern Sie Spesendetails wie Belege und Beschreibungen an, legen Sie Limits und
upgradeWorkspaceWarningForRestrictedPolicyCreationPrompt:
'Ihr Unternehmen hat das Erstellen von Arbeitsbereichen eingeschränkt. Bitte wenden Sie sich an eine*n Admin, um Hilfe zu erhalten.',
},
+ hr: {
+ title: 'HR-Integrationen',
+ description:
+ 'Verbinden Sie Ihren HR-Anbieter, um Mitarbeitende automatisch zu synchronisieren und Genehmigungsworkflows zu verwalten. Halten Sie Ihr Teamverzeichnis und Ihre Berichtsstruktur ohne manuellen Aufwand auf dem neuesten Stand.',
+ onlyAvailableOnPlan: ({formattedPrice, hasTeam2025Pricing}: {formattedPrice: string; hasTeam2025Pricing: boolean}) =>
+ `<muted-text>HR-Integrationen sind nur im Control-Tarif verfügbar, ab <strong>${formattedPrice}</strong> ${hasTeam2025Pricing ? `pro Mitglied und Monat.` : `pro aktivem Mitglied und Monat.`}</muted-text>`,
+ },
},
downgrade: {
commonFeatures: {
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index fe8ce386..96f40099 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -2622,7 +2622,7 @@ ${amount} pour ${merchant} - ${date}`,
title: 'Dépenses de',
memberAlreadyInWorkflowTitle: 'Membre déjà dans un workflow',
memberAlreadyInWorkflowPrompt: ({memberName, approverName}: {memberName: string; approverName: string}) =>
- `${memberName} fait déjà partie d\u2019un workflow d\u2019approbation qui soumet à ${approverName}. L\u2019ajouter ici le déplacera vers ce workflow.`,
+ `${memberName} fait déjà partie d’un workflow d’approbation qui soumet à ${approverName}. L’ajouter ici le déplacera vers ce workflow.`,
header: 'Quand les membres suivants soumettent des dépenses :',
},
workflowsApproverPage: {
@@ -6669,6 +6669,13 @@ Rendez obligatoires des informations de dépense comme les reçus et les descrip
upgradeWorkspaceWarningForRestrictedPolicyCreationPrompt:
'Votre entreprise a restreint la création d’espaces de travail. Veuillez contacter un administrateur pour obtenir de l’aide.',
},
+ hr: {
+ title: 'Intégrations RH',
+ description:
+ 'Connectez votre fournisseur RH pour synchroniser automatiquement les employés et gérer les workflows d’approbation. Maintenez la liste de votre équipe et la structure de reporting à jour sans travail manuel.',
+ onlyAvailableOnPlan: ({formattedPrice, hasTeam2025Pricing}: {formattedPrice: string; hasTeam2025Pricing: boolean}) =>
+ `<muted-text>Les intégrations RH sont uniquement disponibles avec l’offre Control, à partir de <strong>${formattedPrice}</strong> ${hasTeam2025Pricing ? `par membre et par mois.` : `par membre actif et par mois.`}</muted-text>`,
+ },
},
downgrade: {
commonFeatures: {
diff --git a/src/languages/it.ts b/src/languages/it.ts
index fbc6e646..df01ab04 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -6631,6 +6631,13 @@ Richiedi dettagli sulle spese come ricevute e descrizioni, imposta limiti e valo
upgradeWorkspaceWarning: `Impossibile eseguire l'upgrade dello spazio di lavoro`,
upgradeWorkspaceWarningForRestrictedPolicyCreationPrompt: 'La tua azienda ha limitato la creazione degli spazi di lavoro. Contatta un amministratore per assistenza.',
},
+ hr: {
+ title: 'Integrazioni HR',
+ description:
+ 'Collega il tuo provider HR per sincronizzare automaticamente i dipendenti e gestire i flussi di approvazione. Mantieni l’organigramma del tuo team e la struttura dei report sempre aggiornati senza lavoro manuale.',
+ onlyAvailableOnPlan: ({formattedPrice, hasTeam2025Pricing}: {formattedPrice: string; hasTeam2025Pricing: boolean}) =>
+ `<muted-text>Le integrazioni HR sono disponibili solo con il piano Control, a partire da <strong>${formattedPrice}</strong> ${hasTeam2025Pricing ? `per membro al mese.` : `per membro attivo al mese.`}</muted-text>`,
+ },
},
downgrade: {
commonFeatures: {
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index 5f1f5c7a..e0a45828 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -6559,6 +6559,12 @@ ${reportName}
upgradeWorkspaceWarning: `ワークスペースをアップグレードできません`,
upgradeWorkspaceWarningForRestrictedPolicyCreationPrompt: 'あなたの会社ではワークスペースの作成が制限されています。管理者に連絡してサポートを受けてください。',
},
+ hr: {
+ title: '人事連携',
+ description: '人事システムを連携して、従業員情報を自動で同期し、承認ワークフローを管理できます。チームの名簿とレポートラインを手作業なしで最新の状態に保てます。',
+ onlyAvailableOnPlan: ({formattedPrice, hasTeam2025Pricing}: {formattedPrice: string; hasTeam2025Pricing: boolean}) =>
+ `<muted-text>人事システム連携は、<strong>${formattedPrice}</strong> ${hasTeam2025Pricing ? `メンバー1人あたり月額` : `アクティブメンバー1人あたり、1か月ごと。`}からのControlプランでのみご利用いただけます</muted-text>`,
+ },
},
downgrade: {
commonFeatures: {
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index 6ad319bd..c887aa57 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -6612,6 +6612,13 @@ Vereis onkostendetails zoals bonnen en beschrijvingen, stel limieten en standaar
upgradeWorkspaceWarning: `Kan werkruimte niet upgraden`,
upgradeWorkspaceWarningForRestrictedPolicyCreationPrompt: 'Je bedrijf heeft het aanmaken van werkruimtes beperkt. Neem contact op met een admin voor hulp.',
},
+ hr: {
+ title: 'HR-integraties',
+ description:
+ 'Koppel je HR-provider om automatisch werknemers te synchroniseren en goedkeuringsworkflows te beheren. Houd je teamoverzicht en rapportagestructuur up-to-date zonder handmatig werk.',
+ onlyAvailableOnPlan: ({formattedPrice, hasTeam2025Pricing}: {formattedPrice: string; hasTeam2025Pricing: boolean}) =>
+ `<muted-text>HR-integraties zijn alleen beschikbaar in het Control-abonnement, vanaf <strong>${formattedPrice}</strong> ${hasTeam2025Pricing ? `per lid per maand.` : `per actief lid per maand.`}</muted-text>`,
+ },
},
downgrade: {
commonFeatures: {
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index 289aabbd..11f67a45 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -6604,6 +6604,13 @@ Wymagaj szczegółów wydatków, takich jak paragony i opisy, ustawiaj limity i
upgradeWorkspaceWarningForRestrictedPolicyCreationPrompt:
'Twoja firma ograniczyła możliwość tworzenia przestrzeni roboczych. Skontaktuj się z administratorem, aby uzyskać pomoc.',
},
+ hr: {
+ title: 'Integracje HR',
+ description:
+ 'Połącz się ze swoim dostawcą HR, aby automatycznie synchronizować pracowników i zarządzać ścieżkami akceptacji. Utrzymuj listę członków zespołu i strukturę raportowania na bieżąco, bez ręcznej pracy.',
+ onlyAvailableOnPlan: ({formattedPrice, hasTeam2025Pricing}: {formattedPrice: string; hasTeam2025Pricing: boolean}) =>
+ `<muted-text>Integracje HR są dostępne tylko w planie Control, zaczynającym się od <strong>${formattedPrice}</strong> ${hasTeam2025Pricing ? `za osobę miesięcznie.` : `za aktywnego członka miesięcznie.`}</muted-text>`,
+ },
},
downgrade: {
commonFeatures: {
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index 8b0adb49..afdec086 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -6610,6 +6610,13 @@ Exija dados de despesas como recibos e descrições, defina limites e padrões e
upgradeWorkspaceWarning: `Não é possível atualizar o workspace`,
upgradeWorkspaceWarningForRestrictedPolicyCreationPrompt: 'Sua empresa restringiu a criação de espaços de trabalho. Entre em contato com um administrador para obter ajuda.',
},
+ hr: {
+ title: 'Integrações de RH',
+ description:
+ 'Conecte seu provedor de RH para sincronizar automaticamente funcionários e gerenciar fluxos de aprovação. Mantenha a lista de integrantes da equipe e a estrutura de relatórios sempre atualizadas sem trabalho manual.',
+ onlyAvailableOnPlan: ({formattedPrice, hasTeam2025Pricing}: {formattedPrice: string; hasTeam2025Pricing: boolean}) =>
+ `<muted-text>Integrações de RH estão disponíveis apenas no plano Control, a partir de <strong>${formattedPrice}</strong> ${hasTeam2025Pricing ? `por membro por mês.` : `por membro ativo por mês.`}</muted-text>`,
+ },
},
downgrade: {
commonFeatures: {
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index 8a6d58a4..e7f07d4f 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -6445,6 +6445,12 @@ ${reportName}
upgradeWorkspaceWarning: `无法升级工作空间`,
upgradeWorkspaceWarningForRestrictedPolicyCreationPrompt: '您的公司已限制创建工作区。请联系管理员获取帮助。',
},
+ hr: {
+ title: '人力资源集成',
+ description: '连接你的 HR 提供商,自动同步员工并管理审批流程。无需手动操作,即可保持团队成员名单和汇报结构的最新状态。',
+ onlyAvailableOnPlan: ({formattedPrice, hasTeam2025Pricing}: {formattedPrice: string; hasTeam2025Pricing: boolean}) =>
+ `<muted-text>人力资源集成功能仅在 Control 方案中提供,起价为 <strong>${formattedPrice}</strong> ${hasTeam2025Pricing ? `每位成员每月。` : `每位活跃成员每月。`}</muted-text>`,
+ },
},
downgrade: {
commonFeatures: {
Note You can apply these changes to your branch by copying the patch to your clipboard, then running |
flaviadefaria
left a comment
There was a problem hiding this comment.
Part of an on-going #whatsnext project rollout, approving.
|
@shubham1206agra are you going to complete your review today? |
|
@trjExpensify Yes |
Reviewer Checklist
Screenshots/VideosScreen.Recording.2026-04-19.at.11.34.36.PM.mov |
|
🚧 @yuwenmemon 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! 🧪🧪
|
yuwenmemon
left a comment
There was a problem hiding this comment.
Reviewed and approved. Apologies for merging without stamping first.
|
✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release. |
|
🚀 Deployed to staging by https://github.com/yuwenmemon in version: 9.3.61-0 🚀
Bundle Size Analysis (Sentry): |
|
🚀 Deployed to production by https://github.com/marcaaron in version: 9.3.61-4 🚀
|
| } | ||
|
|
||
| if (policyFeatureStates?.[CONST.POLICY.MORE_FEATURES.IS_HR_ENABLED]) { | ||
| workspaceMenuItems.push({ |
There was a problem hiding this comment.
This comes from #94576.
The More Features navigation is organized as Accounting → Receipt Partners → HR, while the Workspace LHN is currently organized as Accounting → HR → Receipt Partners. To keep the navigation consistent across both locations, we should move HR under Receipt Partners.
| <HeaderWithBackButton | ||
| title={translate('workspace.common.hr')} | ||
| onBackButtonPress={() => Navigation.goBack()} | ||
| /> |
There was a problem hiding this comment.
shouldDisplayHelpButton prop was missing, inconsistent with other workspace setting pages.
Issue: Workspace - Concierge Help Button is missing on HR Connections
Explanation of Change
This PR adds the Gusto HR page setup work on top of the Gusto foundation branch.
It adds the HR workspace routes, screen registrations, linking config, and placeholder HR/Gusto settings pages needed for the next setup step. Also includes the upgrade path for Collect workspaces.
Fixed Issues
$ #87008
PROPOSAL:
Tests
gustoNewDotbeta.gustoNewDotbeta.Offline tests
QA Steps
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectiontoggleReportand notonIconClick)src/languages/*files and using the translation methodSTYLE.md) were followedAvatar, 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.ScrollViewcomponent to make it scrollable when more elements are added to the page.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
Screen.Recording.2026-04-21.at.12.47.59.AM.mov
Android: mWeb Chrome
Screen.Recording.2026-04-21.at.12.30.15.AM.mov
iOS: Native
Screen.Recording.2026-04-21.at.12.16.55.AM.mov
iOS: mWeb Safari
Screen.Recording.2026-04-21.at.12.26.57.AM.mov
MacOS: Chrome / Safari
Screen.Recording.2026-04-18.at.1.48.16.AM.mov
Screen.Recording.2026-04-18.at.11.11.43.AM.mov