Skip to content

[Due for payment 2026-09-28] [Exploratory] Spend - For marked as done expense, edit multiple reimbursement no option not applied #98739

Closed

Description

@applause-bot

If you haven’t already, check out our contributing guidelines for onboarding. To join our Slack channel, fill out this form.


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:

  1. Launch app onboarding via track business expense
  2. Open workspace chat
  3. Create 2 expenses as 2 seperate reports
  4. Mark as done one expense
  5. Go to spend - select both expenses - edit multiple - reimbursement select No and comple the flow
  6. 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.

Workaround:

Unknown

Platforms:

  • Android: App
  • Android: mWeb Chrome
  • iOS: App
  • iOS: mWeb Safari
  • iOS: mWeb Chrome
  • Windows: Chrome
  • MacOS: Chrome Safari

Screenshots/Videos

Bug7234375_1786801662570.Screenrecorder-2026-08-15-19-09-03-922.1.mp4

View all open jobs on GitHub

Applause Internal Information
Exported by: Julia Ponikarchuk
Bug ID: 7234375

Issue OwnerCurrent Issue Owner: @mallenexpensify

Activity

  1. applause-bot commented on Aug 17, 2026

    @applause-bot
    Author

    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

  2. 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
  3. added
    BugSomething is broken. Auto assigns a BugZero manager.
    on Sep 5, 2026
  4. MelvinBot commented on Sep 5, 2026

    @MelvinBot
    Contributor

    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, because canEditFieldOfMoneyRequest returns false for REIMBURSABLE on 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.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).

    1. 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.
    2. Do the same for Billable, which has the identical omission (:123-129, :320-328) and is restricted by the same rule.
    3. Add a unit test in tests/actions/IOUTest/BulkEditTest.ts covering a CLOSED report — today no test exercises the skip.

    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.


    view run · view recording

  5. added
    ExternalAdded to denote the issue can be worked on by a contributor
    on Sep 5, 2026
  6. melvin-bot commented on Sep 5, 2026

    @melvin-bot

    Triggered auto assignment to Contributor-plus team member for initial proposal review - @suneox (External)

  7. melvin-bot commented on Sep 5, 2026

    @melvin-bot

    Unable to auto-create job on Upwork. The BZ team member should create it manually for this issue.

  8. suneox commented on Sep 8, 2026

    @suneox
    Contributor

    I'll take a look at this one tomorrow

  9. melvin-bot commented on Sep 11, 2026

    @melvin-bot

    @suneox Uh oh! This issue is overdue by 2 days. Don't forget to update your issues!

  10. 23 remaining items

  11. suneox commented on Sep 23, 2026

    @suneox
    Contributor

    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:

    1. Launch the app and complete onboarding via Track and budget expenses (workflow disabled)
    2. Open the workspace chat.
    3. Create 2 expenses as 2 separate reports.
    4. Mark one of the two expenses as done.
    5. Go to Spend and select both expenses and tap Edit multiple.
    6. Verify the Reimbursable row is greyed out and cannot be tapped

    Do we agree 👍 or 👎

  12. abzokhattab commented on Sep 24, 2026

    @abzokhattab
    Contributor

    Kind reminder on this #101754 (comment) it might be related to the current issue .. could you please check @suneox

  13. suneox commented on Sep 25, 2026

    @suneox
    Contributor

    Kind reminder on this #101754 (comment) it might be related to the current issue .. could you please check @suneox

    That issue is invalid, I've left a comment on it.

  14. added
    Awaiting PaymentAuto-added when associated PR is deployed to production
    and removed on Sep 27, 2026
  15. melvin-bot commented on Sep 27, 2026

    @melvin-bot

    Triggered auto assignment to @mallenexpensify (Awaiting Payment)

  16. melvin-bot commented on Sep 27, 2026

    @melvin-bot

    Payment Summary

    Resolving PRs:

    BugZero Checklist (@mallenexpensify)

    • I have confirmed assignees, roles, and Upwork contracts look correct
    • I have paid out Upwork contracts / manual NewDot requests
    • [BugZero Assignee] I have created a GH issue for creating/updating the regression test once above steps have been agreed upon
  17. mallenexpensify commented on Sep 28, 2026

    @mallenexpensify
    Contributor

    Payment Summary

    Contributor+: @suneox due $250 via NewDot

  18. garrettmknight commented on Oct 7, 2026

    @garrettmknight
    Contributor

    $250 approved for @suneox

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

Awaiting PaymentAuto-added when associated PR is deployed to productionBugSomething is broken. Auto assigns a BugZero manager.DailyKSv2ExternalAdded to denote the issue can be worked on by a contributorNot a priority

Type

No type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions