﻿---
title: SAIF.Business.Claim business rules
summary: Enumerated business rules for SAIF.Business.Claim.
status: draft
owner: Technical Writer
last_reviewed: 2026-07-30
library: SAIF.Business.Claim
reference_type: package
---

# SAIF.Business.Claim business rules

This page captures business rules enforced by `SAIF.Business.Claim`.

## BR-001: claim ID must be non-zero

| Field | Value |
| --- | --- |
| **Statement** | The claim ID must be non-zero |
| **Trigger** | Property validation on ClaimID |
| **Enforcement** | ``cls1502Transfer.ValidClaimID`` |
| **Outcome** | Error: "The claim id is invalid." |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Claim\cls1502Transfer.vb` (`ValidClaimID`) |

---

## BR-002: filing reason code is required

| Field | Value |
| --- | --- |
| **Statement** | The filing reason code is required |
| **Trigger** | Property validation on FilingReasonCode |
| **Enforcement** | ``cls1502Transfer.ValidFilingReason`` |
| **Outcome** | Error: "The Filing Reason is required." |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Claim\cls1502Transfer.vb` (`ValidFilingReason`) |

---

## BR-003: Work release date must be valid

| Field | Value |
| --- | --- |
| **Statement** | Work release date must be valid |
| **Trigger** | Property validation on WorkReleaseDate |
| **Enforcement** | ``clsClaimWorkReleaseStatus.ValidWorkReleaseDate`` |
| **Outcome** | LevelTwo check error |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Claim\clsClaimWorkReleaseStatus.vb` (`ValidWorkReleaseDate`) |

---

## BR-004: Work release status data must be present

| Field | Value |
| --- | --- |
| **Statement** | Work release status data must be present |
| **Trigger** | Object-level validation |
| **Enforcement** | ``clsClaimWorkReleaseStatus.HasData`` |
| **Outcome** | Error: "No work release status data available." |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Claim\clsClaimWorkReleaseStatus.vb` (`HasData`) |

---

## BR-005: date the worker returned to work must be valid

| Field | Value |
| --- | --- |
| **Statement** | The date the worker returned to work must be valid |
| **Trigger** | Property validation on WorkStatusDate |
| **Enforcement** | ``clsClaimWorkStatus.ValidWorkStatusDate`` |
| **Outcome** | Error: "The date the worker returned to work is invalid." |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Claim\clsClaimWorkStatus.vb` (`ValidWorkStatusDate`) |

---

## BR-006: primary body part must be designated

| Field | Value |
| --- | --- |
| **Statement** | A primary body part must be designated |
| **Trigger** | Collection-level validation on PrimaryFlag |
| **Enforcement** | ``clsWorkerInjuredBodyPartCollection.PrimaryValid`` |
| **Outcome** | Error: "Primary body part is required." |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Claim\clsWorkerInjuredBodyPartCollection.vb` (`PrimaryValid`) |

---

## BR-007: Only one body part may be marked as primary

| Field | Value |
| --- | --- |
| **Statement** | Only one body part may be marked as primary |
| **Trigger** | Collection-level validation on PrimaryFlag |
| **Enforcement** | ``clsWorkerInjuredBodyPartCollection.OnlyOnePrimary`` |
| **Outcome** | Error: "Only one primary body part is allowed." |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Claim\clsWorkerInjuredBodyPartCollection.vb` (`OnlyOnePrimary`) |

---

## BR-008: Update/delete row count must equal 1

| Field | Value |
| --- | --- |
| **Statement** | Update/delete row count must equal 1 |
| **Trigger** | AfterUpdate/AfterDelete lifecycle |
| **Enforcement** | `Multiple classes` |
| **Outcome** | Error messages added on contention failure |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Claim\cls1502Transfer.vb` (`AfterUpdate`, `AfterDelete`) and peer mutable BOF objects that perform the same single-row concurrency check |

---

## BR-009: Released scheduled payments are truncated to one remaining payment

