---
title: Compose local US Bank user identifier
summary: Builds the composite local identifier (policy number plus business-online user ID) used to key a SAIF policy/user pair for US Bank, rejecting combinations that would be too long.
status: draft
owner: SAIF
last_reviewed: 2026-07-30
library: SAIF.Business.EPay.USBank
reference_type: package
operation_id: OP-EPAY-09
trigger: Caller invokes User.GetUser(inPolicyNumber, inBusinessOnlineUserId)
---

# Compose local US Bank user identifier

This is a small, standalone utility operation: it concatenates a policy number and a business-online user ID into a single composite string, enforces US Bank's 16-character identifier limit, and returns an object exposing that ID alongside a fixed password. It has no BOF persistence and no SOAP call of its own — it exists purely to produce an identifier value another caller can supply to US Bank-facing operations.

| Field | Value |
| --- | --- |
| **Operation ID** | OP-EPAY-09 |
| **Trigger** | Caller invokes `User.GetUser(inPolicyNumber, inBusinessOnlineUserId)` |
| **Inputs** | Policy number (String), business-online user ID (String) |
| **Outputs** | A `User` instance exposing the composite `UserId` and a fixed `Password` |
| **Primary components** | `User.GetUser`, `User.New` (private constructor) |
| **Entry point** | `Business\SAIF.Business.EPay.USBank\User.vb` |

## Steps

1. **Concatenate the inputs.** `GetUser` forms the candidate identifier by concatenating `inPolicyNumber` and `inBusinessOnlineUserId` with no separator.
2. **Enforce the length limit.** If the concatenated string is 16 characters or fewer, construct and return a new `User` with that value as its `UserId` ([BR-017](../business-rules.md#br-017-local-composite-user-ids-are-limited-to-16-characters)).
   - If longer than 16 characters: throw `Exception("Combination of inPolicyNumber and inBusinessOnlineUserId are too long for US Bank.")`. A source comment notes a possible future improvement — generating and storing a short surrogate ID instead of throwing — that is not implemented.*
3. **Expose the fixed password.** The returned `User.Password` always returns the literal string `"9999aaaa"`, the same hardcoded value used elsewhere in this library for US Bank user passwords.

## Process flow

The following diagram visualizes this operation's control flow.

```mermaid
flowchart TD
	Start([GetUser policyNumber, businessOnlineUserId]) --> Concat[Concatenate policy number<br>and business-online user ID]
	Concat --> Len{Length <= 16?}
	Len -->|Yes| Ok([Return new User<br>with composite UserId])
	Len -->|No| Err([Throw: combination too long])
```

## Failure and edge-case behavior

- There is no separator between the policy number and business-online user ID, so different policy/user pairs could theoretically concatenate to the same composite string if one pair's boundary characters happen to match another's — for example policy `"12"` with user `"34"` versus policy `"1"` with user `"234"`.*
- The 16-character limit throws a plain `System.Exception` rather than a more specific or application-level exception type, unlike most other failure paths in this library which use `ApplicationException`.*
- The class provides no way to reconstruct a `User` from an already-known composite ID — the constructor is private, so `GetUser` is the only entry point.

> **Note:** Statements marked with `*` were inferred from code structure, naming
> conventions, or contextual evidence where direct confirmation was not available
> in source artifacts.

## Related documentation

- [Operations and processes](../operations-processes.md)
- [Business rules](../business-rules.md)
- [SQL catalog](../sql/index.md)
- [Database tables](../database-tables.md)

## Sources

- `Business\SAIF.Business.EPay.USBank\User.vb`
