From 2303f97245b87ee34dffeff705b565d7839a33d4 Mon Sep 17 00:00:00 2001 From: FitseTLT Date: Wed, 8 Apr 2026 23:17:32 +0300 Subject: [PATCH 1/2] fixed self dm distance expense bugs --- src/components/MoneyRequestConfirmationList.tsx | 12 ++++++++---- .../DistanceRequestController.tsx | 4 +--- src/libs/DistanceRequestUtils.ts | 9 ++++++--- .../iou/request/step/IOURequestStepParticipants.tsx | 6 ++++-- 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/components/MoneyRequestConfirmationList.tsx b/src/components/MoneyRequestConfirmationList.tsx index 44cd1763c3b86..235a9d4b4db38 100644 --- a/src/components/MoneyRequestConfirmationList.tsx +++ b/src/components/MoneyRequestConfirmationList.tsx @@ -321,6 +321,7 @@ function MoneyRequestConfirmationList({ const customUnitRateID = getRateID(transaction); const subRates = transaction?.comment?.customUnit?.subRates ?? []; + const prevSubRates = usePrevious(subRates); const defaultRate = defaultMileageRate?.customUnitRateID; const lastSelectedRate = policy?.id ? (lastSelectedDistanceRates?.[policy.id] ?? defaultRate) : defaultRate; @@ -328,15 +329,18 @@ function MoneyRequestConfirmationList({ 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 3517de617404a..bb11b63852ecb 100644 --- a/src/components/MoneyRequestConfirmationList/DistanceRequestController.tsx +++ b/src/components/MoneyRequestConfirmationList/DistanceRequestController.tsx @@ -164,9 +164,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; } diff --git a/src/libs/DistanceRequestUtils.ts b/src/libs/DistanceRequestUtils.ts index d2c970e4371b4..a7294c8dba41c 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 9ab933c6b78bf..4dbd7d331cb77 100644 --- a/src/pages/iou/request/step/IOURequestStepParticipants.tsx +++ b/src/pages/iou/request/step/IOURequestStepParticipants.tsx @@ -200,6 +200,7 @@ function IOURequestStepParticipants({ isTrackDistanceExpense: isDistanceRequest(transaction), policy: policyForMovingExpenses, isPolicyExpenseChat: false, + lastSelectedDistanceRates, }); setCustomUnitRateID(transaction.transactionID, rateID, transaction, policyForMovingExpenses); const shouldSetParticipantAutoAssignment = iouType === CONST.IOU.TYPE.CREATE; @@ -237,6 +238,7 @@ function IOURequestStepParticipants({ isActivePolicyRequest, backTo, policyForMovingExpenses, + lastSelectedDistanceRates, ]); const addParticipant = useCallback( @@ -268,8 +270,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) { From 5c0483a7e5703b78c6dc3db535e18e187a8a0f11 Mon Sep 17 00:00:00 2001 From: FitseTLT Date: Thu, 9 Apr 2026 00:34:37 +0300 Subject: [PATCH 2/2] fix dependency --- .../MoneyRequestConfirmationList/DistanceRequestController.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/components/MoneyRequestConfirmationList/DistanceRequestController.tsx b/src/components/MoneyRequestConfirmationList/DistanceRequestController.tsx index bb11b63852ecb..c0c89a629e039 100644 --- a/src/components/MoneyRequestConfirmationList/DistanceRequestController.tsx +++ b/src/components/MoneyRequestConfirmationList/DistanceRequestController.tsx @@ -197,11 +197,9 @@ function DistanceRequestController({ translate, toLocaleDigit, isDistanceRequest, - isPolicyExpenseChat, transaction, transactionID, isReadOnly, - isMovingTransactionFromTrackExpense, getCurrencySymbol, isManualDistanceRequest, ]);