diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 43da6f6c7cb6..2109a050227f 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -1005,6 +1005,16 @@ const ROUTES = { return getUrlWithBackToParam(`${action as string}/${iouType as string}/distance/${transactionID}/${reportID}${reportActionID ? `/${reportActionID}` : ''}`, backTo); }, }, + MONEY_REQUEST_STEP_DISTANCE_MANUAL: { + route: ':action/:iouType/distance-manual/:transactionID/:reportID/:reportActionID?', + getRoute: (action: IOUAction, iouType: IOUType, transactionID: string | undefined, reportID: string | undefined, backTo = '', reportActionID?: string) => { + if (!transactionID || !reportID) { + Log.warn('Invalid transactionID or reportID is used to build the MONEY_REQUEST_STEP_DISTANCE_MANUAL route'); + } + // eslint-disable-next-line no-restricted-syntax -- Legacy route generation + return getUrlWithBackToParam(`${action as string}/${iouType as string}/distance-manual/${transactionID}/${reportID}${reportActionID ? `/${reportActionID}` : ''}`, backTo); + }, + }, MONEY_REQUEST_STEP_DISTANCE_RATE: { route: ':action/:iouType/distanceRate/:transactionID/:reportID/:reportActionID?', getRoute: (action: IOUAction, iouType: IOUType, transactionID: string | undefined, reportID: string | undefined, backTo = '', reportActionID?: string) => { diff --git a/src/components/MoneyRequestConfirmationListFooter.tsx b/src/components/MoneyRequestConfirmationListFooter.tsx index 4faf714176a4..6d01676b87b7 100644 --- a/src/components/MoneyRequestConfirmationListFooter.tsx +++ b/src/components/MoneyRequestConfirmationListFooter.tsx @@ -473,6 +473,11 @@ function MoneyRequestConfirmationListFooter({ return; } + if (isManualDistanceRequest) { + Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_DISTANCE_MANUAL.getRoute(action, iouType, transactionID, reportID, Navigation.getActiveRoute(), reportActionID)); + return; + } + Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_DISTANCE.getRoute(action, iouType, transactionID, reportID, Navigation.getActiveRoute(), reportActionID)); }} disabled={didConfirm} diff --git a/src/components/ReportActionItem/MoneyRequestView.tsx b/src/components/ReportActionItem/MoneyRequestView.tsx index 64a4867ef2d3..3e150155be73 100644 --- a/src/components/ReportActionItem/MoneyRequestView.tsx +++ b/src/components/ReportActionItem/MoneyRequestView.tsx @@ -434,6 +434,14 @@ function MoneyRequestView({ if (!transaction?.transactionID || !report?.reportID) { return; } + + if (isManualDistanceRequest) { + Navigation.navigate( + ROUTES.MONEY_REQUEST_STEP_DISTANCE_MANUAL.getRoute(CONST.IOU.ACTION.EDIT, iouType, transaction.transactionID, report.reportID, getReportRHPActiveRoute()), + ); + return; + } + Navigation.navigate( ROUTES.MONEY_REQUEST_STEP_DISTANCE.getRoute(CONST.IOU.ACTION.EDIT, iouType, transaction.transactionID, report.reportID, getReportRHPActiveRoute()), ); diff --git a/src/libs/Navigation/linkingConfig/config.ts b/src/libs/Navigation/linkingConfig/config.ts index 9b229efdabcd..024bdfa1e3b7 100644 --- a/src/libs/Navigation/linkingConfig/config.ts +++ b/src/libs/Navigation/linkingConfig/config.ts @@ -1326,6 +1326,7 @@ const config: LinkingOptions['config'] = { [SCREENS.MONEY_REQUEST.STEP_DATE]: ROUTES.MONEY_REQUEST_STEP_DATE.route, [SCREENS.MONEY_REQUEST.STEP_DESCRIPTION]: ROUTES.MONEY_REQUEST_STEP_DESCRIPTION.route, [SCREENS.MONEY_REQUEST.STEP_DISTANCE]: ROUTES.MONEY_REQUEST_STEP_DISTANCE.route, + [SCREENS.MONEY_REQUEST.STEP_DISTANCE_MANUAL]: ROUTES.MONEY_REQUEST_STEP_DISTANCE_MANUAL.route, [SCREENS.MONEY_REQUEST.STEP_DISTANCE_RATE]: ROUTES.MONEY_REQUEST_STEP_DISTANCE_RATE.route, [SCREENS.MONEY_REQUEST.HOLD]: ROUTES.MONEY_REQUEST_HOLD_REASON.route, [SCREENS.MONEY_REQUEST.REJECT]: ROUTES.REJECT_MONEY_REQUEST_REASON.route, diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index 73a470784caf..9647a423aa27 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -1396,6 +1396,24 @@ type MoneyRequestNavigatorParamList = { backToReport?: string; reportActionID?: string; }; + [SCREENS.MONEY_REQUEST.STEP_DISTANCE_MAP]: { + action: IOUAction; + iouType: IOUType; + transactionID: string; + reportID: string; + backTo: Routes; + backToReport?: string; + reportActionID?: string; + }; + [SCREENS.MONEY_REQUEST.STEP_DISTANCE_MANUAL]: { + action: IOUAction; + iouType: IOUType; + transactionID: string; + reportID: string; + backTo: Routes; + backToReport?: string; + reportActionID?: string; + }; [SCREENS.MONEY_REQUEST.CREATE]: { iouType: IOUType; reportID: string; @@ -1569,23 +1587,6 @@ type MoneyRequestNavigatorParamList = { backToReport?: string; reportActionID?: string; }; - [SCREENS.MONEY_REQUEST.STEP_DISTANCE_MANUAL]: { - action: IOUAction; - iouType: IOUType; - transactionID: string; - reportID: string; - backTo: Routes; - backToReport?: string; - }; - [SCREENS.MONEY_REQUEST.STEP_DISTANCE_MAP]: { - action: IOUAction; - iouType: IOUType; - transactionID: string; - reportID: string; - backTo: Routes; - backToReport?: string; - reportActionID?: string; - }; }; type WorkspaceConfirmationNavigatorParamList = { diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index c0a0c0c26c78..4ec6be04b2c1 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -257,7 +257,7 @@ import { isDistanceRequest, isExpensifyCardTransaction, isFetchingWaypointsFromServer, - isManualDistanceRequest, + isManualDistanceRequest as isManualDistanceRequestTransactionUtils, isOnHold as isOnHoldTransactionUtils, isPayAtEndExpense, isPending, @@ -717,6 +717,7 @@ type TransactionDetails = { originalAmount: number; originalCurrency: string; postedDate: string; + distance?: number; }; type OptimisticIOUReport = Pick< @@ -4022,6 +4023,8 @@ function getTransactionDetails( return; } const report = getReportOrDraftReport(transaction?.reportID); + const isManualDistanceRequest = isManualDistanceRequestTransactionUtils(transaction); + return { created: getFormattedCreated(transaction, createdDateFormat), amount: getTransactionAmount(transaction, !isEmptyObject(report) && isExpenseReport(report), transaction?.reportID === CONST.REPORT.UNREPORTED_REPORT_ID), @@ -4043,6 +4046,7 @@ function getTransactionDetails( originalAmount: getOriginalAmount(transaction), originalCurrency: getOriginalCurrency(transaction), postedDate: getFormattedPostedDate(transaction), + ...(isManualDistanceRequest && {distance: transaction.comment?.customUnit?.quantity ?? undefined}), }; } @@ -4291,7 +4295,7 @@ function canEditFieldOfMoneyRequest( !isInvoiceReport(moneyRequestReport) && !isReceiptBeingScanned(transaction) && !isPerDiemRequest(transaction) && - (!isDistanceRequest(transaction) || isManualDistanceRequest(transaction)) && + (!isDistanceRequest(transaction) || isManualDistanceRequestTransactionUtils(transaction)) && (isAdmin || isManager || isRequestor) && (isDeleteAction ? isRequestor : true) ); @@ -4877,15 +4881,19 @@ function getModifiedExpenseOriginalMessage( originalMessage.billable = transactionChanges?.billable ? translateLocal('common.billable').toLowerCase() : translateLocal('common.nonBillable').toLowerCase(); } - if ('customUnitRateID' in transactionChanges && updatedTransaction?.comment?.customUnit?.customUnitRateID) { + if ( + // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing + ('customUnitRateID' in transactionChanges && updatedTransaction?.comment?.customUnit?.customUnitRateID) || + ('distance' in transactionChanges && updatedTransaction?.comment?.customUnit?.quantity) + ) { originalMessage.oldAmount = getTransactionAmount(oldTransaction, isFromExpenseReport); originalMessage.oldCurrency = getCurrency(oldTransaction); originalMessage.oldMerchant = getMerchant(oldTransaction); // For the originalMessage, we should use the non-negative amount, similar to what getAmount does for oldAmount - originalMessage.amount = Math.abs(updatedTransaction.modifiedAmount ?? 0); - originalMessage.currency = updatedTransaction.modifiedCurrency ?? CONST.CURRENCY.USD; - originalMessage.merchant = updatedTransaction.modifiedMerchant; + originalMessage.amount = Math.abs(updatedTransaction?.modifiedAmount ?? 0); + originalMessage.currency = updatedTransaction?.modifiedCurrency ?? CONST.CURRENCY.USD; + originalMessage.merchant = updatedTransaction?.modifiedMerchant; } return originalMessage; diff --git a/src/libs/TransactionUtils/index.ts b/src/libs/TransactionUtils/index.ts index 04ac998a548a..db552ff1f987 100644 --- a/src/libs/TransactionUtils/index.ts +++ b/src/libs/TransactionUtils/index.ts @@ -589,6 +589,28 @@ function getUpdatedTransaction({ updatedTransaction.receipt.state = CONST.IOU.RECEIPT_STATE.OPEN; } + if (Object.hasOwn(transactionChanges, 'distance') && typeof transactionChanges.distance === 'number') { + const distance = roundToTwoDecimalPlaces(transactionChanges.distance ?? 0); + + lodashSet(updatedTransaction, 'comment.customUnit.quantity', distance); + shouldStopSmartscan = true; + + const updatedMileageRate = DistanceRequestUtils.getRate({transaction: updatedTransaction, policy, useTransactionDistanceUnit: false}); + const {unit, rate} = updatedMileageRate; + + const distanceInMeters = getDistanceInMeters(updatedTransaction, unit); + let amount = DistanceRequestUtils.getDistanceRequestAmount(distanceInMeters, unit, rate ?? 0); + amount = isFromExpenseReport || isUnReportedExpense ? -amount : amount; + const updatedCurrency = updatedMileageRate.currency ?? CONST.CURRENCY.USD; + const updatedMerchant = DistanceRequestUtils.getDistanceMerchant(true, distanceInMeters, unit, rate, updatedCurrency, translateLocal, (digit) => + toLocaleDigit(IntlStore.getCurrentLocale(), digit), + ); + + updatedTransaction.modifiedAmount = amount; + updatedTransaction.modifiedMerchant = updatedMerchant; + updatedTransaction.modifiedCurrency = updatedCurrency; + } + updatedTransaction.pendingFields = { ...(updatedTransaction?.pendingFields ?? {}), ...(Object.hasOwn(transactionChanges, 'comment') && {comment: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE}), @@ -604,6 +626,11 @@ function getUpdatedTransaction({ ...(Object.hasOwn(transactionChanges, 'taxAmount') && {taxAmount: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE}), ...(Object.hasOwn(transactionChanges, 'taxCode') && {taxCode: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE}), ...(Object.hasOwn(transactionChanges, 'attendees') && {attendees: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE}), + ...(Object.hasOwn(transactionChanges, 'distance') && { + quantity: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, + amount: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, + merchant: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, + }), }; return updatedTransaction; diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 81fc9031992d..db47f9d3a6bf 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -4306,7 +4306,6 @@ function getUpdateMoneyRequestParams( key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, value: { ...updatedTransaction, - pendingFields, errorFields: null, }, }); @@ -4869,7 +4868,8 @@ function updateMoneyRequestTaxRate({transactionID, optimisticReportActionID, tax type UpdateMoneyRequestDistanceParams = { transactionID: string | undefined; transactionThreadReportID: string | undefined; - waypoints: WaypointCollection; + waypoints?: WaypointCollection; + distance?: number; routes?: Routes; policy?: OnyxEntry; policyTagList?: OnyxEntry; @@ -4882,6 +4882,7 @@ function updateMoneyRequestDistance({ transactionID, transactionThreadReportID, waypoints, + distance, routes = undefined, policy = {} as OnyxTypes.Policy, policyTagList = {}, @@ -4889,8 +4890,9 @@ function updateMoneyRequestDistance({ transactionBackup, }: UpdateMoneyRequestDistanceParams) { const transactionChanges: TransactionChanges = { - waypoints: sanitizeRecentWaypoints(waypoints), + ...(waypoints && {waypoints: sanitizeRecentWaypoints(waypoints)}), routes, + ...(distance && {distance}), }; const transactionThreadReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${transactionThreadReportID}`] ?? null; const parentReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${transactionThreadReport?.parentReportID}`] ?? null; @@ -4902,12 +4904,14 @@ function updateMoneyRequestDistance({ } const {params, onyxData} = data; - const recentServerValidatedWaypoints = getRecentWaypoints().filter((item) => !item.pendingAction); - onyxData?.failureData?.push({ - onyxMethod: Onyx.METHOD.SET, - key: `${ONYXKEYS.NVP_RECENT_WAYPOINTS}`, - value: recentServerValidatedWaypoints, - }); + if (!distance) { + const recentServerValidatedWaypoints = getRecentWaypoints().filter((item) => !item.pendingAction); + onyxData?.failureData?.push({ + onyxMethod: Onyx.METHOD.SET, + key: `${ONYXKEYS.NVP_RECENT_WAYPOINTS}`, + value: recentServerValidatedWaypoints, + }); + } if (transactionBackup) { const transaction = allTransactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]; diff --git a/src/pages/iou/request/step/IOURequestStepConfirmation.tsx b/src/pages/iou/request/step/IOURequestStepConfirmation.tsx index 5bce9133b576..dd6f941cdddc 100644 --- a/src/pages/iou/request/step/IOURequestStepConfirmation.tsx +++ b/src/pages/iou/request/step/IOURequestStepConfirmation.tsx @@ -43,7 +43,17 @@ import {getParticipantsOption, getReportOption} from '@libs/OptionsListUtils'; import Performance from '@libs/Performance'; import {isPaidGroupPolicy} from '@libs/PolicyUtils'; import {generateReportID, getReportOrDraftReport, isProcessingReport, isReportOutstanding, isSelectedManagerMcTest} from '@libs/ReportUtils'; -import {getAttendees, getDefaultTaxCode, getRateID, getRequestType, getValidWaypoints, hasReceipt, isScanRequest} from '@libs/TransactionUtils'; +import { + getAttendees, + getDefaultTaxCode, + getRateID, + getRequestType, + getValidWaypoints, + hasReceipt, + isDistanceRequest as isDistanceRequestTransactionUtils, + isManualDistanceRequest as isManualDistanceRequestTransactionUtils, + isScanRequest, +} from '@libs/TransactionUtils'; import type {FileObject} from '@pages/media/AttachmentModalScreen/types'; import type {GpsPoint} from '@userActions/IOU'; import { @@ -174,9 +184,8 @@ function IOURequestStepConfirmation({ const [receiptFiles, setReceiptFiles] = useState>({}); const requestType = getRequestType(transaction, isBetaEnabled(CONST.BETAS.MANUAL_DISTANCE)); - const isDistanceRequest = - requestType === CONST.IOU.REQUEST_TYPE.DISTANCE || requestType === CONST.IOU.REQUEST_TYPE.DISTANCE_MAP || requestType === CONST.IOU.REQUEST_TYPE.DISTANCE_MANUAL; - const isManualDistanceRequest = requestType === CONST.IOU.REQUEST_TYPE.DISTANCE_MANUAL; + const isDistanceRequest = isDistanceRequestTransactionUtils(transaction); + const isManualDistanceRequest = isManualDistanceRequestTransactionUtils(transaction); const isPerDiemRequest = requestType === CONST.IOU.REQUEST_TYPE.PER_DIEM; const [lastLocationPermissionPrompt] = useOnyx(ONYXKEYS.NVP_LAST_LOCATION_PERMISSION_PROMPT, {canBeMissing: true}); diff --git a/src/pages/iou/request/step/IOURequestStepDistanceManual.tsx b/src/pages/iou/request/step/IOURequestStepDistanceManual.tsx index 0d09f55ab550..fb9bc98ef5b6 100644 --- a/src/pages/iou/request/step/IOURequestStepDistanceManual.tsx +++ b/src/pages/iou/request/step/IOURequestStepDistanceManual.tsx @@ -22,10 +22,11 @@ import { setMoneyRequestParticipantsFromReport, setMoneyRequestPendingFields, trackExpense, + updateMoneyRequestDistance, } from '@libs/actions/IOU'; import {canUseTouchScreen} from '@libs/DeviceCapabilities'; import DistanceRequestUtils from '@libs/DistanceRequestUtils'; -import {navigateToParticipantPage} from '@libs/IOUUtils'; +import {navigateToParticipantPage, shouldUseTransactionDraft} from '@libs/IOUUtils'; import Navigation from '@libs/Navigation/Navigation'; import {roundToTwoDecimalPlaces} from '@libs/NumberUtils'; import {getParticipantsOption, getReportOption} from '@libs/OptionsListUtils'; @@ -80,9 +81,10 @@ function IOURequestStepDistanceManual({ const [reportAttributesDerived] = useOnyx(ONYXKEYS.DERIVED.REPORT_ATTRIBUTES, {canBeMissing: true, selector: (val) => val?.reports}); const isEditing = action === CONST.IOU.ACTION.EDIT; - const isSplitBill = iouType === CONST.IOU.TYPE.SPLIT; const isCreatingNewRequest = !(backTo || isEditing); + const isTransactionDraft = shouldUseTransactionDraft(action, iouType); + const customUnitRateID = getRateID(transaction); const unit = DistanceRequestUtils.getRate({transaction, policy}).unit; const distance = transaction?.comment?.customUnit?.quantity ? roundToTwoDecimalPlaces(transaction.comment.customUnit.quantity) : undefined; @@ -95,12 +97,12 @@ function IOURequestStepDistanceManual({ }, [distance]); const shouldSkipConfirmation: boolean = useMemo(() => { - if (isSplitBill || !skipConfirmation || !report?.reportID) { + if (!skipConfirmation || !report?.reportID) { return false; } return !(isArchivedReport(reportNameValuePairs) || isPolicyExpenseChatUtils(report)); - }, [report, isSplitBill, skipConfirmation, reportNameValuePairs]); + }, [report, skipConfirmation, reportNameValuePairs]); useFocusEffect( useCallback(() => { @@ -120,14 +122,11 @@ function IOURequestStepDistanceManual({ const buttonText = useMemo(() => { if (shouldSkipConfirmation) { - if (iouType === CONST.IOU.TYPE.SPLIT) { - return translate('iou.split'); - } return translate('iou.createExpense'); } return isCreatingNewRequest ? translate('common.next') : translate('common.save'); - }, [shouldSkipConfirmation, translate, isCreatingNewRequest, iouType]); + }, [shouldSkipConfirmation, translate, isCreatingNewRequest]); const navigateToConfirmationPage = useCallback(() => { switch (iouType) { @@ -142,7 +141,22 @@ function IOURequestStepDistanceManual({ const navigateToNextPage = useCallback( (amount: string) => { const distanceAsFloat = roundToTwoDecimalPlaces(parseFloat(amount)); - setMoneyRequestDistance(transactionID, distanceAsFloat, isCreatingNewRequest); + setMoneyRequestDistance(transactionID, distanceAsFloat, isTransactionDraft); + + if (action === CONST.IOU.ACTION.EDIT) { + if (distance !== distanceAsFloat) { + updateMoneyRequestDistance({ + transactionID: transaction?.transactionID, + transactionThreadReportID: reportID, + distance: distanceAsFloat, + // Not required for manual distance request + transactionBackup: undefined, + policy, + }); + } + Navigation.goBack(backTo); + return; + } if (backTo) { Navigation.goBack(backTo); @@ -253,7 +267,7 @@ function IOURequestStepDistanceManual({ currentUserPersonalDetails.login, currentUserPersonalDetails.accountID, reportNameValuePairs, - isCreatingNewRequest, + isTransactionDraft, activePolicy, shouldSkipConfirmation, personalDetails, @@ -263,6 +277,8 @@ function IOURequestStepDistanceManual({ customUnitRateID, translate, navigateToConfirmationPage, + action, + distance, ], ); diff --git a/src/types/onyx/Transaction.ts b/src/types/onyx/Transaction.ts index a2200bae432a..83a414802ed0 100644 --- a/src/types/onyx/Transaction.ts +++ b/src/types/onyx/Transaction.ts @@ -583,6 +583,9 @@ type AdditionalTransactionChanges = { /** Previous currency before changes */ oldCurrency?: string; + + /** Previous distance before changes */ + distance?: number; }; /** Model of transaction changes */ diff --git a/tests/unit/TransactionUtilsTest.ts b/tests/unit/TransactionUtilsTest.ts index 09689eedbec5..02586c40a4cb 100644 --- a/tests/unit/TransactionUtilsTest.ts +++ b/tests/unit/TransactionUtilsTest.ts @@ -335,6 +335,67 @@ describe('TransactionUtils', () => { expect(updatedTransaction.taxCode).toBe(taxCode); expect(updatedTransaction.taxAmount).toBe(5); }); + + it('should update transaction when distance is changed', () => { + // Given: a policy with a mileage rate + const fakePolicy: Policy = { + ...createRandomPolicy(0), + customUnits: { + distance: { + name: CONST.CUSTOM_UNITS.NAME_DISTANCE, + customUnitID: 'distance', + rates: { + default: { + customUnitRateID: '1', + currency: CONST.CURRENCY.USD, + rate: 1, // 1 USD per mile + }, + }, + attributes: { + unit: CONST.CUSTOM_UNITS.DISTANCE_UNIT_MILES, + }, + }, + }, + }; + const transaction = generateTransaction({ + comment: { + customUnit: { + distanceUnit: CONST.CUSTOM_UNITS.DISTANCE_UNIT_MILES, + quantity: 10, // original distance + }, + }, + currency: CONST.CURRENCY.USD, + }); + + const newDistance = 20; // change distance to 20 miles + + // When: updating the transaction with a new distance + const updatedTransaction = TransactionUtils.getUpdatedTransaction({ + transaction, + isFromExpenseReport: false, + policy: fakePolicy, + transactionChanges: {distance: newDistance}, + }); + + // Then: quantity should be updated + expect(updatedTransaction.comment?.customUnit?.quantity).toBe(newDistance); + + // And: amount should be recalculated (20 miles × 1 USD = 20) + expect(updatedTransaction.modifiedAmount).toBe(20); + + // And: merchant should be updated with mileage description + expect(updatedTransaction.modifiedMerchant).toContain('20'); + + // And: currency should be set from policy mileage rate + expect(updatedTransaction.modifiedCurrency).toBe(CONST.CURRENCY.USD); + + // And: pending fields should mark distance-related updates + expect(updatedTransaction.pendingFields).toMatchObject({ + quantity: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, + amount: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, + merchant: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, + }); + }); }); describe('shouldShowRTERViolationMessage', () => {