Repository navigation
[Certinia] R2 PSA: Import page (PSA branch) and CertiniaTagsMappingPage - #93899
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 |
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 89ee628060
ℹ️ 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".
|
@yuwenmemon Please help trigger translation once you having time. Thanks |
🦜 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 baae98a4a96..cb1bd4d4e02 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -5047,6 +5047,16 @@ ${amount} für ${merchant} – ${date}`,
[CONST.CERTINIA_MAPPING_VALUE.TAG]: 'Als Tags importiert',
[CONST.CERTINIA_MAPPING_VALUE.REPORT_FIELD]: 'Als Berichtsfelder importiert',
},
+ expenseTypeGlaMappings: 'Ausgabentyp-GLA-Zuordnungen',
+ expenseTypeGlaMappingsDescription: 'FinancialForce Expense Type GLA-Zuordnungen werden als Kategorien in Expensify importiert.',
+ tagsMappedTo: 'Tags sollten zugeordnet werden zu',
+ milestones: 'Meilensteine',
+ milestonesDescription: 'Wenn aktiviert, werden mit PSA-Projekten verknüpfte Meilensteine mit Expensify synchronisiert.',
+ parentTagMappingTypes: {
+ [CONST.CERTINIA_PARENT_TAG_MAPPING.PARENT_TAG_PROJECTS_AND_ASSIGNMENTS]: 'Projekte und Zuweisungen',
+ [CONST.CERTINIA_PARENT_TAG_MAPPING.PARENT_TAG_PROJECTS]: 'Projekte',
+ [CONST.CERTINIA_PARENT_TAG_MAPPING.PARENT_TAG_ASSIGNMENTS]: 'Zuweisungen',
+ },
},
},
netsuite: {
diff --git a/src/languages/es.ts b/src/languages/es.ts
index 4ad01d8ab84..451364caca0 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -4928,6 +4928,16 @@ ${amount} para ${merchant} - ${date}`,
[CONST.CERTINIA_MAPPING_VALUE.TAG]: 'Importado como etiquetas',
[CONST.CERTINIA_MAPPING_VALUE.REPORT_FIELD]: 'Importado como campos de informe',
},
+ expenseTypeGlaMappings: 'Asignaciones de GLA por tipo de gasto',
+ expenseTypeGlaMappingsDescription: 'Las asignaciones de GLA de tipo de gasto de FinancialForce se importan en Expensify como categorías.',
+ tagsMappedTo: 'Las etiquetas deben asignarse a',
+ milestones: 'Hitos',
+ milestonesDescription: 'Cuando está habilitado, los hitos asociados con proyectos PSA se sincronizan en Expensify.',
+ parentTagMappingTypes: {
+ [CONST.CERTINIA_PARENT_TAG_MAPPING.PARENT_TAG_PROJECTS_AND_ASSIGNMENTS]: 'Proyectos y asignaciones',
+ [CONST.CERTINIA_PARENT_TAG_MAPPING.PARENT_TAG_PROJECTS]: 'Proyectos',
+ [CONST.CERTINIA_PARENT_TAG_MAPPING.PARENT_TAG_ASSIGNMENTS]: 'Asignaciones',
+ },
},
},
netsuite: {
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index a33070ee4e8..b9e7ce92be5 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -5059,6 +5059,16 @@ ${amount} pour ${merchant} - ${date}`,
[CONST.CERTINIA_MAPPING_VALUE.TAG]: 'Importé comme tags',
[CONST.CERTINIA_MAPPING_VALUE.REPORT_FIELD]: 'Importé en tant que champs de note de frais',
},
+ expenseTypeGlaMappings: 'Correspondances GLA par type de dépense',
+ expenseTypeGlaMappingsDescription: 'Les correspondances des comptes GLA de type de dépense FinancialForce sont importées dans Expensify en tant que catégories.',
+ tagsMappedTo: 'Les tags doivent être associés à',
+ milestones: 'Jalons',
+ milestonesDescription: 'Lorsque cette option est activée, les jalons associés aux projets PSA sont synchronisés avec Expensify.',
+ parentTagMappingTypes: {
+ [CONST.CERTINIA_PARENT_TAG_MAPPING.PARENT_TAG_PROJECTS_AND_ASSIGNMENTS]: 'Projets et affectations',
+ [CONST.CERTINIA_PARENT_TAG_MAPPING.PARENT_TAG_PROJECTS]: 'Projets',
+ [CONST.CERTINIA_PARENT_TAG_MAPPING.PARENT_TAG_ASSIGNMENTS]: 'Affectations',
+ },
},
},
netsuite: {
diff --git a/src/languages/it.ts b/src/languages/it.ts
index df1a2df35c1..9d6cac65d11 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -5032,6 +5032,16 @@ ${amount} per ${merchant} - ${date}`,
[CONST.CERTINIA_MAPPING_VALUE.TAG]: 'Importato come tag',
[CONST.CERTINIA_MAPPING_VALUE.REPORT_FIELD]: 'Importato come campi del report',
},
+ expenseTypeGlaMappings: 'Mappature GLA per tipo di spesa',
+ expenseTypeGlaMappingsDescription: 'Le mappature GLA dei tipi di spesa di FinancialForce vengono importate in Expensify come categorie.',
+ tagsMappedTo: 'I tag dovrebbero essere mappati a',
+ milestones: 'Traguardi',
+ milestonesDescription: 'Quando è attivata, le milestone associate ai progetti PSA vengono sincronizzate in Expensify.',
+ parentTagMappingTypes: {
+ [CONST.CERTINIA_PARENT_TAG_MAPPING.PARENT_TAG_PROJECTS_AND_ASSIGNMENTS]: 'Progetti e incarichi',
+ [CONST.CERTINIA_PARENT_TAG_MAPPING.PARENT_TAG_PROJECTS]: 'Progetti',
+ [CONST.CERTINIA_PARENT_TAG_MAPPING.PARENT_TAG_ASSIGNMENTS]: 'Assegnazioni',
+ },
},
},
netsuite: {
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index ab95fab380b..c2e6783b2b3 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -4987,6 +4987,16 @@ ${integrationName === CONST.ONBOARDING_ACCOUNTING_MAPPING.other ? 'あなたの'
[CONST.CERTINIA_MAPPING_VALUE.TAG]: 'タグとしてインポート済み',
[CONST.CERTINIA_MAPPING_VALUE.REPORT_FIELD]: 'レポートフィールドとしてインポートしました',
},
+ expenseTypeGlaMappings: '経費タイプのGLAマッピング',
+ expenseTypeGlaMappingsDescription: 'FinancialForce の経費タイプ GLA マッピングは、Expensify にカテゴリとしてインポートされます。',
+ tagsMappedTo: 'タグは次の項目にマッピングされます',
+ milestones: 'マイルストーン',
+ milestonesDescription: '有効にすると、PSA プロジェクトに関連付けられているマイルストーンが Expensify に同期されます。',
+ parentTagMappingTypes: {
+ [CONST.CERTINIA_PARENT_TAG_MAPPING.PARENT_TAG_PROJECTS_AND_ASSIGNMENTS]: 'プロジェクトと割り当て',
+ [CONST.CERTINIA_PARENT_TAG_MAPPING.PARENT_TAG_PROJECTS]: 'プロジェクト',
+ [CONST.CERTINIA_PARENT_TAG_MAPPING.PARENT_TAG_ASSIGNMENTS]: 'アサインメント',
+ },
},
},
netsuite: {
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index 018486676a8..88a05a9a9b5 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -5022,6 +5022,16 @@ ${amount} voor ${merchant} - ${date}`,
[CONST.CERTINIA_MAPPING_VALUE.TAG]: 'Geïmporteerd als labels',
[CONST.CERTINIA_MAPPING_VALUE.REPORT_FIELD]: 'Geïmporteerd als rapportvelden',
},
+ expenseTypeGlaMappings: 'Kosten-type GLA-koppelingen',
+ expenseTypeGlaMappingsDescription: 'FinancialForce Expense Type GLA-koppelingen worden in Expensify geïmporteerd als categorieën.',
+ tagsMappedTo: 'Tags moeten worden toegewezen aan',
+ milestones: 'Mijlpalen',
+ milestonesDescription: 'Als deze optie is ingeschakeld, worden met PSA-projecten gekoppelde mijlpalen gesynchroniseerd met Expensify.',
+ parentTagMappingTypes: {
+ [CONST.CERTINIA_PARENT_TAG_MAPPING.PARENT_TAG_PROJECTS_AND_ASSIGNMENTS]: 'Projecten en opdrachten',
+ [CONST.CERTINIA_PARENT_TAG_MAPPING.PARENT_TAG_PROJECTS]: 'Projecten',
+ [CONST.CERTINIA_PARENT_TAG_MAPPING.PARENT_TAG_ASSIGNMENTS]: 'Taken',
+ },
},
},
netsuite: {
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index 011871e5192..d1222133781 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -5015,6 +5015,16 @@ ${amount} dla ${merchant} - ${date}`,
[CONST.CERTINIA_MAPPING_VALUE.TAG]: 'Zaimportowano jako tagi',
[CONST.CERTINIA_MAPPING_VALUE.REPORT_FIELD]: 'Zaimportowano jako pola raportu',
},
+ expenseTypeGlaMappings: 'Mapowania GLA typów wydatków',
+ expenseTypeGlaMappingsDescription: 'Mapowania GLA typu wydatku FinancialForce są importowane do Expensify jako kategorie.',
+ tagsMappedTo: 'Tagi powinny być odwzorowane na',
+ milestones: 'Kamienie milowe',
+ milestonesDescription: 'Po włączeniu kamienie milowe powiązane z projektami PSA są synchronizowane z Expensify.',
+ parentTagMappingTypes: {
+ [CONST.CERTINIA_PARENT_TAG_MAPPING.PARENT_TAG_PROJECTS_AND_ASSIGNMENTS]: 'Projekty i zadania',
+ [CONST.CERTINIA_PARENT_TAG_MAPPING.PARENT_TAG_PROJECTS]: 'Projekty',
+ [CONST.CERTINIA_PARENT_TAG_MAPPING.PARENT_TAG_ASSIGNMENTS]: 'Przydziały',
+ },
},
},
netsuite: {
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index fbd9121d037..1d4ceee2bcb 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -5013,6 +5013,16 @@ ${amount} para ${merchant} - ${date}`,
[CONST.CERTINIA_MAPPING_VALUE.TAG]: 'Importado como tags',
[CONST.CERTINIA_MAPPING_VALUE.REPORT_FIELD]: 'Importado como campos de relatório',
},
+ expenseTypeGlaMappings: 'Mapeamentos de GLA por tipo de despesa',
+ expenseTypeGlaMappingsDescription: 'Os mapeamentos de GLA de tipo de despesa do FinancialForce são importados para o Expensify como categorias.',
+ tagsMappedTo: 'As tags devem ser mapeadas para',
+ milestones: 'Marcos',
+ milestonesDescription: 'Quando ativado, os marcos associados a projetos PSA são sincronizados com o Expensify.',
+ parentTagMappingTypes: {
+ [CONST.CERTINIA_PARENT_TAG_MAPPING.PARENT_TAG_PROJECTS_AND_ASSIGNMENTS]: 'Projetos e atribuições',
+ [CONST.CERTINIA_PARENT_TAG_MAPPING.PARENT_TAG_PROJECTS]: 'Projetos',
+ [CONST.CERTINIA_PARENT_TAG_MAPPING.PARENT_TAG_ASSIGNMENTS]: 'Atribuições',
+ },
},
},
netsuite: {
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index 4fe029f7abe..031613f441d 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -4891,6 +4891,16 @@ ${amount},商户:${merchant} - 日期:${date}`,
[CONST.CERTINIA_MAPPING_VALUE.TAG]: '已作为标签导入',
[CONST.CERTINIA_MAPPING_VALUE.REPORT_FIELD]: '已作为报表字段导入',
},
+ expenseTypeGlaMappings: '费用类型 GLA 映射',
+ expenseTypeGlaMappingsDescription: 'FinancialForce 费用类型 GLA 映射会作为类别导入到 Expensify 中。',
+ tagsMappedTo: '标签应映射到',
+ milestones: '里程碑',
+ milestonesDescription: '启用后,与 PSA 项目关联的里程碑会同步到 Expensify。',
+ parentTagMappingTypes: {
+ [CONST.CERTINIA_PARENT_TAG_MAPPING.PARENT_TAG_PROJECTS_AND_ASSIGNMENTS]: '项目和任务',
+ [CONST.CERTINIA_PARENT_TAG_MAPPING.PARENT_TAG_PROJECTS]: '项目',
+ [CONST.CERTINIA_PARENT_TAG_MAPPING.PARENT_TAG_ASSIGNMENTS]: '任务',
+ },
},
},
netsuite: {
Note You can apply these changes to your branch by copying the patch to your clipboard, then running |
…to receipt management. Updated multiple components to utilize transaction violations when detaching and replacing receipts, ensuring better compliance tracking. This includes modifications in TransactionReceiptModalContent, useReceiptDrop, MoneyRequestReceiptView, and related actions.
Codecov Report✅ Changes either increased or maintained existing code coverage, great job!
|
|
@codex review |
|
@QichenZhu 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] |
|
Codex Review: Didn't find any major issues. Hooray! Reviewed commit: ℹ️ About Codex in GitHubCodex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
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". |
|
@ShridharGoel Please do initial review - please note that the |
|
@QichenZhu Please ignore the assignment as @ShridharGoel will review this PR. Melvin went wrong somehow |
trjExpensify
left a comment
There was a problem hiding this comment.
Core PR for a WN project. 👍
Reviewer Checklist
Screenshots/VideosMacOS: Chrome / SafariScreen.Recording.2026-06-23.at.10.29.52.AM.mov |
|
Dimension page can be directly opened using PSA user shouldn't be able to open dimensions page and FFA user shouldn't be able to open tags page. |
@ShridharGoel Fixed |
|
🚧 yuwenmemon has triggered a test Expensify/App build. You can view the workflow run here. |
|
✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release. |
|
🧪🧪 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.19-1 🚀
Bundle Size Analysis (Sentry): |
|
🚀 Deployed to production by https://github.com/blimpich in version: 9.4.19-5 🚀
|

Explanation of Change
Fixed Issues
$ #89439
PROPOSAL:
Tests
Prerequisites
A Control workspace with a Certinia (FinancialForce) connection.
Ability to test both connection modes:
PSA mode: config.hasPSA === true
FFA-only mode: config.hasPSA === false
Be an admin on the workspace.
Test 1:
-Expense type GLA mappings toggle - ON and disabled (cannot be toggled), with the description "FinancialForce Expense Type GLA Mappings are imported into Expensify as categories."
Test 2
Test 3
Offline tests
QA Steps
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectiontoggleReportand notonIconClick)Avatar, 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
Screen.Recording.2026-06-21.at.13.44.11.mov