---
title: SAIF.Business.Policy.Rating business rules
summary: Enumerated business rules with trigger, enforcement, outcomes, and traceability.
status: draft
owner: Technical Writer
last_reviewed: 2026-07-31
library: SAIF.Business.Policy.Rating
reference_type: package
---

# SAIF.Business.Policy.Rating business rules

This page captures the local and procedure-derived business rules enforced by `SAIF.Business.Policy.Rating`.

## BR-001: The adjusted rate is the base rate multiplied by the product of all applicable non-null "other" factors, rounded to 6 decimal places.

| Field | Value |
| --- | --- |
| **Statement** | The adjusted rate is the base rate multiplied by the product of all applicable non-null "other" factors, rounded to 6 decimal places. |
| **Trigger** | Adjusted rate computation (OP-001) |
| **Enforcement** | ``ClassRateExtensions.AdjustedRate` (`ClassRateExtensions.vb:39-58`)` |
| **Outcome** | Rounded decimal rate |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Policy.Rating\ClassRateExtensions.vb` |

---

## BR-002: The base rate is the provider's pure rate factor multiplied by the rate tier factor, the USL&HW factor and all non-null accident-limit factors, rounded to 4 decimal places using arithmetic (not banker's) rounding.

| Field | Value |
| --- | --- |
| **Statement** | The base rate is the provider's pure rate factor multiplied by the rate tier factor, the USL&HW factor and all non-null accident-limit factors, rounded to 4 decimal places using arithmetic (not banker's) rounding. |
| **Trigger** | Base rate computation (OP-002) |
| **Enforcement** | ``ClassRateExtensions.BaseRate` — `SAIFRound(..., 4)`` |
| **Outcome** | Rounded decimal base rate |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Policy.Rating\ClassRateExtensions.vb` |

---

## BR-003: A manual class base is valid only when its rate file sequence number is non-zero and its class number/usage code is not empty.

