| [623] | 1 | MAGJUTL1 ;WIRMFO/JHC VistARad subroutines for RPC calls ; 29 Jul 2003  10:03 AM
 | 
|---|
 | 2 |  ;;3.0;IMAGING;**22,18,65**;Jul 27, 2006;Build 28
 | 
|---|
 | 3 |  ;;Per VHA Directive 2004-038, this routine should not be modified.
 | 
|---|
 | 4 |  ;; +---------------------------------------------------------------+
 | 
|---|
 | 5 |  ;; | Property of the US Government.                                |
 | 
|---|
 | 6 |  ;; | No permission to copy or redistribute this software is given. |
 | 
|---|
 | 7 |  ;; | Use of unreleased versions of this software requires the user |
 | 
|---|
 | 8 |  ;; | to execute a written test agreement with the VistA Imaging    |
 | 
|---|
 | 9 |  ;; | Development Office of the Department of Veterans Affairs,     |
 | 
|---|
 | 10 |  ;; | telephone (301) 734-0100.                                     |
 | 
|---|
 | 11 |  ;; |                                                               |
 | 
|---|
 | 12 |  ;; | The Food and Drug Administration classifies this software as  |
 | 
|---|
 | 13 |  ;; | a medical device.  As such, it may not be changed in any way. |
 | 
|---|
 | 14 |  ;; | Modifications to this software may result in an adulterated   |
 | 
|---|
 | 15 |  ;; | medical device under 21CFR820, the use of which is considered |
 | 
|---|
 | 16 |  ;; | to be a violation of US Federal Statutes.                     |
 | 
|---|
 | 17 |  ;; +---------------------------------------------------------------+
 | 
|---|
 | 18 |  ;;
 | 
|---|
 | 19 |  Q
 | 
|---|
 | 20 |  ;<*>Notes on possible changes to ^RAO7PC1/1A for fetching rad pkg data:
 | 
|---|
 | 21 |  ; 1) Return also: Exam Status IEN, Order Request Urgency, & Pre-Op Date
 | 
|---|
 | 22 |  ; 2) Allow to retrieve one specific exam; e.g. modify SETDATA^RAO7PC1A
 | 
|---|
 | 23 |  ;    to act as a true subrtn, W/ params for RADFN, RADTI, & RACNI--if
 | 
|---|
 | 24 |  ;    passed, then only the one exam would be returned
 | 
|---|
 | 25 |  ;
 | 
|---|
 | 26 | GETEXAM3(DFN,BEGDT,ENDT,MAGRACNT,MAGRET,MORE,LIMEXAMS) ; Get data for all exams for a
 | 
|---|
 | 27 |  ; pt within a date range (default all dates); limit returned list to LIMEXAMS
 | 
|---|
 | 28 |  ; Input:
 | 
|---|
 | 29 |  ;      DFN -- Patient DFN
 | 
|---|
 | 30 |  ;    BEGDT -- Opt, earliest date desired
 | 
|---|
 | 31 |  ;     ENDT -- Opt, latest date desired
 | 
|---|
 | 32 |  ; MAGRACNT -- Opt, pass by ref to init counter to ref return data in ^TMP (see GETEXSET)
 | 
|---|
 | 33 |  ; LIMEXAMS -- Opt, limit # exams to return
 | 
|---|
 | 34 |  ; Return:
 | 
|---|
 | 35 |  ; MAGRACNT -- highest counter for return data
 | 
|---|
 | 36 |  ;   MAGRET -- 1/0: exam was/not found
 | 
|---|
 | 37 |  ;     MORE -- more exams exist for pt on & B4 this date
 | 
|---|
 | 38 |  ;     ^TMP -- data returned (see GETEXSET)
 | 
|---|
 | 39 |  ;
 | 
|---|
 | 40 |  I '$D(DT) N DIQUIET S DIQUIET=1 D DT^DICRW
 | 
|---|
 | 41 |  N MORECHK
 | 
|---|
 | 42 |  S LIMEXAMS=+$G(LIMEXAMS)
 | 
|---|
 | 43 |  S MORECHK=BEGDT!LIMEXAMS
 | 
|---|
 | 44 |  S:$G(BEGDT)="" BEGDT=2010101 S:$G(ENDT)="" ENDT=DT ; default all dates
 | 
|---|
 | 45 |  S MAGRACNT=+$G(MAGRACNT),MAGRET=0,MORE=0  ; Init return data
 | 
|---|
 | 46 |  I BEGDT>ENDT S X=ENDT,ENDT=BEGDT,BEGDT=X
 | 
|---|
 | 47 |  I '(DFN&BEGDT&ENDT) Q
 | 
|---|
 | 48 |  K ^TMP($J,"RAE1") D EN1^RAO7PC1(DFN,BEGDT,ENDT,LIMEXAMS)
 | 
|---|
 | 49 |  N EXID,TMP,EX1,EX2 S EXID=0
 | 
|---|
 | 50 |  F MAGRET=0:1 S EXID=$O(^TMP($J,"RAE1",DFN,EXID)) Q:'EXID  S TMP($P(EXID,"-"),$P(EXID,"-",2))=EXID
 | 
|---|
 | 51 |  S (EX1,EX2)=""
 | 
|---|
 | 52 |  F  S EX1=$O(TMP(EX1)) Q:'EX1  F  S EX2=$O(TMP(EX1,EX2)) Q:'EX2  D GETEXSET(DFN,TMP(EX1,EX2),"")
 | 
|---|
 | 53 |  K ^TMP($J,"RAE1")
 | 
|---|
 | 54 |  I 'MORECHK Q  ; all done; else indicate if pt has more exams
 | 
|---|
 | 55 |  N DTI,CNI,STS
 | 
|---|
 | 56 |  I 'MAGRET S DTI=9999999.9999-BEGDT,CNI=0 ; no exam found in orig dt range
 | 
|---|
 | 57 |  E  S X=^TMP($J,"MAGRAEX",MAGRACNT,1),DTI=$P(X,U,2),CNI=$P(X,U,3) ; last exam processed
 | 
|---|
 | 58 |  ; loop thru addl exams til find one that is NOT Cancelled
 | 
|---|
 | 59 | MORE1 F  S CNI=$O(^RADPT(DFN,"DT",DTI,"P",CNI)) Q:'CNI  S STS=$P($G(^(CNI,0)),U,3) I STS]"" D  Q:MORE
 | 
|---|
 | 60 |  . S MORE='($P($G(^RA(72,STS,0)),U,3)=0) ; True if sts is NOT Canc
 | 
|---|
 | 61 |  I 'MORE S DTI=$O(^RADPT(DFN,"DT",DTI)),CNI=0 G MORE1:DTI
 | 
|---|
 | 62 |  I MORE S MORE=9999999.9999-DTI\1
 | 
|---|
 | 63 |  Q
 | 
|---|
 | 64 |  ;
 | 
|---|
 | 65 | GETEXAM2(DFN,DTI,CNI,MAGRACNT,MAGRET) ; Fetch data for one exam
 | 
|---|
 | 66 |  ;Input:
 | 
|---|
 | 67 |  ; DFN -- Pt DFN
 | 
|---|
 | 68 |  ; DTI -- Internal Date pointer to Rad exam
 | 
|---|
 | 69 |  ; CNI -- Case pointer to Rad exam
 | 
|---|
 | 70 |  ; MAGRACNT -- Opt, pass by ref to init counter for return data in ^TMP (see GETEXSET)
 | 
|---|
 | 71 |  ; Return:
 | 
|---|
 | 72 |  ; MAGRACNT -- highest counter for return data
 | 
|---|
 | 73 |  ;   MAGRET -- 1/0: exam was/not found
 | 
|---|
 | 74 |  ;     ^TMP -- data returned (see GETEXSET)
 | 
|---|
 | 75 |  ;
 | 
|---|
 | 76 |  ; This subroutine calls RAO7PC1A directly to fetch exam data
 | 
|---|
 | 77 |  ; which is returned in ^TMP($J,"RAE1",DFN,DTI_"-"_CNI).
 | 
|---|
 | 78 |  ; RAO7PC1A currently returns ALL exams filed under one DTI,
 | 
|---|
 | 79 |  ; but this subroutine returns the single exam for the input DTI, CNI
 | 
|---|
 | 80 |  ;
 | 
|---|
 | 81 |  N RADFN,RACNT,RAIBDT,RAEXN,RAXIT  ; Vars input to RAO7PC1A
 | 
|---|
 | 82 |  S RADFN=DFN,RACNT=0,RAIBDT=DTI,RAEXN=0,RAXIT=0
 | 
|---|
 | 83 |  ; other Vars set by RAO7PC1A:
 | 
|---|
 | 84 |  N RABNOR,RACSE,RADIAG,RANO,RAPRC,RAREX,RARPT,RARPTST,RASTNM,RAXAM,RAXID
 | 
