fix: resolve admin "Keep selected" duplicates when transaction thread…#96607
Open
yusufdeveloper2903 wants to merge 1 commit into
Open
Conversation
melvin-bot
Bot
requested review from
heyjennahay and
nyomanjyotisa
and removed request for
a team
July 21, 2026 09:23
|
@nyomanjyotisa Please copy/paste the Reviewer Checklist from here into a new comment on this PR and complete it. If you have the K2 extension, you can simply click: [this button] |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Explanation of Change
When an admin resolves duplicate expenses submitted by another member via "Resolve duplicates" → "Keep selected" → "Confirm", the duplicates were not resolved — the
DUPLICATED_TRANSACTIONviolation reappeared after the next pull.Root cause: in
resolveDuplicates, a duplicate was dropped from theRESOLVE_DUPLICATESpayload whenever its transaction thread (childReportID) was missing. Transaction threads are created lazily, so when an admin resolves from the workspace chat without opening each expense,transactionThreadReportIDMapis empty and every duplicate hit the skip → the backend received an emptytransactionIDListand held nothing.Fix (in
src/libs/actions/IOU/Duplicate.ts):transactionID+ holdreportActionIDand thecomment.holdoptimistic update are now added to the payload before the thread check. Only the thread-keyed optimistic hold report action is guarded behind a definedtransactionThreadReportID(so we never write toreport_actions_undefined).dismissedViolationReportActionIDis still sent so the backend records the dismissal.comment.holdvalue is restored on failure.Unit tests were added for both missing-thread paths (held duplicate and kept transaction) plus the preserved skip when the IOU action is absent.
Fixed Issues
$ #92845
PROPOSAL: #92845 (comment)
Tests
Offline tests
QA Steps
Same as tests.
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectionAvatar, I verified the components usingAvatarare working as expected)StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))npm run compress-svg)Avataris modified, I verified thatAvataris working as expected in all cases)Designlabel and/or tagged@Expensify/designso the design team can review the changes.mainbranch was merged into this PR after a review, I tested again and verified the outcome was still expected according to theTeststeps.Screenshots/Videos
Android: Native
Android: mWeb Chrome
iOS: Native
After fix:
REC-20260721134626.mp4
iOS: mWeb Safari
MacOS: Chrome / Safari
After fix:
REC-20260721135136.mp4