/** DataSonnet version=2.0 output application/json input payload application/json */ /* Product provided US Template Note: 1. Don't Change the functions 2. For any customization, make proper documentations */ local _DATASOURCE = "OK"; local simpleAttr(sourceattr) = { value: sourceattr }; local lookupAttr(sourceattr, codebase, lookup) = { //value: codebase+"."+lookup+"."+sourceattr value: lookup+"."+codebase+"."+sourceattr }; local complexAttr(sourceattr, codebase, lookup) = { value: codebase+"."+lookup+"."+sourceattr }; local reltioHCPCurrentAddressIds = if std.objectHas(payload[0], "object") && std.objectHas(payload[0].object,"attributes") && std.objectHas(payload[0].object.attributes,"Address") && payload[0].crosswalk.sourceTable == "HCP" then ds.jsonpath.select(payload[0].object.attributes, "$.Address[*].value.SourceAddressID[*].value") else ["DUMMY"]; local reltioHCPCurrentAddressDetails = if std.objectHas(payload[0], "object") && std.objectHas(payload[0].object,"attributes") && std.objectHas(payload[0].object.attributes,"Address") && payload[0].crosswalk.sourceTable == "HCP" then ds.jsonpath.select(payload[0].object.attributes, "$.Address[*]") else []; local oneKeyIndDirectAddress = if std.objectHas(payload[1], "workplace") && std.objectHas(payload[1].workplace, "workplaceAddresses") && payload[1].workplace.workplaceAddresses != null then ds.jsonpath.select(payload[1].workplace, "$.workplaceAddresses..address.addressEid"); local oneKeyDirectAddress = if std.objectHas(payload[1], "individual") && payload[1].individual != null && std.objectHas(payload[1].individual, "individualAddresses") && payload[1].individual.individualAddresses != null then ds.jsonpath.select(payload[1].individual, "$.individualAddresses..address.addressEid") else ["DUMMY"]; /*Function for Workplace Address*/ local findWKPAddress(source, type) = [ { "refEntity": { "crosswalks": [ { "type": "configuration/sources/OK", "value": "Surrogate" } ] }, "refRelation": { "crosswalks": [ if type == "IND" then { "type": "configuration/sources/OK", "value": payload[1].activity.activityEid+"."+payload[1].workplace.workplaceEid+"."+addresses.address.addressEid, "deleteDate": "" } else { "type": "configuration/sources/OK", "value": payload[1].workplace.workplaceEid+"."+addresses.address.addressEid, "deleteDate": "" } ] }, "value" :{ "AddressLine1" : [simpleAttr(addresses.address.addressLongLabel)], "AddressLine2" : [simpleAttr(addresses.address.extensionLabel)], "AddressType" : [lookupAttr(addresses.typeCode, payload[1].codBase, "TYS")], "AddressRank" : [simpleAttr(addresses.rank)], "Zip": [ { "value": { "Zip5": [simpleAttr(addresses.address.longPostalCode)] } } ], "City": [simpleAttr(addresses.address.postalTownReference.villageLabel)], "Country":[simpleAttr(addresses.address.postalTownReference.country)], "PostalCity": [simpleAttr(addresses.address.postalTownReference.dispatchLabel )], "SourceAddressInfo": [ { "value": { "SourceLocationId": [simpleAttr(addresses.address.addressEid)], "SourceName": [simpleAttr("OK")] } } ], "SourceAddressID": [simpleAttr(addresses.address.addressEid)], "BuildLabel": if std.objectHas(addresses, "buildingLabel") then [simpleAttr(addresses.buildingLabel)] else [], "StateProvinceCode": [ { "value": "DPT"+"."+payload[1].codBase+"."+subdivisions.externalId } for subdivisions in ds.valuesOf(addresses.address.postalTownReference.subdivisions) if std.objectHas(subdivisions, "subdivisionType") && subdivisions.subdivisionType == "SUB.3" ], "StateProvince": [ simpleAttr(subdivisions.longLocalizedLabel) for subdivisions in ds.valuesOf(addresses.address.postalTownReference.subdivisions) if std.objectHas(subdivisions, "subdivisionType") && subdivisions.subdivisionType == "SUB.3" ], "Brick": [ { "value": { "Type": [simpleAttr("UG" + segments.type)], "BrickValue": [simpleAttr("UG" + segments.type+"."+payload[1].codBase+"."+ segments.brickEid)], "SortOrder": [simpleAttr(self.Type[0].value+"."+self.BrickValue[0].value)] } } for segments in ds.valuesOf(addresses.address.segmentations) ] } } for addresses in ds.valuesOf(source) ]; /*Function for Address*/ local findAddress(addresses, type, addressType, wkpName, mainAct) = { "refEntity": { "crosswalks": [ { "type": "configuration/sources/OK", "value": "Surrogate" } ] }, "refRelation": { "crosswalks": [ if type == "IND" && std.objectHas(payload[1], "individual") && std.objectHas(payload[1], "activity") then if addressType == "INDIRECT" then { "type": "configuration/sources/OK", "value": payload[1].activity.activityEid+"."+payload[1].workplace.workplaceEid+"."+addresses.address.addressEid, "deleteDate": "" } else { "type": "configuration/sources/OK", "value": payload[1].individual.individualEid+"."+addresses.address.addressEid, "deleteDate": "" } else { "type": "configuration/sources/OK", "value": payload[1].workplace.workplaceEid+"."+addresses.address.addressEid, "deleteDate": "" } ] }, "value" :{ "PrimaryAffiliation" : if mainAct !=null && mainAct then [simpleAttr("Yes")] else [simpleAttr("No")], "HcoName" : if wkpName !=null then [simpleAttr(wkpName)] else [], "AddressLine1" : [simpleAttr(addresses.address.addressLongLabel)], "AddressLine2" : [simpleAttr(addresses.address.extensionLabel)], "AddressType" : [ if type == "IND" then if addressType == "DIRECT" then { "value": "ADDR_LOCATION"+"."+payload[1].codBase+"."+addresses.address.locationCode, } else { "value": "TYS"+"."+"ADDR_LOCATION"+"."+addresses.typeCode, } else { "value": "TYS"+"."+"ADDR_LOCATION"+"."+addresses.typeCode, } ], "LocConfInd" : [ if type == "IND" then if addressType == "DIRECT" then { "value": "ADC"+"."+payload[1].codBase+"."+addresses.confidenceIndicatorCode, } else { "value": "TYS"+"."+"ADDR_LOCATION"+"."+addresses.typeCode, } else { "value": "TYS"+"."+"ADDR_LOCATION"+"."+addresses.typeCode, } ], "DerivedAddress": [ if addressType == "DIRECT" then { "value": "0", } else { "value": "1", } ], "BestRecord" : [ if addressType == "DIRECT" then if addresses.isBestAddress then { "value": "Y", }else{ "value": "N", } else { "value": null, } ], "AddressRank" : [ if addressType == "DIRECT" then { "value": addresses.rankCode, } else { "value": "8", } ], "Zip": [ { "value": { "Zip5": [simpleAttr(addresses.address.longPostalCode)] } } ], "City": [simpleAttr(addresses.address.postalTownReference.villageLabel)], "Country":[simpleAttr(addresses.address.postalTownReference.country)], "PostalCity": [simpleAttr(addresses.address.postalTownReference.dispatchLabel )], "SourceAddressInfo": [ { "value": { "SourceLocationId": [simpleAttr(addresses.address.addressEid)], "SourceName": [simpleAttr("OK")] } } ], "SourceAddressID": [simpleAttr(addresses.address.addressEid)], "BuildLabel": if std.objectHas(addresses, "buildingLabel") then [simpleAttr(addresses.buildingLabel)] else [], "StateProvinceCode": [ { "value": "DPT"+"."+payload[1].codBase+"."+subdivisions.externalId } for subdivisions in ds.valuesOf(addresses.address.postalTownReference.subdivisions) if std.objectHas(subdivisions, "subdivisionType") && subdivisions.subdivisionType == "SUB.3" ], "StateProvince": [ simpleAttr(subdivisions.longLocalizedLabel) for subdivisions in ds.valuesOf(addresses.address.postalTownReference.subdivisions) if std.objectHas(subdivisions, "subdivisionType") && subdivisions.subdivisionType == "SUB.3" ], "Brick": [ { "value": { "Type": [simpleAttr("UG" + segments.type)], "BrickValue": [simpleAttr("UG" + segments.type+"."+payload[1].codBase+"."+ segments.brickEid)], "SortOrder": [simpleAttr(self.Type[0].value+"."+self.BrickValue[0].value)] } } for segments in ds.valuesOf(addresses.address.segmentations) ] } }; /*Identify Address*/ { "tempAddrData" : [if std.objectHas(payload[1], "individual") && payload[1].individual != null then { "indirect" : [ if !ds.contains(oneKeyDirectAddress, wkpaddr.address.addressEid) then { "Addresses" : findAddress(wkpaddr, "IND", "INDIRECT", null, null) }else{ "Addresses" : null } for wkpaddr in ds.valuesOf(payload[1].workplace.workplaceAddresses) if std.count(reltioHCPCurrentAddressIds, wkpaddr.address.addressEid ) == 0 ], "direct" : [ if ds.contains(oneKeyIndDirectAddress, indaddr.address.addressEid) then { "Addresses" : findAddress(indaddr, "IND", "DIRECT", payload[1].workplace.usualName, payload[1].activity.isMainActivity) }else{ "Addresses" : findAddress(indaddr, "IND", "DIRECT", null, null) } for indaddr in ds.valuesOf(payload[1].individual.individualAddresses) if std.count(reltioHCPCurrentAddressIds, indaddr.address.addressEid ) == 0 ] } ] } /*Individual Mapping*/ { "individual" : [ if std.objectHas(payload[1], "individual") && payload[1].individual != null then { "attributes" : { "FirstName" : [simpleAttr((payload[1].individual.firstName))], "LastName" : [simpleAttr((payload[1].individual.lastName))], "ValidationStatus":[lookupAttr(payload[1].individual.statusCode, payload[1].codBase, "STA")], "StateCode":[lookupAttr(payload[1].individual.stateCode, payload[1].codBase, "STE")], "SourceName": [simpleAttr(("OK"))], "Title" : [lookupAttr(payload[1].individual.titleCode, payload[1].codBase, "TIT")], "Country" : [simpleAttr((payload[1].country))], "Prefix" : [lookupAttr(payload[1].individual.prefixNameCode, payload[1].codBase, "APP")], "SubTypeCode" : [lookupAttr(payload[1].individual.typeCode, payload[1].codBase, "TYP")], "Specialities": [ { "value" :{ "SpecialtyType" :[simpleAttr(("SPEC"))], "Rank":[simpleAttr("1")], "Specialty": [lookupAttr(specs.code, payload[1].codBase, "SP")], "SortOrder" : [simpleAttr("1." + specs.rank)] } } for specs in ds.valuesOf(payload[1].individual.qualifications) if specs.listCode == "SP" ], "Identifiers" : [ { "value" :{ "ID" : [simpleAttr((idts.value))], "Order":[simpleAttr(idts.number)], "Type": [lookupAttr(idts.typeCode, payload[1].codBase, "REX")] } } for idts in ds.valuesOf(payload[1].individual.externalKeys) ], "Address": [ valuess.Addresses for valuess in $['tempAddrData'][0].direct if valuess.Addresses != null ] + [ valuess.Addresses for valuess in $['tempAddrData'][0].indirect if valuess.Addresses != null ] + reltioHCPCurrentAddressDetails }, "type": "configuration/entityTypes/HCP", "crosswalks": [ { "sourceTable": "HCP", "type": "configuration/sources/OK", "value": payload[1].individual.individualEid, "deleteDate": "" } ] } ] } /*Workplace Mapping*/ { "workplace" : [ if std.objectHas(payload[1], "workplace") && payload[1].workplace != null then { "attributes" : { "Name" : [simpleAttr((payload[1].workplace.usualName))], "UpdateDate" : [simpleAttr(payload[1].workplace.updateDate)], "SourceName" : [simpleAttr(("OK"))], "Country" : [simpleAttr((payload[1].country))], "ValidationStatus":[lookupAttr(payload[1].workplace.statusCode, payload[1].codBase, "STA")], "StateCode":[lookupAttr(payload[1].workplace.stateCode, payload[1].codBase, "STE")], "StateDate" : if std.objectHas(payload[1].workplace, "stateDate") then [simpleAttr(payload[1].workplace.stateDate)] else [], "ActTypeCode" : if std.objectHas(payload[1].workplace, "activityStructureTypeCode") && payload[1].workplace.activityStructureTypeCode != null then [lookupAttr(payload[1].workplace.activityStructureTypeCode, payload[1].codBase, "TAS")] else [], "WebsiteURL": [ { "value" : idts.value } for idts in ds.valuesOf(payload[1].workplace.medias) if idts.typeCode == "W3" ], "Identifiers" : [ { "value" :{ "ID" : [simpleAttr((idts.value))], "Order":[simpleAttr(idts.number)], "Type": [lookupAttr(idts.typeCode, payload[1].codBase, "REX")] } } for idts in ds.valuesOf(payload[1].workplace.externalKeys) ], "ClassofTradeN" :[ { "value":{ "Classification": [lookupAttr(payload[1].workplace.activityLocationCode, payload[1].codBase, "LEX")], "FacilityType" : [lookupAttr(payload[1].workplace.typeCode, payload[1].codBase, "TET")] } } ], "Specialities": [ { "value" :{ "SpecialtyType" :[simpleAttr(("SPEC"))], "Rank":[simpleAttr("1")], "Specialty": [lookupAttr(specs.code, payload[1].codBase, "SP")], "SortOrder" : [simpleAttr("1." + specs.rank)] } } for specs in ds.valuesOf(payload[1].workplace.qualifications) if specs.listCode == "SP" ], "Phone": if std.objectHas(payload[1].workplace, "telephones") then [ { "value": { "Extension": [simpleAttr((phones.officeNumber))], "Number": [simpleAttr((phones.callNumberForDisplay))], "Rank": [simpleAttr(phones.rank)], "TypeIMS": [lookupAttr(phones.typeCode, payload[1].codBase, "TEL")], "CountryCode": [simpleAttr(payload[1].country)] } } for phones in ds.valuesOf(payload[1].workplace.telephones) if phones.typeCode == "1" ], "Address": if std.objectHas(payload[1], "workplace") && std.objectHas(payload[1].workplace, "workplaceAddresses") && payload[1].workplace.workplaceAddresses != null then findWKPAddress(payload[1].workplace.workplaceAddresses, "WKP") }, "type" : "configuration/entityTypes/HCO", "crosswalks" : [ { "sourceTable" : "HCO", "deleteDate" : "", "type" : "configuration/sources/"+_DATASOURCE, "value" : payload[1].workplace.workplaceEid, } ] } ] } /*Activity Mapping*/ { "activity" :[ if std.objectHas(payload[1], "activity") && payload[1].individual != null then { "type": "configuration/relationTypes/Activity", "crosswalks": [ { "value": payload[1].activity.activityEid+"."+payload[1].activity.individualEid+"."+payload[1].activity.workplaceEid, "sourceTable": "Activity", "deleteDate": "", "type": "configuration/sources/OK" } ], "startObject": { "crosswalks": [ { "sourceTable": "HCP", "type": "configuration/sources/OK", "value": payload[1].activity.individualEid } ] }, "endObject": { "crosswalks": [ { "sourceTable": "HCO", "type": "configuration/sources/OK", "value": payload[1].activity.workplaceEid } ] }, "attributes": { "Country": [simpleAttr((payload[1].country))], "ValidationStatus":[lookupAttr(payload[1].activity.statusCode, payload[1].codBase, "STA")], "ActValidationStatus" :[lookupAttr(payload[1].activity.statusCode, payload[1].codBase, "STA")], "RelationshipCreateDate":if std.objectHas(payload[1].activity, "creationDate") then [simpleAttr(payload[1].activity.creationDate)] else [], "RelationshipStartDate":[simpleAttr(payload[1].activity.activityStartDate)], "RelationshipEndDate":[simpleAttr((payload[1].activity.activityEndDate))], "PrimaryAffiliationIndicator": [simpleAttr(payload[1].activity.isMainActivity)], "UpdateDate":[simpleAttr(payload[1].activity.updateDate)], "RocheReasonCode" : [simpleAttr(payload[1].activity.reasonLabel)], "ActIdentifiers" : [ { "value" :{ "ID" : [simpleAttr((idts.value))], "Order":[simpleAttr(idts.number)], "Type": [lookupAttr(idts.typeCode, payload[1].codBase, "REX")] } } for idts in ds.valuesOf(payload[1].activity.externalKeys) ], } } ] }