| Field | Value |
| --- | --- |
| **Statement** | A manual class base is valid only when its rate file sequence number is non-zero and its class number/usage code is not empty. |
| **Trigger** | Validation of a `clsManualClassBase` |
| **Enforcement** | ``clsManualClassBase.vb:1391-1401` — `IsValidManualClassBase`, `RuleData("clsManualClassBase01", …)`` |
| **Outcome** | Error: "Error: Invalid ManualClassBase" |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Policy.Rating\clsManualClassBase.vb` |

---

## BR-004: A manual class base may not be deleted while any `PREM_HIST_CLASS_COVERAGE` row references the same class number and rate file sequence number.

| Field | Value |
| --- | --- |
| **Statement** | A manual class base may not be deleted while any `PREM_HIST_CLASS_COVERAGE` row references the same class number and rate file sequence number. |
| **Trigger** | Delete eligibility check (OP-006) |
| **Enforcement** | ``clsManualClassBase.CanDeleteManualClassBaseRecord` (`:1341-1383`)` |
| **Outcome** | Returns `False` |
| **Confidence** | Verified |
| **Tables** | [PREM_HIST_CLASS_COVERAGE](database-tables.md#prem_hist_class_coverage), [RATE_FILE_MASTER](database-tables.md#rate_file_master) |
| **SQL** | [SQL-017](sql/SQL-017-saif-business-policy-rating.md), [SQL-053](sql/SQL-053-saif-business-policy-rating.md) |
| **Source** | `Business\SAIF.Business.Policy.Rating\ClassRateExtensions.vb` |

---

## BR-005: A failure while probing delete eligibility is surfaced as an application exception carrying the framework's media-files-check message.

| Field | Value |
| --- | --- |
| **Statement** | A failure while probing delete eligibility is surfaced as an application exception carrying the framework's media-files-check message. |
| **Trigger** | Delete eligibility check |
| **Enforcement** | ``clsManualClassBase.CanDeleteManualClassBaseRecord`, `clsRateFileMaster.CanDeleteRateFileMasterRecord`` |
| **Outcome** | `ApplicationException(clsMessages.ErrMsgMediaFilesCheck & ex.Message, ex)` |
| **Confidence** | Verified |
| **Tables** | [PREM_HIST_CLASS_COVERAGE](database-tables.md#prem_hist_class_coverage), [MANUAL_CLASS_BASE](database-tables.md#manual_class_base) |
| **SQL** | [SQL-017](sql/SQL-017-saif-business-policy-rating.md), [SQL-032](sql/SQL-032-saif-business-policy-rating.md) |
| **Source** | `Business\SAIF.Business.Policy.Rating\ClassRateExtensions.vb` |

---

## BR-006: A delete, insert or update that affects a number of rows other than exactly one is treated as a database-contention failure.

| Field | Value |
| --- | --- |
| **Statement** | A delete, insert or update that affects a number of rows other than exactly one is treated as a database-contention failure. |
| **Trigger** | Persistence completion |
| **Enforcement** | ``AfterDelete`/`AfterInsert`/`AfterUpdate` across `clsManualClassBase`, `clsManualClassAssociation`, `clsManualClassDetail`, `clsManualClassParagraph`, `clsManualClassParagraphUsage`, `clsRateFileMaster`, `clsStatPremiumClass`` |
| **Outcome** | `AddErrorMessage("DeleteError"/"UpdateError", clsConstants.Messages.DBContentionError)`; inserts use the literal message `"Insert Failed"` |
| **Confidence** | Verified |
| **Tables** | [RATE_FILE_MASTER](database-tables.md#rate_file_master) |
| **SQL** | [SQL-053](sql/SQL-053-saif-business-policy-rating.md) |
| **Source** | `Business\SAIF.Business.Policy.Rating\ClassRateExtensions.vb` |

---

## BR-007: A bulk delete of manual class bases by rate file returns `False` on any error and does not surface the underlying exception.

| Field | Value |
| --- | --- |
| **Statement** | A bulk delete of manual class bases by rate file returns `False` on any error and does not surface the underlying exception. |
| **Trigger** | Bulk delete (OP-007) |
| **Enforcement** | ``clsManualClassBaseCollection.DeleteManualClassBasebyRateFileSeqNum` (`:327-365`)` |
| **Outcome** | Returns `False`; exception swallowed |
| **Confidence** | Verified |
| **Tables** | [STAT_PREMIUM_CLASS](database-tables.md#stat_premium_class) |
| **SQL** | [SQL-062](sql/SQL-062-saif-business-policy-rating.md) |
| **Source** | `Business\SAIF.Business.Policy.Rating\ClassRateExtensions.vb` |

---

## BR-008: A rate file master may not be deleted while any `MANUAL_CLASS_BASE` row references its sequence number.

| Field | Value |
| --- | --- |
| **Statement** | A rate file master may not be deleted while any `MANUAL_CLASS_BASE` row references its sequence number. |
| **Trigger** | Delete eligibility check (OP-008) |
| **Enforcement** | ``clsRateFileMaster.CanDeleteRateFileMasterRecord` (`:494-534`)` |
| **Outcome** | Returns `False` |
| **Confidence** | Verified |
| **Tables** | [MANUAL_CLASS_BASE](database-tables.md#manual_class_base) |
| **SQL** | [SQL-032](sql/SQL-032-saif-business-policy-rating.md) |
| **Source** | `Business\SAIF.Business.Policy.Rating\ClassRateExtensions.vb` |

---

## BR-009: The class description paragraph in force is the one whose usage row covers the anniversary rating date, matches the market type, and carries new/outstanding code `'N'`.

| Field | Value |
| --- | --- |
| **Statement** | The class description paragraph in force is the one whose usage row covers the anniversary rating date, matches the market type, and carries new/outstanding code `'N'`. |
| **Trigger** | Paragraph retrieval (OP-009) |
| **Enforcement** | ``clsManualClassBase.GetClassParagraph` (`:848-884`)` |
| **Outcome** | Paragraph text or empty string |
| **Confidence** | Verified |
| **Tables** | [MANUAL_CLASS_PARAGRAPH_USAGE](database-tables.md#manual_class_paragraph_usage), [MANUAL_CLASS_PARAGRAPH](database-tables.md#manual_class_paragraph) |
| **SQL** | [SQL-018](sql/SQL-018-saif-business-policy-rating.md) |
| **Source** | `Business\SAIF.Business.Policy.Rating\ClassRateExtensions.vb` |

---

## BR-010: A rate factor that does not apply to a given rate provider must return the neutral factor value (1) rather than 0, so that it cannot alter the cumulative factor.

| Field | Value |
| --- | --- |
| **Statement** | A rate factor that does not apply to a given rate provider must return the neutral factor value (1) rather than 0, so that it cannot alter the cumulative factor. |
| **Trigger** | Any factor evaluation |
| **Enforcement** | ``clsARPCreditFactor.Factor`, `clsUSLHWCompFactor.Factor`, `clsRateTierFactor.AdjustedRateFactor` — all return `NonApplicableAdjustedRateFactor`` |
| **Outcome** | Cumulative factor unchanged |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Policy.Rating\ClassRateExtensions.vb` |

