Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Note

This specification might evolve based on the development constraints.

Summary

Table of Contents

Claim AI-based Adjudication System

...

The AI input model is represented by a matrix having on each row one Medical Item/Service from a Claim. If the FHIR Claim Bundle contains multiple Claims then the AI input model will contain all Items/Services from all Claims. Each row contains the following informations (either FHIR Medical OR ActivityDefinition, representing an Item in FHIR Claim):

FHIR Medication fields

FHIR ActivityDefinition fields

FHIR Claim fields

FHIR Patient fields

FHIR HealthcareService fields

identifier (ItemUUID)

identifier (ServiceUUID)

identifier (ClaimUUID)

identifier (InsureeUUID, CHFID)

identifier (HfUUID)

extension.unitPrice

unitPrice

billablePeriod (start, end)

birthDate (to calculate age)

location (HFLocationUUID)

frequency

frequency

created

gender

category

extension.useContext (ItemPatCat)

useContext (ServicePatCat)

type

extension.isHead

type

type (always “Medication”)

type (always “ActivityDefinition”)

item.quantity

extension.povertyStatus

item.unitPrice

extension.locationCode (LocationUUID)

diagnosis.diagnosisReference (for icd_0 get ICDID)

extension.group (FamilyUUID)

diagnosis.diagnosisReference (for icd_1 get ICDID)

enterer (ClaimAdminUUID)

...

The following module configuration is defined:

Code Block
languagejson
{
    'authentication': [string], // Authentication key list. Default: [] String
    'claim_response_url': 'http://localhost:8000/claim_ai/ClaimResponse', // URL set in the ClaimResponse. String
    'ai_model_file': string"joblib_Voting_Model.pkl", // AI Model file name, relative location withto fullmodule pathfolder. String
Default: ./ai_model.pkl   claim'ai_responsescaler_organizationfile': string"scaler.pkl", // ValueAI toScaler build the insurer reference in the ClaimResponse. Default: openIMIS-Claim-AI
}file name, relative location to module folder. String
    'ai_encoder_file': "Encoder.obj", // AI Encoder file name, relative location to module folder. String
    'claim_response_organization': 'openIMIS-Claim-AI', // Organisation name in ClaimResponse. String
    'date_format': '%Y-%m-%d', // Date format to use. String
    'first_date': '2016-01-01' // First date for date transformation. String
}
Note

The default AI Model filename will be defined after finalizing the AI Algorithm development.

...

FHIR Contained Resources feature allows to integrate the referred resourced. Because AI-model is requiring information from other resources referenced by the Claim, these resources must to be accessible from the Claim sent by Claim-AI Quality module. In case of FHIR Claim, these are Patient, Condition, Medication, HealthcareService, Practitioner, ActivityDefinition. The mechanism to build Claim resource with Contained Resources is developed in the openIMIS FHIR R4 module. In FHIR R4 module, the inclusion of Contained Resources should be possible based on the query variable contained=true/false (default false).

...

Plantumlcloud
filenameClaimStatusStateDiagram.png
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
width
compressedtrue
revision1314
Expand
titleDiagram source
Code Block
@startuml

state "Enter Claim" as ClaimEntering {
 [*] --> Entered : Enter Claim
 
 Entered --> Entered : Edit\nClaim
 Entered : ClaimStatus=Entered (2)
 Entered : ReviewStatus=Idle (1)
 Entered : ClaimItemStatus=Accepted (1)
 Entered : RejectionReason=Accepted (0)
}

state "Rule Engine Checking" as RuleEngineCheck {

 state RuleEngineValidation <<choice>>

 Entered --> RuleEngineValidation : Submit Claim

 RuleEngineValidation --> RejectedByRuleEngine : Reject\nAll Items
 RejectedByRuleEngine : ClaimStatus=Rejected (1)
 RejectedByRuleEngine : ClaimItemStatus=Rejected (2)
 RejectedByRuleEngine : RejectionReason=[1-19]
 RejectedByRuleEngine : json_ext.claim_ai_quality.was_categorized=false
 RejectedByRuleEngine : json_ext.claim_ai_quality.request_time=ValidityFrom
 RejectedByRuleEngine : json_ext.claim_ai_quality.response_time=ValidityFrom
 RejectedByRuleEngine : json_ext.claim_ai_quality.ai_result=Rejected (2)


 RejectedByRuleEngine --> [*]

 RuleEngineValidation --> CheckedIdle : Accept \n Some Items
 CheckedIdle : ClaimStatus=Checked (4)
 CheckedIdle : json_ext.claim_ai_quality.was_categorized=false
 
}

