Changeset 623 for WorldVistAEHR/trunk/r/KERNEL-XU-A4A7-USC-XG-XLF-XNOA-XPD-XQ-XVIR-ZI-ZOSF-ZOSV-ZT-ZU-%Z-XIP--XQAB--XUC--XUR--ZIN--ZTED/XQALSURO.m
- Timestamp:
- Dec 4, 2009, 12:11:15 AM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
WorldVistAEHR/trunk/r/KERNEL-XU-A4A7-USC-XG-XLF-XNOA-XPD-XQ-XVIR-ZI-ZOSF-ZOSV-ZT-ZU-%Z-XIP--XQAB--XUC--XUR--ZIN--ZTED/XQALSURO.m
r613 r623 1 XQALSURO ;ISC-SF.SEA/JLI - SURROGATES FOR ALERTS ;3/17/08 15:20 2 ;;8.0;KERNEL;**114,125,173,285,366,443**;Jul 10, 1995;Build 4 3 ;; 4 Q 5 OTHRSURO ; OPT:- XQALERT SURROGATE SET/REMOVE -- OTHERS SPECIFY SURROGATE FOR SELECTED USER 6 N XQAUSER,DIR,Y 7 S DIR(0)="PD^200:AEMQ",DIR("A",1)="SURROGATE related to which" 8 S DIR("A")="NEW PERSON entry" 9 D ^DIR K DIR Q:Y'>0 W " ",$P(Y,U,2) 10 S XQAUSER=+Y 11 G SURROGAT 12 Q 13 ; 14 SURROGAT ; USER SPECIFICATION OF SURROGATE 15 I '$D(XQAUSER) N XQAUSER S XQAUSER=DUZ 16 D SURRO1^XQALSUR1(XQAUSER) 17 Q 18 CYCLIC(XQALSURO,XQAUSER,XQASTRT,XQAEND) ; code added to prevent cyclical surrogates 19 I '$$ACTIVE^XUSER(XQALSURO) Q "You cannot have an INACTIVE USER ("_XQALSURO_") as a surrogate!" ;P443 20 I XQALSURO=XQAUSER Q "You cannot specify yourself as your own surrogate!" ; moved in P443 21 I $G(XQASTRT)>0 Q $$DCYCLIC^XQALSUR1(XQALSURO,XQAUSER,XQASTRT,$G(XQAEND)) 22 N XQALSTRT 23 S XQALSTRT=$$CURRSURO(XQALSURO) I XQALSTRT>0 D 24 . I XQALSTRT=XQAUSER S XQALSURO="YOU are designated as the surrogate for this user ("_XQALSURO_") - can't do it!" Q 25 . F S XQALSTRT=$$CURRSURO(XQALSTRT) Q:XQALSTRT'>0 I XQALSTRT=XQAUSER S XQALSURO="This forms a circle which leads back to you - can't do it!" Q 26 . Q 27 Q XQALSURO 28 ; 29 SETSURO(XQAUSER,XQALSURO,XQALSTRT,XQALEND) ; Use SETSURO1 instead 30 N XQALVAL ; P443 31 S XQALVAL=$$SETSURO1(XQAUSER,XQALSURO,$G(XQALSTRT),$G(XQALEND)) ; P443 32 Q 33 ; 34 SETSUROX(XQAUSER,XQALSURO,XQALSTRT,XQALEND) ; SETSURO CODE MOVED TO HERE TO PERMIT AN ERROR TO BE GENERATED AT THE OLD ENTRY POINT 35 N XQALFM,XQALIEN,XQAIENS 36 I $G(XQAUSER)'>0 Q 37 I $G(XQALSURO)'>0 Q 38 I '$D(^XTV(8992,XQAUSER,0)) D 39 . N XQALFM,XQALFM1 40 . S XQALFM1(1)=XQAUSER 41 . S XQALFM(8992,"+1,",.01)=XQAUSER 42 . D UPDATE^DIE("","XQALFM","XQALFM1") 43 . Q 44 S XQAIENS=XQAUSER_"," 45 ; P366 - force no start date/time to NOW 46 ; P366 - change to force anything less than NOW to NOW - 8/22/05 47 I $G(XQALSTRT)<$$NOW^XLFDT() S XQALSTRT=$$NOW^XLFDT() 48 ; P366 - add values to new multiple 49 S XQALFM(8992.02,"+1,"_XQAIENS,.01)=XQALSTRT 50 S XQALFM(8992.02,"+1,"_XQAIENS,.02)=XQALSURO 51 I XQALEND>0 S XQALFM(8992.02,"+1,"_XQAIENS,.03)=XQALEND 52 K XQALIEN D UPDATE^DIE("","XQALFM","XQALIEN") 53 ; P366 - if start date time is already in effect - place in old locations to make active 54 I XQALSTRT'>$$NOW^XLFDT() D ACTIVATE(XQAUSER,XQALIEN(1)) 55 N XQAMESG,XMSUB,XMTEXT 56 S XQAMESG(1,0)="You have been specified as a surrogate recipient for alerts for" 57 S XQAMESG(2,0)=$$GET1^DIQ(200,XQAIENS,.01,"E")_" (IEN="_XQAUSER_") effective "_$$FMTE^XLFDT(XQALSTRT) 58 I $G(XQALEND)'>0 S XQAMESG(2,0)=XQAMESG(2,0)_"." 59 E S XQAMESG(3,0)="until "_$$FMTE^XLFDT(XQALEND) 60 S XMSUB="Surrogate Recipient for "_$$GET1^DIQ(200,XQAIENS,.01,"E") 61 S XMTEXT="XQAMESG(" 62 ; ZEXCEPT: XTMUNIT - Defined if unit tests are being run 63 D:'$D(XTMUNIT) SENDMESG 64 Q 65 ; 66 ACTIVATE(XQAUSER,XQALIEN) ; activates a surrogate 67 N X0,XQALFM,XQALSURO,XQALSTRT,XQALEND 68 S X0=$G(^XTV(8992,XQAUSER,2,XQALIEN,0)) Q:X0="" S XQALSTRT=$P(X0,U),XQALSURO=$P(X0,U,2),XQALEND=$P(X0,U,3) 69 S X0=^XTV(8992,XQAUSER,0) 70 I $P(X0,U,2)>0,$P(X0,U,3)'>$$NOW^XLFDT() D REMVSURO(XQAUSER) ; If we are activaing a new surrogate, if one exists simply remove. 71 K XQALFM S XQALFM(8992,XQAUSER_",",.03)=XQALSTRT 72 S XQALFM(8992,XQAUSER_",",.02)=XQALSURO 73 S XQALFM(8992,XQAUSER_",",.04)=$S($G(XQALEND)>0:XQALEND,1:"@") 74 D FILE^DIE("","XQALFM") 75 Q 76 ; 77 ; usage $$SETSURO1(XQAUSER,XQALSURO,XQALSTRT,XQALEND) returns 0 if invalid, otherwise > 0 78 SETSURO1(XQAUSER,XQALSURO,XQALSTRT,XQALEND) ; SR. This should be used instead of SETSURO 79 I $G(XQALSTRT)'>0 S XQALSTRT=$$NOW^XLFDT() 80 N XQAVAL 81 S XQAVAL=$$CYCLIC(XQALSURO,XQAUSER,XQALSTRT,$G(XQALEND)) I XQAVAL'>0 Q XQAVAL ; Can't use as surrogate 82 D SETSUROX(XQAUSER,XQALSURO,XQALSTRT,$G(XQALEND)) ; P443 83 Q XQALSURO 84 ; 85 CHKREMV ; 86 N DIR,XQAI,XQASLIST,XQAVAL,YVAL,Y 87 ; ZEXCEPT: XQAUSER (EXTERNAL VALUE) 88 D SUROLIST^XQALSUR1(XQAUSER,.XQASLIST) 89 W !,"Current Surrogate(s):",?35,"START DATE",?60,"END DATE" 90 F XQAI=0:0 S XQAI=$O(XQASLIST(XQAI)) Q:XQAI'>0 W !,XQAI," ",$P(XQASLIST(XQAI),U,2),?35,$$FMTE^XLFDT($P(XQASLIST(XQAI),U,3)),?60,$$FMTE^XLFDT($P(XQASLIST(XQAI),U,4)) 91 W ! I XQASLIST'>0 W !," No current surrogates",! Q 92 S DIR(0)="Y",DIR("A")="Do you want to REMOVE "_$S(XQASLIST>1:"a",1:"THIS")_" surrogate recipient",DIR("?")="A surrogate will receive your alerts until they are removed as surrogate." D ^DIR K DIR Q:Y'>0 93 S Y=1 I XQASLIST>1 S DIR(0)="L^1:"_XQASLIST,DIR("A")="Enter a list (comma separated, e.g., 1,2) of the surrogate(s) to remove" D ^DIR K DIR 94 I Y>0 S YVAL=Y F XQAI=1:1 S XQAVAL=+$P(YVAL,",",XQAI) Q:XQAVAL'>0 D REMVSURO(XQAUSER,$P(XQASLIST(XQAVAL),U),$P(XQASLIST(XQAVAL),U,3)) 95 Q 96 ; 97 ; P366 - added OPTIONAL second and third arguments to permit deletion of a specific pending surrogate and start date 98 REMVSURO(XQAUSER,XQALSURO,XQALSTRT) ; SR - ends the currently active surrogate relationship 99 I $G(XQAUSER)'>0 Q 100 D REMVSURO^XQALSUR1(XQAUSER,$G(XQALSURO),$G(XQALSTRT)) 101 Q 102 ; 103 ; P366 - added OPTIONAL second and third arguments to determine surrogate for specified time range 104 CURRSURO(XQAUSER,XQASTRT,XQAEND) ;SR. - returns current surrogate for user or -1 usage $$CURRSURO^XQALSURO(DUZ) 105 N X,ACTIVE,XQANOW,XQASTR1,XQAIVAL,XQA0,XQAI 106 D CHEKSUBS^XQALSUR2(XQAUSER) 107 I $G(XQASTRT)>0 Q $$DATESURO^XQALSUR1(XQAUSER,XQASTRT,$G(XQAEND)) ; P366 - check for current in specified date/times 108 ; 109 ; P366 - find the latest start time which is now or past or the first one in the future 110 S XQANOW=$$NOW^XLFDT() D 111 . S XQAIVAL=0,XQASTR1=0 112 . F XQASTRT=0:0 S XQASTRT=$O(^XTV(8992,XQAUSER,2,"B",XQASTRT)) Q:XQASTRT'>0 Q:XQASTRT'<XQANOW S XQASTR1=XQASTRT F XQAI=0:0 S XQAI=$O(^XTV(8992,XQAUSER,2,"B",XQASTRT,XQAI)) Q:XQAI'>0 D 113 . . S XQAEND=$P(^XTV(8992,XQAUSER,2,XQAI,0),U,3) I (XQAEND="")!(XQAEND>XQANOW) S XQAIVAL=XQAI 114 . . Q 115 . ; to be compatible with the past, if there is not a current surrogate, show the next scheduled on the zero node if there is one 116 . I XQAIVAL=0 S XQASTRT=$O(^XTV(8992,XQAUSER,2,"B",XQASTR1)) Q:XQASTRT="" F XQAI=0:0 S XQAI=$O(^XTV(8992,XQAUSER,2,"B",XQASTRT,XQAI)) Q:XQAI'>0 D Q:XQAIVAL>0 117 . . S XQAEND=$P(^XTV(8992,XQAUSER,2,XQAI,0),U,3) I (XQAEND="")!(XQAEND>XQANOW) S XQAIVAL=XQAI 118 . . Q 119 . I XQAIVAL>0 S XQA0=^XTV(8992,XQAUSER,2,XQAIVAL,0),XQASTRT=^XTV(8992,XQAUSER,0) I ($P(XQA0,U,2)'=$P(XQASTRT,U,2))!($P(XQA0,U)'=$P(XQASTRT,U,3))!(+$P(XQA0,U,3)'=+$P(XQASTRT,U,4)) D ACTIVATE(XQAUSER,XQAIVAL) 120 . Q 121 ; P366 - end 122 S X=$G(^XTV(8992,XQAUSER,0)) 123 ; now check for a CURRENT surrogate, already started and not expired or cyclic 124 I $P(X,U,2)>0,+$P(X,U,3)'>XQANOW D I $P($G(^XTV(8992,XQAUSER,0)),U,2)>0 Q +$P(^XTV(8992,XQAUSER,0),U,2) 125 . N DATE ; Get Current date/time to check date/times if present 126 . ; FOLLOWING LINES MODIFIED IN P443 TO ELIMINATE A STACK ERROR WHEN SURROGATE WAS CIRCULAR 127 . ; Current Date/time past End date for surrogate 128 . S DATE=$P(X,U,4) I (DATE>0&(DATE<XQANOW)) D REMVSURO(XQAUSER) Q 129 . N XQASURO,XQASURO1 S XQASURO1=+$P(^XTV(8992,XQAUSER,0),U,2) 130 . ; REMOVE IF SURROGATE IS USER 131 . I XQASURO1=XQAUSER D REMVSURO(XQAUSER) Q 132 . N XQALLIST S XQALLIST(XQAUSER)="" 133 . ; REMOVE IF CYCLES BACK TO USER - thought about removing inactive, but best to let those be handled by groups for unprocessed alerts 134 . F S XQASURO=$P($G(^XTV(8992,XQASURO1,0)),U,2) Q:XQASURO'>0 Q:'$$ISACTIVE(XQASURO) S XQASURO1=XQASURO D 135 . . I $D(XQALLIST(XQASURO)) D REMVSURO(XQASURO) S XQASURO1=XQAUSER K XQALLIST S XQALLIST(XQAUSER)="" Q 136 . . S XQALLIST(XQASURO1)="" 137 . . Q 138 . ; END OF P443 MODIFICATION 139 . Q 140 Q -1 141 ; 142 ISACTIVE(XQAUSER) ; checks for whether a surrogate relationship is active or not (returns 0 or 1) 143 N DATA 144 S DATA=$G(^XTV(8992,XQAUSER,0)) Q:$P(DATA,U,2)="" 0 ; NO SURROGATE SPECIFIED 145 I $P(DATA,U,3)>0,$P(DATA,U,3)>$$NOW^XLFDT() Q 0 ; START DATE/TIME NOT YET 146 I $P(DATA,U,4)>0,$P(DATA,U,4)<$$NOW^XLFDT() Q 0 ; PAST END DATE/TIME 147 Q 1 148 ; 149 ACTVSURO(XQAUSER) ;SR. - returns the actual surrogate at this time 150 N CURRSURO,NEXTSURO,SURODATA,NOW 151 S NOW=$$NOW^XLFDT() 152 S CURRSURO=$$CURRSURO(XQAUSER),SURODATA=$$GETSURO(XQAUSER) I (CURRSURO'>0)!(+$P(SURODATA,U,3)>NOW)!('(+$$ACTIVE^XUSER(CURRSURO))) Q -1 153 F S NEXTSURO=$$CURRSURO(CURRSURO),SURODATA=$$GETSURO(CURRSURO) Q:NEXTSURO'>0 Q:+$P(SURODATA,U,3)>NOW Q:'(+$$ACTIVE^XUSER(NEXTSURO)) S CURRSURO=NEXTSURO 154 Q CURRSURO 155 ; 156 GETSURO(XQAUSER) ;SR. - returns data for surrogate for user including times 157 I $$CURRSURO(XQAUSER)'>0 Q "" 158 N GLOBREF,IENS,X 159 S IENS=XQAUSER_",",GLOBREF=$NA(^TMP($J,"XQALSURO")) K @GLOBREF 160 D GETS^DIQ(8992,IENS,".02;.03;.04","IE",GLOBREF) 161 S GLOBREF=$NA(@GLOBREF@(8992,IENS)) 162 S X=$G(@GLOBREF@(.02,"I"))_U_$G(@GLOBREF@(.02,"E"))_U_$G(@GLOBREF@(.03,"I"))_U_$G(@GLOBREF@(.04,"I")) 163 K @GLOBREF 164 Q X 165 ; 166 GETFOR ;OPT. 167 N XQAUSER,VALUES,XQACNT,DIR,DIRUT,I,Y 168 S DIR(0)="PD^200:AEMQ",DIR("A",1)="View Users who have selected a specified User as their Surrogate." 169 S DIR("A")="Select User (NEW PERSON entry)" 170 D ^DIR K DIR Q:Y'>0 W " ",$P(Y,U,2) 171 S XQAUSER=+Y 172 D SUROFOR(.VALUES,XQAUSER) I VALUES'>0 W !,"No entries found.",!! Q 173 S XQACNT=0 K DIRUT F I=0:0 S I=$O(VALUES(I)) Q:I'>0 D:(XQACNT>(IOSL-4)) Q:$D(DIRUT) W !,?5,$P(VALUES(I),U,2) S XQACNT=XQACNT+1 174 . S DIR(0)="E" D ^DIR K DIR 175 . Q 176 K DIRUT 177 Q 178 ; 179 SUROLIST(XQAUSER,XQALIST) ; SR. returns list of current and scheduled surrogates for XQAUSER 180 D SUROLIST^XQALSUR1(XQAUSER,.XQALIST) 181 Q 182 ; 183 SUROFOR(LIST,XQAUSER) ;SR. - returns list of users XQAUSER is acting as a surrogate for 184 I $G(XQAUSER)="" Q 185 N I,COUNT S I=0,COUNT=0 F S I=$O(^XTV(8992,"AC",XQAUSER,I)) Q:I'>0 I $$CURRSURO(I)>0 D 186 . S COUNT=COUNT+1,LIST(COUNT)=I_U_$$GET1^DIQ(200,(I_","),".01","E")_U_$$GET1^DIQ(8992,(I_","),".03","E")_U_$$GET1^DIQ(8992,(I_","),".04","E") 187 S LIST=COUNT 188 Q 189 ; 190 SENDMESG ; 191 N XMY,XMDUZ,XMCHAN 192 ; ZEXCEPT: XQALSURO (EXTERNAL VALUE) 193 S XMY(XQALSURO)="",XMDUZ=.5 194 D ^XMD 195 Q 1 XQALSURO ;ISC-SF.SEA/JLI - SURROGATES FOR ALERTS ;9/6/05 15:13 2 ;;8.0;KERNEL;**114,125,173,285,366**;Jul 10, 1995 3 ;; 4 Q 5 OTHRSURO ; OPT:- XQALERT SURROGATE SET/REMOVE -- OTHERS SPECIFY SURROGATE FOR SELECTED USER 6 N XQAUSER,DIR,Y 7 S DIR(0)="PD^200:AEMQ",DIR("A",1)="SURROGATE related to which" 8 S DIR("A")="NEW PERSON entry" 9 D ^DIR K DIR Q:Y'>0 W " ",$P(Y,U,2) 10 S XQAUSER=+Y 11 G SURROGAT 12 Q 13 ; 14 SURROGAT ; USER SPECIFICATION OF SURROGATE 15 I '$D(XQAUSER) N XQAUSER S XQAUSER=DUZ 16 D SURRO1^XQALSUR1(XQAUSER) 17 Q 18 ; P366 - optional start and end dates added to permit identification of cyclical surrogates in specific times 19 CYCLIC(XQALSURO,XQAUSER,XQASTRT,XQAEND) ; code added to prevent cyclical surrogates 20 I $G(XQASTRT)>0 Q $$DCYCLIC^XQALSUR1(XQALSURO,XQAUSER,XQASTRT,$G(XQAEND)) 21 N XQALSTRT 22 I XQALSURO=XQAUSER Q "You cannot specify yourself as your own surrogate!" 23 S XQALSTRT=$$CURRSURO(XQALSURO) I XQALSTRT>0 D 24 . I XQALSTRT=XQAUSER S XQALSURO="YOU are designated as the surrogate for this user - can't do it!" Q 25 . F S XQALSTRT=$$CURRSURO(XQALSTRT) Q:XQALSTRT'>0 I XQALSTRT=XQAUSER S XQALSURO="This forms a circle which leads back to you - can't do it!" Q 26 . Q 27 Q XQALSURO 28 ; 29 SETSURO(XQAUSER,XQALSURO,XQALSTRT,XQALEND) ; SR 30 N XQALFM,XQALIEN,XQAIENS 31 I $G(XQAUSER)'>0 Q 32 I $G(XQALSURO)'>0 Q 33 I '$D(^XTV(8992,XQAUSER,0)) D 34 . N XQALFM,XQALFM1 35 . S XQALFM1(1)=XQAUSER 36 . S XQALFM(8992,"+1,",.01)=XQAUSER 37 . D UPDATE^DIE("","XQALFM","XQALFM1") 38 . Q 39 S XQAIENS=XQAUSER_"," 40 ; P366 - force no start date/time to NOW 41 ; P366 - change to force anything less than NOW to NOW - 8/22/05 42 I $G(XQALSTRT)<$$NOW^XLFDT() S XQALSTRT=$$NOW^XLFDT() 43 ; P366 - add values to new multiple 44 S XQALFM(8992.02,"+1,"_XQAIENS,.01)=XQALSTRT 45 S XQALFM(8992.02,"+1,"_XQAIENS,.02)=XQALSURO 46 I XQALEND>0 S XQALFM(8992.02,"+1,"_XQAIENS,.03)=XQALEND 47 K XQALIEN D UPDATE^DIE("","XQALFM","XQALIEN") 48 ; P366 - if start date time is already in effect - place in old locations to make active 49 I XQALSTRT'>$$NOW^XLFDT() D ACTIVATE(XQAUSER,XQALIEN(1)) 50 N XQAMESG,XMSUB,XMTEXT 51 S XQAMESG(1,0)="You have been specified as a surrogate recipient for alerts for" 52 S XQAMESG(2,0)=$$GET1^DIQ(200,XQAIENS,.01,"E")_" (IEN="_XQAUSER_") effective "_$$FMTE^XLFDT(XQALSTRT) 53 I $G(XQALEND)'>0 S XQAMESG(2,0)=XQAMESG(2,0)_"." 54 E S XQAMESG(3,0)="until "_$$FMTE^XLFDT(XQALEND) 55 S XMSUB="Surrogate Recipient for "_$$GET1^DIQ(200,XQAIENS,.01,"E") 56 S XMTEXT="XQAMESG(" 57 D:'$D(XQATEST) SENDMESG 58 Q 59 ; 60 ACTIVATE(XQAUSER,XQALIEN) ; activates a surrogate 61 N X0,XQALFM,XQALSURO,XQALSTRT,XQALEND 62 S X0=$G(^XTV(8992,XQAUSER,2,XQALIEN,0)) Q:X0="" S XQALSTRT=$P(X0,U),XQALSURO=$P(X0,U,2),XQALEND=$P(X0,U,3) 63 S X0=^XTV(8992,XQAUSER,0) 64 I $P(X0,U,2)>0,$P(X0,U,3)'>$$NOW^XLFDT() D REMVSURO(XQAUSER) ; If we are activaing a new surrogate, if one exists simply remove. 65 K XQALFM S XQALFM(8992,XQAUSER_",",.03)=XQALSTRT 66 S XQALFM(8992,XQAUSER_",",.02)=XQALSURO 67 S XQALFM(8992,XQAUSER_",",.04)=$S($G(XQALEND)>0:XQALEND,1:"@") 68 D FILE^DIE("","XQALFM") 69 Q 70 ; 71 ; usage $$SETSURO1(XQAUSER,XQALSURO,XQALSTRT,XQALEND) returns 0 if invalid, otherwise > 0 72 SETSURO1(XQAUSER,XQALSURO,XQALSTRT,XQALEND) ; SR. This should be used instead of SETSURO 73 I $G(XQALSTRT)'>0 S XQALSTRT=$$NOW^XLFDT() 74 N XQAVAL 75 S XQAVAL=$$CYCLIC(XQALSURO,XQAUSER,XQALSTRT,$G(XQALEND)) I XQAVAL'>0 Q XQAVAL ; Can't use as surrogate 76 D SETSURO(XQAUSER,XQALSURO,XQALSTRT,$G(XQALEND)) 77 Q XQALSURO 78 ; 79 CHKREMV ; 80 N DIR,XQAI,XQASLIST,XQAVAL,YVAL,Y 81 ; ZEXCEPT: XQAUSER (EXTERNAL VALUE) 82 D SUROLIST^XQALSUR1(XQAUSER,.XQASLIST) 83 W !,"Current Surrogate(s):",?35,"START DATE",?60,"END DATE" 84 F XQAI=0:0 S XQAI=$O(XQASLIST(XQAI)) Q:XQAI'>0 W !,XQAI," ",$P(XQASLIST(XQAI),U,2),?35,$$FMTE^XLFDT($P(XQASLIST(XQAI),U,3)),?60,$$FMTE^XLFDT($P(XQASLIST(XQAI),U,4)) 85 W ! I XQASLIST'>0 W !," No current surrogates",! Q 86 S DIR(0)="Y",DIR("A")="Do you want to REMOVE "_$S(XQASLIST>1:"a",1:"THIS")_" surrogate recipient",DIR("?")="A surrogate will receive your alerts until they are removed as surrogate." D ^DIR K DIR Q:Y'>0 87 S Y=1 I XQASLIST>1 S DIR(0)="L^1:"_XQASLIST,DIR("A")="Enter a list (comma separated, e.g., 1,2) of the surrogate(s) to remove" D ^DIR K DIR 88 I Y>0 S YVAL=Y F XQAI=1:1 S XQAVAL=+$P(YVAL,",",XQAI) Q:XQAVAL'>0 D REMVSURO(XQAUSER,$P(XQASLIST(XQAVAL),U),$P(XQASLIST(XQAVAL),U,3)) 89 Q 90 ; 91 ; P366 - added OPTIONAL second and third arguments to permit deletion of a specific pending surrogate and start date 92 REMVSURO(XQAUSER,XQALSURO,XQALSTRT) ; SR - ends the currently active surrogate relationship 93 I $G(XQAUSER)'>0 Q 94 D REMVSURO^XQALSUR1(XQAUSER,$G(XQALSURO),$G(XQALSTRT)) 95 Q 96 ; 97 ; P366 - added OPTIONAL second and third arguments to determine surrogate for specified time range 98 CURRSURO(XQAUSER,XQASTRT,XQAEND) ;SR. - returns current surrogate for user or -1 usage $$CURRSURO^XQALSURO(DUZ) 99 N X,ACTIVE,XQANOW,XQASTR1,XQAIVAL,XQA0,XQAI 100 D CHEKSUBS^XQALSUR2(XQAUSER) 101 I $G(XQASTRT)>0 Q $$DATESURO^XQALSUR1(XQAUSER,XQASTRT,$G(XQAEND)) ; P366 - check for current in specified date/times 102 ; 103 ; P366 - find the latest start time which is now or past or the first one in the future 104 S XQANOW=$$NOW^XLFDT() 105 ;I $P($G(^XTV(8992,XQAUSER,0)),U,2)'>0 D 106 D 107 . S XQAIVAL=0,XQASTR1=0 108 . F XQASTRT=0:0 S XQASTRT=$O(^XTV(8992,XQAUSER,2,"B",XQASTRT)) Q:XQASTRT'>0 Q:XQASTRT'<XQANOW S XQASTR1=XQASTRT F XQAI=0:0 S XQAI=$O(^XTV(8992,XQAUSER,2,"B",XQASTRT,XQAI)) Q:XQAI'>0 D 109 . . S XQAEND=$P(^XTV(8992,XQAUSER,2,XQAI,0),U,3) I (XQAEND="")!(XQAEND>XQANOW) S XQAIVAL=XQAI 110 . . Q 111 . ; to be compatible with the past, if there is not a current surrogate, show the next scheduled on the zero node if there is one 112 . I XQAIVAL=0 S XQASTRT=$O(^XTV(8992,XQAUSER,2,"B",XQASTR1)) Q:XQASTRT="" F XQAI=0:0 S XQAI=$O(^XTV(8992,XQAUSER,2,"B",XQASTRT,XQAI)) Q:XQAI'>0 D Q:XQAIVAL>0 113 . . S XQAEND=$P(^XTV(8992,XQAUSER,2,XQAI,0),U,3) I (XQAEND="")!(XQAEND>XQANOW) S XQAIVAL=XQAI 114 . . Q 115 . I XQAIVAL>0 S XQA0=^XTV(8992,XQAUSER,2,XQAIVAL,0),XQASTRT=^XTV(8992,XQAUSER,0) I ($P(XQA0,U,2)'=$P(XQASTRT,U,2))!($P(XQA0,U)'=$P(XQASTRT,U,3))!(+$P(XQA0,U,3)'=+$P(XQASTRT,U,4)) D ACTIVATE(XQAUSER,XQAIVAL) 116 . Q 117 ; P366 - end 118 S X=$G(^XTV(8992,XQAUSER,0)) 119 ; now check for a CURRENT surrogate, already started and not expired or cyclic 120 I $P(X,U,2)>0,+$P(X,U,3)'>XQANOW D I $P($G(^XTV(8992,XQAUSER,0)),U,2)>0 Q +$P(^XTV(8992,XQAUSER,0),U,2) 121 . N DATE ; Get Current date/time to check date/times if present 122 . ; Current Date/time past End date for surrogate or cyclic relationship remove checks for new surrogate 123 . S DATE=$P(X,U,4) I (DATE>0&(DATE<XQANOW))!('$$CYCLIC($P(X,U,2),XQAUSER)) D REMVSURO(XQAUSER) 124 . Q 125 Q -1 126 ; 127 ACTVSURO(XQAUSER) ;SR. - returns the actual surrogate at this time 128 N CURRSURO,NEXTSURO,SURODATA,NOW 129 S NOW=$$NOW^XLFDT() 130 S CURRSURO=$$CURRSURO(XQAUSER),SURODATA=$$GETSURO(XQAUSER) I (CURRSURO'>0)!(+$P(SURODATA,U,3)>NOW)!('(+$$ACTIVE^XUSER(CURRSURO))) Q -1 131 F S NEXTSURO=$$CURRSURO(CURRSURO),SURODATA=$$GETSURO(CURRSURO) Q:NEXTSURO'>0 Q:+$P(SURODATA,U,3)>NOW Q:'(+$$ACTIVE^XUSER(NEXTSURO)) S CURRSURO=NEXTSURO 132 Q CURRSURO 133 ; 134 GETSURO(XQAUSER) ;SR. - returns data for surrogate for user including times 135 I $$CURRSURO(XQAUSER)'>0 Q "" 136 N GLOBREF,IENS,X 137 S IENS=XQAUSER_",",GLOBREF=$NA(^TMP($J,"XQALSURO")) K @GLOBREF 138 D GETS^DIQ(8992,IENS,".02;.03;.04","IE",GLOBREF) 139 S GLOBREF=$NA(@GLOBREF@(8992,IENS)) 140 S X=$G(@GLOBREF@(.02,"I"))_U_$G(@GLOBREF@(.02,"E"))_U_$G(@GLOBREF@(.03,"I"))_U_$G(@GLOBREF@(.04,"I")) 141 K @GLOBREF 142 Q X 143 ; 144 GETFOR ;OPT. 145 N XQAUSER,VALUES,XQACNT,DIR,DIRUT,I,Y 146 S DIR(0)="PD^200:AEMQ",DIR("A",1)="View Users who have selected a specified User as their Surrogate." 147 S DIR("A")="Select User (NEW PERSON entry)" 148 D ^DIR K DIR Q:Y'>0 W " ",$P(Y,U,2) 149 S XQAUSER=+Y 150 D SUROFOR(.VALUES,XQAUSER) I VALUES'>0 W !,"No entries found.",!! Q 151 S XQACNT=0 K DIRUT F I=0:0 S I=$O(VALUES(I)) Q:I'>0 D:(XQACNT>(IOSL-4)) Q:$D(DIRUT) W !,?5,$P(VALUES(I),U,2) S XQACNT=XQACNT+1 152 . S DIR(0)="E" D ^DIR K DIR 153 . Q 154 K DIRUT 155 Q 156 ; 157 SUROLIST(XQAUSER,XQALIST) ; SR. returns list of current and scheduled surrogates for XQAUSER 158 D SUROLIST^XQALSUR1(XQAUSER,.XQALIST) 159 Q 160 ; 161 SUROFOR(LIST,XQAUSER) ;SR. - returns list of users XQAUSER is acting as a surrogate for 162 I $G(XQAUSER)="" Q 163 N I,COUNT S I=0,COUNT=0 F S I=$O(^XTV(8992,"AC",XQAUSER,I)) Q:I'>0 I $$CURRSURO(I)>0 D 164 . S COUNT=COUNT+1,LIST(COUNT)=I_U_$$GET1^DIQ(200,(I_","),".01","E")_U_$$GET1^DIQ(8992,(I_","),".03","E")_U_$$GET1^DIQ(8992,(I_","),".04","E") 165 S LIST=COUNT 166 Q 167 ; 168 SENDMESG ; 169 N XMY,XMDUZ,XMCHAN 170 ; ZEXCEPT: XQALSURO (EXTERNAL VALUE) 171 S XMY(XQALSURO)="",XMDUZ=.5 172 D ^XMD 173 Q
Note:
See TracChangeset
for help on using the changeset viewer.