| 1 | ICD187PT ; ALB/ADL - GROUPER DRIVER ; 04/11/03
 | 
|---|
| 2 |  ;;18.0;DRG Grouper;**7**;Oct 20, 2000
 | 
|---|
| 3 |  ;;**routine to build the new DRG global levels required for the CSV project
 | 
|---|
| 4 |  ;;**taken from routine created by DEK to add new "66" levels to ICD0 and ICD9
 | 
|---|
| 5 |  ;;**it addes the "DRG" levels to the 66 multiples in ICD0 (#80.1) and ICD9 (#80) and
 | 
|---|
| 6 |  ;;**it creates the 66 multiple levels in the DRG file (ICD/#80.2)
 | 
|---|
| 7 |  N I,FILE,CSD,NODE,FLAG,FLGN,CSIN,CSIP,CSAN,CSAP,ADATE,IDATE
 | 
|---|
| 8 |  S U="^"
 | 
|---|
| 9 |  F I=2:1 S CSD=$P($T(ADJDATA+I),";;",2) Q:CSD']""  D
 | 
|---|
| 10 |  . S FILE=$P(CSD,U),NODE=$P(CSD,U,2),FLAG=$P(CSD,U,3),FLGN=$P(CSD,U,10)
 | 
|---|
| 11 |  . S CSIN=$P(CSD,U,4),CSIP=$P(CSD,U,5),CSAN=$P(CSD,U,6)
 | 
|---|
| 12 |  . S CSAP=$P(CSD,U,7),ADATE=$P(CSD,U,8),IDATE=$P(CSD,U,9),MDC=$P(CSD,U,11),SURG=$P(CSD,U,12)
 | 
|---|
| 13 |  . D MAINLOOP(^DIC(FILE,0,"GL"),0)
 | 
|---|
| 14 |  Q
 | 
|---|
| 15 |  ;
 | 
|---|
| 16 | MAINLOOP(ROOT,IEN)      ;
 | 
|---|
| 17 |  N DKZ,RC,STAT,IDT,ADT,S,DRGZ S S="////"
 | 
|---|
| 18 |  W !!!?5,"APPLYING EDITS TO FILE ",FILE,!
 | 
|---|
| 19 |  I FILE=80.2 D CLEANUP  ;Remove old "66" levels before inserting new ones into ICD file
 | 
|---|
| 20 |  F  S IEN=$O(@(ROOT_IEN_")")) Q:'+IEN  D
 | 
|---|
| 21 |  . S DKZ=$G(@(ROOT_IEN_",0)")),STAT=+$P(DKZ,U,FLAG) ; zero node, status
 | 
|---|
| 22 |  . S IDT=$P(DKZ,U,CSIP),ADT=$P(DKZ,U,CSAP) ; in/active dates
 | 
|---|
| 23 |  . I FILE<81 D  Q
 | 
|---|
| 24 |  . . I FILE=80.2 S MDCD=$P(DKZ,U,MDC),SURGD=$P(DKZ,U,SURG) D ALTERDRG Q
 | 
|---|
| 25 |  . . I FILE=80 S DRGZ=$G(@(ROOT_IEN_",""DRG"")"))
 | 
|---|
| 26 |  . . I FILE=80.1 S DRGZ="^^^^^",SS=$O(@(ROOT_IEN_",""MDC"",99999)"),-1) I SS'="" S DRGZ=$G(@(ROOT_IEN_",""MDC"","_SS_",""DRG"")"))
 | 
|---|
| 27 |  . . D ALTERICD
 | 
|---|
| 28 |  . D ALTERCPT
 | 
|---|
| 29 |  Q
 | 
|---|
| 30 | ALTERICD        ;
 | 
|---|
| 31 |  N ANS,AD,ID,DR
 | 
|---|
| 32 |  I 'STAT S AD=$S(IDT="":ADATE,1:IDT),DR=CSAN_S_AD
 | 
|---|
| 33 |  E  S ID=$S(IDT="":IDATE,1:IDT),DR=CSIN_S_ID_";"_CSAN_S_ADATE
 | 
|---|
| 34 |  ;S ANS=$$EDIT0(IEN,ROOT,DR)  ;*DON'T RUN TO REBUILD .01 LEVEL
 | 
|---|
| 35 |  S ANS=1
 | 
|---|
| 36 |  ;W !,"IEN ",IEN,$S('ANS:" IN USE",1:" EDITED")
 | 
|---|
| 37 |  ;
 | 
|---|
| 38 |  I 'STAT D ADDMULT(FILE,IEN,NODE,AD,1,DRGZ)
 | 
|---|
| 39 |  I STAT D ADDMULT(FILE,IEN,NODE,ID,0,DRGZ)
 | 
|---|
| 40 |  Q
 | 
|---|
| 41 |  ;
 | 
|---|
| 42 | ALTERDRG        ;
 | 
|---|
| 43 |  N ANS,AD,ID,DR,EFFDT,EFFDT2,ACTFLG,FIRSTSET
 | 
|---|
| 44 |  ;I $D(@(ROOT_IEN_",66)")) Q
 | 
|---|
| 45 |  S FY=0,ACTFLG=0,FIRSTSET=0  ;Default ACTLFG=0 to start
 | 
|---|
| 46 |  F  S FY=$O(@(ROOT_IEN_",""FY"",FY)")) Q:FY=""  S FYINFO=^(FY,0),WGHT=$P(FYINFO,U,2),UPDT=$S((+WGHT)&('ACTFLG):1,(+WGHT=0)&(ACTFLG):1,1:0) I UPDT!('FIRSTSET) D
 | 
|---|
| 47 |  . S EFFDT=($E(FY,1,3)-1)_"1001" I EFFDT<2821001 Q  ;Ignore dates before FY 1983
 | 
|---|
| 48 |  . I 'FIRSTSET&(+WGHT=0) D  ;1st FY date WEIGHT = 0 (INACTIVE) - must have 1st entry = ACTIVE so create one
 | 
|---|
| 49 |  . . S EFFDT2=2821001 D ADDDRGZ(FILE,IEN,NODE,EFFDT2,1,MDCD,SURGD)  ;add FY 1983 w/status of ACTIVE
 | 
|---|
| 50 |  . . S ACTFLG=1
 | 
|---|
| 51 |  . S FIRSTSET=1
 | 
|---|
| 52 |  . I EFFDT=2821001&(ACTFLG) Q  ;First FY date = 2830000. Don't add second EFF DT entry for FY 2830000
 | 
|---|
| 53 |  . I ACTFLG D ADDDRGZ(FILE,IEN,NODE,EFFDT,0,MDCD,SURGD) S ACTFLG=0 Q  ;add INACTIVE node
 | 
|---|
| 54 |  . I 'ACTFLG D ADDDRGZ(FILE,IEN,NODE,EFFDT,1,MDCD,SURGD) S ACTFLG=1   ;add ACTIVE node
 | 
|---|
| 55 |  Q
 | 
|---|
| 56 |  ;
 | 
|---|
| 57 | CLEANUP ;REMOVE 66 LEVELS TO REPROCESS
 | 
|---|
| 58 |  S CD=0
 | 
|---|
| 59 |  F  S CD=$O(^ICD(CD)) Q:CD=""  K ^ICD(CD,66)
 | 
|---|
| 60 |  Q  ;CLEANUP
 | 
|---|
| 61 | ALTERCPT        ;
 | 
|---|
| 62 |  N DR,AD,ID,ANS,EFF,EFFS
 | 
|---|
| 63 |  S EFF=$$EFF(FILE,IEN)
 | 
|---|
| 64 |  S EFFS=$P(EFF,U,2),ID=$P(EFF,U,3),AD=$P(EFF,U,4),DR=CSAN_S_AD
 | 
|---|
| 65 |  S:'EFFS DR=DR_";"_CSIN_S_ID
 | 
|---|
| 66 |  I EFFS'=1-STAT S DR=DR_";"_FLGN_S_EFFS
 | 
|---|
| 67 |  S ANS=$$EDIT0(IEN,ROOT,DR)
 | 
|---|
| 68 |  ;W !,"IEN ",IEN,$S('ANS:" IN USE",1:" EDITED")
 | 
|---|
| 69 |  ;
 | 
|---|
| 70 |  I AD=ADATE D ADDMULT(FILE,IEN,NODE,AD,1)
 | 
|---|
| 71 |  I 'EFFS,ID=IDATE D ADDMULT(FILE,IEN,NODE,ID,0)
 | 
|---|
| 72 |  Q
 | 
|---|
| 73 |  ;
 | 
|---|
| 74 | EFF(FILE,CODE)  ;
 | 
|---|
| 75 |  N EFILE,EFF,EFFN,STR,EFFDT,EFFST,EFFBOOL,EFFDOS,EFFDFLT
 | 
|---|
| 76 |  S EFFDFLT="2890101^1^2900101^2890101",EFILE=^DIC(FILE,0,"GL")_CODE_",60,"
 | 
|---|
| 77 |  S EFF=$O(@(EFILE_"""B"","_(DT+.001)_")"),-1) I 'EFF Q EFFDFLT
 | 
|---|
| 78 |  S EFFN=$O(@(EFILE_"""B"","_EFF_",0)")) ; node 60 (effective date) sub-entry
 | 
|---|
| 79 |  S STR=$G(@(EFILE_EFFN_",0)")) I 'STR Q EFFDFLT
 | 
|---|
| 80 |  ;set Opposite eff. date based on status
 | 
|---|
| 81 |  S EFFDT=+STR,EFFST=$P(STR,U,2),EFFBOOL=0
 | 
|---|
| 82 |  F  S EFF=$O(@(EFILE_"""B"","_EFF_")"),-1) Q:'EFF!EFFBOOL  D
 | 
|---|
| 83 |  . S EFFN=$O(@(EFILE_"""B"","_EFF_",0)"))
 | 
|---|
| 84 |  . S EFFDOS=$G(@(EFILE_EFFN_",0)")) I 'EFFDOS S EFF="" Q
 | 
|---|
| 85 |  . S EFFBOOL=(EFFST'=$P(EFFDOS,U,2))
 | 
|---|
| 86 |  S EFFDOS=$G(EFFDOS,$S('EFFST:$P(EFFDFLT,U),1:$P(EFFDFLT,U,3)))
 | 
|---|
| 87 |  I EFFST S $P(STR,U,3,4)=(+EFFDOS)_U_EFFDT
 | 
|---|
| 88 |  E  S $P(STR,U,3,4)=EFFDT_U_(+EFFDOS)
 | 
|---|
| 89 |  Q STR
 | 
|---|
| 90 |  ;
 | 
|---|
| 91 | EDIT0(DA,DIE,DR)        ; adjust zero node
 | 
|---|
| 92 |  N REC S REC=DA
 | 
|---|
| 93 |  L +@(DIE_REC_",0)"):2 I  D  Q 1
 | 
|---|
| 94 |  . D ^DIE
 | 
|---|
| 95 |  . L -@(DIE_REC_",0)")
 | 
|---|
| 96 |  Q 0
 | 
|---|
| 97 |  ;
 | 
|---|
| 98 | ADDMULT(FN,IEN,NODE,X,STA,DRGZ) ; add to multiple
 | 
|---|
| 99 |  N FDA,FDAIEN,ANS
 | 
|---|
| 100 |  S FN=+$P(^DD(FN,NODE,0),U,2)
 | 
|---|
| 101 |  S FDAIEN="1,"_IEN_","
 | 
|---|
| 102 |  K ^TMP("DIERR",$J)
 | 
|---|
| 103 |  ;S FDA(FN,FDAIEN,.01)=X  ;NOT REQ'D SINCE ICD*18.0*6 ALREADY BUILT THIS LEVEL
 | 
|---|
| 104 |  ;S FDA(FN,FDAIEN,.02)=STA  ;NOT REQ'D SINCE ICD*18.0*6 ALREADY BUILT THIS LEVEL
 | 
|---|
| 105 |  F DRGCNT=1:1:6 S FDA(FN,FDAIEN,59+DRGCNT)=$P(DRGZ,"^",DRGCNT)
 | 
|---|
| 106 |  D UPDATE^DIE("","FDA")
 | 
|---|
| 107 |  S ANS='$D(^TMP("DIERR",$J))
 | 
|---|
| 108 |  ;W !,"IEN ",IEN,$S('ANS:" DIDNT",1:" DID")," ADD ",STA
 | 
|---|
| 109 |  Q
 | 
|---|
| 110 |  ;
 | 
|---|
| 111 | ADDDRGZ(FN,IEN,NODE,X,STA,MDCD,SURGD)   ; add to DRG multiple
 | 
|---|
| 112 |  N FDA,FDAIEN,ANS
 | 
|---|
| 113 |  S FN=+$P(^DD(FN,NODE,0),U,2)
 | 
|---|
| 114 |  S FDAIEN="+1,"_IEN_","
 | 
|---|
| 115 |  K ^TMP("DIERR",$J)
 | 
|---|
| 116 |  S FDA(FN,FDAIEN,.01)=X
 | 
|---|
| 117 |  S FDA(FN,FDAIEN,.03)=STA
 | 
|---|
| 118 |  S FDA(FN,FDAIEN,.05)=MDCD
 | 
|---|
| 119 |  S FDA(FN,FDAIEN,.06)=SURGD
 | 
|---|
| 120 |  ;F DRGCNT=1:1:6 S FDA(FN,FDAIEN,59+DRGCBT)=$P(DRGZ,"^",DRGCNT)
 | 
|---|
| 121 |  D UPDATE^DIE("","FDA")
 | 
|---|
| 122 |  S ANS='$D(^TMP("DIERR",$J))
 | 
|---|
| 123 |  ;W !,"IEN ",IEN,$S('ANS:" DIDNT",1:" DID")," ADD ",STA
 | 
|---|
| 124 |  Q
 | 
|---|
| 125 |  ;
 | 
|---|
| 126 | SETINACT(IEN)   ;set inactive dates for DRG codes
 | 
|---|
| 127 |  N FY
 | 
|---|
| 128 |  S FY=0
 | 
|---|
| 129 |  F  S FY=$O(^ICD(IEN,"FY",FY)) Q:FY=""  I +$P(^ICD(IEN,"FY",FY,0),"^",2)=0 D  Q
 | 
|---|
| 130 |  . S DATE=$E(FY,1,3)_"1001"
 | 
|---|
| 131 |  . I $D(^ICD(IEN,66,"B",DATE)) Q
 | 
|---|
| 132 |  . D ADDDRGZ(FILE,IEN,NODE,DATE,0,MDCD,SURGD) ; add w/date of 10/1 of FY and STATUS of 0 (INACTIVE)
 | 
|---|
| 133 |  . W !,"UPDATING ",IEN," TO INACTIVE"
 | 
|---|
| 134 |  Q  ;SETINACT
 | 
|---|
| 135 |  ;
 | 
|---|
| 136 | UPDATE ; SET INACTIVE DRG LEVELS
 | 
|---|
| 137 |  N I,FILE,CSD,NODE,FLAG,FLGN,CSIN,CSIP,CSAN,CSAP,ADATE,IDATE
 | 
|---|
| 138 |  S U="^"
 | 
|---|
| 139 |  S CSD=$P($T(ADJDATA+4),";;",2) Q:CSD']""  D
 | 
|---|
| 140 |  . S FILE=80.2,NODE=$P(CSD,U,2),FLAG=$P(CSD,U,3),FLGN=$P(CSD,U,10)
 | 
|---|
| 141 |  . S CSIN=$P(CSD,U,4),CSIP=$P(CSD,U,5),CSAN=$P(CSD,U,6)
 | 
|---|
| 142 |  . S CSAP=$P(CSD,U,7),ADATE=$P(CSD,U,8),IDATE=$P(CSD,U,9),MDC=$P(CSD,U,11),SURG=$P(CSD,U,12)
 | 
|---|
| 143 |  . S ROOT=^DIC(FILE,0,"GL"),IEN=0
 | 
|---|
| 144 |  . ;CODE TAKE FROM MAINLOOP 
 | 
|---|
| 145 |  . N DKZ,RC,STAT,IDT,ADT,S,DRGZ S S="////"
 | 
|---|
| 146 |  . W !!!?5,"UPDATING INACTIVE FLAG FOR ",FILE,!
 | 
|---|
| 147 |  . F  S IEN=$O(@(ROOT_IEN_")")) Q:'+IEN  D
 | 
|---|
| 148 |  . . S DKZ=$G(@(ROOT_IEN_",0)")),STAT=+$P(DKZ,U,FLAG) ; zero node, status
 | 
|---|
| 149 |  . . S IDT=$P(DKZ,U,CSIP),ADT=$P(DKZ,U,CSAP) ; in/active dates
 | 
|---|
| 150 |  . . S MDCD=$P(DKZ,U,MDC),SURGD=$P(DKZ,U,SURG) D SETINACT(IEN) Q
 | 
|---|
| 151 |  Q
 | 
|---|
| 152 |  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 | 
|---|
| 153 | ADJDATA ;data to add/update
 | 
|---|
| 154 |  ;;
 | 
|---|
| 155 |  ;;80.1^66^9^102^11^12^12^2781001^2791001^100
 | 
|---|
| 156 |  ;;80^66^9^102^11^16^16^2781001^2791001^100
 | 
|---|
| 157 |  ;;80.2^66^14^16^15^14^13^2821001^2791001^15^5^6
 | 
|---|
| 158 |  Q
 | 
|---|
| 159 |  ;;81^60^4^7^7^8^8^2890101^2900101^5
 | 
|---|
| 160 |  ;;81.3^60^5^7^7^8^8^2890101^2900101^5
 | 
|---|
| 161 |  ;;
 | 
|---|
| 162 |  ;;
 | 
|---|