source: ccr/trunk/p/GPLCCR.m@ 56

Last change on this file since 56 was 56, checked in by George Lilly, 16 years ago

Put ODIR in global to ease versioning and numbered lines in PARY

File size: 6.8 KB
Line 
1GPLCCR ; CCDCCR/GPL - CCR MAIN PROCESSING; 6/6/08
2 ;;0.1;CCDCCR;nopatch;noreleasedate
3 ;
4 ; EXPORT A CCR
5 ;
6EXPORT ; 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("GPLCCR",$J,DFN,"CCR",1))
14 S ONAM="PAT_"_DFN_"_CCR_V1.xml"
15 S ODIRGLB=$NA(^TMP("GPLCCR","ODIR"))
16 I '$D(@ODIRGLB) D ; IF NOT ODIR HAS BEEN SET
17 . S @ODIRGLB="/home/glilly/CCROUT"
18 . ;S @ODIRGLB="/home/cedwards/"
19 . ;S @ODIRGLB="/opt/wv/p/"
20 S ODIR=@ODIRGLB
21 D OUTPUT^GPLXPATH(OARY,ONAM,ODIR)
22 Q
23 ;
24CCRRPC(CCRGRTN,DFN,CCRPART,TIME1,TIME2,HDRARY) ;RPC ENTRY POINT FOR CCR OUTPUT
25 ; CCRGRTN IS RETURN ARRAY PASSED BY NAME
26 ; DFN IS PATIENT IEN
27 ; CCRPART IS "CCR" FOR ENTIRE CCR, OR SECTION NAME FOR A PART
28 ; OF THE CCR BODY.. PARTS INCLUDE "PROBLEMS" "VITALS" ETC
29 ; TIME1 IS STARTING TIME TO INCLUDE - NULL MEANS ALL
30 ; TIME2 IS ENDING TIME TO INCLUDE TIME IS FILEMAN TIME
31 ; - NULL MEANS NOW
32 ; HDRARY IS THE HEADER ARRAY DEFINING THE "FROM" AND
33 ; "TO" VARIABLES
34 ; IF NULL WILL DEFAULT TO "FROM" DUZ AND "TO" DFN
35 S DEBUG=0
36 S TGLOBAL=$NA(^TMP("GPLCCR",$J,"TEMPLATE")) ; GLOBAL FOR STORING TEMPLATE
37 S CCRGLO=$NA(^TMP("GPLCCR",$J,DFN,"CCR")) ; GLOBAL FOR BUILDING THE CCR
38 S ACTGLO=$NA(^TMP("GPLCCR",$J,DFN,"ACTORS")) ; GLOBAL FOR ALL ACTORS
39 ; TO GET PART OF THE CCR RETURNED, PASS CCRPART="PROBLEMS" ETC
40 S CCRGRTN=$NA(^TMP("GPLCCR",$J,DFN,CCRPART)) ; RTN GLO NM OF PART OR ALL
41 D LOAD^GPLCCR0(TGLOBAL) ; LOAD THE CCR TEMPLATE
42 D CP^GPLXPATH(TGLOBAL,CCRGLO) ; COPY THE TEMPLATE TO CCR GLOBAL
43 ;
44 ; DELETE THE BODY, ACTORS AND SIGNATURES SECTIONS FROM GLOBAL
45 ; THESE WILL BE POPULATED AFTER CALLS TO THE XPATH ROUTINES
46 D REPLACE^GPLXPATH(CCRGLO,"","//ContinuityOfCareRecord/Body")
47 D REPLACE^GPLXPATH(CCRGLO,"","//ContinuityOfCareRecord/Actors")
48 D REPLACE^GPLXPATH(CCRGLO,"","//ContinuityOfCareRecord/Signatures")
49 I DEBUG F I=1:1:@CCRGLO@(0) W @CCRGLO@(I),!
50 ;
51 D HDRMAP(CCRGLO,DFN,HDRARY) ; MAP HEADER VARIABLES
52 ;
53 K ^TMP("GPLCCR",$J,"CCRSTEP") ; KILL GLOBAL PRIOR TO ADDING TO IT
54 S CCRXTAB=$NA(^TMP("GPLCCR",$J,"CCRSTEP")) ; GLOBAL TO STORE CCR STEPS
55 D INITSTPS(CCRXTAB) ; INITIALIZED CCR PROCESSING STEPS
56 N I,XI,TAG,RTN,CALL,XPATH,IXML,OXML,INXML,CCRBLD
57 F I=1:1:@CCRXTAB@(0) D ; PROCESS THE CCR BODY SECTIONS
58 . S XI=@CCRXTAB@(I) ; CALL COPONENTS TO PARSE
59 . S RTN=$P(XI,";",2) ; NAME OF ROUTINE TO CALL
60 . S TAG=$P(XI,";",1) ; LABEL INSIDE ROUTINE TO CALL
61 . S XPATH=$P(XI,";",3) ; XPATH TO XML TO PASS TO ROUTINE
62 . D QUERY^GPLXPATH(TGLOBAL,XPATH,"INXML") ; EXTRACT XML TO PASS
63 . S IXML="INXML"
64 . S OXML=$P(XI,";",4) ; ARRAY FOR SECTION VALUES
65 . ; W OXML,!
66 . S CALL="D "_TAG_"^"_RTN_"(IXML,DFN,OXML)" ; SETUP THE CALL
67 . W "RUNNING ",CALL,!
68 . X CALL
69 . ; NOW INSERT THE RESULTS IN THE CCR BUFFER
70 . D INSERT^GPLXPATH(CCRGLO,OXML,"//ContinuityOfCareRecord/Body")
71 . I DEBUG F GPLI=1:1:@OXML@(0) W @OXML@(GPLI),!
72 D ACTLST^GPLCCR(CCRGLO,ACTGLO) ; GEN THE ACTOR LIST
73 D QUERY^GPLXPATH(TGLOBAL,"//ContinuityOfCareRecord/Actors","ACTT")
74 D EXTRACT^GPLACTORS("ACTT",ACTGLO,"ACTT2")
75 D INSINNER^GPLXPATH(CCRGLO,"ACTT2","//ContinuityOfCareRecord/Actors")
76 N I,J,DONE S DONE=0
77 F I=0:0 D Q:DONE ; DELETE UNTIL ALL EMPTY ELEMENTS ARE GONE
78 . S J=$$TRIM^GPLXPATH(CCRGLO) ; DELETE EMPTY ELEMENTS
79 . W "TRIMMED",J,!
80 . I J=0 S DONE=1 ; DONE WHEN TRIM RETURNS FALSE
81 Q
82 ;
83INITSTPS(TAB) ; INITIALIZE CCR PROCESSING STEPS
84 ; TAB IS PASSED BY NAME
85 W "TAB= ",TAB,!
86 D PUSH^GPLXPATH(TAB,"EXTRACT;GPLPROBS;//ContinuityOfCareRecord/Body/Problems;^TMP(""GPLCCR"",$J,DFN,""PROBLEMS"")")
87 D PUSH^GPLXPATH(TAB,"EXTRACT;GPLVITALS;//ContinuityOfCareRecord/Body/VitalSigns;^TMP(""GPLCCR"",$J,DFN,""VITALS"")")
88 Q
89 ;
90HDRMAP(CXML,DFN,IHDR) ; MAP HEADER VARIABLES: FROM, TO ECT
91 N VMAP S VMAP=$NA(^TMP("GPLCCR",$J,DFN,"HEADER"))
92 ; K @VMAP
93 S @VMAP@("DATETIME")=$$FMDTOUTC^CCRUTIL($$NOW^XLFDT,"DT")
94 I IHDR="" D ; HEADER ARRAY IS NOT PROVIDED, USE DEFAULTS
95 . S @VMAP@("ACTORPATIENT")="ACTORPATIENT_"_DFN
96 . S @VMAP@("ACTORFROM")="ACTORPROVIDER_"_DUZ ; FROM DUZ - ???
97 . S @VMAP@("ACTORFROM2")="ACTORSYSTEM_1" ; SECOND FROM IS THE SYSTEM
98 . S @VMAP@("ACTORTO")="ACTORPATIENT_"_DFN ; FOR TEST PURPOSES,
99 . ; THIS IS THE USE CASE FOR THE PHR WHERE "TO" IS THE PATIENT
100 I IHDR'="" D ; HEADER VALUES ARE PROVIDED
101 . D CP^GPLXPATH(IHDR,VMAP) ; COPY HEADER VARIABLES TO MAP ARRAY
102 N CTMP
103 D MAP^GPLXPATH(CXML,VMAP,"CTMP")
104 D CP^GPLXPATH("CTMP",CXML)
105 Q
106 ;
107ACTLST(AXML,ACTRTN) ; RETURN THE ACTOR LIST FOR THE XML IN AXML
108 ; AXML AND ACTRTN ARE PASSED BY NAME
109 ; EACH ACTOR RECORD HAS 3 PARTS - IE IF OBJECTID=ACTORPATIENT_2
110 ; P1= OBJECTID - ACTORPATIENT_2
111 ; P2= OBJECT TYPE - PATIENT OR PROVIDER OR SOFTWARE
112 ;OR INSTITUTION
113 ; OR PERSON(IN PATIENT FILE IE NOK)
114 ; P3= IEN RECORD NUMBER FOR ACTOR - 2
115 N I,J,K,L
116 K @ACTRTN ; CLEAR RETURN ARRAY
117 F I=1:1:@AXML@(0) D ; SCAN ALL LINES
118 . I @AXML@(I)?.E1"<ActorID>".E D ; THERE IS AN ACTOR THIS LINE
119 . . S J=$P($P(@AXML@(I),"<ActorID>",2),"</ActorID>",1)
120 . . W "<ActorID>=>",J,!
121 . . I J'="" S K(J)="" ; HASHING ACTOR
122 . . ; TO GET RID OF DUPLICATES
123 S I="" ; GOING TO $O THROUGH THE HASH
124 F J=0:0 D Q:$O(K(I))=""
125 . S I=$O(K(I)) ; WALK THROUGH THE HASH OF ACTORS
126 . S $P(L,U,1)=I ; FIRST PIECE IS THE OBJECT ID
127 . S $P(L,U,2)=$P($P(I,"ACTOR",2),"_",1) ; ACTOR TYPE
128 . S $P(L,U,3)=$P(I,"_",2) ; IEN RECORD NUMBER FOR ACTOR
129 . D PUSH^GPLXPATH(ACTRTN,L) ; ADD THE ACTOR TO THE RETURN ARRAY
130 Q
131 ;
132TEST ; RUN ALL THE TEST CASES
133 D TESTALL^GPLUNIT("GPLCCR")
134 Q
135 ;
136ZTEST(WHICH) ; RUN ONE SET OF TESTS
137 N ZTMP
138 D ZLOAD^GPLUNIT("ZTMP","GPLCCR")
139 D ZTEST^GPLUNIT(.ZTMP,WHICH)
140 Q
141 ;
142TLIST ; LIST THE TESTS
143 N ZTMP
144 D ZLOAD^GPLUNIT("ZTMP","GPLCCR")
145 D TLIST^GPLUNIT(.ZTMP)
146 Q
147 ;
148 ;;><TEST>
149 ;;><PROBLEMS>
150 ;;>>>K GPL S GPL=""
151 ;;>>>D CCRRPC^GPLCCR(.GPL,"2","PROBLEMS","","","")
152 ;;>>?@GPL@(@GPL@(0))["</Problems>"
153 ;;><VITALS>
154 ;;>>>K GPL S GPL=""
155 ;;>>>D CCRRPC^GPLCCR(.GPL,"2","VITALS","","","")
156 ;;>>?@GPL@(@GPL@(0))["</VitalSigns>"
157 ;;><CCR>
158 ;;>>>K GPL S GPL=""
159 ;;>>>D CCRRPC^GPLCCR(.GPL,"2","CCR","","","")
160 ;;>>?@GPL@(@GPL@(0))["</ContinuityOfCareRecord>"
161 ;;><ACTLST>
162 ;;>>>K GPL S GPL=""
163 ;;>>>D CCRRPC^GPLCCR(.GPL,"2","CCR","","","")
164 ;;>>>D ACTLST^GPLCCR(GPL,"ACTTEST")
165 ;;><ACTORS>
166 ;;>>>D ZTEST^GPLCCR("ACTLST")
167 ;;>>>D QUERY^GPLXPATH(TGLOBAL,"//ContinuityOfCareRecord/Actors","G2")
168 ;;>>>D EXTRACT^GPLACTORS("G2","ACTTEST","G3")
169 ;;>>?G3(G3(0))["</Actors>"
170 ;;><TRIM>
171 ;;>>>D ZTEST^GPLCCR("CCR")
172 ;;>>>W $$TRIM^GPLXPATH(CCRGLO)
173 ;;></TEST>
Note: See TracBrowser for help on using the repository browser.