Repository navigation
[CFI] [$175] Show the Reimbursable toggle on company card expenses when the card feed is set to Do Not Force #103341
Copy link
Copy link
Open
Labels
ExternalAdded to denote the issue can be worked on by a contributorAdded to denote the issue can be worked on by a contributorNewFeatureSomething to build that is a new item.Something to build that is a new item.ReviewingHas a PR in reviewHas a PR in reviewWeeklyKSv2KSv2
Description
Coming from here, we want to show the Reimbursable toggle on company card expenses when the card feed allows the value to change, matching cash expenses and company card expenses in Expensify Classic.
Details
- Today, New Expensify hides the
Reimbursabletoggle on every company card expense in the expense detail view and in bulk edit. Expensify Classic shows the toggle when the card feed is set to eitherDo Not Forceoption, but customers on those settings can't change reimbursability on card expenses in New Expensify. - The feed's Reimbursable setting doesn't exist in New Expensify yet. This issue doesn't need it: the toggle uses the
forceReimbursablevalue stamped on each card expense at import. - Adding the feed setting to New Expensify is tracked separately: [CFI] Add a Reimbursable setting to company card feed settings in New Expensify #103342
- Forced value: We will use the
forceReimbursablevalue stamped on each card expense at import to decide whether the toggle appears. Changing the feed setting only affects expenses imported afterward, matching Classic.- Force No (
force_no, default): Toggle hidden. - Force Yes (
force_yes): Toggle hidden. - Do Not Force (Defaults to Reimbursable) (
default_yes): Toggle shown and editable. - Do Not Force (Defaults to Non-Reimbursable) (
default_no, or legacynone): Toggle shown and editable.
- Force No (
- For new card transactions, the feed setting sets the starting value. Do Not Force (Defaults to Reimbursable) starts as reimbursable, and Do Not Force (Defaults to Non-Reimbursable) starts as non-reimbursable.
- The Do Not Force settings don't restrict edits after an expense is imported, so users can change the value on each expense. The toggle shows each expense's current value.
- The toggle uses the existing
Reimbursablelabel, matching cash expenses in NewDot today. - Bulk edit expense: We will show the Reimbursable row when none of the selected expenses has a forced value stamped on it. Selections that mix cash and non-forced card expenses show the row. If any selected expense is forced to reimbursable/non-reimbursable, the row is hidden, matching how New Expensify already handles forced cash expenses.
- This change does not apply Expensify Card transactions, which can never be reimbursable.
Existing reimbursable toggle on cash expenses
Existing reimbursable feed setting in Expensify Classic that controls whether we will show this reimbursable toggle on card expenses in New Expensify
Upwork Automation - Do Not Edit
- Upwork Job URL: https://www.upwork.com/jobs/~022108287338260589209
- Upwork Job ID: 2108287338260589209
- Last Price Increase: 2026-10-08
Issue Owner
Current Issue Owner: @dmkt9Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
ExternalAdded to denote the issue can be worked on by a contributorAdded to denote the issue can be worked on by a contributorNewFeatureSomething to build that is a new item.Something to build that is a new item.ReviewingHas a PR in reviewHas a PR in reviewWeeklyKSv2KSv2
Type
Projects
- StatusShow more project fieldsHIGH
Activity
melvin-bot commentedon Oct 8, 2026
Triggered auto assignment to Contributor-plus team member for initial proposal review - @dmkt9 (
External)melvin-bot commentedon Oct 8, 2026
Triggered auto assignment to Design team member for new feature review - @dannymcclain (
NewFeature)[-]Show the Reimbursable toggle on company card expenses when the card feed is set to Do Not Force[/-][+][$175] Show the Reimbursable toggle on company card expenses when the card feed is set to Do Not Force[/+]melvin-bot commentedon Oct 8, 2026
Job added to Upwork: https://www.upwork.com/jobs/~022108287338260589209
joekaufmanexpensify commentedon Oct 8, 2026
@dannymcclain I don't think we need any mocks here. This issue is just showing the existing reimbursable toggle on company card expenses based on an existing setting in Expensify Classic. Going ahead for now, but please let me know if you disagree. 👍
18 remaining items
dmkt9 commentedon Oct 14, 2026
@MelvinBot In addition to the transaction values, we also need to check the policy settings #103342
MelvinBot commentedon Oct 14, 2026
Proposal (updated: also check feed and workspace settings)
Please re-state the problem that we are trying to solve in this issue.
New Expensify hides the Reimbursable toggle on every company card expense. We want to show it on company card expenses set to Do Not Force. The check should use the transaction's stamped value and the feed's Reimbursable setting from Add a Reimbursable setting to company card feed settings in New Expensify.
What is the root cause of that problem?
This is a new feature. Every reimbursable check hides the row when
isManagedCardTransaction(transaction)is true. None of them readforceReimbursablefrom the transaction or the feed. The workspace Cash expenses rule (disabledFields.reimbursable) sits in the same condition, but it should only apply to cash expenses.Code references
MoneyRequestView.tsx:551-555DynamicSplitExpenseEditPage.tsx:269-272SearchEditMultiplePage.tsx:153-159. It requiresdisabledFields.reimbursable === falsefor every reported expense.forceReimbursableonCustomCardFeedData(CardFeeds.ts:85), undersettings.companyCards[feed]insharedNVP_private_domain_member_<fundID>. Nothing reads it yet.getFeedSettingsForCardalready returns that object for a card.MoneyRequestViewalready loads the expense's card and its feed data (lines 282-285).cashExpenseDefaultDescriptioninen.ts).What changes do you think we should make in order to solve the problem?
CONST.COMPANY_CARD.FORCE_REIMBURSABLEwithforce_yes,force_no,default_yes,default_noandnone.forceReimbursableto the transactionCommenttype, next toliabilityType.isCardTransactionReimbursableEditable(transaction, feedSettings)toTransactionUtils. It returns:truefor non-card expenses, so cash behavior doesn't change.falsefor Expensify Card expenses.falseif the transaction's stamped value is forced.falseif the feed setting is forced. If the feed settings exist but have no value, treat it asforce_no, per the feed settings issue.trueonly when the stamped value is Do Not Force and the feed isn't forced. If the stamp is missing, use the feed setting. If both are missing, returnfalse.getFeedSettingsForCard(card, allCardFeeds). If the viewer has no feed data, use the stamped value alone.zerynsreported, such as the toggle disappearing after one change.NON_PERSONAL_AND_WORKSPACE_CARD_LISTand its feed from theSHARED_NVP_PRIVATE_DOMAIN_MEMBERcollection. Hide the row if any selected card expense is forced.Tests:
default_yescard expense on a feed changed toforce_nohides the row.Open questions
joekaufmanexpensify): The issue says feed changes only affect newly imported expenses. Checking the current feed setting changes that: switching a feed to Force hides the toggle on older Do Not Force expenses. Please confirm that's intended.sharedNVP_private_domain_member_<fundID>. If they don't, they only get the stamped value. Please also confirm the stamped transaction key (I assumedcomment.forceReimbursable) and that search results include it.What alternative solutions did you explore? (Optional)
Use only the stamped value, as in my previous proposal. That ignores the feed setting and leaves the workspace Cash expenses rule applied to card expenses.
Next Steps for Contributor+ team:
To accept:
@MelvinBot implement [this](https://github.com/Expensify/App/issues/103341)to create a draft PR.To refine:
@MelvinBot <your feedback>To reject: Explain why you are rejecting Melvin's proposal.
view run
dmkt9 commentedon Oct 14, 2026
@MelvinBot Only check
feedSettingsif the value doesn't exist in the transactionMelvinBot commentedon Oct 14, 2026
Proposal (updated: feed setting is only a fallback)
Please re-state the problem that we are trying to solve in this issue.
New Expensify hides the Reimbursable toggle on every company card expense. We want to show it on company card expenses set to Do Not Force. The transaction's stamped
forceReimbursabledecides. The feed's Reimbursable setting from Add a Reimbursable setting to company card feed settings in New Expensify is used only when the transaction has no stamped value. This way, changing the feed setting only affects expenses imported afterward, matching Classic.What is the root cause of that problem?
This is a new feature. Every reimbursable check hides the row when
isManagedCardTransaction(transaction)is true. None of them readforceReimbursablefrom the transaction or the feed. The workspace Cash expenses rule (disabledFields.reimbursable) sits in the same condition, but it should only apply to cash expenses.Code references
MoneyRequestView.tsx:551-555DynamicSplitExpenseEditPage.tsx:269-272SearchEditMultiplePage.tsx:153-159. It requiresdisabledFields.reimbursable === falsefor every reported expense.forceReimbursableonCustomCardFeedData(CardFeeds.ts:85), undersettings.companyCards[feed]insharedNVP_private_domain_member_<fundID>. Nothing reads it yet.getFeedSettingsForCardalready returns that object for a card.MoneyRequestViewalready loads the expense's card and its feed data (lines 282-285).cashExpenseDefaultDescriptioninen.ts).What changes do you think we should make in order to solve the problem?
CONST.COMPANY_CARD.FORCE_REIMBURSABLEwithforce_yes,force_no,default_yes,default_noandnone.forceReimbursableto the transactionCommenttype, next toliabilityType.isCardTransactionReimbursableEditable(transaction, feedSettings)toTransactionUtils. It returns:truefor non-card expenses, so cash behavior doesn't change.falsefor Expensify Card expenses.truefordefault_yes,default_noornone, andfalseforforce_yesorforce_no. The feed setting is ignored.force_no, per the feed settings issue.falseif both values are missing.getFeedSettingsForCard(card, allCardFeeds). Look them up only when the transaction has no stamped value.zerynsreported, such as the toggle disappearing after one change.NON_PERSONAL_AND_WORKSPACE_CARD_LISTand its feed from theSHARED_NVP_PRIVATE_DOMAIN_MEMBERcollection. Hide the row if any selected card expense is forced.Tests:
default_yescard expense on a feed later changed toforce_nostill shows the row.force_nocard expense on a feed later changed todefault_yesstill hides the row.default_nofeed shows the row.Open questions for the internal engineer
comment.forceReimbursable) and that search results include it.sharedNVP_private_domain_member_<fundID>. If they don't, those expenses stay hidden for them.What alternative solutions did you explore? (Optional)
Check both the stamped value and the current feed setting, as in my previous update. That makes a feed change affect expenses that were already imported, which doesn't match Classic.
Next Steps for Contributor+ team:
To accept:
@MelvinBot implement [this](https://github.com/Expensify/App/issues/103341)to create a draft PR.To refine:
@MelvinBot <your feedback>To reject: Explain why you are rejecting Melvin's proposal.
view run
dmkt9 commentedon Oct 14, 2026
MelvinBot's proposal looks good to me
🎀 👀 🎀 C+
melvin-bot commentedon Oct 14, 2026
Triggered auto assignment to @blimpich, see https://stackoverflow.com/c/expensify/questions/7972 for more details.
blimpich commentedon Oct 14, 2026
LGTM, feel free to ask Melving to raise the PR @dmkt9 👍
dmkt9 commentedon Oct 15, 2026
@MelvinBot implement this #103341 (comment)
MelvinBot commentedon Oct 15, 2026
🤖 Draft PR created: Show the Reimbursable toggle on Do Not Force company card expenses
Please mark it as "Ready for review" or ask me to do that for you when it is ready for review.
It follows the approved proposal:
Typecheck, lint, spelling and the related Jest suites pass, including 17 new tests. I didn't test it manually in the app, because a fresh test account has no company card expenses with a stamped value.
The backend key is still unconfirmed. I assumed the stamped value is
comment.forceReimbursable, and search results need to include it too.view run
melvin-bot commentedon Oct 16, 2026
📣 @dmkt9 We're missing your Upwork ID to automatically send you an offer for the Reviewer role.
Once you apply to the Upwork job, your Upwork ID will be stored and you will be automatically hired for future jobs!
joekaufmanexpensify commentedon Oct 26, 2026
PR review ongoing.