Skip to content

Commit

Permalink
Merge pull request #55610 from shubham1206agra/fix-submit-button
Browse files Browse the repository at this point in the history
Fix submit button when there is only non-reimbursable expenses
  • Loading branch information
lakchote authored Jan 29, 2025
2 parents 0b6d785 + 9fd6d90 commit bbe73a2
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 8 deletions.
3 changes: 2 additions & 1 deletion src/components/MoneyReportHeader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,8 @@ function MoneyReportHeader({policy, report: moneyRequestReport, transactionThrea

const isAdmin = policy?.role === CONST.POLICY.ROLE.ADMIN;

const shouldShowSubmitButton = canSubmitReport(moneyRequestReport, policy, transactionIDs);
const filteredTransactions = transactions?.filter((t) => t) ?? [];
const shouldShowSubmitButton = canSubmitReport(moneyRequestReport, policy, filteredTransactions);

const shouldShowExportIntegrationButton = !shouldShowPayButton && !shouldShowSubmitButton && connectedIntegration && isAdmin && canBeExported(moneyRequestReport);

Expand Down
5 changes: 3 additions & 2 deletions src/components/ReportActionItem/ReportPreview.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -237,8 +237,8 @@ function ReportPreview({
const lastThreeTransactions = transactions?.slice(-3) ?? [];
const lastTransaction = transactions?.at(0);
const lastThreeReceipts = lastThreeTransactions.map((transaction) => ({...getThumbnailAndImageURIs(transaction), transaction}));
const transactionIDList = transactions?.map((reportTransaction) => reportTransaction.transactionID) ?? [];
const showRTERViolationMessage = numberOfRequests === 1 && hasPendingUI(lastTransaction, getTransactionViolations(lastTransaction?.transactionID, transactionViolations));
const transactionIDList = [lastTransaction?.transactionID].filter((transactionID): transactionID is string => transactionID !== undefined);
const shouldShowBrokenConnectionViolation = numberOfRequests === 1 && shouldShowBrokenConnectionViolationTransactionUtils(transactionIDList, iouReport, policy);
let formattedMerchant = numberOfRequests === 1 ? getMerchant(lastTransaction) : null;
const formattedDescription = numberOfRequests === 1 ? getDescription(lastTransaction) : null;
Expand All @@ -249,7 +249,8 @@ function ReportPreview({

const isArchived = isArchivedReportWithID(iouReport?.reportID);
const isAdmin = policy?.role === CONST.POLICY.ROLE.ADMIN;
const shouldShowSubmitButton = canSubmitReport(iouReport, policy, transactionIDList, transactionViolations);
const filteredTransactions = transactions?.filter((transaction) => transaction) ?? [];
const shouldShowSubmitButton = canSubmitReport(iouReport, policy, filteredTransactions, transactionViolations);

const shouldDisableSubmitButton = shouldShowSubmitButton && !isAllowedToSubmitDraftExpenseReport(iouReport);

Expand Down
3 changes: 1 addition & 2 deletions src/libs/SearchUIUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -363,8 +363,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;
}

Expand Down
14 changes: 11 additions & 3 deletions src/libs/actions/IOU.ts
Original file line number Diff line number Diff line change
Expand Up @@ -145,9 +145,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,
Expand Down Expand Up @@ -7913,21 +7917,25 @@ function canIOUBePaid(
function canSubmitReport(
report: OnyxEntry<OnyxTypes.Report> | SearchReport,
policy: OnyxEntry<OnyxTypes.Policy> | SearchPolicy,
transactionIDList: string[],
transactions: OnyxTypes.Transaction[] | SearchTransaction[],
allViolations?: OnyxCollection<OnyxTypes.TransactionViolations>,
) {
const currentUserAccountID = getCurrentUserAccountID();
const isOpenExpenseReport = isOpenExpenseReportReportUtils(report);
const isArchived = isArchivedReportWithID(report?.reportID);
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)
Expand Down

0 comments on commit bbe73a2

Please sign in to comment.