[628] | 1 | XMXADDRG ;ISC-SF/GMB-Expand group ;04/15/2003 13:05
|
---|
| 2 | ;;8.0;MailMan;**18**;Jun 28, 2002
|
---|
| 3 | ; Replaces ^XMA21G (ISC-WASH/CAP)
|
---|
| 4 | EXPAND(XMDUZ,XMADDR,XMSTRIKE,XMPREFIX,XMLATER,XMFULL,XMG) ;
|
---|
| 5 | ; XMG IEN of group in ^XMB(3.8)
|
---|
| 6 | ; XMGN Name of group
|
---|
| 7 | ; XMGPRIV Restrictions on use of group
|
---|
| 8 | ; XMGMREC Group member's ^XMB(3.7,x,0 record
|
---|
| 9 | ; XMGCIRCL Array used to guard against circular references
|
---|
| 10 | N XMGREC,XMGN,XMGPRIV,XMSCREEN,XMGCIRCL,XMIASAVE,XMGMBRS
|
---|
| 11 | I $D(XMRESTR("NOFPG")) D Q ;Must be sender or hold XM GROUP PRIORITY
|
---|
| 12 | . ;key to forward priority mail to groups.
|
---|
| 13 | . D SETERR^XMXADDR4($G(XMIA),"!",39130)
|
---|
| 14 | S XMADDR=$E(XMADDR,3,999)
|
---|
| 15 | ; Screen: Group is public OR user is organizer
|
---|
| 16 | ; OR group is unrestricted and user is member
|
---|
| 17 | S XMSCREEN="N XMR S XMR=^(0) I $S($P(XMR,U,2)=""PU"":1,$P($G(^XMB(3.8,+Y,3),.5),U)=XMDUZ:1,+$P(XMR,U,6):0,$D(^XMB(3.8,+Y,1,""B"",XMDUZ)):1,1:0)"
|
---|
| 18 | I $G(XMIA) D Q:$D(XMERROR)
|
---|
| 19 | . N DIC,X
|
---|
| 20 | . S X=XMADDR
|
---|
| 21 | . S DIC("S")=XMSCREEN
|
---|
| 22 | . S DIC="^XMB(3.8,"
|
---|
| 23 | . S DIC(0)="MEZ"
|
---|
| 24 | . D ^DIC
|
---|
| 25 | . I Y<0 D SETERR^XMXADDR4(XMADDR'="?","",39002) Q ;Not found.
|
---|
| 26 | . S XMG=+Y
|
---|
| 27 | . S XMGN=$P(Y,U,2)
|
---|
| 28 | . S XMGREC=Y(0)
|
---|
| 29 | E D Q:$D(XMERROR)
|
---|
| 30 | . S XMG=$$FIND1^DIC(3.8,"","MO",XMADDR,"",XMSCREEN) I 'XMG D SETERR^XMXADDR4(0,"",$S($D(DIERR):39131,1:39132)) Q ; Mail group ambiguous. / Mail group not found.
|
---|
| 31 | . S XMGREC=^XMB(3.8,XMG,0)
|
---|
| 32 | . S XMGN=$P(XMGREC,U)
|
---|
| 33 | I $D(^XMB(3.8,XMG,4,"B")),'$D(^("B",XMDUZ))!$D(XMRESTR("NET RECEIVE")) D Q
|
---|
| 34 | . ; If the group has authorized senders, then the sender must be local.
|
---|
| 35 | . ; Incoming network mail may not address such a group.
|
---|
| 36 | . D SETERR^XMXADDR4(0,"",39133) ;Sender not authorized to group.
|
---|
| 37 | . Q:'$G(XMIA)
|
---|
| 38 | . N XMABORT,XMTEXT
|
---|
| 39 | . S XMABORT=0
|
---|
| 40 | . W @IOF
|
---|
| 41 | . ;You may not send mail directly to this group.
|
---|
| 42 | . ;You must send it to an authorized sender for the group.
|
---|
| 43 | . D BLD^DIALOG(39134,"","","XMTEXT","F")
|
---|
| 44 | . D MSG^DIALOG("WE","","","","XMTEXT")
|
---|
| 45 | . D AUTHSEND^XMHIG(XMG,XMABORT)
|
---|
| 46 | S XMGPRIV=$P(XMGREC,U,6)
|
---|
| 47 | S XMFULL="G."_XMGN_$S($G(XMINSTR("ADDR FLAGS"))["Y":"",XMGPRIV:$$EZBLD^DIALOG(39135),1:"") ;[Private Mail Group]
|
---|
| 48 | I $G(XMINSTR("ADDR FLAGS"))["X" Q
|
---|
| 49 | I XMSTRIKE Q:$D(^TMP("XMY0",$J,XMFULL,"L")) W:$G(XMIA) $$EZBLD^DIALOG(39136) ;Deleting Members ...
|
---|
| 50 | I $G(XMIA),'XMSTRIKE D Q:$D(XMERROR)
|
---|
| 51 | . I XMLATER="",$G(XMBIGGRP),$$BIG(XMG) D LATERIT(XMFULL,.XMLATER)
|
---|
| 52 | . I XMLATER="?" D QLATER^XMXADDR(XMFULL,.XMLATER)
|
---|
| 53 | I XMLATER,'$G(XMIA) Q
|
---|
| 54 | I $D(XMIA) S XMIASAVE=XMIA
|
---|
| 55 | I $D(^TMP("XM",$J,"GRPERR")) K ^TMP("XM",$J,"GRPERR")
|
---|
| 56 | D EXPGROUP(XMDUZ,XMG,XMGREC,XMSTRIKE,XMPREFIX,XMLATER,.XMGCIRCL)
|
---|
| 57 | I '$G(XMGMBRS),'XMLATER D
|
---|
| 58 | . D SETERR^XMXADDR4($G(XMIA),"",39137) ;Mail group has no members
|
---|
| 59 | I $D(^TMP("XM",$J,"GRPERR")) D
|
---|
| 60 | . D GRPERR^XMXADDR4(XMDUZ,XMG,XMGN)
|
---|
| 61 | . K ^TMP("XM",$J,"GRPERR")
|
---|
| 62 | K XMIA
|
---|
| 63 | I $D(XMIASAVE) S XMIA=XMIASAVE
|
---|
| 64 | Q
|
---|
| 65 | BIG(XMIEN) ; Function returns 1 if big group, 0 if not
|
---|
| 66 | Q:$D(^XMB(3.8,XMIEN,5,"B")) 1 ; has member groups
|
---|
| 67 | Q:$D(^XMB(3.8,XMIEN,7,"B")) 1 ; has distribution list
|
---|
| 68 | ;Q:$D(^XMB(3.8,XMIEN,9,"B")) 1 ; has fax groups
|
---|
| 69 | N XMCNT,XMNODE
|
---|
| 70 | S XMCNT=0
|
---|
| 71 | F XMNODE=1,6,8 D ; local, remote, & fax members
|
---|
| 72 | . Q:'$D(^XMB(3.8,XMIEN,XMNODE,0))
|
---|
| 73 | . S XMCNT=XMCNT+$P($G(^XMB(3.8,XMIEN,XMNODE,0)),U,4)
|
---|
| 74 | Q XMCNT'<XMBIGGRP
|
---|
| 75 | LATERIT(XMFULL,XMLATER) ;
|
---|
| 76 | N DIR,X,Y,DIRUT
|
---|
| 77 | ;This group seems to be fairly big. If you don't need to 'minus'
|
---|
| 78 | ;anyone from it, then you can save some time by queuing it for 'Later'
|
---|
| 79 | ;delivery. Would you like to queue this group for later delivery
|
---|
| 80 | D BLD^DIALOG(39138,"","","DIR(""A"")")
|
---|
| 81 | S DIR(0)="Y"
|
---|
| 82 | S DIR("B")=$$EZBLD^DIALOG(39053) ;No
|
---|
| 83 | ;Answer NO if
|
---|
| 84 | ; - You need to delete any group members from the message.
|
---|
| 85 | ;Answer YES if
|
---|
| 86 | ; - You don't need to delete any group members from the message
|
---|
| 87 | ; - and you'd like to save a bit of time.
|
---|
| 88 | D BLD^DIALOG(39139,"","","DIR(""?"")")
|
---|
| 89 | D ^DIR I $D(DIRUT) D Q
|
---|
| 90 | . D SETERR^XMXADDR4(0,"",37002) ;up-arrow or time out.
|
---|
| 91 | . D EN^DDIOL(XMFULL_$$EZBLD^DIALOG(39015)) ;removed from recipient list.
|
---|
| 92 | Q:'Y
|
---|
| 93 | S XMLATER="?"
|
---|
| 94 | Q
|
---|
| 95 | EXPGROUP(XMDUZ,XMG,XMGREC,XMSTRIKE,XMPREFIX,XMLATER,XMGCIRCL) ;
|
---|
| 96 | ;Q:'$$AUTHGRP(XMDUZ,XMG,XMGREC)
|
---|
| 97 | S XMGCIRCL(XMG)=""
|
---|
| 98 | S $P(^XMB(3.8,XMG,0),U,4,5)=$P(XMGREC,U,4)+1_U_DT ; # references to group^date last ref'd
|
---|
| 99 | I $G(XMIA) D
|
---|
| 100 | . W !
|
---|
| 101 | . D DISPCNT(XMG,1,39141) ;Local
|
---|
| 102 | . D DISPCNT(XMG,5,39142) ;Member Group(s)
|
---|
| 103 | . D DISPCNT(XMG,6,39143) ;Remote
|
---|
| 104 | . D DISPCNT(XMG,7,39144) ;Distribution List(s)
|
---|
| 105 | . D DISPCNT(XMG,8,39145) ;Fax Recipient(s)
|
---|
| 106 | . D DISPCNT(XMG,9,39146) ;Fax Group(s)
|
---|
| 107 | . I $X>1 W ":",!
|
---|
| 108 | D INDIV(XMDUZ,XMG,XMSTRIKE,XMPREFIX,XMLATER) I XMLATER,'$G(XMIA) K XMGCIRCL(XMG) Q
|
---|
| 109 | D GROUP(XMDUZ,XMG,XMSTRIKE,XMPREFIX,XMLATER,.XMGCIRCL) I XMLATER,'$G(XMIA) K XMGCIRCL(XMG) Q
|
---|
| 110 | D REMOTE(XMDUZ,XMG,XMSTRIKE,XMPREFIX,XMLATER) I XMLATER,'$G(XMIA) K XMGCIRCL(XMG) Q
|
---|
| 111 | D DISTR^XMXADDR4(XMDUZ,XMG,XMSTRIKE,XMPREFIX,XMLATER) I XMLATER,'$G(XMIA) K XMGCIRCL(XMG) Q
|
---|
| 112 | I $P(^XMB(1,1,0),U,19) D FAXGROUP^XMXADDR4(XMDUZ,XMG,XMSTRIKE,XMPREFIX,XMLATER) I XMLATER,'$G(XMIA) K XMGCIRCL(XMG) Q
|
---|
| 113 | I $P(^XMB(1,1,0),U,19) D FAXINDIV^XMXADDR4(XMDUZ,XMG,XMSTRIKE,XMPREFIX,XMLATER) I XMLATER,'$G(XMIA) K XMGCIRCL(XMG) Q
|
---|
| 114 | K XMGCIRCL(XMG)
|
---|
| 115 | Q
|
---|
| 116 | DISPCNT(XMIEN,XMNODE,XMDESCR) ;
|
---|
| 117 | N XMCNT
|
---|
| 118 | S XMDESCR=$$EZBLD^DIALOG(XMDESCR)
|
---|
| 119 | S XMCNT=$P($G(^XMB(3.8,XMIEN,XMNODE,0)),U,4) Q:'XMCNT
|
---|
| 120 | I $X+3+$L(XMCNT)+$L(XMDESCR)>IOM W ",",!
|
---|
| 121 | E W:$X>4 ", "
|
---|
| 122 | W XMCNT," ",XMDESCR
|
---|
| 123 | Q
|
---|
| 124 | AUTHGRP(XMDUZ,XMG,XMGREC) ;
|
---|
| 125 | ; Screen: Group is public OR user is owner
|
---|
| 126 | ; OR group is unrestricted and user is member
|
---|
| 127 | N XMOWNER
|
---|
| 128 | I $P(XMGREC,U,2)="PU" Q 1 ; Group is public
|
---|
| 129 | S XMOWNER=$P(^XMB(3.8,XMG,3),U,1) S:XMOWNER="" XMOWNER=.5
|
---|
| 130 | I XMDUZ=XMOWNER Q 1 ; User is owner of group
|
---|
| 131 | I +$P(XMGREC,U,6)=0,$D(^XMB(3.8,XMG,1,"B",XMDUZ)) Q 1 ; Group is unrestricted and user is a member
|
---|
| 132 | D SETERR^XMXADDR4($G(XMIA),"!",39147,$P(XMGREC,U,1))
|
---|
| 133 | Q 0 ;You may not access group '|1|'.
|
---|
| 134 | INDIV(XMDUZ,XMG,XMSTRIKE,XMPREFIX,XMLATER) ;
|
---|
| 135 | ; XMGM Group member
|
---|
| 136 | N XMI,XMGM,XMCNT,XMREC,XMTYPE
|
---|
| 137 | S XMI=0,XMCNT=0
|
---|
| 138 | F S XMI=$O(^XMB(3.8,XMG,1,XMI)) Q:'XMI S XMREC=^(XMI,0) D I XMLATER,'$G(XMIA) Q
|
---|
| 139 | . S XMGM=$P(XMREC,U,1),XMTYPE=$P(XMREC,U,2)
|
---|
| 140 | . ; If SHARED,MAIL or no mailbox, then delete from group.
|
---|
| 141 | . I XMGM=.6!'$D(^XMB(3.7,XMGM))!'$D(^VA(200,XMGM,0)) D DELETE2^XMXADDR4(XMG,1,XMI) Q
|
---|
| 142 | . N XMFULL,XMERROR,XMFWDADD
|
---|
| 143 | . D PERSON^XMXADDR1(XMDUZ,XMGM,"","","","",.XMFULL)
|
---|
| 144 | . I $D(XMERROR) D Q
|
---|
| 145 | . . ; Commenting out because I'm not sure it should be reported.
|
---|
| 146 | . . ;S XMFULL=$P($G(^VA(200,XMGM,0)),U,1)
|
---|
| 147 | . . ;I XMFULL="" S XMFULL="USER #"_XMGM
|
---|
| 148 | . . ;S ^TMP("XM",$J,"GRPERR",XMG,"L",XMFULL)=XMERROR
|
---|
| 149 | . S XMGMBRS=1
|
---|
| 150 | . I 'XMLATER D INDIV^XMXADDR(XMDUZ,XMGM,XMSTRIKE,$S(XMPREFIX'="":XMPREFIX,1:XMTYPE),XMLATER)
|
---|
| 151 | . Q:'$G(XMIA)
|
---|
| 152 | . I XMCNT,XMCNT#16=0 D Q:'$G(XMIA)
|
---|
| 153 | . . N DIR,Y
|
---|
| 154 | . . S DIR("A")=$$EZBLD^DIALOG(39148) ;Do you want to see more members
|
---|
| 155 | . . S DIR(0)="Y",DIR("B")=$$EZBLD^DIALOG(39053) ;No
|
---|
| 156 | . . D ^DIR
|
---|
| 157 | . . S XMIA=+Y ; The '+' takes care of $D(DIRUT)
|
---|
| 158 | . S XMCNT=XMCNT+1
|
---|
| 159 | . W:XMCNT#4-1=0 !
|
---|
| 160 | . W ?XMCNT-1#4*20,$E($S(XMPREFIX'="":XMPREFIX_":",XMTYPE="":"",1:XMTYPE_":")_XMFULL,1,19)
|
---|
| 161 | Q
|
---|
| 162 | GROUP(XMDUZ,XMG,XMSTRIKE,XMPREFIX,XMLATER,XMGCIRCL) ;
|
---|
| 163 | N XMIEN,XMI,XMREC,XMTYPE
|
---|
| 164 | S XMI=0
|
---|
| 165 | F S XMI=$O(^XMB(3.8,XMG,5,XMI)) Q:'XMI S XMREC=^(XMI,0) D I XMLATER,'$G(XMIA) Q
|
---|
| 166 | . S XMIEN=$P(XMREC,U,1),XMTYPE=$P(XMREC,U,2)
|
---|
| 167 | . I '$D(^XMB(3.8,XMIEN,0)) D DELETE2^XMXADDR4(XMG,5,XMI) Q
|
---|
| 168 | . S XMREC=^XMB(3.8,XMIEN,0)
|
---|
| 169 | . W:$G(XMIA) !,$S(XMPREFIX'="":"",XMTYPE="":"",1:XMTYPE_":"),"G.",$P(XMREC,U,1),":"
|
---|
| 170 | . I $D(XMGCIRCL(XMIEN)) D Q
|
---|
| 171 | . . ; Circular (infinite loop) reference! Don't go there!
|
---|
| 172 | . . S ^TMP("XM",$J,"GRPERR",XMG,"C",$P(XMREC,U,1))="" Q
|
---|
| 173 | . . Q:'$G(XMIASAVE)
|
---|
| 174 | . . N XMTEXT
|
---|
| 175 | . . ;Mail group contains circular reference to G.|1|.
|
---|
| 176 | . . ;Circular reference ignored.
|
---|
| 177 | . . ;This circular reference should be investigated and eliminated.
|
---|
| 178 | . . D BLD^DIALOG(39140,$P(XMGREC,U,1),"","XMTEXT","F")
|
---|
| 179 | . . D MSG^DIALOG("WE","","","","XMTEXT")
|
---|
| 180 | . D EXPGROUP(XMDUZ,XMIEN,XMREC,XMSTRIKE,$S(XMPREFIX'="":XMPREFIX,1:XMTYPE),XMLATER,.XMGCIRCL)
|
---|
| 181 | . W:$G(XMIA) !,$$EZBLD^DIALOG(39149,$P(XMREC,U,1)) ;Finished with group |1|.
|
---|
| 182 | Q
|
---|
| 183 | REMOTE(XMDUZ,XMG,XMSTRIKE,XMPREFIX,XMLATER) ;
|
---|
| 184 | N XMGM,XMI
|
---|
| 185 | S XMI=0
|
---|
| 186 | F S XMI=$O(^XMB(3.8,XMG,6,XMI)) Q:XMI'>0 D I XMLATER,'$G(XMIA) Q
|
---|
| 187 | . S XMGM=$P(^XMB(3.8,XMG,6,XMI,0),U)
|
---|
| 188 | . Q:XMGM="" ; Really should delete it from the remotes.
|
---|
| 189 | . W:$G(XMIA) !,XMGM
|
---|
| 190 | . Q:XMLATER
|
---|
| 191 | . D DOREMOTE(XMDUZ,XMGM,XMSTRIKE,XMPREFIX,XMLATER)
|
---|
| 192 | Q
|
---|
| 193 | DOREMOTE(XMDUZ,XMGM,XMSTRIKE,XMPREFIX,XMLATER) ;
|
---|
| 194 | N XMERROR,XMFWDADD
|
---|
| 195 | I XMGM[":" D Q:$D(XMERROR)
|
---|
| 196 | . I XMPREFIX="" D
|
---|
| 197 | . . D PREFIX^XMXADDR(.XMGM,.XMPREFIX)
|
---|
| 198 | . E D
|
---|
| 199 | . . D PREFIX^XMXADDR(.XMGM)
|
---|
| 200 | . I $D(XMERROR) S ^TMP("XM",$J,"GRPERR",XMG,"R",XMGM)=$$GETERR^XMXADDR4
|
---|
| 201 | D REMOTE^XMXADDR3(XMDUZ,XMGM,XMSTRIKE,XMPREFIX,XMLATER)
|
---|
| 202 | I '$D(XMERROR) S XMGMBRS=1 Q
|
---|
| 203 | ;37000 - up-arrow out.
|
---|
| 204 | ;37001 - time out.
|
---|
| 205 | ;37002 - up-arrow or time out.
|
---|
| 206 | ;39015.1 - Not a current recipient.
|
---|
| 207 | ;39133 - Sender not authorized to group.
|
---|
| 208 | I "^37000^37001^37002^39015.1^39133^"[(U_XMERROR_U) S XMGMBRS=1 Q
|
---|
| 209 | S ^TMP("XM",$J,"GRPERR",XMG,"R",XMGM)=$$GETERR^XMXADDR4
|
---|
| 210 | Q
|
---|