EASMTCHK ;ALB/SCK,PJR,BDB - MEANS TEST BLOCKING CHECK ; 11/13/03 11:13am
;;1.0;ENROLLMENT APPLICATION SYSTEM;**3,12,15,38,46,106**;MAR 15,2001;Build 28
; This routine provides an API, which when called from Appointment Management will allow
; for the blocking of future appointments and appointment check-in/out if the patient
; requires a Means Test or has a Means Test Status of Required. $$LST^DGMTU is used
; to determine if a MT is REQUIRED. If a MT does not have a status of REQUIRED,
; but is more than 365 days out (same criteria used in OLD^DGMTU4), the MT will
; be considered "REQUIRED" for blocking purposes. If a Means Test is required, the
; following combinations of appointment actions will be blocked:
; o Making a future appt for a Regular appt type
; o Check In/Out an appt which is either a Regular or Research type
;
; A Walk-in will see the alert notice, and will be warned NOT to CHECK-IN the walk-in
; appointment. Unscheduled/Walk-ins can ONLY be checked out.
;
; This API may be passed a flag to "silence" the screen display of the alert message, and
; will accept an array variable to return the alert text in. Inpatient appointments
; are not affected in any way. Domicilary are not considered inpatients for the purpose
; of Means Test Blocking for appointments
;
MT(DFN,EASAPT,EASACT,EASDT,EASQT,EASMSG) ; Entry point for MT Check
; Input Variables
; DFN - Patient's IEN in File #2
; EASAPT - Appointment Type (File #409.1) [Optional]
; EASACT - Appointment Action Flag [Optional] Default = "Other"
; "M" - Make an Appointment
; "C" - Check In/Out an existing appointment
; "W" - Unscheduled/Walk-in appointment
; "O" - Other
; "L" - Letters
;
; EASDT - Appointment Date/Time [Optional]
; EASQT - Silent flag [Optional], if set will prevent display of alert message
; EASMSG - Return array for alert message [Optional], if passed in, the alert
; message text will be copied to this array
;
; Output
; 1 - Block action (MT Required)
; 0 - Don't block action (MT Not required)
;
N RSLT,EASMT,EASTXT,EASX,EAMTS,DSPLY,IENS
;
S RSLT=0
S EASQT=+$G(EASQT)
S EASAPT=+$G(EASAPT)
S EASDT=$G(EASDT)
S EASACT=$G(EASACT)
S:EASACT']"" EASACT="O"
; If Appt type is not defined, action is CI/CO, get appt date
I 'EASAPT,EASACT="C",EASDT]"" D
.N DGARRAY,SDCNT
.S DGARRAY(4)=DFN,DGARRAY("SORT")="P",DGARRAY("FLDS")=10
.S SDCNT=$$SDAPI^SDAMA301(.DGARRAY)
.S EASAPT=+$P($G(^TMP($J,"SDAMA301",DFN,EASDT)),U,10)
.K DGARRAY,SDCNT,^TMP($J,"SDAMA301")
;
Q:$$INP(DFN) RSLT ; Quit if inpatient
S EAMTS=$$MTCHK(DFN,EASACT) ; Get MT Check flag
Q:'EAMTS RSLT
;
;Build Alert message
D BLDMSG(EASACT,.EASTXT)
I $D(EASMSG) M @EASMSG=EASTXT ; If output array defined,copy message test
;
; Check appointment action and appointment type. Set blocking action
I EASACT="M",EASAPT=9 S (DSPLY,RSLT)=1 ; Make an Appt.
;
I EASACT="C" D ; Check-in an appt.
. I $G(EASAPT)=9 S (DSPLY,RSLT)=1
;
I "W,O"[EASACT D ; Walk-in/Other appt.
. S:$G(EASAPT)=9 DSPLY=1
;
I $G(DSPLY) D
. Q:EASQT ; If silent flag is set, do not display alert
. S EASX=0
. W !?5,$CHAR(7),"******************************************************"
. F S EASX=$O(EASTXT(EASX)) Q:'EASX D
. . W !?5,EASTXT(EASX)
;
; Check for override key on making appointments
I EASACT="M" D
. I $D(^XUSEC("EAS MTOVERRIDE",DUZ)) S RSLT=0
Q $G(RSLT)
;
MTCHK(DFN,EASACT) ; Check Means Test Status
; Input
; DFN
;
; Output
; 0 OK
; 1 MEANS TEST Required
;
N RSLT,EASTAT,EASDT
;
S RSLT=0
S EASTAT=$$LST^DGMTU(DFN,"",1)
I EASTAT]"" D
. I $P(EASTAT,U,4)="R" S RSLT=1 Q
. ;; Condition Check: MT Stat="P" AND GMT Threshold>Threshold A
. ;; AND MT Date is after 10/5/1999 AND Agrees to pay Deductible
. ;; AND MT Date is older than 365 days, THEN MT is required
. ;; EAS*1.0*106 MT less than 1 year old as of "VFA Start Date" and point forward do not expire
. I $P(EASTAT,U,4)="P",$$GET1^DIQ(408.31,+EASTAT,.27,"I")>$$GET1^DIQ(408.31,+EASTAT,.12,"I"),$P(EASTAT,U,2)>2991005,$$GET1^DIQ(408.31,+EASTAT,.11,"I"),$$OLDMTPF^DGMTU4($P(EASTAT,U,2)) S RSLT=1 Q
. ;; Condition Check: Cat C or Pending Adj.
. ;; AND Agrees to pay Deductible AND MT date after 10/5/1999
. I "C,P"[$P(EASTAT,U,4),$$GET1^DIQ(408.31,+EASTAT,.11,"I"),$P(EASTAT,U,2)>2991005 Q
. ;; EAS*1.0*106 MT less than 1 year old as of "VFA Start Date" and point forward do not expire
. I $P(EASTAT,U,4)="P",$$GET1^DIQ(408.31,+EASTAT,.27,"I")>$$GET1^DIQ(408.31,+EASTAT,.12,"I"),$P(EASTAT,U,2)>2991005,$$GET1^DIQ(408.31,+EASTAT,.11,"I"),$$OLDMTPF^DGMTU4($P(EASTAT,U,2)) S RSLT=1 Q
. ;; Condition Check: Cat C AND Declines to give income information AND Agreed to pay deductible
. I $P(EASTAT,U,4)="C",$$GET1^DIQ(408.31,+EASTAT,.14,"I"),$$GET1^DIQ(408.31,+EASTAT,.11,"I") Q
. S EASDT=$P(EASTAT,U,2)
. ;; EAS*1.0*106 MT less than 1 year old as of "VFA Start Date" and point forward do not expire
. I $$OLDMTPF^DGMTU4(EASDT) S RSLT=1
. I $G(EASACT)="L" D
. . ;; For letters, need to check for letters past 60-day threshold
. . I ($$FMDIFF^XLFDT(DT,EASDT)>304) S RSLT=1
;
I $P(EASTAT,U,4)="N" S RSLT=0
Q $G(RSLT)
;
BLDMSG(EASACT,EASTXT) ; Build alert message to user
N LINE
;
S LINE=1
S EASTXT(LINE)="Means Test Alert",LINE=LINE+1
S EASTXT(LINE)="A Means Test is required or needs to be completed.",LINE=LINE+1
;
I "M,C,W"[EASACT D
. S EASTXT(LINE)="Please perform MEANS TEST or instruct patient",LINE=LINE+1
. S EASTXT(LINE)="to report for Means Test interview.",LINE=LINE+1
;
I EASACT="M" D
. S EASTXT(LINE)=">> A future appointment cannot be made at this time."
. S:$D(^XUSEC("EAS MTOVERRIDE",DUZ)) EASTXT(LINE)=">> Override Key in Effect."
. S LINE=LINE+1
;
I EASACT="C" S EASTXT(LINE)=">> This action may not be completed at this time.",LINE=LINE+1
I EASACT="W" D
. S EASTXT(LINE)=">> Check-Out ONLY. Do NOT Check-In (CI) a walk-in appointment",LINE=LINE+1
. S EASTXT(LINE)=" You will not be able to check-out the appt. if you do so.",LINE=LINE+1
Q
;
INP(DFN) ; Check on Inpatient status
; Input
; DFN - IEN from patient file
; Output
; 1 - Patient has Inpatient status
; 0 - Patient does not have Inpatient status
; Default
; Inpatient API defaults to TODAY for inpatient status check
;
N VAERR,EAIN,VAROOT,VAINDT
;
S VAINDT=$$NOW^XLFDT,VAROOT="EAIN"
;; Modified to treat DOM patients as inpatients for the purpose of appointment blocking.
;; EAS*1*12
D INP^VADPT
Q $S(+$G(EAIN(1)):1,1:0)
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HEASMTCHK 6777 printed Oct 16, 2024@17:56:09 Page 2
EASMTCHK ;ALB/SCK,PJR,BDB - MEANS TEST BLOCKING CHECK ; 11/13/03 11:13am
+1 ;;1.0;ENROLLMENT APPLICATION SYSTEM;**3,12,15,38,46,106**;MAR 15,2001;Build 28
+2 ; This routine provides an API, which when called from Appointment Management will allow
+3 ; for the blocking of future appointments and appointment check-in/out if the patient
+4 ; requires a Means Test or has a Means Test Status of Required. $$LST^DGMTU is used
+5 ; to determine if a MT is REQUIRED. If a MT does not have a status of REQUIRED,
+6 ; but is more than 365 days out (same criteria used in OLD^DGMTU4), the MT will
+7 ; be considered "REQUIRED" for blocking purposes. If a Means Test is required, the
+8 ; following combinations of appointment actions will be blocked:
+9 ; o Making a future appt for a Regular appt type
+10 ; o Check In/Out an appt which is either a Regular or Research type
+11 ;
+12 ; A Walk-in will see the alert notice, and will be warned NOT to CHECK-IN the walk-in
+13 ; appointment. Unscheduled/Walk-ins can ONLY be checked out.
+14 ;
+15 ; This API may be passed a flag to "silence" the screen display of the alert message, and
+16 ; will accept an array variable to return the alert text in. Inpatient appointments
+17 ; are not affected in any way. Domicilary are not considered inpatients for the purpose
+18 ; of Means Test Blocking for appointments
+19 ;
MT(DFN,EASAPT,EASACT,EASDT,EASQT,EASMSG) ; Entry point for MT Check
+1 ; Input Variables
+2 ; DFN - Patient's IEN in File #2
+3 ; EASAPT - Appointment Type (File #409.1) [Optional]
+4 ; EASACT - Appointment Action Flag [Optional] Default = "Other"
+5 ; "M" - Make an Appointment
+6 ; "C" - Check In/Out an existing appointment
+7 ; "W" - Unscheduled/Walk-in appointment
+8 ; "O" - Other
+9 ; "L" - Letters
+10 ;
+11 ; EASDT - Appointment Date/Time [Optional]
+12 ; EASQT - Silent flag [Optional], if set will prevent display of alert message
+13 ; EASMSG - Return array for alert message [Optional], if passed in, the alert
+14 ; message text will be copied to this array
+15 ;
+16 ; Output
+17 ; 1 - Block action (MT Required)
+18 ; 0 - Don't block action (MT Not required)
+19 ;
+20 NEW RSLT,EASMT,EASTXT,EASX,EAMTS,DSPLY,IENS
+21 ;
+22 SET RSLT=0
+23 SET EASQT=+$GET(EASQT)
+24 SET EASAPT=+$GET(EASAPT)
+25 SET EASDT=$GET(EASDT)
+26 SET EASACT=$GET(EASACT)
+27 if EASACT']""
SET EASACT="O"
+28 ; If Appt type is not defined, action is CI/CO, get appt date
+29 IF 'EASAPT
IF EASACT="C"
IF EASDT]""
Begin DoDot:1
+30 NEW DGARRAY,SDCNT
+31 SET DGARRAY(4)=DFN
SET DGARRAY("SORT")="P"
SET DGARRAY("FLDS")=10
+32 SET SDCNT=$$SDAPI^SDAMA301(.DGARRAY)
+33 SET EASAPT=+$PIECE($GET(^TMP($JOB,"SDAMA301",DFN,EASDT)),U,10)
+34 KILL DGARRAY,SDCNT,^TMP($JOB,"SDAMA301")
End DoDot:1
+35 ;
+36 ; Quit if inpatient
if $$INP(DFN)
QUIT RSLT
+37 ; Get MT Check flag
SET EAMTS=$$MTCHK(DFN,EASACT)
+38 if 'EAMTS
QUIT RSLT
+39 ;
+40 ;Build Alert message
+41 DO BLDMSG(EASACT,.EASTXT)
+42 ; If output array defined,copy message test
IF $DATA(EASMSG)
MERGE @EASMSG=EASTXT
+43 ;
+44 ; Check appointment action and appointment type. Set blocking action
+45 ; Make an Appt.
IF EASACT="M"
IF EASAPT=9
SET (DSPLY,RSLT)=1
+46 ;
+47 ; Check-in an appt.
IF EASACT="C"
Begin DoDot:1
+48 IF $GET(EASAPT)=9
SET (DSPLY,RSLT)=1
End DoDot:1
+49 ;
+50 ; Walk-in/Other appt.
IF "W,O"[EASACT
Begin DoDot:1
+51 if $GET(EASAPT)=9
SET DSPLY=1
End DoDot:1
+52 ;
+53 IF $GET(DSPLY)
Begin DoDot:1
+54 ; If silent flag is set, do not display alert
if EASQT
QUIT
+55 SET EASX=0
+56 WRITE !?5,$CHAR(7),"******************************************************"
+57 FOR
SET EASX=$ORDER(EASTXT(EASX))
if 'EASX
QUIT
Begin DoDot:2
+58 WRITE !?5,EASTXT(EASX)
End DoDot:2
End DoDot:1
+59 ;
+60 ; Check for override key on making appointments
+61 IF EASACT="M"
Begin DoDot:1
+62 IF $DATA(^XUSEC("EAS MTOVERRIDE",DUZ))
SET RSLT=0
End DoDot:1
+63 QUIT $GET(RSLT)
+64 ;
MTCHK(DFN,EASACT) ; Check Means Test Status
+1 ; Input
+2 ; DFN
+3 ;
+4 ; Output
+5 ; 0 OK
+6 ; 1 MEANS TEST Required
+7 ;
+8 NEW RSLT,EASTAT,EASDT
+9 ;
+10 SET RSLT=0
+11 SET EASTAT=$$LST^DGMTU(DFN,"",1)
+12 IF EASTAT]""
Begin DoDot:1
+13 IF $PIECE(EASTAT,U,4)="R"
SET RSLT=1
QUIT
+14 ;; Condition Check: MT Stat="P" AND GMT Threshold>Threshold A
+15 ;; AND MT Date is after 10/5/1999 AND Agrees to pay Deductible
+16 ;; AND MT Date is older than 365 days, THEN MT is required
+17 ;; EAS*1.0*106 MT less than 1 year old as of "VFA Start Date" and point forward do not expire
+18 IF $PIECE(EASTAT,U,4)="P"
IF $$GET1^DIQ(408.31,+EASTAT,.27,"I")>$$GET1^DIQ(408.31,+EASTAT,.12,"I")
IF $PIECE(EASTAT,U,2)>2991005
IF $$GET1^DIQ(408.31,+EASTAT,.11,"I")
IF $$OLDMTPF^DGMTU4($PIECE(EASTAT,U,2))
SET RSLT=1
QUIT
+19 ;; Condition Check: Cat C or Pending Adj.
+20 ;; AND Agrees to pay Deductible AND MT date after 10/5/1999
+21 IF "C,P"[$PIECE(EASTAT,U,4)
IF $$GET1^DIQ(408.31,+EASTAT,.11,"I")
IF $PIECE(EASTAT,U,2)>2991005
QUIT
+22 ;; EAS*1.0*106 MT less than 1 year old as of "VFA Start Date" and point forward do not expire
+23 IF $PIECE(EASTAT,U,4)="P"
IF $$GET1^DIQ(408.31,+EASTAT,.27,"I")>$$GET1^DIQ(408.31,+EASTAT,.12,"I")
IF $PIECE(EASTAT,U,2)>2991005
IF $$GET1^DIQ(408.31,+EASTAT,.11,"I")
IF $$OLDMTPF^DGMTU4($PIECE(EASTAT,U,2))
SET RSLT=1
QUIT
+24 ;; Condition Check: Cat C AND Declines to give income information AND Agreed to pay deductible
+25 IF $PIECE(EASTAT,U,4)="C"
IF $$GET1^DIQ(408.31,+EASTAT,.14,"I")
IF $$GET1^DIQ(408.31,+EASTAT,.11,"I")
QUIT
+26 SET EASDT=$PIECE(EASTAT,U,2)
+27 ;; EAS*1.0*106 MT less than 1 year old as of "VFA Start Date" and point forward do not expire
+28 IF $$OLDMTPF^DGMTU4(EASDT)
SET RSLT=1
+29 IF $GET(EASACT)="L"
Begin DoDot:2
+30 ;; For letters, need to check for letters past 60-day threshold
+31 IF ($$FMDIFF^XLFDT(DT,EASDT)>304)
SET RSLT=1
End DoDot:2
End DoDot:1
+32 ;
+33 IF $PIECE(EASTAT,U,4)="N"
SET RSLT=0
+34 QUIT $GET(RSLT)
+35 ;
BLDMSG(EASACT,EASTXT) ; Build alert message to user
+1 NEW LINE
+2 ;
+3 SET LINE=1
+4 SET EASTXT(LINE)="Means Test Alert"
SET LINE=LINE+1
+5 SET EASTXT(LINE)="A Means Test is required or needs to be completed."
SET LINE=LINE+1
+6 ;
+7 IF "M,C,W"[EASACT
Begin DoDot:1
+8 SET EASTXT(LINE)="Please perform MEANS TEST or instruct patient"
SET LINE=LINE+1
+9 SET EASTXT(LINE)="to report for Means Test interview."
SET LINE=LINE+1
End DoDot:1
+10 ;
+11 IF EASACT="M"
Begin DoDot:1
+12 SET EASTXT(LINE)=">> A future appointment cannot be made at this time."
+13 if $DATA(^XUSEC("EAS MTOVERRIDE",DUZ))
SET EASTXT(LINE)=">> Override Key in Effect."
+14 SET LINE=LINE+1
End DoDot:1
+15 ;
+16 IF EASACT="C"
SET EASTXT(LINE)=">> This action may not be completed at this time."
SET LINE=LINE+1
+17 IF EASACT="W"
Begin DoDot:1
+18 SET EASTXT(LINE)=">> Check-Out ONLY. Do NOT Check-In (CI) a walk-in appointment"
SET LINE=LINE+1
+19 SET EASTXT(LINE)=" You will not be able to check-out the appt. if you do so."
SET LINE=LINE+1
End DoDot:1
+20 QUIT
+21 ;
INP(DFN) ; Check on Inpatient status
+1 ; Input
+2 ; DFN - IEN from patient file
+3 ; Output
+4 ; 1 - Patient has Inpatient status
+5 ; 0 - Patient does not have Inpatient status
+6 ; Default
+7 ; Inpatient API defaults to TODAY for inpatient status check
+8 ;
+9 NEW VAERR,EAIN,VAROOT,VAINDT
+10 ;
+11 SET VAINDT=$$NOW^XLFDT
SET VAROOT="EAIN"
+12 ;; Modified to treat DOM patients as inpatients for the purpose of appointment blocking.
+13 ;; EAS*1*12
+14 DO INP^VADPT
+15 QUIT $SELECT(+$GET(EAIN(1)):1,1:0)