Skip to content

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); HasOutstandingReserves is True when that value is non-zero.
  2. Catastrophe classification. IsCatastrophe returns True when CatastropheNumber <> "00" (BR-US-023).
  3. Cost and reportability. HasClaimCosts returns True unless both IncurredMedicalAmount and IncurredIndemnityAmount are zero; IsReportable returns True when HasClaimCosts OrElse IsCatastrophe (BR-US-021).
  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). 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

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.

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