From dd50aaa15623ddb28574bff29e7cf1d29cacb4cc Mon Sep 17 00:00:00 2001 From: "ahmedGaber93 (via MelvinBot)" Date: Tue, 10 Mar 2026 00:40:22 +0000 Subject: [PATCH 1/9] Fix: Compute amount for manual distance expenses created via QAB When creating a manual distance expense via QAB (Quick Action Button), the skip-confirmation path hardcoded amount: 0 for both trackExpense and createDistanceRequest. For map-based distance, the backend recalculates from validWaypoints, but manual distance has no waypoints. This meant the expense displayed $0.00, especially noticeable offline. This computes the amount from distance and mileage rate before passing it to trackExpense/createDistanceRequest, using the same DistanceRequestUtils functions used elsewhere in the codebase. Fixed https://github.com/Expensify/App/issues/82801 Co-authored-by: ahmedGaber93 --- src/libs/actions/IOU/MoneyRequest.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/libs/actions/IOU/MoneyRequest.ts b/src/libs/actions/IOU/MoneyRequest.ts index ddd99765f1ec4..f7113009cafdb 100644 --- a/src/libs/actions/IOU/MoneyRequest.ts +++ b/src/libs/actions/IOU/MoneyRequest.ts @@ -634,6 +634,16 @@ function handleMoneyRequestStepDistanceNavigation({ const validWaypoints = !isManualDistance && !isOdometerDistance ? getValidWaypoints(waypoints, true, isGPSDistance) : undefined; + let amount = 0; + if (isManualDistance && distance !== undefined && unit) { + const distanceInMeters = DistanceRequestUtils.convertToDistanceInMeters(distance, unit); + const mileageRates = DistanceRequestUtils.getMileageRates(policy); + const defaultMileageRate = DistanceRequestUtils.getDefaultMileageRate(policy); + // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing + const mileageRate = (customUnitRateID && mileageRates?.[customUnitRateID]) || defaultMileageRate; + amount = DistanceRequestUtils.getDistanceRequestAmount(distanceInMeters, unit, mileageRate?.rate ?? 0); + } + if (isCreatingTrackExpense && participant) { trackExpense({ report, @@ -647,7 +657,7 @@ function handleMoneyRequestStepDistanceNavigation({ policy, }, transactionParams: { - amount: 0, + amount, distance, currency: transaction?.currency ?? 'USD', created: transaction?.created ?? '', @@ -682,7 +692,7 @@ function handleMoneyRequestStepDistanceNavigation({ iouType, existingTransaction: transaction, transactionParams: { - amount: 0, + amount, distance, comment: '', created: transaction?.created ?? '', From 7099eafa745f7de747b2ab1ca6f6c185365391ab Mon Sep 17 00:00:00 2001 From: "ahmedGaber93 (via MelvinBot)" Date: Tue, 10 Mar 2026 12:27:13 +0000 Subject: [PATCH 2/9] Fix: use getRate() for P2P manual distance amount calculation getMileageRates(policy) returns {} for P2P expenses (no workspace policy), causing amount to always be 0. Use DistanceRequestUtils.getRate() which correctly handles P2P via getRateForP2P() with CURRENCY_TO_DEFAULT_MILEAGE_RATE. Co-authored-by: ahmedGaber93 --- src/libs/actions/IOU/MoneyRequest.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/libs/actions/IOU/MoneyRequest.ts b/src/libs/actions/IOU/MoneyRequest.ts index f7113009cafdb..7f0fb011a6d28 100644 --- a/src/libs/actions/IOU/MoneyRequest.ts +++ b/src/libs/actions/IOU/MoneyRequest.ts @@ -637,10 +637,7 @@ function handleMoneyRequestStepDistanceNavigation({ let amount = 0; if (isManualDistance && distance !== undefined && unit) { const distanceInMeters = DistanceRequestUtils.convertToDistanceInMeters(distance, unit); - const mileageRates = DistanceRequestUtils.getMileageRates(policy); - const defaultMileageRate = DistanceRequestUtils.getDefaultMileageRate(policy); - // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing - const mileageRate = (customUnitRateID && mileageRates?.[customUnitRateID]) || defaultMileageRate; + const mileageRate = DistanceRequestUtils.getRate({transaction, policy}); amount = DistanceRequestUtils.getDistanceRequestAmount(distanceInMeters, unit, mileageRate?.rate ?? 0); } From d5f0295b7a5473eecf45deb0a2ad75efa3691989 Mon Sep 17 00:00:00 2001 From: "ahmedGaber93 (via MelvinBot)" Date: Thu, 12 Mar 2026 02:33:57 +0000 Subject: [PATCH 3/9] Fix: compute merchant string for manual distance skip-confirmation path Instead of hardcoding merchant to 'Pending...' when skip-confirmation is used for manual distance, compute the actual merchant string (e.g., '20 mi @ $0.67 / mi') using DistanceRequestUtils.getDistanceMerchant(). This matches the behavior of the normal confirmation flow in MoneyRequestConfirmationList. Co-authored-by: ahmedGaber93 --- src/libs/actions/IOU/MoneyRequest.ts | 22 ++++++++++++++++--- .../step/IOURequestStepDistanceManual.tsx | 8 ++++++- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/libs/actions/IOU/MoneyRequest.ts b/src/libs/actions/IOU/MoneyRequest.ts index 7f0fb011a6d28..a70ce9e6a6304 100644 --- a/src/libs/actions/IOU/MoneyRequest.ts +++ b/src/libs/actions/IOU/MoneyRequest.ts @@ -153,6 +153,8 @@ type MoneyRequestStepDistanceNavigationParams = { lastSelectedDistanceRates?: OnyxEntry; setDistanceRequestData?: (participants: Participant[]) => void; translate: (path: TPath, ...parameters: TranslationParameters) => string; + toLocaleDigit: (digit: string) => string; + getCurrencySymbol: (currencyCode: string) => string | undefined; quickAction: OnyxEntry; policyRecentlyUsedCurrencies?: string[]; introSelected?: IntroSelected; @@ -571,6 +573,8 @@ function handleMoneyRequestStepDistanceNavigation({ lastSelectedDistanceRates, setDistanceRequestData, translate, + toLocaleDigit, + getCurrencySymbol, quickAction, policyRecentlyUsedCurrencies, introSelected, @@ -620,7 +624,6 @@ function handleMoneyRequestStepDistanceNavigation({ cancelSpan(CONST.TELEMETRY.SPAN_CONFIRMATION_LIST_READY); cancelSpan(CONST.TELEMETRY.SPAN_CONFIRMATION_RECEIPT_LOAD); setMoneyRequestPendingFields(transactionID, {waypoints: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD}); - setMoneyRequestMerchant(transactionID, translate('iou.fieldPending'), false); const isCreatingTrackExpense = iouType === CONST.IOU.TYPE.TRACK; const participant = participants.at(0); const isPolicyExpenseChat = !!participant?.isPolicyExpenseChat; @@ -635,11 +638,24 @@ function handleMoneyRequestStepDistanceNavigation({ const validWaypoints = !isManualDistance && !isOdometerDistance ? getValidWaypoints(waypoints, true, isGPSDistance) : undefined; let amount = 0; + let merchant = translate('iou.fieldPending'); if (isManualDistance && distance !== undefined && unit) { const distanceInMeters = DistanceRequestUtils.convertToDistanceInMeters(distance, unit); const mileageRate = DistanceRequestUtils.getRate({transaction, policy}); amount = DistanceRequestUtils.getDistanceRequestAmount(distanceInMeters, unit, mileageRate?.rate ?? 0); + merchant = DistanceRequestUtils.getDistanceMerchant( + true, + distanceInMeters, + unit, + mileageRate?.rate ?? 0, + mileageRate?.currency ?? transaction?.currency ?? 'USD', + translate, + toLocaleDigit, + getCurrencySymbol, + true, + ); } + setMoneyRequestMerchant(transactionID, merchant, false); if (isCreatingTrackExpense && participant) { trackExpense({ @@ -658,7 +674,7 @@ function handleMoneyRequestStepDistanceNavigation({ distance, currency: transaction?.currency ?? 'USD', created: transaction?.created ?? '', - merchant: translate('iou.fieldPending'), + merchant, receipt: {}, billable: false, reimbursable: defaultReimbursable, @@ -694,7 +710,7 @@ function handleMoneyRequestStepDistanceNavigation({ comment: '', created: transaction?.created ?? '', currency: transaction?.currency ?? 'USD', - merchant: translate('iou.fieldPending'), + merchant, billable: !!policy?.defaultBillable, reimbursable: defaultReimbursable, validWaypoints, diff --git a/src/pages/iou/request/step/IOURequestStepDistanceManual.tsx b/src/pages/iou/request/step/IOURequestStepDistanceManual.tsx index 43c261a455bf0..2aa12303b0049 100644 --- a/src/pages/iou/request/step/IOURequestStepDistanceManual.tsx +++ b/src/pages/iou/request/step/IOURequestStepDistanceManual.tsx @@ -9,6 +9,7 @@ import type {NumberWithSymbolFormRef} from '@components/NumberWithSymbolForm'; import type {BaseTextInputRef} from '@components/TextInput/BaseTextInput/types'; import withCurrentUserPersonalDetails from '@components/withCurrentUserPersonalDetails'; import type {WithCurrentUserPersonalDetailsProps} from '@components/withCurrentUserPersonalDetails'; +import {useCurrencyListActions} from '@hooks/useCurrencyList'; import useDefaultExpensePolicy from '@hooks/useDefaultExpensePolicy'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; @@ -57,9 +58,10 @@ function IOURequestStepDistanceManual({ transaction, currentUserPersonalDetails, }: IOURequestStepDistanceManualProps) { - const {translate} = useLocalize(); + const {translate, toLocaleDigit} = useLocalize(); const styles = useThemeStyles(); const {isBetaEnabled} = usePermissions(); + const {getCurrencySymbol} = useCurrencyListActions(); const {isExtraSmallScreenHeight} = useResponsiveLayout(); const textInput = useRef(null); @@ -227,6 +229,8 @@ function IOURequestStepDistanceManual({ transactionViolations, lastSelectedDistanceRates, translate, + toLocaleDigit, + getCurrencySymbol, quickAction, policyRecentlyUsedCurrencies, introSelected, @@ -265,6 +269,8 @@ function IOURequestStepDistanceManual({ transactionViolations, lastSelectedDistanceRates, translate, + toLocaleDigit, + getCurrencySymbol, quickAction, policyRecentlyUsedCurrencies, introSelected, From 6b496a0b07fadf407edd9d4bfa45a7f68bff787c Mon Sep 17 00:00:00 2001 From: "ahmedGaber93 (via MelvinBot)" Date: Thu, 12 Mar 2026 02:38:42 +0000 Subject: [PATCH 4/9] Fix: make toLocaleDigit and getCurrencySymbol optional in MoneyRequestStepDistanceNavigationParams These properties are only needed for the manual distance path. Making them optional fixes typecheck errors in callers that don't deal with manual distance (GPS, Map, Odometer, and tests). Co-authored-by: ahmedGaber93 --- src/libs/actions/IOU/MoneyRequest.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/libs/actions/IOU/MoneyRequest.ts b/src/libs/actions/IOU/MoneyRequest.ts index a70ce9e6a6304..0fd284c1038d9 100644 --- a/src/libs/actions/IOU/MoneyRequest.ts +++ b/src/libs/actions/IOU/MoneyRequest.ts @@ -153,8 +153,8 @@ type MoneyRequestStepDistanceNavigationParams = { lastSelectedDistanceRates?: OnyxEntry; setDistanceRequestData?: (participants: Participant[]) => void; translate: (path: TPath, ...parameters: TranslationParameters) => string; - toLocaleDigit: (digit: string) => string; - getCurrencySymbol: (currencyCode: string) => string | undefined; + toLocaleDigit?: (digit: string) => string; + getCurrencySymbol?: (currencyCode: string) => string | undefined; quickAction: OnyxEntry; policyRecentlyUsedCurrencies?: string[]; introSelected?: IntroSelected; @@ -639,7 +639,7 @@ function handleMoneyRequestStepDistanceNavigation({ let amount = 0; let merchant = translate('iou.fieldPending'); - if (isManualDistance && distance !== undefined && unit) { + if (isManualDistance && distance !== undefined && unit && toLocaleDigit && getCurrencySymbol) { const distanceInMeters = DistanceRequestUtils.convertToDistanceInMeters(distance, unit); const mileageRate = DistanceRequestUtils.getRate({transaction, policy}); amount = DistanceRequestUtils.getDistanceRequestAmount(distanceInMeters, unit, mileageRate?.rate ?? 0); From 3ab015e2a93368aeeed1f72001d54ee47c8909fe Mon Sep 17 00:00:00 2001 From: "ahmedGaber93 (via MelvinBot)" Date: Thu, 12 Mar 2026 04:29:52 +0000 Subject: [PATCH 5/9] Fix: initialize toLocaleDigit and getCurrencySymbol locally Instead of passing toLocaleDigit and getCurrencySymbol down from MoneyRequestStepDistanceNavigationParams, initialize them locally inside handleMoneyRequestStepDistanceNavigation using the same pattern as TransactionUtils (importing from LocaleDigitUtils, CurrencyUtils, and IntlStore). Co-authored-by: ahmedGaber93 --- src/libs/actions/IOU/MoneyRequest.ts | 11 +++++------ .../iou/request/step/IOURequestStepDistanceManual.tsx | 8 +------- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/src/libs/actions/IOU/MoneyRequest.ts b/src/libs/actions/IOU/MoneyRequest.ts index 0fd284c1038d9..446f6a185461e 100644 --- a/src/libs/actions/IOU/MoneyRequest.ts +++ b/src/libs/actions/IOU/MoneyRequest.ts @@ -1,6 +1,8 @@ import type {OnyxCollection, OnyxEntry} from 'react-native-onyx'; +import {getCurrencySymbol} from '@libs/CurrencyUtils'; import DistanceRequestUtils from '@libs/DistanceRequestUtils'; import getCurrentPosition from '@libs/getCurrentPosition'; +import {toLocaleDigit} from '@libs/LocaleDigitUtils'; import {calculateDefaultReimbursable, getExistingTransactionID, navigateToConfirmationPage, navigateToParticipantPage} from '@libs/IOUUtils'; import Log from '@libs/Log'; import Navigation from '@libs/Navigation/Navigation'; @@ -15,6 +17,7 @@ import type {ReceiptFile} from '@pages/iou/request/step/IOURequestStepScan/types import {setTransactionReport} from '@userActions/Transaction'; import type {IOUType} from '@src/CONST'; import CONST from '@src/CONST'; +import IntlStore from '@src/languages/IntlStore'; import type {TranslationParameters, TranslationPaths} from '@src/languages/types'; import ONYXKEYS from '@src/ONYXKEYS'; import type {Route} from '@src/ROUTES'; @@ -153,8 +156,6 @@ type MoneyRequestStepDistanceNavigationParams = { lastSelectedDistanceRates?: OnyxEntry; setDistanceRequestData?: (participants: Participant[]) => void; translate: (path: TPath, ...parameters: TranslationParameters) => string; - toLocaleDigit?: (digit: string) => string; - getCurrencySymbol?: (currencyCode: string) => string | undefined; quickAction: OnyxEntry; policyRecentlyUsedCurrencies?: string[]; introSelected?: IntroSelected; @@ -573,8 +574,6 @@ function handleMoneyRequestStepDistanceNavigation({ lastSelectedDistanceRates, setDistanceRequestData, translate, - toLocaleDigit, - getCurrencySymbol, quickAction, policyRecentlyUsedCurrencies, introSelected, @@ -639,7 +638,7 @@ function handleMoneyRequestStepDistanceNavigation({ let amount = 0; let merchant = translate('iou.fieldPending'); - if (isManualDistance && distance !== undefined && unit && toLocaleDigit && getCurrencySymbol) { + if (isManualDistance && distance !== undefined && unit) { const distanceInMeters = DistanceRequestUtils.convertToDistanceInMeters(distance, unit); const mileageRate = DistanceRequestUtils.getRate({transaction, policy}); amount = DistanceRequestUtils.getDistanceRequestAmount(distanceInMeters, unit, mileageRate?.rate ?? 0); @@ -650,7 +649,7 @@ function handleMoneyRequestStepDistanceNavigation({ mileageRate?.rate ?? 0, mileageRate?.currency ?? transaction?.currency ?? 'USD', translate, - toLocaleDigit, + (digit) => toLocaleDigit(IntlStore.getCurrentLocale(), digit), getCurrencySymbol, true, ); diff --git a/src/pages/iou/request/step/IOURequestStepDistanceManual.tsx b/src/pages/iou/request/step/IOURequestStepDistanceManual.tsx index 2aa12303b0049..43c261a455bf0 100644 --- a/src/pages/iou/request/step/IOURequestStepDistanceManual.tsx +++ b/src/pages/iou/request/step/IOURequestStepDistanceManual.tsx @@ -9,7 +9,6 @@ import type {NumberWithSymbolFormRef} from '@components/NumberWithSymbolForm'; import type {BaseTextInputRef} from '@components/TextInput/BaseTextInput/types'; import withCurrentUserPersonalDetails from '@components/withCurrentUserPersonalDetails'; import type {WithCurrentUserPersonalDetailsProps} from '@components/withCurrentUserPersonalDetails'; -import {useCurrencyListActions} from '@hooks/useCurrencyList'; import useDefaultExpensePolicy from '@hooks/useDefaultExpensePolicy'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; @@ -58,10 +57,9 @@ function IOURequestStepDistanceManual({ transaction, currentUserPersonalDetails, }: IOURequestStepDistanceManualProps) { - const {translate, toLocaleDigit} = useLocalize(); + const {translate} = useLocalize(); const styles = useThemeStyles(); const {isBetaEnabled} = usePermissions(); - const {getCurrencySymbol} = useCurrencyListActions(); const {isExtraSmallScreenHeight} = useResponsiveLayout(); const textInput = useRef(null); @@ -229,8 +227,6 @@ function IOURequestStepDistanceManual({ transactionViolations, lastSelectedDistanceRates, translate, - toLocaleDigit, - getCurrencySymbol, quickAction, policyRecentlyUsedCurrencies, introSelected, @@ -269,8 +265,6 @@ function IOURequestStepDistanceManual({ transactionViolations, lastSelectedDistanceRates, translate, - toLocaleDigit, - getCurrencySymbol, quickAction, policyRecentlyUsedCurrencies, introSelected, From e81786b1b4670b451a5aaa440869d7db4b4eb3e1 Mon Sep 17 00:00:00 2001 From: "ahmedGaber93 (via MelvinBot)" Date: Thu, 12 Mar 2026 04:33:41 +0000 Subject: [PATCH 6/9] Remove redundant setMoneyRequestMerchant call merchant is already passed via transactionParams to trackExpense and createDistanceRequest, which build optimistic data with it. The separate Onyx merge from setMoneyRequestMerchant is immediately overwritten. Co-authored-by: ahmedGaber93 --- src/libs/actions/IOU/MoneyRequest.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/libs/actions/IOU/MoneyRequest.ts b/src/libs/actions/IOU/MoneyRequest.ts index 446f6a185461e..f49f09cede9c5 100644 --- a/src/libs/actions/IOU/MoneyRequest.ts +++ b/src/libs/actions/IOU/MoneyRequest.ts @@ -47,7 +47,6 @@ import { requestMoney, setCustomUnitRateID, setMoneyRequestDistance, - setMoneyRequestMerchant, setMoneyRequestParticipants, setMoneyRequestParticipantsFromReport, setMoneyRequestPendingFields, @@ -654,8 +653,6 @@ function handleMoneyRequestStepDistanceNavigation({ true, ); } - setMoneyRequestMerchant(transactionID, merchant, false); - if (isCreatingTrackExpense && participant) { trackExpense({ report, From 91c4920d35fc011bed1dc960522e4501c88727c8 Mon Sep 17 00:00:00 2001 From: "ahmedGaber93 (via MelvinBot)" Date: Thu, 12 Mar 2026 04:34:58 +0000 Subject: [PATCH 7/9] Fix: correct import ordering for Prettier compliance Co-authored-by: ahmedGaber93 --- src/libs/actions/IOU/MoneyRequest.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/actions/IOU/MoneyRequest.ts b/src/libs/actions/IOU/MoneyRequest.ts index 446f6a185461e..62a37c9b47697 100644 --- a/src/libs/actions/IOU/MoneyRequest.ts +++ b/src/libs/actions/IOU/MoneyRequest.ts @@ -2,8 +2,8 @@ import type {OnyxCollection, OnyxEntry} from 'react-native-onyx'; import {getCurrencySymbol} from '@libs/CurrencyUtils'; import DistanceRequestUtils from '@libs/DistanceRequestUtils'; import getCurrentPosition from '@libs/getCurrentPosition'; -import {toLocaleDigit} from '@libs/LocaleDigitUtils'; import {calculateDefaultReimbursable, getExistingTransactionID, navigateToConfirmationPage, navigateToParticipantPage} from '@libs/IOUUtils'; +import {toLocaleDigit} from '@libs/LocaleDigitUtils'; import Log from '@libs/Log'; import Navigation from '@libs/Navigation/Navigation'; import {roundToTwoDecimalPlaces} from '@libs/NumberUtils'; From 5e274a879a658d55f04d295349607716b003707e Mon Sep 17 00:00:00 2001 From: "ahmedGaber93 (via MelvinBot)" Date: Thu, 12 Mar 2026 04:47:14 +0000 Subject: [PATCH 8/9] Fix: restore setMoneyRequestMerchant call to update Onyx transaction MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The previous commit removed the setMoneyRequestMerchant call which updated the transaction's merchant field in Onyx. This caused the existing test to fail because the Onyx transaction no longer had the merchant set. The merchant is now set after computing it — either 'Pending...' for map-based distance, or the calculated merchant string for manual distance. Co-authored-by: ahmedGaber93 --- src/libs/actions/IOU/MoneyRequest.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/libs/actions/IOU/MoneyRequest.ts b/src/libs/actions/IOU/MoneyRequest.ts index 781414a238583..5836bb5b1e8c5 100644 --- a/src/libs/actions/IOU/MoneyRequest.ts +++ b/src/libs/actions/IOU/MoneyRequest.ts @@ -47,6 +47,7 @@ import { requestMoney, setCustomUnitRateID, setMoneyRequestDistance, + setMoneyRequestMerchant, setMoneyRequestParticipants, setMoneyRequestParticipantsFromReport, setMoneyRequestPendingFields, @@ -653,6 +654,7 @@ function handleMoneyRequestStepDistanceNavigation({ true, ); } + setMoneyRequestMerchant(transactionID, merchant, false); if (isCreatingTrackExpense && participant) { trackExpense({ report, From 78fe023ba5d976d2d05f89a2dc20c4be85a4450d Mon Sep 17 00:00:00 2001 From: "Francois Laithier (via MelvinBot)" Date: Thu, 12 Mar 2026 05:49:23 +0000 Subject: [PATCH 9/9] Use CONST.CURRENCY.USD instead of string literal Co-authored-by: Francois Laithier --- src/libs/actions/IOU/MoneyRequest.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/actions/IOU/MoneyRequest.ts b/src/libs/actions/IOU/MoneyRequest.ts index 5836bb5b1e8c5..ffe52e172b4ab 100644 --- a/src/libs/actions/IOU/MoneyRequest.ts +++ b/src/libs/actions/IOU/MoneyRequest.ts @@ -647,7 +647,7 @@ function handleMoneyRequestStepDistanceNavigation({ distanceInMeters, unit, mileageRate?.rate ?? 0, - mileageRate?.currency ?? transaction?.currency ?? 'USD', + mileageRate?.currency ?? transaction?.currency ?? CONST.CURRENCY.USD, translate, (digit) => toLocaleDigit(IntlStore.getCurrentLocale(), digit), getCurrencySymbol,