Skip to content

Commit b5b8f9d

Browse files
authored
Merge pull request Expensify#89513 from KJ21-ENG/fix/89173-auditor-accounting-saved-searches
feat: expose Accounting suggested searches to Auditors
2 parents 2d3ef28 + 59b99d5 commit b5b8f9d

2 files changed

Lines changed: 95 additions & 5 deletions

File tree

src/libs/SearchUIUtils.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1071,6 +1071,7 @@ function getSuggestedSearchesVisibility(
10711071
const isPaidPolicy = isPaidGroupPolicy(policy);
10721072
const isPayer = isPolicyPayer(policy, currentUserEmail);
10731073
const isAdmin = policy.role === CONST.POLICY.ROLE.ADMIN;
1074+
const isAuditor = policy.role === CONST.POLICY.ROLE.AUDITOR;
10741075
const isExporter = policy.exporter === currentUserEmail;
10751076

10761077
const isSubmittedTo =
@@ -1091,11 +1092,10 @@ function getSuggestedSearchesVisibility(
10911092
const isPolicyEligibleForApproveSuggestion = isPaidPolicy && isEligibleForApproveSuggestion(policy.approvalMode, isUserApprover, isSubmittedTo);
10921093
const isEligibleForExportSuggestion = isExporter && !hasExportError;
10931094
const isEligibleForStatementsSuggestion = isPaidPolicy && !!policy.areCompanyCardsEnabled && hasCardFeed;
1094-
const isEligibleForUnapprovedCashSuggestion = isPaidPolicy && isAdmin && isApprovalEnabled && isPaymentEnabled;
1095-
const isEligibleForUnapprovedCardSuggestion = isPaidPolicy && isAdmin && isApprovalEnabled && (hasCardFeed || !!defaultExpensifyCard);
1096-
const isEligibleForExpensifyCardSuggestion = isPaidPolicy && isAdmin && isECardEnabled;
1097-
const isEligibleForReimbursementsSuggestion = isPaidPolicy && isAdmin && isPaymentEnabled && hasVBBA && hasReimburser;
1098-
const isAuditor = policy.role === CONST.POLICY.ROLE.AUDITOR;
1095+
const isEligibleForUnapprovedCashSuggestion = isPaidPolicy && (isAdmin || isAuditor) && isApprovalEnabled && isPaymentEnabled;
1096+
const isEligibleForUnapprovedCardSuggestion = isPaidPolicy && (isAdmin || isAuditor) && isApprovalEnabled && (hasCardFeed || !!defaultExpensifyCard);
1097+
const isEligibleForExpensifyCardSuggestion = isPaidPolicy && (isAdmin || isAuditor) && isECardEnabled;
1098+
const isEligibleForReimbursementsSuggestion = isPaidPolicy && (isAdmin || isAuditor) && isPaymentEnabled && hasVBBA && hasReimburser;
10991099
const memberCount = Object.keys(policy.employeeList ?? {}).length;
11001100
const isEligibleForTopSpendersSuggestion = isPaidPolicy && (isAdmin || isAuditor || isUserApprover) && memberCount >= 2;
11011101
const isEligibleForTopCategoriesSuggestion = isPaidPolicy && policy.areCategoriesEnabled === true;

tests/unit/Search/SearchUIUtilsTest.ts

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7751,6 +7751,96 @@ describe('SearchUIUtils', () => {
77517751
const response = SearchUIUtils.getSuggestedSearchesVisibility(regularEmail, {}, policies, undefined);
77527752
expect(response.visibility.topSpenders).toBe(false);
77537753
});
7754+
7755+
test('Should show Unapproved Cash for Auditor role in paid policy with approvals and payments enabled', () => {
7756+
const auditorEmail = 'auditor@policy.com';
7757+
const policyKey = `policy_${policyID}`;
7758+
7759+
const policies: OnyxCollection<OnyxTypes.Policy> = {
7760+
[policyKey]: {
7761+
id: policyID,
7762+
type: CONST.POLICY.TYPE.TEAM,
7763+
role: CONST.POLICY.ROLE.AUDITOR,
7764+
approvalMode: CONST.POLICY.APPROVAL_MODE.ADVANCED,
7765+
} as OnyxTypes.Policy,
7766+
};
7767+
7768+
const response = SearchUIUtils.getSuggestedSearchesVisibility(auditorEmail, {}, policies, undefined);
7769+
expect(response.visibility.unapprovedCash).toBe(true);
7770+
});
7771+
7772+
test('Should show Unapproved Card for Auditor role in paid policy with approvals enabled and a default Expensify card', () => {
7773+
const auditorEmail = 'auditor@policy.com';
7774+
const policyKey = `policy_${policyID}`;
7775+
7776+
const policies: OnyxCollection<OnyxTypes.Policy> = {
7777+
[policyKey]: {
7778+
id: policyID,
7779+
type: CONST.POLICY.TYPE.TEAM,
7780+
role: CONST.POLICY.ROLE.AUDITOR,
7781+
approvalMode: CONST.POLICY.APPROVAL_MODE.ADVANCED,
7782+
} as OnyxTypes.Policy,
7783+
};
7784+
7785+
const response = SearchUIUtils.getSuggestedSearchesVisibility(auditorEmail, {}, policies, {} as CardFeedForDisplay);
7786+
expect(response.visibility.unapprovedCard).toBe(true);
7787+
});
7788+
7789+
test('Should show Reconciliation for Auditor role in paid policy with Expensify Cards enabled', () => {
7790+
const auditorEmail = 'auditor@policy.com';
7791+
const policyKey = `policy_${policyID}`;
7792+
7793+
const policies: OnyxCollection<OnyxTypes.Policy> = {
7794+
[policyKey]: {
7795+
id: policyID,
7796+
type: CONST.POLICY.TYPE.TEAM,
7797+
role: CONST.POLICY.ROLE.AUDITOR,
7798+
areExpensifyCardsEnabled: true,
7799+
} as OnyxTypes.Policy,
7800+
};
7801+
7802+
const response = SearchUIUtils.getSuggestedSearchesVisibility(auditorEmail, {}, policies, undefined);
7803+
expect(response.visibility.reconciliation).toBe(true);
7804+
});
7805+
7806+
test('Should hide Unapproved Cash, Unapproved Card, and Reconciliation for User role even when prerequisites are met', () => {
7807+
const userEmail = 'user@policy.com';
7808+
const policyKey = `policy_${policyID}`;
7809+
7810+
const policies: OnyxCollection<OnyxTypes.Policy> = {
7811+
[policyKey]: {
7812+
id: policyID,
7813+
type: CONST.POLICY.TYPE.TEAM,
7814+
role: CONST.POLICY.ROLE.USER,
7815+
approvalMode: CONST.POLICY.APPROVAL_MODE.ADVANCED,
7816+
areExpensifyCardsEnabled: true,
7817+
} as OnyxTypes.Policy,
7818+
};
7819+
7820+
const response = SearchUIUtils.getSuggestedSearchesVisibility(userEmail, {}, policies, {} as CardFeedForDisplay);
7821+
expect(response.visibility.unapprovedCash).toBe(false);
7822+
expect(response.visibility.unapprovedCard).toBe(false);
7823+
expect(response.visibility.reconciliation).toBe(false);
7824+
});
7825+
7826+
test('Should still show Unapproved Cash, Unapproved Card, and Reconciliation for Admin role when prerequisites are met (regression)', () => {
7827+
const policyKey = `policy_${policyID}`;
7828+
7829+
const policies: OnyxCollection<OnyxTypes.Policy> = {
7830+
[policyKey]: {
7831+
id: policyID,
7832+
type: CONST.POLICY.TYPE.TEAM,
7833+
role: CONST.POLICY.ROLE.ADMIN,
7834+
approvalMode: CONST.POLICY.APPROVAL_MODE.ADVANCED,
7835+
areExpensifyCardsEnabled: true,
7836+
} as OnyxTypes.Policy,
7837+
};
7838+
7839+
const response = SearchUIUtils.getSuggestedSearchesVisibility(adminEmail, {}, policies, {} as CardFeedForDisplay);
7840+
expect(response.visibility.unapprovedCash).toBe(true);
7841+
expect(response.visibility.unapprovedCard).toBe(true);
7842+
expect(response.visibility.reconciliation).toBe(true);
7843+
});
77547844
});
77557845

77567846
describe('Test getSuggestedSearches sort defaults', () => {

0 commit comments

Comments
 (0)