/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠOn a ĠSystems , ĠInc Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġorg . smart register . fhir core . engine . util . extension Ċ Ċ import Ġca . u hn . fhir . context . Fhir Context Ċ import Ġca . u hn . fhir . parser . I Parser Ċ import Ġca . u hn . fhir . rest . g client . Reference Client Param Ċ import Ġcom . google . android . fhir . datac apt ure . create Questionnaire Response Item Ċ import Ġcom . google . android . fhir . logical Id Ċ import Ġjava . util . Date Ċ import Ġjava . util . UUID Ċ import Ġorg . hl 7 . fhir . r 4 . model . Base Ċ import Ġorg . hl 7 . fhir . r 4 . model . Base DateTime Type Ċ import Ġorg . hl 7 . fhir . r 4 . model . Code able Concept Ċ import Ġorg . hl 7 . fhir . r 4 . model . Coding Ċ import Ġorg . hl 7 . fhir . r 4 . model . Condition Ċ import Ġorg . hl 7 . fhir . r 4 . model . Extension Ċ import Ġorg . hl 7 . fhir . r 4 . model . Human Name Ċ import Ġorg . hl 7 . fhir . r 4 . model . Observation Ċ import Ġorg . hl 7 . fhir . r 4 . model . Patient Ċ import Ġorg . hl 7 . fhir . r 4 . model . Primitive Type Ċ import Ġorg . hl 7 . fhir . r 4 . model . Quantity Ċ import Ġorg . hl 7 . fhir . r 4 . model . Questionnaire Ċ import Ġorg . hl 7 . fhir . r 4 . model . Questionnaire Response Ċ import Ġorg . hl 7 . fhir . r 4 . model . Reference Ċ import Ġorg . hl 7 . fhir . r 4 . model . Resource Ċ import Ġorg . hl 7 . fhir . r 4 . model . ResourceType Ċ import Ġorg . hl 7 . fhir . r 4 . model . Timing Ċ import Ġorg . json . JSONException Ċ import Ġorg . json . JSONObject Ċ import Ġorg . smart register . fhir core . engine . data . local . Default Repository Ċ import Ġtim ber . log . Tim ber Ċ Ċ private Ġval Ġfhir R 4 Json Parser Ġ= ĠF hir Context . for R 4 Cached (). new Json Parser () Ċ Ċ fun ĠBase ?. value ToString (): ĠString Ġ{ ĊĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠ Ġthis Ġ== Ġnull Ġ-> Ġreturn Ġ"" ĊĠĠĠ Ġthis . is DateTime Ġ-> Ġ( this Ġas ĠBase DateTime Type ). value . make It Readable () ĊĠĠĠ Ġthis . is Primitive Ġ-> Ġ( this Ġas ĠPrimitive Type < *> ). as StringValue () ĊĠĠĠ Ġthis Ġis ĠCoding Ġ-> Ġthis . display Ġ?: Ġcode ĊĠĠĠ Ġthis Ġis ĠCode able Concept Ġ-> Ġthis . stringValue () ĊĠĠĠ Ġthis Ġis ĠQuantity Ġ-> Ġthis . value . to Plain String () ĊĠĠĠ Ġthis Ġis ĠT iming Ġ-> ĊĠĠĠĠĠ Ġthis . repeat . let Ġ{ ĊĠĠĠĠĠĠĠ Ġit . period . to Plain String (). plus (" Ġ"). plus ( it . period Unit . display . capitalize ()). plus (" Ġ( s )") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġthis Ġis ĠHuman Name Ġ-> Ġ"${ this . given . first OrNull (). value ToString ()} Ġ${ this . family }" ĊĠĠĠ Ġelse Ġ-> Ġthis . toString () ĊĠ Ġ} Ċ } Ċ Ċ fun ĠCoding . as Code able Concept () Ġ= ĊĠ ĠCode able Concept (). apply Ġ{ ĊĠĠĠ Ġadd Coding ( this @ as Code able Concept ) ĊĠĠĠ Ġtext Ġ= Ġthis @ as Code able Concept . display ĊĠ Ġ} Ċ Ċ fun ĠCode able Concept . stringValue (): ĠString Ġ= ĊĠ Ġthis . text Ġ?: Ġthis . coding First Rep . display Ġ?: Ġthis . coding First Rep . code Ċ Ċ fun ĠResource . encode Resource ToString ( parser : ĠI Parser Ġ= Ġfhir R 4 Json Parser ): ĠString Ġ= ĊĠ Ġparser . encode Resource ToString ( this ) Ċ Ċ fun Ġ< T > ĠString . decode Resource FromString ( parser : ĠI Parser Ġ= Ġfhir R 4 Json Parser ): ĠT Ġ= ĊĠ Ġparser . parse Resource ( this ) Ġas ĠT Ċ Ċ fun Ġ< T Ġ: ĠResource > ĠT . update From ( updated Resource : ĠResource ): ĠT Ġ{ ĊĠ Ġvar Ġextension Update Form Ġ= ĠlistOf < Extension >() ĊĠ Ġif Ġ( updated Resource Ġis ĠPatient ) Ġ{ ĊĠĠĠ Ġextension Update Form Ġ= Ġupdated Resource . extension ĊĠ Ġ} ĊĠ Ġvar Ġextension Ġ= ĠlistOf < Extension >() ĊĠ Ġif Ġ( this Ġis ĠPatient ) Ġ{ ĊĠĠĠ Ġextension Ġ= Ġthis . extension ĊĠ Ġ} ĊĠ Ġval Ġjson Parser Ġ= Ġfhir R 4 Json Parser ĊĠ Ġval Ġstring Json Ġ= Ġencode Resource ToString ( json Parser ) ĊĠ Ġval Ġoriginal Resource Json Ġ= ĠJSONObject ( string Json ) ĊĊĠ Ġoriginal Resource Json . update From ( JSONObject ( updated Resource . encode Resource ToString ( json Parser ))) ĊĠ Ġreturn Ġjson Parser . parse Resource ( this :: class . java , Ġoriginal Resource Json . toString ()). apply Ġ{ ĊĠĠĠ Ġval Ġmeta Ġ= Ġthis . meta ĊĠĠĠ Ġval Ġmeta Update Form Ġ= Ġthis @ update From . meta ĊĠĠĠ Ġif Ġ(( meta Ġ== Ġnull Ġ|| Ġmeta . isEmpty )) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( meta Update Form Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . meta Ġ= Ġmeta Update Form ĊĠĠĠĠĠĠĠ Ġthis . meta . tag Ġ= Ġmeta Update Form . tag ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġval Ġset Of Tags Ġ= Ġmutable Set Of < Coding >() ĊĠĠĠĠĠ Ġset Of Tags . addAll ( meta . tag ) ĊĠĠĠĠĠ Ġset Of Tags . addAll ( meta Update Form . tag ) ĊĠĠĠĠĠ Ġthis . meta . tag Ġ= Ġset Of Tags . distinct By Ġ{ Ġit . code Ġ+ Ġit . system Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( this Ġis ĠPatient Ġ&& Ġthis @ update From Ġis ĠPatient Ġ&& Ġupdated Resource Ġis ĠPatient ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( extension . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( extension Update Form . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġthis . extension Ġ= Ġextension Update Form ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġset Of Extension Ġ= Ġmutable Set Of < Extension >() ĊĠĠĠĠĠĠĠ Ġset Of Extension . addAll ( extension ) ĊĠĠĠĠĠĠĠ Ġset Of Extension . addAll ( extension Update Form ) ĊĠĠĠĠĠĠĠ Ġthis . extension Ġ= Ġset Of Extension . distinct () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ @ Throws ( JSONException :: class ) Ċ fun ĠJSONObject . update From ( updated : ĠJSONObject ) Ġ{ ĊĠ Ġval Ġkeys Ġ= ĊĠĠĠ Ġmutable ListOf < String >(). apply Ġ{ ĊĠĠĠĠĠ Ġkeys (). forEach Ġ{ Ġadd ( it ) Ġ} ĊĠĠĠĠĠ Ġupdated . keys (). forEach Ġ{ Ġadd ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠ Ġkeys . forEach Ġ{ Ġkey Ġ-> Ġupdated . opt ( key )?. run Ġ{ Ġput ( key , Ġthis ) Ġ} Ġ} Ċ } Ċ Ċ fun ĠQuestion naire Response . generate Missing Items ( question naire : ĠQuestion naire ) Ġ= ĊĠ Ġquestion naire . item . generate Missing Items ( this . item ) Ċ Ċ fun ĠList < Questionnaire . Questionnaire Item Component >. generate Missing Items ( ĊĠ Ġqr Items : ĠMutable List < Questionnaire Response . Questionnaire Response Item Component > Ċ ) Ġ{ ĊĠ Ġthis . forEach Indexed Ġ{ Ġindex , Ġq Item Ġ-> ĊĠĠĠ Ġ// Ġgenerate Ġcomplete Ġhierarchy Ġif Ġresponse Ġitem Ġmissing Ġotherwise Ġcheck Ġfor Ġnested Ġitems ĊĠĠĠ Ġif Ġ( qr Items . isEmpty () Ġ|| Ġq Item . link Id Ġ!= Ġqr Items [ index ]. link Id ) Ġ{ ĊĠĠĠĠĠ Ġqr Items . add ( index , Ġq Item . create Questionnaire Response Item ()) ĊĠĠĠ Ġ} Ġelse Ġq Item . item . generate Missing Items ( qr Items [ index ]. item ) ĊĠ Ġ} Ċ } Ċ /** Ċ Ġ* ĠSet Ġall Ġquestions Ġthat Ġare Ġnot Ġof Ġtype Ġ[ Questionnaire . Questionnaire ItemType . GROUP ] Ġto ĠreadOnly Ġif Ċ Ġ* Ġ[ readOnly ] Ġis Ġtrue . ĠThis Ġalso Ġgenerates Ġthe Ġcorrect ĠFHIR Path Ġpopulation Ġexpression Ġfor Ġeach Ċ Ġ* Ġquestion Ġwhen Ġmapped Ġto Ġthe Ġcorresponding Ġ[ Questionnaire Response ] Ċ Ġ*/ Ċ fun ĠList < Questionnaire . Questionnaire Item Component >. prepare Questions For Reading Or Editing ( ĊĠ Ġpath : ĠString , ĊĠ ĠreadOnly : ĠBoolean Ġ= Ġfalse , Ċ ) Ġ{ ĊĠ ĠforEach Ġ{ Ġitem Ġ-> ĊĠĠĠ Ġif Ġ( item . type Ġ!= ĠQuestion naire . Questionnaire ItemType . GROUP ) Ġ{ ĊĠĠĠĠĠ Ġitem . readOnly Ġ= ĠreadOnly ĊĠĠĠĠĠ Ġitem . item . prepare Questions For Reading Or Editing ( ĊĠĠĠĠĠĠĠ Ġ"$ path . where ( link Id Ġ= Ġ'${ item . link Id } '). answer . item ", ĊĠĠĠĠĠĠĠ ĠreadOnly ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġitem . item . prepare Questions For Reading Or Editing ( ĊĠĠĠĠĠĠĠ Ġ"$ path . where ( link Id Ġ= Ġ'${ item . link Id } '). item ", ĊĠĠĠĠĠĠĠ ĠreadOnly ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ /** ĠDelete Ġresources Ġin Ġ[ Questionnaire Response . contained ] Ġfrom Ġthe Ġdatabase Ġ*/ Ċ suspend Ġfun ĠQuestion naire Response . delete Related Resources ( default Repository : ĠDefault Repository ) Ġ{ ĊĠ Ġcontained . forEach Ġ{ Ġdefault Repository . delete ( it ) Ġ} Ċ } Ċ Ċ fun ĠQuestion naire Response . retain Metadata ( question naire Response : ĠQuestion naire Response ) Ġ{ ĊĠ Ġauthor Ġ= Ġquestion naire Response . author ĊĠ Ġauth ored Ġ= Ġquestion naire Response . auth ored ĊĠ Ġid Ġ= Ġquestion naire Response . logical Id ĊĊĠ Ġval Ġversion Id Ġ= ĠInteger . parseInt ( question naire Response . meta . version Id Ġ?: Ġ" 1 ") Ġ+ Ġ 1 ĊĊĠ Ġquestion naire Response . meta . apply Ġ{ ĊĠĠĠ Ġlast Updated Ġ= ĠDate () ĊĠĠĠ Ġset Version Id ( version Id . toString ()) ĊĠ Ġ} Ċ } Ċ Ċ fun ĠQuestion naire Response . assert Subject () Ġ{ ĊĠ Ġif Ġ(! this . has Subject () Ġ|| Ġ! this . subject . has Reference ()) ĊĠĠĠ Ġthrow ĠIllegalStateException (" Questionnaire Response Ġmust Ġhave Ġa Ġsubject Ġreference Ġassigned ") Ċ } Ċ Ċ fun ĠQuestion naire Response . get Encounter Id (): ĠString ? Ġ{ ĊĠ Ġreturn Ġthis . contained ĊĠĠĠ Ġ? . find Ġ{ Ġit . resourceType Ġ== ĠResource Type . Encounter Ġ} ĊĠĠĠ Ġ? . logical Id ĊĠĠĠ Ġ? . replace ("# ", Ġ"") Ċ } Ċ Ċ fun ĠResource . generate Missing Id () Ġ{ ĊĠ Ġif Ġ( logical Id . isBlank ()) Ġid Ġ= ĠUUID . randomUUID (). toString () Ċ } Ċ Ċ fun ĠResource . update Last Updated () Ġ{ ĊĠ Ġmeta . last Updated Ġ= ĠDate () Ċ } Ċ Ċ fun ĠResource . is Patient ( patient Id : ĠString ) Ġ= ĊĠ Ġthis . resourceType Ġ== ĠResource Type . Patient Ġ&& Ġthis . logical Id Ġ== Ġpatient Id Ċ Ċ fun ĠResource . as Reference (): ĠReference Ġ{ ĊĠ Ġval Ġreference Value Ġ= Ġ"${ fhir Type () }/ $ logical Id " ĊĊĠ Ġreturn ĠReference (). apply Ġ{ Ġthis . reference Ġ= Ġreference Value Ġ} Ċ } Ċ Ċ fun ĠResource . reference Value (): ĠString Ġ= Ġ"${ fhir Type () }/ $ logical Id " Ċ Ċ fun ĠResource . reference Param For Condition (): ĠReference Client Param Ġ= ĊĠ Ġwhen Ġ( resourceType ) Ġ{ ĊĠĠĠ ĠResource Type . Patient Ġ-> ĠCondition . PAT IENT ĊĠĠĠ ĠResource Type . Encounter Ġ-> ĠCondition . EN COUNTER ĊĠĠĠ Ġelse Ġ-> ĊĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Do Ġnot Ġknow Ġhow Ġto Ġuse Ġ$ resourceType Ġfor ĠCondition Ġresource ") ĊĠ Ġ} Ċ Ċ fun ĠResource . reference Param For Observation (): ĠReference Client Param Ġ= ĊĠ Ġwhen Ġ( resourceType ) Ġ{ ĊĠĠĠ ĠResource Type . Patient Ġ-> ĠOb servation . PAT IENT ĊĠĠĠ ĠResource Type . Encounter Ġ-> ĠOb servation . EN COUNTER ĊĠĠĠ ĠResource Type . Questionnaire Response Ġ-> ĠOb servation . FOCUS ĊĠĠĠ Ġelse Ġ-> ĊĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Do Ġnot Ġknow Ġhow Ġto Ġuse Ġ$ resourceType Ġfor ĠOb servation Ġresource ") ĊĠ Ġ} Ċ Ċ fun ĠResource . setProperty S af ely ( name : ĠString , Ġvalue : ĠBase ) Ġ= ĊĠ Ġkotlin . run Catch ing Ġ{ Ġthis . setProperty ( name , Ġvalue ) Ġ}. on Failure Ġ{ ĠTim ber . w ( it ) Ġ}. get OrNull () Ċ Ċ fun Ġgenerate UniqueId () Ġ= ĠUUID . randomUUID (). toString () Ċ