From 362d4f6c34330459196ec1fe3de307c35412812b Mon Sep 17 00:00:00 2001 From: huutech <20178761+huult@users.noreply.github.com> Date: Sat, 1 Nov 2025 12:32:59 +0700 Subject: [PATCH 1/7] fix create report becomes unresponsive after deleting workspace with per diem rates --- .../ReportActionItem/MoneyRequestView.tsx | 18 ++++++++++++------ .../iou/request/step/IOURequestStepReport.tsx | 2 +- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/components/ReportActionItem/MoneyRequestView.tsx b/src/components/ReportActionItem/MoneyRequestView.tsx index e7c04524c1a5..1b343bafdcc0 100644 --- a/src/components/ReportActionItem/MoneyRequestView.tsx +++ b/src/components/ReportActionItem/MoneyRequestView.tsx @@ -150,7 +150,8 @@ function MoneyRequestView({ }, [parentReportAction]); const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${getNonEmptyStringOnyxID(linkedTransactionID)}`, {canBeMissing: true}); const isExpenseUnreported = isExpenseUnreportedTransactionUtils(updatedTransaction ?? transaction); - const {policyForMovingExpensesID, policyForMovingExpenses, shouldSelectPolicy} = usePolicyForMovingExpenses(); + const isPerDiemRequest = isPerDiemRequestTransactionUtils(transaction); + const {policyForMovingExpensesID, policyForMovingExpenses, shouldSelectPolicy} = usePolicyForMovingExpenses(isPerDiemRequest); // 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 const policy = isExpenseUnreported ? policyForMovingExpenses : expensePolicy; const policyID = isExpenseUnreported ? policyForMovingExpensesID : report?.policyID; @@ -205,7 +206,7 @@ function MoneyRequestView({ const isDistanceRequest = isDistanceRequestTransactionUtils(transaction); const isManualDistanceRequest = isManualDistanceRequestTransactionUtils(transaction); const isMapDistanceRequest = isDistanceRequest && !isManualDistanceRequest; - const isPerDiemRequest = isPerDiemRequestTransactionUtils(transaction); + const isTransactionScanning = isScanning(updatedTransaction ?? transaction); const hasRoute = hasRouteTransactionUtils(transactionBackup ?? transaction, isDistanceRequest); @@ -254,10 +255,15 @@ function MoneyRequestView({ const canEditDate = isEditable && canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.DATE, undefined, isChatReportArchived); const canEditDistance = isEditable && canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.DISTANCE, undefined, isChatReportArchived); const canEditDistanceRate = isEditable && canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.DISTANCE_RATE, undefined, isChatReportArchived); - const canEditReport = useMemo( - () => isEditable && canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.REPORT, undefined, isChatReportArchived, outstandingReportsByPolicyID), - [isEditable, parentReportAction, isChatReportArchived, outstandingReportsByPolicyID], - ); + const canEditReport = useMemo(() => { + const isEditableReport = isEditable && canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.REPORT, undefined, isChatReportArchived, outstandingReportsByPolicyID); + + if (!isPerDiemRequest) { + return isEditableReport; + } + + return isEditableReport && !!policyForMovingExpensesID && !shouldSelectPolicy; + }, [isEditable, parentReportAction, isChatReportArchived, outstandingReportsByPolicyID, isPerDiemRequest, policyForMovingExpensesID, shouldSelectPolicy]); // A flag for verifying that the current report is a sub-report of a expense chat // if the policy of the report is either Collect or Control, then this report must be tied to expense chat diff --git a/src/pages/iou/request/step/IOURequestStepReport.tsx b/src/pages/iou/request/step/IOURequestStepReport.tsx index ae301865e91e..a074ecc749cf 100644 --- a/src/pages/iou/request/step/IOURequestStepReport.tsx +++ b/src/pages/iou/request/step/IOURequestStepReport.tsx @@ -219,7 +219,7 @@ function IOURequestStepReport({route, transaction}: IOURequestStepReportProps) { isUnreported={isUnreported} shouldShowNotFoundPage={shouldShowNotFoundPage} isPerDiemRequest={transaction ? isPerDiemRequest(transaction) : false} - createReport={action === CONST.IOU.ACTION.EDIT ? createReport : undefined} + createReport={action === CONST.IOU.ACTION.EDIT && (policyForMovingExpensesID || shouldSelectPolicy) ? createReport : undefined} /> ); From 6649879826ef003e53396001fe8cb82c850d3950 Mon Sep 17 00:00:00 2001 From: huutech <20178761+huult@users.noreply.github.com> Date: Thu, 6 Nov 2025 14:21:16 +0700 Subject: [PATCH 2/7] Update logic for creating a report --- .../MoneyRequestConfirmationListFooter.tsx | 14 ++++++++++++-- .../ReportActionItem/MoneyRequestView.tsx | 13 ++++--------- .../iou/request/step/IOURequestStepUpgrade.tsx | 13 ++++++++++--- 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/src/components/MoneyRequestConfirmationListFooter.tsx b/src/components/MoneyRequestConfirmationListFooter.tsx index fac7f948ad84..cedda717f5e8 100644 --- a/src/components/MoneyRequestConfirmationListFooter.tsx +++ b/src/components/MoneyRequestConfirmationListFooter.tsx @@ -273,7 +273,7 @@ function MoneyRequestConfirmationListFooter({ const [outstandingReportsByPolicyID] = useOnyx(ONYXKEYS.DERIVED.OUTSTANDING_REPORTS_BY_POLICY_ID, { canBeMissing: true, }); - const {policyForMovingExpensesID, shouldSelectPolicy} = usePolicyForMovingExpenses(); + const {policyForMovingExpensesID, shouldSelectPolicy} = usePolicyForMovingExpenses(isPerDiemRequest); const [currentUserLogin] = useOnyx(ONYXKEYS.SESSION, {selector: emailSelector, canBeMissing: true}); @@ -781,7 +781,17 @@ function MoneyRequestConfirmationListFooter({ shouldRenderAsHTML /> ), - shouldShow: isPolicyExpenseChat, + shouldShow: () => { + if (!isPolicyExpenseChat) { + return false; + } + + if (action !== CONST.IOU.ACTION.EDIT) { + return true; + } + + return Boolean(policyForMovingExpensesID || shouldSelectPolicy); + }, }, ]; diff --git a/src/components/ReportActionItem/MoneyRequestView.tsx b/src/components/ReportActionItem/MoneyRequestView.tsx index f8b509ef6a58..32812ee736c9 100644 --- a/src/components/ReportActionItem/MoneyRequestView.tsx +++ b/src/components/ReportActionItem/MoneyRequestView.tsx @@ -257,15 +257,10 @@ function MoneyRequestView({ const canEditDate = isEditable && canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.DATE, undefined, isChatReportArchived); const canEditDistance = isEditable && canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.DISTANCE, undefined, isChatReportArchived); const canEditDistanceRate = isEditable && canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.DISTANCE_RATE, undefined, isChatReportArchived); - const canEditReport = useMemo(() => { - const isEditableReport = isEditable && canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.REPORT, undefined, isChatReportArchived, outstandingReportsByPolicyID); - - if (!isPerDiemRequest) { - return isEditableReport; - } - - return isEditableReport && !!policyForMovingExpensesID && !shouldSelectPolicy; - }, [isEditable, parentReportAction, isChatReportArchived, outstandingReportsByPolicyID, isPerDiemRequest, policyForMovingExpensesID, shouldSelectPolicy]); + const canEditReport = useMemo( + () => isEditable && canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.REPORT, undefined, isChatReportArchived, outstandingReportsByPolicyID), + [isEditable, parentReportAction, isChatReportArchived, outstandingReportsByPolicyID], + ); // A flag for verifying that the current report is a sub-report of a expense chat // if the policy of the report is either Collect or Control, then this report must be tied to expense chat diff --git a/src/pages/iou/request/step/IOURequestStepUpgrade.tsx b/src/pages/iou/request/step/IOURequestStepUpgrade.tsx index a281f1fdfd88..4032dcfeaf4c 100644 --- a/src/pages/iou/request/step/IOURequestStepUpgrade.tsx +++ b/src/pages/iou/request/step/IOURequestStepUpgrade.tsx @@ -9,6 +9,7 @@ import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails' import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; import useOnyx from '@hooks/useOnyx'; +import usePolicyForMovingExpenses from '@hooks/usePolicyForMovingExpenses'; import useThemeStyles from '@hooks/useThemeStyles'; import {setTransactionReport} from '@libs/actions/Transaction'; import type CreateWorkspaceParams from '@libs/API/parameters/CreateWorkspaceParams'; @@ -16,6 +17,7 @@ import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import type {MoneyRequestNavigatorParamList} from '@libs/Navigation/types'; import {getParticipantsOption} from '@libs/OptionsListUtils'; +import {isPerDiemRequest} from '@libs/TransactionUtils'; import UpgradeConfirmation from '@pages/workspace/upgrade/UpgradeConfirmation'; import UpgradeIntro from '@pages/workspace/upgrade/UpgradeIntro'; import {setCustomUnitRateID, setMoneyRequestParticipants} from '@userActions/IOU'; @@ -39,7 +41,9 @@ function IOURequestStepUpgrade({ const currentUserPersonalDetails = useCurrentUserPersonalDetails(); const personalDetails = usePersonalDetails(); - const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID}`, {canBeMissing: true}); + const [transactionDraft] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID}`, {canBeMissing: true}); + const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, {canBeMissing: true}); + const {policyForMovingExpensesID, shouldSelectPolicy} = usePolicyForMovingExpenses(isPerDiemRequest(transaction)); const [isUpgraded, setIsUpgraded] = useState(false); const [showConfirmationForm, setShowConfirmationForm] = useState(false); @@ -87,6 +91,9 @@ function IOURequestStepUpgrade({ break; } case CONST.UPGRADE_PATHS.REPORTS: + if (!(action === CONST.IOU.ACTION.EDIT && (policyForMovingExpensesID || shouldSelectPolicy))) { + return; + } Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_REPORT.getRoute(action, CONST.IOU.TYPE.SUBMIT, transactionID, reportID)); break; case CONST.UPGRADE_PATHS.CATEGORIES: @@ -97,13 +104,13 @@ function IOURequestStepUpgrade({ }, [action, backTo, reportID, shouldSubmitExpense, transactionID, upgradePath]); const adminParticipant = useMemo(() => { - const participant = transaction?.participants?.[0]; + const participant = transactionDraft?.participants?.[0]; if (!isDistanceRateUpgrade || !participant?.accountID) { return; } return getParticipantsOption(participant, personalDetails); - }, [isDistanceRateUpgrade, transaction?.participants, personalDetails]); + }, [isDistanceRateUpgrade, transactionDraft?.participants, personalDetails]); const onUpgrade = useCallback(() => { if (isCategorizing || isReporting) { From 3d7e2f4324f0f050b1fbadecdd08faba833992a4 Mon Sep 17 00:00:00 2001 From: huutech <20178761+huult@users.noreply.github.com> Date: Thu, 6 Nov 2025 14:33:54 +0700 Subject: [PATCH 3/7] fix eslint --- src/components/MoneyRequestConfirmationListFooter.tsx | 2 +- src/pages/iou/request/step/IOURequestStepUpgrade.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/MoneyRequestConfirmationListFooter.tsx b/src/components/MoneyRequestConfirmationListFooter.tsx index cedda717f5e8..329aa0fbddcb 100644 --- a/src/components/MoneyRequestConfirmationListFooter.tsx +++ b/src/components/MoneyRequestConfirmationListFooter.tsx @@ -790,7 +790,7 @@ function MoneyRequestConfirmationListFooter({ return true; } - return Boolean(policyForMovingExpensesID || shouldSelectPolicy); + return !!(policyForMovingExpensesID || shouldSelectPolicy); }, }, ]; diff --git a/src/pages/iou/request/step/IOURequestStepUpgrade.tsx b/src/pages/iou/request/step/IOURequestStepUpgrade.tsx index 4032dcfeaf4c..009e3a621b74 100644 --- a/src/pages/iou/request/step/IOURequestStepUpgrade.tsx +++ b/src/pages/iou/request/step/IOURequestStepUpgrade.tsx @@ -101,7 +101,7 @@ function IOURequestStepUpgrade({ break; default: } - }, [action, backTo, reportID, shouldSubmitExpense, transactionID, upgradePath]); + }, [action, backTo, reportID, shouldSubmitExpense, transactionID, upgradePath, policyForMovingExpensesID, shouldSelectPolicy]); const adminParticipant = useMemo(() => { const participant = transactionDraft?.participants?.[0]; From ab40799fd797194ad44622a3bc5ca95871da5749 Mon Sep 17 00:00:00 2001 From: huutech <20178761+huult@users.noreply.github.com> Date: Thu, 6 Nov 2025 14:36:23 +0700 Subject: [PATCH 4/7] fix eslint --- src/components/MoneyRequestConfirmationListFooter.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/MoneyRequestConfirmationListFooter.tsx b/src/components/MoneyRequestConfirmationListFooter.tsx index 329aa0fbddcb..16f160c045a9 100644 --- a/src/components/MoneyRequestConfirmationListFooter.tsx +++ b/src/components/MoneyRequestConfirmationListFooter.tsx @@ -790,7 +790,7 @@ function MoneyRequestConfirmationListFooter({ return true; } - return !!(policyForMovingExpensesID || shouldSelectPolicy); + return !!(policyForMovingExpensesID ?? shouldSelectPolicy); }, }, ]; From dc28ffc5bb171cce682366f7e8233f1b39c1bacd Mon Sep 17 00:00:00 2001 From: huutech <20178761+huult@users.noreply.github.com> Date: Tue, 18 Nov 2025 09:15:41 +0700 Subject: [PATCH 5/7] revert IOURequestStepUpgrade --- .../iou/request/step/IOURequestStepUpgrade.tsx | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/src/pages/iou/request/step/IOURequestStepUpgrade.tsx b/src/pages/iou/request/step/IOURequestStepUpgrade.tsx index 25c64f05e8bf..0e40247046f8 100644 --- a/src/pages/iou/request/step/IOURequestStepUpgrade.tsx +++ b/src/pages/iou/request/step/IOURequestStepUpgrade.tsx @@ -9,7 +9,6 @@ import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails' import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; import useOnyx from '@hooks/useOnyx'; -import usePolicyForMovingExpenses from '@hooks/usePolicyForMovingExpenses'; import useThemeStyles from '@hooks/useThemeStyles'; import {setTransactionReport} from '@libs/actions/Transaction'; import type CreateWorkspaceParams from '@libs/API/parameters/CreateWorkspaceParams'; @@ -18,7 +17,6 @@ import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import type {MoneyRequestNavigatorParamList} from '@libs/Navigation/types'; import {getParticipantsOption} from '@libs/OptionsListUtils'; -import {isPerDiemRequest} from '@libs/TransactionUtils'; import UpgradeConfirmation from '@pages/workspace/upgrade/UpgradeConfirmation'; import UpgradeIntro from '@pages/workspace/upgrade/UpgradeIntro'; import {setCustomUnitRateID, setMoneyRequestParticipants} from '@userActions/IOU'; @@ -43,9 +41,7 @@ function IOURequestStepUpgrade({ const currentUserPersonalDetails = useCurrentUserPersonalDetails(); const personalDetails = usePersonalDetails(); - const [transactionDraft] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID}`, {canBeMissing: true}); - const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, {canBeMissing: true}); - const {policyForMovingExpensesID, shouldSelectPolicy} = usePolicyForMovingExpenses(isPerDiemRequest(transaction)); + const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID}`, {canBeMissing: true}); const [isUpgraded, setIsUpgraded] = useState(false); const [showConfirmationForm, setShowConfirmationForm] = useState(false); @@ -107,10 +103,6 @@ function IOURequestStepUpgrade({ break; } case CONST.UPGRADE_PATHS.REPORTS: - if (!(action === CONST.IOU.ACTION.EDIT && (policyForMovingExpensesID || shouldSelectPolicy))) { - return; - } - navigateWithMicrotask(ROUTES.MONEY_REQUEST_STEP_REPORT.getRoute(action, CONST.IOU.TYPE.SUBMIT, transactionID, reportID)); break; @@ -120,16 +112,16 @@ function IOURequestStepUpgrade({ break; default: } - }, [action, backTo, navigateWithMicrotask, policyForMovingExpensesID, reportID, shouldSelectPolicy, shouldSubmitExpense, transactionID, upgradePath]); + }, [action, backTo, navigateWithMicrotask, reportID, shouldSubmitExpense, transactionID, upgradePath]); const adminParticipant = useMemo(() => { - const participant = transactionDraft?.participants?.[0]; + const participant = transaction?.participants?.[0]; if (!isDistanceRateUpgrade || !participant?.accountID) { return; } return getParticipantsOption(participant, personalDetails); - }, [isDistanceRateUpgrade, transactionDraft?.participants, personalDetails]); + }, [isDistanceRateUpgrade, transaction?.participants, personalDetails]); const onUpgrade = useCallback(() => { if (isCategorizing || isReporting) { From ec6b3b8f3edebde1530d87a680b8609563901782 Mon Sep 17 00:00:00 2001 From: huutech <20178761+huult@users.noreply.github.com> Date: Tue, 18 Nov 2025 09:30:07 +0700 Subject: [PATCH 6/7] Make report field read-only if the expense doesn't have per diem --- .../MoneyRequestConfirmationListFooter.tsx | 14 ++------------ .../ReportActionItem/MoneyRequestView.tsx | 7 +++++-- 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/src/components/MoneyRequestConfirmationListFooter.tsx b/src/components/MoneyRequestConfirmationListFooter.tsx index 59eb3315e0dd..86d8c030a51e 100644 --- a/src/components/MoneyRequestConfirmationListFooter.tsx +++ b/src/components/MoneyRequestConfirmationListFooter.tsx @@ -273,7 +273,7 @@ function MoneyRequestConfirmationListFooter({ const [outstandingReportsByPolicyID] = useOnyx(ONYXKEYS.DERIVED.OUTSTANDING_REPORTS_BY_POLICY_ID, { canBeMissing: true, }); - const {policyForMovingExpensesID, shouldSelectPolicy} = usePolicyForMovingExpenses(isPerDiemRequest); + const {policyForMovingExpensesID, shouldSelectPolicy} = usePolicyForMovingExpenses(); const [currentUserLogin] = useOnyx(ONYXKEYS.SESSION, {selector: emailSelector, canBeMissing: true}); const isUnreported = transaction?.reportID === CONST.REPORT.UNREPORTED_REPORT_ID; @@ -789,17 +789,7 @@ function MoneyRequestConfirmationListFooter({ shouldRenderAsHTML /> ), - shouldShow: () => { - if (!isPolicyExpenseChat) { - return false; - } - - if (action !== CONST.IOU.ACTION.EDIT) { - return true; - } - - return !!(policyForMovingExpensesID ?? shouldSelectPolicy); - }, + shouldShow: isPolicyExpenseChat, }, ]; diff --git a/src/components/ReportActionItem/MoneyRequestView.tsx b/src/components/ReportActionItem/MoneyRequestView.tsx index 6aa856575db5..ca8e17e5d753 100644 --- a/src/components/ReportActionItem/MoneyRequestView.tsx +++ b/src/components/ReportActionItem/MoneyRequestView.tsx @@ -263,8 +263,11 @@ function MoneyRequestView({ const canEditDistance = isEditable && canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.DISTANCE, undefined, isChatReportArchived); const canEditDistanceRate = isEditable && canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.DISTANCE_RATE, undefined, isChatReportArchived); const canEditReport = useMemo( - () => isEditable && canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.REPORT, undefined, isChatReportArchived, outstandingReportsByPolicyID), - [isEditable, parentReportAction, isChatReportArchived, outstandingReportsByPolicyID], + () => + isEditable && canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.REPORT, undefined, isChatReportArchived, outstandingReportsByPolicyID) && isPerDiemRequest + ? !!policyForMovingExpensesID && !shouldSelectPolicy + : true, + [isEditable, parentReportAction, isChatReportArchived, outstandingReportsByPolicyID, isPerDiemRequest, policyForMovingExpensesID, shouldSelectPolicy], ); // A flag for verifying that the current report is a sub-report of a expense chat From cf1ba495c1340e855aaef4e8a2382c1b98afbf96 Mon Sep 17 00:00:00 2001 From: huutech <20178761+huult@users.noreply.github.com> Date: Fri, 21 Nov 2025 12:39:18 +0700 Subject: [PATCH 7/7] Check if expense is per diem, then verify if it can be submitted to allow editing --- .../ReportActionItem/MoneyRequestView.tsx | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/components/ReportActionItem/MoneyRequestView.tsx b/src/components/ReportActionItem/MoneyRequestView.tsx index b0f1b1b95863..3548b2dcdf98 100644 --- a/src/components/ReportActionItem/MoneyRequestView.tsx +++ b/src/components/ReportActionItem/MoneyRequestView.tsx @@ -36,7 +36,7 @@ import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID'; import {getRateFromMerchant, getReportIDForExpense} from '@libs/MergeTransactionUtils'; import {hasEnabledOptions} from '@libs/OptionsListUtils'; import Parser from '@libs/Parser'; -import {getLengthOfTag, getTagLists, hasDependentTags as hasDependentTagsPolicyUtils, isTaxTrackingEnabled} from '@libs/PolicyUtils'; +import {canSubmitPerDiemExpenseFromWorkspace, getLengthOfTag, getTagLists, hasDependentTags as hasDependentTagsPolicyUtils, isTaxTrackingEnabled} from '@libs/PolicyUtils'; import {getOriginalMessage, isMoneyRequestAction} from '@libs/ReportActionsUtils'; import {isSplitAction} from '@libs/ReportSecondaryActionUtils'; import type {TransactionDetails} from '@libs/ReportUtils'; @@ -155,8 +155,7 @@ function MoneyRequestView({ }, [parentReportAction]); const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${getNonEmptyStringOnyxID(linkedTransactionID)}`, {canBeMissing: true}); const isExpenseUnreported = isExpenseUnreportedTransactionUtils(updatedTransaction ?? transaction); - const isPerDiemRequest = isPerDiemRequestTransactionUtils(transaction); - const {policyForMovingExpensesID, policyForMovingExpenses, shouldSelectPolicy} = usePolicyForMovingExpenses(isPerDiemRequest); + const {policyForMovingExpensesID, policyForMovingExpenses, shouldSelectPolicy} = usePolicyForMovingExpenses(); // 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 const policy = isExpenseUnreported ? policyForMovingExpenses : expensePolicy; const policyID = isExpenseUnreported ? policyForMovingExpensesID : report?.policyID; @@ -211,7 +210,7 @@ function MoneyRequestView({ const isDistanceRequest = isDistanceRequestTransactionUtils(transaction); const isManualDistanceRequest = isManualDistanceRequestTransactionUtils(transaction); const isMapDistanceRequest = isDistanceRequest && !isManualDistanceRequest; - + const isPerDiemRequest = isPerDiemRequestTransactionUtils(transaction); const isTransactionScanning = isScanning(updatedTransaction ?? transaction); const hasRoute = hasRouteTransactionUtils(transactionBackup ?? transaction, isDistanceRequest); @@ -264,10 +263,10 @@ function MoneyRequestView({ const canEditDistanceRate = isEditable && canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.DISTANCE_RATE, undefined, isChatReportArchived); const canEditReport = useMemo( () => - isEditable && canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.REPORT, undefined, isChatReportArchived, outstandingReportsByPolicyID) && isPerDiemRequest - ? !!policyForMovingExpensesID && !shouldSelectPolicy - : true, - [isEditable, parentReportAction, isChatReportArchived, outstandingReportsByPolicyID, isPerDiemRequest, policyForMovingExpensesID, shouldSelectPolicy], + isEditable && + canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.REPORT, undefined, isChatReportArchived, outstandingReportsByPolicyID) && + (!isPerDiemRequest || canSubmitPerDiemExpenseFromWorkspace(policy)), + [isEditable, parentReportAction, isChatReportArchived, outstandingReportsByPolicyID, isPerDiemRequest, policy], ); // A flag for verifying that the current report is a sub-report of a expense chat @@ -293,7 +292,6 @@ function MoneyRequestView({ policy?.defaultReimbursable !== undefined && !!(updatedTransaction?.reimbursable ?? transactionReimbursable) !== policy.defaultReimbursable; const shouldShowReimbursable = (isPolicyExpenseChat || isExpenseUnreported) && - !!policyForMovingExpensesID && (policy?.disabledFields?.reimbursable !== true || isCurrentTransactionReimbursableDifferentFromPolicyDefault) && !isCardTransaction && !isInvoice;