Coverage Object

Topics: ACORD XML 2.x, Resources
Developer
Feb 18, 2016 at 4:26 PM
Edited Feb 18, 2016 at 4:28 PM
Starting a thread for the conversation on Coverage.

This is a real world example of a working coverage, covering many aspects, including rating, forms generation, reinsurance tracking, taxes, etc.

Some items are enumerated as _1, _2, _3 as a way to bridge to physical storage, programming, and limit conditions exceeding database columns.
<coverage>
          <ID>0</ID>
          <typeCd>PD</typeCd>
          <rateCd>PLA_MO_PD_2335</rateCd>
          <lossCd>LI_PD_MO</lossCd>
          <exposure></exposure>
          <p1>1.06</p1>   [These are parameters used in the rating algorithm]
          <p2>1.02</p2>
          <p3>1.0</p3>
          <p4>.68</p4>
          <p5>1</p5>
          <p6>1</p6>
          <p7>1</p7>
          <p8>1</p8>
          <p9>1</p9>
          <p10>122</p10>
          <p11>.95</p11>
          <form></form>   [Forms such as HO-3, GR-255, etc]
          <name></name>
          <description>PROPERTY DAMAGE LIABILITY - EACH ACCIDENT PART A</description>
          <statusCd></statusCd>   [inforce, removed, etc]
          <declinedInd>false</declinedInd>
          <declinationReason></declinationReason>
          <conditionsInd>false</conditionsInd>
          <conditionsReason></conditionsReason>
          <limit_1>50000</limit_1>
          <limit_2></limit_2>
          <limit_3></limit_3>
          <deductible_1></deductible_1>
          <deductible_2></deductible_2>
          <deductible_3></deductible_3>
          <attributes></attributes>
          <premium_1>85.00</premium_1>
          <premium_2></premium_2>
          <premium_3></premium_3>
          <creditOrSurcharge_1>0.0</creditOrSurcharge_1>
          <creditOrSurcharge_2>0.0</creditOrSurcharge_2>
          <creditOrSurcharge_3>0.0</creditOrSurcharge_3>
          <taxFeeAssessment_1>0.0</taxFeeAssessment_1>
          <taxFeeAssessment_2>0.0</taxFeeAssessment_2>
          <taxFeeAssessment_3>0.0</taxFeeAssessment_3>
          <ratingDetails_1>[Step1: PD Driver Age(33), Terr(27) fx=1.06] 1.06 * 1.0 = 1.06&#xd;
[Step2: PD Driver Age(33), Sex(M) fx=1.02] 1.02 * 1.06 = 1.0812000000000002&#xd;
[Step3: PD Driver Age(33), Marital Status(S) fx=1.0] 1.0 * 1.0812000000000002 = 1.0812000000000002&#xd;
[Step4: PD Vehicle Use(P2), MilesToWork(1) fx=1.0] 1.0 * 1.0812000000000002 = 1.0812000000000002&#xd;
[Step5: PD Vehicle Annual Miles(3000) fx=0.68] 0.68 * 1.0812000000000002 = 0.7352160000000002&#xd;
[Step6: PD Driver Status(F), Age(33) fx=1.0] 1.0 * 0.7352160000000002 = 0.7352160000000002&#xd;
[Step7: PD Good Student(N), Driver Training(N) fx=1.0] 1.0 * 0.7352160000000002 = 0.7352160000000002&#xd;
[Step8: PD Student Away(N) fx=1.0] 1.0 * 0.7352160000000002 = 0.7352160000000002&#xd;
[Step9: PD SDIP() fx=1.0] 1.0 * 0.7352160000000002 = 0.7352160000000002&#xd;
[Step10:PD NumVeh() fx=1.0] 1.0 * 0.7352160000000002 = 0.7352160000000002&#xd;
[Step11:PD LicenseYears(LicensedAge=16 yearsLicensed=17) fx=1.0] 1.0 * 0.7352160000000002 = 0.7352160000000002&#xd;
[Step12: PD BASE terr(27,50)] 122.0 * 1.0 = 122.0&#xd;
[Step13: PD ABS(0.95)] 122.0 * 0.95 = 116.0&#xd;
[Step14: PD RATE CLASS ADJUST(0.7352160000000002)] 116.0 * 0.7352160000000002 = 85.0&#xd;</ratingDetails_1>
          <ratingDetails_2></ratingDetails_2>
          <ratingDetails_3></ratingDetails_3>
          <option_1></option_1>
          <option_2></option_2>
          <option_3></option_3>
          <effectiveDate></effectiveDate>
          <expirationDate></expirationDate>
          <timestamp></timestamp>
        </coverage>
