Skip to content

Commit fbbe11b

Browse files
committed
updated canAddTransaction
1 parent 4053d40 commit fbbe11b

8 files changed

Lines changed: 50 additions & 40 deletions

File tree

src/components/BrokenConnectionDescription.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ function BrokenConnectionDescription({transactionID, policy, report}: BrokenConn
3939
return translate('violations.brokenConnection530Error');
4040
}
4141

42-
if (isPolicyAdmin && !isCurrentUserSubmitter(report?.reportID)) {
42+
if (isPolicyAdmin && !isCurrentUserSubmitter(report)) {
4343
return (
4444
<>
4545
{`${translate('violations.adminBrokenConnectionError')}`}

src/libs/ReportPreviewActionUtils.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ function canSubmit(
5353
}
5454

5555
const isExpense = isExpenseReport(report);
56-
const isSubmitter = isCurrentUserSubmitter(report.reportID);
56+
const isSubmitter = isCurrentUserSubmitter(report);
5757
const isOpen = isOpenReport(report);
5858
const isManager = report.managerID === getCurrentUserAccountID();
5959
const isAdmin = policy?.role === CONST.POLICY.ROLE.ADMIN;
@@ -107,7 +107,7 @@ function canApprove(report: Report, violations: OnyxCollection<TransactionViolat
107107
}
108108

109109
const isPreventSelfApprovalEnabled = policy?.preventSelfApproval;
110-
const isReportSubmitter = isCurrentUserSubmitter(report.reportID);
110+
const isReportSubmitter = isCurrentUserSubmitter(report);
111111

112112
if (isPreventSelfApprovalEnabled && isReportSubmitter) {
113113
return false;
@@ -209,7 +209,7 @@ function canReview(report: Report, violations: OnyxCollection<TransactionViolati
209209
hasViolations(report.reportID, violations) ||
210210
hasNoticeTypeViolations(report.reportID, violations, true) ||
211211
hasWarningTypeViolations(report.reportID, violations, true);
212-
const isSubmitter = isCurrentUserSubmitter(report.reportID);
212+
const isSubmitter = isCurrentUserSubmitter(report);
213213
const isOpen = isOpenExpenseReport(report);
214214
const isReimbursed = isSettled(report);
215215

src/libs/ReportPrimaryActionUtils.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,9 @@ function isAddExpenseAction(report: Report, reportTransactions: Transaction[], i
6565
}
6666

6767
const isExpenseReport = isExpenseReportUtils(report);
68-
const isReportSubmitter = isCurrentUserSubmitter(report.reportID);
6968
const canAddTransaction = canAddTransactionUtil(report);
7069

71-
return isExpenseReport && canAddTransaction && isReportSubmitter && reportTransactions.length === 0;
70+
return isExpenseReport && canAddTransaction && reportTransactions.length === 0;
7271
}
7372

7473
function isSubmitAction(report: Report, reportTransactions: Transaction[], policy?: Policy, reportNameValuePairs?: ReportNameValuePairs, reportActions?: ReportAction[]) {
@@ -77,7 +76,7 @@ function isSubmitAction(report: Report, reportTransactions: Transaction[], polic
7776
}
7877

7978
const isExpenseReport = isExpenseReportUtils(report);
80-
const isReportSubmitter = isCurrentUserSubmitter(report.reportID);
79+
const isReportSubmitter = isCurrentUserSubmitter(report);
8180
const isOpenReport = isOpenReportUtils(report);
8281
const isManualSubmitEnabled = getCorrectedAutoReportingFrequency(policy) === CONST.POLICY.AUTO_REPORTING_FREQUENCIES.MANUAL;
8382
const transactionAreComplete = reportTransactions.every((transaction) => transaction.amount !== 0 || transaction.modifiedAmount !== 0);
@@ -128,7 +127,7 @@ function isApproveAction(report: Report, reportTransactions: Transaction[], poli
128127
}
129128

130129
const isPreventSelfApprovalEnabled = policy?.preventSelfApproval;
131-
const isReportSubmitter = isCurrentUserSubmitter(report.reportID);
130+
const isReportSubmitter = isCurrentUserSubmitter(report);
132131

133132
if (isPreventSelfApprovalEnabled && isReportSubmitter) {
134133
return false;
@@ -262,7 +261,7 @@ function isReviewDuplicatesAction(report: Report, reportTransactions: Transactio
262261
}
263262

264263
const isReportApprover = isApproverUtils(policy, getCurrentUserAccountID());
265-
const isReportSubmitter = isCurrentUserSubmitter(report.reportID);
264+
const isReportSubmitter = isCurrentUserSubmitter(report);
266265
const isProcessingReport = isProcessingReportUtils(report);
267266
const isReportOpen = isOpenReportUtils(report);
268267

@@ -290,7 +289,7 @@ function isMarkAsCashAction(report: Report, reportTransactions: Transaction[], v
290289
return true;
291290
}
292291

293-
const isReportSubmitter = isCurrentUserSubmitter(report.reportID);
292+
const isReportSubmitter = isCurrentUserSubmitter(report);
294293
const isReportApprover = isApproverUtils(policy, getCurrentUserAccountID());
295294
const isAdmin = policy?.role === CONST.POLICY.ROLE.ADMIN;
296295

@@ -364,7 +363,7 @@ function isMarkAsCashActionForTransaction(parentReport: Report, violations: Tran
364363
return false;
365364
}
366365

367-
const isReportSubmitter = isCurrentUserSubmitter(parentReport.reportID);
366+
const isReportSubmitter = isCurrentUserSubmitter(parentReport);
368367
const isReportApprover = isApproverUtils(policy, getCurrentUserAccountID());
369368
const isAdmin = policy?.role === CONST.POLICY.ROLE.ADMIN;
370369

src/libs/ReportSecondaryActionUtils.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ import {
5555
} from './TransactionUtils';
5656

5757
function isAddExpenseAction(report: Report, reportTransactions: Transaction[], isReportArchived = false) {
58-
const isReportSubmitter = isCurrentUserSubmitter(report.reportID);
58+
const isReportSubmitter = isCurrentUserSubmitter(report);
5959

6060
if (!isReportSubmitter || reportTransactions.length === 0) {
6161
return false;
@@ -94,7 +94,7 @@ function isSplitAction(report: Report, reportTransactions: Transaction[], policy
9494
return false;
9595
}
9696

97-
const isSubmitter = isCurrentUserSubmitter(report.reportID);
97+
const isSubmitter = isCurrentUserSubmitter(report);
9898
const isAdmin = policy?.role === CONST.POLICY.ROLE.ADMIN;
9999
const isManager = (report.managerID ?? CONST.DEFAULT_NUMBER_ID) === getCurrentUserAccountID();
100100

@@ -130,7 +130,7 @@ function isSubmitAction(
130130
return false;
131131
}
132132

133-
const isReportSubmitter = isCurrentUserSubmitter(report.reportID);
133+
const isReportSubmitter = isCurrentUserSubmitter(report);
134134
const isReportApprover = isApproverUtils(policy, getCurrentUserAccountID());
135135
const isAdmin = policy?.role === CONST.POLICY.ROLE.ADMIN;
136136
const isManager = report.managerID === getCurrentUserAccountID();
@@ -183,7 +183,7 @@ function isApproveAction(report: Report, reportTransactions: Transaction[], viol
183183
}
184184

185185
const isPreventSelfApprovalEnabled = policy?.preventSelfApproval;
186-
const isReportSubmitter = isCurrentUserSubmitter(report.reportID);
186+
const isReportSubmitter = isCurrentUserSubmitter(report);
187187

188188
if (isPreventSelfApprovalEnabled && isReportSubmitter) {
189189
return false;
@@ -319,7 +319,7 @@ function isMarkAsExportedAction(report: Report, policy?: Policy): boolean {
319319
}
320320

321321
const isInvoiceReport = isInvoiceReportUtils(report);
322-
const isReportSender = isCurrentUserSubmitter(report.reportID);
322+
const isReportSender = isCurrentUserSubmitter(report);
323323

324324
if (isInvoiceReport && isReportSender) {
325325
return true;
@@ -387,7 +387,7 @@ function isHoldActionForTransaction(report: Report, reportTransaction: Transacti
387387
}
388388

389389
const isOpenReport = isOpenReportUtils(report);
390-
const isSubmitter = isCurrentUserSubmitter(report.reportID);
390+
const isSubmitter = isCurrentUserSubmitter(report);
391391
const isReportManager = isReportManagerUtils(report);
392392

393393
if (isOpenReport && (isSubmitter || isReportManager)) {
@@ -437,7 +437,7 @@ function isDeleteAction(report: Report, reportTransactions: Transaction[], repor
437437
return false;
438438
}
439439

440-
const isReportSubmitter = isCurrentUserSubmitter(report.reportID);
440+
const isReportSubmitter = isCurrentUserSubmitter(report);
441441
const isApprovalEnabled = policy ? policy.approvalMode && policy.approvalMode !== CONST.POLICY.APPROVAL_MODE.OPTIONAL : false;
442442
const isForwarded = isProcessingReportUtils(report) && isApprovalEnabled && !isAwaitingFirstLevelApproval(report);
443443

@@ -457,7 +457,7 @@ function isRetractAction(report: Report, policy?: Policy): boolean {
457457
return false;
458458
}
459459

460-
const isReportSubmitter = isCurrentUserSubmitter(report.reportID);
460+
const isReportSubmitter = isCurrentUserSubmitter(report);
461461
if (!isReportSubmitter) {
462462
return false;
463463
}

src/libs/ReportUtils.ts

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1479,12 +1479,8 @@ function isSettled(reportOrID: OnyxInputOrEntry<Report> | SearchReport | string
14791479
/**
14801480
* Whether the current user is the submitter of the report
14811481
*/
1482-
function isCurrentUserSubmitter(reportID: string | undefined): boolean {
1483-
if (!allReports || !reportID) {
1484-
return false;
1485-
}
1486-
const report = allReports[`${ONYXKEYS.COLLECTION.REPORT}${reportID}`];
1487-
return !!(report && report.ownerAccountID === currentUserAccountID);
1482+
function isCurrentUserSubmitter(report: OnyxEntry<Report>): boolean {
1483+
return !!report && report.ownerAccountID === currentUserAccountID;
14881484
}
14891485

14901486
/**
@@ -2457,9 +2453,11 @@ function canAddOrDeleteTransactions(moneyRequestReport: OnyxEntry<Report>, isRep
24572453
* Return true if:
24582454
* - report is a non-settled IOU
24592455
* - report is a draft
2456+
* Returns false if:
2457+
* - if current user is not the submitter of an expense report
24602458
*/
24612459
function canAddTransaction(moneyRequestReport: OnyxEntry<Report>, isReportArchived = false): boolean {
2462-
if (!isMoneyRequestReport(moneyRequestReport)) {
2460+
if (!isMoneyRequestReport(moneyRequestReport) || (isExpenseReport(moneyRequestReport) && !isCurrentUserSubmitter(moneyRequestReport))) {
24632461
return false;
24642462
}
24652463
// This will be fixed as part of https://github.com/Expensify/Expensify/issues/507850
@@ -4074,7 +4072,7 @@ function canEditMoneyRequest(reportAction: OnyxInputOrEntry<ReportAction<typeof
40744072
return true;
40754073
}
40764074

4077-
if (policy?.type === CONST.POLICY.TYPE.CORPORATE && moneyRequestReport && isSubmitted && isCurrentUserSubmitter(moneyRequestReport.reportID)) {
4075+
if (policy?.type === CONST.POLICY.TYPE.CORPORATE && moneyRequestReport && isSubmitted && isCurrentUserSubmitter(moneyRequestReport)) {
40784076
const isForwarded = getSubmitToAccountID(policy, moneyRequestReport) !== moneyRequestReport.managerID;
40794077
return !isForwarded;
40804078
}
@@ -7918,7 +7916,7 @@ function shouldDisplayViolationsRBRInLHN(report: OnyxEntry<Report>, transactionV
79187916
}
79197917

79207918
// We only show the RBR to the submitter
7921-
if (!isCurrentUserSubmitter(report.reportID)) {
7919+
if (!isCurrentUserSubmitter(report)) {
79227920
return false;
79237921
}
79247922
if (!report.policyID || !reportsByPolicyID) {
@@ -8556,11 +8554,8 @@ function canRequestMoney(report: OnyxEntry<Report>, policy: OnyxEntry<Policy>, o
85568554
return false;
85578555
}
85588556

8559-
// User can submit expenses in any IOU report, unless paid, but the user can only submit expenses in an expense report
8560-
// which is tied to their expense chat.
85618557
if (isMoneyRequestReport(report)) {
8562-
const canAddTransactions = canAddTransaction(report);
8563-
return isReportInGroupPolicy(report) ? isOwnPolicyExpenseChat && canAddTransactions : canAddTransactions;
8558+
return canAddTransaction(report);
85648559
}
85658560

85668561
// In the case of policy expense chat, users can only submit expenses from their own policy expense chat
@@ -9653,7 +9648,7 @@ function isAllowedToSubmitDraftExpenseReport(report: OnyxEntry<Report>): boolean
96539648
* What missing payment method does this report action indicate, if any?
96549649
*/
96559650
function getIndicatedMissingPaymentMethod(userWallet: OnyxEntry<UserWallet>, reportId: string | undefined, reportAction: ReportAction): MissingPaymentMethod | undefined {
9656-
const isSubmitterOfUnsettledReport = isCurrentUserSubmitter(reportId) && !isSettled(reportId);
9651+
const isSubmitterOfUnsettledReport = reportId && isCurrentUserSubmitter(getReport(reportId, allReports)) && !isSettled(reportId);
96579652
if (!reportId || !isSubmitterOfUnsettledReport || !isReimbursementQueuedAction(reportAction)) {
96589653
return undefined;
96599654
}

src/libs/TransactionUtils/index.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -914,7 +914,7 @@ function shouldShowBrokenConnectionViolationInternal(brokenConnectionViolations:
914914
return false;
915915
}
916916

917-
if (!isPolicyAdmin(policy) || isCurrentUserSubmitter(report?.reportID)) {
917+
if (!isPolicyAdmin(policy) || isCurrentUserSubmitter(report)) {
918918
return true;
919919
}
920920

@@ -969,9 +969,7 @@ function checkIfShouldShowMarkAsCashButton(hasRTERPendingViolation: boolean, sho
969969
if (hasRTERPendingViolation) {
970970
return true;
971971
}
972-
return (
973-
shouldDisplayBrokenConnectionViolation && (!isPolicyAdmin(policy) || isCurrentUserSubmitter(report?.reportID)) && !isReportApproved({report}) && !isReportManuallyReimbursed(report)
974-
);
972+
return shouldDisplayBrokenConnectionViolation && (!isPolicyAdmin(policy) || isCurrentUserSubmitter(report)) && !isReportApproved({report}) && !isReportManuallyReimbursed(report);
975973
}
976974

977975
/**

src/pages/home/HeaderView.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ function HeaderView({report, parentReportAction, onNavigationMenuButtonClicked,
151151
const reportDescription = Parser.htmlToText(getReportDescription(report));
152152
const policyName = getPolicyName({report, returnEmptyIfNotFound: true});
153153
const policyDescription = getPolicyDescriptionText(policy);
154-
const isPersonalExpenseChat = isPolicyExpenseChat && isCurrentUserSubmitter(report?.reportID);
154+
const isPersonalExpenseChat = isPolicyExpenseChat && isCurrentUserSubmitter(report);
155155
const hasTeam2025Pricing = useHasTeam2025Pricing();
156156
const subscriptionPlan = useSubscriptionPlan();
157157

tests/unit/ReportUtilsTest.ts

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1024,7 +1024,7 @@ describe('ReportUtils', () => {
10241024
...LHNTestUtils.getFakeReport(),
10251025
parentReportID: '102',
10261026
type: CONST.REPORT.TYPE.EXPENSE,
1027-
managerID: currentUserAccountID,
1027+
ownerAccountID: currentUserAccountID,
10281028
};
10291029
const moneyRequestOptions = temporary_getMoneyRequestOptions(report, undefined, [currentUserAccountID]);
10301030
expect(moneyRequestOptions.length).toBe(2);
@@ -1046,7 +1046,7 @@ describe('ReportUtils', () => {
10461046
stateNum: CONST.REPORT.STATE_NUM.OPEN,
10471047
statusNum: CONST.REPORT.STATUS_NUM.OPEN,
10481048
parentReportID: '103',
1049-
managerID: currentUserAccountID,
1049+
ownerAccountID: currentUserAccountID,
10501050
};
10511051
const paidPolicy = {
10521052
type: CONST.POLICY.TYPE.TEAM,
@@ -1177,6 +1177,7 @@ describe('ReportUtils', () => {
11771177
statusNum: CONST.REPORT.STATUS_NUM.SUBMITTED,
11781178
parentReportID: '101',
11791179
policyID: paidPolicy.id,
1180+
ownerAccountID: currentUserAccountID,
11801181
};
11811182
const moneyRequestOptions = temporary_getMoneyRequestOptions(report, paidPolicy, [currentUserAccountID, participantsAccountIDs.at(0) ?? CONST.DEFAULT_NUMBER_ID]);
11821183
expect(moneyRequestOptions.length).toBe(2);
@@ -3593,6 +3594,7 @@ describe('ReportUtils', () => {
35933594
const report: Report = {
35943595
...createRandomReport(10000),
35953596
type: CONST.REPORT.TYPE.EXPENSE,
3597+
ownerAccountID: currentUserAccountID,
35963598
};
35973599
await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${report.reportID}`, report);
35983600

@@ -3605,11 +3607,27 @@ describe('ReportUtils', () => {
36053607
expect(result).toBe(true);
36063608
});
36073609

3610+
it('should return false for an expense report the current user is not the submitter', async () => {
3611+
// Given an expense report the current user is not the submitter
3612+
const report: Report = {
3613+
...createRandomReport(10000),
3614+
type: CONST.REPORT.TYPE.EXPENSE,
3615+
ownerAccountID: currentUserAccountID + 1,
3616+
};
3617+
await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${report.reportID}`, report);
3618+
3619+
const result = canAddTransaction(report, false);
3620+
3621+
// Then the result is false
3622+
expect(result).toBe(false);
3623+
});
3624+
36083625
it('should return false for an archived report', async () => {
36093626
// Given an archived expense report
36103627
const report: Report = {
36113628
...createRandomReport(10001),
36123629
type: CONST.REPORT.TYPE.EXPENSE,
3630+
ownerAccountID: currentUserAccountID,
36133631
};
36143632
await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${report.reportID}`, report);
36153633
await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report.reportID}`, {private_isArchived: DateUtils.getDBTime()});

0 commit comments

Comments
 (0)