ORQQPL1 ; ALB/PDR,REV,ISL/JER,TC,LAB - PROBLEM LIST FOR CPRS GUI ;04/25/19 09:27
;;3.0;ORDER ENTRY/RESULTS REPORTING;**10,85,148,173,203,206,249,243,280,306,361,385,350,479,377**;Dec 17, 1997;Build 582
;
;------------------------- GET PROBLEM FROM LEXICON -------------------
;
LEXSRCH(LIST,FROM,N,VIEW,ORDATE) ; Get candidate Problems from LEX file
N LEX,VAL,VAL1,COD,CIEN,SYS,MAX,NAME,ORIMPDT,ICDCSYS,ICDCODE
S ORIMPDT=$$IMPDATE^LEXU("10D")
S:'+$G(ORDATE) ORDATE=DT
S:'$G(N) N=100
S:'$L($G(VIEW)) VIEW="PL1"
D CONFIG^LEXSET("GMPL",VIEW,ORDATE)
D LOOK^LEXA(FROM,"GMPL",N,"",ORDATE)
S S=0
F S S=$O(LEX("LIST",S)) Q:S<1 D
. S VAL1=LEX("LIST",S)
. S COD="",CIEN="",SYS="",NAME="",ICDCODE=""
. S ICDCSYS=$S(ORDATE<ORIMPDT:"ICD",1:"10D")
. I $L(VAL1,"CPT-4 ")>1 D
.. S SYS=$S(ORDATE<ORIMPDT:"ICD-9-CM ",1:"ICD-10-CM ")
.. S COD=$S(ORDATE<ORIMPDT:"799.9",1:"R69")
.. S CIEN=""
.. S NAME=$P(VAL1," (CPT-4")
. I $L(VAL1,"DSM-IV ")>1 D
.. S SYS="DSM-IV "
.. S COD=$P($P(VAL1,SYS,2),")")
.. S:COD["/" COD=$P(COD,"/",1)
.. S ICDCODE=$$ONE^LEXU($P(VAL1,U,1),ORDATE,ICDCSYS)
.. S ICDCODE=$S(ICDCODE["":COD,1:ICDCODE)
.. S CIEN=+$$ICDDATA^ICDXCODE(ICDCSYS,$G(ICDCODE),ORDATE,"E")
.. S NAME=$P(VAL1," (DSM-IV")
.. ;
. I $L(VAL1,"(TITLE 38 ")>1 D
.. S SYS="TITLE 38 "
.. S COD=$P($P(VAL1,SYS,2),")")
.. S:COD["/" COD=$P(COD,"/",1)
.. S ICDCODE=$$ONE^LEXU($P(VAL1,U,1),ORDATE,ICDCSYS)
.. S ICDCODE=$S(ICDCODE["":COD,1:ICDCODE)
.. S CIEN=+$$ICDDATA^ICDXCODE(ICDCSYS,$G(ICDCODE),ORDATE,"E")
.. S NAME=$P(VAL1,"(TITLE 38 ")
.. ;
. I $L(VAL1,"ICD-9-CM ")>1 D
.. S SYS="ICD-9-CM "
.. S COD=$P($P(VAL1,SYS,2),")")
.. S:COD["/" COD=$P(COD,"/",1)
.. S CIEN=+$$ICDDATA^ICDXCODE("DIAG",$G(COD),ORDATE,"E")
.. S NAME=$P(VAL1," (ICD-9-CM")
.. ;
. I $L(VAL1,"ICD-10-CM ")>1 D
.. S SYS="ICD-10-CM "
.. S COD=$P($P(VAL1,SYS,2),")")
.. S:COD["/" COD=$P(COD,"/",1)
.. S CIEN=+$$ICDDATA^ICDXCODE("DIAG",$G(COD),ORDATE,"E")
.. S NAME=$P(VAL1," (ICD-10-CM")
. I $L(NAME)=0 S NAME=$P($P(VAL1," (")," *")
. ;
. ; jeh Clean left over codes
. S NAME=$P(NAME," (CPT-4")
. S NAME=$P(NAME," (DSM-IV")
. S NAME=$P(NAME,"(TITLE 38 ")
. S NAME=$P(NAME," (ICD-9-CM")
. S NAME=$P(NAME," (ICD-10-CM")
. ;
. S VAL=NAME_U_COD_U_CIEN_U_SYS ; ien^.01^icd^icdifn^system
. S LIST(S)=VAL
. S MAX=S
I $G(MAX)'="" S LIST(MAX+1)=$G(LEX("MAT"))
K ^TMP("LEXSCH",$J)
Q
;
SORT(LEX) ; Sort terms alphabetically
N ORI S ORI=0
F S ORI=$O(LEX("LIST",ORI)) Q:+ORI'>0 S LEX("ALPHA",$E($P(LEX("LIST",ORI),U,2),1,255),ORI)=""
Q
;
ICDREC(COD) ;
N CODIEN,ICDCSYS
I COD="" Q ""
S COD=$P($P(COD,U),"/")
S ICDCSYS=$$SAB^ICDEX(+$$CODECS^ICDEX($G(COD),80,DT),DT) ;ICR #5747
S CODIEN=+$$ICDDATA^ICDXCODE(ICDCSYS,$G(COD),DT,"E") ;ICR #5699
Q CODIEN
;
CPTREC(COD) ;
I COD="" Q ""
Q $$CODEN^ICPTCOD(COD) ;ICR #1995
;
EDLOAD(RETURN,DA) ; LOAD EDIT ARRAYS
; DA=problem IFN
N I,GMPFLD,GMPORIG,GMPL
D GETFLDS^GMPLEDT3(DA)
S I=0
D LOADFLDS(.RETURN,"GMPFLD","NEW",.I)
D LOADFLDS(.RETURN,"GMPORIG","ORG",.I)
K GMPFLD,GMPORIG,GMPL ; should not have to do this
Q
;
LOADFLDS(RETURN,NAM,TYP,I) ; LOAD FIELDS FOR TYPE OF ARRAY
N S,V,CVP,PN,PID
S S="",V=$C(254)
F S S=$O(@NAM@(S)) Q:S=10 D
. S RETURN(I)=TYP_V_S_V_@NAM@(S)
. S I=I+1
S S=""
F S S=$O(@NAM@(10,S)) Q:S="" D
. S CVP=@NAM@(10,S)
. S PN="" ; provider name
. S PID=$P(CVP,U,6) ; provider id
. I PID'="" S PN=$$GET1^DIQ(200,PID,.01) ; get provider name
. S RETURN(I)=TYP_V_"10,"_S_V_CVP_U_PN
. S I=I+1
S S=80000
F S S=$O(@NAM@(S)) Q:S="" D
. S RETURN(I)=TYP_V_S_V_@NAM@(S)
. S I=I+1
Q
;
EDSAVE(RETURN,GMPIFN,GMPROV,GMPVAMC,UT,EDARRAY,GMPSRCH) ; SAVE EDITED RES
; RETURN - boolean, 1 success, 0 failure
; EDARRAY - array used for indirect sets of GMPORIG() and GMPFLDS()
;
N GMPFLD,GMPORIG,S,GMPLUSER
N VSRQFLG ; lab OR*3.0*479 added new variable
S VSRQFLG=0
S GMPSRCH=$G(GMPSRCH)
S RETURN=1 ; initialize for success
I UT S GMPLUSER=1
;
S S=""
F S S=$O(EDARRAY(S)) Q:S="" D
. ;S @EDARRAY(S) D lab OR*3.0*479 commented out EDDARRAY and added new logic below
. ; lab OR*3.0*479 Adding data checks to prevent backdoor access into VistA
. ; lab - start new logic OR*3.0*479
. I ($E(EDARRAY(S),1,6)="GMPFLD")!($E(EDARRAY(S),1,7)="GMPORIG") D
. . I $E(EDARRAY(S),$F(EDARRAY(S),"="))="""" D
. . . S @EDARRAY(S)
. . ELSE D
. . . S RETURN=0
. . . S VSRQFLG=1
. ELSE D
. . S RETURN=0
. . S VSRQFLG=1
;
Q:(VSRQFLG) ;quit if flag has been set meaning an unexpected value was sent in the parameter.
; lab - end new logic OR*3.0*479
I $D(GMPFLD(10,"NEW"))>9 D I 'RETURN Q ; Bail Out if no lock
. L +^AUPNPROB(GMPIFN,11):10 ; given bogus nature of this lock, should be able to get
. I '$T S RETURN=0
;
D EN^GMPLSAVE ; save the data
K GMPFLD,GMPORIG
;
L -^AUPNPROB(GMPIFN,11) ; free this instance of lock (in case it was set)
S RETURN=1
Q
;
UPDATE(ORRETURN,UPDARRAY) ; UPDATE A PROBLEM RECORD
; Does essentially same job as EDSAVE above, however does not handle edits to comments
; or addition of multiple comments.
; Use initially just for status updates.
;
N S,GMPL,GMPORIG,ORARRAY ; last 2 vars created in nested call
N VSRQFLG ; lab OR*3.0*479 added new variable
S VSRQFLG=0
S S=""
F S S=$O(UPDARRAY(S)) Q:S="" D
. ;S @UPDARRAY(S) lab OR*3.0*479 commented out UPDARRAY and added new logic below
. ; lab OR*3.0*479 Adding data checks to prevent backdoor access into VistA
. ; lab - start new logic OR*3.0*479
. I ($E(UPDARRAY(S),1,7)="ORARRAY") D
. . I $E(UPDARRAY(S),$F(UPDARRAY(S),"="))="""" D
. . . S @UPDARRAY(S)
. . ELSE D
. . . S ORRETURN(0)=0
. . . S ORRETURN(1)="Unexpected array value."
. . . S VSRQFLG=1
. ELSE D
. . S ORRETURN(0)=0
. . S ORRETURN(1)="Unexpected array value."
. . S VSRQFLG=1
;
Q:(VSRQFLG) ;quit if flag has been set meaning an unexpected value was sent in the parameter.
; lab - end new logic OR*3.0*479
D UPDATE^GMPLUTL(.ORARRAY,.ORRETURN)
; broker wont pick up root node RETURN
S ORRETURN(1)=ORRETURN(0) ; error text
S ORRETURN(0)=ORRETURN ; gmpdfn
I ORRETURN(0)="" S ORRETURN=1 ; insurance ? need
Q
;
ADDSAVE(RETURN,GMPDFN,GMPROV,GMPVAMC,ADDARRAY,GMPSRCH) ; SAVE NEW RECORD
; RETURN - Problem IFN if success, 0 otherwise
; ADDARRAY - array used for indirect sets of GMPFLDS()
;
N DA,GMPFLD,GMPORIG,S
N VSRQFLG ; lab OR*3.0*479 added new variable
S VSRQFLG=0
S GMPSRCH=$G(GMPSRCH)
S RETURN=0 ;
L +^AUPNPROB(0):10
Q:'$T ; bail out if no lock
;
S S=""
F S S=$O(ADDARRAY(S)) Q:S="" D
. ; lab - S @ADDARRAY(S) OR*3.0*479 commented out ADDARRAY and added new logic below
. ; lab - for VSR project, adding data checks to prevent backdoor access into VistA
. ; lab - start new logic
. I $E(ADDARRAY(S),1,6)="GMPFLD" D
. . I $E(ADDARRAY(S),$F(ADDARRAY(S),"="))="""" D
. . . S @ADDARRAY(S)
. . ELSE D
. . . S RETURN=0
. . . L -^AUPNPROB(0)
. . . S VSRQFLG=1
. ELSE D
. . S RETURN=0
. . L -^AUPNPROB(0)
. . S VSRQFLG=1
;
Q:(VSRQFLG) ;quit if flag has been set meaning an unexpected value was sent in the parameter.
; lab - end new logic OR*3.0*479
;
D NEW^GMPLSAVE
;
S RETURN=DA
;
L -^AUPNPROB(0)
S RETURN=1
Q
;
INITUSER(RETURN,ORDUZ) ; INITIALIZE FOR NEW USER
; taken from INIT^GMPLMGR
; leave GMPLUSER on symbol table - is evaluated in EDITSAVE
;
N X,PV,CTXT,GMPLPROV,ORENT
S ORDUZ=$G(ORDUZ,DUZ)
S GMPLUSER=$$CLINUSER(ORDUZ)
S CTXT=$$GET^XPAR("ALL","ORCH CONTEXT PROBLEMS",1)
S X=$G(^GMPL(125.99,1,0)) ; IN1+6^GMPLMGR
S RETURN(0)=GMPLUSER ; problem list user, or other user
S RETURN(1)=$$VIEW^GMPLX1(ORDUZ) ; GMPLVIEW("VIEW") - users default view
S RETURN(2)=+$P(X,U,2) ; verify transcribed problems
S RETURN(3)=+$P(X,U,3) ; prompt for chart copy
S RETURN(4)=+$P(X,U,4) ; use lexicon
S RETURN(5)=$S($P(X,U,5)="R":1,1:0) ; chron or reverse chron listing
S RETURN(6)=$S($P($G(CTXT),";",3)'="":$P($G(CTXT),";",3),1:"A")
S GMPLPROV=$P($G(CTXT),";",5)
I +GMPLPROV>0,$D(^VA(200,GMPLPROV)) D
. S RETURN(7)=GMPLPROV_U_$P(^VA(200,GMPLPROV,0),U)
E S RETURN(7)="0^All"
S RETURN(8)=$$SERVICE^GMPLX1(ORDUZ) ; user's service/section
; Guessing from what I see in the data that $$VIEW^GMPLX1 actually returns a composite
; of default view (in/out patient)/(c1/c2... if out patient i.e. GMPLVIEW("CLIN")) or
; /(s1/s2... if in patient i.e. GMPLVIEW("SERV"))
; Going with this assumption for now:
I $L(RETURN(1),"/")>1 D
. S PV=RETURN(1)
. S RETURN(1)=$P(PV,"/")
. I RETURN(1)="C" S GMPLVIEW("CLIN")=$P(PV,"/",2,99)
. I RETURN(1)="S" S GMPLVIEW("SERV")=$P(PV,"/",2,99)
S RETURN(9)=$G(GMPLVIEW("SERV")) ; ??? Where from - see tech doc
S RETURN(10)=$G(GMPLVIEW("CLIN")) ; ??? Where from - see tech doc
S RETURN(11)=""
S RETURN(12)=+$P($G(CTXT),";",4) ; should comments display?
S ORENT="ALL^SRV.`"_+$$SERVICE^GMPLX1(ORDUZ,1)
S RETURN(13)=+$$GET^XPAR(ORENT,"ORQQPL SUPPRESS CODES",1) ; suppress codes?
K GMPLVIEW
Q
;
CLINUSER(ORDUZ) ;is this a clinical user?
N ORUSER
S ORUSER=0
I $D(^XUSEC("ORES",ORDUZ)) S ORUSER=1
I $D(^XUSEC("ORELSE",ORDUZ)) S ORUSER=1
I $D(^XUSEC("PROVIDER",ORDUZ)) S ORUSER=1
Q ORUSER
;
INITPT(RETURN,DFN) ; GET PATIENT PARAMETERS
Q:+$G(DFN)=0
N GMPSC,GMPAGTOR,GMPION,GMPGULF,GMPHNC,GMPMST,GMPCV,GMPSHD
;
S RETURN(0)=DUZ(2) ; facility #
D DEM^VADPT ; get death indicator
S RETURN(1)=$G(VADM(6)) ; death indicator
D VADPT^GMPLX1(DFN) ; get eligibilities
S RETURN(2)=$P(GMPSC,U) ; service connected
S RETURN(3)=$G(GMPAGTOR) ; agent orange exposure
S RETURN(4)=$G(GMPION) ; ionizing radiation exposure
S RETURN(5)=$G(GMPGULF) ; gulf war exposure
S RETURN(6)=VA("BID") ; need this to reconstitute GMPDFN on return
S RETURN(7)=$G(GMPHNC) ; head/neck cancer
S RETURN(8)=$G(GMPMST) ; MST
S RETURN(9)=$G(GMPCV) ; CV
S RETURN(10)=$G(GMPSHD) ; SHAD
Q
;
PROVSRCH(LST,FLAG,N,FROM,PART) ; Get candidate Rroviders from person file
N LV,NS,RV,IEN
S RV=$NAME(LV("DILIST","ID"))
IF +$G(N)=0 S N=50
S FLAG=$G(FLAG),N=$G(N),FROM=$G(FROM),PART=$G(PART)
D LIST^DIC(200,"",".01;1",FLAG,N,FROM,PART,"","","","LV")
S NS=""
F S NS=$O(LV("DILIST",1,NS)) Q:NS="" D
. S IEN=""
. S IEN=$O(^VA(200,"B",@RV@(NS,.01),IEN)) ; compliments of PROV^ORQPTQ
. S LST(NS)=IEN_U_@RV@(NS,.01) ; initials_U_@RV@(NS,1)
Q
;
CLINSRCH(Y,X) ; Get LIST OF CLINICS
; Note: This comes from CLIN^ORQPTQ2, where it was commented out in place of
; a call to ^XPAR. I would have just used CLIN^ORQPTQ2, but it didn't work - at
; least on SLC OEX directory.
; X has no purpose other than to satisfy apparent rpc and tcallv requirement for args
N I,NAME,IEN
S I=1,IEN=0,NAME=""
;access to SC global granted under DBIA #518:
F S NAME=$O(^SC("B",NAME)) Q:NAME="" S IEN=$O(^(NAME,0)) D
. I $P(^SC(IEN,0),"^",3)="C" S Y(I)=IEN_"^"_NAME,I=I+1
Q
;
SRVCSRCH(Y,FROM,DIR,ALL) ; GET LIST OF SERVICES
N I,IEN,CNT S I=0,CNT=44
F Q:I=CNT S FROM=$O(^DIC(49,"B",FROM),DIR) Q:FROM="" D
. S IEN=$O(^DIC(49,"B",FROM,0)) I '$G(ALL),$P(^DIC(49,IEN,0),U,9)'="C" Q
. S I=I+1,Y(I)=IEN_"^"_FROM
Q
;
DUP(Y,DFN,TERM,TEXT) ;Check for duplicate problem
S Y=$$DUPL^GMPLX(DFN,TERM,TEXT) Q:+Y=0
I $P(^AUPNPROB(Y,1),U,2)="H" S Y=0 Q
S Y=Y_U_$P(^AUPNPROB(Y,0),U,12)
Q
GETDX(ORCODE,ORSYS,ORIDT) ; Get ICD associated with SNOMED CT or VHAT Code
N LEX,ORI,ORY,ORUH,ORIMPDT,ORCSYSPR,ORMAP
S ORIDT=$G(ORIDT,DT)
S ORY=0,ORIMPDT=$$IMPDATE^LEXU("10D")
S ORUH=$S(ORIDT<ORIMPDT:"799.9",1:"R69.")
S ORCSYSPR=$S(ORIDT<ORIMPDT:1,1:30)
I ORSYS["VHAT" D I 1
. I ORIDT<ORIMPDT S ORY=$$GETASSN^LEXTRAN1(ORCODE,"VHAT2ICD") I 1
. E S ORY=0
E D
. S ORMAP=$S(ORIDT<ORIMPDT:"SCT2ICD",1:"SCT210D")
. S ORY=$$GETASSN^LEXTRAN1(ORCODE,ORMAP) I 1
. ;I ORIDT<ORIMPDT S ORY=$$GETASSN^LEXTRAN1(ORCODE,"SCT2ICD") I 1 ; ajb IDT is always greater than so ORY always got set to 0 below
. ;E S ORY=0
I $S(+ORY'>0:1,+$P(ORY,U,2)'>0:1,+LEX'>0:1,1:0) S ORY=ORUH G GETDXX
S ORI=0,ORY=""
F S ORI=$O(LEX(ORI)) Q:+ORI'>0 D
. N ORICD
. S ORICD=$O(LEX(ORI,""))
. S ORICD=$S(ORICD'[".":ORICD_".",1:ORICD)
. S:'+$$STATCHK^ICDEX(ORICD,ORIDT,ORCSYSPR) ORICD=""
. I ORICD]"" S ORY=$S(ORY'="":ORY_"/",1:"")_ORICD
I (ORY]""),(ORY'[".") S ORY=ORY_"."
GETDXX Q ORY
TEST ; test invocation
N LIST,I S I=""
D LEXSRCH(.LIST,"diabetes with neuro",10,"GMPL",DT)
F S I=$O(LIST(I)) Q:+I'>0 W !,LIST(I)
Q
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HORQQPL1 12580 printed Oct 16, 2024@18:34:14 Page 2
ORQQPL1 ; ALB/PDR,REV,ISL/JER,TC,LAB - PROBLEM LIST FOR CPRS GUI ;04/25/19 09:27
+1 ;;3.0;ORDER ENTRY/RESULTS REPORTING;**10,85,148,173,203,206,249,243,280,306,361,385,350,479,377**;Dec 17, 1997;Build 582
+2 ;
+3 ;------------------------- GET PROBLEM FROM LEXICON -------------------
+4 ;
LEXSRCH(LIST,FROM,N,VIEW,ORDATE) ; Get candidate Problems from LEX file
+1 NEW LEX,VAL,VAL1,COD,CIEN,SYS,MAX,NAME,ORIMPDT,ICDCSYS,ICDCODE
+2 SET ORIMPDT=$$IMPDATE^LEXU("10D")
+3 if '+$GET(ORDATE)
SET ORDATE=DT
+4 if '$GET(N)
SET N=100
+5 if '$LENGTH($GET(VIEW))
SET VIEW="PL1"
+6 DO CONFIG^LEXSET("GMPL",VIEW,ORDATE)
+7 DO LOOK^LEXA(FROM,"GMPL",N,"",ORDATE)
+8 SET S=0
+9 FOR
SET S=$ORDER(LEX("LIST",S))
if S<1
QUIT
Begin DoDot:1
+10 SET VAL1=LEX("LIST",S)
+11 SET COD=""
SET CIEN=""
SET SYS=""
SET NAME=""
SET ICDCODE=""
+12 SET ICDCSYS=$SELECT(ORDATE<ORIMPDT:"ICD",1:"10D")
+13 IF $LENGTH(VAL1,"CPT-4 ")>1
Begin DoDot:2
+14 SET SYS=$SELECT(ORDATE<ORIMPDT:"ICD-9-CM ",1:"ICD-10-CM ")
+15 SET COD=$SELECT(ORDATE<ORIMPDT:"799.9",1:"R69")
+16 SET CIEN=""
+17 SET NAME=$PIECE(VAL1," (CPT-4")
End DoDot:2
+18 IF $LENGTH(VAL1,"DSM-IV ")>1
Begin DoDot:2
+19 SET SYS="DSM-IV "
+20 SET COD=$PIECE($PIECE(VAL1,SYS,2),")")
+21 if COD["/"
SET COD=$PIECE(COD,"/",1)
+22 SET ICDCODE=$$ONE^LEXU($PIECE(VAL1,U,1),ORDATE,ICDCSYS)
+23 SET ICDCODE=$SELECT(ICDCODE["":COD,1:ICDCODE)
+24 SET CIEN=+$$ICDDATA^ICDXCODE(ICDCSYS,$GET(ICDCODE),ORDATE,"E")
+25 SET NAME=$PIECE(VAL1," (DSM-IV")
+26 ;
End DoDot:2
+27 IF $LENGTH(VAL1,"(TITLE 38 ")>1
Begin DoDot:2
+28 SET SYS="TITLE 38 "
+29 SET COD=$PIECE($PIECE(VAL1,SYS,2),")")
+30 if COD["/"
SET COD=$PIECE(COD,"/",1)
+31 SET ICDCODE=$$ONE^LEXU($PIECE(VAL1,U,1),ORDATE,ICDCSYS)
+32 SET ICDCODE=$SELECT(ICDCODE["":COD,1:ICDCODE)
+33 SET CIEN=+$$ICDDATA^ICDXCODE(ICDCSYS,$GET(ICDCODE),ORDATE,"E")
+34 SET NAME=$PIECE(VAL1,"(TITLE 38 ")
+35 ;
End DoDot:2
+36 IF $LENGTH(VAL1,"ICD-9-CM ")>1
Begin DoDot:2
+37 SET SYS="ICD-9-CM "
+38 SET COD=$PIECE($PIECE(VAL1,SYS,2),")")
+39 if COD["/"
SET COD=$PIECE(COD,"/",1)
+40 SET CIEN=+$$ICDDATA^ICDXCODE("DIAG",$GET(COD),ORDATE,"E")
+41 SET NAME=$PIECE(VAL1," (ICD-9-CM")
+42 ;
End DoDot:2
+43 IF $LENGTH(VAL1,"ICD-10-CM ")>1
Begin DoDot:2
+44 SET SYS="ICD-10-CM "
+45 SET COD=$PIECE($PIECE(VAL1,SYS,2),")")
+46 if COD["/"
SET COD=$PIECE(COD,"/",1)
+47 SET CIEN=+$$ICDDATA^ICDXCODE("DIAG",$GET(COD),ORDATE,"E")
+48 SET NAME=$PIECE(VAL1," (ICD-10-CM")
End DoDot:2
+49 IF $LENGTH(NAME)=0
SET NAME=$PIECE($PIECE(VAL1," (")," *")
+50 ;
+51 ; jeh Clean left over codes
+52 SET NAME=$PIECE(NAME," (CPT-4")
+53 SET NAME=$PIECE(NAME," (DSM-IV")
+54 SET NAME=$PIECE(NAME,"(TITLE 38 ")
+55 SET NAME=$PIECE(NAME," (ICD-9-CM")
+56 SET NAME=$PIECE(NAME," (ICD-10-CM")
+57 ;
+58 ; ien^.01^icd^icdifn^system
SET VAL=NAME_U_COD_U_CIEN_U_SYS
+59 SET LIST(S)=VAL
+60 SET MAX=S
End DoDot:1
+61 IF $GET(MAX)'=""
SET LIST(MAX+1)=$GET(LEX("MAT"))
+62 KILL ^TMP("LEXSCH",$JOB)
+63 QUIT
+64 ;
SORT(LEX) ; Sort terms alphabetically
+1 NEW ORI
SET ORI=0
+2 FOR
SET ORI=$ORDER(LEX("LIST",ORI))
if +ORI'>0
QUIT
SET LEX("ALPHA",$EXTRACT($PIECE(LEX("LIST",ORI),U,2),1,255),ORI)=""
+3 QUIT
+4 ;
ICDREC(COD) ;
+1 NEW CODIEN,ICDCSYS
+2 IF COD=""
QUIT ""
+3 SET COD=$PIECE($PIECE(COD,U),"/")
+4 ;ICR #5747
SET ICDCSYS=$$SAB^ICDEX(+$$CODECS^ICDEX($GET(COD),80,DT),DT)
+5 ;ICR #5699
SET CODIEN=+$$ICDDATA^ICDXCODE(ICDCSYS,$GET(COD),DT,"E")
+6 QUIT CODIEN
+7 ;
CPTREC(COD) ;
+1 IF COD=""
QUIT ""
+2 ;ICR #1995
QUIT $$CODEN^ICPTCOD(COD)
+3 ;
EDLOAD(RETURN,DA) ; LOAD EDIT ARRAYS
+1 ; DA=problem IFN
+2 NEW I,GMPFLD,GMPORIG,GMPL
+3 DO GETFLDS^GMPLEDT3(DA)
+4 SET I=0
+5 DO LOADFLDS(.RETURN,"GMPFLD","NEW",.I)
+6 DO LOADFLDS(.RETURN,"GMPORIG","ORG",.I)
+7 ; should not have to do this
KILL GMPFLD,GMPORIG,GMPL
+8 QUIT
+9 ;
LOADFLDS(RETURN,NAM,TYP,I) ; LOAD FIELDS FOR TYPE OF ARRAY
+1 NEW S,V,CVP,PN,PID
+2 SET S=""
SET V=$CHAR(254)
+3 FOR
SET S=$ORDER(@NAM@(S))
if S=10
QUIT
Begin DoDot:1
+4 SET RETURN(I)=TYP_V_S_V_@NAM@(S)
+5 SET I=I+1
End DoDot:1
+6 SET S=""
+7 FOR
SET S=$ORDER(@NAM@(10,S))
if S=""
QUIT
Begin DoDot:1
+8 SET CVP=@NAM@(10,S)
+9 ; provider name
SET PN=""
+10 ; provider id
SET PID=$PIECE(CVP,U,6)
+11 ; get provider name
IF PID'=""
SET PN=$$GET1^DIQ(200,PID,.01)
+12 SET RETURN(I)=TYP_V_"10,"_S_V_CVP_U_PN
+13 SET I=I+1
End DoDot:1
+14 SET S=80000
+15 FOR
SET S=$ORDER(@NAM@(S))
if S=""
QUIT
Begin DoDot:1
+16 SET RETURN(I)=TYP_V_S_V_@NAM@(S)
+17 SET I=I+1
End DoDot:1
+18 QUIT
+19 ;
EDSAVE(RETURN,GMPIFN,GMPROV,GMPVAMC,UT,EDARRAY,GMPSRCH) ; SAVE EDITED RES
+1 ; RETURN - boolean, 1 success, 0 failure
+2 ; EDARRAY - array used for indirect sets of GMPORIG() and GMPFLDS()
+3 ;
+4 NEW GMPFLD,GMPORIG,S,GMPLUSER
+5 ; lab OR*3.0*479 added new variable
NEW VSRQFLG
+6 SET VSRQFLG=0
+7 SET GMPSRCH=$GET(GMPSRCH)
+8 ; initialize for success
SET RETURN=1
+9 IF UT
SET GMPLUSER=1
+10 ;
+11 SET S=""
+12 FOR
SET S=$ORDER(EDARRAY(S))
if S=""
QUIT
Begin DoDot:1
+13 ;S @EDARRAY(S) D lab OR*3.0*479 commented out EDDARRAY and added new logic below
+14 ; lab OR*3.0*479 Adding data checks to prevent backdoor access into VistA
+15 ; lab - start new logic OR*3.0*479
+16 IF ($EXTRACT(EDARRAY(S),1,6)="GMPFLD")!($EXTRACT(EDARRAY(S),1,7)="GMPORIG")
Begin DoDot:2
+17 IF $EXTRACT(EDARRAY(S),$FIND(EDARRAY(S),"="))=""""
Begin DoDot:3
+18 SET @EDARRAY(S)
End DoDot:3
+19 IF '$TEST
Begin DoDot:3
+20 SET RETURN=0
+21 SET VSRQFLG=1
End DoDot:3
End DoDot:2
+22 IF '$TEST
Begin DoDot:2
+23 SET RETURN=0
+24 SET VSRQFLG=1
End DoDot:2
End DoDot:1
+25 ;
+26 ;quit if flag has been set meaning an unexpected value was sent in the parameter.
if (VSRQFLG)
QUIT
+27 ; lab - end new logic OR*3.0*479
+28 ; Bail Out if no lock
IF $DATA(GMPFLD(10,"NEW"))>9
Begin DoDot:1
+29 ; given bogus nature of this lock, should be able to get
LOCK +^AUPNPROB(GMPIFN,11):10
+30 IF '$TEST
SET RETURN=0
End DoDot:1
IF 'RETURN
QUIT
+31 ;
+32 ; save the data
DO EN^GMPLSAVE
+33 KILL GMPFLD,GMPORIG
+34 ;
+35 ; free this instance of lock (in case it was set)
LOCK -^AUPNPROB(GMPIFN,11)
+36 SET RETURN=1
+37 QUIT
+38 ;
UPDATE(ORRETURN,UPDARRAY) ; UPDATE A PROBLEM RECORD
+1 ; Does essentially same job as EDSAVE above, however does not handle edits to comments
+2 ; or addition of multiple comments.
+3 ; Use initially just for status updates.
+4 ;
+5 ; last 2 vars created in nested call
NEW S,GMPL,GMPORIG,ORARRAY
+6 ; lab OR*3.0*479 added new variable
NEW VSRQFLG
+7 SET VSRQFLG=0
+8 SET S=""
+9 FOR
SET S=$ORDER(UPDARRAY(S))
if S=""
QUIT
Begin DoDot:1
+10 ;S @UPDARRAY(S) lab OR*3.0*479 commented out UPDARRAY and added new logic below
+11 ; lab OR*3.0*479 Adding data checks to prevent backdoor access into VistA
+12 ; lab - start new logic OR*3.0*479
+13 IF ($EXTRACT(UPDARRAY(S),1,7)="ORARRAY")
Begin DoDot:2
+14 IF $EXTRACT(UPDARRAY(S),$FIND(UPDARRAY(S),"="))=""""
Begin DoDot:3
+15 SET @UPDARRAY(S)
End DoDot:3
+16 IF '$TEST
Begin DoDot:3
+17 SET ORRETURN(0)=0
+18 SET ORRETURN(1)="Unexpected array value."
+19 SET VSRQFLG=1
End DoDot:3
End DoDot:2
+20 IF '$TEST
Begin DoDot:2
+21 SET ORRETURN(0)=0
+22 SET ORRETURN(1)="Unexpected array value."
+23 SET VSRQFLG=1
End DoDot:2
End DoDot:1
+24 ;
+25 ;quit if flag has been set meaning an unexpected value was sent in the parameter.
if (VSRQFLG)
QUIT
+26 ; lab - end new logic OR*3.0*479
+27 DO UPDATE^GMPLUTL(.ORARRAY,.ORRETURN)
+28 ; broker wont pick up root node RETURN
+29 ; error text
SET ORRETURN(1)=ORRETURN(0)
+30 ; gmpdfn
SET ORRETURN(0)=ORRETURN
+31 ; insurance ? need
IF ORRETURN(0)=""
SET ORRETURN=1
+32 QUIT
+33 ;
ADDSAVE(RETURN,GMPDFN,GMPROV,GMPVAMC,ADDARRAY,GMPSRCH) ; SAVE NEW RECORD
+1 ; RETURN - Problem IFN if success, 0 otherwise
+2 ; ADDARRAY - array used for indirect sets of GMPFLDS()
+3 ;
+4 NEW DA,GMPFLD,GMPORIG,S
+5 ; lab OR*3.0*479 added new variable
NEW VSRQFLG
+6 SET VSRQFLG=0
+7 SET GMPSRCH=$GET(GMPSRCH)
+8 ;
SET RETURN=0
+9 LOCK +^AUPNPROB(0):10
+10 ; bail out if no lock
if '$TEST
QUIT
+11 ;
+12 SET S=""
+13 FOR
SET S=$ORDER(ADDARRAY(S))
if S=""
QUIT
Begin DoDot:1
+14 ; lab - S @ADDARRAY(S) OR*3.0*479 commented out ADDARRAY and added new logic below
+15 ; lab - for VSR project, adding data checks to prevent backdoor access into VistA
+16 ; lab - start new logic
+17 IF $EXTRACT(ADDARRAY(S),1,6)="GMPFLD"
Begin DoDot:2
+18 IF $EXTRACT(ADDARRAY(S),$FIND(ADDARRAY(S),"="))=""""
Begin DoDot:3
+19 SET @ADDARRAY(S)
End DoDot:3
+20 IF '$TEST
Begin DoDot:3
+21 SET RETURN=0
+22 LOCK -^AUPNPROB(0)
+23 SET VSRQFLG=1
End DoDot:3
End DoDot:2
+24 IF '$TEST
Begin DoDot:2
+25 SET RETURN=0
+26 LOCK -^AUPNPROB(0)
+27 SET VSRQFLG=1
End DoDot:2
End DoDot:1
+28 ;
+29 ;quit if flag has been set meaning an unexpected value was sent in the parameter.
if (VSRQFLG)
QUIT
+30 ; lab - end new logic OR*3.0*479
+31 ;
+32 DO NEW^GMPLSAVE
+33 ;
+34 SET RETURN=DA
+35 ;
+36 LOCK -^AUPNPROB(0)
+37 SET RETURN=1
+38 QUIT
+39 ;
INITUSER(RETURN,ORDUZ) ; INITIALIZE FOR NEW USER
+1 ; taken from INIT^GMPLMGR
+2 ; leave GMPLUSER on symbol table - is evaluated in EDITSAVE
+3 ;
+4 NEW X,PV,CTXT,GMPLPROV,ORENT
+5 SET ORDUZ=$GET(ORDUZ,DUZ)
+6 SET GMPLUSER=$$CLINUSER(ORDUZ)
+7 SET CTXT=$$GET^XPAR("ALL","ORCH CONTEXT PROBLEMS",1)
+8 ; IN1+6^GMPLMGR
SET X=$GET(^GMPL(125.99,1,0))
+9 ; problem list user, or other user
SET RETURN(0)=GMPLUSER
+10 ; GMPLVIEW("VIEW") - users default view
SET RETURN(1)=$$VIEW^GMPLX1(ORDUZ)
+11 ; verify transcribed problems
SET RETURN(2)=+$PIECE(X,U,2)
+12 ; prompt for chart copy
SET RETURN(3)=+$PIECE(X,U,3)
+13 ; use lexicon
SET RETURN(4)=+$PIECE(X,U,4)
+14 ; chron or reverse chron listing
SET RETURN(5)=$SELECT($PIECE(X,U,5)="R":1,1:0)
+15 SET RETURN(6)=$SELECT($PIECE($GET(CTXT),";",3)'="":$PIECE($GET(CTXT),";",3),1:"A")
+16 SET GMPLPROV=$PIECE($GET(CTXT),";",5)
+17 IF +GMPLPROV>0
IF $DATA(^VA(200,GMPLPROV))
Begin DoDot:1
+18 SET RETURN(7)=GMPLPROV_U_$PIECE(^VA(200,GMPLPROV,0),U)
End DoDot:1
+19 IF '$TEST
SET RETURN(7)="0^All"
+20 ; user's service/section
SET RETURN(8)=$$SERVICE^GMPLX1(ORDUZ)
+21 ; Guessing from what I see in the data that $$VIEW^GMPLX1 actually returns a composite
+22 ; of default view (in/out patient)/(c1/c2... if out patient i.e. GMPLVIEW("CLIN")) or
+23 ; /(s1/s2... if in patient i.e. GMPLVIEW("SERV"))
+24 ; Going with this assumption for now:
+25 IF $LENGTH(RETURN(1),"/")>1
Begin DoDot:1
+26 SET PV=RETURN(1)
+27 SET RETURN(1)=$PIECE(PV,"/")
+28 IF RETURN(1)="C"
SET GMPLVIEW("CLIN")=$PIECE(PV,"/",2,99)
+29 IF RETURN(1)="S"
SET GMPLVIEW("SERV")=$PIECE(PV,"/",2,99)
End DoDot:1
+30 ; ??? Where from - see tech doc
SET RETURN(9)=$GET(GMPLVIEW("SERV"))
+31 ; ??? Where from - see tech doc
SET RETURN(10)=$GET(GMPLVIEW("CLIN"))
+32 SET RETURN(11)=""
+33 ; should comments display?
SET RETURN(12)=+$PIECE($GET(CTXT),";",4)
+34 SET ORENT="ALL^SRV.`"_+$$SERVICE^GMPLX1(ORDUZ,1)
+35 ; suppress codes?
SET RETURN(13)=+$$GET^XPAR(ORENT,"ORQQPL SUPPRESS CODES",1)
+36 KILL GMPLVIEW
+37 QUIT
+38 ;
CLINUSER(ORDUZ) ;is this a clinical user?
+1 NEW ORUSER
+2 SET ORUSER=0
+3 IF $DATA(^XUSEC("ORES",ORDUZ))
SET ORUSER=1
+4 IF $DATA(^XUSEC("ORELSE",ORDUZ))
SET ORUSER=1
+5 IF $DATA(^XUSEC("PROVIDER",ORDUZ))
SET ORUSER=1
+6 QUIT ORUSER
+7 ;
INITPT(RETURN,DFN) ; GET PATIENT PARAMETERS
+1 if +$GET(DFN)=0
QUIT
+2 NEW GMPSC,GMPAGTOR,GMPION,GMPGULF,GMPHNC,GMPMST,GMPCV,GMPSHD
+3 ;
+4 ; facility #
SET RETURN(0)=DUZ(2)
+5 ; get death indicator
DO DEM^VADPT
+6 ; death indicator
SET RETURN(1)=$GET(VADM(6))
+7 ; get eligibilities
DO VADPT^GMPLX1(DFN)
+8 ; service connected
SET RETURN(2)=$PIECE(GMPSC,U)
+9 ; agent orange exposure
SET RETURN(3)=$GET(GMPAGTOR)
+10 ; ionizing radiation exposure
SET RETURN(4)=$GET(GMPION)
+11 ; gulf war exposure
SET RETURN(5)=$GET(GMPGULF)
+12 ; need this to reconstitute GMPDFN on return
SET RETURN(6)=VA("BID")
+13 ; head/neck cancer
SET RETURN(7)=$GET(GMPHNC)
+14 ; MST
SET RETURN(8)=$GET(GMPMST)
+15 ; CV
SET RETURN(9)=$GET(GMPCV)
+16 ; SHAD
SET RETURN(10)=$GET(GMPSHD)
+17 QUIT
+18 ;
PROVSRCH(LST,FLAG,N,FROM,PART) ; Get candidate Rroviders from person file
+1 NEW LV,NS,RV,IEN
+2 SET RV=$NAME(LV("DILIST","ID"))
+3 IF +$GET(N)=0
SET N=50
+4 SET FLAG=$GET(FLAG)
SET N=$GET(N)
SET FROM=$GET(FROM)
SET PART=$GET(PART)
+5 DO LIST^DIC(200,"",".01;1",FLAG,N,FROM,PART,"","","","LV")
+6 SET NS=""
+7 FOR
SET NS=$ORDER(LV("DILIST",1,NS))
if NS=""
QUIT
Begin DoDot:1
+8 SET IEN=""
+9 ; compliments of PROV^ORQPTQ
SET IEN=$ORDER(^VA(200,"B",@RV@(NS,.01),IEN))
+10 ; initials_U_@RV@(NS,1)
SET LST(NS)=IEN_U_@RV@(NS,.01)
End DoDot:1
+11 QUIT
+12 ;
CLINSRCH(Y,X) ; Get LIST OF CLINICS
+1 ; Note: This comes from CLIN^ORQPTQ2, where it was commented out in place of
+2 ; a call to ^XPAR. I would have just used CLIN^ORQPTQ2, but it didn't work - at
+3 ; least on SLC OEX directory.
+4 ; X has no purpose other than to satisfy apparent rpc and tcallv requirement for args
+5 NEW I,NAME,IEN
+6 SET I=1
SET IEN=0
SET NAME=""
+7 ;access to SC global granted under DBIA #518:
+8 FOR
SET NAME=$ORDER(^SC("B",NAME))
if NAME=""
QUIT
SET IEN=$ORDER(^(NAME,0))
Begin DoDot:1
+9 IF $PIECE(^SC(IEN,0),"^",3)="C"
SET Y(I)=IEN_"^"_NAME
SET I=I+1
End DoDot:1
+10 QUIT
+11 ;
SRVCSRCH(Y,FROM,DIR,ALL) ; GET LIST OF SERVICES
+1 NEW I,IEN,CNT
SET I=0
SET CNT=44
+2 FOR
if I=CNT
QUIT
SET FROM=$ORDER(^DIC(49,"B",FROM),DIR)
if FROM=""
QUIT
Begin DoDot:1
+3 SET IEN=$ORDER(^DIC(49,"B",FROM,0))
IF '$GET(ALL)
IF $PIECE(^DIC(49,IEN,0),U,9)'="C"
QUIT
+4 SET I=I+1
SET Y(I)=IEN_"^"_FROM
End DoDot:1
+5 QUIT
+6 ;
DUP(Y,DFN,TERM,TEXT) ;Check for duplicate problem
+1 SET Y=$$DUPL^GMPLX(DFN,TERM,TEXT)
if +Y=0
QUIT
+2 IF $PIECE(^AUPNPROB(Y,1),U,2)="H"
SET Y=0
QUIT
+3 SET Y=Y_U_$PIECE(^AUPNPROB(Y,0),U,12)
+4 QUIT
GETDX(ORCODE,ORSYS,ORIDT) ; Get ICD associated with SNOMED CT or VHAT Code
+1 NEW LEX,ORI,ORY,ORUH,ORIMPDT,ORCSYSPR,ORMAP
+2 SET ORIDT=$GET(ORIDT,DT)
+3 SET ORY=0
SET ORIMPDT=$$IMPDATE^LEXU("10D")
+4 SET ORUH=$SELECT(ORIDT<ORIMPDT:"799.9",1:"R69.")
+5 SET ORCSYSPR=$SELECT(ORIDT<ORIMPDT:1,1:30)
+6 IF ORSYS["VHAT"
Begin DoDot:1
+7 IF ORIDT<ORIMPDT
SET ORY=$$GETASSN^LEXTRAN1(ORCODE,"VHAT2ICD")
IF 1
+8 IF '$TEST
SET ORY=0
End DoDot:1
IF 1
+9 IF '$TEST
Begin DoDot:1
+10 SET ORMAP=$SELECT(ORIDT<ORIMPDT:"SCT2ICD",1:"SCT210D")
+11 SET ORY=$$GETASSN^LEXTRAN1(ORCODE,ORMAP)
IF 1
+12 ;I ORIDT<ORIMPDT S ORY=$$GETASSN^LEXTRAN1(ORCODE,"SCT2ICD") I 1 ; ajb IDT is always greater than so ORY always got set to 0 below
+13 ;E S ORY=0
End DoDot:1
+14 IF $SELECT(+ORY'>0:1,+$PIECE(ORY,U,2)'>0:1,+LEX'>0:1,1:0)
SET ORY=ORUH
GOTO GETDXX
+15 SET ORI=0
SET ORY=""
+16 FOR
SET ORI=$ORDER(LEX(ORI))
if +ORI'>0
QUIT
Begin DoDot:1
+17 NEW ORICD
+18 SET ORICD=$ORDER(LEX(ORI,""))
+19 SET ORICD=$SELECT(ORICD'[".":ORICD_".",1:ORICD)
+20 if '+$$STATCHK^ICDEX(ORICD,ORIDT,ORCSYSPR)
SET ORICD=""
+21 IF ORICD]""
SET ORY=$SELECT(ORY'="":ORY_"/",1:"")_ORICD
End DoDot:1
+22 IF (ORY]"")
IF (ORY'[".")
SET ORY=ORY_"."
GETDXX QUIT ORY
TEST ; test invocation
+1 NEW LIST,I
SET I=""
+2 DO LEXSRCH(.LIST,"diabetes with neuro",10,"GMPL",DT)
+3 FOR
SET I=$ORDER(LIST(I))
if +I'>0
QUIT
WRITE !,LIST(I)
+4 QUIT