diff --git a/src/components/MoneyRequestConfirmationList.tsx b/src/components/MoneyRequestConfirmationList.tsx index fe2a67ad21b75..e7867bc53572b 100644 --- a/src/components/MoneyRequestConfirmationList.tsx +++ b/src/components/MoneyRequestConfirmationList.tsx @@ -315,21 +315,25 @@ function MoneyRequestConfirmationList({ const customUnitRateID = getRateID(transaction); const subRates = transaction?.comment?.customUnit?.subRates ?? []; + const prevSubRates = usePrevious(subRates); const defaultRate = defaultMileageRate?.customUnitRateID; const mileageRate = DistanceRequestUtils.getRate({ transaction, policy, ...(isMovingTransactionFromTrackExpense && {policyForMovingExpenses}), + isMovingTransactionFromTrackExpense, policyDraft, }); - const rate = mileageRate.rate; + const distanceRate = mileageRate.rate; + const distanceUnit = mileageRate.unit; + const calculateFromTransactionData = isMovingTransactionFromTrackExpense && !distanceRate; + const unit = calculateFromTransactionData ? transaction?.comment?.customUnit?.distanceUnit : distanceUnit; + const rate = calculateFromTransactionData ? Math.abs(iouAmount) / (transaction?.comment?.customUnit?.quantity ?? 1) : distanceRate; + const currency = calculateFromTransactionData ? iouCurrencyCode : (mileageRate.currency ?? CONST.CURRENCY.USD); const prevRate = usePrevious(rate); - const unit = mileageRate.unit; const prevUnit = usePrevious(unit); - const currency = mileageRate.currency ?? CONST.CURRENCY.USD; const prevCurrency = usePrevious(currency); - const prevSubRates = usePrevious(subRates); // A flag for showing the categories field const shouldShowCategories = isTrackExpense diff --git a/src/components/MoneyRequestConfirmationList/DistanceRequestController.tsx b/src/components/MoneyRequestConfirmationList/DistanceRequestController.tsx index acd924e61e5dd..01d6be663648d 100644 --- a/src/components/MoneyRequestConfirmationList/DistanceRequestController.tsx +++ b/src/components/MoneyRequestConfirmationList/DistanceRequestController.tsx @@ -168,9 +168,7 @@ function DistanceRequestController({ }, [customUnitRateID, transactionID, lastSelectedRate, isDistanceRequest, isPolicyExpenseChat, isMovingTransactionFromTrackExpense, transaction, policy, selectedParticipants]); useEffect(() => { - if (!isDistanceRequest || (isMovingTransactionFromTrackExpense && !isPolicyExpenseChat) || !transactionID || isReadOnly) { - // We don't want to recalculate the distance merchant when moving a transaction from Track Expense to a 1:1 chat, because the distance rate will be the same default P2P rate. - // When moving to a policy chat (e.g. sharing with an accountant), we should recalculate the distance merchant with the policy's rate. + if (!isDistanceRequest || !transactionID || isReadOnly) { return; } @@ -203,11 +201,9 @@ function DistanceRequestController({ translate, toLocaleDigit, isDistanceRequest, - isPolicyExpenseChat, transaction, transactionID, isReadOnly, - isMovingTransactionFromTrackExpense, getCurrencySymbol, isManualDistanceRequest, ]); diff --git a/src/libs/DistanceRequestUtils.ts b/src/libs/DistanceRequestUtils.ts index be513d8b6de11..b42cfb8cfa0d2 100644 --- a/src/libs/DistanceRequestUtils.ts +++ b/src/libs/DistanceRequestUtils.ts @@ -357,12 +357,12 @@ function getCustomUnitRateID({ return customUnitRateID; } - // For TrackDistanceExpense we will return the default rate of the policyForMovingExpenses. + // For TrackDistanceExpense we will return the default or last selected rate of the policyForMovingExpenses. if (isPolicyExpenseChat || isTrackDistanceExpense) { const distanceUnit = Object.values(policy.customUnits ?? {}).find((unit) => unit.name === CONST.CUSTOM_UNITS.NAME_DISTANCE); const lastSelectedDistanceRateID = lastSelectedDistanceRates?.[policy.id]; const lastSelectedDistanceRate = lastSelectedDistanceRateID ? distanceUnit?.rates[lastSelectedDistanceRateID] : undefined; - if (!isTrackDistanceExpense && lastSelectedDistanceRate?.enabled && lastSelectedDistanceRateID) { + if (lastSelectedDistanceRate?.enabled && lastSelectedDistanceRateID) { customUnitRateID = lastSelectedDistanceRateID; } else { const defaultMileageRate = getDefaultMileageRate(policy); @@ -409,6 +409,7 @@ function getRate({ useTransactionDistanceUnit = true, policyForMovingExpenses, isFakeP2PRate, + isMovingTransactionFromTrackExpense, }: { transaction: OnyxEntry; policy: OnyxEntry; @@ -416,6 +417,7 @@ function getRate({ policyForMovingExpenses?: OnyxEntry; useTransactionDistanceUnit?: boolean; isFakeP2PRate?: boolean; + isMovingTransactionFromTrackExpense?: boolean; }): MileageRate { let mileageRates = getMileageRates(policy, true, transaction?.comment?.customUnit?.customUnitRateID); if (isEmptyObject(mileageRates) && policyDraft) { @@ -429,7 +431,8 @@ function getRate({ const defaultMileageRate = getDefaultMileageRate(policy); const customUnitRateID = getRateID(transaction); const customMileageRate = - (customUnitRateID && (mileageRates?.[customUnitRateID] ?? mileageRatesForMovingExpenses?.[customUnitRateID])) || (isUnreportedExpense ? undefined : defaultMileageRate); + (customUnitRateID && (mileageRates?.[customUnitRateID] ?? mileageRatesForMovingExpenses?.[customUnitRateID])) || + (isUnreportedExpense || isMovingTransactionFromTrackExpense ? undefined : defaultMileageRate); const mileageRate = isCustomUnitRateIDForP2P(transaction) || isFakeP2PRate ? getRateForP2P(policyCurrency, transaction) : customMileageRate; const unit = getDistanceUnit(useTransactionDistanceUnit ? transaction : undefined, mileageRate); return { diff --git a/src/pages/iou/request/step/IOURequestStepParticipants.tsx b/src/pages/iou/request/step/IOURequestStepParticipants.tsx index 36a5770b5173f..c909ada64cbf6 100644 --- a/src/pages/iou/request/step/IOURequestStepParticipants.tsx +++ b/src/pages/iou/request/step/IOURequestStepParticipants.tsx @@ -201,6 +201,7 @@ function IOURequestStepParticipants({ isTrackDistanceExpense: isDistanceRequest(transaction), policy: policyForMovingExpenses, isPolicyExpenseChat: false, + lastSelectedDistanceRates, }); setCustomUnitRateID(transaction.transactionID, rateID, transaction, policyForMovingExpenses); const shouldSetParticipantAutoAssignment = iouType === CONST.IOU.TYPE.CREATE; @@ -238,6 +239,7 @@ function IOURequestStepParticipants({ isActivePolicyRequest, backTo, policyForMovingExpenses, + lastSelectedDistanceRates, ]); const addParticipant = useCallback( @@ -269,8 +271,8 @@ function IOURequestStepParticipants({ } if (!isMovingTransactionFromTrackExpense || !isPolicyExpenseChat) { - // If not moving the transaction from track expense, select the default rate automatically. - // Otherwise, keep the original p2p rate and let the user manually change it to the one they want from the workspace. + // If not moving the transaction from track expense to a workspace, select the default rate automatically. + // Otherwise, keep the original rate and let the user manually change it to the one they want from the workspace. const rateID = DistanceRequestUtils.getCustomUnitRateID({reportID: firstParticipantReportID, isPolicyExpenseChat, policy, lastSelectedDistanceRates}); if (draftTransactions.length > 0) {