|---|
 | 85 |  N RABNORMR,RACPT
 | 
|---|
 | 86 |  S MAGRACNT=+$G(MAGRACNT)
 | 
|---|
 | 87 |  K ^TMP($J,"RAE1") D SETDATA^RAO7PC1A
 | 
|---|
 | 88 |  S MAGRET=RACNT Q:'RACNT     ; no exams found
 | 
|---|
 | 89 |  D GETEXSET(DFN,DTI_"-"_CNI,.X)
 | 
|---|
 | 90 |  I 'X S MAGRET=0   ; no exam for this CNI
 | 
|---|
 | 91 |  K ^TMP($J,"RAE1")
 | 
|---|
 | 92 |  Q
 | 
|---|
 | 93 |  ;
 | 
|---|
 | 94 | GETEXSET(RADFN,EXID,MAGRET) ; 
 | 
|---|
 | 95 |  ; Used by GETEXAM* subroutines above to set up rad data for vrad
 | 
|---|
 | 96 |  ; Input:
 | 
|---|
 | 97 |  ;  RADFN -- Pt DFN
 | 
|---|
 | 98 |  ;  EXID --- RADTI_"-"_RACNI, pointers to Rad exam
 | 
|---|
 | 99 |  ; Output:
 | 
|---|
 | 100 |  ;  MAGRET- 1/0: an exam was/was not filed
 | 
|---|
 | 101 |  ;  ^TMP($J,"MAGRAEX",MAGRACNT)=Data String (see code at end)
 | 
|---|
 | 102 |  ;  MAGRACNT described in above subroutines
 | 
|---|
 | 103 |  ;
 | 
|---|
 | 104 |  N RACN,RACNI,RADATA,RADATE,RADTE,RADTI,RADTPRT,RAELOC,RANME
 | 
|---|
 | 105 |  N RAPRC,RARPT,RASSN,RAST,RASTORD,RASTP,RASTNM,RACPT,IMTYPABB,PROCMOD
 | 
|---|
 | 106 |  N DAYCASE,REQLOC,REQLOCN,REQLOCA,REQLOCT,RIST,RIST1,RIST2,COMPLIC
 | 
|---|
 | 107 |  N RADIV,RISTISME,REQWARD,RASTCAT,CPTMOD,LRFLAG,MODTXT
 | 
|---|
 | 108 |  S MAGRET=0,RADTI=$P(EXID,"-"),RACNI=$P(EXID,"-",2)
 | 
|---|
 | 109 |  Q:'(RADTI&RACNI)
 | 
|---|
 | 110 |  S RADIV=""
 | 
|---|
 | 111 |  S RADATA=$G(^TMP($J,"RAE1",RADFN,EXID))
 | 
|---|
 | 112 |  Q:RADATA=""        ;  no exam for this EXID
 | 
|---|
 | 113 |  S RARPT=$P(RADATA,U,5)
 | 
|---|
 | 114 |  S X=$P(RADATA,U,6),RASTORD=$P(X,"~"),RASTNM=$P(X,"~",2)
 | 
|---|
 | 115 |  S X=^RADPT(RADFN,"DT",RADTI,"P",RACNI,0),COMPLIC=$D(^("COMP")),PROCMOD=$D(^("M")),CPTMOD=$D(^("CMOD"))
 | 
|---|
 | 116 |  S RAST=$P(X,U,3),REQLOC=$P(X,U,22),RIST1=$P(X,U,12),RIST2=$P(X,U,15),COMPLIC=$P(X,U,16)_"~"_COMPLIC
 | 
|---|
 | 117 |  S REQWARD=$P(X,U,6)
 | 
|---|
 | 118 |  N CT,MODS,IEN,TT  ; Process Proc/CPT Modifier info
 | 
|---|
 | 119 |  S CT=0
 | 
|---|
 | 120 |  I PROCMOD D
 | 
|---|
 | 121 |  . S IEN=0
 | 
|---|
 | 122 |  . F  S IEN=$O(^RADPT(RADFN,"DT",RADTI,"P",RACNI,"M",IEN)) Q:'IEN  S X=$P($G(^(IEN,0)),U) I X D
 | 
|---|
 | 123 |  . . S X=$P($G(^RAMIS(71.2,X,0)),U) Q:X=""  S X=$$TRIM(X)
 | 
|---|
 | 124 |  . . S X=$S(X="BILATERAL EXAM":"BILAT",1:X)
 | 
|---|
 | 125 |  . . S CT=CT+1,MODS(CT)=X
 | 
