---
title: Wage calculation worksheet management
summary: Records and finalizes primary and secondary wage worksheets used to establish a worker's statutory average weekly wage, including the fixed 20-slot earnings grid and finalization side effects.
status: draft
owner: SAIF Doc Gen
last_reviewed: 2026-07-30
library: SAIF.Business.Claim.Payment
reference_type: embedded
operation_id: OP-CP-10
trigger: An adjuster or auditor enters, verifies, or finalizes a primary or secondary wage calculation worksheet for a claim
---

# Wage calculation worksheet management

This operation covers `clsClaimTimelossCalculation`/`clsSecTimelossCalculation` (the primary and secondary wage worksheet headers), `clsWageWorksheet`/`clsSecWageWorksheet` (the worksheet UI/calculation surface), `clsWageCalculationPeriod`/`clsSecWageCalculationPeriod` and their earnings grids (`clsWageCalcPeriodEarnings`, `clsSecWageCalcPeriodEarnings`), and `clsInjuryClaimWageAndJob`, which rolls secondary worksheets into the claim's multiple-employer wage state and enforces the legal-order-date gate.

| Field | Value |
| --- | --- |
| **Operation ID** | OP-CP-10 |
| **Trigger** | Adjuster/auditor creates, edits, verifies, or finalizes a primary (`clsClaimTimelossCalculation`) or secondary (`clsSecTimelossCalculation`) wage worksheet |
| **Inputs** | Calculation method (Hourly/Dollar), pay-period unit, work-shift hours, paid amount, per-period earnings entries, secondary employer name |
| **Outputs** | `CL_CLAIM_TIMELOSS_CALCULATION` / `CL_SEC_TIMELOSS_CALCULATION` header rows; `CL_WAGE_CALCULATION_PERIOD` / `CL_SEC_WAGE_CALCULATION_PERIOD` period rows; `CL_WAGE_CALC_PERIOD_EARNINGS` / `CL_SEC_WAGE_CALC_PER_EARNINGS` earnings rows; frozen statutory weekly wage on the claim |
| **Primary components** | `clsClaimTimelossCalculation`, `clsSecTimelossCalculation`, `clsWageWorksheet`, `clsSecWageWorksheet`, `clsWageCalculationPeriod`, `clsSecWageCalculationPeriod`, `clsInjuryClaimWageAndJob` |
| **Entry point** | `Business\SAIF.Business.Claim.Payment\Wage and Job\clsClaimTimelossCalculation.vb` |

## Steps

