diff --git a/src/hooks/usePolicyForMovingExpenses.ts b/src/hooks/usePolicyForMovingExpenses.ts index e0e313e598f6..f0625978fb35 100644 --- a/src/hooks/usePolicyForMovingExpenses.ts +++ b/src/hooks/usePolicyForMovingExpenses.ts @@ -1,7 +1,7 @@ import {activePolicySelector} from '@selectors/Policy'; import type {OnyxEntry} from 'react-native-onyx'; import {useSession} from '@components/OnyxListItemProvider'; -import {isPaidGroupPolicy, isPolicyMemberWithoutPendingDelete} from '@libs/PolicyUtils'; +import {canSubmitPerDiemExpenseFromWorkspace, isPaidGroupPolicy, isPolicyMemberWithoutPendingDelete} from '@libs/PolicyUtils'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import type {Policy} from '@src/types/onyx'; @@ -20,7 +20,7 @@ function isPolicyMemberByRole(policy: OnyxEntry) { return !!policy?.role && Object.values(CONST.POLICY.ROLE).includes(policy.role); } -function usePolicyForMovingExpenses() { +function usePolicyForMovingExpenses(isPerDiemRequest?: boolean) { const [allPolicies] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {canBeMissing: true}); const [activePolicyID] = useOnyx(ONYXKEYS.NVP_ACTIVE_POLICY_ID, {canBeMissing: true}); const [activePolicy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${activePolicyID}`, { @@ -32,11 +32,15 @@ function usePolicyForMovingExpenses() { const login = session?.email ?? ''; const userPolicies = Object.values(allPolicies ?? {}).filter( (policy) => - checkForUserPendingDelete(login, policy) && isPolicyMemberByRole(policy) && isPaidGroupPolicy(policy) && policy?.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE, + checkForUserPendingDelete(login, policy) && + isPolicyMemberByRole(policy) && + isPaidGroupPolicy(policy) && + policy?.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE && + (!isPerDiemRequest || canSubmitPerDiemExpenseFromWorkspace(policy)), ); const isMemberOfMoreThanOnePolicy = userPolicies.length > 1; - if (activePolicy) { + if (activePolicy && (!isPerDiemRequest || canSubmitPerDiemExpenseFromWorkspace(activePolicy))) { return {policyForMovingExpensesID: activePolicyID, policyForMovingExpenses: activePolicy, shouldSelectPolicy: false}; } diff --git a/src/pages/NewReportWorkspaceSelectionPage.tsx b/src/pages/NewReportWorkspaceSelectionPage.tsx index d0da894e3359..c809a0832c9a 100644 --- a/src/pages/NewReportWorkspaceSelectionPage.tsx +++ b/src/pages/NewReportWorkspaceSelectionPage.tsx @@ -20,10 +20,11 @@ import Navigation from '@libs/Navigation/Navigation'; import type {NewReportWorkspaceSelectionNavigatorParamList} from '@libs/Navigation/types'; import {getHeaderMessageForNonUserList} from '@libs/OptionsListUtils'; import Permissions from '@libs/Permissions'; -import {isPolicyAdmin, shouldShowPolicy} from '@libs/PolicyUtils'; +import {canSubmitPerDiemExpenseFromWorkspace, isPolicyAdmin, shouldShowPolicy} from '@libs/PolicyUtils'; import {getDefaultWorkspaceAvatar, hasViolations as hasViolationsReportUtils} from '@libs/ReportUtils'; import {buildCannedSearchQuery} from '@libs/SearchQueryUtils'; import {shouldRestrictUserBillableActions} from '@libs/SubscriptionUtils'; +import {isPerDiemRequest} from '@libs/TransactionUtils'; import isRHPOnSearchMoneyRequestReportPage from '@navigation/helpers/isRHPOnSearchMoneyRequestReportPage'; import type {PlatformStackScreenProps} from '@navigation/PlatformStackNavigation/types'; import {changeTransactionsReport} from '@userActions/Transaction'; @@ -59,6 +60,7 @@ function NewReportWorkspaceSelectionPage({route}: NewReportWorkspaceSelectionPag const [activePolicyID] = useOnyx(ONYXKEYS.NVP_ACTIVE_POLICY_ID, {canBeMissing: true}); const [policies, fetchStatus] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {canBeMissing: true}); + const [allTransactions] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION, {canBeMissing: true}); const currentUserPersonalDetails = useCurrentUserPersonalDetails(); const [isLoadingApp] = useOnyx(ONYXKEYS.IS_LOADING_APP, {canBeMissing: true}); @@ -133,13 +135,30 @@ function NewReportWorkspaceSelectionPage({route}: NewReportWorkspaceSelectionPag ], ); + const hasPerDiemTransactions = useMemo(() => { + if (selectedTransactionIDs && selectedTransactionIDs.length > 0 && allTransactions) { + return selectedTransactionIDs.some((transactionID) => { + const transaction = allTransactions[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]; + return transaction && isPerDiemRequest(transaction); + }); + } + + return false; + }, [selectedTransactionIDs, allTransactions]); + const usersWorkspaces = useMemo(() => { if (!policies || isEmptyObject(policies)) { return []; } return Object.values(policies) - .filter((policy) => shouldShowPolicy(policy, !!isOffline, currentUserPersonalDetails?.login) && !policy?.isJoinRequestPending && policy?.isPolicyExpenseChatEnabled) + .filter( + (policy) => + shouldShowPolicy(policy, !!isOffline, currentUserPersonalDetails?.login) && + !policy?.isJoinRequestPending && + policy?.isPolicyExpenseChatEnabled && + (!hasPerDiemTransactions || canSubmitPerDiemExpenseFromWorkspace(policy)), + ) .map((policy) => ({ text: policy?.name ?? '', policyID: policy?.id, @@ -157,7 +176,7 @@ function NewReportWorkspaceSelectionPage({route}: NewReportWorkspaceSelectionPag shouldSyncFocus: true, })) .sort((a, b) => localeCompare(a.text, b.text)); - }, [policies, isOffline, currentUserPersonalDetails?.login, localeCompare]); + }, [policies, isOffline, currentUserPersonalDetails?.login, localeCompare, hasPerDiemTransactions]); const filteredAndSortedUserWorkspaces = useMemo( () => usersWorkspaces.filter((policy) => policy.text?.toLowerCase().includes(debouncedSearchTerm?.toLowerCase() ?? '')), diff --git a/src/pages/iou/request/step/IOURequestEditReport.tsx b/src/pages/iou/request/step/IOURequestEditReport.tsx index 312f89d9ab9a..dbedd4aff054 100644 --- a/src/pages/iou/request/step/IOURequestEditReport.tsx +++ b/src/pages/iou/request/step/IOURequestEditReport.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, {useMemo} from 'react'; import {useSession} from '@components/OnyxListItemProvider'; import {useSearchContext} from '@components/Search/SearchContext'; import type {ListItem} from '@components/SelectionListWithSections/types'; @@ -11,6 +11,7 @@ import Navigation from '@libs/Navigation/Navigation'; import Permissions from '@libs/Permissions'; import {hasViolations as hasViolationsReportUtils} from '@libs/ReportUtils'; import {shouldRestrictUserBillableActions} from '@libs/SubscriptionUtils'; +import {isPerDiemRequest} from '@libs/TransactionUtils'; import {createNewReport} from '@userActions/Report'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; @@ -39,8 +40,17 @@ function IOURequestEditReport({route}: IOURequestEditReportProps) { const session = useSession(); const [allPolicies] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {canBeMissing: true}); const [allPolicyCategories] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}`, {canBeMissing: true}); + const [allTransactions] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION, {canBeMissing: true}); const currentUserPersonalDetails = useCurrentUserPersonalDetails(); - const {policyForMovingExpensesID, shouldSelectPolicy} = usePolicyForMovingExpenses(); + + const hasPerDiemTransactions = useMemo(() => { + return selectedTransactionIDs.some((transactionID) => { + const transaction = allTransactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]; + return transaction && isPerDiemRequest(transaction); + }); + }, [selectedTransactionIDs, allTransactions]); + + const {policyForMovingExpensesID, shouldSelectPolicy} = usePolicyForMovingExpenses(hasPerDiemTransactions); const [transactionViolations] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, {canBeMissing: true}); const hasViolations = hasViolationsReportUtils(undefined, transactionViolations); @@ -102,6 +112,7 @@ function IOURequestEditReport({route}: IOURequestEditReportProps) { removeFromReport={removeFromReport} isEditing={action === CONST.IOU.ACTION.EDIT} createReport={createReport} + isPerDiemRequest={hasPerDiemTransactions} /> ); } diff --git a/src/pages/iou/request/step/IOURequestEditReportCommon.tsx b/src/pages/iou/request/step/IOURequestEditReportCommon.tsx index c9e38771a802..5fcefa677969 100644 --- a/src/pages/iou/request/step/IOURequestEditReportCommon.tsx +++ b/src/pages/iou/request/step/IOURequestEditReportCommon.tsx @@ -68,7 +68,7 @@ function IOURequestEditReportCommon({ const [selectedReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${selectedReportID}`, {canBeMissing: true}); const reportOwnerAccountID = useMemo(() => selectedReport?.ownerAccountID ?? currentUserPersonalDetails.accountID, [selectedReport, currentUserPersonalDetails.accountID]); const reportPolicy = usePolicy(selectedReport?.policyID); - const {policyForMovingExpenses} = usePolicyForMovingExpenses(); + const {policyForMovingExpenses} = usePolicyForMovingExpenses(isPerDiemRequest); const [reportNameValuePairs] = useOnyx(ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS, {canBeMissing: true}); diff --git a/src/pages/iou/request/step/IOURequestStepReport.tsx b/src/pages/iou/request/step/IOURequestStepReport.tsx index 3a11275b4686..8b50fb3f8c20 100644 --- a/src/pages/iou/request/step/IOURequestStepReport.tsx +++ b/src/pages/iou/request/step/IOURequestStepReport.tsx @@ -53,7 +53,7 @@ function IOURequestStepReport({route, transaction}: IOURequestStepReportProps) { const isASAPSubmitBetaEnabled = Permissions.isBetaEnabled(CONST.BETAS.ASAP_SUBMIT, allBetas); const session = useSession(); const currentUserPersonalDetails = useCurrentUserPersonalDetails(); - const {policyForMovingExpensesID, shouldSelectPolicy} = usePolicyForMovingExpenses(); + const {policyForMovingExpensesID, shouldSelectPolicy} = usePolicyForMovingExpenses(isPerDiemRequest(transaction)); const [transactionViolations] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, {canBeMissing: true}); const hasViolations = hasViolationsReportUtils(undefined, transactionViolations); useRestartOnReceiptFailure(transaction, reportIDFromRoute, iouType, action);