DGPTFJC ;ALB/ADL,HIOFT/FT - CLOSED PTF ;12/12/14 2:15pm
;;5.3;Registration;**158,510,517,590,636,635,701,729,785,850,884,912**;Aug 13, 1993;Build 3
;;ADL;;Update for CSV Project;;Mar 25, 2003
101 W !,"Enter '^N' for Screen N, RETURN for <MAS>,'^' to Abort: <MAS>//"
D READ G Q^DGPTF:X=U,^DGPTFM:X="",^DGPTFJ:X?1"^".E D H G 101
;
H D HELP^DGPTFJ W ! Q
;
MAS W !!,"Enter '^N' for Screen N, RETURN for <",DGNUM,">,'^' to Abort: <",DGNUM,">//"
D READ G Q^DGPTF:X=U,^DGPTFJ:X?1"^".E
I X="" S (ST,ST1)=J+1 G @($S($D(DGZDIAG):"NDG",$D(DGZSER):"NSR",$D(DGZPRO):"NPR",$D(DGZSUR):"EN",+DGZPRF-1'=$P(DGZPRF,U,3):"NPS",1:"DONE")_"^DGPTFM")
D H G MAS
;
401 S DGNUM=$S($D(S(DGZS0+1)):401_"-"_(DGZS0+1),1:"MAS")
W !,"Enter '^N' for Screen N, RETURN for <",DGNUM,">,'^' to Abort: <",DGNUM,">//"
D READ G Q^DGPTF:X=U,NEXM^DGPTFM5:X="",^DGPTFJ:X?1"^".E D H G 401
;
501 W !,"Enter '^N' for Screen N, RETURN for <",DGNUM,">,'^' to Abort: <",DGNUM,">//"
D READ G Q^DGPTF:X=U,NEXM^DGPTFM4:X="",^DGPTFJ:X?1"^".E D H G 501
;
601 W !,"Enter '^N' for Screen N, RETURN for <",DGNUM,">,'^' to Abort: <",DGNUM,">//"
D READ G Q^DGPTF:X=U,NEXP^DGPTFM6:X="",^DGPTFJ:X?1"^".E D H G 601
;
701 ;
G ACT1^DGPTF41 ; new code
;
;Display screen prompt and process user response for 801 screen
801 W !,"Enter '^N' for Screen N, RETURN for <",DGNUM,">,'^' to Abort: <",DGNUM,">//"
D READ G Q^DGPTF:X=U,NEXP^DGPTFM2:X="",^DGPTFJ:X?1"^".E D H G 801
READ ; -- read X
R X:DTIME S:'$T X="^",DGPTOUT=""
Q
;
EN ; DG*636 ; DG*5.3*850
; Called from Diagnosis fields in 501 movements
; Variable DGN is passed globally as a node identifier
;
N EFFDATE,DGTEMP,IMPDATE,DGINAC
D EFFDATE^DGPTIC10(DA(1))
S K=$S($D(K):K,1:1),DGER=0 ;S DGPTDAT=$$GETDATE^ICDGTDRG(DA(1))
;
;if there is a disch and a previous movement, if disch
;is >Oct 1 (next FY) and movement <Oct 1, then use the movement date
I $G(DGZM0)="" S DGZM0=1,M(DGZM0)="0^" ; to prevent sys err from TD5^DGPTTS2 and ptf quick load (DG*701/729)
N DGPTMVDT I DGPTDAT=$P($G(^DGPT(DA(1),70)),U,1)&(DGPTDAT=$P($G(^DGPT(DA(1),"M",1,0)),U,10))&($D(M(DGZM0)))&($P($G(M(DGZM0)),U)'=1) S DGPTMVDT=$P($G(^DGPT(DA(1),"M",2,0)),U,10)
;next line is if using "Add a code" in MAS screen
I '$G(DGPTMVDT)&($D(DGADD))&($G(DGMOV)'=1) S DGPTMVDT=$P($G(^DGPT(DA(1),"M",2,0)),U,10)
I $G(DGPTMVDT) D
.;if same calendar year
.I $E(DGPTDAT,1,3)=$E(DGPTMVDT,1,3),$E(DGPTDAT,4,7)>0930,$E(DGPTMVDT,4,7)<1001 S DGPTDAT=DGPTMVDT Q
.;if different calendar year
.I ($E(DGPTDAT,1,3)-$E(DGPTMVDT,1,3))>1 S DGPTDAT=DGPTMVDT Q
.I $E(DGPTMVDT,4,7)<1001 S DGPTDAT=DGPTMVDT Q
.I $E(DGPTDAT,4,7)>0930 S DGPTDAT=DGPTMVDT Q
I $G(DGPMT)!$G(DGQWK) K M(DGZM0),DGZM0 ; DG*701/729
S DGPTTMP=$$ICDDATA^ICDXCODE("DIAG",+Y,EFFDATE)
I +DGPTTMP<0 D MSG("Can not use inactive codes.") S DGER=1 Q
I '$P(DGPTTMP,U,10) S DGINAC=$P(DGPTTMP,U,12) I DGINAC<EFFDATE D MSG("Can not use inactive codes.") S DGER=1 Q
;end DG*636
;===================================================================
;
;Allow sex-unique ICD codes to be assigned to the opposite sex
;for 501 movements, output warning only (Ref: DG*5.3*884)
I $P(DGPTTMP,U,11)]""&($P(DGPTTMP,U,11)'=$S($D(^DPT(+^DGPT(DA(1),0),0)):$P(^(0),U,2),1:"M")) D
. D:K<24 MSG($P(DGPTTMP,U,2)_" should only be used with "_$S($P(DGPTTMP,U,11)="F":"FEMALES",1:"MALES")) S K=K+1 Q
;
; -- can't enter a code already in the movement
I $D(^DGPT(DA(1),"M","AC",+Y,DA)) W !,"Cannot enter the same code twice." S DGER=1 Q
;
S %=U_$P(^DGPT(DA(1),"M",DA,0),U,5,15),$P(%,U,7)=U ;take movement date out of %
D NOT(+Y,%)
Q:DGER
D REQ(+Y,%)
Q
;
EN1 ; called from 601 movement procedure codes and 401 Surgical operations
S K=$S($D(K):K,1:1),DGER=0
;
N EFFDATE,DGTEMP,IMPDATE,DGPTDAT
;
;Next 2 lines commented out since they were used to prevent duplicate operation/procedure codes (401 & 601)
;from being entered. If duplicate checking is ever implemented for operation/procedure data, a replacement
;multi-field xref will need to be created. (Ref: DG*5.3*884)
;S:$G(DGIT)=5 DGCR="AP6",DGSB="P"
;S:$G(DGIT)=8 DGCR="AO",DGSB="S"
;
D EFFDATE^DGPTIC10(DA(1))
;S DGICD0=$$ICDDATA^ICDXCODE("PROC",+Y,EFFDATE)
N DGPRDT S DGPRDT=$S(+$G(DGPROCD):+DGPROCD,1:+$G(DGPROCI))
S:'+$G(DGPRDT) DGICD0=$$ICDDATA^ICDXCODE("PROC",+Y,EFFDATE)
I +$G(DGPRDT) D
. ;if procedure before ICD-10 era but the effective date (discharge date) is after then use the eff date and quit
. I DGPRDT<IMPDATE,EFFDATE'<IMPDATE S DGICD0=$$ICDDATA^ICDXCODE("PROC",+Y,EFFDATE) Q
. ;otherwise use the procedure date
. S DGICD0=$$ICDDATA^ICDXCODE("PROC",+Y,DGPRDT)
;
I +DGICD0,0!('$P(DGICD0,U,10)) S DGER=1 Q
;
;Allow sex-unique ICD codes to be assigned to the opposite sex for
;401 Surgeries and 601 Procedures, output warning only (Ref: DG*5.3*884)
I $P(DGICD0,U,11)]""&($P(DGICD0,U,11)'=$S($D(^DPT(+^DGPT(DA(1),0),0)):$P(^(0),U,2),1:"M")) D
. D:K<24 MSG($P(DGICD0,U,2)_" should only be used with "_$S($P(DGICD0,U,11)="F":"FEMALES",1:"MALES")) S K=K+1 Q
;
;Next 2 lines commented out since user may enter duplicate operation/procedure codes (401 & 601) as sometimes
;they must code left and right when there aren't specific codes, they enter the code twice. (Ref: DG*5.3*884)
;S %=$P(^DGPT(DA(1),$G(DGSB),DA,0),U,DGI)
;I $D(^DGPT(DA(1),$G(DGSB),$G(DGCR),Y,DA)),%'=Y S DGER=1 D MSG("Cannot enter the same code more than once within a "_$S(DGSB="S":"401",1:"601")_" transaction") Q
;
Q
EN2 ; Called from 701 movement procedure codes
S K=$S($D(K):K,1:1),DGER=0
N EFFDATE,DGTEMP,IMPDATE,DGPTDAT
D EFFDATE^DGPTIC10(DA)
S DGPTTMP=$$ICDDATA^ICDXCODE("PROC",+Y,EFFDATE)
;
I +DGPTTMP<0!('$P(DGPTTMP,U,10)) S DGER=1 Q
;
;Allow sex-unique ICD codes to be assigned to the opposite sex for
;401P Procedures, output warning only (Ref: DG*5.3*884)
I $P(DGPTTMP,U,11)]""&($P(DGPTTMP,U,11)'=$S($D(^DPT(+^DGPT(DA,0),0)):$P(^(0),U,2),1:"M")) D
. D:K<24 MSG($P(DGPTTMP,U,2)_" should only be used with "_$S($P(DGPTTMP,U,11)="F":"FEMALES",1:"MALES")) S K=K+1 Q
;
S L=$P($S($D(^DGPT((DA),"401P")):^("401P"),1:0),U,1,5)
S %=$P(L,U,DGI)
S L=$P(L,U,1,DGI-1)_U_$P(L,U,DGI+1,5)
I L[+Y D MSG("Cannot enter the same code twice.") S DGER=1 Q
Q
EN3 ;Called from 701 movement diagnosis fields (top level)
; - EFFDATE := date of interest e.g. patient discharge date
; - IMPDATE := ICD-10 implementation date
; - DGTEMP := temp variable to hold data from $$IMPDATE^DGPTIC10
;
N EFFDATE,DGTEMP,IMPDATE,DGINAC
;
D EFFDATE^DGPTIC10(DA)
;
S K=$S($D(K):K,1:1),DGER=0,DGPTTMP=$$ICDDATA^ICDXCODE("DIAG",+Y,EFFDATE)
I +DGPTTMP<0 D MSG("Can not use inactive codes.") S DGER=1 Q
I '$P(DGPTTMP,U,10) S DGINAC=$P(DGPTTMP,U,12) I DGINAC<EFFDATE D MSG("Can not use inactive codes.") S DGER=1 Q
;
; - unacceptable as primary DX
I DGI=1,$P(DGPTTMP,U,5) D MSG("Not acceptable as a primary Diagnosis.") S DGER=1 Q
;
;Allow sex-unique ICD codes to be assigned to the opposite sex for
;Primary and Secondary Dx's, output warning only (Ref: DG*5.3*884)
I $P(DGPTTMP,U,11)]""&($P(DGPTTMP,U,11)'=$S($D(^DPT(+^DGPT(DA,0),0)):$P(^(0),U,2),1:"M")) D
. D:K<24 MSG($P(DGPTTMP,U,2)_" should only be used with "_$S($P(DGPTTMP,U,11)="F":"FEMALES",1:"MALES")) S K=K+1 Q
;
; -- build string of 701 dx codes
S %=$S($D(^DGPT(DA,70)):^(70),1:""),%=U_$P(%,U,10)_U_$P(%,U,16,24)_U
S:$G(^DGPT(DA,71))'="" %=%_^(71)_U
;
; -- can't enter the same entry twice
S $P(%,U,DGI+1)=U I %[(U_+Y_U) S DGER=1 D MSG("Cannot enter the same code twice.") Q
;
D NOT(+Y,%)
Q:DGER
;
D REQ(+Y,%)
Q
EN4 ; called from ??
S K=$S($D(K):K,1:1),DGER=0,N=$$ICDDATA^ICDXCODE("DIAG",+Y,$$GETDATE^ICDGTDRG(DA)) I N<0!'$P(N,U,10) S DGER=1 Q
I DGI=1,$P(N,U,5) S DGER=1 Q
I $P(N,U,11)]""&($P(N,U,11)'=$S($D(^DPT(+^DGPT(DA(2),0),0)):$P(^(0),U,2),1:"M")) D:K<24 MSG($P(N,U,2)_" can only be used with "_$S($P(N,U,11)="F":"FEMALES",1:"MALES")) S K=K+1,DGER=1 Q
S %=$S($D(^DGPT(DA(2),"C",DA(1),"CPT",DA,0)):^(0),1:""),%=U_$P(%,U,4,7)_U,$P(%,U,DGI+1)=U I %[(U_+Y_U) S DGER=1 Q
D NOT(+Y,%)
Q:DGER
D REQ(DA(2),+Y,%)
Q
EN5 ; DG*5.3*850
; called from the diagnosis input transforms in file 46
N EFFDATE,DGTEMP,IMPDATE
I $G(PTF) D EFFDATE^DGPTIC10($G(PTF))
S K=$S($D(K):K,1:1),DGER=0,DGPTTMP=$$ICDDATA^ICDXCODE("DIAG",+Y,EFFDATE)
I +DGPTTMP<0!('$P(DGPTTMP,U,10)) D MSG("Must be an active code.") S DGER=1 Q
;
I $P(DGPTTMP,U,11)]""&($P(DGPTTMP,U,11)'=$S($D(^DPT(+^DGPT(PTF,0),0)):$P(^(0),U,2),1:"M")) D
. D:K<24 MSG($P(DGPTTMP,U,2)_" can only be used with "_$S($P(DGPTTMP,U,11)="F":"FEMALES",1:"MALES")) S K=K+1,DGER=1 Q
;
S K=^DGCPT(46,DA,0) I $P(K,U,4,7)_U_$P(K,U,15,18)[Y D MSG("Cannot enter the same code twice.") S DGER=1 Q
Q
EN6 ; -- called from file 46; .01 field
;DG*5.3*912 code being changed to accomodate patch ICPT*46 code enforcement
;I $P($G(^(0)),U,2)?.N S DGER=1 Q
;using a naked reference as this line of code calls an input transform, which requires a naked reference
I '$D(^(61,"B")) S DGER=1 Q
S DGER=0,N=$$CPT^ICPTCOD(+Y,$$GETDATE^ICDGTDRG($G(DA))) I N<0!'$P(N,"^",7) S DGER=1 Q
S L=0 F S L=$O(^DGCPT(46,L)) Q:L'>0 I +$G(^(L,1))=$G(DGPRD),$P(^(1),U,3)=$G(PTF),+^(0)=Y,'$G(^(9)) S DGER=1 Q
K L Q
Q
;
REQ(DX,STRING) ; - is another ICD code required with this code
; -- input DX - code being entered
; STRING - string of code iens already entered for movement ("^123^456^789^")
; -- output - writes message if another code is required
;
N I,IEN,DGI,DZ
K ^TMP("DGPTF-R",$J)
Q:$G(DX)<1
Q:'$$REQ^ICDEX(DX,"DGPTF-R",1)
;
S DGI=1 S DZ="" F I=0:0 S DZ=$O(^TMP("DGPTF-R",$J,"B",DZ)) Q:DZ="" D Q:DG1=1
. S IEN=$O(^TMP("DGPTF-R",$J,"B",DZ,0)) Q:IEN<1 S DG1=0 I STRING[(U_IEN_U) S DG1=1 Q
I DG1=0 D MSG($S(+DGPTTMP>0:$P(DGPTTMP,U,2),1:"")_" requires additional code.")
K ^TMP("DGPTF-R",$J)
Q
;
NOT(DX,STRING) ; - is icd code not to use with existing codes
; -- input DX - code being entered
; STRING - string of code iens already entered for movement ("^123^456^789^")
; -- output DGER :=1 if error
; writes message if not allowed
;
N I,IEN,DGI,DZ
K ^TMP("DGPTF-N",$J)
S DGER=0
Q:$G(DX)<1
;
Q:'$$NOT^ICDEX(DX,"DGPTF-N",1)
;
S DGI=1 S DZ="" F I=0:0 S DZ=$O(^TMP("DGPTF-N",$J,"B",DZ)) Q:DZ="" D Q:DGER
. S IEN=$O(^TMP("DGPTF-N",$J,"B",DZ,0)) Q:IEN<1 I STRING[(U_IEN_U) S DGER=1 D Q:DGER
.. D MSG("Cannot use "_$$CODEC^ICDEX(80,DX)_" with "_$$CODEC^ICDEX(80,IEN)) Q
K ^TMP("DGPTF-N",$J)
Q
MSG(TEXT) ;
D EN^DDIOL(TEXT)
Q
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HDGPTFJC 10629 printed Dec 13, 2024@02:52:14 Page 2
DGPTFJC ;ALB/ADL,HIOFT/FT - CLOSED PTF ;12/12/14 2:15pm
+1 ;;5.3;Registration;**158,510,517,590,636,635,701,729,785,850,884,912**;Aug 13, 1993;Build 3
+2 ;;ADL;;Update for CSV Project;;Mar 25, 2003
101 WRITE !,"Enter '^N' for Screen N, RETURN for <MAS>,'^' to Abort: <MAS>//"
+1 DO READ
if X=U
GOTO Q^DGPTF
if X=""
GOTO ^DGPTFM
if X?1"^".E
GOTO ^DGPTFJ
DO H
GOTO 101
+2 ;
H DO HELP^DGPTFJ
WRITE !
QUIT
+1 ;
MAS WRITE !!,"Enter '^N' for Screen N, RETURN for <",DGNUM,">,'^' to Abort: <",DGNUM,">//"
+1 DO READ
if X=U
GOTO Q^DGPTF
if X?1"^".E
GOTO ^DGPTFJ
+2 IF X=""
SET (ST,ST1)=J+1
GOTO @($SELECT($DATA(DGZDIAG):"NDG",$DATA(DGZSER):"NSR",$DATA(DGZPRO):"NPR",$DATA(DGZSUR):"EN",+DGZPRF-1'=$PIECE(DGZPRF,U,3):"NPS",1:"DONE")_"^DGPTFM")
+3 DO H
GOTO MAS
+4 ;
401 SET DGNUM=$SELECT($DATA(S(DGZS0+1)):401_"-"_(DGZS0+1),1:"MAS")
+1 WRITE !,"Enter '^N' for Screen N, RETURN for <",DGNUM,">,'^' to Abort: <",DGNUM,">//"
+2 DO READ
if X=U
GOTO Q^DGPTF
if X=""
GOTO NEXM^DGPTFM5
if X?1"^".E
GOTO ^DGPTFJ
DO H
GOTO 401
+3 ;
501 WRITE !,"Enter '^N' for Screen N, RETURN for <",DGNUM,">,'^' to Abort: <",DGNUM,">//"
+1 DO READ
if X=U
GOTO Q^DGPTF
if X=""
GOTO NEXM^DGPTFM4
if X?1"^".E
GOTO ^DGPTFJ
DO H
GOTO 501
+2 ;
601 WRITE !,"Enter '^N' for Screen N, RETURN for <",DGNUM,">,'^' to Abort: <",DGNUM,">//"
+1 DO READ
if X=U
GOTO Q^DGPTF
if X=""
GOTO NEXP^DGPTFM6
if X?1"^".E
GOTO ^DGPTFJ
DO H
GOTO 601
+2 ;
701 ;
+1 ; new code
GOTO ACT1^DGPTF41
+2 ;
+3 ;Display screen prompt and process user response for 801 screen
801 WRITE !,"Enter '^N' for Screen N, RETURN for <",DGNUM,">,'^' to Abort: <",DGNUM,">//"
+1 DO READ
if X=U
GOTO Q^DGPTF
if X=""
GOTO NEXP^DGPTFM2
if X?1"^".E
GOTO ^DGPTFJ
DO H
GOTO 801
READ ; -- read X
+1 READ X:DTIME
if '$TEST
SET X="^"
SET DGPTOUT=""
+2 QUIT
+3 ;
EN ; DG*636 ; DG*5.3*850
+1 ; Called from Diagnosis fields in 501 movements
+2 ; Variable DGN is passed globally as a node identifier
+3 ;
+4 NEW EFFDATE,DGTEMP,IMPDATE,DGINAC
+5 DO EFFDATE^DGPTIC10(DA(1))
+6 ;S DGPTDAT=$$GETDATE^ICDGTDRG(DA(1))
SET K=$SELECT($DATA(K):K,1:1)
SET DGER=0
+7 ;
+8 ;if there is a disch and a previous movement, if disch
+9 ;is >Oct 1 (next FY) and movement <Oct 1, then use the movement date
+10 ; to prevent sys err from TD5^DGPTTS2 and ptf quick load (DG*701/729)
IF $GET(DGZM0)=""
SET DGZM0=1
SET M(DGZM0)="0^"
+11 NEW DGPTMVDT
IF DGPTDAT=$PIECE($GET(^DGPT(DA(1),70)),U,1)&(DGPTDAT=$PIECE($GET(^DGPT(DA(1),"M",1,0)),U,10))&($DATA(M(DGZM0)))&($PIECE($GET(M(DGZM0)),U)'=1)
SET DGPTMVDT=$PIECE($GET(^DGPT(DA(1),"M",2,0)),U,10)
+12 ;next line is if using "Add a code" in MAS screen
+13 IF '$GET(DGPTMVDT)&($DATA(DGADD))&($GET(DGMOV)'=1)
SET DGPTMVDT=$PIECE($GET(^DGPT(DA(1),"M",2,0)),U,10)
+14 IF $GET(DGPTMVDT)
Begin DoDot:1
+15 ;if same calendar year
+16 IF $EXTRACT(DGPTDAT,1,3)=$EXTRACT(DGPTMVDT,1,3)
IF $EXTRACT(DGPTDAT,4,7)>0930
IF $EXTRACT(DGPTMVDT,4,7)<1001
SET DGPTDAT=DGPTMVDT
QUIT
+17 ;if different calendar year
+18 IF ($EXTRACT(DGPTDAT,1,3)-$EXTRACT(DGPTMVDT,1,3))>1
SET DGPTDAT=DGPTMVDT
QUIT
+19 IF $EXTRACT(DGPTMVDT,4,7)<1001
SET DGPTDAT=DGPTMVDT
QUIT
+20 IF $EXTRACT(DGPTDAT,4,7)>0930
SET DGPTDAT=DGPTMVDT
QUIT
End DoDot:1
+21 ; DG*701/729
IF $GET(DGPMT)!$GET(DGQWK)
KILL M(DGZM0),DGZM0
+22 SET DGPTTMP=$$ICDDATA^ICDXCODE("DIAG",+Y,EFFDATE)
+23 IF +DGPTTMP<0
DO MSG("Can not use inactive codes.")
SET DGER=1
QUIT
+24 IF '$PIECE(DGPTTMP,U,10)
SET DGINAC=$PIECE(DGPTTMP,U,12)
IF DGINAC<EFFDATE
DO MSG("Can not use inactive codes.")
SET DGER=1
QUIT
+25 ;end DG*636
+26 ;===================================================================
+27 ;
+28 ;Allow sex-unique ICD codes to be assigned to the opposite sex
+29 ;for 501 movements, output warning only (Ref: DG*5.3*884)
+30 IF $PIECE(DGPTTMP,U,11)]""&($PIECE(DGPTTMP,U,11)'=$SELECT($DATA(^DPT(+^DGPT(DA(1),0),0)):$PIECE(^(0),U,2),1:"M"))
Begin DoDot:1
+31 if K<24
DO MSG($PIECE(DGPTTMP,U,2)_" should only be used with "_$SELECT($PIECE(DGPTTMP,U,11)="F":"FEMALES",1:"MALES"))
SET K=K+1
QUIT
End DoDot:1
+32 ;
+33 ; -- can't enter a code already in the movement
+34 IF $DATA(^DGPT(DA(1),"M","AC",+Y,DA))
WRITE !,"Cannot enter the same code twice."
SET DGER=1
QUIT
+35 ;
+36 ;take movement date out of %
SET %=U_$PIECE(^DGPT(DA(1),"M",DA,0),U,5,15)
SET $PIECE(%,U,7)=U
+37 DO NOT(+Y,%)
+38 if DGER
QUIT
+39 DO REQ(+Y,%)
+40 QUIT
+41 ;
EN1 ; called from 601 movement procedure codes and 401 Surgical operations
+1 SET K=$SELECT($DATA(K):K,1:1)
SET DGER=0
+2 ;
+3 NEW EFFDATE,DGTEMP,IMPDATE,DGPTDAT
+4 ;
+5 ;Next 2 lines commented out since they were used to prevent duplicate operation/procedure codes (401 & 601)
+6 ;from being entered. If duplicate checking is ever implemented for operation/procedure data, a replacement
+7 ;multi-field xref will need to be created. (Ref: DG*5.3*884)
+8 ;S:$G(DGIT)=5 DGCR="AP6",DGSB="P"
+9 ;S:$G(DGIT)=8 DGCR="AO",DGSB="S"
+10 ;
+11 DO EFFDATE^DGPTIC10(DA(1))
+12 ;S DGICD0=$$ICDDATA^ICDXCODE("PROC",+Y,EFFDATE)
+13 NEW DGPRDT
SET DGPRDT=$SELECT(+$GET(DGPROCD):+DGPROCD,1:+$GET(DGPROCI))
+14 if '+$GET(DGPRDT)
SET DGICD0=$$ICDDATA^ICDXCODE("PROC",+Y,EFFDATE)
+15 IF +$GET(DGPRDT)
Begin DoDot:1
+16 ;if procedure before ICD-10 era but the effective date (discharge date) is after then use the eff date and quit
+17 IF DGPRDT<IMPDATE
IF EFFDATE'<IMPDATE
SET DGICD0=$$ICDDATA^ICDXCODE("PROC",+Y,EFFDATE)
QUIT
+18 ;otherwise use the procedure date
+19 SET DGICD0=$$ICDDATA^ICDXCODE("PROC",+Y,DGPRDT)
End DoDot:1
+20 ;
+21 IF +DGICD0
IF 0!('$PIECE(DGICD0,U,10))
SET DGER=1
QUIT
+22 ;
+23 ;Allow sex-unique ICD codes to be assigned to the opposite sex for
+24 ;401 Surgeries and 601 Procedures, output warning only (Ref: DG*5.3*884)
+25 IF $PIECE(DGICD0,U,11)]""&($PIECE(DGICD0,U,11)'=$SELECT($DATA(^DPT(+^DGPT(DA(1),0),0)):$PIECE(^(0),U,2),1:"M"))
Begin DoDot:1
+26 if K<24
DO MSG($PIECE(DGICD0,U,2)_" should only be used with "_$SELECT($PIECE(DGICD0,U,11)="F":"FEMALES",1:"MALES"))
SET K=K+1
QUIT
End DoDot:1
+27 ;
+28 ;Next 2 lines commented out since user may enter duplicate operation/procedure codes (401 & 601) as sometimes
+29 ;they must code left and right when there aren't specific codes, they enter the code twice. (Ref: DG*5.3*884)
+30 ;S %=$P(^DGPT(DA(1),$G(DGSB),DA,0),U,DGI)
+31 ;I $D(^DGPT(DA(1),$G(DGSB),$G(DGCR),Y,DA)),%'=Y S DGER=1 D MSG("Cannot enter the same code more than once within a "_$S(DGSB="S":"401",1:"601")_" transaction") Q
+32 ;
+33 QUIT
EN2 ; Called from 701 movement procedure codes
+1 SET K=$SELECT($DATA(K):K,1:1)
SET DGER=0
+2 NEW EFFDATE,DGTEMP,IMPDATE,DGPTDAT
+3 DO EFFDATE^DGPTIC10(DA)
+4 SET DGPTTMP=$$ICDDATA^ICDXCODE("PROC",+Y,EFFDATE)
+5 ;
+6 IF +DGPTTMP<0!('$PIECE(DGPTTMP,U,10))
SET DGER=1
QUIT
+7 ;
+8 ;Allow sex-unique ICD codes to be assigned to the opposite sex for
+9 ;401P Procedures, output warning only (Ref: DG*5.3*884)
+10 IF $PIECE(DGPTTMP,U,11)]""&($PIECE(DGPTTMP,U,11)'=$SELECT($DATA(^DPT(+^DGPT(DA,0),0)):$PIECE(^(0),U,2),1:"M"))
Begin DoDot:1
+11 if K<24
DO MSG($PIECE(DGPTTMP,U,2)_" should only be used with "_$SELECT($PIECE(DGPTTMP,U,11)="F":"FEMALES",1:"MALES"))
SET K=K+1
QUIT
End DoDot:1
+12 ;
+13 SET L=$PIECE($SELECT($DATA(^DGPT((DA),"401P")):^("401P"),1:0),U,1,5)
+14 SET %=$PIECE(L,U,DGI)
+15 SET L=$PIECE(L,U,1,DGI-1)_U_$PIECE(L,U,DGI+1,5)
+16 IF L[+Y
DO MSG("Cannot enter the same code twice.")
SET DGER=1
QUIT
+17 QUIT
EN3 ;Called from 701 movement diagnosis fields (top level)
+1 ; - EFFDATE := date of interest e.g. patient discharge date
+2 ; - IMPDATE := ICD-10 implementation date
+3 ; - DGTEMP := temp variable to hold data from $$IMPDATE^DGPTIC10
+4 ;
+5 NEW EFFDATE,DGTEMP,IMPDATE,DGINAC
+6 ;
+7 DO EFFDATE^DGPTIC10(DA)
+8 ;
+9 SET K=$SELECT($DATA(K):K,1:1)
SET DGER=0
SET DGPTTMP=$$ICDDATA^ICDXCODE("DIAG",+Y,EFFDATE)
+10 IF +DGPTTMP<0
DO MSG("Can not use inactive codes.")
SET DGER=1
QUIT
+11 IF '$PIECE(DGPTTMP,U,10)
SET DGINAC=$PIECE(DGPTTMP,U,12)
IF DGINAC<EFFDATE
DO MSG("Can not use inactive codes.")
SET DGER=1
QUIT
+12 ;
+13 ; - unacceptable as primary DX
+14 IF DGI=1
IF $PIECE(DGPTTMP,U,5)
DO MSG("Not acceptable as a primary Diagnosis.")
SET DGER=1
QUIT
+15 ;
+16 ;Allow sex-unique ICD codes to be assigned to the opposite sex for
+17 ;Primary and Secondary Dx's, output warning only (Ref: DG*5.3*884)
+18 IF $PIECE(DGPTTMP,U,11)]""&($PIECE(DGPTTMP,U,11)'=$SELECT($DATA(^DPT(+^DGPT(DA,0),0)):$PIECE(^(0),U,2),1:"M"))
Begin DoDot:1
+19 if K<24
DO MSG($PIECE(DGPTTMP,U,2)_" should only be used with "_$SELECT($PIECE(DGPTTMP,U,11)="F":"FEMALES",1:"MALES"))
SET K=K+1
QUIT
End DoDot:1
+20 ;
+21 ; -- build string of 701 dx codes
+22 SET %=$SELECT($DATA(^DGPT(DA,70)):^(70),1:"")
SET %=U_$PIECE(%,U,10)_U_$PIECE(%,U,16,24)_U
+23 if $GET(^DGPT(DA,71))'=""
SET %=%_^(71)_U
+24 ;
+25 ; -- can't enter the same entry twice
+26 SET $PIECE(%,U,DGI+1)=U
IF %[(U_+Y_U)
SET DGER=1
DO MSG("Cannot enter the same code twice.")
QUIT
+27 ;
+28 DO NOT(+Y,%)
+29 if DGER
QUIT
+30 ;
+31 DO REQ(+Y,%)
+32 QUIT
EN4 ; called from ??
+1 SET K=$SELECT($DATA(K):K,1:1)
SET DGER=0
SET N=$$ICDDATA^ICDXCODE("DIAG",+Y,$$GETDATE^ICDGTDRG(DA))
IF N<0!'$PIECE(N,U,10)
SET DGER=1
QUIT
+2 IF DGI=1
IF $PIECE(N,U,5)
SET DGER=1
QUIT
+3 IF $PIECE(N,U,11)]""&($PIECE(N,U,11)'=$SELECT($DATA(^DPT(+^DGPT(DA(2),0),0)):$PIECE(^(0),U,2),1:"M"))
if K<24
DO MSG($PIECE(N,U,2)_" can only be used with "_$SELECT($PIECE(N,U,11)="F":"FEMALES",1:"MALES"))
SET K=K+1
SET DGER=1
QUIT
+4 SET %=$SELECT($DATA(^DGPT(DA(2),"C",DA(1),"CPT",DA,0)):^(0),1:"")
SET %=U_$PIECE(%,U,4,7)_U
SET $PIECE(%,U,DGI+1)=U
IF %[(U_+Y_U)
SET DGER=1
QUIT
+5 DO NOT(+Y,%)
+6 if DGER
QUIT
+7 DO REQ(DA(2),+Y,%)
+8 QUIT
EN5 ; DG*5.3*850
+1 ; called from the diagnosis input transforms in file 46
+2 NEW EFFDATE,DGTEMP,IMPDATE
+3 IF $GET(PTF)
DO EFFDATE^DGPTIC10($GET(PTF))
+4 SET K=$SELECT($DATA(K):K,1:1)
SET DGER=0
SET DGPTTMP=$$ICDDATA^ICDXCODE("DIAG",+Y,EFFDATE)
+5 IF +DGPTTMP<0!('$PIECE(DGPTTMP,U,10))
DO MSG("Must be an active code.")
SET DGER=1
QUIT
+6 ;
+7 IF $PIECE(DGPTTMP,U,11)]""&($PIECE(DGPTTMP,U,11)'=$SELECT($DATA(^DPT(+^DGPT(PTF,0),0)):$PIECE(^(0),U,2),1:"M"))
Begin DoDot:1
+8 if K<24
DO MSG($PIECE(DGPTTMP,U,2)_" can only be used with "_$SELECT($PIECE(DGPTTMP,U,11)="F":"FEMALES",1:"MALES"))
SET K=K+1
SET DGER=1
QUIT
End DoDot:1
+9 ;
+10 SET K=^DGCPT(46,DA,0)
IF $PIECE(K,U,4,7)_U_$PIECE(K,U,15,18)[Y
DO MSG("Cannot enter the same code twice.")
SET DGER=1
QUIT
+11 QUIT
EN6 ; -- called from file 46; .01 field
+1 ;DG*5.3*912 code being changed to accomodate patch ICPT*46 code enforcement
+2 ;I $P($G(^(0)),U,2)?.N S DGER=1 Q
+3 ;using a naked reference as this line of code calls an input transform, which requires a naked reference
+4 IF '$DATA(^(61,"B"))
SET DGER=1
QUIT
+5 SET DGER=0
SET N=$$CPT^ICPTCOD(+Y,$$GETDATE^ICDGTDRG($GET(DA)))
IF N<0!'$PIECE(N,"^",7)
SET DGER=1
QUIT
+6 SET L=0
FOR
SET L=$ORDER(^DGCPT(46,L))
if L'>0
QUIT
IF +$GET(^(L,1))=$GET(DGPRD)
IF $PIECE(^(1),U,3)=$GET(PTF)
IF +^(0)=Y
IF '$GET(^(9))
SET DGER=1
QUIT
+7 KILL L
QUIT
+8 QUIT
+9 ;
REQ(DX,STRING) ; - is another ICD code required with this code
+1 ; -- input DX - code being entered
+2 ; STRING - string of code iens already entered for movement ("^123^456^789^")
+3 ; -- output - writes message if another code is required
+4 ;
+5 NEW I,IEN,DGI,DZ
+6 KILL ^TMP("DGPTF-R",$JOB)
+7 if $GET(DX)<1
QUIT
+8 if '$$REQ^ICDEX(DX,"DGPTF-R",1)
QUIT
+9 ;
+10 SET DGI=1
SET DZ=""
FOR I=0:0
SET DZ=$ORDER(^TMP("DGPTF-R",$JOB,"B",DZ))
if DZ=""
QUIT
Begin DoDot:1
+11 SET IEN=$ORDER(^TMP("DGPTF-R",$JOB,"B",DZ,0))
if IEN<1
QUIT
SET DG1=0
IF STRING[(U_IEN_U)
SET DG1=1
QUIT
End DoDot:1
if DG1=1
QUIT
+12 IF DG1=0
DO MSG($SELECT(+DGPTTMP>0:$PIECE(DGPTTMP,U,2),1:"")_" requires additional code.")
+13 KILL ^TMP("DGPTF-R",$JOB)
+14 QUIT
+15 ;
NOT(DX,STRING) ; - is icd code not to use with existing codes
+1 ; -- input DX - code being entered
+2 ; STRING - string of code iens already entered for movement ("^123^456^789^")
+3 ; -- output DGER :=1 if error
+4 ; writes message if not allowed
+5 ;
+6 NEW I,IEN,DGI,DZ
+7 KILL ^TMP("DGPTF-N",$JOB)
+8 SET DGER=0
+9 if $GET(DX)<1
QUIT
+10 ;
+11 if '$$NOT^ICDEX(DX,"DGPTF-N",1)
QUIT
+12 ;
+13 SET DGI=1
SET DZ=""
FOR I=0:0
SET DZ=$ORDER(^TMP("DGPTF-N",$JOB,"B",DZ))
if DZ=""
QUIT
Begin DoDot:1
+14 SET IEN=$ORDER(^TMP("DGPTF-N",$JOB,"B",DZ,0))
if IEN<1
QUIT
IF STRING[(U_IEN_U)
SET DGER=1
Begin DoDot:2
+15 DO MSG("Cannot use "_$$CODEC^ICDEX(80,DX)_" with "_$$CODEC^ICDEX(80,IEN))
QUIT
End DoDot:2
if DGER
QUIT
End DoDot:1
if DGER
QUIT
+16 KILL ^TMP("DGPTF-N",$JOB)
+17 QUIT
MSG(TEXT) ;
+1 DO EN^DDIOL(TEXT)
+2 QUIT