| Field | Value |
| --- | --- |
| **Statement** | When a claim change stops a benefit payment schedule, a scheduled payment that already has a released financial transaction is kept with its remaining payment count set to 1; a scheduled payment with no released transaction is deleted outright |
| **Trigger** | `ProcessBenefitPayment` evaluates each schedule row with a remaining payment count greater than zero |
| **Enforcement** | ``clsBenefitSchedule.ProcessBenefitPayment`` and ``clsActiveBenefitSchedule.ProcessBenefitPayment``, using `ClaimServices.hasReleasedScheduledPayment` to classify the row |
| **Outcome** | The schedule is truncated (stop status "released") or the payment row is deleted (stop status "deleted"); a zero row count raises `#PAYUPD#` or `#PAYDEL#` and aborts the remaining rows |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Claim\clsBenefitSchedule.vb` (`ProcessBenefitPayment`) |

---

## BR-010: Stopping a benefit payment schedule posts an adjuster review task

| Field | Value |
| --- | --- |
| **Statement** | Stopping a benefit payment schedule creates a claim task describing the triggering change and whether the schedule was deleted or a released payment will still be issued, unless the caller declared that it posts its own task and the payment was released |
| **Trigger** | A schedule row has been truncated or deleted by `ProcessBenefitPayment` |
| **Enforcement** | ``clsBenefitSchedule.ReturnTask`` composes the text and `clsClaimTaskGenerator.AddTask` posts it |
| **Outcome** | A claim task is created for the adjuster, due the current date; `clsActiveBenefitSchedule` never posts a task |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Claim\clsBenefitSchedule.vb` (`ProcessBenefitPayment`, `ReturnTask`) |

---

## BR-011: Setting an award to pending resets its benefit payments to in-progress

| Field | Value |
| --- | --- |
| **Statement** | Only the claim's active award may be moved to pending status, and once it is, its benefit payment rows are returned to in-progress status with the approver nulled and the initiator blanked so the payment must be re-initiated and re-approved |
| **Trigger** | `clsSetAwardPaymentPending` is retrieved for a claim and saved |
| **Enforcement** | ``clsSetAwardPaymentPending.BeforeUpdate`` and ``clsSetAwardPaymentPending.ProcessBenefitPayment`` |
| **Outcome** | `CL_AWARD.AWARD_STATUS_CODE` becomes `P` and `CL_BENEFIT_PAYMENT.BENEFIT_STATUS_CODE` becomes `0`; a failed award update prevents the payment reset and raises `UpdateError` |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Claim\clsSetAwardPaymentPending.vb` (`BeforeRetrieve`, `BeforeUpdate`, `AfterUpdate`, `ProcessBenefitPayment`) |

---

## BR-012: Award benefit payment collections default to federal benefit types

| Field | Value |
| --- | --- |
| **Statement** | When a caller requests an award's benefit payments without supplying benefit type codes, the retrieval is restricted to the federal benefit types `4`, `5`, and `6` |
| **Trigger** | `clsAwardBenefitPaymentCollection.BeforeRetrieve` finds an empty benefit type code list |
| **Enforcement** | ``clsAwardBenefitPaymentCollection.BeforeRetrieve`` |
| **Outcome** | The dynamic benefit type predicate is completed with the three federal codes, so state-only payments are excluded from the result |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Claim\clsAwardBenefitPaymentCollection.vb` (`BeforeRetrieve`) |

---

## BR-013: The primary injured body part is mirrored onto the claim header

| Field | Value |
| --- | --- |
| **Statement** | After an injured body part marked as primary is inserted or updated, its body part code, body side code, and injury nature code are written onto the claim header; a clearing request writes placeholder values instead |
| **Trigger** | `AfterInsert` or `AfterUpdate` on a dirty body part carrying the primary flag |
| **Enforcement** | ``clsWorkerInjuredBodyPart.UpdateClaimBodyPart`` |
| **Outcome** | The claim header's primary body part, side, and injury nature columns are kept in step with the detail rows; the cascade performs no rows-affected check |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Claim\clsWorkerInjuredBodyPart.vb` (`AfterInsert`, `AfterUpdate`, `UpdateClaimBodyPart`) |

---

## BR-014: Only 1502 transfers with no processed date are eligible for transfer

