Skip to content

[Due for payment 2025-12-05] [$250] Workspace - Company name instead of Reconciliation bank account name #72758

Closed

Description

@jponikarchuk

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.2.32-0
Reproducible in staging?: Yes
Reproducible in production?: Yes
If this was caught during regression testing, add the test name, ID and link from BrowserStack: #72543
Email or phone of affected tester (no customers): -
Issue reported by: Applause Internal Team
Device used: MacOS Catalina 10.15.7 / Chrome
App Component: Other

Action Performed:

Precondition: workspace with enabled Expensify card, two bank accounts and connected Accounting integration (e.g. Netsuite)

  1. Go to WS > Accounting
  2. Click on Card reconciliation
  3. Turn on toggle Continuous Reconciliation

Expected Result:

The list on the ReconciliationAccountSettingsPage consist bank account names (e.g. Plaid Savings, Plaid Checking)

Actual Result:

The list on the ReconciliationAccountSettingsPage consist company names - Alberta Bobbeth Charleson, which makes indeterminacy which account to choose.

Workaround:

Unknown

Platforms:

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

Screenshots/Videos

1.mp4

View all open jobs on GitHub

Upwork Automation - Do Not Edit
  • Upwork Job URL: https://www.upwork.com/jobs/~021980574704594726344
  • Upwork Job ID: 1980574704594726344
  • Last Price Increase: 2025-11-11
  • Automatic offers:
    • daledah | Contributor | 109588429