|---|
 | 126 |  I CPTMOD D
 | 
|---|
 | 127 |  . S IEN=0
 | 
|---|
 | 128 |  . F  S IEN=$O(^RADPT(RADFN,"DT",RADTI,"P",RACNI,"CMOD",IEN)) Q:'IEN  S X=$P($G(^(IEN,0)),U) I X D
 | 
|---|
 | 129 |  . . S X=$P($G(^DIC(81.3,X,0)),U,2) Q:X=""  S X=$$TRIM(X)
 | 
|---|
 | 130 |  . . S X=$S(X="LEFT SIDE":"LEFT",X="RIGHT SIDE":"RIGHT",X="BILATERAL PROCEDURE":"BILAT",1:X)
 | 
|---|
 | 131 |  . . S CT=CT+1,MODS(CT)=X
 | 
|---|
 | 132 |  S MODTXT="",LRFLAG=0 K TT
 | 
|---|
 | 133 |  I CT F I=1:1:CT S X=MODS(I) D
 | 
|---|
 | 134 |  . ; eliminate redundant values for L/R/Bilat (TT), & track L/R for prior matching (LRFLAG)
 | 
|---|
 | 135 |  . S T=(X="LEFT") I T,$D(TT(1)) Q  ; already got it
 | 
|---|
 | 136 |  . I 'T S T=(X="RIGHT") I T S T=2 I T,$D(TT(2)) Q   ; ditto
 | 
|---|
 | 137 |  . I 'T S T=(X="BILAT") I T S T=3 I T,$D(TT(3)) Q   ; ditto
 | 
|---|
 | 138 |  . I T S TT(T)="",MODTXT=X_$S(MODTXT="":"",1:";")_MODTXT ; force L/R/Bilat to left end of string ..
 | 
|---|
 | 139 |  . E  S MODTXT=MODTXT_$S(MODTXT="":"",1:";")_X  ; .. so is easier to spot in displayed column
 | 
|---|
 | 140 |  . I 'LRFLAG S:T LRFLAG=T
 | 
|---|
 | 141 |  . E  I T  S:(LRFLAG'=T) LRFLAG=3 ; L&R or Bilat--ignore result
 | 
|---|
 | 142 |  S LRFLAG=$S(LRFLAG=1:"L",LRFLAG=2:"R",1:"") ; Left/Right indicator
 | 
|---|
 | 143 |  S RADIV=$P(^RADPT(RADFN,"DT",RADTI,0),U,3)
 | 
|---|
 | 144 |  K DIC,DR,DA,DIQ
 | 
|---|
 | 145 |  I 'REQLOC S (REQLOCN,REQLOCT,REQLOCA)=""
 | 
|---|
 | 146 |  E  D
 | 
|---|
 | 147 |  . S X=$G(^SC(REQLOC,0)),REQLOCN=$P(X,U),REQLOCA=$P(X,U,2)
 | 
|---|
 | 148 |  . S:REQLOCA="" REQLOCA=REQLOCN
 | 
|---|
 | 149 |  . S DIC="44",DR="2",DA=REQLOC,DIQ="REQLOCT" D EN^DIQ1 K DIC,DR,DA,DIQ
 | 
|---|
 | 150 |  . S REQLOCT=REQLOCT(44,REQLOC,2)
 | 
|---|
 | 151 |  I REQWARD]"" S DIC="42",DR=".01",DA=REQWARD,DIQ="REQWARD" D EN^DIQ1 K DIC,DR,DA,DIQ S REQWARD=REQWARD(42,REQWARD,.01)
 | 
|---|
 | 152 |  S X=$$RIST(RIST1,RIST2),RIST=$P(X,U),RISTISME=$P(X,U,2)
 | 
|---|
 | 153 |  S RADTE=9999999.9999-RADTI,(RADTPRT,Y)=RADTE D D^RAUTL S RADATE=Y
 | 
|---|
 | 154 |  S RADTPRT=$E(RADTPRT,4,5)_"/"_$E(RADTPRT,6,7)_"/"_$E(RADTPRT,2,3)
 | 
|---|
 | 155 |  S RAPRC=$E($P(RADATA,U),1,40),RACN=$P(RADATA,U,2),RAELOC=$P(RADATA,U,7)
 | 
|---|
 | 156 |  S IMTYPABB=$P($P(RADATA,U,8),"~"),RACPT=$P(RADATA,U,10)
 | 
|---|
 | 157 |  S DAYCASE=$E(RADTE,4,7)_$E(RADTE,2,3)_"-"_RACN
 | 
