diff --git a/src/components/MoneyReportHeader.tsx b/src/components/MoneyReportHeader.tsx index bcfbf3e51c24..f4173ce774c7 100644 --- a/src/components/MoneyReportHeader.tsx +++ b/src/components/MoneyReportHeader.tsx @@ -1404,6 +1404,7 @@ function MoneyReportHeader({ [CONST.REPORT.SECONDARY_ACTIONS.PAY]: { text: translate('iou.settlePayment', {formattedAmount: totalAmount}), icon: expensifyIcons.Cash, + rightIcon: expensifyIcons.ArrowRight, value: CONST.REPORT.SECONDARY_ACTIONS.PAY, backButtonText: translate('iou.settlePayment', {formattedAmount: totalAmount}), sentryLabel: CONST.SENTRY_LABEL.MORE_MENU.PAY, diff --git a/src/libs/ReportPreviewActionUtils.ts b/src/libs/ReportPreviewActionUtils.ts index 1f3abf711759..c947d1a0a76e 100644 --- a/src/libs/ReportPreviewActionUtils.ts +++ b/src/libs/ReportPreviewActionUtils.ts @@ -104,8 +104,12 @@ function canPay(report: Report, isReportArchived: boolean, currentUserAccountID: const {reimbursableSpend} = getMoneyRequestSpendBreakdown(report); const isReimbursed = isSettled(report); + const isExported = report.isExportedToIntegration ?? false; + const hasExportError = report?.hasExportError ?? false; + const didExportFail = !isExported && hasExportError; + if (isExpense && isReportPayer && isPaymentsEnabled && isReportFinished && reimbursableSpend !== 0) { - return true; + return !didExportFail; } if (!isProcessing) { diff --git a/src/libs/ReportPrimaryActionUtils.ts b/src/libs/ReportPrimaryActionUtils.ts index 9af38883a0bb..910b081e79dc 100644 --- a/src/libs/ReportPrimaryActionUtils.ts +++ b/src/libs/ReportPrimaryActionUtils.ts @@ -154,7 +154,15 @@ function isApproveAction(report: Report, reportTransactions: Transaction[], poli return isProcessingReportUtils(report); } -function isPrimaryPayAction(report: Report, policy?: Policy, reportNameValuePairs?: ReportNameValuePairs, isChatReportArchived?: boolean, invoiceReceiverPolicy?: Policy) { +function isPrimaryPayAction( + report: Report, + policy?: Policy, + reportNameValuePairs?: ReportNameValuePairs, + isChatReportArchived?: boolean, + invoiceReceiverPolicy?: Policy, + reportActions?: ReportAction[], + isSecondaryAction?: boolean, +) { if (isArchivedReport(reportNameValuePairs) || isChatReportArchived) { return false; } @@ -164,6 +172,9 @@ function isPrimaryPayAction(report: Report, policy?: Policy, reportNameValuePair const isReportApproved = isReportApprovedUtils({report}); const isReportClosed = isClosedReportUtils(report); const isProcessingReport = isProcessingReportUtils(report); + const isExported = isExportedUtil(reportActions); + const hasExportError = hasExportErrorUtil(reportActions, report); + const didExportFail = !isExported && hasExportError; const isApprovalEnabled = policy ? policy.approvalMode && policy.approvalMode !== CONST.POLICY.APPROVAL_MODE.OPTIONAL : false; const isSubmittedWithoutApprovalsEnabled = !isApprovalEnabled && isProcessingReport; @@ -172,7 +183,7 @@ function isPrimaryPayAction(report: Report, policy?: Policy, reportNameValuePair const {reimbursableSpend} = getMoneyRequestSpendBreakdown(report); if (isReportPayer && isExpenseReport && arePaymentsEnabled && isReportFinished && reimbursableSpend !== 0) { - return true; + return isSecondaryAction ?? !didExportFail; } if (!isProcessingReport) { @@ -404,7 +415,8 @@ function getReportPrimaryAction(params: GetReportPrimaryActionParams): ValueOf> { const options: Array> = []; - if (isPrimaryPayAction(report, policy, reportNameValuePairs) && hasOnlyHeldExpenses(report?.reportID)) { + const isExported = isExportedUtils(reportActions); + const hasExportError = hasExportErrorUtils(reportActions, report); + const didExportFail = !isExported && hasExportError; + + if (isPrimaryPayAction(report, policy, reportNameValuePairs, isChatReportArchived, undefined, reportActions, true) && (hasOnlyHeldExpenses(report?.reportID) || didExportFail)) { options.push(CONST.REPORT.SECONDARY_ACTIONS.PAY); }