diff --git a/src/libs/ReportPrimaryActionUtils.ts b/src/libs/ReportPrimaryActionUtils.ts index be2e8682ad76..4671c8c9c35a 100644 --- a/src/libs/ReportPrimaryActionUtils.ts +++ b/src/libs/ReportPrimaryActionUtils.ts @@ -134,7 +134,8 @@ function isSubmitAction( const reportTransactionsList = reportTransactions ?? []; const hasNoSubmittableTransaction = - reportTransactionsList.length > 0 && reportTransactionsList.every((transaction) => isScanning(transaction) || hasSmartScanFailedWithMissingFields([transaction], report)); + reportTransactionsList.length > 0 && + reportTransactionsList.every((transaction) => isScanning(transaction) || isPending(transaction) || hasSmartScanFailedWithMissingFields([transaction], report)); if (hasNoSubmittableTransaction) { return false; diff --git a/tests/unit/TodosUtilsTest.ts b/tests/unit/TodosUtilsTest.ts index 8fbd4258ba2b..c774aa5d12e3 100644 --- a/tests/unit/TodosUtilsTest.ts +++ b/tests/unit/TodosUtilsTest.ts @@ -248,6 +248,25 @@ describe('TodosUtils', () => { expect(result.reportsToSubmit).toEqual([]); }); + it('excludes a report whose expenses are all pending card transactions', () => { + const pendingOverride: Partial = {status: CONST.TRANSACTION.STATUS.PENDING}; + const submitReport = createMockReport('pending_submit', { + stateNum: CONST.REPORT.STATE_NUM.OPEN, + statusNum: CONST.REPORT.STATUS_NUM.OPEN, + ownerAccountID: CURRENT_USER_ACCOUNT_ID, + }); + const policy = createMockPolicy(POLICY_ID, {role: CONST.POLICY.ROLE.ADMIN, ownerAccountID: CURRENT_USER_ACCOUNT_ID}); + + const result = createTodosReportsAndTransactions({ + ...baseParams, + allReports: toReportsCollection([submitReport]), + allTransactions: toTransactionsCollection([createMockTransaction('trans_pending', 'pending_submit', pendingOverride)]), + allPolicies: toPoliciesCollection([policy]), + }); + + expect(result.reportsToSubmit).toEqual([]); + }); + it('ignores non-expense reports', () => { const chatReport = createMockReport('chat_report', {type: CONST.REPORT.TYPE.CHAT, ownerAccountID: CURRENT_USER_ACCOUNT_ID}); const policy = createMockPolicy(POLICY_ID, {role: CONST.POLICY.ROLE.ADMIN, ownerAccountID: CURRENT_USER_ACCOUNT_ID}); @@ -319,5 +338,24 @@ describe('TodosUtils', () => { expect(result.reports).toEqual([]); }); + + it('excludes a report whose expenses are all pending card transactions from its bucket', () => { + const pendingOverride: Partial = {status: CONST.TRANSACTION.STATUS.PENDING}; + const submitReport = createMockReport('pending_submit', { + stateNum: CONST.REPORT.STATE_NUM.OPEN, + statusNum: CONST.REPORT.STATUS_NUM.OPEN, + ownerAccountID: CURRENT_USER_ACCOUNT_ID, + }); + const policy = createMockPolicy(POLICY_ID, {role: CONST.POLICY.ROLE.ADMIN, ownerAccountID: CURRENT_USER_ACCOUNT_ID}); + + const result = getTodoReportsForSearchKey(CONST.SEARCH.SEARCH_KEYS.SUBMIT, { + ...baseParams, + allReports: toReportsCollection([submitReport]), + allTransactions: toTransactionsCollection([createMockTransaction('trans_pending', 'pending_submit', pendingOverride)]), + allPolicies: toPoliciesCollection([policy]), + }); + + expect(result.reports).toEqual([]); + }); }); });