diff --git a/src/components/MoneyRequestConfirmationList.tsx b/src/components/MoneyRequestConfirmationList.tsx index be87be64d6388..23a38e3359e54 100755 --- a/src/components/MoneyRequestConfirmationList.tsx +++ b/src/components/MoneyRequestConfirmationList.tsx @@ -22,7 +22,6 @@ import { setCustomUnitRateID, setMoneyRequestAmount, setMoneyRequestCategory, - setMoneyRequestDistance, setMoneyRequestMerchant, setMoneyRequestPendingFields, setMoneyRequestTag, @@ -34,7 +33,6 @@ import {getIsMissingAttendeesViolation} from '@libs/AttendeeUtils'; import {isCategoryDescriptionRequired} from '@libs/CategoryUtils'; import {convertToBackendAmount, convertToDisplayString, convertToDisplayStringWithoutCurrency} from '@libs/CurrencyUtils'; import DistanceRequestUtils from '@libs/DistanceRequestUtils'; -import {calculateGPSDistance} from '@libs/GPSDraftDetailsUtils'; import {calculateAmount, insertTagIntoTransactionTagsString, isMovingTransactionFromTrackExpense as isMovingTransactionFromTrackExpenseUtil} from '@libs/IOUUtils'; import Log from '@libs/Log'; import {validateAmount} from '@libs/MoneyRequestUtils'; @@ -338,21 +336,6 @@ function MoneyRequestConfirmationList({ const defaultRate = defaultMileageRate?.customUnitRateID; const lastSelectedRate = policy?.id ? (lastSelectedDistanceRates?.[policy.id] ?? defaultRate) : defaultRate; - useEffect(() => { - if ( - !['-1', CONST.CUSTOM_UNITS.FAKE_P2P_ID].includes(customUnitRateID) || - !isDistanceRequest || - !isPolicyExpenseChat || - !transactionID || - !lastSelectedRate || - isMovingTransactionFromTrackExpense - ) { - return; - } - - setCustomUnitRateID(transactionID, lastSelectedRate); - }, [customUnitRateID, transactionID, lastSelectedRate, isDistanceRequest, isPolicyExpenseChat, isMovingTransactionFromTrackExpense]); - const mileageRate = DistanceRequestUtils.getRate({transaction, policy, policyDraft}); const rate = mileageRate.rate; const prevRate = usePrevious(rate); @@ -398,19 +381,6 @@ function MoneyRequestConfirmationList({ const distanceRequestAmount = DistanceRequestUtils.getDistanceRequestAmount(distance, unit ?? CONST.CUSTOM_UNITS.DISTANCE_UNIT_MILES, rate ?? 0); - // Update GPS distance whenever the current distance unit differs from the one that was used - // to calculate the distance stored in transaction.comment.customUnit.quantity - const gpsDistance = transaction?.comment?.customUnit?.quantity; - const gpsDistanceWithCurrentDistanceUnit = calculateGPSDistance(distance, unit); - const shouldUpdateGpsDistance = isGPSDistanceRequest && gpsDistance !== gpsDistanceWithCurrentDistanceUnit; - useEffect(() => { - if (!shouldUpdateGpsDistance || !transactionID || isReadOnly) { - return; - } - - setMoneyRequestDistance(transactionID, gpsDistanceWithCurrentDistanceUnit, true); - }, [shouldUpdateGpsDistance, transactionID, isReadOnly, gpsDistanceWithCurrentDistanceUnit]); - let amountToBeUsed = iouAmount; if (shouldCalculateDistanceAmount) { @@ -517,7 +487,7 @@ function MoneyRequestConfirmationList({ // If there is a distance rate in the policy that matches the rate and unit of the currently selected mileage rate, select it automatically const matchingRate = Object.values(policyRates).find((policyRate) => policyRate.rate === mileageRate.rate && policyRate.unit === mileageRate.unit); if (matchingRate?.customUnitRateID) { - setCustomUnitRateID(transactionID, matchingRate.customUnitRateID); + setCustomUnitRateID(transactionID, matchingRate.customUnitRateID, transaction, policy); return; } @@ -534,6 +504,7 @@ function MoneyRequestConfirmationList({ isMovingTransactionFromTrackExpense, setFormError, clearFormErrors, + transaction, ]); const routeError = Object.values(transaction?.errorFields?.route ?? {}).at(0); @@ -700,6 +671,22 @@ function MoneyRequestConfirmationList({ const payeePersonalDetails = useMemo(() => payeePersonalDetailsProp ?? currentUserPersonalDetails, [payeePersonalDetailsProp, currentUserPersonalDetails]); const shouldShowReadOnlySplits = useMemo(() => isPolicyExpenseChat || isReadOnly || isScanRequest, [isPolicyExpenseChat, isReadOnly, isScanRequest]); + useEffect(() => { + if ( + !['-1', CONST.CUSTOM_UNITS.FAKE_P2P_ID].includes(customUnitRateID) || + !isDistanceRequest || + !isPolicyExpenseChat || + !transactionID || + !lastSelectedRate || + isMovingTransactionFromTrackExpense || + !selectedParticipants.some((participant) => participant.policyID === policy?.id) + ) { + return; + } + + setCustomUnitRateID(transactionID, lastSelectedRate, transaction, policy); + }, [customUnitRateID, transactionID, lastSelectedRate, isDistanceRequest, isPolicyExpenseChat, isMovingTransactionFromTrackExpense, transaction, policy, selectedParticipants]); + const splitParticipants = useMemo(() => { if (!isTypeSplit) { return []; diff --git a/src/libs/GPSDraftDetailsUtils.ts b/src/libs/GPSDraftDetailsUtils.ts index 89c95eae53ca8..ff82b47624704 100644 --- a/src/libs/GPSDraftDetailsUtils.ts +++ b/src/libs/GPSDraftDetailsUtils.ts @@ -62,7 +62,7 @@ function getGPSCoordinates(gpsDraftDetails: GpsDraftDetails | undefined): string } function calculateGPSDistance(distanceInMeters: number, unit: Unit): number { - return roundToTwoDecimalPlaces(DistanceRequestUtils.convertDistanceUnit(distanceInMeters, unit)); + return DistanceRequestUtils.convertDistanceUnit(distanceInMeters, unit); } function getGPSConvertedDistance(gpsDraftDetails: GpsDraftDetails | undefined, unit: Unit): number { diff --git a/src/libs/actions/IOU/MoneyRequest.ts b/src/libs/actions/IOU/MoneyRequest.ts index 3f354839775de..7d560d7d2c506 100644 --- a/src/libs/actions/IOU/MoneyRequest.ts +++ b/src/libs/actions/IOU/MoneyRequest.ts @@ -660,7 +660,10 @@ function handleMoneyRequestStepDistanceNavigation({ lastSelectedDistanceRates, }); setTransactionReport(transactionID, {reportID: transactionReportID}, true); - setCustomUnitRateID(transactionID, rateID); + // Do not pass transaction and policy so it only updates customUnitRateID without changing distance and distance unit + // as it is set for Manual requests before this function is called and transaction may have + // obsolete customUnit values + setCustomUnitRateID(transactionID, rateID, undefined, undefined); setMoneyRequestParticipantsFromReport(transactionID, targetReport, currentUserAccountID).then(() => { Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, iouTypeTrackOrSubmit, transactionID, targetReport?.reportID)); }); diff --git a/src/libs/actions/IOU/index.ts b/src/libs/actions/IOU/index.ts index 1e6048f440a59..6b55a54055960 100644 --- a/src/libs/actions/IOU/index.ts +++ b/src/libs/actions/IOU/index.ts @@ -67,6 +67,7 @@ import Navigation, {navigationRef} from '@libs/Navigation/Navigation'; import {isOffline} from '@libs/Network/NetworkStore'; // eslint-disable-next-line @typescript-eslint/no-deprecated import {buildNextStepNew, buildOptimisticNextStep} from '@libs/NextStepUtils'; +import {roundToTwoDecimalPlaces} from '@libs/NumberUtils'; import * as NumberUtils from '@libs/NumberUtils'; import {getManagerMcTestParticipant, getPersonalDetailsForAccountIDs} from '@libs/OptionsListUtils'; import Parser from '@libs/Parser'; @@ -251,6 +252,7 @@ import type {Accountant, Attendee, Participant, Split} from '@src/types/onyx/IOU import type {ErrorFields, Errors, PendingAction, PendingFields} from '@src/types/onyx/OnyxCommon'; import type {PaymentMethodType} from '@src/types/onyx/OriginalMessage'; import type {CurrentUserPersonalDetails} from '@src/types/onyx/PersonalDetails'; +import type {Unit} from '@src/types/onyx/Policy'; import type {QuickActionName} from '@src/types/onyx/QuickAction'; import type RecentlyUsedTags from '@src/types/onyx/RecentlyUsedTags'; import type {ReportNextStep} from '@src/types/onyx/Report'; @@ -1506,15 +1508,48 @@ function setMoneyRequestReceipt(transactionID: string, source: string, filename: } /** - * Set custom unit rateID for the transaction draft + * Set custom unit rateID for the transaction draft, also updates quantity and distanceUnit + * if passed transaction previously had it to make sure that transaction does not have inconsistent + * states (for example distanceUnit not matching distance unit of the new customUnitRateID) */ -function setCustomUnitRateID(transactionID: string, customUnitRateID: string | undefined) { +function setCustomUnitRateID(transactionID: string, customUnitRateID: string | undefined, transaction: OnyxEntry, policy: OnyxEntry) { const isFakeP2PRate = customUnitRateID === CONST.CUSTOM_UNITS.FAKE_P2P_ID; + + let newDistanceUnit: Unit | undefined; + let newQuantity: number | undefined; + + if (customUnitRateID && transaction) { + const distanceRate = isFakeP2PRate + ? DistanceRequestUtils.getRate({transaction, useTransactionDistanceUnit: false, policy}) + : DistanceRequestUtils.getRateByCustomUnitRateID({policy, customUnitRateID}); + + const transactionDistanceUnit = transaction.comment?.customUnit?.distanceUnit; + const transactionQuantity = transaction.comment?.customUnit?.quantity; + + const shouldUpdateDistanceUnit = !!transactionDistanceUnit && !!distanceRate?.unit; + const shouldUpdateQuantity = transactionQuantity !== null && transactionQuantity !== undefined; + + if (shouldUpdateDistanceUnit) { + newDistanceUnit = distanceRate.unit; + } + if (shouldUpdateQuantity && !!distanceRate?.unit) { + const newQuantityInMeters = getDistanceInMeters(transaction, transactionDistanceUnit); + + // getDistanceInMeters returns 0 only if there was not enough input to get the correct + // distance in meters or if the current transaction distance is 0 + if (newQuantityInMeters !== 0) { + newQuantity = DistanceRequestUtils.convertDistanceUnit(newQuantityInMeters, distanceRate.unit); + } + } + } + Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID}`, { comment: { customUnit: { customUnitRateID, ...(!isFakeP2PRate && {defaultP2PRate: null}), + distanceUnit: newDistanceUnit, + quantity: newQuantity, }, }, }); @@ -1662,8 +1697,8 @@ function addSubrate(transaction: OnyxEntry, currentIndex: Onyx.set(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction?.transactionID}`, newTransaction); } -function setMoneyRequestDistance(transactionID: string, distanceAsFloat: number, isDraft: boolean) { - Onyx.merge(`${isDraft ? ONYXKEYS.COLLECTION.TRANSACTION_DRAFT : ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, {comment: {customUnit: {quantity: distanceAsFloat}}}); +function setMoneyRequestDistance(transactionID: string, distanceAsFloat: number, isDraft: boolean, distanceUnit: Unit) { + Onyx.merge(`${isDraft ? ONYXKEYS.COLLECTION.TRANSACTION_DRAFT : ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, {comment: {customUnit: {quantity: distanceAsFloat, distanceUnit}}}); } /** @@ -1719,18 +1754,20 @@ function setMoneyRequestDistanceRate(transactionID: string, customUnitRateID: st Onyx.merge(ONYXKEYS.NVP_LAST_SELECTED_DISTANCE_RATES, {[policy.id]: customUnitRateID}); } - const distanceRate = DistanceRequestUtils.getRateByCustomUnitRateID({policy, customUnitRateID}); + const newDistanceUnit = getDistanceRateCustomUnit(policy)?.attributes?.unit; const transaction = isDraft ? allTransactionDrafts[`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID}`] : allTransactions[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]; + let newDistance; - if (distanceRate?.unit && distanceRate?.unit !== transaction?.comment?.customUnit?.distanceUnit) { - newDistance = DistanceRequestUtils.convertDistanceUnit(getDistanceInMeters(transaction, transaction?.comment?.customUnit?.distanceUnit), distanceRate.unit); + if (newDistanceUnit && newDistanceUnit !== transaction?.comment?.customUnit?.distanceUnit) { + newDistance = DistanceRequestUtils.convertDistanceUnit(getDistanceInMeters(transaction, transaction?.comment?.customUnit?.distanceUnit), newDistanceUnit); } + Onyx.merge(`${isDraft ? ONYXKEYS.COLLECTION.TRANSACTION_DRAFT : ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, { comment: { customUnit: { customUnitRateID, ...(!!policy && {defaultP2PRate: null}), - ...(distanceRate && {distanceUnit: distanceRate.unit}), + ...(newDistanceUnit && {distanceUnit: newDistanceUnit}), ...(newDistance && {quantity: newDistance}), }, }, @@ -7529,7 +7566,7 @@ function trackExpense(params: CreateTrackExpenseParams) { attendees: attendees ? JSON.stringify(attendees) : undefined, currency, comment, - distance, + distance: distance !== undefined ? roundToTwoDecimalPlaces(distance) : undefined, created, merchant, iouReportID: iouReport?.reportID, @@ -8374,7 +8411,7 @@ function createDistanceRequest(distanceRequestInformation: CreateDistanceRequest createdIOUReportActionID, reportPreviewReportActionID: reportPreviewAction.reportActionID, waypoints: JSON.stringify(sanitizedWaypoints), - distance, + distance: distance !== undefined ? roundToTwoDecimalPlaces(distance) : undefined, receipt, odometerStart, odometerEnd, diff --git a/src/pages/iou/request/step/IOURequestStepDestination.tsx b/src/pages/iou/request/step/IOURequestStepDestination.tsx index 30dec1317a268..d0b19cdb7199f 100644 --- a/src/pages/iou/request/step/IOURequestStepDestination.tsx +++ b/src/pages/iou/request/step/IOURequestStepDestination.tsx @@ -119,7 +119,7 @@ function IOURequestStepDestination({ setCustomUnitID(transactionID, customUnit.customUnitID); setMoneyRequestCategory(transactionID, customUnit?.defaultCategory ?? '', undefined); } - setCustomUnitRateID(transactionID, destination.keyForList ?? ''); + setCustomUnitRateID(transactionID, destination.keyForList ?? '', transaction, policy); setMoneyRequestCurrency(transactionID, destination.currency); clearSubrates(transactionID); } diff --git a/src/pages/iou/request/step/IOURequestStepDistanceManual.tsx b/src/pages/iou/request/step/IOURequestStepDistanceManual.tsx index ac09c7c65e047..0b92cbb860e35 100644 --- a/src/pages/iou/request/step/IOURequestStepDistanceManual.tsx +++ b/src/pages/iou/request/step/IOURequestStepDistanceManual.tsx @@ -21,7 +21,6 @@ import useSelfDMReport from '@hooks/useSelfDMReport'; import useThemeStyles from '@hooks/useThemeStyles'; import {getMoneyRequestParticipantsFromReport, setMoneyRequestDistance, updateMoneyRequestDistance} from '@libs/actions/IOU'; import {handleMoneyRequestStepDistanceNavigation} from '@libs/actions/IOU/MoneyRequest'; -import {setDraftSplitTransaction} from '@libs/actions/IOU/Split'; import {canUseTouchScreen} from '@libs/DeviceCapabilities'; import DistanceRequestUtils from '@libs/DistanceRequestUtils'; import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID'; @@ -30,7 +29,7 @@ import Navigation from '@libs/Navigation/Navigation'; import {roundToTwoDecimalPlaces} from '@libs/NumberUtils'; import {isArchivedReport, isPolicyExpenseChat as isPolicyExpenseChatUtils} from '@libs/ReportUtils'; import shouldUseDefaultExpensePolicyUtil from '@libs/shouldUseDefaultExpensePolicy'; -import {getRateID} from '@libs/TransactionUtils'; +import {getDistanceInMeters, getRateID} from '@libs/TransactionUtils'; import variables from '@styles/variables'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; @@ -102,8 +101,16 @@ function IOURequestStepDistanceManual({ const shouldUseDefaultExpensePolicy = useMemo(() => shouldUseDefaultExpensePolicyUtil(iouType, defaultExpensePolicy), [iouType, defaultExpensePolicy]); const customUnitRateID = getRateID(transaction); - const unit = DistanceRequestUtils.getRate({transaction, policy: shouldUseDefaultExpensePolicy ? defaultExpensePolicy : policy}).unit; - const distance = typeof transaction?.comment?.customUnit?.quantity === 'number' ? roundToTwoDecimalPlaces(transaction.comment.customUnit.quantity) : undefined; + // to make sure the correct distance amount and unit will be shown we use distance unit + // from defaultExpensePolicy or current report's policy instead of from transaction and + // then we use transaction data (distanceUnit and quantity) for conversions + const unit = DistanceRequestUtils.getRate({ + transaction, + policy: shouldUseDefaultExpensePolicy ? defaultExpensePolicy : policy, + useTransactionDistanceUnit: false, + }).unit; + const distanceInMeters = getDistanceInMeters(transaction, transaction?.comment?.customUnit?.distanceUnit ? transaction.comment.customUnit.distanceUnit : unit); + const distance = typeof transaction?.comment?.customUnit?.quantity === 'number' ? roundToTwoDecimalPlaces(DistanceRequestUtils.convertDistanceUnit(distanceInMeters, unit)) : undefined; const isASAPSubmitBetaEnabled = isBetaEnabled(CONST.BETAS.ASAP_SUBMIT); useEffect(() => { @@ -150,10 +157,17 @@ function IOURequestStepDistanceManual({ const navigateToNextPage = useCallback( (amount: string) => { const distanceAsFloat = roundToTwoDecimalPlaces(parseFloat(amount)); - setMoneyRequestDistance(transactionID, distanceAsFloat, isTransactionDraft); + setMoneyRequestDistance(transactionID, distanceAsFloat, isTransactionDraft, unit); if (action === CONST.IOU.ACTION.EDIT) { - if (distance !== distanceAsFloat) { + const transactionDistanceUnit = transaction?.comment?.customUnit?.distanceUnit; + + const isDistanceChanged = distance !== distanceAsFloat; + const isDistanceUnitChanged = transactionDistanceUnit && transactionDistanceUnit !== unit; + + const shouldUpdateTransaction = isDistanceChanged || isDistanceUnitChanged; + + if (shouldUpdateTransaction) { updateMoneyRequestDistance({ transactionID: transaction?.transactionID, transactionThreadReport: report, @@ -244,6 +258,7 @@ function IOURequestStepDistanceManual({ policyCategories, parentReportNextStep, recentWaypoints, + unit, selfDMReport, betas, ], diff --git a/src/pages/iou/request/step/IOURequestStepDistanceOdometer.tsx b/src/pages/iou/request/step/IOURequestStepDistanceOdometer.tsx index a5f3910522562..351d22a1061c4 100644 --- a/src/pages/iou/request/step/IOURequestStepDistanceOdometer.tsx +++ b/src/pages/iou/request/step/IOURequestStepDistanceOdometer.tsx @@ -357,7 +357,7 @@ function IOURequestStepDistanceOdometer({ const calculatedDistance = roundToTwoDecimalPlaces(distance); // Store total distance in transaction.comment.customUnit.quantity - setMoneyRequestDistance(transactionID, calculatedDistance, isTransactionDraft); + setMoneyRequestDistance(transactionID, calculatedDistance, isTransactionDraft, unit); if (isEditing) { // Update existing transaction @@ -509,7 +509,7 @@ function IOURequestStepDistanceOdometer({ lastSelectedDistanceRates, }); setTransactionReport(transactionID, {reportID: transactionReportID}, true); - setCustomUnitRateID(transactionID, rateID); + setCustomUnitRateID(transactionID, rateID, transaction, policy); setMoneyRequestParticipantsFromReport(transactionID, activePolicyExpenseChat, currentUserPersonalDetails.accountID).then(() => { Navigation.navigate( ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute( diff --git a/src/pages/iou/request/step/IOURequestStepParticipants.tsx b/src/pages/iou/request/step/IOURequestStepParticipants.tsx index ac8f1795c2720..a274fcaf9263c 100644 --- a/src/pages/iou/request/step/IOURequestStepParticipants.tsx +++ b/src/pages/iou/request/step/IOURequestStepParticipants.tsx @@ -191,7 +191,7 @@ function IOURequestStepParticipants({ const rateID = CONST.CUSTOM_UNITS.FAKE_P2P_ID; for (const transaction of transactions) { - setCustomUnitRateID(transaction.transactionID, rateID); + setCustomUnitRateID(transaction.transactionID, rateID, transaction, activePolicy); const shouldSetParticipantAutoAssignment = iouType === CONST.IOU.TYPE.CREATE; setMoneyRequestParticipantsFromReport( transaction.transactionID, @@ -215,7 +215,19 @@ function IOURequestStepParticipants({ } }); }); - }, [selfDMReportID, transactions, action, initialTransactionID, waitForKeyboardDismiss, iouType, selfDMReport, currentUserPersonalDetails.accountID, isActivePolicyRequest, backTo]); + }, [ + selfDMReportID, + transactions, + action, + initialTransactionID, + waitForKeyboardDismiss, + iouType, + selfDMReport, + currentUserPersonalDetails.accountID, + isActivePolicyRequest, + backTo, + activePolicy, + ]); const addParticipant = useCallback( (val: Participant[]) => { @@ -252,11 +264,11 @@ function IOURequestStepParticipants({ if (transactions.length > 0) { for (const transaction of transactions) { - setCustomUnitRateID(transaction.transactionID, rateID); + setCustomUnitRateID(transaction.transactionID, rateID, transaction, policy); } } else { // Fallback to using initialTransactionID directly - setCustomUnitRateID(initialTransactionID, rateID); + setCustomUnitRateID(initialTransactionID, rateID, undefined, policy); } } diff --git a/src/pages/iou/request/step/IOURequestStepReport.tsx b/src/pages/iou/request/step/IOURequestStepReport.tsx index 26fa92cca3e61..7ea899b114ac4 100644 --- a/src/pages/iou/request/step/IOURequestStepReport.tsx +++ b/src/pages/iou/request/step/IOURequestStepReport.tsx @@ -128,7 +128,7 @@ function IOURequestStepReport({route, transaction}: IOURequestStepReportProps) { // Clear subrates, and update customUnitID if policy changed for per diem transactions if (policyChanged && isPerDiemTransaction) { setCustomUnitID(transaction.transactionID, newCustomUnitID ?? CONST.CUSTOM_UNITS.FAKE_P2P_ID); - setCustomUnitRateID(transaction.transactionID, undefined); + setCustomUnitRateID(transaction.transactionID, undefined, transaction, newPolicy); clearSubrates(transaction.transactionID); } diff --git a/src/pages/iou/request/step/IOURequestStepUpgrade.tsx b/src/pages/iou/request/step/IOURequestStepUpgrade.tsx index a19e7033d8723..99f5e6c597dae 100644 --- a/src/pages/iou/request/step/IOURequestStepUpgrade.tsx +++ b/src/pages/iou/request/step/IOURequestStepUpgrade.tsx @@ -87,30 +87,40 @@ function IOURequestStepUpgrade({ }, ]); } - Navigation.goBack(); switch (upgradePath) { case CONST.UPGRADE_PATHS.DISTANCE_RATES: { if (!policyID || !reportID) { + Navigation.goBack(); return; } + + // In case we get here from /:action/track/... route we need to navigate to + // /:action/submit/... when shouldSubmitExpense === true as transaction is not selfDM anymore + const backToRoute = shouldSubmitExpense ? ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(action, CONST.IOU.TYPE.SUBMIT, transactionID, reportID) : undefined; + + Navigation.goBack(backToRoute); + setTransactionReport(transactionID, {reportID: expenseReportID}, true); // Let the confirmation step decide the distance rate because policy data is not fully available at this step - setCustomUnitRateID(transactionID, '-1'); + setCustomUnitRateID(transactionID, '-1', undefined, undefined); Navigation.setParams({reportID: expenseReportID}); navigateWithMicrotask(ROUTES.WORKSPACE_CREATE_DISTANCE_RATE_UPGRADE.getRoute(policyID, transactionID, expenseReportID)); break; } case CONST.UPGRADE_PATHS.REPORTS: + Navigation.goBack(); navigateWithMicrotask(ROUTES.MONEY_REQUEST_STEP_REPORT.getRoute(action, CONST.IOU.TYPE.SUBMIT, transactionID, reportID)); break; case CONST.UPGRADE_PATHS.CATEGORIES: + Navigation.goBack(); navigateWithMicrotask(backTo ?? ROUTES.MONEY_REQUEST_STEP_CATEGORY.getRoute(action, CONST.IOU.TYPE.SUBMIT, transactionID, reportID)); break; default: + Navigation.goBack(); } };