Skip to content

Commit a06a1e9

Browse files
authored
Merge pull request Expensify#77741 from Expensify/revert-76636-feat/72238-taxes-field-v2
[CP Staging][Fix Deploy Blocker] Revert "Tax field on unreported expense"
2 parents 6a6de6c + 12e22e3 commit a06a1e9

12 files changed

Lines changed: 28 additions & 120 deletions

src/components/MoneyRequestConfirmationList.tsx

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -253,8 +253,6 @@ function MoneyRequestConfirmationList({
253253
selector: mileageRateSelector,
254254
canBeMissing: true,
255255
});
256-
const {policyForMovingExpenses} = usePolicyForMovingExpenses();
257-
const isMovingTransactionFromTrackExpense = isMovingTransactionFromTrackExpenseUtil(action);
258256
const [defaultMileageRateReal] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {
259257
selector: mileageRateSelector,
260258
canBeMissing: true,
@@ -282,6 +280,7 @@ function MoneyRequestConfirmationList({
282280
isTestDriveReceipt || isManagerMcTestReceipt,
283281
);
284282

283+
const {policyForMovingExpenses} = usePolicyForMovingExpenses();
285284
const isTrackExpense = iouType === CONST.IOU.TYPE.TRACK;
286285
const policy = isTrackExpense ? policyForMovingExpenses : (policyReal ?? policyDraft);
287286
const policyCategories = policyCategoriesReal ?? policyCategoriesDraft;
@@ -299,6 +298,7 @@ function MoneyRequestConfirmationList({
299298
const isTypeInvoice = iouType === CONST.IOU.TYPE.INVOICE;
300299
const isScanRequest = useMemo(() => isScanRequestUtil(transaction), [transaction]);
301300
const isCreateExpenseFlow = !!transaction?.isFromGlobalCreate && !isPerDiemRequest;
301+
const isMovingTransactionFromTrackExpense = isMovingTransactionFromTrackExpenseUtil(action);
302302

303303
const transactionID = transaction?.transactionID;
304304
const customUnitRateID = getRateID(transaction);
@@ -342,18 +342,16 @@ function MoneyRequestConfirmationList({
342342

343343
const policyTagLists = useMemo(() => getTagLists(policyTags), [policyTags]);
344344

345-
const shouldShowTax = isTaxTrackingEnabled(isPolicyExpenseChat || isTrackExpense, policy, isDistanceRequest, isPerDiemRequest);
345+
const shouldShowTax = isTaxTrackingEnabled(isPolicyExpenseChat, policy, isDistanceRequest, isPerDiemRequest);
346346

347347
// Update the tax code when the default changes (for example, because the transaction currency changed)
348-
const defaultTaxCode = getDefaultTaxCode(policy, transaction) ?? (isMovingTransactionFromTrackExpense ? (getDefaultTaxCode(policyForMovingExpenses, transaction) ?? '') : '');
349-
348+
const defaultTaxCode = getDefaultTaxCode(policy, transaction) ?? '';
350349
useEffect(() => {
351-
if (!transactionID || isReadOnly || !shouldShowTax || isMovingTransactionFromTrackExpense) {
350+
if (!transactionID || isReadOnly || !shouldShowTax) {
352351
return;
353352
}
354353
setMoneyRequestTaxRate(transactionID, defaultTaxCode);
355-
// trigger this useEffect also when policyID changes - the defaultTaxCode may stay the same
356-
}, [defaultTaxCode, isMovingTransactionFromTrackExpense, isReadOnly, transactionID, policyID, shouldShowTax]);
354+
}, [defaultTaxCode, transactionID, isReadOnly, shouldShowTax]);
357355

358356
const distance = getDistanceInMeters(transaction, unit);
359357
const prevDistance = usePrevious(distance);
@@ -504,18 +502,15 @@ function MoneyRequestConfirmationList({
504502

505503
// Calculate and set tax amount in transaction draft
506504
const taxableAmount = isDistanceRequest ? DistanceRequestUtils.getTaxableAmount(policy, customUnitRateID, distance) : (transaction?.amount ?? 0);
507-
// 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)
508-
const taxPercentage =
509-
getTaxValue(policy, transaction, transaction?.taxCode ?? defaultTaxCode) ??
510-
(isMovingTransactionFromTrackExpense ? getTaxValue(policyForMovingExpenses, transaction, transaction?.taxCode ?? defaultTaxCode) : '');
505+
const taxPercentage = getTaxValue(policy, transaction, transaction?.taxCode ?? defaultTaxCode) ?? '';
511506
const taxAmount = calculateTaxAmount(taxPercentage, taxableAmount, transaction?.currency ?? CONST.CURRENCY.USD);
512507
const taxAmountInSmallestCurrencyUnits = convertToBackendAmount(Number.parseFloat(taxAmount.toString()));
513508
useEffect(() => {
514-
if (!transactionID || isMovingTransactionFromTrackExpense || isReadOnly || !shouldShowTax) {
509+
if (!transactionID || isReadOnly || !shouldShowTax) {
515510
return;
516511
}
517512
setMoneyRequestTaxAmount(transactionID, taxAmountInSmallestCurrencyUnits);
518-
}, [transactionID, taxAmountInSmallestCurrencyUnits, isMovingTransactionFromTrackExpense, isReadOnly, shouldShowTax]);
513+
}, [transactionID, taxAmountInSmallestCurrencyUnits, isReadOnly, shouldShowTax]);
519514

520515
// If completing a split expense fails, set didConfirm to false to allow the user to edit the fields again
521516
if (isEditingSplitBill && didConfirm) {
@@ -840,7 +835,7 @@ function MoneyRequestConfirmationList({
840835
if (!transactionID || iouCategory || !shouldShowCategories || enabledCategories.length !== 1 || !isCategoryRequired) {
841836
return;
842837
}
843-
setMoneyRequestCategory(transactionID, enabledCategories.at(0)?.name ?? '', policy, isMovingTransactionFromTrackExpense);
838+
setMoneyRequestCategory(transactionID, enabledCategories.at(0)?.name ?? '', policy);
844839
// Keep 'transaction' out to ensure that we auto select the option only once
845840
// eslint-disable-next-line react-compiler/react-compiler, react-hooks/exhaustive-deps
846841
}, [shouldShowCategories, policyCategories, isCategoryRequired, policy?.id]);
@@ -924,11 +919,6 @@ function MoneyRequestConfirmationList({
924919
return;
925920
}
926921

927-
if (shouldShowTax && !Object.keys(policy?.taxRates?.taxes ?? {}).some((key) => key === transaction.taxCode)) {
928-
setFormError('violations.taxOutOfPolicy');
929-
return;
930-
}
931-
932922
if (isPerDiemRequest && (transaction.comment?.customUnit?.subRates ?? []).length === 0) {
933923
setFormError('iou.error.invalidSubrateLength');
934924
return;
@@ -986,7 +976,6 @@ function MoneyRequestConfirmationList({
986976
isMerchantRequired,
987977
isMerchantEmpty,
988978
shouldDisplayFieldError,
989-
shouldShowTax,
990979
transaction,
991980
policyTags,
992981
isPerDiemRequest,

src/components/MoneyRequestConfirmationListFooter.tsx

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,12 @@ import useThemeStyles from '@hooks/useThemeStyles';
1616
import {getDecodedCategoryName} from '@libs/CategoryUtils';
1717
import {convertToDisplayString} from '@libs/CurrencyUtils';
1818
import DistanceRequestUtils from '@libs/DistanceRequestUtils';
19-
import {isMovingTransactionFromTrackExpense, shouldShowReceiptEmptyState} from '@libs/IOUUtils';
19+
import {shouldShowReceiptEmptyState} from '@libs/IOUUtils';
2020
import Navigation from '@libs/Navigation/Navigation';
2121
import {getDestinationForDisplay, getSubratesFields, getSubratesForDisplay, getTimeDifferenceIntervals, getTimeForDisplay} from '@libs/PerDiemRequestUtils';
2222
import {canSendInvoice, getPerDiemCustomUnit} from '@libs/PolicyUtils';
2323
import type {ThumbnailAndImageURI} from '@libs/ReceiptUtils';
2424
import {getThumbnailAndImageURIs} from '@libs/ReceiptUtils';
25-
// eslint-disable-next-line @typescript-eslint/no-deprecated
2625
import {generateReportID, getDefaultWorkspaceAvatar, getOutstandingReportsForUser, getReportName, isArchivedReport, isMoneyRequestReport, isReportOutstanding} from '@libs/ReportUtils';
2726
import {getTagVisibility, hasEnabledTags} from '@libs/TagsOptionsListUtils';
2827
import {
@@ -275,7 +274,7 @@ function MoneyRequestConfirmationListFooter({
275274
const [outstandingReportsByPolicyID] = useOnyx(ONYXKEYS.DERIVED.OUTSTANDING_REPORTS_BY_POLICY_ID, {
276275
canBeMissing: true,
277276
});
278-
const {policyForMovingExpensesID, policyForMovingExpenses, shouldSelectPolicy} = usePolicyForMovingExpenses();
277+
const {policyForMovingExpensesID, shouldSelectPolicy} = usePolicyForMovingExpenses();
279278

280279
const [currentUserLogin] = useOnyx(ONYXKEYS.SESSION, {selector: emailSelector, canBeMissing: true});
281280
const isUnreported = transaction?.reportID === CONST.REPORT.UNREPORTED_REPORT_ID;
@@ -347,7 +346,6 @@ function MoneyRequestConfirmationListFooter({
347346
}, [allReports, shouldUseTransactionReport, transaction?.reportID, outstandingReportID]);
348347

349348
const reportName = useMemo(() => {
350-
// eslint-disable-next-line @typescript-eslint/no-deprecated
351349
const name = getReportName(selectedReport, selectedPolicy);
352350
if (!name) {
353351
return isUnreported ? translate('common.none') : translate('iou.newReport');
@@ -357,13 +355,11 @@ function MoneyRequestConfirmationListFooter({
357355

358356
const shouldReportBeEditableFromFAB = isUnreported ? allOutstandingReports.length >= 1 : allOutstandingReports.length > 1;
359357

360-
const isMovingCurrentTransactionFromTrackExpense = isMovingTransactionFromTrackExpense(action);
361-
362358
// When creating an expense in an individual report, the report field becomes read-only
363359
// since the destination is already determined and there's no need to show a selectable list.
364360
const shouldReportBeEditable = (isFromGlobalCreate ? shouldReportBeEditableFromFAB : availableOutstandingReports.length > 1) && !isMoneyRequestReport(reportID, allReports);
365361

366-
const taxRates = policy?.taxRates ?? (isMovingCurrentTransactionFromTrackExpense ? policyForMovingExpenses?.taxRates : null);
362+
const taxRates = policy?.taxRates ?? null;
367363
// In Send Money and Split Bill with Scan flow, we don't allow the Merchant or Date to be edited. For distance requests, don't show the merchant as there's already another "Distance" menu item
368364
const shouldShowDate = shouldShowSmartScanFields || isDistanceRequest;
369365
// Determines whether the tax fields can be modified.
@@ -378,19 +374,11 @@ function MoneyRequestConfirmationListFooter({
378374
const taxAmount = getTaxAmount(transaction, false);
379375
const formattedTaxAmount = convertToDisplayString(taxAmount, iouCurrencyCode);
380376
// Get the tax rate title based on the policy and transaction
381-
let taxRateTitle;
382-
if (getTaxName(policy, transaction)) {
383-
taxRateTitle = getTaxName(policy, transaction);
384-
} else if (isMovingCurrentTransactionFromTrackExpense) {
385-
taxRateTitle = getTaxName(policyForMovingExpenses, transaction);
386-
} else {
387-
taxRateTitle = '';
388-
}
377+
const taxRateTitle = getTaxName(policy, transaction);
389378
// Determine if the merchant error should be displayed
390379
const shouldDisplayMerchantError = isMerchantRequired && (shouldDisplayFieldError || formError === 'iou.error.invalidMerchant') && isMerchantEmpty;
391380
const shouldDisplayDistanceRateError = formError === 'iou.error.invalidRate';
392381
const shouldDisplayTagError = formError === 'violations.tagOutOfPolicy';
393-
const shouldDisplayTaxRateError = formError === 'violations.taxOutOfPolicy';
394382
const shouldDisplayCategoryError = formError === 'violations.categoryOutOfPolicy';
395383

396384
const showReceiptEmptyState = shouldShowReceiptEmptyState(iouType, action, policy, isPerDiemRequest);
@@ -709,8 +697,6 @@ function MoneyRequestConfirmationListFooter({
709697
}}
710698
disabled={didConfirm}
711699
interactive={canModifyTaxFields}
712-
brickRoadIndicator={shouldDisplayTaxRateError ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined}
713-
errorText={shouldDisplayTaxRateError ? translate(formError) : ''}
714700
/>
715701
),
716702
shouldShow: shouldShowTax,

src/components/ReportActionItem/MoneyRequestView.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@ function MoneyRequestView({
345345
const canEditReimbursable = isEditable && canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.REIMBURSABLE, undefined, isChatReportArchived);
346346
const shouldShowAttendees = useMemo(() => shouldShowAttendeesTransactionUtils(iouType, policy), [iouType, policy]);
347347

348-
const shouldShowTax = isTaxTrackingEnabled(isPolicyExpenseChat || isExpenseUnreported, policy, isDistanceRequest, isPerDiemRequest);
348+
const shouldShowTax = isTaxTrackingEnabled(isPolicyExpenseChat, policy, isDistanceRequest, isPerDiemRequest);
349349
const tripID = getTripIDFromTransactionParentReportID(parentReport?.parentReportID);
350350
const shouldShowViewTripDetails = hasReservationList(transaction) && !!tripID;
351351

src/hooks/usePolicyForTransaction.ts

Lines changed: 0 additions & 39 deletions
This file was deleted.

src/libs/PolicyUtils.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -594,13 +594,13 @@ function isCollectPolicy(policy: OnyxEntry<Policy>): boolean {
594594
return policy?.type === CONST.POLICY.TYPE.TEAM;
595595
}
596596

597-
function isTaxTrackingEnabled(isPolicyExpenseChatOrUnreportedExpense: boolean, policy: OnyxEntry<Policy>, isDistanceRequest: boolean, isPerDiemRequest = false): boolean {
597+
function isTaxTrackingEnabled(isPolicyExpenseChat: boolean, policy: OnyxEntry<Policy>, isDistanceRequest: boolean, isPerDiemRequest = false): boolean {
598598
if (isPerDiemRequest) {
599599
return false;
600600
}
601601
const distanceUnit = getDistanceRateCustomUnit(policy);
602602
const customUnitID = distanceUnit?.customUnitID ?? CONST.DEFAULT_NUMBER_ID;
603-
const isPolicyTaxTrackingEnabled = isPolicyExpenseChatOrUnreportedExpense && policy?.tax?.trackingEnabled;
603+
const isPolicyTaxTrackingEnabled = isPolicyExpenseChat && policy?.tax?.trackingEnabled;
604604
const isTaxEnabledForDistance = isPolicyTaxTrackingEnabled && !!customUnitID && policy?.customUnits?.[customUnitID]?.attributes?.taxEnabled;
605605

606606
return !!(isDistanceRequest ? isTaxEnabledForDistance : isPolicyTaxTrackingEnabled);

src/libs/TransactionUtils/index.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1739,9 +1739,7 @@ function getWorkspaceTaxesSettingsName(policy: OnyxEntry<Policy>, taxCode: strin
17391739
*/
17401740
function getTaxName(policy: OnyxEntry<Policy>, transaction: OnyxEntry<Transaction>) {
17411741
const defaultTaxCode = getDefaultTaxCode(policy, transaction);
1742-
// transaction?.taxCode may be an empty string
1743-
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
1744-
return Object.values(transformedTaxRates(policy, transaction)).find((taxRate) => taxRate.code === (transaction?.taxCode || defaultTaxCode))?.modifiedName;
1742+
return Object.values(transformedTaxRates(policy, transaction)).find((taxRate) => taxRate.code === (transaction?.taxCode ?? defaultTaxCode))?.modifiedName;
17451743
}
17461744

17471745
type FieldsToCompare = Record<string, Array<keyof Transaction>>;

src/libs/actions/IOU.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1249,13 +1249,9 @@ function setMoneyRequestPendingFields(transactionID: string, pendingFields: Onyx
12491249
* @param transactionID - The transaction ID
12501250
* @param category - The category name
12511251
* @param policy - The policy object, or undefined for P2P transactions where tax info should be cleared
1252-
* @param isMovingFromTrackExpense - If the expense is moved from Track Expense
12531252
*/
1254-
function setMoneyRequestCategory(transactionID: string, category: string, policy: OnyxEntry<OnyxTypes.Policy>, isMovingFromTrackExpense?: boolean) {
1253+
function setMoneyRequestCategory(transactionID: string, category: string, policy: OnyxEntry<OnyxTypes.Policy>) {
12551254
Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID}`, {category});
1256-
if (isMovingFromTrackExpense) {
1257-
return;
1258-
}
12591255
if (!policy) {
12601256
setMoneyRequestTaxRate(transactionID, '');
12611257
setMoneyRequestTaxAmount(transactionID, null);
@@ -6266,7 +6262,7 @@ function requestMoney(requestMoneyInformation: RequestMoneyInformation): {iouRep
62666262
category,
62676263
tag,
62686264
taxCode,
6269-
taxAmount: Math.abs(taxAmount),
6265+
taxAmount,
62706266
billable,
62716267
policyID: chatReport.policyID,
62726268
waypoints: sanitizedWaypoints,
@@ -11895,7 +11891,6 @@ function completePaymentOnboarding(
1189511891
shouldSkipTestDriveModal: true,
1189611892
});
1189711893
}
11898-
1189911894
function payMoneyRequest(
1190011895
paymentType: PaymentMethodType,
1190111896
chatReport: OnyxTypes.Report,

src/pages/iou/request/step/IOURequestStepAmount.tsx

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import useLocalize from '@hooks/useLocalize';
1111
import useOnyx from '@hooks/useOnyx';
1212
import usePermissions from '@hooks/usePermissions';
1313
import usePersonalPolicy from '@hooks/usePersonalPolicy';
14-
import usePolicyForMovingExpenses from '@hooks/usePolicyForMovingExpenses';
1514
import useReportIsArchived from '@hooks/useReportIsArchived';
1615
import useShowNotFoundPageInIOUStep from '@hooks/useShowNotFoundPageInIOUStep';
1716
import {setTransactionReport} from '@libs/actions/Transaction';
@@ -80,9 +79,7 @@ function IOURequestStepAmount({
8079
const focusTimeoutRef = useRef<NodeJS.Timeout | null>(null);
8180
const isSaveButtonPressed = useRef(false);
8281
const iouRequestType = getRequestType(transaction);
83-
const isTrackExpense = iouType === CONST.IOU.TYPE.TRACK;
84-
const {policyForMovingExpensesID} = usePolicyForMovingExpenses();
85-
const policyID = isTrackExpense ? policyForMovingExpensesID : report?.policyID;
82+
const policyID = report?.policyID;
8683

8784
const isReportArchived = useReportIsArchived(report?.reportID);
8885
const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {canBeMissing: true});

src/pages/iou/request/step/IOURequestStepConfirmation.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -398,7 +398,7 @@ function IOURequestStepConfirmation({
398398
if (!isDistanceRequest || !!item?.category) {
399399
continue;
400400
}
401-
setMoneyRequestCategory(item.transactionID, defaultCategory, policy, isMovingTransactionFromTrackExpense);
401+
setMoneyRequestCategory(item.transactionID, defaultCategory, policy);
402402
}
403403
// Prevent resetting to default when unselect category
404404
// eslint-disable-next-line react-compiler/react-compiler, react-hooks/exhaustive-deps

0 commit comments

Comments
 (0)