Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: MAGJUTL1

MAGJUTL1.m

Go to the documentation of this file.
  1. MAGJUTL1 ;WIRMFO/JHC - VistARad subroutines for RPC calls ; 10/17/2022
  1. ;;3.0;IMAGING;**22,18,65,76,101,133,341**;Dec 21, 2022;Build 28
  1. ;;Per VHA Directive 2004-038, this routine should not be modified.
  1. ;; +---------------------------------------------------------------+
  1. ;; | Property of the US Government. |
  1. ;; | No permission to copy or redistribute this software is given. |
  1. ;; | Use of unreleased versions of this software requires the user |
  1. ;; | to execute a written test agreement with the VistA Imaging |
  1. ;; | Development Office of the Department of Veterans Affairs, |
  1. ;; | telephone (301) 734-0100. |
  1. ;; | |
  1. ;; | The Food and Drug Administration classifies this software as |
  1. ;; | a medical device. As such, it may not be changed in any way. |
  1. ;; | Modifications to this software may result in an adulterated |
  1. ;; | medical device under 21CFR820, the use of which is considered |
  1. ;; | to be a violation of US Federal Statutes. |
  1. ;; +---------------------------------------------------------------+
  1. ;;
  1. ; Reference to EN1^RAO7PC1 in ICR #2268
  1. ; Reference to SETDATA^RAO7PC1A in ICR #3509
  1. ; Reference to D^RAUTL in ICR #3507
  1. ;; ISI IMAGING;**99,102**
  1. Q
  1. ;<*>Notes on possible changes to ^RAO7PC1/1A for fetching rad pkg data:
  1. ; 1) Return also: Exam Status IEN, Order Request Urgency, & Pre-Op Date
  1. ; 2) Allow to retrieve one specific exam; e.g. modify SETDATA^RAO7PC1A
  1. ; to act as a true subrtn, W/ params for RADFN, RADTI, & RACNI--if
  1. ; passed, then only the one exam would be returned
  1. ;
  1. GETEXAM3(DFN,BEGDT,ENDT,MAGRACNT,MAGRET,MORE,LIMEXAMS) ; Get data for all exams for a
  1. ; pt within a date range
  1. ; limit to LIMEXAMS entries--note, only PREFETCH & Auto-route Priors use this
  1. ; Input:
  1. ; DFN -- Patient DFN
  1. ; BEGDT -- Opt, earliest date desired
  1. ; ENDT -- Opt, latest date desired
  1. ; MAGRACNT -- Opt, pass by ref to init counter to ref return data in ^TMP (see GETEXSET)
  1. ; MORE -- Opt, If True, check for additional exams for pt
  1. ; LIMEXAMS -- Opt, limit # exams to return
  1. ; Return:
  1. ; MAGRACNT -- highest counter for return data
  1. ; MAGRET -- 1/0: exam was/not found
  1. ; MORE -- more exams exist for pt on & B4 this date
  1. ; ^TMP -- data returned (see GETEXSET)
  1. ;
  1. I '$D(DT) N DIQUIET S DIQUIET=1 D DT^DICRW
  1. S LIMEXAMS=+$G(LIMEXAMS)
  1. S:$G(BEGDT)="" BEGDT=2010101 S:$G(ENDT)="" ENDT=DT ; default all dates
  1. N MORECHK S MORECHK=+$G(MORE)
  1. S MAGRACNT=+$G(MAGRACNT),MAGRET=0,MORE=0 ; Init return data
  1. I BEGDT>ENDT S X=ENDT,ENDT=BEGDT,BEGDT=X
  1. I '(DFN&BEGDT&ENDT) Q
  1. K ^TMP($J,"RAE1") D EN1^RAO7PC1(DFN,BEGDT,ENDT,LIMEXAMS)
  1. N EXID,TMP,EX1,EX2 S EXID=0
  1. F MAGRET=0:1 S EXID=$O(^TMP($J,"RAE1",DFN,EXID)) Q:'EXID S TMP($P(EXID,"-"),$P(EXID,"-",2))=EXID
  1. S (EX1,EX2)=""
  1. F S EX1=$O(TMP(EX1)) Q:'EX1 F S EX2=$O(TMP(EX1,EX2)) Q:'EX2 D GETEXSET(DFN,TMP(EX1,EX2),"")
  1. K ^TMP($J,"RAE1")
  1. I 'MORECHK Q ; all done; else indicate if pt has more exams
  1. N DTI,CNI,STS,DTCHK
  1. I 'MAGRET S DTI=9999999.9999-BEGDT,CNI=0 ; no exam found in orig dt range
  1. E S X=^TMP($J,"MAGRAEX",MAGRACNT,1),DTI=$P(X,U,2),CNI=$P(X,U,3) ; last exam processed
  1. ; loop thru addl exams til find one that is NOT Cancelled
  1. 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
  1. . Q:($P($G(^RA(72,STS,0)),U,3)=0) ; Canceled--keep looking
  1. . S DTCHK=9999999.9999-DTI D EN1^RAO7PC1(DFN,DTCHK,DTCHK,1) ; verify there is at least one "good" exam for this date (Remedy #200480)
  1. . I +$O(^TMP($J,"RAE1",DFN,0)) S MORE=1
  1. . K ^TMP($J,"RAE1")
  1. I 'MORE S DTI=$O(^RADPT(DFN,"DT",DTI)),CNI=0 G MORE1:DTI
  1. I MORE S MORE=9999999.9999-DTI\1
  1. Q
  1. ;
  1. GETEXAM2(DFN,DTI,CNI,MAGRACNT,MAGRET) ; Fetch data for one exam
  1. ;Input:
  1. ; DFN -- Pt DFN
  1. ; DTI -- Internal Date pointer to Rad exam
  1. ; CNI -- Case pointer to Rad exam
  1. ; MAGRACNT -- Opt, pass by ref to init counter for return data in ^TMP (see GETEXSET)
  1. ; Return:
  1. ; MAGRACNT -- highest counter for return data
  1. ; MAGRET -- 1/0: exam was/not found
  1. ; ^TMP -- data returned (see GETEXSET)
  1. ;
  1. ; This subroutine calls RAO7PC1A directly to fetch exam data
  1. ; which is returned in ^TMP($J,"RAE1",DFN,DTI_"-"_CNI).
  1. ; RAO7PC1A currently returns ALL exams filed under one DTI,
  1. ; but this subroutine returns the single exam for the input DTI, CNI
  1. ;
  1. N RADFN,RACNT,RAIBDT,RAEXN,RAXIT ; Vars input to RAO7PC1A
  1. S RADFN=DFN,RACNT=0,RAIBDT=DTI,RAEXN=0,RAXIT=0
  1. ; other Vars set by RAO7PC1A:
  1. N RABNOR,RACSE,RADIAG,RANO,RAPRC,RAREX,RARPT,RARPTST,RASTNM,RAXAM,RAXID
  1. N RABNORMR,RACPT
  1. S MAGRACNT=+$G(MAGRACNT)
  1. K ^TMP($J,"RAE1") D SETDATA^RAO7PC1A
  1. S MAGRET=RACNT Q:'RACNT ; no exams found
  1. D GETEXSET(DFN,DTI_"-"_CNI,.X)
  1. I 'X S MAGRET=0 ; no exam for this CNI
  1. K ^TMP($J,"RAE1")
  1. Q
  1. ;
  1. GETEXSET(RADFN,EXID,MAGRET) ;
  1. ; Used by GETEXAM* subroutines above to set up rad data for vrad
  1. ; Input:
  1. ; RADFN -- Pt DFN
  1. ; EXID --- RADTI_"-"_RACNI, pointers to Rad exam
  1. ; Output:
  1. ; MAGRET- 1/0: an exam was/was not filed
  1. ; ^TMP($J,"MAGRAEX",MAGRACNT)=Data String (see code at end)
  1. ; MAGRACNT described in above subroutines
  1. ;
  1. N RACN,RACNI,RADATA,RADATE,RADTE,RADTI,RADTPRT,RAELOC,RANME
  1. N RAPRC,RARPT,RASSN,RAST,RASTORD,RASTP,RASTNM,RACPT,IMTYPABB,PROCMOD
  1. N DAYCASE,REQLOC,REQLOCN,REQLOCA,REQLOCT,RIST,RIST1,RIST2,COMPLIC
  1. N RADIV,RISTISME,REQWARD,RASTCAT,CPTMOD,LRFLAG,MODTXT,LONGACN,TECH
  1. N MEDS,RDIOPHARM
  1. N ASIGINI,ASIGNOTE,ASIGDUZ,FAVKWD1,FAVKWD2,FAVNOTE,PTAGE,PTDOB,PTSEX ; ISI
  1. N RPTSTS ; ISI
  1. S MAGRET=0,RADTI=$P(EXID,"-"),RACNI=$P(EXID,"-",2)
  1. Q:'(RADTI&RACNI)
  1. S RADIV=""
  1. S RADATA=$G(^TMP($J,"RAE1",RADFN,EXID))
  1. Q:RADATA="" ; no exam for this EXID
  1. S RARPT=$P(RADATA,U,5)
  1. S X=$P(RADATA,U,6),RASTORD=$P(X,"~"),RASTNM=$P(X,"~",2)
  1. S X=^RADPT(RADFN,"DT",RADTI,"P",RACNI,0),COMPLIC=$D(^("COMP")),PROCMOD=$D(^("M")),CPTMOD=$D(^("CMOD")),TECH=$D(^("TC")),MEDS=$D(^("RX")) ; ICR #1172 (Private)
  1. 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
  1. S REQWARD=$P(X,U,6),LONGACN=$P(X,U,31),RDIOPHARM=$P(X,U,28) ; ICR #1172 (Private)
  1. ; ISI begin ...
  1. S (FAVKWD1,FAVKWD2,FAVNOTE)="" ; values are placeholders only inside this program
  1. S (ASIGINI,ASIGNOTE,ASIGDUZ)=""
  1. I $$UJOCHECK^ISIJUTL9() D ; not implemented in VA--future mod required to store in ISI file (tbd)
  1. . S X=$G(^RADPT(RADFN,"DT",RADTI,"P",RACNI,"ISI")) I +X D
  1. . . S ASIGDUZ=+X,ASIGNOTE=$P(X,U,2)
  1. . . S ASIGINI=$$USERINF^MAGJUTL3(ASIGDUZ,1) ; assignee initials
  1. S RPTSTS="No Report" I +RARPT D
  1. . S X=$P($G(^RARPT(RARPT,0)),U,5)
  1. . I X]"" S RPTSTS=$S(X="V":"VERIFIED",X="D":"DRAFT",X="R":"REL./NOT VERIF.",X="PD":"PROBLEM DRAFT",X="EF":"ELECTRONICALLY FILED",X="X":"DELETED")
  1. ; ISI ... end
  1. N CT,MODS,IEN,TT ; Process Proc/CPT Modifier info
  1. S CT=0
  1. I PROCMOD D
  1. . S IEN=0
  1. . F S IEN=$O(^RADPT(RADFN,"DT",RADTI,"P",RACNI,"M",IEN)) Q:'IEN S X=$P($G(^(IEN,0)),U) I X D
  1. . . S X=$P($G(^RAMIS(71.2,X,0)),U) Q:X="" S X=$$TRIM(X)
  1. . . S X=$S(X="BILATERAL EXAM":"BILAT",1:X)
  1. . . S CT=CT+1,MODS(CT)=X
  1. I CPTMOD D
  1. . S IEN=0
  1. . F S IEN=$O(^RADPT(RADFN,"DT",RADTI,"P",RACNI,"CMOD",IEN)) Q:'IEN S X=$P($G(^(IEN,0)),U) I X D
  1. . . S X=$P($$MOD^ICPTMOD(X,"I"),U,3) Q:X="" S X=$$TRIM(X)
  1. . . S X=$S(X="LEFT SIDE":"LEFT",X="RIGHT SIDE":"RIGHT",X="BILATERAL PROCEDURE":"BILAT",1:X)
  1. . . S CT=CT+1,MODS(CT)=X
  1. S MODTXT="",LRFLAG=0 K TT
  1. I CT F I=1:1:CT S X=MODS(I) D
  1. . ; eliminate redundant values for L/R/Bilat (TT), & track L/R for prior matching (LRFLAG)
  1. . S T=(X="LEFT") I T,$D(TT(1)) Q ; already got it
  1. . I 'T S T=(X="RIGHT") I T S T=2 I T,$D(TT(2)) Q ; ditto
  1. . I 'T S T=(X="BILAT") I T S T=3 I T,$D(TT(3)) Q ; ditto
  1. . I T S TT(T)="",MODTXT=X_$S(MODTXT="":"",1:";")_MODTXT ; force L/R/Bilat to left end of string ..
  1. . E S MODTXT=MODTXT_$S(MODTXT="":"",1:";")_X ; .. so is easier to spot in displayed column
  1. . I 'LRFLAG S:T LRFLAG=T
  1. . E I T S:(LRFLAG'=T) LRFLAG=3 ; L&R or Bilat--ignore result
  1. S LRFLAG=$S(LRFLAG=1:"L",LRFLAG=2:"R",1:"") ; Left/Right indicator
  1. I 'TECH S TECH=""
  1. E D
  1. . S IEN=0,TECH="" N T
  1. . F S IEN=$O(^RADPT(RADFN,"DT",RADTI,"P",RACNI,"TC",IEN)) Q:'IEN S X=$P($G(^(IEN,0)),U) I X S T(X)=""
  1. . I $D(T) S T="" F S T=$O(T(T)) Q:T="" S X=$P($G(^VA(200,T,0)),U,2) I X]"" S TECH=TECH_$S(TECH="":"",1:"~")_X
  1. S RADIV=$P(^RADPT(RADFN,"DT",RADTI,0),U,3)
  1. K DIC,DR,DA,DIQ
  1. I 'REQLOC S (REQLOCN,REQLOCT,REQLOCA)=""
  1. E D
  1. . S X=$G(^SC(REQLOC,0)),REQLOCN=$P(X,U),REQLOCA=$P(X,U,2)
  1. . S:REQLOCA="" REQLOCA=REQLOCN
  1. . S DIC="44",DR="2",DA=REQLOC,DIQ="REQLOCT" D EN^DIQ1 K DIC,DR,DA,DIQ
  1. . S REQLOCT=REQLOCT(44,REQLOC,2)
  1. 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)
  1. S X=$$RIST(RIST1,RIST2),RIST=$P(X,U),RISTISME=$P(X,U,2)
  1. S RADTE=9999999.9999-RADTI,(RADTPRT,Y)=RADTE D D^RAUTL S RADATE=Y
  1. S RADTPRT=$E(RADTPRT,4,5)_"/"_$E(RADTPRT,6,7)_"/"_$E(RADTPRT,2,3)
  1. S RAPRC=$E($P(RADATA,U),1,40),RACN=$P(RADATA,U,2),RAELOC=$P(RADATA,U,7)
  1. S IMTYPABB=$P($P(RADATA,U,8),"~"),RACPT=$P(RADATA,U,10)
  1. S DAYCASE=$E(RADTE,4,7)_$E(RADTE,2,3)_"-"_RACN
  1. I LONGACN]"" S DAYCASE=LONGACN
  1. S RASTP=RASTNM,RASTCAT=""
  1. I RAST S RASTCAT=$P($G(^RA(72,RAST,0)),U,9)
  1. S RANME=$P(^DPT(RADFN,0),U),PTSEX=$P(^(0),U,2),PTDOB=$P(^(0),U,3),PTAGE="" ; ISI
  1. S DFN=RADFN D PID^VADPT6 S RASSN=$S(VAERR:"Unknown",1:VA("PID"))
  1. K VA("PID"),VA("BID"),VAERR
  1. S MAGRACNT=$G(MAGRACNT)+1
  1. I MAGRACNT=1 K ^TMP($J,"MAGRAEX")
  1. 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
  1. 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_U_TECH_U_MEDS_U_RDIOPHARM
  1. S ^TMP($J,"MAGRAEX",MAGRACNT,"ISI")=ASIGINI_U_ASIGNOTE_U_ASIGDUZ_U_FAVKWD1_U_FAVKWD2_U_FAVNOTE_U_PTAGE_U_PTSEX_U_PTDOB_U_RPTSTS ; ISI
  1. S MAGRET=1
  1. Q
  1. ;
  1. RIST(RIST1,RIST2) ; return Interp Radiologist info
  1. S RIST1=$G(RIST1),RIST2=$G(RIST2)
  1. N RIST,RISTISME
  1. S (RIST,RISTISME)=""
  1. I RIST1!RIST2 D
  1. . I RIST1 S RISTISME=RIST1 S RIST=$$USERINF^MAGJUTL3(RIST1,1)
  1. . I RIST2 S RISTISME=$S('RISTISME:RIST2,1:RISTISME_"~"_RIST2) S RIST2=$$USERINF^MAGJUTL3(RIST2,1)
  1. . I RIST]"" S RIST=RIST_$S(RIST2]"":"/"_RIST2,1:"")
  1. . E S RIST=RIST2
  1. Q RIST_U_RISTISME
  1. ;
  1. IMGSIT(DIV,DFLT) ; Return Imaging Site code for input Division
  1. ; From 2006.1: IEN ^ Site Code ^ Parent_DIV
  1. I DIV]"" D
  1. . N IEN I $D(^MAG(2006.1,"B",DIV)) S IEN=$O(^(DIV,"")) I IEN
  1. . E I $G(DFLT) S IEN=$O(^MAG(2006.1,0)) ; Dflt to 1st if requested
  1. . E S X="" Q
  1. . S X=^MAG(2006.1,IEN,0),X=IEN_U_$P(X,U,9)_U_$P(X,U)
  1. Q X
  1. ;
  1. TRIM(X) ; Trim trailing spaces from X
  1. I $G(X)]"" D
  1. . F I=$L(X):-1:0 I $E(X,I)'=" " Q
  1. . I I S X=$E(X,1,I)
  1. . E S X=""
  1. Q:$Q X Q
  1. ;
  1. END Q ;