---

## BR-011: The rate tier factor is the federal risk type factor when the provider's benefit jurisdiction is Federal, the state risk type factor when it is State, and the neutral factor otherwise or when the rate tier factor is invalid.

| Field | Value |
| --- | --- |
| **Statement** | The rate tier factor is the federal risk type factor when the provider's benefit jurisdiction is Federal, the state risk type factor when it is State, and the neutral factor otherwise or when the rate tier factor is invalid. |
| **Trigger** | Base rate computation |
| **Enforcement** | ``clsRateTierFactor.AdjustedRateFactor`` |
| **Outcome** | Selected factor value |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Policy.Rating\ClassRateExtensions.vb` |

---

## BR-012: The USL&HW comp factor applies only when the rate tier record is valid **and** the provider's manual class type is USLH; otherwise the neutral factor is returned.

| Field | Value |
| --- | --- |
| **Statement** | The USL&HW comp factor applies only when the rate tier record is valid **and** the provider's manual class type is USLH; otherwise the neutral factor is returned. |
| **Trigger** | Base rate computation |
| **Enforcement** | ``clsUSLHWCompFactor.Factor(inAdjustedRateProvider)`` |
| **Outcome** | Selected factor value |
| **Confidence** | Verified |
| **Tables** | [USLHW_COMP_FACTOR](database-tables.md#uslhw_comp_factor) |
| **SQL** | [SQL-046](sql/SQL-046-saif-business-policy-rating.md) |
| **Source** | `Business\SAIF.Business.Policy.Rating\ClassRateExtensions.vb` |

---

## BR-013: The rate file sequence number returned by the rate-retrieval procedure is applied only when it is not `DBNull`.

| Field | Value |
| --- | --- |
| **Statement** | The rate file sequence number returned by the rate-retrieval procedure is applied only when it is not `DBNull`. |
| **Trigger** | Manual class key resolution (OP-004) |
| **Enforcement** | ``clsManualClassBase.GetManualClassBaseKey` (`:1260-1263`)` |
| **Outcome** | `outRateFileSeqNum` left unchanged when null |
| **Confidence** | Verified |
| **SQL** | [SQL-019](sql/SQL-019-saif-business-policy-rating.md) |
| **Source** | `Business\SAIF.Business.Policy.Rating\ClassRateExtensions.vb` |

---

## BR-014: The rate-retrieval procedure may return a **replaced** manual class number; when the returned class number is not `DBNull` it overwrites the caller's value.

| Field | Value |
| --- | --- |
| **Statement** | The rate-retrieval procedure may return a **replaced** manual class number; when the returned class number is not `DBNull` it overwrites the caller's value. |
| **Trigger** | Manual class key resolution |
| **Enforcement** | ``clsManualClassBase.GetManualClassBaseKey` (`:1264-1267`)` |
| **Outcome** | Caller receives the substituted class number |
| **Confidence** | Verified |
| **SQL** | [SQL-019](sql/SQL-019-saif-business-policy-rating.md) |
| **Source** | `Business\SAIF.Business.Policy.Rating\ClassRateExtensions.vb` |

---

## BR-015: Period rating information must be sought in both the current `policy_period` table and the legacy `policy_period_non_wcis` table, combined with `UNION`.

| Field | Value |
| --- | --- |
| **Statement** | Period rating information must be sought in both the current `policy_period` table and the legacy `policy_period_non_wcis` table, combined with `UNION`. |
| **Trigger** | Period rating info retrieval (OP-010) |
| **Enforcement** | ``clsPeriodRatingInfo.vb` — `RetrieveSQL` / `LegacyRetrieveSQL`` |
| **Outcome** | Union result set |
| **Confidence** | Verified |
| **Tables** | [POLICY](database-tables.md#policy), [POLICY_PERIOD](database-tables.md#policy_period), [POLICY_PERIOD_NON_WCIS](database-tables.md#policy_period_non_wcis) |
| **SQL** | [SQL-027](sql/SQL-027-saif-business-policy-rating.md) |
| **Source** | `Business\SAIF.Business.Policy.Rating\clsPeriodRatingInfo.vb` |

---

## BR-016: "Current" period rating information is the row whose policy period effective date equals the maximum effective date for that policy, ordered descending.

| Field | Value |
| --- | --- |
| **Statement** | "Current" period rating information is the row whose policy period effective date equals the maximum effective date for that policy, ordered descending. |
| **Trigger** | `GetCurrentPeriodRatingInfo` |
| **Enforcement** | ``clsPeriodRatingInfo.vb:222-243`` |
| **Outcome** | Latest period selected |
| **Confidence** | Verified |
| **Tables** | [POLICY](database-tables.md#policy), [POLICY_PERIOD](database-tables.md#policy_period), [POLICY_PERIOD_NON_WCIS](database-tables.md#policy_period_non_wcis) |
| **SQL** | [SQL-027](sql/SQL-027-saif-business-policy-rating.md) |
| **Source** | `Business\SAIF.Business.Policy.Rating\clsPeriodRatingInfo.vb` |

---

## BR-017: Period rating info retrieval always returns an object; an empty (default) instance is returned when no row matches.

| Field | Value |
| --- | --- |
| **Statement** | Period rating info retrieval always returns an object; an empty (default) instance is returned when no row matches. |
| **Trigger** | Period rating info retrieval |
| **Enforcement** | ``clsPeriodRatingInfo.GetPeriodRatingInfo` / `GetCurrentPeriodRatingInfo`` |
| **Outcome** | Non-null result with default values |
| **Confidence** | Verified |
| **Tables** | [POLICY](database-tables.md#policy), [POLICY_PERIOD](database-tables.md#policy_period), [POLICY_PERIOD_NON_WCIS](database-tables.md#policy_period_non_wcis) |
| **SQL** | [SQL-027](sql/SQL-027-saif-business-policy-rating.md) |
| **Source** | `Business\SAIF.Business.Policy.Rating\ClassRateExtensions.vb` |

---

## BR-018: A rate tier factor applies to a risk type code on a date when the code matches exactly, the effective date is on or before the date, and the expiration date is either null (`Date.MinValue`) or after the date.

| Field | Value |
| --- | --- |
| **Statement** | A rate tier factor applies to a risk type code on a date when the code matches exactly, the effective date is on or before the date, and the expiration date is either null (`Date.MinValue`) or after the date. |
| **Trigger** | Rate tier factor selection (OP-011) |
| **Enforcement** | ``clsRateTierFactor.IsApplicableTo`` |
| **Outcome** | Boolean applicability |
| **Confidence** | Verified |
| **Tables** | [RISK_TYPE_DESCRIPTION](database-tables.md#risk_type_description) |
| **SQL** | [SQL-037](sql/SQL-037-saif-business-policy-rating.md) |
| **Source** | `Business\SAIF.Business.Policy.Rating\ClassRateExtensions.vb` |

---

## BR-019: A rating plan factor is in force on a date when its effective date is on or before the date and its expiration date is either null or after the date.

| Field | Value |
| --- | --- |
| **Statement** | A rating plan factor is in force on a date when its effective date is on or before the date and its expiration date is either null or after the date. |
| **Trigger** | Rating plan factor selection (OP-012) |
| **Enforcement** | ``RatingPlanFactorExtensions.AsOfDate`` |
| **Outcome** | Filtered sequence |
| **Confidence** | Verified |
| **Tables** | [RATING_PLAN_CODE](database-tables.md#rating_plan_code), [RATING_PLAN_FACTOR](database-tables.md#rating_plan_factor) |
| **SQL** | [SQL-038](sql/SQL-038-saif-business-policy-rating.md), [SQL-039](sql/SQL-039-saif-business-policy-rating.md), [SQL-040](sql/SQL-040-saif-business-policy-rating.md) |
| **Source** | `Business\SAIF.Business.Policy.Rating\ClassRateExtensions.vb` |

---

## BR-020: The ARP credit factor is the rating plan factor's upper limit when the rating plan factor is valid; otherwise the neutral factor.

| Field | Value |
| --- | --- |
| **Statement** | The ARP credit factor is the rating plan factor's upper limit when the rating plan factor is valid; otherwise the neutral factor. |
| **Trigger** | ARP credit factor evaluation |
| **Enforcement** | ``clsARPCreditFactor.Factor` (`clsARPCreditFactor.vb:50-61`)` |
| **Outcome** | Factor value |
| **Confidence** | Verified |
| **Tables** | [RATING_PLAN_FACTOR](database-tables.md#rating_plan_factor) |
| **SQL** | [SQL-039](sql/SQL-039-saif-business-policy-rating.md) |
| **Source** | `Business\SAIF.Business.Policy.Rating\clsARPCreditFactor.vb` |

---

## BR-021: A prepay frequency is offered on a date only when a prepay discount factor is in force for that frequency on that date.

| Field | Value |
| --- | --- |
| **Statement** | A prepay frequency is offered on a date only when a prepay discount factor is in force for that frequency on that date. |
| **Trigger** | Prepay frequency selection (OP-013) |
| **Enforcement** | ``PrepayFrequencyExtensions.ActiveAsOf`` |
| **Outcome** | Filtered sequence |
| **Confidence** | Verified |
| **Tables** | [PREPAY_DISCOUNT_FACTOR](database-tables.md#prepay_discount_factor), [PREPAY_FREQUENCY_CODE](database-tables.md#prepay_frequency_code) |
| **SQL** | [SQL-029](sql/SQL-029-saif-business-policy-rating.md), [SQL-030](sql/SQL-030-saif-business-policy-rating.md), [SQL-031](sql/SQL-031-saif-business-policy-rating.md) |
| **Source** | `Business\SAIF.Business.Policy.Rating\ClassRateExtensions.vb` |

---

## BR-022: A federal coverage liability limit is valid only when its sequence number is non-zero.

| Field | Value |
| --- | --- |
| **Statement** | A federal coverage liability limit is valid only when its sequence number is non-zero. |
| **Trigger** | Validation of a `clsFederalCoverageLiabilityLimit` |
| **Enforcement** | ``clsFederalCoverageLiabilityLimit.vb:296-301` — `ValidFederalCoverageLiabilityLimit`` |
| **Outcome** | Error: "Error: Invalid Federal coverage liability limit." |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Policy.Rating\clsFederalCoverageLiabilityLimit.vb` |

