---
title: Policy and unit-stat support
summary: Validates policies, resolves policy addresses, calculates default expiration dates, and derives NCCI and valuation data.
status: draft
owner: SAIF
last_reviewed: 2026-07-30
library: SAIF.Business
reference_type: package
operation_id: OP-SB-10
trigger: Caller requests policy validation, address resolution, expiration, or unit-stat calculations.
---

# Policy and unit-stat support

This operation combines the policy-facing SQL helpers in `PolicyServices` with the date-calculation logic in `UnitStatServices`. The policy branch delegates complex address and expiration rules to stored procedures, while the unit-stat branch performs most of its business logic directly in .NET after a small amount of policy data is loaded.

| Field | Value |
| --- | --- |
| **Operation ID** | OP-SB-10 |
| **Trigger** | Caller invokes policy or unit-stat service helpers. |
| **Inputs** | Policy number, effective date, process date, cancel date, correspondence type, max-expiration flag |
| **Outputs** | Address, validity boolean, expiration date, NCCI policy number, unit split date, policy-period units, valuation data |
| **Primary components** | `PolicyServices.getPolicyAddress`, `PolicyServices.CoverageExists`, `PolicyServices.IsValidPolicy`, `PolicyServices.GetDefaultExpirationDate`, `UnitStatServices.GetNCCIPolicyNumber`, `UnitStatServices.GetPolicyPeriodUnits`, `UnitStatServices.GetReportValuationPeriods` |
| **Entry point** | `Business\SAIF.Business\PolicyServices.vb` |

## Steps

