You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[Due for payment 2026-09-28] [Exploratory] Spend - For marked as done expense, edit multiple reimbursement no option not applied #98739
Version Number: V9.4 54-1 Reproducible in staging?: Yes Reproducible in production?: Yes If this was caught during regression testing, add the test name, ID and link from BrowserStack:https://test-management.browserstack.com/projects/2219752/test-runs/69228694/folder/13176730/41237121/1660994359?sort=%2Bname Email or phone of affected tester (no customers): Redmi note 10s android 13 Issue reported by: Applause Internal Team Bug source: Exploratory - Significant User Experience Deterioration Device used: Redmi note 10s android 13 App Component: Money Requests
Action Performed:
Launch app onboarding via track business expense
Open workspace chat
Create 2 expenses as 2 seperate reports
Mark as done one expense
Go to spend - select both expenses - edit multiple - reimbursement select No and comple the flow
Open both expenses and note Reimbursement row
Expected Result:
The marked-as-done expense should not be eligible for the Reimbursement bulk-edit option because its Reimbursement row is locked. The bulk edit should either exclude this expense or prevent applying the option to it.
Actual Result:
The marked-as-done expense can be included in Edit Multiple and the Reimbursement → No option can be selected, but the change is not applied to the marked-as-done expense.
changed the title [-][Exploratory] Spend-For marked as done expense, edit multiple reimbursement no option not applied[/-][+][Exploratory] Spend - For marked as done expense, edit multiple reimbursement no option not applied[/+]on Aug 17, 2026
The bulk-edit menu and the bulk-edit apply step use two different rules for the Reimbursement field, so a locked expense is offered the option and then silently skipped.
Edit multiple never asks that question. Its Reimbursement gate only checks report type, policy.disabledFields.reimbursable and card status — never editability (SearchEditMultiplePage.tsx:131-137), and the menu row is rendered with no disabled prop (:329-337). All selected transaction IDs are then sent unfiltered.
The check finally happens deep in the apply step, which drops the change for the closed expense and skips it with no error and no optimistic update (BulkEdit.ts:334-336 then :391-394). Hence: option offered, flow completes, nothing changes.
What changes do you think we should make in order to solve the problem?
Make the menu use the same rule the apply step already uses. The file already has the helper for this — isFieldDisabledForAnyTransaction, which wraps canEditFieldOfMoneyRequest and is used for Amount, Merchant, Date, Tax and Attendees (SearchEditMultiplePage.tsx:105-112).
Add disabled: isFieldDisabledForAnyTransaction(CONST.EDIT_REQUEST_FIELD.REIMBURSABLE) to the Reimbursement row at :329-337, so a selection containing a done expense shows the row greyed out instead of actionable.
Do the same for Billable, which has the identical omission (:123-129, :320-328) and is restricted by the same rule.
One product call is needed: isFieldDisabledForAnyTransaction disables the row if any selected expense is locked, which also blocks the still-editable ones in a mixed selection. That matches how Amount/Merchant/Date/Tax already behave, so I'd follow the precedent.
Alternative solutions considered
Apply to the editable expenses and warn about the rest. Keep the row enabled, and have BulkEdit.ts report skipped transactions so the UI can say "applied to 1 of 2 expenses". Better for mixed selections, but it is new behaviour that diverges from every other bulk-edit field and needs design input.
Exclude locked expenses from the selection itself. Rejected — it silently changes what the user selected and would have to be per-field, since the same expense is still editable for description or category.
Leave the client alone and surface a backend error. Rejected — the change never reaches the API; the client skips it before any request is made.
Not verified: whether the UpdateMoneyRequest backend independently rejects reimbursable on a closed report. It does not affect this fix, since the client never sends the request.
Related issues: a quick scan of open App issues turned up no duplicate.
Next Steps for Contributor+ team: To accept:@MelvinBot implement [this](https://github.com/Expensify/App/issues/98739) to create a draft PR. To refine:@MelvinBot <your feedback> To reject: Explain why you are rejecting Melvin's proposal.
[Contributor] The offending PR and associated issue have been commented on, pointing out the bug it caused and why, so the author and reviewers can learn from the mistake.
[Contributor] If the regression was CRITICAL (e.g. interrupts a core flow) A discussion in #expensify-open-source has been started about whether any other steps should be taken (e.g. updating the PR review checklist) in order to catch this type of bug sooner.
N/A
[Contributor] If it was decided to create a regression test for the bug, please propose the regression test steps using the template below to ensure the same bug will not reach production again.
Regression Test Proposal
Test:
Launch the app and complete onboarding via Track and budget expenses (workflow disabled)
Open the workspace chat.
Create 2 expenses as 2 separate reports.
Mark one of the two expenses as done.
Go to Spend and select both expenses and tap Edit multiple.
Verify the Reimbursable row is greyed out and cannot be tapped
Activity
applause-bot commentedon Aug 17, 2026
While Applause doesn't embed attachments for this bug, here are the links for quick view:
https://platform.applause.com/services/links/v1/external/11621bfb486a69d49f8537dee53a3b7db05589c13f3b1b2bb1e33921da178025
[-][Exploratory] Spend-For marked as done expense, edit multiple reimbursement no option not applied[/-][+][Exploratory] Spend - For marked as done expense, edit multiple reimbursement no option not applied[/+]MelvinBot commentedon Sep 5, 2026
Proposal
What is the root cause of that problem?
The bulk-edit menu and the bulk-edit apply step use two different rules for the Reimbursement field, so a locked expense is offered the option and then silently skipped.
"Mark as done" is the Submit button on a Submit-&-Close workspace. It sets the report to
stateNum: APPROVED, statusNum: CLOSED(src/libs/actions/IOU/ReportWorkflow.ts:1440-1458). Reimbursable is then permanently locked, becausecanEditFieldOfMoneyRequestreturnsfalseforREIMBURSABLEon any closed report (src/libs/ReportUtils.ts:5478-5480). That is why the row is read-only on the expense page (MoneyRequestView.tsx:525-535).Edit multiple never asks that question. Its Reimbursement gate only checks report type,
policy.disabledFields.reimbursableand card status — never editability (SearchEditMultiplePage.tsx:131-137), and the menu row is rendered with nodisabledprop (:329-337). All selected transaction IDs are then sent unfiltered.The check finally happens deep in the apply step, which drops the change for the closed expense and skips it with no error and no optimistic update (
BulkEdit.ts:334-336then:391-394). Hence: option offered, flow completes, nothing changes.What changes do you think we should make in order to solve the problem?
Make the menu use the same rule the apply step already uses. The file already has the helper for this —
isFieldDisabledForAnyTransaction, which wrapscanEditFieldOfMoneyRequestand is used for Amount, Merchant, Date, Tax and Attendees (SearchEditMultiplePage.tsx:105-112).disabled: isFieldDisabledForAnyTransaction(CONST.EDIT_REQUEST_FIELD.REIMBURSABLE)to the Reimbursement row at:329-337, so a selection containing a done expense shows the row greyed out instead of actionable.:123-129,:320-328) and is restricted by the same rule.tests/actions/IOUTest/BulkEditTest.tscovering a CLOSED report — today no test exercises the skip.One product call is needed:
isFieldDisabledForAnyTransactiondisables the row if any selected expense is locked, which also blocks the still-editable ones in a mixed selection. That matches how Amount/Merchant/Date/Tax already behave, so I'd follow the precedent.Alternative solutions considered
BulkEdit.tsreport skipped transactions so the UI can say "applied to 1 of 2 expenses". Better for mixed selections, but it is new behaviour that diverges from every other bulk-edit field and needs design input.Not verified: whether the
UpdateMoneyRequestbackend independently rejectsreimbursableon a closed report. It does not affect this fix, since the client never sends the request.Related issues: a quick scan of open App issues turned up no duplicate.
Next Steps for Contributor+ team:
To accept:
@MelvinBot implement [this](https://github.com/Expensify/App/issues/98739)to create a draft PR.To refine:
@MelvinBot <your feedback>To reject: Explain why you are rejecting Melvin's proposal.
view run · view recording
melvin-bot commentedon Sep 5, 2026
Triggered auto assignment to Contributor-plus team member for initial proposal review - @suneox (
External)melvin-bot commentedon Sep 5, 2026
Unable to auto-create job on Upwork. The BZ team member should create it manually for this issue.
suneox commentedon Sep 8, 2026
I'll take a look at this one tomorrow
melvin-bot commentedon Sep 11, 2026
@suneox Uh oh! This issue is overdue by 2 days. Don't forget to update your issues!
23 remaining items
suneox commentedon Sep 23, 2026
Contributor+ Checklist:
[Contributor] The offending PR and associated issue have been commented on, pointing out the bug it caused and why, so the author and reviewers can learn from the mistake.
No offending PR found this issue is an edge case from original feature Reapply "Reapply "Feat: bulk edit multiple"" #84756
[Contributor] If the regression was CRITICAL (e.g. interrupts a core flow) A discussion in #expensify-open-source has been started about whether any other steps should be taken (e.g. updating the PR review checklist) in order to catch this type of bug sooner.
N/A
[Contributor] If it was decided to create a regression test for the bug, please propose the regression test steps using the template below to ensure the same bug will not reach production again.
Regression Test Proposal
Test:
Do we agree 👍 or 👎
abzokhattab commentedon Sep 24, 2026
Kind reminder on this #101754 (comment) it might be related to the current issue .. could you please check @suneox
suneox commentedon Sep 25, 2026
That issue is invalid, I've left a comment on it.
melvin-bot commentedon Sep 27, 2026
Triggered auto assignment to @mallenexpensify (
Awaiting Payment)melvin-bot commentedon Sep 27, 2026
Payment Summary
Resolving PRs:
Disable Reimbursable in Edit multiple when a selected expense is locked #101090
Reviewer: @suneox owed $175 via NewDot
BugZero Checklist (@mallenexpensify)
mallenexpensify commentedon Sep 28, 2026
Payment Summary
Contributor+: @suneox due $250 via NewDot
garrettmknight commentedon Oct 7, 2026
$250 approved for @suneox