---
title: SAIF.Business.Policy business rules
summary: Enumerated business rules and inherited framework behavior.
status: draft
owner: Technical Writer
last_reviewed: 2026-07-31
library: SAIF.Business.Policy
reference_type: package
---

# SAIF.Business.Policy business rules

This page records the local and inherited business rules enforced or depended on by `SAIF.Business.Policy`.

## BR-POL-001: Latest policy period date comes from the maximum effective date

| Field | Value |
| --- | --- |
| **Statement** | Latest policy period date comes from the maximum effective date |
| **Trigger** | A caller invokes `PolicyInformation.MaxPolicyEffectiveDate` for a policy number. |
| **Enforcement** | `PolicyInformation.vb` executes the `SQL.PolicyEffectiveDate` correlated subquery, which selects `MAX(POLICY_PERIOD.POLICY_PERIOD_EFF_DATE)` for the policy. |
| **Outcome** | A single `Date` value is returned representing the policy's most recent period effective date. |
| **Confidence** | Verified |
| **Source** | Business\SAIF.Business.Policy\PolicyInformation.vb |

---
## BR-POL-002: Expiration and anniversary lookups search both WCIS and non-WCIS period tables

| Field | Value |
| --- | --- |
| **Statement** | Expiration and anniversary lookups search both WCIS and non-WCIS period tables |
| **Trigger** | A caller requests `PolicyInformation.PolicyPeriodExpirationDate` or `PolicyInformation.AnniversaryRateDate`. |
| **Enforcement** | `PolicyInformation.vb`'s `SQL.PolicyPeriodExpirationDate` and `SQL.PolicyPeriodARD` queries `UNION` matching rows from `POLICY_PERIOD` (WCIS) and `POLICY_PERIOD_NON_WCIS`. |
| **Outcome** | The matching date is found regardless of which source system holds the policy period. |
| **Confidence** | Verified |
| **Source** | Business\SAIF.Business.Policy\PolicyInformation.vb |

---
## BR-POL-003: Persisted policy codes map to fixed domain enums

| Field | Value |
| --- | --- |
| **Statement** | Persisted policy codes map to fixed domain enums |
| **Trigger** | A caller invokes any `Enums.Convert*` method (e.g. original user type, financial system, payroll report frequency, sales plan, policy issuance system, policy relationship, renewal track, cancellation track, waiver type, rating plan). |
| **Enforcement** | `Enums.vb` `Select Case` blocks translate persisted codes such as `ARP` to `Assigned Risk` and `VOL` to `Voluntary`, and the equivalent sets for the other code families. |
| **Outcome** | Callers receive a strongly typed enum or normalized code string instead of the raw persisted code. |
| **Confidence** | Verified |
| **Source** | Business\SAIF.Business.Policy\Enums.vb |

---
## BR-POL-004: Unrecognized codes translate to safe defaults

| Field | Value |
| --- | --- |
| **Statement** | Unrecognized codes translate to safe defaults |
| **Trigger** | An `Enums.Convert*` method receives a code value it does not recognize. |
| **Enforcement** | `Enums.vb` `Case Else` branches return the enum's unassigned/default member, or an empty string when converting an unmapped enum back to a code. |
| **Outcome** | The caller receives a safe default value; translation never raises an exception. |
| **Confidence** | Verified |
| **Source** | Business\SAIF.Business.Policy\Enums.vb |

---
## BR-POL-005: Only eligible premium-history types contribute to the max set id

| Field | Value |
| --- | --- |
| **Statement** | Only eligible premium-history types contribute to the max set id |
| **Trigger** | A caller invokes `PolicyInformation.MaxPremiumHistorySetId`. |
| **Enforcement** | The inline SQL predicate in `PolicyInformation.vb` restricts candidate rows to `PREM_HIST_SUMMARY` rows where `prem_hist_type_code` is `'1'` or `'3'`. |
| **Outcome** | Only the restricted candidate set is considered when determining the current premium history set. |
| **Confidence** | Verified |
| **Source** | Business\SAIF.Business.Policy\PolicyInformation.vb |

---
## BR-POL-006: Missing premium-history rows return zero

| Field | Value |
| --- | --- |
| **Statement** | Missing premium-history rows return zero |
| **Trigger** | The `MaxPremiumHistorySetId` query result is `DBNull`. |
| **Enforcement** | `PolicyInformation.vb` guards the scalar result with `If Not IsDBNull(...)` before casting it. |
| **Outcome** | The method returns `0` instead of raising a cast exception when no eligible premium history set exists. |
| **Confidence** | Verified |
| **Source** | Business\SAIF.Business.Policy\PolicyInformation.vb |

---
## BR-POL-007: Database failures are swallowed for minimum-premium retrieval*

| Field | Value |
| --- | --- |
| **Statement** | Database failures are swallowed for minimum-premium retrieval* |
| **Trigger** | An exception occurs during `ProcessPortalRequest` while `PolicyInformation.PolicyMinimumPremium` calls the rating procedure. |
| **Enforcement** | `PolicyInformation.vb` wraps the call in a `Try...Catch` whose `Catch` block is empty, so the exception is discarded rather than re-thrown or logged. |
| **Outcome** | The exception is swallowed and the method returns `0` instead of surfacing the failure to the caller.* |
| **Confidence** | Inferred |
| **Source** | Business\SAIF.Business.Policy\PolicyInformation.vb |

---
## BR-POL-008: Missing procedure results return zero

| Field | Value |
| --- | --- |
| **Statement** | Missing procedure results return zero |
| **Trigger** | `PolicyMinimumPremium`'s `DataRequest(0).Result` is `Nothing` after the rating procedure call returns. |
| **Enforcement** | `PolicyInformation.vb` checks the result reference before casting the returned value. |
| **Outcome** | The method returns `0` when the procedure produced no result. |
| **Confidence** | Verified |
| **Source** | Business\SAIF.Business.Policy\PolicyInformation.vb |

---
## BR-POL-009: Only printed P401 endorsements count as issued information pages

| Field | Value |
| --- | --- |
| **Statement** | Only printed P401 endorsements count as issued information pages |
| **Trigger** | A caller invokes `PolicyInformation.IsInformationPagePrinted` for a policy number and period effective date. |
| **Enforcement** | The inline SQL predicate selects `policy_num` from `ENDORSEMENT` where `endorse_code = 'P401'` and `printed_date IS NOT NULL` for the matching policy and period. |
| **Outcome** | The method returns `True` only when the matching printed P401 endorsement's `policy_num` equals the input policy number. Whether an empty (no-row) result also yields `False` is unknown**: the code calls `CDec(PortalRequest.DataRequest(0).Result)` directly with no guard for a no-result/`Nothing` case, so the actual behavior when no row matches depends on the untyped `IPortalRequest` contract, not on code visible in this method. |
| **Confidence** | Inferred |
| **Source** | Business\SAIF.Business.Policy\PolicyInformation.vb |

---
## BR-POL-010: Ownership comes from the Oracle submission-ownership function

| Field | Value |
| --- | --- |
| **Statement** | Ownership comes from the Oracle submission-ownership function |
| **Trigger** | A caller invokes `PolicyInformation.GetPolicyOwnershipSystem` for a policy number. |
| **Enforcement** | `PolicyInformation.vb` converts the `Y`/`N` result of `pk73102_policy.does_wcis_own_submission` into the `PolicyOwnershipSystems` enum. |
| **Outcome** | The method returns `PolicyOwnershipSystems.WCIS` when the function returns `Y`, otherwise `PolicyOwnershipSystems.SAIFQuote`. |
| **Confidence** | Verified |
| **Source** | Business\SAIF.Business.Policy\PolicyInformation.vb |

---
## BR-POL-011: Hazard-group data is read-only

| Field | Value |
| --- | --- |
| **Statement** | Hazard-group data is read-only |
| **Trigger** | Any attempt to create, update, or delete a hazard group or hazard-group collection. |
| **Enforcement** | `clsHazardGroupCollection.vb`'s constructor and `Criteria` implementation, and `clsHazardGroup.vb`'s `Criteria` implementation, throw for every SQL property except `RetrieveSQL`; the collection always reports `IsSavable = False`. |
| **Outcome** | Attempted mutation raises `ApplicationException(clsConstants.Messages.InvalidSQLProperty)` and no persistence occurs. |
| **Confidence** | Verified |
| **Source** | Business\SAIF.Business.Policy\clsHazardGroup.vb |

---
## BR-POL-012: Hazard groups are filtered by effective-date window

| Field | Value |
| --- | --- |
| **Statement** | Hazard groups are filtered by effective-date window |
| **Trigger** | A caller retrieves hazard groups for a specific date. |
| **Enforcement** | `clsHazardGroupCollection.Criteria.BuildWhere` requires `EFFECTIVE_DATE <= date` and `date < NVL(EXPIRATION_DATE, date + 1)`, so a null expiration date is treated as open-ended. |
| **Outcome** | Only rows in effect for the requested date are loaded into the collection. |
| **Confidence** | Verified |
| **Source** | Business\SAIF.Business.Policy\clsHazardGroupCollection.vb |

---
## BR-POL-013: Code maps are cached until refresh is requested*

