| [3] | 1 | GPLCCR ; CCDCCR/GPL - CCR MAIN PROCESSING; 6/6/08 | 
|---|
|  | 2 | ;;0.1;CCDCCR;nopatch;noreleasedate | 
|---|
|  | 3 | ; | 
|---|
|  | 4 | ; EXPORT A CCR | 
|---|
|  | 5 | ; | 
|---|
|  | 6 | EXPORT ; EXPORT ENTRY POINT FOR CCR | 
|---|
| [32] | 7 | ; Select a patient. | 
|---|
| [3] | 8 | S DIC=2,DIC(0)="AEMQ" D ^DIC | 
|---|
| [28] | 9 | I Y<1 Q ; EXIT | 
|---|
| [3] | 10 | S DFN=$P(Y,U,1) ; SET THE PATIENT | 
|---|
|  | 11 | N CCRGLO | 
|---|
| [31] | 12 | D CCRRPC(.CCRGLO,DFN,"CCR","","","") | 
|---|
| [3] | 13 | S OARY=$NA(^TMP($J,DFN,"CCR",1)) | 
|---|
|  | 14 | S ONAM="PAT_"_DFN_"_CCR_V1.xml" | 
|---|
| [27] | 15 | S ODIR="/home/glilly/CCROUT" | 
|---|
| [3] | 16 | D OUTPUT^GPLXPATH(OARY,ONAM,ODIR) | 
|---|
|  | 17 | Q | 
|---|
|  | 18 | ; | 
|---|
| [31] | 19 | CCRRPC(CCRGRTN,DFN,CCRPART,TIME1,TIME2,HDRARY) ; RPC ENTRY POINT FOR CCR OUTPUT | 
|---|
|  | 20 | ; CCRGRTN IS RETURN ARRAY PASSED BY NAME | 
|---|
|  | 21 | ; DFN IS PATIENT IEN | 
|---|
|  | 22 | ; CCRPART IS "CCR" FOR ENTIRE CCR, OR SECTION NAME FOR A PART OF THE | 
|---|
|  | 23 | ;        CCR BODY.. PARTS INCLUDE "PROBLEMS" "VITALS" ETC | 
|---|
|  | 24 | ; TIME1 IS STARTING TIME TO INCLUDE - NULL MEANS ALL | 
|---|
|  | 25 | ; TIME2 IS ENDING TIME TO INCLUDE TIME IS FILEMAN TIME - NULL MEANS NOW | 
|---|
|  | 26 | ; HDRARY IS THE HEADER ARRAY DEFINING THE "FROM" AND "TO" VARIABLES | 
|---|
|  | 27 | ;    IF NULL WILL DEFAULT TO "FROM" DUZ AND "TO" DFN | 
|---|
| [32] | 28 | S DEBUG=1 | 
|---|
| [3] | 29 | S TGLOBAL=$NA(^TMP($J,"TEMPLATE")) ; GLOBAL FOR STORING TEMPLATE | 
|---|
|  | 30 | S CCRGLO=$NA(^TMP($J,DFN,"CCR")) ; GLOBAL FOR BUILDING THE CCR | 
|---|
| [29] | 31 | S ACTGLO=$NA(^TMP($J,DFN,"ACTORS")); GLOBAL FOR ALL ACTORS IN CCR | 
|---|
| [3] | 32 | ; TO GET PART OF THE CCR RETURNED, PASS CCRPART="PROBLEMS" ETC | 
|---|
|  | 33 | S CCRGRTN=$NA(^TMP($J,DFN,CCRPART)) ; RTN GLO NM OF PART OR ALL OF CCR | 
|---|
|  | 34 | D LOAD^GPLCCR0(TGLOBAL)  ; LOAD THE CCR TEMPLATE | 
|---|
|  | 35 | D CP^GPLXPATH(TGLOBAL,CCRGLO) ; COPY THE TEMPLATE TO THE CCR GLOBAL | 
|---|
|  | 36 | ; | 
|---|
|  | 37 | ; DELETE THE BODY, ACTORS AND SIGNATURES SECTIONS FROM THE CCR GLOBAL | 
|---|
| [28] | 38 | ; THESE WILL BE POPULATED AFTER CALLS TO THE XPATH PROCESSING ROUTINES | 
|---|
| [3] | 39 | D REPLACE^GPLXPATH(CCRGLO,"","//ContinuityOfCareRecord/Body") | 
|---|
|  | 40 | D REPLACE^GPLXPATH(CCRGLO,"","//ContinuityOfCareRecord/Actors") | 
|---|
|  | 41 | D REPLACE^GPLXPATH(CCRGLO,"","//ContinuityOfCareRecord/Signatures") | 
|---|
| [29] | 42 | I DEBUG F I=1:1:@CCRGLO@(0) W @CCRGLO@(I),! | 
|---|
| [3] | 43 | ; | 
|---|
| [31] | 44 | D HDRMAP(CCRGLO,DFN,HDRARY) ; MAP HEADER VARIABLES | 
|---|
|  | 45 | ; | 
|---|
| [3] | 46 | S CCRXTAB="^TMP($J,""CCRSTEP"")" ; GLOBAL TO STORE CCR PROCESSING STEPS | 
|---|
|  | 47 | D INITSTPS(CCRXTAB) ; INITIALIZED CCR PROCESSING STEPS | 
|---|
|  | 48 | N I,XI,TAG,RTN,CALL,XPATH,IXML,OXML,INXML,CCRBLD | 
|---|
|  | 49 | F I=1:1:@CCRXTAB@(0)  D  ; PROCESS THE CCR BODY SECTIONS | 
|---|
|  | 50 | . S XI=@CCRXTAB@(I) ; CALL COPONENTS TO PARSE | 
|---|
|  | 51 | . S RTN=$P(XI,";",2) ; NAME OF ROUTINE TO CALL | 
|---|
|  | 52 | . S TAG=$P(XI,";",1) ; LABEL INSIDE ROUTINE TO CALL | 
|---|
|  | 53 | . S XPATH=$P(XI,";",3) ; XPATH TO XML TO PASS TO ROUTINE | 
|---|
|  | 54 | . D QUERY^GPLXPATH(TGLOBAL,XPATH,"INXML") ; EXTRACT XML TO PASS | 
|---|
|  | 55 | . S IXML="INXML" | 
|---|
|  | 56 | . S OXML=$P(XI,";",4) ; ARRAY FOR SECTION VALUES | 
|---|
|  | 57 | . ; W OXML,! | 
|---|
|  | 58 | . S CALL="D "_TAG_"^"_RTN_"(IXML,DFN,OXML)" ; SETUP THE CALL | 
|---|
|  | 59 | . W "RUNNING ",CALL,! | 
|---|
|  | 60 | . X CALL | 
|---|
|  | 61 | . ; NOW INSERT THE RESULTS IN THE CCR BUFFER | 
|---|
| [22] | 62 | . D INSERT^GPLXPATH(CCRGLO,OXML,"//ContinuityOfCareRecord/Body") | 
|---|
| [3] | 63 | . I DEBUG F GPLI=1:1:@OXML@(0) W @OXML@(GPLI),! | 
|---|
| [33] | 64 | D ACTLST^GPLCCR(CCRGLO,ACTGLO) ; GEN THE ACTOR LIST | 
|---|
| [3] | 65 | Q | 
|---|
|  | 66 | ; | 
|---|
|  | 67 | INITSTPS(TAB)   ; INITIALIZE CCR PROCESSING STEPS | 
|---|
|  | 68 | ; TAB IS PASSED BY NAME | 
|---|
|  | 69 | ; W "TAB= ",TAB,! | 
|---|
|  | 70 | ; D PUSH^GPLXPATH(TAB,"EXTRACT;GPLVITALS;//ContinuityOfCareRecord/Body/VitalSigns;^TMP($J,DFN,""VITALS"")") | 
|---|
|  | 71 | D PUSH^GPLXPATH(TAB,"EXTRACT;GPLPROBS;//ContinuityOfCareRecord/Body/Problems;^TMP($J,DFN,""PROBLEMS"")") | 
|---|
|  | 72 | Q | 
|---|
|  | 73 | ; | 
|---|
| [31] | 74 | HDRMAP(CXML,DFN,IHDR) ; MAP HEADER VARIABLES: FROM, TO ECT | 
|---|
| [29] | 75 | N VMAP S VMAP=$NA(^TMP($J,DFN,"HEADER")) | 
|---|
|  | 76 | ; K @VMAP | 
|---|
| [31] | 77 | I IHDR="" D  ; HEADER ARRAY IS NOT PROVIDED, USE DEFAULTS | 
|---|
|  | 78 | . S @VMAP@("ACTORPATIENT")="ACTORPATIENT_"_DFN | 
|---|
|  | 79 | . S @VMAP@("ACTORFROM")="ACTORPROVIDER_"_DUZ ; FROM DUZ - ??? | 
|---|
|  | 80 | . S @VMAP@("ACTORFROM2")="ACTORPROVIDER_"_DUZ ; NEED A BETTER WAY | 
|---|
|  | 81 | . S @VMAP@("ACTORTO")="ACTORPATIENT_"_DFN  ; FOR TEST PURPOSES, | 
|---|
|  | 82 | . ; THIS IS THE USE CASE FOR THE PHR WHERE "TO" IS THE PATIENT | 
|---|
|  | 83 | I IHDR'="" D  ; HEADER VALUES ARE PROVIDED | 
|---|
|  | 84 | . D CP^GPLXPATH(IHDR,VMAP) ; COPY HEADER VARIABLES TO MAP ARRAY | 
|---|
| [29] | 85 | N CTMP | 
|---|
|  | 86 | D MAP^GPLXPATH(CXML,VMAP,"CTMP") | 
|---|
|  | 87 | D CP^GPLXPATH("CTMP",CXML) | 
|---|
|  | 88 | Q | 
|---|
|  | 89 | ; | 
|---|
|  | 90 | ACTLST(AXML,ACTRTN) ; RETURN THE ACTOR LIST FOR THE XML IN AXML | 
|---|
|  | 91 | ; AXML AND ACTRTN ARE PASSED BY NAME | 
|---|
| [31] | 92 | ; EACH ACTOR RECORD HAS 3 PARTS - IE IF OBJECTID=ACTORPATIENT_2 | 
|---|
|  | 93 | ; P1= OBJECTID - ACTORPATIENT_2 | 
|---|
| [33] | 94 | ; P2= OBJECT TYPE - PATIENT OR PROVIDER OR SOFTWARE OR INSTITUTION | 
|---|
|  | 95 | ;     OR PERSON(IN PATIENT FILE IE NOK) | 
|---|
| [31] | 96 | ; P3= IEN RECORD NUMBER FOR ACTOR - 2 | 
|---|
|  | 97 | N I,J,K,L | 
|---|
| [29] | 98 | K @ACTRTN ; CLEAR RETURN ARRAY | 
|---|
|  | 99 | F I=1:1:@AXML@(0) D  ; SCAN ALL LINES | 
|---|
|  | 100 | . I @AXML@(I)?.E1"<ActorID>".E D  ; THERE IS AN ACTOR ON THIS LINE | 
|---|
|  | 101 | . . S J=$P($P(@AXML@(I),"<ActorID>",2),"</ActorID>",1) | 
|---|
|  | 102 | . . W "<ActorID>=>",J,! | 
|---|
| [31] | 103 | . . S K(J)="" ; HASHING ACTOR TO GET RID OF DUPLICATES | 
|---|
| [30] | 104 | S I="" ; GOING TO $O THROUGH THE HASH | 
|---|
|  | 105 | F J=0:0 D  Q:$O(K(I))="" | 
|---|
|  | 106 | . S I=$O(K(I)) ; WALK THROUGH THE HASH OF ACTORS | 
|---|
| [31] | 107 | . S $P(L,U,1)=I ; FIRST PIECE IS THE OBJECT ID | 
|---|
|  | 108 | . S $P(L,U,2)=$P($P(I,"ACTOR",2),"_",1) ; ACTOR TYPE: PATIENT/PROVIDER | 
|---|
|  | 109 | . S $P(L,U,3)=$P(I,"_",2) ; IEN RECORD NUMBER FOR ACTOR | 
|---|
|  | 110 | . D PUSH^GPLXPATH(ACTRTN,L) ; ADD THE ACTOR TO THE RETURN ARRAY | 
|---|
| [29] | 111 | Q | 
|---|
|  | 112 | ; | 
|---|
| [3] | 113 | TEST   ; RUN ALL THE TEST CASES | 
|---|
| [28] | 114 | ;D TESTALL^GPLUNIT("GPLCCR") | 
|---|
|  | 115 | D ZTEST^GPLCCR("PROBLEMS") | 
|---|
| [29] | 116 | W "TESTING RETURNED FROM PROBLMES",! | 
|---|
| [28] | 117 | D ZTEST^GPLCCR("CCR") | 
|---|
| [3] | 118 | Q | 
|---|
|  | 119 | ; | 
|---|
|  | 120 | ZTEST(WHICH) ; RUN ONE SET OF TESTS | 
|---|
|  | 121 | N ZTMP | 
|---|
|  | 122 | D ZLOAD^GPLUNIT("ZTMP","GPLCCR") | 
|---|
|  | 123 | D ZTEST^GPLUNIT(.ZTMP,WHICH) | 
|---|
|  | 124 | Q | 
|---|
|  | 125 | ; | 
|---|
|  | 126 | TLIST ; LIST THE TESTS | 
|---|
|  | 127 | N ZTMP | 
|---|
|  | 128 | D ZLOAD^GPLUNIT("ZTMP","GPLCCR") | 
|---|
|  | 129 | D TLIST^GPLUNIT(.ZTMP) | 
|---|
|  | 130 | Q | 
|---|
|  | 131 | ; | 
|---|
|  | 132 | ;;><TEST> | 
|---|
| [28] | 133 | ;;><PROBLEMS> | 
|---|
| [3] | 134 | ;;>>>K GPL S GPL="" | 
|---|
| [32] | 135 | ;;>>>D CCRRPC^GPLCCR(.GPL,"2","PROBLEMS","","","") | 
|---|
| [28] | 136 | ;;>>?@GPL@(@GPL@(0))="</Problems>" | 
|---|
|  | 137 | ;;><CCR> | 
|---|
| [33] | 138 | ;;>>>D ^%ZTER | 
|---|
| [28] | 139 | ;;>>>K GPL S GPL="" | 
|---|
| [32] | 140 | ;;>>>D CCRRPC^GPLCCR(.GPL,"2","CCR","","","") | 
|---|
| [28] | 141 | ;;>>?@GPL@(@GPL@(0))="</ContinutiyOfCareRecord>" | 
|---|
| [29] | 142 | ;;><ACTLST> | 
|---|
|  | 143 | ;;>>>N TCCR | 
|---|
| [32] | 144 | ;;>>>D CCRRPC^GPLCCR(.TCCR,"2","CCR","","","") | 
|---|
| [29] | 145 | ;;>>>D ACTLST^GPLCCR("TCCR","ACTTEST") | 
|---|
| [3] | 146 | ;;></TEST> | 
|---|