Repository navigation
[HOLD BE] feat: Add support for group-by:approver - #102635
nkdengineer wants to merge 14 commits into
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 bun ./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.
|
🦜 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 8eeada0a..582f5559 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -9943,7 +9943,7 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc
[CONST.SEARCH.GROUP_BY.WEEK]: 'Woche',
[CONST.SEARCH.GROUP_BY.YEAR]: 'Jahr',
[CONST.SEARCH.GROUP_BY.QUARTER]: 'Quartal',
- [CONST.SEARCH.GROUP_BY.VIOLATION_APPROVER]: 'Verstoßgenehmiger',
+ [CONST.SEARCH.GROUP_BY.VIOLATION_APPROVER]: 'Verstoßgenehmigende Person',
},
feed: 'Feed',
withdrawalType: {
@@ -9953,8 +9953,8 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc
},
is: 'Ist',
has: {submittedViolation: 'Eingereichter Verstoß', approvedViolation: 'Genehmigter Verstoß'},
- approvalCount: 'Anzahl der Genehmigungen',
- approvedTotal: 'Genehmigter Gesamtbetrag',
+ approvalCount: 'Genehmigungsanzahl',
+ approvedTotal: 'Genehmigte Gesamtsumme',
action: {
[CONST.SEARCH.ACTION_FILTERS.SUBMIT]: 'Senden',
[CONST.SEARCH.ACTION_FILTERS.APPROVE]: 'Genehmigen',
@@ -9998,7 +9998,7 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc
[CONST.SEARCH.GROUP_BY.WEEK]: 'Wochen',
[CONST.SEARCH.GROUP_BY.YEAR]: 'Jahre',
[CONST.SEARCH.GROUP_BY.QUARTER]: 'Quartale',
- [CONST.SEARCH.GROUP_BY.VIOLATION_APPROVER]: 'Verstoßgenehmiger',
+ [CONST.SEARCH.GROUP_BY.VIOLATION_APPROVER]: 'Verstoßgenehmigende Personen',
},
moneyRequestReport: {emptyStateTitle: 'Noch keine Ausgaben', accessPlaceHolder: 'Für Details öffnen'},
noCategory: 'Keine Kategorie',
diff --git a/src/languages/el.ts b/src/languages/el.ts
index e185137c..37ed8917 100644
--- a/src/languages/el.ts
+++ b/src/languages/el.ts
@@ -10151,7 +10151,7 @@ ${reportName}`,
[CONST.SEARCH.GROUP_BY.WEEK]: 'Εβδομάδα',
[CONST.SEARCH.GROUP_BY.YEAR]: 'Έτος',
[CONST.SEARCH.GROUP_BY.QUARTER]: 'Τρίμηνο',
- [CONST.SEARCH.GROUP_BY.VIOLATION_APPROVER]: 'Εγκριτής παραβάσεων',
+ [CONST.SEARCH.GROUP_BY.VIOLATION_APPROVER]: 'Εγκρίνων παραβάσεων',
},
feed: 'Ροή',
withdrawalType: {
@@ -10167,8 +10167,8 @@ ${reportName}`,
[CONST.SEARCH.ACTION_FILTERS.EXPORT]: 'Εξαγωγή',
},
has: {submittedViolation: 'Υποβληθείσα παράβαση', approvedViolation: 'Εγκεκριμένη παράβαση'},
- approvalCount: 'Αριθμός εγκρίσεων',
- approvedTotal: 'Εγκεκριμένο σύνολο',
+ approvalCount: 'Μετρητής εγκρίσεων',
+ approvedTotal: 'Συνολικό εγκεκριμένο ποσό',
filterType: {
label: 'Τύπος φίλτρου',
has: {positive: 'έχει', negative: 'δεν έχει'},
@@ -10208,9 +10208,9 @@ ${reportName}`,
[CONST.SEARCH.GROUP_BY.DAY]: 'Ημέρες',
[CONST.SEARCH.GROUP_BY.MONTH]: 'Μήνες',
[CONST.SEARCH.GROUP_BY.WEEK]: 'Εβδομάδες',
- [CONST.SEARCH.GROUP_BY.YEAR]: 'Έτη',
+ [CONST.SEARCH.GROUP_BY.YEAR]: 'Χρόνια',
[CONST.SEARCH.GROUP_BY.QUARTER]: 'Τρίμηνα',
- [CONST.SEARCH.GROUP_BY.VIOLATION_APPROVER]: 'Εγκριτές παραβάσεων',
+ [CONST.SEARCH.GROUP_BY.VIOLATION_APPROVER]: 'Εγκρίνοντες παραβάσεων',
},
moneyRequestReport: {
emptyStateTitle: 'Καμία δαπάνη ακόμη',
diff --git a/src/languages/es.ts b/src/languages/es.ts
index 06e08396..25452686 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -9789,9 +9789,9 @@ ${reportName}`,
groupBy: {
[CONST.SEARCH.GROUP_BY.FROM]: 'De',
[CONST.SEARCH.GROUP_BY.CARD]: 'Tarjeta',
- [CONST.SEARCH.GROUP_BY.WITHDRAWAL_ID]: 'ID de retiro',
+ [CONST.SEARCH.GROUP_BY.WITHDRAWAL_ID]: 'ID de retirada',
[CONST.SEARCH.GROUP_BY.CATEGORY]: 'Categoría',
- [CONST.SEARCH.GROUP_BY.MERCHANT]: 'Comerciante',
+ [CONST.SEARCH.GROUP_BY.MERCHANT]: 'Comercio',
[CONST.SEARCH.GROUP_BY.TAG]: 'Etiqueta',
[CONST.SEARCH.GROUP_BY.DAY]: 'Día',
[CONST.SEARCH.GROUP_BY.MONTH]: 'Mes',
@@ -9832,7 +9832,7 @@ ${reportName}`,
[CONST.SEARCH.GROUP_BY.CARD]: 'Tarjetas',
[CONST.SEARCH.GROUP_BY.WITHDRAWAL_ID]: 'Exportaciones',
[CONST.SEARCH.GROUP_BY.CATEGORY]: 'Categorías',
- [CONST.SEARCH.GROUP_BY.MERCHANT]: 'Comerciantes',
+ [CONST.SEARCH.GROUP_BY.MERCHANT]: 'Comercios',
[CONST.SEARCH.GROUP_BY.TAG]: 'Etiquetas',
[CONST.SEARCH.GROUP_BY.DAY]: 'Días',
[CONST.SEARCH.GROUP_BY.MONTH]: 'Meses',
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index 37796f6a..ac2a6f9a 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -10014,7 +10014,7 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e
chartTitles: {
[CONST.SEARCH.GROUP_BY.FROM]: 'De',
[CONST.SEARCH.GROUP_BY.CARD]: 'Cartes',
- [CONST.SEARCH.GROUP_BY.WITHDRAWAL_ID]: 'Exports',
+ [CONST.SEARCH.GROUP_BY.WITHDRAWAL_ID]: 'Exportations',
[CONST.SEARCH.GROUP_BY.CATEGORY]: 'Catégories',
[CONST.SEARCH.GROUP_BY.MERCHANT]: 'Commerçants',
[CONST.SEARCH.GROUP_BY.TAG]: 'Tags',
@@ -10023,7 +10023,7 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e
[CONST.SEARCH.GROUP_BY.WEEK]: 'Semaines',
[CONST.SEARCH.GROUP_BY.YEAR]: 'Années',
[CONST.SEARCH.GROUP_BY.QUARTER]: 'Trimestres',
- [CONST.SEARCH.GROUP_BY.VIOLATION_APPROVER]: 'Approbateurs des violations',
+ [CONST.SEARCH.GROUP_BY.VIOLATION_APPROVER]: 'Approbateurs des infractions',
},
moneyRequestReport: {emptyStateTitle: 'Aucune dépense pour l’instant', accessPlaceHolder: 'Ouvrir pour plus de détails'},
noCategory: 'Aucune catégorie',
diff --git a/src/languages/it.ts b/src/languages/it.ts
index f9bec08e..bbb0d6c0 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -9898,7 +9898,7 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`,
[CONST.SEARCH.GROUP_BY.WEEK]: 'Settimana',
[CONST.SEARCH.GROUP_BY.YEAR]: 'Anno',
[CONST.SEARCH.GROUP_BY.QUARTER]: 'Trimestre',
- [CONST.SEARCH.GROUP_BY.VIOLATION_APPROVER]: 'Approvatore delle violazioni',
+ [CONST.SEARCH.GROUP_BY.VIOLATION_APPROVER]: 'Responsabile violazioni',
},
feed: 'Feed',
withdrawalType: {
@@ -9953,7 +9953,7 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`,
[CONST.SEARCH.GROUP_BY.WEEK]: 'Settimane',
[CONST.SEARCH.GROUP_BY.YEAR]: 'Anni',
[CONST.SEARCH.GROUP_BY.QUARTER]: 'Trimestri',
- [CONST.SEARCH.GROUP_BY.VIOLATION_APPROVER]: 'Approvatori delle violazioni',
+ [CONST.SEARCH.GROUP_BY.VIOLATION_APPROVER]: 'Approver delle violazioni',
},
moneyRequestReport: {emptyStateTitle: 'Nessuna spesa ancora', accessPlaceHolder: 'Apri per i dettagli'},
noCategory: 'Nessuna categoria',
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index 1b598b68..2aeb9f40 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -9749,7 +9749,7 @@ ${reportName}`,
groupBy: {
[CONST.SEARCH.GROUP_BY.FROM]: '差出人',
[CONST.SEARCH.GROUP_BY.CARD]: 'カード',
- [CONST.SEARCH.GROUP_BY.WITHDRAWAL_ID]: '出金ID',
+ [CONST.SEARCH.GROUP_BY.WITHDRAWAL_ID]: '出金 ID',
[CONST.SEARCH.GROUP_BY.CATEGORY]: 'カテゴリ',
[CONST.SEARCH.GROUP_BY.MERCHANT]: '加盟店',
[CONST.SEARCH.GROUP_BY.TAG]: 'タグ',
@@ -9768,8 +9768,8 @@ ${reportName}`,
},
is: 'は',
has: {submittedViolation: '違反を送信しました', approvedViolation: '承認済みの違反'},
- approvalCount: '承認件数',
- approvedTotal: '承認合計',
+ approvalCount: '承認数',
+ approvedTotal: '承認済み合計',
action: {
[CONST.SEARCH.ACTION_FILTERS.SUBMIT]: '送信',
[CONST.SEARCH.ACTION_FILTERS.APPROVE]: '承認',
@@ -9804,7 +9804,7 @@ ${reportName}`,
[CONST.SEARCH.GROUP_BY.TAG]: 'タグ',
[CONST.SEARCH.GROUP_BY.DAY]: '日数',
[CONST.SEARCH.GROUP_BY.MONTH]: '月数',
- [CONST.SEARCH.GROUP_BY.WEEK]: '週数',
+ [CONST.SEARCH.GROUP_BY.WEEK]: '週間',
[CONST.SEARCH.GROUP_BY.YEAR]: '年数',
[CONST.SEARCH.GROUP_BY.QUARTER]: '四半期',
[CONST.SEARCH.GROUP_BY.VIOLATION_APPROVER]: '違反承認者',
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index 0f8f7e5c..ffc4ddcf 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -9858,14 +9858,14 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`,
[CONST.SEARCH.GROUP_BY.CARD]: 'Kaart',
[CONST.SEARCH.GROUP_BY.WITHDRAWAL_ID]: 'Opname-ID',
[CONST.SEARCH.GROUP_BY.CATEGORY]: 'Categorie',
- [CONST.SEARCH.GROUP_BY.MERCHANT]: 'Handelaar',
+ [CONST.SEARCH.GROUP_BY.MERCHANT]: 'Winkelier',
[CONST.SEARCH.GROUP_BY.TAG]: 'Label',
[CONST.SEARCH.GROUP_BY.DAY]: 'Dag',
[CONST.SEARCH.GROUP_BY.MONTH]: 'Maand',
[CONST.SEARCH.GROUP_BY.WEEK]: 'Week',
[CONST.SEARCH.GROUP_BY.YEAR]: 'Jaar',
[CONST.SEARCH.GROUP_BY.QUARTER]: 'Kwartaal',
- [CONST.SEARCH.GROUP_BY.VIOLATION_APPROVER]: 'Overtredingsgoedkeurder',
+ [CONST.SEARCH.GROUP_BY.VIOLATION_APPROVER]: 'Schendinggoedkeurder',
},
feed: 'Feed',
withdrawalType: {
@@ -9955,7 +9955,7 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`,
chartTitles: {
[CONST.SEARCH.GROUP_BY.FROM]: 'Van',
[CONST.SEARCH.GROUP_BY.CARD]: 'Kaarten',
- [CONST.SEARCH.GROUP_BY.WITHDRAWAL_ID]: 'Exporten',
+ [CONST.SEARCH.GROUP_BY.WITHDRAWAL_ID]: 'Exports',
[CONST.SEARCH.GROUP_BY.CATEGORY]: 'Categorieën',
[CONST.SEARCH.GROUP_BY.MERCHANT]: 'Handelaars',
[CONST.SEARCH.GROUP_BY.TAG]: 'Tags',
@@ -9964,7 +9964,7 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`,
[CONST.SEARCH.GROUP_BY.WEEK]: 'Weken',
[CONST.SEARCH.GROUP_BY.YEAR]: 'Jaren',
[CONST.SEARCH.GROUP_BY.QUARTER]: 'Kwartalen',
- [CONST.SEARCH.GROUP_BY.VIOLATION_APPROVER]: 'Overtredingsgoedkeurders',
+ [CONST.SEARCH.GROUP_BY.VIOLATION_APPROVER]: 'Overtredingsfiatteurs',
},
spendOverTime: 'Uitgaven in de tijd',
tabs: {
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index 8889d031..329d7e1c 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -9872,7 +9872,7 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`,
groupBy: {
[CONST.SEARCH.GROUP_BY.FROM]: 'Od',
[CONST.SEARCH.GROUP_BY.CARD]: 'Karta',
- [CONST.SEARCH.GROUP_BY.WITHDRAWAL_ID]: 'Identyfikator wypłaty',
+ [CONST.SEARCH.GROUP_BY.WITHDRAWAL_ID]: 'ID wypłaty',
[CONST.SEARCH.GROUP_BY.CATEGORY]: 'Kategoria',
[CONST.SEARCH.GROUP_BY.MERCHANT]: 'Sprzedawca',
[CONST.SEARCH.GROUP_BY.TAG]: 'Tag',
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index 7b1f0f68..da7157ed 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -9854,16 +9854,16 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`,
groupBy: {
[CONST.SEARCH.GROUP_BY.FROM]: 'De',
[CONST.SEARCH.GROUP_BY.CARD]: 'Cartão',
- [CONST.SEARCH.GROUP_BY.WITHDRAWAL_ID]: 'ID do saque',
+ [CONST.SEARCH.GROUP_BY.WITHDRAWAL_ID]: 'ID de saque',
[CONST.SEARCH.GROUP_BY.CATEGORY]: 'Categoria',
- [CONST.SEARCH.GROUP_BY.MERCHANT]: 'Estabelecimento',
- [CONST.SEARCH.GROUP_BY.TAG]: 'Etiqueta',
+ [CONST.SEARCH.GROUP_BY.MERCHANT]: 'Comerciante',
+ [CONST.SEARCH.GROUP_BY.TAG]: 'Tag',
[CONST.SEARCH.GROUP_BY.DAY]: 'Dia',
[CONST.SEARCH.GROUP_BY.MONTH]: 'Mês',
[CONST.SEARCH.GROUP_BY.WEEK]: 'Semana',
[CONST.SEARCH.GROUP_BY.YEAR]: 'Ano',
[CONST.SEARCH.GROUP_BY.QUARTER]: 'Trimestre',
- [CONST.SEARCH.GROUP_BY.VIOLATION_APPROVER]: 'Aprovador de violações',
+ [CONST.SEARCH.GROUP_BY.VIOLATION_APPROVER]: 'Aprovador de violação',
},
feed: 'Feed',
withdrawalType: {
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index 6ed0132d..600f6397 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -9487,11 +9487,11 @@ ${reportName}`,
[CONST.SEARCH.SORT_ORDER.DESC]: '降序',
},
groupBy: {
- [CONST.SEARCH.GROUP_BY.FROM]: '来自',
- [CONST.SEARCH.GROUP_BY.CARD]: '卡片',
- [CONST.SEARCH.GROUP_BY.WITHDRAWAL_ID]: '提现编号',
+ [CONST.SEARCH.GROUP_BY.FROM]: '发件人',
+ [CONST.SEARCH.GROUP_BY.CARD]: '卡',
+ [CONST.SEARCH.GROUP_BY.WITHDRAWAL_ID]: '提现 ID',
[CONST.SEARCH.GROUP_BY.CATEGORY]: '类别',
- [CONST.SEARCH.GROUP_BY.MERCHANT]: '商户',
+ [CONST.SEARCH.GROUP_BY.MERCHANT]: '商家',
[CONST.SEARCH.GROUP_BY.TAG]: '标签',
[CONST.SEARCH.GROUP_BY.DAY]: '天',
[CONST.SEARCH.GROUP_BY.MONTH]: '月',
@@ -9508,8 +9508,8 @@ ${reportName}`,
},
is: '是',
has: {submittedViolation: '已提交违规', approvedViolation: '已批准违规'},
- approvalCount: '审批次数',
- approvedTotal: '已审批总额',
+ approvalCount: '审批数量',
+ approvedTotal: '已批准总额',
action: {
[CONST.SEARCH.ACTION_FILTERS.SUBMIT]: '提交',
[CONST.SEARCH.ACTION_FILTERS.APPROVE]: '批准',
@@ -9536,11 +9536,11 @@ ${reportName}`,
has: '有',
view: {label: '查看', table: '表格', bar: '栏', line: '折线', pie: '饼图'},
chartTitles: {
- [CONST.SEARCH.GROUP_BY.FROM]: '来自',
+ [CONST.SEARCH.GROUP_BY.FROM]: '发件人',
[CONST.SEARCH.GROUP_BY.CARD]: '卡片',
[CONST.SEARCH.GROUP_BY.WITHDRAWAL_ID]: '导出',
[CONST.SEARCH.GROUP_BY.CATEGORY]: '类别',
- [CONST.SEARCH.GROUP_BY.MERCHANT]: '商家',
+ [CONST.SEARCH.GROUP_BY.MERCHANT]: '商户',
[CONST.SEARCH.GROUP_BY.TAG]: '标签',
[CONST.SEARCH.GROUP_BY.DAY]: '天',
[CONST.SEARCH.GROUP_BY.MONTH]: '月数',
Note You can apply these changes to your branch by copying the patch to your clipboard, then running |
|
@nkdengineer BUG: After applying Screen.Recording.2026-10-02.at.12.21.33.mov |
|
🚧 trjExpensify 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! 🧪🧪
|
trjExpensify
left a comment
There was a problem hiding this comment.
Asked @neil-marcellini for some context on this group-by:violation-approver addition here in thread: https://expensify.slack.com/archives/C07HPDRELLD/p1790941165166729?thread_ts=1790607185.617899&cid=C07HPDRELLD
The HL had "Violations by approver" down to use group-by:to, the existing "To" column, and thus display the "To" column in the table:
If it transpires that we couldn't do that for some tangible reason, it seems extraneous to have opted to call this Group by Violation approver and not simply Approver.
Similarly, I see the groupTotal has been named Approval total which I don't understand why we deviated from Total like all of the other group by table views, including "Violations by submitter".
Then lastly, where did we decide to add this Approval count column? It's identical to the existing Expenses group column which is a count.
"Violations by submitter" doesn't have that, so I don't quite understand why we need to add it for "Violations by approver".
|
Answered in Slack |
|
friendly bump @nkdengineer, could you please resolve conflict and update the PR title? |
Explanation of Change
feat: Add support for group-by:violation-approver
Fixed Issues
$ #99931
PROPOSAL:
Tests
Precondition:
Violation approverdoesn't displayApproved violationoptionViolation approveris displayedOffline tests
QA Steps
Same as test
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
Screen.Recording.2026-10-01.at.11.46.52.mov
Android: mWeb Chrome
Screen.Recording.2026-10-01.at.11.43.43.mov
iOS: Native
Screen.Recording.2026-10-01.at.11.46.10.mov
iOS: mWeb Safari
Screen.Recording.2026-10-01.at.11.44.47.mov
MacOS: Chrome / Safari
Screen.Recording.2026-10-01.at.11.49.38.mov