| 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 | 
|---|
| 7 | ; Select a patient. | 
|---|
| 8 | S DIC=2,DIC(0)="AEMQ" D ^DIC | 
|---|
| 9 | I Y<1 Q ; EXIT | 
|---|
| 10 | S DFN=$P(Y,U,1) ; SET THE PATIENT | 
|---|
| 11 | N CCRGLO | 
|---|
| 12 | D CCRRPC(.CCRGLO,DFN,"CCR","","","") | 
|---|
| 13 | S OARY=$NA(^TMP($J,DFN,"CCR",1)) | 
|---|
| 14 | S ONAM="PAT_"_DFN_"_CCR_V1.xml" | 
|---|
| 15 | S ODIR="/home/glilly/CCROUT" | 
|---|
| 16 | D OUTPUT^GPLXPATH(OARY,ONAM,ODIR) | 
|---|
| 17 | Q | 
|---|
| 18 | ; | 
|---|
| 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 | 
|---|
| 28 | S DEBUG=1 | 
|---|
| 29 | S TGLOBAL=$NA(^TMP($J,"TEMPLATE")) ; GLOBAL FOR STORING TEMPLATE | 
|---|
| 30 | S CCRGLO=$NA(^TMP($J,DFN,"CCR")) ; GLOBAL FOR BUILDING THE CCR | 
|---|
| 31 | S ACTGLO=$NA(^TMP($J,DFN,"ACTORS")); GLOBAL FOR ALL ACTORS IN CCR | 
|---|
| 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 | 
|---|
| 38 | ; THESE WILL BE POPULATED AFTER CALLS TO THE XPATH PROCESSING ROUTINES | 
|---|
| 39 | D REPLACE^GPLXPATH(CCRGLO,"","//ContinuityOfCareRecord/Body") | 
|---|
| 40 | D REPLACE^GPLXPATH(CCRGLO,"","//ContinuityOfCareRecord/Actors") | 
|---|
| 41 | D REPLACE^GPLXPATH(CCRGLO,"","//ContinuityOfCareRecord/Signatures") | 
|---|
| 42 | I DEBUG F I=1:1:@CCRGLO@(0) W @CCRGLO@(I),! | 
|---|
| 43 | ; | 
|---|
| 44 | D HDRMAP(CCRGLO,DFN,HDRARY) ; MAP HEADER VARIABLES | 
|---|
| 45 | ; | 
|---|
| 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 | 
|---|
| 62 | . D INSERT^GPLXPATH(CCRGLO,OXML,"//ContinuityOfCareRecord/Body") | 
|---|
| 63 | . I DEBUG F GPLI=1:1:@OXML@(0) W @OXML@(GPLI),! | 
|---|
| 64 | . D ACTLST^GPLCCR(CCRGLO,ACTGLO) ; GEN THE ACTOR LIST | 
|---|
| 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 | ; | 
|---|
| 74 | HDRMAP(CXML,DFN,IHDR) ; MAP HEADER VARIABLES: FROM, TO ECT | 
|---|
| 75 | N VMAP S VMAP=$NA(^TMP($J,DFN,"HEADER")) | 
|---|
| 76 | ; K @VMAP | 
|---|
| 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 | 
|---|
| 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 | 
|---|
| 92 | ; EACH ACTOR RECORD HAS 3 PARTS - IE IF OBJECTID=ACTORPATIENT_2 | 
|---|
| 93 | ; P1= OBJECTID - ACTORPATIENT_2 | 
|---|
| 94 | ; P2= OBJECT TYPE - PATIENT OR PROVIDER | 
|---|
| 95 | ; P3= IEN RECORD NUMBER FOR ACTOR - 2 | 
|---|
| 96 | N I,J,K,L | 
|---|
| 97 | K @ACTRTN ; CLEAR RETURN ARRAY | 
|---|
| 98 | F I=1:1:@AXML@(0) D  ; SCAN ALL LINES | 
|---|
| 99 | . I @AXML@(I)?.E1"<ActorID>".E D  ; THERE IS AN ACTOR ON THIS LINE | 
|---|
| 100 | . . S J=$P($P(@AXML@(I),"<ActorID>",2),"</ActorID>",1) | 
|---|
| 101 | . . W "<ActorID>=>",J,! | 
|---|
| 102 | . . S K(J)="" ; HASHING ACTOR TO GET RID OF DUPLICATES | 
|---|
| 103 | S I="" ; GOING TO $O THROUGH THE HASH | 
|---|
| 104 | F J=0:0 D  Q:$O(K(I))="" | 
|---|
| 105 | . S I=$O(K(I)) ; WALK THROUGH THE HASH OF ACTORS | 
|---|
| 106 | . S $P(L,U,1)=I ; FIRST PIECE IS THE OBJECT ID | 
|---|
| 107 | . S $P(L,U,2)=$P($P(I,"ACTOR",2),"_",1) ; ACTOR TYPE: PATIENT/PROVIDER | 
|---|
| 108 | . S $P(L,U,3)=$P(I,"_",2) ; IEN RECORD NUMBER FOR ACTOR | 
|---|
| 109 | . D PUSH^GPLXPATH(ACTRTN,L) ; ADD THE ACTOR TO THE RETURN ARRAY | 
|---|
| 110 | Q | 
|---|
| 111 | ; | 
|---|
| 112 | TEST   ; RUN ALL THE TEST CASES | 
|---|
| 113 | ;D TESTALL^GPLUNIT("GPLCCR") | 
|---|
| 114 | D ZTEST^GPLCCR("PROBLEMS") | 
|---|
| 115 | W "TESTING RETURNED FROM PROBLMES",! | 
|---|
| 116 | D ZTEST^GPLCCR("CCR") | 
|---|
| 117 | Q | 
|---|
| 118 | ; | 
|---|
| 119 | ZTEST(WHICH) ; RUN ONE SET OF TESTS | 
|---|
| 120 | N ZTMP | 
|---|
| 121 | D ZLOAD^GPLUNIT("ZTMP","GPLCCR") | 
|---|
| 122 | D ZTEST^GPLUNIT(.ZTMP,WHICH) | 
|---|
| 123 | Q | 
|---|
| 124 | ; | 
|---|
| 125 | TLIST ; LIST THE TESTS | 
|---|
| 126 | N ZTMP | 
|---|
| 127 | D ZLOAD^GPLUNIT("ZTMP","GPLCCR") | 
|---|
| 128 | D TLIST^GPLUNIT(.ZTMP) | 
|---|
| 129 | Q | 
|---|
| 130 | ; | 
|---|
| 131 | ;;><TEST> | 
|---|
| 132 | ;;><PROBLEMS> | 
|---|
| 133 | ;;>>>K GPL S GPL="" | 
|---|
| 134 | ;;>>>D CCRRPC^GPLCCR(.GPL,"2","PROBLEMS","","","") | 
|---|
| 135 | ;;>>?@GPL@(@GPL@(0))="</Problems>" | 
|---|
| 136 | ;;><CCR> | 
|---|
| 137 | ;;>>>K GPL S GPL="" | 
|---|
| 138 | ;;>>>D CCRRPC^GPLCCR(.GPL,"2","CCR","","","") | 
|---|
| 139 | ;;>>?@GPL@(@GPL@(0))="</ContinutiyOfCareRecord>" | 
|---|
| 140 | ;;><ACTLST> | 
|---|
| 141 | ;;>>>N TCCR | 
|---|
| 142 | ;;>>>D CCRRPC^GPLCCR(.TCCR,"2","CCR","","","") | 
|---|
| 143 | ;;>>>D ACTLST^GPLCCR("TCCR","ACTTEST") | 
|---|
| 144 | ;;></TEST> | 
|---|