---
title: SAIF.Business.Provider.PaymentPreference business rules
summary: Enumerated business rules with per-rule trigger, enforcement, and outcomes.
status: draft
owner: SAIF
last_reviewed: 2026-07-30
library: SAIF.Business.Provider.PaymentPreference
reference_type: package
---

# SAIF.Business.Provider.PaymentPreference business rules

This page captures business rules enforced by this library.

## BR-01: PaperlessEOBFlag is set to "Y" only when ExtUserTypeSeqNum is non-zero and non-empty at insert time; otherwise defaults to "N".

| Field | Value |
| --- | --- |
| **Statement** | PaperlessEOBFlag is set to "Y" only when ExtUserTypeSeqNum is non-zero and non-empty at insert time; otherwise defaults to "N". |
| **Trigger** | Invoking the related property, save hook, or retrieval path. |
| **Enforcement** | clsProviderEOB.BeforeInsert |
| **Outcome** | PaperlessEOBFlag is set to "Y" only when ExtUserTypeSeqNum is non-zero and non-empty at insert time; otherwise defaults to "N". |
| **Confidence** | Verified |
| **Tables** | [PROVIDER_EOB_INTERFACE](database-tables.md#provider_eob_interface) |
| **SQL** | [SQL-001](sql/SQL-001-insert-provider-eob-interface.md) |
| **Source** | `Business\SAIF.Business.Provider.PaymentPreference\clsProviderEOB.vb` |

---

## BR-02: DefaultPrimaryFlag is always initialized to "N" on new EOB creation.

| Field | Value |
| --- | --- |
| **Statement** | DefaultPrimaryFlag is always initialized to "N" on new EOB creation. |
| **Trigger** | Invoking the related property, save hook, or retrieval path. |
| **Enforcement** | clsProviderEOB.Create and clsProviderEOB.BeforeInsert |
| **Outcome** | DefaultPrimaryFlag is always initialized to "N" on new EOB creation. |
| **Confidence** | Verified |
| **Tables** | [PROVIDER_EOB_INTERFACE](database-tables.md#provider_eob_interface) |
| **SQL** | [SQL-001](sql/SQL-001-insert-provider-eob-interface.md) |
| **Source** | `Business\SAIF.Business.Provider.PaymentPreference\clsProviderEOB.vb` |

---

## BR-03: Insert contention check: if RowsAffected <> 1 after insert, an InsertError error message is added and the record is not marked old.

| Field | Value |
| --- | --- |
| **Statement** | Insert contention check: if RowsAffected <> 1 after insert, an InsertError error message is added and the record is not marked old. |
| **Trigger** | Invoking the related property, save hook, or retrieval path. |
| **Enforcement** | clsProviderEOB.AfterInsert |
| **Outcome** | Insert contention check: if RowsAffected <> 1 after insert, an InsertError error message is added and the record is not marked old. |
| **Confidence** | Verified |
| **Tables** | [PROVIDER_EOB_INTERFACE](database-tables.md#provider_eob_interface) |
| **SQL** | [SQL-001](sql/SQL-001-insert-provider-eob-interface.md) |
| **Source** | `Business\SAIF.Business.Provider.PaymentPreference\clsProviderEOB.vb` |

---

## BR-04: Update contention check: if RowsAffected <> 1 after update, DBContentionError is added. UPDATE_NUM must match for the WHERE clause to succeed.

| Field | Value |
| --- | --- |
| **Statement** | Update contention check: if RowsAffected <> 1 after update, DBContentionError is added. UPDATE_NUM must match for the WHERE clause to succeed. |
| **Trigger** | Invoking the related property, save hook, or retrieval path. |
| **Enforcement** | clsProviderEOB.AfterUpdate; SQL WHERE UPDATE_NUM = :UpdateNum |
| **Outcome** | Update contention check: if RowsAffected <> 1 after update, DBContentionError is added. UPDATE_NUM must match for the WHERE clause to succeed. |
| **Confidence** | Verified |
| **Tables** | [PROVIDER_EOB_INTERFACE](database-tables.md#provider_eob_interface) |
| **SQL** | [SQL-013](sql/SQL-013-update-provider-eob-interface.md) |
| **Source** | `Business\SAIF.Business.Provider.PaymentPreference\clsProviderEOB.vb` |

---

## BR-05: Delete contention check: if RowsAffected <> 1 after delete, DBContentionError is added.

| Field | Value |
| --- | --- |
| **Statement** | Delete contention check: if RowsAffected <> 1 after delete, DBContentionError is added. |
| **Trigger** | Invoking the related property, save hook, or retrieval path. |
| **Enforcement** | clsProviderEOB.AfterDelete |
| **Outcome** | Delete contention check: if RowsAffected <> 1 after delete, DBContentionError is added. |
| **Confidence** | Verified |
| **Tables** | [PROVIDER_EOB_INTERFACE](database-tables.md#provider_eob_interface) |
| **SQL** | [SQL-015](sql/SQL-015-delete-provider-eob-interface.md) |
| **Source** | `Business\SAIF.Business.Provider.PaymentPreference\clsProviderEOB.vb` |

---

## BR-06: An EFT record is considered active only when today falls within [EffDate, ExpDate] (inclusive). If either date is null, IsActive = False.

| Field | Value |
| --- | --- |
| **Statement** | An EFT record is considered active only when today falls within [EffDate, ExpDate] (inclusive). If either date is null, IsActive = False. |
| **Trigger** | Invoking the related property, save hook, or retrieval path. |
| **Enforcement** | clsProviderEFT.IsActive |
| **Outcome** | An EFT record is considered active only when today falls within [EffDate, ExpDate] (inclusive). If either date is null, IsActive = False. |
| **Confidence** | Verified |
| **Tables** | [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** | [SQL-008](sql/SQL-008-select-provider-eft-interface-by-provider-location.md) |
| **Source** | `Business\SAIF.Business.Provider.PaymentPreference\clsProviderEFT.vb` |

---

## BR-07: A provider location has EFT (direct deposit) only when PaymentPreferenceType = DirectDeposit AND IsRevokeDateNull (authorization has not been revoked).

| Field | Value |
| --- | --- |
| **Statement** | A provider location has EFT (direct deposit) only when PaymentPreferenceType = DirectDeposit AND IsRevokeDateNull (authorization has not been revoked). |
| **Trigger** | Invoking the related property, save hook, or retrieval path. |
| **Enforcement** | clsProviderEFT.LocationHasEFT |
| **Outcome** | A provider location has EFT (direct deposit) only when PaymentPreferenceType = DirectDeposit AND IsRevokeDateNull (authorization has not been revoked). |
| **Confidence** | Verified |
| **Tables** | [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** | [SQL-008](sql/SQL-008-select-provider-eft-interface-by-provider-location.md) |
| **Source** | `Business\SAIF.Business.Provider.PaymentPreference\clsProviderEFT.vb` |

---

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

| Field | Value |
| --- | --- |
| **Statement** | 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. |
| **Trigger** | Invoking the related property, save hook, or retrieval path. |
| **Enforcement** | clsProviderEFT.ProviderPaymentPreference setter |
| **Outcome** | 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. |
| **Confidence** | Verified |
| **Tables** | [PROVIDER_EFT_INTERFACE](database-tables.md#provider_eft_interface) |
| **SQL** | [SQL-003](sql/SQL-003-insert-provider-eft-interface.md) |
| **Source** | `Business\SAIF.Business.Provider.PaymentPreference\clsProviderEFT.vb` |

---

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

| Field | Value |
| --- | --- |
| **Statement** | On AssignPaymentLocation, CustomerEmailNotificationFlag is always set to "Y" and CustomerContactEmailAddress is populated from ExtUserEmailAddr, ensuring the customer receives notification of an EFT assignment. |
| **Trigger** | Invoking the related property, save hook, or retrieval path. |
| **Enforcement** | clsProviderEFT.AssignPaymentLocation |
| **Outcome** | On AssignPaymentLocation, CustomerEmailNotificationFlag is always set to "Y" and CustomerContactEmailAddress is populated from ExtUserEmailAddr, ensuring the customer receives notification of an EFT assignment. |
| **Confidence** | Verified |
| **Tables** | [PROVIDER_LOCATION](database-tables.md#provider_location), [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), [EMAIL_ADDRESS](database-tables.md#email_address) |
| **SQL** | [SQL-012](sql/SQL-012-select-provider-eft-locations-with-external-user-email.md) |
| **Source** | `Business\SAIF.Business.Provider.PaymentPreference\clsProviderEFT.vb` |

---

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

| Field | Value |
| --- | --- |
| **Statement** | 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). |
| **Trigger** | Invoking the related property, save hook, or retrieval path. |
| **Enforcement** | clsProviderEFT.UnAssignPaymentLocation, RevokeAuthorization |
| **Outcome** | 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). |
| **Confidence** | Verified |
| **Tables** | [PROVIDER_EFT_INTERFACE](database-tables.md#provider_eft_interface) |
| **SQL** | [SQL-014](sql/SQL-014-update-provider-eft-interface.md) |
| **Source** | `Business\SAIF.Business.Provider.PaymentPreference\clsProviderEFT.vb` |

---

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

| Field | Value |
| --- | --- |
| **Statement** | 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. |
| **Trigger** | Invoking the related property, save hook, or retrieval path. |
| **Enforcement** | clsProviderEFT.SetExtUserTypeSeqNum |
| **Outcome** | 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. |
| **Confidence** | Verified |
| **Tables** | [PROVIDER_EFT_INTERFACE](database-tables.md#provider_eft_interface) |
| **SQL** | [SQL-003](sql/SQL-003-insert-provider-eft-interface.md) |
| **Source** | `Business\SAIF.Business.Provider.PaymentPreference\clsProviderEFT.vb` |

---

## BR-12: EFT insert contention: RowsAffected <> 1 triggers InsertError. Child payment preferences are saved only after a successful insert (SaveChildObject called in AfterInsert).

| Field | Value |
| --- | --- |
| **Statement** | EFT insert contention: RowsAffected <> 1 triggers InsertError. Child payment preferences are saved only after a successful insert (SaveChildObject called in AfterInsert). |
| **Trigger** | Invoking the related property, save hook, or retrieval path. |
| **Enforcement** | clsProviderEFT.AfterInsert |
| **Outcome** | EFT insert contention: RowsAffected <> 1 triggers InsertError. Child payment preferences are saved only after a successful insert (SaveChildObject called in AfterInsert). |
| **Confidence** | Verified |
| **Tables** | [PROVIDER_EFT_INTERFACE](database-tables.md#provider_eft_interface) |
| **SQL** | [SQL-003](sql/SQL-003-insert-provider-eft-interface.md) |
| **Source** | `Business\SAIF.Business.Provider.PaymentPreference\clsProviderEFT.vb` |

---

## BR-13: EFT update contention: RowsAffected <> 1 triggers DBContentionError. UPDATE_NUM is incremented and child preferences saved only on success.

| Field | Value |
| --- | --- |
| **Statement** | EFT update contention: RowsAffected <> 1 triggers DBContentionError. UPDATE_NUM is incremented and child preferences saved only on success. |
| **Trigger** | Invoking the related property, save hook, or retrieval path. |
| **Enforcement** | clsProviderEFT.AfterUpdate |
| **Outcome** | EFT update contention: RowsAffected <> 1 triggers DBContentionError. UPDATE_NUM is incremented and child preferences saved only on success. |
| **Confidence** | Verified |
| **Tables** | [PROVIDER_EFT_INTERFACE](database-tables.md#provider_eft_interface) |
| **SQL** | [SQL-014](sql/SQL-014-update-provider-eft-interface.md) |
| **Source** | `Business\SAIF.Business.Provider.PaymentPreference\clsProviderEFT.vb` |

---

## BR-14: Bank account status 'DELET' is excluded from all bank account retrievals for a provider.

| Field | Value |
| --- | --- |
| **Statement** | Bank account status 'DELET' is excluded from all bank account retrievals for a provider. |
| **Trigger** | Invoking the related property, save hook, or retrieval path. |
| **Enforcement** | clsProviderBankAccountCollection.GetProviderBankAccounts SQL |
| **Outcome** | Bank account status 'DELET' is excluded from all bank account retrievals for a provider. |
| **Confidence** | Verified |
| **Tables** | [BANK_ACCOUNT](database-tables.md#bank_account), [PAYMENT_AUTHORIZATION](database-tables.md#payment_authorization), [PROVIDER_LOCATION](database-tables.md#provider_location) |
| **SQL** | [SQL-004](sql/SQL-004-select-provider-bank-accounts-by-provider.md) |
| **Source** | `Business\SAIF.Business.Provider.PaymentPreference\clsProviderBankAccounts.vb` |

---

## BR-15: Provider location EFT eligibility requires an active physical address (PROVIDER_ADDRESS_CODE = 'PHY', EFF_DATE <= trunc(sysdate), EXP_DATE > trunc(sysdate) OR EXP_DATE IS NULL).

| Field | Value |
| --- | --- |
| **Statement** | Provider location EFT eligibility requires an active physical address (PROVIDER_ADDRESS_CODE = 'PHY', EFF_DATE <= trunc(sysdate), EXP_DATE > trunc(sysdate) OR EXP_DATE IS NULL). |
| **Trigger** | Invoking the related property, save hook, or retrieval path. |
| **Enforcement** | clsProviderEFTCollection.GetProviderEFTLocations SQL |
| **Outcome** | Provider location EFT eligibility requires an active physical address (PROVIDER_ADDRESS_CODE = 'PHY', EFF_DATE <= trunc(sysdate), EXP_DATE > trunc(sysdate) OR EXP_DATE IS NULL). |
| **Confidence** | Verified |
| **Tables** | [PROVIDER_LOCATION](database-tables.md#provider_location), [PROVIDER_EFT_INTERFACE](database-tables.md#provider_eft_interface), [PROVIDER_ADDRESS](database-tables.md#provider_address) |
| **SQL** | [SQL-011](sql/SQL-011-select-provider-eft-locations.md) |
| **Source** | `Business\SAIF.Business.Provider.PaymentPreference\clsProviderEFT.vb` |

---

## BR-16: If EffDate is Date.MinValue at update time, it is defaulted to Today.Date before persisting.

| Field | Value |
| --- | --- |
| **Statement** | If EffDate is Date.MinValue at update time, it is defaulted to Today.Date before persisting. |
| **Trigger** | Invoking the related property, save hook, or retrieval path. |
| **Enforcement** | clsProviderEFT.BeforeUpdate |
| **Outcome** | If EffDate is Date.MinValue at update time, it is defaulted to Today.Date before persisting. |
| **Confidence** | Verified |
| **Tables** | [PROVIDER_EFT_INTERFACE](database-tables.md#provider_eft_interface) |
| **SQL** | [SQL-014](sql/SQL-014-update-provider-eft-interface.md) |
| **Source** | `Business\SAIF.Business.Provider.PaymentPreference\clsProviderEFT.vb` |

---

## BR-17: UserName on clsProviderEOB returns the constant PAPER_EOB = "Paper EOB" when the underlying name is blank, indicating no external user is linked to the record.

| Field | Value |
| --- | --- |
| **Statement** | UserName on clsProviderEOB returns the constant PAPER_EOB = "Paper EOB" when the underlying name is blank, indicating no external user is linked to the record. |
| **Trigger** | Invoking the related property, save hook, or retrieval path. |
| **Enforcement** | clsProviderEOB.UserName getter |
| **Outcome** | UserName on clsProviderEOB returns the constant PAPER_EOB = "Paper EOB" when the underlying name is blank, indicating no external user is linked to the record. |
| **Confidence** | Verified |
| **Tables** | [PROVIDER_EOB_INTERFACE](database-tables.md#provider_eob_interface), [EXT_USER_TYPE](database-tables.md#ext_user_type), [EXT_USER](database-tables.md#ext_user), [EMAIL_ADDRESS](database-tables.md#email_address), [PERSON](database-tables.md#person), [PROVIDER_LOCATION](database-tables.md#provider_location) |
| **SQL** | [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) |
| **Source** | `Business\SAIF.Business.Provider.PaymentPreference\clsProviderEOB.vb` |

---

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

| Field | Value |
| --- | --- |
| **Statement** | 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. |
| **Trigger** | `clsProviderEOB.Fill` runs after any retrieval — a single-object `GetProviderEOB` fetch or a row loaded into `clsProviderEOBCollection` via `GetProviderEOBs`. |
| **Enforcement** | `clsProviderEOB.Fill`: `If Row.GetDecimal("UpdateNum") = 0 Then MarkNew() Else MarkOld()`. |
| **Outcome** | Provider locations that have never had an EOB preference row still appear in the collection (via the left-outer-joined listing query) but are flagged New, so editing and saving one performs an Insert instead of failing an Update against a nonexistent row. |
| **Confidence** | Verified |
| **Tables** | [PROVIDER_EOB_INTERFACE](database-tables.md#provider_eob_interface), [PROVIDER_LOCATION](database-tables.md#provider_location) |
| **SQL** | [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) |
| **Source** | `Business\SAIF.Business.Provider.PaymentPreference\clsProviderEOB.vb` |

---

## PBR-001: Only the provider primary tax ID row supplies the correspondence address

| Field | Value |
| --- | --- |
| **Statement** | Only the provider primary tax ID row supplies the correspondence address copied into `PROVIDER_CORR_HIST`. |
| **Trigger** | `FETCH_TIN_ADDRESS` runs for `EFT_CORR_HIST` or `EOB_CORR_HIST`. |
| **Enforcement** | `FETCH_TIN_ADDRESS` joins `PROVIDER_TAX_ID` to `PROVIDER` on `provider.PRIMARY_TAX_ID = provider_tax_id.TAX_ID`. |
| **Outcome** | History rows copy mailing-address fields only from the provider primary tax-ID record. |
| **Confidence** | Verified |
| **Stored procedure** | [PK83548_PROVIDER_CORR_HIST.FETCH_TIN_ADDRESS](procedures/pk83548_provider_corr_hist.md#fetch_tin_address) |
| **Source** | `Business\SAIF.Business.Provider.PaymentPreference\clsProviderEFT.vb` |

---

## PBR-002: The tax ID row must be effective on the supplied EFT effective date

| Field | Value |
| --- | --- |
| **Statement** | The correspondence-address lookup uses only tax ID rows whose effective dates cover the supplied effective date. |
| **Trigger** | `FETCH_TIN_ADDRESS` evaluates `in_eff_date` during the address lookup. |
| **Enforcement** | The query requires `PROVIDER_TAX_ID.EFF_DATE <= in_eff_date` and `(PROVIDER_TAX_ID.EXP_DATE IS NULL OR PROVIDER_TAX_ID.EXP_DATE >= in_eff_date)`. |
| **Outcome** | Expired or not-yet-effective tax ID addresses are excluded from correspondence-history inserts. |
| **Confidence** | Verified |
| **Stored procedure** | [PK83548_PROVIDER_CORR_HIST.FETCH_TIN_ADDRESS](procedures/pk83548_provider_corr_hist.md#fetch_tin_address) |
| **Source** | `Business\SAIF.Business.Provider.PaymentPreference\clsProviderEFT.vb` |

---

## PBR-003: Fetch TIN address returns only the first matching tax ID address row

| Field | Value |
| --- | --- |
| **Statement** | `FETCH_TIN_ADDRESS` returns only the first matching tax ID address row. |
| **Trigger** | Multiple rows satisfy the helper query. |
| **Enforcement** | The fetch loop exits when `%ROWCOUNT > 1`, leaving the first fetched `TIN_Address` record as the return value. |
| **Outcome** | At most one address record is returned to `EFT_CORR_HIST` or `EOB_CORR_HIST`. |
| **Confidence** | Verified |
| **Stored procedure** | [PK83548_PROVIDER_CORR_HIST.FETCH_TIN_ADDRESS](procedures/pk83548_provider_corr_hist.md#fetch_tin_address) |
| **Source** | `Business\SAIF.Business.Provider.PaymentPreference\clsProviderEFT.vb` |

---

## PBR-004: EFT correspondence history inserts are always marked as authorization letter events

| Field | Value |
| --- | --- |
| **Statement** | Every EFT correspondence-history insert is flagged as an authorization-letter event. |
| **Trigger** | `EFT_CORR_HIST` inserts a `PROVIDER_CORR_HIST` row. |
| **Enforcement** | `EFT_CORR_HIST` sets `PCH.EFT_AUTH_LTR_FLAG` to `'Y'` in the insert statement. |
| **Outcome** | Stored history rows identify the correspondence as an EFT authorization letter. |
| **Confidence** | Verified |
| **Stored procedure** | [PK83548_PROVIDER_CORR_HIST.EFT_CORR_HIST](procedures/pk83548_provider_corr_hist.md#eft_corr_hist) |
| **Source** | `Business\SAIF.Business.Provider.PaymentPreference\clsProviderEFT.vb` |

---

## PBR-005: Foreign address history values are normalized to Y or N during insert

| Field | Value |
| --- | --- |
| **Statement** | Foreign-address history values are normalized to `N` when the source flag is null and to `Y` otherwise. |
| **Trigger** | `EFT_CORR_HIST` or `EOB_CORR_HIST` writes a `PROVIDER_CORR_HIST` row. |
| **Enforcement** | Both insert statements use `case when TIN_Address_rec.FOREIGN_ADDRESS_FLAG is null then `'N'` else `'Y'` end`. |
| **Outcome** | `PROVIDER_CORR_HIST.FOREIGN_ADDRESS_FLAG` is always stored as `Y` or `N`. |
| **Confidence** | Verified |
| **Stored procedure** | [PK83548_PROVIDER_CORR_HIST.EFT_CORR_HIST](procedures/pk83548_provider_corr_hist.md#eft_corr_hist); [PK83548_PROVIDER_CORR_HIST.EOB_CORR_HIST](procedures/pk83548_provider_corr_hist.md#eob_corr_hist) |
| **Source** | `Business\SAIF.Business.Provider.PaymentPreference\clsProviderEFT.vb` |

---

## PBR-006: Correspondence history rows always stamp create date create number and create user

| Field | Value |
| --- | --- |
| **Statement** | Correspondence-history rows always stamp `CREATE_DATE`, `CREATE_NUM`, and `CREATE_USER` during insert. |
| **Trigger** | `EFT_CORR_HIST` or `EOB_CORR_HIST` inserts into `PROVIDER_CORR_HIST`. |
| **Enforcement** | Both insert statements set `CREATE_DATE = sysdate`, `CREATE_NUM = 0`, and `CREATE_USER = in_UPDATE_USER`. |
| **Outcome** | Each inserted history row receives consistent audit values from the package. |
| **Confidence** | Verified |
| **Stored procedure** | [PK83548_PROVIDER_CORR_HIST.EFT_CORR_HIST](procedures/pk83548_provider_corr_hist.md#eft_corr_hist); [PK83548_PROVIDER_CORR_HIST.EOB_CORR_HIST](procedures/pk83548_provider_corr_hist.md#eob_corr_hist) |
| **Source** | `Business\SAIF.Business.Provider.PaymentPreference\clsProviderEFT.vb` |

---

## PBR-007: Tax ID lookup failures are raised instead of silently ignored

| Field | Value |
| --- | --- |
| **Statement** | Tax ID lookup failures are raised instead of being silently ignored. |
| **Trigger** | `FETCH_TIN_ADDRESS` does not resolve a row or encounters another query error. |
| **Enforcement** | `FETCH_TIN_ADDRESS` re-raises `NO_DATA_FOUND` and raises the package-local `v_error` exception for other failures. |
| **Outcome** | Calling procedures do not continue with an unhandled missing-address lookup. |
| **Confidence** | Verified |
| **Stored procedure** | [PK83548_PROVIDER_CORR_HIST.FETCH_TIN_ADDRESS](procedures/pk83548_provider_corr_hist.md#fetch_tin_address) |
| **Source** | `Business\SAIF.Business.Provider.PaymentPreference\clsProviderEFT.vb` |

---

## PBR-008: Correspondence history insert failures are re-raised as the package local exception

| Field | Value |
| --- | --- |
| **Statement** | Correspondence-history insert failures are re-raised as the package-local exception. |
| **Trigger** | The `INSERT INTO PROVIDER_CORR_HIST` statement fails in `EFT_CORR_HIST` or `EOB_CORR_HIST`. |
| **Enforcement** | Each procedure catches `WHEN OTHERS`, captures `SQLERRM` text in `outResult`, and then raises `v_error`. |
| **Outcome** | Insert failures stop normal procedure completion instead of being swallowed. |
| **Confidence** | Verified |
| **Stored procedure** | [PK83548_PROVIDER_CORR_HIST.EFT_CORR_HIST](procedures/pk83548_provider_corr_hist.md#eft_corr_hist); [PK83548_PROVIDER_CORR_HIST.EOB_CORR_HIST](procedures/pk83548_provider_corr_hist.md#eob_corr_hist) |
| **Source** | `Business\SAIF.Business.Provider.PaymentPreference\clsProviderEFT.vb` |

## Notes
- The stored-procedure rules above are derived directly from `WCIS_DBA.PK83548_PROVIDER_CORR_HIST` and cross-reference the package documentation.

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

## 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`
- `Business\SAIF.Business.Provider.PaymentPreference\clsProviderEFT.vb`