1. **Choose the calculation method.** A primary wage worksheet must use calculation method Hourly or Dollar ([BR-CP-047](../business-rules.md#br-cp-047-wage-worksheet-validation-sets-primary-and-secondary)).
2. **Enter per-period earnings.** Each wage calculation period exposes exactly 20 earnings-type rows; `AfterRetrieve`/`RemoveUnusedEarningsRecords` pad missing rows on load and drop any dirty row with a blank earnings-type description before save ([BR-CP-049](../business-rules.md#br-cp-049-fixed-20-slot-wage-earnings-grid)), persisted via [SQL-029](../sql/SQL-029.md)/[SQL-088](../sql/SQL-088.md)/[SQL-112](../sql/SQL-112.md)/[SQL-132](../sql/SQL-132.md) ([CL_WAGE_CALC_PERIOD_EARNINGS](../database-tables.md#cl_wage_calc_period_earnings)) or the secondary equivalents ([SQL-026](../sql/SQL-026.md)/[SQL-080](../sql/SQL-080.md)/[SQL-107](../sql/SQL-107.md)/[SQL-129](../sql/SQL-129.md), [CL_SEC_WAGE_CALC_PER_EARNINGS](../database-tables.md#cl_sec_wage_calc_per_earnings)).
3. **Enter hourly or dollar values, never both** ([BR-CP-050](../business-rules.md#br-cp-050-hourly-and-dollar-wage-entry-are-mutually-exclusive-per-row)). `clsWageWorksheet.SetAmount` zeroes the fields belonging to the representation not chosen; gap-coded ("Excluded") periods are omitted from the "less gap" wage totals shown by `TotalsLessGapDisplay`.
4. **Save the wage calculation period** ([SQL-030](../sql/SQL-030.md)/[SQL-089](../sql/SQL-089.md)/[SQL-113](../sql/SQL-113.md)/[SQL-133](../sql/SQL-133.md), [CL_WAGE_CALCULATION_PERIOD](../database-tables.md#cl_wage_calculation_period)) or the secondary equivalent ([SQL-027](../sql/SQL-027.md)/[SQL-081](../sql/SQL-081.md)/[SQL-108](../sql/SQL-108.md)/[SQL-130](../sql/SQL-130.md), [CL_SEC_WAGE_CALCULATION_PERIOD](../database-tables.md#cl_sec_wage_calculation_period)).
5. **Name the secondary employer.** A secondary-employer worksheet must additionally name the employer, and if periods exist, use the same calculation-method restriction as a primary worksheet before it can be marked Final ([BR-CP-047](../business-rules.md#br-cp-047-wage-worksheet-validation-sets-primary-and-secondary)).
6. **Validate work-shift hours and wage ranges** ([BR-CP-047](../business-rules.md#br-cp-047-wage-worksheet-validation-sets-primary-and-secondary)). A Final worksheet requires a paid amount greater than zero and a weekly pay-period unit; hourly units require work-shift hours between 1 and 99.99; wages must fall between 0 and 999,999.99.
7. **Save the worksheet header** ([SQL-018](../sql/SQL-018.md)/[SQL-051](../sql/SQL-051.md)/[SQL-100](../sql/SQL-100.md)/[SQL-123](../sql/SQL-123.md), [CL_CLAIM_TIMELOSS_CALCULATION](../database-tables.md#cl_claim_timeloss_calculation)) or secondary header ([SQL-025](../sql/SQL-025.md)/[SQL-079](../sql/SQL-079.md)/[SQL-106](../sql/SQL-106.md)/[SQL-128](../sql/SQL-128.md), [CL_SEC_TIMELOSS_CALCULATION](../database-tables.md#cl_sec_timeloss_calculation)).
8. **Finalize the worksheet** ([BR-CP-046](../business-rules.md#br-cp-046-finalizing-a-timeloss-wage-worksheet-freezes-the-statutory-wage-and-discards-in-progress-worksheets)). `BeforeInsert`/`BeforeUpdate` on a Final save with a positive wage amount sets the claim's statutory weekly wage to that amount and stamps the finalizing user and date.
9. **Discard superseded worksheets.** Saving a Final primary worksheet deletes every In Progress worksheet for the claim (`RemoveInProgressRecords`).
10. **Gate auditor verification.** `AuditReviewerValid` requires a Final worksheet to already exist before an auditor can verify the calculation ([BR-CP-046](../business-rules.md#br-cp-046-finalizing-a-timeloss-wage-worksheet-freezes-the-statutory-wage-and-discards-in-progress-worksheets)).
11. **Roll Final secondary worksheets into the claim's wage state** ([BR-CP-051](../business-rules.md#br-cp-051-only-final-secondary-wage-worksheets-feed-multiple-employer-wages-and-supplemental-benefits)). `clsInjuryClaimWageAndJob.ProcessSecondaryWages` only considers secondary calculations flagged Final (`wage_entry_status_type_code = 'F'`) when computing the claim's multiple-employer wage rollup; in-progress secondary worksheets remain invisible to downstream payment logic.
12. **Block the legal order date while secondary worksheets are in progress** ([BR-CP-052](../business-rules.md#br-cp-052-legal-order-date-blocked-while-secondary-wage-worksheets-are-in-progress)). `LegalOrderDateSecInProgressValid` blocks saving the claim's legal order date while any secondary wage worksheet remains In Progress.
13. **Recompute tenure from hire date.** `clsInjuryClaimWageAndJob.BeforeUpdate` supersedes any manually entered tenure years/months/days with a calculation from the worker's hire date whenever that date is present ([BR-CP-052](../business-rules.md#br-cp-052-legal-order-date-blocked-while-secondary-wage-worksheets-are-in-progress)), reading/writing `CL_INJURY_CLAIM` ([SQL-066](../sql/SQL-066.md)/[SQL-103](../sql/SQL-103.md), [CL_INJURY_CLAIM](../database-tables.md#cl_injury_claim)).

## Process flow

```mermaid
flowchart TD
	Start([Adjuster/auditor opens<br>wage worksheet]) --> Method{Calculation method<br>Hourly or Dollar?}
	Method -->|No| BlockedMethod([Blocked: invalid method])
	Method -->|Yes| Entry[Enter earnings grid;<br>hourly XOR dollar per row]
	Entry --> SecName{Secondary worksheet?}
	SecName -->|Yes| NameCheck{Employer named?}
	NameCheck -->|No| BlockedName([Blocked: employer required])
	NameCheck -->|Yes| Ranges
	SecName -->|No| Ranges
	Ranges{Hours/wage within<br>valid ranges?} -->|No| BlockedRange([Blocked: out of range])
	Ranges -->|Yes| Status{Save status?}
	Status -->|In Progress| SaveIP[Save worksheet]
	Status -->|Final| FinalCheck{Paid amount > 0<br>and weekly unit?}
	FinalCheck -->|No| BlockedFinal([Blocked: Final requirements not met])
	FinalCheck -->|Yes| Freeze[Freeze statutory wage;<br>stamp finalizer]
	Freeze --> Discard[Delete In Progress<br>worksheets for claim]
	Discard --> Rollup{Secondary worksheet?}
	Rollup -->|Yes| ProcessSec[Roll into multiple-employer<br>wage state]
	Rollup -->|No| Done([Worksheet finalized])
	ProcessSec --> Done
	SaveIP --> Done2([Worksheet saved in progress])
```

## Failure and edge-case behavior

- A malformed (non-7-character) days-off string used elsewhere in wage-adjustment logic falls back to counting every calendar day as payable rather than failing outright ([BR-CP-054](../business-rules.md#br-cp-054-worker-adjusted-average-weekly-wage-formula)) — this is a defensive fallback, not a validation error, so a genuinely corrupt days-off value is silently treated as "worker works every day."
- Because finalizing a primary worksheet deletes every In Progress worksheet for the claim, any unsaved or draft secondary work in progress can be lost as a side effect of finalizing the primary calculation — there is no confirmation step visible in this layer.
- The legal-order-date gate ([BR-CP-052](../business-rules.md#br-cp-052-legal-order-date-blocked-while-secondary-wage-worksheets-are-in-progress)) can block claim closure activity indefinitely if a secondary worksheet is started but never finalized or removed.
- Auditor verification strictly requires a pre-existing Final worksheet; there is no path to verify an In Progress worksheet directly.

## 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\Wage and Job\clsClaimTimelossCalculation.vb`
- `Business\SAIF.Business.Claim.Payment\Wage and Job\clsSecTimelossCalculation.vb`
- `Business\SAIF.Business.Claim.Payment\Wage and Job\clsWageWorksheet.vb`
- `Business\SAIF.Business.Claim.Payment\Wage and Job\clsSecWageWorksheet.vb`
- `Business\SAIF.Business.Claim.Payment\Wage and Job\clsWageCalculationPeriod.vb`
- `Business\SAIF.Business.Claim.Payment\Wage and Job\clsSecWageCalculationPeriod.vb`
- `Business\SAIF.Business.Claim.Payment\Wage and Job\clsWageCalcPeriodEarnings.vb`
- `Business\SAIF.Business.Claim.Payment\Wage and Job\clsSecWageCalcPeriodEarnings.vb`
- `Business\SAIF.Business.Claim.Payment\Wage and Job\clsInjuryClaimWageAndJob.vb`
