Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: XQALERT1

XQALERT1.m

Go to the documentation of this file.
  1. XQALERT1 ;ISC-SF.SEA/JLI - ALERT HANDLER ;07/05/12 11:27
  1. ;;8.0;KERNEL;**20,65,114,123,125,164,173,285,366,443,513,602**;Jul 10, 1995;Build 9
  1. ;Per VHA Directive 2004-038, this routine should not be modified
  1. Q
  1. ;
  1. DOIT ;SR.
  1. ; ZEXCEPT: IOF,XQAID,XQAUSER,XQX1 - global variables
  1. ; ZEXCEPT: XQACNT,XQADATA,XQAKILL,XQALDELE,XQALFWD,XQAQ,XQAREV,XQAROU,XQAROUX,XQI,XQII,XQK,XQX,XQXOUT,XQZ4
  1. N DIR,DIRUT,DUOUT,Y
  1. I $D(XQX1),XQX1'>0 K XQX1
  1. I $D(XQAID) D I '$D(XQAID) G EXIT
  1. . N XQACHOIC,REASK S REASK=0
  1. . I '$D(XQX1),$O(^XTV(8992,XQAUSER,"XQA",+$O(^XTV(8992,XQAUSER,"XQA",0))))'>0,$G(XQAROUX)="^ " S XQAROU=""
  1. AGAIN . S XQACHOIC="Y:YES;N:NO;C:CONTINUE;",XQAQ("?")="Enter Y (or C) to continue, N to exit alert processing"
  1. . S XQACHOIC=$G(XQACHOIC)_"F:FORWARD ALERT;R:RENEW(MAKE NEW AGAIN);" S XQAQ("?",1)="Enter F to forward this alert to someone else",XQAQ("?",2)="Enter R to Renew (Make New) this alert"
  1. . D I REASK=1 G AGAIN
  1. . . S REASK=0 W !! K DIR S DIR(0)="SA^"_XQACHOIC,DIR("A")=$S(XQACHOIC["F:":"Continue (Y/N) or F(orward) or R(enew) ",1:"Continue Processing (Y/N) "),DIR("B")="YES" M DIR("?")=XQAQ("?") D ^DIR K DIR
  1. . . I $D(DUOUT)!$D(DIRUT) S Y="N" K DUOUT,DIRUT
  1. . . I Y="N" D:$D(XQAKILL) DELETEA^XQALERT K XQAID
  1. . . I Y="R" S REASK=REASK+1 K XQAKILL I '$D(^XTV(8992,"AXQA",XQAID,DUZ)) D RESTORE
  1. . . I Y="F" D:'$D(^XTV(8992,"AXQA",XQAID,DUZ)) RESTORE D FRWRDONE S REASK=REASK+1
  1. . . Q
  1. . Q
  1. I $D(XQAKILL) D DELETEA^XQALERT
  1. S XQAREV=1,XQXOUT=0,XQK=0,XQACNT=0 K XQADATA,XQAID,XQAROU,XQAKILL,XQAROUX
  1. I '$D(XQX1) S XQX1=0 K ^TMP("XQ",$J,"XQA"),^("XQA1"),^("XQA2") I $O(^XTV(8992,XQAUSER,"XQA",0))'>0 K XQX1 D:'$G(^TMP("XQALERT1",$J,"NOTFIRST")) CHKSURO G:$O(^XTV(8992,XQAUSER,"XQA",0))'>0 EXIT S XQX1=0 ; P366
  1. I $$ACTVSURO^XQALSURO(XQAUSER)'>0 D RETURN^XQALSUR1(XQAUSER) ; P366
  1. S ^TMP("XQALERT1",$J,"NOTFIRST")=1 ; Added 2/2/99 jli to clear flag for initial entry
  1. ;Sort and remove display only
  1. I 'XQX1 W !!! D
  1. . D SORT
  1. ; Now display them.
  1. SUBLOOP W @IOF
  1. N XQZ1,XQZ
  1. S XQK=0 F XQI=0:0 Q:XQX1!XQXOUT S XQI=$O(^TMP("XQ",$J,"XQA",XQI)) Q:XQI'>0 S XQX=^(XQI),XQII=^(XQI,1),XQZ=^(2),XQZ1=^(3),XQZ4=^(4) D I XQX'="" D DOIT1
  1. . I '$D(^XTV(8992,XQAUSER,"XQA",XQII)) S XQX="" K ^TMP("XQ",$J,"XQA",XQI),^TMP("XQ",$J,"XQA1",(XQI))
  1. . Q
  1. S:'$D(XQXOUT) XQXOUT=0 G:XQXOUT EXIT G:XQK'>0&'XQX1 EXIT I 'XQX1 D ASK G:XQXOUT EXIT
  1. G:+XQX1=0 EXIT I XQX1<0 S XQX1=0 G DOIT
  1. I $D(XQALDELE)!$D(XQALFWD) Q
  1. G:XQXOUT EXIT
  1. G EN^XQALDOIT
  1. ;
  1. RESTORE ; SR. ICR #4100 (controlled subscription)
  1. ; Restore a deleted message for use
  1. ; ZEXCEPT: XQAID
  1. N ALERTREF,XTVGLOB,ADUZ,X,X0,X1,X2,TIME,MESG,OPT,TAG,ROU,X4,LONG
  1. S XTVGLOB=$NA(^XTV(8992,DUZ,"XQA"))
  1. S ADUZ=$O(^XTV(8992,"AXQA",XQAID,0)) I ADUZ>0 S TIME=$O(^(ADUZ,0)) D I 1
  1. . M @XTVGLOB@(TIME)=^XTV(8992,ADUZ,"XQA",TIME) K @XTVGLOB@(TIME,2) ; copy alert, kill comment if any
  1. E S ALERTREF=$O(^XTV(8992.1,"B",XQAID,0)) Q:ALERTREF'>0 D ; otherwise rebuild from alert tracking file if possible
  1. . S X0=^XTV(8992.1,ALERTREF,0),X1=$G(^(1)),X2=$G(^(2)),X4=$O(^(4,0))
  1. . S TIME=$P($P(X0,U),";",3),MESG=$P(X1,U),OPT=$P(X1,U,2),TAG=$P(X1,U,3),ROU=$P(X1,U,4),LONG=(X4>0)
  1. . S X=TIME_U_XQAID_U_MESG_U_U_$S(OPT'=""!(ROU'=""):"R",LONG:"L",1:"I")_U_U_$S(OPT'="":OPT,TAG'="":TAG,1:"")_U_$S(OPT'="":"",ROU'="":ROU,1:" ")
  1. . S @XTVGLOB@(TIME,0)=X I $G(X2)'="" S ^(1)=X2
  1. S ^XTV(8992,"AXQA",XQAID,DUZ,TIME)="",^XTV(8992,"AXQAN",$E($P(XQAID,";"),1,30),DUZ,TIME)=""
  1. Q
  1. ;
  1. EXIT ;
  1. ; ZEXCEPT: %ZIS,XQ1,XQ1OFF,XQ1ON,XQA1,XQACNT,XQALAST,XQALDELE,XQALFWD,XQAQ,XQAREV,XQAROU,XQAROUX,XQI,XQII,XQJ,XQK,XQOFF,XQON,XQOUT,XQX,XQX1,XQX2,XQXOUT
  1. I $G(XQALAST)="I",$G(DUZ("AUTO")) D WAIT2
  1. I $D(XQALDELE)!$D(XQALFWD) Q
  1. K ^TMP("XQ",$J,"XQA"),^("XQA1"),^("XQA2"),XQI,XQX,XQJ,XQK,XQX1,XQX2,XQXOUT,XQ1,XQII,XQACNT,XQA1,XQAREV,%ZIS,XQAROU,XQALAST,XQAROUX,XQON,XQOFF,XQ1ON,XQ1OFF,XQOUT,XQAQ
  1. K ^TMP("XQALERT1",$J)
  1. Q
  1. ;
  1. CHKSURO ; If user selects process alerts with no alerts present, give him/her the opportunity to add or delete a surrogate
  1. ; P366 - list currently established surrogates if any
  1. I '$G(^TMP("XQALERT1",$J,"NOTFIRST")) W !!,"You have no alerts for processing.",!
  1. D SURROGAT^XQALSURO ; XU*8*17
  1. Q
  1. ;
  1. DOIT1 ;
  1. ; ZEXCEPT: IOF,IOSL,XQ1OFF,XQ1ON,XQALFWD,XQALINFO,XQI,XQII,XQK,XQOFF,XQON,XQX,XQZ,XQZ1,XQZ4
  1. I XQK=0 S XQALINFO=0 I '$D(XQALFWD) W @IOF
  1. S XQON="$C(0)",XQOFF="$C(0)" I $$CHKCRIT^XQALSUR2(XQX) D:'$D(XQ1ON) SETREV^XQALERT S XQON=XQ1ON,XQOFF=XQ1OFF ; P513 modified to add use data from file 8992.3 for identifying critical alerts
  1. S XQK=XQK+1 W !,$J(XQK,2),".",$S(XQZ4:"L",$P(XQX,U,8)=" ":"I",1:" ")," ",@XQON,$E($P(XQX,U,3),1,70),@XQOFF S:$P(XQX,U,8)=" " XQALINFO=XQALINFO+1 D:XQZ1'="" ; P285
  1. . W !?8,"Forwarded by: ",$P(^VA(200,+XQZ1,0),U)," Generated: ",$$DAT8^XQALERT(+$P($P(XQX,U,2),";",3),1)
  1. . I $P(XQZ1,U,3)'="" W !?8,$P(XQZ1,U,3)
  1. S ^TMP("XQ",$J,"XQA1",XQK)=XQX,^(XQK,1)=XQII,^(2)=XQZ,^(3)=XQZ1
  1. I ($Y+6)>IOSL N XQKVALUE S XQKVALUE=XQK D ASK0(XQI) S:'$D(XQK) XQK=XQKVALUE Q:XQX1!(XQXOUT) W @IOF
  1. Q
  1. ;
  1. ASK0(XQI) ;Stack XQI
  1. ; ZEXCEPT: DIR,X,XQ1,XQACNT,XQALAST,XQALDELE,XQALFWD,XQAUSER,XQII,XQK,XQX1,XQX2,XQXOUT,Y
  1. ASK ;
  1. N XQALNEWF K XQALAST
  1. S XQ1=0,XQXOUT=0 W !?10,"Select from 1 to ",XQK W:$D(XQALDELE) " to DELETE" W:$D(XQALFWD) " to FORWARD"
  1. W !?10,"or enter ?, A, " W:'$D(XQALDELE)&'$D(XQALFWD)&(XQALINFO>0) "I, D, " W:'$D(XQALDELE)&'$D(XQALFWD) "F, S, P, M, R, " W "or ^ to exit" I XQI>0,$O(^XTV(8992,XQAUSER,"XQA",XQI))>0 W !?10,"or RETURN to continue" S XQ1=1
  1. R ": ",XQII:DTIME S:'$T!(XQII[U)!(XQII=""&'XQ1) XQXOUT=1 Q:XQXOUT
  1. I '$D(XQALDELE)&'$D(XQALFWD),"PpMm"[$E(XQII_".") D MORP^XQALDOIT D:"Pp"[$E(XQII_".") PRINT^XQALDOIT D:"Mm"[$E(XQII_".") MAIL^XQALDOIT K ^TMP("XQ",$J,"XQA2") G ASK
  1. I XQII'="",XQII["?" D HELP G ASK
  1. I XQII=""&XQ1 Q
  1. I "IiAaFfRrSsDd"'[$E(XQII_"."),$L(XQII)>31,$E(XQII,1,32)?1N.N W !,$C(7)," ?? Invalid number entered",! G ASK
  1. I "IiAaFfRrSsDd"'[$E(XQII_"."),(XQII<1)!(XQII>XQK) W $C(7)," ??",! G ASK
  1. I '$D(XQALDELE)&'$D(XQALFWD),"Ff"[$E(XQII) D FWRD^XQALFWD S XQX1=-2 Q ; MODIFIED 7-6
  1. I '$D(XQALDELE)&'$D(XQALFWD),"Ss"[$E(XQII) D CHKSURO S XQX1=-1 Q
  1. I '$D(XQALDELE)&'$D(XQALFWD),"Dd"[$E(XQII) D ASKDEL S XQX1=-2 Q ; MODIFIED 7-6
  1. I '$D(XQALDELE),"Rr"[$E(XQII) S XQX1=-2 Q
  1. I "Aa"[$E(XQII) S X="1-"_XQACNT,DIR(0)="LV^1:"_XQACNT D ^DIR K DIR,XQX1 M XQX1=Y S XQII="" K Y ;Merge list from Y
  1. I XQII'="","Ii"[$E(XQII) S XQX1(0)="",XQX2=0,XQII="" F XQK=0:0 S XQK=$O(^TMP("XQ",$J,"XQA1",XQK)) S:XQK'>0 XQX1=XQX1(0) Q:XQK'>0 I $P(^(XQK),U,7,8)="^ " S XQX1(XQX2)=XQX1(XQX2)_XQK_"," S:$L(XQX1(XQX2))>240 XQX2=XQX2+1,XQX1(XQX2)=""
  1. I XQII="" Q
  1. S X=XQII,DIR(0)="LV^1:"_XQK D ^DIR I '$D(Y) W $C(7)," ??" D HELP G ASK ;Use of 'LV' is special
  1. K XQX1 M XQX1=Y K Y S Y=XQX1 ;Merge list from Y
  1. Q
  1. ;
  1. WAIT(IFN) ;Wait for user input if last alert is INFO and next isn't.
  1. ; ZEXCEPT: IOF,IOSL,XQALAST
  1. N X,YY Q:$G(XQXOUT)
  1. S X=$G(^TMP("XQ",$J,"XQA1",IFN)),YY=$P(X,U,7,8),YY=$S(YY="^ ":"I",YY="^":"O",1:"R")
  1. I $G(XQALAST)="I","OR"[YY D WAIT2
  1. I YY="I",$Y+4>IOSL D WAIT2 W @IOF
  1. S XQALAST=YY
  1. Q
  1. ;
  1. WAIT2 ;Wait for user input before continuing
  1. ; ZEXCEPT: XQXOUT
  1. N DIR,Y,DIROUT,DIRUT S DIR(0)="E",DIR("?")="The next ALERT may cause the loss of info on the screen."
  1. D ^DIR S:$D(DIRUT) XQXOUT=1
  1. Q
  1. ;
  1. HELP ;
  1. ; ZEXCEPT: XQALDELE,XQALFWD,XQI,XQK
  1. W !!,"YOU MAY ENTER:",!?3,$S(XQK>1:"One or more numbers",1:"A number")," in the range 1 to ",XQK," to select specific alert(s)"
  1. W !?6,"for "_$S($D(XQALDELE):"DELETION.",$D(XQALFWD):"FORWARDING",1:"processing.") W:XQK>1 " This may be a series of numbers, e.g., 2,3,6-9"
  1. W !?3,"A to "_$S($D(XQALDELE):"DELETE",$D(XQALFWD):"FORWARD",1:"process")," all of the pending alerts in the order shown."
  1. W:'$D(XQALDELE)&'$D(XQALFWD) !?3,"I to process all of the INFORMATION ONLY alerts, if any, without further ado."
  1. W:'$D(XQALDELE)&'$D(XQALFWD) !?3,"S to add or remove a surrogate to receive alerts for you"
  1. W:'$D(XQALDELE)&'$D(XQALFWD) !?3,"F to forward one or more specific alerts. Forwarding may be as an ALERT",!,"to specific user(s) and/or mail group(s), or as a MAIL MESSAGE, or to a",!,"specific PRINTER."
  1. W:'$D(XQALDELE)&'$D(XQALFWD) !?3,"D to delete specific alerts (some alerts may not be deleted)"
  1. W:'$D(XQALDELE)&'$D(XQALFWD) !?3,"P to print a copy of the pending alerts on a printer"
  1. W:'$D(XQALDELE)&'$D(XQALFWD) !?3,"M to receive a MailMan message containing a copy of these pending alerts"
  1. W:'$D(XQALDELE) !?3,"R to Redisplay the available alerts"
  1. W !?3,"^ to exit"
  1. I XQI W !?5,"or RETURN to see additional pending ALERTS"
  1. W !!
  1. Q
  1. ;
  1. SORT ;Sort and remove display only
  1. ; ZEXCEPT: XQAUSER,XQACNT,XQAREV - global variable
  1. ; Unit test: P602T3^ZZUTXQA6
  1. N XQZ,XQZ1,XQZ4,XQI,XQK,XQX,XQJ
  1. K ^TMP("XQ",$J,"XQA")
  1. K ^TMP("XQ",$J,"XQA1")
  1. F XQI=0:0 S XQI=$O(^XTV(8992,XQAUSER,"XQA",XQI)) Q:(XQI'>0)!(XQACNT>10000) D
  1. . S XQX=^XTV(8992,XQAUSER,"XQA",XQI,0) ; zero node for the alert
  1. . S XQZ=$G(^XTV(8992,XQAUSER,"XQA",XQI,1)) ; data for alert
  1. . S XQZ1=$G(^XTV(8992,XQAUSER,"XQA",XQI,2)) ; comment for display
  1. . S XQZ4=$O(^XTV(8992,XQAUSER,"XQA",XQI,4,0)) ; long info text
  1. . S XQJ=$P(XQX,U,7,8) K:XQJ=U ^XTV(8992,XQAUSER,"XQA",XQI) I XQJ'=U D
  1. . . S XQACNT=XQACNT+1
  1. . . I $$CHKCRIT^XQALSUR2(XQX) D
  1. . . . S XQJ=$S(XQAREV:499999-XQACNT,1:XQACNT) ; critical alert
  1. . . E D
  1. . . . S XQJ=$S(XQAREV:999999-XQACNT,1:500000+XQACNT) ; normal alert
  1. . . S ^TMP("XQ",$J,"XQA",XQJ)=XQX ; zero node for the alert
  1. . . S ^TMP("XQ",$J,"XQA",XQJ,1)=XQI ; IEN of the alert
  1. . . S ^TMP("XQ",$J,"XQA",XQJ,2)=XQZ ; data for the alert
  1. . . S ^TMP("XQ",$J,"XQA",XQJ,3)=XQZ1 ; comment for display
  1. . . S ^TMP("XQ",$J,"XQA",XQJ,4)=XQZ4 ; long info text
  1. S XQK=0 F XQI=0:0 S XQI=$O(^TMP("XQ",$J,"XQA",XQI)) Q:XQI'>0 S XQK=XQK+1 M ^TMP("XQ",$J,"XQA1",XQK)=^TMP("XQ",$J,"XQA",XQI)
  1. K ^TMP("XQ",$J,"XQA")
  1. S XQK=0 F XQI=0:0 S XQI=$O(^TMP("XQ",$J,"XQA1",XQI)) Q:XQI'>0 S XQK=XQK+1 M ^TMP("XQ",$J,"XQA",XQK)=^TMP("XQ",$J,"XQA1",XQI)
  1. Q
  1. ;
  1. ASKDEL ;
  1. ; ZEXCEPT: XQAUSER,XQX1 - global variables
  1. N DIR,XQALDELE,XQX1COPY,XQAID,DA,XQAKILL,XQXOUT,XQAUSERD,XQALVALU,Y
  1. S XQALDELE=1
  1. K XQX1
  1. D DOIT^XQALERT1
  1. K XQALDELE S XQAUSERD=1
  1. I $D(XQX1),XQX1>0 D
  1. . M XQX1COPY=XQX1
  1. . F Q:XQX1="" S DA=+XQX1,XQX1=$P(XQX1,",",2,99) D I XQX1="" S Y=$O(XQX1(0)) I Y>0 S XQX1=XQX1(Y) K XQX1(Y)
  1. . . S XQAID=$P(^TMP("XQ",$J,"XQA1",DA),U,2),XQALVALU=^(DA),XQAKILL=1
  1. . . I $P(XQALVALU,U,8)=" "!$P(XQALVALU,U,10) D
  1. . . . I XQAID="" K ^XTV(8992,XQAUSER,"XQA",+^TMP("XQ",$J,"XQA1",DA,1))
  1. . . . I XQAID'="" D DELETE^XQALDEL
  1. . . . K ^TMP("XQ",$J,"XQA1",DA),^TMP("XQ",$J,"XQA",(999999-DA))
  1. . K XQX1 M XQX1=XQX1COPY S XQAID=0
  1. . F Q:XQX1="" S DA=+XQX1,XQX1=$P(XQX1,",",2,99) D I XQX1="" S Y=$O(XQX1(0)) I Y>0 S XQX1=XQX1(Y) K XQX1(Y)
  1. . . I $D(^TMP("XQ",$J,"XQA1",DA)) W:'XQAID !!,"Unable to delete alerts which require action: ",DA W:XQAID ",",DA S XQAID=1
  1. . I XQAID=1 K DIR S DIR(0)="E" D ^DIR K DIR
  1. K XQX1,XQAKILL
  1. Q
  1. ;
  1. FRWRDONE ;
  1. ; ZEXCEPT: XQAID - global variable
  1. N XQX1,XQALFWDL S XQALFWDL(1)=XQAID
  1. N XQAID
  1. D FWDONE^XQALFWD
  1. Q