| Field | Value |
| --- | --- |
| **Statement** | Code maps are cached until refresh is requested* |
| **Trigger** | A caller invokes `CodeMaps.Get*CodeMap`. |
| **Enforcement** | The `CodeMaps` partial classes hold a `Static` cache populated on first use and reused on subsequent calls unless the caller explicitly requests a refresh.* |
| **Outcome** | Repeated calls return the cached map without re-querying the database.* |
| **Confidence** | Inferred |
| **Source** | Business\SAIF.Business.Policy\CodeMaps\clsBenefitJurisdictionCodeMap.vb |

---
## BR-POL-014: Only recognized database codes are admitted into a map

| Field | Value |
| --- | --- |
| **Statement** | Only recognized database codes are admitted into a map |
| **Trigger** | A code map is constructed from `BENEFIT_JURISDICTION_CODE` or `MANUAL_CLASS_TYPE_CODE` rows. |
| **Enforcement** | `clsBenefitJurisdictionCodeMap` and `clsManualClassTypeCodeMap` use `Select Case` blocks that enumerate only the recognized code values. |
| **Outcome** | Any database code outside the enumerated set is silently excluded from the resulting map. |
| **Confidence** | Verified |
| **Source** | Business\SAIF.Business.Policy\CodeMaps\clsManualClassTypeCodeMap.vb |

---
## BR-POL-015: Period-rating equality requires all eight rating attributes to match

| Field | Value |
| --- | --- |
| **Statement** | Period-rating equality requires all eight rating attributes to match |
| **Trigger** | `PeriodRatingInfoExtensions.BaseEquals` is called to compare two period rating infos. |
| **Enforcement** | `BaseEquals` compares anniversary rating date, rating effective date, ARD-extended flag, RED-extended flag, effective date, expiration date, rate tier code, and market type. |
| **Outcome** | The two instances are considered equal only when all eight attributes match; otherwise the comparison returns `False`. |
| **Confidence** | Verified |
| **Source** | Business\SAIF.Business.Policy\iPeriodRatingInfo.vb |

---
## BR-POL-016: Hazard-group identity is the hazard-group id only

| Field | Value |
| --- | --- |
| **Statement** | Hazard-group identity is the hazard-group id only |
| **Trigger** | `clsHazardGroup.Equals`, `GetHashCode`, or a collection lookup is invoked. |
| **Enforcement** | `clsHazardGroup.vb` overrides equality and hashing to key solely on `HAZARD_GROUP_ID`, ignoring other properties. |
| **Outcome** | Two hazard-group instances with the same id compare equal and hash identically regardless of other field values. |
| **Confidence** | Verified |
| **Source** | Business\SAIF.Business.Policy\clsHazardGroup.vb |

---
## BR-POL-017: Non-applicable adjusted-rate factors contribute the neutral value one

| Field | Value |
| --- | --- |
| **Statement** | Non-applicable adjusted-rate factors contribute the neutral value one |
| **Trigger** | An implementation of `iAdjustedRateFactor.Factor` is evaluated for a provider the factor does not apply to. |
| **Enforcement** | The contract documented in `CodeMaps/iAdjustedRateFactor.vb` requires returning the constant `AdjustedRates.NonApplicableAdjustedRateFactor = 1` rather than `0`. |
| **Outcome** | The cumulative rate factor is left unchanged when a factor does not apply, instead of being zeroed out. |
| **Confidence** | Verified |
| **Source** | Business\SAIF.Business.Policy\CodeMaps\iAdjustedRateFactor.vb |

---
## BR-POL-018: Translation results expose graded confidence values

| Field | Value |
| --- | --- |
| **Statement** | Translation results expose graded confidence values |
| **Trigger** | Any translation operation produces a `clsTranslationResult`. |
| **Enforcement** | `clsTranslationResult.Accuracies` defines fixed grades: exact match (100), most likely (75), default (10), failure (0). |
| **Outcome** | Consumers can rank how confident a translation is by comparing the returned accuracy grade. |
| **Confidence** | Verified |
| **Source** | Business\SAIF.Business.Policy\clsTranslationResult.vb |

---
## BR-POL-019: Policy-association visibility is governed by a security-group contract*

| Field | Value |
| --- | --- |
| **Statement** | Policy-association visibility is governed by a security-group contract* |
| **Trigger** | A consumer resolves `IPolicyAssociationType.SecurityGroupName` before displaying an association type. |
| **Enforcement** | The contract is declared in `IPolicyHeaderDataProvider.vb`; the actual Active Directory group membership check is enforced by the implementing library, not by this contract itself.* |
| **Outcome** | The association type is shown or hidden depending on the consumer's membership in the named security group.* |
| **Confidence** | Inferred |
| **Source** | Business\SAIF.Business.Policy\IPolicyHeaderDataProvider.vb |

