---
title: SAIF.Business.Claim.Entry business rules
summary: Business rules enforced by SAIF.Business.Claim.Entry.
status: draft
owner: SAIF Doc Gen
last_reviewed: 2026-07-30
library: SAIF.Business.Claim.Entry
reference_type: package
---

# SAIF.Business.Claim.Entry business rules

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

## BR-CE-001: Injury date must be on or after worker's birth date

| Field | Value |
| --- | --- |
| Statement | Injury date must be on or after worker's birth date |
| Trigger | `clsClaimEntry.IsValid` via `CompareInjuryDate_BirthDate` |
| Enforcement | `clsClaimEntry.vb` |
| Outcome | Validation failure if `InjuryDate < BirthDate` |
| Confidence | Source-backed |
| Source | See page sources |

---

## BR-CE-002: If birth date is entered, age at injury must be 0 (federal/inmate only)

| Field | Value |
| --- | --- |
| Statement | If birth date is entered, age at injury must be 0 (federal/inmate only) |
| Trigger | `ValidAgeAndBirthDate` called externally |
| Enforcement | `clsClaimEntry.vb` |
| Outcome | Validation failure |
| Confidence | Source-backed |
| Source | See page sources |

---

## BR-CE-003: Manual claim number must not already exist and must not exceed '7799999' if numeric

| Field | Value |
| --- | --- |
| Statement | Manual claim number must not already exist and must not exceed '7799999' if numeric |
| Trigger | `ValidManualClaim` |
| Enforcement | `clsClaimEntry.vb` |
| Outcome | Returns false — prevents save |
| Confidence | Source-backed |
| Source | See page sources |

---

## BR-CE-004: Active claim flag is 'Y' only when status is 'New'

| Field | Value |
| --- | --- |
| Statement | Active claim flag is 'Y' only when status is 'New' |
| Trigger | `BeforeInsert` / `BeforeUpdate` |
| Enforcement | `clsClaimEntry.vb` |
| Outcome | Derived field set automatically |
| Confidence | Source-backed |
| Source | See page sources |

---

## BR-CE-005: Work release status must exist if work release date or code is provided (state only)

| Field | Value |
| --- | --- |
| Statement | Work release status must exist if work release date or code is provided (state only) |
| Trigger | `UpdateWorkReleaseStatus` |
| Enforcement | `clsStateClaimEntry.vb` |
| Outcome | Creates/updates/deletes child object |
| Confidence | Source-backed |
| Source | See page sources |

---

## BR-CE-006: Tail coverage claims (policy subcode = 'T') are ineligible for fast track*

| Field | Value |
| --- | --- |
| Statement | Tail coverage claims (policy subcode = 'T') are ineligible for fast track* |
| Trigger | `IsPolicyTailCoverage` property |
| Enforcement | `clsClaimEntry.vb` |
| Outcome | Filtering condition for fast-track eligibility |
| Confidence | Source-backed |
| Source | See page sources |

---

## BR-CE-007: Non-Oregon state defaults county code to '37'

| Field | Value |
| --- | --- |
| Statement | Non-Oregon state defaults county code to '37' |
| Trigger | `DetermineCountyCode` |
| Enforcement | `clsStateClaimEntry.vb` |
| Outcome | Sets county to non-Oregon constant |
| Confidence | Source-backed |
| Source | See page sources |

---

## BR-CE-008: Oregon county code is resolved from zip via `ZIP_MCO_COUNTY` table

| Field | Value |
| --- | --- |
| Statement | Oregon county code is resolved from zip via `ZIP_MCO_COUNTY` table |
| Trigger | `DetermineCountyCode` |
| Enforcement | `clsStateClaimEntry.vb` |
| Outcome | Zip-to-county lookup |
| Confidence | Source-backed |
| Source | See page sources |

---

## BR-CE-009: Multiple employer letter request is inserted when claim is New and MultipleEmprFlag = 'Y'

| Field | Value |
| --- | --- |
| Statement | Multiple employer letter request is inserted when claim is New and MultipleEmprFlag = 'Y' |
| Trigger | `AddNewStatusData` (state) |
| Enforcement | `clsStateClaimEntry.vb` |
| Outcome | Insert to `CL_MULT_EMPLOYER_LETTER_REQ` |
| Confidence | Source-backed |
| Source | See page sources |

---

## BR-CE-010: Pharmacy eligibility update date must use override or default to current timestamp

| Field | Value |
| --- | --- |
| Statement | Pharmacy eligibility update date must use override or default to current timestamp |
| Trigger | `BeforeUpdate` |
| Enforcement | `clsPharmacyEligibility.vb` |
| Outcome | Conditional date assignment |
| Confidence | Source-backed |
| Source | See page sources |

---

## BR-CE-011: Optimistic concurrency — update fails if `RowsAffected <> 1`

