Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 16 additions & 4 deletions src/libs/ReportUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2153,6 +2153,18 @@ function canDeleteTransaction(moneyRequestReport: OnyxEntry<Report>): boolean {
return canAddOrDeleteTransactions(moneyRequestReport);
}

/**
* Checks whether the card transaction support deleting based on liability type
*/
function canDeleteCardTransactionByLiabilityType(iouTransactionID?: string): boolean {
const transaction = getTransaction(iouTransactionID ?? CONST.DEFAULT_NUMBER_ID);
const isCardTransaction = isCardTransactionTransactionUtils(transaction);
if (!isCardTransaction) {
return true;
}
return transaction?.comment?.liabilityType === CONST.TRANSACTION.LIABILITY_TYPE.ALLOW;
}

/**
* Can only delete if the author is this user and the action is an ADD_COMMENT action or an IOU action in an unsettled report, or if the user is a
* policy admin
Expand All @@ -2161,11 +2173,10 @@ function canDeleteReportAction(reportAction: OnyxInputOrEntry<ReportAction>, rep
const report = getReportOrDraftReport(reportID);
const isActionOwner = reportAction?.actorAccountID === currentUserAccountID;
const policy = allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`] ?? null;
const iouTransactionID = isMoneyRequestAction(reportAction) ? getOriginalMessage(reportAction)?.IOUTransactionID : '';
const transaction = getTransaction(iouTransactionID ?? CONST.DEFAULT_NUMBER_ID);
const isCardTransaction = isCardTransactionTransactionUtils(transaction);

if (isMoneyRequestAction(reportAction)) {
const iouTransactionID = getOriginalMessage(reportAction)?.IOUTransactionID;
const isCardTransactionCanBeDeleted = canDeleteCardTransactionByLiabilityType(iouTransactionID);
// For now, users cannot delete split actions
const isSplitAction = getOriginalMessage(reportAction)?.type === CONST.IOU.REPORT_ACTION_TYPE.SPLIT;

Expand All @@ -2175,7 +2186,7 @@ function canDeleteReportAction(reportAction: OnyxInputOrEntry<ReportAction>, rep

if (isActionOwner) {
if (!isEmptyObject(report) && (isMoneyRequestReport(report) || isInvoiceReport(report))) {
return canDeleteTransaction(report) && (!isCardTransaction || (isCardTransaction && transaction?.comment?.liabilityType === CONST.TRANSACTION.LIABILITY_TYPE.ALLOW));
return canDeleteTransaction(report) && isCardTransactionCanBeDeleted;
}
return true;
}
Expand Down Expand Up @@ -9363,6 +9374,7 @@ export {
getRoom,
getRootParentReport,
getRouteFromLink,
canDeleteCardTransactionByLiabilityType,
getTaskAssigneeChatOnyxData,
getTransactionDetails,
getTransactionReportName,
Expand Down
11 changes: 3 additions & 8 deletions src/pages/ReportDetailsPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ import {getPersonalDetailsForAccountIDs} from '@libs/OptionsListUtils';
import {getConnectedIntegration, isPolicyAdmin as isPolicyAdminUtil, isPolicyEmployee as isPolicyEmployeeUtil, shouldShowPolicy} from '@libs/PolicyUtils';
import {getOneTransactionThreadReportID, getOriginalMessage, getTrackExpenseActionableWhisper, isDeletedAction, isMoneyRequestAction, isTrackExpenseAction} from '@libs/ReportActionsUtils';
import {
canDeleteCardTransactionByLiabilityType,
canDeleteTransaction,
canEditReportDescription as canEditReportDescriptionUtil,
canHoldUnholdReportAction as canHoldUnholdReportActionUtil,
Expand Down Expand Up @@ -92,7 +93,6 @@ import {
shouldUseFullTitleToDisplay,
} from '@libs/ReportUtils';
import StringUtils from '@libs/StringUtils';
import {isCardTransaction as isCardTransactionTransactionUtils} from '@libs/TransactionUtils';
import {
canCancelPayment,
cancelPayment as cancelPaymentAction,
Expand Down Expand Up @@ -297,13 +297,8 @@ function ReportDetailsPage({policies, report, route, reportMetadata}: ReportDeta
isTaskReport && !isCanceledTaskReport && canWriteInReport(report) && report.stateNum !== CONST.REPORT.STATE_NUM.APPROVED && !isClosedReport(report) && canModifyTask && canActionTask;
const canDeleteRequest = isActionOwner && (canDeleteTransaction(moneyRequestReport) || isSelfDMTrackExpenseReport) && !isDeletedParentAction;
const iouTransactionID = isMoneyRequestAction(requestParentReportAction) ? getOriginalMessage(requestParentReportAction)?.IOUTransactionID : '';

/* eslint-disable @typescript-eslint/prefer-nullish-coalescing */
const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${iouTransactionID || CONST.DEFAULT_NUMBER_ID}`);
const isCardTransaction = isCardTransactionTransactionUtils(transaction);

const shouldShowDeleteButton =
shouldShowTaskDeleteButton || (canDeleteRequest && (!isCardTransaction || (isCardTransaction && transaction?.comment?.liabilityType === CONST.TRANSACTION.LIABILITY_TYPE.ALLOW)));
const isCardTransactionCanBeDeleted = canDeleteCardTransactionByLiabilityType(iouTransactionID);
const shouldShowDeleteButton = shouldShowTaskDeleteButton || (canDeleteRequest && isCardTransactionCanBeDeleted);

useEffect(() => {
if (canDeleteRequest) {
Expand Down