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¶
- Outstanding reserves.
OutstandingReservescomputes(IncurredMedicalAmount + IncurredIndemnityAmount) - (PaidMedicalAmount + PaidIndemnityAmount)(BR-US-022);HasOutstandingReservesisTruewhen that value is non-zero. - Catastrophe classification.
IsCatastrophereturnsTruewhenCatastropheNumber <> "00"(BR-US-023). - Cost and reportability.
HasClaimCostsreturnsTrueunless bothIncurredMedicalAmountandIncurredIndemnityAmountare zero;IsReportablereturnsTruewhenHasClaimCosts OrElse IsCatastrophe(BR-US-021). - Claim status classification.
IsClaimOpencomparesNCCIClaimStatusCodeagainst the code-map values forOpenorReOpened;IsClaimClosedcompares it againstClosed— both resolved throughmdlCodeMaps.GetNCCIClaimStatusCodeMap(see Code map loading).IsClaimFatalcomparesNCCIInjuryCodeagainst the code-map value forFatalviamdlCodeMaps.GetNCCIInjuryCodeMap. - Fraud classification.
IsNotFraudulent,IsPartialFraudulent,IsNotPartialFraudulent,IsFullyFraudulent, andIsNotFullyFraudulenteach compareFraudClaimCodeagainst the correspondingmdlCodeMaps.GetNCCIFraudulentClaimTypeMapcode value; separately,IsFraudulentClaimperforms a simpler direct comparison ofFraudClaimCode = "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).* - Report-system classification.
IsDCIandIsUnitStatcompare the object'sReportTypeproperty against theDCIandUSTATmembers of theReportTypesenum, respectively. - NCCIInjuryCode dirty-tracking gap. The
NCCIInjuryCodeproperty setter has a commented-outMarkDirty()call (annotatedTODO: Change for saving to database), so changingNCCIInjuryCodeon an existing object does not mark the object dirty and a subsequentSave()will not persist that change unless another dirty-triggering property is also modified.* - CopyData (loss).
clsLossBase.CopyData(objA, objB)(Shared) copies every loss field fromobjAtoobjBthrough theiLossDatainterface, withFinalDenialDatecopied conditionally (set null on the target if null on the source, otherwise copied by value). - HasCostsChanged.
clsLossBase.HasCostsChanged(objA, objB)(Shared) returnsTrueif any ofIncurredMedicalAmount,IncurredIndemnityAmount,ReimbursementAmount,PaidIndemnityAmount, orPaidMedicalAmountdiffer between the two objects — used to detect whether a loss's financial picture changed between two snapshots (for example, between reporting cycles). - CopyData (exposure).
clsExposureBase.CopyData(objA, objB)(instance method, not shared) copiesClassRateandERModFactorunconditionally, and copiesExposureQuantity,PremiumAmount, andSplitCoverageNumberconditionally — setting the target to null when the source is null via each field'sSet*Nullmethod, 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
NCCIInjuryCodesetter'sMarkDirty()call is commented out, so setting this property alone on an existing object does not causeSave()to persist the change; callers relying solely on this property to trigger a save may observe no database update.* IsFraudulentClaimand theIsFullyFraudulent/IsPartialFraudulent/IsNotFraudulentfamily both derive fromFraudClaimCodebut 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.CopyDatais an instance method whileclsLossBase.CopyDataisShared; callers must have an existingclsExposureBase-derived instance to invoke the exposure copy, whereas the loss copy can be invoked without one.
Related documentation¶
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.vbBusiness\SAIF.Business.UnitStat\clsExposureBase.vb