| Field | Value |
| --- | --- |
| Statement | Optimistic concurrency — update fails if `RowsAffected <> 1` |
| Trigger | All `After*` methods |
| Enforcement | `clsClaimEntry.vb`, `clsPharmacyEligibility.vb` |
| Outcome | `AddErrorMessage` with DB contention error |
| Confidence | Source-backed |
| Source | See page sources |

---

## BR-CE-012: Multi-claim detection returns the most recently updated same-worker claim within a 14-day injury-date window

| Field | Value |
| --- | --- |
| Statement | `CheckForMultipleClaimsForWorker` searches `CL_INJURY_CLAIM` for the same worker, excludes the current claim, restricts to injury dates within ±14 days of the current claim's injury date, and returns only the SAIF claim number of the match with the maximum `UPDATE_DATE`. |
| Trigger | `clsClaimEntry.CheckForMultipleClaimsForWorker` |
| Enforcement | `clsClaimEntry.vb` |
| Outcome | Returns a trimmed claim number string (empty if no match); callers use it to warn of a possible duplicate/related claim.* |
| Confidence | Source-backed* |
| Source | See page sources |

---

## BR-CE-013: Saving a New-status claim cascades auxiliary status rows

| Field | Value |
| --- | --- |
| Statement | When a claim is saved with `IsNewStatus = True`, the save also queues inserts for claim request decision, claim status activity, and claim type activity; MCO eligibility is queued only when `McoID` is non-blank, and employer/policy history is queued only when `PolicyNum > 0`. |
| Trigger | `clsClaimEntry.AddNewStatusData`, called from `BeforeInsert` and `BeforeUpdate` |
| Enforcement | `clsClaimEntry.vb` |
| Outcome | Additional rows created in `CL_CLAIM_REQUEST_DECISION`, `CL_CLAIM_STATUS_ACTIVITY`, `CL_CLAIM_TYPE_ACTIVITY`, and conditionally `CL_CLAIM_MCO_ELIGIBILITY` / `CL_CLAIM_POLICY_HISTORY`; each auxiliary insert is separately row-count checked | 
| Confidence | Source-backed |
| Source | See page sources |

---

## BR-CE-014: Accepted manual claim numbers are truncated to seven characters with a recalculated check digit

| Field | Value |
| --- | --- |
| Statement | After `ValidManualClaim` accepts a manually entered claim number, only the leftmost seven characters are stored in `SaifClaimNum`, and the alpha check digit is always recomputed from that value rather than trusting any caller-supplied trailing check character. |
| Trigger | `clsClaimEntry.ValidManualClaim` |
| Enforcement | `clsClaimEntry.vb` |
| Outcome | Stored claim number is normalized to 7 characters plus a recalculated check digit |
| Confidence | Source-backed |
| Source | See page sources |

---

## BR-CE-015: Work-release status child record lifecycle follows presence of code/date and claim deletion

| Field | Value |
| --- | --- |
| Statement | `UpdateWorkReleaseStatus` creates a work-release-status child when a work release date or code is supplied and none exists; updates the child when both a code/date and the child already exist; deletes the child when both values become empty; and deletes any existing child outright when the parent claim itself is deleted. |
| Trigger | `clsStateClaimEntry.UpdateWorkReleaseStatus`, called from `IsValid` |
| Enforcement | `clsStateClaimEntry.vb` |
| Outcome | Child work-release-status object is created, updated, or deleted to stay consistent with the parent claim's work-release fields |
| Confidence | Source-backed |
| Source | See page sources |

---

## BR-CE-016: Full pharmacy eligibility extract excludes inactive records

| Field | Value |
| --- | --- |
| Statement | `GetEligibilityReports(inGetAllRecords:=True)` excludes rows where `eligibility_status_code = 'I'` from the full extract. |
| Trigger | `clsPharmacyEligibilityReportCollection.GetEligibilityReports` |
| Enforcement | `clsPharmacyEligibility.vb` |
| Outcome | Inactive eligibility rows are never returned in the full-extract mode |
| Confidence | Source-backed |
| Source | See page sources |

---

## BR-CE-017: Change-only pharmacy eligibility extract requires an untransmitted or changed row

| Field | Value |
| --- | --- |
| Statement | `GetEligibilityReports(inGetAllRecords:=False)` returns only rows that are untransmitted or updated after their last transmit date, whose current status or effective date differs from the previous stored values, and excludes both never-transmitted-inactive rows and inactive-to-inactive repeats. |
| Trigger | `clsPharmacyEligibilityReportCollection.GetEligibilityReports` |
| Enforcement | `clsPharmacyEligibility.vb` |
| Outcome | Delta extract used for incremental pharmacy eligibility transmission |
| Confidence | Source-backed |
| Source | See page sources |

---

## BR-CE-018: First-fill (FF) eligibility extract remaps inactive status to outbound code `'1'`

