- ICDDRGM ;ALB/GRR/EG/ADL/KUM - GROUPER DRIVER ;28 Oct 2013 5:41 PM
- ;;18.0;DRG Grouper;**7,36,57,64**;Oct 20, 2000;Build 103
- ;
- ; ADL Add Date prompt and passing of effective date for DRG CSV project
- ; ADL Update DIC("S") code to screen using new function calls
- ; ADL Update to access DRG file using new API for CSV Project
- ; KER Remove direct global reads, update for ICD-10
- ;
- ; Global Variables
- ; ^DPT( ICR 10035
- ;
- ; External References
- ; ^%DTC ICR 10000
- ; ^DIC ICR 10006
- ; ^DIR ICR 10026
- ; $$DT^XLFDT ICR 10103
- ; H^XUS ICR 10044
- ; ^ICDDRG ICR N/A
- ; $$DRG^ICDEX ICR N/A
- ; $$DRGD^ICDEX ICR N/A
- ; $$ROOT^ICDEX ICR N/A
- ;
- ; Local Variables NEWed or KILLed Elsewhere
- ; DIRUT,ICDDATE,QUIT,Y
- ;
- S U="^",DT=$$DT^XLFDT W !!?11,"DRG Grouper Version ","18.0",!! ;$$VERSION^XPDUTL("ICD"),!!
- PAT ; Patient
- D KILL
- S ICDQU=0 K ICDEXP,SEX,ICDDX,ICDSURG,ICDPOA,ICDCSYS
- D EFFDATE G KILL:$D(DUOUT),ICDOUT:$D(DTOUT)
- S DIR(0)="Y",DIR("A")="DRGs for Registered PATIENTS (Y/N)",DIR("B")="YES"
- S DIR("?")="Enter 'Yes' if the patient has been previously registered, enter 'No' for other patient, or '^' to quit."
- D ^DIR K DIR S ICDPT=Y G KILL:$D(DUOUT),ICDOUT:$D(DTOUT)
- PAT0 ; Patient - Ask again
- G:ICDPT=0 ASK
- VA ; VA Patient File #2
- S DIC="^DPT(",DIC(0)="AEQMZ" D ^DIC G Q:X=""!(X[U)!(Y'>0),ICDOUT:$D(DTOUT) S DFN=+Y,(DOB,AGE)=$P(Y(0),U,3),SEX=$P(Y(0),U,2)
- D TAC G:ICDQU PAT D DAM G:ICDQU PAT
- EN1 ; Entry Point - Patient is known (DFN)
- I $D(^DPT(DFN,.35)),$L(^DPT(DFN,.35)) D ALIVE G:ICDQU PAT
- S ICDEXP=$S($D(ICDEXP):ICDEXP,1:0)
- I AGE]"" N %,X,X1,X2 S X1=DT,X2=AGE D ^%DTC S AGE=X\365.25 W " AGE: ",AGE
- CD ;Prompt POA if ICD-10 DRG calculation
- S ICDCSYS=$S(ICDDATE'<$$IMPDATE^LEXU("10D"):"ICD10",1:"ICD9")
- D ICDCD G PAT:$G(QUIT)
- G Q:X[U
- OP ; PROCEDURE CODE SELECTION
- S ICDCDSY=$S(ICDCSYS="ICD9":2,1:31),ICDCV="(ICD "_$P(ICDCSYS,"ICD",2)_")"
- S DIC("A")="Enter Operation/Procedure "_ICDCV_": "
- W !
- F ICDNOR=1:1 D Q:X=""!(X[U) G:$D(DTOUT) ICDOUT I X'=0,Y>0 S ICDPRC(ICDNOR)=+Y,ICDSURG(ICDNOR)=X
- .;I ICDCSYS="ICD10" S ICDXX1=1 S ICDPRC="" D ASK^ICDCODLK K ICDXX1
- .I ICDCSYS="ICD10" D PROC
- .I ICDCSYS="ICD9" S ICDPRC="" D ICD9OP
- K DIC,ICDCDSY,ICDCV G Q:X["^"
- ;Rearrange ICDPRC array
- S X=0,ICDCNT=1
- F S X=$O(ICDPRC(X)) Q:'X D
- . S ICDPRCT(ICDCNT)=ICDPRC(X)
- . S ICDCNT=ICDCNT+1
- K ICDPRC
- M ICDPRC=ICDPRCT
- ;Rearrange ICDSURG array
- S X=0,ICDCNT=1
- F S X=$O(ICDSURG(X)) Q:'X D
- . S ICDSURGT(ICDCNT)=ICDSURG(X)
- . S ICDCNT=ICDCNT+1
- K ICDSURG
- M ICDSURG=ICDSURGT
- ;
- I ICDCSYS="ICD10" M ICDDXZ=ICDDX,ICDPRCZ=ICDPRC,ICDPOAZ=ICDPOA
- D ^ICDDRG
- D WRT
- I ICDCSYS="ICD10" K ICDEXP,SEX,ICDDX,ICDSURG,ICDPOA,ICDPRC,ICDDXZ,ICDPRCZ,ICDPOAZ,ICDPRCT,ICDCNT,ICDSURGT
- G PAT0
- WRT S ICDDRG(0)=$$DRG^ICDEX(+ICDDRG,ICDDATE) ; new CSV code
- I ICDCSYS="ICD10" D
- . S ICDTMP=$$ICDDX^ICDEX(ICDDXZ(1),ICDDATE,"10D","I")
- . W !,"Principal Diagnosis: ",$P(ICDTMP,U,2),?30,$E($$VST^ICDEX(80,ICDDXZ(1),ICDDATE),1,44),?75,"POA=",$S($G(ICDPOAZ(1))'="":ICDPOAZ(1),1:"-")
- . F ICDI=2:1 Q:'$D(ICDDXZ(ICDI)) D
- . . S ICDTMP=$$ICDDX^ICDEX(ICDDXZ(ICDI),ICDDATE,"10D","I")
- . . W:ICDI=2 !,"Secondary Diagnosis: " W:ICDI>2 !?21 W $P(ICDTMP,U,2),?30,$E($$VST^ICDEX(80,ICDDXZ(ICDI),ICDDATE),1,44),?75,"POA=",$S($G(ICDPOAZ(ICDI))'="":ICDPOAZ(ICDI),1:"-")
- . F ICDI=1:1 Q:'$D(ICDPRCZ(ICDI)) D
- . . S ICDTMP=$$ICDOP^ICDEX(ICDPRCZ(ICDI),ICDDATE,"10P","I")
- . . W:ICDI=1 !!,"Procedure Code: " W:ICDI>1 ! W ?21,$P(ICDTMP,U,2),?30,$E($$VST^ICDEX(80.1,ICDPRCZ(ICDI),ICDDATE),1,50)
- W !!?9,"Effective Date: "," ",ICDDSP
- W !,"Diagnosis Related Group: ",$J(ICDDRG,6),?40,"Avg len of stay: ",$J($P(ICDDRG(0),"^",8),6)
- W !?17,"Weight: ",$J($P(ICDDRG(0),"^",2),6),?40,"Local Breakeven: ",$J($P(ICDDRG(0),"^",12),6)
- W !?12," Low day(s): ",$J($P(ICDDRG(0),"^",3),6),?39,"Local low day(s): ",$J($P(ICDDRG(0),"^",9),6)
- W !?13," High days: ",$J($P(ICDDRG(0),"^",4),6),?40,"Local High days: ",$J($P(ICDDRG(0),"^",10),6)
- ;W !!,"DRG: ",ICDDRG,"-" F I=0:0 S I=$N(^ICD(ICDDRG,1,I)) Q:I'>0 W ?10,$P(^(I,0),U,1),!
- ;W !!,"DRG: ",ICDDRG,"-" F I=0:0 S I=$O(^ICD(ICDDRG,1,I)) Q:(I="")!(I'?.N) W ?10,$P(^(I,0),U,1),!
- N ICDXD,ICDGDX,ICDGI
- S ICDXD=$$DRGD^ICDEX(ICDDRG,"ICDGDX",ICDDATE),ICDGI=0
- W !!,"DRG: ",ICDDRG,"-" F S ICDGI=$O(ICDGDX(ICDGI)) Q:'+ICDGI Q:ICDGDX(ICDGI)=" " W ?10,ICDGDX(ICDGI),!
- Q
- ERROR D WRT
- I ICDRTC<5 W !!,"Invalid ",$S(ICDRTC=1:"Principal Diagnosis",ICDRTC=2:"Operation/Procedure",ICDRTC=3:"Age",ICDRTC=4:"Sex",1:"") G PAT0
- I ICDRTC=5 W !!,"Grouper needs to know if patient died during this episode!" G PAT0
- I ICDRTC=6 W !!,"Grouper needs to know if patient was transferred to an acute care facility!" G PAT0
- I ICDRTC=7 W !!,"Grouper needs to know if patient was discharged against medical advice!" G PAT0
- I ICDRTC=8 W !!,"Patient assigned newborn diagnosis code. Check diagnosis!" G PAT0
- G PAT0
- KILL K DIC,DFN,DUOUT,DTOUT,ICDNOR,ICDDX,ICDPRC,ICDEXP,ICDTRS,ICDDMS,ICDDRG,ICDMDC,ICDO24,ICDP24,ICDP25,ICDRTC,ICDPT,ICDQU,ICDSD,ICDNMDC
- K ICDMAJ,ICDS25,ICDSEX,AGE,DOB,CC,HICDRG,ICD,ICDCC3,ICDJ,ICDJJ,ICDL39,ICDFZ,ICDDT,ICDDSP,IENT,QUIT
- Q
- Q G PAT
- AGE S DIR(0)="NOA^0:124:0",DIR("A")="Patient's age: ",DIR("?")="Enter how old the patient is (0-124)." D ^DIR K DIR S AGE=Y G QQ:$D(DUOUT),ICDOUT:$D(DTOUT)
- Q
- ALIVE S DIR(0)="YO",DIR("A")="Did patient die during this episode" D ^DIR K DIR S ICDEXP=Y G QQ:$D(DUOUT),ICDOUT:$D(DTOUT)
- Q
- TAC S DIR(0)="YO",DIR("A")="Was patient transferred to an acute care facility" D ^DIR K DIR S ICDTRS=Y G QQ:$D(DUOUT),ICDOUT:$D(DTOUT)
- Q
- DAM S DIR(0)="YO",DIR("A")="Was patient discharged against medical advice" D ^DIR K DIR S ICDDMS=Y G QQ:$D(DUOUT),ICDOUT:$D(DTOUT)
- Q
- SEX S DIR(0)="SBO^M:MALE;F:FEMALE",DIR("?")="Enter M for Male and F for Female",DIR("A")="Patient's Sex" D ^DIR K DIR S SEX=Y G QQ:$D(DUOUT),ICDOUT:$D(DTOUT)
- Q
- QQ S ICDQU=1 Q
- EFFDATE ;prompts for effective date for DRG grouper?
- K DIR S DIR(0)="D^::AEX",DIR("B")="TODAY",DIR("A")="Effective Date"
- S DIR("?")="The effective to be used when calculating the DRG code for the patient."
- D ^DIR K DIR I $D(DIRUT) S QUIT=1 Q
- S ICDDATE=Y,ICDDSP=Y(0)
- Q
- ASK K DTOUT,DUOUT D AGE G:ICDQU PAT D ALIVE G:ICDQU PAT D TAC G:ICDQU PAT D DAM G:ICDQU PAT D SEX G:ICDQU PAT G CD
- ICDOUT G H^XUS
- ;
- ICDCD ;prompts for ICD diagnosis codes; ALB/JAM *64 ICD10 changes
- N ICDPDXV,ICDSDXV,ICDDXPOA,ICDSD,ICDSC
- S ICDSC="(ICD "_$P(ICDCSYS,"ICD",2)_")"
- S ICDPDXV=$$ICDPDX Q:$G(QUIT)!(ICDPDXV<0) S ICDDX(1)=ICDPDXV
- ;if ICD9 code skip POA question
- I ICDCSYS="ICD9" G ICDSDXV
- S ICDDXPOA=$$POA(ICDPDXV) Q:$G(QUIT) S ICDPOA(1)=$TR(ICDDXPOA,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ")
- ICDSDXV F ICDSD=2:1 S ICDSDXV=$$ICDSDX Q:$G(QUIT)!(ICDSDXV'>0) S ICDDX(ICDSD)=ICDSDXV D Q:$G(QUIT)
- .; if ICD9 code skip POA question
- .I ICDCSYS="ICD9" Q
- .S ICDDXPOA=$$POA(ICDSDXV) Q:$G(QUIT) S ICDPOA(ICDSD)=$TR(ICDDXPOA,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ")
- Q
- ;
- ; Get ICD Principal Diagnosis Code
- ICDPDX() ;
- N DIC,ICDCDSY,IENT,ICDSVAL,ICDPRI
- N ICDDSCR,ICDQUIT
- S ICDQUIT=0
- S ICDDSCR="Enter Principal diagnosis "_ICDSC_": "
- S ICDCDSY=$S(ICDCSYS="ICD9":1,1:30)
- ;if ICD-10
- I ICDCSYS="ICD10" D Q ICDSVAL
- . ;if was aborted in the list then don't set QUIT=1, if aborted in the search string prompt then set QUIT=1
- . F S ICDSVAL=$$ICD10SRH(ICDDSCR,ICDDATE) Q:$G(ICDSVAL)>0 S:(ICDSVAL=-11)!(ICDSVAL=-2)!(ICDSVAL=0) (ICDQUIT,QUIT)=1 Q:ICDQUIT=1
- ;if ICD-9
- S IENT="I",ICDPRI="Y"
- S DIC=$$ROOT^ICDEX(80),DIC(0)="AEQMZI"
- S DIC("A")=ICDDSCR
- S DIC("S")="I $P($$ICDDX^ICDEX(+$G(Y),$G(ICDDATE),ICDCDSY,IENT),U,1)>0,$P($$ICDDX^ICDEX(+$G(Y),$G(ICDDATE),ICDCDSY,IENT),U,10),'$P($$ICDDX^ICDEX(+$G(Y),ICDDATE,ICDCDSY,IENT),U,5)"
- S Y=$$SEARCH^ICDSAPI(80,DIC("S"),DIC(0),$G(ICDDATE))
- I Y<=0 S QUIT=1 Q -1
- Q +Y
- ;
- ;Get ICD Secondary Diagnoses Codes
- ICDSDX() ;
- N DIC,ICDCDSY,IENT,ICDSVAL
- N ICDDSCR,ICDQUIT
- S ICDQUIT=0
- S ICDDSCR="Enter SECONDARY diagnosis "_ICDSC_": "
- S ICDCDSY=$S(ICDCSYS="ICD9":1,1:30)
- ;if ICD-10
- I ICDCSYS="ICD10" D Q ICDSVAL
- . ;if was aborted in the list then don't set QUIT=1, if aborted in the search string prompt then set QUIT=1
- . F S ICDSVAL=$$ICD10SRH(ICDDSCR,ICDDATE) Q:$G(ICDSVAL)>0 S:ICDSVAL=0!(ICDSVAL=-2) ICDQUIT=1 S:ICDSVAL=-11 (ICDQUIT,QUIT)=1 Q:ICDQUIT=1
- ;if ICD-9
- S IENT="I"
- S DIC=$$ROOT^ICDEX(80),DIC(0)="AEQMZI"
- S DIC("A")=ICDDSCR
- S DIC("S")="I $P($$ICDDX^ICDEX(+$G(Y),$G(ICDDATE),ICDCDSY,IENT),U,1)>0,$P($$ICDDX^ICDEX(+$G(Y),$G(ICDDATE),ICDCDSY,IENT),U,10)"
- S Y=$$SEARCH^ICDSAPI(80,DIC("S"),DIC(0),$G(ICDDATE))
- I $D(DTOUT) S QUIT=1 Q -1
- I Y>0 Q +Y
- Q -1
- ;
- ;
- ;Ask for diagnosis
- ;ICDTINT - date of interest
- ;ICDPROM - prompt
- ;
- ;returns -11 if user has entered one of these - ^ ^^ or null
- ; -4 user doesn't want to continue
- ; -11 aborted by ^ or ^^ when the user enters the search sring (wants to quit from the prompt to the previous level)
- ; -3 aborted by ^ or ^^ during selection of the items on the list
- ; -2 Timed out
- ; -9 User entered only one character
- ; -1 User entered Blank in the list of selection
- ; -10 User entered invalid data in the list of selection
- ICD10SRH(ICDPROM,ICDTINT) ; Lexicon Partial Code Search
- N ICDUSTR,ICDPARAM
- ;set parameters for partial LEXICON search
- D SETPARAM^ICDDSLK(.ICDPARAM)
- ;if prompt provided the getusers input,
- ; return -11 to indicate that user wants to quit from the prompt to the previous level
- ; return 0 to indicate that user pressed Enter in the primary diag prompt it means he wants to quit from the prompt to the previous level,
- ; in secondary - wants to skip secodary diags
- ; otherwise call STS API for partial LEXICON search
- D Q:ICDUSTR'>0 ICDUSTR S ICDY=$$LEXICD10^ICDDSLK($P(ICDUSTR,U,2),ICDTINT,.ICDPARAM)
- . F S ICDUSTR=$$GETUSINP(ICDPROM) Q:ICDUSTR'=-22 ;repeat if less than 2 chars and wasn't aborted by ^,^^ or null (Enter key pressed)
- ; User entered only one character
- I ICDY=-9 Q -9
- ; User entered Blank
- I ICDY=-1 Q -1
- ; User entered invalid data
- I ICDY="" W !!,ICDPARAM("NO DATA FOUND") Q -12
- ; aborted by ^ or ^^
- I ICDY=-3 Q -3
- ; Timed out
- I ICDY=-2 Q -2
- ; User doesn't want to continue
- I ICDY=-4 Q -4
- ; otherwise get the IEN of the selected code
- K DIC
- S ICDY=+$$CODEN^ICDEX($P($P(ICDY,";",2),U,1),80)
- Q +ICDY
- ;
- ;Get user input
- ;returns:
- ; "-2" timeout
- ; "-11" user entered ^ or ^^
- ; "-22" user entered less than 2 chars
- ; 0 user entered null
- ; 1 user entered more than 2 chars
- GETUSINP(ICDPRMPT) ;
- N DIR
- S DIR("A")=ICDPRMPT
- S DIR(0)="FAO^0:245"
- S DIR("?")="^D INPHLP^ICDDSLK"
- S DIR("??")="^D INPHLP^ICDDSLK"
- D ^DIR
- I $D(DTOUT) Q -2 ;timeout
- I Y="" Q 0 ; user entered null
- I Y["^" Q -11 ; user entered ^ or ^^
- I $L(Y)'>1 W !,"Please enter at least the first two characters of the ICD-10 code or code description to start the search." Q -22
- Q "1"_U_Y
- ;
- GETIDX(ICDCSYS,ICDCODE,ICDT) ;
- N ICDICDX
- S ICDICDX=$$ICDDATA^ICDXCODE(ICDCSYS,ICDCODE,ICDT)
- I ICDICDX<1 Q $P(ICDICDX,U,2)
- Q $P(ICDICDX,U)_U_$P(ICDICDX,U,4)
- ;
- POA(ICDDX123) ; Present On Admission
- N DIR,X,Y,ICDPR
- S QUIT=0,DIR("A")="Present on Admission: ",DIR(0)="SOA^Y:YES;N:NO;U:Unknown;W:Clinically undetermined"
- K DIR S QUIT=0,DIR("A")="Present on Admission: ",DIR(0)="SOA^Y:YES;N:NO;U:Unknown;W:Clinically undetermined"
- S (DIR("?"),DIR("??"))="^D HELPPOA^ICDDRGM"
- D ^DIR
- I ($D(DTOUT))!($D(DUOUT))!($D(DIROUT)) S QUIT=1 Q -1
- I X="" D
- . I $$GET1^DIQ(80,ICDDX123,1.9,"I")'=1 D ;Not POA Exempt
- . . S ICDPR(1)="Diagnosis "_$$GET1^DIQ(80,ICDDX123,.01,"I")_" is not contained in the POA Exempt list so the POA field should"
- . . S ICDPR(2)="not be blank. If left blank, it will be treated as if it were a No (""N"")."
- . . D EN^DDIOL(.ICDPR)
- . . K DIR S DIR(0)="Y",DIR("A")="Do you wish to continue? (Y/N)",DIR("B")="YES" D ^DIR I ($D(DTOUT))!($D(DUOUT))!($D(DIROUT)) S QUIT=1
- . . I Y=0 S QUIT=1 Q
- . . S Y="N" ;This may subsequently be removed if the DX is on the HAC list - see $$HAC^ICDDRGM
- . E S Y="Y"
- E S Y=X
- I QUIT Q -1
- Q Y
- ;
- DXSCRN ;Diagnoses review of POA and HAC indicators; ALB/JAM *64 ICD10 changes
- N I,X,ICDDX123,ICDTMPX,ICDTMPOA,C,ICDOUT
- ;if POA value does not exist for Primary DX set to "U"nknown
- I '$D(ICDPOA(1)) S ICDPOA(1)="U"
- S X=1
- F S X=$O(ICDDX(X)) Q:'X S ICDOUT=0 D
- .;if POA value does not exist for DX set to "U"nknown
- .I '$D(ICDPOA(X)) S ICDPOA(X)="U"
- .;if DX is POA exempt include in DRG calculation
- .S ICDDX123=ICDDX(X) I $$GET1^DIQ(80,ICDDX123,1.9,"I") Q
- .;if POA value for DX is Y or W include in DRG calculation
- .F I="Y","W" I ICDPOA(X)=I S ICDOUT=1 Q
- .I ICDOUT Q
- .;if DX not in HAC list include in DRG calculation
- .F I="N","U",1 I ICDPOA(X)=I,'$$HAC(ICDDX123) S ICDOUT=1 Q
- .I ICDOUT Q
- .I ICDPOA(X)="",'$$HAC(ICDDX123) S ICDOUT=1 Q
- .I ICDOUT Q
- .; remove entry from ICDDX and ICDPOA array
- .K ICDDX(X),ICDPOA(X)
- ; resequence entries in ICDDX and ICDPOA array
- M ICDTMPX=ICDDX,ICDTMPOA=ICDPOA
- K ICDDX,ICDPOA
- S C=0
- S X=0 F S X=$O(ICDTMPX(X)) Q:'X S C=C+1,ICDDX(C)=ICDTMPX(X),ICDPOA(C)=ICDTMPOA(X)
- Q
- ;
- HAC(ICDDX123) ; Check if diagnosis code is in Hospital Acquired Conditions (HACS) file #80.6
- ;Input DX - Diagnosis code IEN, pointer to file #80
- ;Output - 1 if the DX code is found in file #80.6
- ; 0 if the DX code not found in the file
- ;
- I $D(^ICDHAC("C",ICDDX123)) Q 1
- Q 0
- ;
- ICD9OP ; ICD-9 PROCEDURE CODE SEARCH
- S IENT="I"
- S DIC("S")="I $P($$ICDOP^ICDEX(+$G(Y),$G(ICDDATE),ICDCDSY,IENT),U,1)>0,+$P($$ICDOP^ICDEX(+$G(Y),$G(ICDDATE),ICDCDSY,IENT),U,10)'=0"
- S DIC("A")="Enter Operation/Procedure "_ICDCV_": "
- S DIC(0)="AEQMZI" ;,DIC("S")="I $P($$ICDOP^ICDEX($G(Y),$G(ICDDATE),ICDCDSY,IENT),U,1)>0"
- S Y=$$SEARCH^ICDSAPI(80.1,DIC("S"),DIC(0),$G(ICDDATE))
- Q
- ;
- HELPPOA ;
- W !?5,"Apply the Present on Admission (POA) indicator for each diagnosis"
- W !?5,"and external cause of injury code(s) reported as the final set of"
- W !?5,"diagnosis codes assigned. One of the following values should be"
- W !?5,"assigned in accordance with the official coding guidelines:"
- W !?5,""
- W !?5,"Y = present at the time of inpatient admission;"
- W !?5,"N = not present at the time of inpatient admission;"
- W !?5,"U = documentation is insufficient to determine if"
- W !?5," condition is present on admission;"
- W !?5,"W = provider is unable to clinically determine"
- W !?5," whether condition was present on admission or not"
- W !?5,"<enter> = use only if diagnosis is exempt from POA reporting"
- Q
- ;
- PROC ; Ask Procedure
- N DIR,ICDXX1
- S ICDXX1=1 S ICDPRC=""
- S DIR(0)="FAO^1:12"
- S DIR("A")="Enter Operation/Procedure (ICD 10):"
- S DIR("?")="^D P1^ICDDRGM",DIR("??")="^D P2^ICDDRGM"
- D ^DIR
- I $D(DTOUT)!($D(DUOUT))!($D(DIRUT))!($D(DIROUT))!(Y="") S Y=-1 Q
- ;I X["*" S X=$P(X,"*",1)
- S ICDPRC=X
- ;I X["*" S X=$P(X,"*",1)_$P(X,"*",2)
- D ASK^ICDCODLK
- Q Y
- P1 ;
- I X["???" D P3 Q ;For calls from ^DIR, doesn't support ??? help
- I X["??" D P2 Q
- D EN^DDIOL("Enter the initial character(s) of an ICD-10 partial code or an","","!?5")
- D EN^DDIOL("asterisk (*) for more information.","","!?5")
- D EN^DDIOL(" ")
- Q
- ;
- P2 ;
- D EN^DDIOL("1. Enter an ICD-10 Procedure Code.","","!?8")
- D EN^DDIOL(" or ","","!?8")
- D EN^DDIOL("2. Enter any alphanumeric char values of the procedure code to 'build'","","!?8")
- D EN^DDIOL(" an ICD-10 Procedure Code.","","!?8")
- D EN^DDIOL(" or ","","!?8")
- D EN^DDIOL("3. Enter an asterisk (*) to initiate a procedure code build search. ","","!?8")
- D EN^DDIOL(" ")
- Q
- ;
- P3 ;
- D EN^DDIOL("The procedure code search provides a 'decision tree' type structure","","!?8")
- D EN^DDIOL("that makes use of the specific ICD-10-PCS code format and structure,","","!?8")
- D EN^DDIOL("where all codes consist of 7 alphanumeric characters, with each","","!?8")
- D EN^DDIOL("position in the code having a specific meaning.","","!?8")
- D EN^DDIOL(" ")
- Q
- ;
- --- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HICDDRGM 16295 printed Feb 18, 2025@23:16:43 Page 2
- ICDDRGM ;ALB/GRR/EG/ADL/KUM - GROUPER DRIVER ;28 Oct 2013 5:41 PM
- +1 ;;18.0;DRG Grouper;**7,36,57,64**;Oct 20, 2000;Build 103
- +2 ;
- +3 ; ADL Add Date prompt and passing of effective date for DRG CSV project
- +4 ; ADL Update DIC("S") code to screen using new function calls
- +5 ; ADL Update to access DRG file using new API for CSV Project
- +6 ; KER Remove direct global reads, update for ICD-10
- +7 ;
- +8 ; Global Variables
- +9 ; ^DPT( ICR 10035
- +10 ;
- +11 ; External References
- +12 ; ^%DTC ICR 10000
- +13 ; ^DIC ICR 10006
- +14 ; ^DIR ICR 10026
- +15 ; $$DT^XLFDT ICR 10103
- +16 ; H^XUS ICR 10044
- +17 ; ^ICDDRG ICR N/A
- +18 ; $$DRG^ICDEX ICR N/A
- +19 ; $$DRGD^ICDEX ICR N/A
- +20 ; $$ROOT^ICDEX ICR N/A
- +21 ;
- +22 ; Local Variables NEWed or KILLed Elsewhere
- +23 ; DIRUT,ICDDATE,QUIT,Y
- +24 ;
- +25 ;$$VERSION^XPDUTL("ICD"),!!
- SET U="^"
- SET DT=$$DT^XLFDT
- WRITE !!?11,"DRG Grouper Version ","18.0",!!
- PAT ; Patient
- +1 DO KILL
- +2 SET ICDQU=0
- KILL ICDEXP,SEX,ICDDX,ICDSURG,ICDPOA,ICDCSYS
- +3 DO EFFDATE
- if $DATA(DUOUT)
- GOTO KILL
- if $DATA(DTOUT)
- GOTO ICDOUT
- +4 SET DIR(0)="Y"
- SET DIR("A")="DRGs for Registered PATIENTS (Y/N)"
- SET DIR("B")="YES"
- +5 SET DIR("?")="Enter 'Yes' if the patient has been previously registered, enter 'No' for other patient, or '^' to quit."
- +6 DO ^DIR
- KILL DIR
- SET ICDPT=Y
- if $DATA(DUOUT)
- GOTO KILL
- if $DATA(DTOUT)
- GOTO ICDOUT
- PAT0 ; Patient - Ask again
- +1 if ICDPT=0
- GOTO ASK
- VA ; VA Patient File #2
- +1 SET DIC="^DPT("
- SET DIC(0)="AEQMZ"
- DO ^DIC
- if X=""!(X[U)!(Y'>0)
- GOTO Q
- if $DATA(DTOUT)
- GOTO ICDOUT
- SET DFN=+Y
- SET (DOB,AGE)=$PIECE(Y(0),U,3)
- SET SEX=$PIECE(Y(0),U,2)
- +2 DO TAC
- if ICDQU
- GOTO PAT
- DO DAM
- if ICDQU
- GOTO PAT
- EN1 ; Entry Point - Patient is known (DFN)
- +1 IF $DATA(^DPT(DFN,.35))
- IF $LENGTH(^DPT(DFN,.35))
- DO ALIVE
- if ICDQU
- GOTO PAT
- +2 SET ICDEXP=$SELECT($DATA(ICDEXP):ICDEXP,1:0)
- +3 IF AGE]""
- NEW %,X,X1,X2
- SET X1=DT
- SET X2=AGE
- DO ^%DTC
- SET AGE=X\365.25
- WRITE " AGE: ",AGE
- CD ;Prompt POA if ICD-10 DRG calculation
- +1 SET ICDCSYS=$SELECT(ICDDATE'<$$IMPDATE^LEXU("10D"):"ICD10",1:"ICD9")
- +2 DO ICDCD
- if $GET(QUIT)
- GOTO PAT
- +3 if X[U
- GOTO Q
- OP ; PROCEDURE CODE SELECTION
- +1 SET ICDCDSY=$SELECT(ICDCSYS="ICD9":2,1:31)
- SET ICDCV="(ICD "_$PIECE(ICDCSYS,"ICD",2)_")"
- +2 SET DIC("A")="Enter Operation/Procedure "_ICDCV_": "
- +3 WRITE !
- +4 FOR ICDNOR=1:1
- Begin DoDot:1
- +5 ;I ICDCSYS="ICD10" S ICDXX1=1 S ICDPRC="" D ASK^ICDCODLK K ICDXX1
- +6 IF ICDCSYS="ICD10"
- DO PROC
- +7 IF ICDCSYS="ICD9"
- SET ICDPRC=""
- DO ICD9OP
- End DoDot:1
- if X=""!(X[U)
- QUIT
- if $DATA(DTOUT)
- GOTO ICDOUT
- IF X'=0
- IF Y>0
- SET ICDPRC(ICDNOR)=+Y
- SET ICDSURG(ICDNOR)=X
- +8 KILL DIC,ICDCDSY,ICDCV
- if X["^"
- GOTO Q
- +9 ;Rearrange ICDPRC array
- +10 SET X=0
- SET ICDCNT=1
- +11 FOR
- SET X=$ORDER(ICDPRC(X))
- if 'X
- QUIT
- Begin DoDot:1
- +12 SET ICDPRCT(ICDCNT)=ICDPRC(X)
- +13 SET ICDCNT=ICDCNT+1
- End DoDot:1
- +14 KILL ICDPRC
- +15 MERGE ICDPRC=ICDPRCT
- +16 ;Rearrange ICDSURG array
- +17 SET X=0
- SET ICDCNT=1
- +18 FOR
- SET X=$ORDER(ICDSURG(X))
- if 'X
- QUIT
- Begin DoDot:1
- +19 SET ICDSURGT(ICDCNT)=ICDSURG(X)
- +20 SET ICDCNT=ICDCNT+1
- End DoDot:1
- +21 KILL ICDSURG
- +22 MERGE ICDSURG=ICDSURGT
- +23 ;
- +24 IF ICDCSYS="ICD10"
- MERGE ICDDXZ=ICDDX,ICDPRCZ=ICDPRC,ICDPOAZ=ICDPOA
- +25 DO ^ICDDRG
- +26 DO WRT
- +27 IF ICDCSYS="ICD10"
- KILL ICDEXP,SEX,ICDDX,ICDSURG,ICDPOA,ICDPRC,ICDDXZ,ICDPRCZ,ICDPOAZ,ICDPRCT,ICDCNT,ICDSURGT
- +28 GOTO PAT0
- WRT ; new CSV code
- SET ICDDRG(0)=$$DRG^ICDEX(+ICDDRG,ICDDATE)
- +1 IF ICDCSYS="ICD10"
- Begin DoDot:1
- +2 SET ICDTMP=$$ICDDX^ICDEX(ICDDXZ(1),ICDDATE,"10D","I")
- +3 WRITE !,"Principal Diagnosis: ",$PIECE(ICDTMP,U,2),?30,$EXTRACT($$VST^ICDEX(80,ICDDXZ(1),ICDDATE),1,44),?75,"POA=",$SELECT($GET(ICDPOAZ(1))'="":ICDPOAZ(1),1:"-")
- +4 FOR ICDI=2:1
- if '$DATA(ICDDXZ(ICDI))
- QUIT
- Begin DoDot:2
- +5 SET ICDTMP=$$ICDDX^ICDEX(ICDDXZ(ICDI),ICDDATE,"10D","I")
- +6 if ICDI=2
- WRITE !,"Secondary Diagnosis: "
- if ICDI>2
- WRITE !?21
- WRITE $PIECE(ICDTMP,U,2),?30,$EXTRACT($$VST^ICDEX(80,ICDDXZ(ICDI),ICDDATE),1,44),?75,"POA=",$SELECT($GET(ICDPOAZ(ICDI))'="":ICDPOAZ(ICDI),1:"-")
- End DoDot:2
- +7 FOR ICDI=1:1
- if '$DATA(ICDPRCZ(ICDI))
- QUIT
- Begin DoDot:2
- +8 SET ICDTMP=$$ICDOP^ICDEX(ICDPRCZ(ICDI),ICDDATE,"10P","I")
- +9 if ICDI=1
- WRITE !!,"Procedure Code: "
- if ICDI>1
- WRITE !
- WRITE ?21,$PIECE(ICDTMP,U,2),?30,$EXTRACT($$VST^ICDEX(80.1,ICDPRCZ(ICDI),ICDDATE),1,50)
- End DoDot:2
- End DoDot:1
- +10 WRITE !!?9,"Effective Date: "," ",ICDDSP
- +11 WRITE !,"Diagnosis Related Group: ",$JUSTIFY(ICDDRG,6),?40,"Avg len of stay: ",$JUSTIFY($PIECE(ICDDRG(0),"^",8),6)
- +12 WRITE !?17,"Weight: ",$JUSTIFY($PIECE(ICDDRG(0),"^",2),6),?40,"Local Breakeven: ",$JUSTIFY($PIECE(ICDDRG(0),"^",12),6)
- +13 WRITE !?12," Low day(s): ",$JUSTIFY($PIECE(ICDDRG(0),"^",3),6),?39,"Local low day(s): ",$JUSTIFY($PIECE(ICDDRG(0),"^",9),6)
- +14 WRITE !?13," High days: ",$JUSTIFY($PIECE(ICDDRG(0),"^",4),6),?40,"Local High days: ",$JUSTIFY($PIECE(ICDDRG(0),"^",10),6)
- +15 ;W !!,"DRG: ",ICDDRG,"-" F I=0:0 S I=$N(^ICD(ICDDRG,1,I)) Q:I'>0 W ?10,$P(^(I,0),U,1),!
- +16 ;W !!,"DRG: ",ICDDRG,"-" F I=0:0 S I=$O(^ICD(ICDDRG,1,I)) Q:(I="")!(I'?.N) W ?10,$P(^(I,0),U,1),!
- +17 NEW ICDXD,ICDGDX,ICDGI
- +18 SET ICDXD=$$DRGD^ICDEX(ICDDRG,"ICDGDX",ICDDATE)
- SET ICDGI=0
- +19 WRITE !!,"DRG: ",ICDDRG,"-"
- FOR
- SET ICDGI=$ORDER(ICDGDX(ICDGI))
- if '+ICDGI
- QUIT
- if ICDGDX(ICDGI)=" "
- QUIT
- WRITE ?10,ICDGDX(ICDGI),!
- +20 QUIT
- ERROR DO WRT
- +1 IF ICDRTC<5
- WRITE !!,"Invalid ",$SELECT(ICDRTC=1:"Principal Diagnosis",ICDRTC=2:"Operation/Procedure",ICDRTC=3:"Age",ICDRTC=4:"Sex",1:"")
- GOTO PAT0
- +2 IF ICDRTC=5
- WRITE !!,"Grouper needs to know if patient died during this episode!"
- GOTO PAT0
- +3 IF ICDRTC=6
- WRITE !!,"Grouper needs to know if patient was transferred to an acute care facility!"
- GOTO PAT0
- +4 IF ICDRTC=7
- WRITE !!,"Grouper needs to know if patient was discharged against medical advice!"
- GOTO PAT0
- +5 IF ICDRTC=8
- WRITE !!,"Patient assigned newborn diagnosis code. Check diagnosis!"
- GOTO PAT0
- +6 GOTO PAT0
- KILL KILL DIC,DFN,DUOUT,DTOUT,ICDNOR,ICDDX,ICDPRC,ICDEXP,ICDTRS,ICDDMS,ICDDRG,ICDMDC,ICDO24,ICDP24,ICDP25,ICDRTC,ICDPT,ICDQU,ICDSD,ICDNMDC
- +1 KILL ICDMAJ,ICDS25,ICDSEX,AGE,DOB,CC,HICDRG,ICD,ICDCC3,ICDJ,ICDJJ,ICDL39,ICDFZ,ICDDT,ICDDSP,IENT,QUIT
- +2 QUIT
- Q GOTO PAT
- AGE SET DIR(0)="NOA^0:124:0"
- SET DIR("A")="Patient's age: "
- SET DIR("?")="Enter how old the patient is (0-124)."
- DO ^DIR
- KILL DIR
- SET AGE=Y
- if $DATA(DUOUT)
- GOTO QQ
- if $DATA(DTOUT)
- GOTO ICDOUT
- +1 QUIT
- ALIVE SET DIR(0)="YO"
- SET DIR("A")="Did patient die during this episode"
- DO ^DIR
- KILL DIR
- SET ICDEXP=Y
- if $DATA(DUOUT)
- GOTO QQ
- if $DATA(DTOUT)
- GOTO ICDOUT
- +1 QUIT
- TAC SET DIR(0)="YO"
- SET DIR("A")="Was patient transferred to an acute care facility"
- DO ^DIR
- KILL DIR
- SET ICDTRS=Y
- if $DATA(DUOUT)
- GOTO QQ
- if $DATA(DTOUT)
- GOTO ICDOUT
- +1 QUIT
- DAM SET DIR(0)="YO"
- SET DIR("A")="Was patient discharged against medical advice"
- DO ^DIR
- KILL DIR
- SET ICDDMS=Y
- if $DATA(DUOUT)
- GOTO QQ
- if $DATA(DTOUT)
- GOTO ICDOUT
- +1 QUIT
- SEX SET DIR(0)="SBO^M:MALE;F:FEMALE"
- SET DIR("?")="Enter M for Male and F for Female"
- SET DIR("A")="Patient's Sex"
- DO ^DIR
- KILL DIR
- SET SEX=Y
- if $DATA(DUOUT)
- GOTO QQ
- if $DATA(DTOUT)
- GOTO ICDOUT
- +1 QUIT
- QQ SET ICDQU=1
- QUIT
- EFFDATE ;prompts for effective date for DRG grouper?
- +1 KILL DIR
- SET DIR(0)="D^::AEX"
- SET DIR("B")="TODAY"
- SET DIR("A")="Effective Date"
- +2 SET DIR("?")="The effective to be used when calculating the DRG code for the patient."
- +3 DO ^DIR
- KILL DIR
- IF $DATA(DIRUT)
- SET QUIT=1
- QUIT
- +4 SET ICDDATE=Y
- SET ICDDSP=Y(0)
- +5 QUIT
- ASK KILL DTOUT,DUOUT
- DO AGE
- if ICDQU
- GOTO PAT
- DO ALIVE
- if ICDQU
- GOTO PAT
- DO TAC
- if ICDQU
- GOTO PAT
- DO DAM
- if ICDQU
- GOTO PAT
- DO SEX
- if ICDQU
- GOTO PAT
- GOTO CD
- ICDOUT GOTO H^XUS
- +1 ;
- ICDCD ;prompts for ICD diagnosis codes; ALB/JAM *64 ICD10 changes
- +1 NEW ICDPDXV,ICDSDXV,ICDDXPOA,ICDSD,ICDSC
- +2 SET ICDSC="(ICD "_$PIECE(ICDCSYS,"ICD",2)_")"
- +3 SET ICDPDXV=$$ICDPDX
- if $GET(QUIT)!(ICDPDXV<0)
- QUIT
- SET ICDDX(1)=ICDPDXV
- +4 ;if ICD9 code skip POA question
- +5 IF ICDCSYS="ICD9"
- GOTO ICDSDXV
- +6 SET ICDDXPOA=$$POA(ICDPDXV)
- if $GET(QUIT)
- QUIT
- SET ICDPOA(1)=$TRANSLATE(ICDDXPOA,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ")
- ICDSDXV FOR ICDSD=2:1
- SET ICDSDXV=$$ICDSDX
- if $GET(QUIT)!(ICDSDXV'>0)
- QUIT
- SET ICDDX(ICDSD)=ICDSDXV
- Begin DoDot:1
- +1 ; if ICD9 code skip POA question
- +2 IF ICDCSYS="ICD9"
- QUIT
- +3 SET ICDDXPOA=$$POA(ICDSDXV)
- if $GET(QUIT)
- QUIT
- SET ICDPOA(ICDSD)=$TRANSLATE(ICDDXPOA,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ")
- End DoDot:1
- if $GET(QUIT)
- QUIT
- +4 QUIT
- +5 ;
- +6 ; Get ICD Principal Diagnosis Code
- ICDPDX() ;
- +1 NEW DIC,ICDCDSY,IENT,ICDSVAL,ICDPRI
- +2 NEW ICDDSCR,ICDQUIT
- +3 SET ICDQUIT=0
- +4 SET ICDDSCR="Enter Principal diagnosis "_ICDSC_": "
- +5 SET ICDCDSY=$SELECT(ICDCSYS="ICD9":1,1:30)
- +6 ;if ICD-10
- +7 IF ICDCSYS="ICD10"
- Begin DoDot:1
- +8 ;if was aborted in the list then don't set QUIT=1, if aborted in the search string prompt then set QUIT=1
- +9 FOR
- SET ICDSVAL=$$ICD10SRH(ICDDSCR,ICDDATE)
- if $GET(ICDSVAL)>0
- QUIT
- if (ICDSVAL=-11)!(ICDSVAL=-2)!(ICDSVAL=0)
- SET (ICDQUIT,QUIT)=1
- if ICDQUIT=1
- QUIT
- End DoDot:1
- QUIT ICDSVAL
- +10 ;if ICD-9
- +11 SET IENT="I"
- SET ICDPRI="Y"
- +12 SET DIC=$$ROOT^ICDEX(80)
- SET DIC(0)="AEQMZI"
- +13 SET DIC("A")=ICDDSCR
- +14 SET DIC("S")="I $P($$ICDDX^ICDEX(+$G(Y),$G(ICDDATE),ICDCDSY,IENT),U,1)>0,$P($$ICDDX^ICDEX(+$G(Y),$G(ICDDATE),ICDCDSY,IENT),U,10),'$P($$ICDDX^ICDEX(+$G(Y),ICDDATE,ICDCDSY,IENT),U,5)"
- +15 SET Y=$$SEARCH^ICDSAPI(80,DIC("S"),DIC(0),$GET(ICDDATE))
- +16 IF Y<=0
- SET QUIT=1
- QUIT -1
- +17 QUIT +Y
- +18 ;
- +19 ;Get ICD Secondary Diagnoses Codes
- ICDSDX() ;
- +1 NEW DIC,ICDCDSY,IENT,ICDSVAL
- +2 NEW ICDDSCR,ICDQUIT
- +3 SET ICDQUIT=0
- +4 SET ICDDSCR="Enter SECONDARY diagnosis "_ICDSC_": "
- +5 SET ICDCDSY=$SELECT(ICDCSYS="ICD9":1,1:30)
- +6 ;if ICD-10
- +7 IF ICDCSYS="ICD10"
- Begin DoDot:1
- +8 ;if was aborted in the list then don't set QUIT=1, if aborted in the search string prompt then set QUIT=1
- +9 FOR
- SET ICDSVAL=$$ICD10SRH(ICDDSCR,ICDDATE)
- if $GET(ICDSVAL)>0
- QUIT
- if ICDSVAL=0!(ICDSVAL=-2)
- SET ICDQUIT=1
- if ICDSVAL=-11
- SET (ICDQUIT,QUIT)=1
- if ICDQUIT=1
- QUIT
- End DoDot:1
- QUIT ICDSVAL
- +10 ;if ICD-9
- +11 SET IENT="I"
- +12 SET DIC=$$ROOT^ICDEX(80)
- SET DIC(0)="AEQMZI"
- +13 SET DIC("A")=ICDDSCR
- +14 SET DIC("S")="I $P($$ICDDX^ICDEX(+$G(Y),$G(ICDDATE),ICDCDSY,IENT),U,1)>0,$P($$ICDDX^ICDEX(+$G(Y),$G(ICDDATE),ICDCDSY,IENT),U,10)"
- +15 SET Y=$$SEARCH^ICDSAPI(80,DIC("S"),DIC(0),$GET(ICDDATE))
- +16 IF $DATA(DTOUT)
- SET QUIT=1
- QUIT -1
- +17 IF Y>0
- QUIT +Y
- +18 QUIT -1
- +19 ;
- +20 ;
- +21 ;Ask for diagnosis
- +22 ;ICDTINT - date of interest
- +23 ;ICDPROM - prompt
- +24 ;
- +25 ;returns -11 if user has entered one of these - ^ ^^ or null
- +26 ; -4 user doesn't want to continue
- +27 ; -11 aborted by ^ or ^^ when the user enters the search sring (wants to quit from the prompt to the previous level)
- +28 ; -3 aborted by ^ or ^^ during selection of the items on the list
- +29 ; -2 Timed out
- +30 ; -9 User entered only one character
- +31 ; -1 User entered Blank in the list of selection
- +32 ; -10 User entered invalid data in the list of selection
- ICD10SRH(ICDPROM,ICDTINT) ; Lexicon Partial Code Search
- +1 NEW ICDUSTR,ICDPARAM
- +2 ;set parameters for partial LEXICON search
- +3 DO SETPARAM^ICDDSLK(.ICDPARAM)
- +4 ;if prompt provided the getusers input,
- +5 ; return -11 to indicate that user wants to quit from the prompt to the previous level
- +6 ; return 0 to indicate that user pressed Enter in the primary diag prompt it means he wants to quit from the prompt to the previous level,
- +7 ; in secondary - wants to skip secodary diags
- +8 ; otherwise call STS API for partial LEXICON search
- +9 Begin DoDot:1
- +10 ;repeat if less than 2 chars and wasn't aborted by ^,^^ or null (Enter key pressed)
- FOR
- SET ICDUSTR=$$GETUSINP(ICDPROM)
- if ICDUSTR'=-22
- QUIT
- End DoDot:1
- if ICDUSTR'>0
- QUIT ICDUSTR
- SET ICDY=$$LEXICD10^ICDDSLK($PIECE(ICDUSTR,U,2),ICDTINT,.ICDPARAM)
- +11 ; User entered only one character
- +12 IF ICDY=-9
- QUIT -9
- +13 ; User entered Blank
- +14 IF ICDY=-1
- QUIT -1
- +15 ; User entered invalid data
- +16 IF ICDY=""
- WRITE !!,ICDPARAM("NO DATA FOUND")
- QUIT -12
- +17 ; aborted by ^ or ^^
- +18 IF ICDY=-3
- QUIT -3
- +19 ; Timed out
- +20 IF ICDY=-2
- QUIT -2
- +21 ; User doesn't want to continue
- +22 IF ICDY=-4
- QUIT -4
- +23 ; otherwise get the IEN of the selected code
- +24 KILL DIC
- +25 SET ICDY=+$$CODEN^ICDEX($PIECE($PIECE(ICDY,";",2),U,1),80)
- +26 QUIT +ICDY
- +27 ;
- +28 ;Get user input
- +29 ;returns:
- +30 ; "-2" timeout
- +31 ; "-11" user entered ^ or ^^
- +32 ; "-22" user entered less than 2 chars
- +33 ; 0 user entered null
- +34 ; 1 user entered more than 2 chars
- GETUSINP(ICDPRMPT) ;
- +1 NEW DIR
- +2 SET DIR("A")=ICDPRMPT
- +3 SET DIR(0)="FAO^0:245"
- +4 SET DIR("?")="^D INPHLP^ICDDSLK"
- +5 SET DIR("??")="^D INPHLP^ICDDSLK"
- +6 DO ^DIR
- +7 ;timeout
- IF $DATA(DTOUT)
- QUIT -2
- +8 ; user entered null
- IF Y=""
- QUIT 0
- +9 ; user entered ^ or ^^
- IF Y["^"
- QUIT -11
- +10 IF $LENGTH(Y)'>1
- WRITE !,"Please enter at least the first two characters of the ICD-10 code or code description to start the search."
- QUIT -22
- +11 QUIT "1"_U_Y
- +12 ;
- GETIDX(ICDCSYS,ICDCODE,ICDT) ;
- +1 NEW ICDICDX
- +2 SET ICDICDX=$$ICDDATA^ICDXCODE(ICDCSYS,ICDCODE,ICDT)
- +3 IF ICDICDX<1
- QUIT $PIECE(ICDICDX,U,2)
- +4 QUIT $PIECE(ICDICDX,U)_U_$PIECE(ICDICDX,U,4)
- +5 ;
- POA(ICDDX123) ; Present On Admission
- +1 NEW DIR,X,Y,ICDPR
- +2 SET QUIT=0
- SET DIR("A")="Present on Admission: "
- SET DIR(0)="SOA^Y:YES;N:NO;U:Unknown;W:Clinically undetermined"
- +3 KILL DIR
- SET QUIT=0
- SET DIR("A")="Present on Admission: "
- SET DIR(0)="SOA^Y:YES;N:NO;U:Unknown;W:Clinically undetermined"
- +4 SET (DIR("?"),DIR("??"))="^D HELPPOA^ICDDRGM"
- +5 DO ^DIR
- +6 IF ($DATA(DTOUT))!($DATA(DUOUT))!($DATA(DIROUT))
- SET QUIT=1
- QUIT -1
- +7 IF X=""
- Begin DoDot:1
- +8 ;Not POA Exempt
- IF $$GET1^DIQ(80,ICDDX123,1.9,"I")'=1
- Begin DoDot:2
- +9 SET ICDPR(1)="Diagnosis "_$$GET1^DIQ(80,ICDDX123,.01,"I")_" is not contained in the POA Exempt list so the POA field should"
- +10 SET ICDPR(2)="not be blank. If left blank, it will be treated as if it were a No (""N"")."
- +11 DO EN^DDIOL(.ICDPR)
- +12 KILL DIR
- SET DIR(0)="Y"
- SET DIR("A")="Do you wish to continue? (Y/N)"
- SET DIR("B")="YES"
- DO ^DIR
- IF ($DATA(DTOUT))!($DATA(DUOUT))!($DATA(DIROUT))
- SET QUIT=1
- +13 IF Y=0
- SET QUIT=1
- QUIT
- +14 ;This may subsequently be removed if the DX is on the HAC list - see $$HAC^ICDDRGM
- SET Y="N"
- End DoDot:2
- +15 IF '$TEST
- SET Y="Y"
- End DoDot:1
- +16 IF '$TEST
- SET Y=X
- +17 IF QUIT
- QUIT -1
- +18 QUIT Y
- +19 ;
- DXSCRN ;Diagnoses review of POA and HAC indicators; ALB/JAM *64 ICD10 changes
- +1 NEW I,X,ICDDX123,ICDTMPX,ICDTMPOA,C,ICDOUT
- +2 ;if POA value does not exist for Primary DX set to "U"nknown
- +3 IF '$DATA(ICDPOA(1))
- SET ICDPOA(1)="U"
- +4 SET X=1
- +5 FOR
- SET X=$ORDER(ICDDX(X))
- if 'X
- QUIT
- SET ICDOUT=0
- Begin DoDot:1
- +6 ;if POA value does not exist for DX set to "U"nknown
- +7 IF '$DATA(ICDPOA(X))
- SET ICDPOA(X)="U"
- +8 ;if DX is POA exempt include in DRG calculation
- +9 SET ICDDX123=ICDDX(X)
- IF $$GET1^DIQ(80,ICDDX123,1.9,"I")
- QUIT
- +10 ;if POA value for DX is Y or W include in DRG calculation
- +11 FOR I="Y","W"
- IF ICDPOA(X)=I
- SET ICDOUT=1
- QUIT
- +12 IF ICDOUT
- QUIT
- +13 ;if DX not in HAC list include in DRG calculation
- +14 FOR I="N","U",1
- IF ICDPOA(X)=I
- IF '$$HAC(ICDDX123)
- SET ICDOUT=1
- QUIT
- +15 IF ICDOUT
- QUIT
- +16 IF ICDPOA(X)=""
- IF '$$HAC(ICDDX123)
- SET ICDOUT=1
- QUIT
- +17 IF ICDOUT
- QUIT
- +18 ; remove entry from ICDDX and ICDPOA array
- +19 KILL ICDDX(X),ICDPOA(X)
- End DoDot:1
- +20 ; resequence entries in ICDDX and ICDPOA array
- +21 MERGE ICDTMPX=ICDDX,ICDTMPOA=ICDPOA
- +22 KILL ICDDX,ICDPOA
- +23 SET C=0
- +24 SET X=0
- FOR
- SET X=$ORDER(ICDTMPX(X))
- if 'X
- QUIT
- SET C=C+1
- SET ICDDX(C)=ICDTMPX(X)
- SET ICDPOA(C)=ICDTMPOA(X)
- +25 QUIT
- +26 ;
- HAC(ICDDX123) ; Check if diagnosis code is in Hospital Acquired Conditions (HACS) file #80.6
- +1 ;Input DX - Diagnosis code IEN, pointer to file #80
- +2 ;Output - 1 if the DX code is found in file #80.6
- +3 ; 0 if the DX code not found in the file
- +4 ;
- +5 IF $DATA(^ICDHAC("C",ICDDX123))
- QUIT 1
- +6 QUIT 0
- +7 ;
- ICD9OP ; ICD-9 PROCEDURE CODE SEARCH
- +1 SET IENT="I"
- +2 SET DIC("S")="I $P($$ICDOP^ICDEX(+$G(Y),$G(ICDDATE),ICDCDSY,IENT),U,1)>0,+$P($$ICDOP^ICDEX(+$G(Y),$G(ICDDATE),ICDCDSY,IENT),U,10)'=0"
- +3 SET DIC("A")="Enter Operation/Procedure "_ICDCV_": "
- +4 ;,DIC("S")="I $P($$ICDOP^ICDEX($G(Y),$G(ICDDATE),ICDCDSY,IENT),U,1)>0"
- SET DIC(0)="AEQMZI"
- +5 SET Y=$$SEARCH^ICDSAPI(80.1,DIC("S"),DIC(0),$GET(ICDDATE))
- +6 QUIT
- +7 ;
- HELPPOA ;
- +1 WRITE !?5,"Apply the Present on Admission (POA) indicator for each diagnosis"
- +2 WRITE !?5,"and external cause of injury code(s) reported as the final set of"
- +3 WRITE !?5,"diagnosis codes assigned. One of the following values should be"
- +4 WRITE !?5,"assigned in accordance with the official coding guidelines:"
- +5 WRITE !?5,""
- +6 WRITE !?5,"Y = present at the time of inpatient admission;"
- +7 WRITE !?5,"N = not present at the time of inpatient admission;"
- +8 WRITE !?5,"U = documentation is insufficient to determine if"
- +9 WRITE !?5," condition is present on admission;"
- +10 WRITE !?5,"W = provider is unable to clinically determine"
- +11 WRITE !?5," whether condition was present on admission or not"
- +12 WRITE !?5,"<enter> = use only if diagnosis is exempt from POA reporting"
- +13 QUIT
- +14 ;
- PROC ; Ask Procedure
- +1 NEW DIR,ICDXX1
- +2 SET ICDXX1=1
- SET ICDPRC=""
- +3 SET DIR(0)="FAO^1:12"
- +4 SET DIR("A")="Enter Operation/Procedure (ICD 10):"
- +5 SET DIR("?")="^D P1^ICDDRGM"
- SET DIR("??")="^D P2^ICDDRGM"
- +6 DO ^DIR
- +7 IF $DATA(DTOUT)!($DATA(DUOUT))!($DATA(DIRUT))!($DATA(DIROUT))!(Y="")
- SET Y=-1
- QUIT
- +8 ;I X["*" S X=$P(X,"*",1)
- +9 SET ICDPRC=X
- +10 ;I X["*" S X=$P(X,"*",1)_$P(X,"*",2)
- +11 DO ASK^ICDCODLK
- +12 QUIT Y
- P1 ;
- +1 ;For calls from ^DIR, doesn't support ??? help
- IF X["???"
- DO P3
- QUIT
- +2 IF X["??"
- DO P2
- QUIT
- +3 DO EN^DDIOL("Enter the initial character(s) of an ICD-10 partial code or an","","!?5")
- +4 DO EN^DDIOL("asterisk (*) for more information.","","!?5")
- +5 DO EN^DDIOL(" ")
- +6 QUIT
- +7 ;
- P2 ;
- +1 DO EN^DDIOL("1. Enter an ICD-10 Procedure Code.","","!?8")
- +2 DO EN^DDIOL(" or ","","!?8")
- +3 DO EN^DDIOL("2. Enter any alphanumeric char values of the procedure code to 'build'","","!?8")
- +4 DO EN^DDIOL(" an ICD-10 Procedure Code.","","!?8")
- +5 DO EN^DDIOL(" or ","","!?8")
- +6 DO EN^DDIOL("3. Enter an asterisk (*) to initiate a procedure code build search. ","","!?8")
- +7 DO EN^DDIOL(" ")
- +8 QUIT
- +9 ;
- P3 ;
- +1 DO EN^DDIOL("The procedure code search provides a 'decision tree' type structure","","!?8")
- +2 DO EN^DDIOL("that makes use of the specific ICD-10-PCS code format and structure,","","!?8")
- +3 DO EN^DDIOL("where all codes consist of 7 alphanumeric characters, with each","","!?8")
- +4 DO EN^DDIOL("position in the code having a specific meaning.","","!?8")
- +5 DO EN^DDIOL(" ")
- +6 QUIT
- +7 ;