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

# SAIF.Business.Claim.MedicalBill business rules

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

## BR-MB-001: Exposure claims require `ExposureClaim` AD resource authorization

| Field | Value |
| --- | --- |
| Statement | Exposure claims require `ExposureClaim` AD resource authorization |
| Trigger | Bill collection retrieval |
| Enforcement | `clsMedicalBillCollection.HasExposureAccess` |
| Outcome | Filters data based on authorization |
| Confidence | Source-backed |
| Source | `Business\SAIF.Business.Claim.MedicalBill\clsMedicalBillCollection.vb` — `HasExposureAccess` |

---

## BR-MB-002: Collateral health claims require `CollateralHealthClaim` AD resource authorization

| Field | Value |
| --- | --- |
| Statement | Collateral health claims require `CollateralHealthClaim` AD resource authorization |
| Trigger | Bill collection retrieval |
| Enforcement | `clsMedicalBillCollection.HasHealthIssueAccess` |
| Outcome | Filters data based on authorization |
| Confidence | Source-backed |
| Source | `Business\SAIF.Business.Claim.MedicalBill\clsMedicalBillCollection.vb` — `HasHealthIssueAccess` |

---

## BR-MB-003: SAIF employee status affects data visibility

| Field | Value |
| --- | --- |
| Statement | SAIF employee status affects data visibility |
| Trigger | Bill retrieval |
| Enforcement | `clsMedicalBillCollection.IsSAIFEmployee` — checks `SecurityPrincipal.Domain = "SAIF"` |
| Outcome | Domain-based filtering |
| Confidence | Source-backed |
| Source | `Business\SAIF.Business.Claim.MedicalBill\clsMedicalBillCollection.vb` — `IsSAIFEmployee`, `AfterRetrieve` |

---

## BR-MB-004: Optimistic concurrency on all CRUD operations

| Field | Value |
| --- | --- |
| Statement | Optimistic concurrency on all CRUD operations |
| Trigger | All After* lifecycle methods |
| Enforcement | All business objects |
| Outcome | DB contention error on failure |
| Confidence | Source-backed |
| Source | `Business\SAIF.Business.Claim.MedicalBill\clsNationalDrug.vb` — `AfterUpdate`; `Business\SAIF.Business.Claim.MedicalBill\clsNationalDrugPrice.vb` — `AfterUpdate`, `AfterDelete`; `Business\SAIF.Business.Claim.MedicalBill\clsNdcPriceHistory.vb` — `AfterInsert` |

---

## BR-MB-005: Bill search claim number must resolve to a valid SAIF claim

| Field | Value |
| --- | --- |
| Statement | When a claim number is entered on a bill search, it must resolve to a valid claim through claim security. |
| Trigger | `clsBillSearchCriteria.IsValid` evaluation of the `ClaimNumber` property. |
| Enforcement | `clsBillSearchCriteria.IsValidClaim` |
| Outcome | Search is blocked with a broken rule until the claim number is valid or cleared. |
| Confidence | Source-backed |
| Source | `Business\SAIF.Business.Claim.MedicalBill\clsBillSearchCriteria.vb` — `IsValidClaim` |

---

## BR-MB-006: Bill search provider location must be valid when entered

| Field | Value |
| --- | --- |
| Statement | When a provider location is entered on a bill search, it must resolve to a valid provider location; resolving it also derives the associated provider identifier. |
| Trigger | `clsBillSearchCriteria.IsValid` evaluation of the `ProviderLocID` property. |
| Enforcement | `clsBillSearchCriteria.IsValidProviderLocation` |
| Outcome | Search is blocked with a broken rule when the location does not resolve; `ProviderID` is set as a side effect when it does. |
| Confidence | Source-backed |
| Source | `Business\SAIF.Business.Claim.MedicalBill\clsBillSearchCriteria.vb` — `IsValidProviderLocation` |

---

## BR-MB-007: Bill search worker last name is required when a first name is entered

| Field | Value |
| --- | --- |
| Statement | A worker last name must be entered whenever a worker first name is entered on a bill search. |
| Trigger | `clsBillSearchCriteria.IsValid` evaluation of the `WorkerFirstName` property. |
| Enforcement | `clsBillSearchCriteria.IsValidFirstName` |
| Outcome | Search is blocked with a broken rule until a last name is also supplied. |
| Confidence | Source-backed |
| Source | `Business\SAIF.Business.Claim.MedicalBill\clsBillSearchCriteria.vb` — `IsValidFirstName` |

---

## BR-MB-008: Bill search service begin and end dates must both be entered together