state "AI Automatic Categorisation" as AICheck {

 state AIClaimCategorisation <<choice>>

 CheckedIdle --> AIClaimCategorisation 

 AIClaimCategorisation --> CheckedAIAccepted : Accept\nAll Items
 CheckedAIAccepted : json_ext.claim_ai_quality.was_categorized=true
 CheckedAIAccepted : json_ext.claim_ai_quality.ai_result=Accepted (1)

 AIClaimCategorisation --> CheckedAIFlagged : Reject\nSome Items
 CheckedAIFlagged : ReviewStatus=SelectedForReview (4)
 CheckedAIFlagged : ClaimItemStatus=Rejected (2)
 CheckedAIFlagged : RejectionReason=Rejected by AI (-2)
 CheckedAIFlagged : json_ext.claim_ai_quality.was_categorized=true
 CheckedAIFlagged : json_ext.claim_ai_quality.ai_result=Rejected (2)

 note top of CheckedAIFlagged : Rejected Items values 

}

state "Manual Review" as ManualReview {

 state SelectForReview <<choice>>

 CheckedAIAccepted --> SelectForReview

 SelectForReview --> CheckedNotSelected : Select manually\nnot to review
 CheckedNotSelected : ReviewStatus=Not Selected (2)
 CheckedNotSelected : RejectionReason=Accepted (0)

 SelectForReview --> CheckedSelected : Select manually\nto review
 CheckedSelected : ReviewStatus=Selected (4)
 CheckedSelected : RejectionReason=Accepted (0)

 state RequireManualReview <<choice>>

 CheckedSelected --> RequireManualReview 

 CheckedAIFlagged --> RequireManualReview : Selected automatically\nfor review

 RequireManualReview --> CheckedRejected : Manual Review\nReject All Items
 CheckedRejected: ClaimStatus=Rejected (1)
 CheckedRejected: ClaimItemStatus=Rejected (2)
 CheckedRejected : RejectionReason=Rejected by MO (-1)

 CheckedRejected --> [*]

 RequireManualReview --> CheckedAccepted : Manual Review\nAccept Some Items
 CheckedAccepted : ClaimItemStatus=Accepted (1)
 CheckedAccepted : RejectionReason=Accepted (0)

 CheckedAccepted  --> CheckedReviewed : Deliver review
 CheckedReviewed : ReviewStatus=Reviewed (8)

}

state "Processing" as Process {

 CheckedReviewed --> ValuatedAccepted : Process
 ValuatedAccepted : ClaimStatus=Valuated (16)

 CheckedNotSelected --> ValuatedAccepted : Process

 CheckedAccepted --> ValuatedBypassed : Process \nwithout \ndelivering \nreview
 ValuatedBypassed : ClaimStatus=Valuated (16)
 ValuatedBypassed : ReviewStatus=Bypassed (16)

 ValuatedBypassed --> [*]

 ValuatedAccepted --> [*]

}

@enduml

...

  • ClaimFilterMedicalItem allows Medical Officers to filter the Claims list based on a specific Medical Item (only one from autocomplete list)

  • ClaimFilterMedicalService allows Medical Officers to filter the Claims list based on a specific Medical Service (only one from autocomplete list)

  • ClaimFilterAIProcessed allows Medical Officers to display or hide the non AI-processed Claims when the option Checked is selected in Claim Status dropdown (checkbox, default checked, hidden and not used for other Claim Status options(dropdown with options: Show all, AI-Categorized Claim Only, Not AI-Categorized Claims Only, default AI-Categorized Claim Only)

Custom Claim Review Search Results - Frontend

...

Plantumlcloud
filenameopenIMIS-AI-Modules-Deployment.png
datalVTLboMwEPwaSpVXbboMwDP2aSNsDUkSp+0BySJEOTtJo1pqDqX9ATdsE0tpyWTUNaH8b2A1nx2kghIBIe9vdzuBQaQqGaZEGIfU6c+IGwODiQiGrDK1PnklCGpooMSEiLElRyTD6TvJSQgzLciEKhg2t8kDDsA/fsujxTi4EKkFTK7O4O9M4Zk1HlRDLjQltxG7f8p2KvCwUOnHyILnIj0VWSxgxNbM47B2hD8WSj5pLYX5n4SzBRxd0h+VorQhlGIbz4Eg5ISm0Jhh31LUnTaMJip3GURg4UzUEEZLvPuL5ARrZxQDYvzsY2zDJuDmi1ButHo2xmFz42Z8FHGZHSzanZR8YN/5x37blYwtxmmuSwUajBdeWoMF4fBB0vTagG9hT9p0bHq+k9WlNVjE5E4JqY+2qBWMmNosLq+FdArF+HstlPQ/UTjj+Oib/mE7vPI8z+5YmjSu8iyAYgSIhKy3hXAXKMh6n5DVS3CwFWsYVzuMGieMdQzKIqeYYgs++CgjUoZ7as9BNvtuEdV2ajMjf0T2cW+afmdLvNO2Jq12j9mI8WkndFxjCdH48lucbpGgosCmlA7znRf+Shifz9/op2jpcxJzecvYW7Pz+QT+iS7H5+BwjA5uZOuhn5WQRprzrFBD45xETJ1tJf1FR4b91tzboWc09THykcGfwUAlPLjwmswRLvL5oGNGwRT4P/0FZ6XN24K9JtYXw5jRD/3+AymbVd3A0mouyWWqPNJjRotPGYTFniV1rLNZYIdo/44adbJMhZoHWFw4EtC6snXHdWE1r6HMx1UcPYSb/tIw/+ia7Hp6DxGDXclK2DflVcKKHOi4UaApdKxOS5qIS55DOH/W7vhSHGqdYgwxRKKU78Tmb4jrF/rpeCJ4FH6ncGBRU3oK9V9CWzvneqFjMmXJnhdN01MosoqAz/GX8=
width
compressedtrue
revision24
Expand
titleDiagram source
Code Block
@startuml

database openIMISDB

node openIMISImplementation as


node openIMISImplementation as "openIMIS Implementation" {


component ClaimModule as "Claim Module"


component ClaimAIQualityModule as "Claim AI Quality Module"


component FHIRR4Module as "FHIR R4 Module"


FHIRR4Module -[dashed]-> ClaimModule: <<use>>


ClaimAIQualityModule -[dashed]-> FHIRR4Module :
<<use>>
ClaimAIQualityModule --^ ClaimModule

}

openIMISImplementation
 <<use>>
ClaimAIQualityModule --^ ClaimModule

database openIMISDB

ClaimModule -[dashed]-> openIMISDB:
<<use>>node openIMISClaimAIImplementation as "openIMIS
 <<use>>

}


node openIMISClaimAIImplementation as "openIMIS Claim-AI Implementation" {


component ClaimAIModule as "Claim-AI Module"


artifact ClaimAIModel as "Claim-AI Model"


ClaimAIModule -[dashed]-> ClaimAIModel: <<use>>

}

ClaimAIModule


}


ClaimAIModule -0)- ClaimAIQualityModule: FHIR Claim


ClaimAIModule -(0- ClaimAIQualityModule: FHIR ClaimResponse


node ClaimAITraining as "openIMIS Claim-AI Training" {


component ClaimAIAlgorithm as "Claim-AI ML Algorithm
"
ClaimAIAlgorithm
"
artifact openIMISDBReplica as "openIMIS Claim Data"

ClaimAIAlgorithm -[dashed]-> ClaimAIModel:
<<generates>>
ClaimAIAlgorithm
 <<generates>>
openIMISDBReplica -[dashed]-> openIMISDB: <<replicates>>
ClaimAIAlgorithm -[dashed]->
openIMISDB
 openIMISDBReplica: <<use>>


}


@enduml

Testing

Testing the WebSocket from JavaScript console

...