---
title: Derived reporting calculations
summary: Base-class read-only calculations shared by exposure and loss reporting data (outstanding reserves, catastrophe/reportability/fraud classification, claim open/closed/fatal status) and the CopyData/HasCostsChanged helpers used to duplicate and compare loss/exposure records across report cycles.
status: draft
owner: SAIF
last_reviewed: 2026-07-30
library: SAIF.Business.UnitStat
reference_type: package
operation_id: OP-US-07
trigger: Caller reads a derived property on clsLossBase or clsExposureBase, or invokes CopyData/HasCostsChanged
---

# Derived reporting calculations

`clsLossBase` and `clsExposureBase` are shared base classes used by Unit Stat's loss and exposure reporting data structures (subclassed elsewhere for the concrete loss/exposure detail objects). They expose read-only calculated properties derived from raw stored fields and code-map lookups, plus static helpers for copying data between instances and detecting cost changes between report cycles.

| Field | Value |
| --- | --- |
| **Operation ID** | OP-US-07 |
| **Trigger** | Caller reads a derived property (`OutstandingReserves`, `IsCatastrophe`, `HasClaimCosts`, `IsReportable`, `IsClaimOpen`/`IsClaimClosed`/`IsClaimFatal`, `IsFullyFraudulent`/`IsPartialFraudulent`/`IsNotFraudulent`, `IsDCI`/`IsUnitStat`, etc.) or invokes `clsLossBase.CopyData`/`HasCostsChanged` or `clsExposureBase.CopyData` |
| **Inputs** | Stored loss/exposure fields (incurred/paid amounts, NCCI claim status/injury/fraud codes, catastrophe number, report type) |
| **Outputs** | Calculated decimal/boolean values; for `CopyData`, a target object populated from a source object; for `HasCostsChanged`, a boolean indicating a cost difference |
| **Primary components** | `clsLossBase.OutstandingReserves`, `IsCatastrophe`, `HasClaimCosts`, `IsReportable`, `IsClaimOpen`, `IsClaimClosed`, `IsClaimFatal`, `IsFullyFraudulent`/`IsPartialFraudulent`/`IsNotFraudulent`, `IsDCI`, `IsUnitStat`, `CopyData` (Shared), `HasCostsChanged` (Shared); `clsExposureBase.CopyData` |
| **Entry point** | `Business\SAIF.Business.UnitStat\clsLossBase.vb`, `Business\SAIF.Business.UnitStat\clsExposureBase.vb` |

## Steps