| Field | Value |
| --- | --- |
| Statement | A service begin date and a service end date must both be entered together on a bill search, or neither. |
| Trigger | `clsBillSearchCriteria.IsValid` evaluation of the `ServiceBeginDate` property. |
| Enforcement | `clsBillSearchCriteria.IsValidDatesOfService` |
| Outcome | Search is blocked with a broken rule when only one of the two dates is present. |
| Confidence | Source-backed |
| Source | `Business\SAIF.Business.Claim.MedicalBill\clsBillSearchCriteria.vb` — `IsValidDatesOfService` |

---

## BR-MB-009: Bill search service begin date may not be in the future

| Field | Value |
| --- | --- |
| Statement | A bill search service begin date may not be later than today. |
| Trigger | `clsBillSearchCriteria.IsValid` evaluation of the `ServiceBeginDate` property. |
| Enforcement | `clsBillSearchCriteria.IsFromDateNotFuture` |
| Outcome | Search is blocked with a broken rule when the begin date is in the future. |
| Confidence | Source-backed |
| Source | `Business\SAIF.Business.Claim.MedicalBill\clsBillSearchCriteria.vb` — `IsFromDateNotFuture` |

---

## BR-MB-010: Bill search service end date may not precede the begin date

| Field | Value |
| --- | --- |
| Statement | A bill search service end date may not be earlier than the service begin date. |
| Trigger | `clsBillSearchCriteria.IsValid` evaluation of the `ServiceEndDate` property. |
| Enforcement | `clsBillSearchCriteria.IsValidThruDate` |
| Outcome | Search is blocked with a broken rule when the end date precedes the begin date. |
| Confidence | Source-backed |
| Source | `Business\SAIF.Business.Claim.MedicalBill\clsBillSearchCriteria.vb` — `IsValidThruDate` |

---

## BR-MB-011: Bill search date range may not exceed six months unless an identifier is given

| Field | Value |
| --- | --- |
| Statement | A bill search date range may not exceed six months unless a claim number, bill number, or check number is also entered. |
| Trigger | `clsBillSearchCriteria.IsValid` evaluation of the `ServiceBeginDate` property. |
| Enforcement | `clsBillSearchCriteria.IsValidDateRange` |
| Outcome | Search is blocked with a broken rule when the six-month window is exceeded without a qualifying identifier. |
| Confidence | Source-backed |
| Source | `Business\SAIF.Business.Claim.MedicalBill\clsBillSearchCriteria.vb` — `IsValidDateRange` |

---

## BR-MB-012: Bill search service end date may not be in the future

| Field | Value |
| --- | --- |
| Statement | A bill search service end date may not be later than today. |
| Trigger | `clsBillSearchCriteria.IsValid` evaluation of the `ServiceEndDate` property. |
| Enforcement | `clsBillSearchCriteria.IsThruDateNotFuture` |
| Outcome | Search is blocked with a broken rule when the end date is in the future. |
| Confidence | Source-backed |
| Source | `Business\SAIF.Business.Claim.MedicalBill\clsBillSearchCriteria.vb` — `IsThruDateNotFuture` |

---

## BR-MB-013: Bill search worker birth date may not be in the future