Activity

  1. added
    BugSomething is broken. Auto assigns a BugZero manager.
    on Oct 16, 2025
  2. melvin-bot commented on Oct 16, 2025

    @melvin-bot

    Triggered auto assignment to @bfitzexpensify (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. daledah commented on Oct 16, 2025

    @daledah
    Contributor

    🚨 Edited by proposal-police: This proposal was edited at 2025-10-22 16:29:34 UTC.

    Proposal

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

    The list on the ReconciliationAccountSettingsPage consist company names - Alberta Bobbeth Charleson, which makes indeterminacy which account to choose.

    What is the root cause of that problem?

    We're using bank account title here:

    Some bank account have different number but have the same title.

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

    To better distinguish different account title and account number, we should add an alternate text showing account number:

    return eligibleBankAccounts.map((bankAccount, index) => ({
    text: bankAccount.title,
    value: bankAccount.accountData?.bankAccountID,
    keyForList: bankAccount.accountData?.bankAccountID?.toString() ?? `${bankAccount.title}-${index}`,
    isSelected: bankAccount.accountData?.bankAccountID === paymentBankAccountID,
    }));

    alternateText: bankAccount.description ?? (bankAccount.accountData?.accountNumber ? `${translate('bankAccount.accountEnding')} ${getLastFourDigits(bankAccount.accountData.accountNumber)}` : ''),
    Image

    We can use different translation, this can be discussed further in the PR phase.

    To use the new list item, replace RadioListItem with SingleSelectListItem, with some tweaks to match the design styles.

    Note: We don't store each account's name, this information is available only when adding bank account flow. I think this is expected for security reasons. So we have the only option to display in account number last four.

    What specific scenarios should we cover in automated tests to prevent reintroducing this issue in the future?

    None

    What alternative solutions did you explore? (Optional)

    Reminder: Please use plain English, be brief and avoid jargon. Feel free to use images, charts or pseudo-code if necessary. Do not post large multi-line diffs or write walls of text. Do not create PRs unless you have been hired for this job.

  4. ShridharGoel commented on Oct 16, 2025

    @ShridharGoel
    Contributor

    🚨 Edited by proposal-police: This proposal was edited at 2025-10-22 15:09:43 UTC.

    Proposal

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

    Workspace accounting screens show confusing bank names. When admins enable continuous reconciliation, the pickers list the workspace legal entity or card domain name instead of the real bank account label.

    What is the root cause of that problem?

    The bank selection lists read bankAccount.title, which stores the company name for these feeds rather than the connected bank nickname. See the existing mapper that feeds the reconciliation picker:

    const sections = useMemo(() => {
    if (!bankAccountList || isEmptyObject(bankAccountList)) {
    return [];
    }
    const eligibleBankAccounts = getEligibleBankAccountsForCard(bankAccountList);
    const data = eligibleBankAccounts.map((bankAccount) => ({
    text: bankAccount.title,
    value: bankAccount.accountData?.bankAccountID,
    keyForList: bankAccount.accountData?.bankAccountID?.toString(),
    isSelected: bankAccount.accountData?.bankAccountID === paymentBankAccountID,
    }));
    return [{data}];
    }, [bankAccountList, paymentBankAccountID]);

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

    Create a shared helper that builds a friendly display name for each bank account, and reuse it across every settlement-account list. The helper would contain multiple fallbacks so that if a particular data is not available, then we can use the next best available data to decide the name to be shown. Pair that primary label with the standard “Account ending in XXXX” secondary line so the picker matches the rest of the places where we show such options.

    Key updates:

    • Add getBankAccountDisplayName in BankAccountUtils to normalize names once.
    • Swap each selection list to call that helper when setting the option text or title.
    • Include the masked last four digits (alternate text / description) alongside the friendly label.
    • Update the reconciliation summary card to use the same helper so the label stays consistent across screens.
    // src/libs/BankAccountUtils.ts
    const ACCOUNT_NAME_KEYWORDS = ['checking', 'savings', 'account'];
    
    function getBankAccountDisplayName(bankAccount: OnyxTypes.BankAccount | undefined, translate: TranslateFunction): string {
        if (!bankAccount) {
            return '';
        }
    
        const accountName = bankAccount.accountData?.addressName?.trim() ?? '';
        const lastFourDigits = getLastFourDigits(bankAccount.accountData?.accountNumber ?? '');
        const friendlyBankNames = CONST.BANK_NAMES_USER_FRIENDLY;
        const bankNameKey = bankAccount.accountData?.additionalData?.bankName;
        const bankName = bankNameKey ? friendlyBankNames?.[bankNameKey] ?? startCase(bankNameKey) : '';
    
        if (accountName) {
            const normalizedAccountName = accountName.toLowerCase();
            const includesKeyword = ACCOUNT_NAME_KEYWORDS.some((keyword) => normalizedAccountName.includes(keyword));
            const includesBankName = bankName ? normalizedAccountName.includes(bankName.toLowerCase()) : false;
    
            if (includesKeyword || includesBankName) {
                return accountName;
            }
        }
    
        if (bankName) {
            return bankName;
        }
    
        if (accountName) {
            return accountName;
        }
    
        if (lastFourDigits) {
            return `${translate('workspace.expensifyCard.accountEndingIn')} ${lastFourDigits}`;
        }
    
        return translate('common.bankAccount');
    }
    // src/pages/workspace/accounting/reconciliation/ReconciliationAccountSettingsPage.tsx
    const sections = useMemo(() => {
        if (!bankAccountList || isEmptyObject(bankAccountList)) {
            return [];
        }
        const eligibleBankAccounts = getEligibleBankAccountsForCard(bankAccountList);
    
        const data = eligibleBankAccounts.map((bankAccount) => {
            const bankAccountNumber = bankAccount.accountData?.accountNumber ?? '';
            return {
                text: getBankAccountDisplayName(bankAccount, translate),
                alternateText: `${translate('workspace.expensifyCard.accountEndingIn')} ${getLastFourDigits(bankAccountNumber)}`,
                value: bankAccount.accountData?.bankAccountID,
                keyForList: bankAccount.accountData?.bankAccountID?.toString(),
                isSelected: bankAccount.accountData?.bankAccountID === paymentBankAccountID,
            };
        });
        return [{data}];
    }, [bankAccountList, paymentBankAccountID, translate]);
    Image

    Above logic can be discussed and improved during implementation.

    We can consider using the same helper in WorkspaceSettlementAccountPage, WorkspaceExpensifyCardBankAccounts, CardReconciliationPage, and ChooseTransferAccountPage so every view shows the same friendly name.

    Update: As per latest design comment, we can start using the radio list UI for this feature.

  5. added
    ExternalAdded to denote the issue can be worked on by a contributor
    on Oct 21, 2025
  6. changed the title [-]Workspace - Company name instead of Reconciliation bank account name[/-] [+][$250] Workspace - Company name instead of Reconciliation bank account name[/+] on Oct 21, 2025
  7. melvin-bot commented on Oct 21, 2025

    @melvin-bot
  8. added
    Help WantedApply this label when an issue is open to proposals by contributors
    on Oct 21, 2025
  9. melvin-bot commented on Oct 21, 2025

    @melvin-bot

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

  10. 67 remaining items

  11. melvin-bot commented on Nov 28, 2025

    @melvin-bot

    The solution for this issue has been 🚀 deployed to production 🚀 in version 9.2.65-6 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 2025-12-05. 🎊

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

  12. melvin-bot commented on Nov 28, 2025

    @melvin-bot

    @akinwale @bfitzexpensify 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]

  13. akinwale commented on Dec 3, 2025

    @akinwale
    Contributor

    BugZero Checklist:

    • [@akinwale] 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: N/A

    • [@akinwale] 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

    • [@akinwale] 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.

    • [BugZero Assignee] Create a GH issue for creating/updating the regression test once above steps have been agreed upon.

      Link to issue:

    Regression Test Proposal

    Precondition:

    • Workspace with Expensify card enabled, two or more bank accounts and a connected accounting integration (e.g. Netsuite)

    Test:

    1. Launch Expensify.
    2. Navigate to Workspace settings > Accounting.
    3. Click on Card reconciliation.
    4. Turn on toggle Continuous Reconciliation.
    5. Verify that there is an alternative text below the bank account name with the last 4 digits of the account number (Account ending in XXXX)

    Do we agree 👍 or 👎?

  14. Julesssss commented on Dec 3, 2025

    @Julesssss
    Contributor

    Don't need a specific regression test for just this case.

  15. Julesssss commented on Dec 8, 2025

    @Julesssss
    Contributor

    awaiting payment

  16. bfitzexpensify commented on Dec 11, 2025

    @bfitzexpensify
    Contributor

    Payment summary:

    @akinwale due $250 via NewDot Manual Requests
    @daledah paid $250 via Upwork ✅

  17. moved this from Bugs and Follow Up Issues to Done in #expensify-bugson Dec 11, 2025
  18. JmillsExpensify commented on Dec 12, 2025

    @JmillsExpensify
    Contributor

    $250 approved for @akinwale

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 contributor

Type

No type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions