HMPDJ ;SLC/MKB,ASMR/RRB,CK -- Serve VistA data as JSON via RPC;Aug 29, 2016 20:06:27
;;2.0;ENTERPRISE HEALTH MANAGEMENT PLATFORM;**1,2,3**;May 15, 2016;Build 15
;Per VA Directive 6402, this routine should not be modified.
;
; External References DBIA#
; ------------------- -----
; ^DPT 10035
; MPIF001 2701
; XLFDT 10103
; XLFSTR 10104
; XUPARAM 2541
;
; DE2818/RRB - SQA findings 1st 3 lines of code.
;
Q
;
GET(HMP,FILTER) ; -- Return search results as JSON in @HMP@(n)
; RPC = HMP GET PATIENT DATA JSON
; where FILTER("patientId") = DFN or DFN;ICN
; FILTER("domain") = name of desired data type (see HMPDJ0)
; FILTER("text") = boolean, to include document text [opt]
; FILTER("start") = start date.time of search [opt]
; FILTER("stop") = stop date.time of search [opt]
; FILTER("max") = maximum number of items to return [opt]
; FILTER("id") = single item id to return [opt]
; FILTER("uid") = single record uid to return [opt]
; FILTER("noHead") = flag, to omit header and commas [opt]
;
N ICN,DFN,HMPI,HMPSYS,HMPTYPE,HMPSTART,HMPSTOP,HMPMAX,HMPID,HMPTEXT,HMPP,TYPE,HMPTN,HMPERR
S HMP=$NA(^TMP("HMP",$J)),HMPI=0 K @HMP
S HMPSYS=$$SYS^HMPUTILS
S DT=$$DT^XLFDT ;for crossing midnight
;
; parse & validate input parameters
I $G(FILTER("uid"))'="" D SEPUID(.FILTER)
;
S DFN=$G(FILTER("patientId"))
;
S ICN=+$P($G(DFN),";",2),DFN=+$G(DFN)
I '(DFN>0),ICN S DFN=+$$GETDFN^MPIF001(ICN) ;DE4496
;
S HMPTYPE=$G(FILTER("domain")) S:HMPTYPE="" HMPTYPE=$$ALL
I $D(ZTQUEUED) S HMP=$NA(^XTMP(HMPBATCH,HMPFZTSK,HMPTYPE)) K @HMP
;ICR 10035 DE2818 ASF 11/2/15, DE4496 August 19, 2016
I HMPTYPE'="new",'(DFN>0)!'$D(^DPT(DFN)) D LOGDPT^HMPLOG(DFN) S HMPERR=$$ERR(1,DFN) G GTQ
;
; -- initialize chunking if from DOMPT^HMPDJFSP ; i.e. HMPCHNK defined *S68-JCH*
D CHNKINIT^HMPDJFSP(.HMP,.HMPI) ; *S68-JCH*
;
S HMPSTART=+$G(FILTER("start"),1410102)
S HMPSTOP=+$G(FILTER("stop"),4141015)
S HMPMAX=+$G(FILTER("max"),999999)
I HMPSTART,HMPSTOP,HMPSTOP<HMPSTART D
. N X S X=HMPSTART,HMPSTART=HMPSTOP,HMPSTOP=X
I HMPSTOP,$L(HMPSTOP,".")<2 S HMPSTOP=HMPSTOP_".24"
;
S HMPID=$G(FILTER("id"))
S HMPTEXT=+$G(FILTER("text"),1) ;default = true/text
;
;set error trap
K ^TMP($J,"HMP ERROR")
;
; extract data
I HMPTYPE="new",$L($T(EN^HMPDJX)),'$G(^XTMP("HMP-off","GET")) D EN^HMPDJX(HMPID,HMPMAX) Q ;data updates
F HMPP=1:1:$L(HMPTYPE,";") S TYPE=$P(HMPTYPE,";",HMPP) I $L(TYPE) D
. S HMPTN=$$TAG(TYPE)_"^HMPDJ0" Q:'$L($T(@HMPTN)) ;D ERR(2) Q
. N $ES,$ET,ERRPAT,ERRMSG
. S $ET="D ERRHDLR^HMPDERRH",ERRMSG="A problem occurred when trying to load patient data from an API."
. D @HMPTN
;
GTQ ; add item count and terminating characters
N ERROR I $D(^TMP($J,"HMP ERROR"))>0 D BUILDERR(.ERROR)
I +$G(FILTER("noHead"))=1 D Q
.S @HMP@("total")=+$G(HMPI)
.I $L($G(ERROR(1)))>1 S @HMP@("error")=ERROR(1)
S @HMP@(.5)="{""apiVersion"":""1.01"",""params"":{"_$$SYS_"},"
I $D(HMPERR) S @HMP@(1)="""error"":{""message"":"""_HMPERR_"""}}" Q
I '$D(@HMP)!'$G(HMPI) D Q
. I '$D(ERROR) S @HMP@(1)="""data"":{""totalItems"":0,""items"":[]}}" Q
. S @HMP@(1)="""data"":{""totalItems"":0,""items"":[]},"
. S @HMP@(2,1)=ERROR(1)_"}"
;
S @HMP@(.6)="""data"":{""updated"":"""_$$HL7NOW_""",""totalItems"":"_HMPI_",""items"":["
S HMPI=HMPI+1,@HMP@(HMPI)=$S($D(ERROR):"]}",1:"]}}")
I $D(ERROR)>0 S HMPI=HMPI+1,@HMP@(HMPI,.3)=",",@HMP@(HMPI,1)=ERROR(1)_"}"
K ^TMP($J,"HMP ERROR"),^TMP("HMPTEXT",$J)
Q
;
SEPUID(FILTER) ; -- separate uid into FILTER pieces
N UID
S UID=$G(FILTER("uid")) K FILTER("uid") Q:UID=""
I $P(UID,":",4)'=HMPSYS Q
S FILTER("patientId")=$P(UID,":",5)
S FILTER("domain")=$P(UID,":",3)
S FILTER("id")=$P(UID,":",6)
Q
;
SYS() ; -- return system info for JSON header
Q """domain"":"""_$$KSP^XUPARAM("WHERE")_""",""systemId"":"""_HMPSYS_""""
;
BUILDERR(RESULT,DFN) ; -- build error array
N COUNT,MESSAGE,MSGCNT
S COUNT=$G(^TMP($J,"HMP ERROR","# of Errors"))
S MESSAGE="A mumps error occurred when extracting patient data. A total of "_COUNT_" occurred.\n\r"
S MSGCNT=0 F S MSGCNT=$O(^TMP($J,"HMP ERROR","ERROR MESSAGE",MSGCNT)) Q:MSGCNT'>0 D
. S MESSAGE=MESSAGE_$G(^TMP($J,"HMP ERROR","ERROR MESSAGE",MSGCNT))_"\n\r"
S RESULT(1)="""error"":{""message"":"""_MESSAGE_"""}"
Q
;
TAG(X) ; -- Return linetag in HMPDJ0 routine for clinical domain X
N Y S X=$G(X,"Z")
S Y=$E($$UP^XLFSTR(X),1,8)
S:'$L($T(@(Y_"^HMPDJ0"))) Y="HMP"
Q Y
;
ALL() ; -- return string for all types of data
Q "patient;problem;allergy;consult;vital;lab;procedure;obs;order;treatment;med;ptf;factor;immunization;exam;cpt;education;pov;skin;image;appointment;surgery;document;visit;mh"
;
ERR(X,VAL) ; -- return error message
N MSG S MSG="Error"
I X=1 S MSG="Patient with dfn '"_$G(VAL)_"' not found"
I X=2 S MSG="Domain type '"_$G(VAL)_"' not recognized"
I X=3 S MSG="UID '"_$G(VAL)_"' not found"
I X=4 S MSG="Unable to create new object"
I X=99 S MSG="Unknown request"
Q MSG
;
HL7NOW() ; -- Return current time in HL7 format
Q $$FMTHL7^HMPSTMP($$NOW^XLFDT) ; DE5016
;
ADD(ITEM,COLL) ; -- add ITEM to results
I $D(HMPCRC),$D(COLL) D ONE^HMPDCRC(ITEM,COLL) Q ;checksum
; -- add ITEM to @HMP@(HMPI) to return JSON
N HMPY,HMPERR
D ENCODE^HMPJSON(ITEM,"HMPY","HMPERR")
I $D(HMPERR) D ;return ERRor instead of ITEM
. N HMPTMP,HMPTXT,HMPITM
. M HMPITM=@ITEM K HMPY
. S HMPTXT(1)="Problem encoding json output."
. D SETERROR^HMPUTILS(.HMPTMP,.HMPERR,.HMPTXT,.HMPITM)
. K HMPERR D ENCODE^HMPJSON("HMPTMP","HMPY","HMPERR")
I $D(HMPY) D
. S HMPI=HMPI+1
. I HMPI>1 S @HMP@(HMPI,.3)=","
. M @HMP@(HMPI)=HMPY
. ;
. ; -- chunk data if from DOMPT^HMPDJFSP ; i.e. HMPCHNK defined ; *S68-JCH*
. D CHNKCHK^HMPDJFSP(.HMP,.HMPI) ; *S68-JCH*
Q
;
TEST(DFN,TYPE,ID,TEXT,IN) ; -- test GET, write results to screen
N OUT,IDX S U="^"
S:'$D(IN("systemID")) IN("systemID")=$$SYS^HMPUTILS
S IN("patientId")=+$G(DFN)
S IN("domain")=$G(TYPE)
S:$D(ID) IN("id")=ID
S:$D(TEXT) IN("text")=TEXT
D GET(.OUT,.IN)
;
S IDX=OUT
F S IDX=$Q(@IDX) Q:IDX'?1"^TMP(""HMP"","1.N.E Q:+$P(IDX,",",2)'=$J W !,@IDX
Q
;
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HHMPDJ 6469 printed Oct 16, 2024@17:53:53 Page 2
HMPDJ ;SLC/MKB,ASMR/RRB,CK -- Serve VistA data as JSON via RPC;Aug 29, 2016 20:06:27
+1 ;;2.0;ENTERPRISE HEALTH MANAGEMENT PLATFORM;**1,2,3**;May 15, 2016;Build 15
+2 ;Per VA Directive 6402, this routine should not be modified.
+3 ;
+4 ; External References DBIA#
+5 ; ------------------- -----
+6 ; ^DPT 10035
+7 ; MPIF001 2701
+8 ; XLFDT 10103
+9 ; XLFSTR 10104
+10 ; XUPARAM 2541
+11 ;
+12 ; DE2818/RRB - SQA findings 1st 3 lines of code.
+13 ;
+14 QUIT
+15 ;
GET(HMP,FILTER) ; -- Return search results as JSON in @HMP@(n)
+1 ; RPC = HMP GET PATIENT DATA JSON
+2 ; where FILTER("patientId") = DFN or DFN;ICN
+3 ; FILTER("domain") = name of desired data type (see HMPDJ0)
+4 ; FILTER("text") = boolean, to include document text [opt]
+5 ; FILTER("start") = start date.time of search [opt]
+6 ; FILTER("stop") = stop date.time of search [opt]
+7 ; FILTER("max") = maximum number of items to return [opt]
+8 ; FILTER("id") = single item id to return [opt]
+9 ; FILTER("uid") = single record uid to return [opt]
+10 ; FILTER("noHead") = flag, to omit header and commas [opt]
+11 ;
+12 NEW ICN,DFN,HMPI,HMPSYS,HMPTYPE,HMPSTART,HMPSTOP,HMPMAX,HMPID,HMPTEXT,HMPP,TYPE,HMPTN,HMPERR
+13 SET HMP=$NAME(^TMP("HMP",$JOB))
SET HMPI=0
KILL @HMP
+14 SET HMPSYS=$$SYS^HMPUTILS
+15 ;for crossing midnight
SET DT=$$DT^XLFDT
+16 ;
+17 ; parse & validate input parameters
+18 IF $GET(FILTER("uid"))'=""
DO SEPUID(.FILTER)
+19 ;
+20 SET DFN=$GET(FILTER("patientId"))
+21 ;
+22 SET ICN=+$PIECE($GET(DFN),";",2)
SET DFN=+$GET(DFN)
+23 ;DE4496
IF '(DFN>0)
IF ICN
SET DFN=+$$GETDFN^MPIF001(ICN)
+24 ;
+25 SET HMPTYPE=$GET(FILTER("domain"))
if HMPTYPE=""
SET HMPTYPE=$$ALL
+26 IF $DATA(ZTQUEUED)
SET HMP=$NAME(^XTMP(HMPBATCH,HMPFZTSK,HMPTYPE))
KILL @HMP
+27 ;ICR 10035 DE2818 ASF 11/2/15, DE4496 August 19, 2016
+28 IF HMPTYPE'="new"
IF '(DFN>0)!'$DATA(^DPT(DFN))
DO LOGDPT^HMPLOG(DFN)
SET HMPERR=$$ERR(1,DFN)
GOTO GTQ
+29 ;
+30 ; -- initialize chunking if from DOMPT^HMPDJFSP ; i.e. HMPCHNK defined *S68-JCH*
+31 ; *S68-JCH*
DO CHNKINIT^HMPDJFSP(.HMP,.HMPI)
+32 ;
+33 SET HMPSTART=+$GET(FILTER("start"),1410102)
+34 SET HMPSTOP=+$GET(FILTER("stop"),4141015)
+35 SET HMPMAX=+$GET(FILTER("max"),999999)
+36 IF HMPSTART
IF HMPSTOP
IF HMPSTOP<HMPSTART
Begin DoDot:1
+37 NEW X
SET X=HMPSTART
SET HMPSTART=HMPSTOP
SET HMPSTOP=X
End DoDot:1
+38 IF HMPSTOP
IF $LENGTH(HMPSTOP,".")<2
SET HMPSTOP=HMPSTOP_".24"
+39 ;
+40 SET HMPID=$GET(FILTER("id"))
+41 ;default = true/text
SET HMPTEXT=+$GET(FILTER("text"),1)
+42 ;
+43 ;set error trap
+44 KILL ^TMP($JOB,"HMP ERROR")
+45 ;
+46 ; extract data
+47 ;data updates
IF HMPTYPE="new"
IF $LENGTH($TEXT(EN^HMPDJX))
IF '$GET(^XTMP("HMP-off","GET"))
DO EN^HMPDJX(HMPID,HMPMAX)
QUIT
+48 FOR HMPP=1:1:$LENGTH(HMPTYPE,";")
SET TYPE=$PIECE(HMPTYPE,";",HMPP)
IF $LENGTH(TYPE)
Begin DoDot:1
+49 ;D ERR(2) Q
SET HMPTN=$$TAG(TYPE)_"^HMPDJ0"
if '$LENGTH($TEXT(@HMPTN))
QUIT
+50 NEW $ESTACK,$ETRAP,ERRPAT,ERRMSG
+51 SET $ETRAP="D ERRHDLR^HMPDERRH"
SET ERRMSG="A problem occurred when trying to load patient data from an API."
+52 DO @HMPTN
End DoDot:1
+53 ;
GTQ ; add item count and terminating characters
+1 NEW ERROR
IF $DATA(^TMP($JOB,"HMP ERROR"))>0
DO BUILDERR(.ERROR)
+2 IF +$GET(FILTER("noHead"))=1
Begin DoDot:1
+3 SET @HMP@("total")=+$GET(HMPI)
+4 IF $LENGTH($GET(ERROR(1)))>1
SET @HMP@("error")=ERROR(1)
End DoDot:1
QUIT
+5 SET @HMP@(.5)="{""apiVersion"":""1.01"",""params"":{"_$$SYS_"},"
+6 IF $DATA(HMPERR)
SET @HMP@(1)="""error"":{""message"":"""_HMPERR_"""}}"
QUIT
+7 IF '$DATA(@HMP)!'$GET(HMPI)
Begin DoDot:1
+8 IF '$DATA(ERROR)
SET @HMP@(1)="""data"":{""totalItems"":0,""items"":[]}}"
QUIT
+9 SET @HMP@(1)="""data"":{""totalItems"":0,""items"":[]},"
+10 SET @HMP@(2,1)=ERROR(1)_"}"
End DoDot:1
QUIT
+11 ;
+12 SET @HMP@(.6)="""data"":{""updated"":"""_$$HL7NOW_""",""totalItems"":"_HMPI_",""items"":["
+13 SET HMPI=HMPI+1
SET @HMP@(HMPI)=$SELECT($DATA(ERROR):"]}",1:"]}}")
+14 IF $DATA(ERROR)>0
SET HMPI=HMPI+1
SET @HMP@(HMPI,.3)=","
SET @HMP@(HMPI,1)=ERROR(1)_"}"
+15 KILL ^TMP($JOB,"HMP ERROR"),^TMP("HMPTEXT",$JOB)
+16 QUIT
+17 ;
SEPUID(FILTER) ; -- separate uid into FILTER pieces
+1 NEW UID
+2 SET UID=$GET(FILTER("uid"))
KILL FILTER("uid")
if UID=""
QUIT
+3 IF $PIECE(UID,":",4)'=HMPSYS
QUIT
+4 SET FILTER("patientId")=$PIECE(UID,":",5)
+5 SET FILTER("domain")=$PIECE(UID,":",3)
+6 SET FILTER("id")=$PIECE(UID,":",6)
+7 QUIT
+8 ;
SYS() ; -- return system info for JSON header
+1 QUIT """domain"":"""_$$KSP^XUPARAM("WHERE")_""",""systemId"":"""_HMPSYS_""""
+2 ;
BUILDERR(RESULT,DFN) ; -- build error array
+1 NEW COUNT,MESSAGE,MSGCNT
+2 SET COUNT=$GET(^TMP($JOB,"HMP ERROR","# of Errors"))
+3 SET MESSAGE="A mumps error occurred when extracting patient data. A total of "_COUNT_" occurred.\n\r"
+4 SET MSGCNT=0
FOR
SET MSGCNT=$ORDER(^TMP($JOB,"HMP ERROR","ERROR MESSAGE",MSGCNT))
if MSGCNT'>0
QUIT
Begin DoDot:1
+5 SET MESSAGE=MESSAGE_$GET(^TMP($JOB,"HMP ERROR","ERROR MESSAGE",MSGCNT))_"\n\r"
End DoDot:1
+6 SET RESULT(1)="""error"":{""message"":"""_MESSAGE_"""}"
+7 QUIT
+8 ;
TAG(X) ; -- Return linetag in HMPDJ0 routine for clinical domain X
+1 NEW Y
SET X=$GET(X,"Z")
+2 SET Y=$EXTRACT($$UP^XLFSTR(X),1,8)
+3 if '$LENGTH($TEXT(@(Y_"^HMPDJ0")))
SET Y="HMP"
+4 QUIT Y
+5 ;
ALL() ; -- return string for all types of data
+1 QUIT "patient;problem;allergy;consult;vital;lab;procedure;obs;order;treatment;med;ptf;factor;immunization;exam;cpt;education;pov;skin;image;appointment;surgery;document;visit;mh"
+2 ;
ERR(X,VAL) ; -- return error message
+1 NEW MSG
SET MSG="Error"
+2 IF X=1
SET MSG="Patient with dfn '"_$GET(VAL)_"' not found"
+3 IF X=2
SET MSG="Domain type '"_$GET(VAL)_"' not recognized"
+4 IF X=3
SET MSG="UID '"_$GET(VAL)_"' not found"
+5 IF X=4
SET MSG="Unable to create new object"
+6 IF X=99
SET MSG="Unknown request"
+7 QUIT MSG
+8 ;
HL7NOW() ; -- Return current time in HL7 format
+1 ; DE5016
QUIT $$FMTHL7^HMPSTMP($$NOW^XLFDT)
+2 ;
ADD(ITEM,COLL) ; -- add ITEM to results
+1 ;checksum
IF $DATA(HMPCRC)
IF $DATA(COLL)
DO ONE^HMPDCRC(ITEM,COLL)
QUIT
+2 ; -- add ITEM to @HMP@(HMPI) to return JSON
+3 NEW HMPY,HMPERR
+4 DO ENCODE^HMPJSON(ITEM,"HMPY","HMPERR")
+5 ;return ERRor instead of ITEM
IF $DATA(HMPERR)
Begin DoDot:1
+6 NEW HMPTMP,HMPTXT,HMPITM
+7 MERGE HMPITM=@ITEM
KILL HMPY
+8 SET HMPTXT(1)="Problem encoding json output."
+9 DO SETERROR^HMPUTILS(.HMPTMP,.HMPERR,.HMPTXT,.HMPITM)
+10 KILL HMPERR
DO ENCODE^HMPJSON("HMPTMP","HMPY","HMPERR")
End DoDot:1
+11 IF $DATA(HMPY)
Begin DoDot:1
+12 SET HMPI=HMPI+1
+13 IF HMPI>1
SET @HMP@(HMPI,.3)=","
+14 MERGE @HMP@(HMPI)=HMPY
+15 ;
+16 ; -- chunk data if from DOMPT^HMPDJFSP ; i.e. HMPCHNK defined ; *S68-JCH*
+17 ; *S68-JCH*
DO CHNKCHK^HMPDJFSP(.HMP,.HMPI)
End DoDot:1
+18 QUIT
+19 ;
TEST(DFN,TYPE,ID,TEXT,IN) ; -- test GET, write results to screen
+1 NEW OUT,IDX
SET U="^"
+2 if '$DATA(IN("systemID"))
SET IN("systemID")=$$SYS^HMPUTILS
+3 SET IN("patientId")=+$GET(DFN)
+4 SET IN("domain")=$GET(TYPE)
+5 if $DATA(ID)
SET IN("id")=ID
+6 if $DATA(TEXT)
SET IN("text")=TEXT
+7 DO GET(.OUT,.IN)
+8 ;
+9 SET IDX=OUT
+10 FOR
SET IDX=$QUERY(@IDX)
if IDX'?1"^TMP(""HMP"","1.N.E
QUIT
if +$PIECE(IDX,",",2)'=$JOB
QUIT
WRITE !,@IDX
+11 QUIT
+12 ;