Developer
Feb 18, 2016 at 6:29 PM
So based on the meeting Feb 18, we need to take this example, (that is not ACORD), and standardize it to ACORD, add other examples, and add multiple limts/rates.
Coordinator
Feb 18, 2016 at 6:50 PM
Below is the equivalent structure in ACORD XML - looks like we may be missing some rating details and parameters - most everything else is supported:
<?xml version="1.0" encoding="UTF-8"?>
<Coverage>
    <CoverageCd>PD</CoverageCd>
    <CoverageTypeCd/>
    <IterationNumber/>
    <CoverageDesc/>
    <Limit>
        <FormatInteger>50000</FormatInteger>
        <LimitBasisCd/>
        <LimitAppliesToCd/>
    </Limit>
    <Limit>
        <FormatInteger/>
        <LimitBasisCd/>
        <LimitAppliesToCd/>
    </Limit>
    <Deductible>
        <FormatInteger/>
        <DeductibleBasisCd/>
        <DeductibleTypeCd/>
        <DeductibleAppliesToCd/>
    </Deductible>
    <Deductible>
        <FormatInteger/>
        <DeductibleBasisCd/>
        <DeductibleTypeCd/>
        <DeductibleAppliesToCd/>
    </Deductible>
    <Option>
        <OptionTypeCd/>
        <OptionCd/>
        <OptionValue/>
        <OptionDescCd/>
        <OptionValueDesc/>
    </Option>
    <Option>
        <OptionTypeCd/>
        <OptionCd/>
        <OptionValue/>
        <OptionDescCd/>
        <OptionValueDesc/>
    </Option>
    <CurrentTermAmt>
        <!-- not repeating -->
        <Amt>85</Amt>
        <CurCd/>
        <Precision/>
    </CurrentTermAmt>
    <NetChangeAmt>
        <!-- not repeating -->
        <Amt/>
        <CurCd/>
        <Precision/>
    </NetChangeAmt>
    <WrittenAmt>
        <!-- not repeating -->
        <Amt/>
        <CurCd/>
        <Precision/>
    </WrittenAmt>
    <CreditOrSurcharge>
        <CreditSurchargeCd/>
        <NumericValue>
            <FormatInteger/>
        </NumericValue>
    </CreditOrSurcharge>
    <CreditOrSurcharge>
        <CreditSurchargeCd/>
        <NumericValue>
            <FormatInteger/>
        </NumericValue>
    </CreditOrSurcharge>
    <EffectiveDt/>
    <ExpirationDt/>
    <Rate/>
    <PremiumBasisCd/>
    <TerritoryCd/>
    <Form>
        <FormNumber/>
        <FormName/>
    </Form>
    <FloodZoneCd/>
    <CategoryCd/>
    <MinPremAmt>
        <Amt/>
        <CurCd/>
        <Precision/>
    </MinPremAmt>
    <ProRateFactor/>
    <RatingClassificationCd/>
    <CoinsurancePct/>
</Coverage>

Coordinator
Feb 18, 2016 at 6:51 PM
... and these elements are also missing:
          <statusCd></statusCd>   [inforce, removed, etc]
          <declinedInd>false</declinedInd>
          <declinationReason></declinationReason>
          <conditionsInd>false</conditionsInd>
          <conditionsReason></conditionsReason>
Coordinator
Feb 22, 2016 at 8:42 PM
Would you decline and/or have a status at the coverage level? Looking beyond coverage, does this mean you'd need to apply 'Business Rules' at any level or element in the message?

