Implementing Enterprise Service Bus (ESB) is crucial game when it comes to complex working model of Insurance sector. A key part of the ESB is to leverage the SOA framework and implement a set of services that connect with cloud and on-premise applications. This becomes more critical when linkage is between various business processes of the insurance domain.
The ESB Services Layer consists of a set of common services that connect and access data spread across enterprise systems and provide the data in a format that the end-users are able to consume as part of their business functions.
As a leader in B2B integration, Adeptia has gained expertise in implementing ESB for Insurance companies. Here’s a high-level diagram that shows how an Adeptia ESB service layer interacts with the business process and the underlying systems.
The process begins by calling a context-specific API or Business Process Service (the ESB framework allows for many different methods of initialization whether it be batch jobs kicked off during another process, timed events, or manual requests) and passing the appropriate data elements (for that specific service), once the request is received the service layer parses the request and determines the appropriate actions to take such as: which system to query, what query to use, which mapping process to use and how to send the data back. Next the data is gathered from the appropriate data source and mapped to the Insurance Company’s standard (or “base”) format, business rules are applied to the data (if the requesting process has defined any) and the data is returned in the predefined way.
In the following example, we would setup a service with two methods that provides Policy and Policy summary to a HealthCare Claims system. In this use case, a claim’s handler is reviewing a new claim application. On the Claim Management System, reviewer clicks on a button called “Find Policy Information” by policy number among other required values. The service (API) response brings up the policy details of the insured and displays it in the Claims system next to the claim application. The information helps the claim reviewer with the relevant data needed to process the claim.
Now let’s look at the ESB implementation examples in detail.
Claims Web Service
There are two methods exposed in the following Claims API:
Sample endpoint: https://IPaddress/wsx/services/getPolicy?wsdl
Method 1: getPolicy
Method 2: getPolicySummaries
Method 1: getPolicy
Method getPolicy request (see Appendix D) contains the following fields:
Field | Comments |
FullPolicyNumber | Optional |
PolicyPrefix | Required |
PolicyNumber | Required |
PolicySuffix | Optional |
LineOfBusiness | Required (example WC) |
EffDate | Required (yyyy-mm-dd) |
ExpDate | Required (yyyy-mm-dd) |
LossDate | Optional (yyyy-mm-dd) |
OriginatingSystem | Required (values can be PNT, CSC, PHX) |
RequestSystem | Required (such as ClaimPlus) |
The response message structure for this request is mentioned in Appendix B. For more information on the response message please refer to the ‘Returning Data’ section.
Method getPolicySummaries request (see Appendix C) contains the following fields:
Field | Comments |
FullPolicyNumber | Required. Supports wild card * |
PolicyPrefix | Optional. Supports wild card * |
PolicyNumber | Optional. Supports wild card * |
PolicySuffix | Optional. Supports wild card * |
LineOfBusiness | Required (example WC) |
EffDate | Optional |
ExpDate | Optional |
LossDate | Required. (yyyy-mm-dd) |
InsuredName | Optional. Supports wild card * |
InsuredTaxID | Optional. Supports wild card * |
City | Optional. Supports wild card * |
State | Optional. Supports wild card * |
PostalCode | Optional. Supports wild card * |
PolicyStatusCD | Optional. Supports wild card * |
PEOClientName | Optional. Supports wild card * |
PolicyStatusCD | Optional. Supports wild card * |
OriginatingSystem | Optional (example value is OneSource) |
RequestSystem | Optional (example ClaimPlus) |
The response message structure for this request is mentioned in Appendix A. For more information on the response message please refer to the ‘Returning Data’ section.
Data element maps are created in the service layer that corresponds to the standard or base mapping for each policy system data source and line of business that is needed. This allows the framework to be standardized across multiple systems and reduce or eliminate the system specific knowledge that is needed to not only map but also extract data from any given system. The concept is to write an extraction process once for every system and LOB then reuse and expand the mapping to accommodate the next project that needs data from any given source.
One of the major benefits to the SOA approach is to reduce the complexity of data mapping from project to project and to be able to reuse these mappings over and over. Another area of opportunity is reducing the complexity and standardization of the data elements themselves into easily understandable names and meanings. Your company can standardize on XML or JSON constructs that are easily expandable for future projects and all Lines of Business. This does not mean that XML or JSON is the only way to receive data; it is only one of many. If your application needs data delivered in some other format or written to a database this framework would be able to deliver that as well.
The returning response structure itself is comprised of elements or nodes that are hierarchical in nature. The first node at the top of the structure is the “COMPANY” node. Under this node you can have a Policy node. The Policy node contains elements that all Policies have regardless of the business line, examples are: PolicyNumber, EffDate, LineOfBusiness and many others. If the LOB node is populated as “WC” then there will be node named “WorkersCompensation” at that level. This node will contain all the policy detail information for that Workers Comp policy.
Here is a portion of the xml:
<?xml version="1.0"?>
<COMPANY type="claim" userid="">
<ReturnStatus>
<ReturnCd></ReturnCd>
<Error>
<ErrorCd></ErrorCd>
<ErrorMessage></ErrorMessage>
</Error>
</ReturnStatus>
<Policy offset="Added" description="Policy" type="system">
<PolicyPrefix></PolicyPrefix>
<PolicyNumber></PolicyNumber>
<PolicySuffix></PolicySuffix>
<FullPolicyNumber></FullPolicyNumber>
<LineOfBusiness></LineOfBusiness>
<PolicyStatusCd></PolicyStatusCd>
<EffDate></EffDate>
<ExpDate></ExpDate>
<CancelDate>
</CancelDate>
<ReinstatedDate>
</ReinstatedDate>
<Renewal></Renewal>
<OriginatingSystem></OriginatingSystem>
</Policy>
</COMPANY>
Please see the table below and the appendixes’ of this document for further description of the returned XML.
Below is a list of existing response types:
TYPE | NAME | Response Type | Specifications |
XML | Policy Header | XML - Standard | Appendix A |
XML | Policy Header and Workers Compensation | XML - Standard | Appendix B |
In this section, we describe each of the existing interfaces and the general idea behind each one. The tables at the end of the section will point you to more detailed information in the appendixes.
Your company may have several varying systems and one of the challenges for SOA strategy is to verify policy accuracy before performing an action on a given policy. The getSummaries Web Service method can be created to offer policy searching and verification capability to applications or processes that may need it.
Guidelines/Information:
The getPolicy Web Service is created to provide policy detail information, for any line of business, in a standard format.
Guidelines/Information:
Below is a list of existing interfaces:
TYPE | NAME | Response Type | LOB | Data Source | Specifications |
Web Service | getSummaries | XML – Standard Policy Header | ALL | OneSource Reference | Appendix C |
Web Service | get Policy | XML – Standard Policy Detail | WC | Data Mirrors: Point8, PointIN, Phoenix | Appendix D |
API Library consists of services that get data from following systems:
- Point8
- PointIN
- Vantage
- Phoenix
- Insurity
- WPC
- Coverall
- MRS database
- Guidewire
- Duckcreek
- and other systems
API can also use Mapping (data transformation rules) to convert data, such as:
- Legacy to HIPAA, HL7 or ACORD XML maps
- HIPAA, HL7 or ACORD XML to Insurance Company systems
- ACORD AL3 conversion to canonical format
- EDI to SAP
- HIPAA to Database
- HL7 to a common format
- and many others
<?xml version="1.0"?>
<COMPANY type="rate,claim,policy,etc..." userid="">
<ReturnStatus>
<ReturnCd>01</ReturnCd>
<Error>
<ErrorCd>02</ErrorCd>
<ErrorMessage>No Policy Found</ErrorMessage>
</Error>
</ReturnStatus>
<Policy offset="Added" description="Policy" type="system">
<PolicyPrefix>WCC</PolicyPrefix>
<PolicyNumber>0001735</PolicyNumber>
<PolicySuffix>09</PolicySuffix>
<FullPolicyNumber>WCC000173509</FullPolicyNumber>
<LineOfBusiness>WC</LineOfBusiness>
<PolicyStatusCd>ACTIVE</PolicyStatusCd>
<EffDate>1/26/2016</EffDate>
<ExpDate>1/26/2017</ExpDate>
<CancelDate>
</CancelDate>
<ReinstatedDate>
</ReinstatedDate>
<Renewal>0</Renewal>
<OriginatingSystem>PHX, CSC, PNT</OriginatingSystem>
<AdditionalInterest>
<MasterCompany />
<SUAProgramCd />
<SUAPlanCd />
</AdditionalInterest>
<InsuredOrPrincipal>
<AdditionalInterest>
<TaxID />
</AdditionalInterest>
<Address>
<AddrTypeCd>MailingAddress</AddrTypeCd>
<Addr1>404 Avenue Of The Americas</Addr1>
<Addr2>
</Addr2>
<Addr3>
</Addr3>
<City>New York</City>
<Country>US</Country>
<StateProvCd>NY</StateProvCd>
<PostalCode>10011-8416</PostalCode>
</Address>
<BusinessInfo>
<OperationsDesc>Nature of Business</OperationsDesc>
</BusinessInfo>
<ContactInfo>
<Email>insured@hotmail.com</Email>
<HomePhone>555-555-5555</HomePhone>
<MobilePhone>555-555-5555</MobilePhone>
<WorkPhone>555-555-5555</WorkPhone>
</ContactInfo>
<NameInfo>
<LegalEntityCd>LL</LegalEntityCd>
<CommlName>
<CommercialName>NY Test Class Specfic Questions-9074 red</CommercialName>
</CommlName>
<NonTaxIdentity>
<NonTaxIdTypeCd>StateBureau</NonTaxIdTypeCd>
<NonTaxId>2323232</NonTaxId>
</NonTaxIdentity>
<TaxIdentity>
<TaxIdTypeCd>FEIN</TaxIdTypeCd>
<TaxId>121211111</TaxId>
</TaxIdentity>
</NameInfo>
</InsuredOrPrincipal>
<Producer>
<ProducerInfo>
<ContractNumber>0000667</ContractNumber>
<ProducerSubCode>0000151</ProducerSubCode>
<ProducerName>Producer Name</ProducerName>
<PlacingOffice>1001</PlacingOffice>
</ProducerInfo>
<SubProducerInfo>
<ContractNumber>0000667</ContractNumber>
<ProducerSubCode>0000151</ProducerSubCode>
<ProducerName>Producer Name</ProducerName>
<PlacingOffice>1001</PlacingOffice>
</SubProducerInfo>
</Producer>
</Policy>
</COMPANY>
<WorkersCompensation id="N2">
<LOBCd>WORK</LOBCd>
<RiskId>444444444444</RiskId>
<AdditionalInterest>
<DrugFreeWorkPlace />
<LargeDeductible>
</LargeDeductible>
<LargeDeductibleALAE>
</LargeDeductibleALAE>
<ManagedCareCredit />
</AdditionalInterest>
<WorkCompRateState id="N4">
<StateProvCd>NY</StateProvCd>
<WorkCompLocInfo LocationRef="N3">
<LocationDesc>NY Test Class Specfic Questions</LocationDesc>
<Address validated="true">
<Addr1>404 Avenue Of The Americas</Addr1>
<Addr2>
</Addr2>
<Addr3>
</Addr3>
<City>New York</City>
<StateProvCd>NY</StateProvCd>
<PostalCode>10011-8416</PostalCode>
</Address>
<AdditionalInterest>
<EffDate />
<ExpDate />
<CancelDate />
<ReinstatedDate />
<SICCd />
<NAICCd />
</AdditionalInterest>
<NameInfo>
<CommlName>
<CommercialName>Test2</CommercialName>
</CommlName>
</NameInfo>
<WorkCompRateClass id="N7">
<NumEmployeesFullTime>2</NumEmployeesFullTime>
<NumEmployeesPartTime>2</NumEmployeesPartTime>
<Rate>1.91</Rate>
<PremiumBasisCd>PAYRL</PremiumBasisCd>
<RatingClassificationCd>9074</RatingClassificationCd>
<Exposure>112000</Exposure>
<RatingClassificationDesc>TAVERN</RatingClassificationDesc>
<RatingClassificationDescCd>01</RatingClassificationDescCd>
<CurrentTermAmt>
</CurrentTermAmt>
</WorkCompRateClass>
</WorkCompLocInfo>
<CommlCoverage>
<ASL>160</ASL>
<CoverageCd>WCEL</CoverageCd>
<Deductible>
</Deductible>
<Limit>
<FormatInteger>500000</FormatInteger>
<LimitAppliesToCd>PerAcc</LimitAppliesToCd>
</Limit>
<Limit>
<FormatInteger>500000</FormatInteger>
<LimitAppliesToCd>DisEachEmpl</LimitAppliesToCd>
</Limit>
<Limit>
<FormatInteger>500000</FormatInteger>
<LimitAppliesToCd>DisPol</LimitAppliesToCd>
</Limit>
</CommlCoverage>
</WorkCompRateState>
</WorkersCompensation>
<xs:element name="getPolicySummaries">
-<xs:complexType>
-<xs:sequence>
<xs:elementmaxOccurs="1" minOccurs="0" name="FullPolicyNumber" type="xs:string" />
<xs:elementmaxOccurs="1" minOccurs="0" name="PolicyPrefix" type="xs:string" />
<xs:elementmaxOccurs="1" minOccurs="0" name="PolicyNumber" type="xs:string" />
<xs:elementmaxOccurs="1" minOccurs="0" name="PolicySuffix" type="xs:string" />
<xs:elementmaxOccurs="1" minOccurs="0" name="LineOfBusiness" type="xs:string" />
<xs:elementmaxOccurs="1" minOccurs="0" name="EffDate" type="xs:string" />
<xs:elementmaxOccurs="1" minOccurs="0" name="ExpDate" type="xs:string" />
<xs:elementmaxOccurs="1" minOccurs="0" name="LossDate" type="xs:string" />
<xs:elementmaxOccurs="1" minOccurs="0" name="InsuredName" type="xs:string" />
<xs:elementmaxOccurs="1" minOccurs="0" name="InsuredTaxID" type="xs:string" />
<xs:elementmaxOccurs="1" minOccurs="0" name="City" type="xs:string" />
<xs:elementmaxOccurs="1" minOccurs="0" name="State" type="xs:string" />
<xs:elementmaxOccurs="1" minOccurs="0" name="PostalCode" type="xs:string" />
<xs:elementmaxOccurs="1" minOccurs="0" name="PolicyStatusCD" type="xs:string" />
<xs:elementmaxOccurs="1" minOccurs="0" name="PEOClientName" type="xs:string" />
<xs:elementmaxOccurs="1" minOccurs="0" name="OriginatingSystem" type="xs:string" />
<xs:elementmaxOccurs="1" minOccurs="0" name="RequestSystem" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="getPolicy">
-<xs:complexType>
-<xs:sequence>
<xs:elementmaxOccurs="1" minOccurs="0" name="FullPolicyNumber" type="xs:string" />
<xs:elementmaxOccurs="1" minOccurs="1" name="PolicyPrefix" type="xs:string" />
<xs:elementmaxOccurs="1" minOccurs="1" name="PolicyNumber" type="xs:string" />
<xs:elementmaxOccurs="1" minOccurs="0" name="PolicySuffix" type="xs:string" />
<xs:elementmaxOccurs="1" minOccurs="1" name="LineOfBusiness" type="xs:string" />
<xs:elementmaxOccurs="1" minOccurs="0" name="EffDate" type="xs:string" />
<xs:elementmaxOccurs="1" minOccurs="0" name="ExpDate" type="xs:string" />
<xs:elementmaxOccurs="1" minOccurs="1" name="LossDate" type="xs:string" />
<xs:elementmaxOccurs="1" minOccurs="1" name="OriginatingSystem" type="xs:string" />
<xs:elementmaxOccurs="1" minOccurs="1" name="RequestSystem" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>