From 9dded9b142f54b68d78ea0e5e178c3c65998181f Mon Sep 17 00:00:00 2001 From: Ben Limpich Date: Fri, 24 Oct 2025 09:48:06 -0700 Subject: [PATCH 1/3] Revert "Merge pull request #73391 from Expensify/Rory-FixTaxAmountAdjustment" This reverts commit 0f48666fb931b3b6a2ad1b9eee8e75d4fcdb4d53, reversing changes made to bd83ec9cd505e54b5f2f564c757c77004a8904e9. --- .../MoneyRequestConfirmationList.tsx | 36 ++++++++++++++----- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/src/components/MoneyRequestConfirmationList.tsx b/src/components/MoneyRequestConfirmationList.tsx index 0fc2c478e75a6..6d153dd561830 100755 --- a/src/components/MoneyRequestConfirmationList.tsx +++ b/src/components/MoneyRequestConfirmationList.tsx @@ -35,7 +35,7 @@ import Log from '@libs/Log'; import {validateAmount} from '@libs/MoneyRequestUtils'; import Navigation from '@libs/Navigation/Navigation'; import {getIOUConfirmationOptionsFromPayeePersonalDetail, hasEnabledOptions} from '@libs/OptionsListUtils'; -import {getTagLists, isTaxTrackingEnabled} from '@libs/PolicyUtils'; +import {getDistanceRateCustomUnitRate, getTagLists, isTaxTrackingEnabled} from '@libs/PolicyUtils'; import {isSelectedManagerMcTest} from '@libs/ReportUtils'; import type {OptionData} from '@libs/ReportUtils'; import { @@ -475,16 +475,35 @@ function MoneyRequestConfirmationList({ }, [shouldCalculateDistanceAmount, isReadOnly, distanceRequestAmount, transactionID, currency, isTypeSplit, isPolicyExpenseChat, selectedParticipantsProp, transaction]); // Calculate and set tax amount in transaction draft - const taxableAmount = isDistanceRequest ? DistanceRequestUtils.getTaxableAmount(policy, customUnitRateID, distance) : (transaction?.amount ?? 0); - const taxPercentage = getTaxValue(policy, transaction, transaction?.taxCode ?? defaultTaxCode) ?? ''; - const taxAmount = calculateTaxAmount(taxPercentage, taxableAmount, transaction?.currency ?? CONST.CURRENCY.USD); - const taxAmountInSmallestCurrencyUnits = convertToBackendAmount(Number.parseFloat(taxAmount.toString())); useEffect(() => { - if (!transactionID) { + if (!shouldShowTax || !transaction) { return; } - setMoneyRequestTaxAmount(transactionID, taxAmountInSmallestCurrencyUnits); - }, [transactionID, taxAmountInSmallestCurrencyUnits]); + + let taxableAmount: number | undefined; + let taxCode: string | undefined; + if (isDistanceRequest) { + if (customUnitRateID) { + const customUnitRate = getDistanceRateCustomUnitRate(policy, customUnitRateID); + taxCode = customUnitRate?.attributes?.taxRateExternalID; + taxableAmount = DistanceRequestUtils.getTaxableAmount(policy, customUnitRateID, distance); + } + } else { + taxableAmount = transaction.amount ?? 0; + taxCode = transaction.taxCode ?? getDefaultTaxCode(policy, transaction) ?? ''; + } + + if (taxCode && taxableAmount) { + const taxPercentage = getTaxValue(policy, transaction, taxCode) ?? ''; + const taxAmount = calculateTaxAmount(taxPercentage, taxableAmount, transaction.currency); + const taxAmountInSmallestCurrencyUnits = convertToBackendAmount(Number.parseFloat(taxAmount.toString())); + + // Only update if the calculated tax amount is different from the current one + if (transaction.taxAmount !== taxAmountInSmallestCurrencyUnits) { + setMoneyRequestTaxAmount(transaction.transactionID, taxAmountInSmallestCurrencyUnits); + } + } + }, [policy, shouldShowTax, transaction, isDistanceRequest, customUnitRateID, distance]); // If completing a split expense fails, set didConfirm to false to allow the user to edit the fields again if (isEditingSplitBill && didConfirm) { @@ -945,7 +964,6 @@ function MoneyRequestConfirmationList({ routeError, isDelegateAccessRestricted, showDelegateNoAccessModal, - setDidConfirmSplit, ], ); From 12669ce691c3ef880f4a9f16a79f9baa1e1fd4a2 Mon Sep 17 00:00:00 2001 From: Ben Limpich Date: Fri, 24 Oct 2025 09:48:25 -0700 Subject: [PATCH 2/3] Revert "Merge pull request #73361 from Expensify/Rory-ChangeTaxOnConfirmPage" This reverts commit 6dbd7cc989f6031288cd977355eb19f1679fb091, reversing changes made to ed2c73d413b8ef1cafd93a51259178ffc6206102. --- src/components/MoneyRequestConfirmationList.tsx | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/components/MoneyRequestConfirmationList.tsx b/src/components/MoneyRequestConfirmationList.tsx index 6d153dd561830..57b2905f5e15b 100755 --- a/src/components/MoneyRequestConfirmationList.tsx +++ b/src/components/MoneyRequestConfirmationList.tsx @@ -332,14 +332,19 @@ function MoneyRequestConfirmationList({ const shouldShowTax = isTaxTrackingEnabled(isPolicyExpenseChat, policy, isDistanceRequest, isPerDiemRequest); - // Update the tax code when the default changes (for example, because the transaction currency changed) - const defaultTaxCode = getDefaultTaxCode(policy, transaction) ?? ''; useEffect(() => { - if (!transactionID) { + // Set the default tax code when conditions change + if (!shouldShowTax || !transaction || !transactionID) { return; } - setMoneyRequestTaxRate(transactionID, defaultTaxCode); - }, [defaultTaxCode, transactionID]); + const defaultTaxCode = getDefaultTaxCode(policy, transaction); + const currentTaxCode = transaction.taxCode ?? ''; + + // Update tax code if it's different from what should be the default + if (defaultTaxCode !== currentTaxCode) { + setMoneyRequestTaxRate(transactionID, defaultTaxCode ?? ''); + } + }, [customUnitRateID, policy, shouldShowTax, transaction, transactionID]); const isMovingTransactionFromTrackExpense = isMovingTransactionFromTrackExpenseUtil(action); From 2e46e2dda4a1e9c50a0908743ba087cc7ec8453b Mon Sep 17 00:00:00 2001 From: Ben Limpich Date: Fri, 24 Oct 2025 09:48:45 -0700 Subject: [PATCH 3/3] Revert "Merge pull request #73045 from Expensify/Rory-TaxUpdatingForWaypoints" This reverts commit 63e72de9d2b268ee3d16ffc75515827ef9f4a325, reversing changes made to 001dd99a87f6563e46c6fcd157b6dd68f34ac2cc. --- .../MoneyRequestConfirmationList.tsx | 57 +++++++++++++------ 1 file changed, 41 insertions(+), 16 deletions(-) diff --git a/src/components/MoneyRequestConfirmationList.tsx b/src/components/MoneyRequestConfirmationList.tsx index 57b2905f5e15b..8928b0efb7390 100755 --- a/src/components/MoneyRequestConfirmationList.tsx +++ b/src/components/MoneyRequestConfirmationList.tsx @@ -332,19 +332,27 @@ function MoneyRequestConfirmationList({ const shouldShowTax = isTaxTrackingEnabled(isPolicyExpenseChat, policy, isDistanceRequest, isPerDiemRequest); + const previousTransactionAmount = usePrevious(transaction?.amount); + const previousTransactionCurrency = usePrevious(transaction?.currency); + const previousTransactionModifiedCurrency = usePrevious(transaction?.modifiedCurrency); + const previousCustomUnitRateID = usePrevious(customUnitRateID); useEffect(() => { - // Set the default tax code when conditions change - if (!shouldShowTax || !transaction || !transactionID) { + // previousTransaction is in the condition because if it is falsy, it means this is the first time the useEffect is triggered after we load it, so we should calculate the default + // tax even if the other parameters are the same against their previous values. + if ( + !shouldShowTax || + !transaction || + !transactionID || + (transaction.taxCode && + previousTransactionModifiedCurrency === transaction.modifiedCurrency && + previousTransactionCurrency === transaction.currency && + previousCustomUnitRateID === customUnitRateID) + ) { return; } const defaultTaxCode = getDefaultTaxCode(policy, transaction); - const currentTaxCode = transaction.taxCode ?? ''; - - // Update tax code if it's different from what should be the default - if (defaultTaxCode !== currentTaxCode) { - setMoneyRequestTaxRate(transactionID, defaultTaxCode ?? ''); - } - }, [customUnitRateID, policy, shouldShowTax, transaction, transactionID]); + setMoneyRequestTaxRate(transactionID, defaultTaxCode ?? ''); + }, [customUnitRateID, policy, previousCustomUnitRateID, previousTransactionCurrency, previousTransactionModifiedCurrency, shouldShowTax, transaction, transactionID]); const isMovingTransactionFromTrackExpense = isMovingTransactionFromTrackExpenseUtil(action); @@ -479,9 +487,19 @@ function MoneyRequestConfirmationList({ } }, [shouldCalculateDistanceAmount, isReadOnly, distanceRequestAmount, transactionID, currency, isTypeSplit, isPolicyExpenseChat, selectedParticipantsProp, transaction]); + const previousTaxCode = usePrevious(transaction?.taxCode); + // Calculate and set tax amount in transaction draft useEffect(() => { - if (!shouldShowTax || !transaction) { + if ( + !shouldShowTax || + !transaction || + (transaction.taxAmount !== undefined && + previousTransactionAmount === transaction.amount && + previousTransactionCurrency === transaction.currency && + previousCustomUnitRateID === customUnitRateID && + previousTaxCode === transaction.taxCode) + ) { return; } @@ -502,13 +520,20 @@ function MoneyRequestConfirmationList({ const taxPercentage = getTaxValue(policy, transaction, taxCode) ?? ''; const taxAmount = calculateTaxAmount(taxPercentage, taxableAmount, transaction.currency); const taxAmountInSmallestCurrencyUnits = convertToBackendAmount(Number.parseFloat(taxAmount.toString())); - - // Only update if the calculated tax amount is different from the current one - if (transaction.taxAmount !== taxAmountInSmallestCurrencyUnits) { - setMoneyRequestTaxAmount(transaction.transactionID, taxAmountInSmallestCurrencyUnits); - } + setMoneyRequestTaxAmount(transaction.transactionID, taxAmountInSmallestCurrencyUnits); } - }, [policy, shouldShowTax, transaction, isDistanceRequest, customUnitRateID, distance]); + }, [ + policy, + shouldShowTax, + previousTransactionAmount, + previousTransactionCurrency, + transaction, + isDistanceRequest, + customUnitRateID, + previousCustomUnitRateID, + previousTaxCode, + distance, + ]); // If completing a split expense fails, set didConfirm to false to allow the user to edit the fields again if (isEditingSplitBill && didConfirm) {