1. Policy-address retrieval delegates to `sp62087_get_policy_address`, passing the policy number, effective date, process date, and correspondence type so Oracle can choose the correct location row and formatted address output ([SQL-042](../sql/SQL-042-policy-lookup-family.md), [PROC-RULE-022](../business-rules.md#proc-rule-022-uw312-and-uw310-correspondence-prefers-the-payroll-mailing-address-before-standard-policy-locations), [PROC-RULE-023](../business-rules.md#proc-rule-023-other-correspondence-uses-the-standard-policy-location-first-and-then-the-latest-eligible-expired-policy-location), [PROC-RULE-024](../business-rules.md#proc-rule-024-policy-location-rows-are-filtered-against-either-the-policy-effective-date-or-the-process-date-depending-on-whether-processing-is-before-or-after-the-policy-period-start), [PROC-RULE-025](../business-rules.md#proc-rule-025-barcode-output-switches-to-email-address-for-uw560-correspondence), [PROC-RULE-026](../business-rules.md#proc-rule-026-missing-country-codes-default-to-the-united-states-before-country-name-lookup), [PROC-RULE-027](../business-rules.md#proc-rule-027-the-dba-line-is-only-emitted-when-the-legal-name-differs-from-the-policy-name), [PROC-RULE-028](../business-rules.md#proc-rule-028-missing-policy-location-data-is-surfaced-as-an-application-error-after-blanking-all-output-fields), [POLICY](../database-tables.md#policy-policy-period-all-policy-period-master-us-policy-unit), [POLICY_PERIOD_ALL](../database-tables.md#policy-policy-period-all-policy-period-master-us-policy-unit), [POLICY_PERIOD_MASTER](../database-tables.md#policy-policy-period-all-policy-period-master-us-policy-unit)).
2. Coverage checks query `POLICY_PERIOD_ALL` to confirm that the policy has a period covering the supplied date ([SQL-042](../sql/SQL-042-policy-lookup-family.md), [POLICY_PERIOD_ALL](../database-tables.md#policy-policy-period-all-policy-period-master-us-policy-unit)).
3. Policy validation routes low-number policies to `NON_EMPR_ACCT` instead of the standard policy tables, while higher-number policies validate against the normal policy source ([SQL-042](../sql/SQL-042-policy-lookup-family.md), [NON_EMPR_ACCT](../database-tables.md#non-empr-acct), [BR-SB-005](../business-rules.md#br-sb-005-low-number-policies-validate-against-non-empr-acct)).
4. Default expiration-date calculation delegates to `SP72232_Calc_Policy_Exp_Date`, which chooses between standard and max-horizon modes and applies the AR quarter-snapping rules when appropriate ([SQL-042](../sql/SQL-042-policy-lookup-family.md), [PROC-RULE-029](../business-rules.md#proc-rule-029-max-mode-returns-the-first-day-of-the-month-15-months-after-the-effective-date), [PROC-RULE-030](../business-rules.md#proc-rule-030-default-mode-uses-a-13-month-horizon-for-second-half-effective-dates-and-12-months-otherwise), [PROC-RULE-031](../business-rules.md#proc-rule-031-ar-policies-snap-the-calculated-expiration-month-to-quarter-boundaries), [PROC-RULE-032](../business-rules.md#proc-rule-032-unhandled-calculation-failures-are-surfaced-as-application-errors)).
5. `GetNCCIPolicyNumber` loads the qualifying policy row and prefixes the number with `A` for voluntary coverage and `C` otherwise ([SQL-043](../sql/SQL-043-unit-stat-lookup-family.md), [US_POLICY_UNIT](../database-tables.md#policy-policy-period-all-policy-period-master-us-policy-unit), [BR-SB-012](../business-rules.md#br-sb-012-ncci-policy-numbers-prefix-voluntary-policies-with-a-and-others-with-c)).
6. `GetPolicyUnitEffectiveDate` reads the policy-unit date needed for valuation calculations ([SQL-043](../sql/SQL-043-unit-stat-lookup-family.md), [US_POLICY_UNIT](../database-tables.md#policy-policy-period-all-policy-period-master-us-policy-unit)).
7. `GetUnitSplitDate` and `GetPolicyPeriodUnits` calculate whether one or two unit ranges are needed, splitting only when the period is more than one year plus sixteen days long ([BR-SB-003](../business-rules.md#br-sb-003-extended-policy-periods-split-only-when-the-period-exceeds-one-year-plus-sixteen-days)).
8. `GetReportValuationPeriods`, `GetValuationNumber`, `GetFirstValuationDate`, and `GetLastValuationDate` derive the reporting schedule from the unit effective date and switch from five valuation periods to ten starting in 2002 ([BR-SB-004](../business-rules.md#br-sb-004-report-valuation-schedules-switch-from-five-to-ten-periods-in-2002)).

## Process flow

The following diagram visualizes this operation's control flow.

```mermaid
flowchart TD
    Start([Policy or unit-stat request]) --> Kind{Policy helper or unit-stat helper?}
    Kind -->|Policy| Policy[Run policy SQL or stored procedure]
    Kind -->|Unit stat| Unit[Load policy-unit data]
    Policy --> Branch{Validation, address, or expiration?}
    Branch -->|Validation| Return1([Return validity or coverage])
    Branch -->|Address| Return2([Return policy address])
    Branch -->|Expiration| Return3([Return expiration date])
    Unit --> Calc[Calculate NCCI, units, and valuation dates]
    Calc --> Return4([Return unit-stat data])
```

## Failure and edge-case behavior

- Low-number policies are intentionally validated against `NON_EMPR_ACCT`, so callers can get a negative result even when the number does not exist in the standard policy tables ([BR-SB-005](../business-rules.md#br-sb-005-low-number-policies-validate-against-non-empr-acct)).
- Policy-address resolution can surface an application error when no qualifying location row exists ([PROC-RULE-028](../business-rules.md#proc-rule-028-missing-policy-location-data-is-surfaced-as-an-application-error-after-blanking-all-output-fields)).
- Long policy periods do not split into two unit ranges unless they exceed one year plus sixteen days ([BR-SB-003](../business-rules.md#br-sb-003-extended-policy-periods-split-only-when-the-period-exceeds-one-year-plus-sixteen-days)).

## Related documentation
- [Operations and processes](../operations-processes.md)
- [Business rules](../business-rules.md)
- [SQL catalog](../sql/index.md)
- [Database tables](../database-tables.md)

## Sources
- `Business\SAIF.Business\PolicyServices.vb`
- `Business\SAIF.Business\UnitStatServices.vb`