1. **Outstanding reserves.** `OutstandingReserves` computes `(IncurredMedicalAmount + IncurredIndemnityAmount) - (PaidMedicalAmount + PaidIndemnityAmount)` ([BR-US-022](../business-rules.md#br-us-022-outstanding-reserves-equal-incurred-amounts-minus-paid-amounts)); `HasOutstandingReserves` is `True` when that value is non-zero.
2. **Catastrophe classification.** `IsCatastrophe` returns `True` when `CatastropheNumber <> "00"` ([BR-US-023](../business-rules.md#br-us-023-a-catastrophe-claim-has-a-catastrophenumber-00)).
3. **Cost and reportability.** `HasClaimCosts` returns `True` unless both `IncurredMedicalAmount` and `IncurredIndemnityAmount` are zero; `IsReportable` returns `True` when `HasClaimCosts OrElse IsCatastrophe` ([BR-US-021](../business-rules.md#br-us-021-a-loss-is-reportable-if-it-has-claim-costs-incurred-medical-0-or-incurred-indemnity-0-or-is-a-catastrophe-claim)).
4. **Claim status classification.** `IsClaimOpen` compares `NCCIClaimStatusCode` against the code-map values for `Open` or `ReOpened`; `IsClaimClosed` compares it against `Closed` — both resolved through `mdlCodeMaps.GetNCCIClaimStatusCodeMap` (see [Code map loading](code-map-loading.md)). `IsClaimFatal` compares `NCCIInjuryCode` against the code-map value for `Fatal` via `mdlCodeMaps.GetNCCIInjuryCodeMap`.
5. **Fraud classification.** `IsNotFraudulent`, `IsPartialFraudulent`, `IsNotPartialFraudulent`, `IsFullyFraudulent`, and `IsNotFullyFraudulent` each compare `FraudClaimCode` against the corresponding `mdlCodeMaps.GetNCCIFraudulentClaimTypeMap` code value; separately, `IsFraudulentClaim` performs a simpler direct comparison of `FraudClaimCode = "Y"` rather than going through the code map — the two families of properties use different comparison mechanisms for related but distinct questions (general fraud flag vs. NCCI fraud classification detail).*
6. **Report-system classification.** `IsDCI` and `IsUnitStat` compare the object's `ReportType` property against the `DCI` and `USTAT` members of the `ReportTypes` enum, respectively.
7. **NCCIInjuryCode dirty-tracking gap.** The `NCCIInjuryCode` property setter has a commented-out `MarkDirty()` call (annotated `TODO: Change for saving to database`), so changing `NCCIInjuryCode` on an existing object does not mark the object dirty and a subsequent `Save()` will not persist that change unless another dirty-triggering property is also modified.*
8. **CopyData (loss).** `clsLossBase.CopyData(objA, objB)` (Shared) copies every loss field from `objA` to `objB` through the `iLossData` interface, with `FinalDenialDate` copied conditionally (set null on the target if null on the source, otherwise copied by value).
9. **HasCostsChanged.** `clsLossBase.HasCostsChanged(objA, objB)` (Shared) returns `True` if any of `IncurredMedicalAmount`, `IncurredIndemnityAmount`, `ReimbursementAmount`, `PaidIndemnityAmount`, or `PaidMedicalAmount` differ between the two objects — used to detect whether a loss's financial picture changed between two snapshots (for example, between reporting cycles).
10. **CopyData (exposure).** `clsExposureBase.CopyData(objA, objB)` (instance method, not shared) copies `ClassRate` and `ERModFactor` unconditionally, and copies `ExposureQuantity`, `PremiumAmount`, and `SplitCoverageNumber` conditionally — setting the target to null when the source is null via each field's `Set*Null` method, otherwise copying the value.

## Process flow

```mermaid
flowchart TD
	Start([Caller reads a derived property<br>or invokes a copy/compare helper]) --> Which{Which category?}
	Which -->|Reserves/reportability| Reserves[OutstandingReserves = incurred - paid]
	Reserves --> Reportable{HasClaimCosts<br>or IsCatastrophe?}
	Reportable -->|Yes| ReportableYes([IsReportable = True])
	Reportable -->|No| ReportableNo([IsReportable = False])
	Which -->|Claim status| StatusLookup[Compare NCCIClaimStatusCode/<br>NCCIInjuryCode against<br>code map values]
	Which -->|Fraud classification| FraudLookup[Compare FraudClaimCode against<br>NCCIFraudulentClaimType code map<br>or direct Y comparison]
	Which -->|Report system| SystemCompare[Compare ReportType against<br>DCI or USTAT enum member]
	Which -->|CopyData loss| CopyLoss[Copy all iLossData fields;<br>FinalDenialDate copied<br>null-aware]
	Which -->|HasCostsChanged| CompareCosts{Any of 5 cost fields differ<br>between two objects?}
	CompareCosts -->|Yes| Changed([Return True])
	CompareCosts -->|No| Unchanged([Return False])
	Which -->|CopyData exposure| CopyExp[Copy ClassRate, ERModFactor;<br>copy Quantity/Premium/SplitCoverage<br>null-aware]
```

## Failure and edge-case behavior

- The `NCCIInjuryCode` setter's `MarkDirty()` call is commented out, so setting this property alone on an existing object does not cause `Save()` to persist the change; callers relying solely on this property to trigger a save may observe no database update.*
- `IsFraudulentClaim` and the `IsFullyFraudulent`/`IsPartialFraudulent`/`IsNotFraudulent` family both derive from `FraudClaimCode` but use different comparison logic (direct `"Y"` comparison vs. code-map lookup), so they answer related but not necessarily identical questions; callers should choose the property matching their exact intent rather than assuming they are interchangeable.*
- `clsExposureBase.CopyData` is an instance method while `clsLossBase.CopyData` is `Shared`; callers must have an existing `clsExposureBase`-derived instance to invoke the exposure copy, whereas the loss copy can be invoked without one.

## 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. Statements
> marked with `**` could not be confirmed; treat as unknown until verified.

## Sources

- `Business\SAIF.Business.UnitStat\clsLossBase.vb`
- `Business\SAIF.Business.UnitStat\clsExposureBase.vb`
