---
title: SAIF.Business.Provider.PaymentPreference operations and processes
summary: Business and technical operations supported by this library.
status: draft
owner: SAIF
last_reviewed: 2026-07-30
library: SAIF.Business.Provider.PaymentPreference
reference_type: package
---

# SAIF.Business.Provider.PaymentPreference operations and processes

This page is the operation catalog and cross-operation hub for this library. Each operation's detailed, step-by-step logic lives in its own page under `operations/`. The library manages a provider location's mail/paperless EOB preference and its EFT (direct-deposit) preference, including assignment/unassignment of payment methods, correspondence-history logging, batch/collection retrieval, and read-only bank-account lookup.

## Operation catalog
| Operation | Intent | Trigger | Inputs | Outputs | Rules | Tables | SQL |
| --- | --- | --- | --- | --- | --- | --- | --- |
| [EOB preference management](operations/eob-preference-management.md) | Retrieves, creates, updates, and deletes a provider location's paperless/mail EOB preference | `GetProviderEOB(s)`/`NewProviderEOB(s)` → `Save()` | `ProviderSeqNum`, `ProviderLocationSeqNum`, `PaperlessEOBFlag`, `DefaultPrimaryFlag` | Persisted `PROVIDER_EOB_INTERFACE` row or `InsertError`/`DBContentionError` | [BR-01](business-rules.md#br-01-paperlesseobflag-is-set-to-y-only-when-extusertypeseqnum-is-non-zero-and-non-empty-at-insert-time-otherwise-defaults-to-n), [BR-02](business-rules.md#br-02-defaultprimaryflag-is-always-initialized-to-n-on-new-eob-creation), [BR-03](business-rules.md#br-03-insert-contention-check-if-rowsaffected-1-after-insert-an-inserterror-error-message-is-added-and-the-record-is-not-marked-old), [BR-04](business-rules.md#br-04-update-contention-check-if-rowsaffected-1-after-update-dbcontentionerror-is-added-updatenum-must-match-for-the-where-clause-to-succeed), [BR-05](business-rules.md#br-05-delete-contention-check-if-rowsaffected-1-after-delete-dbcontentionerror-is-added), [BR-17](business-rules.md#br-17-username-on-clsprovidereob-returns-the-constant-papereob-paper-eob-when-the-underlying-name-is-blank-indicating-no-external-user-is-linked-to-the-record), [BR-18](business-rules.md#br-18-a-retrieved-eob-preference-row-with-updatenum-equal-to-zero-is-treated-as-unsaved-and-marked-new-so-save-falls-through-to-insert-instead-of-update) | [PROVIDER_EOB_INTERFACE](database-tables.md#provider_eob_interface) | [SQL-001](sql/SQL-001-insert-provider-eob-interface.md), [SQL-005](sql/SQL-005-select-provider-eob-interface-by-provider-location.md), [SQL-006](sql/SQL-006-select-provider-eob-interface-by-location.md), [SQL-007](sql/SQL-007-select-provider-locations-with-eob-preference.md), [SQL-013](sql/SQL-013-update-provider-eob-interface.md), [SQL-015](sql/SQL-015-delete-provider-eob-interface.md) |
| [EFT record management](operations/eft-record-management.md) | Retrieves, creates, updates, and deletes a provider location's EFT (direct-deposit) record | `GetProviderEFT`/`NewProviderEFT` → `Save()` | `ProviderSeqNum`, `ProviderLocationSeqNum`, `ExtUserTypeSeqNum`, `EffDate`, `ExpDate` | Persisted `PROVIDER_EFT_INTERFACE` row or `InsertError`/`DBContentionError` | [BR-11](business-rules.md#br-11-extusertypeseqnum-is-cleared-set-empty-when-the-eft-is-being-expired-expdate-minvalue-and-no-explicit-new-value-supplied-or-when-no-admin-user-is-present-it-is-set-from-the-incoming-invalue-when-a-new-eft-is-being-opened-and-from-adminuserseqnum-otherwise), [BR-12](business-rules.md#br-12-eft-insert-contention-rowsaffected-1-triggers-inserterror-child-payment-preferences-are-saved-only-after-a-successful-insert-savechildobject-called-in-afterinsert), [BR-13](business-rules.md#br-13-eft-update-contention-rowsaffected-1-triggers-dbcontentionerror-updatenum-is-incremented-and-child-preferences-saved-only-on-success), [BR-16](business-rules.md#br-16-if-effdate-is-dateminvalue-at-update-time-it-is-defaulted-to-todaydate-before-persisting) | [PROVIDER_EFT_INTERFACE](database-tables.md#provider_eft_interface), [EXT_USER_TYPE](database-tables.md#ext_user_type), [EXT_USER](database-tables.md#ext_user), [PERSON](database-tables.md#person) | [SQL-003](sql/SQL-003-insert-provider-eft-interface.md), [SQL-008](sql/SQL-008-select-provider-eft-interface-by-provider-location.md), [SQL-014](sql/SQL-014-update-provider-eft-interface.md), [SQL-016](sql/SQL-016-delete-provider-eft-interface.md) |
| [EFT payment location assignment](operations/eft-payment-location-assignment.md) | Assigns a new direct-deposit/check preference to an EFT record, or unassigns it and revokes the prior authorization | `AssignPaymentLocation`/`UnAssignPaymentLocation` | New `clsProviderPaymentPreference`, acting user | Updated `ProviderPaymentPreference`, `EffDate`/`ExpDate`; revoked prior authorization | [BR-08](business-rules.md#br-08-when-assigning-a-new-payment-preference-to-an-eft-that-is-already-saved-and-currently-direct-deposit-the-existing-authorization-is-revoked-before-the-new-one-is-applied-if-the-existing-eft-is-new-unsaved-or-is-a-check-type-it-is-simply-overwritten), [BR-09](business-rules.md#br-09-on-assignpaymentlocation-customeremailnotificationflag-is-always-set-to-y-and-customercontactemailaddress-is-populated-from-extuseremailaddr-ensuring-the-customer-receives-notification-of-an-eft-assignment), [BR-10](business-rules.md#br-10-on-unassignpaymentlocation-expdate-is-set-to-today-and-the-active-authorization-is-revoked-for-saif-employees-isusersaifemployee-true-authorization-is-revoked-with-false-internal-path-for-non-employees-with-true-external-path), [BR-11](business-rules.md#br-11-extusertypeseqnum-is-cleared-set-empty-when-the-eft-is-being-expired-expdate-minvalue-and-no-explicit-new-value-supplied-or-when-no-admin-user-is-present-it-is-set-from-the-incoming-invalue-when-a-new-eft-is-being-opened-and-from-adminuserseqnum-otherwise) | [PROVIDER_EFT_INTERFACE](database-tables.md#provider_eft_interface) | [SQL-003](sql/SQL-003-insert-provider-eft-interface.md), [SQL-014](sql/SQL-014-update-provider-eft-interface.md) |
| [EFT correspondence history](operations/eft-correspondence-history.md) | Records an EFT authorization-letter correspondence-history event via a stored PL/SQL package | `CreateHistory()` | `ProviderSeqNum`, `ProviderLocationSeqNum`, `EffDate`, `ExpDate` | Inserted `PROVIDER_CORR_HIST` row or raised package exception | [PBR-001](business-rules.md#pbr-001-only-the-provider-primary-tax-id-row-supplies-the-correspondence-address), [PBR-002](business-rules.md#pbr-002-the-tax-id-row-must-be-effective-on-the-supplied-eft-effective-date), [PBR-003](business-rules.md#pbr-003-fetch-tin-address-returns-only-the-first-matching-tax-id-address-row), [PBR-004](business-rules.md#pbr-004-eft-correspondence-history-inserts-are-always-marked-as-authorization-letter-events), [PBR-005](business-rules.md#pbr-005-foreign-address-history-values-are-normalized-to-y-or-n-during-insert), [PBR-006](business-rules.md#pbr-006-correspondence-history-rows-always-stamp-create-date-create-number-and-create-user), [PBR-007](business-rules.md#pbr-007-tax-id-lookup-failures-are-raised-instead-of-silently-ignored) | [PROVIDER_CORR_HIST](database-tables.md#provider_corr_hist), [PROVIDER_TAX_ID](database-tables.md#provider_tax_id), [PROVIDER](database-tables.md#provider) | [SQL-002](sql/SQL-002-pk83548-provider-corr-hist-eft-corr-hist.md) |
| [Provider EFT collection retrieval](operations/provider-eft-collection-retrieval.md) | Retrieves batches of EFT/location records for a provider, or system-wide, and classifies them by assignment status | `GetProviderEFTColl`/`GetAllEFTsColl`/`GetProviderEFTLocations`/`GetProviderEFTLocEmails` | `ProviderSeqNum` (except batch), masking/context flags | Populated `clsProviderEFTCollection`; filtered assigned/unassigned views | [BR-06](business-rules.md#br-06-an-eft-record-is-considered-active-only-when-today-falls-within-effdate-expdate-inclusive-if-either-date-is-null-isactive-false), [BR-07](business-rules.md#br-07-a-provider-location-has-eft-direct-deposit-only-when-paymentpreferencetype-directdeposit-and-isrevokedatenull-authorization-has-not-been-revoked), [BR-15](business-rules.md#br-15-provider-location-eft-eligibility-requires-an-active-physical-address-provideraddresscode-phy-effdate-truncsysdate-expdate-truncsysdate-or-expdate-is-null) | [PROVIDER_EFT_INTERFACE](database-tables.md#provider_eft_interface), [PROVIDER_LOCATION](database-tables.md#provider_location), [PROVIDER_ADDRESS](database-tables.md#provider_address), [EXT_USER_TYPE](database-tables.md#ext_user_type), [EXT_USER](database-tables.md#ext_user), [EMAIL_ADDRESS](database-tables.md#email_address) | [SQL-009](sql/SQL-009-select-all-provider-eft-interface-rows.md), [SQL-010](sql/SQL-010-select-provider-eft-interface-by-provider.md), [SQL-011](sql/SQL-011-select-provider-eft-locations.md), [SQL-012](sql/SQL-012-select-provider-eft-locations-with-external-user-email.md) |
| [Provider bank account retrieval](operations/provider-bank-account-retrieval.md) | Retrieves non-deleted bank accounts linked to a provider's payment authorizations and decrypts/masks their fields | `GetProviderBankAccounts` → field access | `ProviderSeqNum` | Populated `clsProviderBankAccountCollection`; decrypted/masked field values | [BR-14](business-rules.md#br-14-bank-account-status-delet-is-excluded-from-all-bank-account-retrievals-for-a-provider) | [BANK_ACCOUNT](database-tables.md#bank_account), [PAYMENT_AUTHORIZATION](database-tables.md#payment_authorization), [PROVIDER_LOCATION](database-tables.md#provider_location) | [SQL-004](sql/SQL-004-select-provider-bank-accounts-by-provider.md) |

<!--
  STRICT: The Operation name in each catalog row MUST link to that operation's
  detail page at operations/<operation-slug>.md (never an on-page anchor). The
  step-by-step logic, per-step rule/SQL citations, and embedded dependency logic
  live in the per-operation document (see templates/operation-document.md), not
  on this hub page. The Rules column lists the primary business rules the
  operation enforces, each as a link to business-rules.md.
-->

## Process flow diagram
The following diagram visualizes the primary operational flow across operations.

```mermaid
flowchart TD
	Start([Provider location payment setup]) --> Choice{Preference type?}
	Choice -->|EOB delivery| EOB[EOB preference management]
	Choice -->|Payment method| EFT[EFT record management]
	EFT --> Assign[EFT payment location assignment]
	Assign --> History[EFT correspondence history]
	EOB --> Collection[Provider EFT collection retrieval]
	Assign --> Collection
	Collection --> BankAcct[Provider bank account retrieval]
```

## Inherited operations and processes

Operations in this section originate from base classes or services provided by dependency libraries. They are inherited or delegated, not implemented in this library.

### From `clsProviderPaymentPreference`, `clsBankAccount` (`SAIF.Business.Payment.EFT`)

| Operation | Intent | Provided by | Origin | Embedded in |
| --- | --- | --- | --- | --- |
| Payment preference selection | Resolves a provider location's current payment-preference type (Check, DirectDeposit, DebitCard, Unspecified) and loads its authorization. | `clsProviderPaymentPreference` | `SAIF.Business.Payment.EFT` | [EFT payment location assignment](operations/eft-payment-location-assignment.md) |
| EFT authorization / consent | Revokes an existing direct-deposit authorization, using an internal or external revocation path depending on the acting user. | `clsEFTAuthorization` | `SAIF.Business.Payment.EFT` | [EFT payment location assignment](operations/eft-payment-location-assignment.md) |
| Bank account management | Resolves and masks a bank account's nickname, routing number, and account number for a given bank account sequence number. | `clsBankAccount` | `SAIF.Business.Payment.EFT` | [Provider bank account retrieval](operations/provider-bank-account-retrieval.md) |

> **Origin**: These operations are defined in `SAIF.Business.Payment.EFT`, which is documented in the previous format (no per-operation page exists). See [Payment preference selection](../saif-business-payment-eft/operations/payment-preference-selection.md), [EFT authorization / consent](../saif-business-payment-eft/operations/eft-authorization-consent.md), and [Bank account management](../saif-business-payment-eft/operations/bank-account-management.md) in the `SAIF.Business.Payment.EFT` documentation set.

## 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 |
| --- | --- | --- | --- |
| [EOB preference management](operations/eob-preference-management.md) | [SQL-001](sql/SQL-001-insert-provider-eob-interface.md), [SQL-005](sql/SQL-005-select-provider-eob-interface-by-provider-location.md), [SQL-006](sql/SQL-006-select-provider-eob-interface-by-location.md), [SQL-007](sql/SQL-007-select-provider-locations-with-eob-preference.md), [SQL-013](sql/SQL-013-update-provider-eob-interface.md), [SQL-015](sql/SQL-015-delete-provider-eob-interface.md) | [PROVIDER_EOB_INTERFACE](database-tables.md#provider_eob_interface) | Read / Write |
| [EFT record management](operations/eft-record-management.md) | [SQL-003](sql/SQL-003-insert-provider-eft-interface.md), [SQL-008](sql/SQL-008-select-provider-eft-interface-by-provider-location.md), [SQL-014](sql/SQL-014-update-provider-eft-interface.md), [SQL-016](sql/SQL-016-delete-provider-eft-interface.md) | [PROVIDER_EFT_INTERFACE](database-tables.md#provider_eft_interface), [EXT_USER_TYPE](database-tables.md#ext_user_type), [EXT_USER](database-tables.md#ext_user), [PERSON](database-tables.md#person) | Read / Write |
| [EFT payment location assignment](operations/eft-payment-location-assignment.md) | [SQL-003](sql/SQL-003-insert-provider-eft-interface.md), [SQL-014](sql/SQL-014-update-provider-eft-interface.md) | [PROVIDER_EFT_INTERFACE](database-tables.md#provider_eft_interface) | Write (via parent EFT save) |
| [EFT correspondence history](operations/eft-correspondence-history.md) | [SQL-002](sql/SQL-002-pk83548-provider-corr-hist-eft-corr-hist.md) | [PROVIDER_CORR_HIST](database-tables.md#provider_corr_hist), [PROVIDER_TAX_ID](database-tables.md#provider_tax_id), [PROVIDER](database-tables.md#provider) | Write (stored procedure) |
| [Provider EFT collection retrieval](operations/provider-eft-collection-retrieval.md) | [SQL-009](sql/SQL-009-select-all-provider-eft-interface-rows.md), [SQL-010](sql/SQL-010-select-provider-eft-interface-by-provider.md), [SQL-011](sql/SQL-011-select-provider-eft-locations.md), [SQL-012](sql/SQL-012-select-provider-eft-locations-with-external-user-email.md) | [PROVIDER_EFT_INTERFACE](database-tables.md#provider_eft_interface), [PROVIDER_LOCATION](database-tables.md#provider_location), [PROVIDER_ADDRESS](database-tables.md#provider_address), [EXT_USER_TYPE](database-tables.md#ext_user_type), [EXT_USER](database-tables.md#ext_user), [EMAIL_ADDRESS](database-tables.md#email_address) | Read |
| [Provider bank account retrieval](operations/provider-bank-account-retrieval.md) | [SQL-004](sql/SQL-004-select-provider-bank-accounts-by-provider.md) | [BANK_ACCOUNT](database-tables.md#bank_account), [PAYMENT_AUTHORIZATION](database-tables.md#payment_authorization), [PROVIDER_LOCATION](database-tables.md#provider_location) | Read |

## Stored procedure operations

Operations implemented in Oracle stored procedures referenced by this library.

| Operation | Description | Source | Link |
| --- | --- | --- | --- |
| Insert EFT correspondence history | Resolves the provider's correspondence address and inserts one `PROVIDER_CORR_HIST` row marked as an EFT authorization-letter event. | `PK83548_PROVIDER_CORR_HIST.EFT_CORR_HIST` | [Details](procedures/pk83548_provider_corr_hist.md#eft_corr_hist) |
| Fetch TIN correspondence address | Internal helper that locates the provider's primary tax-ID address effective on a supplied date. | `PK83548_PROVIDER_CORR_HIST.FETCH_TIN_ADDRESS` | [Details](procedures/pk83548_provider_corr_hist.md#fetch_tin_address) |
| Insert EOB correspondence history | Package sibling that inserts a paperless-EOB correspondence-history row; no call site was found in this library's source.* | `PK83548_PROVIDER_CORR_HIST.EOB_CORR_HIST` | [Details](procedures/pk83548_provider_corr_hist.md#eob_corr_hist) |

## Failure and edge-case behavior

- Optimistic concurrency is the dominant failure mode across EOB and EFT persistence: every insert/update/delete checks the affected row count and adds an `InsertError`/`DBContentionError` instead of throwing ([BR-03](business-rules.md#br-03-insert-contention-check-if-rowsaffected-1-after-insert-an-inserterror-error-message-is-added-and-the-record-is-not-marked-old), [BR-04](business-rules.md#br-04-update-contention-check-if-rowsaffected-1-after-update-dbcontentionerror-is-added-updatenum-must-match-for-the-where-clause-to-succeed), [BR-05](business-rules.md#br-05-delete-contention-check-if-rowsaffected-1-after-delete-dbcontentionerror-is-added), [BR-12](business-rules.md#br-12-eft-insert-contention-rowsaffected-1-triggers-inserterror-child-payment-preferences-are-saved-only-after-a-successful-insert-savechildobject-called-in-afterinsert), [BR-13](business-rules.md#br-13-eft-update-contention-rowsaffected-1-triggers-dbcontentionerror-updatenum-is-incremented-and-child-preferences-saved-only-on-success)). Detailed per-operation behavior is documented on each operation page.
- `clsProviderEOB` and `clsProviderEFT` diverge on how a retrieved-but-never-persisted row is recognized: EOB relies on `UpdateNum = 0` to mark itself New ([BR-18](business-rules.md#br-18-a-retrieved-eob-preference-row-with-updatenum-equal-to-zero-is-treated-as-unsaved-and-marked-new-so-save-falls-through-to-insert-instead-of-update)), while EFT retrieval always marks itself Old regardless of `UpdateNum`.
- EFT assignment/unassignment and its child payment-preference persistence are only committed when the parent `clsProviderEFT.Save()` succeeds; a failed EFT insert/update leaves any staged preference change unsaved.
- `PK83548_PROVIDER_CORR_HIST.EOB_CORR_HIST` exists in the Oracle package but was not found to be called anywhere in this library's `.vb` source; only `EFT_CORR_HIST` is exercised by this library.*
- Bank account retrieval and field decryption is read-only and depends on `SAIF.Business.Payment.EFT` and the local `SAIFEncrypt.dll` for its underlying implementation; each field access issues its own lookup rather than caching the resolved bank account.*

## 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.

## Sources
- `Business\SAIF.Business.Provider.PaymentPreference\clsProviderEOB.vb`
- `Business\SAIF.Business.Provider.PaymentPreference\clsProviderEOBCollection.vb`
- `Business\SAIF.Business.Provider.PaymentPreference\clsProviderEFT.vb`
- `Business\SAIF.Business.Provider.PaymentPreference\clsProviderBankAccounts.vb`
