SCMSVUT2 ;ALB/JLU;Utility routine for AMBCARE;06/28/99
;;5.3;Scheduling;**66,180,254,293,325,466,521,1015**;AUG 13,1993;Build 21
;06/28/99 ACS Added CPT modifier validation
;
COUNT(VALER) ;counts the number of errored encounters found.
;INPUT VALER - The array containing the errors.
;OUTPUT the number of errors
;
N VAR,CNT
S VAR="",CNT=0
F S VAR=$O(@VALER@(VAR)) Q:VAR']"" S CNT=CNT+1
Q CNT
;
IPERR(VALER) ;counts the number of inpatient errored encounters found.
;INPUT VALER - The array containing the errors.
;OUTPUT the number of errors
;
N VAR,CNT
S VAR="",CNT=0
F S VAR=$O(@VALER@(VAR)) Q:VAR']"" D
.I $$INPATENC^SCDXUTL(VAR) S CNT=CNT+1
Q CNT
;
FILEVERR(PTR,VALERR) ;files the errors found for an encounter
;INPUT PTR - The pointer to the entry in the transmission file 409.73
; VALERR - The array holding the errors for the encounter.
;OUTPUT 0 - did not file
; 1 - did file
N SEG,FILE
I '$D(VALERR) Q 0
S SEG="",FILE=-1
F S SEG=$O(@VALERR@(SEG)) Q:SEG']"" D FILE(VALERR,SEG,PTR,.FILE)
Q $S(FILE=1:1,1:0)
;
FILE(VALERR,SEG,PTR,FILE) ;
N NBR
S NBR=0
F S NBR=$O(@VALERR@(SEG,NBR)) Q:'NBR DO
.N CODPTR,CODE
.S CODE=$G(@VALERR@(SEG,NBR))
.I CODE']"" Q
.S CODPTR=$O(^SD(409.76,"B",CODE,""))
.I 'CODPTR Q
.I $D(^SD(409.75,"AER",PTR,CODPTR)) S FILE=1 Q
.S FILE=$$CRTERR^SCDXFU02(PTR,CODE)
.Q
Q
;
VALWL(CLIN) ;WORKLOAD VALIDATION AT CHECK OUT
;INPUT CLIN - IEN OF CLINIC
;OUTPUT 0 - DO NOT VALIDATE WORKLOAD
; 1 - VALIDATE CLINIC WORKLOAD
N A1
I '$D(CLIN) S CLIN=0
S A1=$P($G(^SC(+CLIN,0)),U,30)
Q $S(A1=1:1,1:0)
;
VALIDATE(XMITPTR) ;validates data that has a entry in the transmit file.
;
;INPUT XMITPTR - This is the point to an entry in file 409.73.
;
;OUTPUT -1 - the was a problem with the inputs
; 0 - no errors were found
; 1 - errors were found
;
N VALERR,ERR,HL,HLEID,DFN
S ANS=-1
S XMITPTR=+$G(XMITPTR)
I $G(^SD(409.73,XMITPTR,0))']"" G VALQ
D PATDFN^SCDXUTL2(XMITPTR)
;
S HL7XMIT="^TMP(""HLS"","_$J_")",VALERR="^TMP(""SCDXVALID"","_$J_","_XMITPTR_")"
;Initialze HL7 variables
S HLEID=+$O(^ORD(101,"B","SCDX AMBCARE SEND SERVER FOR ADT-Z00",0))
I ('HLEID) G VALQ
D INIT^HLFNC2(HLEID,.HL)
I ($O(HL(""))="") G VALQ
;
S ERR=$$BUILDHL7^SCDXMSG0(XMITPTR,.HL,1,HL7XMIT,1,VALERR)
;
I ERR<0,$O(@VALERR@(0))']"" D VALIDATE^SCMSVUT0("INTERNAL","","V900",VALERR,0)
S ANS=0
D DELAERR^SCDXFU02(XMITPTR,0)
D DEMUPDT(DFN,VALERR,"DEMO")
I $O(@VALERR@(0))]"" DO
.N FILE
.S ANS=1
.S FILE=$$FILEVERR(XMITPTR,VALERR)
.Q
;
K @VALERR,@HL7XMIT
;
VALQ Q ANS
;
DEMUPDT(DFN,VALERR,TYP) ;
;This entry point updates all the other encoutners for this patient
;that HAVE errors with a new set or demographic errors or deletes all
;the demographic errors if none were found.
;INPUT DFN - The patient's DFN
; VALERR - errors to log
; TYP - The type of errors to delete and log.
; Right now demographic errors are the only kind "DEMO"
;
S DFN=$G(DFN),TYP=$G(TYP),VALERR=$G(VALERR)
I DFN=""!(TYP="")!(VALERR="") Q
N PTRS,RNG,LP,PTR
S RNG=$P($T(@(TYP)),";;",2),PTRS=""
D CLEAN(DFN,RNG,.PTRS)
I '$D(@VALERR@("PID")) Q
I PTRS']"" Q
F LP=1:1 S PTR=$P(PTRS,U,LP) Q:PTR']"" DO
.I '$D(^SD(409.73,PTR,0)) Q
.N FILE
.D FILE(VALERR,"PID",PTR,.FILE)
.Q
Q
;
CLEAN(DFN,RNG,PTRS) ;This subroutine cleans out all errors for a pateint
;and returns a string of which entries in 409.73 were cleaned of errors
;
N LP,COD,LP2,IEN
F LP=1:1 S COD=$P(RNG,U,LP) Q:COD']"" I $D(^SD(409.75,"ACOD",DFN,COD)) S IEN="" F LP2=1:1 S IEN=$O(^SD(409.75,"ACOD",DFN,COD,IEN)) Q:IEN']"" DO
.N VAR,RES
.S VAR=$P($G(^SD(409.75,IEN,0)),U,1)_"^"
.I $P(VAR,U,1)="" S PTR="" Q
.S RES=$$DELERR^SCDXFU02(IEN)
.I PTRS[VAR Q
.S PTRS=PTRS_VAR
.Q
Q
;
MODCODE(DATA,ENCDT) ;
;
;---------------------------------------------------------------
; VALIDATE MODIFIER AND CPT+MODIFIER COMBINATION
;
; INPUT: DATA - The procedure and modifier code to be checked
; format: CPT~modifier
; ENCDT - The date of the encounter
;
;OUTPUT: 1 - valid modifier and CPT+modifier combination
; 0 - invalid modifier or CPT+modifier combination
;
;**NOTE** This call makes the assumption that leading zeros are
; intact in the input.
;---------------------------------------------------------------
;
;- validate modifier only
N DATAMOD
S DATAMOD=$P(DATA,"~",2)
I '$D(DATAMOD) Q 0
I $$MOD^ICPTMOD(DATAMOD,"E",ENCDT,1)'>0 Q 0
;
;- validate CPT+modifier pair
N DATAPROC
S DATAPROC=$P(DATA,"~",1)
I '$D(DATAPROC) Q 0
I $$MODP^ICPTMOD(DATAPROC,DATAMOD,"E",ENCDT,1)'>0 Q 0
Q 1
;
MODMETH(DATA) ;
;
;---------------------------------------------------------------
; VALIDATE MODIFIER CODING METHOD
;
; INPUT: DATA - The modifier coding method to be checked
;
;OUTPUT: 1 - valid modifier coding method
; 0 - invalid modifier coding method
;
; Valid modifier coding methods: C and H
;---------------------------------------------------------------
;
I '$D(DATA) Q 0
S DATA=","_DATA_","
I ",C,H,"'[DATA Q 0
Q 1
;
ETHNIC(DATA) ;
;INPUT DATA - the ethnicity code to be validated (NNNN-C-XXX)
;
N VAL,MTHD
I '$D(DATA) Q 0
I DATA="" Q 1
S VAL=$P(DATA,"-",1,2)
S MTHD=$P(DATA,"-",3)
I VAL'?4N1"-"1N Q 0
I ",SLF,UNK,PRX,OBS,"'[MTHD Q 0
Q 1
CONFDT(DATA,SUB) ;CONFIDENTIAL ADDRESS START/STOP DATE
N X,Y,%DT,DTOUT,STDT,ENDT
I '$D(DATA) Q 0
S STDT=$P(DATA,SUB,1)
S ENDT=$P(DATA,SUB,2)
I STDT="" Q 0
S STDT=$$FMDATE^HLFNC(STDT)
S X=STDT,%DT="X" D ^%DT I Y=-1 Q 0 ;SD/521 added %DT
I ENDT="" Q 1
S ENDT=$$FMDATE^HLFNC(ENDT)
S X=ENDT,%DT="X" D ^%DT I Y=-1 Q 0 ;SD/521 added %DT
I $$FMDIFF^XLFDT(ENDT,STDT,1)<0 Q 0
Q 1
;
CONFCAT(DATA) ;CONFIDENTIAL ADDRESS CATEGORY TYPE
I '$D(DATA) Q 0
I DATA="" Q 0
N VAL,GOOD
S GOOD=0
F VAL="VACAA","VACAC","VACAE","VACAM","VACAO" I DATA=VAL S GOOD=1 Q
Q GOOD
;
CVEDT(DATA) ;Combat vet end date (ZEL.38)
;Input : DATA - CombatVetIndicator ^ CombatVetEndDate
;Output : 1 = Good / 0 = Bad
;
N CVI,CVEDT
S DATA=$G(DATA)
S CVI=$P(DATA,"^",1)
S CVEDT=$P(DATA,"^",2)
I 'CVI Q $S(CVEDT="":1,1:0)
Q CVEDT?8N
;
CLCV(DATA,SDOE) ;Cross check for combat vet classification question
;Input : DATA - Answer to classification question
; SDOE - Pointer to encounter (file # 409.68)
;Output : 1 = Good / 0 = Bad
;
S DATA=$G(DATA)
Q:(DATA'=1) 1
N VET,SDDT,SDOE0
S SDOE=$G(SDOE) Q:'SDOE 0
S SDOE0=$G(^SCE(SDOE,0))
S SDDT=+SDOE0 Q:'SDDT 0
S DFN=+$P(SDOE0,"^",2) Q:'DFN 0
S VET=$P($$EL^SDCO22(DFN,SDOE),"^",5)
I VET'="Y" Q 0
S VET=+$$CVEDT^DGCV(DFN,SDDT)
Q $S(VET=1:1,1:0)
;
DEMO ;;2000^2030^2050^2100^2150^2200^2210^2220^2230^2240^2250^2300^2330^2360
SCMSVUT2 ;ALB/JLU;Utility routine for AMBCARE;06/28/99
+1 ;;5.3;Scheduling;**66,180,254,293,325,466,521,1015**;AUG 13,1993;Build 21
+2 ;06/28/99 ACS Added CPT modifier validation
+3 ;
COUNT(VALER) ;counts the number of errored encounters found.
+1 ;INPUT VALER - The array containing the errors.
+2 ;OUTPUT the number of errors
+3 ;
+4 NEW VAR,CNT
+5 SET VAR=""
SET CNT=0
+6 FOR
SET VAR=$ORDER(@VALER@(VAR))
IF VAR']""
QUIT
SET CNT=CNT+1
+7 QUIT CNT
+8 ;
IPERR(VALER) ;counts the number of inpatient errored encounters found.
+1 ;INPUT VALER - The array containing the errors.
+2 ;OUTPUT the number of errors
+3 ;
+4 NEW VAR,CNT
+5 SET VAR=""
SET CNT=0
+6 FOR
SET VAR=$ORDER(@VALER@(VAR))
IF VAR']""
QUIT
Begin DoDot:1
+7 IF $$INPATENC^SCDXUTL(VAR)
SET CNT=CNT+1
End DoDot:1
+8 QUIT CNT
+9 ;
FILEVERR(PTR,VALERR) ;files the errors found for an encounter
+1 ;INPUT PTR - The pointer to the entry in the transmission file 409.73
+2 ; VALERR - The array holding the errors for the encounter.
+3 ;OUTPUT 0 - did not file
+4 ; 1 - did file
+5 NEW SEG,FILE
+6 IF '$DATA(VALERR)
QUIT 0
+7 SET SEG=""
SET FILE=-1
+8 FOR
SET SEG=$ORDER(@VALERR@(SEG))
IF SEG']""
QUIT
DO FILE(VALERR,SEG,PTR,.FILE)
+9 QUIT $SELECT(FILE=1:1,1:0)
+10 ;
FILE(VALERR,SEG,PTR,FILE) ;
+1 NEW NBR
+2 SET NBR=0
+3 FOR
SET NBR=$ORDER(@VALERR@(SEG,NBR))
IF 'NBR
QUIT
Begin DoDot:1
+4 NEW CODPTR,CODE
+5 SET CODE=$GET(@VALERR@(SEG,NBR))
+6 IF CODE']""
QUIT
+7 SET CODPTR=$ORDER(^SD(409.76,"B",CODE,""))
+8 IF 'CODPTR
QUIT
+9 IF $DATA(^SD(409.75,"AER",PTR,CODPTR))
SET FILE=1
QUIT
+10 SET FILE=$$CRTERR^SCDXFU02(PTR,CODE)
+11 QUIT
End DoDot:1
+12 QUIT
+13 ;
VALWL(CLIN) ;WORKLOAD VALIDATION AT CHECK OUT
+1 ;INPUT CLIN - IEN OF CLINIC
+2 ;OUTPUT 0 - DO NOT VALIDATE WORKLOAD
+3 ; 1 - VALIDATE CLINIC WORKLOAD
+4 NEW A1
+5 IF '$DATA(CLIN)
SET CLIN=0
+6 SET A1=$PIECE($GET(^SC(+CLIN,0)),U,30)
+7 QUIT $SELECT(A1=1:1,1:0)
+8 ;
VALIDATE(XMITPTR) ;validates data that has a entry in the transmit file.
+1 ;
+2 ;INPUT XMITPTR - This is the point to an entry in file 409.73.
+3 ;
+4 ;OUTPUT -1 - the was a problem with the inputs
+5 ; 0 - no errors were found
+6 ; 1 - errors were found
+7 ;
+8 NEW VALERR,ERR,HL,HLEID,DFN
+9 SET ANS=-1
+10 SET XMITPTR=+$GET(XMITPTR)
+11 IF $GET(^SD(409.73,XMITPTR,0))']""
GOTO VALQ
+12 DO PATDFN^SCDXUTL2(XMITPTR)
+13 ;
+14 SET HL7XMIT="^TMP(""HLS"","_$JOB_")"
SET VALERR="^TMP(""SCDXVALID"","_$JOB_","_XMITPTR_")"
+15 ;Initialze HL7 variables
+16 SET HLEID=+$ORDER(^ORD(101,"B","SCDX AMBCARE SEND SERVER FOR ADT-Z00",0))
+17 IF ('HLEID)
GOTO VALQ
+18 DO INIT^HLFNC2(HLEID,.HL)
+19 IF ($ORDER(HL(""))="")
GOTO VALQ
+20 ;
+21 SET ERR=$$BUILDHL7^SCDXMSG0(XMITPTR,.HL,1,HL7XMIT,1,VALERR)
+22 ;
+23 IF ERR<0
IF $ORDER(@VALERR@(0))']""
DO VALIDATE^SCMSVUT0("INTERNAL","","V900",VALERR,0)
+24 SET ANS=0
+25 DO DELAERR^SCDXFU02(XMITPTR,0)
+26 DO DEMUPDT(DFN,VALERR,"DEMO")
+27 IF $ORDER(@VALERR@(0))]""
Begin DoDot:1
+28 NEW FILE
+29 SET ANS=1
+30 SET FILE=$$FILEVERR(XMITPTR,VALERR)
+31 QUIT
End DoDot:1
+32 ;
+33 KILL @VALERR,@HL7XMIT
+34 ;
VALQ QUIT ANS
+1 ;
DEMUPDT(DFN,VALERR,TYP) ;
+1 ;This entry point updates all the other encoutners for this patient
+2 ;that HAVE errors with a new set or demographic errors or deletes all
+3 ;the demographic errors if none were found.
+4 ;INPUT DFN - The patient's DFN
+5 ; VALERR - errors to log
+6 ; TYP - The type of errors to delete and log.
+7 ; Right now demographic errors are the only kind "DEMO"
+8 ;
+9 SET DFN=$GET(DFN)
SET TYP=$GET(TYP)
SET VALERR=$GET(VALERR)
+10 IF DFN=""!(TYP="")!(VALERR="")
QUIT
+11 NEW PTRS,RNG,LP,PTR
+12 SET RNG=$PIECE($TEXT(@(TYP)),";;",2)
SET PTRS=""
+13 DO CLEAN(DFN,RNG,.PTRS)
+14 IF '$DATA(@VALERR@("PID"))
QUIT
+15 IF PTRS']""
QUIT
+16 FOR LP=1:1
SET PTR=$PIECE(PTRS,U,LP)
IF PTR']""
QUIT
Begin DoDot:1
+17 IF '$DATA(^SD(409.73,PTR,0))
QUIT
+18 NEW FILE
+19 DO FILE(VALERR,"PID",PTR,.FILE)
+20 QUIT
End DoDot:1
+21 QUIT
+22 ;
CLEAN(DFN,RNG,PTRS) ;This subroutine cleans out all errors for a pateint
+1 ;and returns a string of which entries in 409.73 were cleaned of errors
+2 ;
+3 NEW LP,COD,LP2,IEN
+4 FOR LP=1:1
SET COD=$PIECE(RNG,U,LP)
IF COD']""
QUIT
IF $DATA(^SD(409.75,"ACOD",DFN,COD))
SET IEN=""
FOR LP2=1:1
SET IEN=$ORDER(^SD(409.75,"ACOD",DFN,COD,IEN))
IF IEN']""
QUIT
Begin DoDot:1
+5 NEW VAR,RES
+6 SET VAR=$PIECE($GET(^SD(409.75,IEN,0)),U,1)_"^"
+7 IF $PIECE(VAR,U,1)=""
SET PTR=""
QUIT
+8 SET RES=$$DELERR^SCDXFU02(IEN)
+9 IF PTRS[VAR
QUIT
+10 SET PTRS=PTRS_VAR
+11 QUIT
End DoDot:1
+12 QUIT
+13 ;
MODCODE(DATA,ENCDT) ;
+1 ;
+2 ;---------------------------------------------------------------
+3 ; VALIDATE MODIFIER AND CPT+MODIFIER COMBINATION
+4 ;
+5 ; INPUT: DATA - The procedure and modifier code to be checked
+6 ; format: CPT~modifier
+7 ; ENCDT - The date of the encounter
+8 ;
+9 ;OUTPUT: 1 - valid modifier and CPT+modifier combination
+10 ; 0 - invalid modifier or CPT+modifier combination
+11 ;
+12 ;**NOTE** This call makes the assumption that leading zeros are
+13 ; intact in the input.
+14 ;---------------------------------------------------------------
+15 ;
+16 ;- validate modifier only
+17 NEW DATAMOD
+18 SET DATAMOD=$PIECE(DATA,"~",2)
+19 IF '$DATA(DATAMOD)
QUIT 0
+20 IF $$MOD^ICPTMOD(DATAMOD,"E",ENCDT,1)'>0
QUIT 0
+21 ;
+22 ;- validate CPT+modifier pair
+23 NEW DATAPROC
+24 SET DATAPROC=$PIECE(DATA,"~",1)
+25 IF '$DATA(DATAPROC)
QUIT 0
+26 IF $$MODP^ICPTMOD(DATAPROC,DATAMOD,"E",ENCDT,1)'>0
QUIT 0
+27 QUIT 1
+28 ;
MODMETH(DATA) ;
+1 ;
+2 ;---------------------------------------------------------------
+3 ; VALIDATE MODIFIER CODING METHOD
+4 ;
+5 ; INPUT: DATA - The modifier coding method to be checked
+6 ;
+7 ;OUTPUT: 1 - valid modifier coding method
+8 ; 0 - invalid modifier coding method
+9 ;
+10 ; Valid modifier coding methods: C and H
+11 ;---------------------------------------------------------------
+12 ;
+13 IF '$DATA(DATA)
QUIT 0
+14 SET DATA=","_DATA_","
+15 IF ",C,H,"'[DATA
QUIT 0
+16 QUIT 1
+17 ;
ETHNIC(DATA) ;
+1 ;INPUT DATA - the ethnicity code to be validated (NNNN-C-XXX)
+2 ;
+3 NEW VAL,MTHD
+4 IF '$DATA(DATA)
QUIT 0
+5 IF DATA=""
QUIT 1
+6 SET VAL=$PIECE(DATA,"-",1,2)
+7 SET MTHD=$PIECE(DATA,"-",3)
+8 IF VAL'?4N1"-"1N
QUIT 0
+9 IF ",SLF,UNK,PRX,OBS,"'[MTHD
QUIT 0
+10 QUIT 1
CONFDT(DATA,SUB) ;CONFIDENTIAL ADDRESS START/STOP DATE
+1 NEW X,Y,%DT,DTOUT,STDT,ENDT
+2 IF '$DATA(DATA)
QUIT 0
+3 SET STDT=$PIECE(DATA,SUB,1)
+4 SET ENDT=$PIECE(DATA,SUB,2)
+5 IF STDT=""
QUIT 0
+6 SET STDT=$$FMDATE^HLFNC(STDT)
+7 ;SD/521 added %DT
SET X=STDT
SET %DT="X"
DO ^%DT
IF Y=-1
QUIT 0
+8 IF ENDT=""
QUIT 1
+9 SET ENDT=$$FMDATE^HLFNC(ENDT)
+10 ;SD/521 added %DT
SET X=ENDT
SET %DT="X"
DO ^%DT
IF Y=-1
QUIT 0
+11 IF $$FMDIFF^XLFDT(ENDT,STDT,1)<0
QUIT 0
+12 QUIT 1
+13 ;
CONFCAT(DATA) ;CONFIDENTIAL ADDRESS CATEGORY TYPE
+1 IF '$DATA(DATA)
QUIT 0
+2 IF DATA=""
QUIT 0
+3 NEW VAL,GOOD
+4 SET GOOD=0
+5 FOR VAL="VACAA","VACAC","VACAE","VACAM","VACAO"
IF DATA=VAL
SET GOOD=1
QUIT
+6 QUIT GOOD
+7 ;
CVEDT(DATA) ;Combat vet end date (ZEL.38)
+1 ;Input : DATA - CombatVetIndicator ^ CombatVetEndDate
+2 ;Output : 1 = Good / 0 = Bad
+3 ;
+4 NEW CVI,CVEDT
+5 SET DATA=$GET(DATA)
+6 SET CVI=$PIECE(DATA,"^",1)
+7 SET CVEDT=$PIECE(DATA,"^",2)
+8 IF 'CVI
QUIT $SELECT(CVEDT="":1,1:0)
+9 QUIT CVEDT?8N
+10 ;
CLCV(DATA,SDOE) ;Cross check for combat vet classification question
+1 ;Input : DATA - Answer to classification question
+2 ; SDOE - Pointer to encounter (file # 409.68)
+3 ;Output : 1 = Good / 0 = Bad
+4 ;
+5 SET DATA=$GET(DATA)
+6 IF (DATA'=1)
QUIT 1
+7 NEW VET,SDDT,SDOE0
+8 SET SDOE=$GET(SDOE)
IF 'SDOE
QUIT 0
+9 SET SDOE0=$GET(^SCE(SDOE,0))
+10 SET SDDT=+SDOE0
IF 'SDDT
QUIT 0
+11 SET DFN=+$PIECE(SDOE0,"^",2)
IF 'DFN
QUIT 0
+12 SET VET=$PIECE($$EL^SDCO22(DFN,SDOE),"^",5)
+13 IF VET'="Y"
QUIT 0
+14 SET VET=+$$CVEDT^DGCV(DFN,SDDT)
+15 QUIT $SELECT(VET=1:1,1:0)
+16 ;
DEMO ;;2000^2030^2050^2100^2150^2200^2210^2220^2230^2240^2250^2300^2330^2360