Certinia/r1 pr3 certinia import - #91221
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 |
206a2ed to
fe4f6b7
Compare
🦜 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 23ae6833..50edd579 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -4852,6 +4852,21 @@ ${amount} für ${merchant} – ${date}`,
oauthDescription: 'Um die Einrichtung abzuschließen, müssen Sie sich über Salesforce und Certinia anmelden.\n\nVerwenden Sie die Schaltfläche unten, um fortzufahren.',
connectButton: 'Mit Certinia verbinden',
},
+ import: {
+ chartOfAccounts: 'Kontenplan',
+ chartOfAccountsDescription: 'Der Kontenplan wird als Kategorien in Expensify importiert.',
+ dimensionMapping: ({n}: {n: number}) => `Dimension ${n}`,
+ dimensions: {dimension1: 'Dimension 1', dimension2: 'Dimension 2', dimension3: 'Dimension 3', dimension4: 'Dimension 4'},
+ doNotMap: 'Nicht zuordnen',
+ doNotMapSubtitle: 'Mitarbeiterressource standardmäßig verwenden',
+ importedAsTags: 'Als Tags importiert',
+ importedAsReportFields: 'Als Berichtsfelder importiert',
+ mappingTypes: {
+ [CONST.CERTINIA_MAPPING_VALUE.DEFAULT]: 'Nicht zuordnen',
+ [CONST.CERTINIA_MAPPING_VALUE.TAG]: 'Als Tags importiert',
+ [CONST.CERTINIA_MAPPING_VALUE.REPORT_FIELD]: 'Als Berichtsfelder importiert',
+ },
+ },
},
netsuite: {
subsidiary: 'Tochtergesellschaft',
diff --git a/src/languages/es.ts b/src/languages/es.ts
index 35f4cc98..f29d4225 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -4736,6 +4736,21 @@ ${amount} para ${merchant} - ${date}`,
oauthDescription: 'Para terminar la configuración, tendrás que iniciar sesión a través de Salesforce y Certinia.\n\nUsa el botón de abajo para continuar.',
connectButton: 'Conectar con Certinia',
},
+ import: {
+ chartOfAccounts: 'Plan de cuentas',
+ chartOfAccountsDescription: 'El plan de cuentas se importa en Expensify como categorías.',
+ dimensionMapping: ({n}: {n: number}) => `Dimensión ${n}`,
+ dimensions: {dimension1: 'Dimensión 1', dimension2: 'Dimensión 2', dimension3: 'Dimensión 3', dimension4: 'Dimensión 4'},
+ doNotMap: 'No asignar',
+ doNotMapSubtitle: 'Usar recurso de empleado por defecto',
+ importedAsTags: 'Importado como etiquetas',
+ importedAsReportFields: 'Importado como campos de informe',
+ mappingTypes: {
+ [CONST.CERTINIA_MAPPING_VALUE.DEFAULT]: 'No asignar',
+ [CONST.CERTINIA_MAPPING_VALUE.TAG]: 'Importado como etiquetas',
+ [CONST.CERTINIA_MAPPING_VALUE.REPORT_FIELD]: 'Importado como campos de informe',
+ },
+ },
},
netsuite: {
subsidiary: 'Subsidiaria',
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index b43bdd5c..f099cd9c 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -4862,6 +4862,21 @@ ${amount} pour ${merchant} - ${date}`,
oauthDescription: 'Pour terminer la configuration, vous devez vous connecter via Salesforce et Certinia.\n\nUtilisez le bouton ci-dessous pour continuer.',
connectButton: 'Se connecter à Certinia',
},
+ import: {
+ chartOfAccounts: 'Plan comptable',
+ chartOfAccountsDescription: 'Le plan comptable est importé dans Expensify en tant que catégories.',
+ dimensionMapping: ({n}: {n: number}) => `Dimension ${n}`,
+ dimensions: {dimension1: 'Dimension 1', dimension2: 'Dimension 2', dimension3: 'Dimension 3', dimension4: 'Dimension 4'},
+ doNotMap: 'Ne pas mapper',
+ doNotMapSubtitle: 'Utiliser la ressource employé par défaut',
+ importedAsTags: 'Importé comme tags',
+ importedAsReportFields: 'Importé en tant que champs de note de frais',
+ mappingTypes: {
+ [CONST.CERTINIA_MAPPING_VALUE.DEFAULT]: 'Ne pas mapper',
+ [CONST.CERTINIA_MAPPING_VALUE.TAG]: 'Importé comme tags',
+ [CONST.CERTINIA_MAPPING_VALUE.REPORT_FIELD]: 'Importé en tant que champs de note de frais',
+ },
+ },
},
netsuite: {
subsidiary: 'Filiale',
diff --git a/src/languages/it.ts b/src/languages/it.ts
index a2f42231..36c0316c 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -4837,6 +4837,21 @@ ${amount} per ${merchant} - ${date}`,
oauthDescription: 'Per completare la configurazione, dovrai accedere tramite Salesforce e Certinia.\n\nUsa il pulsante qui sotto per continuare.',
connectButton: 'Connetti a Certinia',
},
+ import: {
+ chartOfAccounts: 'Piano dei conti',
+ chartOfAccountsDescription: 'Il piano dei conti viene importato in Expensify come categorie.',
+ dimensionMapping: ({n}: {n: number}) => `Dimensione ${n}`,
+ dimensions: {dimension1: 'Dimensione 1', dimension2: 'Dimensione 2', dimension3: 'Dimensione 3', dimension4: 'Dimensione 4'},
+ doNotMap: 'Non mappare',
+ doNotMapSubtitle: 'Usa come predefinita la risorsa dipendente',
+ importedAsTags: 'Importato come tag',
+ importedAsReportFields: 'Importato come campi del report',
+ mappingTypes: {
+ [CONST.CERTINIA_MAPPING_VALUE.DEFAULT]: 'Non mappare',
+ [CONST.CERTINIA_MAPPING_VALUE.TAG]: 'Importato come tag',
+ [CONST.CERTINIA_MAPPING_VALUE.REPORT_FIELD]: 'Importato come campi del report',
+ },
+ },
},
netsuite: {
subsidiary: 'Filiale',
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index cc303469..ada3b84b 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -4794,6 +4794,21 @@ ${integrationName === CONST.ONBOARDING_ACCOUNTING_MAPPING.other ? 'あなたの'
oauthDescription: '設定を完了するには、Salesforce と Certinia を通じてサインインする必要があります。\n\n続行するには、下のボタンを使用してください。',
connectButton: 'Certinia に接続',
},
+ import: {
+ chartOfAccounts: '勘定科目表',
+ chartOfAccountsDescription: '勘定科目表は、カテゴリとして Expensify にインポートされます。',
+ dimensionMapping: ({n}: {n: number}) => `ディメンション ${n}`,
+ dimensions: {dimension1: 'ディメンション 1', dimension2: 'ディメンション 2', dimension3: 'ディメンション 3', dimension4: 'ディメンション4'},
+ doNotMap: 'マッピングしない',
+ doNotMapSubtitle: '従業員リソースをデフォルトで使用する',
+ importedAsTags: 'タグとしてインポート済み',
+ importedAsReportFields: 'レポートフィールドとしてインポートしました',
+ mappingTypes: {
+ [CONST.CERTINIA_MAPPING_VALUE.DEFAULT]: 'マッピングしない',
+ [CONST.CERTINIA_MAPPING_VALUE.TAG]: 'タグとしてインポート済み',
+ [CONST.CERTINIA_MAPPING_VALUE.REPORT_FIELD]: 'レポートフィールドとしてインポートしました',
+ },
+ },
},
netsuite: {
subsidiary: '子会社',
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index bf9d5f8c..80b86232 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -4828,6 +4828,21 @@ ${amount} voor ${merchant} - ${date}`,
oauthDescription: 'Om de installatie te voltooien, moet je je aanmelden via Salesforce en Certinia.\n\nGebruik de knop hieronder om door te gaan.',
connectButton: 'Verbind met Certinia',
},
+ import: {
+ chartOfAccounts: 'Rekeningschema',
+ chartOfAccountsDescription: 'Het grootboekschema wordt in Expensify geïmporteerd als categorieën.',
+ dimensionMapping: ({n}: {n: number}) => `Dimensie ${n}`,
+ dimensions: {dimension1: 'Dimensie 1', dimension2: 'Dimensie 2', dimension3: 'Dimensie 3', dimension4: 'Dimensie 4'},
+ doNotMap: 'Niet toewijzen',
+ doNotMapSubtitle: 'Standaard werknemersbron gebruiken',
+ importedAsTags: 'Geïmporteerd als labels',
+ importedAsReportFields: 'Geïmporteerd als rapportvelden',
+ mappingTypes: {
+ [CONST.CERTINIA_MAPPING_VALUE.DEFAULT]: 'Niet toewijzen',
+ [CONST.CERTINIA_MAPPING_VALUE.TAG]: 'Geïmporteerd als labels',
+ [CONST.CERTINIA_MAPPING_VALUE.REPORT_FIELD]: 'Geïmporteerd als rapportvelden',
+ },
+ },
},
netsuite: {
subsidiary: 'Dochteronderneming',
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index af2495e8..a82f0346 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -4820,6 +4820,21 @@ ${amount} dla ${merchant} - ${date}`,
oauthDescription: 'Aby zakończyć konfigurację, musisz się zalogować przez Salesforce i Certinia.\n\nUżyj przycisku poniżej, żeby kontynuować.',
connectButton: 'Połącz z Certinia',
},
+ import: {
+ chartOfAccounts: 'Plan kont',
+ chartOfAccountsDescription: 'Plan kont jest importowany do Expensify jako kategorie.',
+ dimensionMapping: ({n}: {n: number}) => `Wymiar ${n}`,
+ dimensions: {dimension1: 'Wymiar 1', dimension2: 'Wymiar 2', dimension3: 'Wymiar 3', dimension4: 'Wymiar 4'},
+ doNotMap: 'Nie mapuj',
+ doNotMapSubtitle: 'Domyślnie użyj zasobu pracownika',
+ importedAsTags: 'Zaimportowano jako tagi',
+ importedAsReportFields: 'Zaimportowano jako pola raportu',
+ mappingTypes: {
+ [CONST.CERTINIA_MAPPING_VALUE.DEFAULT]: 'Nie mapuj',
+ [CONST.CERTINIA_MAPPING_VALUE.TAG]: 'Zaimportowano jako tagi',
+ [CONST.CERTINIA_MAPPING_VALUE.REPORT_FIELD]: 'Zaimportowano jako pola raportu',
+ },
+ },
},
netsuite: {
subsidiary: 'Spółka zależna',
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index f81081cc..54a3c03e 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -4823,6 +4823,21 @@ ${amount} para ${merchant} - ${date}`,
oauthDescription: 'Para concluir a configuração, você precisa entrar pelo Salesforce e pela Certinia.\n\nUse o botão abaixo para continuar.',
connectButton: 'Conectar ao Certinia',
},
+ import: {
+ chartOfAccounts: 'Plano de contas',
+ chartOfAccountsDescription: 'O plano de contas é importado para o Expensify como categorias.',
+ dimensionMapping: ({n}: {n: number}) => `Dimensão ${n}`,
+ dimensions: {dimension1: 'Dimensão 1', dimension2: 'Dimensão 2', dimension3: 'Dimensão 3', dimension4: 'Dimensão 4'},
+ doNotMap: 'Não mapear',
+ doNotMapSubtitle: 'Usar recurso de funcionário por padrão',
+ importedAsTags: 'Importado como tags',
+ importedAsReportFields: 'Importado como campos de relatório',
+ mappingTypes: {
+ [CONST.CERTINIA_MAPPING_VALUE.DEFAULT]: 'Não mapear',
+ [CONST.CERTINIA_MAPPING_VALUE.TAG]: 'Importado como tags',
+ [CONST.CERTINIA_MAPPING_VALUE.REPORT_FIELD]: 'Importado como campos de relatório',
+ },
+ },
},
netsuite: {
subsidiary: 'Subsidiária',
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index 60240c63..82caaf3a 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -4704,6 +4704,21 @@ ${amount},商户:${merchant} - 日期:${date}`,
oauthDescription: '要完成设置,您需要通过 Salesforce 和 Certinia 登录。\n\n请使用下方按钮继续。',
connectButton: '连接到 Certinia',
},
+ import: {
+ chartOfAccounts: '会计科目表',
+ chartOfAccountsDescription: '会计科目表会作为类别导入 Expensify。',
+ dimensionMapping: ({n}: {n: number}) => `维度 ${n}`,
+ dimensions: {dimension1: '维度 1', dimension2: '维度 2', dimension3: '维度 3', dimension4: '维度 4'},
+ doNotMap: '不要映射',
+ doNotMapSubtitle: '默认使用员工资源',
+ importedAsTags: '已作为标签导入',
+ importedAsReportFields: '已作为报表字段导入',
+ mappingTypes: {
+ [CONST.CERTINIA_MAPPING_VALUE.DEFAULT]: '不要映射',
+ [CONST.CERTINIA_MAPPING_VALUE.TAG]: '已作为标签导入',
+ [CONST.CERTINIA_MAPPING_VALUE.REPORT_FIELD]: '已作为报表字段导入',
+ },
+ },
},
netsuite: {
subsidiary: '子公司',
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.
|
… Accounting - Inbox opens after refreshing Certinia setup RHP Fixes Expensify#91376
|
@thelullabyy 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] |
Reviewer Checklist
Screenshots/VideosAndroid: HybridAppAndroid: mWeb ChromeiOS: HybridAppiOS: mWeb SafariMacOS: Chrome / SafariScreen.Recording.2026-06-04.at.04.10.55.movScreen.Recording.2026-06-04.at.04.07.49.movScreen.Recording.2026-06-04.at.04.04.39.mov |
| dimension4: 'Dimension 4', | ||
| }, | ||
| doNotMap: 'Do not map', | ||
| doNotMapSubtitle: 'Use employee resource on default', |
There was a problem hiding this comment.
Where do we get this copy? I couldn't find them in the doc
There was a problem hiding this comment.
From the mocks.
|
Overall, the changes look good. Added minor comments @ChavdaSachin |
|
@thelullabyy, the comments are addressed, back to you for the approval. |
|
@ChavdaSachin Test failed. Please fix so I can approve |
|
@ChavdaSachin friendly bump |
|
@ChavdaSachin bump here please |
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 451be4fae9
ℹ️ 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".
| onExportPagePress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_CERTINIA_EXPORT.getRoute(policyID)), | ||
| subscribedExportSettings: [], | ||
| onAdvancedPagePress: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_CERTINIA_ADVANCED.getRoute(policyID)), |
There was a problem hiding this comment.
Do not expose unregistered Certinia settings pages
When a verified Certinia connection renders the accounting configuration menu, these new handlers expose the Export and Advanced rows, but repo-wide search shows only CertiniaImportPage and CertiniaDimensionMappingPage are registered in ModalStackNavigators/index.tsx and present under src/pages/workspace/accounting/certinia. Pressing Export or Advanced therefore navigates to CERTINIA_EXPORT / CERTINIA_ADVANCED routes that have no screen component, leaving the action unhandled instead of opening a settings page. Until those pages are added, these rows should stay hidden for Certinia or point to implemented screens.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
I think they will be tackled in follow-up PRs right? @ChavdaSachin
|
🚧 @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! 🧪🧪
|
|
🚀 Deployed to staging by https://github.com/yuwenmemon in version: 9.4.0-0 🚀
Bundle Size Analysis (Sentry): |
|
Deploy Blocker #92849 was identified to be related to this PR. |
|
🚀 Deployed to production by https://github.com/Julesssss in version: 9.4.0-7 🚀
|
Explanation of Change
Fixed Issues
$ #89434
PROPOSAL:
Tests
Offline tests
QA Steps
// TODO: These must be filled out, or the issue title must include "[No QA]."
Test 1.
Prerequisites: Connect a workspace to Certinia.
Test 2.
Prerequisites: Connect a workspace to Certinia.
Sync nowfrom the menu.Test 3.
connectbutton in the certinia row.Connect to Certiniafrom the menu.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.Screenshots/Videos
Android: Native
Android: mWeb Chrome
iOS: Native
iOS: mWeb Safari
MacOS: Chrome / Safari
Screen.Recording.2026-05-28.at.1.16.59.PM.mov
Screen.Recording.2026-05-28.at.1.17.56.PM.mov
Screen.Recording.2026-05-28.at.1.18.49.PM.mov