Ignore:
Timestamp:
Dec 4, 2009, 12:11:15 AM (14 years ago)
Author:
George Lilly
Message:

revised back to 6/30/08 version

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/XQALSUR1.m

    r613 r623  
    1 XQALSUR1        ;ISC-SF.SEA/JLI - SURROGATES FOR ALERTS ;11/21/07  08:35
    2         ;;8.0;KERNEL;**366,443**;Jul 10, 1995;Build 4
    3         Q
    4         ;
    5 RETURN(XQAUSER) ; P366 - return alerts to the user
    6         N XQAI,X0,XQASTRT,XQASURO,XQAEND
    7         ; identify periods in the surrogate multiple that haven't been returned
    8         F XQAI=0:0 S XQAI=$O(^XTV(8992,XQAUSER,2,"AC",1,XQAI)) Q:XQAI'>0  S X0=^XTV(8992,XQAUSER,2,XQAI,0) I $P(X0,U,4)=1 D
    9         . S XQASTRT=$P(X0,U) S XQAEND=$P(X0,U,3)
    10         . ; and clear the flag indicating we need to restore these alerts
    11         . N XQAFDA S XQAFDA(8992.02,XQAI_","_XQAUSER_",",.04)="@" D FILE^DIE("","XQAFDA")
    12         . ; restore alerts to intended user, remove from surrogate if completed (i.e., no other surrogates and not intended recipient)
    13         . D PUSHBACK(XQAUSER,XQASTRT,XQAEND)
    14         . Q
    15         Q
    16         ;
    17 PUSHBACK(XQAUSER,XQASTRT,XQAEND)        ; P366 - identify alerts in alert tracking file for return and return them
    18         N XQAINIT,XQAI,X0,X30,XNOSURO,XQADT,XQAJ,XQAK,XQAL,XQAOTH,XQASUROP
    19         S XQAINIT=$$FIND1^DIC(8992.2,,"X","INITIAL RECIPIENT")
    20         F XQADT=XQASTRT-.0000001:0 S XQADT=$O(^XTV(8992.1,"AUD",XQAUSER,XQADT)) Q:XQADT'>0  Q:XQADT>XQAEND  F XQAI=0:0 S XQAI=$O(^XTV(8992.1,"AUD",XQAUSER,XQADT,XQAI)) Q:XQAI'>0  D
    21         . S XQAJ=$O(^XTV(8992.1,XQAI,20,"B",XQAUSER,0)) Q:XQAJ'>0
    22         . N XSURO,XNOSURO,XQAID S XNOSURO=0,XQAID=$P(^XTV(8992.1,XQAI,0),U)
    23         . F XQAK=0:0 S XQAK=$O(^XTV(8992.1,XQAI,20,XQAJ,1,"B",XQAK)) Q:XQAK'>0  F XQAL=0:0 S XQAL=$O(^XTV(8992.1,XQAI,20,XQAJ,1,"B",XQAK,XQAL)) Q:XQAL'>0  D
    24         . . S X0=^XTV(8992.1,XQAI,20,XQAJ,1,XQAL,0) S:$P(X0,U,2)>0 XSURO($P(X0,U,2))="" S:$P(X0,U,2)'>0 XNOSURO=1 ; sent to XSURO as surrogate
    25         . . Q
    26         . I 'XNOSURO D
    27         . . N XQA,XQACMNT,XQALTYPE
    28         . . S XQA(XQAUSER)="",XQACMNT="RESTORED FROM SURROGATE",XQALTYPE="RESTORE FROM SURROGATE"
    29         . . N XQAUSER,XQAI S XQAUSER=$O(^XTV(8992,"AXQA",XQAID,0)) Q:XQAUSER'>0  D RESETUP^XQALFWD(XQAID,.XQA,XQACMNT)
    30         . . Q
    31         . ; walk through each of those it was sent to as a surrogate for XQAUSER
    32         . F XQASUROP=0:0 S XQASUROP=$O(XSURO(XQASUROP)) Q:XQASUROP'>0  S XQAJ=$O(^XTV(8992.1,XQAI,20,"B",XQASUROP,0)) D
    33         . . ; and identify each time they were considered a recipient of the alert
    34         . . S XNOSURO=0 F XQAK=0:0 Q:XNOSURO  S XQAK=$O(^XTV(8992.1,XQAI,20,XQAJ,1,"B",XQAK)) Q:XQAK'>0  F XQAL=0:0 S XQAL=$O(^XTV(8992.1,XQAI,20,XQAJ,1,"B",XQAK,XQAL)) Q:XQAL'>0  S X0=^XTV(8992.1,XQAI,20,XQAJ,1,XQAL,0) D  Q:XNOSURO
    35         . . . I $P(X0,U,3)'="Y" S XNOSURO=1 Q  ; this one got it directly as a recipient as well
    36         . . . ; walk through the SURROGATE FOR entries for this user
    37         . . . F XQAOTH=0:0 S XQAOTH=$O(^XTV(8992.1,XQAI,20,XQAJ,3,XQAOTH)) Q:XQAOTH'>0  S X30=^(XQAOTH,0) D  Q:XNOSURO
    38         . . . . I +X30=XQAUSER S $P(^XTV(8992.1,XQAI,20,XQAJ,3,XQAOTH,0),U,3)=$$NOW^XLFDT() Q  ; mark this user as returned
    39         . . . . I $P(X30,U,3)'>0 S XNOSURO=1 Q  ; another surrogate hasn't been returned yet, so leave the alert
    40         . . . . Q
    41         . . . Q
    42         . . I 'XNOSURO D
    43         . . . N XQAKILL,XQAUSER,XQAI S XQAKILL=1,XQAUSER=XQASUROP D DELETE^XQALDEL
    44         . . . Q
    45         . . Q
    46         . Q
    47         Q
    48         ;
    49 SUROLIST(XQAUSER,XQALIST)       ; returns for XQAUSER a list of current and/or future surrogates in XQALIST
    50         ;  usage  D SUROLIST^XQALSUR1(DUZ,.XQALIST)
    51         ;
    52         ;  returns  XQALIST=count
    53         ;           XQALIST(1)=IEN2^NEWPERSON,USER2^STARTDATETIME^ENDDATETIME
    54         ;           XQALIST(2)=3^NAME,USER3^3050407.1227^3050406
    55         ;
    56         N XQA0,XQADATE,XQAIEN,XQAL,XQALCNT,XQALEND,XQANOW,XQASTART,XQASURO,XQAVALU
    57         D CHEKSUBS^XQALSUR2(XQAUSER)
    58         S XQALCNT=$$CURRSURO^XQALSURO(XQAUSER)
    59         S XQANOW=$$NOW^XLFDT(),XQALCNT=0
    60         S XQADATE="" F  S XQADATE=$O(^XTV(8992,XQAUSER,2,"B",XQADATE)) Q:XQADATE'>0  S XQAIEN="" F  S XQAIEN=$O(^XTV(8992,XQAUSER,2,"B",XQADATE,XQAIEN)) Q:XQAIEN'>0  D
    61         . S XQA0=^XTV(8992,XQAUSER,2,XQAIEN,0),XQASTART=$P(XQA0,U),XQASURO=$P(XQA0,U,2),XQALEND=$P(XQA0,U,3) I XQALEND>0,XQALEND'>XQANOW Q
    62         . S XQALCNT=XQALCNT+1,XQAVALU=$$GET1^DIQ(200,XQASURO_",",.01),XQAL(XQALCNT)=XQASURO_U_XQAVALU_U_XQASTART_U_XQALEND
    63         . Q
    64         ; now rearrange by earliest to last
    65         K XQALIST S XQALIST=0
    66         S XQALCNT="" F  S XQALCNT=$O(XQAL(XQALCNT)) Q:XQALCNT'>0  D
    67         . ; if end date not specified, and start date follows, set end date to next start date
    68         . I $D(XQAL(XQALCNT+1)),($P(XQAL(XQALCNT),U,4)>$P(XQAL(XQALCNT+1),U,3))!($P(XQAL(XQALCNT),U,4)'>0) S $P(XQAL(XQALCNT),U,4)=$P(XQAL(XQALCNT+1),U,3)
    69         . S XQALIST=XQALIST+1,XQALIST(XQALIST)=XQAL(XQALCNT)
    70         . Q
    71         Q
    72         ;
    73 DCYCLIC(XQALSURO,XQAUSER,XQALSTRT,XQALEND)      ; code added to prevent cyclical surrogates - use dates for surrogacy
    74         N XQALNEXT,XQALIST,I,XQALAST
    75         I XQALSURO=XQAUSER Q "This forms a circle which leads back to this user during this period - can't do it!"
    76         S XQALNEXT=$$CURRSURO^XQALSURO(XQALSURO,XQALSTRT,XQALEND) I XQALNEXT>0 D
    77         . F I=1:1 Q:$P(XQALNEXT,U,I)=""  S XQALAST=$$DCYCLIC($P(XQALNEXT,U,I),XQAUSER,XQALSTRT,XQALEND) I XQALAST'>0 S XQALSURO=XQALAST Q
    78         . Q
    79         Q XQALSURO
    80         ;
    81 DATESURO(XQAUSER,XQALSTRT,XQALEND)      ; returns surrogate(s) for XQAUSER in date range XQALSTRT to XQALEND, may be multiple values ^-separated
    82         N XQALY,XQA0,XQALIEN,XQALS
    83         S XQALY="" I XQALEND'>0 S XQALEND=4000101
    84         F XQALS=0:0 S XQALS=$O(^XTV(8992,XQAUSER,2,"B",XQALS)) Q:XQALS'>0  Q:XQALS'<XQALEND  D
    85         . F XQALIEN=0:0 S XQALIEN=$O(^XTV(8992,XQAUSER,2,"B",XQALS,XQALIEN)) Q:XQALIEN'>0  S XQA0=^XTV(8992,XQAUSER,2,XQALIEN,0) Q:$P(XQA0,U,3)'>XQALSTRT  S XQALY=XQALY_$S(XQALY="":"",1:U)_$P(XQA0,U,2)
    86         . Q
    87         Q XQALY
    88         ;
    89 SURRO1(XQAUSER) ;
    90         N XQALSURO,XQALSTRT,XQALEND
    91         D CHKREMV^XQALSURO
    92 SURRO11 ;
    93         S XQALSURO=$$NEWDLG() I XQALSURO'>0 Q
    94         I $$CYCLIC^XQALSURO(XQALSURO,XQAUSER)'>0 W $C(7),!,$$CYCLIC^XQALSURO(XQALSURO,XQAUSER),! G SURRO11
    95         S XQALSTRT=+$$STRTDLG() I XQALSTRT<0 Q
    96         S XQALEND=+$$ENDDLG() I XQALEND<0 Q
    97         D SETSURO^XQALSURO(XQAUSER,XQALSURO,XQALSTRT,XQALEND)
    98         G SURRO11 ;
    99         Q
    100         ;
    101         ; P366 - added OPTIONAL second and third arguments to permit deletion of a specific pending surrogate and start date
    102 REMVSURO(XQAUSER,XQALSURO,XQALSTRT)     ; SR - ends the currently active surrogate relationship
    103         I $G(XQAUSER)'>0 Q
    104         S XQALSURO=$G(XQALSURO),XQALSTRT=$G(XQALSTRT)
    105         N XQALFM,XQALXREF,XQALSTR1,XQALSUR1,XQALNOW,XQALEND,XQA0
    106         D CHEKSUBS^XQALSUR2(XQAUSER)
    107         S XQALSUR1=+$P($G(^XTV(8992,XQAUSER,0)),U,2) S:XQALSURO'>0 XQALSURO=XQALSUR1
    108         S XQALSTR1=$P($G(^XTV(8992,XQAUSER,0)),U,3) S:XQALSTRT'>0 XQALSTRT=XQALSTR1
    109         S XQALEND=$P($G(^XTV(8992,XQAUSER,0)),U,4)
    110         S XQALXREF=0 I XQALSTRT>0 F  S XQALXREF=$O(^XTV(8992,XQAUSER,2,"B",XQALSTRT,XQALXREF)) Q:XQALXREF'>0  I $P(^XTV(8992,XQAUSER,2,XQALXREF,0),U,2)=XQALSURO D
    111         . S XQALEND=$P(^XTV(8992,XQAUSER,2,XQALXREF,0),U,3) D DELETENT(XQAUSER,XQALXREF,XQALSURO,XQALSTRT,XQALSUR1,XQALSTR1,XQALEND)
    112         . Q
    113         S XQALSURO=$$CURRSURO^XQALSURO(XQAUSER) ; make sure current surrogate is updated if necessary.
    114         Q
    115         ;
    116 DELETENT(XQAUSER,XQALXREF,XQALSURO,XQALSTRT,XQALSUR1,XQALSTR1,XQALEND)  ;
    117         N XQALNOW,XQALFM
    118         S XQAUSER=XQAUSER_",",XQALXREF=XQALXREF_","_XQAUSER
    119         I XQALXREF>0 D
    120         . S XQALNOW=$$NOW^XLFDT()
    121         . I XQALSTRT>XQALNOW S XQALFM(8992.02,XQALXREF,.01)=XQALNOW ; if scheduled for later, mark start as now
    122         . I (XQALEND>XQALNOW)!(XQALEND'>0) S XQALFM(8992.02,XQALXREF,.03)=XQALNOW ; update end time for surrogate to now
    123         . I XQALSTRT'>XQALNOW S XQALFM(8992.02,XQALXREF,.04)=1
    124         . Q
    125         I XQALSUR1=XQALSURO,XQALSTRT=XQALSTR1 D
    126         . S XQALFM(8992,XQAUSER,.02)="@"
    127         . S XQALFM(8992,XQAUSER,.03)="@"
    128         . S XQALFM(8992,XQAUSER,.04)="@"
    129         . Q
    130         I $D(XQALFM) D FILE^DIE("","XQALFM")
    131         ; ZEXCEPT: XTMUNIT   (EXTERNAL VALUE - INDICATING UNIT TEST BEING RUN)
    132         I XQALSURO>0,'$D(XTMUNIT) D
    133         . N XQAMESG,XMSUB,XMTEXT
    134         . S XQAMESG(1,0)="You have been REMOVED as a surrogate recipient for alerts for"
    135         . S XQAMESG(2,0)=$$GET1^DIQ(200,XQAUSER,.01,"E")_" (IEN="_$P(XQAUSER,",")_")."
    136         . S XMTEXT="XQAMESG(",XMSUB="Removal as surrogate recipient"
    137         . D SENDMESG^XQALSURO
    138         . Q
    139         Q
    140         ;
    141 NEWDLG()        ; new surrogate dialog
    142         N DIR,Y S DIR(0)="Y",DIR("A")="Do you want to SET a new surrogate recipient",DIR("?")="A surrogate will receive your alerts until they are removed as surrogate.",DIR("B")="NO"
    143         S Y=$$ASKDIR(.DIR) I 'Y Q 0
    144         ;
    145         S DIR(0)="P^200:AEMQ",DIR("A")="Select USER to be SURROGATE" S Y=$$ASKDIR(.DIR)  ; COS-0401-41366
    146         I Y>0 W "  ",$P(Y,U,2)
    147         Q +Y
    148         ;
    149 STRTDLG()       ; new surrogate start date/time dialog
    150         N DIR
    151         S DIR(0)="DO^::ATEX",DIR("A")="Specify Date/Time SURROGATE becomes active" ; BRX-1000-10427
    152         S DIR("A",1)="",DIR("A",2)=""
    153         S DIR("A",3)="if no date/time is entered, alerts will start going to"
    154         S DIR("A",4)="the SURROGATE immediately."
    155         Q +$$ASKDIR(.DIR)
    156         ;
    157 ENDDLG()        ; new surrogate end date/time dialog
    158         N DIR
    159         S DIR(0)="DO^::AETX",DIR("A")="Specify Date/Time SURROGATE should be removed" ; BRX-1000-10427
    160         S DIR("A",1)="",DIR("A",2)=""
    161         S DIR("A",3)="if no date/time is entered, YOU must remove the SURROGATE"
    162         S DIR("A",4)="to terminate alerts going to the SURROGATE"
    163         Q +$$ASKDIR(.DIR)
    164         ;
    165 ASKDIR(DIR)     ;
    166         N Y,DTOUT,DUOUT
    167         D ^DIR K DIR I $D(DTOUT)!$D(DUOUT) S Y=-1
    168         Q Y
     1XQALSUR1 ;ISC-SF.SEA/JLI - SURROGATES FOR ALERTS ;9/6/05  14:26
     2 ;;8.0;KERNEL;**366**;Jul 10, 1995
     3 Q
     4 ;
     5RETURN(XQAUSER) ; P366 - return alerts to the user
     6 N XQAI,X0,XQASTRT,XQASURO,XQAEND
     7 ; identify periods in the surrogate multiple that haven't been returned
     8 F XQAI=0:0 S XQAI=$O(^XTV(8992,XQAUSER,2,"AC",1,XQAI)) Q:XQAI'>0  S X0=^XTV(8992,XQAUSER,2,XQAI,0) I $P(X0,U,4)=1 D
     9 . S XQASTRT=$P(X0,U) S XQAEND=$P(X0,U,3)
     10 . ; and clear the flag indicating we need to restore these alerts
     11 . N XQAFDA S XQAFDA(8992.02,XQAI_","_XQAUSER_",",.04)="@" D FILE^DIE("","XQAFDA")
     12 . ; restore alerts to intended user, remove from surrogate if completed (i.e., no other surrogates and not intended recipient)
     13 . D PUSHBACK(XQAUSER,XQASTRT,XQAEND)
     14 . Q
     15 Q
     16 ;
     17PUSHBACK(XQAUSER,XQASTRT,XQAEND) ; P366 - identify alerts in alert tracking file for return and return them
     18 N XQAINIT,XQAI,X0,X30,XNOSURO,XQADT,XQAJ,XQAK,XQAL,XQAOTH,XQASUROP
     19 S XQAINIT=$$FIND1^DIC(8992.2,,"X","INITIAL RECIPIENT")
     20 F XQADT=XQASTRT-.0000001:0 S XQADT=$O(^XTV(8992.1,"AUD",XQAUSER,XQADT)) Q:XQADT'>0  Q:XQADT>XQAEND  F XQAI=0:0 S XQAI=$O(^XTV(8992.1,"AUD",XQAUSER,XQADT,XQAI)) Q:XQAI'>0  D
     21 . S XQAJ=$O(^XTV(8992.1,XQAI,20,"B",XQAUSER,0)) Q:XQAJ'>0
     22 . N XSURO,XNOSURO,XQAID S XNOSURO=0,XQAID=$P(^XTV(8992.1,XQAI,0),U)
     23 . F XQAK=0:0 S XQAK=$O(^XTV(8992.1,XQAI,20,XQAJ,1,"B",XQAK)) Q:XQAK'>0  F XQAL=0:0 S XQAL=$O(^XTV(8992.1,XQAI,20,XQAJ,1,"B",XQAK,XQAL)) Q:XQAL'>0  D
     24 . . S X0=^XTV(8992.1,XQAI,20,XQAJ,1,XQAL,0) S:$P(X0,U,2)>0 XSURO($P(X0,U,2))="" S:$P(X0,U,2)'>0 XNOSURO=1 ; sent to XSURO as surrogate
     25 . . Q
     26 . I 'XNOSURO D
     27 . . N XQA,XQACMNT,XQALTYPE
     28 . . S XQA(XQAUSER)="",XQACMNT="RESTORED FROM SURROGATE",XQALTYPE="RESTORE FROM SURROGATE"
     29 . . N XQAUSER,XQAI S XQAUSER=$O(^XTV(8992,"AXQA",XQAID,0)) Q:XQAUSER'>0  D RESETUP^XQALFWD(XQAID,.XQA,XQACMNT)
     30 . . Q
     31 . ; walk through each of those it was sent to as a surrogate for XQAUSER
     32 . F XQASUROP=0:0 S XQASUROP=$O(XSURO(XQASUROP)) Q:XQASUROP'>0  S XQAJ=$O(^XTV(8992.1,XQAI,20,"B",XQASUROP,0)) D
     33 . . ; and identify each time they were considered a recipient of the alert
     34 . . S XNOSURO=0 F XQAK=0:0 Q:XNOSURO  S XQAK=$O(^XTV(8992.1,XQAI,20,XQAJ,1,"B",XQAK)) Q:XQAK'>0  F XQAL=0:0 S XQAL=$O(^XTV(8992.1,XQAI,20,XQAJ,1,"B",XQAK,XQAL)) Q:XQAL'>0  S X0=^XTV(8992.1,XQAI,20,XQAJ,1,XQAL,0) D  Q:XNOSURO
     35 . . . I $P(X0,U,3)'="Y" S XNOSURO=1 Q  ; this one got it directly as a recipient as well
     36 . . . ; walk through the SURROGATE FOR entries for this user
     37 . . . F XQAOTH=0:0 S XQAOTH=$O(^XTV(8992.1,XQAI,20,XQAJ,3,XQAOTH)) Q:XQAOTH'>0  S X30=^(XQAOTH,0) D  Q:XNOSURO
     38 . . . . I +X30=XQAUSER S $P(^XTV(8992.1,XQAI,20,XQAJ,3,XQAOTH,0),U,3)=$$NOW^XLFDT() Q  ; mark this user as returned
     39 . . . . I $P(X30,U,3)'>0 S XNOSURO=1 Q  ; another surrogate hasn't been returned yet, so leave the alert
     40 . . . . Q
     41 . . . Q
     42 . . I 'XNOSURO D
     43 . . . N XQAKILL,XQAUSER,XQAI S XQAKILL=1,XQAUSER=XQASUROP D DELETE^XQALDEL
     44 . . . Q
     45 . . Q
     46 . Q
     47 Q
     48 ;
     49SUROLIST(XQAUSER,XQALIST) ; returns for XQAUSER a list of current and/or future surrogates in XQALIST
     50 ;  usage  D SUROLIST^XQALSUR1(DUZ,.XQALIST)
     51 ;
     52 ;  returns  XQALIST=count
     53 ;           XQALIST(1)=IEN2^NEWPERSON,USER2^STARTDATETIME^ENDDATETIME
     54 ;           XQALIST(2)=3^NAME,USER3^3050407.1227^3050406
     55 ;
     56 N XQA0,XQADATE,XQAIEN,XQAL,XQALCNT,XQALEND,XQANOW,XQASTART,XQASURO,XQAVALU
     57 D CHEKSUBS^XQALSUR2(XQAUSER)
     58 S XQALCNT=$$CURRSURO^XQALSURO(XQAUSER)
     59 S XQANOW=$$NOW^XLFDT(),XQALCNT=0
     60 S XQADATE="" F  S XQADATE=$O(^XTV(8992,XQAUSER,2,"B",XQADATE)) Q:XQADATE'>0  S XQAIEN="" F  S XQAIEN=$O(^XTV(8992,XQAUSER,2,"B",XQADATE,XQAIEN)) Q:XQAIEN'>0  D
     61 . S XQA0=^XTV(8992,XQAUSER,2,XQAIEN,0),XQASTART=$P(XQA0,U),XQASURO=$P(XQA0,U,2),XQALEND=$P(XQA0,U,3) I XQALEND>0,XQALEND'>XQANOW Q
     62 . S XQALCNT=XQALCNT+1,XQAVALU=$$GET1^DIQ(200,XQASURO_",",.01),XQAL(XQALCNT)=XQASURO_U_XQAVALU_U_XQASTART_U_XQALEND
     63 . Q
     64 ; now rearrange by earliest to last
     65 K XQALIST S XQALIST=0
     66 S XQALCNT="" F  S XQALCNT=$O(XQAL(XQALCNT)) Q:XQALCNT'>0  D
     67 . ; if end date not specified, and start date follows, set end date to next start date
     68 . I $D(XQAL(XQALCNT+1)),($P(XQAL(XQALCNT),U,4)>$P(XQAL(XQALCNT+1),U,3))!($P(XQAL(XQALCNT),U,4)'>0) S $P(XQAL(XQALCNT),U,4)=$P(XQAL(XQALCNT+1),U,3)
     69 . S XQALIST=XQALIST+1,XQALIST(XQALIST)=XQAL(XQALCNT)
     70 . Q
     71 Q
     72 ;
     73DCYCLIC(XQALSURO,XQAUSER,XQALSTRT,XQALEND) ; code added to prevent cyclical surrogates - use dates for surrogacy
     74 N XQALNEXT,XQALIST,I,XQALAST
     75 I XQALSURO=XQAUSER Q "This forms a circle which leads back to this user during this period - can't do it!"
     76 S XQALNEXT=$$CURRSURO^XQALSURO(XQALSURO,XQALSTRT,XQALEND) I XQALNEXT>0 D
     77 . F I=1:1 Q:$P(XQALNEXT,U,I)=""  S XQALAST=$$DCYCLIC($P(XQALNEXT,U,I),XQAUSER,XQALSTRT,XQALEND) I XQALAST'>0 S XQALSURO=XQALAST Q
     78 . Q
     79 Q XQALSURO
     80 ;
     81DATESURO(XQAUSER,XQALSTRT,XQALEND) ; returns surrogate(s) for XQAUSER in date range XQALSTRT to XQALEND, may be multiple values ^-separated
     82 N XQALY,XQA0,XQALIEN,XQALS
     83 S XQALY="" I XQALEND'>0 S XQALEND=4000101
     84 F XQALS=0:0 S XQALS=$O(^XTV(8992,XQAUSER,2,"B",XQALS)) Q:XQALS'>0  Q:XQALS'<XQALEND  D
     85 . F XQALIEN=0:0 S XQALIEN=$O(^XTV(8992,XQAUSER,2,"B",XQALS,XQALIEN)) Q:XQALIEN'>0  S XQA0=^XTV(8992,XQAUSER,2,XQALIEN,0) Q:$P(XQA0,U,3)'>XQALSTRT  S XQALY=XQALY_$S(XQALY="":"",1:U)_$P(XQA0,U,2)
     86 . Q
     87 Q XQALY
     88 ;
     89SURRO1(XQAUSER) ;
     90 N XQALSURO,XQALSTRT,XQALEND
     91 D CHKREMV^XQALSURO
     92SURRO11 ;
     93 S XQALSURO=$$NEWDLG() I XQALSURO'>0 Q
     94 I $$CYCLIC^XQALSURO(XQALSURO,XQAUSER)'>0 W $C(7),!,$$CYCLIC^XQALSURO(XQALSURO,XQAUSER),! G SURRO1
     95 S XQALSTRT=+$$STRTDLG() I XQALSTRT<0 Q
     96 S XQALEND=+$$ENDDLG() I XQALEND<0 Q
     97 D SETSURO^XQALSURO(XQAUSER,XQALSURO,XQALSTRT,XQALEND)
     98 G SURRO11 ;
     99 Q
     100 ;
     101 ; P366 - added OPTIONAL second and third arguments to permit deletion of a specific pending surrogate and start date
     102REMVSURO(XQAUSER,XQALSURO,XQALSTRT) ; SR - ends the currently active surrogate relationship
     103 I $G(XQAUSER)'>0 Q
     104 S XQALSURO=$G(XQALSURO),XQALSTRT=$G(XQALSTRT)
     105 N XQALFM,XQALXREF,XQALSTR1,XQALSUR1,XQALNOW,XQALEND,XQA0
     106 ; ZEXCEPT: XQATEST   (EXTERNAL VALUE - INDICATING TEST BEING RUN)
     107 D CHEKSUBS^XQALSUR2(XQAUSER)
     108 S XQALSUR1=+$P($G(^XTV(8992,XQAUSER,0)),U,2) S:XQALSURO'>0 XQALSURO=XQALSUR1
     109 S XQALSTR1=$P($G(^XTV(8992,XQAUSER,0)),U,3) S:XQALSTRT'>0 XQALSTRT=XQALSTR1
     110 S XQALEND=$P($G(^XTV(8992,XQAUSER,0)),U,4)
     111 S XQALXREF=0 I XQALSTRT>0 F  S XQALXREF=$O(^XTV(8992,XQAUSER,2,"B",XQALSTRT,XQALXREF)) Q:XQALXREF'>0  I $P(^XTV(8992,XQAUSER,2,XQALXREF,0),U,2)=XQALSURO D
     112 . S XQALEND=$P(^XTV(8992,XQAUSER,2,XQALXREF,0),U,3) D DELETENT(XQAUSER,XQALXREF,XQALSURO,XQALSTRT,XQALSUR1,XQALSTR1,XQALEND)
     113 . Q
     114 S XQALSURO=$$CURRSURO^XQALSURO(XQAUSER) ; make sure current surrogate is updated if necessary.
     115 Q
     116 ;
     117DELETENT(XQAUSER,XQALXREF,XQALSURO,XQALSTRT,XQALSUR1,XQALSTR1,XQALEND) ;
     118 N XQALNOW,XQALFM
     119 ; ZEXCEPT: XQATEST   (EXTERNAL VALUE - INDICATING TEST BEING RUN)
     120 S XQAUSER=XQAUSER_",",XQALXREF=XQALXREF_","_XQAUSER
     121 I XQALXREF>0 D
     122 . S XQALNOW=$$NOW^XLFDT()
     123 . I XQALSTRT>XQALNOW S XQALFM(8992.02,XQALXREF,.01)=XQALNOW ; if scheduled for later, mark start as now
     124 . I (XQALEND>XQALNOW)!(XQALEND'>0) S XQALFM(8992.02,XQALXREF,.03)=XQALNOW ; update end time for surrogate to now
     125 . I XQALSTRT'>XQALNOW S XQALFM(8992.02,XQALXREF,.04)=1
     126 . Q
     127 I XQALSUR1=XQALSURO,XQALSTRT=XQALSTR1 D
     128 . S XQALFM(8992,XQAUSER,.02)="@"
     129 . S XQALFM(8992,XQAUSER,.03)="@"
     130 . S XQALFM(8992,XQAUSER,.04)="@"
     131 . Q
     132 I $D(XQALFM) D FILE^DIE("","XQALFM")
     133 I XQALSURO>0,'$D(XQATEST) D
     134 . N XQAMESG,XMSUB,XMTEXT
     135 . S XQAMESG(1,0)="You have been REMOVED as a surrogate recipient for alerts for"
     136 . S XQAMESG(2,0)=$$GET1^DIQ(200,XQAUSER,.01,"E")_" (IEN="_$P(XQAUSER,",")_")."
     137 . S XMTEXT="XQAMESG(",XMSUB="Removal as surrogate recipient"
     138 . D SENDMESG^XQALSURO
     139 . Q
     140 Q
     141 ;
     142NEWDLG() ; new surrogate dialog
     143 N DIR,Y S DIR(0)="Y",DIR("A")="Do you want to SET a new surrogate recipient",DIR("?")="A surrogate will receive your alerts until they are removed as surrogate.",DIR("B")="NO"
     144 S Y=$$ASKDIR(.DIR) I 'Y Q 0
     145 ;
     146 S DIR(0)="P^200:AEMQ",DIR("A")="Select USER to be SURROGATE" S Y=$$ASKDIR(.DIR)  ; COS-0401-41366
     147 I Y>0 W "  ",$P(Y,U,2)
     148 Q +Y
     149 ;
     150STRTDLG() ; new surrogate start date/time dialog
     151 N DIR
     152 S DIR(0)="DO^::ATEX",DIR("A")="Specify Date/Time SURROGATE becomes active" ; BRX-1000-10427
     153 S DIR("A",1)="",DIR("A",2)=""
     154 S DIR("A",3)="if no date/time is entered, alerts will start going to"
     155 S DIR("A",4)="the SURROGATE immediately."
     156 Q +$$ASKDIR(.DIR)
     157 ;
     158ENDDLG() ; new surrogate end date/time dialog
     159 N DIR
     160 S DIR(0)="DO^::AETX",DIR("A")="Specify Date/Time SURROGATE should be removed" ; BRX-1000-10427
     161 S DIR("A",1)="",DIR("A",2)=""
     162 S DIR("A",3)="if no date/time is entered, YOU must remove the SURROGATE"
     163 S DIR("A",4)="to terminate alerts going to the SURROGATE"
     164 Q +$$ASKDIR(.DIR)
     165 ;
     166ASKDIR(DIR) ;
     167 N Y,DTOUT,DUOUT
     168 D ^DIR K DIR I $D(DTOUT)!$D(DUOUT) S Y=-1
     169 Q Y
Note: See TracChangeset for help on using the changeset viewer.