---
title: Offset and supplemental wage calculation
summary: Builds per-period offset wage earnings from hourly/overtime entries and reallocates supplemental wage shortfalls to compute the timeloss offset amount applied to a benefit period.
status: draft
owner: SAIF Doc Gen
last_reviewed: 2026-07-30
library: SAIF.Business.Claim.Payment
reference_type: embedded
operation_id: OP-CP-11
trigger: A timeloss payment computes the offset amount for a benefit period against a worker's other concurrent earnings
---

# Offset and supplemental wage calculation

This operation covers `clsOffsetWageCalculation`/`clsOffsetWageCalcPeriod(s)` (per-period offset earnings from a worker's hourly/overtime entries) and `clsSupplementalWages`/`clsSupplementalWagePeriod(s)` (the supplemental-TD shortfall calculation), which together determine the `OffsetAmount`/`OffsetAmountAdjusted` applied to a timeloss benefit period in [Timeloss payment issuance](timeloss-payment-issuance.md).

| Field | Value |
| --- | --- |
| **Operation ID** | OP-CP-11 |
| **Trigger** | `clsTimelossPayment.AssignOffsetWagesToPeriods` computing offset/supplemental amounts as part of timeloss payment validation |
| **Inputs** | Wage type (Daily/BiWeekly/SupTD), hours worked, hourly rate, overtime hours, overtime rate, worker's average weekly wage, secondary employer earnings |
| **Outputs** | `CL_OFFSET_CALC_PERIOD` / `CL_OFFSET_WAGE_CALCULATION` rows; `CL_SEC_WAGE_EARNINGS` supplemental period rows; `OffsetAmount`/`OffsetAmountAdjusted` on affected benefit periods |
| **Primary components** | `clsOffsetWageCalculation`, `clsOffsetWageCalcPeriod`, `clsOffsetWageCalcPeriods`, `clsSupplementalWages`, `clsSupplementalWagePeriod`, `clsSupplementalWagePeriods` |
| **Entry point** | `Business\SAIF.Business.Claim.Payment\Payments\TimelossPayments\clsOffsetWageCalculation.vb` |

## Steps

1. **Select the wage type and build calculation periods** ([BR-CP-053](../business-rules.md#br-cp-053-offset-wage-earnings-formula-and-rounding)). `clsOffsetWageCalculation.BuildCalcPeriods` produces one offset period per calendar day for Daily wage type, or one period per benefit period for BiWeekly; SupTD periods are excluded from the offset build entirely.
2. **Create the offset wage calculation header** ([SQL-022](../sql/SQL-022.md)/[SQL-069](../sql/SQL-069.md)/[SQL-105](../sql/SQL-105.md)/[SQL-127](../sql/SQL-127.md), [CL_OFFSET_WAGE_CALCULATION](../database-tables.md#cl_offset_wage_calculation)), sequenced via [SQL-006](../sql/SQL-006.md) (`OFFSET_WAGE_CALC_SEQ_NUM`).
3. **Enter hours/rate data per period** ([SQL-021](../sql/SQL-021.md)/[SQL-068](../sql/SQL-068.md)/[SQL-104](../sql/SQL-104.md)/[SQL-126](../sql/SQL-126.md), [CL_OFFSET_CALC_PERIOD](../database-tables.md#cl_offset_calc_period)), sequenced via [SQL-005](../sql/SQL-005.md) (`OFFSET_CALC_PERIOD_SEQ_NUM`).
4. **Require a rate whenever Daily-mode hours are entered** ([BR-CP-056](../business-rules.md#br-cp-056-offset-rate-entry-required-in-daily-mode-warning-only)). `CheckValidHourlyRate` warns (does not block) when Daily-mode hours are entered without an hourly rate; `CheckValidOvertimeRate` does the same for overtime hours/rate.
5. **Compute rounded per-period earnings** ([BR-CP-053](../business-rules.md#br-cp-053-offset-wage-earnings-formula-and-rounding)). `GetCalculatedEarnings`/the `Earnings` setter compute (hours worked × hourly rate) + (overtime hours × overtime rate), rounded to 2 decimal places using round-half-away-from-zero, and sum into `TotalOffsetWages`.
6. **Compute the worker-adjusted average weekly wage** ([BR-CP-054](../business-rules.md#br-cp-054-worker-adjusted-average-weekly-wage-formula)). `GetWorkerAdjustedAverageWeeklyWages`/`GetWorkerDaysPayable` compute (average weekly wage ÷ scheduled work days per week) × days payable in the period; a half-shift period deducts 0.5 day, and a malformed (non-7-character) days-off string falls back to counting every calendar day as payable.
7. **Load secondary-employer earnings for the supplemental calculation** ([SQL-028](../sql/SQL-028.md)/[SQL-082](../sql/SQL-082.md)/[SQL-111](../sql/SQL-111.md)/[SQL-131](../sql/SQL-131.md), [CL_SEC_WAGE_EARNINGS](../database-tables.md#cl_sec_wage_earnings)) via `clsSupplementalWages.GetSecondaryEmployers`, which only considers secondary wage worksheets flagged Final ([BR-CP-051](../business-rules.md#br-cp-051-only-final-secondary-wage-worksheets-feed-multiple-employer-wages-and-supplemental-benefits), [SQL-083](../sql/SQL-083.md), [CL_SEC_TIMELOSS_CALCULATION](../database-tables.md#cl_sec_timeloss_calculation)).
8. **Compute the supplemental wage shortfall** ([BR-CP-055](../business-rules.md#br-cp-055-supplemental-wage-shortfall-reallocation)). `clsSupplementalWagePeriod.SupplementalEarnings` computes the adjusted average weekly wage minus actual secondary earnings for a SupTD period.
9. **Reallocate the shortfall or over-earning** ([BR-CP-055](../business-rules.md#br-cp-055-supplemental-wage-shortfall-reallocation)). `clsTimelossPayment.AssignOffsetWagesToPeriods` shifts a positive shortfall's excess primary-job earnings onto the supplemental period; a negative value (over-earning on secondary jobs) instead reduces the offset on matching non-supplemental periods.
10. **Apply the computed amounts to the benefit period.** `OffsetAmount`/`OffsetAmountAdjusted` are set on the affected [benefit periods](benefit-period-and-schedule-management.md), directly changing the payable benefit used by [Timeloss payment issuance](timeloss-payment-issuance.md).
11. **Retire prior offset/supplemental data.** Individual period rows are deleted via [SQL-126](../sql/SQL-126.md)/[SQL-127](../sql/SQL-127.md)/[SQL-131](../sql/SQL-131.md) as recalculation supersedes them.

## Process flow

```mermaid
flowchart TD
	Start([Timeloss payment triggers<br>offset/supplemental calculation]) --> WageType{Wage type?}
	WageType -->|Daily| BuildDaily[One offset period<br>per calendar day]
	WageType -->|BiWeekly| BuildBW[One offset period<br>per benefit period]
	WageType -->|SupTD| ExcludeOffset[Excluded from offset build]
	BuildDaily --> RateCheck{Hours entered<br>without rate?}
	BuildBW --> RateCheck
	RateCheck -->|Yes| WarnRate([Warning; save proceeds])
	RateCheck -->|No| ComputeEarnings[Compute rounded<br>per-period earnings]
	WarnRate --> ComputeEarnings
	ComputeEarnings --> AdjustedAWW[Compute worker-adjusted<br>average weekly wage]
	AdjustedAWW --> SecEarnings[Load Final secondary-employer<br>earnings]
	ExcludeOffset --> SecEarnings
	SecEarnings --> Shortfall[Compute supplemental<br>wage shortfall]
	Shortfall --> Sign{Shortfall positive<br>or negative?}
	Sign -->|Positive| ShiftPrimary[Shift excess primary earnings<br>onto SupTD period]
	Sign -->|Negative| ReduceOffset[Reduce offset on<br>non-supplemental periods]
	ShiftPrimary --> Apply[Set OffsetAmount /<br>OffsetAmountAdjusted]
	ReduceOffset --> Apply
	Apply --> Done([Offset applied to<br>benefit period])
```

## Failure and edge-case behavior

- A malformed (non-7-character) days-off string is silently treated as "every day payable" rather than raising an error, which could understate the offset for a worker with an unusual or corrupted work schedule ([BR-CP-054](../business-rules.md#br-cp-054-worker-adjusted-average-weekly-wage-formula)).
- Because only Final secondary worksheets feed the supplemental calculation ([BR-CP-051](../business-rules.md#br-cp-051-only-final-secondary-wage-worksheets-feed-multiple-employer-wages-and-supplemental-benefits)), a worker's genuinely-earned but not-yet-finalized secondary wages are invisible to the offset/supplemental calculation until that worksheet is finalized — a timing gap between real-world earnings and system-recognized earnings.
- The Daily-mode rate-entry checks are warnings only ([BR-CP-056](../business-rules.md#br-cp-056-offset-rate-entry-required-in-daily-mode-warning-only)); an offset period can be saved with hours but no rate, producing zero calculated earnings for that period without a hard error.
- Rounding uses round-half-away-from-zero rather than banker's rounding, which is worth flagging for anyone reconciling totals against a different rounding convention.

## Related documentation

- [Operations and processes](../operations-processes.md)
- [Business rules](../business-rules.md)
- [SQL catalog](../sql/index.md)
- [Database tables](../database-tables.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.Payment\Payments\TimelossPayments\clsOffsetWageCalculation.vb`
- `Business\SAIF.Business.Claim.Payment\Payments\TimelossPayments\clsOffsetWageCalcPeriod.vb`
- `Business\SAIF.Business.Claim.Payment\Payments\TimelossPayments\clsOffsetWageCalcPeriods.vb`
- `Business\SAIF.Business.Claim.Payment\Payments\TimelossPayments\clsSupplementalWages.vb`
- `Business\SAIF.Business.Claim.Payment\Payments\TimelossPayments\clsSupplementalWagePeriod.vb`
- `Business\SAIF.Business.Claim.Payment\Payments\TimelossPayments\clsSupplementalWagePeriods.vb`
- `Business\SAIF.Business.Claim.Payment\Payments\TimelossPayments\clsTimelossPayment.vb`
