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
3 changes: 2 additions & 1 deletion src/libs/API/parameters/DismissViolationParams.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
type DismissViolationParams = {
name: string;
transactionIDList: string;
reportActionIDList: string;
reportActionIDList?: string;
reportID?: string;
};

export default DismissViolationParams;
2 changes: 1 addition & 1 deletion src/libs/ReportPrimaryActionUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,7 @@ function isRemoveHoldAction(report: Report, chatReport: OnyxEntry<Report>, repor
}

function isReviewDuplicatesAction(report: Report, reportTransactions: Transaction[]) {
const hasDuplicates = reportTransactions.some((transaction) => isDuplicate(transaction, true));
const hasDuplicates = reportTransactions.some((transaction) => isDuplicate(transaction));

if (!hasDuplicates) {
return false;
Expand Down
2 changes: 1 addition & 1 deletion src/libs/ReportSecondaryActionUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@ function isApproveAction(currentUserLogin: string, report: Report, reportTransac
return false;
}
const isExpenseReport = isExpenseReportUtils(report);
const reportHasDuplicatedTransactions = reportTransactions.some((transaction) => isDuplicate(transaction, true));
const reportHasDuplicatedTransactions = reportTransactions.some((transaction) => isDuplicate(transaction));

if (isExpenseReport && isProcessingReport && reportHasDuplicatedTransactions) {
return true;
Expand Down
17 changes: 6 additions & 11 deletions src/libs/TransactionUtils/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@

let allTransactions: OnyxCollection<Transaction> = {};

Onyx.connect({

Check warning on line 119 in src/libs/TransactionUtils/index.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.COLLECTION.TRANSACTION,
waitForCollectionCallback: true,
callback: (value) => {
Expand All @@ -128,7 +128,7 @@
});

let allReports: OnyxCollection<Report> = {};
Onyx.connect({

Check warning on line 131 in src/libs/TransactionUtils/index.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.COLLECTION.REPORT,
waitForCollectionCallback: true,
callback: (value) => {
Expand All @@ -137,7 +137,7 @@
});

let allTransactionViolations: OnyxCollection<TransactionViolations> = {};
Onyx.connect({

Check warning on line 140 in src/libs/TransactionUtils/index.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS,
waitForCollectionCallback: true,
callback: (value) => (allTransactionViolations = value),
Expand All @@ -145,7 +145,7 @@

let currentUserEmail = '';
let currentUserAccountID = -1;
Onyx.connect({

Check warning on line 148 in src/libs/TransactionUtils/index.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.SESSION,
callback: (val) => {
currentUserEmail = val?.email ?? '';
Expand Down Expand Up @@ -1236,23 +1236,18 @@
/**
* Check if transaction has duplicatedTransaction violation.
* @param transactionID - the transaction to check
* @param checkDismissed - whether to check if the violation has already been dismissed as well
*/
function isDuplicate(transaction: OnyxEntry<Transaction>, checkDismissed = false): boolean {
function isDuplicate(transaction: OnyxEntry<Transaction>): boolean {
if (!transaction) {
return false;
}
const duplicateViolation = allTransactionViolations?.[`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transaction.transactionID}`]?.find(
const duplicatedTransactionViolation = allTransactionViolations?.[`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transaction.transactionID}`]?.find(
(violation: TransactionViolation) => violation.name === CONST.VIOLATIONS.DUPLICATED_TRANSACTION,
);
const hasDuplicatedViolation = !!duplicateViolation;
if (!checkDismissed) {
return hasDuplicatedViolation;
}

const didDismissedViolation = isViolationDismissed(transaction, duplicateViolation);
const hasDuplicatedTransactionViolation = !!duplicatedTransactionViolation;
const isDuplicatedTransactionViolationDismissed = isViolationDismissed(transaction, duplicatedTransactionViolation);

return hasDuplicatedViolation && !didDismissedViolation;
return hasDuplicatedTransactionViolation && !isDuplicatedTransactionViolationDismissed;
}

/**
Expand Down Expand Up @@ -1307,7 +1302,7 @@
const transactionsByIouReportID = getReportTransactions(iouReportID);
const reportTransactions = allReportTransactions ?? transactionsByIouReportID;

return reportTransactions.length > 0 && reportTransactions.some((transaction) => isDuplicate(transaction, true));
return reportTransactions.length > 0 && reportTransactions.some((transaction) => isDuplicate(transaction));
}

/**
Expand Down
2 changes: 1 addition & 1 deletion src/libs/actions/IOU.ts
Original file line number Diff line number Diff line change
Expand Up @@ -684,7 +684,7 @@
};

let allPersonalDetails: OnyxTypes.PersonalDetailsList = {};
Onyx.connect({

Check warning on line 687 in src/libs/actions/IOU.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.PERSONAL_DETAILS_LIST,
callback: (value) => {
allPersonalDetails = value ?? {};
Expand Down Expand Up @@ -725,13 +725,13 @@
};

let allBetas: OnyxEntry<OnyxTypes.Beta[]>;
Onyx.connect({

Check warning on line 728 in src/libs/actions/IOU.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.BETAS,
callback: (value) => (allBetas = value),
});

let allTransactions: NonNullable<OnyxCollection<OnyxTypes.Transaction>> = {};
Onyx.connect({

Check warning on line 734 in src/libs/actions/IOU.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.COLLECTION.TRANSACTION,
waitForCollectionCallback: true,
callback: (value) => {
Expand All @@ -745,7 +745,7 @@
});

let allTransactionDrafts: NonNullable<OnyxCollection<OnyxTypes.Transaction>> = {};
Onyx.connect({

Check warning on line 748 in src/libs/actions/IOU.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.COLLECTION.TRANSACTION_DRAFT,
waitForCollectionCallback: true,
callback: (value) => {
Expand All @@ -754,7 +754,7 @@
});

let allTransactionViolations: NonNullable<OnyxCollection<OnyxTypes.TransactionViolations>> = {};
Onyx.connect({

Check warning on line 757 in src/libs/actions/IOU.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS,
waitForCollectionCallback: true,
callback: (value) => {
Expand All @@ -768,7 +768,7 @@
});

let allDraftSplitTransactions: NonNullable<OnyxCollection<OnyxTypes.Transaction>> = {};
Onyx.connect({

Check warning on line 771 in src/libs/actions/IOU.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT,
waitForCollectionCallback: true,
callback: (value) => {
Expand Down Expand Up @@ -10012,7 +10012,7 @@

// Remove duplicates violations if we approve the report
if (hasDuplicates) {
const transactions = getReportTransactions(expenseReport.reportID).filter((transaction) => isDuplicate(transaction, true));
const transactions = getReportTransactions(expenseReport.reportID).filter((transaction) => isDuplicate(transaction));
if (!full) {
transactions.filter((transaction) => !isOnHold(transaction));
}
Expand Down
36 changes: 35 additions & 1 deletion src/libs/actions/Transaction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -383,7 +383,13 @@ function updateWaypoints(transactionID: string, waypoints: WaypointCollection, i
* Dismisses the duplicate transaction violation for the provided transactionIDs
* and updates the transaction to include the dismissed violation in the comment.
*/
function dismissDuplicateTransactionViolation(transactionIDs: string[], dismissedPersonalDetails: PersonalDetails) {
function dismissDuplicateTransactionViolation(
transactionIDs: string[],
dismissedPersonalDetails: PersonalDetails,
expenseReport: OnyxEntry<Report>,
policy: OnyxEntry<Policy>,
isASAPSubmitBetaEnabled: boolean,
) {
const currentTransactionViolations = transactionIDs.map((id) => ({transactionID: id, violations: allTransactionViolation?.[id] ?? []}));
const currentTransactions = transactionIDs.map((id) => allTransactions?.[id]);
const transactionsReportActions = currentTransactions.map((transaction) => getIOUActionForReportID(transaction.reportID, transaction.transactionID));
Expand All @@ -394,6 +400,33 @@ function dismissDuplicateTransactionViolation(transactionIDs: string[], dismisse
const optimisticData: OnyxUpdate[] = [];
const failureData: OnyxUpdate[] = [];

if (expenseReport) {
const hasOtherViolationsBesideDuplicates = currentTransactionViolations.some(
({violations}) => violations.filter((violation) => violation.name !== CONST.VIOLATIONS.DUPLICATED_TRANSACTION).length,
);
const optimisticNextStep = buildNextStepNew({
report: expenseReport,
predictedNextStatus: expenseReport?.statusNum ?? CONST.REPORT.STATUS_NUM.OPEN,
shouldFixViolations: hasOtherViolationsBesideDuplicates,
policy,
currentUserAccountIDParam: dismissedPersonalDetails.accountID,
currentUserEmailParam: dismissedPersonalDetails.login ?? '',
hasViolations: hasOtherViolationsBesideDuplicates,
isASAPSubmitBetaEnabled,
});

optimisticData.push({
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.NEXT_STEP}${expenseReport.reportID}`,
value: optimisticNextStep,
});
failureData.push({
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.NEXT_STEP}${expenseReport.reportID}`,
value: null,
});
}

const optimisticReportActions: OnyxUpdate[] = transactionsReportActions.map((action, index) => {
const optimisticDismissedViolationReportAction = optimisticDismissedViolationReportActions.at(index);
return {
Expand Down Expand Up @@ -484,6 +517,7 @@ function dismissDuplicateTransactionViolation(transactionIDs: string[], dismisse
name: CONST.VIOLATIONS.DUPLICATED_TRANSACTION,
transactionIDList: transactionIDs.join(','),
reportActionIDList: optimisticDismissedViolationReportActions.map(() => NumberUtils.rand64()).join(','),
reportID: expenseReport?.reportID,
};

API.write(WRITE_COMMANDS.DISMISS_VIOLATION, params, {
Expand Down
7 changes: 6 additions & 1 deletion src/pages/TransactionDuplicate/Review.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import {dismissDuplicateTransactionViolation} from '@libs/actions/Transaction';
import Navigation from '@libs/Navigation/Navigation';
import type {PlatformStackRouteProp} from '@libs/Navigation/PlatformStackNavigation/types';
import type {TransactionDuplicateNavigatorParamList} from '@libs/Navigation/types';
import Permissions from '@libs/Permissions';
import {getLinkedTransactionID, getReportAction} from '@libs/ReportActionsUtils';
import {isReportIDApproved, isSettled} from '@libs/ReportUtils';
import CONST from '@src/CONST';
Expand All @@ -32,8 +33,12 @@ function TransactionDuplicateReview() {
const {translate} = useLocalize();
const route = useRoute<PlatformStackRouteProp<TransactionDuplicateNavigatorParamList, typeof SCREENS.TRANSACTION_DUPLICATE.REVIEW>>();
const currentPersonalDetails = useCurrentUserPersonalDetails();
const [allBetas] = useOnyx(ONYXKEYS.BETAS, {canBeMissing: true});
const isASAPSubmitBetaEnabled = Permissions.isBetaEnabled(CONST.BETAS.ASAP_SUBMIT, allBetas);
const [report] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${route.params.threadReportID}`, {canBeMissing: true});
const [reportMetadata] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_METADATA}${route.params.threadReportID}`, {canBeMissing: true});
const [expenseReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${report?.parentReportID}`, {canBeMissing: false});
const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`, {canBeMissing: false});
const reportAction = getReportAction(report?.parentReportID, report?.parentReportActionID);
const transactionID = getLinkedTransactionID(reportAction);
const transactionViolations = useTransactionViolations(transactionID);
Expand All @@ -60,7 +65,7 @@ function TransactionDuplicateReview() {
);

const keepAll = () => {
dismissDuplicateTransactionViolation(transactionIDs, currentPersonalDetails);
dismissDuplicateTransactionViolation(transactionIDs, currentPersonalDetails, expenseReport, policy, isASAPSubmitBetaEnabled);
Navigation.goBack();
};

Expand Down
Loading