---
title: SAIF.Business.External.Users operations and processes
summary: Operation catalog and cross-operation hub for the external-user library.
status: draft
owner: SAIF Doc Gen
last_reviewed: 2026-07-30
library: SAIF.Business.External.Users
reference_type: package
---

# SAIF.Business.External.Users operations and processes

This page is the operation catalog and cross-operation hub for `SAIF.Business.External.Users`. The library centers on external-user registration, account maintenance, user-type and access-group administration, premium-audit routing, and supporting lookup utilities. Each operation's detailed, step-by-step logic lives in its own page under `operations/`.

## Operation catalog

| Operation | Intent | Trigger | Inputs | Outputs | Rules | Tables | SQL |
| --- | --- | --- | --- | --- | --- | --- | --- |
| [User self-registration and account management](operations/user-account-management.md) | Create, retrieve, update, and post-process external-user accounts | `clsUser.NewUser`, `clsUser.GetUser`, `clsUser.GetForgottenUser`, or `clsUser.UpdateLastLogonDate` | `clsNewUserArgs`, `UserID`, AD user ID, email, user-type context, child collections | Persisted `EXT_USER` row, saved child objects, forgotten-user match, updated last-logon timestamp | [BR-EU-01](business-rules.md#br-eu-01-authorized-user-flag-persistence), [BR-EU-04](business-rules.md#br-eu-04-unique-active-email-per-non-test-user), [BR-EU-05](business-rules.md#br-eu-05-optimistic-concurrency-via-update_num) | [EXT_USER](database-tables.md#ext_user), [EXT_USER_TYPE](database-tables.md#ext_user_type), [EMAIL_ADDRESS](database-tables.md#email_address) | [SQL-005](sql/SQL-005-saif-business-external-users.md), [SQL-015](sql/SQL-015-saif-business-external-users.md), [SQL-016](sql/SQL-016-saif-business-external-users.md), [SQL-017](sql/SQL-017-saif-business-external-users.md), [SQL-018](sql/SQL-018-saif-business-external-users.md), [SQL-019](sql/SQL-019-saif-business-external-users.md), [SQL-045](sql/SQL-045-saif-business-external-users.md), [SQL-046](sql/SQL-046-saif-business-external-users.md) |
| [Deny self-registration check](operations/deny-self-registration-check.md) | Maintain and query the self-registration block list | `clsUserDenySelfRegistration` CRUD or `clsUserDenySelfRegistrationCollection.GetUserDenySelfRegistrations` | User-type code, source-system group ID, customer-requested flag, reason | Matching deny-list row(s) or persisted block-list change | [BR-EU-02](business-rules.md#br-eu-02-deny-self-registration-block-list), [BR-EU-05](business-rules.md#br-eu-05-optimistic-concurrency-via-update_num) | [EXT_USER_DENY_SELF_REG](database-tables.md#ext_user_deny_self_reg) | [SQL-007](sql/SQL-007-saif-business-external-users.md), [SQL-027](sql/SQL-027-saif-business-external-users.md), [SQL-048](sql/SQL-048-saif-business-external-users.md), [SQL-054](sql/SQL-054-saif-business-external-users.md) |
| [Security question management](operations/security-question-management.md) | Maintain a user's security-question answers and the active question catalog | `clsUserSecurityQuestion` CRUD, `GetUserSecurityQuestionsByUserID`, or `GetAllSecurityQuestions` | User ID, question code, answer, culture code | Persisted question rows or active question choices | [BR-EU-05](business-rules.md#br-eu-05-optimistic-concurrency-via-update_num) | [EXT_USER_SECURITY_QUESTION](database-tables.md#ext_user_security_question), [EXT_USER_SEC_QUESTION_CODE](database-tables.md#ext_user_sec_question_code) | [SQL-008](sql/SQL-008-saif-business-external-users.md), [SQL-028](sql/SQL-028-saif-business-external-users.md), [SQL-029](sql/SQL-029-saif-business-external-users.md), [SQL-049](sql/SQL-049-saif-business-external-users.md), [SQL-055](sql/SQL-055-saif-business-external-users.md) |
| [Auditor assignment override management](operations/auditor-assignment-override.md) | Maintain premium auditors, auditor zip routing, and policy-specific default or exclusion overrides | Auditor, zip-code, or override CRUD; default-auditor resolution for a policy | Auditor metadata, zip codes, policy number, override auditor IDs, audit type | Persisted `PA_AUDITOR`, `PA_AUDITOR_ZIP_CODE`, and `PA_ASSIGN_OVERRIDE` rows; resolved default auditor | [BR-EU-03](business-rules.md#br-eu-03-audit-assignment-auditor-distinctness) | [PA_AUDITOR](database-tables.md#pa_auditor), [PA_AUDITOR_ZIP_CODE](database-tables.md#pa_auditor_zip_code), [PA_ASSIGN_OVERRIDE](database-tables.md#pa_assign_override) | [SQL-001](sql/SQL-001-saif-business-external-users.md), [SQL-002](sql/SQL-002-saif-business-external-users.md), [SQL-003](sql/SQL-003-saif-business-external-users.md), [SQL-004](sql/SQL-004-saif-business-external-users.md), [SQL-010](sql/SQL-010-saif-business-external-users.md), [SQL-011](sql/SQL-011-saif-business-external-users.md), [SQL-012](sql/SQL-012-saif-business-external-users.md), [SQL-013](sql/SQL-013-saif-business-external-users.md), [SQL-042](sql/SQL-042-saif-business-external-users.md), [SQL-043](sql/SQL-043-saif-business-external-users.md), [SQL-044](sql/SQL-044-saif-business-external-users.md), [SQL-052](sql/SQL-052-saif-business-external-users.md) |
| [User access group management](operations/user-access-group-management.md) | Load, reconcile, and persist access-group selections for a user type | Access-group list retrieval, AD reconciliation helpers, or access-group save | User-type ID, user-type code, access type, AD group list, selected flags | Possible groups, AD-derived additions/removals, persisted access-group rows | [BR-EU-05](business-rules.md#br-eu-05-optimistic-concurrency-via-update_num) | [EXT_USER_ACCESS_GROUP](database-tables.md#ext_user_access_group), [EXT_USER_ACCESS_GROUP_CODE](database-tables.md#ext_user_access_group_code), [EXT_USER_ACCESS_GROUP_AD](database-tables.md#ext_user_access_group_ad), [EXT_USER_AD_GROUP](database-tables.md#ext_user_ad_group) | [SQL-006](sql/SQL-006-saif-business-external-users.md), [SQL-021](sql/SQL-021-saif-business-external-users.md), [SQL-022](sql/SQL-022-saif-business-external-users.md), [SQL-023](sql/SQL-023-saif-business-external-users.md), [SQL-024](sql/SQL-024-saif-business-external-users.md), [SQL-025](sql/SQL-025-saif-business-external-users.md), [SQL-026](sql/SQL-026-saif-business-external-users.md), [SQL-047](sql/SQL-047-saif-business-external-users.md), [SQL-053](sql/SQL-053-saif-business-external-users.md) |
| [User type management](operations/user-type-management.md) | Create, validate, and persist user-type rows and their provider/policy helper actions | `clsUserType` CRUD, `GetUserTypesByUserID`, policy/provider helper methods | User-type metadata, customer IDs, source-system values, policy number, provider email | Persisted `EXT_USER_TYPE` row, saved customer/access-group children, helper booleans and EFT updates | [BR-EU-05](business-rules.md#br-eu-05-optimistic-concurrency-via-update_num) | [EXT_USER_TYPE](database-tables.md#ext_user_type), [EXT_USER_TYPE_CODE](database-tables.md#ext_user_type_code), [EXT_USER_STATUS_CODE](database-tables.md#ext_user_status_code), [PAYMENT_AUTHORIZATION](database-tables.md#payment_authorization), [PROVIDER_EOB_INTERFACE](database-tables.md#provider_eob_interface) | [SQL-009](sql/SQL-009-saif-business-external-users.md), [SQL-030](sql/SQL-030-saif-business-external-users.md), [SQL-031](sql/SQL-031-saif-business-external-users.md), [SQL-032](sql/SQL-032-saif-business-external-users.md), [SQL-033](sql/SQL-033-saif-business-external-users.md), [SQL-034](sql/SQL-034-saif-business-external-users.md), [SQL-035](sql/SQL-035-saif-business-external-users.md), [SQL-036](sql/SQL-036-saif-business-external-users.md), [SQL-038](sql/SQL-038-saif-business-external-users.md), [SQL-039](sql/SQL-039-saif-business-external-users.md), [SQL-050](sql/SQL-050-saif-business-external-users.md), [SQL-051](sql/SQL-051-saif-business-external-users.md), [SQL-056](sql/SQL-056-saif-business-external-users.md) |
| [Premium auditor lookup](operations/premium-auditor-lookup.md) | Resolve an auditor from AD user ID and vendor number | `mdlAuditor.LoadAuditor` | AD user ID, vendor number, test-user flag | Retrieved `clsAuditor` object | — | [PA_AUDITOR](database-tables.md#pa_auditor) | [SQL-041](sql/SQL-041-saif-business-external-users.md) |
| [Zip code routing lookup](operations/zip-code-routing-lookup.md) | Resolve county, office, and audit-office routing for a zip code | `clsZipCode.GetZipCode` | Zip code | Populated routing object or empty lookup object | — | [PA_ZIP_CODE](database-tables.md#pa_zip_code), [COUNTY](database-tables.md#county), [OFFICE_CODE](database-tables.md#office_code) | [SQL-037](sql/SQL-037-saif-business-external-users.md) |
| [Provider registration validation](operations/provider-registration-validation.md) | Validate a medical-provider registration request before account creation | `clsNewUserArgs.ValidateMedicalProviderRegistration` or `clsNewUserArgs.IsValidProviderRegistration` | Provider tax ID or provider ID, bill ID, claim number, self-registration context | Boolean validation result and caller-facing error message | [BR-EU-02](business-rules.md#br-eu-02-deny-self-registration-block-list) | [DUAL](database-tables.md#dual), [EXT_USER_DENY_SELF_REG](database-tables.md#ext_user_deny_self_reg) | [SQL-014](sql/SQL-014-saif-business-external-users.md) |
| [User search](operations/user-search.md) | Search external users with optional filters and row limiting | `clsUserCollection.GetUsers(...)` search overload | Test-user flag, access group, customer ID, partial AD ID, partial email, partial name, status code, user-type code, optional row limit | Collection of matching users | — | [EXT_USER](database-tables.md#ext_user), [PERSON](database-tables.md#person), [EXT_USER_TYPE](database-tables.md#ext_user_type), [EXT_USER_ACCESS_GROUP](database-tables.md#ext_user_access_group), [COMPANY](database-tables.md#company), [PERSON_EMAIL](database-tables.md#person_email), [EMAIL_ADDRESS](database-tables.md#email_address) | [SQL-020](sql/SQL-020-saif-business-external-users.md) |
| [Password generation and validation](operations/password-generation-validation.md) | Generate temporary passwords and validate caller-supplied passwords | `clsPassword.Generate` or `clsPassword.IsValid` | Password length, special-character count, user ID, first name, last name, candidate password | Generated password string or validation result with messages | [BR-EU-06](business-rules.md#br-eu-06-password-composition-and-personal-data-exclusion) | None | None |

## Process flow diagram

The following diagram shows how the major external-user operations interact from registration through ongoing administration.

```mermaid
flowchart TD
    Start([External-user request]) --> Validate[Validate registration or admin input]
    Validate --> Provider[Provider registration validation]
    Validate --> Deny[Deny self-registration check]
    Validate --> Password[Password generation and validation]
    Provider --> Account[User self-registration and account management]
    Deny --> Account
    Password --> Account
    Account --> Questions[Security question management]
    Account --> Types[User type management]
    Types --> Groups[User access group management]
    Types --> Search[User search]
    Account --> Search
    Account --> AuditorLookup[Premium auditor lookup]
    AuditorLookup --> AuditorAdmin[Auditor assignment override management]
    AuditorAdmin --> Zip[Zip code routing lookup]
    Zip --> AuditorAdmin
    Search --> Done([Read or persisted result returned])
    Questions --> Done
    Groups --> Done
    AuditorAdmin --> Done
```

## Database interactions

The following table summarizes which operations read from or write to the database. Per-step SQL and table citations live in each operation's detail page under `operations/`.

| Operation | SQL | Tables | Type |
| --- | --- | --- | --- |
| [User self-registration and account management](operations/user-account-management.md) | [SQL-005](sql/SQL-005-saif-business-external-users.md), [SQL-015](sql/SQL-015-saif-business-external-users.md), [SQL-016](sql/SQL-016-saif-business-external-users.md), [SQL-017](sql/SQL-017-saif-business-external-users.md), [SQL-018](sql/SQL-018-saif-business-external-users.md), [SQL-019](sql/SQL-019-saif-business-external-users.md), [SQL-045](sql/SQL-045-saif-business-external-users.md), [SQL-046](sql/SQL-046-saif-business-external-users.md) | [EXT_USER](database-tables.md#ext_user), [EXT_USER_TYPE](database-tables.md#ext_user_type), [EMAIL_ADDRESS](database-tables.md#email_address) | Read / Write |
| [Deny self-registration check](operations/deny-self-registration-check.md) | [SQL-007](sql/SQL-007-saif-business-external-users.md), [SQL-027](sql/SQL-027-saif-business-external-users.md), [SQL-048](sql/SQL-048-saif-business-external-users.md), [SQL-054](sql/SQL-054-saif-business-external-users.md) | [EXT_USER_DENY_SELF_REG](database-tables.md#ext_user_deny_self_reg) | Read / Write |
| [Security question management](operations/security-question-management.md) | [SQL-008](sql/SQL-008-saif-business-external-users.md), [SQL-028](sql/SQL-028-saif-business-external-users.md), [SQL-029](sql/SQL-029-saif-business-external-users.md), [SQL-049](sql/SQL-049-saif-business-external-users.md), [SQL-055](sql/SQL-055-saif-business-external-users.md) | [EXT_USER_SECURITY_QUESTION](database-tables.md#ext_user_security_question), [EXT_USER_SEC_QUESTION_CODE](database-tables.md#ext_user_sec_question_code) | Read / Write |
| [Auditor assignment override management](operations/auditor-assignment-override.md) | [SQL-001](sql/SQL-001-saif-business-external-users.md), [SQL-002](sql/SQL-002-saif-business-external-users.md), [SQL-003](sql/SQL-003-saif-business-external-users.md), [SQL-004](sql/SQL-004-saif-business-external-users.md), [SQL-010](sql/SQL-010-saif-business-external-users.md), [SQL-011](sql/SQL-011-saif-business-external-users.md), [SQL-012](sql/SQL-012-saif-business-external-users.md), [SQL-013](sql/SQL-013-saif-business-external-users.md), [SQL-042](sql/SQL-042-saif-business-external-users.md), [SQL-043](sql/SQL-043-saif-business-external-users.md), [SQL-044](sql/SQL-044-saif-business-external-users.md), [SQL-052](sql/SQL-052-saif-business-external-users.md) | [PA_AUDITOR](database-tables.md#pa_auditor), [PA_AUDITOR_ZIP_CODE](database-tables.md#pa_auditor_zip_code), [PA_ASSIGN_OVERRIDE](database-tables.md#pa_assign_override) | Read / Write |
| [User access group management](operations/user-access-group-management.md) | [SQL-006](sql/SQL-006-saif-business-external-users.md), [SQL-021](sql/SQL-021-saif-business-external-users.md), [SQL-022](sql/SQL-022-saif-business-external-users.md), [SQL-023](sql/SQL-023-saif-business-external-users.md), [SQL-024](sql/SQL-024-saif-business-external-users.md), [SQL-025](sql/SQL-025-saif-business-external-users.md), [SQL-026](sql/SQL-026-saif-business-external-users.md), [SQL-047](sql/SQL-047-saif-business-external-users.md), [SQL-053](sql/SQL-053-saif-business-external-users.md) | [EXT_USER_ACCESS_GROUP](database-tables.md#ext_user_access_group), [EXT_USER_ACCESS_GROUP_AD](database-tables.md#ext_user_access_group_ad), [EXT_USER_AD_GROUP](database-tables.md#ext_user_ad_group) | Read / Write |
| [User type management](operations/user-type-management.md) | [SQL-009](sql/SQL-009-saif-business-external-users.md), [SQL-030](sql/SQL-030-saif-business-external-users.md), [SQL-031](sql/SQL-031-saif-business-external-users.md), [SQL-032](sql/SQL-032-saif-business-external-users.md), [SQL-033](sql/SQL-033-saif-business-external-users.md), [SQL-034](sql/SQL-034-saif-business-external-users.md), [SQL-035](sql/SQL-035-saif-business-external-users.md), [SQL-036](sql/SQL-036-saif-business-external-users.md), [SQL-038](sql/SQL-038-saif-business-external-users.md), [SQL-039](sql/SQL-039-saif-business-external-users.md), [SQL-050](sql/SQL-050-saif-business-external-users.md), [SQL-051](sql/SQL-051-saif-business-external-users.md), [SQL-056](sql/SQL-056-saif-business-external-users.md) | [EXT_USER_TYPE](database-tables.md#ext_user_type), [PAYMENT_AUTHORIZATION](database-tables.md#payment_authorization), [PROVIDER_EOB_INTERFACE](database-tables.md#provider_eob_interface) | Read / Write |
| [Premium auditor lookup](operations/premium-auditor-lookup.md) | [SQL-041](sql/SQL-041-saif-business-external-users.md) | [PA_AUDITOR](database-tables.md#pa_auditor) | Read |
| [Zip code routing lookup](operations/zip-code-routing-lookup.md) | [SQL-037](sql/SQL-037-saif-business-external-users.md) | [PA_ZIP_CODE](database-tables.md#pa_zip_code), [COUNTY](database-tables.md#county), [OFFICE_CODE](database-tables.md#office_code) | Read |
| [Provider registration validation](operations/provider-registration-validation.md) | [SQL-014](sql/SQL-014-saif-business-external-users.md) | [DUAL](database-tables.md#dual), [EXT_USER_DENY_SELF_REG](database-tables.md#ext_user_deny_self_reg) | Read |
| [User search](operations/user-search.md) | [SQL-020](sql/SQL-020-saif-business-external-users.md) | [EXT_USER](database-tables.md#ext_user), [PERSON](database-tables.md#person), [EXT_USER_TYPE](database-tables.md#ext_user_type), [EXT_USER_ACCESS_GROUP](database-tables.md#ext_user_access_group), [COMPANY](database-tables.md#company), [PERSON_EMAIL](database-tables.md#person_email), [EMAIL_ADDRESS](database-tables.md#email_address) | Read |
| [Password generation and validation](operations/password-generation-validation.md) | None | None | In-memory only |

## Stored procedure operations

Operations implemented in Oracle stored procedures referenced by this library.

| Operation | Description | Source | Link |
| --- | --- | --- | --- |
| Provider registration validation | Validates that the provider, bill, and claim combination is eligible for registration | `pk82396_medical_bills.ValidateProvReg` | [Details](procedures/pk82396_medical_bills.md) |
| Quoted policy expiry check | Evaluates whether a quoted policy has expired before policyholder self-registration | `pk72971_epay_policy.is_expired_quoted_policy` | [Details](procedures/pk72971_epay_policy.md) |
| Billing plan type retrieval | Verifies that a quoted or pending policy has an established billing plan | `pk72971_epay_policy.get_policy_billing_plan_type` | [Details](procedures/pk72971_epay_policy.md) |
| ePay eligibility check | Verifies that the billing plan supports the installment pattern required for self-registration | `pk72971_epay_policy.is_policy_eligible_for_epay` | [Details](procedures/pk72971_epay_policy.md) |

## Failure and edge-case behavior

- Duplicate active non-test email addresses fail validation before the user row is persisted ([BR-EU-04](business-rules.md#br-eu-04-unique-active-email-per-non-test-user)).
- Updates on BOF-managed tables rely on `UPDATE_NUM`; if the row-count check fails, the operation reports a DB-contention error instead of silently overwriting data ([BR-EU-05](business-rules.md#br-eu-05-optimistic-concurrency-via-update_num)).
- Self-registration validators actively query the deny list for agency, provider, policyholder, and injured-worker registrations; any matching row blocks the registration path ([BR-EU-02](business-rules.md#br-eu-02-deny-self-registration-block-list)).
- The stored-procedure package bodies referenced by [Provider registration validation](operations/provider-registration-validation.md) and the policy helper methods are not present in this repository, so their database-side behavior must be taken from the SQL and procedure documentation rather than traced local source.**
- Lookup-style operations such as [Premium auditor lookup](operations/premium-auditor-lookup.md) and [Zip code routing lookup](operations/zip-code-routing-lookup.md) return whatever data the backing read path finds; when no row matches, callers receive an empty or default object rather than a persisted update.

## Related documentation
- [Index](index.md)
- [Overview](overview.md)
- [Architecture](architecture.md)
- [Dependencies](dependencies.md)
- [Business rules](business-rules.md)
- [Database tables](database-tables.md)
- [SQL catalog](sql/index.md)
- [Procedures](procedures/index.md)
- [API reference](api/index.md)
- [Configuration](configuration.md)

> **Note:** Statements marked with * were inferred from code structure, naming conventions, or contextual evidence where direct confirmation was not available in source artifacts. Statements marked with ** could not be confirmed; treat as unknown until verified.

## Sources
- `Business\SAIF.Business.External.Users\clsAuditAssignmentOverride.vb`
- `Business\SAIF.Business.External.Users\clsAuditor.vb`
- `Business\SAIF.Business.External.Users\clsAuditorCollection.vb`
- `Business\SAIF.Business.External.Users\clsAuditorZipCode.vb`
- `Business\SAIF.Business.External.Users\clsAuditorZipCodeCollection.vb`
- `Business\SAIF.Business.External.Users\clsNewUserArgs.vb`
- `Business\SAIF.Business.External.Users\clsPassword.vb`
- `Business\SAIF.Business.External.Users\clsUser.vb`
- `Business\SAIF.Business.External.Users\clsUserAccessGroup.vb`
- `Business\SAIF.Business.External.Users\clsUserDenySelfRegistration.vb`
- `Business\SAIF.Business.External.Users\clsUserSecurityQuestion.vb`
- `Business\SAIF.Business.External.Users\clsUserType.vb`
- `Business\SAIF.Business.External.Users\clsZipCode.vb`
- `Business\SAIF.Business.External.Users\mdlAuditor.vb`
- `Business\SAIF.Business.External.Users\mdlCodeMaps.vb`
- `Business\SAIF.Business.External.Users\mdlGroupAssociation.vb`
