Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
154 commits
Select commit Hold shift + click to select a range
135caf9
Add commuter exclusion types, constants, and strings
fedirjh Jun 17, 2026
8324df2
Render commuter exclusion breakdown on confirmation, view, and edit
fedirjh Jun 17, 2026
4456e9a
Gate manual/odometer entry on commuter exclusion policies
fedirjh Jun 17, 2026
cdafc1b
Route COMMUTER_EXCLUSION system action through ActionContentRouter
fedirjh Jun 17, 2026
44f5bd1
Optimistic commuter exclusion on createDistanceRequest
fedirjh Jun 17, 2026
932c326
Block manual and odometer entry on commuter-exclusion workspaces
fedirjh Jun 17, 2026
6bdf910
Merge remote-tracking branch 'upstream' into commuter-exclusions-app
fedirjh Jun 17, 2026
8974878
Merge branch 'alberto-createExclusion' into commuter-exclusions-app
fedirjh Jun 18, 2026
ee0cba7
Merge remote-tracking branch 'upstream' into commuter-exclusions-app
fedirjh Jun 18, 2026
290daee
Consolidate commuter exclusion constants under CONST.POLICY
fedirjh Jun 18, 2026
2f9b65a
Add commuter exclusion breakdown and unit label utilities
fedirjh Jun 18, 2026
bbe4aa3
Display commuter exclusion breakdown in the distance field
fedirjh Jun 18, 2026
c41d074
Apply reimbursable amount and seed optimistic commuter exclusion data
fedirjh Jun 18, 2026
103dcd5
Render commuter exclusion system message as HTML with settings link
fedirjh Jun 18, 2026
a366047
Remove buildOptimisticCommuterExclusionReportAction function and its …
fedirjh Jun 18, 2026
2833278
fix: always use computed distanceRequestAmount for distance requests
fedirjh Jun 18, 2026
7bc17b8
fix: pass commuterExclusionBreakdown from hook to confirmation UI
fedirjh Jun 18, 2026
fbee94b
fix: show reimbursable distance in merchant text with commuter exclusion
fedirjh Jun 18, 2026
ad78962
fix: compute commuter exclusion from policy in MoneyRequestView
fedirjh Jun 18, 2026
a01fa2e
Merge remote-tracking branch 'upstream' into commuter-exclusions-app
fedirjh Jun 22, 2026
e45fffd
Use Onyx selector for commuter exclusion tab check, exclude personal …
fedirjh Jun 22, 2026
9d80222
Centralize commuter exclusion distance display in getDistanceForDisplay
fedirjh Jun 22, 2026
8b64f38
Align DistanceField commuter exclusion display with MoneyRequestView …
fedirjh Jun 22, 2026
76504c7
Use shared CommuterExclusionData type in DistanceRequestController an…
fedirjh Jun 22, 2026
1d2c6f6
Add getFormattedDistanceInUnits util for localized commuter exclusion…
fedirjh Jun 22, 2026
e831728
Reuse getFormattedDistanceInUnits for commuter distance labels
fedirjh Jun 22, 2026
61e6047
Refactor commuter exclusion handling in MoneyRequestConfirmationList
fedirjh Jun 22, 2026
057386e
Rename getCommuterExclusionBreakdown to getCommuterExclusionData
fedirjh Jun 22, 2026
e2b751b
Pass commuterExclusionData to getDistanceMerchant
fedirjh Jun 22, 2026
1dabe25
Break MoneyRequestUtils/DistanceRequestUtils dependency cycle
fedirjh Jun 22, 2026
d13d5c6
Show map/GPS-required confirm modal for manual and odometer distance
fedirjh Jun 22, 2026
b3c370c
Refactor commuter exclusion distance formatting in multiple languages
fedirjh Jun 22, 2026
27bc11b
Format commuter exclusion change-log messages via getFormattedDistanc…
fedirjh Jun 22, 2026
e6aa09d
Add mapOrGpsDistanceRequired translations for all locales
fedirjh Jun 22, 2026
c225c32
Add commuter exclusion translations for multiple languages
fedirjh Jun 22, 2026
caa7327
Add mock implementations for distance request utilities in tests
fedirjh Jun 22, 2026
c80f6da
Merge branch 'Expensify:main' into commuter-exclusions-app
fedirjh Jun 22, 2026
814c91b
Scope distance amount recalculation to commuter exclusions via should…
fedirjh Jun 22, 2026
b13da76
Merge remote-tracking branch 'upstream' into commuter-exclusions-app
fedirjh Jun 29, 2026
dd83c0f
Merge remote-tracking branch 'upstream' into commuter-exclusions-app
fedirjh Jun 29, 2026
1a4b275
Add 'commuter' translations for multiple languages
fedirjh Jun 29, 2026
0b8f004
Fix commuter exclusion distance display
fedirjh Jun 29, 2026
332ffb6
Use shared distance merchant formatting
fedirjh Jun 29, 2026
eddff4c
Add commuter fields to debug validation
fedirjh Jun 29, 2026
2a633bf
Merge remote-tracking branch 'upstream' into commuter-exclusions-app
fedirjh Jun 29, 2026
67e2da5
Refactor fixed distance unit style
fedirjh Jun 29, 2026
39a7adb
Extract distance display formatting
fedirjh Jun 29, 2026
956288a
Merge branch 'Expensify:main' into commuter-exclusions-app
fedirjh Jun 29, 2026
5d25316
Merge branch 'Expensify:main' into commuter-exclusions-app
fedirjh Jun 29, 2026
832893e
Cover commuter distance merchant updates
fedirjh Jun 29, 2026
7468b01
Fix ESLint type-assertion errors in commuter exclusion messages
fedirjh Jun 29, 2026
f678ffc
Add HouseWithMap illustration SVG and update imports
fedirjh Jun 29, 2026
9d42637
Update IOU request steps to use HouseWithMap illustration and add new…
fedirjh Jun 30, 2026
1d7bc19
Refactor HouseWithMap SVG illustration by removing unnecessary metada…
fedirjh Jun 30, 2026
44583be
Merge branch 'Expensify:main' into commuter-exclusions-app
fedirjh Jun 30, 2026
7a565b0
Merge branch 'Expensify:main' into commuter-exclusions-app
fedirjh Jun 30, 2026
6c4c521
Merge remote-tracking branch 'upstream' into commuter-exclusions-app
fedirjh Jul 6, 2026
241934e
Merge remote-tracking branch 'upstream' into commuter-exclusions-app
fedirjh Jul 6, 2026
4a93ae8
refactor: reorganize imports across multiple files for consistency an…
fedirjh Jul 6, 2026
1423373
refactor: remove DistanceWithCommuterExclusion component and update r…
fedirjh Jul 6, 2026
4588797
refactor: extract getDistanceDisplayDetailsWithCommuter to DRY commut…
fedirjh Jul 6, 2026
8d8f67a
Merge branch 'Expensify:main' into commuter-exclusions-app
fedirjh Jul 6, 2026
fc675a8
refactor: extract useCommuterExclusionGuard hook to deduplicate commu…
fedirjh Jul 6, 2026
da3aa04
chore: add justification for eslint-disable on deprecated Localize.tr…
fedirjh Jul 6, 2026
8e19689
refactor: move commuter exclusion stored check inside getCommuterExcl…
fedirjh Jul 6, 2026
e671fd4
refactor: update import paths in useCommuterExclusionGuard hook
fedirjh Jul 6, 2026
5474b61
Merge remote-tracking branch 'upstream' into commuter-exclusions-app
fedirjh Jul 6, 2026
cf90db5
Merge remote-tracking branch 'upstream' into commuter-exclusions-app
fedirjh Jul 9, 2026
0b3f398
Merge remote-tracking branch 'upstream' into commuter-exclusions-app
fedirjh Jul 9, 2026
73ac23f
Refactor ConfirmContent component to reposition dismiss icon rendering
fedirjh Jul 9, 2026
16a95ab
Guard commuter exclusions during workspace changes
fedirjh Jul 9, 2026
9f368a0
Block workspace changes for commuter exclusions
fedirjh Jul 9, 2026
c67fb8b
Store commuter exclusions on distance requests
fedirjh Jul 9, 2026
c56d0d0
Cover commuter exclusion distance updates
fedirjh Jul 9, 2026
ea20193
Clean up commuter exclusion distance display
fedirjh Jul 9, 2026
7a0eddc
Tighten commuter exclusion validation
fedirjh Jul 9, 2026
a0a28d8
Merge remote-tracking branch 'upstream' into commuter-exclusions-app
fedirjh Jul 9, 2026
1ea13ba
Update distance display tests
fedirjh Jul 9, 2026
c6b1ef5
Merge branch 'Expensify:main' into commuter-exclusions-app
fedirjh Jul 9, 2026
b43208b
Merge branch 'main' into commuter-exclusions-app
fedirjh Jul 10, 2026
ba9b360
fedirjh Jul 13, 2026
e75c44f
Merge remote-tracking branch 'upstream' into commuter-exclusions-app
fedirjh Jul 13, 2026
4517c98
Merge remote-tracking branch 'upstream' into commuter-exclusions-app
fedirjh Jul 14, 2026
09c12ee
Merge remote-tracking branch 'upstream' into commuter-exclusions-app
fedirjh Jul 14, 2026
393ac24
Exclude inactive workspaces from commuter exclusion checks
fedirjh Jul 14, 2026
c2ec657
Merge branch 'Expensify:main' into commuter-exclusions-app
fedirjh Jul 14, 2026
6d07f8e
Merge remote-tracking branch 'upstream' into commuter-exclusions-app
fedirjh Jul 14, 2026
6fb0277
Merge branch 'Expensify:main' into commuter-exclusions-app
fedirjh Jul 14, 2026
4651d1f
Merge remote-tracking branch 'upstream' into commuter-exclusions-app
fedirjh Jul 14, 2026
e2de8d5
Merge remote-tracking branch 'upstream' into commuter-exclusions-app
fedirjh Jul 15, 2026
b309577
Check default workspace for commuter exclusions
fedirjh Jul 15, 2026
47f6dd3
Merge remote-tracking branch 'upstream' into commuter-exclusions-app
fedirjh Jul 15, 2026
9ba8011
Apply commuter exclusions to distance request amounts
fedirjh Jul 15, 2026
3d708fd
Merge remote-tracking branch 'upstream' into commuter-exclusions-app
fedirjh Jul 15, 2026
74cb1fc
Block forced-commuter workspace switches in money request confirmatio…
fedirjh Jul 15, 2026
55083b7
Add unit tests for useCommuterExclusionGuard
fedirjh Jul 15, 2026
c39fcb0
Merge remote-tracking branch 'upstream' into commuter-exclusions-app
fedirjh Jul 16, 2026
53a45ff
Address review: stabilize commuter guard, fix split amount, clarify n…
fedirjh Jul 21, 2026
6947c47
Merge remote-tracking branch 'upstream' into commuter-exclusions-app
fedirjh Jul 21, 2026
a78cd4a
Localize commuter exclusion original-distance label
fedirjh Jul 21, 2026
1dc4f5c
Merge branch 'Expensify:main' into commuter-exclusions-app
fedirjh Jul 21, 2026
ad31018
Merge pull request #96258 from nkdengineer/fix/93934
fedirjh Jul 22, 2026
ede50e3
Merge remote-tracking branch 'upstream' into commuter-exclusions-app
fedirjh Jul 22, 2026
3e6ec06
Merge branch 'main' into commuter-exclusions-app
fedirjh Jul 22, 2026
ef5b772
Merge branch 'main' into commuter-exclusions-app
fedirjh Jul 22, 2026
5efe0db
fix: tax commuter exclusion distance
fedirjh Jul 22, 2026
5b7007c
test: avoid unsafe tax amount assertions
fedirjh Jul 22, 2026
038d044
test: add required tax amount fixture fields
fedirjh Jul 22, 2026
177d8e8
Merge remote-tracking branch 'upstream' into commuter-exclusions-app
fedirjh Jul 23, 2026
e723354
Merge remote-tracking branch 'upstream' into commuter-exclusions-app
fedirjh Jul 23, 2026
b61a809
fix: clarify commuter exclusion distance copy
fedirjh Jul 23, 2026
b8f4546
fix: gate commuter exclusion by distance rates
fedirjh Jul 23, 2026
59a4e41
fix: avoid empty commuter settings links
fedirjh Jul 23, 2026
90fab73
fix: rely on commuter exclusion config
fedirjh Jul 23, 2026
c7fef15
fix: preserve IOU action amount signs
fedirjh Jul 23, 2026
cdf1977
fix: avoid premature commuter exclusion blocks
fedirjh Jul 23, 2026
2e115ad
test: update commuter exclusion guard expectation
fedirjh Jul 23, 2026
a750771
fix: pluralize commuter exclusion units
fedirjh Jul 23, 2026
99f8ffa
refactor: remove redundant distance rate prop
fedirjh Jul 23, 2026
7eb8a80
Merge branch 'Expensify:main' into commuter-exclusions-app
fedirjh Jul 23, 2026
b2cda6b
Merge remote-tracking branch 'upstream' into commuter-exclusions-app
fedirjh Jul 24, 2026
c117b7f
Merge branch 'Expensify:main' into commuter-exclusions-app
fedirjh Jul 26, 2026
e403e5c
Merge remote-tracking branch 'upstream' into commuter-exclusions-app
fedirjh Jul 27, 2026
1c61590
Merge remote-tracking branch 'refs/remotes/origin/commuter-exclusions…
fedirjh Jul 27, 2026
2e8b758
Merge remote-tracking branch 'upstream' into commuter-exclusions-app
fedirjh Jul 28, 2026
0a6d870
Merge branch 'Expensify:main' into commuter-exclusions-app
fedirjh Jul 28, 2026
b36121a
Merge remote-tracking branch 'upstream' into commuter-exclusions-app
fedirjh Jul 29, 2026
cb12e2c
Merge remote-tracking branch 'upstream' into commuter-exclusions-app
fedirjh Jul 29, 2026
a56f4b0
Merge branch 'commuter-exclusions-app' of github.com:fedirjh/ExpensiA…
fedirjh Jul 29, 2026
c2c4aa3
Merge branch 'Expensify:main' into commuter-exclusions-app
fedirjh Jul 31, 2026
037e9f3
Merge remote-tracking branch 'upstream' into commuter-exclusions-app
fedirjh Aug 3, 2026
af3bbc0
chore: remove duplicate import
fedirjh Aug 3, 2026
00b14d2
chore: add missing parameters
fedirjh Aug 4, 2026
fd733d4
Merge branch 'Expensify:main' into commuter-exclusions-app
fedirjh Aug 4, 2026
6820885
chore: add transaltions paths for commuter
fedirjh Aug 4, 2026
3a40cae
chore: Add missing translations
fedirjh Aug 4, 2026
4089870
Merge branch 'Expensify:main' into commuter-exclusions-app
fedirjh Aug 4, 2026
8d3d6fd
Keep the commuter exclusion applied in the optimistic distance rate c…
fedirjh Aug 4, 2026
d2d560a
fix(distance): scope commuter exclusion guard
fedirjh Aug 7, 2026
1f37a46
test(distance): cover personal commuter flows
fedirjh Aug 7, 2026
9dc26f6
fix(distance): hide invalid sole-target tabs
fedirjh Aug 7, 2026
f3325bb
fix(distance): keep self-DM distance tabs
fedirjh Aug 7, 2026
780d757
fix(distance): scope modified fields
fedirjh Aug 7, 2026
fad1e6e
fix(distance): recalculate exclusion on change
fedirjh Aug 7, 2026
165c35d
test(distance): widen IOU type helper
fedirjh Aug 7, 2026
319655d
refactor(report): pass transactions to guard
fedirjh Aug 7, 2026
87e7c56
Merge remote-tracking branch 'upstream' into commuter-exclusions-app
fedirjh Aug 7, 2026
5f00f53
fix(distance): show excluded split distance
fedirjh Aug 7, 2026
cad83c4
fix(distance): unwrap default participants
fedirjh Aug 7, 2026
55e579e
test(distance): cover rate unit conversion
fedirjh Aug 7, 2026
c0be995
fix(distance): normalize split commuter data
fedirjh Aug 8, 2026
8a12e59
fix(distance): prevent stale split exclusions
fedirjh Aug 8, 2026
5267d1c
Merge remote-tracking branch 'upstream' into commuter-exclusions-app
fedirjh Aug 8, 2026
05f51a7
Merge branch 'Expensify:main' into commuter-exclusions-app
fedirjh Aug 10, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions src/CONST/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1629,6 +1629,7 @@ const CONST = {
HOLD_COMMENT: 'HOLDCOMMENT',
INTEGRATION_SYNC_FAILED: 'INTEGRATIONSYNCFAILED',
COMPANY_CARD_CONNECTION_BROKEN: 'COMPANYCARDCONNECTIONBROKEN',
COMMUTER_EXCLUSION: 'COMMUTEREXCLUSION',
Comment thread
fedirjh marked this conversation as resolved.
PLAID_BALANCE_FAILURE: 'PLAIDBALANCEFAILURE',
IOU: 'IOU',
INTEGRATIONS_MESSAGE: 'INTEGRATIONSMESSAGE', // OldDot Action
Expand Down
2 changes: 2 additions & 0 deletions src/components/Icon/chunks/illustrations.chunk.ts
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,7 @@ import HeadSet from '@assets/images/simple-illustrations/simple-illustration__he
import Hourglass from '@assets/images/simple-illustrations/simple-illustration__hourglass.svg';
import HouseMoney from '@assets/images/simple-illustrations/simple-illustration__house-money.svg';
import House from '@assets/images/simple-illustrations/simple-illustration__house.svg';
import HouseWithMap from '@assets/images/simple-illustrations/simple-illustration__housewithmap.svg';
import InvoiceBlue from '@assets/images/simple-illustrations/simple-illustration__invoice.svg';
import LifeRing from '@assets/images/simple-illustrations/simple-illustration__lifering.svg';
import Lightbulb from '@assets/images/simple-illustrations/simple-illustration__lightbulb.svg';
Expand Down Expand Up @@ -415,6 +416,7 @@ const Illustrations = {
HeadSet,
Hourglass,
House,
HouseWithMap,
HouseMoney,
LifeRing,
Lightbulb,
Expand Down
16 changes: 14 additions & 2 deletions src/components/MoneyRequestConfirmationList.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import useAttendees from '@hooks/useAttendees';
import useCommuterExclusionGuard from '@hooks/useCommuterExclusionGuard';
import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
import useIsInLandscapeMode from '@hooks/useIsInLandscapeMode';
import useLocalize from '@hooks/useLocalize';
Expand Down Expand Up @@ -254,6 +255,11 @@ function MoneyRequestConfirmationList({
const isDistanceRequest = isDistanceRequestUtil(transaction);
const isManualDistanceRequest = isManualDistanceRequestUtil(transaction);
const isGPSDistanceRequest = isGPSDistanceRequestUtil(transaction);
const blockManualOrOdometerDistanceRequestIfNeeded = useCommuterExclusionGuard({
policyID: isPolicyExpenseChat ? policy?.id : undefined,
isManualDistanceRequest,
isOdometerDistanceRequest,
});

const iouAmount = hasValidModifiedAmount(transaction) ? Number(transaction?.modifiedAmount) : (transaction?.amount ?? 0);
const iouCurrencyCode = getCurrency(transaction);
Expand Down Expand Up @@ -305,6 +311,7 @@ function MoneyRequestConfirmationList({
isMovingTransactionFromTrackExpense,
customUnitRateID,
distance,
distanceUnit: unit,
previousTransactionCurrency,
});

Expand Down Expand Up @@ -504,7 +511,12 @@ function MoneyRequestConfirmationList({
setFormError,
setDidConfirmSplit,
showDelegateNoAccessModal,
onConfirm,
onConfirm: () => {
if (blockManualOrOdometerDistanceRequestIfNeeded()) {
return;
}
onConfirm?.();
},
onSendMoney,
});

Expand Down Expand Up @@ -558,13 +570,13 @@ function MoneyRequestConfirmationList({
distance,
hasRoute,
unit,
rate,
distanceRateName: mileageRate.name,
distanceRateCurrency: currency,
mileageRate,
expenseDate: getCreated(transaction),
customUnitRateID,
shouldShowRateAutoUpdatedTooltip,
customUnit: transaction?.comment?.customUnit,
}}
amountDisplay={{amount: amountToBeUsed, formattedAmount, formattedAmountPerAttendee}}
requiredFlags={{isCategoryRequired, isMerchantRequired, isDescriptionRequired}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,14 @@ import useOnyx from '@hooks/useOnyx';
import usePersonalPolicy from '@hooks/usePersonalPolicy';
import usePrevious from '@hooks/usePrevious';

import {clearMoneyRequestRateAutoUpdated, setCustomUnitRateID, setMoneyRequestAmount, setMoneyRequestMerchant, setMoneyRequestPendingFields} from '@libs/actions/IOU/MoneyRequest';
import {
clearMoneyRequestRateAutoUpdated,
setCustomUnitRateID,
setMoneyRequestAmount,
setMoneyRequestCommuterExclusionFields,
setMoneyRequestMerchant,
setMoneyRequestPendingFields,
} from '@libs/actions/IOU/MoneyRequest';
import {setSplitShares} from '@libs/actions/IOU/Split';
import DistanceRequestUtils from '@libs/DistanceRequestUtils';
import type {MileageRate} from '@libs/DistanceRequestUtils';
Expand Down Expand Up @@ -146,10 +153,10 @@ function DistanceRequestController({
if (isReadOnly) {
return;
}
const amount = DistanceRequestUtils.getDistanceRequestAmount(distance, unit ?? CONST.CUSTOM_UNITS.DISTANCE_UNIT_MILES, rate ?? 0);
setMoneyRequestAmount(transactionID, amount, currency ?? '');
// Use the (commuter-exclusion-aware) reimbursable amount so the seeded amount matches what the backend will calculate.
setMoneyRequestAmount(transactionID, distanceRequestAmount, currency ?? '');
isFirstUpdatedDistanceAmount.current = true;
}, [distance, rate, isReadOnly, unit, transactionID, currency, isDistanceRequest]);
}, [distanceRequestAmount, isReadOnly, transactionID, currency, isDistanceRequest]);

useEffect(() => {
if (!shouldCalculateDistanceAmount || !transactionID || isReadOnly) {
Expand Down Expand Up @@ -239,6 +246,19 @@ function DistanceRequestController({
isManualDistanceRequest,
);
setMoneyRequestMerchant(transactionID, distanceMerchant, true);

setMoneyRequestCommuterExclusionFields({
transactionID,
transaction,
policy,
customUnitRateID,
routeDistanceMeters: distance,
distanceUnit: unit ?? CONST.CUSTOM_UNITS.DISTANCE_UNIT_MILES,
translate,
toLocaleDigit,
getCurrencySymbol,
personalPolicyOutputCurrency: personalPolicy?.outputCurrency,
});
}, [
isDistanceRequestWithPendingRoute,
hasRoute,
Expand All @@ -254,6 +274,9 @@ function DistanceRequestController({
isReadOnly,
getCurrencySymbol,
isManualDistanceRequest,
policy,
customUnitRateID,
personalPolicy?.outputCurrency,
]);

return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -322,7 +322,9 @@ function useConfirmationValidation({
return {errorKey: 'iou.error.genericSmartscanFailureMessage', shouldSetDidConfirmSplit: true};
}

if (isEditingSplitBill && iouAmount === 0) {
const isFullyCoveredByCommuterExclusion =
isDistanceRequest && (transaction?.comment?.customUnit?.commuterExclusion ?? 0) > 0 && transaction?.comment?.customUnit?.reimbursableDistance === 0;
if (isEditingSplitBill && iouAmount === 0 && !isFullyCoveredByCommuterExclusion) {
return {errorKey: 'iou.error.invalidAmount'};
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,21 +85,31 @@ function useDistanceRequestState({
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 customUnit = transaction?.comment?.customUnit;
const unit = calculateFromTransactionData ? customUnit?.distanceUnit : distanceUnit;
const rate = calculateFromTransactionData ? Math.abs(iouAmount) / (customUnit?.quantity ?? 1) : distanceRate;
const currency = calculateFromTransactionData ? iouCurrencyCode : (mileageRate.currency ?? CONST.CURRENCY.USD);
const prevRate = usePrevious(rate);
const prevUnit = usePrevious(unit);
const prevCurrency = usePrevious(currency);

const distance = getDistanceInMeters(transaction, unit);
const prevDistance = usePrevious(distance);
const shouldCalculateDistanceAmount = isDistanceRequest && (iouAmount === 0 || prevRate !== rate || prevDistance !== distance || prevCurrency !== currency || prevUnit !== unit);
const amountUnit = unit ?? CONST.CUSTOM_UNITS.DISTANCE_UNIT_MILES;
const commuterExclusionData = DistanceRequestUtils.getCommuterExclusionDisplayData(customUnit, amountUnit);
const reimbursableDistance = commuterExclusionData?.reimbursableDistance;
const prevReimbursableDistance = usePrevious(reimbursableDistance);
const reimbursableDistanceInMeters = commuterExclusionData
? DistanceRequestUtils.convertToDistanceInMeters(commuterExclusionData.reimbursableDistance, commuterExclusionData.distanceUnit)
: distance;
const shouldCalculateDistanceAmount =
isDistanceRequest &&
(iouAmount === 0 || prevRate !== rate || prevDistance !== distance || prevCurrency !== currency || prevUnit !== unit || prevReimbursableDistance !== reimbursableDistance);

const hasRoute = hasRouteUtil(transaction, isDistanceRequest);
const isDistanceRequestWithPendingRoute = isDistanceRequest && (!hasRoute || !rate) && !isMovingTransactionFromTrackExpense;

const distanceRequestAmount = DistanceRequestUtils.getDistanceRequestAmount(distance, unit ?? CONST.CUSTOM_UNITS.DISTANCE_UNIT_MILES, rate ?? 0);
const distanceRequestAmount = DistanceRequestUtils.getDistanceRequestAmount(reimbursableDistanceInMeters, amountUnit, rate ?? 0);

return {
policyDraft,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import {calculateTaxAmount, getDefaultTaxCode, getTaxValue, hasTaxRateWithMatchi

import CONST from '@src/CONST';
import type * as OnyxTypes from '@src/types/onyx';
import type {Unit} from '@src/types/onyx/Policy';

import type {OnyxEntry} from 'react-native-onyx';

Expand All @@ -31,6 +32,9 @@ type UseTaxAmountParams = {
/** Distance value used to compute the taxable amount for distance requests */
distance: number;

/** Active distance unit for the selected mileage rate */
distanceUnit: Unit | undefined;

/** Currency the transaction had on the previous render, used to detect currency changes */
previousTransactionCurrency: string | undefined;
};
Expand All @@ -51,6 +55,7 @@ function useTaxAmount({
isMovingTransactionFromTrackExpense,
customUnitRateID,
distance,
distanceUnit,
previousTransactionCurrency,
}: UseTaxAmountParams) {
const {getCurrencyDecimals} = useCurrencyListActions();
Expand All @@ -61,8 +66,15 @@ function useTaxAmount({
const previousDefaultTaxCode = getDefaultTaxCode(policy, transaction, previousTransactionCurrency);
const shouldKeepCurrentTaxSelection = hasTaxRateWithMatchingValue(policy, transaction) && transaction?.taxCode !== previousDefaultTaxCode;

const commuterExclusionData = isDistanceRequest
? DistanceRequestUtils.getCommuterExclusionDisplayData(
transaction?.comment?.customUnit,
transaction?.comment?.customUnit?.distanceUnit ?? distanceUnit ?? CONST.CUSTOM_UNITS.DISTANCE_UNIT_MILES,
)
: null;
const taxableDistance = commuterExclusionData ? DistanceRequestUtils.convertToDistanceInMeters(commuterExclusionData.reimbursableDistance, commuterExclusionData.distanceUnit) : distance;
// Calculate and set tax amount in transaction draft
const taxableAmount = isDistanceRequest ? DistanceRequestUtils.getTaxableAmount(policy, customUnitRateID, distance) : Math.abs(transaction?.amount ?? 0);
const taxableAmount = isDistanceRequest ? DistanceRequestUtils.getTaxableAmount(policy, customUnitRateID, taxableDistance) : Math.abs(transaction?.amount ?? 0);
// First we'll try to get the tax value from the chosen policy and if not found, we'll try to get it from the policy for moving expenses (only if the transaction is moving from track expense)
const taxPercentage =
getTaxValue(policy, transaction, transaction?.taxCode ?? defaultTaxCode) ??
Expand Down
Loading
Loading