| 1 | XMTDL2 ;ISC-SF/GMB-Deliver local mail to mailbox (cont.) ;04/17/2002  11:31
 | 
|---|
| 2 |  ;;8.0;MailMan;;Jun 28, 2002
 | 
|---|
| 3 |  ; Replaces ^XMADJF1B (ISC-WASH/CAP)
 | 
|---|
| 4 |  ; XMTO     Recipient DUZ
 | 
|---|
| 5 |  ; XMZ      Original XMZ
 | 
|---|
| 6 |  ; XMZSUBJ  Msg subject
 | 
|---|
| 7 |  ; XMZFROM  Who sent the original message
 | 
|---|
| 8 |  ; XMFROM   Who sent the msg or reply, or who forwarded the msg
 | 
|---|
| 9 |  ; XMREPLY  0=msg is not a reply; 1=msg is a reply
 | 
|---|
| 10 |  ; XMK      Basket number (or name) to deliver to (as specified by sender XMFROM)
 | 
|---|
| 11 |  ; XMDEL    Delete Date (as specified by sender XMZFROM)
 | 
|---|
| 12 |  ; XMKCURR  Basket the msg is currently in
 | 
|---|
| 13 | DELIVER(XMTO,XMZ,XMZSUBJ,XMZFROM,XMFROM,XMREPLY,XMK,XMDEL,XMZBSKT) ;
 | 
|---|
| 14 |  N XMKCURR,XMACT
 | 
|---|
| 15 |  I +XMTO'>0!'$D(^XMB(3.7,XMTO,2)) Q  ; Do not deliver if invalid mailbox
 | 
|---|
| 16 |  S XMFROM=+$G(XMFROM),XMREPLY=+$G(XMREPLY),XMK=$G(XMK),XMDEL=+$G(XMDEL),XMZBSKT=$G(XMZBSKT)
 | 
|---|
| 17 |  I XMTO=.6,XMREPLY Q  ; Do not deliver response to Shared,Mail
 | 
|---|
| 18 |  S XMKCURR=$O(^XMB(3.7,"M",XMZ,XMTO,0)) ; Get basket it is in
 | 
|---|
| 19 |  I XMKCURR D  Q  ; Already in a basket (ignore any basket sender may have specified)
 | 
|---|
| 20 |  . Q:'XMREPLY  ; If this is a reply, continue, else it must be a forwarded msg, so quit.
 | 
|---|
| 21 |  . I XMKCURR=.5 D  Q  ; Msg is in waste basket
 | 
|---|
| 22 |  . . D CHEKBSKT(XMTO,.XMK,XMZSUBJ,XMZFROM,XMZBSKT,.XMACT) ; Where should it go?
 | 
|---|
| 23 |  . . Q:XMK=.5
 | 
|---|
| 24 |  . . D MOVENEW(XMFROM,XMTO,XMK,XMZ,.XMACT) ; Move msg and make it new.
 | 
|---|
| 25 |  . ; Msg is not in waste basket.  Make the msg new.
 | 
|---|
| 26 |  . Q:$D(^XMB(3.7,XMTO,"N0",XMKCURR,XMZ))  ; Already new.
 | 
|---|
| 27 |  . D:XMFROM'=XMTO MAKENEW(XMTO,XMKCURR,XMZ)
 | 
|---|
| 28 |  ; Not yet in a basket.
 | 
|---|
| 29 |  ; Reinstated user may not see replies to old msgs which he doesn't already have.
 | 
|---|
| 30 |  I XMREPLY,$P(^XMB(3.7,XMTO,0),U,7) Q:$$SECRET($P(^(0),U,7),XMZ)
 | 
|---|
| 31 |  S:$G(XMK)="" XMK=0
 | 
|---|
| 32 |  I +XMK=XMK D
 | 
|---|
| 33 |  . D CHEKBSKT(XMTO,.XMK,XMZSUBJ,XMZFROM,XMZBSKT,.XMACT)
 | 
|---|
| 34 |  E  D
 | 
|---|
| 35 |  . S XMK=$$NAMEBSKT(XMTO,XMK,"Y")
 | 
|---|
| 36 |  D ADDNEW($S(XMREPLY:XMFROM,1:XMZFROM),XMTO,XMK,XMZ,XMDEL,.XMACT,XMREPLY)
 | 
|---|
| 37 |  Q
 | 
|---|
| 38 | CHEKBSKT(XMTO,XMK,XMZSUBJ,XMZFROM,XMZBSKT,XMACT) ; Basket number (or no basket at all)
 | 