---

## Inherited business rules

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

## INH-POL-001: Broken-rule tracking is surfaced through the BOF base class

| Field | Value |
| --- | --- |
| **Statement** | Broken-rule state is exposed through `IDataErrorInfo` and the BOF rules manager* |
| **Trigger** | A BOF business object or collection evaluates its registered rules* |
| **Enforcement** | `clsBusinessBase` and `clsBusinessCollectionBase` expose rule failures through the framework validation surface* |
| **Outcome** | UI and binding consumers can display validation failures without duplicating rule logic* |
| **Confidence** | Dependency documentation |
| **Source** | Retrieved from dependency library documentation via Legends CLI |

---

## BR-POL-020: Procedure dispatches by market type

| Field | Value |
| --- | --- |
| **Statement** | Procedure dispatches by market type |
| **Trigger** | `PolicyInformation.PolicyMinimumPremium` calls `pk73069_rating_procs.get_minimum_expense_constant` for a premium-history set. |
| **Enforcement** | The procedure first resolves policy-period data via `get_pp_info`, then branches on `v_pp_info.market_type_code`: `'VOL'` routes to voluntary/combination-voluntary logic, any other value routes to assigned-risk logic. |
| **Outcome** | The correct minimum-premium calculation path is selected for the policy's market type. |
| **Confidence** | Verified |
| **Stored procedure** | [Procedure details](procedures/pk73069-rating-procs.md) |
| **Source** | Oracle DBA_SOURCE: WCIS_DBA.pk73069_rating_procs |

---
## BR-POL-021: Voluntary combination policies use combination-wide minimum logic

| Field | Value |
| --- | --- |
| **Statement** | Voluntary combination policies use combination-wide minimum logic |
| **Trigger** | `get_minimum_expense_constant` finds `v_pp_info.market_type_code = 'VOL'` and `v_pp_info.combo_period_prem_set_seq_num` is not null. |
| **Enforcement** | The procedure calls `get_comb_vol_policy_minimum`, which loops over every `prem_hist_summary` row sharing the same `combo_period_prem_set_seq_num` rather than evaluating a single period in isolation. |
| **Outcome** | The minimum premium is computed across the whole voluntary combination, not per individual period. |
| **Confidence** | Verified |
| **Stored procedure** | [Procedure details](procedures/pk73069-rating-procs.md) |
| **Source** | Oracle DBA_SOURCE: WCIS_DBA.pk73069_rating_procs |

---
## BR-POL-022: Voluntary periods before the cut-over date use a fixed minimum

| Field | Value |
| --- | --- |
| **Statement** | Voluntary periods before the cut-over date use a fixed minimum |
| **Trigger** | `get_vol_policy_minimum` or `get_comb_vol_policy_minimum` evaluates a policy/combination period effective date earlier than the `c_vol_variable_min_eff_date` constant (`01-APR-2010`). |
| **Enforcement** | Both procedures short-circuit with `out_minimum := c_vol_fixed_min_amount` (the constant `500`) before reaching the variable-rate calculation. |
| **Outcome** | Pre-cutover voluntary periods receive the fixed `$500` minimum instead of a rate-derived minimum. |
| **Confidence** | Verified |
| **Stored procedure** | [Procedure details](procedures/pk73069-rating-procs.md) |
| **Source** | Oracle DBA_SOURCE: WCIS_DBA.pk73069_rating_procs |

---
## BR-POL-023: Assessment handling changes at the alignment date

| Field | Value |
| --- | --- |
| **Statement** | Assessment handling changes at the alignment date |
| **Trigger** | `get_vol_policy_minimum` evaluates a policy period effective date against the `c_vol_assess_min_same_eff_date` constant (`01-JAN-2014`). |
| **Enforcement** | When the period effective date is before the alignment date, the procedure calls `get_variable_min_exp_constant` with a premium-history-type mapping (via a `CASE` on `in_prem_hist_type_code`) that differs from the mapping used on or after the alignment date. |
| **Outcome** | The variable minimum-expense-constant calculation uses the pre-alignment or post-alignment premium-history-type mapping depending on the period's effective date. |
| **Confidence** | Verified |
| **Stored procedure** | [Procedure details](procedures/pk73069-rating-procs.md) |
| **Source** | Oracle DBA_SOURCE: WCIS_DBA.pk73069_rating_procs |

---
## BR-POL-024: Combination voluntary minimums prefer the highest non-default minimum

