IBDF18C ;ALB/CJM/AAS - ENCOUNTER FORM - form ID utilities ;04-OCT-94
;;3.0;AUTOMATED INFO COLLECTION SYS;**5,9**;APR 24, 1997
;
FID(DFN,APPT,SOURCE,FORMTYPE,CLIN) ; -- Form ID Tracking
; -- create record in the ENCOUNTER FORM TRACKING file
; and returned a unique FORM ID
; -- Input DFN = patient internal entry number
; APPT = appointment date time (fm format)
; SOURCE = the source of the form, ie
; IB = 1
; Pandas = 2
; Telefr = 3
; FORMTYPE = the package form definition ID - may have been exterally assigned
; CLIN = pointer to 44 (optional)
;
; -- Output Returns = internal form id^external form id
;
N I,J,X,Y,ID,EXID,CLN,INTERNAL,NODE,FORMID,DIC,DIE,DA,DR,DINUM,DLAYGO
S ID=-1,EXID=""
;
I '$G(DFN)!('$G(APPT))!('$G(SOURCE)) G FIDQ
;
; -- FORMTYPE may="", but should always be >0 for scannable forms
S FORMTYPE=+$G(FORMTYPE)
S FORMID("APPT")=APPT,FORMID("SOURCE")=1
;
; -- determine if the FORMTYPE was exterally assigned
S INTERNAL=$D(^IBD(357.95,"C",SOURCE,FORMTYPE))
;
;
S ID=$$FINDID(DFN,APPT,FORMTYPE) I ID S EXID=ID_"^"_$P($G(^IBD(357.96,ID,0)),"^",9) G FIDQ
K DIC,DO,D0,DD,DA,DINUM
S DIC="^IBD(357.96,",X=ID,DIC(0)="L",DLAYGO=357.96,DINUM=ID
;
L +^IBD(357.97,1,.02):3
S ID=+$P($G(^IBD(357.97,1,0)),"^",2)
F ID=ID+1:1 L:$D(^IBD(357.96,(ID-1))) -^IBD(357.96,(ID-1)) I ID>0,'$D(^IBD(357.96,ID)) L +^IBD(357.96,ID):1 I $T,'$D(^IBD(357.96,ID)) S (X,DINUM)=ID D FILE^DICN I +Y>0 L -^IBD(357.96,ID) Q
S $P(^IBD(357.97,1,0),"^",2)=ID
L -^IBD(357.97,1,.02)
;
S ID=$S(+Y<1:"",1:+Y) I ID="" D LOGERR^IBDF18E2(3579600,.FORMID) G FIDQ
D:ID
.S EXID=$$EXID(ID)
.S DIE="^IBD(357.96,",DA=ID
.S DR="[IBD CREATE FORM TRACKING]"
.L +^IBD(357.96,ID):5 D ^DIE L -^IBD(357.96,ID)
.K DIC,DIE,DA,DR,DINUM,DLAYGO,%,%H,%I
.;
.;D NOW^%DTC N IBPRDT S IBPRDT=% ;Not needed with template, delete
.;S DR=".02////^S X=DFN;.03////^S X=APPT;.04////^S X=$S(INTERNAL:FORMTYPE,1:"""");.05////^S X=IBPRDT;.07////^S X=SOURCE;.08////^S X=$S('INTERNAL:FORMTYPE,1:"""");.09////^S X=EXID;.1////^S X=$G(CLIN);.11////1"
.;I $G(^DPT(DFN,"S",APPT,0))="" S DR=DR_";.14////1"
FIDQ Q ID_"^"_EXID
;
EXID(ID) ; -- converts external id format to internal id format
; -- we need to decide on external id format
Q $G(ID)
;
INID(ID) ; -- find internal id number from external format
; -- Input ID = form id in external format
; Output = form id in internal format or NULL if nonexistant
;
N EXID
S EXID=$O(^IBD(357.96,"AEXT",ID,0))
INIDQ Q $G(EXID)
;
FSCND(ID,STAT,ERR) ; -- update form tracking file that
; -- Input ID = entry to flag as scanned (internal format)
; STAT = NEW status, 1=printed, 2=scanned,3=sent to pce okay,
; 4=pce returned err
; 11=pending pages, 12=input data error
; ERR = pce error message (required only if stat=4)
;
; -- Output = 1 if successful, 0 if not
;
N IBI,SUCCESS,I,J,X,Y,DA,DR,DIC,DIE
S SUCCESS=0
I '$G(ID) G FSCNDQ
I $G(STAT)=4,$G(ERR)="" G FSCNDQ
;
; -- three lines below use template, new for t6, uncommend and delete
; remaining lines
S DIE="^IBD(357.96,",DA=ID,DR="[IBD EDIT FORM TRACKING STATUS]"
D ^DIE
S SUCCESS=1
;
;S IBI=$G(^IBD(357.96,+ID,0)) I IBI="" G FSCND
;I $P(IBI,"^",6)="" S DIE="^IBD(357.96,",DA=ID,DR=".06///NOW;.11////^S X=$S($G(STAT):STAT,1:2);.12////^S X=$G(ERR)" D ^DIE S SUCCESS=1 G FSCNDQ
;S DIE="^IBD(357.96,",DA=+ID,DR=".11////^S X=$G(STAT);.12////^S X=$G(ERR)" D ^DIE S SUCCESS=1
;
FSCNDQ Q SUCCESS
;
FIDST(ID) ; -- form id status
; -- Input ID = form id (internal entry number)
;
; -- Output STATUS = -1 if id does not exist
; = 1 if id exists but not scanned (printed)
; = 2 if already scanned in
; = 3 if sent to pce okay
; = 4 if sent to pce with error....
;
N STATUS,I,J,X,Y
S STATUS=-1
I '$G(ID) G FIDSTQ
S X=$G(^IBD(357.96,ID,0)) I X="" G FIDSTQ
S STATUS=$S($P(X,"^",6)="":1,1:2)
S:$P(X,"^",11)>2 STATUS=$P(X,"^",11)
FIDSTQ Q STATUS
;
FINDID(DFN,APPT,FORM,DUP) ; -- Find a form id for a patient and appointment
; -- input DFN = patient
; APPT = appointment date time
; FORM = (Optional) type of form, pointer to 357.95 or field 10
; DUP = (Optional) if true, No duplicates of same form (357)
; returns last printing of same form with different
; form definitions, will also exclude nonscannable form
;
; -- output = form id1^form id2^form id3^form idn...
; = where form ids are successive form ids (in internal
; format) for same appointment
;
N ID,I,J,X,ORIGIN,OLDDATE,NEWDATE
S ID=""
I '$G(DFN)!('$G(APPT)) G FINDIDQ
K ^TMP($J,"IBD-FINDID")
S CLN=+$G(^DPT(DFN,"S",APPT,0)) ;get clinic if appointment
;
I '$G(DUP) S X=0 F S X=$O(^IBD(357.96,"APTAP",DFN,APPT,X)) Q:'X D
.I CLN,CLN'=$P($G(^IBD(357.96,X,0)),"^",10) Q ;form for canceled appt.
.I '$G(FORM) S ID=ID_X_"^" Q
.I $G(FORM) S I=$G(^IBD(357.96,X,0)) I $P(I,"^",4)=FORM!($P(I,"^",8)=FORM) S ID=X Q
;
I $G(DUP) S X=0 F S X=$O(^IBD(357.96,"APTAP",DFN,APPT,X)) Q:'X D
.I +$P($G(^IBE(357,+$P($G(^IBD(357.95,+$P($G(^IBD(357.96,X,0)),"^",4),0)),"^",21),0)),"^",12)<1 Q
.I CLN,CLN'=$P($G(^IBD(357.96,X,0)),"^",10) Q ;form for canceled appt.
.S ORIGIN=$P($G(^IBD(357.95,+$P($G(^IBD(357.96,X,0)),"^",4),0)),"^",21) Q:'ORIGIN
.I '$G(FORM) D
..I '$D(^TMP($J,"IBD-FINDID",ORIGIN)) S ^TMP($J,"IBD-FINDID",ORIGIN)=X Q
..S OLDDATE=$P($G(^IBD(357.96,+$G(^TMP("IBD-FINDID",ORIGIN)),0)),"^",5)
..S NEWDATE=$P($G(^IBD(357.96,X,0)),"^",5)
..I NEWDATE'<OLDDATE S ^TMP($J,"IBD-FINDID",ORIGIN)=X
.I $G(FORM) S I=$G(^IBD(357.96,X,0)) I $P(I,"^",4)=FORM!($P(I,"^",8)=FORM) S ID=X Q
I $G(DUP),'$G(FORM) S ORIGIN=0 F S ORIGIN=$O(^TMP($J,"IBD-FINDID",ORIGIN)) Q:'ORIGIN S ID=ID_^TMP($J,"IBD-FINDID",ORIGIN)_"^"
;
FINDIDQ K ^TMP($J,"IBD-FINDID")
Q ID
;
FINDPT(FORMID) ;
; -- find patient from form id
; -- Output :Patient Name ^ PID ^ clinic Name ^ appt date/time (external)
; ^form ID ^ form status ^ DFN ^ clinic ien ^ appt date/time (fm format)
;
N I,J,X,Y,DFN,IBNODE,IBXX,VA,VADM,VAERR,STATNM,FORM,FORMNM
S IBXX="Unable to identify Form^^^"
I +$G(FORMID)<1 G FINDPTQ
S IBNODE=$G(^IBD(357.96,+FORMID,0))
I IBNODE="" G FINDPTQ
S DFN=+$P(IBNODE,"^",2)
D DEM^VADPT
S Y=$P(IBNODE,"^",11),C=$P(^DD(357.96,.11,0),"^",2) D Y^DIQ S STATNM=Y
S FORM=$P($G(^IBD(357.95,+$P(IBNODE,"^",4),0)),"^",21)
S FORMNM=$P($G(^IBE(357,+FORM,0)),"^")
;
S IBXX=$G(VADM(1))_"^"_$G(VA("PID"))_"^"_$P($G(^SC(+$P(IBNODE,"^",10),0),"Clinic Not Specified"),"^")_"^"_$$FMTE^XLFDT($P(IBNODE,"^",3))_"^"_$P(IBNODE,"^",4)_"^"_$P(IBNODE,"^",11)_"^"_DFN
S IBXX=IBXX_"^"_$P(IBNODE,"^",10)_"^"_$P(IBNODE,"^",3)_"^"_STATNM_"^"_FORMNM_"^"_FORM
;
I +$P(FORMID,"^",2)>0,$P(IBNODE,"^",4)'=+$P(FORMID,"^",2) S IBXX="Form Type and Form ID Don't match^^^"
;
FINDPTQ Q IBXX
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HIBDF18C 7204 printed Dec 13, 2024@02:50:53 Page 2
IBDF18C ;ALB/CJM/AAS - ENCOUNTER FORM - form ID utilities ;04-OCT-94
+1 ;;3.0;AUTOMATED INFO COLLECTION SYS;**5,9**;APR 24, 1997
+2 ;
FID(DFN,APPT,SOURCE,FORMTYPE,CLIN) ; -- Form ID Tracking
+1 ; -- create record in the ENCOUNTER FORM TRACKING file
+2 ; and returned a unique FORM ID
+3 ; -- Input DFN = patient internal entry number
+4 ; APPT = appointment date time (fm format)
+5 ; SOURCE = the source of the form, ie
+6 ; IB = 1
+7 ; Pandas = 2
+8 ; Telefr = 3
+9 ; FORMTYPE = the package form definition ID - may have been exterally assigned
+10 ; CLIN = pointer to 44 (optional)
+11 ;
+12 ; -- Output Returns = internal form id^external form id
+13 ;
+14 NEW I,J,X,Y,ID,EXID,CLN,INTERNAL,NODE,FORMID,DIC,DIE,DA,DR,DINUM,DLAYGO
+15 SET ID=-1
SET EXID=""
+16 ;
+17 IF '$GET(DFN)!('$GET(APPT))!('$GET(SOURCE))
GOTO FIDQ
+18 ;
+19 ; -- FORMTYPE may="", but should always be >0 for scannable forms
+20 SET FORMTYPE=+$GET(FORMTYPE)
+21 SET FORMID("APPT")=APPT
SET FORMID("SOURCE")=1
+22 ;
+23 ; -- determine if the FORMTYPE was exterally assigned
+24 SET INTERNAL=$DATA(^IBD(357.95,"C",SOURCE,FORMTYPE))
+25 ;
+26 ;
+27 SET ID=$$FINDID(DFN,APPT,FORMTYPE)
IF ID
SET EXID=ID_"^"_$PIECE($GET(^IBD(357.96,ID,0)),"^",9)
GOTO FIDQ
+28 KILL DIC,DO,D0,DD,DA,DINUM
+29 SET DIC="^IBD(357.96,"
SET X=ID
SET DIC(0)="L"
SET DLAYGO=357.96
SET DINUM=ID
+30 ;
+31 LOCK +^IBD(357.97,1,.02):3
+32 SET ID=+$PIECE($GET(^IBD(357.97,1,0)),"^",2)
+33 FOR ID=ID+1:1
if $DATA(^IBD(357.96,(ID-1)))
LOCK -^IBD(357.96,(ID-1))
IF ID>0
IF '$DATA(^IBD(357.96,ID))
LOCK +^IBD(357.96,ID):1
IF $TEST
IF '$DATA(^IBD(357.96,ID))
SET (X,DINUM)=ID
DO FILE^DICN
IF +Y>0
LOCK -^IBD(357.96,ID)
QUIT
+34 SET $PIECE(^IBD(357.97,1,0),"^",2)=ID
+35 LOCK -^IBD(357.97,1,.02)
+36 ;
+37 SET ID=$SELECT(+Y<1:"",1:+Y)
IF ID=""
DO LOGERR^IBDF18E2(3579600,.FORMID)
GOTO FIDQ
+38 if ID
Begin DoDot:1
+39 SET EXID=$$EXID(ID)
+40 SET DIE="^IBD(357.96,"
SET DA=ID
+41 SET DR="[IBD CREATE FORM TRACKING]"
+42 LOCK +^IBD(357.96,ID):5
DO ^DIE
LOCK -^IBD(357.96,ID)
+43 KILL DIC,DIE,DA,DR,DINUM,DLAYGO,%,%H,%I
+44 ;
+45 ;D NOW^%DTC N IBPRDT S IBPRDT=% ;Not needed with template, delete
+46 ;S DR=".02////^S X=DFN;.03////^S X=APPT;.04////^S X=$S(INTERNAL:FORMTYPE,1:"""");.05////^S X=IBPRDT;.07////^S X=SOURCE;.08////^S X=$S('INTERNAL:FORMTYPE,1:"""");.09////^S X=EXID;.1////^S X=$G(CLIN);.11////1"
+47 ;I $G(^DPT(DFN,"S",APPT,0))="" S DR=DR_";.14////1"
End DoDot:1
FIDQ QUIT ID_"^"_EXID
+1 ;
EXID(ID) ; -- converts external id format to internal id format
+1 ; -- we need to decide on external id format
+2 QUIT $GET(ID)
+3 ;
INID(ID) ; -- find internal id number from external format
+1 ; -- Input ID = form id in external format
+2 ; Output = form id in internal format or NULL if nonexistant
+3 ;
+4 NEW EXID
+5 SET EXID=$ORDER(^IBD(357.96,"AEXT",ID,0))
INIDQ QUIT $GET(EXID)
+1 ;
FSCND(ID,STAT,ERR) ; -- update form tracking file that
+1 ; -- Input ID = entry to flag as scanned (internal format)
+2 ; STAT = NEW status, 1=printed, 2=scanned,3=sent to pce okay,
+3 ; 4=pce returned err
+4 ; 11=pending pages, 12=input data error
+5 ; ERR = pce error message (required only if stat=4)
+6 ;
+7 ; -- Output = 1 if successful, 0 if not
+8 ;
+9 NEW IBI,SUCCESS,I,J,X,Y,DA,DR,DIC,DIE
+10 SET SUCCESS=0
+11 IF '$GET(ID)
GOTO FSCNDQ
+12 IF $GET(STAT)=4
IF $GET(ERR)=""
GOTO FSCNDQ
+13 ;
+14 ; -- three lines below use template, new for t6, uncommend and delete
+15 ; remaining lines
+16 SET DIE="^IBD(357.96,"
SET DA=ID
SET DR="[IBD EDIT FORM TRACKING STATUS]"
+17 DO ^DIE
+18 SET SUCCESS=1
+19 ;
+20 ;S IBI=$G(^IBD(357.96,+ID,0)) I IBI="" G FSCND
+21 ;I $P(IBI,"^",6)="" S DIE="^IBD(357.96,",DA=ID,DR=".06///NOW;.11////^S X=$S($G(STAT):STAT,1:2);.12////^S X=$G(ERR)" D ^DIE S SUCCESS=1 G FSCNDQ
+22 ;S DIE="^IBD(357.96,",DA=+ID,DR=".11////^S X=$G(STAT);.12////^S X=$G(ERR)" D ^DIE S SUCCESS=1
+23 ;
FSCNDQ QUIT SUCCESS
+1 ;
FIDST(ID) ; -- form id status
+1 ; -- Input ID = form id (internal entry number)
+2 ;
+3 ; -- Output STATUS = -1 if id does not exist
+4 ; = 1 if id exists but not scanned (printed)
+5 ; = 2 if already scanned in
+6 ; = 3 if sent to pce okay
+7 ; = 4 if sent to pce with error....
+8 ;
+9 NEW STATUS,I,J,X,Y
+10 SET STATUS=-1
+11 IF '$GET(ID)
GOTO FIDSTQ
+12 SET X=$GET(^IBD(357.96,ID,0))
IF X=""
GOTO FIDSTQ
+13 SET STATUS=$SELECT($PIECE(X,"^",6)="":1,1:2)
+14 if $PIECE(X,"^",11)>2
SET STATUS=$PIECE(X,"^",11)
FIDSTQ QUIT STATUS
+1 ;
FINDID(DFN,APPT,FORM,DUP) ; -- Find a form id for a patient and appointment
+1 ; -- input DFN = patient
+2 ; APPT = appointment date time
+3 ; FORM = (Optional) type of form, pointer to 357.95 or field 10
+4 ; DUP = (Optional) if true, No duplicates of same form (357)
+5 ; returns last printing of same form with different
+6 ; form definitions, will also exclude nonscannable form
+7 ;
+8 ; -- output = form id1^form id2^form id3^form idn...
+9 ; = where form ids are successive form ids (in internal
+10 ; format) for same appointment
+11 ;
+12 NEW ID,I,J,X,ORIGIN,OLDDATE,NEWDATE
+13 SET ID=""
+14 IF '$GET(DFN)!('$GET(APPT))
GOTO FINDIDQ
+15 KILL ^TMP($JOB,"IBD-FINDID")
+16 ;get clinic if appointment
SET CLN=+$GET(^DPT(DFN,"S",APPT,0))
+17 ;
+18 IF '$GET(DUP)
SET X=0
FOR
SET X=$ORDER(^IBD(357.96,"APTAP",DFN,APPT,X))
if 'X
QUIT
Begin DoDot:1
+19 ;form for canceled appt.
IF CLN
IF CLN'=$PIECE($GET(^IBD(357.96,X,0)),"^",10)
QUIT
+20 IF '$GET(FORM)
SET ID=ID_X_"^"
QUIT
+21 IF $GET(FORM)
SET I=$GET(^IBD(357.96,X,0))
IF $PIECE(I,"^",4)=FORM!($PIECE(I,"^",8)=FORM)
SET ID=X
QUIT
End DoDot:1
+22 ;
+23 IF $GET(DUP)
SET X=0
FOR
SET X=$ORDER(^IBD(357.96,"APTAP",DFN,APPT,X))
if 'X
QUIT
Begin DoDot:1
+24 IF +$PIECE($GET(^IBE(357,+$PIECE($GET(^IBD(357.95,+$PIECE($GET(^IBD(357.96,X,0)),"^",4),0)),"^",21),0)),"^",12)<1
QUIT
+25 ;form for canceled appt.
IF CLN
IF CLN'=$PIECE($GET(^IBD(357.96,X,0)),"^",10)
QUIT
+26 SET ORIGIN=$PIECE($GET(^IBD(357.95,+$PIECE($GET(^IBD(357.96,X,0)),"^",4),0)),"^",21)
if 'ORIGIN
QUIT
+27 IF '$GET(FORM)
Begin DoDot:2
+28 IF '$DATA(^TMP($JOB,"IBD-FINDID",ORIGIN))
SET ^TMP($JOB,"IBD-FINDID",ORIGIN)=X
QUIT
+29 SET OLDDATE=$PIECE($GET(^IBD(357.96,+$GET(^TMP("IBD-FINDID",ORIGIN)),0)),"^",5)
+30 SET NEWDATE=$PIECE($GET(^IBD(357.96,X,0)),"^",5)
+31 IF NEWDATE'<OLDDATE
SET ^TMP($JOB,"IBD-FINDID",ORIGIN)=X
End DoDot:2
+32 IF $GET(FORM)
SET I=$GET(^IBD(357.96,X,0))
IF $PIECE(I,"^",4)=FORM!($PIECE(I,"^",8)=FORM)
SET ID=X
QUIT
End DoDot:1
+33 IF $GET(DUP)
IF '$GET(FORM)
SET ORIGIN=0
FOR
SET ORIGIN=$ORDER(^TMP($JOB,"IBD-FINDID",ORIGIN))
if 'ORIGIN
QUIT
SET ID=ID_^TMP($JOB,"IBD-FINDID",ORIGIN)_"^"
+34 ;
FINDIDQ KILL ^TMP($JOB,"IBD-FINDID")
+1 QUIT ID
+2 ;
FINDPT(FORMID) ;
+1 ; -- find patient from form id
+2 ; -- Output :Patient Name ^ PID ^ clinic Name ^ appt date/time (external)
+3 ; ^form ID ^ form status ^ DFN ^ clinic ien ^ appt date/time (fm format)
+4 ;
+5 NEW I,J,X,Y,DFN,IBNODE,IBXX,VA,VADM,VAERR,STATNM,FORM,FORMNM
+6 SET IBXX="Unable to identify Form^^^"
+7 IF +$GET(FORMID)<1
GOTO FINDPTQ
+8 SET IBNODE=$GET(^IBD(357.96,+FORMID,0))
+9 IF IBNODE=""
GOTO FINDPTQ
+10 SET DFN=+$PIECE(IBNODE,"^",2)
+11 DO DEM^VADPT
+12 SET Y=$PIECE(IBNODE,"^",11)
SET C=$PIECE(^DD(357.96,.11,0),"^",2)
DO Y^DIQ
SET STATNM=Y
+13 SET FORM=$PIECE($GET(^IBD(357.95,+$PIECE(IBNODE,"^",4),0)),"^",21)
+14 SET FORMNM=$PIECE($GET(^IBE(357,+FORM,0)),"^")
+15 ;
+16 SET IBXX=$GET(VADM(1))_"^"_$GET(VA("PID"))_"^"_$PIECE($GET(^SC(+$PIECE(IBNODE,"^",10),0),"Clinic Not Specified"),"^")_"^"_$$FMTE^XLFDT($PIECE(IBNODE,"^",3))_"^"_$PIECE(IBNODE,"^",4)_"^"_$PIECE(IBNODE,"^",11)_"^"_DFN
+17 SET IBXX=IBXX_"^"_$PIECE(IBNODE,"^",10)_"^"_$PIECE(IBNODE,"^",3)_"^"_STATNM_"^"_FORMNM_"^"_FORM
+18 ;
+19 IF +$PIECE(FORMID,"^",2)>0
IF $PIECE(IBNODE,"^",4)'=+$PIECE(FORMID,"^",2)
SET IBXX="Form Type and Form ID Don't match^^^"
+20 ;
FINDPTQ QUIT IBXX