---

## BR-023: A manual class detail requires a non-blank manual class number and a non-blank default usage code.

| Field | Value |
| --- | --- |
| **Statement** | A manual class detail requires a non-blank manual class number and a non-blank default usage code. |
| **Trigger** | Validation of a `clsManualClassDetail` |
| **Enforcement** | ``clsManualClassDetail.vb:482-500` — `ValidManualClassNumber`, `ValidDefaultUsageCode`` |
| **Outcome** | Errors: "Error: Invalid Manual Class Number" / "Error: Invalid Default Usage Code" |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Policy.Rating\clsManualClassDetail.vb` |

---

## BR-024: A manual class association requires a manual class number, an associated class number and an association code.

| Field | Value |
| --- | --- |
| **Statement** | A manual class association requires a manual class number, an associated class number and an association code. |
| **Trigger** | Validation of a `clsManualClassAssociation` |
| **Enforcement** | ``clsManualClassAssociation.vb:422-424` — three `CommonBusinessRules.TextRequired` registrations` |
| **Outcome** | Field-level required errors |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Policy.Rating\clsManualClassAssociation.vb` |

---

## BR-025: A prepay discount factor requires a non-empty prepay frequency code.

| Field | Value |
| --- | --- |
| **Statement** | A prepay discount factor requires a non-empty prepay frequency code. |
| **Trigger** | Validation of a `clsPrepayDiscountFactor` |
| **Enforcement** | ``clsPrepayDiscountFactor.vb:249-254` — `ValidPrepayDiscountFactor`` |
| **Outcome** | Error: "Error: Invalid prepay discount factor." |
| **Confidence** | Verified |
| **Tables** | [PREPAY_DISCOUNT_FACTOR](database-tables.md#prepay_discount_factor) |
| **SQL** | [SQL-029](sql/SQL-029-saif-business-policy-rating.md), [SQL-030](sql/SQL-030-saif-business-policy-rating.md) |
| **Source** | `Business\SAIF.Business.Policy.Rating\clsPrepayDiscountFactor.vb` |

---

## BR-026: A rate tier factor requires a non-empty risk type code.

| Field | Value |
| --- | --- |
| **Statement** | A rate tier factor requires a non-empty risk type code. |
| **Trigger** | Validation of a `clsRateTierFactor` |
| **Enforcement** | ``clsRateTierFactor.vb:297-302` — `ValidRateTier`` |
| **Outcome** | Error: "Error:  Invalid rate tier." |
| **Confidence** | Verified |
| **Tables** | [RISK_TYPE_DESCRIPTION](database-tables.md#risk_type_description) |
| **SQL** | [SQL-037](sql/SQL-037-saif-business-policy-rating.md) |
| **Source** | `Business\SAIF.Business.Policy.Rating\clsRateTierFactor.vb` |

---

## BR-027: A rating plan factor requires a non-empty code.

| Field | Value |
| --- | --- |
| **Statement** | A rating plan factor requires a non-empty code. |
| **Trigger** | Validation of a `clsRatingPlanFactor` |
| **Enforcement** | ``clsRatingPlanFactor.vb:382-387` — `ValidRatingPlanFactor`` |
| **Outcome** | Error: "Error: Invalid rating plan factor." |
| **Confidence** | Verified |
| **Tables** | [RATING_PLAN_FACTOR](database-tables.md#rating_plan_factor) |
| **SQL** | [SQL-039](sql/SQL-039-saif-business-policy-rating.md) |
| **Source** | `Business\SAIF.Business.Policy.Rating\clsRatingPlanFactor.vb` |

---

## BR-028: A SAIF Plus discount requires an effective date other than `Date.MinValue`.

| Field | Value |
| --- | --- |
| **Statement** | A SAIF Plus discount requires an effective date other than `Date.MinValue`. |
| **Trigger** | Validation of a `clsSAIFPlusDiscount` |
| **Enforcement** | ``clsSAIFPlusDiscount.vb:436-441` — `ValidSAIFPlusDiscount`` |
| **Outcome** | Error: "Error: Invalid SAIFPlus discount." |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Policy.Rating\clsSAIFPlusDiscount.vb` |

---

## BR-029: A USL&HW comp factor requires an effective date other than `Date.MinValue`.

| Field | Value |
| --- | --- |
| **Statement** | A USL&HW comp factor requires an effective date other than `Date.MinValue`. |
| **Trigger** | Validation of a `clsUSLHWCompFactor` |
| **Enforcement** | ``clsUSLHWCompFactor.vb:285-290` — `ValidUSLHWCompFactor`` |
| **Outcome** | Error: "Error: Invalid USLHW comp factor." |
| **Confidence** | Verified |
| **Tables** | [USLHW_COMP_FACTOR](database-tables.md#uslhw_comp_factor) |
| **SQL** | [SQL-046](sql/SQL-046-saif-business-policy-rating.md) |
| **Source** | `Business\SAIF.Business.Policy.Rating\clsUSLHWCompFactor.vb` |

---

## BR-030: A federal coverage liability limit is in force when the select date is on or after the limit effective date and before the limit expiration date, with a null expiration treated as `01-jan-2199`.

| Field | Value |
| --- | --- |
| **Statement** | A federal coverage liability limit is in force when the select date is on or after the limit effective date and before the limit expiration date, with a null expiration treated as `01-jan-2199`. |
| **Trigger** | Federal coverage liability limit retrieval |
| **Enforcement** | ``clsFederalCoverageLiabilityLimit.Criteria.RetrieveSQL` — `NVL(..., '01-jan-2199')`` |
| **Outcome** | Row selected or not |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Policy.Rating\ClassRateExtensions.vb` |

---

## BR-031: The manual class base collection criteria does not support update; attempting to use its `UpdateSQL` is an error.

| Field | Value |
| --- | --- |
| **Statement** | The manual class base collection criteria does not support update; attempting to use its `UpdateSQL` is an error. |
| **Trigger** | Any attempt to update through the collection criteria |
| **Enforcement** | ``clsManualClassBaseCollection.vb:517-521` — `Throw New ApplicationException(BOC.Messages.InvalidSQLProperty)`` |
| **Outcome** | `ApplicationException` |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Policy.Rating\clsManualClassBaseCollection.vb` |

---

## BR-032: Prepay frequency codes map as Annual→"A", SemiAnnual→"S", Quarterly→"Q", Monthly→"M"; the numeric enum values (1, 2, 4, 10) express the number of instalments per year.*

| Field | Value |
| --- | --- |
| **Statement** | Prepay frequency codes map as Annual→"A", SemiAnnual→"S", Quarterly→"Q", Monthly→"M"; the numeric enum values (1, 2, 4, 10) express the number of instalments per year.* |
| **Trigger** | Prepay frequency conversion |
| **Enforcement** | ``clsPrepayFrequency.vb:55-100`` |
| **Outcome** | Converted code or enum |
| **Confidence** | Verified |
| **Tables** | [PREPAY_FREQUENCY_CODE](database-tables.md#prepay_frequency_code) |
| **SQL** | [SQL-031](sql/SQL-031-saif-business-policy-rating.md) |
| **Source** | `Business\SAIF.Business.Policy.Rating\clsPrepayFrequency.vb` |

---

## BR-033: Federal coverage types map bidirectionally to both federal coverage codes and manual class type codes; an unrecognised value converts to `String.Empty` / `UnAssigned`.

| Field | Value |
| --- | --- |
| **Statement** | Federal coverage types map bidirectionally to both federal coverage codes and manual class type codes; an unrecognised value converts to `String.Empty` / `UnAssigned`. |
| **Trigger** | Federal coverage conversion |
| **Enforcement** | ``clsFederalCoverageTypeCode.vb:72-130`` |
| **Outcome** | Converted value or default |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Policy.Rating\clsFederalCoverageTypeCode.vb` |

---

## BR-034: Applicable ARD is derived before rate lookup starts.

| Field | Value |
| --- | --- |
| **Statement** | Applicable ARD is derived before rate lookup starts. |
| **Trigger** | Stored procedure entry |
| **Enforcement** | Helper `get_applicable_ard` resolves the date used by `sp62005_retrieve_rate`. |
| **Outcome** | Lookup uses the derived anniversary rating date. |
| **Confidence** | Verified |
| **Stored procedure** | `pk73059_prem_hist_summary` |
| **Source** | Oracle DBA_SOURCE: WCIS_DBA.pk73059_prem_hist_summary |

---

## BR-035: Current non-outstanding filing is searched first.

| Field | Value |
| --- | --- |
| **Statement** | Current non-outstanding filing is searched first. |
| **Trigger** | Procedure class-rate lookup |
| **Enforcement** | Procedure filters `RATE_FILE_MASTER` to current, matching risk-type, non-outstanding filings before joining to `MANUAL_CLASS_BASE`. |
| **Outcome** | First pass uses the current filing for the requested ARD. |
| **Confidence** | Verified |
| **Stored procedure** | `pk73059_prem_hist_summary` |
| **Source** | Oracle DBA_SOURCE: WCIS_DBA.pk73059_prem_hist_summary |

---

## BR-036: Replacement class lookup runs when the requested class is missing or expired.

| Field | Value |
| --- | --- |
| **Statement** | Replacement class lookup runs when the requested class is missing or expired. |
| **Trigger** | Procedure class-rate lookup |
| **Enforcement** | When the first cursor does not yield a valid class row, the procedure resolves `REPLACEMENT_MANUAL_CLASS_NUM` and retries. |
| **Outcome** | Caller can receive a substituted manual class number. |
| **Confidence** | Verified |
| **Stored procedure** | `pk73059_prem_hist_summary` |
| **Source** | Oracle DBA_SOURCE: WCIS_DBA.pk73059_prem_hist_summary |

---

## BR-037: Outstanding filing rows override the current filing when present.

| Field | Value |
| --- | --- |
| **Statement** | Outstanding filing rows override the current filing when present. |
| **Trigger** | Procedure class-rate lookup |
| **Enforcement** | After a current-filing class is found, the procedure checks `NR_RATE_FILE_SEQ_NUM`-linked outstanding filings and replaces the row when found. |
| **Outcome** | Outstanding filing takes precedence. |
| **Confidence** | Verified |
| **Stored procedure** | `pk73059_prem_hist_summary` |
| **Source** | Oracle DBA_SOURCE: WCIS_DBA.pk73059_prem_hist_summary |

---

## BR-038: Original class number is preserved when no replacement class is resolved.

| Field | Value |
| --- | --- |
| **Statement** | Original class number is preserved when no replacement class is resolved. |
| **Trigger** | Procedure class-rate lookup |
| **Enforcement** | Procedure assigns `io_class_num := NVL(class_rec.manual_class_num, io_class_num)`. |
| **Outcome** | Caller keeps the input class number when no replacement exists. |
| **Confidence** | Verified |
| **Stored procedure** | `pk73059_prem_hist_summary` |
| **Source** | Oracle DBA_SOURCE: WCIS_DBA.pk73059_prem_hist_summary |

---

## BR-039: Mid-policy next ARD falls back to the policy-period expiration date unless rerated.

| Field | Value |
| --- | --- |
| **Statement** | Mid-policy next ARD falls back to the policy-period expiration date unless rerated. |
| **Trigger** | Applicable ARD calculation |
| **Enforcement** | Helper `get_applicable_ard` replaces the next ARD with the policy-period expiration date when the mid-policy ARD was not rerated. |
| **Outcome** | Lookup date stays aligned to the policy-period boundary. |
| **Confidence** | Verified |
| **Stored procedure** | `pk73059_prem_hist_summary` |
| **Source** | Oracle DBA_SOURCE: WCIS_DBA.pk73059_prem_hist_summary |

---

## BR-040: Original ARD applies when the next ARD falls after the class effective date.

| Field | Value |
| --- | --- |
| **Statement** | Original ARD applies when the next ARD falls after the class effective date. |
| **Trigger** | Applicable ARD calculation |
| **Enforcement** | Helper `get_applicable_ard` returns `in_ard` when `v_next_ard > in_eff_date`. |
| **Outcome** | Lookup continues to use the original anniversary rating date. |
| **Confidence** | Verified |
| **Stored procedure** | `pk73059_prem_hist_summary` |
| **Source** | Oracle DBA_SOURCE: WCIS_DBA.pk73059_prem_hist_summary |

---

## BR-041: Rate-file lookup returns zero when no active filing matches ARD and risk type.

| Field | Value |
| --- | --- |
| **Statement** | Rate-file lookup returns zero when no active filing matches ARD and risk type. |
| **Trigger** | Rate file sequence lookup |
| **Enforcement** | Function `get_rate_file_seq_num` traps `NO_DATA_FOUND` and returns `0`. |
| **Outcome** | Callers can distinguish no active filing from a matched filing. |
| **Confidence** | Verified |
| **Stored procedure** | `PK73193_submission` |
| **Source** | Oracle DBA_SOURCE: WCIS_DBA.PK73193_submission |

---

## Inherited business rules

### From clsBusinessBase (SAIF.Framework.Core)

## INH-001: BOF rule execution and surfacing

| Field | Value |
| --- | --- |
| **Statement** | Derived BOF business objects use the shared rules manager to execute registered rules and surface broken-rule state through `IDataErrorInfo`.† |
| **Trigger** | Property setters or lifecycle methods invoke rule evaluation. |
| **Enforcement** | Inherited `clsBusinessBase` rule-engine flow. |
| **Outcome** | Validation failures remain attached to the object for callers and bound UI consumers.† |
| **Confidence** | Inherited |
| **Origin** | `SAIF.Framework.Core` — `clsBusinessBase` |
| **Source** | Retrieved from dependency library documentation |

---

### From clsBusinessCollectionBase (SAIF.Framework.Core)

## INH-002: Collection broken-rule surfacing

| Field | Value |
| --- | --- |
| **Statement** | Derived BOF collections surface aggregate broken-rule state through `IDataErrorInfo`.† |
| **Trigger** | Child items or the collection itself contain broken rules. |
| **Enforcement** | Inherited `clsBusinessCollectionBase` validation behavior. |
| **Outcome** | Callers can inspect collection-level error state without traversing every child first.† |
| **Confidence** | Inherited |
| **Origin** | `SAIF.Framework.Core` — `clsBusinessCollectionBase` |
| **Source** | Retrieved from dependency library documentation |


## Notes
- Procedure-derived rules are included here so stored-procedure pages can link to the same rule catalog.

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

> **Note:** Statements marked with `†` are derived from dependency library documentation via the Legends CLI.

## Sources
- `Business\SAIF.Business.Policy.Rating\ClassRateExtensions.vb`
- `Business\SAIF.Business.Policy.Rating\clsARPCreditFactor.vb`
- `Business\SAIF.Business.Policy.Rating\clsFederalCoverageLiabilityLimit.vb`
- `Business\SAIF.Business.Policy.Rating\clsManualClassAssociation.vb`
- `Business\SAIF.Business.Policy.Rating\clsManualClassBase.vb`
- `Business\SAIF.Business.Policy.Rating\clsManualClassDetail.vb`
- `Business\SAIF.Business.Policy.Rating\clsPeriodRatingInfo.vb`
- `Business\SAIF.Business.Policy.Rating\clsPrepayDiscountFactor.vb`
- `Business\SAIF.Business.Policy.Rating\clsRateFileMaster.vb`
- `Business\SAIF.Business.Policy.Rating\clsRateTierFactor.vb`
- `Business\SAIF.Business.Policy.Rating\clsRatingPlanFactor.vb`
- `Business\SAIF.Business.Policy.Rating\clsSAIFPlusDiscount.vb`
- `Business\SAIF.Business.Policy.Rating\clsUSLHWCompFactor.vb`