| Field | Value |
| --- | --- |
| **Statement** | A 1502 transfer record is outstanding only while its processed date is null; both transfer-queue queries exclude records that already carry a processed date, and the whole-queue query returns them in file name order |
| **Trigger** | `GetTransferList` or `GetUnprocessedTransferList` is called |
| **Enforcement** | ``cls1502Transfer.GetTransferList`` and ``cls1502Transfer.GetUnprocessedTransferList`` |
| **Outcome** | Transferred documents drop out of the queue once their processed date is written |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Claim\cls1502Transfer.vb` (`GetTransferList`, `GetUnprocessedTransferList`) |

---

## BR-015: Employee work address ZIP codes are stored numerically and normalized to five digits

| Field | Value |
| --- | --- |
| **Statement** | The employee work address ZIP code is stored as a number; a stored value of zero is treated as no ZIP code, and any other value is left-padded with zeros to five digits when the object is filled |
| **Trigger** | `Fill` reads an employee work address row |
| **Enforcement** | ``clsClaimEmployeeWorkAddress.Fill`` |
| **Outcome** | Leading-zero ZIP codes are restored for display and validation; a genuine ZIP of `00000` cannot be represented |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Claim\clsClaimEmployeeWorkAddress.vb` (`Fill`) |

---

## BR-016: Time-loss due dates falling on a non-working day roll to the next state working day

| Field | Value |
| --- | --- |
| **Statement** | The time-loss due date returned by the first-payment timeliness assessment is evaluated against the state holidays calendar rather than SAIF's own calendar, and a due date falling on a non-working day is reported as the next working day |
| **Trigger** | A caller reads the time-loss due date from a timeliness assessment |
| **Enforcement** | ``clsTimelinessOfFirstPayment.TimeLossDueDate`` over a smart date constructed with the `STATEHOLIDAYS` calendar |
| **Outcome** | Statutory deadlines follow the state's non-working days, so the reported due date can differ from the raw procedure output |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Claim\clsITimelinessOfFirstPayment.vb` (`AfterRetrieve`, `TimeLossDueDate`) |

---

## BR-017: Scheduled PPD awards use the latest rate effective on or before the award date

| Field | Value |
| --- | --- |
| **Statement** | A scheduled permanent partial disability award is priced using the last per-degree rate whose effective date is on or before the supplied award date; when no rate qualifies the amount is zero |
| **Trigger** | `GetAwardAmount` is called on the scheduled degree award table |
| **Enforcement** | ``clsPPDScheduledDegreeAwards.GetAwardAmount`` |
| **Outcome** | Awards are priced at the rate in force when they became effective; a date earlier than every rate yields zero |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Claim\clsPPDScheduledDegreeAwards.vb` (`GetAwardAmount`) |

---

## BR-018: Unscheduled PPD awards accumulate across cumulative degree bands

| Field | Value |
| --- | --- |
| **Statement** | An unscheduled permanent partial disability award is priced by allocating the degree count across the degree bands effective on the award date in ascending degree order, multiplying the degrees allocated to each band by that band's per-degree rate and accumulating the total |
| **Trigger** | `GetAwardAmount` is called on the unscheduled degree award table with a degree count and effective date |
| **Enforcement** | ``clsPPDUnscheduledDegreeAwards.GetAwardAmount`` |
| **Outcome** | The award amount is returned together with a step-by-step calculation proof recording each band's contribution |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Claim\clsPPDUnscheduledDegreeAwards.vb` (`GetAwardAmount`) |

---

## BR-019: Work status and work release retrieval returns only the most recent sequence