| Field | Value |
| --- | --- |
| Statement | `GetEligibilityFFReports` hard-codes the outbound `EligibilityStatusCode` to `'1'` for rows where MedImpact has been transmitted (`medimpact_transmit_date is not null`), the stored status is inactive (`'I'`), and the regular transmit has not yet occurred (`transmit_date is null`). |
| Trigger | `clsPharmacyEligibilityReportCollection.GetEligibilityFFReports` |
| Enforcement | `clsPharmacyEligibility.vb` |
| Outcome | Downstream consumers see outbound code `'1'` instead of the stored inactive code for this specific transmit-timing combination |
| Confidence | Source-backed |
| Source | See page sources |

---

## BR-CE-019: First-fill eligibility pickup requires a related document, no MedImpact transmit, and a two-minute aging delay

| Field | Value |
| --- | --- |
| Statement | `GetFirstFillEligibilityReports` requires a joined `CL_801_DOCUMENT` row with document type code `'9'`, a null `medimpact_transmit_date`, a non-inactive eligibility status, and an `update_date` at least two minutes in the past before the row is eligible for first-fill pickup. |
| Trigger | `clsPharmacyEligibilityReportCollection.GetFirstFillEligibilityReports` |
| Enforcement | `clsPharmacyEligibility.vb` |
| Outcome | Prevents first-fill extraction of rows that are too new or lack the required supporting document |
| Confidence | Source-backed |
| Source | See page sources |

---

## BR-CE-020: Submitted Online 801 submissions cannot be deleted

| Field | Value |
| --- | --- |
| Statement | `Rule_ValidDelete` blocks deletion of a `cls801Submission` unless its status is Incomplete; a submitted submission is not deletable from the business layer. |
| Trigger | `cls801Submission` validation rules, evaluated before `Save()`/delete |
| Enforcement | `Online801\Submission\cls801Submission.vb` |
| Outcome | Validation failure prevents deletion of submitted rows |
| Confidence | Source-backed |
| Source | See page sources |

---

## BR-CE-021: New Online 801 submissions default to Incomplete status with preseeded language and policy number

| Field | Value |
| --- | --- |
| Statement | A newly created `cls801Submission` always starts with `SubmissionStatusCode = INCOMPLETE`, defaults `SubmissionData.Box12LanguagePreferenceCode` to "None", and copies the supplied policy number into `SubmissionData.Box36InsurancePolicyNum`. |
| Trigger | `cls801Submission.New801Submission` / `Create` |
| Enforcement | `Online801\Submission\cls801Submission.vb` |
| Outcome | New submissions always begin in a consistent default state |
| Confidence | Source-backed |
| Source | See page sources |

---

## BR-CE-022: Worker lookup requires unique-PersonID consensus and uses a 14-day injury-date window for same-claim detection

| Field | Value |
| --- | --- |
| Statement | `FindWorker` treats a search as resolved only when every returned candidate shares the same `PersonID`; when a resolved worker's injury date falls within ±14 days of the submission's injury date, the matching claim is treated as the same claim and its `ClaimID` is adopted. |
| Trigger | `cls801Submission.FindWorker`, delegating to `clsFindWorkerAPI` |
| Enforcement | `Online801\Submission\cls801Submission.vb`, `Online801\Submission\clsFindWorkerAPI.vb` |
| Outcome | Prevents duplicate claim creation when a matching in-progress claim already exists for the worker |
| Confidence | Source-backed |
| Source | See page sources |

---

## BR-CE-023: ClaimCenter submission shifts loss date and claimant birth date to avoid same-day rollback

| Field | Value |
| --- | --- |
| Statement | Before building the ClaimCenter submission payload, `clsNewClaimModel` shifts `LossDate` forward by one minute and shifts the claimant's date of birth forward by two hours, to avoid the receiving system rolling either date back a day due to time-zone conversion. |
| Trigger | `clsNewClaimModel.New(submission)` |
| Enforcement | `Online801\Submission\ApiNewClaimModels\clsNewClaimModel.vb` |
| Outcome | ClaimCenter receives shifted date/time values rather than the raw stored dates* |
| Confidence | Source-backed* |
| Source | See page sources |

---

## BR-CE-024: Claim search requires a policy number greater than zero

| Field | Value |
| --- | --- |
| Statement | `clsClaimSearchCriteria`'s only registered validation rule, `ValidPolicyNum`, requires `PolicyNum > 0`; an invalid (unset) policy number causes `GetResults` to return an empty collection rather than raising an error. |
| Trigger | `clsClaimSearchCriteria` business rules, evaluated via `IsValid` in `clsClaimSearchResultCollection.GetResults` |
| Enforcement | `Online801\Search\clsClaimSearchCriteria.vb`, `Online801\Search\clsClaimSearchResult.vb` |
| Outcome | Searches without a policy number silently return no results |
| Confidence | Source-backed |
| Source | See page sources |

