---
title: Provider EFT collection retrieval
summary: Retrieves multiple clsProviderEFT records at once — all locations for a provider, all EFT rows system-wide, or all provider locations with their current EFT status and (optionally) the administering user's email address.
status: draft
owner: SAIF Doc Gen
last_reviewed: 2026-07-30
library: SAIF.Business.Provider.PaymentPreference
reference_type: package
operation_id: OP-PP-05
trigger: Caller invokes one of the clsProviderEFTCollection shared factory methods
---

# Provider EFT collection retrieval

`clsProviderEFTCollection` exposes four shared factory methods that return different slices of provider location EFT data — records that already have an EFT row for a specific provider, a batch export of every EFT row in the system, every location for a provider whether or not it has an EFT row yet, and the same location set enriched with the administering external user's email address. All four populate the same collection type and are read-only, so they are documented together; the collection also exposes LINQ filter properties (`UnAssignedPaymentLocations`, `AssignedPaymentLocations`, `AllPaymentLocations`) that classify the retrieved rows for callers.

| Field | Value |
| --- | --- |
| **Operation ID** | OP-PP-05 |
| **Trigger** | `GetProviderEFTColl`, `GetAllEFTsColl`, `GetProviderEFTLocations`, or `GetProviderEFTLocEmails` on `clsProviderEFTCollection` |
| **Inputs** | `ProviderSeqNum` (except `GetAllEFTsColl`); for the location-based queries: `IsUserSAIFEmployee`, `AdminUserTypeSeqNum`, `MaskBankNumbers`, `BankValidatorXML` |
| **Outputs** | Populated `clsProviderEFTCollection`; `UnAssignedPaymentLocations`/`AssignedPaymentLocations`/`AllPaymentLocations` filtered views over that collection |
| **Primary components** | `clsProviderEFTCollection.GetProviderEFTColl`, `clsProviderEFTCollection.GetAllEFTsColl`, `clsProviderEFTCollection.GetProviderEFTLocations`, `clsProviderEFTCollection.GetProviderEFTLocEmails`, `clsProviderEFTCollection.UnAssignedPaymentLocations`, `clsProviderEFTCollection.AssignedPaymentLocations`, `clsProviderEFTCollection.AllPaymentLocations` |
| **Entry point** | `Business\SAIF.Business.Provider.PaymentPreference\clsProviderEFT.vb` |

## Steps

1. **List EFTs for a provider.** `GetProviderEFTColl(dpi, providerSeqNum)` selects every `PROVIDER_EFT_INTERFACE` row for the provider ([SQL-010](../sql/SQL-010-select-provider-eft-interface-by-provider.md), [PROVIDER_EFT_INTERFACE](../database-tables.md#provider_eft_interface)); every row therefore represents a location that already has an EFT record.
2. **List all EFTs (batch).** `GetAllEFTsColl(dpi)` selects every `PROVIDER_EFT_INTERFACE` row in the table with no filter ([SQL-009](../sql/SQL-009-select-all-provider-eft-interface-rows.md)), intended for batch/system-wide processing rather than a single provider's data.
3. **List all locations with EFT status.** `GetProviderEFTLocations(dpi, providerID, isUserSAIFEmployee, adminUserTypeSeqNum, maskBankNumbers, bankValidatorXML)` left-outer-joins `PROVIDER_LOCATION` to `PROVIDER_EFT_INTERFACE`, additionally left-outer-joining `PROVIDER_ADDRESS` and filtering to locations with an active physical address ([SQL-011](../sql/SQL-011-select-provider-eft-locations.md), [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)). Locations without a matching EFT row are still returned, flagged via a `case when EFT.UPDATE_USER IS NULL then 'Y' else 'N'` computed `IsNewEFTFlag` column, so every eligible location appears exactly once whether or not it has EFT data yet.
   - The four masking/context inputs (`IsUserSAIFEmployee`, `AdminUserTypeSeqNum`, `MaskBankNumbers`, `BankValidatorXML`) are stored on the collection itself after the query runs, for use by child objects retrieved through it.
4. **List all locations with administering-user email.** `GetProviderEFTLocEmails(dpi, providerID, isUserSAIFEmployee, adminUserTypeSeqNum, maskBankNumbers, bankValidatorXML)` runs the same location/EFT left-outer-join as step 3, additionally chaining through `EXT_USER_TYPE` → `EXT_USER` → `EMAIL_ADDRESS` to populate `ExtUserEmailAddr` for each row ([SQL-012](../sql/SQL-012-select-provider-eft-locations-with-external-user-email.md)). It does not include the physical-address eligibility filter present in step 3's query. This method was not present in the prior operations catalog for this library.*
   - Records retrieved this way carry a populated `ExtUserEmailAddr`, which [EFT payment location assignment](eft-payment-location-assignment.md) copies into `CustomerContactEmailAddress` when `AssignPaymentLocation` is called on one of these objects.
5. **Classify locations after retrieval.** Once a `clsProviderEFTCollection` is populated (typically via step 3 or 4), callers can read:
   - `UnAssignedPaymentLocations` — every record where `LocationHasEFT` is 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)).
   - `AssignedPaymentLocations` — every record where `LocationHasEFT` is true and `IsActive` is true (both today falls within `[EffDate, ExpDate]` and the location currently has an active direct-deposit preference) ([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)).
   - `AllPaymentLocations` — every record that is either currently active or does not yet have EFT, i.e. everything except an inactive/expired-but-still-EFT-flagged record.