| Field | Value |
| --- | --- |
| **Statement** | Retrieving a claim's work status or work release status returns only the row carrying the highest sequence number for that claim, so callers always act on the latest history entry |
| **Trigger** | `GetClaimWorkStatus` or `GetClaimWorkReleaseStatus` is called for a claim |
| **Enforcement** | ``clsClaimWorkStatus`` and ``clsClaimWorkReleaseStatus`` retrieve statements, which filter on the maximum sequence number for the claim |
| **Outcome** | Earlier history entries are unreachable through these objects |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Claim\clsClaimWorkStatus.vb` and `Business\SAIF.Business.Claim\clsClaimWorkReleaseStatus.vb` (Criteria `RetrieveSQL`) |

---

## Inherited business rules

Rules in this section are inherited from shared BOF framework behavior.

### From `clsBusinessBase` (`saif-framework-core`)

## INH-001: Framework rule execution

| Field | Value |
| --- | --- |
| **Statement** | Inherited BOF business objects evaluate property and object rules through the shared rules manager.* |
| **Trigger** | When a property setter or save path triggers rule evaluation |
| **Enforcement** | Inherited `clsBusinessBase` rules-manager flow |
| **Outcome** | Broken-rule state is captured and exposed to consumers.* |
| **Confidence** | Inherited |
| **Origin** | `saif-framework-core — clsBusinessBase` |
| **Source** | Retrieved from dependency documentation via Legends CLI |

---

## INH-002: Collection validation surfacing

| Field | Value |
| --- | --- |
| **Statement** | Inherited BOF collections surface aggregated validation state through `IDataErrorInfo`.* |
| **Trigger** | When child items or collection state contain broken rules |
| **Enforcement** | Inherited `clsBusinessCollectionBase` validation behavior |
| **Outcome** | Consumers can read collection-level error state without querying each child directly.* |
| **Confidence** | Inherited |
| **Origin** | `saif-framework-core — clsBusinessCollectionBase` |
| **Source** | Retrieved from dependency documentation via Legends CLI |

---

## Stored procedure business rules

Rules sourced from Oracle procedures referenced by this library.

## PR-001: Reject injury dates on or before 01-JAN-1900

| Field | Value |
| --- | --- |
| **Statement** | Injury dates on or before 01-JAN-1900 are rejected |
| **Trigger** | `sp82286_statutoryweeklywage` receives `inInjuryDate <= 01-JAN-1900` |
| **Enforcement** | `sp82286_statutoryweeklywage` sets `ErrorMessage` to `Invalid injury date` and exits before calculation |
| **Outcome** | No statutory weekly wage is calculated and the caller receives an error message |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Claim\clsStatutoryWeeklyWageCalculation.vb` (`BeforeRetrieve`, `AfterRetrieve` call `sp82286_statutoryweeklywage`) |

---

## PR-002: Reject non-positive wages

| Field | Value |
| --- | --- |
| **Statement** | Non-positive wages are rejected |
| **Trigger** | `sp82286_statutoryweeklywage` receives `inWages <= 0` |
| **Enforcement** | `sp82286_statutoryweeklywage` sets `ErrorMessage` to `Invalid wages at time of injury` and exits |
| **Outcome** | No statutory weekly wage is calculated and the caller receives an error message |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Claim\clsStatutoryWeeklyWageCalculation.vb` (`BeforeRetrieve`, `AfterRetrieve` call `sp82286_statutoryweeklywage`) |

---

## PR-003: Restrict pay period to H, D, W, M, or A

| Field | Value |
| --- | --- |
| **Statement** | Pay period codes are limited to `H`, `D`, `W`, `M`, or `A` |
| **Trigger** | `sp82286_statutoryweeklywage` receives an unsupported `inPayPeriod` value |
| **Enforcement** | `sp82286_statutoryweeklywage` sets `ErrorMessage` to `Invalid pay period` and exits |
| **Outcome** | No statutory weekly wage is calculated and the caller receives an error message |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Claim\clsStatutoryWeeklyWageCalculation.vb` (`BeforeRetrieve`, `AfterRetrieve` call `sp82286_statutoryweeklywage`) |

---

## PR-004: Enforce hours per day for hourly wage inputs

| Field | Value |
| --- | --- |
| **Statement** | Hourly wage inputs must include hours worked per day |
| **Trigger** | `sp82286_statutoryweeklywage` receives `inPayPeriod = H` with `inHoursWorkedPerDay = 0` |
| **Enforcement** | `sp82286_statutoryweeklywage` sets `ErrorMessage` to `Invalid hours worked per day for a hourly pay period` and exits |
| **Outcome** | No statutory weekly wage is calculated and the caller receives an error message |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Claim\clsStatutoryWeeklyWageCalculation.vb` (`BeforeRetrieve`, `AfterRetrieve` call `sp82286_statutoryweeklywage`) |

---

## PR-005: Enforce days worked per week for hourly and daily inputs

| Field | Value |
| --- | --- |
| **Statement** | Hourly and daily wage inputs must include days worked per week |
| **Trigger** | `sp82286_statutoryweeklywage` receives `inPayPeriod = H` or `D` with `inDaysWorkedPerWeek = 0` |
| **Enforcement** | `sp82286_statutoryweeklywage` sets `ErrorMessage` to `Invalid days worked per week for a hourly or daily pay period` and exits |
| **Outcome** | No statutory weekly wage is calculated and the caller receives an error message |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Claim\clsStatutoryWeeklyWageCalculation.vb` (`BeforeRetrieve`, `AfterRetrieve` call `sp82286_statutoryweeklywage`) |

