[Payment due @huult] [NO QA] Add Amount debited and Amount reimbursed filters, columns and sorting - #97708
Conversation
The new keys precede amount in the grammar so it cannot match them first.
|
Hey, I noticed you changed If you want to automatically generate translations for other locales, an Expensify employee will have to:
Alternatively, if you are an external contributor, you can run the translation script locally with your own OpenAI API key. To learn more, try running: npx ts-node ./scripts/generateTranslations.ts --helpTypically, you'd want to translate only what you changed by running |
Codecov Report✅ Changes either increased or maintained existing code coverage, great job!
|
A payment pays a whole report, so an expense has no debited or reimbursed amount of its own to show or filter on.
…655933-fx-filters-and-columns
Sorting ascending puts the reports without that amount first, so an all-domestic first page would drop the column, taking the header and the Sort by option with it.
The currency list refactor removed the bare convertToDisplayString these three call sites relied on, leaving main unable to typecheck.
…paul/655933-fx-filters-and-columns
…655933-fx-filters-and-columns
…655933-fx-filters-and-columns
|
@huult wanna review this one, you reviewed a related PR recently? Backend is not merged yet but will be soon, let me know if you are interested i will assign you |
|
@MelvinBot review |
|
Yes, thank you |
|
@ishpaul777 please assign this PR to me |
|
Thank you! Assigned you still keeping it draft until backend merge feel free to start reviewing early |
Review — LGTM overall ✅Clean, well-scoped, and it mirrors the existing amount-filter patterns ( Web verification (dev NewDot)
Screenshots attached in the following comment. Note I could not verify the end-to-end typed-syntax path (test step 11: CIThe red checks are not code failures — Two minor, non-blocking notes
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 40c3e79177
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
getColumnsToShow keeps the sorted column even with no values to show, so the CSV export has to pass the sort key too or it drops a column the view still shows.
JmillsExpensify
left a comment
There was a problem hiding this comment.
Part of an existing product initiative.
|
I’ll review this PR tmr. |
Reviewer Checklist
Screenshots/VideosAndroid: HybridAppAndroid: mWeb ChromeScreen.Recording.2026-08-14.at.00.45.12.moviOS: HybridAppiOS: mWeb SafariScreen.Recording.2026-08-14.at.00.47.18.mov |
| // The column the results are sorted by has to stay, even with nothing to show in it. Both the header and the | ||
| // Sort by option come from this list, so dropping it would leave the sort applied with no way to change it. |
There was a problem hiding this comment.
@ishpaul777 Can we shorten this comment? I don’t think we need such a long comment here.
| [CONST.SEARCH.TABLE_COLUMNS.TO]: 'formattedTo' as const, | ||
| [CONST.SEARCH.TABLE_COLUMNS.TOTAL]: 'total' as const, | ||
| // Both the backend page selection and this local sort rank the amounts as stored, without converting between | ||
| // currencies, so a report can outrank one that is worth more in another currency. |
There was a problem hiding this comment.
Can we shorten this comment? I don’t think we need such a long comment here.
|
I’m having an issue building the native app with the VM backend, so I don’t think this change impacts the UI. We can go ahead. |
|
🎯 @huult, thanks for reviewing and testing this PR! 🎉 A payment issue will be created for your review once this PR is deployed to production. If payment is not needed (e.g., regression PR review fix etc), react with 👎 to this comment to prevent the payment issue from being created. |
|
✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release. |
|
🚀 Deployed to staging by https://github.com/madmax330 in version: 9.4.54-0 🚀
|
|
Yes — help site changes are required, and I've opened a draft PR for them. This PR adds two new report-level search filters/operators (Amount debited and Amount reimbursed), so the public search-operators article needed the new syntax. The other UI additions (columns/sorting) are out of scope for that article, which documents operators only. Draft help-site PR: #98687 — adds What I verified
Filters panel for Expense Reports search type showing Total, Amount debited, and Amount reimbursed filter rows
@ishpaul777, please review the linked help site PR and confirm it reflects the current behavior. Then mark the linked help site PR |
|
🚀 Deployed to production by https://github.com/Beamanator in version: 9.4.54-4 🚀
Bundle Size Analysis (Sentry): |
|
🤖 Payment issue created: #98812 |



















Explanation of Change
A cross-border reimbursement moves two amounts: the company is debited in the currency it settles in, and the employee is credited in the currency of their deposit account. #97167 shows those on withdrawal groups in the reconciliation dashboard. This adds them as filters and as columns on expense reports.
amountDebited/amountReimbursed, withamount-debited/amount-reimbursedas the readable form used in saved searches and URLs.Decisions worth a look:
amountin the parser grammar, otherwiseamountmatches first and swallowsamountDebitedasamountfollowed by stray text.total, which is also absent from the expense filter menu.Needs Expensify/Auth#23431, which accepts the two filter keys and the two sort keys. Stacked on #97167, so only eleven commits belong to this PR, and one of those - "Restore the currency formatter the cross-border payment messages use" - is the same fix as #97723, carried here only so this branch can typecheck until that lands on main.
Fixed Issues
$ https://github.com/Expensify/Expensify/issues/655933
PROPOSAL: N/A, internal
Tests
Requires a workspace whose reports were paid with a currency conversion, since Auth records these amounts on the payment. Locally that means a workspace on a Corpay withdrawal account paying a member whose deposit account is in another currency, with at least one report left unconverted for comparison.
amount-debited:<value>.amountDebited:100directly into the search bar and verify it parses as a filter chip rather than as free text, then reload the page and verify the filter survives in the URL.Offline tests
Search results come from the server, so with no connection the list keeps showing the last loaded results. Applying either filter offline shows the offline indicator and no results change until the connection returns, the same as every other search filter. Column selection is local, so enabling or disabling the two columns works offline against already-loaded rows.
QA Steps
Same as Tests, on a workspace configured for global reimbursement whose reports have been paid across borders.
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
iOS: mWeb Safari
MacOS: Chrome / Safari