SAIF.Business.Payment.EFT operations and processes¶
This page is the operation catalog and cross-operation hub for SAIF.Business.Payment.EFT. The library exposes ten operations covering bank-account maintenance, payee/provider payment-preference selection, EFT authorization and consent, debit-card enrollment, the payment-detail/event/allocation lifecycle, output-control/print-status tracking, NACHA addenda, returned-payment handling, runtime-configurable balance calculation, and the ACH/EFT reference-data lookups that back all of the above. 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 |
|---|---|---|---|---|---|---|---|
| Bank account management | Create, retrieve, update, and delete (soft or hard) a payee's bank-account record | Caller creates clsBankAccount via NewBankAccount, edits properties, and calls Save(), or retrieves by BankAccountID/CreateUser |
Routing number, account number, account type/status/data-source codes, business/consumer code, nickname, owner name | Persisted/updated BANK_ACCOUNT row; encrypted routing/account numbers; soft- or hard-deleted record |
BR-EFT-04, BR-EFT-05, BR-EFT-11 | BANK_ACCOUNT, BANK_ACCOUNT_TRANSFER | SQL-001, SQL-009, SQL-010, SQL-030, SQL-031, SQL-036, SQL-077, SQL-078, SQL-088, SQL-089 |
| Payment preference selection | Determine and edit how a claimant or provider payee wants to be paid — check, direct deposit, or debit card | Caller constructs clsPaymentPreference (claimant) or clsProviderPaymentPreference (provider) for a payee and calls Save() after IsValid |
iPayee, requested PaymentPreferenceType, bank routing/account numbers, IAT address fields |
Composed clsEFTAuthorization and, for debit-card, clsDebitCardEnrollmentRequest, persisted as child objects |
BR-EFT-02 | PAYMENT_AUTHORIZATION, DEBIT_CARD_ENROLLMENT_REQUEST | None of its own — delegates all persistence to EFT authorization / consent and Debit card enrollment |
| EFT authorization / consent | Record, retrieve, and revoke a payee's consent to receive electronic (ACH) payments | Caller creates/retrieves clsEFTAuthorization by authorization ID, auto-pay confirmation number, or customer ID, edits it, and calls Save() |
Authorization type, bank account, customer ID/type/second ID, prenote flag, IAT address fields | Persisted PAYMENT_AUTHORIZATION row; derived AuthorizationStatus; revoked authorization with reason code |
BR-EFT-01, BR-EFT-05, BR-EFT-08, BR-EFT-09 | PAYMENT_AUTHORIZATION | SQL-013, SQL-045, SQL-046, SQL-081, SQL-092 |
| Debit card enrollment | Process, track, and retrieve debit-card payment enrollment requests submitted to US Bank | Caller creates clsDebitCardEnrollmentRequest from a cardholder ID, edits demographic/address fields, and calls Save() |
Cardholder ID number, enrollment status, participant ID, address/demographic data, card enroll/active/termination dates | Persisted DEBIT_CARD_ENROLLMENT_REQUEST row with an auto-assigned participant ID |
BR-EFT-05, BR-EFT-06 | DEBIT_CARD_ENROLLMENT_REQUEST | SQL-003, SQL-012, SQL-043, SQL-044, SQL-080, SQL-091 |
| Payment detail, events, and allocation | Create an ACH/EFT payment line item, drive it through its status-transition event log, and allocate it across balance types via a session transfer | Caller calls NewPaymentDetail/NewPrenoteTrans, then state-transition methods (PostPending, RemitPosted, RefundVendorRemitted, ReturnVendorRemitted, CancelPayment, DeletePending), and Save() |
Payment amount, authorization reference, ACH entry class/event codes, session/policy context, balance-type allocations | Persisted PAYMENT_DETAIL row; appended PAYMENT_EVENT audit rows; persisted SESSION_TRANSFER and PAYMENT_ALLOCATION rows; NACHA addenda for IAT payments |
BR-EFT-05, BR-EFT-10 | PAYMENT_DETAIL, PAYMENT_EVENT, PAYMENT_ALLOCATION, SESSION_TRANSFER, PAYMENT_AUTH_SESSION_TRANSFER | SQL-006, SQL-007, SQL-016, SQL-017, SQL-018, SQL-019, SQL-021, SQL-057, SQL-058, SQL-059, SQL-060, SQL-063, SQL-076, SQL-084, SQL-085, SQL-087, SQL-095, SQL-096, SQL-097 |
| Output control tracking | Track the print/transmission status of generated payment output artifacts (checks, ACH files) via OUTPUT_CONTROL records |
clsOutputControl.NewOutputControl when an output artifact is generated; updated once printed/transmitted |
Output document code, claim/policy reference, payment/authorization/banking-network type codes | Persisted/updated OUTPUT_CONTROL row; PRINTED_DATE populated once transmitted |
BR-EFT-05 | OUTPUT_CONTROL, ACH_FILE_ID, OUTPUT_DOCUMENT_CODE | SQL-004, SQL-014, SQL-022, SQL-023, SQL-051, SQL-052, SQL-053, SQL-054, SQL-082, SQL-093 |
| Payment addenda | Attach NACHA addenda records (including 7-record IAT sets) to an EFT payment detail | clsPaymentDetail.CreateIATAddenda/CreateStandardAddenda on payment creation, or direct NewPaymentAddenda call |
Payment detail sequence number, addenda text, addenda type code | Persisted PAYMENT_ADDENDA row(s) linked to the parent payment detail |
BR-EFT-05 | PAYMENT_ADDENDA | SQL-005, SQL-015, SQL-055, SQL-056, SQL-083, SQL-094 |
| Payment return handling | Record a bank-returned EFT payment, classify it by NACHA return reason, and mark it reviewed | Bank return file processing calls clsPaymentReturn.NewPaymentReturn, or a reviewer calls MarkReviewed |
Return reason/status/type codes, customer details, payment amount, payment-detail reference | Persisted PAYMENT_RETURN row; culture-aware return-reason description; optional backout payment event |
BR-EFT-03, BR-EFT-05, BR-EFT-07 | PAYMENT_RETURN, PAYMENT_RETURN_REASON_CODE | SQL-008, SQL-020, SQL-064, SQL-065, SQL-066, SQL-067, SQL-070, SQL-071, SQL-072, SQL-073, SQL-086 |
| Dynamic balance calculation | Compute balance values at runtime for balance types configured with a stored-procedure reference | Caller calls DynamicallyCalculatedBalanceInfoFactory.GetBalances(policyNumber, balanceType) |
Policy number, clsBalanceTypeCode with GET_BALANCE_SQL_TXT populated |
List of DynamicallyCalculatedBalanceInfo (seq num, description, amount, URL) net of pending online-payment allocations |
None registered* | BALANCE_TYPE_CODE | SQL-029 |
| Code table lookups | Retrieve EFT/ACH reference data used to validate and describe payment fields throughout the library | Any lookup class's Get<Code> / Get<Code>Collection call |
Code value, or no filter for a full collection | Code-table entry or entries (code, description, and type-specific attributes) | None registered* | Various ACH/EFT code tables | SQL-002, SQL-011, SQL-024, SQL-025, SQL-026, SQL-027, SQL-028, SQL-032 through SQL-035, SQL-037 through SQL-042, SQL-047 through SQL-050, SQL-053, SQL-054, SQL-061, SQL-062, SQL-068, SQL-069, SQL-079, SQL-090 |
Process flow diagram¶
The following diagram shows how the ten operations relate across the EFT payment-processing lifecycle: a payee establishes a bank account and payment preference, an EFT authorization records their consent (with debit-card enrollment as one branch), a payment detail is created and moves through its event/allocation lifecycle, ACH output is batched and addenda attached, and any bank-returned payment is captured and classified.
flowchart TD
Start([Payee sets up payment method]) --> Bank[Bank account management]
Bank --> Pref[Payment preference selection]
Pref --> Auth{Preference type?}
Auth -->|Direct deposit| EFTAuth[EFT authorization / consent]
Auth -->|Debit card| Debit[Debit card enrollment]
Debit --> EFTAuth
EFTAuth --> Ref[Code table lookups<br>validate type/status codes]
EFTAuth --> Detail[Payment detail, events,<br>and allocation]
Detail --> Balance[Dynamic balance calculation<br>for configurable balance types]
Detail --> Addenda{IAT or standard<br>addenda required?}
Addenda -->|Yes| PAddenda[Payment addenda]
Addenda -->|No| Batch[Output control tracking]
PAddenda --> Batch
Batch --> Transmitted{Payment<br>transmitted}
Transmitted -->|Return received| Return[Payment return handling]
Transmitted -->|Success| End([Complete])
Return --> End
Database interactions¶
| Operation | SQL | Tables | Type |
|---|---|---|---|
| Bank account management | SQL-009, SQL-077, SQL-088 | BANK_ACCOUNT | Write |
| EFT authorization / consent | SQL-013, SQL-081, SQL-092 | PAYMENT_AUTHORIZATION | Write |
| Debit card enrollment | SQL-012, SQL-080, SQL-091 | DEBIT_CARD_ENROLLMENT_REQUEST | Write |
| Payment detail, events, and allocation | SQL-018, SQL-019, SQL-016, SQL-021 | PAYMENT_DETAIL, PAYMENT_EVENT, PAYMENT_ALLOCATION, SESSION_TRANSFER | Write |
| Output control tracking | SQL-014, SQL-082 | OUTPUT_CONTROL | Write |
| Payment addenda | SQL-015 | PAYMENT_ADDENDA | Write |
| Payment return handling | SQL-020, SQL-064 | PAYMENT_RETURN | Write / Read |
| Dynamic balance calculation | SQL-029 | BALANCE_TYPE_CODE | Read |
Failure and edge-case behavior¶
- All transactional inserts, updates, and deletes across every operation enforce a
RowsAffected = 1check; a different count adds anInsertError/UpdateError/DeleteErrormessage rather than raising an exception, so callers must inspectErrorCount/IsValidafterSave()(BR-EFT-05). clsEFTAuthorization.BeforeRetrievecontains a CustomerID branch that invokes stored procedurePK72970_EPAY.retrieve_EFTAuth_ByCustomerID; the Oracle source was not retrievable, so this branch may be dead code.**clsPaymentDetailCollectionbypasses ordinary retrieval and assembles live SQL throughBuildSqlNormal,BuildSqlSeqNum,BuildSqlPend,BuildPreNoteSql, andBuildPostedSql, each targeting a different retrieval scenario (claim payments, single payment, pending payments, pre-note candidates, US Bank posted payments).*DynamicallyCalculatedBalanceInfoFactoryalways invokesBALANCE_TYPE_CODE.GET_BALANCE_SQL_TXTas a stored-procedure name (CommandType.StoredProcedure), never as literal inline SQL text, despite the column name implying raw SQL; the exact procedure logic cannot be documented from this library's source alone.*- Bank account "delete" is a soft-delete by default (
BANK_ACCOUNT_STATUS_CODEset toDELETED); an explicitPurgeRecordflag switches to a hardDELETEinstead (SQL-088, BR-EFT-11). clsPaymentReturn.DeleteSQLandclsPaymentEvent.DeleteSQLboth throw on any attempt to delete — return and event records are permanent once created, by design.*clsEFTAuthorizationCollection.DoesAccountHaveAuthorizationis an unimplemented stub that always returnsFalse; it has aTODOcomment and no callers observed in this pass.**
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.
Stored procedure operations¶
One Oracle package is referenced by this library. The package source was not found in Oracle during analysis and the calling code path is considered possibly dead code.
| Package / Procedure | Schema | Calling class | Calling method | Purpose | Status |
|---|---|---|---|---|---|
PK72970_EPAY.retrieve_EFTAuth_ByCustomerID |
PK72970 | clsEFTAuthorization |
BeforeRetrieve (CustomerID branch) |
Retrieves EFT authorization records by customer type/ID** | ⚠️ Not found in Oracle — possibly dead code** |
See procedures/index.md for the full procedure catalog and PK72970_EPAY.md for detailed analysis.
Related documentation¶
- Index
- Overview
- Architecture
- Dependencies
- Business rules
- Database tables
- SQL catalog
- API reference
- Configuration
Sources¶
Business\SAIF.Business.Payment.EFT\clsBankAccount.vbBusiness\SAIF.Business.Payment.EFT\clsBankAccountCollection.vbBusiness\SAIF.Business.Payment.EFT\clsBankAccountTransfer.vbBusiness\SAIF.Business.Payment.EFT\clsPaymentPreference.vbBusiness\SAIF.Business.Payment.EFT\clsProviderPaymentPreference.vbBusiness\SAIF.Business.Payment.EFT\clsEFTAuthorization.vbBusiness\SAIF.Business.Payment.EFT\clsEFTAuthorizationCollection.vbBusiness\SAIF.Business.Payment.EFT\clsDebitCardEnrollmentRequest.vbBusiness\SAIF.Business.Payment.EFT\clsDebitCardEnrollmentRequestCollection.vbBusiness\SAIF.Business.Payment.EFT\clsPaymentDetail.vbBusiness\SAIF.Business.Payment.EFT\clsPaymentDetailCollection.vbBusiness\SAIF.Business.Payment.EFT\clsPaymentAllocation.vbBusiness\SAIF.Business.Payment.EFT\clsPaymentAllocationCollection.vbBusiness\SAIF.Business.Payment.EFT\clsSessionTransfer.vbBusiness\SAIF.Business.Payment.EFT\clsPaymentAuthorizationSessionTransfer.vbBusiness\SAIF.Business.Payment.EFT\clsPaymentEvent.vbBusiness\SAIF.Business.Payment.EFT\clsPaymentEventCollection.vbBusiness\SAIF.Business.Payment.EFT\clsPaymentEventCode.vbBusiness\SAIF.Business.Payment.EFT\clsAchFileID.vbBusiness\SAIF.Business.Payment.EFT\clsAchFileIDCollection.vbBusiness\SAIF.Business.Payment.EFT\clsPaymentBatchNumber.vbBusiness\SAIF.Business.Payment.EFT\clsOutputControl.vbBusiness\SAIF.Business.Payment.EFT\clsOutputControlCollection.vbBusiness\SAIF.Business.Payment.EFT\clsPaymentAddenda.vbBusiness\SAIF.Business.Payment.EFT\clsPaymentAddendaCollection.vbBusiness\SAIF.Business.Payment.EFT\clsPaymentReturn.vbBusiness\SAIF.Business.Payment.EFT\clsPaymentReturnCollection.vbBusiness\SAIF.Business.Payment.EFT\clsPaymentReturnReasonCode.vbBusiness\SAIF.Business.Payment.EFT\DynamicallyCalculatedBalanceInfoFactory.vbBusiness\SAIF.Business.Payment.EFT\DynamicallyCalculatedBalanceInfo.vbBusiness\SAIF.Business.Payment.EFT\clsBalanceTypeCode.vb