Skip to content

[HOLD for payment 2024-11-11] [$250] Held expense-Negative amount in transaction thread for held expense after paying unheld expense #49754

Closed

Description

@IuliiaHerets

If you haven’t already, check out our contributing guidelines for onboarding and email contributors@expensify.com to request to join our Slack channel!


Version Number: 9.0.40-1
Reproducible in staging?: Y
Reproducible in production?: Y
Issue was found when executing this PR: #49463
Email or phone of affected tester (no customers): applausetester+kh010901@applause.expensifail.com
Issue reported by: Applause Internal Team

Action Performed:

  1. Go to staging.new.expensify.com
  2. [User A] Submit two expenses to User B.
  3. [User A] Hold one of the expenses.
  4. [User B] Go offline.
  5. [User B] Pay the unheld expense.
  6. [User B] Click on the expense preview of the held expense in the main chat.

Expected Result:

The amount in the transaction thread will not be negative.

Actual Result:

The amount in the transaction thread is negative.

Workaround:

Unknown

Platforms:

  • Android: Native
  • Android: mWeb Chrome
  • iOS: Native
  • iOS: mWeb Safari
  • MacOS: Chrome / Safari
  • MacOS: Desktop

Screenshots/Videos

Bug6615322_1727299431457.20240926_051632.mp4

View all open jobs on GitHub

Upwork Automation - Do Not Edit
  • Upwork Job URL: https://www.upwork.com/jobs/~021841126678085530276
  • Upwork Job ID: 1841126678085530276
  • Last Price Increase: 2024-10-15
  • Automatic offers:
    • Nodebrute | Contributor | 104483850
Issue OwnerCurrent Issue Owner: @OfstadC

