Skip to content

[Due for payment 2026-10-15] [CFI][FE 2/7] Payment history: render the payment history table rows #101829

Open

Description

@melvin-bot

Sub-task of [CFI] Add a "View payment history" page with historical billing receipts and monthly user activity.

Goal

The page shows a table of all past payments — one row per bill, newest first, with the billing period, the amount, and an incl. tax indicator where sales tax was charged.

Scope

  • Read the purchase list from Onyx (ONYXKEYS.PURCHASE_LIST) and render the rows.
  • Extend the Onyx type. src/types/onyx/PurchaseList.ts currently declares only amount, created, currency, message, and purchaseID. None of the fields these pages need are declared — the purchase type, the receipt identifier, the sales-tax flags, and the back-pointer identifiers that FE 3/7 needs. Add them as part of this PR.
  • Exclude non-bill records from the table. Refunds, disputes, and balance transfers are their own purchase records that point back at the bill they modify. They must not render as standalone rows. (Folding them onto their parent to derive the badge is FE 3/7; this issue only needs them filtered out.)
  • Table text must be user-selectable and copyable. CSV export was cut from scope specifically on the basis that the table is copyable, so this is a requirement, not a nicety.
  • Empty state when there are no purchases; skeleton while the list is loading.
  • Copy in every src/languages/*.ts locale.

Acceptance criteria

  • One row per billed period, sorted newest first.
  • The amount renders in the purchase's own currency using the app's currency formatting.
  • incl. tax appears only when sales tax was actually charged and the account is not tax-exempt.
  • No refund / dispute / balance-transfer record appears as its own row.
  • Text in the table can be selected and copied on web.
  • Renders correctly wide and narrow.

Depends on

The backend PR that pushes the full purchase list to Onyx (tracked in a separate internal issue). Until that lands, only the most recent purchase is in Onyx — build against the agreed payload shape, not against what is pushed today.

Easy to get wrong

  • Showing the active-user count next to the amount. This was explicitly rejected in design review: a 40-seat annual commitment billed in full with only 25 users active does not add up, and pairing the two numbers creates support volume. The count belongs under the Activity header (FE 5/7).
  • Treating the purchase list as a mergeable object. It is an array, so Onyx replaces it wholesale rather than merging entries.
Issue OwnerCurrent Issue Owner: @mallenexpensify

Activity

  1. self-assigned this
    on Sep 25, 2026
  2. added
    ReviewingHas a PR in review
    and removed
    ReviewingHas a PR in review
    on Sep 29, 2026
  3. 19 remaining items

  4. melvin-bot commented on Oct 14, 2026

    @melvin-bot
    Author

    Triggered auto assignment to @mallenexpensify (Awaiting Payment)

  5. melvin-bot commented on Oct 14, 2026

    @melvin-bot
    Author

    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
  6. nkdengineer commented on Oct 15, 2026

    @nkdengineer
    Contributor

    Price increase request

    Mandatory

    Proposed amount: $350

    Why the work exceeded the issue: We combined the fix for both #101829 and #101830

    Regressions caused by this PR: None

    Optional

    Multiple PRs: #102506 and #103298

  7. mallenexpensify commented on Oct 17, 2026

    @mallenexpensify
    Contributor

    Payment Summary

    Contributor+: @nkdengineer due $350 via NewDot

    Makes sense, I think the difference maker is that the decision was made before the PR was created. If one PR magically fixes two bugs, then payment wouldn't be automatically due for both.

    cc @mollfpr in case you disagree

  8. nkdengineer commented on Oct 27, 2026

    @nkdengineer
    Contributor

    @mallenexpensify I requested the price as double with the base price on this. Based on this, could you please update the payment summary here to $500 (price with base $250)?

  9. mallenexpensify commented on Oct 27, 2026

    @mallenexpensify
    Contributor

    I requested the price as double with the base price on #101829 (comment).

    @nkdengineer This shows $175, am I missing something?

    Image
  10. nkdengineer commented on Oct 27, 2026

    @nkdengineer
    Contributor

    @mallenexpensify Yeah, but based on this comment, this is an issue of the project started before 2026-09-19

    Image
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 productionDailyKSv2

Type

No type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions