---
title: SAIF.Business.Claim.Person business rules
summary: Enumerated business rules with per-rule trigger, enforcement, and outcomes.
status: draft
owner: SAIF
last_reviewed: 2026-07-30
library: SAIF.Business.Claim.Person
reference_type: package
---

# SAIF.Business.Claim.Person business rules

This page captures business rules enforced by this library.

## BR-PER-001: Optimistic concurrency applies to CRUD operations

| Field | Value |
| --- | --- |
| **Statement** | Optimistic concurrency checks apply to claim-person business-object save and delete operations. |
| **Trigger** | When an entity save or delete operation completes. |
| **Enforcement** | BOF criteria lifecycle handlers and entity completion checks across the person business objects. |
| **Outcome** | Stale updates raise contention errors instead of silently overwriting database state. |
| **Source** | `Business\SAIF.Business.Claim.Person\clsAwardEligibility.vb` |

---

## BR-PER-002: Phonetic name generation is required for name maintenance

| Field | Value |
| --- | --- |
| **Statement** | The library generates a phonetic name code whenever a claim-person name is inserted or updated. |
| **Trigger** | When `clsClaimPersonName` saves a name-history record. |
| **Enforcement** | `clsClaimPersonName.GetPhoneticNameCode` calls the Oracle package before name persistence. |
| **Outcome** | Search-oriented phonetic indexing stays aligned with saved name history. |
| **Tables** | [CL_CLAIM_PERSON_NAME_HISTORY](database-tables.md#cl-claim-person-name-history), [CL_CLAIM_PERSON](database-tables.md#cl-claim-person), [DUAL](database-tables.md#dual) |
| **SQL** | [SQL-002](sql/sql-002-insert.md), [SQL-008](sql/sql-008-select.md), [SQL-016](sql/sql-016-update.md), [SQL-017](sql/sql-017-update.md) |
| **Source** | `Business\SAIF.Business.Claim.Person\clsClaimPersonName.vb` |

---

## BR-PROC-001: Phonetic name generation must occur before claim-person name persistence

| Field | Value |
| --- | --- |
| Statement | Phonetic name generation must occur before claim-person name persistence. |
| Trigger | When `clsClaimPersonName` prepares Oracle-backed name persistence. |
| Enforcement | `PK82028_PHONETIC_NAME.createPhoneticName` |
| Outcome | The stored procedure returns the phonetic name token that the BOF object persists with the claim-person name history row. |
| Confidence | Source-backed |
| Source | [PK82028_PHONETIC_NAME.createPhoneticName](procedures/pk82028-phonetic-name.md#createphoneticname) |

---

## BR-PER-003: Tax ID must contain exactly nine digits

| Field | Value |
| --- | --- |
| **Statement** | A person tax ID history row's tax ID must contain exactly nine digits. |
| **Trigger** | When a dirty `clsPersonTaxIDHistory` row is validated. |
| **Enforcement** | `clsPersonTaxIDHistory.SSNRequired`. |
| **Outcome** | An invalid tax ID blocks save. |
| **Confidence** | Source-backed |
| **Source** | `Business\SAIF.Business.Claim.Person\clsPersonTaxIDHistory.vb` |

---

## BR-PER-004: Primary flag must be Y or N

| Field | Value |
| --- | --- |
| **Statement** | `PrimaryFlag` on a tax ID history row must be `Y` or `N`. |
| **Trigger** | When a dirty `clsPersonTaxIDHistory` row is validated. |
| **Enforcement** | `clsPersonTaxIDHistory.PrimaryFlagValid`. |
| **Outcome** | An invalid flag value blocks save. |
| **Confidence** | Source-backed |
| **Source** | `Business\SAIF.Business.Claim.Person\clsPersonTaxIDHistory.vb` |

---

## BR-PER-005: Void flag must be Y or N

| Field | Value |
| --- | --- |
| **Statement** | `VoidFlag` on a tax ID history row must be `Y` or `N`. |
| **Trigger** | When a dirty `clsPersonTaxIDHistory` row is validated. |
| **Enforcement** | `clsPersonTaxIDHistory.VoidFlagValid`. |
| **Outcome** | An invalid flag value blocks save. |
| **Confidence** | Source-backed |
| **Source** | `Business\SAIF.Business.Claim.Person\clsPersonTaxIDHistory.vb` |

---

## BR-PER-006: Primary tax IDs must be unique across worker records

| Field | Value |
| --- | --- |
| **Statement** | A primary tax ID cannot already be recorded as primary for a different worker person. |
| **Trigger** | When a nine-digit primary tax ID is validated. |
| **Enforcement** | `clsPersonTaxIDHistory.PrimarySSNValid` (via `GetPrimaryTaxID`). |
| **Outcome** | A duplicate primary tax ID for another worker blocks save. |
| **Tables** | [CL_PERSON_TAX_ID_HISTORY](database-tables.md#cl-person-tax-id-history), [CL_CLAIM_PERSON](database-tables.md#cl-claim-person) |
| **SQL** | [SQL-011](sql/sql-011-select.md) |
| **Confidence** | Source-backed |
| **Source** | `Business\SAIF.Business.Claim.Person\clsPersonTaxIDHistory.vb` |

---

## BR-PER-007: Duplicate tax IDs raise a warning

| Field | Value |
| --- | --- |
| **Statement** | A tax ID already used by another person's history row generates a warning rather than a blocking error. |
| **Trigger** | When a nine-digit tax ID is validated. |
| **Enforcement** | `clsPersonTaxIDHistory.SSNInUse` (via `GetTaxIDInUseAsActive` / `GetTaxIDInUse`). |
| **Outcome** | A warning is added; save is not blocked by this check alone. |
| **Tables** | [CL_PERSON_TAX_ID_HISTORY](database-tables.md#cl-person-tax-id-history) |
| **SQL** | [SQL-010](sql/sql-010-select.md), [SQL-012](sql/sql-012-select.md) |
| **Confidence** | Source-backed |
| **Source** | `Business\SAIF.Business.Claim.Person\clsPersonTaxIDHistory.vb` |

---

## BR-PER-008: Only one tax ID can be primary per person

| Field | Value |
| --- | --- |
| **Statement** | A person's tax ID history collection can contain at most one row marked primary. |
| **Trigger** | When the tax ID history collection is dirty and validated. |
| **Enforcement** | `clsPersonTaxIDHistoryCollection.PrimaryValid`. |
| **Outcome** | Multiple primary rows block save. |
| **Confidence** | Source-backed |
| **Source** | `Business\SAIF.Business.Claim.Person\clsPersonTaxIDHistoryCollection.vb` |

---

## BR-PER-009: Primary tax IDs cannot be voided

| Field | Value |
| --- | --- |
| **Statement** | A tax ID history row cannot be marked both primary and void. |
| **Trigger** | When a `clsPersonTaxIDHistory` row is validated. |
| **Enforcement** | `clsPersonTaxIDHistory.PrimaryNotVoid`. |
| **Outcome** | An invalid combination blocks save. |
| **Confidence** | Source-backed |
| **Source** | `Business\SAIF.Business.Claim.Person\clsPersonTaxIDHistory.vb` |

---

## BR-PER-010: Award eligibility effective date is required

| Field | Value |
| --- | --- |
| **Statement** | An award eligibility period must have an effective date. |
| **Trigger** | When a `clsAwardEligibility` period is validated. |
| **Enforcement** | `clsAwardEligibility.ValidEffectiveDate`. |
| **Outcome** | A blank effective date blocks save. |
| **Tables** | [CL_AWARD_ELIGIBILITY](database-tables.md#cl-award-eligibility) |
| **Confidence** | Source-backed |
| **Source** | `Business\SAIF.Business.Claim.Person\clsAwardEligibility.vb` |

---

## BR-PER-011: Award eligibility expiration date cannot precede the effective date

| Field | Value |
| --- | --- |
| **Statement** | An award eligibility period's expiration date cannot be earlier than its effective date. |
| **Trigger** | When a `clsAwardEligibility` period is validated. |
| **Enforcement** | `clsAwardEligibility.ValidExpirationDate`. |
| **Outcome** | An invalid date range blocks save. |
| **Tables** | [CL_AWARD_ELIGIBILITY](database-tables.md#cl-award-eligibility) |
| **Confidence** | Source-backed |
| **Source** | `Business\SAIF.Business.Claim.Person\clsAwardEligibility.vb` |

---

## BR-PER-012: Award eligibility cannot start before the beneficiary birth date

| Field | Value |
| --- | --- |
| **Statement** | An award eligibility period's effective date must be on or after the beneficiary's birth date. |
| **Trigger** | When a `clsAwardEligibility` period is validated. |
| **Enforcement** | `clsAwardEligibility.EffectiveDateAfterBirthDate`. |
| **Outcome** | An invalid period blocks save. |
| **Tables** | [CL_AWARD_ELIGIBILITY](database-tables.md#cl-award-eligibility) |
| **Confidence** | Source-backed |
| **Source** | `Business\SAIF.Business.Claim.Person\clsAwardEligibility.vb` |

---

## BR-PER-013: Award eligibility cannot extend past the beneficiary death date

| Field | Value |
| --- | --- |
| **Statement** | An award eligibility period cannot run beyond the beneficiary's recorded death date. |
| **Trigger** | When a `clsAwardEligibility` period is validated and a death date is present. |
| **Enforcement** | `clsAwardEligibility.EligPeriodAfterDeathDate`. |
| **Outcome** | An invalid period blocks save. |
| **Tables** | [CL_AWARD_ELIGIBILITY](database-tables.md#cl-award-eligibility) |
| **Confidence** | Source-backed |
| **Source** | `Business\SAIF.Business.Claim.Person\clsAwardEligibility.vb` |

---

## BR-PER-014: Award eligibility periods cannot overlap

| Field | Value |
| --- | --- |
| **Statement** | A beneficiary's award eligibility periods cannot overlap one another. |
| **Trigger** | When the award eligibility collection is validated. |
| **Enforcement** | `clsAwardEligibilityCollection.NoDateOverlap`. |
| **Outcome** | Overlapping periods block save. |
| **Tables** | [CL_AWARD_ELIGIBILITY](database-tables.md#cl-award-eligibility) |
| **Confidence** | Source-backed |
| **Source** | `Business\SAIF.Business.Claim.Person\clsAwardEligibilityCollection.vb` |

---

## BR-PER-015: Beneficiary last name is required

| Field | Value |
| --- | --- |
| **Statement** | A beneficiary must have a last name. |
| **Trigger** | When a `clsBeneficiary` object is validated. |
| **Enforcement** | `clsBeneficiary.PrimaryLastNameRequired`. |
| **Outcome** | A missing last name blocks validation. |
| **Confidence** | Source-backed |
| **Source** | `Business\SAIF.Business.Claim.Person\clsBeneficiary.vb` |

---

## BR-PER-016: Orphan codes require the child relationship code

| Field | Value |
| --- | --- |
| **Statement** | An orphan code of `1` or `2` requires the beneficiary relationship code to be the child code (`2`). |
| **Trigger** | When a `clsBeneficiary` object is validated. |
| **Enforcement** | `clsBeneficiary.OrphanIsChild`. |
| **Outcome** | An inconsistent orphan/relationship combination blocks validation. |
| **Confidence** | Source-backed |
| **Source** | `Business\SAIF.Business.Claim.Person\clsBeneficiary.vb` |

---

## BR-PER-017: Beneficiary birth dates cannot be future-dated and are required when eligibility periods exist

| Field | Value |
| --- | --- |
| **Statement** | A beneficiary birth date cannot be in the future, and is required when an eligibility end date exists. |
| **Trigger** | When a `clsBeneficiary` object is validated. |
| **Enforcement** | `clsBeneficiary.ValidBirthDate`. |
| **Outcome** | An invalid birth-date state blocks validation. |
| **Confidence** | Source-backed |
| **Source** | `Business\SAIF.Business.Claim.Person\clsBeneficiary.vb` |

---

## BR-PER-018: Beneficiary death dates cannot be future-dated and must be after the birth date

| Field | Value |
| --- | --- |
| **Statement** | A beneficiary death date cannot be in the future and must be later than the birth date. |
| **Trigger** | When a `clsBeneficiary` object is validated. |
| **Enforcement** | `clsBeneficiary.ValidDeathDate`. |
| **Outcome** | An invalid death date blocks validation. |
| **Confidence** | Source-backed |
| **Source** | `Business\SAIF.Business.Claim.Person\clsBeneficiary.vb` |

---

## BR-PER-019: Birth certificate received dates cannot be future-dated

| Field | Value |
| --- | --- |
| **Statement** | A beneficiary's birth-certificate-received date cannot be in the future. |
| **Trigger** | When a `clsBeneficiary` object is validated. |
| **Enforcement** | `clsBeneficiary.ValidBirthCertReceivedDate`. |
| **Outcome** | An invalid date blocks validation. |
| **Confidence** | Source-backed |
| **Source** | `Business\SAIF.Business.Claim.Person\clsBeneficiary.vb` |

---

## BR-PER-020: Beneficiary gender codes must be M, F, or U

| Field | Value |
| --- | --- |
| **Statement** | A beneficiary gender code must be `M`, `F`, or `U`. |
| **Trigger** | When a `clsBeneficiary` object is validated. |
| **Enforcement** | `clsBeneficiary.ValidGenderCode`. |
| **Outcome** | An invalid code blocks validation. |
| **Confidence** | Source-backed |
| **Source** | `Business\SAIF.Business.Claim.Person\clsBeneficiary.vb` |

---

## BR-PER-021: Beneficiary tax IDs must contain exactly nine digits when provided

| Field | Value |
| --- | --- |
| **Statement** | A beneficiary tax ID, when entered, must contain exactly nine digits. |
| **Trigger** | When a `clsBeneficiary` object is validated and a tax ID is present. |
| **Enforcement** | `clsBeneficiary.ValidSSN`. |
| **Outcome** | An invalid tax ID blocks validation. |
| **Confidence** | Source-backed |
| **Source** | `Business\SAIF.Business.Claim.Person\clsBeneficiary.vb` |

---

## BR-PER-022: Post-1999 PTD beneficiary claims require a recorded worker death date

| Field | Value |
| --- | --- |
| **Statement** | For claims with an injury date on or after October 23, 1999, PTD beneficiary eligibility requires a recorded worker death date. |
| **Trigger** | When a `clsBeneficiary` object is validated. |
| **Enforcement** | `clsBeneficiary.PTDBenefitsAfter10_23_1999`. |
| **Outcome** | A missing worker death date blocks validation. |
| **Confidence** | Source-backed |
| **Source** | `Business\SAIF.Business.Claim.Person\clsBeneficiary.vb` |

---

## BR-PER-023: Conflicting payment addresses generate a warning

| Field | Value |
| --- | --- |
| **Statement** | When a beneficiary has both a special payment address and a guardian payment address, a warning is generated. |
| **Trigger** | When a `clsBeneficiary` object is validated. |
| **Enforcement** | `clsBeneficiary.TwoPaymentAddresses`. |
| **Outcome** | A warning is added; validation is not blocked by this check alone. |
| **Confidence** | Source-backed |
| **Source** | `Business\SAIF.Business.Claim.Person\clsBeneficiary.vb` |

---

## BR-PER-024: Beneficiary death-date changes generate an eligibility review warning

| Field | Value |
| --- | --- |
| **Statement** | Editing a beneficiary's death date generates a warning that the current award eligibility period may need expiration review. |
| **Trigger** | When the beneficiary death date is modified. |
| **Enforcement** | `clsBeneficiary.DeathDateModified`. |
| **Outcome** | A warning is added. |
| **Confidence** | Source-backed |
| **Source** | `Business\SAIF.Business.Claim.Person\clsBeneficiary.vb` |

---

## BR-PER-025: Higher education requires orphan code 2

| Field | Value |
| --- | --- |
| **Statement** | Higher-education status is only valid for a beneficiary with orphan code `2`. |
| **Trigger** | When a `clsBeneficiary` object is validated. |
| **Enforcement** | `clsBeneficiary.HigherEdOrphanValid`. |
| **Outcome** | An invalid combination blocks validation. |
| **Confidence** | Source-backed |
| **Source** | `Business\SAIF.Business.Claim.Person\clsBeneficiary.vb` |

---

## BR-PER-026: Twice-orphaned child beneficiaries must resolve higher education status

| Field | Value |
| --- | --- |
| **Statement** | A child beneficiary with orphan code `2` must resolve a definite higher-education status. |
| **Trigger** | When a `clsBeneficiary` object is validated. |
| **Enforcement** | `clsBeneficiary.HigherEdOrphanRequired`. |
| **Outcome** | An unresolved status blocks validation. |
| **Confidence** | Source-backed |
| **Source** | `Business\SAIF.Business.Claim.Person\clsBeneficiary.vb` |

---

## BR-PER-027: Worker health issue exposure codes are required and must be at least 1

| Field | Value |
| --- | --- |
| **Statement** | A worker health issue row's exposure code cannot be blank and must be numerically at least `1`. |
| **Trigger** | When a `clsWorkerHealthIssue` row is validated. |
| **Enforcement** | `clsWorkerHealthIssue.ExposureCodeValid`. |
| **Outcome** | An invalid exposure code blocks save. |
| **Tables** | [CL_WORKER_HEALTH_ISSUE](database-tables.md#cl-worker-health-issue) |
| **Confidence** | Source-backed |
| **Source** | `Business\SAIF.Business.Claim.Person\clsWorkerHealthIssue.vb` |

---

## BR-PER-028: Claim-person name last name is required

| Field | Value |
| --- | --- |
| **Statement** | A claim-person name-history row must have a non-blank last name. |
| **Trigger** | When a `clsClaimPersonName` row is validated. |
| **Enforcement** | `clsClaimPersonName.LastNameRequired`. |
| **Outcome** | A blank last name blocks save. |
| **Tables** | [CL_CLAIM_PERSON_NAME_HISTORY](database-tables.md#cl-claim-person-name-history) |
| **Confidence** | Source-backed |
| **Source** | `Business\SAIF.Business.Claim.Person\clsClaimPersonName.vb` |

---

## BR-PER-029: Claim-person name primary flag must be Y or N

| Field | Value |
| --- | --- |
| **Statement** | `PrimaryFlag` on a claim-person name row must be `Y` or `N`. |
| **Trigger** | When a `clsClaimPersonName` row is validated. |
| **Enforcement** | `clsClaimPersonName.PrimaryFlagValid`. |
| **Outcome** | An invalid flag value blocks save. |
| **Confidence** | Source-backed |
| **Source** | `Business\SAIF.Business.Claim.Person\clsClaimPersonName.vb` |

---

## BR-PER-030: Claim-person name void flag must be Y or N

| Field | Value |
| --- | --- |
| **Statement** | `VoidFlag` on a claim-person name row must be `Y` or `N`. |
| **Trigger** | When a `clsClaimPersonName` row is validated. |
| **Enforcement** | `clsClaimPersonName.VoidFlagValid`. |
| **Outcome** | An invalid flag value blocks save. |
| **Confidence** | Source-backed |
| **Source** | `Business\SAIF.Business.Claim.Person\clsClaimPersonName.vb` |

---

## BR-PER-031: A primary claim-person name may not be void

| Field | Value |
| --- | --- |
| **Statement** | A claim-person name row cannot be marked both primary and void. |
| **Trigger** | When a `clsClaimPersonName` row is validated. |
| **Enforcement** | `clsClaimPersonName.PrimaryVoidFlagsValid`. |
| **Outcome** | An invalid combination blocks save. |
| **Confidence** | Source-backed |
| **Source** | `Business\SAIF.Business.Claim.Person\clsClaimPersonName.vb` |

---

## BR-PER-032: Only one claim-person name can be primary

| Field | Value |
| --- | --- |
| **Statement** | A person's name-history collection can contain at most one row marked primary. |
| **Trigger** | When the name-history collection is dirty and non-empty. |
| **Enforcement** | `clsClaimPersonNameCollection.PrimaryValid`. |
| **Outcome** | Multiple primary name rows block save. |
| **Tables** | [CL_CLAIM_PERSON_NAME_HISTORY](database-tables.md#cl-claim-person-name-history) |
| **Confidence** | Source-backed |
| **Source** | `Business\SAIF.Business.Claim.Person\clsClaimPersonNameCollection.vb` |

---

## BR-PER-033: Payment address effective date must be present and not in the past

| Field | Value |
| --- | --- |
| **Statement** | A special payment address's effective date cannot be blank or earlier than today. |
| **Trigger** | When a dirty payment address (`clsClaimPersonAddress`) with a modified effective date is validated. |
| **Enforcement** | `clsClaimPersonAddress.ValidEffDate`. |
| **Outcome** | An invalid effective date blocks save. |
| **Confidence** | Source-backed |
| **Source** | `Business\SAIF.Business.Claim.Person\clsClaimPersonAddress.vb` |

---

## BR-PER-034: Payment address expiration date cannot precede the effective date or be in the past

| Field | Value |
| --- | --- |
| **Statement** | A special payment address's expiration date, when set, cannot be earlier than the effective date and cannot be in the past if it was just modified. |
| **Trigger** | When a dirty payment address (`clsClaimPersonAddress`) is validated. |
| **Enforcement** | `clsClaimPersonAddress.ValidExpDate`. |
| **Outcome** | An invalid expiration date blocks save. |
| **Confidence** | Source-backed |
| **Source** | `Business\SAIF.Business.Claim.Person\clsClaimPersonAddress.vb` |

---

## BR-PER-035: Domestic payment addresses require address line 1, city, state, and zip

| Field | Value |
| --- | --- |
| **Statement** | A dirty, non-foreign payment address that has any address content entered must include address line 1, city, state, and zip code. |
| **Trigger** | When a dirty, domestic-format payment address (`clsClaimPersonAddress`) is validated. |
| **Enforcement** | `clsClaimPersonAddress.ValidDomesticAddress`. |
| **Outcome** | An incomplete domestic address blocks save. |
| **Confidence** | Source-backed |
| **Source** | `Business\SAIF.Business.Claim.Person\clsClaimPersonAddress.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)
- [Procedures](procedures/index.md)
- [API reference](api/index.md)

## Sources
- `Business\SAIF.Business.Claim.Person\clsAwardEligibility.vb`
- `Business\SAIF.Business.Claim.Person\clsAwardEligibilityCollection.vb`
- `Business\SAIF.Business.Claim.Person\clsClaimPersonName.vb`
- `Business\SAIF.Business.Claim.Person\clsClaimPersonNameCollection.vb`
- `Business\SAIF.Business.Claim.Person\clsClaimPersonAddress.vb`
- `Business\SAIF.Business.Claim.Person\clsPersonTaxIDHistory.vb`
- `Business\SAIF.Business.Claim.Person\clsPersonTaxIDHistoryCollection.vb`
- `Business\SAIF.Business.Claim.Person\clsBeneficiary.vb`
- `Business\SAIF.Business.Claim.Person\clsWorkerHealthIssue.vb`