|---|
 | 158 |  S RASTP=RASTNM,RASTCAT=""
 | 
|---|
 | 159 |  I RAST S RASTCAT=$P($G(^RA(72,RAST,0)),U,9)
 | 
|---|
 | 160 |  S RANME=$P(^DPT(RADFN,0),U)
 | 
|---|
 | 161 |  S DFN=RADFN D PID^VADPT6 S RASSN=$S(VAERR:"Unknown",1:VA("PID"))
 | 
|---|
 | 162 |  K VA("PID"),VA("BID"),VAERR
 | 
|---|
 | 163 |  S MAGRACNT=$G(MAGRACNT)+1
 | 
|---|
 | 164 |  I MAGRACNT=1 K ^TMP($J,"MAGRAEX")
 | 
|---|
 | 165 |  S ^TMP($J,"MAGRAEX",MAGRACNT,1)=RADFN_U_RADTI_U_RACNI_U_$E(RANME,1,30)_U_RASSN_U_RADATE_U_RADTE_U_RACN_U_$E(RAPRC,1,35)_U_RARPT_U_RAST_U_DAYCASE_U_RAELOC_U_RASTP_U_RASTORD_U_RADTPRT_U_RACPT_U_IMTYPABB
 | 
|---|
 | 166 |  S ^TMP($J,"MAGRAEX",MAGRACNT,2)=REQLOCA_U_$E(REQLOCN,1,25)_U_RIST_U_COMPLIC_U_RADIV_U_$P($$IMGSIT(RADIV),U,2)_U_RISTISME_U_MODTXT_U_REQLOCT_U_REQWARD_U_RASTCAT_U_LRFLAG
 | 
|---|
 | 167 |  S MAGRET=1
 | 
|---|
 | 168 |  Q
 | 
|---|
 | 169 |  ;
 | 
|---|
 | 170 | RIST(RIST1,RIST2) ; return Interp Radiologist info
 | 
|---|
 | 171 |  S RIST1=$G(RIST1),RIST2=$G(RIST2)
 | 
|---|
 | 172 |  N RIST,RISTISME
 | 
|---|
 | 173 |  S (RIST,RISTISME)=""
 | 
|---|
 | 174 |  I RIST1!RIST2 D
 | 
|---|
 | 175 |  . I RIST1 S RISTISME=RIST1=DUZ S RIST=$$USERINF^MAGJUTL3(RIST1,1)
 | 
|---|
 | 176 |  . I RIST2 S:'RISTISME RISTISME=RIST2=DUZ S RIST2=$$USERINF^MAGJUTL3(RIST2,1)
 | 
|---|
 | 177 |  . I RIST]"" S RIST=RIST_$S(RIST2]"":"/"_RIST2,1:"")
 | 
|---|
 | 178 |  . E  S RIST=RIST2
 | 
|---|
 | 179 |  Q RIST_U_RISTISME
 | 
|---|
 | 180 |  ;
 | 
|---|
 | 181 | IMGSIT(DIV,DFLT) ; Return Imaging Site code for input Division
 | 
|---|
 | 182 |  ; From 2006.1:  IEN ^ Site Code ^ Parent_DIV
 | 
|---|
 | 183 |  I DIV]"" D
 | 
|---|
 | 184 |  . N IEN I $D(^MAG(2006.1,"B",DIV)) S IEN=$O(^(DIV,"")) I IEN
 | 
|---|
 | 185 |  . E  I $G(DFLT) S IEN=$O(^MAG(2006.1,0)) ; Dflt to 1st if requested
 | 
|---|
 | 186 |  . E  S X="" Q
 | 
|---|
 | 187 |  . S X=^MAG(2006.1,IEN,0),X=IEN_U_$P(X,U,9)_U_$P(X,U)
 | 
|---|
 | 188 |  Q X
 | 
|---|
 | 189 |  ;
 | 
|---|
 | 190 | TRIM(X) ; Trim trailing spaces from X
 | 
|---|
 | 191 |  I $G(X)]"" D
 | 
|---|
 | 192 |  . F I=$L(X):-1:0 I $E(X,I)'=" " Q
 | 
|---|
 | 193 |  . I I S X=$E(X,1,I)
 | 
|---|
 | 194 |  . E  S X=""
 | 
|---|
 | 195 |  Q:$Q X  Q
 | 
|---|
 | 196 |  ;
 | 
|---|
 | 197 | END Q  ;
 | 
|---|