diff --git a/src/CONST/index.ts b/src/CONST/index.ts index 6dc1f5c03d4d..188495e64a5e 100755 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -1352,6 +1352,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_DEFAULT_APPROVER: 'POLICYCHANGELOG_UPDATE_DEFAULT_APPROVER', diff --git a/src/languages/de.ts b/src/languages/de.ts index 020ccf7147e6..b0af98d749ba 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -6331,6 +6331,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: string, approverName: string, field: string, name: string) => `${approverName} (${approverEmail}) als Genehmiger für das Feld ${field} „${name}“ hinzugefügt`, deleteApprovalRule: (approverEmail: string, approverName: string, field: string, name: string) => diff --git a/src/languages/en.ts b/src/languages/en.ts index 9cc61cc8166f..66920d7298f9 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -6208,6 +6208,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: string, approverName: string, field: string, name: string) => `added ${approverName} (${approverEmail}) as an approver for the ${field} "${name}"`, deleteApprovalRule: (approverEmail: string, approverName: string, field: string, name: string) => `removed ${approverName} (${approverEmail}) as an approver for the ${field} "${name}"`, diff --git a/src/languages/es.ts b/src/languages/es.ts index 222e2131599a..a5896d729650 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -5951,6 +5951,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/languages/fr.ts b/src/languages/fr.ts index 7bc96c367822..f4ef403761e1 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -6340,6 +6340,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: string, approverName: string, field: string, name: string) => `a ajouté ${approverName} (${approverEmail}) comme approbateur pour le ${field} « ${name} »`, deleteApprovalRule: (approverEmail: string, approverName: string, field: string, name: string) => diff --git a/src/languages/it.ts b/src/languages/it.ts index f8ae6fef71c9..88a5a75ab19b 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -6315,6 +6315,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: string, approverName: string, field: string, name: string) => `ha aggiunto ${approverName} (${approverEmail}) come approvatore per il campo ${field} "${name}"`, deleteApprovalRule: (approverEmail: string, approverName: string, field: string, name: string) => diff --git a/src/languages/ja.ts b/src/languages/ja.ts index c9ea2e2d83b6..dde2e152ddb9 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -6270,6 +6270,8 @@ ${reportName} billcom: 'Bill.com', }, workspaceActions: { + changedCompanyAddress: ({newAddress, previousAddress}: {newAddress: string; previousAddress?: string}) => + previousAddress ? `会社住所を「${newAddress}」(以前は「${previousAddress}」)に変更しました` : `会社の住所を「${newAddress}」に設定`, addApprovalRule: (approverEmail: string, approverName: string, field: string, name: string) => `${field}「${name}」の承認者として${approverName}(${approverEmail})を追加しました`, deleteApprovalRule: (approverEmail: string, approverName: string, field: string, name: string) => `${field}「${name}」の承認者として${approverName}(${approverEmail})を削除しました`, diff --git a/src/languages/nl.ts b/src/languages/nl.ts index efb0e5be92bd..6bb2db2acee3 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -6304,6 +6304,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: string, approverName: string, field: string, name: string) => `${approverName} (${approverEmail}) toegevoegd als goedkeurder voor het veld ${field} "${name}"`, deleteApprovalRule: (approverEmail: string, approverName: string, field: string, name: string) => diff --git a/src/languages/pl.ts b/src/languages/pl.ts index 4b158b362d7a..c6852857797d 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -6292,6 +6292,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: string, approverName: string, field: string, name: string) => `dodano ${approverName} (${approverEmail}) jako osobę zatwierdzającą dla pola ${field} „${name}”`, deleteApprovalRule: (approverEmail: string, approverName: string, field: string, name: string) => diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index 94f3cf4ca44c..026b8078d901 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -6294,6 +6294,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: string, approverName: string, field: string, name: string) => `adicionou ${approverName} (${approverEmail}) como aprovador para o campo ${field} "${name}"`, deleteApprovalRule: (approverEmail: string, approverName: string, field: string, name: string) => `removeu ${approverName} (${approverEmail}) como aprovador para ${field} "${name}"`, diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 29373376dc3a..cc0f1fbb081d 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -6169,6 +6169,8 @@ ${reportName} billcom: 'BILLCOM', }, workspaceActions: { + changedCompanyAddress: ({newAddress, previousAddress}: {newAddress: string; previousAddress?: string}) => + previousAddress ? `将公司地址更改为“${newAddress}”(原为“${previousAddress}”)` : `将公司地址设置为“${newAddress}”`, addApprovalRule: (approverEmail: string, approverName: string, field: string, name: string) => `已将 ${approverName}(${approverEmail})添加为字段 ${field}“${name}”的审批人`, deleteApprovalRule: (approverEmail: string, approverName: string, field: string, name: string) => `已将 ${approverName}(${approverEmail})从 ${field}“${name}”的审批人中移除`, updateApprovalRule: ({field, name, newApproverEmail, newApproverName, oldApproverEmail, oldApproverName}: UpdatedPolicyApprovalRuleParams) => { diff --git a/src/libs/ReportActionsUtils.ts b/src/libs/ReportActionsUtils.ts index 4ecbc6848964..4e0ee7255602 100644 --- a/src/libs/ReportActionsUtils.ts +++ b/src/libs/ReportActionsUtils.ts @@ -2942,6 +2942,68 @@ function getWorkspaceUpdateFieldMessage(translate: LocalizedTranslate, action: R 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(translate: LocalizedTranslate, 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); + + return translate('workspaceActions.changedCompanyAddress', { + newAddress: newAddressStr, + previousAddress: oldAddressStr || undefined, + }); +} + function getWorkspaceFeatureEnabledMessage(translate: LocalizedTranslate, action: ReportAction): string { const {enabled, featureName} = getOriginalMessage(action as ReportAction) ?? {}; @@ -3694,6 +3756,7 @@ export { getWorkspaceUpdateFieldMessage, getWorkspaceFeatureEnabledMessage, getWorkspaceAttendeeTrackingUpdateMessage, + getCompanyAddressUpdateMessage, getDefaultApproverUpdateMessage, getSubmitsToUpdateMessage, getForwardsToUpdateMessage, diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 4bc3e042d780..b2b5e7919c87 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -176,6 +176,7 @@ import { getAllReportActions, getCardIssuedMessage, getChangedApproverActionMessage, + getCompanyAddressUpdateMessage, getCompanyCardConnectionBrokenMessage, getCreatedReportForUnapprovedTransactionsMessage, getDefaultApproverUpdateMessage, @@ -5739,6 +5740,10 @@ function getReportName( // eslint-disable-next-line @typescript-eslint/no-deprecated 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); + } if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.MARKED_REIMBURSED)) { return getMarkedReimbursedMessage(parentReportAction); diff --git a/src/libs/SidebarUtils.ts b/src/libs/SidebarUtils.ts index 675760dab92f..37d89d333537 100644 --- a/src/libs/SidebarUtils.ts +++ b/src/libs/SidebarUtils.ts @@ -31,6 +31,7 @@ import { getAddedConnectionMessage, getCardIssuedMessage, getChangedApproverActionMessage, + getCompanyAddressUpdateMessage, getCompanyCardConnectionBrokenMessage, getDefaultApproverUpdateMessage, getDeletedApprovalRuleMessage, @@ -908,6 +909,8 @@ function getOptionData({ result.alternateText = getForwardsToUpdateMessage(translate, lastAction); } 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(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 1ab0a98c3093..d41bc689d590 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, getCompanyCardConnectionBrokenMessage, getCreatedReportForUnapprovedTransactionsMessage, getDefaultApproverUpdateMessage, @@ -747,6 +748,8 @@ const ContextMenuActions: ContextMenuAction[] = [ Clipboard.setString(getForwardsToUpdateMessage(translate, reportAction)); } 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(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 1a4a304bea68..41178c62cc31 100644 --- a/src/pages/home/report/PureReportActionItem.tsx +++ b/src/pages/home/report/PureReportActionItem.tsx @@ -69,6 +69,7 @@ import { getAddedApprovalRuleMessage, getAddedConnectionMessage, getChangedApproverActionMessage, + getCompanyAddressUpdateMessage, getCompanyCardConnectionBrokenMessage, getCreatedReportForUnapprovedTransactionsMessage, getDefaultApproverUpdateMessage, @@ -1456,6 +1457,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)) { diff --git a/tests/unit/ReportActionsUtilsTest.ts b/tests/unit/ReportActionsUtilsTest.ts index db2dea655d01..3f54fffc8cd6 100644 --- a/tests/unit/ReportActionsUtilsTest.ts +++ b/tests/unit/ReportActionsUtilsTest.ts @@ -12,6 +12,7 @@ import CONST from '../../src/CONST'; import * as ReportActionsUtils from '../../src/libs/ReportActionsUtils'; import { getCardIssuedMessage, + getCompanyAddressUpdateMessage, getCreatedReportForUnapprovedTransactionsMessage, getOneTransactionThreadReportID, getOriginalMessage, @@ -2284,6 +2285,78 @@ describe('ReportActionsUtils', () => { }); }); + describe('getCompanyAddressUpdateMessage', () => { + 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', + created: '', + originalMessage: { + newAddress: { + addressStreet: '123 Main St', + city: 'San Francisco', + state: 'CA', + zipCode: '94102', + country: 'US', + }, + oldAddress: null, + }, + } as ReportAction; + + const result = getCompanyAddressUpdateMessage(translateLocal, 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: '', + 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 = 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)', () => { + const action = { + actionName: CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_ADDRESS, + reportActionID: '1', + created: '', + originalMessage: { + newAddress: { + addressStreet: '123 Main St\nSuite 500', + city: 'New York', + state: 'NY', + zipCode: '10001', + country: 'US', + }, + oldAddress: null, + }, + } as ReportAction; + + 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"'); + }); + }); + describe('getWorkspaceCustomUnitRateUpdatedMessage', () => { it('should return the correct message when a rate is enabled', () => { const action: ReportAction = {