From 749fb0f099e68ca22ebf073c25029e067e9567b1 Mon Sep 17 00:00:00 2001 From: "Daniel Gale-Rosen (via MelvinBot)" Date: Thu, 9 Apr 2026 19:08:13 +0000 Subject: [PATCH 1/3] Add itemized receipt changelog support and fix manual approval threshold bug - Add UPDATE_MAX_EXPENSE_AMOUNT_NO_ITEMIZED_RECEIPT action type to CONST.ts - Add oldMaxExpenseAmountNoItemizedReceipt and newMaxExpenseAmountNoItemizedReceipt fields to OriginalMessage.ts - Add getPolicyChangeLogMaxExpenseAmountNoItemizedReceiptMessage function in ReportActionsUtils.ts - Add dispatch branches in PureReportActionItem.tsx and SidebarUtils.ts - Add translations for set/changed/removed itemized receipt required amount in all languages - Fix getUpdatedManualApprovalThresholdMessage: check newLimit instead of oldLimit twice - Clean up stale useState/isModalVisible in AddNewCardPage.tsx Co-authored-by: Daniel Gale-Rosen --- src/CONST/index.ts | 1 + src/languages/de.ts | 5 +++- src/languages/en.ts | 3 +++ src/languages/es.ts | 3 +++ src/languages/fr.ts | 3 +++ src/languages/it.ts | 4 +++ src/languages/ja.ts | 3 +++ src/languages/nl.ts | 4 +++ src/languages/pl.ts | 3 +++ src/languages/pt-BR.ts | 3 +++ src/languages/zh-hans.ts | 5 +++- src/libs/ReportActionsUtils.ts | 27 ++++++++++++++++++- src/libs/SidebarUtils.ts | 3 +++ .../inbox/report/PureReportActionItem.tsx | 3 +++ .../Wallet/PersonalCards/AddNewCardPage.tsx | 22 ++++++--------- src/types/onyx/OriginalMessage.ts | 6 +++++ 16 files changed, 81 insertions(+), 17 deletions(-) diff --git a/src/CONST/index.ts b/src/CONST/index.ts index 3d66a4d43fac..724ab8c0a4cb 100644 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -1625,6 +1625,7 @@ const CONST = { UPDATE_MANUAL_APPROVAL_THRESHOLD: 'POLICYCHANGELOG_UPDATE_MANUAL_APPROVAL_THRESHOLD', UPDATE_MAX_EXPENSE_AMOUNT: 'POLICYCHANGELOG_UPDATE_MAX_EXPENSE_AMOUNT', UPDATE_MAX_EXPENSE_AMOUNT_NO_RECEIPT: 'POLICYCHANGELOG_UPDATE_MAX_EXPENSE_AMOUNT_NO_RECEIPT', + UPDATE_MAX_EXPENSE_AMOUNT_NO_ITEMIZED_RECEIPT: 'POLICYCHANGELOG_UPDATE_MAX_EXPENSE_AMOUNT_NO_ITEMIZED_RECEIPT', UPDATE_MAX_EXPENSE_AGE: 'POLICYCHANGELOG_UPDATE_MAX_EXPENSE_AGE', UPDATE_MULTIPLE_TAGS_APPROVER_RULES: 'POLICYCHANGELOG_UPDATE_MULTIPLE_TAGS_APPROVER_RULES', UPDATE_NAME: 'POLICYCHANGELOG_UPDATE_NAME', diff --git a/src/languages/de.ts b/src/languages/de.ts index 963c61ac7a7c..40783f846a81 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -7277,7 +7277,10 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc }, setReceiptRequiredAmount: (newValue: string) => `Belegpflichtigen Betrag auf „${newValue}“ festlegen`, changedReceiptRequiredAmount: (oldValue: string, newValue: string) => `Belegpflichtbetrag auf „${newValue}“ geändert (zuvor „${oldValue}“)`, - removedReceiptRequiredAmount: (oldValue: string) => `Belegpflichtigen Betrag entfernt (zuvor „${oldValue}“)`, + removedReceiptRequiredAmount: (oldValue: string) => `Belegpflichtigen Betrag entfernt (zuvor „${oldValue}”)`, + setItemizedReceiptRequiredAmount: (newValue: string) => `Pflichtbetrag für aufgeschlüsselten Beleg auf „${newValue}” festgelegt`, + changedItemizedReceiptRequiredAmount: (oldValue: string, newValue: string) => `Pflichtbetrag für aufgeschlüsselten Beleg auf „${newValue}” geändert (zuvor „${oldValue}”)`, + removedItemizedReceiptRequiredAmount: (oldValue: string) => `Pflichtbetrag für aufgeschlüsselten Beleg entfernt (zuvor „${oldValue}”)`, setMaxExpenseAmount: (newValue: string) => `maximalen Ausgabenbetrag auf „${newValue}“ festlegen`, changedMaxExpenseAmount: (oldValue: string, newValue: string) => `hat den maximalen Ausgabenbetrag auf „${newValue}“ geändert (zuvor „${oldValue}“)`, removedMaxExpenseAmount: (oldValue: string) => `maximale Ausgabenhöhe entfernt (zuvor „${oldValue}“)`, diff --git a/src/languages/en.ts b/src/languages/en.ts index e4c5028b6235..5a11a64675a3 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -7383,6 +7383,9 @@ const translations = { setReceiptRequiredAmount: (newValue: string) => `set receipt required amount to "${newValue}"`, changedReceiptRequiredAmount: (oldValue: string, newValue: string) => `changed receipt required amount to "${newValue}" (previously "${oldValue}")`, removedReceiptRequiredAmount: (oldValue: string) => `removed receipt required amount (previously "${oldValue}")`, + setItemizedReceiptRequiredAmount: (newValue: string) => `set itemized receipt required amount to "${newValue}"`, + changedItemizedReceiptRequiredAmount: (oldValue: string, newValue: string) => `changed itemized receipt required amount to "${newValue}" (previously "${oldValue}")`, + removedItemizedReceiptRequiredAmount: (oldValue: string) => `removed itemized receipt required amount (previously "${oldValue}")`, setMaxExpenseAmount: (newValue: string) => `set max expense amount to "${newValue}"`, changedMaxExpenseAmount: (oldValue: string, newValue: string) => `changed max expense amount to "${newValue}" (previously "${oldValue}")`, removedMaxExpenseAmount: (oldValue: string) => `removed max expense amount (previously "${oldValue}")`, diff --git a/src/languages/es.ts b/src/languages/es.ts index 1e9a38ec17bf..3df3f3d4dacc 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -6948,6 +6948,9 @@ ${amount} para ${merchant} - ${date}`, setReceiptRequiredAmount: (newValue) => `estableció el importe requerido del recibo en "${newValue}"`, changedReceiptRequiredAmount: (oldValue, newValue) => `cambió el importe requerido del recibo a "${newValue}" (antes "${oldValue}")`, removedReceiptRequiredAmount: (oldValue) => `eliminó el importe requerido del recibo (antes "${oldValue}")`, + setItemizedReceiptRequiredAmount: (newValue) => `estableció el importe requerido del recibo detallado en "${newValue}"`, + changedItemizedReceiptRequiredAmount: (oldValue, newValue) => `cambió el importe requerido del recibo detallado a "${newValue}" (antes "${oldValue}")`, + removedItemizedReceiptRequiredAmount: (oldValue) => `eliminó el importe requerido del recibo detallado (antes "${oldValue}")`, setMaxExpenseAmount: (newValue) => `estableció el importe máximo del gasto en "${newValue}"`, changedMaxExpenseAmount: (oldValue, newValue) => `cambió el importe máximo del gasto a "${newValue}" (antes "${oldValue}")`, diff --git a/src/languages/fr.ts b/src/languages/fr.ts index 82f6c79bcdb6..9873e8aa5812 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -7300,6 +7300,9 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e setReceiptRequiredAmount: (newValue: string) => `définir le montant de reçu obligatoire sur « ${newValue} »`, changedReceiptRequiredAmount: (oldValue: string, newValue: string) => `a modifié le montant requis pour le reçu à « ${newValue} » (auparavant « ${oldValue} »)`, removedReceiptRequiredAmount: (oldValue: string) => `a supprimé le montant requis pour le reçu (précédemment « ${oldValue} »)`, + setItemizedReceiptRequiredAmount: (newValue: string) => `a défini le montant requis pour le reçu détaillé sur « ${newValue} »`, + changedItemizedReceiptRequiredAmount: (oldValue: string, newValue: string) => `a modifié le montant requis pour le reçu détaillé à « ${newValue} » (auparavant « ${oldValue} »)`, + removedItemizedReceiptRequiredAmount: (oldValue: string) => `a supprimé le montant requis pour le reçu détaillé (précédemment « ${oldValue} »)`, setMaxExpenseAmount: (newValue: string) => `définir le montant maximal de dépense sur « ${newValue} »`, changedMaxExpenseAmount: (oldValue: string, newValue: string) => `montant maximal de dépense modifié en « ${newValue} » (précédemment « ${oldValue} »)`, removedMaxExpenseAmount: (oldValue: string) => `montant de dépense maximal supprimé (précédemment « ${oldValue} »)`, diff --git a/src/languages/it.ts b/src/languages/it.ts index 4a3ad959ec29..1beb48f2e810 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -7265,6 +7265,10 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, setReceiptRequiredAmount: (newValue: string) => `imposta l’importo richiesto per la ricevuta su "${newValue}"`, changedReceiptRequiredAmount: (oldValue: string, newValue: string) => `ha modificato l’importo richiesto per la ricevuta in "${newValue}" (in precedenza "${oldValue}")`, removedReceiptRequiredAmount: (oldValue: string) => `ha rimosso l’importo richiesto per la ricevuta (in precedenza «${oldValue}»)`, + setItemizedReceiptRequiredAmount: (newValue: string) => `ha impostato l’importo richiesto per la ricevuta dettagliata su "${newValue}"`, + changedItemizedReceiptRequiredAmount: (oldValue: string, newValue: string) => + `ha modificato l’importo richiesto per la ricevuta dettagliata in "${newValue}" (in precedenza "${oldValue}")`, + removedItemizedReceiptRequiredAmount: (oldValue: string) => `ha rimosso l’importo richiesto per la ricevuta dettagliata (in precedenza "${oldValue}")`, setMaxExpenseAmount: (newValue: string) => `imposta l’importo massimo della spesa su "${newValue}"`, changedMaxExpenseAmount: (oldValue: string, newValue: string) => `ha modificato l'importo massimo della spesa a "${newValue}" (precedentemente "${oldValue}")`, removedMaxExpenseAmount: (oldValue: string) => `importo massimo spesa rimosso (precedentemente "${oldValue}")`, diff --git a/src/languages/ja.ts b/src/languages/ja.ts index b7460368b0e3..ea0a0ef334f9 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -7179,6 +7179,9 @@ ${reportName} setReceiptRequiredAmount: (newValue: string) => `必要な領収書金額を「${newValue}」に設定`, changedReceiptRequiredAmount: (oldValue: string, newValue: string) => `領収書必須金額を「${newValue}」(以前は「${oldValue}」)に変更しました`, removedReceiptRequiredAmount: (oldValue: string) => `必須領収書金額を削除しました(以前の値:「${oldValue}」)`, + setItemizedReceiptRequiredAmount: (newValue: string) => `明細付き領収書の必須金額を「${newValue}」に設定しました`, + changedItemizedReceiptRequiredAmount: (oldValue: string, newValue: string) => `明細付き領収書の必須金額を「${newValue}」に変更しました(以前は「${oldValue}」)`, + removedItemizedReceiptRequiredAmount: (oldValue: string) => `明細付き領収書の必須金額を削除しました(以前の値:「${oldValue}」)`, setMaxExpenseAmount: (newValue: string) => `最大経費金額を「${newValue}」に設定`, changedMaxExpenseAmount: (oldValue: string, newValue: string) => `上限経費額を「${newValue}」に変更しました(以前は「${oldValue}」)`, removedMaxExpenseAmount: (oldValue: string) => `最大経費金額を削除しました(以前の値: 「${oldValue}」)`, diff --git a/src/languages/nl.ts b/src/languages/nl.ts index 82eec026635c..c7a428293372 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -7244,6 +7244,10 @@ Voeg meer bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`, setReceiptRequiredAmount: (newValue: string) => `stel het vereiste bonbedrag in op "${newValue}"`, changedReceiptRequiredAmount: (oldValue: string, newValue: string) => `heeft het vereiste bonbedrag gewijzigd naar "${newValue}" (voorheen "${oldValue}")`, removedReceiptRequiredAmount: (oldValue: string) => `vereiste bedrag op verwijderde bon (voorheen “${oldValue}”)`, + setItemizedReceiptRequiredAmount: (newValue: string) => `vereist bedrag voor gespecificeerde bon ingesteld op "${newValue}"`, + changedItemizedReceiptRequiredAmount: (oldValue: string, newValue: string) => + `heeft het vereiste bedrag voor gespecificeerde bon gewijzigd naar "${newValue}" (voorheen "${oldValue}")`, + removedItemizedReceiptRequiredAmount: (oldValue: string) => `vereist bedrag voor gespecificeerde bon verwijderd (voorheen "${oldValue}")`, setMaxExpenseAmount: (newValue: string) => `maximumbedrag voor uitgave instellen op "${newValue}"`, changedMaxExpenseAmount: (oldValue: string, newValue: string) => `maximale onkostensom gewijzigd naar "${newValue}" (voorheen "${oldValue}")`, removedMaxExpenseAmount: (oldValue: string) => `maximaal bedrag voor uitgave verwijderd (voorheen "${oldValue}")`, diff --git a/src/languages/pl.ts b/src/languages/pl.ts index fad2436ea5bc..735ec0751961 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -7233,6 +7233,9 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, setReceiptRequiredAmount: (newValue: string) => `ustaw wymaganą kwotę paragonu na „${newValue}”`, changedReceiptRequiredAmount: (oldValue: string, newValue: string) => `zmienił(a) wymaganą kwotę paragonu na „${newValue}” (wcześniej „${oldValue}”)`, removedReceiptRequiredAmount: (oldValue: string) => `usunięto wymagany limit paragonu (wcześniej „${oldValue}”)`, + setItemizedReceiptRequiredAmount: (newValue: string) => `ustawiono wymaganą kwotę szczegółowego paragonu na „${newValue}”`, + changedItemizedReceiptRequiredAmount: (oldValue: string, newValue: string) => `zmieniono wymaganą kwotę szczegółowego paragonu na „${newValue}” (wcześniej „${oldValue}”)`, + removedItemizedReceiptRequiredAmount: (oldValue: string) => `usunięto wymaganą kwotę szczegółowego paragonu (wcześniej „${oldValue}”)`, setMaxExpenseAmount: (newValue: string) => `ustaw maksymalną kwotę wydatku na „${newValue}”`, changedMaxExpenseAmount: (oldValue: string, newValue: string) => `zmieniono maksymalną kwotę wydatku na „${newValue}” (wcześniej „${oldValue}”)`, removedMaxExpenseAmount: (oldValue: string) => `usunięto maksymalną kwotę wydatku (wcześniej „${oldValue}”)`, diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index b50ded52c6e8..3cc9af5e4e4f 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -7236,6 +7236,9 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, setReceiptRequiredAmount: (newValue: string) => `definir valor exigido do recibo como "${newValue}"`, changedReceiptRequiredAmount: (oldValue: string, newValue: string) => `alterou o valor obrigatório do recibo para "${newValue}" (antes "${oldValue}")`, removedReceiptRequiredAmount: (oldValue: string) => `removeu o valor obrigatório do recibo (antes era "${oldValue}")`, + setItemizedReceiptRequiredAmount: (newValue: string) => `definiu o valor obrigatório do recibo detalhado como "${newValue}"`, + changedItemizedReceiptRequiredAmount: (oldValue: string, newValue: string) => `alterou o valor obrigatório do recibo detalhado para "${newValue}" (antes "${oldValue}")`, + removedItemizedReceiptRequiredAmount: (oldValue: string) => `removeu o valor obrigatório do recibo detalhado (antes era "${oldValue}")`, setMaxExpenseAmount: (newValue: string) => `definir valor máximo da despesa como "${newValue}"`, changedMaxExpenseAmount: (oldValue: string, newValue: string) => `alterou o valor máximo da despesa para "${newValue}" (antes "${oldValue}")`, removedMaxExpenseAmount: (oldValue: string) => `removeu o valor máximo de despesa (anteriormente "${oldValue}")`, diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index acf4ea70a06f..e1b3632f9fe3 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -7045,7 +7045,10 @@ ${reportName} setReceiptRequiredAmount: (newValue: string) => `将需要收据的金额设置为“${newValue}”`, changedReceiptRequiredAmount: (oldValue: string, newValue: string) => `已将所需收据金额更改为“${newValue}”(之前为“${oldValue}”)`, removedReceiptRequiredAmount: (oldValue: string) => `已移除所需收据金额(先前为“${oldValue}”)`, - setMaxExpenseAmount: (newValue: string) => `将最高报销金额设置为“${newValue}”`, + setItemizedReceiptRequiredAmount: (newValue: string) => `将逐项收据所需金额设置为”${newValue}”`, + changedItemizedReceiptRequiredAmount: (oldValue: string, newValue: string) => `已将逐项收据所需金额更改为”${newValue}”(之前为”${oldValue}”)`, + removedItemizedReceiptRequiredAmount: (oldValue: string) => `已移除逐项收据所需金额(先前为”${oldValue}”)`, + setMaxExpenseAmount: (newValue: string) => `将最高报销金额设置为”${newValue}”`, changedMaxExpenseAmount: (oldValue: string, newValue: string) => `将最高报销金额更改为 “${newValue}”(之前为 “${oldValue}”)`, removedMaxExpenseAmount: (oldValue: string) => `已移除最⾼报销金额(原为“${oldValue}”)`, setMaxExpenseAge: (newValue: string) => `将最大报销天数设置为“${newValue}”天`, diff --git a/src/libs/ReportActionsUtils.ts b/src/libs/ReportActionsUtils.ts index 1c31711ce7a7..10ea68413baa 100644 --- a/src/libs/ReportActionsUtils.ts +++ b/src/libs/ReportActionsUtils.ts @@ -3612,6 +3612,30 @@ function getPolicyChangeLogMaxExpenseAmountNoReceiptMessage(translate: Localized return getReportActionText(action); } +function getPolicyChangeLogMaxExpenseAmountNoItemizedReceiptMessage(translate: LocalizedTranslate, action: ReportAction): string { + const {oldMaxExpenseAmountNoItemizedReceipt, newMaxExpenseAmountNoItemizedReceipt, currency} = + getOriginalMessage(action as ReportAction) ?? {}; + + if (typeof oldMaxExpenseAmountNoItemizedReceipt === 'number' && typeof newMaxExpenseAmountNoItemizedReceipt === 'number') { + const isOldLimitDisabled = oldMaxExpenseAmountNoItemizedReceipt === CONST.DISABLED_MAX_EXPENSE_VALUE; + const isNewLimitDisabled = newMaxExpenseAmountNoItemizedReceipt === CONST.DISABLED_MAX_EXPENSE_VALUE; + const oldValue = isOldLimitDisabled ? '' : convertToDisplayString(oldMaxExpenseAmountNoItemizedReceipt, currency); + const newValue = isNewLimitDisabled ? '' : convertToDisplayString(newMaxExpenseAmountNoItemizedReceipt, currency); + + if (isOldLimitDisabled && !isNewLimitDisabled) { + return translate('workspaceActions.setItemizedReceiptRequiredAmount', newValue); + } + + if (!isOldLimitDisabled && isNewLimitDisabled) { + return translate('workspaceActions.removedItemizedReceiptRequiredAmount', oldValue); + } + + return translate('workspaceActions.changedItemizedReceiptRequiredAmount', oldValue, newValue); + } + + return getReportActionText(action); +} + function getPolicyChangeLogMaxExpenseAmountMessage(translate: LocalizedTranslate, action: ReportAction): string { const {oldMaxExpenseAmount, newMaxExpenseAmount, currency} = getOriginalMessage(action as ReportAction) ?? {}; @@ -3927,7 +3951,7 @@ function getUpdatedManualApprovalThresholdMessage(translate: LocalizedTranslate, currency = CONST.CURRENCY.USD, } = getOriginalMessage(reportAction as ReportAction) ?? {}; - if (typeof oldLimit !== 'number' || typeof oldLimit !== 'number') { + if (typeof oldLimit !== 'number' || typeof newLimit !== 'number') { return getReportActionText(reportAction); } return translate('workspaceActions.updatedManualApprovalThreshold', {oldLimit: convertToDisplayString(oldLimit, currency), newLimit: convertToDisplayString(newLimit, currency)}); @@ -4684,6 +4708,7 @@ export { getForeignCurrencyDefaultTaxUpdateMessage, getWorkspaceFrequencyUpdateMessage, getPolicyChangeLogMaxExpenseAmountNoReceiptMessage, + getPolicyChangeLogMaxExpenseAmountNoItemizedReceiptMessage, getPolicyChangeLogMaxExpenseAmountMessage, getPolicyChangeLogMaxExpenseAgeMessage, getPolicyChangeLogDefaultBillableMessage, diff --git a/src/libs/SidebarUtils.ts b/src/libs/SidebarUtils.ts index fe3de00aec9a..85362be9e161 100644 --- a/src/libs/SidebarUtils.ts +++ b/src/libs/SidebarUtils.ts @@ -72,6 +72,7 @@ import { getPolicyChangeLogEmployeeLeftMessage, getPolicyChangeLogMaxExpenseAgeMessage, getPolicyChangeLogMaxExpenseAmountMessage, + getPolicyChangeLogMaxExpenseAmountNoItemizedReceiptMessage, getPolicyChangeLogMaxExpenseAmountNoReceiptMessage, getPolicyChangeLogUpdateEmployee, getReimburserUpdateMessage, @@ -1036,6 +1037,8 @@ function getOptionData({ 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_NO_ITEMIZED_RECEIPT) { + result.alternateText = getPolicyChangeLogMaxExpenseAmountNoItemizedReceiptMessage(translate, lastAction); } else if (lastAction?.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AMOUNT) { result.alternateText = getPolicyChangeLogMaxExpenseAmountMessage(translate, lastAction); } else if (lastAction?.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AGE) { diff --git a/src/pages/inbox/report/PureReportActionItem.tsx b/src/pages/inbox/report/PureReportActionItem.tsx index ca19344d56b7..153ec506951e 100644 --- a/src/pages/inbox/report/PureReportActionItem.tsx +++ b/src/pages/inbox/report/PureReportActionItem.tsx @@ -118,6 +118,7 @@ import { getPolicyChangeLogDeleteMemberMessage, getPolicyChangeLogMaxExpenseAgeMessage, getPolicyChangeLogMaxExpenseAmountMessage, + getPolicyChangeLogMaxExpenseAmountNoItemizedReceiptMessage, getPolicyChangeLogMaxExpenseAmountNoReceiptMessage, getPolicyChangeLogUpdateEmployee, getReimburserUpdateMessage, @@ -1626,6 +1627,8 @@ function PureReportActionItem({ 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_NO_ITEMIZED_RECEIPT)) { + children = ; } else if (isActionOfType(action, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AMOUNT)) { children = ; } else if (isActionOfType(action, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AGE)) { diff --git a/src/pages/settings/Wallet/PersonalCards/AddNewCardPage.tsx b/src/pages/settings/Wallet/PersonalCards/AddNewCardPage.tsx index 77ff0a98d0a4..9e139591a2ab 100644 --- a/src/pages/settings/Wallet/PersonalCards/AddNewCardPage.tsx +++ b/src/pages/settings/Wallet/PersonalCards/AddNewCardPage.tsx @@ -1,4 +1,4 @@ -import React, {useEffect, useState} from 'react'; +import React, {useEffect} from 'react'; import {View} from 'react-native'; import FullScreenLoadingIndicator from '@components/FullscreenLoadingIndicator'; import {ModalActions} from '@components/Modal/Global/ModalContext'; @@ -26,7 +26,6 @@ function AddPersonalNewCardPage() { const [introSelected] = useOnyx(ONYXKEYS.NVP_INTRO_SELECTED); const [betas] = useOnyx(ONYXKEYS.BETAS); const {currentStep} = addNewPersonalCardFeed ?? {}; - const [isModalVisible, setIsModalVisible] = useState(false); const {showConfirmModal} = useConfirmModal(); const {translate} = useLocalize(); const {accountID: currentUserAccountID} = useCurrentUserPersonalDetails(); @@ -66,29 +65,24 @@ function AddPersonalNewCardPage() { CurrentStep = ( { - setIsModalVisible(true); showConfirmModal({ title: translate('workspace.companyCards.addNewCard.exitModal.title'), success: true, confirmText: translate('workspace.companyCards.addNewCard.exitModal.confirmText'), cancelText: translate('workspace.companyCards.addNewCard.exitModal.cancelText'), prompt: translate('workspace.companyCards.addNewCard.exitModal.prompt'), - }) - .then((result) => { - if (result.action !== ModalActions.CONFIRM) { - return; - } - navigateToConciergeChat(conciergeReportID, introSelected, currentUserAccountID, false, betas); - }) - .finally(() => { - setIsModalVisible(false); - }); + }).then((result) => { + if (result.action !== ModalActions.CONFIRM) { + return; + } + navigateToConciergeChat(conciergeReportID, introSelected, currentUserAccountID, false, betas); + }); }} /> ); break; default: - CurrentStep = ; + CurrentStep = ; break; } diff --git a/src/types/onyx/OriginalMessage.ts b/src/types/onyx/OriginalMessage.ts index 41b63bc21800..7fc49006c20b 100644 --- a/src/types/onyx/OriginalMessage.ts +++ b/src/types/onyx/OriginalMessage.ts @@ -475,6 +475,12 @@ type OriginalMessagePolicyChangeLog = { /** New value for max expense amount with no receipt */ newMaxExpenseAmountNoReceipt?: number; + /** Old value for max expense amount with no itemized receipt */ + oldMaxExpenseAmountNoItemizedReceipt?: number; + + /** New value for max expense amount with no itemized receipt */ + newMaxExpenseAmountNoItemizedReceipt?: number; + /** Currency of the policy */ currency?: string; From 2289000bfc25c4ff718b91021e79423ad6583fec Mon Sep 17 00:00:00 2001 From: "Daniel Gale-Rosen (via MelvinBot)" Date: Fri, 10 Apr 2026 15:34:20 +0000 Subject: [PATCH 2/3] Revert unrelated changes to AddNewCardPage Co-authored-by: Daniel Gale-Rosen --- .../Wallet/PersonalCards/AddNewCardPage.tsx | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/pages/settings/Wallet/PersonalCards/AddNewCardPage.tsx b/src/pages/settings/Wallet/PersonalCards/AddNewCardPage.tsx index 9e139591a2ab..77ff0a98d0a4 100644 --- a/src/pages/settings/Wallet/PersonalCards/AddNewCardPage.tsx +++ b/src/pages/settings/Wallet/PersonalCards/AddNewCardPage.tsx @@ -1,4 +1,4 @@ -import React, {useEffect} from 'react'; +import React, {useEffect, useState} from 'react'; import {View} from 'react-native'; import FullScreenLoadingIndicator from '@components/FullscreenLoadingIndicator'; import {ModalActions} from '@components/Modal/Global/ModalContext'; @@ -26,6 +26,7 @@ function AddPersonalNewCardPage() { const [introSelected] = useOnyx(ONYXKEYS.NVP_INTRO_SELECTED); const [betas] = useOnyx(ONYXKEYS.BETAS); const {currentStep} = addNewPersonalCardFeed ?? {}; + const [isModalVisible, setIsModalVisible] = useState(false); const {showConfirmModal} = useConfirmModal(); const {translate} = useLocalize(); const {accountID: currentUserAccountID} = useCurrentUserPersonalDetails(); @@ -65,24 +66,29 @@ function AddPersonalNewCardPage() { CurrentStep = ( { + setIsModalVisible(true); showConfirmModal({ title: translate('workspace.companyCards.addNewCard.exitModal.title'), success: true, confirmText: translate('workspace.companyCards.addNewCard.exitModal.confirmText'), cancelText: translate('workspace.companyCards.addNewCard.exitModal.cancelText'), prompt: translate('workspace.companyCards.addNewCard.exitModal.prompt'), - }).then((result) => { - if (result.action !== ModalActions.CONFIRM) { - return; - } - navigateToConciergeChat(conciergeReportID, introSelected, currentUserAccountID, false, betas); - }); + }) + .then((result) => { + if (result.action !== ModalActions.CONFIRM) { + return; + } + navigateToConciergeChat(conciergeReportID, introSelected, currentUserAccountID, false, betas); + }) + .finally(() => { + setIsModalVisible(false); + }); }} /> ); break; default: - CurrentStep = ; + CurrentStep = ; break; } From 2a8055d6f68fa9ba395be6cbb663d2def711c714 Mon Sep 17 00:00:00 2001 From: "Daniel Gale-Rosen (via MelvinBot)" Date: Fri, 10 Apr 2026 15:43:07 +0000 Subject: [PATCH 3/3] Update itemized receipt translations and add tests - Update itemized receipt changelog translations for de, fr, it, ja, nl, pl, pt-BR, and zh-hans to match the translation script output - Add unit tests for getPolicyChangeLogMaxExpenseAmountNoItemizedReceiptMessage covering set, remove, and change scenarios Co-authored-by: Daniel Gale-Rosen --- src/languages/de.ts | 6 ++-- src/languages/fr.ts | 2 +- src/languages/it.ts | 6 ++-- src/languages/ja.ts | 4 +-- src/languages/nl.ts | 4 +-- src/languages/pl.ts | 6 ++-- src/languages/pt-BR.ts | 4 +-- src/languages/zh-hans.ts | 6 ++-- tests/unit/ReportActionsUtilsTest.ts | 48 ++++++++++++++++++++++++++++ 9 files changed, 67 insertions(+), 19 deletions(-) diff --git a/src/languages/de.ts b/src/languages/de.ts index 40783f846a81..766787424cb9 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -7278,9 +7278,9 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc setReceiptRequiredAmount: (newValue: string) => `Belegpflichtigen Betrag auf „${newValue}“ festlegen`, changedReceiptRequiredAmount: (oldValue: string, newValue: string) => `Belegpflichtbetrag auf „${newValue}“ geändert (zuvor „${oldValue}“)`, removedReceiptRequiredAmount: (oldValue: string) => `Belegpflichtigen Betrag entfernt (zuvor „${oldValue}”)`, - setItemizedReceiptRequiredAmount: (newValue: string) => `Pflichtbetrag für aufgeschlüsselten Beleg auf „${newValue}” festgelegt`, - changedItemizedReceiptRequiredAmount: (oldValue: string, newValue: string) => `Pflichtbetrag für aufgeschlüsselten Beleg auf „${newValue}” geändert (zuvor „${oldValue}”)`, - removedItemizedReceiptRequiredAmount: (oldValue: string) => `Pflichtbetrag für aufgeschlüsselten Beleg entfernt (zuvor „${oldValue}”)`, + setItemizedReceiptRequiredAmount: (newValue: string) => `Betrag für Pflicht zur Einzelauflistung auf „${newValue}” festgelegt`, + changedItemizedReceiptRequiredAmount: (oldValue: string, newValue: string) => `erforderlichen Betrag des aufgeschlüsselten Belegs auf „${newValue}” geändert (zuvor „${oldValue}”)`, + removedItemizedReceiptRequiredAmount: (oldValue: string) => `Betrag für obligatorische Einzelpostenbelege entfernt (zuvor „${oldValue}”)`, setMaxExpenseAmount: (newValue: string) => `maximalen Ausgabenbetrag auf „${newValue}“ festlegen`, changedMaxExpenseAmount: (oldValue: string, newValue: string) => `hat den maximalen Ausgabenbetrag auf „${newValue}“ geändert (zuvor „${oldValue}“)`, removedMaxExpenseAmount: (oldValue: string) => `maximale Ausgabenhöhe entfernt (zuvor „${oldValue}“)`, diff --git a/src/languages/fr.ts b/src/languages/fr.ts index 9873e8aa5812..205cbb845a8e 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -7300,7 +7300,7 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e setReceiptRequiredAmount: (newValue: string) => `définir le montant de reçu obligatoire sur « ${newValue} »`, changedReceiptRequiredAmount: (oldValue: string, newValue: string) => `a modifié le montant requis pour le reçu à « ${newValue} » (auparavant « ${oldValue} »)`, removedReceiptRequiredAmount: (oldValue: string) => `a supprimé le montant requis pour le reçu (précédemment « ${oldValue} »)`, - setItemizedReceiptRequiredAmount: (newValue: string) => `a défini le montant requis pour le reçu détaillé sur « ${newValue} »`, + setItemizedReceiptRequiredAmount: (newValue: string) => `définir le montant requis pour le reçu détaillé sur « ${newValue} »`, changedItemizedReceiptRequiredAmount: (oldValue: string, newValue: string) => `a modifié le montant requis pour le reçu détaillé à « ${newValue} » (auparavant « ${oldValue} »)`, removedItemizedReceiptRequiredAmount: (oldValue: string) => `a supprimé le montant requis pour le reçu détaillé (précédemment « ${oldValue} »)`, setMaxExpenseAmount: (newValue: string) => `définir le montant maximal de dépense sur « ${newValue} »`, diff --git a/src/languages/it.ts b/src/languages/it.ts index 1beb48f2e810..75fbf46b6825 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -7265,10 +7265,10 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, setReceiptRequiredAmount: (newValue: string) => `imposta l’importo richiesto per la ricevuta su "${newValue}"`, changedReceiptRequiredAmount: (oldValue: string, newValue: string) => `ha modificato l’importo richiesto per la ricevuta in "${newValue}" (in precedenza "${oldValue}")`, removedReceiptRequiredAmount: (oldValue: string) => `ha rimosso l’importo richiesto per la ricevuta (in precedenza «${oldValue}»)`, - setItemizedReceiptRequiredAmount: (newValue: string) => `ha impostato l’importo richiesto per la ricevuta dettagliata su "${newValue}"`, + setItemizedReceiptRequiredAmount: (newValue: string) => `imposta l’importo richiesto per la ricevuta con voci singole su "${newValue}"`, changedItemizedReceiptRequiredAmount: (oldValue: string, newValue: string) => - `ha modificato l’importo richiesto per la ricevuta dettagliata in "${newValue}" (in precedenza "${oldValue}")`, - removedItemizedReceiptRequiredAmount: (oldValue: string) => `ha rimosso l’importo richiesto per la ricevuta dettagliata (in precedenza "${oldValue}")`, + `ha modificato l’importo richiesto per la ricevuta con voci a "${newValue}" (in precedenza "${oldValue}")`, + removedItemizedReceiptRequiredAmount: (oldValue: string) => `ha rimosso l’importo richiesto per la ricevuta dettagliata (precedentemente "${oldValue}")`, setMaxExpenseAmount: (newValue: string) => `imposta l’importo massimo della spesa su "${newValue}"`, changedMaxExpenseAmount: (oldValue: string, newValue: string) => `ha modificato l'importo massimo della spesa a "${newValue}" (precedentemente "${oldValue}")`, removedMaxExpenseAmount: (oldValue: string) => `importo massimo spesa rimosso (precedentemente "${oldValue}")`, diff --git a/src/languages/ja.ts b/src/languages/ja.ts index ea0a0ef334f9..b292a2df9d8a 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -7180,8 +7180,8 @@ ${reportName} changedReceiptRequiredAmount: (oldValue: string, newValue: string) => `領収書必須金額を「${newValue}」(以前は「${oldValue}」)に変更しました`, removedReceiptRequiredAmount: (oldValue: string) => `必須領収書金額を削除しました(以前の値:「${oldValue}」)`, setItemizedReceiptRequiredAmount: (newValue: string) => `明細付き領収書の必須金額を「${newValue}」に設定しました`, - changedItemizedReceiptRequiredAmount: (oldValue: string, newValue: string) => `明細付き領収書の必須金額を「${newValue}」に変更しました(以前は「${oldValue}」)`, - removedItemizedReceiptRequiredAmount: (oldValue: string) => `明細付き領収書の必須金額を削除しました(以前の値:「${oldValue}」)`, + changedItemizedReceiptRequiredAmount: (oldValue: string, newValue: string) => `品目別レシートの必須金額を「${newValue}」(以前は「${oldValue}」)に変更しました`, + removedItemizedReceiptRequiredAmount: (oldValue: string) => `品目別レシートの必須金額を削除しました(以前の値:「${oldValue}」)`, setMaxExpenseAmount: (newValue: string) => `最大経費金額を「${newValue}」に設定`, changedMaxExpenseAmount: (oldValue: string, newValue: string) => `上限経費額を「${newValue}」に変更しました(以前は「${oldValue}」)`, removedMaxExpenseAmount: (oldValue: string) => `最大経費金額を削除しました(以前の値: 「${oldValue}」)`, diff --git a/src/languages/nl.ts b/src/languages/nl.ts index c7a428293372..63cb4f3d0c2a 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -7244,9 +7244,9 @@ Voeg meer bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`, setReceiptRequiredAmount: (newValue: string) => `stel het vereiste bonbedrag in op "${newValue}"`, changedReceiptRequiredAmount: (oldValue: string, newValue: string) => `heeft het vereiste bonbedrag gewijzigd naar "${newValue}" (voorheen "${oldValue}")`, removedReceiptRequiredAmount: (oldValue: string) => `vereiste bedrag op verwijderde bon (voorheen “${oldValue}”)`, - setItemizedReceiptRequiredAmount: (newValue: string) => `vereist bedrag voor gespecificeerde bon ingesteld op "${newValue}"`, + setItemizedReceiptRequiredAmount: (newValue: string) => `stel het vereiste bedrag voor de gespecificeerde bon in op "${newValue}"`, changedItemizedReceiptRequiredAmount: (oldValue: string, newValue: string) => - `heeft het vereiste bedrag voor gespecificeerde bon gewijzigd naar "${newValue}" (voorheen "${oldValue}")`, + `heeft het vereiste bedrag voor gespecificeerde bonnen gewijzigd naar "${newValue}" (voorheen "${oldValue}")`, removedItemizedReceiptRequiredAmount: (oldValue: string) => `vereist bedrag voor gespecificeerde bon verwijderd (voorheen "${oldValue}")`, setMaxExpenseAmount: (newValue: string) => `maximumbedrag voor uitgave instellen op "${newValue}"`, changedMaxExpenseAmount: (oldValue: string, newValue: string) => `maximale onkostensom gewijzigd naar "${newValue}" (voorheen "${oldValue}")`, diff --git a/src/languages/pl.ts b/src/languages/pl.ts index 735ec0751961..4552b081074f 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -7233,9 +7233,9 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, setReceiptRequiredAmount: (newValue: string) => `ustaw wymaganą kwotę paragonu na „${newValue}”`, changedReceiptRequiredAmount: (oldValue: string, newValue: string) => `zmienił(a) wymaganą kwotę paragonu na „${newValue}” (wcześniej „${oldValue}”)`, removedReceiptRequiredAmount: (oldValue: string) => `usunięto wymagany limit paragonu (wcześniej „${oldValue}”)`, - setItemizedReceiptRequiredAmount: (newValue: string) => `ustawiono wymaganą kwotę szczegółowego paragonu na „${newValue}”`, - changedItemizedReceiptRequiredAmount: (oldValue: string, newValue: string) => `zmieniono wymaganą kwotę szczegółowego paragonu na „${newValue}” (wcześniej „${oldValue}”)`, - removedItemizedReceiptRequiredAmount: (oldValue: string) => `usunięto wymaganą kwotę szczegółowego paragonu (wcześniej „${oldValue}”)`, + setItemizedReceiptRequiredAmount: (newValue: string) => `ustaw wymaganą kwotę z wyszczególnionego paragonu na „${newValue}”`, + changedItemizedReceiptRequiredAmount: (oldValue: string, newValue: string) => `zmienił wymaganą kwotę za zindeksowany paragon na „${newValue}” (wcześniej „${oldValue}”)`, + removedItemizedReceiptRequiredAmount: (oldValue: string) => `usunięto wymaganą kwotę z rozbitego paragonu (wcześniej „${oldValue}”)`, setMaxExpenseAmount: (newValue: string) => `ustaw maksymalną kwotę wydatku na „${newValue}”`, changedMaxExpenseAmount: (oldValue: string, newValue: string) => `zmieniono maksymalną kwotę wydatku na „${newValue}” (wcześniej „${oldValue}”)`, removedMaxExpenseAmount: (oldValue: string) => `usunięto maksymalną kwotę wydatku (wcześniej „${oldValue}”)`, diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index 3cc9af5e4e4f..cef7ae7dd450 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -7236,9 +7236,9 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, setReceiptRequiredAmount: (newValue: string) => `definir valor exigido do recibo como "${newValue}"`, changedReceiptRequiredAmount: (oldValue: string, newValue: string) => `alterou o valor obrigatório do recibo para "${newValue}" (antes "${oldValue}")`, removedReceiptRequiredAmount: (oldValue: string) => `removeu o valor obrigatório do recibo (antes era "${oldValue}")`, - setItemizedReceiptRequiredAmount: (newValue: string) => `definiu o valor obrigatório do recibo detalhado como "${newValue}"`, + setItemizedReceiptRequiredAmount: (newValue: string) => `definir o valor obrigatório do recibo detalhado como "${newValue}"`, changedItemizedReceiptRequiredAmount: (oldValue: string, newValue: string) => `alterou o valor obrigatório do recibo detalhado para "${newValue}" (antes "${oldValue}")`, - removedItemizedReceiptRequiredAmount: (oldValue: string) => `removeu o valor obrigatório do recibo detalhado (antes era "${oldValue}")`, + removedItemizedReceiptRequiredAmount: (oldValue: string) => `removeu o valor exigido de recibo detalhado (antes era "${oldValue}")`, setMaxExpenseAmount: (newValue: string) => `definir valor máximo da despesa como "${newValue}"`, changedMaxExpenseAmount: (oldValue: string, newValue: string) => `alterou o valor máximo da despesa para "${newValue}" (antes "${oldValue}")`, removedMaxExpenseAmount: (oldValue: string) => `removeu o valor máximo de despesa (anteriormente "${oldValue}")`, diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index e1b3632f9fe3..d3c765eca116 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -7045,9 +7045,9 @@ ${reportName} setReceiptRequiredAmount: (newValue: string) => `将需要收据的金额设置为“${newValue}”`, changedReceiptRequiredAmount: (oldValue: string, newValue: string) => `已将所需收据金额更改为“${newValue}”(之前为“${oldValue}”)`, removedReceiptRequiredAmount: (oldValue: string) => `已移除所需收据金额(先前为“${oldValue}”)`, - setItemizedReceiptRequiredAmount: (newValue: string) => `将逐项收据所需金额设置为”${newValue}”`, - changedItemizedReceiptRequiredAmount: (oldValue: string, newValue: string) => `已将逐项收据所需金额更改为”${newValue}”(之前为”${oldValue}”)`, - removedItemizedReceiptRequiredAmount: (oldValue: string) => `已移除逐项收据所需金额(先前为”${oldValue}”)`, + setItemizedReceiptRequiredAmount: (newValue: string) => `将分项收据所需金额设置为”${newValue}”`, + changedItemizedReceiptRequiredAmount: (oldValue: string, newValue: string) => `将逐项列示收据的必填金额更改为 “${newValue}”(之前为 “${oldValue}”)`, + removedItemizedReceiptRequiredAmount: (oldValue: string) => `已移除按项目明细收据所需金额(先前为”${oldValue}”)`, setMaxExpenseAmount: (newValue: string) => `将最高报销金额设置为”${newValue}”`, changedMaxExpenseAmount: (oldValue: string, newValue: string) => `将最高报销金额更改为 “${newValue}”(之前为 “${oldValue}”)`, removedMaxExpenseAmount: (oldValue: string) => `已移除最⾼报销金额(原为“${oldValue}”)`, diff --git a/tests/unit/ReportActionsUtilsTest.ts b/tests/unit/ReportActionsUtilsTest.ts index 148ad091b59d..904ab473b623 100644 --- a/tests/unit/ReportActionsUtilsTest.ts +++ b/tests/unit/ReportActionsUtilsTest.ts @@ -29,6 +29,7 @@ import { getOriginalMessage, getPolicyChangeLogMaxExpenseAgeMessage, getPolicyChangeLogMaxExpenseAmountMessage, + getPolicyChangeLogMaxExpenseAmountNoItemizedReceiptMessage, getPolicyChangeLogMaxExpenseAmountNoReceiptMessage, getRemovedCardFeedMessage, getRenamedCardFeedMessage, @@ -3303,6 +3304,53 @@ describe('ReportActionsUtils', () => { }); }); + describe('getPolicyChangeLogMaxExpenseAmountNoItemizedReceiptMessage', () => { + it('should return set message when setting from disabled to a value', () => { + const action = { + actionName: CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AMOUNT_NO_ITEMIZED_RECEIPT, + reportActionID: '1', + created: '', + originalMessage: { + oldMaxExpenseAmountNoItemizedReceipt: CONST.DISABLED_MAX_EXPENSE_VALUE, + newMaxExpenseAmountNoItemizedReceipt: 2500, + currency: 'USD', + }, + } as ReportAction; + const result = getPolicyChangeLogMaxExpenseAmountNoItemizedReceiptMessage(translateLocal, action); + expect(result).toBe('set itemized receipt required amount to "$25.00"'); + }); + + it('should return removed message when setting to disabled', () => { + const action = { + actionName: CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AMOUNT_NO_ITEMIZED_RECEIPT, + reportActionID: '1', + created: '', + originalMessage: { + oldMaxExpenseAmountNoItemizedReceipt: 2500, + newMaxExpenseAmountNoItemizedReceipt: CONST.DISABLED_MAX_EXPENSE_VALUE, + currency: 'USD', + }, + } as ReportAction; + const result = getPolicyChangeLogMaxExpenseAmountNoItemizedReceiptMessage(translateLocal, action); + expect(result).toBe('removed itemized receipt required amount (previously "$25.00")'); + }); + + it('should return changed message when changing from one value to another', () => { + const action = { + actionName: CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MAX_EXPENSE_AMOUNT_NO_ITEMIZED_RECEIPT, + reportActionID: '1', + created: '', + originalMessage: { + oldMaxExpenseAmountNoItemizedReceipt: 2500, + newMaxExpenseAmountNoItemizedReceipt: 7500, + currency: 'USD', + }, + } as ReportAction; + const result = getPolicyChangeLogMaxExpenseAmountNoItemizedReceiptMessage(translateLocal, action); + expect(result).toBe('changed itemized receipt required amount to "$75.00" (previously "$25.00")'); + }); + }); + describe('getAddedCardFeedMessage', () => { it('should return translated message when feedName is present', () => { const action = {