@@ -38,7 +38,15 @@ import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
3838import { getRateFromMerchant } from '@libs/MergeTransactionUtils' ;
3939import { hasEnabledOptions } from '@libs/OptionsListUtils' ;
4040import Parser from '@libs/Parser' ;
41- import { canSubmitPerDiemExpenseFromWorkspace , getLengthOfTag , getTagLists , hasDependentTags as hasDependentTagsPolicyUtils , isTaxTrackingEnabled } from '@libs/PolicyUtils' ;
41+ import {
42+ canSubmitPerDiemExpenseFromWorkspace ,
43+ getLengthOfTag ,
44+ getPerDiemCustomUnit ,
45+ getPolicyByCustomUnitID ,
46+ getTagLists ,
47+ hasDependentTags as hasDependentTagsPolicyUtils ,
48+ isTaxTrackingEnabled ,
49+ } from '@libs/PolicyUtils' ;
4250import { getOriginalMessage , isMoneyRequestAction } from '@libs/ReportActionsUtils' ;
4351import { getReportName } from '@libs/ReportNameUtils' ;
4452import { isSplitAction } from '@libs/ReportSecondaryActionUtils' ;
@@ -90,6 +98,7 @@ import ONYXKEYS from '@src/ONYXKEYS';
9098import ROUTES from '@src/ROUTES' ;
9199import type * as OnyxTypes from '@src/types/onyx' ;
92100import type { TransactionPendingFieldsKey } from '@src/types/onyx/Transaction' ;
101+ import { isEmptyObject } from '@src/types/utils/EmptyObject' ;
93102import MoneyRequestReceiptView from './MoneyRequestReceiptView' ;
94103
95104type MoneyRequestViewProps = {
@@ -118,6 +127,17 @@ type MoneyRequestViewProps = {
118127 mergeTransactionID ?: string ;
119128} ;
120129
130+ const perDiemPoliciesSelector = ( policies : OnyxCollection < OnyxTypes . Policy > ) => {
131+ return Object . fromEntries (
132+ Object . entries ( policies ?? { } ) . filter ( ( [ , policy ] ) => {
133+ const perDiemCustomUnit = getPerDiemCustomUnit ( policy ) ;
134+ const hasPolicyPerDiemRates = ! isEmptyObject ( perDiemCustomUnit ?. rates ) ;
135+
136+ return policy ?. arePerDiemRatesEnabled && hasPolicyPerDiemRates ;
137+ } ) ,
138+ ) ;
139+ } ;
140+
121141function MoneyRequestView ( {
122142 allReports,
123143 report,
@@ -158,9 +178,28 @@ function MoneyRequestView({
158178 const [ transaction ] = useOnyx ( `${ ONYXKEYS . COLLECTION . TRANSACTION } ${ getNonEmptyStringOnyxID ( linkedTransactionID ) } ` , { canBeMissing : true } ) ;
159179 const isExpenseUnreported = isExpenseUnreportedTransactionUtils ( updatedTransaction ?? transaction ) ;
160180 const { policyForMovingExpensesID, policyForMovingExpenses, shouldSelectPolicy} = usePolicyForMovingExpenses ( ) ;
161- // If the expense is unreported the policy should be the user's default policy, otherwise it should be the policy the expense was made for
162- const policy = isExpenseUnreported ? policyForMovingExpenses : expensePolicy ;
163- const policyID = isExpenseUnreported ? policyForMovingExpensesID : report ?. policyID ;
181+
182+ const [ policiesWithPerDiem ] = useOnyx ( ONYXKEYS . COLLECTION . POLICY , {
183+ selector : perDiemPoliciesSelector ,
184+ canBeMissing : true ,
185+ } ) ;
186+ const isPerDiemRequest = isPerDiemRequestTransactionUtils ( transaction ) ;
187+ const perDiemOriginalPolicy = getPolicyByCustomUnitID ( transaction , policiesWithPerDiem ) ;
188+
189+ let policy ;
190+ let policyID ;
191+ // If the expense is unreported the policy should be the user's default policy, if the expense is a per diem request and is unreported
192+ // the policy should be the one where the per diem rates are enabled, otherwise it should be the expense's report policy
193+ if ( isExpenseUnreported && ! isPerDiemRequest ) {
194+ policy = policyForMovingExpenses ;
195+ policyID = policyForMovingExpensesID ;
196+ } else if ( isExpenseUnreported && isPerDiemRequest ) {
197+ policy = perDiemOriginalPolicy ;
198+ policyID = perDiemOriginalPolicy ?. id ;
199+ } else {
200+ policy = expensePolicy ;
201+ policyID = report ?. policyID ;
202+ }
164203
165204 const allPolicyCategories = usePolicyCategories ( ) ;
166205 const policyCategories = allPolicyCategories ?. [ `${ ONYXKEYS . COLLECTION . POLICY_CATEGORIES } ${ policyID } ` ] ;
@@ -220,7 +259,6 @@ function MoneyRequestView({
220259 const isDistanceRequest = isDistanceRequestTransactionUtils ( transaction ) ;
221260 const isManualDistanceRequest = isManualDistanceRequestTransactionUtils ( transaction ) ;
222261 const isMapDistanceRequest = isDistanceRequest && ! isManualDistanceRequest ;
223- const isPerDiemRequest = isPerDiemRequestTransactionUtils ( transaction ) ;
224262 const isTransactionScanning = isScanning ( updatedTransaction ?? transaction ) ;
225263 const hasRoute = hasRouteTransactionUtils ( transactionBackup ?? transaction , isDistanceRequest ) ;
226264
@@ -271,13 +309,10 @@ function MoneyRequestView({
271309 const canEditDate = isEditable && canEditFieldOfMoneyRequest ( parentReportAction , CONST . EDIT_REQUEST_FIELD . DATE , undefined , isChatReportArchived ) ;
272310 const canEditDistance = isEditable && canEditFieldOfMoneyRequest ( parentReportAction , CONST . EDIT_REQUEST_FIELD . DISTANCE , undefined , isChatReportArchived ) ;
273311 const canEditDistanceRate = isEditable && canEditFieldOfMoneyRequest ( parentReportAction , CONST . EDIT_REQUEST_FIELD . DISTANCE_RATE , undefined , isChatReportArchived ) ;
274- const canEditReport = useMemo (
275- ( ) =>
276- isEditable &&
277- canEditFieldOfMoneyRequest ( parentReportAction , CONST . EDIT_REQUEST_FIELD . REPORT , undefined , isChatReportArchived , outstandingReportsByPolicyID ) &&
278- ( ! isPerDiemRequest || canSubmitPerDiemExpenseFromWorkspace ( policy ) ) ,
279- [ isEditable , parentReportAction , isChatReportArchived , outstandingReportsByPolicyID , isPerDiemRequest , policy ] ,
280- ) ;
312+ const canEditReport =
313+ isEditable &&
314+ canEditFieldOfMoneyRequest ( parentReportAction , CONST . EDIT_REQUEST_FIELD . REPORT , undefined , isChatReportArchived , outstandingReportsByPolicyID ) &&
315+ ( ! isPerDiemRequest || canSubmitPerDiemExpenseFromWorkspace ( policy ) || ( isExpenseUnreported && ! ! perDiemOriginalPolicy ) ) ;
281316
282317 // A flag for verifying that the current report is a sub-report of a expense chat
283318 // if the policy of the report is either Collect or Control, then this report must be tied to expense chat
0 commit comments