---
title: SAIF.Business.Policy.Group business rules
summary: Enumerated business rules for SAIF.Business.Policy.Group.
status: draft
owner: Technical Writer
last_reviewed: 2026-07-31
library: SAIF.Business.Policy.Group
reference_type: package
---

# SAIF.Business.Policy.Group business rules

This page captures business rules enforced by `SAIF.Business.Policy.Group`.

## BR-001: Group association code is required

| Field | Value |
| --- | --- |
| **Statement** | A group association must have a non-empty group code. |
| **Trigger** | Validation of `clsGroupAssociation` |
| **Enforcement** | `ValidGroupAssociation (clsGroupAssociation.vb:1144-1150), <RuleData("ValidGroupAssociation", "Error: Invalid group.")>` |
| **Outcome** | "Error: Invalid group." |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Policy.Group\clsGroupAssociation.vb:1147-1149` |

---

## BR-002: Group expiration is date-effective

| Field | Value |
| --- | --- |
| **Statement** | A group is considered expired as of a date when it has an expiration date and that date is on or before the as-of date; a group with no expiration date is never expired. |
| **Trigger** | `IsExpired` / `NotExpired` filter |
| **Enforcement** | `clsGroupAssociation.IsExpired (:589), GroupAssociationExtensions.NotExpired (clsGroupAssociationCollection.vb:560)` |
| **Outcome** | Group included in / excluded from the active set |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Policy.Group\clsGroupAssociation.vb:589-593` |

---

## BR-003: Group type derives from stored code

| Field | Value |
| --- | --- |
| **Statement** | Group type is derived from the stored code: `SERV`=Service, `OGSER`=OGSERP, `LGMAP`=LargeGroupMemberAlliance, `PARNT`=Parent, `ENDOR`=Endorsing, `INQUR`=Inquiry; anything else is Unknown/empty. |
| **Trigger** | `GroupType` read or write |
| **Enforcement** | `clsGroupAssociation.ConvertGroupType (:102,121)` |
| **Outcome** | Typed classification |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Policy.Group\clsGroupAssociation.vb:102-132` |

---

## BR-004: SalesPlan excludes listed plan codes

| Field | Value |
| --- | --- |
| **Statement** | The `SalesPlan` filter returns groups whose plan code is **not** in the supplied sales-plan code list. |
| **Trigger** | Collection filtering |
| **Enforcement** | `GroupAssociationExtensions.SalesPlan (clsGroupAssociationCollection.vb:565,570)` |
| **Outcome** | Filtered enumerable (note the negation — the name reads as an inclusion filter but the predicate is `Not ... IsIn(...)`)\* |
| **Confidence** | Inferred |
| **Source** | `Business\SAIF.Business.Policy.Group\clsGroupAssociationCollection.vb:565-571` |

---

## BR-005: Group exposes a placeholder chapter when none exist

| Field | Value |
| --- | --- |
| **Statement** | A group must always expose at least one chapter; when a group has no chapter rows, a placeholder chapter with a blank code is created in memory. |
| **Trigger** | First access to `clsGroupAssociation.Chapters` |
| **Enforcement** | `clsGroupAssociation.vb:601-611` |
| **Outcome** | Placeholder `clsChapter` added |
| **Confidence** | Verified |
| **Source** | `Business\\SAIF.Business.Policy.Group\\clsGroupAssociation.vb` |

---

## BR-006: Chapter activity is bounded by effective dates

| Field | Value |
| --- | --- |
| **Statement** | A chapter is active on a date when the date is on or after its effective date and strictly before its expiration date. |
| **Trigger** | `ActiveChapters` filter |
| **Enforcement** | `ChapterExtensions.ActiveChapters (clsChapterCollection.vb:292)` |
| **Outcome** | Chapter included / excluded |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Policy.Group\clsChapterCollection.vb:288-290` |

---

## BR-007: New chapter seeds key values and starts clean

| Field | Value |
| --- | --- |
| **Statement** | A newly created chapter inherits the group association code and chapter code from its criteria and starts in the clean state. |
| **Trigger** | `clsChapter.Create()` |
| **Enforcement** | `clsChapter.vb:144-150` |
| **Outcome** | `MarkClean()` — new chapter is not dirty until edited |
| **Confidence** | Verified |
| **Source** | `Business\\SAIF.Business.Policy.Group\\clsChapter.vb` |

---

## BR-008: Chapter retrieval is as-of-date effective

| Field | Value |
| --- | --- |
| **Statement** | A chapter is retrieved as of a select date, so only the chapter row effective on that date is returned. |
| **Trigger** | `GetChapter` |
| **Enforcement** | `clsChapter.vb:269, Criteria.New(..., inSelectDate) (:396)` |
| **Outcome** | Date-effective row selection |
| **Confidence** | Verified |
| **Source** | `Business\\SAIF.Business.Policy.Group\\clsChapter.vb` |

---

## BR-009: Insert must affect exactly one row

| Field | Value |
| --- | --- |
| **Statement** | An insert that affects a row count other than 1 is a failure. |
| **Trigger** | `AfterInsert` |
| **Enforcement** | `clsGroupAssociation.vb:781, clsClassSignificance.vb:302, clsGroupUnderwritingCriteria.vb:383, clsPolicyPeriodGroupAssociation.vb:328, clsSignificantClass.vb:290, clsGroupAssociationCollection.vb:199, clsSignificantClassCollection.vb:200` |
| **Outcome** | `AddErrorMessage("InsertError", "Insert Failed")`; object not marked old |
| **Confidence** | Verified |
| **Source** | `Business\\SAIF.Business.Policy.Group\\clsGroupAssociation.vb` |

---

## BR-010: Update must affect exactly one row

| Field | Value |
| --- | --- |
| **Statement** | An update that affects a row count other than 1 indicates database contention. |
| **Trigger** | `AfterUpdate` |
| **Enforcement** | `clsGroupAssociation.vb:869, clsClassSignificance.vb:365, clsGroupUnderwritingCriteria.vb:452, clsPolicyPeriodGroupAssociation.vb:395, clsSignificantClass.vb:348` |
| **Outcome** | `AddErrorMessage("UpdateError", Messages.DBContentionError)` |
| **Confidence** | Verified |
| **Source** | `Business\\SAIF.Business.Policy.Group\\clsGroupAssociation.vb` |

---

## BR-011: Delete must affect exactly one row

| Field | Value |
| --- | --- |
| **Statement** | A delete that affects a row count other than 1 indicates database contention; a successful delete returns the in-memory object to the new state. |
| **Trigger** | `AfterDelete` |
| **Enforcement** | `clsGroupAssociation.vb:719, clsClassSignificance.vb:266, clsGroupUnderwritingCriteria.vb:341, clsPolicyPeriodGroupAssociation.vb:288, clsSignificantClass.vb:257` |
| **Outcome** | `AddErrorMessage("DeleteError", Messages.DBContentionError)` or `MarkNew()` |
| **Confidence** | Verified |
| **Source** | `Business\\SAIF.Business.Policy.Group\\clsGroupAssociation.vb` |

---

## BR-012: Collection persistence reports generic failure messages

| Field | Value |
| --- | --- |
| **Statement** | Collection-level persistence failures report generic messages rather than the framework contention message. |
| **Trigger** | Collection `AfterInsert`/`AfterUpdate`/`AfterDelete` |
| **Enforcement** | `clsGroupAssociationCollection.vb:179,199,251; clsSignificantClassCollection.vb:178,200,265` |
| **Outcome** | `"Insert Failed"` / `"Update Failed"` / `"Delete Failed"` |
| **Confidence** | Verified |
| **Source** | `Business\\SAIF.Business.Policy.Group\\clsGroupAssociationCollection.vb` |

---

## BR-013: Group discount code is required

| Field | Value |
| --- | --- |
| **Statement** | A group discount must reference a non-empty group association code. |
| **Trigger** | Validation of `clsGroupAssociationDiscount` |
| **Enforcement** | `ValidGroupDiscount (clsGroupAssociationDiscount.vb:495-501), <RuleData("ValidGroupDiscount", "Error: Invalid group discount.")>` |
| **Outcome** | "Error: Invalid group discount." |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Policy.Group\clsGroupAssociationDiscount.vb:498-500` |

---

## BR-014: Discount factor returns non-applicable when invalid

| Field | Value |
| --- | --- |
| **Statement** | The adjusted rate factor contributed by a group discount is the stored group discount only when the discount object is valid; otherwise the non-applicable factor is returned. |
| **Trigger** | Rating engine reads `Factor` |
| **Enforcement** | `clsGroupAssociationDiscount.Factor (:133-145)` |
| **Outcome** | `GroupDiscount` or `NonApplicableAdjustedRateFactor` |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Policy.Group\clsGroupAssociationDiscount.vb:133-141` |

---

## BR-015: Pending flag marks a tentative discount

| Field | Value |
| --- | --- |
| **Statement** | A group discount is tentative when its pending flag is set. |
| **Trigger** | `IsTentative` read |
| **Enforcement** | `clsGroupAssociationDiscount.vb:126-130 (PENDING_FLAG column)` |
| **Outcome** | Boolean classification |
| **Confidence** | Verified |
| **Source** | `Business\\SAIF.Business.Policy.Group\\clsGroupAssociationDiscount.vb` |

---

## BR-016: Underwriting flags derive from stored Y/N values

| Field | Value |
| --- | --- |
| **Statement** | Experience-rating-earned and swing-limited status are derived from their persisted flag columns. |
| **Trigger** | `IsExperienceRatingEarned` / `IsSwingLimited` read |
| **Enforcement** | `clsGroupUnderwritingCriteria.vb (ExperienceRatingEarnedFlag, SwingLimitedFlag)` |
| **Outcome** | Boolean classification |
| **Confidence** | Verified |
| **Source** | `Business\\SAIF.Business.Policy.Group\\clsGroupUnderwritingCriteria.vb` |

---

## BR-017: Underwriting criteria requires a group code

| Field | Value |
| --- | --- |
| **Statement** | A group underwriting criteria record must reference a group code with at least one non-blank character. |
| **Trigger** | Validation of `clsGroupUnderwritingCriteria` |
| **Enforcement** | `IsValidGroupCode (clsGroupUnderwritingCriteria.vb:577-583), <RuleData("clsGroupUnderwritingCriteria.IsValidGroupCode", "Error: Group Code is required.")>` |
| **Outcome** | "Error: Group Code is required." |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Policy.Group\clsGroupUnderwritingCriteria.vb:580-583` |

---

## BR-018: Significant class is period-effective

| Field | Value |
| --- | --- |
| **Statement** | A significant class applies to a policy period when the period effective date is on or after the class-significance effective date and strictly before its expiration date. |
| **Trigger** | `PerPolicyPeriod` filter |
| **Enforcement** | `SignificantClassExtensions.PerPolicyPeriod (clsSignificantClassCollection.vb:512)` |
| **Outcome** | Class included / excluded from the period's evaluation |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Policy.Group\clsSignificantClassCollection.vb:508-510` |

---

## BR-019: Include/exclude flag drives significance

| Field | Value |
| --- | --- |
| **Statement** | A class-significance record is an inclusion when its include/exclude flag is `I`; every other value is treated as an exclusion. |
| **Trigger** | `Significance` read |
| **Enforcement** | `clsClassSignificance.Significance property` |
| **Outcome** | `Significances.Included` / `Significances.Excluded` |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Policy.Group\clsClassSignificance.vb:91-97` |

---

## BR-020: Significant-class filters follow significance

| Field | Value |
| --- | --- |
| **Statement** | A significant class is an included class when its class significance is Included, and an excluded class when it is Excluded. |
| **Trigger** | `IncludedClasses` / `ExcludedClasses` filters |
| **Enforcement** | `clsSignificantClass.vb:138-148; clsSignificantClassCollection.vb:513,518` |
| **Outcome** | Filtered enumerables |
| **Confidence** | Verified |
| **Source** | `Business\\SAIF.Business.Policy.Group\\clsSignificantClass.vb` |

---

## BR-021: Writes stamp update date and user

| Field | Value |
| --- | --- |
| **Statement** | Every update and delete of group eligibility, underwriting, significant-class, group and policy-period-group rows stamps the update date and update user (max 30 characters) from the object state. |
| **Trigger** | `BeforeUpdate` / `BeforeDelete` |
| **Enforcement** | `clsClassSignificance.vb:287,350; clsGroupUnderwritingCriteria.vb:369,438; clsSignificantClass.vb:278,336; clsPolicyPeriodGroupAssociation.vb:314,381; clsGroupAssociation.vb:744,832` |
| **Outcome** | Audit columns written |
| **Confidence** | Verified |
| **Source** | `Business\\SAIF.Business.Policy.Group\\clsClassSignificance.vb` |

---

## BR-022: Policy period group membership uses a composite key

| Field | Value |
| --- | --- |
| **Statement** | A policy period's group membership is keyed by policy number plus policy period effective date, and carries the group code, membership effective date, and optional expiration date, termination date, chapter code and membership type code. |
| **Trigger** | Policy-period group link create/retrieve |
| **Enforcement** | `clsPolicyPeriodGroupAssociation.vb:518-540,608-680` |
| **Outcome** | `POLICY_PERIOD_GROUP_ASSOC` row |
| **Confidence** | Verified |
| **Source** | `Business\\SAIF.Business.Policy.Group\\clsPolicyPeriodGroupAssociation.vb` |

---

## BR-023: Chapters and contacts load lazily

| Field | Value |
| --- | --- |
| **Statement** | A group's chapters, and a chapter's contact, are loaded on demand rather than eagerly with the parent object. |
| **Trigger** | First property access |
| **Enforcement** | `clsGroupAssociation.Chapters (:601), clsChapter.Contact` |
| **Outcome** | Deferred database read |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Policy.Group\clsGroupAssociation.vb:601-609` |

---

## Inherited business rules

Rules in this section originate from shared BOF framework behavior and are enforced through inherited base-class logic.

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

#### INH-001: Framework rule execution

| Field | Value |
| --- | --- |
| **Statement** | Inherited BOF business objects execute registered rule handlers through a shared rules manager before callers rely on `IsValid`.† |
| **Trigger** | Property updates, explicit rule checks, and save validation paths.† |
| **Enforcement** | Inherited `clsBusinessBase` / `clsRulesManager` flow.† |
| **Outcome** | Broken-rule state is captured and surfaced back to callers through the BOF validation interfaces.† |
| **Confidence** | Verified |
| **Origin** | `SAIF.Framework.Core` — `clsBusinessBase` |
| **Source** | Retrieved from indexed documentation via Legends CLI |

---

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

#### INH-002: Broken-rule tracking and surfacing

| Field | Value |
| --- | --- |
| **Statement** | Inherited BOF collections surface broken-rule state through `IDataErrorInfo` without requiring callers to inspect each child directly.† |
| **Trigger** | Collection validation or child-save failures.† |
| **Enforcement** | Inherited `clsBusinessCollectionBase` validation behavior.† |
| **Outcome** | Collection-level error text reflects the first failing child or collection validation state.† |
| **Confidence** | Verified |
| **Origin** | `SAIF.Framework.Core` — `clsBusinessCollectionBase` |
| **Source** | Retrieved from indexed documentation via Legends CLI |

## Notes
- Rule identifiers in this document are documentation identifiers for this library set.

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

> **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.
> Statements marked with `†` were retrieved from dependency library documentation via the Legends CLI RAG service.

## Sources
- `Business\SAIF.Business.Policy.Group\clsChapter.vb`
- `Business\SAIF.Business.Policy.Group\clsChapterCollection.vb`
- `Business\SAIF.Business.Policy.Group\clsClassSignificance.vb`
- `Business\SAIF.Business.Policy.Group\clsContact.vb`
- `Business\SAIF.Business.Policy.Group\clsGroupAssociation.vb`
- `Business\SAIF.Business.Policy.Group\clsGroupAssociationCollection.vb`
- `Business\SAIF.Business.Policy.Group\clsGroupAssociationDiscount.vb`
- `Business\SAIF.Business.Policy.Group\clsGroupAssociationDiscountCollection.vb`
- `Business\SAIF.Business.Policy.Group\clsGroupUnderwritingCriteria.vb`
- `Business\SAIF.Business.Policy.Group\clsPolicyPeriodGroupAssociation.vb`
- `Business\SAIF.Business.Policy.Group\clsSignificantClass.vb`
- `Business\SAIF.Business.Policy.Group\clsSignificantClassCollection.vb`