| Field | Value |
| --- | --- |
| Statement | A bill search worker birth date may not be later than today. |
| Trigger | `clsBillSearchCriteria.IsValid` evaluation of the `WorkerBirthDate` property. |
| Enforcement | `clsBillSearchCriteria.IsValidDob` |
| Outcome | Search is blocked with a broken rule when the birth date is in the future. |
| Confidence | Source-backed* (the rule's `RuleData` attribute text is copy-pasted from `IsFromDateNotFuture`, but the bound function and message describe a birth-date check) |
| Source | `Business\SAIF.Business.Claim.MedicalBill\clsBillSearchCriteria.vb` — `IsValidDob` |

---

## BR-MB-014: Internal bill search requires a claim number, bill number, or provider number

| Field | Value |
| --- | --- |
| Statement | A non-external bill search must include a claim number, bill number, or provider location before it is considered valid. |
| Trigger | `clsBillSearchCriteria.IsValid` evaluation of the `ClaimNumber` property, when the criteria object was constructed as non-external. |
| Enforcement | `clsBillSearchCriteria.IsValidSearchInfo` |
| Outcome | Search is blocked with a broken rule when none of the three identifiers is present; external searches skip this check. |
| Confidence | Source-backed |
| Source | `Business\SAIF.Business.Claim.MedicalBill\clsBillSearchCriteria.vb` — `IsValidSearchInfo` |

---

## BR-MB-015: Bill search by check number requires a provider number

| Field | Value |
| --- | --- |
| Statement | A bill search that includes a check number must also include a provider number. |
| Trigger | `clsBillSearchCriteria.IsValid` evaluation of the `CheckNumber` property. |
| Enforcement | `clsBillSearchCriteria.IsValidCheckNum` |
| Outcome | Search is blocked with a broken rule when a check number is entered without a resolved provider. |
| Confidence | Source-backed |
| Source | `Business\SAIF.Business.Claim.MedicalBill\clsBillSearchCriteria.vb` — `IsValidCheckNum` |

---

## BR-MB-016: Bill search starts-with option requires at least three characters

| Field | Value |
| --- | --- |
| Statement | When the starts-with option is selected for worker last name, at least three characters must be entered. |
| Trigger | `clsBillSearchCriteria.IsValid` evaluation of the `WorkerLastName` property. |
| Enforcement | `clsBillSearchCriteria.IsValidWildCard` |
| Outcome | Search is blocked with a broken rule when fewer than three characters are entered with starts-with selected. |
| Confidence | Source-backed |
| Source | `Business\SAIF.Business.Claim.MedicalBill\clsBillSearchCriteria.vb` — `IsValidWildCard` |

---

## BR-MB-017: Medical bill search requires exactly one of worker ID or provider location

| Field | Value |
| --- | --- |
| Statement | A medical bill search (`IsMedicalBillSearch`) must supply exactly one of `WorkerID` or `ProviderLocID`; supplying both or neither is invalid. |
| Trigger | `clsBillSearchCriteria.IsValid` evaluation of the `IsMedicalBillSearch` property. |
| Enforcement | `clsBillSearchCriteria.IsValidMedicalBillSearch` |
| Outcome | Search is blocked with a broken rule when zero or both identifiers are present. |
| Confidence | Source-backed |
| Source | `Business\SAIF.Business.Claim.MedicalBill\clsBillSearchCriteria.vb` — `IsValidMedicalBillSearch` |

---

## BR-MB-018: Active drug price selection prefers an unexpired row, falling back to the most recent effective date

| Field | Value |
| --- | --- |
| Statement | The active national drug price is the first price row found with an expiration date equal to `Date.MaxValue` or `Date.MinValue` (treated as unexpired); if no such row exists, the price row with the latest effective date is used instead. |
| Trigger | Reading `clsNationalDrug.ActivePrice`. |
| Enforcement | `clsNationalDrug.ActivePrice` |
| Outcome | Callers receive a single "current" price row for pricing calculations without having to scan the full price collection themselves. |
| Confidence | Source-backed |
| Source | `Business\SAIF.Business.Claim.MedicalBill\clsNationalDrug.vb` — `ActivePrice` |

---

## BR-MB-019: Pending bill payment totals are suppressed during a medical bill search

| Field | Value |
| --- | --- |
| Statement | `TotalPaidAmt` returns a null value for a pending bill when the bill belongs to a parent collection retrieved as a medical bill search (`IsMedicalBillSearch`), instead of the computed allowed-minus-admin-fee amount. |
| Trigger | Reading `clsMedicalBill.TotalPaidAmt` on a pending bill returned from a medical bill search. |
| Enforcement | `clsMedicalBill.TotalPaidAmt` |
| Outcome | Search result views do not display a misleading paid amount for bills that have not yet completed processing. |
| Confidence | Source-backed |
| Source | `Business\SAIF.Business.Claim.MedicalBill\clsMedicalBill.vb` — `TotalPaidAmt` |

---

## BR-MB-020: Audit and EOB detail retrieval is suppressed for bulk print views

| Field | Value |
| --- | --- |
| Statement | When `SuppressAuditDetail` is set on a bill or propagated across a bill collection, lazy retrieval of audit services, EOB notes, and adjustment descriptions is skipped for the affected bill(s). |
| Trigger | `clsMedicalBillCollection.SuppresAuditDetail` setter (propagates to each item) or `clsMedicalBill.SuppressAuditDetail` directly. |
| Enforcement | `clsMedicalBill.AuditServices`, `clsMedicalBill.EOBNotes`, `clsMedicalBill.AuditDescriptions`, `clsMedicalBillCollection.AuditDescriptions` |
| Outcome | Avoids per-bill audit-detail round trips when printing bill search result reports. |
| Confidence | Source-backed |
| Source | `Business\SAIF.Business.Claim.MedicalBill\clsMedicalBill.vb` — `SuppressAuditDetail`, `AuditServices`, `EOBNotes`; `Business\SAIF.Business.Claim.MedicalBill\clsMedicalBillCollection.vb` — `SuppresAuditDetail` |

---

## BR-MB-021: Worker name is masked for confidential claims

| Field | Value |
| --- | --- |
| Statement | `WorkerName` returns `** Confidential **` instead of the formatted worker name when the caller is internal (or is flagged as a SAIF employee) and the claim reports a worker conflict. |
| Trigger | Reading `clsMedicalBill.WorkerName`. |
| Enforcement | `clsMedicalBill.WorkerName` |
| Outcome | Confidential worker identity is withheld from views that would otherwise expose it. |
| Confidence | Source-backed |
| Source | `Business\SAIF.Business.Claim.MedicalBill\clsMedicalBill.vb` — `WorkerName` |

---

## BR-PROC-001: Service adjustments are sorted so code `FT` appears first, `PA` appears last, and all othe

| Field | Value |
| --- | --- |
| Statement | Service adjustments are sorted so code `FT` appears first, `PA` appears last, and all other codes sort in the middle. |
| Trigger | `CASE adj.AUDIT_ADJUSTMENT_CODE WHEN FT THEN 0 WHEN PA THEN 999 ELSE 1 END`. |
| Enforcement | PK82396_MEDICAL_BILLS.GetServiceAdjustments |
| Outcome | Consumers receive a stable adjustment ordering for the bill audit UI. |
| Confidence | Source-backed |
| Source | [PK82396_MEDICAL_BILLS.GetServiceAdjustments](procedures/pk82396_medical_bills.md#getserviceadjustments) |

---

## BR-PROC-002: Service descriptions prefer bill service description text and fall back to generic drug na

| Field | Value |
| --- | --- |
| Statement | Service descriptions prefer bill service description text and fall back to generic drug name when the service code is a national drug code. |
| Trigger | `NVL(CD.SERVICE_DESCR_TEXT, DRG.GENERIC_NAME)` with date-effective joins. |
| Enforcement | PK82396_MEDICAL_BILLS.GetAuditServices |
| Outcome | Audit-service retrieval returns the most specific available description. |
| Confidence | Source-backed |
| Source | [PK82396_MEDICAL_BILLS.GetAuditServices](procedures/pk82396_medical_bills.md#getauditservices) |

---

## BR-PROC-003: EOB note retrieval is always restricted to the requested bill identifier

| Field | Value |
| --- | --- |
| Statement | EOB note retrieval is always restricted to the requested bill identifier. |
| Trigger | `WHERE bill_id = inBillId`. |
| Enforcement | PK82396_MEDICAL_BILLS.GetEOBNotes |
| Outcome | Callers only receive note rows for the current medical bill. |
| Confidence | Source-backed |
| Source | [PK82396_MEDICAL_BILLS.GetEOBNotes](procedures/pk82396_medical_bills.md#geteobnotes) |

## 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)
- [Security and authorization](security-authorization.md)
- [API reference](api/index.md)

## Sources

- `Business\SAIF.Business.Claim.MedicalBill\clsMedicalBill.vb`
- `Business\SAIF.Business.Claim.MedicalBill\clsMedicalBillCollection.vb`
- `Business\SAIF.Business.Claim.MedicalBill\clsAuditServiceCollection.vb`
- `Business\SAIF.Business.Claim.MedicalBill\clsEOBNoteCollection.vb`
- `Business\SAIF.Business.Claim.MedicalBill\clsServiceAdjustmentCollection.vb`
- `Business\SAIF.Business.Claim.MedicalBill\clsNationalDrug.vb`
- `Business\SAIF.Business.Claim.MedicalBill\clsNationalDrugPrice.vb`
- `Business\SAIF.Business.Claim.MedicalBill\clsNdcPriceHistory.vb`
- `Business\SAIF.Business.Claim.MedicalBill\packages.config`
- `Business\SAIF.Business.Claim.MedicalBill\SAIF.BOF.Business.Claim.MedicalBill.nuspec`
- `Business\SAIF.Business.Claim.MedicalBill\Pipelines\build-vars.yml`
- `Business\SAIF.Business.Claim.MedicalBill\clsAdjustmentCode.vb`
- `Business\SAIF.Business.Claim.MedicalBill\clsAdjustmentCodeCollection.vb`
- `Business\SAIF.Business.Claim.MedicalBill\clsNationalDrugPriceCollection.vb`
- `Business\SAIF.Business.Claim.MedicalBill\clsNdcPriceHistoryCollection.vb`
- `Business\SAIF.Business.Claim.MedicalBill\clsBillSearchCriteria.vb`