---

## BR-PROC-001: Updates only succeed when the caller-supplied `LastUpdateNum` matches the current row vers

| Field | Value |
| --- | --- |
| Statement | Updates only succeed when the caller-supplied `LastUpdateNum` matches the current row version. |
| Trigger | `WHERE ... UPDATE_NUM = LastUpdateNum` in `submission_update`. |
| Enforcement | PK82538_ONLINE_801_CLAIM.submission_update |
| Outcome | Returns `SQL%ROWCOUNT`; the BOF caller treats non-1 results as a contention failure. |
| Confidence | Source-backed |
| Source | [PK82538_ONLINE_801_CLAIM.submission_update](procedures/pk82538_online_801_claim.md#submission_update) |

---

## BR-PROC-002: Deletes only succeed when the caller-supplied `LastUpdateNum` matches the current row vers

| Field | Value |
| --- | --- |
| Statement | Deletes only succeed when the caller-supplied `LastUpdateNum` matches the current row version. |
| Trigger | `WHERE ... UPDATE_NUM = LastUpdateNum` in `submission_delete` and `submission_data_delete`. |
| Enforcement | PK82538_ONLINE_801_CLAIM.submission_delete |
| Outcome | Returns `SQL%ROWCOUNT` so the caller can reject stale deletes. |
| Confidence | Source-backed |
| Source | [PK82538_ONLINE_801_CLAIM.submission_delete](procedures/pk82538_online_801_claim.md#submission_delete) |

---

## BR-PROC-003: Document updates are version-checked with `LastUpdateNum`

| Field | Value |
| --- | --- |
| Statement | Document updates are version-checked with `LastUpdateNum`. |
| Trigger | `WHERE CL_801_DOCUMENT_SEQ_NUM = DocSeqNum and update_num = LastUpdateNum`. |
| Enforcement | PK82538_ONLINE_801_CLAIM.document_update |
| Outcome | Protects Online 801 document rows from lost updates. |
| Confidence | Source-backed |
| Source | [PK82538_ONLINE_801_CLAIM.document_update](procedures/pk82538_online_801_claim.md#document_update) |

## Notes

- Procedure-derived rules are mirrored here so claim-domain readers do not have to open procedure pages to see active constraints.
- Rules without BOF rule attributes are enforced by lifecycle methods, helper methods, or stored-procedure contracts.

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

## Sources

- `Business\SAIF.Business.Claim.Entry\clsClaimEntry.vb`
- `Business\SAIF.Business.Claim.Entry\clsStateClaimEntry.vb`
- `Business\SAIF.Business.Claim.Entry\clsClaimEntryBusinessRules.vb`
- `Business\SAIF.Business.Claim.Entry\clsPharmacyEligibility.vb`
- `Business\SAIF.Business.Claim.Entry\enums.vb`
- `Business\SAIF.Business.Claim.Entry\packages.config`
- `Business\SAIF.Business.Claim.Entry\SAIF.BOF.Business.Claim.Entry.nuspec`
- `Business\SAIF.Business.Claim.Entry\app.config`
- `Business\SAIF.Business.Claim.Entry\nuget.config`
- `Business\SAIF.Business.Claim.Entry\Pipelines\build-vars.yml`
- `Business\SAIF.Business.Claim.Entry\Pipelines\build.yml`
- `Business\SAIF.Business.Claim.Entry\Pipelines\release.yml`
- `Business\SAIF.Business.Claim.Entry\Online801\Submission\cls801Document.vb`
- `Business\SAIF.Business.Claim.Entry\Online801\Submission\cls801Submission.vb`
- `Business\SAIF.Business.Claim.Entry\Online801\Submission\cls801SubmissionData.vb`
- `Business\SAIF.Business.Claim.Entry\Online801\Submission\clsFindWorkerAPI.vb`
- `Business\SAIF.Business.Claim.Entry\Online801\Submission\clsSubmitClaimByAPI.vb`
- `Business\SAIF.Business.Claim.Entry\Online801\Search\clsClaimSearchResult.vb`
- `Business\SAIF.Business.Claim.Entry\Online801\Search\clsClaimSearchCriteria.vb`
- `Business\SAIF.Business.Claim.Entry\Online801\Search\CCClaimDataApi\clsClaimSearchApi.vb`
- `Business\SAIF.Business.Claim.Entry\Online801\CCClaimDataAPIResponseData.vb`
- `Business\SAIF.Business.Claim.Entry\Online801\ClaimCenterAPIResponseData.vb`
- `Business\SAIF.Business.Claim.Entry\Online801\clsRecordInfo.vb`
- `Business\SAIF.Business.Claim.Entry\Online801\mdlCodeTables.vb`