|---|
| 39 |  N XMREC
 | 
|---|
| 40 |  S XMREC=$G(^XMB(3.7,XMTO,16))
 | 
|---|
| 41 |  ; If the message hasn't been sent to a specific basket for this user
 | 
|---|
| 42 |  ; and the sender specified a delivery basket, and the recipient is
 | 
|---|
| 43 |  ; OK with that, then use the delivery basket.
 | 
|---|
| 44 |  ; Note: The IN basket is not considered a 'specific basket'.
 | 
|---|
| 45 |  I XMK<2,XMZBSKT'="","^^N^"'[(U_$P(XMREC,U,2)_U) S XMK=$$NAMEBSKT(XMTO,XMZBSKT,$P(XMREC,U,2)) Q:XMK
 | 
|---|
| 46 |  ; If the message hasn't been sent to a specific basket for this user
 | 
|---|
| 47 |  ; and active filters exist, and filtering is turned on,
 | 
|---|
| 48 |  ; then filter the message.
 | 
|---|
| 49 |  I XMK<2,$D(^XMB(3.7,XMTO,15,"AF")),$P(XMREC,U,1)="Y" D FILTER^XMTDF(XMTO,XMZ,XMZSUBJ,XMZFROM,.XMK,"",.XMACT) Q
 | 
|---|
| 50 |  ; The message was sent to a specific basket for this user.
 | 
|---|
| 51 |  I XMK Q:$D(^XMB(3.7,XMTO,2,XMK,0))  ; Quit if the basket XMK exists.
 | 
|---|
| 52 |  S XMK=1 ; Since the basket doesn't exist, force to the IN basket
 | 
|---|
| 53 |  Q:$D(^XMB(3.7,XMTO,2,XMK,0))  ; Quit if the IN basket exists.
 | 
|---|
| 54 |  D MAKEBSKT^XMXBSKT(XMTO,XMK,$$EZBLD^DIALOG(37005)) ; Create the "IN" basket
 | 
|---|
| 55 |  Q
 | 
|---|
| 56 | NAMEBSKT(XMTO,XMKN,XMZBOK) ; Basket name (not number)
 | 
|---|
| 57 |  N XMK
 | 
|---|
| 58 |  S XMK=$O(^XMB(3.7,XMTO,2,"B",XMKN,0))
 | 
|---|
| 59 |  S:'XMK XMK=$$FIND1^DIC(3.701,","_XMTO_",","X",$$LOW^XLFSTR(XMKN))
 | 
|---|
| 60 |  I XMK D  Q XMK
 | 
|---|
| 61 |  . Q:XMZBOK'="S"  ; 'YES' or 'EXISTING ONLY'
 | 
|---|
| 62 |  . S:$P(^XMB(3.7,XMTO,2,XMK,0),U,3)'="Y" XMK=0  ; 'SELECTED ONLY'
 | 
|---|
| 63 |  ; Basket not found
 | 
|---|
| 64 |  Q:XMZBOK'="Y" 0  ; quit if not 'YES'
 | 
|---|
| 65 |  I XMKN=$$EZBLD^DIALOG(37004) S XMK=.5 D MAKEBSKT^XMXBSKT(XMTO,XMK,XMKN) Q XMK  ; "WASTE"
 | 
|---|
| 66 |  I XMKN=$$EZBLD^DIALOG(37005) S XMK=1 D MAKEBSKT^XMXBSKT(XMTO,XMK,XMKN) Q XMK  ; "IN"
 | 
|---|
| 67 |  D MAKEBSKT^XMXBSKT(XMTO,.XMK,XMKN)
 | 
|---|
| 68 |  Q XMK
 | 
|---|
| 69 | ADDNEW(XMFROM,XMTO,XMK,XMZ,XMDEL,XMACT,XMREPLY) ;
 | 
|---|
| 70 |  N XMFDA,XMIENS,XMIEN,XMTRIES
 | 
|---|
| 71 |  S XMIENS="+1,"_XMK_","_XMTO_","
 | 
|---|
| 72 |  S XMIEN(1)=XMZ
 | 
|---|
| 73 |  S XMFDA(3.702,XMIENS,.01)=XMZ
 | 
|---|
| 74 |  I XMK'=.5 D
 | 
|---|
| 75 |  . I XMFROM'=XMTO D
 | 
|---|
| 76 |  . . I $G(XMACT("NONEW")),'$$RESP^XMXUTIL2(XMZ),$$ZREAD^XMXUTIL2(XMTO,XMZ)="" Q
 | 
|---|
| 77 |  . . S XMFDA(3.702,XMIENS,3)=1  ; new flag
 | 
|---|
| 78 |  . . D INCRNEW^XMXUTIL(XMTO,XMK)  ; New counts
 | 
|---|
| 79 |  . I $G(XMACT("VDAYS")) D  Q
 | 
|---|
| 80 |  . . S XMFDA(3.702,XMIENS,5)=$$FMADD^XLFDT(DT,XMACT("VDAYS"))  ; vapor date
 | 
|---|
| 81 |  . . S XMFDA(3.702,XMIENS,7)=0  ; vapor date set by user
 | 
|---|
| 82 |  . I XMDEL S XMFDA(3.702,XMIENS,5)=XMDEL  ; vapor date
 | 
|---|
| 83 |  ; Basket sequence number (XMKZ), and priority & new xrefs are handled by FM triggers.
 | 
|---|
| 84 | ATRY D UPDATE^DIE("S","XMFDA","XMIEN")
 | 
|---|
| 85 |  I '$D(DIERR) D  Q
 | 
|---|
| 86 |  . Q:'$D(XMACT("FWD"))
 | 
|---|
| 87 |  . I 'XMREPLY,XMFROM'=XMTO D FORWARD(XMTO,XMZ,XMACT("FWD"))
 | 
|---|
| 88 |  S XMTRIES=$G(XMTRIES)+1
 | 
|---|
| 89 |  I $D(^TMP("DIERR",$J,"E",110)) H 1 G ATRY ; Try again if can't lock
 | 
|---|
| 90 |  Q
 | 
|---|
| 91 | MAKENEW(XMTO,XMK,XMZ) ;
 | 
|---|
| 92 |  ; We ignore any "vapor" date here because this is an existing msg
 | 
|---|
| 93 |  N XMFDA,XMREC
 | 
|---|
| 94 |  S XMREC=$G(^XMB(3.7,XMTO,2,XMK,1,XMZ,0))
 | 
|---|
| 95 |  I XMREC="" D  Q:XMREC=""
 | 
|---|
| 96 |  . ; Message entry should have been there, but it wasn't.  Add it.
 | 
|---|
| 97 |  . D FIXBSKT(XMTO,XMK,XMZ)
 | 
|---|
| 98 |  . S XMREC=$G(^XMB(3.7,XMTO,2,XMK,1,XMZ,0)) Q:XMREC'=""
 | 
|---|
| 99 |  . D ADDNEW(0,XMTO,XMK,XMZ,0)
 | 
|---|
| 100 |  S XMFDA(3.702,XMZ_","_XMK_","_XMTO_",",3)=1  ; new flag
 | 
|---|
| 101 |  ; Delete 'automatic delete date' if it was set by the system
 | 
|---|
| 102 |  ; (during IN BASKET PURGE).
 | 
|---|
| 103 |  S:$P(XMREC,U,7) XMFDA(3.702,XMZ_","_XMK_","_XMTO_",",5)="@"
 | 
|---|
| 104 |  L +^XMB(3.7,XMTO,2,XMK,1,XMZ,0):1 ; Lock message
 | 
|---|
| 105 |  ; Priority & new xrefs are handled by FM triggers.
 | 
|---|
| 106 |  D FILE^DIE("","XMFDA")
 | 
|---|
| 107 |  L -^XMB(3.7,XMTO,2,XMK,1,XMZ,0)
 | 
|---|
| 108 |  D INCRNEW^XMXUTIL(XMTO,XMK) ; New counts
 | 
|---|
| 109 |  Q
 | 
|---|
| 110 | SECRET(XMDATE,XMZ) ;
 | 
|---|
| 111 |  ; Don't need to check to see if the user already has the msg, because
 | 
|---|
| 112 |  ; at this point, we already know that he doesn't.
 | 
|---|
| 113 |  N XMCRE8
 | 
|---|
| 114 |  S XMCRE8=$P($G(^XMB(3.9,XMZ,.6)),U)
 | 
|---|
| 115 |  Q $S('XMCRE8:0,XMDATE>XMCRE8:1,1:0)  ; 1 means user may NOT see the msg.
 | 
|---|
| 116 | MOVENEW(XMFROM,XMTO,XMK,XMZ,XMACT) ; Move msg from WASTE bskt and make new
 | 
|---|
| 117 |  N XMFDA,XMREC,XMIENS,XMIEN,XMTRIES
 | 
|---|
| 118 |  S XMREC=$G(^XMB(3.7,XMTO,2,.5,1,XMZ,0))
 | 
|---|
| 119 |  I XMREC="" D  Q:XMREC=""
 | 
|---|
| 120 |  . ; Message entry should have been there, but it wasn't.
 | 
|---|
| 121 |  . D FIXBSKT(XMTO,.5,XMZ)
 | 
|---|
| 122 |  . S XMREC=$G(^XMB(3.7,XMTO,2,.5,1,XMZ,0)) Q:XMREC'=""
 | 
|---|
| 123 |  . D ADDNEW(XMFROM,XMTO,XMK,XMZ,0)
 | 
|---|
| 124 |  S XMIENS="+1,"_XMK_","_XMTO_","
 | 
|---|
| 125 |  S XMIEN(1)=XMZ
 | 
|---|
| 126 |  S XMFDA(3.702,XMIENS,.01)=XMZ
 | 
|---|
| 127 |  S:XMFROM'=XMTO XMFDA(3.702,XMIENS,3)=1 ; new flag
 | 
|---|
| 128 |  S:$P(XMREC,U,4) XMFDA(3.702,XMIENS,4)=$P(XMREC,U,4) ; date last accessed
 | 
|---|
| 129 |  ;I '$P(XMREC,U,7),$P(XMREC,U,5)>DT S XMFDA(3.702,XMIENS,5)=$P(XMREC,U,5) ; vapor date set by user, not system
 | 
|---|
| 130 |  I $G(XMACT("VDAYS")) D
 | 
|---|
| 131 |  . S XMFDA(3.702,XMIENS,5)=$$FMADD^XLFDT(DT,XMACT("VDAYS"))  ; vapor date
 | 
|---|
| 132 |  . S XMFDA(3.702,XMIENS,7)=0  ; vapor date set by user
 | 
|---|
| 133 | MTRY D UPDATE^DIE("S","XMFDA","XMIEN")
 | 
|---|
| 134 |  I '$D(DIERR) D  Q
 | 
|---|
| 135 |  . D:XMFROM'=XMTO INCRNEW^XMXUTIL(XMTO,XMK) ; Increment new counts
 | 
|---|
| 136 |  . N DA,DIK
 | 
|---|
| 137 |  . S DA(2)=XMTO,DA(1)=.5,DA=XMZ
 | 
|---|
| 138 |  . S DIK="^XMB(3.7,"_XMTO_",2,.5,1,"
 | 
|---|
| 139 |  . D ^DIK ; delete msg from waste bskt
 | 
|---|
| 140 |  S XMTRIES=$G(XMTRIES)+1
 | 
|---|
| 141 |  I $D(^TMP("DIERR",$J,"E",110)) H 1 G MTRY ; Try again if can't lock
 | 
|---|
| 142 |  Q
 | 
|---|
| 143 | FIXBSKT(XMTO,XMK,XMZ) ; Basket integrity check
 | 
|---|
| 144 |  N XMERROR ; (set in ^XMUT4)
 | 
|---|
| 145 |  L +^XMB(3.7,XMTO,2,XMK):1
 | 
|---|
| 146 |  K ^XMB(3.7,"M",XMZ,XMTO,XMK) ; This xref is wrong.
 | 
|---|
| 147 |  D BSKT^XMUT4(XMTO,XMK)
 | 
|---|
| 148 |  L -^XMB(3.7,XMTO,2,XMK)
 | 
|---|
| 149 |  Q
 | 
|---|
| 150 | FORWARD(XMTO,XMZ,XMFIEN) ;
 | 
|---|
| 151 |  ; XMFIEN  IEN of the filter which activated.
 | 
|---|
| 152 |  N XMUPTR
 | 
|---|
| 153 |  S XMUPTR=+$O(^XMB(3.9,XMZ,1,"C",XMTO,0))
 | 
|---|
| 154 |  Q:$P($G(^XMB(3.9,XMZ,1,XMUPTR,0)),U,13)'=""  ; already forwarded once.
 | 
|---|
| 155 |  N XMFDA
 | 
|---|
| 156 |  S XMFDA(3.91,XMUPTR_","_XMZ_",",15)=XMFIEN
 | 
|---|
| 157 |  D FILE^DIE("","XMFDA")
 | 
|---|
| 158 |  Q
 | 
|---|