---
title: SAIF.Business.Provider business rules
summary: Enumerated business rules enforced by SAIF.Business.Provider.
status: draft
owner: SAIF
last_reviewed: 2026-07-30
library: SAIF.Business.Provider
reference_type: package
---

# SAIF.Business.Provider business rules

This page captures the primary validation and persistence rules enforced by `SAIF.Business.Provider`.

## BR-001: Search requires at least one criterion

| Field | Value |
| --- | --- |
| **Statement** | A provider search must include at least one search field. |
| **Trigger** | A caller submits clsProviderSearch criteria with all fields empty. |
| **Enforcement** | clsProviderSearch.Rule_ValidCriteria rejects the request with "Error: enter your search criteria." |
| **Outcome** | The search does not execute until the caller provides at least one criterion. |
| **Confidence** | Verified |
| **Tables** | [PROVIDER_LOCATION](database-tables.md#provider_location), [PROVIDER_ADDRESS](database-tables.md#provider_address), [PROVIDER_TYPE_CODE](database-tables.md#provider_type_code) |
| **Source** | `Business\SAIF.Business.Provider\clsProviderSearch.vb` |

---

## BR-002: Search ZIP code must be numeric

| Field | Value |
| --- | --- |
| **Statement** | A provider search ZIP code must be numeric when supplied. |
| **Trigger** | A caller populates the ZIP code field in clsProviderSearch. |
| **Enforcement** | clsProviderSearch.Rule_ValidZipCode validates the ZIP code before query execution. |
| **Outcome** | Invalid ZIP input prevents the search from running. |
| **Confidence** | Verified |
| **Tables** | [PROVIDER_ADDRESS](database-tables.md#provider_address) |
| **Source** | `Business\SAIF.Business.Provider\clsProviderSearch.vb` |

---

## BR-003: Only one primary location is allowed

| Field | Value |
| --- | --- |
| **Statement** | A provider can have only one primary location. |
| **Trigger** | A location is saved with PrimaryLocationFlag enabled. |
| **Enforcement** | clsProviderLocation.HasDuplicatePrimaryLocation validates the flag before persistence. |
| **Outcome** | The save fails when another primary location already exists for the provider. |
| **Confidence** | Verified |
| **Tables** | [PROVIDER_LOCATION](database-tables.md#provider_location) |
| **SQL** | [SQL-028](sql/SQL-028-insert-provider-location.md), [SQL-076](sql/SQL-076-update-provider-location.md) |
| **Source** | `Business\SAIF.Business.Provider\clsProviderLocation.vb` |

---

## BR-004: Provider type is required for a location

| Field | Value |
| --- | --- |
| **Statement** | A provider location must include a provider type code. |
| **Trigger** | A location is inserted or updated. |
| **Enforcement** | clsProviderLocation.MissingProviderType validates ProviderTypeCode before persistence. |
| **Outcome** | The save fails until a provider type is selected. |
| **Confidence** | Verified |
| **Tables** | [PROVIDER_LOCATION](database-tables.md#provider_location), [PROVIDER_TYPE_CODE](database-tables.md#provider_type_code) |
| **SQL** | [SQL-028](sql/SQL-028-insert-provider-location.md), [SQL-076](sql/SQL-076-update-provider-location.md) |
| **Source** | `Business\SAIF.Business.Provider\clsProviderLocation.vb` |

---

## BR-005: Business locations require a business name

| Field | Value |
| --- | --- |
| **Statement** | A location marked as a business must provide a business name. |
| **Trigger** | BusinessFlag is set to Y on a provider location. |
| **Enforcement** | clsProviderLocation.MissingBusinessName validates BusinessName before persistence. |
| **Outcome** | The location cannot be saved without a business name. |
| **Confidence** | Verified |
| **Tables** | [PROVIDER_LOCATION](database-tables.md#provider_location) |
| **SQL** | [SQL-028](sql/SQL-028-insert-provider-location.md), [SQL-076](sql/SQL-076-update-provider-location.md) |
| **Source** | `Business\SAIF.Business.Provider\clsProviderLocation.vb` |

---

## BR-006: Individual locations require a last name

| Field | Value |
| --- | --- |
| **Statement** | A location marked as an individual provider must provide a last name. |
| **Trigger** | BusinessFlag is set to N on a provider location. |
| **Enforcement** | clsProviderLocation.MissingLastName validates LastName before persistence. |
| **Outcome** | The location cannot be saved without a last name. |
| **Confidence** | Verified |
| **Tables** | [PROVIDER_LOCATION](database-tables.md#provider_location) |
| **SQL** | [SQL-028](sql/SQL-028-insert-provider-location.md), [SQL-076](sql/SQL-076-update-provider-location.md) |
| **Source** | `Business\SAIF.Business.Provider\clsProviderLocation.vb` |

---

## BR-007: Address effective periods must not overlap

| Field | Value |
| --- | --- |
| **Statement** | A provider location cannot keep two addresses of the same type active for overlapping date ranges. |
| **Trigger** | A provider address is inserted or updated with effective and expiration dates. |
| **Enforcement** | clsProviderAddress overlap validations run before persistence. |
| **Outcome** | The save fails when the date range overlaps another address of the same type. |
| **Confidence** | Verified |
| **Tables** | [PROVIDER_ADDRESS](database-tables.md#provider_address) |
| **SQL** | [SQL-019](sql/SQL-019-insert-provider-address.md), [SQL-067](sql/SQL-067-update-provider-address.md) |
| **Source** | `Business\SAIF.Business.Provider\clsProviderAddress.vb` |

---

## BR-008: Domestic addresses require city, state, and ZIP data

| Field | Value |
| --- | --- |
| **Statement** | A domestic provider address must provide address line 1, city, state, and ZIP code. |
| **Trigger** | A provider address is saved with ForeignAddressFlag not set to Y. |
| **Enforcement** | clsProviderAddress required-field validations run before persistence. |
| **Outcome** | Incomplete domestic addresses cannot be saved. |
| **Confidence** | Verified |
| **Tables** | [PROVIDER_ADDRESS](database-tables.md#provider_address) |
| **SQL** | [SQL-019](sql/SQL-019-insert-provider-address.md), [SQL-067](sql/SQL-067-update-provider-address.md) |
| **Source** | `Business\SAIF.Business.Provider\clsProviderAddress.vb` |

---

## BR-009: Contacts require a type and a communication path

| Field | Value |
| --- | --- |
| **Statement** | A provider contact must include a contact type and at least one of phone number or email address. |
| **Trigger** | A provider contact is inserted or updated. |
| **Enforcement** | clsProviderContact.ValidateContactType and ValidateEmailPhone run before persistence. |
| **Outcome** | Incomplete contact records are rejected. |
| **Confidence** | Verified |
| **Tables** | [PROVIDER_CONTACT](database-tables.md#provider_contact) |
| **SQL** | [SQL-021](sql/SQL-021-insert-provider-contact.md), [SQL-069](sql/SQL-069-update-provider-contact.md) |
| **Source** | `Business\SAIF.Business.Provider\clsProviderContact.vb` |

---

## BR-010: National Provider ID values must be 10 digits

| Field | Value |
| --- | --- |
| **Statement** | Provider identifiers recorded as National Provider IDs must be exactly 10 digits. |
| **Trigger** | A provider identity is saved for an NPI value. |
| **Enforcement** | clsProviderIdentity.ValidValue validates IdentityValue before persistence. |
| **Outcome** | Invalid NPI values cannot be saved. |
| **Confidence** | Verified |
| **Tables** | [PROVIDER_IDENTITY](database-tables.md#provider_identity) |
| **SQL** | [SQL-024](sql/SQL-024-insert-provider-identity.md), [SQL-072](sql/SQL-072-update-provider-identity.md) |
| **Source** | `Business\SAIF.Business.Provider\clsProviderIdentity.vb` |

---

## BR-011: TIN values must be nine numeric digits and unique

| Field | Value |
| --- | --- |
| **Statement** | A provider tax ID must contain nine numeric digits and cannot duplicate an existing TIN. |
| **Trigger** | A provider tax ID is inserted or updated. |
| **Enforcement** | clsProviderTaxID TIN validations run before persistence. |
| **Outcome** | Invalid or duplicate TIN records are rejected. |
| **Confidence** | Verified |
| **Tables** | [PROVIDER_TAX_ID](database-tables.md#provider_tax_id) |
| **SQL** | [SQL-036](sql/SQL-036-insert-provider-tax-i-d.md), [SQL-084](sql/SQL-084-update-provider-tax-i-d.md) |
| **Source** | `Business\SAIF.Business.Provider\clsProviderTaxID.vb` |

---

## BR-012: Only one primary TIN is allowed per provider

| Field | Value |
| --- | --- |
| **Statement** | A provider can have only one primary tax ID. |
| **Trigger** | A tax ID is saved with PrimaryTaxIDFlag enabled. |
| **Enforcement** | clsProviderTaxID.HasDuplicatePrimaryTaxID validates the flag before persistence. |
| **Outcome** | The save fails when another primary TIN already exists for the provider. |
| **Confidence** | Verified |
| **Tables** | [PROVIDER_TAX_ID](database-tables.md#provider_tax_id), [PROVIDER](database-tables.md#provider) |
| **SQL** | [SQL-036](sql/SQL-036-insert-provider-tax-i-d.md), [SQL-084](sql/SQL-084-update-provider-tax-i-d.md) |
| **Source** | `Business\SAIF.Business.Provider\clsProviderTaxID.vb` |

---

## BR-013: Relationship participants must exist and be distinct

| Field | Value |
| --- | --- |
| **Statement** | A provider relationship must reference two existing provider locations and the two locations cannot be the same. |
| **Trigger** | A provider relationship is inserted or updated. |
| **Enforcement** | clsProviderRelationship validates both location identifiers and checks that the parent and child are different. |
| **Outcome** | Invalid relationship records are rejected. |
| **Confidence** | Verified |
| **Tables** | [PROVIDER_RELATIONSHIP](database-tables.md#provider_relationship), [PROVIDER_LOCATION](database-tables.md#provider_location) |
| **SQL** | [SQL-030](sql/SQL-030-insert-provider-relationship.md), [SQL-078](sql/SQL-078-update-provider-relationship.md) |
| **Source** | `Business\SAIF.Business.Provider\clsProviderRelationship.vb` |

---

## BR-014: Relationship dates must be valid and non-overlapping

| Field | Value |
| --- | --- |
| **Statement** | A provider relationship requires an effective date, cannot expire before it becomes effective, and cannot overlap an existing relationship of the same type. |
| **Trigger** | A provider relationship is inserted or updated. |
| **Enforcement** | clsProviderRelationship validates dates and checks for duplicate overlapping relationships. |
| **Outcome** | Conflicting relationship records cannot be saved. |
| **Confidence** | Verified |
| **Tables** | [PROVIDER_RELATIONSHIP](database-tables.md#provider_relationship) |
| **SQL** | [SQL-030](sql/SQL-030-insert-provider-relationship.md), [SQL-078](sql/SQL-078-update-provider-relationship.md) |
| **Source** | `Business\SAIF.Business.Provider\clsProviderRelationship.vb` |

---

## BR-015: Notes require both type and text

| Field | Value |
| --- | --- |
| **Statement** | A provider note must include a note type code and note text. |
| **Trigger** | A note is inserted or updated. |
| **Enforcement** | clsNote TextRequired rules validate NoteTypeCode and NoteTxt before persistence. |
| **Outcome** | Blank notes and untyped notes are rejected. |
| **Confidence** | Verified |
| **Tables** | [CBP_NOTE](database-tables.md#cbp_note) |
| **SQL** | [SQL-017](sql/SQL-017-insert-note.md), [SQL-065](sql/SQL-065-update-note.md) |
| **Source** | `Business\SAIF.Business.Provider\clsNote.vb` |

## BR-016: MCO membership period must fall within the MCO plan's active date range

| Field | Value |
| --- | --- |
| **Statement** | A provider's MCO membership effective/expiration period must fall entirely within the effective/expiration dates of the referenced MCO plan. |
| **Trigger** | A provider MCO membership is inserted or updated with an effective date, and optionally an expiration date. |
| **Enforcement** | clsProviderMCOMembership.ActiveEffDate compares the membership period to clsMCOPlan.GetMCOPlan(...).EffDate/ExpDate, treating a blank plan or membership expiration as open-ended. |
| **Outcome** | The save fails when the membership period extends outside the plan's active dates. |
| **Confidence** | Verified |
| **Tables** | [MCO_PROVIDER](database-tables.md#mco_provider), [MCO_PLAN](database-tables.md#mco_plan) |
| **SQL** | [SQL-029](sql/SQL-029-insert-provider-m-c-o-membership.md), [SQL-077](sql/SQL-077-update-provider-m-c-o-membership.md) |
| **Source** | `Business\SAIF.Business.Provider\clsProviderMCOMembership.vb` |

---

## BR-017: MCO membership expiration cannot precede an effective service contract's expiration

| Field | Value |
| --- | --- |
| **Statement** | When a provider MCO membership record is being expired, its expiration date cannot be earlier than the expiration date of an effective provider service contract for the same MCO plan and location. |
| **Trigger** | A dirty provider MCO membership is saved with an ExpDate populated. |
| **Enforcement** | clsProviderMCOMembership.BeforeContractExpDate calls IsServiceContractEffective, which counts PROVIDER_SERVICE_CONTRACT rows for the same location/plan whose expiration (or an open-ended NVL to 31-Dec-2999) exceeds the proposed membership expiration date. |
| **Outcome** | The save fails while an effective service contract would outlive the membership record. |
| **Confidence** | Verified |
| **Tables** | [MCO_PROVIDER](database-tables.md#mco_provider), [PROVIDER_SERVICE_CONTRACT](database-tables.md#provider_service_contract) |
| **SQL** | [SQL-077](sql/SQL-077-update-provider-m-c-o-membership.md) |
| **Source** | `Business\SAIF.Business.Provider\clsProviderMCOMembership.vb` |

---

## BR-018: MCO membership admin fee flag and rate must be mutually consistent

| Field | Value |
| --- | --- |
| **Statement** | A provider MCO membership's admin-fee rate must be present and no greater than 1.000 when the admin fee flag is enabled, and must be blank when the flag is not enabled. |
| **Enforcement** | clsProviderMCOMembership.ValidAdminFeeRate. |
| **Outcome** | Membership rows with an inconsistent admin-fee flag/rate combination cannot be saved. |
| **Confidence** | Verified |
| **Tables** | [MCO_PROVIDER](database-tables.md#mco_provider) |
| **SQL** | [SQL-029](sql/SQL-029-insert-provider-m-c-o-membership.md), [SQL-077](sql/SQL-077-update-provider-m-c-o-membership.md) |
| **Source** | `Business\SAIF.Business.Provider\clsProviderMCOMembership.vb` |

---

## BR-019: Exactly one primary provider service is allowed per location, without duplicate service codes

| Field | Value |
| --- | --- |
| **Statement** | A provider location's service collection must include exactly one row flagged primary, and no service code may repeat within that collection. |
| **Trigger** | A provider service row is saved as part of its sibling `clsProviderServiceCollection`. |
| **Enforcement** | clsProviderService.HasPrimaryService, HasDuplicatePrimaryService, and HasDuplicateService inspect the RelatedServices collection. |
| **Outcome** | The save fails when zero or multiple primary rows exist, or a service code is duplicated. |
| **Confidence** | Verified |
| **Tables** | [PROVIDER_SERVICE](database-tables.md#provider_service) |
| **SQL** | [SQL-032](sql/SQL-032-insert-provider-service.md), [SQL-080](sql/SQL-080-update-provider-service.md) |
| **Source** | `Business\SAIF.Business.Provider\clsProviderService.vb` |

---

## BR-020: Provider service contract pricing fields are mutually exclusive

| Field | Value |
| --- | --- |
| **Statement** | A provider service contract's discount rate, additional-fee discount rate, and maximum charge amount must together total more than zero, but no more than one of the three may be populated. |
| **Enforcement** | clsProviderServiceContract.AmtOrRateRequired and AmtAndRateNotZero. |
| **Outcome** | Contract rows missing all three pricing fields, or populating more than one, cannot be saved. |
| **Confidence** | Verified |
| **Tables** | [PROVIDER_SERVICE_CONTRACT](database-tables.md#provider_service_contract) |
| **SQL** | [SQL-034](sql/SQL-034-insert-provider-service-contract.md), [SQL-082](sql/SQL-082-update-provider-service-contract.md) |
| **Source** | `Business\SAIF.Business.Provider\clsProviderServiceContract.vb` |

---

## BR-021: Package-priced and equipment service contract rows carry additional cross-field requirements

| Field | Value |
| --- | --- |
| **Statement** | A provider service contract identifying a package-priced service (service code `Z`) requires an MCO plan and disallows discount-rate fields; a contract identifying equipment or a service type equal to `E` requires a purchase code, and other rows must leave the purchase code blank. Service type code and CBP service code are mutually exclusive, and exactly one is required. |
| **Enforcement** | clsProviderServiceContract.MCOPlanRequired, DiscountRateNotAllowed, AdditionalFeeDiscountRateNotAllowed, PurchaseCodeRequired, PurchaseCodeInvalid, ServiceTypeCodeAndServiceCode, ServiceTypeCodeOrServiceCodeRequired. |
| **Outcome** | Contract rows violating any of these cross-field combinations cannot be saved. |
| **Confidence** | Verified |
| **Tables** | [PROVIDER_SERVICE_CONTRACT](database-tables.md#provider_service_contract) |
| **SQL** | [SQL-034](sql/SQL-034-insert-provider-service-contract.md), [SQL-082](sql/SQL-082-update-provider-service-contract.md) |
| **Source** | `Business\SAIF.Business.Provider\clsProviderServiceContract.vb` |

---

## BR-022: Provider ineligibility periods must fall within a reasonable, non-future date range

| Field | Value |
| --- | --- |
| **Statement** | A provider ineligibility period's start date cannot precede 01/01/1850 or fall in the future, and its termination date cannot precede the start date, fall in the future, or be more than 30 years in the past. |
| **Enforcement** | clsProviderIneligibilityPeriod.UnreasonableStartDate, LateStartDate, ValidTerminationDate, LateTerminationDate, and EarlyTerminationDate. |
| **Outcome** | Ineligibility periods with an out-of-range date are rejected. |
| **Confidence** | Verified |
| **Tables** | [PROVIDER_INELIG_PERIOD](database-tables.md#provider_inelig_period) |
| **SQL** | [SQL-026](sql/SQL-026-insert-provider-ineligibility-period.md), [SQL-074](sql/SQL-074-update-provider-ineligibility-period.md) |
| **Source** | `Business\SAIF.Business.Provider\clsProviderIneligibilityPeriod.vb` |

---

## BR-023: Provider DCBS cost/charge factor must be between 0.000 and 1.000 inclusive

| Field | Value |
| --- | --- |
| **Statement** | A provider location's DCBS cost/charge factor must be between 0.000 and 1.000 inclusive, and its effective/expiration dates must stay within -30 years to +10 years of today with the expiration not preceding the effective date. |
| **Enforcement** | clsProviderDcbsCostCharge.ValidCostChargeFactor, EarlyEffDate, LateEffDate, LateExpDate, and ValidEffExpDate. |
| **Outcome** | Cost/charge records with an out-of-range factor or date cannot be saved. |
| **Confidence** | Verified |
| **Tables** | [PROVIDER_DCBS_COST_CHARGE](database-tables.md#provider_dcbs_cost_charge) |
| **SQL** | [SQL-023](sql/SQL-023-insert-provider-dcbs-cost-charge.md), [SQL-071](sql/SQL-071-update-provider-dcbs-cost-charge.md) |
| **Source** | `Business\SAIF.Business.Provider\clsProviderDcbsCostCharge.vb` |

---

## BR-024: A provider relationship in use cannot be deleted, only expired

| Field | Value |
| --- | --- |
| **Statement** | A provider relationship that is referenced by an attending physician or a claim legal representative cannot be deleted; it must be expired instead. |
| **Trigger** | An existing provider relationship's child or parent location is changed. |
| **Enforcement** | clsProviderRelationship.RelationshipInUseRule queries RelationshipInUse against ATTENDING_PHYSICIAN and CL_CLAIM_LEGAL_REPRESENTATIVE. |
| **Outcome** | The save is rejected with "Relationship in use, must be expired instead of deleted." while the relationship remains referenced.* |
| **Confidence** | Inferred |
| **Tables** | [PROVIDER_RELATIONSHIP](database-tables.md#provider_relationship) |
| **SQL** | [SQL-078](sql/SQL-078-update-provider-relationship.md) |
| **Source** | `Business\SAIF.Business.Provider\clsProviderRelationship.vb` |

---

## BR-025: An existing provider tax ID value is immutable once saved

| Field | Value |
| --- | --- |
| **Statement** | Once a provider tax ID (TIN) has been saved, its underlying 9-digit value cannot be changed; only its display formatting may be altered. |
| **Enforcement** | clsProviderTaxID.AlteredTIN compares the current TaxID to the originally retrieved value. |
| **Outcome** | Attempts to change an existing TIN's digits are rejected with "This TIN may not be changed. Only the format may be altered." |
| **Confidence** | Verified |
| **Tables** | [PROVIDER_TAX_ID](database-tables.md#provider_tax_id) |
| **SQL** | [SQL-084](sql/SQL-084-update-provider-tax-i-d.md) |
| **Source** | `Business\SAIF.Business.Provider\clsProviderTaxID.vb` |

---

## BR-026: A provider address expiration date cannot be removed while a later address of the same type exists

| Field | Value |
| --- | --- |
| **Statement** | A provider address that has already been assigned an expiration date cannot have that expiration date cleared if a later address of the same address type already exists. |
| **Enforcement** | clsProviderAddress.ValidateExpDate. |
| **Outcome** | The save is rejected with "Error: Expiration date cannot be removed." |
| **Confidence** | Verified |
| **Tables** | [PROVIDER_ADDRESS](database-tables.md#provider_address) |
| **SQL** | [SQL-067](sql/SQL-067-update-provider-address.md) |
| **Source** | `Business\SAIF.Business.Provider\clsProviderAddress.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)
- [API reference](api/index.md)
- [Configuration](configuration.md)

## Sources
- `Business\SAIF.Business.Provider\clsProviderSearch.vb`
- `Business\SAIF.Business.Provider\clsProviderSearch.vb`
- `Business\SAIF.Business.Provider\clsProviderLocation.vb`
- `Business\SAIF.Business.Provider\clsProviderLocation.vb`
- `Business\SAIF.Business.Provider\clsProviderLocation.vb`
- `Business\SAIF.Business.Provider\clsProviderLocation.vb`
- `Business\SAIF.Business.Provider\clsProviderAddress.vb`
- `Business\SAIF.Business.Provider\clsProviderAddress.vb`
- `Business\SAIF.Business.Provider\clsProviderContact.vb`
- `Business\SAIF.Business.Provider\clsProviderIdentity.vb`
- `Business\SAIF.Business.Provider\clsProviderTaxID.vb`
- `Business\SAIF.Business.Provider\clsProviderTaxID.vb`
- `Business\SAIF.Business.Provider\clsProviderRelationship.vb`
- `Business\SAIF.Business.Provider\clsProviderRelationship.vb`
- `Business\SAIF.Business.Provider\clsNote.vb`
- `Business\SAIF.Business.Provider\clsProviderMCOMembership.vb`
- `Business\SAIF.Business.Provider\clsProviderMCOMembership.vb`
- `Business\SAIF.Business.Provider\clsProviderMCOMembership.vb`
- `Business\SAIF.Business.Provider\clsProviderService.vb`
- `Business\SAIF.Business.Provider\clsProviderServiceContract.vb`
- `Business\SAIF.Business.Provider\clsProviderServiceContract.vb`
- `Business\SAIF.Business.Provider\clsProviderIneligibilityPeriod.vb`
- `Business\SAIF.Business.Provider\clsProviderDcbsCostCharge.vb`
- `Business\SAIF.Business.Provider\clsProviderRelationship.vb`
- `Business\SAIF.Business.Provider\clsProviderTaxID.vb`
- `Business\SAIF.Business.Provider\clsProviderAddress.vb`
