1 | USRLM ; SLC/JER - User Class Membership functions and proc's ; Jan 1, 2004
|
---|
2 | ;;1.0;AUTHORIZATION/SUBSCRIPTION;**2,3,6,7,8,13,16,25,28**;Jun 20, 1997
|
---|
3 | ; 15 Dec 99 MA - Modified entry point TERM
|
---|
4 | ; 14 Feb 00 MA - Add check to verify that x-ref AUC has valid 0 node.
|
---|
5 | ; 27 Jun 00 MA - Changed WHOIS to build array in alphabetical order
|
---|
6 | ; by subscriber name.
|
---|
7 | ISA(USER,CLASS,ERR,USRDT) ; Boolean - Is USER a Member of CLASS?
|
---|
8 | N USRY,USRI
|
---|
9 | I $S(CLASS="USER":1,CLASS=+$O(^USR(8930,"B","USER",0)):1,1:0) S USRY=1 G ISAX
|
---|
10 | I '+USER S USER=+$O(^VA(200,"B",USER,0))
|
---|
11 | I +USER'>0 S ERR="INVALID USER" Q 0
|
---|
12 | I '+CLASS S CLASS=+$O(^USR(8930,"B",CLASS,0))
|
---|
13 | I +CLASS'>0 S ERR="INVALID USER CLASS" Q 0
|
---|
14 | ; If USER is a member of CLASS return true
|
---|
15 | S USRY=0
|
---|
16 | I +$D(^USR(8930.3,"AUC",USER,CLASS)) D
|
---|
17 | . N USRMDA
|
---|
18 | . S USRMDA=0
|
---|
19 | . F S USRMDA=+$O(^USR(8930.3,"AUC",USER,CLASS,USRMDA)) Q:((+USRMDA'>0)!(USRY)) D
|
---|
20 | .. S USRY=+$$CURRENT(USRMDA,$G(USRDT))
|
---|
21 | I USRY Q USRY
|
---|
22 | ; Otherwise, check to see if user is a member of any subclass of CLASS
|
---|
23 | S USRI=0
|
---|
24 | F S USRI=$O(^USR(8930,+CLASS,1,USRI)) Q:+USRI'>0!+$G(USRY) D
|
---|
25 | . N USRSUB S USRSUB=+$G(^USR(8930,+CLASS,1,USRI,0)) Q:+USRSUB'>0
|
---|
26 | . S USRY=$$ISA(USER,USRSUB,,+$G(USRDT)) ; Recurs to find members of subclass
|
---|
27 | ISAX Q +$G(USRY)
|
---|
28 | ;======================================================================
|
---|
29 | ISAWM(USER,CLASS) ; Boolean - Is USER a Member of CLASS, with message.
|
---|
30 | I $$ISA(USER,CLASS) D Q 1
|
---|
31 | . W !,"Already a member of this class"
|
---|
32 | . H 2
|
---|
33 | E Q 0
|
---|
34 | ;
|
---|
35 | ;======================================================================
|
---|
36 | CURRENT(MEMBER,USRDT) ; Boolean - Is Membership current?
|
---|
37 | N USRIN,USROUT,USRY
|
---|
38 | I +$G(USRDT)'>0 S USRDT=DT
|
---|
39 | S USRIN=+$P($G(^USR(8930.3,+MEMBER,0)),U,3)
|
---|
40 | S USROUT=+$P($G(^USR(8930.3,+MEMBER,0)),U,4)
|
---|
41 | I USRIN'>USRDT,$S(USROUT>0&(USROUT'<USRDT):1,USROUT=0:1,1:0) S USRY=1
|
---|
42 | E S USRY=0
|
---|
43 | Q USRY
|
---|
44 | ;
|
---|
45 | ;======================================================================
|
---|
46 | ISTERM(USER) ;Return true if USER has a termination date and that date
|
---|
47 | ;is less than the current date and time. The read is covered by
|
---|
48 | ;DBIA 10060
|
---|
49 | N TERM,TERMDATE
|
---|
50 | S TERM=0
|
---|
51 | I '$D(^VA(200,+USER,0)) D
|
---|
52 | . S TERMDATE=0
|
---|
53 | . W !,"Warning bad data DUZ=",+USER," found in file 8930.3 but does not exist in file 200!"
|
---|
54 | . H 3
|
---|
55 | E S TERMDATE=+$P(^VA(200,+USER,0),U,11)
|
---|
56 | I (TERMDATE>0) D
|
---|
57 | . I TERMDATE<$$NOW^XLFDT S TERM=1
|
---|
58 | Q TERM
|
---|
59 | ;
|
---|
60 | ;======================================================================
|
---|
61 | RESIZE(LONG,SHORT,SHRINK) ; Resizes list area
|
---|
62 | N USRBM S USRBM=$S(VALMMENU:SHORT,+$G(SHRINK):SHORT,1:LONG)
|
---|
63 | I VALM("BM")'=USRBM S VALMBCK="R" D
|
---|
64 | . S VALM("BM")=USRBM,VALM("LINES")=(USRBM-VALM("TM"))+1
|
---|
65 | . I +$G(VALMCC) D RESET^VALM4
|
---|
66 | Q
|
---|
67 | ;======================================================================
|
---|
68 | TERM ;Actions to be taken when a user is terminated. Invoked by
|
---|
69 | ;XU USER TERMINATE. XUIFN is the user being terminated.
|
---|
70 | ;15 DEC 99 MA - Replaced $$NOW^XLFDT with DT. Piece 4 does
|
---|
71 | ;not need the time. Piece 4 is date only.
|
---|
72 | N IND,OLDTERM,NOW
|
---|
73 | S NOW=DT
|
---|
74 | S IND=""
|
---|
75 | F S IND=$O(^USR(8930.3,"B",XUIFN,IND)) Q:IND="" D
|
---|
76 | . S OLDTERM=+$P($G(^USR(8930.3,IND,0)),U,4)
|
---|
77 | . I (OLDTERM>0)&(OLDTERM<NOW) Q
|
---|
78 | . S $P(^USR(8930.3,IND,0),U,4)=NOW
|
---|
79 | Q
|
---|
80 | ;
|
---|
81 | ;======================================================================
|
---|
82 | WHOIS(MEMBER,CLASS) ; Given a Class, return list of CURRENT members
|
---|
83 | ; CLASS is pointer to file 8930
|
---|
84 | ; MEMBER is name of array (local or global) in which members are
|
---|
85 | ; returned in alphabetical order by name
|
---|
86 | N USER,USRCLNM,USRCNT,USRDA,EFFCTV,EXPIRES,USRI,USRNAME,EFFCTV1,EXPIRES1
|
---|
87 | K ^TMP("USRWHOIS",$J)
|
---|
88 | S USER=0,USRCNT=+$P($G(@MEMBER@(0)),U,3)
|
---|
89 | F S USER=$O(^USR(8930.3,"ACU",CLASS,USER)) Q:+USER'>0 D
|
---|
90 | . S USRDA=""
|
---|
91 | . F S USRDA=$O(^USR(8930.3,"ACU",CLASS,USER,USRDA)) Q:USRDA="" D
|
---|
92 | .. S EFFCTV=$P($G(^USR(8930.3,+USRDA,0)),U,3) S:EFFCTV="" EFFCTV1="0000000"
|
---|
93 | .. S EXPIRES=$P($G(^USR(8930.3,+USRDA,0)),U,4) S:EXPIRES="" EXPIRES1=9999999
|
---|
94 | .. S USRCLNM=$$CLNAME(+CLASS)
|
---|
95 | .. S USRNAME=$$GET1^DIQ(200,USER,.01)
|
---|
96 | .. S ^TMP("USRWHOIS",$J,USRNAME,$S(EFFCTV="":EFFCTV1,1:EFFCTV),$S(EXPIRES="":EXPIRES1,1:EXPIRES))=USER_U_USRDA_U_USRCLNM_U_EFFCTV_U_EXPIRES
|
---|
97 | .. S USRCNT=+$G(USRCNT)+1
|
---|
98 | I $D(^TMP("USRWHOIS",$J)) D
|
---|
99 | . S USRNAME="" F S USRNAME=$O(^TMP("USRWHOIS",$J,USRNAME)) Q:USRNAME="" D
|
---|
100 | .. S EFFCTV="" F S EFFCTV=$O(^TMP("USRWHOIS",$J,USRNAME,EFFCTV)) Q:EFFCTV="" Q:EFFCTV>DT D
|
---|
101 | ... S EXPIRES="" F S EXPIRES=$O(^TMP("USRWHOIS",$J,USRNAME,EFFCTV,EXPIRES),-1) Q:EXPIRES="" Q:EXPIRES<DT D
|
---|
102 | .... S @MEMBER@(USRNAME)=$G(^TMP("USRWHOIS",$J,USRNAME,EFFCTV,EXPIRES))
|
---|
103 | I '$D(@MEMBER@(0)) S @MEMBER@(0)=CLASS_U_$P($G(^USR(8930,+CLASS,0)),U)_U
|
---|
104 | S $P(@MEMBER@(0),U,3)=USRCNT
|
---|
105 | S USRI=0 F S USRI=$O(^USR(8930,+CLASS,1,USRI)) Q:+USRI'>0 D
|
---|
106 | . N USRSUB S USRSUB=+$G(^USR(8930,+CLASS,1,USRI,0)) Q:+USRSUB'>0
|
---|
107 | . D WHOIS(MEMBER,USRSUB) ; Recurs to find members of subclass
|
---|
108 | K ^TMP("USRWHOIS",$J)
|
---|
109 | Q
|
---|
110 | WHOIS2(MEMBER,CLASS) ; Given a Class, return list of CURRENT members
|
---|
111 | ; CLASS is pointer to file 8930
|
---|
112 | ; MEMBER is name of array (local or global) in which members are
|
---|
113 | ; returned in alphabetical order by name - indexed by number
|
---|
114 | ; i.e. @MEMBER@(1 ...n)
|
---|
115 | ; @member@(0) = ien of8930^usr class name^count of members
|
---|
116 | ; @member@(1..n)=
|
---|
117 | ; 1 2 3 4 5 6 7 8
|
---|
118 | ; p200^p8930.3^classname^effectdate^inactdate^username^title^mailcode
|
---|
119 | ; Note: For pieces 2,4 & 5 - Only one of potentially many is returned
|
---|
120 | ;
|
---|
121 | N USER,USRNM,USRCLNM,USRCNT,USRDA,USRNDX,EFFCTV,EXPIRES,USRI
|
---|
122 | D WHOISTMP(.CLASS)
|
---|
123 | S USRNM="",USRNDX=0
|
---|
124 | F S USRNM=$O(^TMP($J,"USRWHO2","B",USRNM)) Q:USRNM']"" D
|
---|
125 | . S USER=0 F S USER=$O(^TMP($J,"USRWHO2","B",USRNM,USER)) Q:'USER D
|
---|
126 | . . S USRNDX=USRNDX+1
|
---|
127 | . . S @MEMBER@(USRNDX)=^TMP($J,"USRWHO2",USER)
|
---|
128 | S @MEMBER@(0)=^TMP($J,"USRWHO2",0)
|
---|
129 | S $P(@MEMBER@(0),U,3)=USRNDX
|
---|
130 | K ^TMP($J,"USRWHO2")
|
---|
131 | Q
|
---|
132 | WHOISTMP(CLASS) ; Given a Class, return list of CURRENT members into ^TMP
|
---|
133 | ; CLASS is pointer to file 8930
|
---|
134 | ; MEMBER is name of array (local or global) in which members are
|
---|
135 | ; returned in order by user/x-ref by name
|
---|
136 | ; main = ^tmp($j,"USRWHO2",user)
|
---|
137 | ; x-ref= ^tmp($j,"USRWHO2","b",usrnm,user)
|
---|
138 | ; -- used by whois2 call
|
---|
139 | N USER,USRNM,USRCLNM,USRCNT,USRDA,EFFCTV,EXPIRES,USRI,USRMC,USRTIT,USRX
|
---|
140 | S USER=0,USRCNT=+$P($G(@MEMBER@(0)),U,3)
|
---|
141 | F S USER=$O(^USR(8930.3,"ACU",CLASS,USER)) Q:+USER'>0 D
|
---|
142 | . S USRDA=$O(^USR(8930.3,"ACU",CLASS,USER,0)) Q:+USRDA'>0
|
---|
143 | . S EFFCTV=$P($G(^USR(8930.3,+USRDA,0)),U,3)
|
---|
144 | . S EXPIRES=$P($G(^USR(8930.3,+USRDA,0)),U,4)
|
---|
145 | . S USRNM=$P($G(^VA(200,+USER,0)),U)
|
---|
146 | . S USRX=$P($G(^VA(200,+USER,0)),U,9)
|
---|
147 | . S USRTIT=$$EXTERNAL^DILFD(200,8,"",USRX)
|
---|
148 | . S USRMC=$P($G(^VA(200,+USER,5)),U,2)
|
---|
149 | . S USRCLNM=$$CLNAME(+CLASS)
|
---|
150 | . S ^TMP($J,"USRWHO2",USER)=USER_U_USRDA_U_USRCLNM_U_EFFCTV_U_EXPIRES_U_USRNM_U_USRTIT_U_USRMC
|
---|
151 | . S ^TMP($J,"USRWHO2","B",USRNM,USER)=""
|
---|
152 | . S USRCNT=+$G(USRCNT)+1
|
---|
153 | I '$D(^TMP($J,"USRWHO2",0))#2 S ^TMP($J,"USRWHO2",0)=CLASS_U_$P($G(^USR(8930,+CLASS,0)),U)_U
|
---|
154 | S $P(^TMP($J,"USRWHO2",0),U,3)=USRCNT
|
---|
155 | S USRI=0 F S USRI=$O(^USR(8930,+CLASS,1,USRI)) Q:+USRI'>0 D
|
---|
156 | . N USRSUB S USRSUB=+$G(^USR(8930,+CLASS,1,USRI,0)) Q:+USRSUB'>0
|
---|
157 | . D WHOISTMP(USRSUB) ; Recurs to find members of subclass
|
---|
158 | Q
|
---|
159 | WHATIS(USER,CLASS) ; Given a User, return list of class memberships
|
---|
160 | ; USER is pointer to file 200
|
---|
161 | ; CLASS is name of array (local or global) in which the list of
|
---|
162 | ; classes to which the USER belongs will be returned in
|
---|
163 | ; alphabetic order by class name
|
---|
164 | N IND,GROUP,CLASSNM,CLASSCNT,USRCUR,USRDA,EFFCTV,EXPIRES,EFFCTV1
|
---|
165 | K ^TMP("USRWHATIS",$J)
|
---|
166 | S (CLASSCNT,IND,GROUP)=0
|
---|
167 | F S GROUP=$O(^USR(8930.3,"AUC",USER,GROUP)) Q:+GROUP'>0 D
|
---|
168 | . S USRDA=0
|
---|
169 | . F S USRDA=$O(^USR(8930.3,"AUC",USER,GROUP,USRDA)) Q:+USRDA'>0 D
|
---|
170 | .. S USRCUR="E",EFFCTV1=""
|
---|
171 | .. S EFFCTV=$P($G(^USR(8930.3,+USRDA,0)),U,3) S:EFFCTV="" EFFCTV1=DT
|
---|
172 | .. S EXPIRES=$P($G(^USR(8930.3,+USRDA,0)),U,4) S:EXPIRES="" EXPIRES=9999999
|
---|
173 | .. I EFFCTV'>DT,EXPIRES'<DT S USRCUR="C"
|
---|
174 | .. I EFFCTV>DT S USRCUR="F"
|
---|
175 | .. S CLASSNM=$$CLNAME(+GROUP)
|
---|
176 | .. S ^TMP("USRWHATIS",$J,CLASSNM,USRCUR,$S(EFFCTV="":EFFCTV1,1:EFFCTV),EXPIRES)=GROUP_U_USRDA_U_CLASSNM_U_EFFCTV_U_$S(EXPIRES=9999999:"",1:EXPIRES)
|
---|
177 | I $D(^TMP("USRWHATIS",$J)) D
|
---|
178 | . S CLASSNM=""
|
---|
179 | . F S CLASSNM=$O(^TMP("USRWHATIS",$J,CLASSNM)) Q:CLASSNM="" D
|
---|
180 | .. F USRCUR="F","E","C" D
|
---|
181 | ... S EFFCTV=""
|
---|
182 | ... F S EFFCTV=$O(^TMP("USRWHATIS",$J,CLASSNM,USRCUR,EFFCTV)) Q:EFFCTV="" D
|
---|
183 | .... S EXPIRES=""
|
---|
184 | .... F S EXPIRES=$O(^TMP("USRWHATIS",$J,CLASSNM,USRCUR,EFFCTV,EXPIRES)) Q:EXPIRES="" D
|
---|
185 | ..... S IND=IND+1
|
---|
186 | ..... S @CLASS@(CLASSNM_IND)=$G(^TMP("USRWHATIS",$J,CLASSNM,USRCUR,EFFCTV,EXPIRES))
|
---|
187 | ..... S CLASSCNT=+$G(CLASSCNT)+1
|
---|
188 | S @CLASS@(0)=USER_U_$$SIGNAME^USRLS(+USER)_U_CLASSCNT
|
---|
189 | K ^TMP("USRWHATIS",$J)
|
---|
190 | Q
|
---|
191 | CLNAME(CLASS) ; Given a class, return the Display Name
|
---|
192 | N USRREC,USRY
|
---|
193 | S USRREC=$G(^USR(8930,+CLASS,0))
|
---|
194 | Q $S($P(USRREC,U,4)]"":$P(USRREC,U,4),1:$$MIXED^USRLS($P(USRREC,U)))
|
---|
195 | PUT(USER,CLASS) ; Make user a member of a given class
|
---|
196 | N DIC,DLAYGO,DA,DR,DIE,X,Y
|
---|
197 | S (DIC,DLAYGO)=8930.3,DIC(0)="LXF",X=""""_"`"_USER_"""" D ^DIC Q:+Y'>0
|
---|
198 | S DIE=DIC,DA=+Y,DR=".02///"_CLASS_";.03///"_DT
|
---|
199 | D ^DIE
|
---|
200 | Q
|
---|
201 | SUBCLASS(DA,CLASS) ; Evaluate whether a given USER CLASS is a DESCENDENT
|
---|
202 | ; of another class
|
---|
203 | ; Receives DA = record # of possible subclass in 8930, and
|
---|
204 | ; CLASS = record # of possible descendent class in 8930
|
---|
205 | N USRI,USRY S (USRI,USRY)=0
|
---|
206 | I +$G(DA)'>0 S DA=+$O(^USR(8930,"B",DA,0))
|
---|
207 | I +$G(CLASS)'>0 S CLASS=+$O(^USR(8930,"B",CLASS,0))
|
---|
208 | F S USRI=$O(^USR(8930,"AD",DA,USRI)) Q:+USRI'>0!(USRY=1) D
|
---|
209 | . I USRI=CLASS S USRY=1 Q
|
---|
210 | . S USRY=$$SUBCLASS(USRI,CLASS)
|
---|
211 | Q USRY
|
---|
212 | CANDEL(USRCLDA) ; Evaluate whether user can delete a class
|
---|
213 | N USRMLST,USRY S USRY=0
|
---|
214 | D WHOIS("USRMLST",USRCLDA)
|
---|
215 | I +$P(USRMLST(0),U,3)>0 S USRY=1 W " There are members of the class ",$$CLNAME(USRCLDA)
|
---|
216 | Q USRY
|
---|