Activity

  1. added
    BugSomething is broken. Auto assigns a BugZero manager.
    on Sep 25, 2024
  2. melvin-bot commented on Sep 25, 2024

    @melvin-bot

    Triggered auto assignment to @OfstadC (Bug), see https://stackoverflow.com/c/expensify/questions/14418 for more details. Please add this bug to a GH project, as outlined in the SO.

  3. IuliiaHerets commented on Sep 25, 2024

    @IuliiaHerets
    Author

    We think that this bug might be related to #wave-collect - Release 1

  4. IuliiaHerets commented on Sep 25, 2024

    @IuliiaHerets
    Author

    @OfstadC FYI I haven't added the External label as I wasn't 100% sure about this issue. Please take a look and add the label if you agree it's a bug and can be handled by external contributors

  5. Nodebrute commented on Sep 26, 2024

    @Nodebrute
    Contributor

    Edited by proposal-police: This proposal was edited at 2024-10-09 18:11:01 UTC.

    Proposal

    Please re-state the problem that we are trying to solve in this issue.

    Negative amount in transaction thread for held expense after paying unheld expense

    What is the root cause of that problem?

    For expense report case we add - before amount because the amounts are stored using an opposite sign

    // Expense report case:
    // The amounts are stored using an opposite sign and negative values can be set,
    // we need to return an opposite sign than is saved in the transaction object
    let amount = transaction?.modifiedAmount ?? 0;
    if (amount) {
    return -amount;
    }

    However, when we handle the pay money request and use getReportFromHoldRequestsOnyxData, we are actually creating an ExpenseReport. For 1:1 direct messages, it should instead be an IOUReport.

    App/src/libs/actions/IOU.ts

    Lines 6451 to 6459 in b655040

    const optimisticExpenseReport = ReportUtils.buildOptimisticExpenseReport(
    chatReport.reportID,
    chatReport.policyID ?? iouReport?.policyID ?? '',
    recipient.accountID ?? 1,
    holdTransactions.reduce((acc, transaction) => acc + transaction.amount, 0) * (ReportUtils.isIOUReport(iouReport) ? 1 : -1),
    getCurrency(firstHoldTransaction),
    false,
    newParentReportActionID,
    );

    This is also not consistent with the BE response in case of 1:1 DMs the backend will return an IOUReport

    What changes do you think we should make in order to solve the problem?

    We should add a check here isPolicyExpenseChat. The idea is that if it's a policy expense chat, we should build an optimistic expense report using buildOptimisticExpenseReport. If it's not a policy expense chat, then we should build an optimistic IOU report using buildOptimisticIOUReport. This is the same logic we are using here Pseudocode

     const optimisticExpenseReport = isPolicyExpenseChat
            ? ReportUtils.buildOptimisticExpenseReport(
                  chatReport.reportID,
                  chatReport.policyID ?? iouReport?.policyID ?? '',
                  recipient.accountID ?? 1,
                  totalAmount,
                  getCurrency(firstHoldTransaction),
                  false,
                  newParentReportActionID,
              )
            : ReportUtils.buildOptimisticIOUReport(recipient.accountID ?? 1, iouReport?.managerID ?? 1, totalAmount, chatReport.reportID, getCurrency(firstHoldTransaction), false);
    

    After this change, this line will evaluate to false, and we'll move to this block, where we'll apply -amount, which will fix the bug

    if (!isFromExpenseReport || isFromTrackedExpense) {

    Note: This is pseudocode only. We need to test the implementation with multiple test cases, which can be done in the pull request (PR).

    What alternative solutions did you explore? (Optional)

    We can use buildOptimisticIOUReport here instead of buildOptimisticExpenseReport

  6. OfstadC commented on Sep 27, 2024

    @OfstadC
    Contributor

    Missed this yesterday - reviewing now

  7. melvin-bot commented on Sep 30, 2024

    @melvin-bot

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

  8. OfstadC commented on Oct 1, 2024

    @OfstadC
    Contributor

    I had issues reproducing this on Friday - forgot to add a comment here.

  9. m-natarajan commented on Oct 1, 2024

    @m-natarajan

    Able to reproduce

    20241001_220541.mp4
  10. added
    ExternalAdded to denote the issue can be worked on by a contributor
    on Oct 1, 2024
  11. 36 remaining items

  12. added
    Awaiting PaymentAuto-added when associated PR is deployed to production
    and removed on Nov 4, 2024
  13. changed the title [-][$250] Held expense-Negative amount in transaction thread for held expense after paying unheld expense[/-] [+][HOLD for payment 2024-11-11] [$250] Held expense-Negative amount in transaction thread for held expense after paying unheld expense[/+] on Nov 4, 2024
  14. melvin-bot commented on Nov 4, 2024

    @melvin-bot

    Reviewing label has been removed, please complete the "BugZero Checklist".

  15. melvin-bot commented on Nov 4, 2024

    @melvin-bot

    The solution for this issue has been 🚀 deployed to production 🚀 in version 9.0.56-9 and is now subject to a 7-day regression period 📆. Here is the list of pull requests that resolve this issue:

    If no regressions arise, payment will be issued on 2024-11-11. 🎊

    For reference, here are some details about the assignees on this issue:

  16. melvin-bot commented on Nov 4, 2024

    @melvin-bot

    @hungvu193 @OfstadC The PR fixing this issue has been merged! The following checklist (instructions) will need to be completed before the issue can be closed. Please copy/paste the BugZero Checklist from here into a new comment on this GH and complete it. If you have the K2 extension, you can simply click: [this button]

  17. OfstadC commented on Nov 5, 2024

    @OfstadC
    Contributor

    Commenting to please Melly Melvin. @hungvu193 Please ensure BZ checklist is completed by payment date. Thank you!

  18. hungvu193 commented on Nov 11, 2024

    @hungvu193
    Contributor
    • The offending PR has been commented on, pointing out the bug it caused and why, so the author and reviewers can learn from the mistake.

    Link to comment: https://github.com/Expensify/App/pull/42573/files#r1836147530

    • 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.

    Link to discussion: N/A

    • 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: We already created some tests to prevent this case, I don't think we need regression test for this one.
  19. OfstadC commented on Nov 11, 2024

    @OfstadC
    Contributor

    Payment Summary

  20. garrettmknight commented on Nov 20, 2024

    @garrettmknight
    Contributor

    $250 approved for @hungvu193

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.ExternalAdded to denote the issue can be worked on by a contributorWeeklyKSv2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions