Implement policy change logs for when changing the policy reimburser#78531
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.
|
@srikarparsi could you please run this workflow? #78531 (comment) |
🦜 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 2af81f04..e379acf4 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -6436,10 +6436,10 @@ Fordere Spesendetails wie Belege und Beschreibungen an, lege Limits und Standard
return `hat einen steuererstattungsfähigen Anteil von „${newValue}“ zum Entfernungssatz „${customUnitRateName}“ hinzugefügt`;
},
updatedCustomUnitRateIndex: ({customUnitName, customUnitRateName, oldValue, newValue}: UpdatedPolicyCustomUnitRateIndexParams) => {
- return `änderte den Index des ${customUnitName}-Tarifs "${customUnitRateName}" auf "${newValue}" ${oldValue ? `(zuvor "${oldValue}")` : ''}`;
+ return `den Index des ${customUnitName}-Satzes „${customUnitRateName}“ in „${newValue}“ geändert ${oldValue ? `(zuvor „${oldValue}“)` : ''}`;
},
updatedCustomUnitRateEnabled: ({customUnitName, customUnitRateName, newValue}: UpdatedPolicyCustomUnitRateEnabledParams) => {
- return `${newValue ? 'aktiviert' : 'deaktiviert'} ${customUnitName}-Tarif "${customUnitRateName}"`;
+ return `${newValue ? 'Aktiviert' : 'Deaktiviert'} ${customUnitName}-Satz „${customUnitRateName}“`;
},
deleteCustomUnitRate: (customUnitName: string, rateName: string) => `hat den Preis „${rateName}“ für „${customUnitName}“ entfernt`,
addedReportField: (fieldType: string, fieldName?: string) => `${fieldType}-Berichtsfield „${fieldName}“ hinzugefügt`,
@@ -6617,6 +6617,8 @@ Fordere Spesendetails wie Belege und Beschreibungen an, lege Limits und Standard
},
changedCustomReportNameFormula: ({newValue, oldValue}: UpdatedPolicyFieldWithNewAndOldValueParams) =>
`benutzerdefinierte Berichtsnamensformel in „${newValue}“ geändert (zuvor „${oldValue}“)`,
+ changedReimburser: ({newReimburser, previousReimburser}: {newReimburser: string; previousReimburser?: string}) =>
+ previousReimburser ? `hat den autorisierten Zahler in „${newReimburser}“ geändert (zuvor „${previousReimburser}“)` : `den autorisierten Zahler in „${newReimburser}“ geändert`,
},
roomMembersPage: {
memberNotFound: 'Mitglied nicht gefunden.',
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index 21a796cf..bb196c3f 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -6445,10 +6445,10 @@ Exigez des informations de dépense comme les reçus et les descriptions, défin
return `a ajouté une partie de taxe récupérable de « ${newValue} » au tarif de distance « ${customUnitRateName}`;
},
updatedCustomUnitRateIndex: ({customUnitName, customUnitRateName, oldValue, newValue}: UpdatedPolicyCustomUnitRateIndexParams) => {
- return `a modifié l’index du tarif ${customUnitName} "${customUnitRateName}" à "${newValue}" ${oldValue ? `(auparavant "${oldValue}")` : ''}`;
+ return `a modifié l’index du taux ${customUnitName} « ${customUnitRateName} » en « ${newValue} » ${oldValue ? `(auparavant « ${oldValue} »)` : ''}`;
},
updatedCustomUnitRateEnabled: ({customUnitName, customUnitRateName, newValue}: UpdatedPolicyCustomUnitRateEnabledParams) => {
- return `${newValue ? 'activé' : 'désactivé'} le tarif ${customUnitName} "${customUnitRateName}"`;
+ return `Taux ${newValue ? 'activé' : 'Désactivé'} ${customUnitName} « ${customUnitRateName} »`;
},
deleteCustomUnitRate: (customUnitName: string, rateName: string) => `a supprimé le taux « ${customUnitName} » « ${rateName} »`,
addedReportField: (fieldType: string, fieldName?: string) => `a ajouté le champ de rapport ${fieldType} « ${fieldName} »`,
@@ -6628,6 +6628,8 @@ Exigez des informations de dépense comme les reçus et les descriptions, défin
previousForwardsTo
? `a modifié le flux d’approbation pour ${approver} afin de ne plus transférer les rapports approuvés (auparavant transférés à ${previousForwardsTo})`
: `a modifié le flux d'approbation pour ${approver} afin de ne plus transférer les rapports approuvés`,
+ changedReimburser: ({newReimburser, previousReimburser}: {newReimburser: string; previousReimburser?: string}) =>
+ previousReimburser ? `a modifié le payeur autorisé en « ${newReimburser} » (auparavant « ${previousReimburser} »)` : `a modifié le payeur autorisé en « ${newReimburser} »`,
},
roomMembersPage: {
memberNotFound: 'Membre introuvable.',
diff --git a/src/languages/it.ts b/src/languages/it.ts
index d71c71e2..a0671458 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -6419,10 +6419,14 @@ Richiedi dettagli di spesa come ricevute e descrizioni, imposta limiti e valori
return `ha aggiunto una parte rimborsabile di imposta di "${newValue}" alla tariffa per distanza "${customUnitRateName}"`;
},
updatedCustomUnitRateIndex: ({customUnitName, customUnitRateName, oldValue, newValue}: UpdatedPolicyCustomUnitRateIndexParams) => {
- return `ha modificato l’indice della tariffa ${customUnitName} "${customUnitRateName}" a "${newValue}" ${oldValue ? `(precedentemente "${oldValue}")` : ''}`;
+ return `ha modificato l'indice della tariffa ${customUnitName} "${customUnitRateName}" in "${newValue}" ${oldValue ? `(in precedenza "${oldValue}")` : ''}`;
},
updatedCustomUnitRateEnabled: ({customUnitName, customUnitRateName, newValue}: UpdatedPolicyCustomUnitRateEnabledParams) => {
- return `${newValue ? 'abilitato' : 'disabilitato'} la tariffa ${customUnitName} "${customUnitRateName}"`;
+ return `Tariffa ${
+ newValue
+ ? 'abilitato' //_/\__/_/ \_,_/\__/\__/\_,_/
+ : 'disabilitato'
+ } ${customUnitName} "${customUnitRateName}"`;
},
deleteCustomUnitRate: (customUnitName: string, rateName: string) => `ha rimosso la tariffa "${rateName}" dell’unità personalizzata "${customUnitName}"`,
addedReportField: (fieldType: string, fieldName?: string) => `aggiunto campo report ${fieldType} "${fieldName}"`,
@@ -6602,6 +6606,10 @@ Richiedi dettagli di spesa come ricevute e descrizioni, imposta limiti e valori
},
changedCustomReportNameFormula: ({newValue, oldValue}: UpdatedPolicyFieldWithNewAndOldValueParams) =>
`ha modificato la formula del nome del report personalizzato in "${newValue}" (precedentemente "${oldValue}")`,
+ changedReimburser: ({newReimburser, previousReimburser}: {newReimburser: string; previousReimburser?: string}) =>
+ previousReimburser
+ ? `ha modificato il pagatore autorizzato in "${newReimburser}" (precedentemente "${previousReimburser}")`
+ : `ha cambiato il pagatore autorizzato in "${newReimburser}"`,
},
roomMembersPage: {
memberNotFound: 'Membro non trovato.',
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index 4869fc09..4ed59a77 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -6373,10 +6373,10 @@ ${reportName}
return `距離レート「${customUnitRateName}」に税還付可能分「${newValue}」を追加しました`;
},
updatedCustomUnitRateIndex: ({customUnitName, customUnitRateName, oldValue, newValue}: UpdatedPolicyCustomUnitRateIndexParams) => {
- return `${customUnitName} のレート "${customUnitRateName}" のインデックスを "${newValue}" に変更しました ${oldValue ? `(以前は "${oldValue}")` : ''}`;
+ return `${customUnitName} レート「${customUnitRateName}」のインデックスを「${newValue}」に変更しました ${oldValue ? `(以前の値は「${oldValue}」)` : ''}`;
},
updatedCustomUnitRateEnabled: ({customUnitName, customUnitRateName, newValue}: UpdatedPolicyCustomUnitRateEnabledParams) => {
- return `${newValue ? '有効化' : '無効化'} ${customUnitName} のレート "${customUnitRateName}"`;
+ return `${newValue ? '有効' : '無効'} ${customUnitName} レート「${customUnitRateName}」`;
},
deleteCustomUnitRate: (customUnitName: string, rateName: string) => `「${customUnitName}」のレート「${rateName}」を削除しました`,
addedReportField: (fieldType: string, fieldName?: string) => `${fieldType} レポートフィールド「${fieldName}」を追加しました`,
@@ -6548,6 +6548,8 @@ ${reportName}
},
changedCustomReportNameFormula: ({newValue, oldValue}: UpdatedPolicyFieldWithNewAndOldValueParams) =>
`カスタムレポート名の数式を「${newValue}」(以前は「${oldValue}」)に変更しました`,
+ changedReimburser: ({newReimburser, previousReimburser}: {newReimburser: string; previousReimburser?: string}) =>
+ previousReimburser ? `認可された支払者を「${newReimburser}」(以前は「${previousReimburser}」)に変更しました` : `承認済み支払者を「${newReimburser}」に変更しました`,
},
roomMembersPage: {
memberNotFound: 'メンバーが見つかりません。',
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index 732c2493..bdd525c3 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -6406,10 +6406,10 @@ Vraag verplichte uitgavedetails zoals bonnetjes en beschrijvingen, stel limieten
return `heeft een terugvorderbaar belastingdeel van "${newValue}" toegevoegd aan het kilometertarief "${customUnitRateName}"`;
},
updatedCustomUnitRateIndex: ({customUnitName, customUnitRateName, oldValue, newValue}: UpdatedPolicyCustomUnitRateIndexParams) => {
- return `heeft de index van het ${customUnitName}-tarief "${customUnitRateName}" gewijzigd naar "${newValue}" ${oldValue ? `(voorheen "${oldValue}")` : ''}`;
+ return `heeft de index van het ${customUnitName}-tarief „${customUnitRateName}” gewijzigd naar „${newValue}” ${oldValue ? `(voorheen "${oldValue}")` : ''}`;
},
updatedCustomUnitRateEnabled: ({customUnitName, customUnitRateName, newValue}: UpdatedPolicyCustomUnitRateEnabledParams) => {
- return `${newValue ? 'ingeschakeld' : 'uitgeschakeld'} ${customUnitName}-tarief "${customUnitRateName}"`;
+ return `${newValue ? 'ingeschakeld' : 'Uitgeschakeld'} ${customUnitName}-tarief "${customUnitRateName}"`;
},
deleteCustomUnitRate: (customUnitName: string, rateName: string) => `heeft het tarief "${rateName}" met de eenheid "${customUnitName}" verwijderd`,
addedReportField: (fieldType: string, fieldName?: string) => `rapportveld ${fieldType} "${fieldName}" toegevoegd`,
@@ -6589,6 +6589,10 @@ Vraag verplichte uitgavedetails zoals bonnetjes en beschrijvingen, stel limieten
previousForwardsTo
? `heeft de goedkeuringsworkflow voor ${approver} gewijzigd zodat goedgekeurde rapporten niet meer worden doorgestuurd (voorheen doorgestuurd naar ${previousForwardsTo})`
: `heeft de goedkeuringsworkflow voor ${approver} gewijzigd zodat goedgekeurde rapporten niet meer worden doorgestuurd`,
+ changedReimburser: ({newReimburser, previousReimburser}: {newReimburser: string; previousReimburser?: string}) =>
+ previousReimburser
+ ? `heeft de gemachtigde betaler gewijzigd in "${newReimburser}" (voorheen "${previousReimburser}")`
+ : `heeft de gemachtigde betaler gewijzigd in "${newReimburser}"`,
},
roomMembersPage: {
memberNotFound: 'Lid niet gevonden.',
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index a98256ba..b68f8f36 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -6397,10 +6397,10 @@ Wymagaj szczegółów wydatków, takich jak paragony i opisy, ustawiaj limity i
return `dodał(a) odzyskiwalną część podatku „${newValue}” do stawki za dystans „${customUnitRateName}`;
},
updatedCustomUnitRateIndex: ({customUnitName, customUnitRateName, oldValue, newValue}: UpdatedPolicyCustomUnitRateIndexParams) => {
- return `zmienił indeks stawki ${customUnitName} "${customUnitRateName}" na "${newValue}" ${oldValue ? `(wcześniej "${oldValue}")` : ''}`;
+ return `zmienił(a) indeks stawki ${customUnitName} „${customUnitRateName}” na „${newValue}” ${oldValue ? `(uprzednio „${oldValue}”)` : ''}`;
},
updatedCustomUnitRateEnabled: ({customUnitName, customUnitRateName, newValue}: UpdatedPolicyCustomUnitRateEnabledParams) => {
- return `${newValue ? 'włączony' : 'wyłączony'} stawka ${customUnitName} "${customUnitRateName}"`;
+ return `stawka ${newValue ? 'włączone' : 'wyłączone'} ${customUnitName} „${customUnitRateName}”`;
},
deleteCustomUnitRate: (customUnitName: string, rateName: string) => `usunął stawkę „${rateName}” dla „${customUnitName}”`,
addedReportField: (fieldType: string, fieldName?: string) => `dodano pole raportu ${fieldType} „${fieldName}”`,
@@ -6577,6 +6577,10 @@ Wymagaj szczegółów wydatków, takich jak paragony i opisy, ustawiaj limity i
previousForwardsTo
? `zmieniono proces zatwierdzania dla ${approver}, aby przestać przekazywać zatwierdzone raporty (wcześniej przekazywane do ${previousForwardsTo})`
: `zmieniono przepływ zatwierdzania dla ${approver}, aby nie przekazywać dalej zatwierdzonych raportów`,
+ changedReimburser: ({newReimburser, previousReimburser}: {newReimburser: string; previousReimburser?: string}) =>
+ previousReimburser
+ ? `zmieniono upoważnionego płatnika na „${newReimburser}” (wcześniej „${previousReimburser}”)`
+ : `zmienił(a) upoważnioną osobę dokonującą płatności na „${newReimburser}”`,
},
roomMembersPage: {
memberNotFound: 'Użytkownik nie został znaleziony.',
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index 6a6f5ff4..d2e46829 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -6398,10 +6398,14 @@ Exija detalhes de despesas como recibos e descrições, defina limites e padrõe
return `adicionou uma parte de imposto recuperável de "${newValue}" à taxa de distância "${customUnitRateName}"`;
},
updatedCustomUnitRateIndex: ({customUnitName, customUnitRateName, oldValue, newValue}: UpdatedPolicyCustomUnitRateIndexParams) => {
- return `alterou o índice da tarifa ${customUnitName} "${customUnitRateName}" para "${newValue}" ${oldValue ? `(anteriormente "${oldValue}")` : ''}`;
+ return `alterou o índice da taxa de ${customUnitName} "${customUnitRateName}" para "${newValue}" ${oldValue ? `(antes "${oldValue}")` : ''}`;
},
updatedCustomUnitRateEnabled: ({customUnitName, customUnitRateName, newValue}: UpdatedPolicyCustomUnitRateEnabledParams) => {
- return `${newValue ? 'habilitado' : 'desabilitado'} tarifa ${customUnitName} "${customUnitRateName}"`;
+ return `Taxa de ${
+ newValue
+ ? 'ativado' //_/\__/_/ \_,_/\__/\__/\_,_/
+ : 'Desativado'
+ } ${customUnitName} "${customUnitRateName}"`;
},
deleteCustomUnitRate: (customUnitName: string, rateName: string) => `removeu a taxa "${customUnitName}" "${rateName}"`,
addedReportField: (fieldType: string, fieldName?: string) => `${fieldType} de relatório "${fieldName}" adicionado`,
@@ -6581,6 +6585,8 @@ Exija detalhes de despesas como recibos e descrições, defina limites e padrõe
},
changedCustomReportNameFormula: ({newValue, oldValue}: UpdatedPolicyFieldWithNewAndOldValueParams) =>
`alterou a fórmula do nome do relatório personalizado para "${newValue}" (anteriormente "${oldValue}")`,
+ changedReimburser: ({newReimburser, previousReimburser}: {newReimburser: string; previousReimburser?: string}) =>
+ previousReimburser ? `alterou o pagador autorizado para "${newReimburser}" (anteriormente "${previousReimburser}")` : `alterou o pagador autorizado para "${newReimburser}"`,
},
roomMembersPage: {
memberNotFound: 'Membro não encontrado.',
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index e713f947..2d8fe922 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -6270,10 +6270,10 @@ ${reportName}
return `在距离费率“${customUnitRateName}”中添加了可退税部分“${newValue}”`;
},
updatedCustomUnitRateIndex: ({customUnitName, customUnitRateName, oldValue, newValue}: UpdatedPolicyCustomUnitRateIndexParams) => {
- return `将 ${customUnitName} 费率 "${customUnitRateName}" 的索引更改为 "${newValue}" ${oldValue ? `(之前为 "${oldValue}")` : ''}`;
+ return `将 ${customUnitName} 费率“${customUnitRateName}”的索引更改为“${newValue}” ${oldValue ? `(之前为“${oldValue}”)` : ''}`;
},
updatedCustomUnitRateEnabled: ({customUnitName, customUnitRateName, newValue}: UpdatedPolicyCustomUnitRateEnabledParams) => {
- return `${newValue ? '已启用' : '已禁用'} ${customUnitName} 费率 "${customUnitRateName}"`;
+ return `${newValue ? '已启用' : '已禁用'} ${customUnitName} 费率“${customUnitRateName}”`;
},
deleteCustomUnitRate: (customUnitName: string, rateName: string) => `已移除“${customUnitName}”费率“${rateName}”`,
addedReportField: (fieldType: string, fieldName?: string) => `已添加 ${fieldType} 报告字段 “${fieldName}”`,
@@ -6439,6 +6439,8 @@ ${reportName}
}
},
changedCustomReportNameFormula: ({newValue, oldValue}: UpdatedPolicyFieldWithNewAndOldValueParams) => `将自定义报表名称公式更改为“${newValue}”(之前为“${oldValue}”)`,
+ changedReimburser: ({newReimburser, previousReimburser}: {newReimburser: string; previousReimburser?: string}) =>
+ previousReimburser ? `将授权付款人更改为“${newReimburser}”(原为“${previousReimburser}”)` : `已将授权付款人更改为“${newReimburser}”`,
},
roomMembersPage: {
memberNotFound: '未找到成员。',
Note You can apply these changes to your branch by copying the patch to your clipboard, then running |
| changedReimburser: ({newReimburser, previousReimburser}) => | ||
| previousReimburser ? `cambió el pagador autorizado a "${newReimburser}" (previamente "${previousReimburser}")` : `cambió el pagador autorizado a "${newReimburser}"`, |
There was a problem hiding this comment.
|
@MonilBhavsar 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] |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 15802503bc
ℹ️ 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".
trjExpensify
left a comment
There was a problem hiding this comment.
James has had eyes on these policy change log improvements 👍
Translations were confirmed |
Reviewer Checklist
Screenshots/VideosAndroid: HybridAppAndroid: mWeb ChromeiOS: HybridAppiOS: mWeb SafariMacOS: Chrome / Safari |
|
✋ 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/srikarparsi in version: 9.3.3-0 🚀
|
|
🚀 Deployed to production by https://github.com/francoisl in version: 9.3.3-8 🚀
|
Explanation of Change
Fixed Issues
Part of https://github.com/Expensify/Expensify/issues/568315
PROPOSAL:
Tests
Prerequisites
Test Steps
changed the authorized payer to "rayanetesting1+2@gmail.com" (previously "rayanetesting1+345345345@gmail.com")Expected Results:
changed the authorized payer to "rayanetesting1+2@gmail.com" (previously "rayanetesting1+345345345@gmail.com")Offline tests
N/A
QA Steps
Same as tests
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectioncanBeMissingparam foruseOnyxtoggleReportand 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
Screen.Recording.2026-01-08.at.12.51.03.AM.mov