| Field | Value |
| --- | --- |
| **Statement** | Combination voluntary minimums prefer the highest non-default minimum |
| **Trigger** | `get_comb_vol_policy_minimum` loops through all `prem_hist_summary` rows tied to a combination premium-set sequence number. |
| **Enforcement** | For each row, when `v_default_minimum_flag = 'Y'` the procedure tracks the highest value in `v_default_minimum`; when `'N'` it tracks the highest in `v_max_minimum`. The final result is `out_minimum := NVL(v_max_minimum, v_default_minimum)`. |
| **Outcome** | A non-default (explicitly computed) minimum wins over the default minimum whenever one exists in the combination. |
| **Confidence** | Verified |
| **Stored procedure** | [Procedure details](procedures/pk73069-rating-procs.md) |
| **Source** | Oracle DBA_SOURCE: WCIS_DBA.pk73069_rating_procs |

---
## BR-POL-025: Submission ownership comes from the submission-status flag

| Field | Value |
| --- | --- |
| **Statement** | Submission ownership comes from the submission-status flag |
| **Trigger** | `PolicyInformation.GetPolicyOwnershipSystem` calls `pk73102_policy.does_wcis_own_submission(policy_num)`. |
| **Enforcement** | The function selects `wcis_owns_flag` from `submission_status_code` joined to `sub_policy` on `submission_status_code`, keyed by the policy number. |
| **Outcome** | The returned `'Y'`/`'N'` flag determines whether ownership resolves to WCIS or SAIF Quote. |
| **Confidence** | Verified |
| **Stored procedure** | [Procedure details](procedures/pk73102-policy.md) |
| **Source** | Oracle DBA_SOURCE: WCIS_DBA.pk73102_policy |

---
## BR-POL-026: Missing or failed submission lookups default to WCIS ownership

| Field | Value |
| --- | --- |
| **Statement** | Missing or failed submission lookups default to WCIS ownership |
| **Trigger** | `does_wcis_own_submission` raises `NO_DATA_FOUND` (no matching `sub_policy` row) or any other exception. |
| **Enforcement** | Both the `WHEN NO_DATA_FOUND` and `WHEN OTHERS` exception handlers in the function return `'Y'`. |
| **Outcome** | The policy defaults to WCIS ownership whenever the submission lookup fails or finds no row, rather than raising an error. |
| **Confidence** | Verified |
| **Stored procedure** | [Procedure details](procedures/pk73102-policy.md) |
| **Source** | Oracle DBA_SOURCE: WCIS_DBA.pk73102_policy |

---
## BR-POL-027: Procedure failures are raised inside Oracle but suppressed by the .NET caller*

| Field | Value |
| --- | --- |
| **Statement** | Procedure failures are raised inside Oracle but suppressed by the .NET caller* |
| **Trigger** | `pk73069_rating_procs` raises an exception (e.g. via its `OTHERS` handlers) while computing the minimum premium for `PolicyMinimumPremium`. |
| **Enforcement** | The Oracle package's own exception handlers log or re-raise internally, but `PolicyInformation.vb`'s empty `Catch` around the `ProcessPortalRequest` call discards the propagated error.* |
| **Outcome** | The caller observes a `0` minimum premium with no visible error, even though the procedure encountered a failure.* |
| **Confidence** | Inferred |
| **Stored procedure** | [Procedure details](procedures/pk73069-rating-procs.md) |
| **Source** | Business\SAIF.Business.Policy\PolicyInformation.vb |

---

## Related documentation
- [Index](index.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)
- [API reference](api/index.md)
- [Configuration](configuration.md)
- [Procedures](procedures/index.md)

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

## Sources
- `Business\SAIF.Business.Policy\PolicyInformation.vb`
- `Business\SAIF.Business.Policy\clsHazardGroup.vb`
- `Business\SAIF.Business.Policy\clsHazardGroupCollection.vb`
- `Business\SAIF.Business.Policy\Enums.vb`
- `Business\SAIF.Business.Policy\iPeriodRatingInfo.vb`
- `Business\SAIF.Business.Policy\IPolicyHeaderDataProvider.vb`
- `Business\SAIF.Business.Policy\CodeMaps\clsBenefitJurisdictionCodeMap.vb`
- `Business\SAIF.Business.Policy\CodeMaps\clsManualClassTypeCodeMap.vb`
- `Business\SAIF.Business.Policy\CodeMaps\iAdjustedRateFactor.vb`
- `Business\SAIF.Business.Policy\clsTranslationResult.vb`
- `Oracle DBA_SOURCE: WCIS_DBA.pk73069_rating_procs`
- `Oracle DBA_SOURCE: WCIS_DBA.pk73102_policy`
