- ICDJC3 ;ALB/ARH - DRG GROUPER CALCULATOR 2015 - DRG SELECT ;05/26/2016
- ;;18.0;DRG Grouper;**89,97**;Oct 20, 2000;Build 5
- ;
- ; DRG Calcuation for re-designed grouper ICD-10 2015, continuation
- ;
- ;
- DRGLS(ICDDATE,PRATT,DXATT,CDSET,DRGARR) ; get all possible satisfied DRGs and their MCC/CC defined by the event diagnosis, procedures and attributes
- ; DRGs are selected based on Code Sets, defined by the event diagnosis and procedures
- ; each DRG may have one or more sets of Code Sets (Cases) that lead to the DRG
- ;
- ; selected DRGs have at least one DRG Case with all required Code Sets defined and following criteria met:
- ; a DRGs MDC must match the MDC of the events Primary diagnosis, except DRG MDCs 00 and 99
- ; a Medical DRG may not have an event OR procedure unless it is specifically assigned to the Case Code Set
- ; if a DRG that is a member of an Exclusive MDC has a Case initially satisfied then no General MDC DRG is allowed
- ; if a DRG Case includes an 'EXCEPT' Code Set (Set or Case level), that code set must not be defined by the event
- ; if a DRG Case requires Any OR procedure, it may not be satisfied by a code used to satisfy any other code set
- ; if a DRG Case requires a Secondary Dx then that Dxs MCC/CC may not affect the MCC/CC designation of that DRG
- ; when this occurs the MCC/CC applied to that specific DRG is updated and may be different than the event MCC/CC
- ;
- ; Input: PRATT - event Procedure Attributes array
- ; DXATT - event Diagnosis Attributes array
- ; CDSET - Code Sets defined by event Diagnosis and Procedures array
- ; Output: DRGARR - array of DRGs (83.1) with at least one Case (83.2) defined by event Code Sets and attributes
- ; DRGARR(drg ifn) = MCC or CC or null - DRG valid for event, applicable MCC/CC (event or DRG specific)
- ; DRGARR(drg ifn, case ifn) [ 1 if Case is valid for event and selects the DRG
- ; DRGARR(drg ifn, case ifn) [ 2 ^ MCC or CC or null if Case is valid for event and selects the DRG,
- ; with a DRG specific MCC/CC that overrides the event MCC/CC
- ; DRGARR(drg ifn, case ifn) [ 3 if there are any unassigned Operating Room Procedures for the Case
- N SETIFN,CSEIFN,DRGIFN,DRG0,MDCIFN,MDC0,MDCTYP,DRGCFND,CASEFND,RESET,ARRCSE,ARRDRG
- S DXATT=$G(DXATT),PRATT=$G(PRATT) K DRGARR
- ;
- ; get list of all potential DRGs: for each satified code set, find all cases, then for those cases find all drgs
- S SETIFN=0 F S SETIFN=$O(CDSET(SETIFN)) Q:'SETIFN D
- . S CSEIFN=0 F S CSEIFN=$O(^ICDD(83.2,"ACS",SETIFN,CSEIFN)) Q:'CSEIFN D
- .. S DRGIFN=0 F S DRGIFN=$O(^ICDD(83.1,"ACE",CSEIFN,DRGIFN)) Q:'DRGIFN S ARRDRG(DRGIFN)=""
- ;
- ; for each potential DRG check that all criteria is met and determine if any of its individual Cases are satisfied
- S DRGIFN=0 F S DRGIFN=$O(ARRDRG(DRGIFN)) Q:'DRGIFN D
- . S DRG0=$G(^ICDD(83.1,DRGIFN,0)) S MDCIFN=+$P(DRG0,U,2),MDC0=$G(^ICDD(83,MDCIFN,0)),MDCTYP=$P(MDC0,U,4)
- . ;
- . I '$$DRGACT(+DRG0,$G(ICDDATE)) Q ; is DRG active
- . ;
- . I $P(MDC0,U,2)'="00",$P(MDC0,U,2)'="99",$P(DXATT,U,2)'[$P(MDC0,U,2) Q ; DRG MDC must match Primary Dx MDC
- . ;
- . D GETCSE(DRGIFN,$G(ICDDATE),.ARRCSE) ; get active Cases associated with the DRG
- . ;
- . ; for each Case associated with a potential DRG, determine if it is defined by the event and meets criteria
- . S CSEIFN=0 F S CSEIFN=$O(ARRCSE(CSEIFN)) Q:'CSEIFN D
- .. ;
- .. S CASEFND=$$CSESET(MDCIFN,CSEIFN,.CDSET,.DXATT,.PRATT,.DRGCFND) ; determine if case and criteria satisfied
- .. ;
- .. I MDCTYP=1,+DRGCFND S ARRDRG=1 ; DRGs MDC Type is Exclusive and DRGs Case code sets satisfied, MDC Exclusive applies
- .. ;
- .. I +CASEFND[3,$P(DRG0,U,4)="M" Q ; medical DRGs should not have OR procedures
- .. ;
- .. S ARRDRG(DRGIFN)=MDCTYP S ARRDRG(DRGIFN,CSEIFN)=CASEFND ; DRGs MDC Type and Case Results
- ;
- ; for each potential DRG that met all selection criteria then create the selected DRG list with Dx Secondary MCC/CC
- S DRGIFN=0 F S DRGIFN=$O(ARRDRG(DRGIFN)) Q:'DRGIFN S RESET=0 D
- . S CSEIFN=0 F S CSEIFN=$O(ARRDRG(DRGIFN,CSEIFN)) Q:'CSEIFN D
- .. ;
- .. I +$G(ARRDRG),ARRDRG(DRGIFN)>1 Q ; MDC Exclusive applies, reject DRGs in General MDCs
- .. ;
- .. S CASEFND=ARRDRG(DRGIFN,CSEIFN) Q:'CASEFND ; all criteria met and at least one DRG Case satisfied or reject
- .. ;
- .. S DRGARR(DRGIFN,CSEIFN)=CASEFND
- .. S DRGARR(DRGIFN)=$S(+CASEFND[2&'RESET:$P(CASEFND,U,2),1:$P(DXATT,U,1)) I +CASEFND'[2 S RESET=1 ; 2nd Dx MCC/CC
- ;
- Q
- ;
- DRGACT(DRG,DATE) ; get the status of the DRG on a date DRG STATUS (#80.2,66,.03)
- ; input: DRG - ptr to 80.2, DATE - date to determine status
- ; output: return true if the DRG is active on the date
- N DRGSB,DRGSTAT S (DRGSB,DRGSTAT)=0 I '$G(DATE) S DATE=DT
- I +$G(DRG) S DATE=DATE+.0001 S DATE=+$O(^ICD(+DRG,66,"B",DATE),-1) S DRGSB=$O(^ICD(+DRG,66,"B",+DATE,0))
- I +DRGSB S DRGSTAT=+$P($G(^ICD(+DRG,66,DRGSB,0)),U,3)
- Q DRGSTAT
- ;
- GETCSE(DRGIFN,DATE,ARRCSE) ; get all active Cases associated with the DRG (83.1,10)
- ; input: DRGIFN - ptr to mdc drg (83.1)
- ; output: ARRCSE(case ifn (83.2)) = DRGIFN - array of active Cases (83.2) linked to the DRG (83.1)
- N IX,LINE,BEGIN,END S DRGIFN=+$G(DRGIFN) K ARRCSE I '$G(DATE) S DATE=DT
- ;
- S IX=0 F S IX=$O(^ICDD(83.1,DRGIFN,10,IX)) Q:'IX D
- . S LINE=$G(^ICDD(83.1,DRGIFN,10,IX,0)) Q:'LINE
- . S BEGIN=$P(LINE,U,1),END=$P(LINE,U,2) I 'END S END=9999999
- . I DATE'<BEGIN,DATE'>END S ARRCSE(+$P(LINE,U,3))=DRGIFN
- Q
- ;
- CSESET(MDCIFN,CSEIFN,CDSET,DXATT,PRATT,DRGCFND) ; determine if a Case is fully satisfied by the event
- ; all Code Sets required by a Case have event codes assigned (CDSET) and satisfy the criteria
- ; input: MDCIFN - ptr to DRGs MDC (83), CSEIFN - ptr to a Case (83.2)
- ; output: return true if all the code sets for the case have event codes assigned and meet the criteria
- ; 1 if all case codes sets and criteria satisfied, MCC/CC not affected
- ; 3 if any Operating Room Procedures unassigned to a case code set
- ; 2 ^ MCC or CC or null if all case code sets and criteria satisfied and reset the MCC/CC for the DRG
- ; DRGCFND returns true if the case is initially satisfied before screening for extra/unassigned OR procedures
- ; a code set identified as EXCEPT, at case or set level, invalidates the case, unless AnyOR overrides it
- ; the codes used to satisfy the ANY OR Procedure Code Set must not be used to satisfy any of the cases other code sets
- ; clusters apply within the MDC of its Set and if no other procedure is necessary to select the case
- ; therefore a cluster with members incompletely assigned to the case may override the selection
- ; if a Secondary Diagnosis is used to select the DRG then its MCC/CC are removed from the DRGs MCC/CC
- N IX,LINE,SETIFN,SET0,LINK,LNKSET,EXCEPT,ANYOR,EXTRAOR,DXSND,ARRSET,FND S CSEIFN=+$G(CSEIFN) S (FND,DRGCFND)=0
- ;
- ; get all code sets required by a Case, add linked sets with codes assigned so all criteria can be applied
- S IX=0 F S IX=$O(^ICDD(83.2,CSEIFN,10,IX)) Q:'IX D
- . S LINE=$G(^ICDD(83.2,CSEIFN,10,IX,0)),SETIFN=+LINE S SET0=$G(^ICDD(83.3,SETIFN,0))
- . ;
- . S ARRSET(SETIFN)=LINE
- . I $P(SET0,U,6)>3 S LINK=$P(SET0,U,7) I LINK'="" D ; unpack linked sets
- .. S LNKSET=0 F S LNKSET=$O(^ICDD(83.3,"ACSL",LINK,LNKSET)) Q:'LNKSET I $O(CDSET(LNKSET,0)) S ARRSET(LNKSET)=LINE
- ;
- S (FND,ANYOR,DXSND)=0 S SETIFN=$O(^ICDD(83.3,"ACSC",1,0)) I $D(ARRSET(SETIFN)) S ANYOR=1 ; ANY OPERATING ROOM PROCEDURE
- ;
- ; for each Code Set required by the Case, check if it is defined for the event and passes all criteria
- S SETIFN=0 F S SETIFN=$O(ARRSET(SETIFN)) Q:'SETIFN D Q:'FND
- . S LINE=ARRSET(SETIFN) S SET0=$G(^ICDD(83.3,SETIFN,0))
- . I $P(SET0,U,3)="DX",$P(SET0,U,4)'="P" S DXSND=1 ; a specific secondary dx is required for set
- . ;
- . S FND=1
- . ;
- . S EXCEPT=0 I ($P(LINE,U,2)=1)!($P(SET0,U,5)=1) S EXCEPT=1 I '$D(CDSET(SETIFN)) Q ; code set except not defined
- . I EXCEPT I ($P(SET0,U,3)'="PR")!('ANYOR) S FND=0 Q ; code set except exists, may be overriden by Any OR Procedure
- . ;
- . I '$D(CDSET(SETIFN)) S FND=0 Q ; code set required for case is not found
- ;
- ; if a Case is selected by individual Code Sets, check Case for relationships between Code Sets
- ;
- S DRGCFND=FND ; codes sets and case initially satisfied
- ;
- I FND S EXTRAOR=$$PRCOR($G(MDCIFN),.ARRSET,.CDSET,.PRATT) I +EXTRAOR S FND=FND_3 ; OR Procedures unassigned
- ;
- I FND,ANYOR,'EXTRAOR S FND=0 ; No OR Procedure unassigned, fails ANY OR set
- ;
- I FND,'$$PRCLR($G(MDCIFN),.ARRSET,.CDSET) S FND=0 ; Procedure Cluster incompletely used by a set
- ;
- I FND,DXSND S DXSND=$$DXSND(.ARRSET,.CDSET,.DXATT) I +DXSND=2 S FND=FND_DXSND ; Secondary selects case, reset MCC/CC
- ;
- Q FND
- ;
- PRCOR(DRGMDCFN,ARRSET,CDSET,PRATT) ; determine if any event OR Procedures are unassigned or unused
- ; input: ARRSET(SETIFN) - all code sets that define the case, codes assigned to these sets are considered used
- ; output: returns true if any event OR Procedure codes are unused - not assigned to any of the cases code sets
- ; checks if any OR procedure is unassigned to the Case Sets, excludes generic code sets like Any OR
- ; also excludes as unused members of clusters defined outside the DRGs MDC that are cluster members only, not singles
- N LINE,IX,M0,DRGCAT,DRGMDC,SETIFN,SETCAT,SETMDC,FND,ARRCDX S FND=0
- S M0=$G(^ICDD(83,+$G(DRGMDCFN),0)) S DRGCAT=$P(M0,U,1),DRGMDC=$P(M0,U,2)
- ;
- ; get all event procedure codes assigned to the cases procedure code sets (non-generic)
- S SETIFN=0 F S SETIFN=$O(ARRSET(SETIFN)) Q:'SETIFN D
- . S LINE=$G(^ICDD(83.3,SETIFN,0)) I $P(LINE,U,3)="PR",+$P(LINE,U,2) D
- .. S M0=$G(^ICDD(83,+$P(LINE,U,2),0)) S SETCAT=$P(M0,U,1),SETMDC=$P(M0,U,2)
- .. S IX=0 F S IX=$O(CDSET(SETIFN,IX)) Q:'IX I (DRGMDC=SETMDC)!($P(CDSET(SETIFN,IX),U,3)) S ARRCDX(IX)=""
- ;
- ; find if any event OR procedure/cluster is not assigned to the case code sets
- S IX=0 F S IX=$O(PRATT(IX)) Q:'IX I $P(PRATT(IX),U,7)="O",'$D(ARRCDX(IX)) S FND=1 Q
- ;
- Q FND
- ;
- PRCLR(DRGMDCFN,ARRSET,CDSET) ; Cluster/MDC Rule - deterime if a cluster is defined by the event and affects the case
- ; procedures within a cluster must all exist for the cluster to satisfy a set
- ; the cluster applies only within the MDC of its Set and if no other procedure is necessary to select the case
- ; input: ARRSET(SETIFN) - all code sets that define the case, codes assigned to these sets are considered used
- ; output: returns true (1) if a procedure cluster does not invalidate the set
- ; returns false (0) if cluster is defined and invalidates the case
- ; if a cluster is defined by the event, it may or may not need to be fully assigned to the case sets
- ; when applied to cases, the clusters individual procedures may be used outside the clusters MDC or if there
- ; are non-cluster procedures necessary to select the case
- ; Cluster/MDC Rule does not apply to MDC 00, single procedures of clusters within MDC 00 may satisfy an MDC 00 set
- N IX,M0,DRGCAT,DRGMDC,SETIFN,SET0,SETCAT,SETMDC,CLSTR,ARRCDX,ARRCLS,FND S FND=1
- S M0=$G(^ICDD(83,+$G(DRGMDCFN),0)) S DRGCAT=$P(M0,U,1),DRGMDC=$P(M0,U,2)
- ;
- I DRGMDC="00" Q 1 ; Cluster/MDC Rule does not apply to clusters in MDC 00
- ;
- ; find event procedures that satisfy the Case procedure Sets, Case MDC and Category
- S SETIFN=0 F S SETIFN=$O(ARRSET(SETIFN)) Q:'SETIFN D
- . S SET0=$G(^ICDD(83.3,SETIFN,0)) I $P(SET0,U,3)="PR" S IX=0 F S IX=$O(CDSET(SETIFN,IX)) Q:'IX S ARRCDX(IX)=""
- ;
- ; find event procedure clusters in the Case MDC but not assigned to the Case MDC Category (not used)
- I $O(ARRCDX(0)) S SETIFN=0 F S SETIFN=$O(CDSET(SETIFN)) Q:'SETIFN D
- . S IX=0 F S IX=$O(CDSET(SETIFN,IX)) Q:'IX S CLSTR=$P(CDSET(SETIFN,IX),U,4) I +CLSTR D
- .. S SET0=$G(^ICDD(83.3,SETIFN,0)) S M0=$G(^ICDD(83,+$P(SET0,U,2),0)) S SETCAT=$P(M0,U,1),SETMDC=$P(M0,U,2)
- .. I SETMDC=DRGMDC,SETCAT'=DRGCAT S ARRCLS(IX)=""
- ;
- ; reject if event cluster is not used to satisfy the Case unless there is also a non-cluster procedure required
- I +FND S IX=0 F S IX=$O(ARRCLS(IX)) Q:'IX I '$D(ARRCDX(IX)) S FND=0 ; not all cluster proc defined for event
- I 'FND S IX=0 F S IX=$O(ARRCDX(IX)) Q:'IX I '$D(ARRCLS(IX)) S FND=1 ; non-cluster proc defined, overrides cluster
- Q FND
- ;
- DXSND(ARRSET,CDSET,DXATT) ; Case Secondary Dx Rule - get updated DRG MCC/CC if a Secondary Dx was used to select the DRG Case
- ; if an event diagnosis is assigned to a cases secondary dx code set then remove its MCC/CC from the DRGs MCC/CC
- ; input: ARRSET(SETIFN) - all code sets that define the case, codes assigned to these sets are considered used
- ; output: 2 ^ MCC or CC or null - updated DRG MCC/CC
- ; null if secondary dx code sets did not affect the MCC/CC
- ; if a Secondary Diagnosis is used to select the DRG then its MCC/CC may not be used for the DRGs MCC/CC
- N SETIFN,LINE,IX,NEWMCC,DXCC,FND,ARRCDX S NEWMCC="",FND=""
- ;
- ; get secondary event diagnosis codes assigned to the cases secondary dx code sets
- S SETIFN=0 F S SETIFN=$O(ARRSET(SETIFN)) Q:'SETIFN S LINE=$G(^ICDD(83.3,SETIFN,0)) D
- . I $P(LINE,U,3)="DX" S IX=0 F S IX=$O(CDSET(SETIFN,IX)) Q:'IX I IX'=$O(DXATT(0)) S ARRCDX(IX)=""
- ;
- ; if an event diagnosis is assigned to a case secondary dx code set then remove its MCC/CC from use on the DRG
- ; recalculate the MCC/CC based on the event diagnosis not assigned to the cases secondary dx code sets
- I $O(ARRCDX(0)) S NEWMCC="" S IX=0 F S IX=$O(DXATT(IX)) Q:'IX D I NEWMCC="MCC" Q
- . S DXCC=$P(DXATT(IX),U,7) I DXCC'="",'$D(ARRCDX(IX)) S NEWMCC=DXCC
- ;
- I $O(ARRCDX(0)),NEWMCC'=$P(DXATT,U,1) S FND=2_U_NEWMCC
- ;
- Q FND
- --- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HICDJC3 13758 printed Mar 13, 2025@20:55:37 Page 2
- ICDJC3 ;ALB/ARH - DRG GROUPER CALCULATOR 2015 - DRG SELECT ;05/26/2016
- +1 ;;18.0;DRG Grouper;**89,97**;Oct 20, 2000;Build 5
- +2 ;
- +3 ; DRG Calcuation for re-designed grouper ICD-10 2015, continuation
- +4 ;
- +5 ;
- DRGLS(ICDDATE,PRATT,DXATT,CDSET,DRGARR) ; get all possible satisfied DRGs and their MCC/CC defined by the event diagnosis, procedures and attributes
- +1 ; DRGs are selected based on Code Sets, defined by the event diagnosis and procedures
- +2 ; each DRG may have one or more sets of Code Sets (Cases) that lead to the DRG
- +3 ;
- +4 ; selected DRGs have at least one DRG Case with all required Code Sets defined and following criteria met:
- +5 ; a DRGs MDC must match the MDC of the events Primary diagnosis, except DRG MDCs 00 and 99
- +6 ; a Medical DRG may not have an event OR procedure unless it is specifically assigned to the Case Code Set
- +7 ; if a DRG that is a member of an Exclusive MDC has a Case initially satisfied then no General MDC DRG is allowed
- +8 ; if a DRG Case includes an 'EXCEPT' Code Set (Set or Case level), that code set must not be defined by the event
- +9 ; if a DRG Case requires Any OR procedure, it may not be satisfied by a code used to satisfy any other code set
- +10 ; if a DRG Case requires a Secondary Dx then that Dxs MCC/CC may not affect the MCC/CC designation of that DRG
- +11 ; when this occurs the MCC/CC applied to that specific DRG is updated and may be different than the event MCC/CC
- +12 ;
- +13 ; Input: PRATT - event Procedure Attributes array
- +14 ; DXATT - event Diagnosis Attributes array
- +15 ; CDSET - Code Sets defined by event Diagnosis and Procedures array
- +16 ; Output: DRGARR - array of DRGs (83.1) with at least one Case (83.2) defined by event Code Sets and attributes
- +17 ; DRGARR(drg ifn) = MCC or CC or null - DRG valid for event, applicable MCC/CC (event or DRG specific)
- +18 ; DRGARR(drg ifn, case ifn) [ 1 if Case is valid for event and selects the DRG
- +19 ; DRGARR(drg ifn, case ifn) [ 2 ^ MCC or CC or null if Case is valid for event and selects the DRG,
- +20 ; with a DRG specific MCC/CC that overrides the event MCC/CC
- +21 ; DRGARR(drg ifn, case ifn) [ 3 if there are any unassigned Operating Room Procedures for the Case
- +22 NEW SETIFN,CSEIFN,DRGIFN,DRG0,MDCIFN,MDC0,MDCTYP,DRGCFND,CASEFND,RESET,ARRCSE,ARRDRG
- +23 SET DXATT=$GET(DXATT)
- SET PRATT=$GET(PRATT)
- KILL DRGARR
- +24 ;
- +25 ; get list of all potential DRGs: for each satified code set, find all cases, then for those cases find all drgs
- +26 SET SETIFN=0
- FOR
- SET SETIFN=$ORDER(CDSET(SETIFN))
- if 'SETIFN
- QUIT
- Begin DoDot:1
- +27 SET CSEIFN=0
- FOR
- SET CSEIFN=$ORDER(^ICDD(83.2,"ACS",SETIFN,CSEIFN))
- if 'CSEIFN
- QUIT
- Begin DoDot:2
- +28 SET DRGIFN=0
- FOR
- SET DRGIFN=$ORDER(^ICDD(83.1,"ACE",CSEIFN,DRGIFN))
- if 'DRGIFN
- QUIT
- SET ARRDRG(DRGIFN)=""
- End DoDot:2
- End DoDot:1
- +29 ;
- +30 ; for each potential DRG check that all criteria is met and determine if any of its individual Cases are satisfied
- +31 SET DRGIFN=0
- FOR
- SET DRGIFN=$ORDER(ARRDRG(DRGIFN))
- if 'DRGIFN
- QUIT
- Begin DoDot:1
- +32 SET DRG0=$GET(^ICDD(83.1,DRGIFN,0))
- SET MDCIFN=+$PIECE(DRG0,U,2)
- SET MDC0=$GET(^ICDD(83,MDCIFN,0))
- SET MDCTYP=$PIECE(MDC0,U,4)
- +33 ;
- +34 ; is DRG active
- IF '$$DRGACT(+DRG0,$GET(ICDDATE))
- QUIT
- +35 ;
- +36 ; DRG MDC must match Primary Dx MDC
- IF $PIECE(MDC0,U,2)'="00"
- IF $PIECE(MDC0,U,2)'="99"
- IF $PIECE(DXATT,U,2)'[$PIECE(MDC0,U,2)
- QUIT
- +37 ;
- +38 ; get active Cases associated with the DRG
- DO GETCSE(DRGIFN,$GET(ICDDATE),.ARRCSE)
- +39 ;
- +40 ; for each Case associated with a potential DRG, determine if it is defined by the event and meets criteria
- +41 SET CSEIFN=0
- FOR
- SET CSEIFN=$ORDER(ARRCSE(CSEIFN))
- if 'CSEIFN
- QUIT
- Begin DoDot:2
- +42 ;
- +43 ; determine if case and criteria satisfied
- SET CASEFND=$$CSESET(MDCIFN,CSEIFN,.CDSET,.DXATT,.PRATT,.DRGCFND)
- +44 ;
- +45 ; DRGs MDC Type is Exclusive and DRGs Case code sets satisfied, MDC Exclusive applies
- IF MDCTYP=1
- IF +DRGCFND
- SET ARRDRG=1
- +46 ;
- +47 ; medical DRGs should not have OR procedures
- IF +CASEFND[3
- IF $PIECE(DRG0,U,4)="M"
- QUIT
- +48 ;
- +49 ; DRGs MDC Type and Case Results
- SET ARRDRG(DRGIFN)=MDCTYP
- SET ARRDRG(DRGIFN,CSEIFN)=CASEFND
- End DoDot:2
- End DoDot:1
- +50 ;
- +51 ; for each potential DRG that met all selection criteria then create the selected DRG list with Dx Secondary MCC/CC
- +52 SET DRGIFN=0
- FOR
- SET DRGIFN=$ORDER(ARRDRG(DRGIFN))
- if 'DRGIFN
- QUIT
- SET RESET=0
- Begin DoDot:1
- +53 SET CSEIFN=0
- FOR
- SET CSEIFN=$ORDER(ARRDRG(DRGIFN,CSEIFN))
- if 'CSEIFN
- QUIT
- Begin DoDot:2
- +54 ;
- +55 ; MDC Exclusive applies, reject DRGs in General MDCs
- IF +$GET(ARRDRG)
- IF ARRDRG(DRGIFN)>1
- QUIT
- +56 ;
- +57 ; all criteria met and at least one DRG Case satisfied or reject
- SET CASEFND=ARRDRG(DRGIFN,CSEIFN)
- if 'CASEFND
- QUIT
- +58 ;
- +59 SET DRGARR(DRGIFN,CSEIFN)=CASEFND
- +60 ; 2nd Dx MCC/CC
- SET DRGARR(DRGIFN)=$SELECT(+CASEFND[2&'RESET:$PIECE(CASEFND,U,2),1:$PIECE(DXATT,U,1))
- IF +CASEFND'[2
- SET RESET=1
- End DoDot:2
- End DoDot:1
- +61 ;
- +62 QUIT
- +63 ;
- DRGACT(DRG,DATE) ; get the status of the DRG on a date DRG STATUS (#80.2,66,.03)
- +1 ; input: DRG - ptr to 80.2, DATE - date to determine status
- +2 ; output: return true if the DRG is active on the date
- +3 NEW DRGSB,DRGSTAT
- SET (DRGSB,DRGSTAT)=0
- IF '$GET(DATE)
- SET DATE=DT
- +4 IF +$GET(DRG)
- SET DATE=DATE+.0001
- SET DATE=+$ORDER(^ICD(+DRG,66,"B",DATE),-1)
- SET DRGSB=$ORDER(^ICD(+DRG,66,"B",+DATE,0))
- +5 IF +DRGSB
- SET DRGSTAT=+$PIECE($GET(^ICD(+DRG,66,DRGSB,0)),U,3)
- +6 QUIT DRGSTAT
- +7 ;
- GETCSE(DRGIFN,DATE,ARRCSE) ; get all active Cases associated with the DRG (83.1,10)
- +1 ; input: DRGIFN - ptr to mdc drg (83.1)
- +2 ; output: ARRCSE(case ifn (83.2)) = DRGIFN - array of active Cases (83.2) linked to the DRG (83.1)
- +3 NEW IX,LINE,BEGIN,END
- SET DRGIFN=+$GET(DRGIFN)
- KILL ARRCSE
- IF '$GET(DATE)
- SET DATE=DT
- +4 ;
- +5 SET IX=0
- FOR
- SET IX=$ORDER(^ICDD(83.1,DRGIFN,10,IX))
- if 'IX
- QUIT
- Begin DoDot:1
- +6 SET LINE=$GET(^ICDD(83.1,DRGIFN,10,IX,0))
- if 'LINE
- QUIT
- +7 SET BEGIN=$PIECE(LINE,U,1)
- SET END=$PIECE(LINE,U,2)
- IF 'END
- SET END=9999999
- +8 IF DATE'<BEGIN
- IF DATE'>END
- SET ARRCSE(+$PIECE(LINE,U,3))=DRGIFN
- End DoDot:1
- +9 QUIT
- +10 ;
- CSESET(MDCIFN,CSEIFN,CDSET,DXATT,PRATT,DRGCFND) ; determine if a Case is fully satisfied by the event
- +1 ; all Code Sets required by a Case have event codes assigned (CDSET) and satisfy the criteria
- +2 ; input: MDCIFN - ptr to DRGs MDC (83), CSEIFN - ptr to a Case (83.2)
- +3 ; output: return true if all the code sets for the case have event codes assigned and meet the criteria
- +4 ; 1 if all case codes sets and criteria satisfied, MCC/CC not affected
- +5 ; 3 if any Operating Room Procedures unassigned to a case code set
- +6 ; 2 ^ MCC or CC or null if all case code sets and criteria satisfied and reset the MCC/CC for the DRG
- +7 ; DRGCFND returns true if the case is initially satisfied before screening for extra/unassigned OR procedures
- +8 ; a code set identified as EXCEPT, at case or set level, invalidates the case, unless AnyOR overrides it
- +9 ; the codes used to satisfy the ANY OR Procedure Code Set must not be used to satisfy any of the cases other code sets
- +10 ; clusters apply within the MDC of its Set and if no other procedure is necessary to select the case
- +11 ; therefore a cluster with members incompletely assigned to the case may override the selection
- +12 ; if a Secondary Diagnosis is used to select the DRG then its MCC/CC are removed from the DRGs MCC/CC
- +13 NEW IX,LINE,SETIFN,SET0,LINK,LNKSET,EXCEPT,ANYOR,EXTRAOR,DXSND,ARRSET,FND
- SET CSEIFN=+$GET(CSEIFN)
- SET (FND,DRGCFND)=0
- +14 ;
- +15 ; get all code sets required by a Case, add linked sets with codes assigned so all criteria can be applied
- +16 SET IX=0
- FOR
- SET IX=$ORDER(^ICDD(83.2,CSEIFN,10,IX))
- if 'IX
- QUIT
- Begin DoDot:1
- +17 SET LINE=$GET(^ICDD(83.2,CSEIFN,10,IX,0))
- SET SETIFN=+LINE
- SET SET0=$GET(^ICDD(83.3,SETIFN,0))
- +18 ;
- +19 SET ARRSET(SETIFN)=LINE
- +20 ; unpack linked sets
- IF $PIECE(SET0,U,6)>3
- SET LINK=$PIECE(SET0,U,7)
- IF LINK'=""
- Begin DoDot:2
- +21 SET LNKSET=0
- FOR
- SET LNKSET=$ORDER(^ICDD(83.3,"ACSL",LINK,LNKSET))
- if 'LNKSET
- QUIT
- IF $ORDER(CDSET(LNKSET,0))
- SET ARRSET(LNKSET)=LINE
- End DoDot:2
- End DoDot:1
- +22 ;
- +23 ; ANY OPERATING ROOM PROCEDURE
- SET (FND,ANYOR,DXSND)=0
- SET SETIFN=$ORDER(^ICDD(83.3,"ACSC",1,0))
- IF $DATA(ARRSET(SETIFN))
- SET ANYOR=1
- +24 ;
- +25 ; for each Code Set required by the Case, check if it is defined for the event and passes all criteria
- +26 SET SETIFN=0
- FOR
- SET SETIFN=$ORDER(ARRSET(SETIFN))
- if 'SETIFN
- QUIT
- Begin DoDot:1
- +27 SET LINE=ARRSET(SETIFN)
- SET SET0=$GET(^ICDD(83.3,SETIFN,0))
- +28 ; a specific secondary dx is required for set
- IF $PIECE(SET0,U,3)="DX"
- IF $PIECE(SET0,U,4)'="P"
- SET DXSND=1
- +29 ;
- +30 SET FND=1
- +31 ;
- +32 ; code set except not defined
- SET EXCEPT=0
- IF ($PIECE(LINE,U,2)=1)!($PIECE(SET0,U,5)=1)
- SET EXCEPT=1
- IF '$DATA(CDSET(SETIFN))
- QUIT
- +33 ; code set except exists, may be overriden by Any OR Procedure
- IF EXCEPT
- IF ($PIECE(SET0,U,3)'="PR")!('ANYOR)
- SET FND=0
- QUIT
- +34 ;
- +35 ; code set required for case is not found
- IF '$DATA(CDSET(SETIFN))
- SET FND=0
- QUIT
- End DoDot:1
- if 'FND
- QUIT
- +36 ;
- +37 ; if a Case is selected by individual Code Sets, check Case for relationships between Code Sets
- +38 ;
- +39 ; codes sets and case initially satisfied
- SET DRGCFND=FND
- +40 ;
- +41 ; OR Procedures unassigned
- IF FND
- SET EXTRAOR=$$PRCOR($GET(MDCIFN),.ARRSET,.CDSET,.PRATT)
- IF +EXTRAOR
- SET FND=FND_3
- +42 ;
- +43 ; No OR Procedure unassigned, fails ANY OR set
- IF FND
- IF ANYOR
- IF 'EXTRAOR
- SET FND=0
- +44 ;
- +45 ; Procedure Cluster incompletely used by a set
- IF FND
- IF '$$PRCLR($GET(MDCIFN),.ARRSET,.CDSET)
- SET FND=0
- +46 ;
- +47 ; Secondary selects case, reset MCC/CC
- IF FND
- IF DXSND
- SET DXSND=$$DXSND(.ARRSET,.CDSET,.DXATT)
- IF +DXSND=2
- SET FND=FND_DXSND
- +48 ;
- +49 QUIT FND
- +50 ;
- PRCOR(DRGMDCFN,ARRSET,CDSET,PRATT) ; determine if any event OR Procedures are unassigned or unused
- +1 ; input: ARRSET(SETIFN) - all code sets that define the case, codes assigned to these sets are considered used
- +2 ; output: returns true if any event OR Procedure codes are unused - not assigned to any of the cases code sets
- +3 ; checks if any OR procedure is unassigned to the Case Sets, excludes generic code sets like Any OR
- +4 ; also excludes as unused members of clusters defined outside the DRGs MDC that are cluster members only, not singles
- +5 NEW LINE,IX,M0,DRGCAT,DRGMDC,SETIFN,SETCAT,SETMDC,FND,ARRCDX
- SET FND=0
- +6 SET M0=$GET(^ICDD(83,+$GET(DRGMDCFN),0))
- SET DRGCAT=$PIECE(M0,U,1)
- SET DRGMDC=$PIECE(M0,U,2)
- +7 ;
- +8 ; get all event procedure codes assigned to the cases procedure code sets (non-generic)
- +9 SET SETIFN=0
- FOR
- SET SETIFN=$ORDER(ARRSET(SETIFN))
- if 'SETIFN
- QUIT
- Begin DoDot:1
- +10 SET LINE=$GET(^ICDD(83.3,SETIFN,0))
- IF $PIECE(LINE,U,3)="PR"
- IF +$PIECE(LINE,U,2)
- Begin DoDot:2
- +11 SET M0=$GET(^ICDD(83,+$PIECE(LINE,U,2),0))
- SET SETCAT=$PIECE(M0,U,1)
- SET SETMDC=$PIECE(M0,U,2)
- +12 SET IX=0
- FOR
- SET IX=$ORDER(CDSET(SETIFN,IX))
- if 'IX
- QUIT
- IF (DRGMDC=SETMDC)!($PIECE(CDSET(SETIFN,IX),U,3))
- SET ARRCDX(IX)=""
- End DoDot:2
- End DoDot:1
- +13 ;
- +14 ; find if any event OR procedure/cluster is not assigned to the case code sets
- +15 SET IX=0
- FOR
- SET IX=$ORDER(PRATT(IX))
- if 'IX
- QUIT
- IF $PIECE(PRATT(IX),U,7)="O"
- IF '$DATA(ARRCDX(IX))
- SET FND=1
- QUIT
- +16 ;
- +17 QUIT FND
- +18 ;
- PRCLR(DRGMDCFN,ARRSET,CDSET) ; Cluster/MDC Rule - deterime if a cluster is defined by the event and affects the case
- +1 ; procedures within a cluster must all exist for the cluster to satisfy a set
- +2 ; the cluster applies only within the MDC of its Set and if no other procedure is necessary to select the case
- +3 ; input: ARRSET(SETIFN) - all code sets that define the case, codes assigned to these sets are considered used
- +4 ; output: returns true (1) if a procedure cluster does not invalidate the set
- +5 ; returns false (0) if cluster is defined and invalidates the case
- +6 ; if a cluster is defined by the event, it may or may not need to be fully assigned to the case sets
- +7 ; when applied to cases, the clusters individual procedures may be used outside the clusters MDC or if there
- +8 ; are non-cluster procedures necessary to select the case
- +9 ; Cluster/MDC Rule does not apply to MDC 00, single procedures of clusters within MDC 00 may satisfy an MDC 00 set
- +10 NEW IX,M0,DRGCAT,DRGMDC,SETIFN,SET0,SETCAT,SETMDC,CLSTR,ARRCDX,ARRCLS,FND
- SET FND=1
- +11 SET M0=$GET(^ICDD(83,+$GET(DRGMDCFN),0))
- SET DRGCAT=$PIECE(M0,U,1)
- SET DRGMDC=$PIECE(M0,U,2)
- +12 ;
- +13 ; Cluster/MDC Rule does not apply to clusters in MDC 00
- IF DRGMDC="00"
- QUIT 1
- +14 ;
- +15 ; find event procedures that satisfy the Case procedure Sets, Case MDC and Category
- +16 SET SETIFN=0
- FOR
- SET SETIFN=$ORDER(ARRSET(SETIFN))
- if 'SETIFN
- QUIT
- Begin DoDot:1
- +17 SET SET0=$GET(^ICDD(83.3,SETIFN,0))
- IF $PIECE(SET0,U,3)="PR"
- SET IX=0
- FOR
- SET IX=$ORDER(CDSET(SETIFN,IX))
- if 'IX
- QUIT
- SET ARRCDX(IX)=""
- End DoDot:1
- +18 ;
- +19 ; find event procedure clusters in the Case MDC but not assigned to the Case MDC Category (not used)
- +20 IF $ORDER(ARRCDX(0))
- SET SETIFN=0
- FOR
- SET SETIFN=$ORDER(CDSET(SETIFN))
- if 'SETIFN
- QUIT
- Begin DoDot:1
- +21 SET IX=0
- FOR
- SET IX=$ORDER(CDSET(SETIFN,IX))
- if 'IX
- QUIT
- SET CLSTR=$PIECE(CDSET(SETIFN,IX),U,4)
- IF +CLSTR
- Begin DoDot:2
- +22 SET SET0=$GET(^ICDD(83.3,SETIFN,0))
- SET M0=$GET(^ICDD(83,+$PIECE(SET0,U,2),0))
- SET SETCAT=$PIECE(M0,U,1)
- SET SETMDC=$PIECE(M0,U,2)
- +23 IF SETMDC=DRGMDC
- IF SETCAT'=DRGCAT
- SET ARRCLS(IX)=""
- End DoDot:2
- End DoDot:1
- +24 ;
- +25 ; reject if event cluster is not used to satisfy the Case unless there is also a non-cluster procedure required
- +26 ; not all cluster proc defined for event
- IF +FND
- SET IX=0
- FOR
- SET IX=$ORDER(ARRCLS(IX))
- if 'IX
- QUIT
- IF '$DATA(ARRCDX(IX))
- SET FND=0
- +27 ; non-cluster proc defined, overrides cluster
- IF 'FND
- SET IX=0
- FOR
- SET IX=$ORDER(ARRCDX(IX))
- if 'IX
- QUIT
- IF '$DATA(ARRCLS(IX))
- SET FND=1
- +28 QUIT FND
- +29 ;
- DXSND(ARRSET,CDSET,DXATT) ; Case Secondary Dx Rule - get updated DRG MCC/CC if a Secondary Dx was used to select the DRG Case
- +1 ; if an event diagnosis is assigned to a cases secondary dx code set then remove its MCC/CC from the DRGs MCC/CC
- +2 ; input: ARRSET(SETIFN) - all code sets that define the case, codes assigned to these sets are considered used
- +3 ; output: 2 ^ MCC or CC or null - updated DRG MCC/CC
- +4 ; null if secondary dx code sets did not affect the MCC/CC
- +5 ; if a Secondary Diagnosis is used to select the DRG then its MCC/CC may not be used for the DRGs MCC/CC
- +6 NEW SETIFN,LINE,IX,NEWMCC,DXCC,FND,ARRCDX
- SET NEWMCC=""
- SET FND=""
- +7 ;
- +8 ; get secondary event diagnosis codes assigned to the cases secondary dx code sets
- +9 SET SETIFN=0
- FOR
- SET SETIFN=$ORDER(ARRSET(SETIFN))
- if 'SETIFN
- QUIT
- SET LINE=$GET(^ICDD(83.3,SETIFN,0))
- Begin DoDot:1
- +10 IF $PIECE(LINE,U,3)="DX"
- SET IX=0
- FOR
- SET IX=$ORDER(CDSET(SETIFN,IX))
- if 'IX
- QUIT
- IF IX'=$ORDER(DXATT(0))
- SET ARRCDX(IX)=""
- End DoDot:1
- +11 ;
- +12 ; if an event diagnosis is assigned to a case secondary dx code set then remove its MCC/CC from use on the DRG
- +13 ; recalculate the MCC/CC based on the event diagnosis not assigned to the cases secondary dx code sets
- +14 IF $ORDER(ARRCDX(0))
- SET NEWMCC=""
- SET IX=0
- FOR
- SET IX=$ORDER(DXATT(IX))
- if 'IX
- QUIT
- Begin DoDot:1
- +15 SET DXCC=$PIECE(DXATT(IX),U,7)
- IF DXCC'=""
- IF '$DATA(ARRCDX(IX))
- SET NEWMCC=DXCC
- End DoDot:1
- IF NEWMCC="MCC"
- QUIT
- +16 ;
- +17 IF $ORDER(ARRCDX(0))
- IF NEWMCC'=$PIECE(DXATT,U,1)
- SET FND=2_U_NEWMCC
- +18 ;
- +19 QUIT FND