Skip to content
1 change: 1 addition & 0 deletions src/components/MoneyReportHeader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -1213,6 +1213,7 @@ function MoneyReportHeader({
[CONST.REPORT.SECONDARY_ACTIONS.PAY]: {
text: translate('iou.settlePayment', {formattedAmount: totalAmount}),
icon: Expensicons.Cash,
rightIcon: Expensicons.ArrowRight,
value: CONST.REPORT.SECONDARY_ACTIONS.PAY,
backButtonText: translate('iou.settlePayment', {formattedAmount: totalAmount}),
subMenuItems: Object.values(paymentButtonOptions),
Expand Down
20 changes: 16 additions & 4 deletions src/libs/ReportPrimaryActionUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,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;
}
Expand All @@ -147,6 +155,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;
Expand All @@ -155,7 +166,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) {
Expand Down Expand Up @@ -341,7 +352,8 @@ function getReportPrimaryAction(params: GetReportPrimaryActionParams): ValueOf<t
return '';
}

const isPayActionWithAllExpensesHeld = isPrimaryPayAction(report, policy, reportNameValuePairs, isChatReportArchived) && hasOnlyHeldExpenses(report?.reportID);
const isPayActionWithAllExpensesHeld =
isPrimaryPayAction(report, policy, reportNameValuePairs, isChatReportArchived, invoiceReceiverPolicy, reportActions) && hasOnlyHeldExpenses(report?.reportID);

if (isMarkAsCashAction(currentUserEmail, report, reportTransactions, violations, policy)) {
return CONST.REPORT.PRIMARY_ACTIONS.MARK_AS_CASH;
Expand All @@ -363,7 +375,7 @@ function getReportPrimaryAction(params: GetReportPrimaryActionParams): ValueOf<t
return CONST.REPORT.PRIMARY_ACTIONS.SUBMIT;
}

if (isPrimaryPayAction(report, policy, reportNameValuePairs, isChatReportArchived, invoiceReceiverPolicy)) {
if (isPrimaryPayAction(report, policy, reportNameValuePairs, isChatReportArchived, invoiceReceiverPolicy, reportActions)) {
return CONST.REPORT.PRIMARY_ACTIONS.PAY;
}

Expand Down
7 changes: 6 additions & 1 deletion src/libs/ReportSecondaryActionUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import {
canRejectReportAction,
doesReportContainRequestsFromMultipleUsers,
getTransactionDetails,
hasExportError as hasExportErrorUtils,
hasOnlyHeldExpenses,
hasOnlyNonReimbursableTransactions,
hasReportBeenReopened as hasReportBeenReopenedUtils,
Expand Down Expand Up @@ -606,7 +607,11 @@ function getSecondaryReportActions({
}): Array<ValueOf<typeof CONST.REPORT.SECONDARY_ACTIONS>> {
const options: Array<ValueOf<typeof CONST.REPORT.SECONDARY_ACTIONS>> = [];

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);
}

Expand Down
Loading