Changeset 1204 for ccr/trunk/p/C0CCCR.m
- Timestamp:
- Jun 23, 2011, 3:01:41 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
ccr/trunk/p/C0CCCR.m
r974 r1204 1 1 C0CCCR ; CCDCCR/GPL - CCR MAIN PROCESSING; 6/6/08 2 ;;1.0;C0C;;May 19, 2009; 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 2 ;;1.0;C0C;;May 19, 2009;Build 38 3 ;Copyright 2008,2009 George Lilly, University of Minnesota. 4 ;Licensed under the terms of the GNU General Public License. 5 ;See attached copy of the License. 6 ; 7 ;This program is free software; you can redistribute it and/or modify 8 ;it under the terms of the GNU General Public License as published by 9 ;the Free Software Foundation; either version 2 of the License, or 10 ;(at your option) any later version. 11 ; 12 ;This program is distributed in the hope that it will be useful, 13 ;but WITHOUT ANY WARRANTY; without even the implied warranty of 14 ;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 ;GNU General Public License for more details. 16 ; 17 ;You should have received a copy of the GNU General Public License along 18 ;with this program; if not, write to the Free Software Foundation, Inc., 19 ;51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 20 ; 21 ; EXPORT A CCR 22 ; 23 23 EXPORT ; EXPORT ENTRY POINT FOR CCR 24 25 26 27 28 29 30 31 XPAT(DFN,XPARMS,DIR,FN) 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 24 ; Select a patient. 25 S DIC=2,DIC(0)="AEMQ" D ^DIC 26 I Y<1 Q ; EXIT 27 S DFN=$P(Y,U,1) ; SET THE PATIENT 28 D XPAT(DFN) ; EXPORT TO A FILE 29 Q 30 ; 31 XPAT(DFN,XPARMS,DIR,FN) ; EXPORT ONE PATIENT TO A FILE 32 ; DIR IS THE DIRECTORY, DEFAULTS IF NULL TO ^TMP("C0CCCR","ODIR") 33 ; FN IS FILE NAME, DEFAULTS IF NULL 34 N CCRGLO,UDIR,UFN 35 S C0CNRPC=1 ; FLAG FOR NOT AN RPC CALL - FOR DEBUGGING THE RPC 36 I '$D(DIR) S UDIR="" 37 E S UDIR=DIR 38 I '$D(FN) S UFN="" ; IF FILENAME IS NOT PASSED 39 E S UFN=FN 40 I '$D(XPARMS) S XPARMS="" 41 N C0CRTN ; RETURN ARRAY 42 D CCRRPC(.C0CRTN,DFN,XPARMS,"CCR") 43 S OARY=$NA(^TMP("C0CCUR",$J,DFN,"CCR",1)) 44 S ONAM=UFN 45 I UFN="" S ONAM="PAT_"_DFN_"_CCR_V1_0_0.xml" 46 S ODIRGLB=$NA(^TMP("C0CCCR","ODIR")) 47 S ^TMP("C0CCCR","FNAME",DFN)=ONAM ; FILE NAME FOR BATCH USE 48 I $D(^TMP("GPLCCR","ODIR")) S @ODIRGLB=^TMP("GPLCCR","ODIR") 49 I '$D(@ODIRGLB) D ; IF NOT ODIR HAS BEEN SET 50 . W "Warning.. please set ^TMP(""C0CCCR"",""ODIR"")=""output path""",! Q 51 . ;S @ODIRGLB="/home/glilly/CCROUT" 52 . ;S @ODIRGLB="/home/cedwards/" 53 . S @ODIRGLB="/opt/wv/p/" 54 S ODIR=UDIR 55 I UDIR="" S ODIR=@ODIRGLB 56 N ZY 57 S ZY=$$OUTPUT^C0CXPATH(OARY,ONAM,ODIR) 58 W !,$P(ZY,U,2),! 59 Q 60 ; 61 61 DCCR(DFN) ; DISPLAY A CCR THAT HAS JUST BEEN EXTRACTED 62 63 64 65 66 67 68 69 62 ; 63 N G1 64 S G1=$NA(^TMP("C0CCUR",$J,DFN,"CCR")) 65 I $D(@G1@(0)) D ; CCR EXISTS 66 . D PARY^C0CXPATH(G1) 67 E W "CCR NOT CREATED, RUN D XPAT^C0CCCR(DFN,"""","""") FIRST",! 68 Q 69 ; 70 70 CCRRPC(CCRGRTN,DFN,CCRPARMS,CCRPART) ;RPC ENTRY POINT FOR CCR OUTPUT 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 71 ; CCRGRTN IS RETURN ARRAY PASSED BY REFERENCE 72 ; DFN IS PATIENT IEN 73 ; CCRPART IS "CCR" FOR ENTIRE CCR, OR SECTION NAME FOR A PART 74 ; OF THE CCR BODY.. PARTS INCLUDE "PROBLEMS" "VITALS" ETC 75 ; CCRPARMS ARE PARAMETERS THAT AFFECT THE EXTRACTION 76 ; IN THE FORM "PARM1:VALUE1^PARM2:VALUE2" 77 ; EXAMPLE: "LABLIMIT:T-60" TO LIMIT LAB EXTRACTION TO THE LAST 60 DAYS 78 ; SEE C0CPARMS FOR A COMPLETE LIST OF SUPPORTED PARAMETERS 79 K ^TMP("C0CCCR",$J) ; CLEAN UP THE GLOBAL BEFORE WE USE IT 80 M ^TMP("C0CSAV",$J)=^TMP($J) ; SAVING CALLER'S TMP SETTINGS 81 K ^TMP($J) ; START CLEAN 82 I '$D(DEBUG) S DEBUG=0 83 S CCD=0 ; NEED THIS FLAG TO DISTINGUISH FROM CCD 84 I '$D(CCRPARMS) S CCRPARMS="" 85 I '$D(CCRPART) S CCRPART="CCR" 86 I '$D(C0CNRPC) S ^TMP("C0CRPC",$H,"CALL",DFN)="" 87 D SET^C0CPARMS(CCRPARMS) ;SET PARAMETERS WITH CCRPARMS AS OVERRIDES 88 I '$D(TESTVIT) S TESTVIT=0 ; FLAG FOR TESTING VITALS 89 I '$D(TESTLAB) S TESTLAB=0 ; FLAG FOR TESTING RESULTS SECTION 90 I '$D(TESTALERT) S TESTALERT=1 ; FLAG FOR TESTING ALERTS SECTION 91 I '$D(TESTMEDS) S TESTMEDS=0 ; FLAG FOR TESTING C0CMED SECTION 92 S TGLOBAL=$NA(^TMP("C0CCCR",$J,"TEMPLATE")) ; GLOBAL FOR STORING TEMPLATE 93 S CCRGLO=$NA(^TMP("C0CCUR",$J,DFN,"CCR")) ; GLOBAL FOR BUILDING THE CCR 94 S ACTGLO=$NA(^TMP("C0CCCR",$J,DFN,"ACTORS")) ; GLOBAL FOR ALL ACTORS 95 ; TO GET PART OF THE CCR RETURNED, PASS CCRPART="PROBLEMS" ETC 96 ;M CCRGRTN=^TMP("C0CCCR",$J,DFN,CCRPART) ; RTN GLOBAL OF PART OR ALL 97 D LOAD^C0CCCR0(TGLOBAL) ; LOAD THE CCR TEMPLATE 98 D CP^C0CXPATH(TGLOBAL,CCRGLO) ; COPY THE TEMPLATE TO CCR GLOBAL 99 ; 100 ; DELETE THE BODY, ACTORS AND SIGNATURES SECTIONS FROM GLOBAL 101 ; THESE WILL BE POPULATED AFTER CALLS TO THE XPATH ROUTINES 102 D REPLACE^C0CXPATH(CCRGLO,"","//ContinuityOfCareRecord/Body") 103 D REPLACE^C0CXPATH(CCRGLO,"","//ContinuityOfCareRecord/Actors") 104 D REPLACE^C0CXPATH(CCRGLO,"","//ContinuityOfCareRecord/Signatures") 105 I DEBUG F I=1:1:@CCRGLO@(0) W @CCRGLO@(I),! 106 ; 107 D HDRMAP(CCRGLO,DFN) ; MAP HEADER VARIABLES 108 ; 109 K ^TMP("C0CCCR",$J,"CCRSTEP") ; KILL GLOBAL PRIOR TO ADDING TO IT 110 S CCRXTAB=$NA(^TMP("C0CCCR",$J,"CCRSTEP")) ; GLOBAL TO STORE CCR STEPS 111 D INITSTPS(CCRXTAB) ; INITIALIZED CCR PROCESSING STEPS 112 N PROCI,XI,TAG,RTN,CALL,XPATH,IXML,OXML,INXML,CCRBLD 113 F PROCI=1:1:@CCRXTAB@(0) D ; PROCESS THE CCR BODY SECTIONS 114 . S XI=@CCRXTAB@(PROCI) ; CALL COPONENTS TO PARSE 115 . S RTN=$P(XI,";",2) ; NAME OF ROUTINE TO CALL 116 . S TAG=$P(XI,";",1) ; LABEL INSIDE ROUTINE TO CALL 117 . S XPATH=$P(XI,";",3) ; XPATH TO XML TO PASS TO ROUTINE 118 . D QUERY^C0CXPATH(TGLOBAL,XPATH,"INXML") ; EXTRACT XML TO PASS 119 . S IXML="INXML" 120 . S OXML=$P(XI,";",4) ; ARRAY FOR SECTION VALUES 121 . ; K @OXML ; KILL EXPECTED OUTPUT ARRAY 122 . ; W OXML,! 123 . S CALL="D "_TAG_"^"_RTN_"(IXML,DFN,OXML)" ; SETUP THE CALL 124 . W "RUNNING ",CALL,! 125 . X CALL 126 . ; NOW INSERT THE RESULTS IN THE CCR BUFFER 127 . I $G(@OXML@(0))>0 D ; THERE IS A RESULT 128 . . D INSERT^C0CXPATH(CCRGLO,OXML,"//ContinuityOfCareRecord/Body") 129 . . I DEBUG F C0CI=1:1:@OXML@(0) W @OXML@(C0CI),! 130 N ACTT,ATMP,ACTT2,ATMP2 ; TEMPORARY ARRAY SYMBOLS FOR ACTOR PROCESSING 131 D ACTLST^C0CCCR(CCRGLO,ACTGLO) ; GEN THE ACTOR LIST 132 D QUERY^C0CXPATH(TGLOBAL,"//ContinuityOfCareRecord/Actors","ACTT") 133 D EXTRACT^C0CACTOR("ACTT",ACTGLO,"ACTT2") 134 D INSINNER^C0CXPATH(CCRGLO,"ACTT2","//ContinuityOfCareRecord/Actors") 135 K ACTT,ACTT2 136 D QUERY^C0CXPATH(TGLOBAL,"//ContinuityOfCareRecord/Comments","CMTT") 137 D EXTRACT^C0CCMT("CMTT",DFN,"CMTT2") 138 D INSINNER^C0CXPATH(CCRGLO,"CMTT2","//ContinuityOfCareRecord/Comments") 139 K CMTT,CMTT2 140 N TRIMI,J,DONE S DONE=0 141 F TRIMI=0:0 D Q:DONE ; DELETE UNTIL ALL EMPTY ELEMENTS ARE GONE 142 . S J=$$TRIM^C0CXPATH(CCRGLO) ; DELETE EMPTY ELEMENTS 143 . I DEBUG W "TRIMMED",J,! 144 . I J=0 S DONE=1 ; DONE WHEN TRIM RETURNS FALSE 145 ;S CCRGRTN=$NA(^TMP("C0CCCR",$J,DFN,CCRPART)) ; RTN GLOBAL OF PART OR ALL 146 I CCRPART="CCR" M CCRGRTN=@CCRGLO ; ENTIRE CCR 147 E M CCRGRTN=^TMP("C0CCCR",$J,DFN,CCRPART) ; RTN GLOBAL OF PART 148 I '$D(C0CNRPC) S ^TMP("C0CRPC",$H,"RESULT",CCRGRTN(0))="" 149 K ^TMP("C0CCCR",$J) ; BEGIN TO CLEAN UP 150 K ^TMP($J) ; REALLY CLEAN UP 151 M ^TMP($J)=^TMP("C0CSAV",$J) ; RESTORE CALLER'S $J 152 Q 153 ; 154 154 INITSTPS(TAB) ; INITIALIZE CCR PROCESSING STEPS 155 156 157 158 159 160 161 162 163 164 165 166 167 168 155 ; TAB IS PASSED BY NAME 156 I DEBUG W "TAB= ",TAB,! 157 ; ORDER FOR CCR IS PROBLEMS,FAMILYHISTORY,SOCIALHISTORY,MEDICATIONS,VITALSIGNS,RESULTS,HEALTHCAREPROVIDERS 158 D PUSH^C0CXPATH(TAB,"EXTRACT;C0CPROBS;//ContinuityOfCareRecord/Body/Problems;^TMP(""C0CCCR"",$J,DFN,""PROBLEMS"")") 159 I TESTALERT D PUSH^C0CXPATH(TAB,"EXTRACT;C0CALERT;//ContinuityOfCareRecord/Body/Alerts;^TMP(""C0CCCR"",$J,DFN,""ALERTS"")") 160 D PUSH^C0CXPATH(TAB,"EXTRACT;C0CMED;//ContinuityOfCareRecord/Body/Medications;^TMP(""C0CCCR"",$J,DFN,""MEDICATIONS"")") 161 D PUSH^C0CXPATH(TAB,"MAP;C0CIMMU;//ContinuityOfCareRecord/Body/Immunizations;^TMP(""C0CCCR"",$J,DFN,""IMMUNE"")") 162 I TESTVIT D PUSH^C0CXPATH(TAB,"EXTRACT;C0CVIT2;//ContinuityOfCareRecord/Body/VitalSigns;^TMP(""C0CCCR"",$J,DFN,""VITALS"")") 163 E D PUSH^C0CXPATH(TAB,"EXTRACT;C0CVITAL;//ContinuityOfCareRecord/Body/VitalSigns;^TMP(""C0CCCR"",$J,DFN,""VITALS"")") 164 D PUSH^C0CXPATH(TAB,"MAP;C0CLABS;//ContinuityOfCareRecord/Body/Results;^TMP(""C0CCCR"",$J,DFN,""RESULTS"")") 165 D PUSH^C0CXPATH(TAB,"EXTRACT;C0CPROC;//ContinuityOfCareRecord/Body/Procedures;^TMP(""C0CCCR"",$J,DFN,""PROCEDURES"")") 166 D PUSH^C0CXPATH(TAB,"EXTRACT;C0CENC;//ContinuityOfCareRecord/Body/Encounters;^TMP(""C0CCCR"",$J,DFN,""ENCOUNTERS"")") 167 Q 168 ; 169 169 HDRMAP(CXML,DFN) ; MAP HEADER VARIABLES: FROM, TO ECT 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 170 N VMAP S VMAP=$NA(^TMP("C0CCCR",$J,DFN,"HEADER")) 171 ; K @VMAP 172 S @VMAP@("DATETIME")=$$FMDTOUTC^C0CUTIL($$NOW^XLFDT,"DT") 173 ; I IHDR="" D ; HEADER ARRAY IS NOT PROVIDED, USE DEFAULTS 174 D ; ALWAYS MAP THESE VARIABLES 175 . S @VMAP@("CCRDOCOBJECTID")=$$UUID^C0CUTIL ; UUID FOR THIS CCR 176 . S @VMAP@("ACTORPATIENT")="ACTORPATIENT_"_DFN 177 . S @VMAP@("ACTORFROM")="ACTORPROVIDER_"_DUZ ; FROM DUZ - FROM PROVIDER 178 . ;S @VMAP@("ACTORFROM")="ACTORORGANIZATION_"_DUZ ; FROM DUZ - ??? 179 . S @VMAP@("ACTORFROM2")="ACTORSYSTEM_1" ; SECOND FROM IS THE SYSTEM 180 . S @VMAP@("ACTORTO")="ACTORPATIENT_"_DFN ; FOR TEST PURPOSES 181 . S @VMAP@("PURPOSEDESCRIPTION")="CEND PHR" ; FOR TEST PURPOSES 182 . S @VMAP@("ACTORTOTEXT")="Patient" ; FOR TEST PURPOSES 183 . ; THIS IS THE USE CASE FOR THE PHR WHERE "TO" IS THE PATIENT 184 ;I IHDR'="" D ; HEADER VALUES ARE PROVIDED 185 ;. D CP^C0CXPATH(IHDR,VMAP) ; COPY HEADER VARIABLES TO MAP ARRAY 186 N CTMP 187 D MAP^C0CXPATH(CXML,VMAP,"CTMP") 188 D CP^C0CXPATH("CTMP",CXML) 189 N HRIMVARS ; 190 S HRIMVARS=$NA(^TMP("C0CRIM","VARS",DFN,"HEADER")) ; TO PERSIST VARS 191 M @HRIMVARS@(1)=@VMAP ; PERSIST THE HEADER VARIABLES IN RIM TABLE 192 S @HRIMVARS@(0)=1 ; ONLY ONE SET OF HEADERS PER PATIENT 193 Q 194 ; 195 195 ACTLST(AXML,ACTRTN) ; RETURN THE ACTOR LIST FOR THE XML IN AXML 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 196 ; AXML AND ACTRTN ARE PASSED BY NAME 197 ; EACH ACTOR RECORD HAS 3 PARTS - IE IF OBJECTID=ACTORPATIENT_2 198 ; P1= OBJECTID - ACTORPATIENT_2 199 ; P2= OBJECT TYPE - PATIENT OR PROVIDER OR SOFTWARE 200 ;OR INSTITUTION 201 ; OR PERSON(IN PATIENT FILE IE NOK) 202 ; P3= IEN RECORD NUMBER FOR ACTOR - 2 203 N I,J,K,L 204 K @ACTRTN ; CLEAR RETURN ARRAY 205 F I=1:1:@AXML@(0) D ; FIRST FIX MISSING LINKS 206 . I @AXML@(I)?.E1"_<".E D ; 207 . . N ZA,ZB 208 . . S ZA=$P(@AXML@(I),">",1)_">" 209 . . S ZB="<"_$P(@AXML@(I),"<",3) 210 . . S @AXML@(I)=ZA_"ACTORORGANIZATION_1"_ZB 211 F I=1:1:@AXML@(0) D ; SCAN ALL LINES 212 . I @AXML@(I)?.E1"<ActorID>".E D ; THERE IS AN ACTOR THIS LINE 213 . . S J=$P($P(@AXML@(I),"<ActorID>",2),"</ActorID>",1) 214 . . I $G(LINKDEBUG) W "<ActorID>=>",J,! 215 . . I J'="" S K(J)="" ; HASHING ACTOR 216 . I @AXML@(I)?.E1"<LinkID>".E D ; THERE IS AN ACTOR THIS LINE 217 . . S J=$P($P(@AXML@(I),"<LinkID>",2),"</LinkID>",1) 218 . . I $G(LINKDEBUG) W "<LinkID>=>",J,! 219 . . I J'="" S K(J)="" ; HASHING ACTOR 220 . . ; TO GET RID OF DUPLICATES 221 S I="" ; GOING TO $O THROUGH THE HASH 222 F J=0:0 D Q:$O(K(I))="" 223 . S I=$O(K(I)) ; WALK THROUGH THE HASH OF ACTORS 224 . S $P(L,U,1)=I ; FIRST PIECE IS THE OBJECT ID 225 . S $P(L,U,2)=$P($P(I,"ACTOR",2),"_",1) ; ACTOR TYPE 226 . S $P(L,U,3)=$P(I,"_",2) ; IEN RECORD NUMBER FOR ACTOR 227 . D PUSH^C0CXPATH(ACTRTN,L) ; ADD THE ACTOR TO THE RETURN ARRAY 228 Q 229 ; 230 230 TEST ; RUN ALL THE TEST CASES 231 232 233 231 D TESTALL^C0CUNIT("C0CCCR") 232 Q 233 ; 234 234 ZTEST(WHICH) ; RUN ONE SET OF TESTS 235 236 237 238 239 235 N ZTMP 236 D ZLOAD^C0CUNIT("ZTMP","C0CCCR") 237 D ZTEST^C0CUNIT(.ZTMP,WHICH) 238 Q 239 ; 240 240 TLIST ; LIST THE TESTS 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 241 N ZTMP 242 D ZLOAD^C0CUNIT("ZTMP","C0CCCR") 243 D TLIST^C0CUNIT(.ZTMP) 244 Q 245 ; 246 ;;><TEST> 247 ;;><PROBLEMS> 248 ;;>>>K C0C S C0C="" 249 ;;>>>D CCRRPC^C0CCCR(.C0C,"2","PROBLEMS","") 250 ;;>>?@C0C@(@C0C@(0))["</Problems>" 251 ;;><VITALS> 252 ;;>>>K C0C S C0C="" 253 ;;>>>D CCRRPC^C0CCCR(.C0C,"2","VITALS","") 254 ;;>>?@C0C@(@C0C@(0))["</VitalSigns>" 255 ;;><CCR> 256 ;;>>>K C0C S C0C="" 257 ;;>>>D CCRRPC^C0CCCR(.C0C,"2","CCR","") 258 ;;>>?@C0C@(@C0C@(0))["</ContinuityOfCareRecord>" 259 ;;><ACTLST> 260 ;;>>>K C0C S C0C="" 261 ;;>>>D CCRRPC^C0CCCR(.C0C,"2","CCR","") 262 ;;>>>D ACTLST^C0CCCR(C0C,"ACTTEST") 263 ;;><ACTORS> 264 ;;>>>D ZTEST^C0CCCR("ACTLST") 265 ;;>>>D QUERY^C0CXPATH(TGLOBAL,"//ContinuityOfCareRecord/Actors","G2") 266 ;;>>>D EXTRACT^C0CACTOR("G2","ACTTEST","G3") 267 ;;>>?G3(G3(0))["</Actors>" 268 ;;><TRIM> 269 ;;>>>D ZTEST^C0CCCR("CCR") 270 ;;>>>W $$TRIM^C0CXPATH(CCRGLO) 271 ;;><ALERTS> 272 ;;>>>S TESTALERT=1 273 ;;>>>K C0C S C0C="" 274 ;;>>>D CCRRPC^C0CCCR(.C0C,"2","ALERTS","") 275 ;;>>?@C0C@(@C0C@(0))["</Alerts>" 276 277
Note:
See TracChangeset
for help on using the changeset viewer.