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

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

rename GPLVITALS and GPLACTORS to GPLVITAL and GPLACTOR for kids build

File size: 8.6 KB
RevLine 
[38]1GPLCCR ; CCDCCR/GPL - CCR MAIN PROCESSING; 6/6/08
[43]2 ;;0.1;CCDCCR;nopatch;noreleasedate
[60]3 ;Copyright 2008 WorldVistA. Licensed under the terms of the GNU
4 ;General Public License See attached copy of the License.
5 ;
6 ;This program is free software; you can redistribute it and/or modify
7 ;it under the terms of the GNU General Public License as published by
8 ;the Free Software Foundation; either version 2 of the License, or
9 ;(at your option) any later version.
10 ;
11 ;This program is distributed in the hope that it will be useful,
12 ;but WITHOUT ANY WARRANTY; without even the implied warranty of
13 ;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 ;GNU General Public License for more details.
15 ;
16 ;You should have received a copy of the GNU General Public License along
17 ;with this program; if not, write to the Free Software Foundation, Inc.,
18 ;51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 ;
20 ; EXPORT A CCR
21 ;
[38]22EXPORT ; EXPORT ENTRY POINT FOR CCR
[41]23 ; Select a patient.
24 S DIC=2,DIC(0)="AEMQ" D ^DIC
[44]25 I Y<1 Q ; EXIT
[41]26 S DFN=$P(Y,U,1) ; SET THE PATIENT
[104]27 D XPAT(DFN,"","") ; EXPORT TO A FILE
28 Q
29 ;
30XPAT(DFN,DIR,FN) ; EXPORT ONE PATIENT TO A FILE
31 ; DIR IS THE DIRECTORY, DEFAULTS IF NULL TO ^TMP("GPLCCR","ODIR")
32 ; FN IS FILE NAME, DEFAULTS IF NULL
[41]33 N CCRGLO
34 D CCRRPC(.CCRGLO,DFN,"CCR","","","")
[50]35 S OARY=$NA(^TMP("GPLCCR",$J,DFN,"CCR",1))
[104]36 S ONAM=FN
37 I FN="" S ONAM="PAT_"_DFN_"_CCR_V1.xml"
[56]38 S ODIRGLB=$NA(^TMP("GPLCCR","ODIR"))
39 I '$D(@ODIRGLB) D ; IF NOT ODIR HAS BEEN SET
[79]40 . ;S @ODIRGLB="/home/glilly/CCROUT"
[101]41 . ;S @ODIRGLB="/home/cedwards/"
42 . S @ODIRGLB="/opt/wv/p/"
[104]43 S ODIR=DIR
44 I DIR="" S ODIR=@ODIRGLB
[41]45 D OUTPUT^GPLXPATH(OARY,ONAM,ODIR)
46 Q
47 ;
[38]48CCRRPC(CCRGRTN,DFN,CCRPART,TIME1,TIME2,HDRARY) ;RPC ENTRY POINT FOR CCR OUTPUT
[41]49 ; CCRGRTN IS RETURN ARRAY PASSED BY NAME
50 ; DFN IS PATIENT IEN
51 ; CCRPART IS "CCR" FOR ENTIRE CCR, OR SECTION NAME FOR A PART
52 ; OF THE CCR BODY.. PARTS INCLUDE "PROBLEMS" "VITALS" ETC
53 ; TIME1 IS STARTING TIME TO INCLUDE - NULL MEANS ALL
54 ; TIME2 IS ENDING TIME TO INCLUDE TIME IS FILEMAN TIME
55 ; - NULL MEANS NOW
56 ; HDRARY IS THE HEADER ARRAY DEFINING THE "FROM" AND
57 ; "TO" VARIABLES
58 ; IF NULL WILL DEFAULT TO "FROM" DUZ AND "TO" DFN
[93]59 I '$D(DEBUG) S DEBUG=0
[76]60 S CCD=0 ; NEED THIS FLAG TO DISTINGUISH FROM CCD
[77]61 I '$D(TESTLAB) S TESTLAB=0 ; FLAG FOR TESTING RESULTS SECTION
[50]62 S TGLOBAL=$NA(^TMP("GPLCCR",$J,"TEMPLATE")) ; GLOBAL FOR STORING TEMPLATE
63 S CCRGLO=$NA(^TMP("GPLCCR",$J,DFN,"CCR")) ; GLOBAL FOR BUILDING THE CCR
64 S ACTGLO=$NA(^TMP("GPLCCR",$J,DFN,"ACTORS")) ; GLOBAL FOR ALL ACTORS
[41]65 ; TO GET PART OF THE CCR RETURNED, PASS CCRPART="PROBLEMS" ETC
[50]66 S CCRGRTN=$NA(^TMP("GPLCCR",$J,DFN,CCRPART)) ; RTN GLO NM OF PART OR ALL
[41]67 D LOAD^GPLCCR0(TGLOBAL) ; LOAD THE CCR TEMPLATE
68 D CP^GPLXPATH(TGLOBAL,CCRGLO) ; COPY THE TEMPLATE TO CCR GLOBAL
69 ;
70 ; DELETE THE BODY, ACTORS AND SIGNATURES SECTIONS FROM GLOBAL
71 ; THESE WILL BE POPULATED AFTER CALLS TO THE XPATH ROUTINES
72 D REPLACE^GPLXPATH(CCRGLO,"","//ContinuityOfCareRecord/Body")
73 D REPLACE^GPLXPATH(CCRGLO,"","//ContinuityOfCareRecord/Actors")
74 D REPLACE^GPLXPATH(CCRGLO,"","//ContinuityOfCareRecord/Signatures")
75 I DEBUG F I=1:1:@CCRGLO@(0) W @CCRGLO@(I),!
76 ;
77 D HDRMAP(CCRGLO,DFN,HDRARY) ; MAP HEADER VARIABLES
78 ;
[50]79 K ^TMP("GPLCCR",$J,"CCRSTEP") ; KILL GLOBAL PRIOR TO ADDING TO IT
80 S CCRXTAB=$NA(^TMP("GPLCCR",$J,"CCRSTEP")) ; GLOBAL TO STORE CCR STEPS
[41]81 D INITSTPS(CCRXTAB) ; INITIALIZED CCR PROCESSING STEPS
[79]82 N PROCI,XI,TAG,RTN,CALL,XPATH,IXML,OXML,INXML,CCRBLD
83 F PROCI=1:1:@CCRXTAB@(0) D ; PROCESS THE CCR BODY SECTIONS
84 . S XI=@CCRXTAB@(PROCI) ; CALL COPONENTS TO PARSE
[41]85 . S RTN=$P(XI,";",2) ; NAME OF ROUTINE TO CALL
86 . S TAG=$P(XI,";",1) ; LABEL INSIDE ROUTINE TO CALL
87 . S XPATH=$P(XI,";",3) ; XPATH TO XML TO PASS TO ROUTINE
88 . D QUERY^GPLXPATH(TGLOBAL,XPATH,"INXML") ; EXTRACT XML TO PASS
89 . S IXML="INXML"
90 . S OXML=$P(XI,";",4) ; ARRAY FOR SECTION VALUES
[104]91 . ; K @OXML ; KILL EXPECTED OUTPUT ARRAY
[41]92 . ; W OXML,!
93 . S CALL="D "_TAG_"^"_RTN_"(IXML,DFN,OXML)" ; SETUP THE CALL
94 . W "RUNNING ",CALL,!
95 . X CALL
96 . ; NOW INSERT THE RESULTS IN THE CCR BUFFER
[84]97 . I @OXML@(0)'=0 D ; THERE IS A RESULT
98 . . D INSERT^GPLXPATH(CCRGLO,OXML,"//ContinuityOfCareRecord/Body")
99 . . I DEBUG F GPLI=1:1:@OXML@(0) W @OXML@(GPLI),!
[41]100 D ACTLST^GPLCCR(CCRGLO,ACTGLO) ; GEN THE ACTOR LIST
[45]101 D QUERY^GPLXPATH(TGLOBAL,"//ContinuityOfCareRecord/Actors","ACTT")
[111]102 D EXTRACT^GPLACTOR("ACTT",ACTGLO,"ACTT2")
[45]103 D INSINNER^GPLXPATH(CCRGLO,"ACTT2","//ContinuityOfCareRecord/Actors")
[79]104 N TRIMI,J,DONE S DONE=0
[98]105 F TRIMI=0:0 D Q:DONE ; DELETE UNTIL ALL EMPTY ELEMENTS ARE GONE
[52]106 . S J=$$TRIM^GPLXPATH(CCRGLO) ; DELETE EMPTY ELEMENTS
107 . W "TRIMMED",J,!
108 . I J=0 S DONE=1 ; DONE WHEN TRIM RETURNS FALSE
[41]109 Q
110 ;
111INITSTPS(TAB) ; INITIALIZE CCR PROCESSING STEPS
112 ; TAB IS PASSED BY NAME
[50]113 W "TAB= ",TAB,!
[70]114 ; ORDER FOR CCR IS PROBLEMS,FAMILYHISTORY,SOCIALHISTORY,MEDICATIONS,VITALSIGNS,RESULTS,HEALTHCAREPROVIDERS
[50]115 D PUSH^GPLXPATH(TAB,"EXTRACT;GPLPROBS;//ContinuityOfCareRecord/Body/Problems;^TMP(""GPLCCR"",$J,DFN,""PROBLEMS"")")
[79]116 D PUSH^GPLXPATH(TAB,"EXTRACT;GPLMEDS;//ContinuityOfCareRecord/Body/Medications;^TMP(""GPLCCR"",$J,DFN,""MEDICATIONS"")")
[111]117 D PUSH^GPLXPATH(TAB,"EXTRACT;GPLVITAL;//ContinuityOfCareRecord/Body/VitalSigns;^TMP(""GPLCCR"",$J,DFN,""VITALS"")")
[77]118 I TESTLAB D PUSH^GPLXPATH(TAB,"EXTRACT;GPLLABS;//ContinuityOfCareRecord/Body/Results;^TMP(""GPLCCR"",$J,DFN,""RESULTS"")")
[41]119 Q
120 ;
[38]121HDRMAP(CXML,DFN,IHDR) ; MAP HEADER VARIABLES: FROM, TO ECT
[50]122 N VMAP S VMAP=$NA(^TMP("GPLCCR",$J,DFN,"HEADER"))
[41]123 ; K @VMAP
[51]124 S @VMAP@("DATETIME")=$$FMDTOUTC^CCRUTIL($$NOW^XLFDT,"DT")
[41]125 I IHDR="" D ; HEADER ARRAY IS NOT PROVIDED, USE DEFAULTS
126 . S @VMAP@("ACTORPATIENT")="ACTORPATIENT_"_DFN
[57]127 . S @VMAP@("ACTORFROM")="ACTORORGANIZATION_"_DUZ ; FROM DUZ - ???
[45]128 . S @VMAP@("ACTORFROM2")="ACTORSYSTEM_1" ; SECOND FROM IS THE SYSTEM
[57]129 . S @VMAP@("ACTORTO")="ACTORPATIENT_"_DFN ; FOR TEST PURPOSES
130 . S @VMAP@("PURPOSEDESCRIPTION")="CEND PHR" ; FOR TEST PURPOSES
131 . S @VMAP@("ACTORTOTEXT")="Patient" ; FOR TEST PURPOSES
[41]132 . ; THIS IS THE USE CASE FOR THE PHR WHERE "TO" IS THE PATIENT
133 I IHDR'="" D ; HEADER VALUES ARE PROVIDED
134 . D CP^GPLXPATH(IHDR,VMAP) ; COPY HEADER VARIABLES TO MAP ARRAY
135 N CTMP
136 D MAP^GPLXPATH(CXML,VMAP,"CTMP")
137 D CP^GPLXPATH("CTMP",CXML)
138 Q
139 ;
140ACTLST(AXML,ACTRTN) ; RETURN THE ACTOR LIST FOR THE XML IN AXML
141 ; AXML AND ACTRTN ARE PASSED BY NAME
142 ; EACH ACTOR RECORD HAS 3 PARTS - IE IF OBJECTID=ACTORPATIENT_2
143 ; P1= OBJECTID - ACTORPATIENT_2
144 ; P2= OBJECT TYPE - PATIENT OR PROVIDER OR SOFTWARE
145 ;OR INSTITUTION
146 ; OR PERSON(IN PATIENT FILE IE NOK)
147 ; P3= IEN RECORD NUMBER FOR ACTOR - 2
148 N I,J,K,L
149 K @ACTRTN ; CLEAR RETURN ARRAY
150 F I=1:1:@AXML@(0) D ; SCAN ALL LINES
151 . I @AXML@(I)?.E1"<ActorID>".E D ; THERE IS AN ACTOR THIS LINE
152 . . S J=$P($P(@AXML@(I),"<ActorID>",2),"</ActorID>",1)
153 . . W "<ActorID>=>",J,!
154 . . I J'="" S K(J)="" ; HASHING ACTOR
155 . . ; TO GET RID OF DUPLICATES
156 S I="" ; GOING TO $O THROUGH THE HASH
157 F J=0:0 D Q:$O(K(I))=""
158 . S I=$O(K(I)) ; WALK THROUGH THE HASH OF ACTORS
159 . S $P(L,U,1)=I ; FIRST PIECE IS THE OBJECT ID
160 . S $P(L,U,2)=$P($P(I,"ACTOR",2),"_",1) ; ACTOR TYPE
161 . S $P(L,U,3)=$P(I,"_",2) ; IEN RECORD NUMBER FOR ACTOR
162 . D PUSH^GPLXPATH(ACTRTN,L) ; ADD THE ACTOR TO THE RETURN ARRAY
163 Q
164 ;
[43]165TEST ; RUN ALL THE TEST CASES
[41]166 D TESTALL^GPLUNIT("GPLCCR")
167 Q
168 ;
169ZTEST(WHICH) ; RUN ONE SET OF TESTS
170 N ZTMP
171 D ZLOAD^GPLUNIT("ZTMP","GPLCCR")
172 D ZTEST^GPLUNIT(.ZTMP,WHICH)
173 Q
174 ;
[43]175TLIST ; LIST THE TESTS
[44]176 N ZTMP
[41]177 D ZLOAD^GPLUNIT("ZTMP","GPLCCR")
178 D TLIST^GPLUNIT(.ZTMP)
179 Q
[44]180 ;
[43]181 ;;><TEST>
182 ;;><PROBLEMS>
183 ;;>>>K GPL S GPL=""
184 ;;>>>D CCRRPC^GPLCCR(.GPL,"2","PROBLEMS","","","")
185 ;;>>?@GPL@(@GPL@(0))["</Problems>"
186 ;;><VITALS>
187 ;;>>>K GPL S GPL=""
188 ;;>>>D CCRRPC^GPLCCR(.GPL,"2","VITALS","","","")
189 ;;>>?@GPL@(@GPL@(0))["</VitalSigns>"
190 ;;><CCR>
191 ;;>>>K GPL S GPL=""
192 ;;>>>D CCRRPC^GPLCCR(.GPL,"2","CCR","","","")
193 ;;>>?@GPL@(@GPL@(0))["</ContinuityOfCareRecord>"
194 ;;><ACTLST>
195 ;;>>>K GPL S GPL=""
196 ;;>>>D CCRRPC^GPLCCR(.GPL,"2","CCR","","","")
197 ;;>>>D ACTLST^GPLCCR(GPL,"ACTTEST")
[45]198 ;;><ACTORS>
199 ;;>>>D ZTEST^GPLCCR("ACTLST")
200 ;;>>>D QUERY^GPLXPATH(TGLOBAL,"//ContinuityOfCareRecord/Actors","G2")
[111]201 ;;>>>D EXTRACT^GPLACTOR("G2","ACTTEST","G3")
[46]202 ;;>>?G3(G3(0))["</Actors>"
[52]203 ;;><TRIM>
204 ;;>>>D ZTEST^GPLCCR("CCR")
205 ;;>>>W $$TRIM^GPLXPATH(CCRGLO)
Note: See TracBrowser for help on using the repository browser.