PSSHDPG1 ;BIRM/KML - APIs SUPPORTING REQUEST AND RETRIEVAL OF PGx DATA FROM HDR ;9/28/23
;;1.0;PHARMACY DATA MANAGEMENT;**262**;9/30/97;Build 66
;
; Reference to $$GETREST^XOBWLIB supported by DBIA# 5421
; Reference to $$GET^XOBWLIB supported by DBIA# 5421
;
GETPGXRESULTS(PSSDFN,PSSGENES) ; get PGx (genetic test interpretation results from HDR)
; INPUT - PSSDFN = IEN of PATIENT file (#2) (the DFN)
; OUTPUT - PSSGENES = local array of drug, phenotype, genotype, activity score returned from the HDR
; Passed in by reference
; RETURN = 1^SUCCESSFUL
; -1^_errorMessage
;
N PSSICN,PSSREQST,PSSINPUTVALUES,PSSXMLJSON,OUTCOME,PSSERR,PSSRESTOBJ,PSSDTTM,RETURN
K PSSGENES
K ^TMP($J,"PSSHDPG1")
S (RETURN,OUTCOME)=0
S PSSICN=$$GETICN(PSSDFN)
I +PSSICN<0 S RETURN=PSSICN G GETPGXEXIT
S PSSDTTM=$$BLDDATETM($$NOW^XLFDT)
D BLDREQSTRING(PSSICN,.PSSREQST,PSSDTTM)
S OUTCOME=$$SENDREQUEST(.PSSRESTOBJ,.PSSREQST,.PSSERR)
I +OUTCOME<0!($G(PSSERR)) S RETURN="-1^"_OUTCOME G GETPGXEXIT
S RETURN="1^Successful"
D PARSE(PSSRESTOBJ.HttpResponse.Data)
D SETARRAY(.PSSGENES)
GETPGXEXIT ;
K ^TMP($J,"PSSHDPG1")
Q RETURN
;
GETICN(X) ;GET ICN
; INPUT = X (DFN)
; OUTPUT = X1 (ICN associated with patient DFN)
N X1
I +X=0 S X1="-1^INVALID DFN" G GETICNX
S X1=$$GETICN^MPIF001(X)
GETICNX ;
Q X1
;
BLDDATETM(PSSFMDT) ; format Fileman date/time to CCYY-MM-DD_"T"_HH:MM:SS_"Z"
; format Fileman date/time to CCYY-MM-DD_"T"_HH:MM:SS_"Z"
N PSSDTM,PSSDTM,PSSTIME,PSSGMT,OFFSET,HH,MM
I '$D(PSSFMDT)!('$G(PSSFMDT)) S PSSFMDT=$$NOW^XLFDT
S PSSDTM=$$FMTHL7^XLFDT(PSSFMDT)
I PSSDTM<0 S PSSDTM="00000000"
S PSSGMT=$E(PSSDTM,1,4)_"-"_$E(PSSDTM,5,6)_"-"_$E(PSSDTM,7,8)
;extract and convert fm time to ISO 8601 external format
S PSSTIME=$E(+PSSDTM,9,99)
S PSSTIME=$$REMOVEOFFSET^PSSHDPG1(PSSTIME)
I PSSTIME']"" S PSSTIME="000000" ; MED_ORDER_CHECK request needs to have TIME along with DATE
I $L(PSSTIME)<6 D ; MED_ORDER_CHECK request requires seconds in TIME
. I $E(PSSTIME,4)']"" S PSSTIME=$E(PSSTIME,1,3)_"000" Q
. I $E(PSSTIME,5)']"" S PSSTIME=$E(PSSTIME,1,4)_"00" Q
. I $E(PSSTIME,6)']"" S PSSTIME=$E(PSSTIME,1,5)_0
;append hour:min:sec
S PSSGMT=PSSGMT_"T"_$E(PSSTIME,1,2)_":"_$E(PSSTIME,3,4)_":"_$E(PSSTIME,5,6)
Q PSSGMT_"Z"
;
BLDREQSTRING(ICN,PSSX,PSSDTM) ;
;format request XML
;Input - ICN = Integration Control Number associated with patient
; PSSX = passed in by reference; name of variable to hold the request string
; PSSDTM - date/time passed in ccyy-mm-ddThh:mm:ssZ format
; Output - PSSX = request string in XML format to be sent to HDR for patient genomic results
K PSSX
S PSSX="/readClinicalData1?&templateId=MedOrderCheckRead&filterRequest=<?xml version=""1.0"" encoding=""UTF-8""?>"
S PSSX=PSSX_"<filter:filter xmlns:filter=""Filter"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" vhimVersion=""Vhim_4_00"">"
S PSSX=PSSX_"<filterId>MOCHA_READ_FILTER</filterId><clientName>HDR-14142</clientName><payloadType>xml</payloadType><clientRequestInitiationTime>"_PSSDTM_"</clientRequestInitiationTime>"
S PSSX=PSSX_"<patients><NationalId>"_ICN_"</NationalId></patients><entryPointFilter queryName=""ID1""><domainEntryPoint>Pharmacogenetic</domainEntryPoint><queryTimeoutSeconds>10000</queryTimeoutSeconds>"
S PSSX=PSSX_" </entryPointFilter> </filter:filter>&filterId=MOCHA_READ_FILTER&requestId="_$P($$SITE^VASITE,U,3)_"MOCHA PGx"_$$NOW^XLFDT_";"_$H
Q
;
SENDREQUEST(PSSROBJ,PSSX,PSSERR) ; post MED_ORDER_CHECK request to HDR web service to return patient genetic test results
; Input - PSSROBJ = rest service request object (passed in by reference)
; PSSX = request string to HDR
; Output - PSSRET = returned (XML) string as a result of HDR processing of the request
; - PSSERR = error object (passed in by reference)
N $ETRAP,PSSRET
; Set error trap
S $ETRAP="DO ERROR^PSSHDPG1"
S PSSROBJ=$$GETREST^XOBWLIB("PSS PGX-HDR SERVICE","PSS PGX-HDR SERVER") ;Return REST Service Request Object using the HWSC supported API.
I $D(^TMP($J,"PSSHDPG1","EXCEPTION"))>0 S PSSRET="-1^"_^TMP($J,"PSSHDPG1","EXCEPTION") G SENDREQUESTX
S PSSRET=$$GET^XOBWLIB(PSSROBJ,PSSX,.PSSERR,1) ;Make HTTP GET Call and Force Error if Problem Encountered
I $D(^TMP($J,"PSSHDPG1","EXCEPTION"))>0 S PSSRET="-1^"_^TMP($J,"PSSHDPG1","EXCEPTION")
SENDREQUESTX ;
Q PSSRET
;
SETARRAY(PSSGENES) ; ;move from temp global into LOCAL array
;PSSGENES - Patient lab result from HDR
; PSSGENES(GENE,CNT,"ACTIVITY_SCORE")
; PSSGENES(GENE,CNT,"GENOTYPE")
; PSSGENES(GENE,CNT,"NPP_SharePointURL")
; PSSGENES(GENE,CNT,"PHENOTYPE")
; PSSGENES(GENE,CNT,"RESULT_DATE")
;PSSXZY - format uses to check for GENE and PHENOTYPE FDB maaping
; PSSXYZ(CNT,LABEL) where labels are "GENE", "ACTIVITY_SCORE", GENOTYPE, PHENOTYPE, RESULT_DATA, NPP_SharePointURL,FULL_ICN, PSSXSID.
N INDX,PSSGENE,PSSPHEN,PSSFDBG,PSSFDBP,PSSCNT,PSSXZY,PSSGMAP,PSSPMAP,PSSFDBG,PSSFDBP,PSSMAP
S INDX=-1,PSSCNT=0
F S INDX=$O(^TMP($J,"PSSHDPG1","ClinicalData",0,"patient",0,"medOrderCheckRead",0,"pgxDatas",0,"pgxData",INDX)) Q:INDX']"" D
. S PSSCNT=PSSCNT+1
. S PSSXZY(PSSCNT,"GENE")=$G(^TMP($J,"PSSHDPG1","ClinicalData",0,"patient",0,"medOrderCheckRead",0,"pgxDatas",0,"pgxData",INDX,"gene",0))
. S PSSXZY(PSSCNT,"ACTIVITY_SCORE")=$G(^TMP($J,"PSSHDPG1","ClinicalData",0,"patient",0,"medOrderCheckRead",0,"pgxDatas",0,"pgxData",INDX,"vinciActivityScore",0))
. S PSSXZY(PSSCNT,"GENOTYPE")=$G(^TMP($J,"PSSHDPG1","ClinicalData",0,"patient",0,"medOrderCheckRead",0,"pgxDatas",0,"pgxData",INDX,"vinciGenotype",0))
. S PSSXZY(PSSCNT,"PHENOTYPE")=$G(^TMP($J,"PSSHDPG1","ClinicalData",0,"patient",0,"medOrderCheckRead",0,"pgxDatas",0,"pgxData",INDX,"vinciPhenotype",0))
. S PSSXZY(PSSCNT,"RESULT_DATE")=$G(^TMP($J,"PSSHDPG1","ClinicalData",0,"patient",0,"medOrderCheckRead",0,"pgxDatas",0,"pgxData",INDX,"resultDate",0))
. S PSSXZY(PSSCNT,"NPP_SharePointURL")=$P($G(^TMP($J,"PSSHDPG1","ClinicalData",0,"patient",0,"medOrderCheckRead",0,"nppSharepointURL",0,"url",0)),"? ",2)
. S PSSXZY(PSSCNT,"FULL_ICN")=$G(^TMP($J,"PSSHDPG1","ClinicalData",0,"patient",0,"medOrderCheckRead",0,"pgxDatas",0,"pgxData",INDX,"patientFullICN",0))
. S PSSXZY(PSSCNT,"PGXSID")=$G(^TMP($J,"PSSHDPG1","ClinicalData",0,"patient",0,"medOrderCheckRead",0,"pgxDatas",0,"pgxData",INDX,"pgxSID",0))
K PSSPERR
I '$G(PSSOPTFG) D DATA^PSSPGXUT(.PSSXZY,.PSSMAP)
F PSSCNT=0:0 S PSSCNT=$O(PSSXZY(PSSCNT)) Q:'PSSCNT D
. S PSSGMAP=$G(PSSMAP(PSSCNT,"GENE")),PSSFDBG=$P(PSSGMAP,U,2)
. S PSSPMAP=$G(PSSMAP(PSSCNT,"PHENOTYPE")),PSSFDBP=$P(PSSPMAP,U,2) I +$P(PSSPMAP,U,3),PSSFDBG'="" S PSSPERR(PSSFDBG)=PSSFDBP
. Q:PSSFDBG="NULL"
. S PSSGENES(PSSFDBG,PSSCNT,"ACTIVITY_SCORE")=PSSXZY(PSSCNT,"ACTIVITY_SCORE")
. S PSSGENES(PSSFDBG,PSSCNT,"GENOTYPE")=PSSXZY(PSSCNT,"GENOTYPE")
. S PSSGENES(PSSFDBG,PSSCNT,"PHENOTYPE")=$S($D(PSSMAP(PSSCNT,"NOFDB")):"",PSSFDBP'="NULL":PSSFDBP,1:"")
. S PSSGENES(PSSFDBG,PSSCNT,"RESULT_DATE")=PSSXZY(PSSCNT,"RESULT_DATE")
. S PSSGENES(PSSFDBG,PSSCNT,"NPP_SharePointURL")=PSSXZY(PSSCNT,"NPP_SharePointURL")
Q
;
PARSE(STREAM) ;parse out xml into temp global (copied from PARSE^ORRDI1)
N %XML,GL,BREAK,X
S GL=$NA(^TMP($J,"PSSHDPG1"))
K @GL
N STATUS,READER,XOBERR,S
S STATUS=##class(%XML.TextReader).ParseStream(STREAM,.READER,,,,,1)
I $$STATCHK^XOBWLIB(STATUS,.XOBERR,1) D
.S BREAK=0 F Q:BREAK!READER.EOF!'READER.Read() D
..I READER.NodeType="element" D SPUSH(.S,READER.LocalName)
..I READER.NodeType="endelement" D SPOP(.S,.X)
..I READER.NodeType="chars" D SPUT(.S,READER.Value)
Q
;
SPUSH(S,X) ;places X on the stack S and returns the current level of the stack (copied from PARSE^ORRDI1)
N I S I=$O(S(""),-1)+1,S(I)=X
Q I
;
SPOP(S,X) ;removes the top item from the stack S and put it into the variable X and returns the level that X was at (copied from PARSE^ORRDI1)
N I S I=$O(S(""),-1)
I I S X=S(I) K S(I)
N J S J=$O(S(I),-1) I J S S(J,X)=$G(S(J,X))+1
Q I
;
SPEEK(S,X) ;same as SPOP except the top item is not removed (copied from PARSE^ORRDI1)
N I S I=$O(S(""),-1)
I I S X=S(I)
Q I
;
SPUT(S,X) ;implementation specific, uses the stack to form a global node (copied from PARSE^ORRDI1)
N I,STR
S STR=$P(GL,")")
S I=0 F S I=$O(S(I)) Q:'I D
.S STR=STR_","_""""_S(I)_""""_","
.N NUM S NUM=0
.I $D(S(I-1,S(I))) S NUM=+$G(S(I-1,S(I)))
.S STR=STR_NUM
S STR=STR_")"
I $D(@STR) S @STR=@STR_X
I '$D(@STR) S @STR=X
Q STR
;
REMOVEOFFSET(TIME) ;
S TIME=$P(TIME,"-")
S TIME=$P(TIME,"+")
S TIME=$P(TIME,"Z")
Q TIME
;
ERROR ;
; @DESC Handles error during request to HDR via webservice.
;
; Depends on GLOBAL variable PSSERR to be set in previous call.
;
; @RETURNS Nothing. Value store in global.
;
N ERRARRAY
;
; Get error object from Error Object Factory
I $G(PSSERR)="" S PSSERR=$$EOFAC^XOBWLIB()
; Store the error object in the error array
D ERR2ARR^XOBWLIB(PSSERR,.ERRARRAY)
;
; Parse out the error text and store in global
S ^TMP($J,"PSSHDPG1","EXCEPTION")=$$GETTEXT(.ERRARRAY)
; Set ecode to empty to return to calling function
SET $ECODE=""
;
Q
;
GETTEXT(ERRARRAY) ;
; @DESC Gets the error text from the array
;
; @ERRARRAY Error array stores error in format defined by web service product.
;
; @RETURNS Error info as a single string
;
N PSS
;
; Loop through the text subscript of error array and concatenate
S PSS("errorText")=""
S PSS("I")=""
F S PSS("I")=$O(ERRARRAY("text",PSS("I"))) Q:PSS("I")="" D
. S PSS("errorText")=PSS("errorText")_ERRARRAY("text",PSS("I"))
;
Q PSS("errorText")
;;
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HPSSHDPG1 9790 printed Mar 25, 2026@15:55:56 Page 2
PSSHDPG1 ;BIRM/KML - APIs SUPPORTING REQUEST AND RETRIEVAL OF PGx DATA FROM HDR ;9/28/23
+1 ;;1.0;PHARMACY DATA MANAGEMENT;**262**;9/30/97;Build 66
+2 ;
+3 ; Reference to $$GETREST^XOBWLIB supported by DBIA# 5421
+4 ; Reference to $$GET^XOBWLIB supported by DBIA# 5421
+5 ;
GETPGXRESULTS(PSSDFN,PSSGENES) ; get PGx (genetic test interpretation results from HDR)
+1 ; INPUT - PSSDFN = IEN of PATIENT file (#2) (the DFN)
+2 ; OUTPUT - PSSGENES = local array of drug, phenotype, genotype, activity score returned from the HDR
+3 ; Passed in by reference
+4 ; RETURN = 1^SUCCESSFUL
+5 ; -1^_errorMessage
+6 ;
+7 NEW PSSICN,PSSREQST,PSSINPUTVALUES,PSSXMLJSON,OUTCOME,PSSERR,PSSRESTOBJ,PSSDTTM,RETURN
+8 KILL PSSGENES
+9 KILL ^TMP($JOB,"PSSHDPG1")
+10 SET (RETURN,OUTCOME)=0
+11 SET PSSICN=$$GETICN(PSSDFN)
+12 IF +PSSICN<0
SET RETURN=PSSICN
GOTO GETPGXEXIT
+13 SET PSSDTTM=$$BLDDATETM($$NOW^XLFDT)
+14 DO BLDREQSTRING(PSSICN,.PSSREQST,PSSDTTM)
+15 SET OUTCOME=$$SENDREQUEST(.PSSRESTOBJ,.PSSREQST,.PSSERR)
+16 IF +OUTCOME<0!($GET(PSSERR))
SET RETURN="-1^"_OUTCOME
GOTO GETPGXEXIT
+17 SET RETURN="1^Successful"
+18 DO PARSE(PSSRESTOBJ.HttpResponse.Data)
+19 DO SETARRAY(.PSSGENES)
GETPGXEXIT ;
+1 KILL ^TMP($JOB,"PSSHDPG1")
+2 QUIT RETURN
+3 ;
GETICN(X) ;GET ICN
+1 ; INPUT = X (DFN)
+2 ; OUTPUT = X1 (ICN associated with patient DFN)
+3 NEW X1
+4 IF +X=0
SET X1="-1^INVALID DFN"
GOTO GETICNX
+5 SET X1=$$GETICN^MPIF001(X)
GETICNX ;
+1 QUIT X1
+2 ;
BLDDATETM(PSSFMDT) ; format Fileman date/time to CCYY-MM-DD_"T"_HH:MM:SS_"Z"
+1 ; format Fileman date/time to CCYY-MM-DD_"T"_HH:MM:SS_"Z"
+2 NEW PSSDTM,PSSDTM,PSSTIME,PSSGMT,OFFSET,HH,MM
+3 IF '$DATA(PSSFMDT)!('$GET(PSSFMDT))
SET PSSFMDT=$$NOW^XLFDT
+4 SET PSSDTM=$$FMTHL7^XLFDT(PSSFMDT)
+5 IF PSSDTM<0
SET PSSDTM="00000000"
+6 SET PSSGMT=$EXTRACT(PSSDTM,1,4)_"-"_$EXTRACT(PSSDTM,5,6)_"-"_$EXTRACT(PSSDTM,7,8)
+7 ;extract and convert fm time to ISO 8601 external format
+8 SET PSSTIME=$EXTRACT(+PSSDTM,9,99)
+9 SET PSSTIME=$$REMOVEOFFSET^PSSHDPG1(PSSTIME)
+10 ; MED_ORDER_CHECK request needs to have TIME along with DATE
IF PSSTIME']""
SET PSSTIME="000000"
+11 ; MED_ORDER_CHECK request requires seconds in TIME
IF $LENGTH(PSSTIME)<6
Begin DoDot:1
+12 IF $EXTRACT(PSSTIME,4)']""
SET PSSTIME=$EXTRACT(PSSTIME,1,3)_"000"
QUIT
+13 IF $EXTRACT(PSSTIME,5)']""
SET PSSTIME=$EXTRACT(PSSTIME,1,4)_"00"
QUIT
+14 IF $EXTRACT(PSSTIME,6)']""
SET PSSTIME=$EXTRACT(PSSTIME,1,5)_0
End DoDot:1
+15 ;append hour:min:sec
+16 SET PSSGMT=PSSGMT_"T"_$EXTRACT(PSSTIME,1,2)_":"_$EXTRACT(PSSTIME,3,4)_":"_$EXTRACT(PSSTIME,5,6)
+17 QUIT PSSGMT_"Z"
+18 ;
BLDREQSTRING(ICN,PSSX,PSSDTM) ;
+1 ;format request XML
+2 ;Input - ICN = Integration Control Number associated with patient
+3 ; PSSX = passed in by reference; name of variable to hold the request string
+4 ; PSSDTM - date/time passed in ccyy-mm-ddThh:mm:ssZ format
+5 ; Output - PSSX = request string in XML format to be sent to HDR for patient genomic results
+6 KILL PSSX
+7 SET PSSX="/readClinicalData1?&templateId=MedOrderCheckRead&filterRequest=<?xml version=""1.0"" encoding=""UTF-8""?>"
+8 SET PSSX=PSSX_"<filter:filter xmlns:filter=""Filter"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" vhimVersion=""Vhim_4_00"">"
+9 SET PSSX=PSSX_"<filterId>MOCHA_READ_FILTER</filterId><clientName>HDR-14142</clientName><payloadType>xml</payloadType><clientRequestInitiationTime>"_PSSDTM_"</clientRequestInitiationTime>"
+10 SET PSSX=PSSX_"<patients><NationalId>"_ICN_"</NationalId></patients><entryPointFilter queryName=""ID1""><domainEntryPoint>Pharmacogenetic</domainEntryPoint><queryTimeoutSeconds>10000</queryTimeoutSeconds>"
+11 SET PSSX=PSSX_" </entryPointFilter> </filter:filter>&filterId=MOCHA_READ_FILTER&requestId="_$PIECE($$SITE^VASITE,U,3)_"MOCHA PGx"_$$NOW^XLFDT_";"_$H
+12 QUIT
+13 ;
SENDREQUEST(PSSROBJ,PSSX,PSSERR) ; post MED_ORDER_CHECK request to HDR web service to return patient genetic test results
+1 ; Input - PSSROBJ = rest service request object (passed in by reference)
+2 ; PSSX = request string to HDR
+3 ; Output - PSSRET = returned (XML) string as a result of HDR processing of the request
+4 ; - PSSERR = error object (passed in by reference)
+5 NEW $ETRAP,PSSRET
+6 ; Set error trap
+7 SET $ETRAP="DO ERROR^PSSHDPG1"
+8 ;Return REST Service Request Object using the HWSC supported API.
SET PSSROBJ=$$GETREST^XOBWLIB("PSS PGX-HDR SERVICE","PSS PGX-HDR SERVER")
+9 IF $DATA(^TMP($JOB,"PSSHDPG1","EXCEPTION"))>0
SET PSSRET="-1^"_^TMP($JOB,"PSSHDPG1","EXCEPTION")
GOTO SENDREQUESTX
+10 ;Make HTTP GET Call and Force Error if Problem Encountered
SET PSSRET=$$GET^XOBWLIB(PSSROBJ,PSSX,.PSSERR,1)
+11 IF $DATA(^TMP($JOB,"PSSHDPG1","EXCEPTION"))>0
SET PSSRET="-1^"_^TMP($JOB,"PSSHDPG1","EXCEPTION")
SENDREQUESTX ;
+1 QUIT PSSRET
+2 ;
SETARRAY(PSSGENES) ; ;move from temp global into LOCAL array
+1 ;PSSGENES - Patient lab result from HDR
+2 ; PSSGENES(GENE,CNT,"ACTIVITY_SCORE")
+3 ; PSSGENES(GENE,CNT,"GENOTYPE")
+4 ; PSSGENES(GENE,CNT,"NPP_SharePointURL")
+5 ; PSSGENES(GENE,CNT,"PHENOTYPE")
+6 ; PSSGENES(GENE,CNT,"RESULT_DATE")
+7 ;PSSXZY - format uses to check for GENE and PHENOTYPE FDB maaping
+8 ; PSSXYZ(CNT,LABEL) where labels are "GENE", "ACTIVITY_SCORE", GENOTYPE, PHENOTYPE, RESULT_DATA, NPP_SharePointURL,FULL_ICN, PSSXSID.
+9 NEW INDX,PSSGENE,PSSPHEN,PSSFDBG,PSSFDBP,PSSCNT,PSSXZY,PSSGMAP,PSSPMAP,PSSFDBG,PSSFDBP,PSSMAP
+10 SET INDX=-1
SET PSSCNT=0
+11 FOR
SET INDX=$ORDER(^TMP($JOB,"PSSHDPG1","ClinicalData",0,"patient",0,"medOrderCheckRead",0,"pgxDatas",0,"pgxData",INDX))
if INDX']""
QUIT
Begin DoDot:1
+12 SET PSSCNT=PSSCNT+1
+13 SET PSSXZY(PSSCNT,"GENE")=$GET(^TMP($JOB,"PSSHDPG1","ClinicalData",0,"patient",0,"medOrderCheckRead",0,"pgxDatas",0,"pgxData",INDX,"gene",0))
+14 SET PSSXZY(PSSCNT,"ACTIVITY_SCORE")=$GET(^TMP($JOB,"PSSHDPG1","ClinicalData",0,"patient",0,"medOrderCheckRead",0,"pgxDatas",0,"pgxData",INDX,"vinciActivityScore",0))
+15 SET PSSXZY(PSSCNT,"GENOTYPE")=$GET(^TMP($JOB,"PSSHDPG1","ClinicalData",0,"patient",0,"medOrderCheckRead",0,"pgxDatas",0,"pgxData",INDX,"vinciGenotype",0))
+16 SET PSSXZY(PSSCNT,"PHENOTYPE")=$GET(^TMP($JOB,"PSSHDPG1","ClinicalData",0,"patient",0,"medOrderCheckRead",0,"pgxDatas",0,"pgxData",INDX,"vinciPhenotype",0))
+17 SET PSSXZY(PSSCNT,"RESULT_DATE")=$GET(^TMP($JOB,"PSSHDPG1","ClinicalData",0,"patient",0,"medOrderCheckRead",0,"pgxDatas",0,"pgxData",INDX,"resultDate",0))
+18 SET PSSXZY(PSSCNT,"NPP_SharePointURL")=$PIECE($GET(^TMP($JOB,"PSSHDPG1","ClinicalData",0,"patient",0,"medOrderCheckRead",0,"nppSharepointURL",0,"url",0)),"? ",2)
+19 SET PSSXZY(PSSCNT,"FULL_ICN")=$GET(^TMP($JOB,"PSSHDPG1","ClinicalData",0,"patient",0,"medOrderCheckRead",0,"pgxDatas",0,"pgxData",INDX,"patientFullICN",0))
+20 SET PSSXZY(PSSCNT,"PGXSID")=$GET(^TMP($JOB,"PSSHDPG1","ClinicalData",0,"patient",0,"medOrderCheckRead",0,"pgxDatas",0,"pgxData",INDX,"pgxSID",0))
End DoDot:1
+21 KILL PSSPERR
+22 IF '$GET(PSSOPTFG)
DO DATA^PSSPGXUT(.PSSXZY,.PSSMAP)
+23 FOR PSSCNT=0:0
SET PSSCNT=$ORDER(PSSXZY(PSSCNT))
if 'PSSCNT
QUIT
Begin DoDot:1
+24 SET PSSGMAP=$GET(PSSMAP(PSSCNT,"GENE"))
SET PSSFDBG=$PIECE(PSSGMAP,U,2)
+25 SET PSSPMAP=$GET(PSSMAP(PSSCNT,"PHENOTYPE"))
SET PSSFDBP=$PIECE(PSSPMAP,U,2)
IF +$PIECE(PSSPMAP,U,3)
IF PSSFDBG'=""
SET PSSPERR(PSSFDBG)=PSSFDBP
+26 if PSSFDBG="NULL"
QUIT
+27 SET PSSGENES(PSSFDBG,PSSCNT,"ACTIVITY_SCORE")=PSSXZY(PSSCNT,"ACTIVITY_SCORE")
+28 SET PSSGENES(PSSFDBG,PSSCNT,"GENOTYPE")=PSSXZY(PSSCNT,"GENOTYPE")
+29 SET PSSGENES(PSSFDBG,PSSCNT,"PHENOTYPE")=$SELECT($DATA(PSSMAP(PSSCNT,"NOFDB")):"",PSSFDBP'="NULL":PSSFDBP,1:"")
+30 SET PSSGENES(PSSFDBG,PSSCNT,"RESULT_DATE")=PSSXZY(PSSCNT,"RESULT_DATE")
+31 SET PSSGENES(PSSFDBG,PSSCNT,"NPP_SharePointURL")=PSSXZY(PSSCNT,"NPP_SharePointURL")
End DoDot:1
+32 QUIT
+33 ;
PARSE(STREAM) ;parse out xml into temp global (copied from PARSE^ORRDI1)
+1 NEW %XML,GL,BREAK,X
+2 SET GL=$NAME(^TMP($JOB,"PSSHDPG1"))
+3 KILL @GL
+4 NEW STATUS,READER,XOBERR,S
+5 SET STATUS=##class(%XML.TextReader).ParseStream(STREAM,.READER,,,,,1)
+6 IF $$STATCHK^XOBWLIB(STATUS,.XOBERR,1)
Begin DoDot:1
+7 SET BREAK=0
FOR
if BREAK!READER.EOF!'READER.Read()
QUIT
Begin DoDot:2
+8 IF READER.NodeType="element"
DO SPUSH(.S,READER.LocalName)
+9 IF READER.NodeType="endelement"
DO SPOP(.S,.X)
+10 IF READER.NodeType="chars"
DO SPUT(.S,READER.Value)
End DoDot:2
End DoDot:1
+11 QUIT
+12 ;
SPUSH(S,X) ;places X on the stack S and returns the current level of the stack (copied from PARSE^ORRDI1)
+1 NEW I
SET I=$ORDER(S(""),-1)+1
SET S(I)=X
+2 QUIT I
+3 ;
SPOP(S,X) ;removes the top item from the stack S and put it into the variable X and returns the level that X was at (copied from PARSE^ORRDI1)
+1 NEW I
SET I=$ORDER(S(""),-1)
+2 IF I
SET X=S(I)
KILL S(I)
+3 NEW J
SET J=$ORDER(S(I),-1)
IF J
SET S(J,X)=$GET(S(J,X))+1
+4 QUIT I
+5 ;
SPEEK(S,X) ;same as SPOP except the top item is not removed (copied from PARSE^ORRDI1)
+1 NEW I
SET I=$ORDER(S(""),-1)
+2 IF I
SET X=S(I)
+3 QUIT I
+4 ;
SPUT(S,X) ;implementation specific, uses the stack to form a global node (copied from PARSE^ORRDI1)
+1 NEW I,STR
+2 SET STR=$PIECE(GL,")")
+3 SET I=0
FOR
SET I=$ORDER(S(I))
if 'I
QUIT
Begin DoDot:1
+4 SET STR=STR_","_""""_S(I)_""""_","
+5 NEW NUM
SET NUM=0
+6 IF $DATA(S(I-1,S(I)))
SET NUM=+$GET(S(I-1,S(I)))
+7 SET STR=STR_NUM
End DoDot:1
+8 SET STR=STR_")"
+9 IF $DATA(@STR)
SET @STR=@STR_X
+10 IF '$DATA(@STR)
SET @STR=X
+11 QUIT STR
+12 ;
REMOVEOFFSET(TIME) ;
+1 SET TIME=$PIECE(TIME,"-")
+2 SET TIME=$PIECE(TIME,"+")
+3 SET TIME=$PIECE(TIME,"Z")
+4 QUIT TIME
+5 ;
ERROR ;
+1 ; @DESC Handles error during request to HDR via webservice.
+2 ;
+3 ; Depends on GLOBAL variable PSSERR to be set in previous call.
+4 ;
+5 ; @RETURNS Nothing. Value store in global.
+6 ;
+7 NEW ERRARRAY
+8 ;
+9 ; Get error object from Error Object Factory
+10 IF $GET(PSSERR)=""
SET PSSERR=$$EOFAC^XOBWLIB()
+11 ; Store the error object in the error array
+12 DO ERR2ARR^XOBWLIB(PSSERR,.ERRARRAY)
+13 ;
+14 ; Parse out the error text and store in global
+15 SET ^TMP($JOB,"PSSHDPG1","EXCEPTION")=$$GETTEXT(.ERRARRAY)
+16 ; Set ecode to empty to return to calling function
+17 SET $ECODE=""
+18 ;
+19 QUIT
+20 ;
GETTEXT(ERRARRAY) ;
+1 ; @DESC Gets the error text from the array
+2 ;
+3 ; @ERRARRAY Error array stores error in format defined by web service product.
+4 ;
+5 ; @RETURNS Error info as a single string
+6 ;
+7 NEW PSS
+8 ;
+9 ; Loop through the text subscript of error array and concatenate
+10 SET PSS("errorText")=""
+11 SET PSS("I")=""
+12 FOR
SET PSS("I")=$ORDER(ERRARRAY("text",PSS("I")))
if PSS("I")=""
QUIT
Begin DoDot:1
+13 SET PSS("errorText")=PSS("errorText")_ERRARRAY("text",PSS("I"))
End DoDot:1
+14 ;
+15 QUIT PSS("errorText")
+16 ;;