---
title: SAIF.Business.View.Policy operations and processes
summary: Business and technical operations supported by this library.
status: draft
owner: SAIF Doc Gen
last_reviewed: "2026-08-17"
library: SAIF.Business.View.Policy
reference_type: package
---

# SAIF.Business.View.Policy operations and processes

This page is the operation catalog and cross-operation hub for `SAIF.Business.View.Policy`. Each operation's detailed, step-by-step logic lives in its own page under `operations/`.

The nine operations divide into three groups: loading a policy and its supporting data ([Retrieve policy header](operations/retrieve-policy-header.md), [Lazy-load policy detail](operations/lazy-load-policy-detail.md), [Check waiver existence](operations/check-waiver-existence.md), [Retrieve supporting policy aggregates](operations/retrieve-supporting-policy-aggregates.md)), resolving how policies relate to one another ([Resolve policy associations](operations/resolve-policy-associations.md), [Resolve policy-header associations](operations/resolve-policy-header-associations.md)), and deciding what the signed-in user is allowed to see ([Authorize a policy for the current user](operations/authorize-policy-for-user.md), [Build the permitted policy list](operations/build-permitted-policy-list.md), [Retrieve affiliated policies](operations/retrieve-affiliated-policies.md)).

## Operation catalog

| Operation | Intent | Trigger | Inputs | Outputs | Rules | Tables | SQL |
| --- | --- | --- | --- | --- | --- | --- | --- |
| [Retrieve policy header](operations/retrieve-policy-header.md) | Load the policy header that every other policy read depends on | A caller requests a policy view | `IDataPortalInfo`, policy number, and an optional `UserAccessLevels` value | A populated `clsPolicyData` marked clean | [BR-009](business-rules.md#br-009-a-policy-view-requires-a-positive-policy-number), [BR-011](business-rules.md#br-011-affiliated-policy-visibility-depends-on-user-access-level-and-affiliate-type) | — | [SQL-007](sql/SQL-007-policy-header.md) |
| [Lazy-load policy detail](operations/lazy-load-policy-detail.md) | Load the extended policy detail block on first use | A detail-backed property is read for the first time | The already-loaded `clsPolicyData` instance | Roughly twenty detail fields populated on the same instance | [BR-014](business-rules.md#br-014-association-date-defaults-differ-per-association-family-and-detail-load-failures-are-non-fatal) | [CANCELLATION](database-tables.md#cancellation), [PA_AUDIT](database-tables.md#pa-audit) | [SQL-014](sql/SQL-014-coverage-bound-flag.md), [SQL-015](sql/SQL-015-future-cancel-date.md), [SQL-016](sql/SQL-016-coverage-gaps.md), [SQL-017](sql/SQL-017-info-page-printed.md), [SQL-018](sql/SQL-018-last-audit-date.md), [SQL-020](sql/SQL-020-secondary-policy-status.md), [SQL-021](sql/SQL-021-wrapup-legal-name.md) |
| [Check waiver existence](operations/check-waiver-existence.md) | Answer whether a policy carries a third-party waiver | `clsPolicyData.HasWaiver` is read for the first time | The policy number held by the loaded `clsPolicyData` | A boolean waiver indicator cached on the instance | — | — | [SQL-022](sql/SQL-022-policy-waiver-count.md) |
| [Resolve policy associations](operations/resolve-policy-associations.md) | List every policy associated with a policy, across four association families | `clsPolicyData.Associations` is first accessed, a preferred association type is assigned, or a caller invokes the list directly | `IDataPortalInfo`, policy number, an include-source-policy flag, and an optional as-of date | A sequence of `PolicyAssociation` values | [BR-014](business-rules.md#br-014-association-date-defaults-differ-per-association-family-and-detail-load-failures-are-non-fatal), [BR-015](business-rules.md#br-015-unrecognized-relationship-codes-are-classified-as-not-specified), [BR-016](business-rules.md#br-016-manually-maintained-affiliations-are-distinguished-by-an-m-prefixed-code) | [POLICY_RELATIONSHIP](database-tables.md#policy-relationship), [POLICY](database-tables.md#policy), [COMBO_POLICY_PERIOD](database-tables.md#combo-policy-period), [POLICY_PERIOD](database-tables.md#policy-period), [ER_COMBINATION_POLICY](database-tables.md#er-combination-policy) | [SQL-026](sql/SQL-026-policy-association-union.md), [SQL-027](sql/SQL-027-max-policy-period-eff-date.md) |
| [Resolve policy-header associations](operations/resolve-policy-header-associations.md) | Resolve the associations shown in a policy header, driven by the association type code table | A caller requests policy-header associations for a policy | `IDataPortalInfo` and a policy number | A sequence of `IPolicyHeaderAssociation` values with attached period date ranges | [BR-014](business-rules.md#br-014-association-date-defaults-differ-per-association-family-and-detail-load-failures-are-non-fatal), [BR-015](business-rules.md#br-015-unrecognized-relationship-codes-are-classified-as-not-specified), [BR-017](business-rules.md#br-017-association-rows-without-a-matching-type-code-are-discarded) | [ASSOCIATION_TYPE_CODE](database-tables.md#association-type-code), [POLICY_PERIOD_ALL](database-tables.md#policy-period-all), [ENDORSEMENT](database-tables.md#endorsement), [POLICY_PERIOD_NON_WCIS](database-tables.md#policy-period-non-wcis) | [SQL-003](sql/SQL-003-association-type-code-table.md), [SQL-013](sql/SQL-013-policy-affiliate-type.md), [SQL-019](sql/SQL-019-parent-policy.md), [SQL-028](sql/SQL-028-association-period-dates.md), [SQL-029](sql/SQL-029-non-typed-associations.md) |
| [Authorize a policy for the current user](operations/authorize-policy-for-user.md) | Decide whether the signed-in principal may view a policy | A consumer asks whether the current principal may see a policy | A `clsSecurityPrincipal` and `IDataPortalInfo` supplied to the constructor, plus the target policy or policy number | A boolean access decision | [BR-001](business-rules.md#br-001-secure-saif-policies-require-explicit-authorization), [BR-002](business-rules.md#br-002-invalid-or-unnumbered-policies-are-never-accessible), [BR-003](business-rules.md#br-003-internal-and-provider-user-types-have-unrestricted-policy-visibility), [BR-004](business-rules.md#br-004-agents-see-only-their-own-book), [BR-005](business-rules.md#br-005-policyholders-see-their-own-policy-and-policies-under-the-same-parent-association), [BR-006](business-rules.md#br-006-group-users-see-only-policies-in-their-group-or-chapter), [BR-007](business-rules.md#br-007-loss-control-consultants-see-only-policies-they-are-assigned-to), [BR-008](business-rules.md#br-008-fee-auditors-see-only-policies-with-a-recent-non-cancelled-audit) | [PA_AUDIT](database-tables.md#pa-audit) | [SQL-007](sql/SQL-007-policy-header.md), [SQL-009](sql/SQL-009-team-assignments.md), [SQL-026](sql/SQL-026-policy-association-union.md) |
| [Build the permitted policy list](operations/build-permitted-policy-list.md) | Produce the list of policies the signed-in principal may see | `clsPolicySecurity.PolicyList` is read for the first time | The principal supplied to the constructor | A cached list of permitted policy numbers and names | [BR-018](business-rules.md#br-018-agent-policy-lists-are-produced-only-for-numeric-agent-identifiers), [BR-019](business-rules.md#br-019-policy-lists-fail-closed) | [PA_AUDIT](database-tables.md#pa-audit) | — |
| [Retrieve affiliated policies](operations/retrieve-affiliated-policies.md) | List the policies affiliated with a policy under one affiliation family | A caller requests the affiliated policy collection for a policy | `IDataPortalInfo`, policy number, affiliate type, totals flag, and optional agent or agency filters | A populated `clsAffiliatedPolicyCollection` with the source policy marked current | [BR-011](business-rules.md#br-011-affiliated-policy-visibility-depends-on-user-access-level-and-affiliate-type), [BR-020](business-rules.md#br-020-affiliated-policies-are-filtered-to-the-requesting-agent-or-agency-when-specified) | — | [SQL-001](sql/SQL-001-affiliated-policy-list.md) |
| [Retrieve supporting policy aggregates](operations/retrieve-supporting-policy-aggregates.md) | Load the supporting aggregates that complete a policy view | A caller invokes one of the shared factory methods on a supporting business object | `IDataPortalInfo` plus the key for the aggregate being loaded | A populated business object or collection, marked clean | [BR-007](business-rules.md#br-007-loss-control-consultants-see-only-policies-they-are-assigned-to), [BR-010](business-rules.md#br-010-a-non-employer-account-requires-a-non-zero-account-number), [BR-012](business-rules.md#br-012-demo-access-levels-are-treated-as-a-distinct-user-population) | [NON_EMPR_ACCT](database-tables.md#non-empr-acct), [TRADING_AS](database-tables.md#trading-as), [BUSINESS_AFFILIATE](database-tables.md#business-affiliate), [AFFILIATE](database-tables.md#affiliate) | [SQL-002](sql/SQL-002-agency-retrieval.md), [SQL-004](sql/SQL-004-non-employer-account.md), [SQL-005](sql/SQL-005-policy-address-by-type.md), [SQL-006](sql/SQL-006-policy-address-by-location.md), [SQL-008](sql/SQL-008-policy-periods.md), [SQL-009](sql/SQL-009-team-assignments.md), [SQL-010](sql/SQL-010-trading-as-by-seq-num.md), [SQL-011](sql/SQL-011-trading-as-by-policy.md), [SQL-012](sql/SQL-012-officer-of-notice.md), [SQL-023](sql/SQL-023-employer-liability-limits.md), [SQL-024](sql/SQL-024-external-client-lookup-legacy.md), [SQL-025](sql/SQL-025-system-user-email-lookup.md) |

## Process flow diagram

The following diagram visualizes the primary operational flow across operations.

```mermaid
flowchart TD
    Start([Consumer requests a policy view]) --> Auth[Authorize the policy<br>for the current user]
    Auth --> D{Access permitted?}
    D -->|No| Deny([Refuse the request])
    D -->|Yes| Head[Retrieve the policy header]
    Head --> Detail[Lazy-load policy detail<br>on first property read]
    Head --> Assoc[Resolve policy associations]
    Head --> Support[Retrieve supporting aggregates]
    Assoc --> Header[Resolve policy-header associations]
    Assoc --> Affil[Retrieve affiliated policies]
    Detail --> Waiver[Check waiver existence]
    Auth --> List[Build the permitted policy list]
    Support --> View([Assembled policy view])
    Header --> View
    Affil --> View
    Waiver --> View
    List --> View
```

## Inherited operations and processes

Operations in this section originate from base classes provided by the `SAIF.Framework.Core` dependency. They are inherited rather than implemented in this library, and their steps are embedded inline in the consuming operation pages.

### From `clsBusinessBase` (`SAIF.Framework.Core`)

| Operation | Intent | Provided by | Origin | Embedded in |
| --- | --- | --- | --- | --- |
| Retrieve object through the data portal | Execute a criteria-described read and drive the before- and after-retrieve hooks around it† | `clsBusinessBase` | `SAIF.Framework.Core` | [Retrieve policy header](operations/retrieve-policy-header.md) |
| Evaluate broken rules | Re-evaluate registered validation rules and expose the result through `IsValid`† | `clsRulesManager` | `SAIF.Framework.Core` | [Retrieve policy header](operations/retrieve-policy-header.md) |

### From `clsBusinessCollectionBase` (`SAIF.Framework.Core`)

| Operation | Intent | Provided by | Origin | Embedded in |
| --- | --- | --- | --- | --- |
| Retrieve a collection through the data portal | Execute a criteria-described read and populate the collection from the result set† | `clsBusinessCollectionBase` | `SAIF.Framework.Core` | [Retrieve supporting policy aggregates](operations/retrieve-supporting-policy-aggregates.md) |
| Track removed members | Move removed items into a deleted-items list so removals stay distinguishable† | `clsBusinessCollectionBase` | `SAIF.Framework.Core` | [Retrieve affiliated policies](operations/retrieve-affiliated-policies.md) |

> **Origin**: These operations are defined in `SAIF.Framework.Core` and inherited by every business object and collection in this library. Their step-by-step logic is embedded inline, with `Origin` callouts, in the consuming operation pages.

## Database interactions

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

| Operation | SQL | Tables | Type |
| --- | --- | --- | --- |
| [Retrieve policy header](operations/retrieve-policy-header.md) | [SQL-007](sql/SQL-007-policy-header.md) | N/A — stored procedure | Read |
| [Lazy-load policy detail](operations/lazy-load-policy-detail.md) | [SQL-014](sql/SQL-014-coverage-bound-flag.md), [SQL-015](sql/SQL-015-future-cancel-date.md), [SQL-016](sql/SQL-016-coverage-gaps.md), [SQL-017](sql/SQL-017-info-page-printed.md), [SQL-018](sql/SQL-018-last-audit-date.md), [SQL-020](sql/SQL-020-secondary-policy-status.md), [SQL-021](sql/SQL-021-wrapup-legal-name.md) | [CANCELLATION](database-tables.md#cancellation), [PA_AUDIT](database-tables.md#pa-audit) | Read |
| [Check waiver existence](operations/check-waiver-existence.md) | [SQL-022](sql/SQL-022-policy-waiver-count.md) | N/A — stored procedure | Read |
| [Resolve policy associations](operations/resolve-policy-associations.md) | [SQL-026](sql/SQL-026-policy-association-union.md), [SQL-027](sql/SQL-027-max-policy-period-eff-date.md) | [POLICY_RELATIONSHIP](database-tables.md#policy-relationship), [POLICY](database-tables.md#policy), [COMBO_POLICY_PERIOD](database-tables.md#combo-policy-period), [POLICY_PERIOD](database-tables.md#policy-period), [ER_COMBINATION_POLICY](database-tables.md#er-combination-policy) | Read |
| [Resolve policy-header associations](operations/resolve-policy-header-associations.md) | [SQL-003](sql/SQL-003-association-type-code-table.md), [SQL-013](sql/SQL-013-policy-affiliate-type.md), [SQL-019](sql/SQL-019-parent-policy.md), [SQL-028](sql/SQL-028-association-period-dates.md), [SQL-029](sql/SQL-029-non-typed-associations.md) | [ASSOCIATION_TYPE_CODE](database-tables.md#association-type-code), [POLICY_PERIOD_ALL](database-tables.md#policy-period-all), [ENDORSEMENT](database-tables.md#endorsement), [POLICY_PERIOD_NON_WCIS](database-tables.md#policy-period-non-wcis) | Read |
| [Authorize a policy for the current user](operations/authorize-policy-for-user.md) | [SQL-007](sql/SQL-007-policy-header.md), [SQL-009](sql/SQL-009-team-assignments.md), [SQL-026](sql/SQL-026-policy-association-union.md) | [PA_AUDIT](database-tables.md#pa-audit) | Read |
| [Build the permitted policy list](operations/build-permitted-policy-list.md) | — | [PA_AUDIT](database-tables.md#pa-audit) | Read |
| [Retrieve affiliated policies](operations/retrieve-affiliated-policies.md) | [SQL-001](sql/SQL-001-affiliated-policy-list.md) | N/A — stored procedure | Read |
| [Retrieve supporting policy aggregates](operations/retrieve-supporting-policy-aggregates.md) | [SQL-002](sql/SQL-002-agency-retrieval.md), [SQL-004](sql/SQL-004-non-employer-account.md), [SQL-005](sql/SQL-005-policy-address-by-type.md), [SQL-006](sql/SQL-006-policy-address-by-location.md), [SQL-008](sql/SQL-008-policy-periods.md), [SQL-009](sql/SQL-009-team-assignments.md), [SQL-010](sql/SQL-010-trading-as-by-seq-num.md), [SQL-011](sql/SQL-011-trading-as-by-policy.md), [SQL-012](sql/SQL-012-officer-of-notice.md), [SQL-023](sql/SQL-023-employer-liability-limits.md), [SQL-024](sql/SQL-024-external-client-lookup-legacy.md), [SQL-025](sql/SQL-025-system-user-email-lookup.md) | [NON_EMPR_ACCT](database-tables.md#non-empr-acct), [TRADING_AS](database-tables.md#trading-as), [BUSINESS_AFFILIATE](database-tables.md#business-affiliate), [AFFILIATE](database-tables.md#affiliate) | Read |

No operation writes to the database ([BR-021](business-rules.md#br-021-this-library-never-writes-policy-data)).

## Failure and edge-case behavior

- Authorization fails closed: an unrecognised user type is refused and produces an empty policy list ([BR-019](business-rules.md#br-019-policy-lists-fail-closed), [BR-002](business-rules.md#br-002-invalid-or-unnumbered-policies-are-never-accessible)).
- A failed lazy detail load is swallowed, leaving the policy header usable but the detail fields empty ([BR-014](business-rules.md#br-014-association-date-defaults-differ-per-association-family-and-detail-load-failures-are-non-fatal)).
- Association rows whose type code is unknown are either retained as not specified or dropped, depending on the path taken ([BR-015](business-rules.md#br-015-unrecognized-relationship-codes-are-classified-as-not-specified), [BR-017](business-rules.md#br-017-association-rows-without-a-matching-type-code-are-discarded)).
- Four of the six permitted-policy-list branches depend on a separately configured SQL Server store, so a configuration error narrows visibility silently. See [Configuration](configuration.md).**

> **Note:** Statements marked with `†` are derived from dependency library
> documentation via the Legends CLI. Statements marked with `*` were inferred
> from code structure or contextual evidence. Statements marked with `**` could
> not be confirmed; treat as unknown until verified.

## Related documentation

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

## Sources

- `Business/SAIF.Business.View.Policy/Associations/clsAssociationTypeCode.vb`
- `Business/SAIF.Business.View.Policy/Associations/clsAssociationTypeCodeCollection.vb`
- `Business/SAIF.Business.View.Policy/Associations/clsAssociationTypeFactory.vb`
- `Business/SAIF.Business.View.Policy/Associations/clsPolicyHeaderAssociationFactory.vb`
- `Business/SAIF.Business.View.Policy/PolicyAssociations.vb`
- `Business/SAIF.Business.View.Policy/clsAffiliatedPolicy.vb`
- `Business/SAIF.Business.View.Policy/clsAffiliatedPolicyCollection.vb`
- `Business/SAIF.Business.View.Policy/clsAgency.vb`
- `Business/SAIF.Business.View.Policy/clsNonEmployerAccount.vb`
- `Business/SAIF.Business.View.Policy/clsPolicyAddress.vb`
- `Business/SAIF.Business.View.Policy/clsPolicyData.vb`
- `Business/SAIF.Business.View.Policy/clsPolicyPeriod.vb`
- `Business/SAIF.Business.View.Policy/clsPolicyPeriodCollection.vb`
- `Business/SAIF.Business.View.Policy/clsPolicySecurity.vb`
- `Business/SAIF.Business.View.Policy/clsTeamAssignment.vb`
- `Business/SAIF.Business.View.Policy/clsTeamAssignmentCollection.vb`
- `Business/SAIF.Business.View.Policy/clsTradingAs.vb`
- `Business/SAIF.Business.View.Policy/clsTradingAsCollection.vb`

## Stored procedure operations

Operations implemented in the Oracle stored procedures that this library calls.

| Operation | Description | Source | Link |
| --- | --- | --- | --- |
| Retrieve policy header | Returns the single-row policy header for a policy number, including a live-computed cancellation status | `pk73094_policy_data.getpolicy` | [Details](procedures/pk73094_policy_data.md#operations) |
| Retrieve policy detail | Returns extended detail: group, plan, gap indicator, combination flags, and governing class | `pk72846_view_policy.getviewdetail` | [Details](procedures/pk72846_view_policy.md#operations) |
| Classify policy affiliation (superseded) | Resolves a policy's affiliation classification through a fixed precedence hierarchy | `pk72846_view_policy.getpolicyaffiliatetype` | [Details](procedures/pk72846_view_policy.md#operations) |
| Resolve parent policy (superseded) | Resolves the parent policy number for an affiliated policy | `pk72846_view_policy.getparentpolicy` | [Details](procedures/pk72846_view_policy.md#operations) |
| Retrieve wrap-up legal name | Returns the legal name resolved up the wrap-up and rate-account chain | `pk72846_view_policy.getwrapuplegalname` | [Details](procedures/pk72846_view_policy.md#operations) |
| Retrieve coverage gaps | Returns date ranges representing gaps in coverage | `pk72846_view_policy.getgaps` | [Details](procedures/pk72846_view_policy.md#operations) |
| Retrieve agency and producer | Returns the agent-of-record's agency and producer contact and address details | `pk72846_view_policy.getagency` | [Details](procedures/pk72846_view_policy.md#operations) |
| Retrieve policy address by type | Returns the best-matching address and contact row for a policy and address type, with mailing-address fallback | `pk72846_view_policy.getpolicyaddress` | [Details](procedures/pk72846_view_policy.md#operations) |
| Retrieve policy address by location | Returns the highest-priority contact for a specific location sequence number | `pk72846_view_policy.getpolicyaddressbylocseqnum` | [Details](procedures/pk72846_view_policy.md#operations) |
| Retrieve policy periods | Returns all or the most recent N policy periods with masked and derived risk, plan, and premium data | `pk72846_view_policy.getpolicyperiods` | [Details](procedures/pk72846_view_policy.md#operations) |
| Retrieve affiliated policy list | Returns member and parent policies for an affiliation family, with an optional totals row | `pk72846_view_policy.getpolicyaffiliatelist` | [Details](procedures/pk72846_view_policy.md#operations) |
| Retrieve team assignments | Returns SAIF staff team assignments plus office, customer-service-team, agency, and producer pseudo-rows | `pk72846_view_policy.team_assign_query` | [Details](procedures/pk72846_view_policy.md#operations) |
| Check waiver existence | Returns the count of waiver records for a policy | `Pk82033_ThirdParty.get_policy_waiver_count` | [Details](procedures/pk82033_thirdparty.md#operations) |
| Retrieve employer-liability limits | Returns statutory employer-liability coverage limits for a policy period with a specific-to-default fallback | `coveragelimits_pkg.getSpecificLimitsForPolicyNum` | [Details](procedures/coveragelimits_pkg.md#operations) |
| Derive secondary cancel status | Derives a human-readable collection and cancellation status for a policy | `sp72268_get_cancel_status` | [Details](procedures/sp72268_get_cancel_status.md#operations) |
| Determine coverage-bound flag | Returns whether a policy in application status has bound coverage | `sp73089_get_policy_bound_flag` | [Details](procedures/sp73089_get_policy_bound_flag.md#operations) |
| Determine information-page-printed flag | Returns whether the information page for a policy period has printed | `sp72347_info_page_printed_yn` | [Details](procedures/sp72347_info_page_printed_yn.md#operations) |
| Look up external client e-mail | Resolves a system user's e-mail address by mail identifier and last name | `sp73341_external_client_lookup` | [Details](procedures/sp73341_external_client_lookup.md#operations) |
| <a id="proc-op-01"></a>Look up external client e-mail — query (legacy, SQL Server) | Queries the SQL Server `Net_Registrant` table for a matching, active, non-test registrant by ID number and last name | `cp_external_client_lookup` | [Details](procedures/cp_external_client_lookup.md#operations) |
| <a id="proc-op-02"></a>Look up external client e-mail — result selection (legacy, SQL Server) | Returns the most recently updated matching row (or none) to the .NET caller | `cp_external_client_lookup` | [Details](procedures/cp_external_client_lookup.md#operations) |
