---
title: "SAIF.Business.Policy.Core business rules"
summary: "Enumerated business rules with per-rule trigger, enforcement, and outcomes."
status: draft
owner: Technical Writer
last_reviewed: 2026-07-31
library: SAIF.Business.Policy.Core
reference_type: package
---

# SAIF.Business.Policy.Core business rules

This page captures business rules enforced by this library.

## BR-001: Policy period status codes map to a fixed

| Field | Value |
| --- | --- |
| **Statement** | Policy period status codes map to a fixed set of 13 named statuses (`P`, `0`, `E`, `F`, `FA`, `FC`, `FP`, `PPROS`, `PR`, `PF`, `RA`, `RF`) |
| **Trigger** | Status conversion |
| **Enforcement** | `clsPolicyPeriodStatus.ConvertStatus` |
| **Outcome** | Typed `Statuses` value |
| **Confidence** | Verified |
| **Tables** | [POLICY_PERIOD_STATUS_CODE](database-tables.md#policy_period_status_code) |
| **SQL** | [SQL-092](sql/SQL-092-saif-business-policy-core.md), [SQL-093](sql/SQL-093-saif-business-policy-core.md) |
| **Source** | `Business\SAIF.Business.Policy.Core\clsPolicyPeriodStatus.vb:64-121` |

---

## BR-002: An unrecognised status code yields Statuses.Unknown; an unrecognised

| Field | Value |
| --- | --- |
| **Statement** | An unrecognised status code yields `Statuses.Unknown`; an unrecognised enum value yields an empty code string |
| **Trigger** | Status conversion |
| **Enforcement** | `clsPolicyPeriodStatus.ConvertStatus` |
| **Outcome** | Safe fallback, no exception |
| **Confidence** | Verified |
| **Tables** | [POLICY_PERIOD_STATUS_CODE](database-tables.md#policy_period_status_code) |
| **SQL** | [SQL-092](sql/SQL-092-saif-business-policy-core.md), [SQL-093](sql/SQL-093-saif-business-policy-core.md) |
| **Source** | `Business\SAIF.Business.Policy.Core\clsPolicyPeriodStatus.vb:64-121` |

---

## BR-003: Statuses roll up into six status groups Application

| Field | Value |
| --- | --- |
| **Statement** | Statuses roll up into six status groups (Application, Closed, NoCoverage, Open, Renewal, Unknown) |
| **Trigger** | Status-group conversion |
| **Enforcement** | `clsPolicyPeriodStatus.ConvertStatusGroup` |
| **Outcome** | Typed `StatusGroups` value |
| **Confidence** | Verified |
| **Tables** | [POLICY_PERIOD_STATUS_CODE](database-tables.md#policy_period_status_code) |
| **SQL** | [SQL-092](sql/SQL-092-saif-business-policy-core.md), [SQL-093](sql/SQL-093-saif-business-policy-core.md) |
| **Source** | `Business\SAIF.Business.Policy.Core\clsPolicyPeriodStatus.vb:137-162` |

---

## BR-004: The current period is the first period flagged

| Field | Value |
| --- | --- |
| **Statement** | The current period is the first period flagged `IsCurrent`; if none is flagged, the latest period by effective date is treated as current |
| **Trigger** | Period selection |
| **Enforcement** | `iPolicyPeriodExtensions.CurrentPeriod` |
| **Outcome** | A single period is always returned when the set is non-empty |
| **Confidence** | Verified |
| **Tables** | [POLICY_PERIOD](database-tables.md#policy_period) |
| **SQL** | [SQL-088](sql/SQL-088-saif-business-policy-core.md) |
| **Source** | `Business\SAIF.Business.Policy.Core\iPolicyPeriod.vb:74-82` |

---

## BR-005: Experience-rating base periods are those whose begin date

| Field | Value |
| --- | --- |
| **Statement** | Experience-rating base periods are those whose begin date falls in the window from 57 months before the anniversary rating date up to 3 years after it |
| **Trigger** | Base-period selection |
| **Enforcement** | `iPolicyPeriodExtensions.BasePeriods` |
| **Outcome** | Filtered period set |
| **Confidence** | Verified |
| **Tables** | [POLICY_PERIOD](database-tables.md#policy_period) |
| **SQL** | [SQL-088](sql/SQL-088-saif-business-policy-core.md) |
| **Source** | `Business\SAIF.Business.Policy.Core\iPolicyPeriod.vb:114-128` |

---

## BR-006: Ownership information is required for all entity types

| Field | Value |
| --- | --- |
| **Statement** | Ownership information is required for all entity types except political subdivisions, associations and labor unions |
| **Trigger** | Ownership validation |
| **Enforcement** | `clsEntityType.IsOwnershipRequired` |
| **Outcome** | Boolean requirement flag |
| **Confidence** | Verified |
| **Tables** | [ENTITY_CODE](database-tables.md#entity_code) |
| **SQL** | [SQL-058](sql/SQL-058-saif-business-policy-core.md), [SQL-059](sql/SQL-059-saif-business-policy-core.md) |
| **Source** | `Business\SAIF.Business.Policy.Core\clsEntityType.vb:308-333` |

---

## BR-007: Sole proprietors require exactly one owner; partnerships, limited

| Field | Value |
| --- | --- |
| **Statement** | Sole proprietors require exactly one owner; partnerships, limited partnerships, LLPs, joint ventures and their construction/landscaping variants require two or more; all other ownership-requiring types require one or more |
| **Trigger** | Ownership validation |
| **Enforcement** | `clsEntityType.OwnersRequired` |
| **Outcome** | `RequiredNumberOfOwners` value |
| **Confidence** | Verified |
| **Tables** | [ENTITY_CODE](database-tables.md#entity_code) |
| **SQL** | [SQL-058](sql/SQL-058-saif-business-policy-core.md), [SQL-059](sql/SQL-059-saif-business-policy-core.md) |
| **Source** | `Business\SAIF.Business.Policy.Core\clsEntityType.vb:336-352` |

---

## BR-008: For the Guidewire path, joint ventures require one

| Field | Value |
| --- | --- |
| **Statement** | For the Guidewire path, joint ventures require one or more owners rather than two or more |
| **Trigger** | Ownership validation (Guidewire) |
| **Enforcement** | `clsEntityType.OwnersRequiredForGw` |
| **Outcome** | `RequiredNumberOfOwners` value |
| **Confidence** | Verified |
| **Tables** | [ENTITY_CODE](database-tables.md#entity_code) |
| **SQL** | [SQL-058](sql/SQL-058-saif-business-policy-core.md), [SQL-059](sql/SQL-059-saif-business-policy-core.md) |
| **Source** | `Business\SAIF.Business.Policy.Core\clsEntityType.vb:355-368` |

---

## BR-009: A cancellation reason override must carry a valid

| Field | Value |
| --- | --- |
| **Statement** | A cancellation reason override must carry a valid cancellation sequence number |
| **Trigger** | Save/validate override |
| **Enforcement** | `clsCancelReasonOverride rule clsCancelReasonOverride.CancellationSeqNum` |
| **Outcome** | Error "Error: Invalid CancellationSeqNum." |
| **Confidence** | Verified |
| **Tables** | [CANCEL_REASON_OVERRIDE](database-tables.md#cancel_reason_override), [CANCELLATION](database-tables.md#cancellation), [CANCEL_REASON_CODE](database-tables.md#cancel_reason_code), [CARRIER_CHANGE_REASON_CODE](database-tables.md#carrier_change_reason_code), [CARRIER_CODE](database-tables.md#carrier_code) |
| **SQL** | [SQL-026](sql/SQL-026-saif-business-policy-core.md), [SQL-049](sql/SQL-049-saif-business-policy-core.md), [SQL-050](sql/SQL-050-saif-business-policy-core.md), [SQL-051](sql/SQL-051-saif-business-policy-core.md), [SQL-052](sql/SQL-052-saif-business-policy-core.md), [SQL-053](sql/SQL-053-saif-business-policy-core.md) |
| **Source** | `Business\SAIF.Business.Policy.Core\clsCancelReasonOverride.vb:307-314` |

---

## BR-010: A policy's period history is the union of

| Field | Value |
| --- | --- |
| **Statement** | A policy's period history is the union of modern (WCIS) and legacy (non-WCIS) periods, ordered by effective date and linked into a chain |
| **Trigger** | Period retrieval |
| **Enforcement** | `clsPolicyPeriodBaseCollection.GetPolicyPeriods` |
| **Outcome** | Single unified, linked timeline |
| **Confidence** | Verified |
| **Tables** | [DUAL](database-tables.md#dual), [POLICY_PERIOD_MASTER](database-tables.md#policy_period_master), [POLICY_PERIOD_NON_WCIS](database-tables.md#policy_period_non_wcis), [POLICY_PERIOD](database-tables.md#policy_period) |
| **SQL** | [SQL-012](sql/SQL-012-saif-business-policy-core.md), [SQL-033](sql/SQL-033-saif-business-policy-core.md), [SQL-061](sql/SQL-061-saif-business-policy-core.md), [SQL-062](sql/SQL-062-saif-business-policy-core.md), [SQL-063](sql/SQL-063-saif-business-policy-core.md), [SQL-078](sql/SQL-078-saif-business-policy-core.md), [SQL-079](sql/SQL-079-saif-business-policy-core.md), [SQL-080](sql/SQL-080-saif-business-policy-core.md), [SQL-081](sql/SQL-081-saif-business-policy-core.md), [SQL-082](sql/SQL-082-saif-business-policy-core.md), [SQL-083](sql/SQL-083-saif-business-policy-core.md), [SQL-088](sql/SQL-088-saif-business-policy-core.md), [SQL-091](sql/SQL-091-saif-business-policy-core.md), [SQL-134](sql/SQL-134-saif-business-policy-core.md), [SQL-155](sql/SQL-155-saif-business-policy-core.md) |
| **Source** | `Business\SAIF.Business.Policy.Core\clsPolicyPeriodBaseCollection.vb:332-341` |

---

## BR-011: Association-based period retrieval uses a different predicate per

| Field | Value |
| --- | --- |
| **Statement** | Association-based period retrieval uses a different predicate per association type: relationship-policy match for leasing company / state agency / sub-account / wrapup; rate-account match for experience combination; a `POLICY_RELATIONSHIP` union for manual affiliation and manual wrapup |
| **Trigger** | Association-type retrieval |
| **Enforcement** | `Criteria.ConfigureAssociationTypeRetrieval` |
| **Outcome** | Association-appropriate result set |
| **Confidence** | Verified |
| **Tables** | [POLICY_PERIOD](database-tables.md#policy_period) |
| **SQL** | [SQL-088](sql/SQL-088-saif-business-policy-core.md) |
| **Source** | `Business\SAIF.Business.Policy.Core\clsPolicyPeriodCollection.vb:392-420` |

---

## BR-012: An association type outside the supported set is

| Field | Value |
| --- | --- |
| **Statement** | An association type outside the supported set is rejected |
| **Trigger** | Association-type retrieval |
| **Enforcement** | `Criteria.ConfigureAssociationTypeRetrieval` |
| **Outcome** | `ApplicationException` "Unsupported association type encountered when retrieving policy periods" |
| **Confidence** | Verified |
| **Tables** | [POLICY_PERIOD](database-tables.md#policy_period) |
| **SQL** | [SQL-088](sql/SQL-088-saif-business-policy-core.md) |
| **Source** | `Business\SAIF.Business.Policy.Core\clsPolicyPeriodCollection.vb:392-419` |

---

## BR-013: Standard premium is sourced from WCIS for WCIS

| Field | Value |
| --- | --- |
| **Statement** | Standard premium is sourced from WCIS for WCIS periods and from the AR/WINS query for AR and WINS periods; any other financial system yields zero |
| **Trigger** | Premium calculation |
| **Enforcement** | `clsPolicyPeriodBase.GetStandardPremium` |
| **Outcome** | Premium amount or `0` |
| **Confidence** | Verified |
| **Tables** | [NON_WCIS_STAT_TRANS](database-tables.md#non_wcis_stat_trans) |
| **SQL** | [SQL-061](sql/SQL-061-saif-business-policy-core.md), [SQL-062](sql/SQL-062-saif-business-policy-core.md), [SQL-078](sql/SQL-078-saif-business-policy-core.md), [SQL-079](sql/SQL-079-saif-business-policy-core.md), [SQL-080](sql/SQL-080-saif-business-policy-core.md), [SQL-081](sql/SQL-081-saif-business-policy-core.md), [SQL-082](sql/SQL-082-saif-business-policy-core.md), [SQL-083](sql/SQL-083-saif-business-policy-core.md), [SQL-084](sql/SQL-084-saif-business-policy-core.md), [SQL-085](sql/SQL-085-saif-business-policy-core.md), [SQL-086](sql/SQL-086-saif-business-policy-core.md), [SQL-087](sql/SQL-087-saif-business-policy-core.md) |
| **Source** | `Business\SAIF.Business.Policy.Core\clsPolicyPeriodBase.vb:568-581` |

---

## BR-014: A modern policy period is considered issued when

| Field | Value |
| --- | --- |
| **Statement** | A modern policy period is considered issued when the WCIS information page has been printed (flag `"Y"`) |
| **Trigger** | Issuance check |
| **Enforcement** | `clsPolicyPeriod.IsIssued → WCISInquiry.IsInformationPagePrinted` |
| **Outcome** | Boolean |
| **Confidence** | Verified |
| **SQL** | [SQL-078](sql/SQL-078-saif-business-policy-core.md), [SQL-079](sql/SQL-079-saif-business-policy-core.md), [SQL-080](sql/SQL-080-saif-business-policy-core.md), [SQL-081](sql/SQL-081-saif-business-policy-core.md), [SQL-082](sql/SQL-082-saif-business-policy-core.md), [SQL-083](sql/SQL-083-saif-business-policy-core.md) |
| **Source** | `Business\SAIF.Business.Policy.Core\clsPolicyPeriod.vb:344-351` |

---

## BR-015: A legacy policy period is never reported as

| Field | Value |
| --- | --- |
| **Statement** | A legacy policy period is never reported as issued |
| **Trigger** | Issuance check |
| **Enforcement** | `clsLegacyPolicyPeriod.IsIssued` |
| **Outcome** | Always `False` |
| **Confidence** | Verified |
| **SQL** | [SQL-061](sql/SQL-061-saif-business-policy-core.md), [SQL-062](sql/SQL-062-saif-business-policy-core.md) |
| **Source** | `Business\SAIF.Business.Policy.Core\clsLegacyPolicyPeriod.vb:186-192` |

---

## BR-016: Coverage-bound status is sourced from WCIS for modern

| Field | Value |
| --- | --- |
| **Statement** | Coverage-bound status is sourced from WCIS for modern periods; period types that do not override it are not bound |
| **Trigger** | Coverage-bound check |
| **Enforcement** | `clsPolicyPeriod.IsCoverageBound, clsPolicyPeriodBase.IsCoverageBound` |
| **Outcome** | Boolean |
| **Confidence** | Verified |
| **SQL** | [SQL-078](sql/SQL-078-saif-business-policy-core.md), [SQL-079](sql/SQL-079-saif-business-policy-core.md), [SQL-080](sql/SQL-080-saif-business-policy-core.md), [SQL-081](sql/SQL-081-saif-business-policy-core.md), [SQL-082](sql/SQL-082-saif-business-policy-core.md), [SQL-083](sql/SQL-083-saif-business-policy-core.md) |
| **Source** | `Business\SAIF.Business.Policy.Core\clsPolicyPeriod.vb:228-234` |

---

## BR-017: A location is active as of a date

| Field | Value |
| --- | --- |
| **Statement** | A location is active as of a date when its effective date is on or before that date and its expiration date is either unset or after that date |
| **Trigger** | Location filtering |
| **Enforcement** | `clsPolicyLocationCollection.Active` |
| **Outcome** | Filtered location set |
| **Confidence** | Verified |
| **Tables** | [DUAL](database-tables.md#dual), [LOCATION](database-tables.md#location), [CONTACT](database-tables.md#contact), [LOCATION_VIEW](database-tables.md#location_view) |
| **SQL** | [SQL-008](sql/SQL-008-saif-business-policy-core.md), [SQL-009](sql/SQL-009-saif-business-policy-core.md), [SQL-030](sql/SQL-030-saif-business-policy-core.md), [SQL-064](sql/SQL-064-saif-business-policy-core.md), [SQL-065](sql/SQL-065-saif-business-policy-core.md), [SQL-075](sql/SQL-075-saif-business-policy-core.md), [SQL-076](sql/SQL-076-saif-business-policy-core.md), [SQL-077](sql/SQL-077-saif-business-policy-core.md), [SQL-129](sql/SQL-129-saif-business-policy-core.md), [SQL-130](sql/SQL-130-saif-business-policy-core.md), [SQL-131](sql/SQL-131-saif-business-policy-core.md), [SQL-152](sql/SQL-152-saif-business-policy-core.md) |
| **Source** | `Business\SAIF.Business.Policy.Core\clsPolicyLocationCollection.vb:498-500` |

---

## BR-018: Summary locations are active locations of type Business

| Field | Value |
| --- | --- |
| **Statement** | Summary locations are active locations of type Business, Audit, Policy or Third-Party Manager |
| **Trigger** | Location filtering |
| **Enforcement** | `clsPolicyLocationCollection.SummaryLocations` |
| **Outcome** | Filtered location set |
| **Confidence** | Verified |
| **Tables** | [CONTACT](database-tables.md#contact), [LOCATION](database-tables.md#location), [LOCATION_VIEW](database-tables.md#location_view) |
| **SQL** | [SQL-075](sql/SQL-075-saif-business-policy-core.md), [SQL-076](sql/SQL-076-saif-business-policy-core.md), [SQL-077](sql/SQL-077-saif-business-policy-core.md), [SQL-131](sql/SQL-131-saif-business-policy-core.md) |
| **Source** | `Business\SAIF.Business.Policy.Core\clsPolicyLocationCollection.vb:483-486` |

---

## BR-019: Only location types flagged PolicyLocationFlag = "Y" are

| Field | Value |
| --- | --- |
| **Statement** | Only location types flagged `PolicyLocationFlag = "Y"` are displayed as policy locations |
| **Trigger** | Location filtering |
| **Enforcement** | `clsPolicyLocationCollection.DisplayPolicyLocations` |
| **Outcome** | Filtered location set |
| **Confidence** | Verified |
| **Tables** | [LOCATION_CODE](database-tables.md#location_code), [LOCATION](database-tables.md#location) |
| **SQL** | [SQL-068](sql/SQL-068-saif-business-policy-core.md), [SQL-069](sql/SQL-069-saif-business-policy-core.md), [SQL-077](sql/SQL-077-saif-business-policy-core.md) |
| **Source** | `Business\SAIF.Business.Policy.Core\clsPolicyLocationCollection.vb:508-510` |

---

## BR-020: When masking is requested, policyholder names, contact identity/contact-method

| Field | Value |
| --- | --- |
| **Statement** | When masking is requested, policyholder names, contact identity/contact-method fields and location address/contact fields are replaced with standard masking placeholders |
| **Trigger** | Retrieval with `MaskData = True` |
| **Enforcement** | `Fill in clsPolicy, clsLocationContact, clsPolicyLocation criteria` |
| **Outcome** | Masked values from `clsConstants.DataMaskingConstants` |
| **Confidence** | Verified |
| **Tables** | [CONTACT](database-tables.md#contact), [CANCELLATION](database-tables.md#cancellation), [POLICY_PERIOD_MASTER](database-tables.md#policy_period_master), [BUSINESS](database-tables.md#business), [POLICY](database-tables.md#policy), [LOCATION](database-tables.md#location), [LOCATION_VIEW](database-tables.md#location_view) |
| **SQL** | [SQL-066](sql/SQL-066-saif-business-policy-core.md), [SQL-067](sql/SQL-067-saif-business-policy-core.md), [SQL-070](sql/SQL-070-saif-business-policy-core.md), [SQL-071](sql/SQL-071-saif-business-policy-core.md), [SQL-072](sql/SQL-072-saif-business-policy-core.md), [SQL-073](sql/SQL-073-saif-business-policy-core.md), [SQL-074](sql/SQL-074-saif-business-policy-core.md), [SQL-075](sql/SQL-075-saif-business-policy-core.md), [SQL-076](sql/SQL-076-saif-business-policy-core.md), [SQL-131](sql/SQL-131-saif-business-policy-core.md) |
| **Source** | `Business\SAIF.Business.Policy.Core\clsPolicy.vb:1021-1028` |

---

## BR-021: Employers-liability limits may be retrieved by statistical code

| Field | Value |
| --- | --- |
| **Statement** | Employers-liability limits may be retrieved by statistical code, by explicit limit values, or by the standard-limits flag |
| **Trigger** | Limits retrieval |
| **Enforcement** | `clsEmployerLiabilityLimits.Criteria.RetrieveSQL` |
| **Outcome** | Predicate selected per `RetrieveTypes` |
| **Confidence** | Verified |
| **Tables** | [EMPLOYERS_LIABILITY_LIMITS](database-tables.md#employers_liability_limits), [EMPLOYERS_LIABILITY_FACTORS](database-tables.md#employers_liability_factors) |
| **SQL** | [SQL-056](sql/SQL-056-saif-business-policy-core.md), [SQL-057](sql/SQL-057-saif-business-policy-core.md) |
| **Source** | `Business\SAIF.Business.Policy.Core\clsEmployerLiabilityLimits.vb:598-612` |

---

## BR-022: A policy period must have a non-zero policy

| Field | Value |
| --- | --- |
| **Statement** | A policy period must have a non-zero policy number |
| **Trigger** | Validation on save |
| **Enforcement** | `clsPolicyPeriodBase rule ValidPolicyNumber (PolicyNumber <> 0)` |
| **Outcome** | Error "Error: Policy number is required." |
| **Confidence** | Verified |
| **Tables** | [NON_WCIS_STAT_TRANS](database-tables.md#non_wcis_stat_trans) |
| **SQL** | [SQL-084](sql/SQL-084-saif-business-policy-core.md), [SQL-085](sql/SQL-085-saif-business-policy-core.md), [SQL-086](sql/SQL-086-saif-business-policy-core.md), [SQL-087](sql/SQL-087-saif-business-policy-core.md) |
| **Source** | `Business\SAIF.Business.Policy.Core\clsPolicyPeriodBase.vb:781-784` |

---

## BR-023: A policy period must have an effective date

| Field | Value |
| --- | --- |
| **Statement** | A policy period must have an effective date |
| **Trigger** | Validation on save |
| **Enforcement** | `clsPolicyPeriodBase rule ValidEffectiveDate (EffectiveDate <> Date.MinValue)` |
| **Outcome** | Error "Error: Effective date is required." |
| **Confidence** | Verified |
| **Tables** | [NON_WCIS_STAT_TRANS](database-tables.md#non_wcis_stat_trans) |
| **SQL** | [SQL-084](sql/SQL-084-saif-business-policy-core.md), [SQL-085](sql/SQL-085-saif-business-policy-core.md), [SQL-086](sql/SQL-086-saif-business-policy-core.md), [SQL-087](sql/SQL-087-saif-business-policy-core.md) |
| **Source** | `Business\SAIF.Business.Policy.Core\clsPolicyPeriodBase.vb:786-789` |

---

## BR-024: Employers-liability limits must carry a valid statistical code

| Field | Value |
| --- | --- |
| **Statement** | Employers-liability limits must carry a valid statistical code |
| **Trigger** | Validation on save |
| **Enforcement** | `clsEmployerLiabilityLimits rule clsEmployersLiabilityLimit01 (field StatCode)` |
| **Outcome** | Error "Error: Invalid Employers Liability Limits" |
| **Confidence** | Verified |
| **SQL** | [SQL-056](sql/SQL-056-saif-business-policy-core.md) |
| **Source** | `Business\SAIF.Business.Policy.Core\clsEmployerLiabilityLimits.vb:387-397` |

---

## BR-025: Per-period employers-liability limits must carry a valid statistical

| Field | Value |
| --- | --- |
| **Statement** | Per-period employers-liability limits must carry a valid statistical code |
| **Trigger** | Validation on save |
| **Enforcement** | `clsPolicyPeriodEmployerLiabilityLimits rule ValidStatCode` |
| **Outcome** | Error "Error: Invalid Limits" |
| **Confidence** | Verified |
| **Tables** | [DUAL](database-tables.md#dual), [POLICY_PERIOD_EMP_LIAB](database-tables.md#policy_period_emp_liab) |
| **SQL** | [SQL-010](sql/SQL-010-saif-business-policy-core.md), [SQL-011](sql/SQL-011-saif-business-policy-core.md), [SQL-031](sql/SQL-031-saif-business-policy-core.md), [SQL-032](sql/SQL-032-saif-business-policy-core.md), [SQL-089](sql/SQL-089-saif-business-policy-core.md), [SQL-090](sql/SQL-090-saif-business-policy-core.md), [SQL-132](sql/SQL-132-saif-business-policy-core.md), [SQL-133](sql/SQL-133-saif-business-policy-core.md), [SQL-153](sql/SQL-153-saif-business-policy-core.md), [SQL-154](sql/SQL-154-saif-business-policy-core.md) |
| **Source** | `Business\SAIF.Business.Policy.Core\clsPolicyPeriodEmployerLiabilityLimits.vb:474-483` |

---

## BR-026: An entity type must have a valid code

| Field | Value |
| --- | --- |
| **Statement** | An entity type must have a valid code |
| **Trigger** | Validation on save |
| **Enforcement** | `clsEntityType rule clsEntityType01` |
| **Outcome** | Error "Error: Invalid Code" |
| **Confidence** | Verified |
| **Tables** | [ENTITY_CODE](database-tables.md#entity_code) |
| **SQL** | [SQL-058](sql/SQL-058-saif-business-policy-core.md) |
| **Source** | `Business\SAIF.Business.Policy.Core\clsEntityType.vb:563-570` |

---

## BR-027: A policy status code must be non-empty

| Field | Value |
| --- | --- |
| **Statement** | A policy status code must be non-empty |
| **Trigger** | Validation on save |
| **Enforcement** | `clsPolicyStatusCode rule clsPolicyStatusCode01 (Code.Trim.Length > 0)` |
| **Outcome** | Error "Error: Policy status code not found." |
| **Confidence** | Verified |
| **Tables** | [POLICY_STATUS_CODE](database-tables.md#policy_status_code) |
| **SQL** | [SQL-094](sql/SQL-094-saif-business-policy-core.md), [SQL-095](sql/SQL-095-saif-business-policy-core.md) |
| **Source** | `Business\SAIF.Business.Policy.Core\clsPolicyStatusCode.vb:300-303` |

---

## BR-028: A policy in application status raises a warning

| Field | Value |
| --- | --- |
| **Statement** | A policy in application status raises a warning rather than an error |
| **Trigger** | Validation on save |
| **Enforcement** | `clsPolicyStatusCode rule clsPolicyStatusCode02 (RuleType.Warning, returns Not IsApplication)` |
| **Outcome** | Warning "Warning: Is application status" |
| **Confidence** | Verified |
| **Tables** | [POLICY_STATUS_CODE](database-tables.md#policy_status_code) |
| **SQL** | [SQL-094](sql/SQL-094-saif-business-policy-core.md), [SQL-095](sql/SQL-095-saif-business-policy-core.md) |
| **Source** | `Business\SAIF.Business.Policy.Core\clsPolicyStatusCode.vb:305-308` |

---

## BR-029: SAIF's own carrier identity is represented by fixed

| Field | Value |
| --- | --- |
| **Statement** | SAIF's own carrier identity is represented by fixed carrier codes: unknown `"0"`, SAIF `"1"`, SAIF ARP `"2"`, SAIF quote `"888"` |
| **Trigger** | Carrier comparison |
| **Enforcement** | `clsInsuranceCarrier constants` |
| **Outcome** | Deterministic carrier classification |
| **Confidence** | Verified |
| **Tables** | [DUAL](database-tables.md#dual), [CARRIER_CODE](database-tables.md#carrier_code) |
| **SQL** | [SQL-007](sql/SQL-007-saif-business-policy-core.md), [SQL-029](sql/SQL-029-saif-business-policy-core.md), [SQL-060](sql/SQL-060-saif-business-policy-core.md), [SQL-128](sql/SQL-128-saif-business-policy-core.md), [SQL-151](sql/SQL-151-saif-business-policy-core.md) |
| **Source** | `Business\SAIF.Business.Policy.Core\clsInsuranceCarrier.vb:54-57` |

---

## BR-030: The service centre office is identified by office

| Field | Value |
| --- | --- |
| **Statement** | The service centre office is identified by office code `"SERV"` |
| **Trigger** | Office comparison |
| **Enforcement** | `clsSAIFOffice.ServiceCenterOfficeCode` |
| **Outcome** | Deterministic office classification |
| **Confidence** | Verified |
| **Tables** | [DUAL](database-tables.md#dual), [OFFICE_CODE](database-tables.md#office_code) |
| **SQL** | [SQL-018](sql/SQL-018-saif-business-policy-core.md), [SQL-019](sql/SQL-019-saif-business-policy-core.md), [SQL-040](sql/SQL-040-saif-business-policy-core.md), [SQL-041](sql/SQL-041-saif-business-policy-core.md), [SQL-102](sql/SQL-102-saif-business-policy-core.md), [SQL-103](sql/SQL-103-saif-business-policy-core.md), [SQL-141](sql/SQL-141-saif-business-policy-core.md), [SQL-142](sql/SQL-142-saif-business-policy-core.md), [SQL-162](sql/SQL-162-saif-business-policy-core.md), [SQL-163](sql/SQL-163-saif-business-policy-core.md) |
| **Source** | `Business\SAIF.Business.Policy.Core\clsSAIFOffice.vb:54,154-157` |

---

## BR-031: A policy period is flat-cancelled when its effective

| Field | Value |
| --- | --- |
| **Statement** | A policy period is flat-cancelled when its effective date equals its cancel date, and a flat-cancelled period has no coverage |
| **Trigger** | Coverage determination |
| **Enforcement** | `clsPolicyPeriodBase.IsFlatCancelled / HasCoverage` |
| **Outcome** | Boolean coverage flag |
| **Confidence** | Verified |
| **SQL** | [SQL-078](sql/SQL-078-saif-business-policy-core.md), [SQL-079](sql/SQL-079-saif-business-policy-core.md), [SQL-080](sql/SQL-080-saif-business-policy-core.md), [SQL-081](sql/SQL-081-saif-business-policy-core.md), [SQL-082](sql/SQL-082-saif-business-policy-core.md), [SQL-083](sql/SQL-083-saif-business-policy-core.md) |
| **Source** | `Business\SAIF.Business.Policy.Core\clsPolicyPeriodBase.vb:370-385` |

---

## BR-032: Preliminary audit is required when the WCIS edit

| Field | Value |
| --- | --- |
| **Statement** | Preliminary audit is required when the WCIS edit procedure returns flag `"1"`; regional-office and information-page checks treat `"Y"` as true |
| **Trigger** | WCIS flag inquiry |
| **Enforcement** | `WCISInquiry.IsPreliminaryAuditRequired, IsRegionalOfficePolicy, IsInformationPagePrinted` |
| **Outcome** | Boolean |
| **Confidence** | Verified |
| **Tables** | [SUB_CONSTANTS](database-tables.md#sub_constants), [POLICY_PERIOD](database-tables.md#policy_period), [POLICY](database-tables.md#policy), [WCIS_CONSTANTS](database-tables.md#wcis_constants) |
| **SQL** | [SQL-078](sql/SQL-078-saif-business-policy-core.md), [SQL-079](sql/SQL-079-saif-business-policy-core.md), [SQL-080](sql/SQL-080-saif-business-policy-core.md), [SQL-081](sql/SQL-081-saif-business-policy-core.md), [SQL-082](sql/SQL-082-saif-business-policy-core.md), [SQL-083](sql/SQL-083-saif-business-policy-core.md), [SQL-106](sql/SQL-106-saif-business-policy-core.md), [SQL-107](sql/SQL-107-saif-business-policy-core.md), [SQL-108](sql/SQL-108-saif-business-policy-core.md), [SQL-109](sql/SQL-109-saif-business-policy-core.md), [SQL-110](sql/SQL-110-saif-business-policy-core.md), [SQL-111](sql/SQL-111-saif-business-policy-core.md), [SQL-112](sql/SQL-112-saif-business-policy-core.md), [SQL-113](sql/SQL-113-saif-business-policy-core.md), [SQL-114](sql/SQL-114-saif-business-policy-core.md), [SQL-115](sql/SQL-115-saif-business-policy-core.md), [SQL-116](sql/SQL-116-saif-business-policy-core.md), [SQL-117](sql/SQL-117-saif-business-policy-core.md), [SQL-118](sql/SQL-118-saif-business-policy-core.md), [SQL-119](sql/SQL-119-saif-business-policy-core.md), [SQL-120](sql/SQL-120-saif-business-policy-core.md), [SQL-121](sql/SQL-121-saif-business-policy-core.md) |
| **Source** | `Business\SAIF.Business.Policy.Core\WCISInquiry.vb:246-372` |

---

## BR-033: New sequence values for writable entities are obtained

| Field | Value |
| --- | --- |
| **Statement** | New sequence values for writable entities are obtained from Oracle sequences via a `SELECT … FROM DUAL` next-value query before insert |
| **Trigger** | Insert lifecycle |
| **Enforcement** | `Criteria.CreateSQL in 21 criteria classes` |
| **Outcome** | Assigned key value |
| **Confidence** | Verified |
| **Tables** | [DUAL](database-tables.md#dual), [CANCEL_REASON_CODE](database-tables.md#cancel_reason_code), [CANCELLATION](database-tables.md#cancellation), [CANCEL_REASON_OVERRIDE](database-tables.md#cancel_reason_override), [COUNTY](database-tables.md#county), [CARRIER_CODE](database-tables.md#carrier_code), [POLICY_PERIOD_EMP_LIAB](database-tables.md#policy_period_emp_liab), [TEAM_FUNCTION_CODE](database-tables.md#team_function_code), [POLICY_TEAM_FUNCTION](database-tables.md#policy_team_function), [PRIOR_COVERAGE](database-tables.md#prior_coverage), [OFFICE_CODE](database-tables.md#office_code), [WCIS_EMPLOYEE](database-tables.md#wcis_employee), [CARRIER_CHANGE_REASON_CODE](database-tables.md#carrier_change_reason_code) |
| **SQL** | [SQL-001](sql/SQL-001-saif-business-policy-core.md), [SQL-002](sql/SQL-002-saif-business-policy-core.md), [SQL-003](sql/SQL-003-saif-business-policy-core.md), [SQL-004](sql/SQL-004-saif-business-policy-core.md), [SQL-005](sql/SQL-005-saif-business-policy-core.md), [SQL-006](sql/SQL-006-saif-business-policy-core.md), [SQL-007](sql/SQL-007-saif-business-policy-core.md), [SQL-010](sql/SQL-010-saif-business-policy-core.md), [SQL-011](sql/SQL-011-saif-business-policy-core.md), [SQL-013](sql/SQL-013-saif-business-policy-core.md), [SQL-014](sql/SQL-014-saif-business-policy-core.md), [SQL-015](sql/SQL-015-saif-business-policy-core.md), [SQL-016](sql/SQL-016-saif-business-policy-core.md), [SQL-017](sql/SQL-017-saif-business-policy-core.md), [SQL-018](sql/SQL-018-saif-business-policy-core.md), [SQL-019](sql/SQL-019-saif-business-policy-core.md), [SQL-020](sql/SQL-020-saif-business-policy-core.md), [SQL-021](sql/SQL-021-saif-business-policy-core.md), [SQL-022](sql/SQL-022-saif-business-policy-core.md), [SQL-023](sql/SQL-023-saif-business-policy-core.md), [SQL-024](sql/SQL-024-saif-business-policy-core.md), [SQL-025](sql/SQL-025-saif-business-policy-core.md), [SQL-026](sql/SQL-026-saif-business-policy-core.md), [SQL-027](sql/SQL-027-saif-business-policy-core.md), [SQL-028](sql/SQL-028-saif-business-policy-core.md), [SQL-029](sql/SQL-029-saif-business-policy-core.md), [SQL-031](sql/SQL-031-saif-business-policy-core.md), [SQL-032](sql/SQL-032-saif-business-policy-core.md), [SQL-034](sql/SQL-034-saif-business-policy-core.md), [SQL-035](sql/SQL-035-saif-business-policy-core.md), [SQL-036](sql/SQL-036-saif-business-policy-core.md), [SQL-037](sql/SQL-037-saif-business-policy-core.md), [SQL-038](sql/SQL-038-saif-business-policy-core.md), [SQL-039](sql/SQL-039-saif-business-policy-core.md), [SQL-040](sql/SQL-040-saif-business-policy-core.md), [SQL-041](sql/SQL-041-saif-business-policy-core.md), [SQL-042](sql/SQL-042-saif-business-policy-core.md), [SQL-043](sql/SQL-043-saif-business-policy-core.md), [SQL-045](sql/SQL-045-saif-business-policy-core.md), [SQL-046](sql/SQL-046-saif-business-policy-core.md), [SQL-047](sql/SQL-047-saif-business-policy-core.md), [SQL-048](sql/SQL-048-saif-business-policy-core.md), [SQL-049](sql/SQL-049-saif-business-policy-core.md), [SQL-050](sql/SQL-050-saif-business-policy-core.md), [SQL-051](sql/SQL-051-saif-business-policy-core.md), [SQL-052](sql/SQL-052-saif-business-policy-core.md), [SQL-053](sql/SQL-053-saif-business-policy-core.md), [SQL-054](sql/SQL-054-saif-business-policy-core.md), [SQL-055](sql/SQL-055-saif-business-policy-core.md), [SQL-060](sql/SQL-060-saif-business-policy-core.md), [SQL-089](sql/SQL-089-saif-business-policy-core.md), [SQL-090](sql/SQL-090-saif-business-policy-core.md), [SQL-096](sql/SQL-096-saif-business-policy-core.md), [SQL-097](sql/SQL-097-saif-business-policy-core.md), [SQL-098](sql/SQL-098-saif-business-policy-core.md), [SQL-099](sql/SQL-099-saif-business-policy-core.md), [SQL-100](sql/SQL-100-saif-business-policy-core.md), [SQL-101](sql/SQL-101-saif-business-policy-core.md), [SQL-102](sql/SQL-102-saif-business-policy-core.md), [SQL-103](sql/SQL-103-saif-business-policy-core.md), [SQL-104](sql/SQL-104-saif-business-policy-core.md), [SQL-105](sql/SQL-105-saif-business-policy-core.md), [SQL-122](sql/SQL-122-saif-business-policy-core.md), [SQL-123](sql/SQL-123-saif-business-policy-core.md), [SQL-124](sql/SQL-124-saif-business-policy-core.md), [SQL-125](sql/SQL-125-saif-business-policy-core.md), [SQL-126](sql/SQL-126-saif-business-policy-core.md), [SQL-127](sql/SQL-127-saif-business-policy-core.md), [SQL-128](sql/SQL-128-saif-business-policy-core.md), [SQL-132](sql/SQL-132-saif-business-policy-core.md), [SQL-133](sql/SQL-133-saif-business-policy-core.md), [SQL-135](sql/SQL-135-saif-business-policy-core.md), [SQL-136](sql/SQL-136-saif-business-policy-core.md), [SQL-137](sql/SQL-137-saif-business-policy-core.md), [SQL-138](sql/SQL-138-saif-business-policy-core.md), [SQL-139](sql/SQL-139-saif-business-policy-core.md), [SQL-140](sql/SQL-140-saif-business-policy-core.md), [SQL-141](sql/SQL-141-saif-business-policy-core.md), [SQL-142](sql/SQL-142-saif-business-policy-core.md), [SQL-143](sql/SQL-143-saif-business-policy-core.md), [SQL-144](sql/SQL-144-saif-business-policy-core.md), [SQL-145](sql/SQL-145-saif-business-policy-core.md), [SQL-146](sql/SQL-146-saif-business-policy-core.md), [SQL-147](sql/SQL-147-saif-business-policy-core.md), [SQL-148](sql/SQL-148-saif-business-policy-core.md), [SQL-149](sql/SQL-149-saif-business-policy-core.md), [SQL-150](sql/SQL-150-saif-business-policy-core.md), [SQL-151](sql/SQL-151-saif-business-policy-core.md), [SQL-153](sql/SQL-153-saif-business-policy-core.md), [SQL-154](sql/SQL-154-saif-business-policy-core.md), [SQL-156](sql/SQL-156-saif-business-policy-core.md), [SQL-157](sql/SQL-157-saif-business-policy-core.md), [SQL-158](sql/SQL-158-saif-business-policy-core.md), [SQL-159](sql/SQL-159-saif-business-policy-core.md), [SQL-160](sql/SQL-160-saif-business-policy-core.md), [SQL-161](sql/SQL-161-saif-business-policy-core.md), [SQL-162](sql/SQL-162-saif-business-policy-core.md), [SQL-163](sql/SQL-163-saif-business-policy-core.md), [SQL-164](sql/SQL-164-saif-business-policy-core.md), [SQL-165](sql/SQL-165-saif-business-policy-core.md) |
| **Source** | `Business\SAIF.Business.Policy.Core\clsCancellationReason.vb:877-880` (pattern repeated across 21 criteria classes' `CreateSQL`) |

## Inherited business rules

Rules in this section originate from BOF framework base classes or services provided by dependency framework libraries.

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

#### INH-001: Framework rules manager evaluates named rules

| Field | Value |
| --- | --- |
| **Statement** | Each `clsBusinessBase`-derived object owns a `clsRulesManager` that evaluates registered named rules and records broken-rule state.† |
| **Trigger** | Domain code calls `Rules.CheckRules(...)` or save-time validation runs. |
| **Enforcement** | `SAIF.Framework.Core` BOF base behavior. |
| **Outcome** | Broken rules are tracked and exposed back to callers and binding consumers. |
| **Origin** | `SAIF.Framework.Core` - `clsBusinessBase` |
| **Source** | Retrieved from indexed dependency documentation via Legends CLI |

---

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

#### INH-002: Collections surface broken-rule state through IDataErrorInfo

| Field | Value |
| --- | --- |
| **Statement** | `clsBusinessCollectionBase` surfaces collection-level broken-rule state through `IDataErrorInfo`, allowing callers to observe child validation failures without bypassing the BOF rules engine.† |
| **Trigger** | Collection validation or save operations encounter one or more broken rules. |
| **Enforcement** | `SAIF.Framework.Core` collection base behavior. |
| **Outcome** | Collection save stops at the first failing child and propagates that child's broken rules.† |
| **Origin** | `SAIF.Framework.Core` - `clsBusinessCollectionBase` |
| **Source** | Retrieved from indexed dependency documentation via Legends CLI |

## Notes
- Stored-procedure-specific rules are documented on the individual procedure pages under `procedures/` because their logic resides in Oracle.

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

> **Note:** Statements marked with `†` are derived from dependency library
> documentation via the Legends CLI.

> **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.Core\clsPolicyPeriodStatus.vb`
- `Business\SAIF.Business.Policy.Core\iPolicyPeriod.vb`
- `Business\SAIF.Business.Policy.Core\clsEntityType.vb`
- `Business\SAIF.Business.Policy.Core\clsPolicyLocationCollection.vb`
- `Business\SAIF.Business.Policy.Core\clsCancelReasonOverride.vb`
- `Business\SAIF.Business.Policy.Core\clsPolicyPeriodBase.vb`
- `Business\SAIF.Business.Policy.Core\clsEmployerLiabilityLimits.vb`
- `Business\SAIF.Business.Policy.Core\WCISInquiry.vb`