## Process flow

```mermaid
flowchart TD
	Start([Caller requests a collection]) --> Which{Which query?}
	Which -->|By provider, existing EFT rows| ByProvider[GetProviderEFTColl:<br>select PROVIDER_EFT_INTERFACE by ProviderSeqNum]
	Which -->|All rows, batch| AllRows[GetAllEFTsColl:<br>select every PROVIDER_EFT_INTERFACE row]
	Which -->|All locations + EFT status| AllLocs[GetProviderEFTLocations:<br>left outer join Location to EFT,<br>filter to active physical address]
	Which -->|All locations + admin email| AllLocsEmail[GetProviderEFTLocEmails:<br>left outer join Location to EFT to<br>ExtUserType to ExtUser to Email]
	ByProvider --> Collection[Populated clsProviderEFTCollection]
	AllRows --> Collection
	AllLocs --> StoreCtx[Store IsUserSAIFEmployee,<br>AdminUserTypeSeqNum, MaskBankNumbers,<br>BankValidatorXML on collection]
	AllLocsEmail --> StoreCtx
	StoreCtx --> Collection
	Collection --> Classify{Caller filters by status?}
	Classify -->|Unassigned| Unassigned([UnAssignedPaymentLocations:<br>not LocationHasEFT])
	Classify -->|Assigned/active| Assigned([AssignedPaymentLocations:<br>LocationHasEFT and IsActive])
	Classify -->|All eligible| AllPref([AllPaymentLocations:<br>IsActive or not LocationHasEFT])
```

## Failure and edge-case behavior

- `GetProviderEFTLocations` restricts results to locations with an active physical address ([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)), but `GetProviderEFTLocEmails` does not apply the same filter, so the two "all locations" queries can return a different set of locations for the same provider.*
- `GetAllEFTsColl` has no `WHERE` clause at all; it is intended for batch/system-wide callers (per source comments referencing `ACH0015_UpdateDirectDepositStatus`) and returning it for interactive per-provider use would be a misuse of the method.*
- `GetProviderEFTColl` and `GetAllEFTsColl` only return locations that already have a `PROVIDER_EFT_INTERFACE` row; a provider location with no EFT history at all will never appear in either result, even though it would appear (flagged as new) in `GetProviderEFTLocations`/`GetProviderEFTLocEmails`.

## Related documentation
- [Operations and processes](../operations-processes.md)
- [Business rules](../business-rules.md)
- [SQL catalog](../sql/index.md)
- [Database tables](../database-tables.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\clsProviderEFT.vb`
