From cb72d57620a7fadaa874187268543b45a8845754 Mon Sep 17 00:00:00 2001 From: Shubham Agrawal Date: Wed, 22 Jan 2025 20:47:18 +0530 Subject: [PATCH 1/3] Fix submit button when there is only non-reimbursable expenses --- src/components/MoneyReportHeader.tsx | 2 +- src/components/ReportActionItem/ReportPreview.tsx | 4 ++-- src/libs/SearchUIUtils.ts | 3 +-- src/libs/actions/IOU.ts | 14 +++++++++++--- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/components/MoneyReportHeader.tsx b/src/components/MoneyReportHeader.tsx index 38d859def1f7..72f1fca58685 100644 --- a/src/components/MoneyReportHeader.tsx +++ b/src/components/MoneyReportHeader.tsx @@ -174,7 +174,7 @@ function MoneyReportHeader({policy, report: moneyRequestReport, transactionThrea const isAdmin = policy?.role === CONST.POLICY.ROLE.ADMIN; - const shouldShowSubmitButton = canSubmitReport(moneyRequestReport, policy, transactionIDs); + const shouldShowSubmitButton = canSubmitReport(moneyRequestReport, policy, allTransactions); const shouldShowExportIntegrationButton = !shouldShowPayButton && !shouldShowSubmitButton && connectedIntegration && isAdmin && canBeExported(moneyRequestReport); diff --git a/src/components/ReportActionItem/ReportPreview.tsx b/src/components/ReportActionItem/ReportPreview.tsx index cad4ffbf658a..0aeaf925ff50 100644 --- a/src/components/ReportActionItem/ReportPreview.tsx +++ b/src/components/ReportActionItem/ReportPreview.tsx @@ -235,7 +235,7 @@ function ReportPreview({ const lastThreeTransactions = allTransactions.slice(-3); const lastThreeReceipts = lastThreeTransactions.map((transaction) => ({...getThumbnailAndImageURIs(transaction), transaction})); const showRTERViolationMessage = numberOfRequests === 1 && hasPendingUI(allTransactions.at(0), getTransactionViolations(allTransactions.at(0)?.transactionID, transactionViolations)); - const transactionIDList = [allTransactions.at(0)?.transactionID].filter((transactionID): transactionID is string => transactionID !== undefined); + const transactionIDList = allTransactions.map((reportTransaction) => reportTransaction.transactionID); const shouldShowBrokenConnectionViolation = numberOfRequests === 1 && shouldShowBrokenConnectionViolationTransactionUtils(transactionIDList, iouReport, policy); let formattedMerchant = numberOfRequests === 1 ? getMerchant(allTransactions.at(0)) : null; const formattedDescription = numberOfRequests === 1 ? getDescription(allTransactions.at(0)) : null; @@ -246,7 +246,7 @@ function ReportPreview({ const isArchived = isArchivedReport(iouReport); const isAdmin = policy?.role === CONST.POLICY.ROLE.ADMIN; - const shouldShowSubmitButton = canSubmitReport(iouReport, policy, transactionIDList, transactionViolations); + const shouldShowSubmitButton = canSubmitReport(iouReport, policy, allTransactions, transactionViolations); const shouldDisableSubmitButton = shouldShowSubmitButton && !isAllowedToSubmitDraftExpenseReport(iouReport); diff --git a/src/libs/SearchUIUtils.ts b/src/libs/SearchUIUtils.ts index 58dcf4932b71..f47a0d56001d 100644 --- a/src/libs/SearchUIUtils.ts +++ b/src/libs/SearchUIUtils.ts @@ -340,8 +340,7 @@ function getAction(data: OnyxTypes.SearchResults['data'], key: string): SearchTr } // We check for isAllowedToApproveExpenseReport because if the policy has preventSelfApprovals enabled, we disable the Submit action and in that case we want to show the View action instead - const transactionIDList = allReportTransactions.map((reportTransaction) => reportTransaction.transactionID); - if (canSubmitReport(report, policy, transactionIDList, allViolations) && isAllowedToApproveExpenseReport) { + if (canSubmitReport(report, policy, allReportTransactions, allViolations) && isAllowedToApproveExpenseReport) { return CONST.SEARCH.ACTION_TYPES.SUBMIT; } diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index b2ec4478284c..78e6d22bb948 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -143,9 +143,13 @@ import { getTransaction, getUpdatedTransaction, hasReceipt as hasReceiptTransactionUtils, + isAmountMissing, isDistanceRequest as isDistanceRequestTransactionUtils, + isExpensifyCardTransaction, isFetchingWaypointsFromServer, isOnHold, + isPartialMerchant, + isPending, isPerDiemRequest as isPerDiemRequestTransactionUtils, isReceiptBeingScanned as isReceiptBeingScannedTransactionUtils, isScanRequest as isScanRequestTransactionUtils, @@ -7844,21 +7848,25 @@ function canIOUBePaid( function canSubmitReport( report: OnyxEntry | SearchReport, policy: OnyxEntry | SearchPolicy, - transactionIDList: string[], + transactions: OnyxTypes.Transaction[] | SearchTransaction[], allViolations?: OnyxCollection, ) { const currentUserAccountID = getCurrentUserAccountID(); const isOpenExpenseReport = isOpenExpenseReportReportUtils(report); const isArchived = isArchivedReport(report); - const {reimbursableSpend} = getMoneyRequestSpendBreakdown(report); const isAdmin = policy?.role === CONST.POLICY.ROLE.ADMIN; + const transactionIDList = transactions.map((transaction) => transaction.transactionID); const hasAllPendingRTERViolations = allHavePendingRTERViolation(transactionIDList, allViolations); const hasBrokenConnectionViolation = shouldShowBrokenConnectionViolation(transactionIDList, report, policy, allViolations); + const hasOnlyPendingCardOrScanFailTransactions = + transactions.length > 0 && + transactions.every((t) => (isExpensifyCardTransaction(t) && isPending(t)) || (isPartialMerchant(getMerchant(t)) && isAmountMissing(t)) || isReceiptBeingScannedTransactionUtils(t)); + return ( isOpenExpenseReport && !isArchived && - reimbursableSpend !== 0 && + !hasOnlyPendingCardOrScanFailTransactions && !hasAllPendingRTERViolations && !hasBrokenConnectionViolation && (report?.ownerAccountID === currentUserAccountID || isAdmin || report?.managerID === currentUserAccountID) From c598d0c64ea0266798beb2af00c1f23f38bbe85f Mon Sep 17 00:00:00 2001 From: Shubham Agrawal Date: Mon, 27 Jan 2025 19:45:18 +0530 Subject: [PATCH 2/3] Fix lint --- src/components/MoneyReportHeader.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/MoneyReportHeader.tsx b/src/components/MoneyReportHeader.tsx index 6a887fb9e85c..4391d7e72424 100644 --- a/src/components/MoneyReportHeader.tsx +++ b/src/components/MoneyReportHeader.tsx @@ -178,7 +178,8 @@ function MoneyReportHeader({policy, report: moneyRequestReport, transactionThrea const isAdmin = policy?.role === CONST.POLICY.ROLE.ADMIN; - const shouldShowSubmitButton = canSubmitReport(moneyRequestReport, policy, allTransactions); + const filteredTransactions = transactions?.filter((t) => !t) ?? []; + const shouldShowSubmitButton = canSubmitReport(moneyRequestReport, policy, filteredTransactions); const shouldShowExportIntegrationButton = !shouldShowPayButton && !shouldShowSubmitButton && connectedIntegration && isAdmin && canBeExported(moneyRequestReport); From 9fd6d90e28c3d5d9bd9961bb05133dc79e96db86 Mon Sep 17 00:00:00 2001 From: Shubham Agrawal Date: Wed, 29 Jan 2025 19:29:53 +0530 Subject: [PATCH 3/3] Fix filtering condition --- src/components/MoneyReportHeader.tsx | 2 +- src/components/ReportActionItem/ReportPreview.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/MoneyReportHeader.tsx b/src/components/MoneyReportHeader.tsx index 08cc339afbb5..1d6c3fe4cfba 100644 --- a/src/components/MoneyReportHeader.tsx +++ b/src/components/MoneyReportHeader.tsx @@ -176,7 +176,7 @@ function MoneyReportHeader({policy, report: moneyRequestReport, transactionThrea const isAdmin = policy?.role === CONST.POLICY.ROLE.ADMIN; - const filteredTransactions = transactions?.filter((t) => !t) ?? []; + const filteredTransactions = transactions?.filter((t) => t) ?? []; const shouldShowSubmitButton = canSubmitReport(moneyRequestReport, policy, filteredTransactions); const shouldShowExportIntegrationButton = !shouldShowPayButton && !shouldShowSubmitButton && connectedIntegration && isAdmin && canBeExported(moneyRequestReport); diff --git a/src/components/ReportActionItem/ReportPreview.tsx b/src/components/ReportActionItem/ReportPreview.tsx index e395529a18a7..e975bcb94481 100644 --- a/src/components/ReportActionItem/ReportPreview.tsx +++ b/src/components/ReportActionItem/ReportPreview.tsx @@ -249,7 +249,7 @@ function ReportPreview({ const isArchived = isArchivedReportWithID(iouReport?.reportID); const isAdmin = policy?.role === CONST.POLICY.ROLE.ADMIN; - const filteredTransactions = transactions?.filter((transaction) => !transaction) ?? []; + const filteredTransactions = transactions?.filter((transaction) => transaction) ?? []; const shouldShowSubmitButton = canSubmitReport(iouReport, policy, filteredTransactions, transactionViolations); const shouldDisableSubmitButton = shouldShowSubmitButton && !isAllowedToSubmitDraftExpenseReport(iouReport);