Skip to content

Commit 0180bd2

Browse files
committed
Merge remote-tracking branch 'upstream/main' into 81771-concierge-thinking-indicator
2 parents b04cfa8 + 1d43910 commit 0180bd2

34 files changed

+202
-303
lines changed

src/ROUTES.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2643,8 +2643,8 @@ const ROUTES = {
26432643
},
26442644
WORKSPACE_CREATE_DISTANCE_RATE_UPGRADE: {
26452645
route: 'workspaces/:policyID/distance-rates/new/upgrade',
2646-
getRoute: (policyID: string, transactionID?: string, reportID?: string) =>
2647-
`workspaces/${policyID}/distance-rates/new/upgrade${transactionID ? `?transactionID=${transactionID}` : ''}${reportID ? `&reportID=${reportID}` : ''}` as const,
2646+
getRoute: (policyID: string, transactionID?: string, reportID?: string, iouType?: string, action?: string) =>
2647+
`workspaces/${policyID}/distance-rates/new/upgrade${transactionID ? `?transactionID=${transactionID}` : ''}${reportID ? `&reportID=${reportID}` : ''}${iouType ? `&iouType=${iouType}` : ''}${action ? `&action=${action}` : ''}` as const,
26482648
},
26492649
WORKSPACE_DISTANCE_RATES_SETTINGS: {
26502650
route: 'workspaces/:policyID/distance-rates/settings',

src/components/MoneyRequestConfirmationList.tsx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ function MoneyRequestConfirmationList({
275275
const [defaultMileageRateDraft] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_DRAFTS}${policyID}`, {
276276
selector: mileageRateSelector,
277277
});
278-
const {policyForMovingExpenses} = usePolicyForMovingExpenses();
278+
const {policyForMovingExpenses, shouldSelectPolicy} = usePolicyForMovingExpenses();
279279
const isMovingTransactionFromTrackExpense = isMovingTransactionFromTrackExpenseUtil(action);
280280
const [defaultMileageRateReal] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {
281281
selector: mileageRateSelector,
@@ -336,7 +336,12 @@ function MoneyRequestConfirmationList({
336336
const defaultRate = defaultMileageRate?.customUnitRateID;
337337
const lastSelectedRate = policy?.id ? (lastSelectedDistanceRates?.[policy.id] ?? defaultRate) : defaultRate;
338338

339-
const mileageRate = DistanceRequestUtils.getRate({transaction, policy, policyDraft});
339+
const mileageRate = DistanceRequestUtils.getRate({
340+
transaction,
341+
policy,
342+
...(isMovingTransactionFromTrackExpense && {policyForMovingExpenses}),
343+
policyDraft,
344+
});
340345
const rate = mileageRate.rate;
341346
const prevRate = usePrevious(rate);
342347
const unit = mileageRate.unit;
@@ -345,8 +350,6 @@ function MoneyRequestConfirmationList({
345350
const prevCurrency = usePrevious(currency);
346351
const prevSubRates = usePrevious(subRates);
347352

348-
const {shouldSelectPolicy} = usePolicyForMovingExpenses();
349-
350353
// A flag for showing the categories field
351354
const shouldShowCategories = isTrackExpense
352355
? !policy || shouldSelectPolicy || hasEnabledOptions(Object.values(policyCategories ?? {}))

src/components/MoneyRequestConfirmationListFooter.tsx

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -587,7 +587,7 @@ function MoneyRequestConfirmationListFooter({
587587
item: (
588588
<MenuItemWithTopDescription
589589
key={translate('common.rate')}
590-
shouldShowRightIcon={!!rate && !isReadOnly && iouType !== CONST.IOU.TYPE.SPLIT && !isUnreported}
590+
shouldShowRightIcon={!!rate && !isReadOnly && iouType !== CONST.IOU.TYPE.SPLIT}
591591
title={DistanceRequestUtils.getRateForDisplay(unit, rate, currency, translate, toLocaleDigit, getCurrencySymbol, isOffline)}
592592
description={translate('common.rate')}
593593
style={[styles.moneyRequestMenuItem]}
@@ -597,7 +597,7 @@ function MoneyRequestConfirmationListFooter({
597597
return;
598598
}
599599

600-
if (!isPolicyExpenseChat) {
600+
if ((!isPolicyExpenseChat && !isTrackExpense) || (shouldNavigateToUpgradePath && isTrackExpense)) {
601601
Navigation.navigate(
602602
ROUTES.MONEY_REQUEST_UPGRADE.getRoute({
603603
action,
@@ -606,16 +606,22 @@ function MoneyRequestConfirmationListFooter({
606606
reportID,
607607
upgradePath: CONST.UPGRADE_PATHS.DISTANCE_RATES,
608608
backTo: Navigation.getActiveRoute(),
609-
shouldSubmitExpense: true,
609+
shouldSubmitExpense: !isTrackExpense,
610610
}),
611611
);
612-
return;
612+
} else if (!policy && shouldSelectPolicy && isTrackExpense) {
613+
Navigation.navigate(
614+
ROUTES.SET_DEFAULT_WORKSPACE.getRoute(
615+
ROUTES.MONEY_REQUEST_STEP_DISTANCE_RATE.getRoute(action, iouType, transactionID, reportID, Navigation.getActiveRoute(), reportActionID),
616+
),
617+
);
618+
} else {
619+
Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_DISTANCE_RATE.getRoute(action, iouType, transactionID, reportID, Navigation.getActiveRoute(), reportActionID));
613620
}
614-
Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_DISTANCE_RATE.getRoute(action, iouType, transactionID, reportID, Navigation.getActiveRoute(), reportActionID));
615621
}}
616622
brickRoadIndicator={shouldDisplayDistanceRateError ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined}
617623
disabled={didConfirm}
618-
interactive={!!rate && !isReadOnly && iouType !== CONST.IOU.TYPE.SPLIT && !isUnreported}
624+
interactive={!!rate && !isReadOnly && iouType !== CONST.IOU.TYPE.SPLIT}
619625
sentryLabel={CONST.SENTRY_LABEL.REQUEST_CONFIRMATION_LIST.RATE_FIELD}
620626
/>
621627
),

src/components/MoneyRequestReportView/MoneyRequestReportTransactionItem.tsx

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import React, {useEffect, useRef} from 'react';
22
import type {View} from 'react-native';
3-
import type {OnyxEntry} from 'react-native-onyx';
43
import {getButtonRole} from '@components/Button/utils';
54
import OfflineWithFeedback from '@components/OfflineWithFeedback';
65
import {PressableWithFeedback} from '@components/Pressable';
@@ -18,7 +17,7 @@ import canUseTouchScreen from '@libs/DeviceCapabilities/canUseTouchScreen';
1817
import {getTransactionPendingAction, isTransactionPendingDelete} from '@libs/TransactionUtils';
1918
import variables from '@styles/variables';
2019
import CONST from '@src/CONST';
21-
import type {Policy, Report} from '@src/types/onyx';
20+
import type {Report} from '@src/types/onyx';
2221
import type {TransactionWithOptionalHighlight} from './MoneyRequestReportTransactionList';
2322

2423
type MoneyRequestReportTransactionItemProps = {
@@ -28,9 +27,6 @@ type MoneyRequestReportTransactionItemProps = {
2827
/** Report to which the transaction belongs */
2928
report: Report;
3029

31-
/** Policy to which the transaction belongs */
32-
policy: OnyxEntry<Policy>;
33-
3430
/** Whether the mobile selection mode is enabled */
3531
isSelectionModeEnabled: boolean;
3632

@@ -71,7 +67,6 @@ type MoneyRequestReportTransactionItemProps = {
7167
function MoneyRequestReportTransactionItem({
7268
transaction,
7369
report,
74-
policy,
7570
isSelectionModeEnabled,
7671
toggleTransaction,
7772
isSelected,
@@ -144,7 +139,6 @@ function MoneyRequestReportTransactionItem({
144139
transactionItem={transaction}
145140
violations={filteredViolations}
146141
report={report}
147-
policy={policy}
148142
isSelected={isSelected}
149143
dateColumnSize={dateColumnSize}
150144
amountColumnSize={amountColumnSize}

src/components/MoneyRequestReportView/MoneyRequestReportTransactionList.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -517,7 +517,6 @@ function MoneyRequestReportTransactionList({
517517
shouldBeHighlighted={highlightedTransactionIDs.has(transaction.transactionID)}
518518
columns={columnsToShow}
519519
report={report}
520-
policy={policy}
521520
isSelectionModeEnabled={isMobileSelectionModeEnabled}
522521
toggleTransaction={toggleTransaction}
523522
isSelected={isTransactionSelected(transaction.transactionID)}
@@ -541,7 +540,6 @@ function MoneyRequestReportTransactionList({
541540
shouldBeHighlighted={highlightedTransactionIDs.has(transaction.transactionID)}
542541
columns={columnsToShow}
543542
report={report}
544-
policy={policy}
545543
isSelectionModeEnabled={isMobileSelectionModeEnabled}
546544
toggleTransaction={toggleTransaction}
547545
isSelected={isTransactionSelected(transaction.transactionID)}

src/components/ReportActionItem/MoneyRequestView.tsx

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@ function MoneyRequestView({
345345
const canEditDate =
346346
isEditable && canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.DATE, undefined, isChatReportArchived, undefined, transaction, moneyRequestReport, policy);
347347

348-
const canEditDistanceOrRate = isPolicyAccessible(policy, currentUserEmailParam) || isP2PDistanceRequest;
348+
const canEditDistanceOrRate = isPolicyAccessible(policy, currentUserEmailParam) || isTrackExpense || isP2PDistanceRequest;
349349

350350
const canEditDistance =
351351
!isGPSDistanceRequest &&
@@ -421,10 +421,14 @@ function MoneyRequestView({
421421
const distance = getDistanceInMeters(transactionBackup ?? updatedTransaction ?? transaction, unit);
422422
const currency = transactionCurrency ?? CONST.CURRENCY.USD;
423423
const hasRequiredCompanyCardViolation = transactionViolations.some((violation) => violation.name === CONST.VIOLATIONS.COMPANY_CARD_REQUIRED);
424-
const isCustomUnitOutOfPolicy = transactionViolations.some((violation) => violation.name === CONST.VIOLATIONS.CUSTOM_UNIT_OUT_OF_POLICY) || (isDistanceRequest && !rate);
424+
const isCustomUnitOutOfPolicy =
425+
(transactionViolations.some((violation) => violation.name === CONST.VIOLATIONS.CUSTOM_UNIT_OUT_OF_POLICY) || (isDistanceRequest && !rate)) && !isTrackExpense;
426+
const calculateFromTransactionData = isTrackExpense && !rate;
427+
const distanceUnit = calculateFromTransactionData ? transaction?.comment?.customUnit?.distanceUnit : unit;
428+
const distanceRate = calculateFromTransactionData ? (transactionAmount ?? 0) / (transaction?.comment?.customUnit?.quantity ?? 1) : rate;
425429
let rateToDisplay = isCustomUnitOutOfPolicy
426430
? translate('common.rateOutOfPolicy')
427-
: DistanceRequestUtils.getRateForDisplay(unit, rate, currency, translate, toLocaleDigit, getCurrencySymbol, isOffline);
431+
: DistanceRequestUtils.getRateForDisplay(distanceUnit, distanceRate, currency, translate, toLocaleDigit, getCurrencySymbol, isOffline);
428432
const distanceToDisplay = DistanceRequestUtils.getDistanceForDisplay(hasRoute, distance, unit, rate, translate, undefined, isManualDistanceRequest);
429433
let merchantTitle = isEmptyMerchant ? '' : transactionMerchant;
430434
let amountTitle = formattedTransactionAmount?.toString() || '';
@@ -655,6 +659,35 @@ function MoneyRequestView({
655659
return;
656660
}
657661

662+
if (isTrackExpense) {
663+
if (shouldNavigateToUpgradePath && transactionThreadReport) {
664+
Navigation.navigate(
665+
ROUTES.MONEY_REQUEST_UPGRADE.getRoute({
666+
action: CONST.IOU.ACTION.EDIT,
667+
iouType,
668+
transactionID: transaction.transactionID,
669+
reportID: transactionThreadReport?.reportID,
670+
upgradePath: CONST.UPGRADE_PATHS.DISTANCE_RATES,
671+
}),
672+
);
673+
return;
674+
}
675+
if (!policy && shouldSelectPolicy) {
676+
Navigation.navigate(
677+
ROUTES.SET_DEFAULT_WORKSPACE.getRoute(
678+
ROUTES.MONEY_REQUEST_STEP_DISTANCE_RATE.getRoute(
679+
CONST.IOU.ACTION.EDIT,
680+
iouType,
681+
transaction.transactionID,
682+
transactionThreadReport?.reportID,
683+
Navigation.getActiveRoute(),
684+
),
685+
),
686+
);
687+
return;
688+
}
689+
}
690+
658691
Navigation.navigate(
659692
ROUTES.MONEY_REQUEST_STEP_DISTANCE_RATE.getRoute(
660693
CONST.IOU.ACTION.EDIT,

src/components/SelectionListWithSections/Search/TransactionGroupListExpanded.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,6 @@ function TransactionGroupListExpanded<TItem extends ListItem>({
179179
const transactionRow = (
180180
<TransactionItemRow
181181
report={transaction.report}
182-
policy={transaction.policy}
183182
transactionItem={transaction}
184183
violations={getTransactionViolations(transaction, violations, currentUserDetails.email ?? '', currentUserDetails.accountID, transaction.report, transaction.policy)}
185184
isSelected={!!transaction.isSelected}

src/components/SelectionListWithSections/Search/TransactionListItem.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,6 @@ function TransactionListItem<TItem extends ListItem>({
208208
<TransactionItemRow
209209
transactionItem={transactionItem}
210210
report={transactionItem.report}
211-
policy={transactionItem.policy}
212211
shouldShowTooltip={showTooltip}
213212
onButtonPress={handleActionButtonPress}
214213
onCheckboxPress={() => onCheckboxPress?.(item)}

src/components/TransactionItemRow/index.tsx

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ import {
4141
isMerchantMissing,
4242
isScanning,
4343
isTimeRequest,
44-
isUnreportedAndHasInvalidDistanceRateTransaction,
4544
} from '@libs/TransactionUtils';
4645
import CONST from '@src/CONST';
4746
import type {TranslationPaths} from '@src/languages/types';
@@ -107,7 +106,6 @@ type TransactionWithOptionalSearchFields = TransactionWithOptionalHighlight & {
107106
type TransactionItemRowProps = {
108107
transactionItem: TransactionWithOptionalSearchFields;
109108
report?: Report;
110-
policy?: Policy;
111109
shouldUseNarrowLayout: boolean;
112110
isSelected: boolean;
113111
shouldShowTooltip: boolean;
@@ -159,7 +157,6 @@ function getMerchantName(transactionItem: TransactionWithOptionalSearchFields, t
159157
function TransactionItemRow({
160158
transactionItem,
161159
report,
162-
policy,
163160
shouldUseNarrowLayout,
164161
isSelected,
165162
shouldShowTooltip,
@@ -234,9 +231,7 @@ function TransactionItemRow({
234231
return '';
235232
}
236233

237-
const policyParam = policy ?? transactionItem.policy;
238-
const isCustomUnitOutOfPolicy = isUnreportedAndHasInvalidDistanceRateTransaction(transactionItem, policyParam);
239-
const hasFieldErrors = hasMissingSmartscanFields(transactionItem, report) || isCustomUnitOutOfPolicy;
234+
const hasFieldErrors = hasMissingSmartscanFields(transactionItem, report);
240235
if (hasFieldErrors) {
241236
const amountMissing = isAmountMissing(transactionItem);
242237
const merchantMissing = isMerchantMissing(transactionItem);
@@ -248,12 +243,11 @@ function TransactionItemRow({
248243
error = translate('iou.missingAmount');
249244
} else if (merchantMissing && !isSettled(report)) {
250245
error = translate('iou.missingMerchant');
251-
} else if (isCustomUnitOutOfPolicy) {
252-
error = translate('violations.customUnitOutOfPolicy');
253246
}
247+
254248
return error;
255249
}
256-
}, [transactionItem, translate, report, policy]);
250+
}, [transactionItem, translate, report]);
257251

258252
const exchangeRateMessage = getExchangeRate(transactionItem);
259253

src/hooks/usePolicyForTransaction.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ type UsePolicyForTransactionParams = {
2121
/** The type of IOU (split, track, submit, etc.) */
2222
iouType: string;
2323

24+
/** The draft policy linked to the report */
25+
policyDraft?: OnyxEntry<Policy>;
26+
2427
/** Indicates if the request is a per diem request */
2528
isPerDiemRequest?: boolean;
2629
};
@@ -30,7 +33,7 @@ type UsePolicyForTransactionResult = {
3033
policy: OnyxEntry<Policy>;
3134
};
3235

33-
function usePolicyForTransaction({transaction, reportPolicyID, action, iouType, isPerDiemRequest}: UsePolicyForTransactionParams): UsePolicyForTransactionResult {
36+
function usePolicyForTransaction({transaction, reportPolicyID, action, iouType, policyDraft, isPerDiemRequest}: UsePolicyForTransactionParams): UsePolicyForTransactionResult {
3437
const {policyForMovingExpenses} = usePolicyForMovingExpenses();
3538

3639
const [allPolicies] = useOnyx(ONYXKEYS.COLLECTION.POLICY);
@@ -45,7 +48,7 @@ function usePolicyForTransaction({transaction, reportPolicyID, action, iouType,
4548
const isCreatingTrackExpense = action === CONST.IOU.ACTION.CREATE && iouType === CONST.IOU.TYPE.TRACK;
4649

4750
const policyForSelfDMExpense = isPerDiemRequest ? customUnitPolicy : policyForMovingExpenses;
48-
const policy = isUnreportedExpense || isCreatingTrackExpense ? policyForSelfDMExpense : reportPolicy;
51+
const policy = isUnreportedExpense || isCreatingTrackExpense ? policyForSelfDMExpense : (reportPolicy ?? policyDraft);
4952

5053
return {policy};
5154
}

0 commit comments

Comments
 (0)