---

## PR-006: Normalize pre-1995 hourly/daily schedules to a three-day minimum

| Field | Value |
| --- | --- |
| **Statement** | Pre-1995 hourly and daily schedules with fewer than three days worked are normalized to three days per week |
| **Trigger** | `sp82286_statutoryweeklywage` receives `inPayPeriod = H` or `D`, an injury date before 07-JUN-1995, and `inDaysWorkedPerWeek < 3` |
| **Enforcement** | `sp82286_statutoryweeklywage` assigns `v_DaysWorkedPerWeek := 3` before the wage calculation |
| **Outcome** | The calculation uses a three-day minimum work schedule |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Claim\clsStatutoryWeeklyWageCalculation.vb` (`BeforeRetrieve`, `AfterRetrieve` call `sp82286_statutoryweeklywage`) |

## Notes
- Rule identifiers in this document are documentation identifiers for this generated 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)
- [Procedures](procedures/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.

## Sources
- `Business\SAIF.Business.Claim\SAIF.BOF.Business.Claim.vbproj`
- `Business\SAIF.Business.Claim\SAIF.BOF.Business.Claim.nuspec`
- `Business\SAIF.Business.Claim\packages.config`
- `Business\SAIF.Business.Claim\Enums.vb`
- `Business\SAIF.Business.Claim\IExplanationOfBenefit.vb`
- `Business\SAIF.Business.Claim\IExplanationOfBenefitSearchCriteria.vb`
- `Business\SAIF.Business.Claim\cls1502Transfer.vb`
- `Business\SAIF.Business.Claim\clsActiveBenefitSchedule.vb`
- `Business\SAIF.Business.Claim\clsAggRightDates.vb`
- `Business\SAIF.Business.Claim\clsAwardBenefitPayment.vb`
- `Business\SAIF.Business.Claim\clsAwardBenefitPaymentCollection.vb`
- `Business\SAIF.Business.Claim\clsBenefitSchedule.vb`
- `Business\SAIF.Business.Claim\clsClaimEmployeeWorkAddress.vb`
- `Business\SAIF.Business.Claim\clsClaimListGenerator.vb`
- `Business\SAIF.Business.Claim\clsClaimWorkReleaseStatus.vb`
- `Business\SAIF.Business.Claim\clsClaimWorkStatus.vb`
- `Business\SAIF.Business.Claim\clsFederalAwardStatus.vb`
- `Business\SAIF.Business.Claim\clsFederalAwardStatusCollection.vb`
- `Business\SAIF.Business.Claim\clsFederalBenefitSchedule.vb`
- `Business\SAIF.Business.Claim\clsITimelinessOfFirstPayment.vb`
- `Business\SAIF.Business.Claim\clsMedicallyStationaryDate.vb`
- `Business\SAIF.Business.Claim\clsPPDBodyParts.vb`
- `Business\SAIF.Business.Claim\clsPPDScheduledDegreeAwards.vb`
- `Business\SAIF.Business.Claim\clsPPDUnscheduledDegreeAwards.vb`
- `Business\SAIF.Business.Claim\clsServiceType.vb`
- `Business\SAIF.Business.Claim\clsServiceTypeCollection.vb`
- `Business\SAIF.Business.Claim\clsSetAwardPaymentPending.vb`
- `Business\SAIF.Business.Claim\clsStatutoryWeeklyWageCalculation.vb`
- `Business\SAIF.Business.Claim\clsVocationalServicesTypes.vb`
- `Business\SAIF.Business.Claim\clsWorkerInjuredBodyPart.vb`
- `Business\SAIF.Business.Claim\clsWorkerInjuredBodyPartCollection.vb`
- `Business\SAIF.Business.Claim\mdlPPD.vb`
- `Business\SAIF.Business.Claim\mdlReserveServices.vb`