Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
10 changes: 7 additions & 3 deletions src/components/TransactionItemRow/DataCells/TotalCell.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import React from 'react';
import React, {useMemo} from 'react';
import TextWithTooltip from '@components/TextWithTooltip';
import useLocalize from '@hooks/useLocalize';
import useThemeStyles from '@hooks/useThemeStyles';
import {convertToDisplayString} from '@libs/CurrencyUtils';
import {getTransactionDetails} from '@libs/ReportUtils';
import {getTransactionDetailsAmount} from '@libs/ReportUtils';
import {getCurrency as getTransactionCurrency, isScanning} from '@libs/TransactionUtils';
import type TransactionDataCellProps from './TransactionDataCellProps';

Expand All @@ -12,7 +12,11 @@ function TotalCell({shouldShowTooltip, transactionItem}: TransactionDataCellProp
const {translate} = useLocalize();
const currency = getTransactionCurrency(transactionItem);

const amount = getTransactionDetails(transactionItem)?.amount;
const amount = useMemo(() => {
return getTransactionDetailsAmount(transactionItem);
// We want this memo to update only when the amount of transactionItem changes
// eslint-disable-next-line react-compiler/react-compiler, react-hooks/exhaustive-deps
}, [transactionItem.amount, transactionItem.modifiedAmount]);
let amountToDisplay = convertToDisplayString(amount, currency);
if (isScanning(transactionItem)) {
amountToDisplay = translate('iou.receiptStatusTitle');
Expand Down
1 change: 1 addition & 0 deletions src/languages/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1023,6 +1023,7 @@ const translations = {
share: 'Teilen',
participants: 'Teilnehmer',
createExpense: 'Ausgabe erstellen',
trackDistance: 'Entfernung verfolgen',
createExpenses: ({expensesNumber}: CreateExpensesParams) => `Erstelle ${expensesNumber} Ausgaben`,
addExpense: 'Ausgabe hinzufügen',
chooseRecipient: 'Empfänger auswählen',
Expand Down
1 change: 1 addition & 0 deletions src/languages/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1008,6 +1008,7 @@ const translations = {
share: 'Share',
participants: 'Participants',
createExpense: 'Create expense',
trackDistance: 'Track distance',
createExpenses: ({expensesNumber}: CreateExpensesParams) => `Create ${expensesNumber} expenses`,
addExpense: 'Add expense',
chooseRecipient: 'Choose recipient',
Expand Down
1 change: 1 addition & 0 deletions src/languages/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1003,6 +1003,7 @@ const translations = {
share: 'Compartir',
participants: 'Participantes',
createExpense: 'Crear gasto',
trackDistance: 'Gasto de distancia',
createExpenses: ({expensesNumber}: CreateExpensesParams) => `Crear ${expensesNumber} gastos`,
paySomeone: ({name}: PaySomeoneParams = {}) => `Pagar a ${name ?? 'alguien'}`,
chooseRecipient: 'Elige destinatario',
Expand Down
1 change: 1 addition & 0 deletions src/languages/fr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1023,6 +1023,7 @@ const translations = {
share: 'Partager',
participants: 'Participants',
createExpense: 'Créer une dépense',
trackDistance: 'Suivre la distance',
createExpenses: ({expensesNumber}: CreateExpensesParams) => `Créer ${expensesNumber} dépenses`,
addExpense: 'Ajouter une dépense',
chooseRecipient: 'Choisir le destinataire',
Expand Down
1 change: 1 addition & 0 deletions src/languages/it.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1019,6 +1019,7 @@ const translations = {
share: 'Condividi',
participants: 'Partecipanti',
createExpense: 'Crea spesa',
trackDistance: 'Traccia distanza',
createExpenses: ({expensesNumber}: CreateExpensesParams) => `Crea ${expensesNumber} spese`,
addExpense: 'Aggiungi spesa',
chooseRecipient: 'Scegli destinatario',
Expand Down
1 change: 1 addition & 0 deletions src/languages/ja.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1022,6 +1022,7 @@ const translations = {
share: '共有',
participants: '参加者',
createExpense: '経費を作成',
trackDistance: '距離を追跡する',
createExpenses: ({expensesNumber}: CreateExpensesParams) => `${expensesNumber}件の経費を作成`,
addExpense: '経費を追加',
chooseRecipient: '受取人を選択',
Expand Down
1 change: 1 addition & 0 deletions src/languages/nl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1020,6 +1020,7 @@ const translations = {
share: 'Delen',
participants: 'Deelnemers',
createExpense: 'Uitgave aanmaken',
trackDistance: 'Afstand bijhouden',
createExpenses: ({expensesNumber}: CreateExpensesParams) => `Maak ${expensesNumber} uitgaven aan`,
addExpense: 'Uitgave toevoegen',
chooseRecipient: 'Kies ontvanger',
Expand Down
1 change: 1 addition & 0 deletions src/languages/pl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1018,6 +1018,7 @@ const translations = {
share: 'Udostępnij',
participants: 'Uczestnicy',
createExpense: 'Utwórz wydatek',
trackDistance: 'Śledź odległość',
createExpenses: ({expensesNumber}: CreateExpensesParams) => `Utwórz ${expensesNumber} wydatki`,
addExpense: 'Dodaj wydatek',
chooseRecipient: 'Wybierz odbiorcę',
Expand Down
1 change: 1 addition & 0 deletions src/languages/pt-BR.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1020,6 +1020,7 @@ const translations = {
share: 'Compartilhar',
participants: 'Participantes',
createExpense: 'Criar despesa',
trackDistance: 'Rastrear distância',
createExpenses: ({expensesNumber}: CreateExpensesParams) => `Criar ${expensesNumber} despesas`,
addExpense: 'Adicionar despesa',
chooseRecipient: 'Escolher destinatário',
Expand Down
1 change: 1 addition & 0 deletions src/languages/zh-hans.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1013,6 +1013,7 @@ const translations = {
share: '分享',
participants: '参与者',
createExpense: '创建报销单',
trackDistance: '跟踪距离',
createExpenses: ({expensesNumber}: CreateExpensesParams) => `创建${expensesNumber}笔费用`,
addExpense: '添加费用',
chooseRecipient: '选择收件人',
Expand Down
14 changes: 13 additions & 1 deletion src/libs/ReportUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -884,7 +884,7 @@
const parsedReportActionMessageCache: Record<string, string> = {};

let conciergeReportID: OnyxEntry<string>;
Onyx.connect({

Check warning on line 887 in src/libs/ReportUtils.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.CONCIERGE_REPORT_ID,
callback: (value) => {
conciergeReportID = value;
Expand All @@ -892,7 +892,7 @@
});

const defaultAvatarBuildingIconTestID = 'SvgDefaultAvatarBuilding Icon';
Onyx.connect({

Check warning on line 895 in src/libs/ReportUtils.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.SESSION,
callback: (value) => {
// When signed out, val is undefined
Expand All @@ -910,7 +910,7 @@
let allPersonalDetails: OnyxEntry<PersonalDetailsList>;
let allPersonalDetailLogins: string[];
let currentUserPersonalDetails: OnyxEntry<PersonalDetails>;
Onyx.connect({

Check warning on line 913 in src/libs/ReportUtils.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.PERSONAL_DETAILS_LIST,
callback: (value) => {
if (currentUserAccountID) {
Expand All @@ -922,14 +922,14 @@
});

let allReportsDraft: OnyxCollection<Report>;
Onyx.connect({

Check warning on line 925 in src/libs/ReportUtils.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.COLLECTION.REPORT_DRAFT,
waitForCollectionCallback: true,
callback: (value) => (allReportsDraft = value),
});

let allPolicies: OnyxCollection<Policy>;
Onyx.connect({

Check warning on line 932 in src/libs/ReportUtils.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.COLLECTION.POLICY,
waitForCollectionCallback: true,
callback: (value) => (allPolicies = value),
Expand All @@ -937,7 +937,7 @@

let allReports: OnyxCollection<Report>;
let reportsByPolicyID: ReportByPolicyMap;
Onyx.connect({

Check warning on line 940 in src/libs/ReportUtils.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.COLLECTION.REPORT,
waitForCollectionCallback: true,
callback: (value) => {
Expand Down Expand Up @@ -974,14 +974,14 @@
});

let allBetas: OnyxEntry<Beta[]>;
Onyx.connect({

Check warning on line 977 in src/libs/ReportUtils.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.BETAS,
callback: (value) => (allBetas = value),
});

let allTransactions: OnyxCollection<Transaction> = {};
let reportsTransactions: Record<string, Transaction[]> = {};
Onyx.connect({

Check warning on line 984 in src/libs/ReportUtils.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.COLLECTION.TRANSACTION,
waitForCollectionCallback: true,
callback: (value) => {
Expand All @@ -1007,7 +1007,7 @@
});

let allReportActions: OnyxCollection<ReportActions>;
Onyx.connect({

Check warning on line 1010 in src/libs/ReportUtils.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.COLLECTION.REPORT_ACTIONS,
waitForCollectionCallback: true,
callback: (actions) => {
Expand All @@ -1020,7 +1020,7 @@

let allReportMetadata: OnyxCollection<ReportMetadata>;
const allReportMetadataKeyValue: Record<string, ReportMetadata> = {};
Onyx.connect({

Check warning on line 1023 in src/libs/ReportUtils.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.COLLECTION.REPORT_METADATA,
waitForCollectionCallback: true,
callback: (value) => {
Expand Down Expand Up @@ -3951,7 +3951,6 @@
* Gets transaction created, amount, currency, comment, and waypoints (for distance expense)
* into a flat object. Used for displaying transactions and sending them in API commands
*/

function getTransactionDetails(
transaction: OnyxInputOrEntry<Transaction>,
createdDateFormat: string = CONST.DATE.FNS_FORMAT_STRING,
Expand Down Expand Up @@ -3984,6 +3983,18 @@
};
}

/**
* Get the amount of a transaction with proper report context handling.
* This is a lightweight alternative to getTransactionDetails when only the amount is needed.
*/
function getTransactionDetailsAmount(transaction: OnyxInputOrEntry<Transaction>): number | undefined {
if (!transaction) {
return;
}
const report = getReportOrDraftReport(transaction?.reportID);
return getTransactionAmount(transaction, !isEmptyObject(report) && isExpenseReport(report));
}

function getTransactionCommentObject(transaction: OnyxEntry<Transaction>): Comment {
return {
...transaction?.comment,
Expand Down Expand Up @@ -11517,6 +11528,7 @@
isOneTransactionReport,
isWorkspaceTaskReport,
isWorkspaceThread,
getTransactionDetailsAmount
};

export type {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import PressableWithFeedback from '@components/Pressable/PressableWithFeedback';
import Tooltip from '@components/Tooltip/PopoverAnchorTooltip';
import useEnvironment from '@hooks/useEnvironment';
import useLocalize from '@hooks/useLocalize';
import usePermissions from '@hooks/usePermissions';
import usePrevious from '@hooks/usePrevious';
import useResponsiveLayout from '@hooks/useResponsiveLayout';
import useTheme from '@hooks/useTheme';
Expand All @@ -36,7 +37,7 @@ import type * as OnyxTypes from '@src/types/onyx';

type MoneyRequestOptions = Record<
Exclude<IOUType, typeof CONST.IOU.TYPE.REQUEST | typeof CONST.IOU.TYPE.SEND | typeof CONST.IOU.TYPE.CREATE | typeof CONST.IOU.TYPE.SPLIT_EXPENSE>,
PopoverMenuItem
PopoverMenuItem[]
>;

type AttachmentPickerWithMenuItemsProps = {
Expand Down Expand Up @@ -131,6 +132,9 @@ function AttachmentPickerWithMenuItems({
const {isDelegateAccessRestricted, showDelegateNoAccessModal} = useContext(DelegateNoAccessContext);
const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`, {canBeMissing: true});
const {isProduction} = useEnvironment();
const {isBetaEnabled} = usePermissions();

const isManualDistanceTrackingEnabled = isBetaEnabled(CONST.BETAS.MANUAL_DISTANCE);

const selectOption = useCallback(
(onSelected: () => void, shouldRestrictAction: boolean) => {
Expand All @@ -152,52 +156,80 @@ function AttachmentPickerWithMenuItems({
*/
const moneyRequestOptions = useMemo(() => {
const options: MoneyRequestOptions = {
[CONST.IOU.TYPE.SPLIT]: {
icon: Expensicons.Transfer,
text: translate('iou.splitExpense'),
shouldCallAfterModalHide: shouldUseNarrowLayout,
onSelected: () => selectOption(() => startMoneyRequest(CONST.IOU.TYPE.SPLIT, report?.reportID ?? String(CONST.DEFAULT_NUMBER_ID)), true),
},
[CONST.IOU.TYPE.SUBMIT]: {
icon: getIconForAction(CONST.IOU.TYPE.CREATE),
text: translate('iou.createExpense'),
shouldCallAfterModalHide: shouldUseNarrowLayout,
onSelected: () => selectOption(() => startMoneyRequest(CONST.IOU.TYPE.SUBMIT, report?.reportID ?? String(CONST.DEFAULT_NUMBER_ID)), true),
},
[CONST.IOU.TYPE.PAY]: {
icon: getIconForAction(CONST.IOU.TYPE.SEND),
text: translate('iou.paySomeone', {name: getPayeeName(report)}),
shouldCallAfterModalHide: shouldUseNarrowLayout,
onSelected: () => {
if (isDelegateAccessRestricted) {
close(() => {
showDelegateNoAccessModal();
});
return;
}
selectOption(() => startMoneyRequest(CONST.IOU.TYPE.PAY, report?.reportID ?? String(CONST.DEFAULT_NUMBER_ID)), false);
[CONST.IOU.TYPE.SPLIT]: [
{
icon: Expensicons.Transfer,
text: translate('iou.splitExpense'),
shouldCallAfterModalHide: shouldUseNarrowLayout,
onSelected: () => selectOption(() => startMoneyRequest(CONST.IOU.TYPE.SPLIT, report?.reportID ?? String(CONST.DEFAULT_NUMBER_ID)), true),
},
},
[CONST.IOU.TYPE.TRACK]: {
icon: getIconForAction(CONST.IOU.TYPE.CREATE),
text: translate('iou.createExpense'),
shouldCallAfterModalHide: shouldUseNarrowLayout,
onSelected: () => selectOption(() => startMoneyRequest(CONST.IOU.TYPE.TRACK, report?.reportID ?? String(CONST.DEFAULT_NUMBER_ID)), true),
},
[CONST.IOU.TYPE.INVOICE]: {
icon: Expensicons.InvoiceGeneric,
text: translate('workspace.invoices.sendInvoice'),
shouldCallAfterModalHide: shouldUseNarrowLayout,
onSelected: () => selectOption(() => startMoneyRequest(CONST.IOU.TYPE.INVOICE, report?.reportID ?? String(CONST.DEFAULT_NUMBER_ID)), false),
},
],
[CONST.IOU.TYPE.SUBMIT]: [
{
icon: getIconForAction(CONST.IOU.TYPE.CREATE),
text: translate('iou.createExpense'),
shouldCallAfterModalHide: shouldUseNarrowLayout,
onSelected: () => selectOption(() => startMoneyRequest(CONST.IOU.TYPE.SUBMIT, report?.reportID ?? String(CONST.DEFAULT_NUMBER_ID)), true),
},
...(isManualDistanceTrackingEnabled
? [
{
icon: Expensicons.Location,
text: translate('quickAction.recordDistance'),
shouldCallAfterModalHide: shouldUseNarrowLayout,
onSelected: () => selectOption(() => null, true),
},
]
: []),
],
[CONST.IOU.TYPE.PAY]: [
{
icon: getIconForAction(CONST.IOU.TYPE.SEND),
text: translate('iou.paySomeone', {name: getPayeeName(report)}),
shouldCallAfterModalHide: shouldUseNarrowLayout,
onSelected: () => {
if (isDelegateAccessRestricted) {
close(() => {
showDelegateNoAccessModal();
});
return;
}
selectOption(() => startMoneyRequest(CONST.IOU.TYPE.PAY, report?.reportID ?? String(CONST.DEFAULT_NUMBER_ID)), false);
},
},
],
[CONST.IOU.TYPE.TRACK]: [
{
icon: getIconForAction(CONST.IOU.TYPE.CREATE),
text: translate('iou.createExpense'),
shouldCallAfterModalHide: shouldUseNarrowLayout,
onSelected: () => selectOption(() => startMoneyRequest(CONST.IOU.TYPE.TRACK, report?.reportID ?? String(CONST.DEFAULT_NUMBER_ID)), true),
},
...(isManualDistanceTrackingEnabled
? [
{
icon: Expensicons.Location,
text: translate('iou.trackDistance'),
shouldCallAfterModalHide: shouldUseNarrowLayout,
onSelected: () => selectOption(() => null, true),
},
]
: []),
],
[CONST.IOU.TYPE.INVOICE]: [
{
icon: Expensicons.InvoiceGeneric,
text: translate('workspace.invoices.sendInvoice'),
shouldCallAfterModalHide: shouldUseNarrowLayout,
onSelected: () => selectOption(() => startMoneyRequest(CONST.IOU.TYPE.INVOICE, report?.reportID ?? String(CONST.DEFAULT_NUMBER_ID)), false),
},
],
};

const moneyRequestOptionsList = temporary_getMoneyRequestOptions(report, policy, reportParticipantIDs ?? []).map((option) => ({
...options[option],
}));
const moneyRequestOptionsList = temporary_getMoneyRequestOptions(report, policy, reportParticipantIDs ?? []).map((option) => options[option]);

return moneyRequestOptionsList.filter((item, index, self) => index === self.findIndex((t) => t.text === item.text));
}, [translate, shouldUseNarrowLayout, report, policy, reportParticipantIDs, selectOption, isDelegateAccessRestricted, showDelegateNoAccessModal]);
return moneyRequestOptionsList.flat().filter((item, index, self) => index === self.findIndex((t) => t.text === item.text));
}, [translate, shouldUseNarrowLayout, report, policy, reportParticipantIDs, selectOption, isDelegateAccessRestricted, showDelegateNoAccessModal, isManualDistanceTrackingEnabled]);

const createReportOption: PopoverMenuItem[] = useMemo(() => {
if (!isPolicyExpenseChat(report) || !isPaidGroupPolicy(report) || !isReportOwner(report)) {
Expand Down
22 changes: 21 additions & 1 deletion src/pages/home/sidebar/FloatingActionButtonAndPopover.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,8 @@ function FloatingActionButtonAndPopover({onHideCreateMenu, onShowCreateMenu, isT
const isFocused = useIsFocused();
const prevIsFocused = usePrevious(isFocused);
const {isOffline} = useNetwork();
const {isBlockedFromSpotnanaTravel} = usePermissions();
const {isBlockedFromSpotnanaTravel, isBetaEnabled} = usePermissions();
const isManualDistanceTrackingEnabled = isBetaEnabled(CONST.BETAS.MANUAL_DISTANCE);
const [primaryLogin] = useOnyx(ONYXKEYS.ACCOUNT, {selector: (account) => account?.primaryLogin, canBeMissing: true});
const primaryContactMethod = primaryLogin ?? session?.email ?? '';
const [travelSettings] = useOnyx(ONYXKEYS.NVP_TRAVEL_SETTINGS, {canBeMissing: true});
Expand Down Expand Up @@ -401,6 +402,25 @@ function FloatingActionButtonAndPopover({onHideCreateMenu, onShowCreateMenu, isT

const menuItems = [
...expenseMenuItems,
...(isManualDistanceTrackingEnabled
? [
{
icon: Expensicons.Location,
text: translate('iou.trackDistance'),
shouldCallAfterModalHide: shouldUseNarrowLayout,
onSelected: () => {
interceptAnonymousUser(() => {
if (shouldRedirectToExpensifyClassic) {
setModalVisible(true);
return;
}
// Start the flow to start tracking a distance request
return null;
});
},
},
]
: []),
...(shouldShowCreateReportOption
? [
{
Expand Down
23 changes: 13 additions & 10 deletions src/pages/iou/request/IOURequestStartPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,7 @@ function IOURequestStartPage({
}, [headerWithBackBtnContainerElement, tabBarContainerElement, activeTabContainerElement]);

const {isBetaEnabled} = usePermissions();
const manualDistanceTrackingEnabled = isBetaEnabled(CONST.BETAS.MANUAL_DISTANCE);
const setTestReceiptAndNavigateRef = useRef<() => void>(() => {});
const {shouldShowProductTrainingTooltip, renderProductTrainingTooltip} = useProductTrainingContext(
CONST.PRODUCT_TRAINING_TOOLTIP_NAMES.SCAN_TEST_TOOLTIP,
Expand Down Expand Up @@ -234,16 +235,18 @@ function IOURequestStartPage({
</TabScreenWithFocusTrapWrapper>
)}
</TopTab.Screen>
<TopTab.Screen name={CONST.TAB_REQUEST.DISTANCE}>
{() => (
<TabScreenWithFocusTrapWrapper>
<IOURequestStepDistance
route={route}
navigation={navigation}
/>
</TabScreenWithFocusTrapWrapper>
)}
</TopTab.Screen>
{!manualDistanceTrackingEnabled && (
<TopTab.Screen name={CONST.TAB_REQUEST.DISTANCE}>
{() => (
<TabScreenWithFocusTrapWrapper>
<IOURequestStepDistance
route={route}
navigation={navigation}
/>
</TabScreenWithFocusTrapWrapper>
)}
</TopTab.Screen>
)}
{!!shouldShowPerDiemOption && (
<TopTab.Screen name={CONST.TAB_REQUEST.PER_DIEM}>
{() => (
Expand Down
Loading