Changeset 1336 for ccr/trunk/p/C0CCCR.m
- Timestamp:
- Jan 4, 2012, 9:39:08 PM (14 years ago)
- File:
-
- 1 edited
-
ccr/trunk/p/C0CCCR.m (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
ccr/trunk/p/C0CCCR.m
r1331 r1336 1 C0CCCR ; CCDCCR/GPL - CCR MAIN PROCESSING; 6/6/082 ;;1.0;C0C;;May 19, 2009;Build 383 ;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 modify8 ;it under the terms of the GNU General Public License as published by9 ;the Free Software Foundation; either version 2 of the License, or10 ;(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 of14 ;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the15 ;GNU General Public License for more details.16 ;17 ;You should have received a copy of the GNU General Public License along18 ;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 CCR22 ;23 EXPORT ; EXPORT ENTRY POINT FOR CCR24 ; Select a patient.25 S DIC=2,DIC(0)="AEMQ" D ^DIC26 I Y<1 Q ; EXIT27 S DFN=$P(Y,U,1) ; SET THE PATIENT28 D XPAT(DFN) ; EXPORT TO A FILE29 Q30 ;31 XPAT(DFN,XPARMS,DIR,FN) ; EXPORT ONE PATIENT TO A FILE32 ; DIR IS THE DIRECTORY, DEFAULTS IF NULL TO ^TMP("C0CCCR","ODIR")33 ; FN IS FILE NAME, DEFAULTS IF NULL34 N CCRGLO,UDIR,UFN35 S C0CNRPC=1 ; FLAG FOR NOT AN RPC CALL - FOR DEBUGGING THE RPC36 I '$D(DIR) S UDIR=""37 E S UDIR=DIR38 I '$D(FN) S UFN="" ; IF FILENAME IS NOT PASSED39 E S UFN=FN40 I '$D(XPARMS) S XPARMS=""41 N C0CRTN ; RETURN ARRAY42 D CCRRPC(.C0CRTN,DFN,XPARMS,"CCR")43 S OARY=$NA(^TMP("C0CCUR",$J,DFN,"CCR",1))44 S ONAM=UFN45 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 USE48 I $D(^TMP("GPLCCR","ODIR")) S @ODIRGLB=^TMP("GPLCCR","ODIR")49 I '$D(@ODIRGLB) D ; IF NOT ODIR HAS BEEN SET50 . W "Warning.. please set ^TMP(""C0CCCR"",""ODIR"")=""output path""",! Q51 . ;S @ODIRGLB="/home/glilly/CCROUT"52 . ;S @ODIRGLB="/home/cedwards/"53 . S @ODIRGLB="/opt/wv/p/"54 S ODIR=UDIR55 I UDIR="" S ODIR=@ODIRGLB56 N ZY57 S ZY=$$OUTPUT^C0CXPATH(OARY,ONAM,ODIR)58 W !,$P(ZY,U,2),!59 Q60 ;61 DCCR(DFN) ; DISPLAY A CCR THAT HAS JUST BEEN EXTRACTED62 ;63 N G164 S G1=$NA(^TMP("C0CCUR",$J,DFN,"CCR"))65 I $D(@G1@(0)) D ; CCR EXISTS66 . D PARY^C0CXPATH(G1)67 E W "CCR NOT CREATED, RUN D XPAT^C0CCCR(DFN,"""","""") FIRST",!68 Q69 ;70 CCRRPC(CCRGRTN,DFN,CCRPARMS,CCRPART) ;RPC ENTRY POINT FOR CCR OUTPUT71 ; CCRGRTN IS RETURN ARRAY PASSED BY REFERENCE72 ; DFN IS PATIENT IEN73 ; CCRPART IS "CCR" FOR ENTIRE CCR, OR SECTION NAME FOR A PART74 ; OF THE CCR BODY.. PARTS INCLUDE "PROBLEMS" "VITALS" ETC75 ; CCRPARMS ARE PARAMETERS THAT AFFECT THE EXTRACTION76 ; IN THE FORM "PARM1:VALUE1^PARM2:VALUE2"77 ; EXAMPLE: "LABLIMIT:T-60" TO LIMIT LAB EXTRACTION TO THE LAST 60 DAYS78 ; SEE C0CPARMS FOR A COMPLETE LIST OF SUPPORTED PARAMETERS79 K ^TMP("C0CCCR",$J) ; CLEAN UP THE GLOBAL BEFORE WE USE IT80 M ^TMP("C0CSAV",$J)=^TMP($J) ; SAVING CALLER'S TMP SETTINGS81 K ^TMP($J) ; START CLEAN82 I '$D(DEBUG) S DEBUG=083 S CCD=0 ; NEED THIS FLAG TO DISTINGUISH FROM CCD84 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 OVERRIDES88 I '$D(TESTVIT) S TESTVIT=0 ; FLAG FOR TESTING VITALS89 I '$D(TESTLAB) S TESTLAB=0 ; FLAG FOR TESTING RESULTS SECTION90 I '$D(TESTALERT) S TESTALERT=1 ; FLAG FOR TESTING ALERTS SECTION91 I '$D(TESTMEDS) S TESTMEDS=0 ; FLAG FOR TESTING C0CMED SECTION92 S TGLOBAL=$NA(^TMP("C0CCCR",$J,"TEMPLATE")) ; GLOBAL FOR STORING TEMPLATE93 S CCRGLO=$NA(^TMP("C0CCUR",$J,DFN,"CCR")) ; GLOBAL FOR BUILDING THE CCR94 S ACTGLO=$NA(^TMP("C0CCCR",$J,DFN,"ACTORS")) ; GLOBAL FOR ALL ACTORS95 ; TO GET PART OF THE CCR RETURNED, PASS CCRPART="PROBLEMS" ETC96 ;M CCRGRTN=^TMP("C0CCCR",$J,DFN,CCRPART) ; RTN GLOBAL OF PART OR ALL97 D LOAD^C0CCCR0(TGLOBAL) ; LOAD THE CCR TEMPLATE98 D CP^C0CXPATH(TGLOBAL,CCRGLO) ; COPY THE TEMPLATE TO CCR GLOBAL99 ;100 ; DELETE THE BODY, ACTORS AND SIGNATURES SECTIONS FROM GLOBAL101 ; THESE WILL BE POPULATED AFTER CALLS TO THE XPATH ROUTINES102 D REPLACE^C0CXPATH(CCRGLO,"","//ContinuityOfCareRecord/Body")103 D REPLACE^C0CXPATH(CCRGLO,"","//ContinuityOfCareRecord/Actors")104 D REPLACE^C0CXPATH(CCRGLO,"","//ContinuityOfCareRecord/Signatures")105 D REPLACE^C0CXPATH(CCRGLO,"","//ContinuityOfCareRecord/Comments")106 I DEBUG F I=1:1:@CCRGLO@(0) W @CCRGLO@(I),!107 ;108 D HDRMAP(CCRGLO,DFN) ; MAP HEADER VARIABLES109 ;110 K ^TMP("C0CCCR",$J,"CCRSTEP") ; KILL GLOBAL PRIOR TO ADDING TO IT111 S CCRXTAB=$NA(^TMP("C0CCCR",$J,"CCRSTEP")) ; GLOBAL TO STORE CCR STEPS112 D INITSTPS(CCRXTAB) ; INITIALIZED CCR PROCESSING STEPS113 N PROCI,XI,TAG,RTN,CALL,XPATH,IXML,OXML,INXML,CCRBLD114 F PROCI=1:1:@CCRXTAB@(0) D ; PROCESS THE CCR BODY SECTIONS115 . S XI=@CCRXTAB@(PROCI) ; CALL COPONENTS TO PARSE116 . S RTN=$P(XI,";",2) ; NAME OF ROUTINE TO CALL117 . S TAG=$P(XI,";",1) ; LABEL INSIDE ROUTINE TO CALL118 . S XPATH=$P(XI,";",3) ; XPATH TO XML TO PASS TO ROUTINE119 . D QUERY^C0CXPATH(TGLOBAL,XPATH,"INXML") ; EXTRACT XML TO PASS120 . S IXML="INXML"121 . S OXML=$P(XI,";",4) ; ARRAY FOR SECTION VALUES122 . ; K @OXML ; KILL EXPECTED OUTPUT ARRAY123 . ; W OXML,!124 . S CALL="D "_TAG_"^"_RTN_"(IXML,DFN,OXML)" ; SETUP THE CALL125 . W "RUNNING ",CALL,!126 . X CALL127 . ; NOW INSERT THE RESULTS IN THE CCR BUFFER128 . I $G(@OXML@(0))>0 D ; THERE IS A RESULT129 . . D INSERT^C0CXPATH(CCRGLO,OXML,"//ContinuityOfCareRecord/Body")130 . . I DEBUG F C0CI=1:1:@OXML@(0) W @OXML@(C0CI),!131 N ACTT,ATMP,ACTT2,ATMP2 ; TEMPORARY ARRAY SYMBOLS FOR ACTOR PROCESSING132 D ACTLST^C0CCCR(CCRGLO,ACTGLO) ; GEN THE ACTOR LIST133 D QUERY^C0CXPATH(TGLOBAL,"//ContinuityOfCareRecord/Actors","ACTT")134 D EXTRACT^C0CACTOR("ACTT",ACTGLO,"ACTT2")135 D INSINNER^C0CXPATH(CCRGLO,"ACTT2","//ContinuityOfCareRecord/Actors")136 K ACTT,ACTT2137 ;D QUERY^C0CXPATH(TGLOBAL,"//ContinuityOfCareRecord/Comments","CMTT")138 ;D EXTRACT^C0CCMT("CMTT",DFN,"CMTT2")139 ;D INSINNER^C0CXPATH(CCRGLO,"CMTT2","//ContinuityOfCareRecord/Comments")140 ; gpl - turned off Comments for Certification141 K CMTT,CMTT2142 N TRIMI,J,DONE S DONE=0143 F TRIMI=0:0 D Q:DONE ; DELETE UNTIL ALL EMPTY ELEMENTS ARE GONE144 . S J=$$TRIM^C0CXPATH(CCRGLO) ; DELETE EMPTY ELEMENTS145 . I DEBUG W "TRIMMED",J,!146 . I J=0 S DONE=1 ; DONE WHEN TRIM RETURNS FALSE147 ;S CCRGRTN=$NA(^TMP("C0CCCR",$J,DFN,CCRPART)) ; RTN GLOBAL OF PART OR ALL148 I CCRPART="CCR" M CCRGRTN=@CCRGLO ; ENTIRE CCR149 E M CCRGRTN=^TMP("C0CCCR",$J,DFN,CCRPART) ; RTN GLOBAL OF PART150 I '$D(C0CNRPC) S ^TMP("C0CRPC",$H,"RESULT",CCRGRTN(0))=""151 K ^TMP("C0CCCR",$J) ; BEGIN TO CLEAN UP152 K ^TMP($J) ; REALLY CLEAN UP153 M ^TMP($J)=^TMP("C0CSAV",$J) ; RESTORE CALLER'S $J154 Q155 ;156 INITSTPS(TAB) ; INITIALIZE CCR PROCESSING STEPS157 ; TAB IS PASSED BY NAME158 I DEBUG W "TAB= ",TAB,!159 ; ORDER FOR CCR IS PROBLEMS,FAMILYHISTORY,SOCIALHISTORY,MEDICATIONS,VITALSIGNS,RESULTS,HEALTHCAREPROVIDERS160 D PUSH^C0CXPATH(TAB,"EXTRACT;C0CPROBS;//ContinuityOfCareRecord/Body/Problems;^TMP(""C0CCCR"",$J,DFN,""PROBLEMS"")")161 I TESTALERT D PUSH^C0CXPATH(TAB,"EXTRACT;C0CALERT;//ContinuityOfCareRecord/Body/Alerts;^TMP(""C0CCCR"",$J,DFN,""ALERTS"")")162 D PUSH^C0CXPATH(TAB,"EXTRACT;C0CMED;//ContinuityOfCareRecord/Body/Medications;^TMP(""C0CCCR"",$J,DFN,""MEDICATIONS"")")163 D PUSH^C0CXPATH(TAB,"MAP;C0CIMMU;//ContinuityOfCareRecord/Body/Immunizations;^TMP(""C0CCCR"",$J,DFN,""IMMUNE"")")164 I TESTVIT D PUSH^C0CXPATH(TAB,"EXTRACT;C0CVIT2;//ContinuityOfCareRecord/Body/VitalSigns;^TMP(""C0CCCR"",$J,DFN,""VITALS"")")165 E D PUSH^C0CXPATH(TAB,"EXTRACT;C0CVITAL;//ContinuityOfCareRecord/Body/VitalSigns;^TMP(""C0CCCR"",$J,DFN,""VITALS"")")166 D PUSH^C0CXPATH(TAB,"MAP;C0CLABS;//ContinuityOfCareRecord/Body/Results;^TMP(""C0CCCR"",$J,DFN,""RESULTS"")")167 D PUSH^C0CXPATH(TAB,"EXTRACT;C0CPROC;//ContinuityOfCareRecord/Body/Procedures;^TMP(""C0CCCR"",$J,DFN,""PROCEDURES"")")168 ;D PUSH^C0CXPATH(TAB,"EXTRACT;C0CENC;//ContinuityOfCareRecord/Body/Encounters;^TMP(""C0CCCR"",$J,DFN,""ENCOUNTERS"")")169 ; gpl - turned off Encounters for Certification170 Q171 ;172 HDRMAP(CXML,DFN) ; MAP HEADER VARIABLES: FROM, TO ECT173 N VMAP S VMAP=$NA(^TMP("C0CCCR",$J,DFN,"HEADER"))174 ; K @VMAP175 S @VMAP@("DATETIME")=$$FMDTOUTC^C0CUTIL($$NOW^XLFDT,"DT")176 ; I IHDR="" D ; HEADER ARRAY IS NOT PROVIDED, USE DEFAULTS177 D ; ALWAYS MAP THESE VARIABLES178 . S @VMAP@("CCRDOCOBJECTID")=$$UUID^C0CUTIL ; UUID FOR THIS CCR179 . S @VMAP@("ACTORPATIENT")="ACTORPATIENT_"_DFN180 . S @VMAP@("ACTORFROM")="ACTORPROVIDER_"_DUZ ; FROM DUZ - FROM PROVIDER181 . ;S @VMAP@("ACTORFROM")="ACTORORGANIZATION_"_DUZ ; FROM DUZ - ???182 . S @VMAP@("ACTORFROM2")="ACTORSYSTEM_1" ; SECOND FROM IS THE SYSTEM183 . S @VMAP@("ACTORTO")="ACTORPATIENT_"_DFN ; FOR TEST PURPOSES184 . S @VMAP@("PURPOSEDESCRIPTION")="CEND PHR" ; FOR TEST PURPOSES185 . S @VMAP@("ACTORTOTEXT")="Patient" ; FOR TEST PURPOSES186 . ; THIS IS THE USE CASE FOR THE PHR WHERE "TO" IS THE PATIENT187 ;I IHDR'="" D ; HEADER VALUES ARE PROVIDED188 ;. D CP^C0CXPATH(IHDR,VMAP) ; COPY HEADER VARIABLES TO MAP ARRAY189 N CTMP190 D MAP^C0CXPATH(CXML,VMAP,"CTMP")191 D CP^C0CXPATH("CTMP",CXML)192 N HRIMVARS ;193 S HRIMVARS=$NA(^TMP("C0CRIM","VARS",DFN,"HEADER")) ; TO PERSIST VARS194 M @HRIMVARS@(1)=@VMAP ; PERSIST THE HEADER VARIABLES IN RIM TABLE195 S @HRIMVARS@(0)=1 ; ONLY ONE SET OF HEADERS PER PATIENT196 Q197 ;198 ACTLST(AXML,ACTRTN) ; RETURN THE ACTOR LIST FOR THE XML IN AXML199 ; AXML AND ACTRTN ARE PASSED BY NAME200 ; EACH ACTOR RECORD HAS 3 PARTS - IE IF OBJECTID=ACTORPATIENT_2201 ; P1= OBJECTID - ACTORPATIENT_2202 ; P2= OBJECT TYPE - PATIENT OR PROVIDER OR SOFTWARE203 ;OR INSTITUTION204 ; OR PERSON(IN PATIENT FILE IE NOK)205 ; P3= IEN RECORD NUMBER FOR ACTOR - 2206 N I,J,K,L207 K @ACTRTN ; CLEAR RETURN ARRAY208 F I=1:1:@AXML@(0) D ; FIRST FIX MISSING LINKS209 . I @AXML@(I)?.E1"_<".E D ;210 . . N ZA,ZB211 . . S ZA=$P(@AXML@(I),">",1)_">"212 . . S ZB="<"_$P(@AXML@(I),"<",3)213 . . S @AXML@(I)=ZA_"ACTORORGANIZATION_1"_ZB214 F I=1:1:@AXML@(0) D ; SCAN ALL LINES215 . I @AXML@(I)?.E1"<ActorID>".E D ; THERE IS AN ACTOR THIS LINE216 . . S J=$P($P(@AXML@(I),"<ActorID>",2),"</ActorID>",1)217 . . I $G(LINKDEBUG) W "<ActorID>=>",J,!218 . . I J'="" S K(J)="" ; HASHING ACTOR219 . I @AXML@(I)?.E1"<LinkID>".E D ; THERE IS AN ACTOR THIS LINE220 . . S J=$P($P(@AXML@(I),"<LinkID>",2),"</LinkID>",1)221 . . I $G(LINKDEBUG) W "<LinkID>=>",J,!222 . . I J'="" S K(J)="" ; HASHING ACTOR223 . . ; TO GET RID OF DUPLICATES224 S I="" ; GOING TO $O THROUGH THE HASH225 F J=0:0 D Q:$O(K(I))=""226 . S I=$O(K(I)) ; WALK THROUGH THE HASH OF ACTORS227 . S $P(L,U,1)=I ; FIRST PIECE IS THE OBJECT ID228 . S $P(L,U,2)=$P($P(I,"ACTOR",2),"_",1) ; ACTOR TYPE229 . S $P(L,U,3)=$P(I,"_",2) ; IEN RECORD NUMBER FOR ACTOR230 . D PUSH^C0CXPATH(ACTRTN,L) ; ADD THE ACTOR TO THE RETURN ARRAY231 Q232 ;233 TEST ; RUN ALL THE TEST CASES234 D TESTALL^C0CUNIT("C0CCCR")235 Q236 ;237 ZTEST(WHICH) ; RUN ONE SET OF TESTS238 N ZTMP239 D ZLOAD^C0CUNIT("ZTMP","C0CCCR")240 D ZTEST^C0CUNIT(.ZTMP,WHICH)241 Q242 ;243 TLIST ; LIST THE TESTS244 N ZTMP245 D ZLOAD^C0CUNIT("ZTMP","C0CCCR")246 D TLIST^C0CUNIT(.ZTMP)247 Q248 ;249 ;;><TEST>250 ;;><PROBLEMS>251 ;;>>>K C0C S C0C=""252 ;;>>>D CCRRPC^C0CCCR(.C0C,"2","PROBLEMS","")253 ;;>>?@C0C@(@C0C@(0))["</Problems>"254 ;;><VITALS>255 ;;>>>K C0C S C0C=""256 ;;>>>D CCRRPC^C0CCCR(.C0C,"2","VITALS","")257 ;;>>?@C0C@(@C0C@(0))["</VitalSigns>"258 ;;><CCR>259 ;;>>>K C0C S C0C=""260 ;;>>>D CCRRPC^C0CCCR(.C0C,"2","CCR","")261 ;;>>?@C0C@(@C0C@(0))["</ContinuityOfCareRecord>"262 ;;><ACTLST>263 ;;>>>K C0C S C0C=""264 ;;>>>D CCRRPC^C0CCCR(.C0C,"2","CCR","")265 ;;>>>D ACTLST^C0CCCR(C0C,"ACTTEST")266 ;;><ACTORS>267 ;;>>>D ZTEST^C0CCCR("ACTLST")268 ;;>>>D QUERY^C0CXPATH(TGLOBAL,"//ContinuityOfCareRecord/Actors","G2")269 ;;>>>D EXTRACT^C0CACTOR("G2","ACTTEST","G3")270 ;;>>?G3(G3(0))["</Actors>"271 ;;><TRIM>272 ;;>>>D ZTEST^C0CCCR("CCR")273 ;;>>>W $$TRIM^C0CXPATH(CCRGLO)274 ;;><ALERTS>275 ;;>>>S TESTALERT=1276 ;;>>>K C0C S C0C=""277 ;;>>>D CCRRPC^C0CCCR(.C0C,"2","ALERTS","")278 ;;>>?@C0C@(@C0C@(0))["</Alerts>"279 280 1 C0CCCR ; CCDCCR/GPL - CCR MAIN PROCESSING; 6/6/08 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 EXPORT ; EXPORT ENTRY POINT FOR CCR 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 DCCR(DFN) ; DISPLAY A CCR THAT HAS JUST BEEN EXTRACTED 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 CCRRPC(CCRGRTN,DFN,CCRPARMS,CCRPART) ;RPC ENTRY POINT FOR CCR OUTPUT 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 D REPLACE^C0CXPATH(CCRGLO,"","//ContinuityOfCareRecord/Comments") 106 I DEBUG F I=1:1:@CCRGLO@(0) W @CCRGLO@(I),! 107 ; 108 D HDRMAP(CCRGLO,DFN) ; MAP HEADER VARIABLES 109 ; 110 K ^TMP("C0CCCR",$J,"CCRSTEP") ; KILL GLOBAL PRIOR TO ADDING TO IT 111 S CCRXTAB=$NA(^TMP("C0CCCR",$J,"CCRSTEP")) ; GLOBAL TO STORE CCR STEPS 112 D INITSTPS(CCRXTAB) ; INITIALIZED CCR PROCESSING STEPS 113 N PROCI,XI,TAG,RTN,CALL,XPATH,IXML,OXML,INXML,CCRBLD 114 F PROCI=1:1:@CCRXTAB@(0) D ; PROCESS THE CCR BODY SECTIONS 115 . S XI=@CCRXTAB@(PROCI) ; CALL COPONENTS TO PARSE 116 . S RTN=$P(XI,";",2) ; NAME OF ROUTINE TO CALL 117 . S TAG=$P(XI,";",1) ; LABEL INSIDE ROUTINE TO CALL 118 . S XPATH=$P(XI,";",3) ; XPATH TO XML TO PASS TO ROUTINE 119 . D QUERY^C0CXPATH(TGLOBAL,XPATH,"INXML") ; EXTRACT XML TO PASS 120 . S IXML="INXML" 121 . S OXML=$P(XI,";",4) ; ARRAY FOR SECTION VALUES 122 . ; K @OXML ; KILL EXPECTED OUTPUT ARRAY 123 . ; W OXML,! 124 . S CALL="D "_TAG_"^"_RTN_"(IXML,DFN,OXML)" ; SETUP THE CALL 125 . W "RUNNING ",CALL,! 126 . X CALL 127 . ; NOW INSERT THE RESULTS IN THE CCR BUFFER 128 . I $G(@OXML@(0))>0 D ; THERE IS A RESULT 129 . . D INSERT^C0CXPATH(CCRGLO,OXML,"//ContinuityOfCareRecord/Body") 130 . . I DEBUG F C0CI=1:1:@OXML@(0) W @OXML@(C0CI),! 131 N ACTT,ATMP,ACTT2,ATMP2 ; TEMPORARY ARRAY SYMBOLS FOR ACTOR PROCESSING 132 D ACTLST^C0CCCR(CCRGLO,ACTGLO) ; GEN THE ACTOR LIST 133 D QUERY^C0CXPATH(TGLOBAL,"//ContinuityOfCareRecord/Actors","ACTT") 134 D EXTRACT^C0CACTOR("ACTT",ACTGLO,"ACTT2") 135 D INSINNER^C0CXPATH(CCRGLO,"ACTT2","//ContinuityOfCareRecord/Actors") 136 K ACTT,ACTT2 137 ;D QUERY^C0CXPATH(TGLOBAL,"//ContinuityOfCareRecord/Comments","CMTT") 138 ;D EXTRACT^C0CCMT("CMTT",DFN,"CMTT2") 139 ;D INSINNER^C0CXPATH(CCRGLO,"CMTT2","//ContinuityOfCareRecord/Comments") 140 ; gpl - turned off Comments for Certification 141 K CMTT,CMTT2 142 N TRIMI,J,DONE S DONE=0 143 F TRIMI=0:0 D Q:DONE ; DELETE UNTIL ALL EMPTY ELEMENTS ARE GONE 144 . S J=$$TRIM^C0CXPATH(CCRGLO) ; DELETE EMPTY ELEMENTS 145 . I DEBUG W "TRIMMED",J,! 146 . I J=0 S DONE=1 ; DONE WHEN TRIM RETURNS FALSE 147 ;S CCRGRTN=$NA(^TMP("C0CCCR",$J,DFN,CCRPART)) ; RTN GLOBAL OF PART OR ALL 148 I CCRPART="CCR" M CCRGRTN=@CCRGLO ; ENTIRE CCR 149 E M CCRGRTN=^TMP("C0CCCR",$J,DFN,CCRPART) ; RTN GLOBAL OF PART 150 I '$D(C0CNRPC) S ^TMP("C0CRPC",$H,"RESULT",CCRGRTN(0))="" 151 K ^TMP("C0CCCR",$J) ; BEGIN TO CLEAN UP 152 K ^TMP($J) ; REALLY CLEAN UP 153 M ^TMP($J)=^TMP("C0CSAV",$J) ; RESTORE CALLER'S $J 154 Q 155 ; 156 INITSTPS(TAB) ; INITIALIZE CCR PROCESSING STEPS 157 ; TAB IS PASSED BY NAME 158 I DEBUG W "TAB= ",TAB,! 159 ; ORDER FOR CCR IS PROBLEMS,FAMILYHISTORY,SOCIALHISTORY,MEDICATIONS,VITALSIGNS,RESULTS,HEALTHCAREPROVIDERS 160 D PUSH^C0CXPATH(TAB,"EXTRACT;C0CPROBS;//ContinuityOfCareRecord/Body/Problems;^TMP(""C0CCCR"",$J,DFN,""PROBLEMS"")") 161 I TESTALERT D PUSH^C0CXPATH(TAB,"EXTRACT;C0CALERT;//ContinuityOfCareRecord/Body/Alerts;^TMP(""C0CCCR"",$J,DFN,""ALERTS"")") 162 D PUSH^C0CXPATH(TAB,"EXTRACT;C0CMED;//ContinuityOfCareRecord/Body/Medications;^TMP(""C0CCCR"",$J,DFN,""MEDICATIONS"")") 163 D PUSH^C0CXPATH(TAB,"MAP;C0CIMMU;//ContinuityOfCareRecord/Body/Immunizations;^TMP(""C0CCCR"",$J,DFN,""IMMUNE"")") 164 I TESTVIT D PUSH^C0CXPATH(TAB,"EXTRACT;C0CVIT2;//ContinuityOfCareRecord/Body/VitalSigns;^TMP(""C0CCCR"",$J,DFN,""VITALS"")") 165 E D PUSH^C0CXPATH(TAB,"EXTRACT;C0CVITAL;//ContinuityOfCareRecord/Body/VitalSigns;^TMP(""C0CCCR"",$J,DFN,""VITALS"")") 166 D PUSH^C0CXPATH(TAB,"MAP;C0CLABS;//ContinuityOfCareRecord/Body/Results;^TMP(""C0CCCR"",$J,DFN,""RESULTS"")") 167 D PUSH^C0CXPATH(TAB,"EXTRACT;C0CPROC;//ContinuityOfCareRecord/Body/Procedures;^TMP(""C0CCCR"",$J,DFN,""PROCEDURES"")") 168 ;D PUSH^C0CXPATH(TAB,"EXTRACT;C0CENC;//ContinuityOfCareRecord/Body/Encounters;^TMP(""C0CCCR"",$J,DFN,""ENCOUNTERS"")") 169 ; gpl - turned off Encounters for Certification 170 Q 171 ; 172 HDRMAP(CXML,DFN) ; MAP HEADER VARIABLES: FROM, TO ECT 173 N VMAP S VMAP=$NA(^TMP("C0CCCR",$J,DFN,"HEADER")) 174 ; K @VMAP 175 S @VMAP@("DATETIME")=$$FMDTOUTC^C0CUTIL($$NOW^XLFDT,"DT") 176 ; I IHDR="" D ; HEADER ARRAY IS NOT PROVIDED, USE DEFAULTS 177 D ; ALWAYS MAP THESE VARIABLES 178 . S @VMAP@("CCRDOCOBJECTID")=$$UUID^C0CUTIL ; UUID FOR THIS CCR 179 . S @VMAP@("ACTORPATIENT")="ACTORPATIENT_"_DFN 180 . S @VMAP@("ACTORFROM")="ACTORPROVIDER_"_DUZ ; FROM DUZ - FROM PROVIDER 181 . ;S @VMAP@("ACTORFROM")="ACTORORGANIZATION_"_DUZ ; FROM DUZ - ??? 182 . S @VMAP@("ACTORFROM2")="ACTORSYSTEM_1" ; SECOND FROM IS THE SYSTEM 183 . S @VMAP@("ACTORTO")="ACTORPATIENT_"_DFN ; FOR TEST PURPOSES 184 . S @VMAP@("PURPOSEDESCRIPTION")="CEND PHR" ; FOR TEST PURPOSES 185 . S @VMAP@("ACTORTOTEXT")="Patient" ; FOR TEST PURPOSES 186 . ; THIS IS THE USE CASE FOR THE PHR WHERE "TO" IS THE PATIENT 187 ;I IHDR'="" D ; HEADER VALUES ARE PROVIDED 188 ;. D CP^C0CXPATH(IHDR,VMAP) ; COPY HEADER VARIABLES TO MAP ARRAY 189 N CTMP 190 D MAP^C0CXPATH(CXML,VMAP,"CTMP") 191 D CP^C0CXPATH("CTMP",CXML) 192 N HRIMVARS ; 193 S HRIMVARS=$NA(^TMP("C0CRIM","VARS",DFN,"HEADER")) ; TO PERSIST VARS 194 M @HRIMVARS@(1)=@VMAP ; PERSIST THE HEADER VARIABLES IN RIM TABLE 195 S @HRIMVARS@(0)=1 ; ONLY ONE SET OF HEADERS PER PATIENT 196 Q 197 ; 198 ACTLST(AXML,ACTRTN) ; RETURN THE ACTOR LIST FOR THE XML IN AXML 199 ; AXML AND ACTRTN ARE PASSED BY NAME 200 ; EACH ACTOR RECORD HAS 3 PARTS - IE IF OBJECTID=ACTORPATIENT_2 201 ; P1= OBJECTID - ACTORPATIENT_2 202 ; P2= OBJECT TYPE - PATIENT OR PROVIDER OR SOFTWARE 203 ;OR INSTITUTION 204 ; OR PERSON(IN PATIENT FILE IE NOK) 205 ; P3= IEN RECORD NUMBER FOR ACTOR - 2 206 N I,J,K,L 207 K @ACTRTN ; CLEAR RETURN ARRAY 208 F I=1:1:@AXML@(0) D ; FIRST FIX MISSING LINKS 209 . I @AXML@(I)?.E1"_<".E D ; 210 . . N ZA,ZB 211 . . S ZA=$P(@AXML@(I),">",1)_">" 212 . . S ZB="<"_$P(@AXML@(I),"<",3) 213 . . S @AXML@(I)=ZA_"ACTORORGANIZATION_1"_ZB 214 F I=1:1:@AXML@(0) D ; SCAN ALL LINES 215 . I @AXML@(I)?.E1"<ActorID>".E D ; THERE IS AN ACTOR THIS LINE 216 . . S J=$P($P(@AXML@(I),"<ActorID>",2),"</ActorID>",1) 217 . . I $G(LINKDEBUG) W "<ActorID>=>",J,! 218 . . I J'="" S K(J)="" ; HASHING ACTOR 219 . I @AXML@(I)?.E1"<LinkID>".E D ; THERE IS AN ACTOR THIS LINE 220 . . S J=$P($P(@AXML@(I),"<LinkID>",2),"</LinkID>",1) 221 . . I $G(LINKDEBUG) W "<LinkID>=>",J,! 222 . . I J'="" S K(J)="" ; HASHING ACTOR 223 . . ; TO GET RID OF DUPLICATES 224 S I="" ; GOING TO $O THROUGH THE HASH 225 F J=0:0 D Q:$O(K(I))="" 226 . S I=$O(K(I)) ; WALK THROUGH THE HASH OF ACTORS 227 . S $P(L,U,1)=I ; FIRST PIECE IS THE OBJECT ID 228 . S $P(L,U,2)=$P($P(I,"ACTOR",2),"_",1) ; ACTOR TYPE 229 . S $P(L,U,3)=$P(I,"_",2) ; IEN RECORD NUMBER FOR ACTOR 230 . D PUSH^C0CXPATH(ACTRTN,L) ; ADD THE ACTOR TO THE RETURN ARRAY 231 Q 232 ; 233 TEST ; RUN ALL THE TEST CASES 234 D TESTALL^C0CUNIT("C0CCCR") 235 Q 236 ; 237 ZTEST(WHICH) ; RUN ONE SET OF TESTS 238 N ZTMP 239 D ZLOAD^C0CUNIT("ZTMP","C0CCCR") 240 D ZTEST^C0CUNIT(.ZTMP,WHICH) 241 Q 242 ; 243 TLIST ; LIST THE TESTS 244 N ZTMP 245 D ZLOAD^C0CUNIT("ZTMP","C0CCCR") 246 D TLIST^C0CUNIT(.ZTMP) 247 Q 248 ; 249 ;;><TEST> 250 ;;><PROBLEMS> 251 ;;>>>K C0C S C0C="" 252 ;;>>>D CCRRPC^C0CCCR(.C0C,"2","PROBLEMS","") 253 ;;>>?@C0C@(@C0C@(0))["</Problems>" 254 ;;><VITALS> 255 ;;>>>K C0C S C0C="" 256 ;;>>>D CCRRPC^C0CCCR(.C0C,"2","VITALS","") 257 ;;>>?@C0C@(@C0C@(0))["</VitalSigns>" 258 ;;><CCR> 259 ;;>>>K C0C S C0C="" 260 ;;>>>D CCRRPC^C0CCCR(.C0C,"2","CCR","") 261 ;;>>?@C0C@(@C0C@(0))["</ContinuityOfCareRecord>" 262 ;;><ACTLST> 263 ;;>>>K C0C S C0C="" 264 ;;>>>D CCRRPC^C0CCCR(.C0C,"2","CCR","") 265 ;;>>>D ACTLST^C0CCCR(C0C,"ACTTEST") 266 ;;><ACTORS> 267 ;;>>>D ZTEST^C0CCCR("ACTLST") 268 ;;>>>D QUERY^C0CXPATH(TGLOBAL,"//ContinuityOfCareRecord/Actors","G2") 269 ;;>>>D EXTRACT^C0CACTOR("G2","ACTTEST","G3") 270 ;;>>?G3(G3(0))["</Actors>" 271 ;;><TRIM> 272 ;;>>>D ZTEST^C0CCCR("CCR") 273 ;;>>>W $$TRIM^C0CXPATH(CCRGLO) 274 ;;><ALERTS> 275 ;;>>>S TESTALERT=1 276 ;;>>>K C0C S C0C="" 277 ;;>>>D CCRRPC^C0CCCR(.C0C,"2","ALERTS","") 278 ;;>>?@C0C@(@C0C@(0))["</Alerts>" 279 280
Note:
See TracChangeset
for help on using the changeset viewer.
