From 6fff359ef522423d905ccbe8b747fa4c8dcb91f4 Mon Sep 17 00:00:00 2001 From: Rayane <77965000+rayane-d@users.noreply.github.com> Date: Wed, 10 Dec 2025 23:20:17 +0100 Subject: [PATCH 01/13] Implemented company address policy change log message formatting in ReportActionsUtil and added report action type handling --- src/CONST/index.ts | 1 + src/languages/en.ts | 2 + src/languages/es.ts | 2 + src/libs/ReportActionsUtils.ts | 64 +++++++++++++++++++ src/libs/ReportUtils.ts | 4 ++ src/libs/SidebarUtils.ts | 3 + .../report/ContextMenu/ContextMenuActions.tsx | 3 + .../home/report/PureReportActionItem.tsx | 3 + 8 files changed, 82 insertions(+) diff --git a/src/CONST/index.ts b/src/CONST/index.ts index b682da76a5bb..ae7bdaa470d3 100755 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -1324,6 +1324,7 @@ const CONST = { UPDATE_DISABLED_FIELDS: 'POLICYCHANGELOG_UPDATE_DISABLED_FIELDS', UPDATE_EMPLOYEE: 'POLICYCHANGELOG_UPDATE_EMPLOYEE', UPDATE_FIELD: 'POLICYCHANGELOG_UPDATE_FIELD', + UPDATE_ADDRESS: 'POLICYCHANGELOG_UPDATE_ADDRESS', UPDATE_FEATURE_ENABLED: 'POLICYCHANGELOG_UPDATE_FEATURE_ENABLED', UPDATE_IS_ATTENDEE_TRACKING_ENABLED: 'POLICYCHANGELOG_UPDATE_IS_ATTENDEE_TRACKING_ENABLED', UPDATE_MANUAL_APPROVAL_THRESHOLD: 'POLICYCHANGELOG_UPDATE_MANUAL_APPROVAL_THRESHOLD', diff --git a/src/languages/en.ts b/src/languages/en.ts index 7bf3d8baff06..2fbfba38f620 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -6213,6 +6213,8 @@ const translations = { billcom: 'BILLCOM', }, workspaceActions: { + changedCompanyAddress: ({newAddress, previousAddress}: {newAddress: string; previousAddress?: string}) => + previousAddress ? `changed the company address to "${newAddress}" (previously "${previousAddress}")` : `set the company address to "${newAddress}"`, addApprovalRule: ({approverEmail, approverName, field, name}: AddedPolicyApprovalRuleParams) => `added ${approverName} (${approverEmail}) as an approver for the ${field} "${name}"`, deleteApprovalRule: ({approverEmail, approverName, field, name}: AddedPolicyApprovalRuleParams) => `removed ${approverName} (${approverEmail}) as an approver for the ${field} "${name}"`, diff --git a/src/languages/es.ts b/src/languages/es.ts index 0237bc58e2ab..1333c295054e 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -5851,6 +5851,8 @@ ${amount} para ${merchant} - ${date}`, billcom: 'BILLCOM', }, workspaceActions: { + changedCompanyAddress: ({newAddress, previousAddress}: {newAddress: string; previousAddress?: string}) => + previousAddress ? `cambió la dirección de la empresa a "${newAddress}" (anteriormente "${previousAddress}")` : `estableció la dirección de la empresa en "${newAddress}"`, addApprovalRule: ({approverEmail, approverName, field, name}) => `añadió a ${approverName} (${approverEmail}) como aprobador para la ${field} "${name}"`, deleteApprovalRule: ({approverEmail, approverName, field, name}) => `eliminó a ${approverName} (${approverEmail}) como aprobador para la ${field} "${name}"`, updateApprovalRule: ({field, name, newApproverEmail, newApproverName, oldApproverEmail, oldApproverName}) => { diff --git a/src/libs/ReportActionsUtils.ts b/src/libs/ReportActionsUtils.ts index 36a3c93ba196..b5d711a5dde2 100644 --- a/src/libs/ReportActionsUtils.ts +++ b/src/libs/ReportActionsUtils.ts @@ -2902,6 +2902,69 @@ function getWorkspaceUpdateFieldMessage(action: ReportAction): string { return getReportActionText(action); } +type CompanyAddressOriginalMessage = { + newAddress: {addressStreet?: string; city?: string; state?: string; zipCode?: string; country?: string}; + oldAddress?: {addressStreet?: string; city?: string; state?: string; zipCode?: string; country?: string} | null; +}; + +/** + * Format address as "street1, street2 (if exists), city, state zipCode" + */ +function formatAddressToString(address: CompanyAddressOriginalMessage['newAddress'] | null | undefined): string { + if (!address) { + return ''; + } + + const [street1Raw, street2Raw] = (address.addressStreet ?? '').split('\n'); + const street1 = street1Raw?.trim() ?? ''; + const street2 = street2Raw?.trim() ?? ''; + + const parts: string[] = []; + + if (street1) { + parts.push(street1); + } + if (street2) { + parts.push(street2); + } + if (address.city) { + parts.push(address.city); + } + + let stateZip = ''; + if (address.state) { + stateZip = address.state; + if (address.zipCode) { + stateZip += ` ${address.zipCode}`; + } + } else if (address.zipCode) { + stateZip = address.zipCode; + } + + if (stateZip) { + parts.push(stateZip); + } + + return parts.join(', '); +} + +function getCompanyAddressUpdateMessage(action: ReportAction): string { + const originalMessage = getOriginalMessage(action as ReportAction) as CompanyAddressOriginalMessage | undefined; + + if (!originalMessage) { + return getReportActionText(action); + } + + const newAddressStr = formatAddressToString(originalMessage.newAddress); + const oldAddressStr = formatAddressToString(originalMessage.oldAddress); + + // eslint-disable-next-line @typescript-eslint/no-deprecated + return translateLocal('workspaceActions.changedCompanyAddress', { + newAddress: newAddressStr, + previousAddress: oldAddressStr || undefined, + }); +} + function getWorkspaceFeatureEnabledMessage(action: ReportAction): string { const {enabled, featureName} = getOriginalMessage(action as ReportAction) ?? {}; @@ -3545,6 +3608,7 @@ export { getWorkspaceUpdateFieldMessage, getWorkspaceFeatureEnabledMessage, getWorkspaceAttendeeTrackingUpdateMessage, + getCompanyAddressUpdateMessage, getWorkspaceReimbursementUpdateMessage, getWorkspaceCurrencyUpdateMessage, getWorkspaceTaxUpdateMessage, diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 96c9cddaab7e..a9ed06e212b5 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -171,6 +171,7 @@ import { getAllReportActions, getCardIssuedMessage, getChangedApproverActionMessage, + getCompanyAddressUpdateMessage, getDismissedViolationMessageText, getExportIntegrationLastMessageText, getIntegrationSyncFailedMessage, @@ -5815,6 +5816,9 @@ function getReportName( if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.ACTIONABLE_CARD_FRAUD_ALERT) && getOriginalMessage(parentReportAction)?.resolution) { return getActionableCardFraudAlertResolutionMessage(parentReportAction); } + if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_ADDRESS)) { + return getCompanyAddressUpdateMessage(parentReportAction); + } if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.MARKED_REIMBURSED)) { // eslint-disable-next-line @typescript-eslint/no-deprecated diff --git a/src/libs/SidebarUtils.ts b/src/libs/SidebarUtils.ts index 5b03ce442400..69ecad8261ca 100644 --- a/src/libs/SidebarUtils.ts +++ b/src/libs/SidebarUtils.ts @@ -32,6 +32,7 @@ import { getAddedConnectionMessage, getCardIssuedMessage, getChangedApproverActionMessage, + getCompanyAddressUpdateMessage, getDeletedApprovalRuleMessage, getIntegrationSyncFailedMessage, getLastVisibleMessage, @@ -893,6 +894,8 @@ function getOptionData({ result.alternateText = getWorkspaceAttendeeTrackingUpdateMessage(lastAction); } else if (lastAction?.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_REIMBURSEMENT_ENABLED) { result.alternateText = getWorkspaceReimbursementUpdateMessage(lastAction); + } else if (lastAction?.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_ADDRESS) { + result.alternateText = getCompanyAddressUpdateMessage(lastAction); } else if (lastAction?.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AMOUNT_NO_RECEIPT) { result.alternateText = getPolicyChangeLogMaxExpenseAmountNoReceiptMessage(lastAction); } else if (lastAction?.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AMOUNT) { diff --git a/src/pages/home/report/ContextMenu/ContextMenuActions.tsx b/src/pages/home/report/ContextMenu/ContextMenuActions.tsx index 35e631c3be31..4daa400f800c 100644 --- a/src/pages/home/report/ContextMenu/ContextMenuActions.tsx +++ b/src/pages/home/report/ContextMenu/ContextMenuActions.tsx @@ -30,6 +30,7 @@ import { getAddedConnectionMessage, getCardIssuedMessage, getChangedApproverActionMessage, + getCompanyAddressUpdateMessage, getDeletedApprovalRuleMessage, getExportIntegrationMessageHTML, getIntegrationSyncFailedMessage, @@ -675,6 +676,8 @@ const ContextMenuActions: ContextMenuAction[] = [ Clipboard.setString(getWorkspaceAttendeeTrackingUpdateMessage(reportAction)); } else if (reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_REIMBURSEMENT_ENABLED) { Clipboard.setString(getWorkspaceReimbursementUpdateMessage(reportAction)); + } else if (reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_ADDRESS) { + Clipboard.setString(getCompanyAddressUpdateMessage(reportAction)); } else if (reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AMOUNT_NO_RECEIPT) { Clipboard.setString(getPolicyChangeLogMaxExpenseAmountNoReceiptMessage(reportAction)); } else if (reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AMOUNT) { diff --git a/src/pages/home/report/PureReportActionItem.tsx b/src/pages/home/report/PureReportActionItem.tsx index 61ebc9ab3500..b4cca3a1754e 100644 --- a/src/pages/home/report/PureReportActionItem.tsx +++ b/src/pages/home/report/PureReportActionItem.tsx @@ -66,6 +66,7 @@ import { getAddedApprovalRuleMessage, getAddedConnectionMessage, getChangedApproverActionMessage, + getCompanyAddressUpdateMessage, getDeletedApprovalRuleMessage, getDemotedFromWorkspaceMessage, getDismissedViolationMessageText, @@ -1374,6 +1375,8 @@ function PureReportActionItem({ children = ; } else if (isActionOfType(action, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_REIMBURSEMENT_ENABLED)) { children = ; + } else if (isActionOfType(action, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_ADDRESS)) { + children = ; } else if (isActionOfType(action, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AMOUNT_NO_RECEIPT)) { children = ; } else if (isActionOfType(action, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AMOUNT)) { From 3a35816576f731e13f72a26645f43f3ee30905db Mon Sep 17 00:00:00 2001 From: Rayane <77965000+rayane-d@users.noreply.github.com> Date: Wed, 10 Dec 2025 23:26:07 +0100 Subject: [PATCH 02/13] add translations --- src/languages/de.ts | 2 ++ src/languages/fr.ts | 2 ++ src/languages/it.ts | 2 ++ src/languages/ja.ts | 2 ++ src/languages/nl.ts | 2 ++ src/languages/pl.ts | 2 ++ src/languages/pt-BR.ts | 2 ++ src/languages/zh-hans.ts | 2 ++ 8 files changed, 16 insertions(+) diff --git a/src/languages/de.ts b/src/languages/de.ts index aec47d6995a8..c7116135b729 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -6359,6 +6359,8 @@ Fordere Spesendetails wie Belege und Beschreibungen an, lege Limits und Standard billcom: 'BILLCOM', }, workspaceActions: { + changedCompanyAddress: ({newAddress, previousAddress}: {newAddress: string; previousAddress?: string}) => + previousAddress ? `Firmenadresse geändert zu „${newAddress}“ (zuvor „${previousAddress}“)` : `Unternehmensadresse auf „${newAddress}“ festlegen`, addApprovalRule: ({approverEmail, approverName, field, name}: AddedPolicyApprovalRuleParams) => `${approverName} (${approverEmail}) als Genehmiger für das Feld ${field} „${name}“ hinzugefügt`, deleteApprovalRule: ({approverEmail, approverName, field, name}: AddedPolicyApprovalRuleParams) => diff --git a/src/languages/fr.ts b/src/languages/fr.ts index edf8bcb97edc..c463f6d67ff9 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -6366,6 +6366,8 @@ Exigez des informations de dépense comme les reçus et les descriptions, défin billcom: 'BILLCOM', }, workspaceActions: { + changedCompanyAddress: ({newAddress, previousAddress}: {newAddress: string; previousAddress?: string}) => + previousAddress ? `a modifié l’adresse de l’entreprise en « ${newAddress} » (auparavant « ${previousAddress} »)` : `définir l’adresse de l’entreprise sur « ${newAddress} »`, addApprovalRule: ({approverEmail, approverName, field, name}: AddedPolicyApprovalRuleParams) => `a ajouté ${approverName} (${approverEmail}) comme approbateur pour le ${field} « ${name} »`, deleteApprovalRule: ({approverEmail, approverName, field, name}: AddedPolicyApprovalRuleParams) => diff --git a/src/languages/it.ts b/src/languages/it.ts index d7642a8dc411..e52162164429 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -6338,6 +6338,8 @@ Richiedi dettagli di spesa come ricevute e descrizioni, imposta limiti e valori billcom: 'BILLCOM', }, workspaceActions: { + changedCompanyAddress: ({newAddress, previousAddress}: {newAddress: string; previousAddress?: string}) => + previousAddress ? `ha modificato l’indirizzo dell’azienda in "${newAddress}" (precedentemente "${previousAddress}")` : `imposta l’indirizzo dell’azienda su "${newAddress}"`, addApprovalRule: ({approverEmail, approverName, field, name}: AddedPolicyApprovalRuleParams) => `ha aggiunto ${approverName} (${approverEmail}) come approvatore per il campo ${field} "${name}"`, deleteApprovalRule: ({approverEmail, approverName, field, name}: AddedPolicyApprovalRuleParams) => diff --git a/src/languages/ja.ts b/src/languages/ja.ts index dcea62da9097..b326f2389c70 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -6299,6 +6299,8 @@ ${reportName} billcom: 'Bill.com', }, workspaceActions: { + changedCompanyAddress: ({newAddress, previousAddress}: {newAddress: string; previousAddress?: string}) => + previousAddress ? `会社住所を「${newAddress}」(以前は「${previousAddress}」)に変更しました` : `会社の住所を「${newAddress}」に設定`, addApprovalRule: ({approverEmail, approverName, field, name}: AddedPolicyApprovalRuleParams) => `${field}「${name}」の承認者として${approverName}(${approverEmail})を追加しました`, deleteApprovalRule: ({approverEmail, approverName, field, name}: AddedPolicyApprovalRuleParams) => `${field}「${name}」の承認者として${approverName}(${approverEmail})を削除しました`, diff --git a/src/languages/nl.ts b/src/languages/nl.ts index 036c1bfb0416..c760f512bb6e 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -6324,6 +6324,8 @@ Vraag verplichte uitgavedetails zoals bonnetjes en beschrijvingen, stel limieten billcom: 'Bill.com', }, workspaceActions: { + changedCompanyAddress: ({newAddress, previousAddress}: {newAddress: string; previousAddress?: string}) => + previousAddress ? `het bedrijfsadres gewijzigd naar "${newAddress}" (voorheen "${previousAddress}")` : `stel het bedrijfsadres in op "${newAddress}"`, addApprovalRule: ({approverEmail, approverName, field, name}: AddedPolicyApprovalRuleParams) => `${approverName} (${approverEmail}) toegevoegd als goedkeurder voor het veld ${field} "${name}"`, deleteApprovalRule: ({approverEmail, approverName, field, name}: AddedPolicyApprovalRuleParams) => diff --git a/src/languages/pl.ts b/src/languages/pl.ts index d2d43c9af8a8..af238a03ee30 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -6318,6 +6318,8 @@ Wymagaj szczegółów wydatków, takich jak paragony i opisy, ustawiaj limity i billcom: 'Bill.com', }, workspaceActions: { + changedCompanyAddress: ({newAddress, previousAddress}: {newAddress: string; previousAddress?: string}) => + previousAddress ? `zmienił adres firmy na „${newAddress}” (wcześniej „${previousAddress}”)` : `ustaw adres firmy na „${newAddress}”`, addApprovalRule: ({approverEmail, approverName, field, name}: AddedPolicyApprovalRuleParams) => `dodano ${approverName} (${approverEmail}) jako osobę zatwierdzającą dla pola ${field} „${name}”`, deleteApprovalRule: ({approverEmail, approverName, field, name}: AddedPolicyApprovalRuleParams) => diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index 4010d47ccfe1..55e5c1299f6a 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -6319,6 +6319,8 @@ Exija detalhes de despesas como recibos e descrições, defina limites e padrõe billcom: 'BILLCOM', }, workspaceActions: { + changedCompanyAddress: ({newAddress, previousAddress}: {newAddress: string; previousAddress?: string}) => + previousAddress ? `alterou o endereço da empresa para "${newAddress}" (anteriormente "${previousAddress}")` : `definir o endereço da empresa como "${newAddress}"`, addApprovalRule: ({approverEmail, approverName, field, name}: AddedPolicyApprovalRuleParams) => `adicionou ${approverName} (${approverEmail}) como aprovador para o campo ${field} "${name}"`, deleteApprovalRule: ({approverEmail, approverName, field, name}: AddedPolicyApprovalRuleParams) => diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 8ee1d32a8f09..1950955b141f 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -6203,6 +6203,8 @@ ${reportName} billcom: 'BILLCOM', }, workspaceActions: { + changedCompanyAddress: ({newAddress, previousAddress}: {newAddress: string; previousAddress?: string}) => + previousAddress ? `将公司地址更改为“${newAddress}”(原为“${previousAddress}”)` : `将公司地址设置为“${newAddress}”`, addApprovalRule: ({approverEmail, approverName, field, name}: AddedPolicyApprovalRuleParams) => `已将 ${approverName}(${approverEmail})添加为字段 ${field}“${name}”的审批人`, deleteApprovalRule: ({approverEmail, approverName, field, name}: AddedPolicyApprovalRuleParams) => `已将 ${approverName}(${approverEmail})从 ${field}“${name}”的审批人中移除`, updateApprovalRule: ({field, name, newApproverEmail, newApproverName, oldApproverEmail, oldApproverName}: UpdatedPolicyApprovalRuleParams) => { From 914a2c548f5dec76361432e067ce75d7ef37cf75 Mon Sep 17 00:00:00 2001 From: Rayane <77965000+rayane-d@users.noreply.github.com> Date: Thu, 11 Dec 2025 00:31:31 +0100 Subject: [PATCH 03/13] fix failing check --- src/languages/fr.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/languages/fr.ts b/src/languages/fr.ts index c463f6d67ff9..0e8472d7f324 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -6367,7 +6367,7 @@ Exigez des informations de dépense comme les reçus et les descriptions, défin }, workspaceActions: { changedCompanyAddress: ({newAddress, previousAddress}: {newAddress: string; previousAddress?: string}) => - previousAddress ? `a modifié l’adresse de l’entreprise en « ${newAddress} » (auparavant « ${previousAddress} »)` : `définir l’adresse de l’entreprise sur « ${newAddress} »`, + previousAddress ? `a modifié l’adresse de l’entreprise en « ${newAddress} » (auparavant « ${previousAddress} »)` : `définir l’adresse de l’entreprise sur « ${newAddress} »`, addApprovalRule: ({approverEmail, approverName, field, name}: AddedPolicyApprovalRuleParams) => `a ajouté ${approverName} (${approverEmail}) comme approbateur pour le ${field} « ${name} »`, deleteApprovalRule: ({approverEmail, approverName, field, name}: AddedPolicyApprovalRuleParams) => From 04f46c250bbfd328b794452e48a2811a8e9ea28b Mon Sep 17 00:00:00 2001 From: Rayane <77965000+rayane-d@users.noreply.github.com> Date: Wed, 24 Dec 2025 20:15:19 +0100 Subject: [PATCH 04/13] implement unit tests for getCompanyAddressUpdateMessage --- tests/unit/ReportActionsUtilsTest.ts | 73 +++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/tests/unit/ReportActionsUtilsTest.ts b/tests/unit/ReportActionsUtilsTest.ts index b35fdf7c3236..df6f50de28eb 100644 --- a/tests/unit/ReportActionsUtilsTest.ts +++ b/tests/unit/ReportActionsUtilsTest.ts @@ -9,7 +9,7 @@ import {actionR14932 as mockIOUAction, originalMessageR14932 as mockOriginalMess import {chatReportR14932 as mockChatReport, iouReportR14932 as mockIOUReport} from '../../__mocks__/reportData/reports'; import CONST from '../../src/CONST'; import * as ReportActionsUtils from '../../src/libs/ReportActionsUtils'; -import {getCardIssuedMessage, getOneTransactionThreadReportID, getOriginalMessage, getSendMoneyFlowAction, isIOUActionMatchingTransactionList} from '../../src/libs/ReportActionsUtils'; +import {getCardIssuedMessage, getCompanyAddressUpdateMessage, getOneTransactionThreadReportID, getOriginalMessage, getSendMoneyFlowAction, isIOUActionMatchingTransactionList} from '../../src/libs/ReportActionsUtils'; import ONYXKEYS from '../../src/ONYXKEYS'; import type {Card, OriginalMessageIOU, Report, ReportAction, ReportActions} from '../../src/types/onyx'; import createRandomReportAction from '../utils/collections/reportActions'; @@ -1868,4 +1868,75 @@ describe('ReportActionsUtils', () => { expect(actual).toBe(expected); }); }); + + describe('getCompanyAddressUpdateMessage', () => { + it('should return "set" message when setting address for first time (no old address)', () => { + const action = { + actionName: CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_ADDRESS, + reportActionID: '1', + created: '2024-01-01', + originalMessage: { + newAddress: { + addressStreet: '123 Main St', + city: 'San Francisco', + state: 'CA', + zipCode: '94102', + country: 'US', + }, + oldAddress: null, + }, + } as ReportAction; + + const result = ReportActionsUtils.getCompanyAddressUpdateMessage(action); + expect(result).toBe('set the company address to "123 Main St, San Francisco, CA 94102"'); + }); + + it('should return "changed" message when updating existing address', () => { + const action = { + actionName: CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_ADDRESS, + reportActionID: '1', + created: '2024-01-01', + originalMessage: { + newAddress: { + addressStreet: '456 New Ave', + city: 'Los Angeles', + state: 'CA', + zipCode: '90001', + country: 'US', + }, + oldAddress: { + addressStreet: '123 Old St', + city: 'San Francisco', + state: 'CA', + zipCode: '94102', + country: 'US', + }, + }, + } as ReportAction; + + const result = ReportActionsUtils.getCompanyAddressUpdateMessage(action); + expect(result).toBe('changed the company address to "456 New Ave, Los Angeles, CA 90001" (previously "123 Old St, San Francisco, CA 94102")'); + }); + it('should handle address with street2 (newline separated)', () => { + const action = { + actionName: CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_ADDRESS, + reportActionID: '1', + created: '2024-01-01', + originalMessage: { + newAddress: { + addressStreet: '123 Main St\nSuite 500', + city: 'New York', + state: 'NY', + zipCode: '10001', + country: 'US', + }, + oldAddress: null, + }, + } as ReportAction; + + const result = ReportActionsUtils.getCompanyAddressUpdateMessage(action); + expect(result).toBe('set the company address to "123 Main St, Suite 500, New York, NY 10001"'); + }); + + }); }); From 46df495cc865da3434ded1c58879cce917deec07 Mon Sep 17 00:00:00 2001 From: Rayane <77965000+rayane-d@users.noreply.github.com> Date: Wed, 24 Dec 2025 20:18:19 +0100 Subject: [PATCH 05/13] simplify test --- tests/unit/ReportActionsUtilsTest.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/unit/ReportActionsUtilsTest.ts b/tests/unit/ReportActionsUtilsTest.ts index df6f50de28eb..04aa52be4ca1 100644 --- a/tests/unit/ReportActionsUtilsTest.ts +++ b/tests/unit/ReportActionsUtilsTest.ts @@ -1874,7 +1874,7 @@ describe('ReportActionsUtils', () => { const action = { actionName: CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_ADDRESS, reportActionID: '1', - created: '2024-01-01', + created: '', originalMessage: { newAddress: { addressStreet: '123 Main St', @@ -1895,7 +1895,7 @@ describe('ReportActionsUtils', () => { const action = { actionName: CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_ADDRESS, reportActionID: '1', - created: '2024-01-01', + created: '', originalMessage: { newAddress: { addressStreet: '456 New Ave', @@ -1921,7 +1921,7 @@ describe('ReportActionsUtils', () => { const action = { actionName: CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_ADDRESS, reportActionID: '1', - created: '2024-01-01', + created: '', originalMessage: { newAddress: { addressStreet: '123 Main St\nSuite 500', From 2123732b1cc17f23d1ee49a5fcc4aae94d87804d Mon Sep 17 00:00:00 2001 From: Rayane <77965000+rayane-d@users.noreply.github.com> Date: Wed, 24 Dec 2025 20:21:20 +0100 Subject: [PATCH 06/13] added a comment --- tests/unit/ReportActionsUtilsTest.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/unit/ReportActionsUtilsTest.ts b/tests/unit/ReportActionsUtilsTest.ts index 04aa52be4ca1..f603f03dab91 100644 --- a/tests/unit/ReportActionsUtilsTest.ts +++ b/tests/unit/ReportActionsUtilsTest.ts @@ -1870,7 +1870,7 @@ describe('ReportActionsUtils', () => { }); describe('getCompanyAddressUpdateMessage', () => { - it('should return "set" message when setting address for first time (no old address)', () => { + it('should return "set" message when setting address for first time', () => { const action = { actionName: CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_ADDRESS, reportActionID: '1', @@ -1935,6 +1935,8 @@ describe('ReportActionsUtils', () => { } as ReportAction; const result = ReportActionsUtils.getCompanyAddressUpdateMessage(action); + + // The new line should be replaced with a comma expect(result).toBe('set the company address to "123 Main St, Suite 500, New York, NY 10001"'); }); From f5a637ede566a5d316389383c45c0d91e37fe5a6 Mon Sep 17 00:00:00 2001 From: Rayane <77965000+rayane-d@users.noreply.github.com> Date: Wed, 24 Dec 2025 20:24:20 +0100 Subject: [PATCH 07/13] fix lint error --- tests/unit/ReportActionsUtilsTest.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/unit/ReportActionsUtilsTest.ts b/tests/unit/ReportActionsUtilsTest.ts index f603f03dab91..14025ab094f5 100644 --- a/tests/unit/ReportActionsUtilsTest.ts +++ b/tests/unit/ReportActionsUtilsTest.ts @@ -1887,7 +1887,7 @@ describe('ReportActionsUtils', () => { }, } as ReportAction; - const result = ReportActionsUtils.getCompanyAddressUpdateMessage(action); + const result = getCompanyAddressUpdateMessage(action); expect(result).toBe('set the company address to "123 Main St, San Francisco, CA 94102"'); }); @@ -1914,7 +1914,7 @@ describe('ReportActionsUtils', () => { }, } as ReportAction; - const result = ReportActionsUtils.getCompanyAddressUpdateMessage(action); + const result = getCompanyAddressUpdateMessage(action); expect(result).toBe('changed the company address to "456 New Ave, Los Angeles, CA 90001" (previously "123 Old St, San Francisco, CA 94102")'); }); it('should handle address with street2 (newline separated)', () => { @@ -1934,7 +1934,7 @@ describe('ReportActionsUtils', () => { }, } as ReportAction; - const result = ReportActionsUtils.getCompanyAddressUpdateMessage(action); + const result = getCompanyAddressUpdateMessage(action); // The new line should be replaced with a comma expect(result).toBe('set the company address to "123 Main St, Suite 500, New York, NY 10001"'); From d713f509f2994da5d602b008b7e4b2cc779af556 Mon Sep 17 00:00:00 2001 From: Rayane <77965000+rayane-d@users.noreply.github.com> Date: Wed, 24 Dec 2025 20:25:25 +0100 Subject: [PATCH 08/13] prettier --- tests/unit/ReportActionsUtilsTest.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tests/unit/ReportActionsUtilsTest.ts b/tests/unit/ReportActionsUtilsTest.ts index 14025ab094f5..830dfc51a478 100644 --- a/tests/unit/ReportActionsUtilsTest.ts +++ b/tests/unit/ReportActionsUtilsTest.ts @@ -9,7 +9,14 @@ import {actionR14932 as mockIOUAction, originalMessageR14932 as mockOriginalMess import {chatReportR14932 as mockChatReport, iouReportR14932 as mockIOUReport} from '../../__mocks__/reportData/reports'; import CONST from '../../src/CONST'; import * as ReportActionsUtils from '../../src/libs/ReportActionsUtils'; -import {getCardIssuedMessage, getCompanyAddressUpdateMessage, getOneTransactionThreadReportID, getOriginalMessage, getSendMoneyFlowAction, isIOUActionMatchingTransactionList} from '../../src/libs/ReportActionsUtils'; +import { + getCardIssuedMessage, + getCompanyAddressUpdateMessage, + getOneTransactionThreadReportID, + getOriginalMessage, + getSendMoneyFlowAction, + isIOUActionMatchingTransactionList, +} from '../../src/libs/ReportActionsUtils'; import ONYXKEYS from '../../src/ONYXKEYS'; import type {Card, OriginalMessageIOU, Report, ReportAction, ReportActions} from '../../src/types/onyx'; import createRandomReportAction from '../utils/collections/reportActions'; @@ -1939,6 +1946,5 @@ describe('ReportActionsUtils', () => { // The new line should be replaced with a comma expect(result).toBe('set the company address to "123 Main St, Suite 500, New York, NY 10001"'); }); - }); }); From cf4515a4ed3c6f7919ed5ec60068eae785eb5489 Mon Sep 17 00:00:00 2001 From: Rayane <77965000+rayane-d@users.noreply.github.com> Date: Wed, 7 Jan 2026 21:51:26 +0100 Subject: [PATCH 09/13] Refactor getCompanyAddressUpdateMessage to accept translate function as a parameter --- src/libs/ReportActionsUtils.ts | 5 ++--- src/libs/ReportUtils.ts | 2 +- src/libs/SidebarUtils.ts | 2 +- src/pages/home/report/ContextMenu/ContextMenuActions.tsx | 2 +- src/pages/home/report/PureReportActionItem.tsx | 2 +- tests/unit/ReportActionsUtilsTest.ts | 6 +++--- 6 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/libs/ReportActionsUtils.ts b/src/libs/ReportActionsUtils.ts index d5f4608124be..830c24d592bf 100644 --- a/src/libs/ReportActionsUtils.ts +++ b/src/libs/ReportActionsUtils.ts @@ -2982,7 +2982,7 @@ function formatAddressToString(address: CompanyAddressOriginalMessage['newAddres return parts.join(', '); } -function getCompanyAddressUpdateMessage(action: ReportAction): string { +function getCompanyAddressUpdateMessage(translate: LocalizedTranslate, action: ReportAction): string { const originalMessage = getOriginalMessage(action as ReportAction) as CompanyAddressOriginalMessage | undefined; if (!originalMessage) { @@ -2992,8 +2992,7 @@ function getCompanyAddressUpdateMessage(action: ReportAction): string { const newAddressStr = formatAddressToString(originalMessage.newAddress); const oldAddressStr = formatAddressToString(originalMessage.oldAddress); - // eslint-disable-next-line @typescript-eslint/no-deprecated - return translateLocal('workspaceActions.changedCompanyAddress', { + return translate('workspaceActions.changedCompanyAddress', { newAddress: newAddressStr, previousAddress: oldAddressStr || undefined, }); diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 680b0dc8f636..a57bb4e7c875 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -5727,7 +5727,7 @@ function getReportName( return getActionableCardFraudAlertResolutionMessage(translateLocal, parentReportAction); } if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_ADDRESS)) { - return getCompanyAddressUpdateMessage(parentReportAction); + return getCompanyAddressUpdateMessage(translateLocal, parentReportAction); } if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.MARKED_REIMBURSED)) { diff --git a/src/libs/SidebarUtils.ts b/src/libs/SidebarUtils.ts index 820b66f222d4..1492ec96e6a0 100644 --- a/src/libs/SidebarUtils.ts +++ b/src/libs/SidebarUtils.ts @@ -909,7 +909,7 @@ function getOptionData({ } else if (lastAction?.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_REIMBURSEMENT_ENABLED) { result.alternateText = getWorkspaceReimbursementUpdateMessage(translate, lastAction); } else if (lastAction?.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_ADDRESS) { - result.alternateText = getCompanyAddressUpdateMessage(lastAction); + result.alternateText = getCompanyAddressUpdateMessage(translate, lastAction); } else if (lastAction?.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AMOUNT_NO_RECEIPT) { result.alternateText = getPolicyChangeLogMaxExpenseAmountNoReceiptMessage(translate, lastAction); } else if (lastAction?.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AMOUNT) { diff --git a/src/pages/home/report/ContextMenu/ContextMenuActions.tsx b/src/pages/home/report/ContextMenu/ContextMenuActions.tsx index 69d2244fe6ab..8f0d5d014f52 100644 --- a/src/pages/home/report/ContextMenu/ContextMenuActions.tsx +++ b/src/pages/home/report/ContextMenu/ContextMenuActions.tsx @@ -745,7 +745,7 @@ const ContextMenuActions: ContextMenuAction[] = [ } else if (reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_REIMBURSEMENT_ENABLED) { Clipboard.setString(getWorkspaceReimbursementUpdateMessage(translate, reportAction)); } else if (reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_ADDRESS) { - Clipboard.setString(getCompanyAddressUpdateMessage(reportAction)); + Clipboard.setString(getCompanyAddressUpdateMessage(translate, reportAction)); } else if (reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AMOUNT_NO_RECEIPT) { Clipboard.setString(getPolicyChangeLogMaxExpenseAmountNoReceiptMessage(translate, reportAction)); } else if (reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AMOUNT) { diff --git a/src/pages/home/report/PureReportActionItem.tsx b/src/pages/home/report/PureReportActionItem.tsx index fdb64725fe64..6f318e400ac6 100644 --- a/src/pages/home/report/PureReportActionItem.tsx +++ b/src/pages/home/report/PureReportActionItem.tsx @@ -1455,7 +1455,7 @@ function PureReportActionItem({ } else if (isActionOfType(action, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_REIMBURSEMENT_ENABLED)) { children = ; } else if (isActionOfType(action, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_ADDRESS)) { - children = ; + children = ; } else if (isActionOfType(action, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AMOUNT_NO_RECEIPT)) { children = ; } else if (isActionOfType(action, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AMOUNT)) { diff --git a/tests/unit/ReportActionsUtilsTest.ts b/tests/unit/ReportActionsUtilsTest.ts index 4c919dd9ae05..4a8cdff5aee7 100644 --- a/tests/unit/ReportActionsUtilsTest.ts +++ b/tests/unit/ReportActionsUtilsTest.ts @@ -2281,7 +2281,7 @@ describe('ReportActionsUtils', () => { }, } as ReportAction; - const result = getCompanyAddressUpdateMessage(action); + const result = getCompanyAddressUpdateMessage(translateLocal, action); expect(result).toBe('set the company address to "123 Main St, San Francisco, CA 94102"'); }); @@ -2308,7 +2308,7 @@ describe('ReportActionsUtils', () => { }, } as ReportAction; - const result = getCompanyAddressUpdateMessage(action); + const result = getCompanyAddressUpdateMessage(translateLocal, action); expect(result).toBe('changed the company address to "456 New Ave, Los Angeles, CA 90001" (previously "123 Old St, San Francisco, CA 94102")'); }); it('should handle address with street2 (newline separated)', () => { @@ -2328,7 +2328,7 @@ describe('ReportActionsUtils', () => { }, } as ReportAction; - const result = getCompanyAddressUpdateMessage(action); + const result = getCompanyAddressUpdateMessage(translateLocal, action); // The new line should be replaced with a comma expect(result).toBe('set the company address to "123 Main St, Suite 500, New York, NY 10001"'); From de32ef0ce0c8089e8b08994b9ace8caa76fcb3d8 Mon Sep 17 00:00:00 2001 From: Rayane <77965000+rayane-d@users.noreply.github.com> Date: Wed, 7 Jan 2026 21:52:54 +0100 Subject: [PATCH 10/13] Remove duplicated imports --- tests/unit/ReportActionsUtilsTest.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/unit/ReportActionsUtilsTest.ts b/tests/unit/ReportActionsUtilsTest.ts index 4a8cdff5aee7..f7ee65661b22 100644 --- a/tests/unit/ReportActionsUtilsTest.ts +++ b/tests/unit/ReportActionsUtilsTest.ts @@ -14,8 +14,6 @@ import { getCompanyAddressUpdateMessage, getOneTransactionThreadReportID, getOriginalMessage, - getOneTransactionThreadReportID, - getOriginalMessage, getReportActionActorAccountID, getSendMoneyFlowAction, isIOUActionMatchingTransactionList, From 7bed61f779e20f63f55398bdabd524db75f55a80 Mon Sep 17 00:00:00 2001 From: Rayane <77965000+rayane-d@users.noreply.github.com> Date: Wed, 7 Jan 2026 21:59:25 +0100 Subject: [PATCH 11/13] add missing import --- src/pages/home/report/PureReportActionItem.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/home/report/PureReportActionItem.tsx b/src/pages/home/report/PureReportActionItem.tsx index 6f318e400ac6..0ef7898f4992 100644 --- a/src/pages/home/report/PureReportActionItem.tsx +++ b/src/pages/home/report/PureReportActionItem.tsx @@ -69,6 +69,7 @@ import { getAddedApprovalRuleMessage, getAddedConnectionMessage, getChangedApproverActionMessage, + getCompanyAddressUpdateMessage, getDefaultApproverUpdateMessage, getDeletedApprovalRuleMessage, getDemotedFromWorkspaceMessage, From 58dcb813f6250aff9639b8b94823d9691aeb46bd Mon Sep 17 00:00:00 2001 From: Rayane <77965000+rayane-d@users.noreply.github.com> Date: Wed, 7 Jan 2026 22:06:58 +0100 Subject: [PATCH 12/13] fix merge conflicts --- src/libs/SidebarUtils.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/libs/SidebarUtils.ts b/src/libs/SidebarUtils.ts index 1492ec96e6a0..264a7e979a9f 100644 --- a/src/libs/SidebarUtils.ts +++ b/src/libs/SidebarUtils.ts @@ -32,8 +32,6 @@ import { getCardIssuedMessage, getChangedApproverActionMessage, getCompanyAddressUpdateMessage, - getCurrencyDefaultTaxUpdateMessage, - getCustomTaxNameUpdateMessage, getDefaultApproverUpdateMessage, getDeletedApprovalRuleMessage, getForwardsToUpdateMessage, From 11636036f313834b7bfe932e90f664de214f7ad0 Mon Sep 17 00:00:00 2001 From: Rayane <77965000+rayane-d@users.noreply.github.com> Date: Wed, 7 Jan 2026 22:15:17 +0100 Subject: [PATCH 13/13] fix "Changed files ESLint check" error --- src/libs/ReportUtils.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index a57bb4e7c875..0253387f7b22 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -5727,6 +5727,7 @@ function getReportName( return getActionableCardFraudAlertResolutionMessage(translateLocal, parentReportAction); } if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_ADDRESS)) { + // eslint-disable-next-line @typescript-eslint/no-deprecated return getCompanyAddressUpdateMessage(translateLocal, parentReportAction); }