diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index e16c5c7abe56..4a9757858c13 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -1454,6 +1454,22 @@ function isMoneyRequestReport(reportOrID: OnyxInputOrEntry | string): bo return isIOUReport(report) || isExpenseReport(report); } +/** + * Checks if a report contains only Non-Reimbursable transactions + */ +function hasOnlyNonReimbursableTransactions(iouReportID: string | undefined): boolean { + if (!iouReportID) { + return false; + } + + const transactions = TransactionUtils.getAllReportTransactions(iouReportID); + if (!transactions || transactions.length === 0) { + return false; + } + + return transactions.every((transaction) => !TransactionUtils.getReimbursable(transaction)); +} + /** * Checks if a report has only one transaction associated with it */ @@ -1553,6 +1569,11 @@ function canAddOrDeleteTransactions(moneyRequestReport: OnyxEntry): bool return false; } + const policy = getPolicy(moneyRequestReport?.policyID); + if (PolicyUtils.isInstantSubmitEnabled(policy) && PolicyUtils.isSubmitAndClose(policy) && hasOnlyNonReimbursableTransactions(moneyRequestReport?.reportID)) { + return false; + } + if (isReportApproved(moneyRequestReport) || isSettled(moneyRequestReport?.reportID)) { return false; } @@ -7383,6 +7404,7 @@ export { getChatUsedForOnboarding, findPolicyExpenseChatByPolicyID, isIndividualInvoiceRoom, + hasOnlyNonReimbursableTransactions, }; export type { diff --git a/src/libs/TransactionUtils.ts b/src/libs/TransactionUtils.ts index b28e5b782965..c8bfa316ca15 100644 --- a/src/libs/TransactionUtils.ts +++ b/src/libs/TransactionUtils.ts @@ -387,6 +387,13 @@ function getDistance(transaction: OnyxInputOrEntry): number { return transaction?.comment?.customUnit?.quantity ?? 0; } +/** + * Return the reimbursable value. Defaults to true to match BE logic. + */ +function getReimbursable(transaction: Transaction): boolean { + return transaction?.reimbursable ?? true; +} + /** * Return the mccGroup field from the transaction, return the modifiedMCCGroup if present. */ @@ -878,6 +885,7 @@ export { isCustomUnitRateIDForP2P, getRateID, getTransaction, + getReimbursable, }; export type {TransactionChanges};