Also the ACORD representation is also missing the rating pieces and algorithm steps in the message. You'd never see these in an Agent/Carrier communication, but if ACORD is intending to be all data-in-motion, we'd need to place these rating steps, calculations and results within the message as well. I've done this before and without looking back it went something like this:

Title
Step Title
Step #
Input
Input
Operation
Result
Output
Output

Translating Mica's post:

[Step2: PD Driver Age(33), Sex(M) fx=1.02] 1.02 * 1.06 = 1.0812000000000002
[Step3: PD Driver Age(33), Marital Status(S) fx=1.0] 1.0 * 1.0812000000000002 = 1.0812000000000002

Title - Calculate PD
Step Title - PD Driver Age(33)
Step # - 2
Inputs 
  InputValueLookupCd - SEX
  InputValueLookupTypeCd - Table
  InputValue - M
  InputFactor - 1.02
Inputs 
  InputValueLookupCd - Step1
  InputValueLookeupTypeCd - XML or Memory 
  InputFactor - 1.06
Operation - *
Calculation - 1.02 * 1.06
Result - 1.0812
Output - N/A
Output - N/A
Title - Calculate PD
Step Title - PD Driver Age(33)
Step # - 3
Inputs 
  InputValueLookupCd - Marital Status
  InputValueLookupTypeCd - Table
  InputValue - S
  InputFactor - 1.0
Inputs 
  InputValueLookupCd - Step2
  InputValueLookeupTypeCd - XML or Memory 
  InputFactor - 1.0812
Operation - *
Calculation - 1.0 * 1.0812
Result - 1.0812
Output - N/A
Output - N/A


Developer
Feb 23, 2016 at 12:53 PM
Steven,

The statusCd for us is used to indicate instances where a coverage has been endorsed, or out of sequence endorsed. There is probably a better way. How would you indicate that at a coverage level? Lets say someone dropped Rental mid-term at 30/900 and added it at 45/1350?

The decline/reasons are to indicate on a quote, that coverage has changed and why on a quote. We print these out on quotes for agents. For instance, Rental declined, not available on vehicles without physical damage. Very easy to communicate the business reason and save a call to the underwriter...huge for us.

LOVE the more formal rating step declaration. I think you will see this communication with a GA or MGA agent communication.

Jamie,

Thank you for converting the example, and helping start the discussion. I feel this is the MOST important and common object for insurance, and one of the most overlooked at ACORD. We obviously went down our own path and flattening for physical storage was a big factor in our structure...10 years ago.

Time for CHANGE!
Coordinator
Feb 23, 2016 at 4:42 PM
I've been thinking a lot about Object Oriented Principals around our new Resources... we should be able to pass the same object/resource back and forth between Carrier and Vendor.

The existing standard already supports this bi-directional construct within QuestionAnswer so the Carrier can invent their own questions. The same should be true of Coverage, we have CoverageCd & CoverageDesc, what we need is AvailableLimit and AvailableDeductible (maybe AvailableOption). See example here: https://acordpcxml2.codeplex.com/SourceControl/latest#samples/Coverage-Resource.xml
Coordinator
Feb 23, 2016 at 6:43 PM
You would use the Coverage Effective and Expiration dates to show coverages that are changed over time. Important to use dates rather than a code because you need to calculate earned/unearned premiums and handle stat reporting. Out of Sequence is always an outlier process. I've had to develop that twice and both times we went with a process that basically went back in time and reset the effective and expiration dates of the changes. You undo the blocking endorsement, apply to OOS one, then add back the blocker (if you still can).
Developer
Feb 24, 2016 at 3:10 AM
EffectiveDt and ExpirationDt show when coverages are valid, as well as a Timestamp to show when.

The StatusCd allows us to do the following:

Coverage=Rental, Limit=30/900, EffectiveDt=01/01/2015, ExpirationDt=01/01/2016, Ts=11/29/2014, StatusCd=Removed
Coverage=Rental, Limit=30/900, EffectiveDt=01/01/2015, ExpirationDt=04/26/2015, Ts=05/10/2015, StatusCd=Inforce
Coverage=Rental, Limit=45/1350, EffectiveDt=04/27/2015, ExpirationDt=01/01/2016, Ts=05/10/2015, StatusCd=Inforce
Coverage=Towing, Limit=Yes, EffectiveDt=04/27/2015, ExpirationDt=01/01/2016, Ts=05/10/2015, StatusCd=Inforce

This is an example of altering Rental coverage on 05/10/2015, and adding Towing. The original Rental coverage record is not lost.

We prefer to not remove, juggle, or otherwise edit records, except to show that coverage is removed. This allows us to keep track of the changes and not alter important records of coverage.

If anyone has a better way, PLEASE share!
Coordinator
Mar 5, 2016 at 4:58 PM
Edited Mar 5, 2016 at 4:58 PM
In Jamie's above ACORD Coverage implementation this is how it would be expressed as a JSON object automatically. I do this to ask these questions;

1) Is this light weight enough for a resource?
2) Do we need to have "Limit" be articulated as "Limits"? (Purals)
3) What would this object look like when going to an object?
4) What would this object look like in UML
{
    "Coverage": {
        "CoverageCd": "PD", 
        "CoverageTypeCd": null, 
        "IterationNumber": null, 
        "CoverageDesc": null, 
        "Limit": [
            {
                "FormatInteger": "50000", 
                "LimitBasisCd": null, 
                "LimitAppliesToCd": null
            }, 
            {
                "FormatInteger": null, 
                "LimitBasisCd": null, 
                "LimitAppliesToCd": null
            }
        ], 
        "Deductible": [
            {
                "FormatInteger": null, 
                "DeductibleBasisCd": null, 
                "DeductibleTypeCd": null, 
                "DeductibleAppliesToCd": null
            }, 
            {
                "FormatInteger": null, 
                "DeductibleBasisCd": null, 
                "DeductibleTypeCd": null, 
                "DeductibleAppliesToCd": null
            }
        ], 
        "Option": [
            {
                "OptionTypeCd": null, 
                "OptionCd": null, 
                "OptionValue": null, 
                "OptionDescCd": null, 
                "OptionValueDesc": null
            }, 
            {
                "OptionTypeCd": null, 
                "OptionCd": null, 
                "OptionValue": null, 
                "OptionDescCd": null, 
                "OptionValueDesc": null
            }
        ], 
        "CurrentTermAmt": {
            "Amt": "85", 
            "CurCd": null, 
            "Precision": null
        }, 
        "NetChangeAmt": {
            "Amt": null, 
            "CurCd": null, 
            "Precision": null
        }, 
        "WrittenAmt": {
            "Amt": null, 
            "CurCd": null, 
            "Precision": null
        }, 
        "CreditOrSurcharge": [
            {
                "CreditSurchargeCd": null, 
                "NumericValue": {
                    "FormatInteger": null
                }
            }, 
            {
                "CreditSurchargeCd": null, 
                "NumericValue": {
                    "FormatInteger": null
                }
            }
        ], 
        "EffectiveDt": null, 
        "ExpirationDt": null, 
        "Rate": null, 
        "PremiumBasisCd": null, 
        "TerritoryCd": null, 
        "Form": {
            "FormNumber": null, 
            "FormName": null
        }, 
        "FloodZoneCd": null, 
        "CategoryCd": null, 
        "MinPremAmt": {
            "Amt": null, 
            "CurCd": null, 
            "Precision": null
        }, 
        "ProRateFactor": null, 
        "RatingClassificationCd": null, 
        "CoinsurancePct": null
    }
}
I also am including Mica's version articulated as a JSON object.
{
    "coverage": {
        "ID": "0", 
        "typeCd": "PD", 
        "rateCd": "PLA_MO_PD_2335", 
        "lossCd": "LI_PD_MO", 
        "exposure": null, 
        "p1": "1.06", 
        "p2": "1.02", 
        "p3": "1.0", 
        "p4": ".68", 
        "p5": "1", 
        "p6": "1", 
        "p7": "1", 
        "p8": "1", 
        "p9": "1", 
        "p10": "122", 
        "p11": ".95", 
        "form": null, 
        "name": null, 
        "description": "PROPERTY DAMAGE LIABILITY - EACH ACCIDENT PART A", 
        "statusCd": null, 
        "declinedInd": "false", 
        "declinationReason": null, 
        "conditionsInd": "false", 
        "conditionsReason": null, 
        "limit_1": "50000", 
        "limit_2": null, 
        "limit_3": null, 
        "deductible_1": null, 
        "deductible_2": null, 
        "deductible_3": null, 
        "attributes": null, 
        "premium_1": "85.00", 
        "premium_2": null, 
        "premium_3": null, 
        "creditOrSurcharge_1": "0.0", 
        "creditOrSurcharge_2": "0.0", 
        "creditOrSurcharge_3": "0.0", 
        "taxFeeAssessment_1": "0.0", 
        "taxFeeAssessment_2": "0.0", 
        "taxFeeAssessment_3": "0.0", 
        "ratingDetails_1": "[Step1: PD Driver Age(33), Terr(27) fx=1.06] 1.06 * 1.0 = 1.06\r\n[Step2: PD Driver Age(33), Sex(M) fx=1.02] 1.02 * 1.06 = 1.0812000000000002\r\n[Step3: PD Driver Age(33), Marital Status(S) fx=1.0] 1.0 * 1.0812000000000002 = 1.0812000000000002\r\n[Step4: PD Vehicle Use(P2), MilesToWork(1) fx=1.0] 1.0 * 1.0812000000000002 = 1.0812000000000002\r\n[Step5: PD Vehicle Annual Miles(3000) fx=0.68] 0.68 * 1.0812000000000002 = 0.7352160000000002\r\n[Step6: PD Driver Status(F), Age(33) fx=1.0] 1.0 * 0.7352160000000002 = 0.7352160000000002\r\n[Step7: PD Good Student(N), Driver Training(N) fx=1.0] 1.0 * 0.7352160000000002 = 0.7352160000000002\r\n[Step8: PD Student Away(N) fx=1.0] 1.0 * 0.7352160000000002 = 0.7352160000000002\r\n[Step9: PD SDIP() fx=1.0] 1.0 * 0.7352160000000002 = 0.7352160000000002\r\n[Step10:PD NumVeh() fx=1.0] 1.0 * 0.7352160000000002 = 0.7352160000000002\r\n[Step11:PD LicenseYears(LicensedAge=16 yearsLicensed=17) fx=1.0] 1.0 * 0.7352160000000002 = 0.7352160000000002\r\n[Step12: PD BASE terr(27,50)] 122.0 * 1.0 = 122.0\r\n[Step13: PD ABS(0.95)] 122.0 * 0.95 = 116.0\r\n[Step14: PD RATE CLASS ADJUST(0.7352160000000002)] 116.0 * 0.7352160000000002 = 85.0", 
        "ratingDetails_2": null, 
        "ratingDetails_3": null, 
        "option_1": null, 
        "option_2": null, 
        "option_3": null, 
        "effectiveDate": null, 
        "expirationDate": null, 
        "timestamp": null, 
        "#text": "[These are parameters used in the rating algorithm]\n          \n          \n          \n          \n          \n          \n          \n          \n          \n          \n             [Forms such as HO-3, GR-255, etc]\n          \n          \n             [inforce, removed, etc]"
    }
}
And for a third example here is how another vendor has articulated coverage in JSON. Notice their use of Plurals. BTW the below is a in production representation.
"coverages": [
                {
                    "coverageSequenceNumber": 1,
                    "coverageName": {
                        "code": "BodInj",
                        "value": "Bodily Injury"
                    },
                    "limits": [
                        {
                            "limitName": {
                                "code": "CovLim",
                                "value": " Coverage Limit"
                            },
                            "limitChoice": {
                                "code": "250000/500000",
                                "value": "$250,000/$350,000"
                            }
                        }
                    ],
                    "financialInfo": {
                        "currentTermAmount": 164
                    }
                }
]