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
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,11 @@ function MoneyRequestPreviewContent({
// Clear the draft before selecting a different expense to prevent merging fields from the previous expense
// (e.g., category, tag, tax) that may be not enabled/available in the new expense's policy.
Transaction.abandonReviewDuplicateTransactions();
const comparisonResult = TransactionUtils.compareDuplicateTransactionFields(reviewingTransactionID, transaction?.reportID ?? '');
const comparisonResult = TransactionUtils.compareDuplicateTransactionFields(
reviewingTransactionID,
transaction?.reportID ?? '',
transaction?.transactionID ?? reviewingTransactionID,
);
Transaction.setReviewDuplicatesKey({...comparisonResult.keep, duplicates, transactionID: transaction?.transactionID ?? '', reportID: transaction?.reportID});

if ('merchant' in comparisonResult.change) {
Expand Down
16 changes: 12 additions & 4 deletions src/libs/TransactionUtils/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1043,10 +1043,10 @@ function removeSettledAndApprovedTransactions(transactionIDs: string[]) {
* 6. It returns the 'keep' and 'change' objects.
*/

function compareDuplicateTransactionFields(transactionID: string, reportID: string): {keep: Partial<ReviewDuplicates>; change: FieldsToChange} {
const transactionViolations = allTransactionViolations?.[`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`];
function compareDuplicateTransactionFields(reviewingTransactionID: string, reportID: string, selectedTransactionID?: string): {keep: Partial<ReviewDuplicates>; change: FieldsToChange} {
const transactionViolations = allTransactionViolations?.[`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${reviewingTransactionID}`];
const duplicates = transactionViolations?.find((violation) => violation.name === CONST.VIOLATIONS.DUPLICATED_TRANSACTION)?.data?.duplicates ?? [];
const transactions = removeSettledAndApprovedTransactions([transactionID, ...duplicates]).map((item) => getTransaction(item));
const transactions = removeSettledAndApprovedTransactions([reviewingTransactionID, ...duplicates]).map((item) => getTransaction(item));
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const keep: Record<string, any> = {};
// eslint-disable-next-line @typescript-eslint/no-explicit-any
Expand Down Expand Up @@ -1099,6 +1099,14 @@ function compareDuplicateTransactionFields(transactionID: string, reportID: stri
}
}

// The comment object needs to be stored only when selecting a specific transaction to keep.
// It contains details such as 'customUnit' and 'waypoints,' which remain unchanged during the review steps
// but are essential for displaying complete information on the confirmation page.
if (selectedTransactionID) {
const selectedTransaction = transactions.find((t) => t?.transactionID === selectedTransactionID);
keep.comment = selectedTransaction?.comment ?? {};
}

for (const fieldName in fieldsToCompare) {
if (Object.prototype.hasOwnProperty.call(fieldsToCompare, fieldName)) {
const keys = fieldsToCompare[fieldName];
Expand Down Expand Up @@ -1195,7 +1203,7 @@ function buildNewTransactionAfterReviewingDuplicates(reviewDuplicateTransaction:
...restReviewDuplicateTransaction,
modifiedMerchant: reviewDuplicateTransaction?.merchant,
merchant: reviewDuplicateTransaction?.merchant,
comment: {comment: reviewDuplicateTransaction?.description},
comment: {...reviewDuplicateTransaction?.comment, comment: reviewDuplicateTransaction?.description},
};
}

Expand Down
5 changes: 5 additions & 0 deletions src/types/onyx/ReviewDuplicates.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import type {Comment} from './Transaction';

/**
* Model of review duplicates request
*/
Expand Down Expand Up @@ -29,6 +31,9 @@ type ReviewDuplicates = {
/** Description which user want to keep */
description: string;

/** NVPs of the transaction that we want to keep */
comment: Comment;

/** Whether the transaction is reimbursable */
reimbursable: boolean;

Expand Down