EHM13UTIL ; ALB/WTC - EHM*1*13 utilities ; Jun 05, 2025@14:49:13
;;1.0;ELECTRONIC HEALTH MODERNIZATION;**13**;Apr 19, 2021;Build 27
;
;
Q ;
;
ENCTRSTS(IEN) ;
;
; Returns status of encounter or its parent.
;
; IEN = Encounter (pointer to #409.68)
;
N STATUS ;
I '$D(^SCE(IEN,0)) Q "" ; Bad data
I $P(^SCE(IEN,0),U,6)'="" S IEN=$P(^SCE(IEN,0),U,6) ; Not a parent encounter. Return status from its parent.
;
S STATUS=$$GET1^DIQ(409.68,IEN,.12) ;
;I STATUS="ACTION REQUIRED",$$MPTYNCTR(IEN)=1 Q "" ; Empty ACTION REQUIRED encounter.
Q STATUS ;
;
MPTYNCTR(IEN) ;
;
; Returns 1 if encounter is "empty". 0 if not. "Empty" means no diagnosis, service/procedure, provider, immunization, health factor or associated TIU document.
;
; IEN= Encounter (pointer to #409.68)
;
N VISIT,TIUDOC,RESULT ;
;
I $G(^SCE(IEN,0))="" Q 1 ; Bad data.
I $P(^SCE(IEN,0),U,6)'="" S IEN=$P(^SCE(IEN,0),U,6) ; Not a parent encounter. Return status from its parent.
;
S VISIT=$P(^SCE(IEN,0),U,5) I 'VISIT Q 1 ; No visit.
;
I $D(^AUPNVPRV("AD",VISIT)) Q 0 ; Visit has provider.
I $D(^AUPNVPOV("AD",VISIT)) Q 0 ; Visit has diagnosis.
I $D(^AUPNVCPT("AD",VISIT)) Q 0 ; Visit has service/procedure.
I $D(^AUPNVIMM("AD",VISIT)) Q 0 ; Visit has immunization.
I $D(^AUPNVHF("AD",VISIT)) Q 0 ; Visit has health factor.
I $D(^TIU(8925,"AVSIT",VISIT)) D Q RESULT ; Visit has TIU document.
. ;
. ; Scan TIU documents. If any of them are not RETRACTED, then encounter is not empty.
. ;
. S RESULT=1,TIUDOC=0 F S TIUDOC=$O(^TIU(8925,"AVSIT",VISIT,TIUDOC)) Q:'TIUDOC I $$GET1^DIQ(8925,TIUDOC,.05)'="RETRACTED" S RESULT=0 Q ;
;
Q 1 ;
;
ADDAPPT(SCIEN,APPTDTTM,DFN,IEN2) ;
;
; Add appointment to file #409.84
;
N SDECIEN,FDA,DURATION,RESRCIEN,IENS ;
;
S DURATION=$P(^SC(SCIEN,"S",APPTDTTM,1,IEN2,0),U,2) ;
S RESRCIEN=$O(^SDEC(409.831,"ALOC",SCIEN,0)) ;
;
S SDECIEN="+1," ;
S FDA(409.84,SDECIEN,.01)=APPTDTTM ;
S FDA(409.84,SDECIEN,.02)=$$FMADD^XLFDT(APPTDTTM,,,DURATION) ;
S FDA(409.84,SDECIEN,.05)=DFN ;
S FDA(409.84,SDECIEN,.07)=RESRCIEN ;
S FDA(409.84,SDECIEN,.08)=$P(^SC(SCIEN,"S",APPTDTTM,1,IEN2,0),U,6) ;
S FDA(409.84,SDECIEN,.09)=$P(^SC(SCIEN,"S",APPTDTTM,1,IEN2,0),U,7) ;
S FDA(409.84,SDECIEN,.18)=DURATION ;
D UPDATE^DIE("","FDA","IENS") ;
S SDECIEN=+$G(IENS(1)) I SDECIEN<1 S SDECIEN="0^Add appointment failed" ;
Q SDECIEN ;
;
LASTFI(DFN,NAME) ;
;
; DFN = Patient (pointer to #2) [OPTIONAL]
; NAME = Name in 'last,first' format
;
; Return last name and first initial of a patient (if DFN passed in) or other name (if DFN absent).
;
N LASTFI ;
S LASTFI="" ;
I $G(DFN) S NAME=$P(^DPT(DFN,0),U,1) ;
Q:$G(NAME)="" "" ;
;
S LASTFI=$P(NAME,",",1)_","_$E($P(NAME,",",2),1) ;
Q LASTFI ;
;
FMTDTTM(DATETIME) ;
;
; Return formatted date/time (MM/DD/YY@HHMM)
;
N MM,DD,YY,FMTDTTM ;
;
S FMTDTTM=$$FMTE^XLFDT(DATETIME,2),MM=$P($P(FMTDTTM,"@",1),"/",1),DD=$P($P(FMTDTTM,"@",1),"/",2),YY=$P($P(FMTDTTM,"@",1),"/",3) ;
S:$L(MM)<2 MM="0"_MM S:$L(DD)<2 DD="0"_DD S:$L(YY)<2 YY="0"_YY ;
S FMTDTTM=MM_"/"_DD_"/"_YY_"@"_$P($P(FMTDTTM,"@",2),":",1,2) ;
Q FMTDTTM ;
;
PROGRESS(DONE,TOTAL) ;
;
; Display progress going through file.
;
I $G(TOTAL) W *13 S $X=0 W $J(DONE/TOTAL*100\1,8),"% of ",TOTAL Q ;
W *13 S $X=0 W $FN(DONE,",") Q ;
;
COMMAOUT(NUMITEMS,S1,S2,S3,S4,S5,S6,S7,S8,S9,S10) ;
;
; NUMITEMS = Number of items to include in the output string.
; S1,S2,...S10 = Up to 10 values to include in the output string.
;
; Output comma-delimited string of values.
;
N COMMAOUT,I,X ;
S COMMAOUT="" F I=1:1:NUMITEMS S @("X=S"_I),COMMAOUT=COMMAOUT_$C(34)_X_$C(34)_$S(I<NUMITEMS:",",1:"") ;
Q COMMAOUT ;
;
CENTER(TEXT,WIDTH) ;
;
; Return centered text.
;
N CENTERED ;
S CENTERED=$J("",WIDTH-$L(TEXT)/2)_TEXT ;
Q CENTERED ;
;
DASHES(COUNT) ;
;
N I,DASHES S DASHES="" F I=1:1:COUNT S DASHES=DASHES_"-" ;
Q DASHES ;
;
CONTINUE() ;
;
; Prompt user to continue or quit.
;
N DIR,Y,DIRUT ;
S DIR(0)="Y",DIR("A")="Continue",DIR("B")="YES" D ^DIR ;
I $D(DIRUT) Q 0 ;
Q Y ;
;
STRIP(X) ;
;
; Strip off leading spaces.
;
Q:$E(X,1)'=" " X ;
S X=$E(X,2,$L(X)) Q $$STRIP(X) ;
;
COMMAOUT2(ARY) ;
;
; ARY = Array of values to include in the output string.
;
; Output comma-delimited string of values.
;
N COMMAOUT,I,X ;
S COMMAOUT="",I="" F S I=$O(ARY(I)) Q:I="" S X=ARY(I),COMMAOUT=COMMAOUT_$C(34)_X_$C(34)_"," ;
Q $E(COMMAOUT,1,$L(COMMAOUT)-1) ;
;
CONVDATE() ;
;
; Enter conversion date
;
N DIR,DIRUT,X,Y ;
;
S DIR(0)="D^::EX",DIR("A")="Conversion Date" D ^DIR Q:$D(DIRUT) "" ;
Q Y ;
;
SORTORDR() ;
;
; Sort Order
;
N DIR,X,Y,DIRUT ;
;
S DIR(0)="S^1:Appointment Date/Time, Patient, Clinic;2:Clinic, Appointment Date/Time, Patient;3:Patient, Appointment Date/Time, Clinic",DIR("A")="Sort Order",DIR("B")=1 D ^DIR Q:Y="" "" Q:$D(DIRUT) "" ;
Q Y ;
;
FILTER() ;
;
; Encounter filter
;
N DIR,X,Y,DIRUT ;
;
S DIR(0)="SO^1:All;2:With Encounters;3:Without Encounters;4:Without ACTION REQUIRED Encounters",DIR("A")="Appointment Filter",DIR("B")="ALL" D ^DIR Q:$D(DIRUT) "" ;
Q Y ;
;
CLINICS(CLINICS) ;
;
; Clinics to include or exclude. Returns A=All, X=All except selected clinics, S=Selected clinics. CLINICS array returned for X and S.
;
N DIR,X,Y,DIRUT,CLINFLTR,DIC ;
;
S DIR(0)="SO^A:All;X:Excluding selected clinics;S:Selected clinics",DIR("A")="Clinics",DIR("B")="All" D ^DIR Q:$D(DIRUT) "" S CLINFLTR=Y ;
;
I CLINFLTR="A" Q CLINFLTR ;
;
; Select clinics to include/exclude
;
F K DIC S DIC=44,DIC(0)="AEQM",DIC("A")="Clinic to "_$S(CLINFLTR="X":"exclude",1:"include")_": " D ^DIC Q:$D(DIRUT) Q:Y=-1 S CLINICS(+Y)=$S(CLINFLTR="X":"EXCLUDE",1:"INCLUDE") ;
;
Q CLINFLTR ;
;
NONCOUNT() ;
;
; Include/exclude non-count clinics.
;
N DIR,X,Y,DIRUT ;
;
S DIR(0)="SO^I:Include;E:Exclude",DIR("A")="Non-count Clinics",DIR("B")="I" D ^DIR Q:$D(DIRUT) "" ;
Q Y ;
;
RPTFMT() ;
;
; Output format
;
N DIR,X,Y,DIRUT ;
;
S DIR(0)="SO^F:Formatted Report;C:Comma-Delimited",DIR("A")="Output Format",DIR("B")="Formatted Report" D ^DIR Q:$D(DIRUT) "" ;
Q Y ;
;
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HEHM13UTIL 6318 printed Apr 22, 2026@13:48:15 Page 2
EHM13UTIL ; ALB/WTC - EHM*1*13 utilities ; Jun 05, 2025@14:49:13
+1 ;;1.0;ELECTRONIC HEALTH MODERNIZATION;**13**;Apr 19, 2021;Build 27
+2 ;
+3 ;
+4 ;
QUIT
+5 ;
ENCTRSTS(IEN) ;
+1 ;
+2 ; Returns status of encounter or its parent.
+3 ;
+4 ; IEN = Encounter (pointer to #409.68)
+5 ;
+6 ;
NEW STATUS
+7 ; Bad data
IF '$DATA(^SCE(IEN,0))
QUIT ""
+8 ; Not a parent encounter. Return status from its parent.
IF $PIECE(^SCE(IEN,0),U,6)'=""
SET IEN=$PIECE(^SCE(IEN,0),U,6)
+9 ;
+10 ;
SET STATUS=$$GET1^DIQ(409.68,IEN,.12)
+11 ;I STATUS="ACTION REQUIRED",$$MPTYNCTR(IEN)=1 Q "" ; Empty ACTION REQUIRED encounter.
+12 ;
QUIT STATUS
+13 ;
MPTYNCTR(IEN) ;
+1 ;
+2 ; Returns 1 if encounter is "empty". 0 if not. "Empty" means no diagnosis, service/procedure, provider, immunization, health factor or associated TIU document.
+3 ;
+4 ; IEN= Encounter (pointer to #409.68)
+5 ;
+6 ;
NEW VISIT,TIUDOC,RESULT
+7 ;
+8 ; Bad data.
IF $GET(^SCE(IEN,0))=""
QUIT 1
+9 ; Not a parent encounter. Return status from its parent.
IF $PIECE(^SCE(IEN,0),U,6)'=""
SET IEN=$PIECE(^SCE(IEN,0),U,6)
+10 ;
+11 ; No visit.
SET VISIT=$PIECE(^SCE(IEN,0),U,5)
IF 'VISIT
QUIT 1
+12 ;
+13 ; Visit has provider.
IF $DATA(^AUPNVPRV("AD",VISIT))
QUIT 0
+14 ; Visit has diagnosis.
IF $DATA(^AUPNVPOV("AD",VISIT))
QUIT 0
+15 ; Visit has service/procedure.
IF $DATA(^AUPNVCPT("AD",VISIT))
QUIT 0
+16 ; Visit has immunization.
IF $DATA(^AUPNVIMM("AD",VISIT))
QUIT 0
+17 ; Visit has health factor.
IF $DATA(^AUPNVHF("AD",VISIT))
QUIT 0
+18 ; Visit has TIU document.
IF $DATA(^TIU(8925,"AVSIT",VISIT))
Begin DoDot:1
+19 ;
+20 ; Scan TIU documents. If any of them are not RETRACTED, then encounter is not empty.
+21 ;
+22 ;
SET RESULT=1
SET TIUDOC=0
FOR
SET TIUDOC=$ORDER(^TIU(8925,"AVSIT",VISIT,TIUDOC))
if 'TIUDOC
QUIT
IF $$GET1^DIQ(8925,TIUDOC,.05)'="RETRACTED"
SET RESULT=0
QUIT
End DoDot:1
QUIT RESULT
+23 ;
+24 ;
QUIT 1
+25 ;
ADDAPPT(SCIEN,APPTDTTM,DFN,IEN2) ;
+1 ;
+2 ; Add appointment to file #409.84
+3 ;
+4 ;
NEW SDECIEN,FDA,DURATION,RESRCIEN,IENS
+5 ;
+6 ;
SET DURATION=$PIECE(^SC(SCIEN,"S",APPTDTTM,1,IEN2,0),U,2)
+7 ;
SET RESRCIEN=$ORDER(^SDEC(409.831,"ALOC",SCIEN,0))
+8 ;
+9 ;
SET SDECIEN="+1,"
+10 ;
SET FDA(409.84,SDECIEN,.01)=APPTDTTM
+11 ;
SET FDA(409.84,SDECIEN,.02)=$$FMADD^XLFDT(APPTDTTM,,,DURATION)
+12 ;
SET FDA(409.84,SDECIEN,.05)=DFN
+13 ;
SET FDA(409.84,SDECIEN,.07)=RESRCIEN
+14 ;
SET FDA(409.84,SDECIEN,.08)=$PIECE(^SC(SCIEN,"S",APPTDTTM,1,IEN2,0),U,6)
+15 ;
SET FDA(409.84,SDECIEN,.09)=$PIECE(^SC(SCIEN,"S",APPTDTTM,1,IEN2,0),U,7)
+16 ;
SET FDA(409.84,SDECIEN,.18)=DURATION
+17 ;
DO UPDATE^DIE("","FDA","IENS")
+18 ;
SET SDECIEN=+$GET(IENS(1))
IF SDECIEN<1
SET SDECIEN="0^Add appointment failed"
+19 ;
QUIT SDECIEN
+20 ;
LASTFI(DFN,NAME) ;
+1 ;
+2 ; DFN = Patient (pointer to #2) [OPTIONAL]
+3 ; NAME = Name in 'last,first' format
+4 ;
+5 ; Return last name and first initial of a patient (if DFN passed in) or other name (if DFN absent).
+6 ;
+7 ;
NEW LASTFI
+8 ;
SET LASTFI=""
+9 ;
IF $GET(DFN)
SET NAME=$PIECE(^DPT(DFN,0),U,1)
+10 ;
if $GET(NAME)=""
QUIT ""
+11 ;
+12 ;
SET LASTFI=$PIECE(NAME,",",1)_","_$EXTRACT($PIECE(NAME,",",2),1)
+13 ;
QUIT LASTFI
+14 ;
FMTDTTM(DATETIME) ;
+1 ;
+2 ; Return formatted date/time (MM/DD/YY@HHMM)
+3 ;
+4 ;
NEW MM,DD,YY,FMTDTTM
+5 ;
+6 ;
SET FMTDTTM=$$FMTE^XLFDT(DATETIME,2)
SET MM=$PIECE($PIECE(FMTDTTM,"@",1),"/",1)
SET DD=$PIECE($PIECE(FMTDTTM,"@",1),"/",2)
SET YY=$PIECE($PIECE(FMTDTTM,"@",1),"/",3)
+7 ;
if $LENGTH(MM)<2
SET MM="0"_MM
if $LENGTH(DD)<2
SET DD="0"_DD
if $LENGTH(YY)<2
SET YY="0"_YY
+8 ;
SET FMTDTTM=MM_"/"_DD_"/"_YY_"@"_$PIECE($PIECE(FMTDTTM,"@",2),":",1,2)
+9 ;
QUIT FMTDTTM
+10 ;
PROGRESS(DONE,TOTAL) ;
+1 ;
+2 ; Display progress going through file.
+3 ;
+4 ;
IF $GET(TOTAL)
WRITE *13
SET $X=0
WRITE $JUSTIFY(DONE/TOTAL*100\1,8),"% of ",TOTAL
QUIT
+5 ;
WRITE *13
SET $X=0
WRITE $FNUMBER(DONE,",")
QUIT
+6 ;
COMMAOUT(NUMITEMS,S1,S2,S3,S4,S5,S6,S7,S8,S9,S10) ;
+1 ;
+2 ; NUMITEMS = Number of items to include in the output string.
+3 ; S1,S2,...S10 = Up to 10 values to include in the output string.
+4 ;
+5 ; Output comma-delimited string of values.
+6 ;
+7 ;
NEW COMMAOUT,I,X
+8 ;
SET COMMAOUT=""
FOR I=1:1:NUMITEMS
SET @("X=S"_I)
SET COMMAOUT=COMMAOUT_$CHAR(34)_X_$CHAR(34)_$SELECT(I<NUMITEMS:",",1:"")
+9 ;
QUIT COMMAOUT
+10 ;
CENTER(TEXT,WIDTH) ;
+1 ;
+2 ; Return centered text.
+3 ;
+4 ;
NEW CENTERED
+5 ;
SET CENTERED=$JUSTIFY("",WIDTH-$LENGTH(TEXT)/2)_TEXT
+6 ;
QUIT CENTERED
+7 ;
DASHES(COUNT) ;
+1 ;
+2 ;
NEW I,DASHES
SET DASHES=""
FOR I=1:1:COUNT
SET DASHES=DASHES_"-"
+3 ;
QUIT DASHES
+4 ;
CONTINUE() ;
+1 ;
+2 ; Prompt user to continue or quit.
+3 ;
+4 ;
NEW DIR,Y,DIRUT
+5 ;
SET DIR(0)="Y"
SET DIR("A")="Continue"
SET DIR("B")="YES"
DO ^DIR
+6 ;
IF $DATA(DIRUT)
QUIT 0
+7 ;
QUIT Y
+8 ;
STRIP(X) ;
+1 ;
+2 ; Strip off leading spaces.
+3 ;
+4 ;
if $EXTRACT(X,1)'=" "
QUIT X
+5 ;
SET X=$EXTRACT(X,2,$LENGTH(X))
QUIT $$STRIP(X)
+6 ;
COMMAOUT2(ARY) ;
+1 ;
+2 ; ARY = Array of values to include in the output string.
+3 ;
+4 ; Output comma-delimited string of values.
+5 ;
+6 ;
NEW COMMAOUT,I,X
+7 ;
SET COMMAOUT=""
SET I=""
FOR
SET I=$ORDER(ARY(I))
if I=""
QUIT
SET X=ARY(I)
SET COMMAOUT=COMMAOUT_$CHAR(34)_X_$CHAR(34)_","
+8 ;
QUIT $EXTRACT(COMMAOUT,1,$LENGTH(COMMAOUT)-1)
+9 ;
CONVDATE() ;
+1 ;
+2 ; Enter conversion date
+3 ;
+4 ;
NEW DIR,DIRUT,X,Y
+5 ;
+6 ;
SET DIR(0)="D^::EX"
SET DIR("A")="Conversion Date"
DO ^DIR
if $DATA(DIRUT)
QUIT ""
+7 ;
QUIT Y
+8 ;
SORTORDR() ;
+1 ;
+2 ; Sort Order
+3 ;
+4 ;
NEW DIR,X,Y,DIRUT
+5 ;
+6 ;
SET DIR(0)="S^1:Appointment Date/Time, Patient, Clinic;2:Clinic, Appointment Date/Time, Patient;3:Patient, Appointment Date/Time, Clinic"
SET DIR("A")="Sort Order"
SET DIR("B")=1
DO ^DIR
if Y=""
QUIT ""
if $DATA(DIRUT)
QUIT ""
+7 ;
QUIT Y
+8 ;
FILTER() ;
+1 ;
+2 ; Encounter filter
+3 ;
+4 ;
NEW DIR,X,Y,DIRUT
+5 ;
+6 ;
SET DIR(0)="SO^1:All;2:With Encounters;3:Without Encounters;4:Without ACTION REQUIRED Encounters"
SET DIR("A")="Appointment Filter"
SET DIR("B")="ALL"
DO ^DIR
if $DATA(DIRUT)
QUIT ""
+7 ;
QUIT Y
+8 ;
CLINICS(CLINICS) ;
+1 ;
+2 ; Clinics to include or exclude. Returns A=All, X=All except selected clinics, S=Selected clinics. CLINICS array returned for X and S.
+3 ;
+4 ;
NEW DIR,X,Y,DIRUT,CLINFLTR,DIC
+5 ;
+6 ;
SET DIR(0)="SO^A:All;X:Excluding selected clinics;S:Selected clinics"
SET DIR("A")="Clinics"
SET DIR("B")="All"
DO ^DIR
if $DATA(DIRUT)
QUIT ""
SET CLINFLTR=Y
+7 ;
+8 ;
IF CLINFLTR="A"
QUIT CLINFLTR
+9 ;
+10 ; Select clinics to include/exclude
+11 ;
+12 ;
FOR
KILL DIC
SET DIC=44
SET DIC(0)="AEQM"
SET DIC("A")="Clinic to "_$SELECT(CLINFLTR="X":"exclude",1:"include")_": "
DO ^DIC
if $DATA(DIRUT)
QUIT
if Y=-1
QUIT
SET CLINICS(+Y)=$SELECT(CLINFLTR="X":"EXCLUDE",1:"INCLUDE")
+13 ;
+14 ;
QUIT CLINFLTR
+15 ;
NONCOUNT() ;
+1 ;
+2 ; Include/exclude non-count clinics.
+3 ;
+4 ;
NEW DIR,X,Y,DIRUT
+5 ;
+6 ;
SET DIR(0)="SO^I:Include;E:Exclude"
SET DIR("A")="Non-count Clinics"
SET DIR("B")="I"
DO ^DIR
if $DATA(DIRUT)
QUIT ""
+7 ;
QUIT Y
+8 ;
RPTFMT() ;
+1 ;
+2 ; Output format
+3 ;
+4 ;
NEW DIR,X,Y,DIRUT
+5 ;
+6 ;
SET DIR(0)="SO^F:Formatted Report;C:Comma-Delimited"
SET DIR("A")="Output Format"
SET DIR("B")="Formatted Report"
DO ^DIR
if $DATA(DIRUT)
QUIT ""
+7 ;
QUIT Y
+8 ;