Skip to content

Commit d5c6449

Browse files
authored
Merge pull request Expensify#67254 from dukenv0307/update-isReviewDuplicatesAction-logic
update isReportApprover to compare managerID with current account ID
2 parents b73ebe2 + cfe480c commit d5c6449

2 files changed

Lines changed: 92 additions & 6 deletions

File tree

src/libs/ReportPrimaryActionUtils.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import {
3333
isPayer,
3434
isProcessingReport as isProcessingReportUtils,
3535
isReportApproved as isReportApprovedUtils,
36+
isReportManager,
3637
isSettled,
3738
} from './ReportUtils';
3839
import {getSession} from './SessionUtils';
@@ -248,14 +249,14 @@ function isRemoveHoldAction(report: Report, chatReport: OnyxEntry<Report>, repor
248249
return isHolder;
249250
}
250251

251-
function isReviewDuplicatesAction(report: Report, reportTransactions: Transaction[], policy?: Policy) {
252+
function isReviewDuplicatesAction(report: Report, reportTransactions: Transaction[]) {
252253
const hasDuplicates = reportTransactions.some((transaction) => isDuplicate(transaction));
253254

254255
if (!hasDuplicates) {
255256
return false;
256257
}
257258

258-
const isReportApprover = isApproverUtils(policy, getCurrentUserAccountID());
259+
const isReportApprover = isReportManager(report);
259260
const isReportSubmitter = isCurrentUserSubmitter(report);
260261
const isProcessingReport = isProcessingReportUtils(report);
261262
const isReportOpen = isOpenReportUtils(report);
@@ -314,7 +315,7 @@ function getReportPrimaryAction(params: GetReportPrimaryActionParams): ValueOf<t
314315
return CONST.REPORT.PRIMARY_ACTIONS.MARK_AS_CASH;
315316
}
316317

317-
if (isReviewDuplicatesAction(report, reportTransactions, policy)) {
318+
if (isReviewDuplicatesAction(report, reportTransactions)) {
318319
return CONST.REPORT.PRIMARY_ACTIONS.REVIEW_DUPLICATES;
319320
}
320321

@@ -376,7 +377,7 @@ function getTransactionThreadPrimaryAction(
376377
return CONST.REPORT.TRANSACTION_PRIMARY_ACTIONS.REMOVE_HOLD;
377378
}
378379

379-
if (isReviewDuplicatesAction(parentReport, [reportTransaction], policy)) {
380+
if (isReviewDuplicatesAction(parentReport, [reportTransaction])) {
380381
return CONST.REPORT.TRANSACTION_PRIMARY_ACTIONS.REVIEW_DUPLICATES;
381382
}
382383

@@ -387,4 +388,4 @@ function getTransactionThreadPrimaryAction(
387388
return '';
388389
}
389390

390-
export {getReportPrimaryAction, getTransactionThreadPrimaryAction, isAddExpenseAction, isPrimaryPayAction, isExportAction, getAllExpensesToHoldIfApplicable};
391+
export {getReportPrimaryAction, getTransactionThreadPrimaryAction, isAddExpenseAction, isPrimaryPayAction, isExportAction, getAllExpensesToHoldIfApplicable, isReviewDuplicatesAction};

tests/unit/ReportPrimaryActionUtilsTest.ts

Lines changed: 86 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import {renderHook} from '@testing-library/react-native';
22
import Onyx from 'react-native-onyx';
33
import useReportIsArchived from '@hooks/useReportIsArchived';
4-
import {getReportPrimaryAction, getTransactionThreadPrimaryAction} from '@libs/ReportPrimaryActionUtils';
4+
import {getReportPrimaryAction, getTransactionThreadPrimaryAction, isReviewDuplicatesAction} from '@libs/ReportPrimaryActionUtils';
55
import CONST from '@src/CONST';
66
import ONYXKEYS from '@src/ONYXKEYS';
77
import type {Policy, Report, ReportAction, Transaction, TransactionViolation} from '@src/types/onyx';
@@ -572,6 +572,91 @@ describe('getPrimaryAction', () => {
572572
});
573573
});
574574

575+
describe('isReviewDuplicatesAction', () => {
576+
beforeAll(() => {
577+
Onyx.init({
578+
keys: ONYXKEYS,
579+
});
580+
});
581+
582+
beforeEach(async () => {
583+
jest.clearAllMocks();
584+
Onyx.clear();
585+
await Onyx.merge(ONYXKEYS.SESSION, SESSION);
586+
await Onyx.set(ONYXKEYS.PERSONAL_DETAILS_LIST, {[CURRENT_USER_ACCOUNT_ID]: PERSONAL_DETAILS});
587+
});
588+
589+
it('should return true when report approver has duplicated transactions', async () => {
590+
const report = {
591+
reportID: REPORT_ID,
592+
type: CONST.REPORT.TYPE.EXPENSE,
593+
ownerAccountID: 999,
594+
managerID: CURRENT_USER_ACCOUNT_ID,
595+
stateNum: CONST.REPORT.STATE_NUM.OPEN,
596+
statusNum: CONST.REPORT.STATUS_NUM.OPEN,
597+
} as unknown as Report;
598+
await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${REPORT_ID}`, report);
599+
const TRANSACTION_ID = 'TRANSACTION_ID';
600+
const transaction = {
601+
transactionID: TRANSACTION_ID,
602+
} as unknown as Transaction;
603+
604+
await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION}${TRANSACTION_ID}`, transaction);
605+
await Onyx.set(`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${TRANSACTION_ID}`, [
606+
{
607+
name: CONST.VIOLATIONS.DUPLICATED_TRANSACTION,
608+
} as TransactionViolation,
609+
]);
610+
611+
expect(isReviewDuplicatesAction(report, [transaction])).toBe(true);
612+
});
613+
614+
it('should return false when report approver has no duplicated transactions', async () => {
615+
const report = {
616+
reportID: REPORT_ID,
617+
type: CONST.REPORT.TYPE.EXPENSE,
618+
ownerAccountID: 999,
619+
managerID: CURRENT_USER_ACCOUNT_ID,
620+
stateNum: CONST.REPORT.STATE_NUM.OPEN,
621+
statusNum: CONST.REPORT.STATUS_NUM.OPEN,
622+
} as unknown as Report;
623+
await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${REPORT_ID}`, report);
624+
const TRANSACTION_ID = 'TRANSACTION_ID';
625+
const transaction = {
626+
transactionID: TRANSACTION_ID,
627+
} as unknown as Transaction;
628+
629+
await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION}${TRANSACTION_ID}`, transaction);
630+
631+
expect(isReviewDuplicatesAction(report, [transaction])).toBe(false);
632+
});
633+
634+
it('should return false when current user is neither the report submitter nor approver', async () => {
635+
const report = {
636+
reportID: REPORT_ID,
637+
type: CONST.REPORT.TYPE.EXPENSE,
638+
ownerAccountID: 999,
639+
managerID: 888,
640+
stateNum: CONST.REPORT.STATE_NUM.OPEN,
641+
statusNum: CONST.REPORT.STATUS_NUM.OPEN,
642+
} as unknown as Report;
643+
await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${REPORT_ID}`, report);
644+
const TRANSACTION_ID = 'TRANSACTION_ID';
645+
const transaction = {
646+
transactionID: TRANSACTION_ID,
647+
} as unknown as Transaction;
648+
649+
await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION}${TRANSACTION_ID}`, transaction);
650+
await Onyx.set(`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${TRANSACTION_ID}`, [
651+
{
652+
name: CONST.VIOLATIONS.DUPLICATED_TRANSACTION,
653+
} as TransactionViolation,
654+
]);
655+
656+
expect(isReviewDuplicatesAction(report, [transaction])).toBe(false);
657+
});
658+
});
659+
575660
describe('getTransactionThreadPrimaryAction', () => {
576661
beforeAll(() => {
577662
Onyx.init({

0 commit comments

Comments
 (0)