Import of revision 19971210+
[mspang/plceo1.git] / member.pl
1 #
2 # Date                  Name                            Modification
3 # ----          ----                ------------
4 # 94/11/20              Alex Brodsky            Split off from main ceo file
5 # 94/12/10              Ian Goldberg            Added the memlist, do{term,all}mem
6 #                                                                       functions that Alex forgot
7 # 95/03/08      Zygo Blaxell            Scan member database when adding new
8 #                                                                       users - forbid duplicate {user,student}id,
9 #                                                                       print warning messages for names, phone #
10 # 95/05/08      Nikita Borisov      Add an option to renew membership without
11 #                                   a password
12 # 95/06/01              Nikita Borisov          Added a "print who I am" for above routine
13 # 96/10/23              Nikita Borisov          Use dbmtie instead of fakedbm
14 # 97/12/10      Michael Farebrother     Added links to common routines
15 #                                       used when creating new members
16 #                                       (Buy Quota, Create Account, PwChange)
17
18 #
19
20
21 sub membermenu
22 {
23     local($menu);
24     local($useCAPTERM) = $CAPTERM;
25     if ($NEXTTERMMEMBER)
26     {
27         $useCAPTERM = $NEXTTERM;
28         $useCAPTERM =~ tr/a-z/A-Z/;
29     }
30     $menu = <<EOM;
31
32 NOTE: If you were last a member in S93 or later, and wish to become a member
33       for $useCAPTERM or later, choose (O).  Otherwise, choose (N).
34
35 Choose an option:
36   Buy membership for (N)ew member
37   Buy membership for (O)ld member
38   Buy membership for old member (W)ithout password
39   (T)his term's members
40   (A)ll members on file
41   (B)uy quota for $useCAPTERM term (also on Quota menu)
42   (C)reate csclub account (also on Admin menu)
43   Csclub (P)assword change (also on Admin menu)
44   (M)ain menu
45
46 (N,O,W,T,A,B,C,P,M): 
47 EOM
48
49     @opts = ('ndonewmember','odooldmember','wdowopasswd','tdotermmem',
50         'adoallmem','bdobuyquota','cdoaccount','pdopwchange','mmainmenu');
51     $choice = &domenu($menu, @opts);
52     return $choice;
53 }
54
55 sub AddNTerms
56 {
57         local($list, $start, $num) = @_[0,1,2];
58         local(@terms,@find);
59         local($i,$t,$t1);
60     @terms = split(/,/,$list);
61         ## What term to start at?
62         foreach $t1 (@terms)
63         {
64                 $t = $t1;
65                 &IncTerm($t);
66                 $start = $t if &CmpTerm($start,$t) < 0;
67         }
68         ## Add the new terms
69         $TERMRANGE = $start;
70         @TERMRANGE = ();
71         for($i=1;$i<=$num;++$i)
72         {
73                 unshift(@terms,$start);
74                 unshift(@TERMRANGE, $start);
75                 &IncTerm($start) unless $i == $num;
76         }
77         $TERMRANGE .= "-$start" if $TERMRANGE ne $start;
78         $TERMRANGE =~ y/a-z/A-Z/;
79     $_[0] = join(',',@terms);
80 }
81
82 sub IncTerm
83 {
84         $_[0] =~ y/wWsSfF/sSfFwW/;
85         local($tm, $yr) = $_[0] =~ /^([wWsSfF])(\d+)$/;
86         if ($tm =~ /[wW]/)
87         {
88                 $yr++;
89                 $yr %= 100;
90                 $yr = "0$yr" if $yr < 10;
91                 $_[0] = "$tm$yr";
92         }
93 }
94
95 sub CmpTerm
96 {
97         local($tm0, $yr0) = $_[0] =~ /^([wWsSfF])(\d+)$/;
98         local($tm1, $yr1) = $_[1] =~ /^([wWsSfF])(\d+)$/;
99         $tm0 =~ y/wWsSfF/001122/;
100         $tm1 =~ y/wWsSfF/001122/;
101         $yr0 += 100 if $yr0 < 90;
102         $yr1 += 100 if $yr1 < 90;
103         "$yr0.$tm0" <=> "$yr1.$tm1";
104 }
105
106 sub MemThisTerm
107 {
108         local($terms) = $_[0];
109         grep(/$TERM/, split(/,/, $terms)) ||
110                 ($NEXTTERMMEMBER && grep(/$NEXTTERM/,split(/,/, $terms)));
111 }
112
113
114
115 sub donewmember
116 {
117     local($useTERM) = $TERM;
118     local($useCAPTERM) = $CAPTERM;
119         local($numterms) = 1;
120     if ($NEXTTERMMEMBER)
121     {
122         $useTERM = $NEXTTERM;
123         $useCAPTERM = $useTERM;
124         $useCAPTERM =~ tr/a-z/A-Z/;
125     }
126     eval { dbmtie($MEMDB,\%MEM) } || do
127     {
128         print "\n${beep}Unable to open members database: $!\n";
129         return;
130     };
131     local($pos) = 0;
132     local($i,$filled);
133     foreach $i (sort {$a<=>$b} (grep(/^\d+$/,keys %MEM)))
134     {
135         last if $i != $pos;
136         ++$pos;
137     }
138         # UserID check by zblaxell
139         local(%member_userids,%member_studentids,%member_names,%member_phones);
140         foreach (grep(/^\d+$/,keys(%MEM))) {
141                 local($my_)=$MEM{$_};
142                 $my_ =~ tr/A-Z/a-z/;
143                 $my_ =~ tr/a-z0-9;\@//dc;
144                 local($name,$studentid,$program,$phone,$userid)=split(/;/,$my_);
145                 $userid =~ s/\@.*$//;
146                 $userid=substr($userid,0,8);
147                 $member_userids{$userid}.="$_, ";
148                 $member_names{$name}.="$_, ";
149                 $member_studentids{$studentid}.="$_, ";
150                 $member_phones{$phone}.="$_, ";
151         }
152     dbmuntie(\%MEM);
153     local($filled) = &memupdate(";;;;;;;");
154     if ($filled eq "")
155     {
156         return;
157     }
158         local($myfilled)=$filled;
159         $myfilled =~ tr/A-Z/a-z/;
160         $myfilled =~ tr/a-z0-9;\@//dc;
161         local($name,$studentid,$program,$phone,$userid)=split(/;/,$myfilled);
162         if ($phone && $member_phones{$phone}) {
163                 print "\n${beep}Warning: Phone number $phone belongs to member(s) $member_phones{$phone}continuing...\n";
164         }
165         if ($name && $member_names{$name}) {
166                 print "\n${beep}Warning: Name $name belongs to member(s) $member_names{$name}continuing...\n";
167         }
168         $userid =~ s/\@.*$//;
169         $userid = substr($userid,0,8);
170         if ($userid && $member_userids{$userid}) {
171                 print "\n${beep}UserID $userid belongs to member(s) $member_userids{$userid}aborting.\n\n";
172                 return;
173         }
174         if ($studentid && $member_studentids{$studentid}) {
175                 print "\n${beep}StudentID $studentid belongs to member(s) $member_studentids{$studentid}aborting.\n\n";
176                 return;
177         }
178     print "\nEnter number of terms (\$$MEMBERFEE each): ";
179     chop($numterms = <STDIN>);
180     $numterms =~ s/\D//g;
181     if ($numterms == 0)
182     {
183         print "\n${beep}No number entered - aborting.\n\n";
184         return;
185     }
186     if ($numterms < 1 || $numterms > 200)
187     {
188         print "\n${beep}Don't be silly - aborting.\n\n";
189         return;
190     }
191     @recs = split(/;/,$filled);
192         $recs[7] .= '';
193         &AddNTerms($recs[7], $useTERM, $numterms);
194     $filled = join(';',@recs);
195
196     eval { dbmtie($MEMDB,\%MEM) } || do
197     {
198         print "\n${beep}Unable to open members database: $!\n";
199         return;
200     };
201         foreach $tt (@TERMRANGE)
202         {
203                 local($termmem) = $MEM{$tt};
204                 @mems = split(/,/,$termmem);
205                 @find = grep($_ == $pos, @mems);
206                 unshift(@mems,$pos) if $#find < 0;
207                 $MEM{$tt} = join(',',sort {$a<=>$b} @mems);
208         }
209     $MEM{$pos} = $filled;
210     dbmuntie(\%MEM);
211         # zblaxell:  replaced these with '$MEMDB'
212     #&Backup("$MEMDB.dir");
213     #&Backup("$MEMDB.pag");
214     &Backup("$MEMDB");
215     print "\nInfo for membership card:\n\nName: $recs[0]\nNum : $pos\nTerm: $TERMRANGE\n";
216     &UpdateCashlog($MEMBERFEE * $numterms,"New member #$pos ($recs[0]) for $TERMRANGE");
217     &Gopher_Members;
218 }
219
220 sub dowopasswd
221 {
222     local($useTERM) = $TERM;
223     local($useCAPTERM) = $CAPTERM;
224         local($numterms) = 1;
225     if ($NEXTTERMMEMBER)
226     {
227         $useTERM = $NEXTTERM;
228         $useCAPTERM = $useTERM;
229         $useCAPTERM =~ tr/a-z/A-Z/;
230     }
231     print "\nEnter member number: ";
232     local($memnum);
233     chop($memnum = <STDIN>);
234     $memnum =~ s/\D//g;
235     if ($memnum == 0)
236     {
237         print "\n${beep}No number entered - aborting.\n\n";
238         return;
239     }
240     eval { dbmtie($MEMDB,\%MEM) } || do
241     {
242         print "\n${beep}Unable to open members database: $!\n";
243         return;
244     };
245     unless (defined $MEM{$memnum})
246     {
247         print "\n${beep}There is no member number $memnum on record - aborting.\n\n";
248         return;
249     }
250     local($filled) = $MEM{$memnum};
251     dbmuntie(\%MEM);
252
253 #    local($filled) = &memupdate($template);
254     if ($filled eq "")
255     {
256         return;
257     }
258         @recs = split(/;/,$filled);
259         print "\n$recs[0]\n";
260     print "\nEnter number of terms (\$$MEMBERFEE each): ";
261     chop($numterms = <STDIN>);
262     $numterms =~ s/\D//g;
263     if ($numterms == 0)
264     {
265         print "\n${beep}No number entered - aborting.\n\n";
266         return;
267     }
268     if ($numterms < 1 || $numterms > 200)
269     {
270         print "\n${beep}Don't be silly - aborting.\n\n";
271         return;
272     }
273         $recs[7] .= '';
274         &AddNTerms($recs[7], $useTERM, $numterms);
275     $filled = join(';',@recs);
276
277     eval { dbmtie($MEMDB,\%MEM) } || do
278     {
279         print "\n${beep}Unable to open members database: $!\n";
280         return;
281     };
282         local($tt);
283         foreach $tt (@TERMRANGE)
284         {
285                 local($termmem) = $MEM{$tt};
286                 @mems = split(/,/,$termmem);
287                 @find = grep($_ == $memnum, @mems);
288                 unshift(@mems,$memnum) if $#find < 0;
289                 $MEM{$tt} = join(',',sort {$a<=>$b} @mems);
290         }
291     $MEM{$memnum} = $filled;
292     dbmuntie(\%MEM);
293     &Backup("$MEMDB.dir");
294     &Backup("$MEMDB.pag");
295     print "\nInfo for membership card:\n\nName: $recs[0]\nNum : $memnum\nTerm: $TERMRANGE\n";
296     &UpdateCashlog($MEMBERFEE * $numterms,"Old member #$memnum ($recs[0]) for $TERMRANGE");
297     &Gopher_Members;
298 }
299
300 sub dooldmember
301 {
302     local($useTERM) = $TERM;
303     local($useCAPTERM) = $CAPTERM;
304         local($numterms) = 1;
305     if ($NEXTTERMMEMBER)
306     {
307         $useTERM = $NEXTTERM;
308         $useCAPTERM = $useTERM;
309         $useCAPTERM =~ tr/a-z/A-Z/;
310     }
311     print "\nEnter member number: ";
312     local($memnum);
313     chop($memnum = <STDIN>);
314     $memnum =~ s/\D//g;
315     if ($memnum == 0)
316     {
317         print "\n${beep}No number entered - aborting.\n\n";
318         return;
319     }
320     eval { dbmtie($MEMDB,\%MEM) } || do
321     {
322         print "\n${beep}Unable to open members database: $!\n";
323         return;
324     };
325     unless (defined $MEM{$memnum})
326     {
327         print "\n${beep}There is no member number $memnum on record - aborting.\n\n";
328         return;
329     }
330     local($template) = $MEM{$memnum};
331     dbmuntie(\%MEM);
332
333     local($filled) = &memupdate($template);
334     if ($filled eq "")
335     {
336         return;
337     }
338     print "\nEnter number of terms (\$$MEMBERFEE each): ";
339     chop($numterms = <STDIN>);
340     $numterms =~ s/\D//g;
341     if ($numterms == 0)
342     {
343         print "\n${beep}No number entered - aborting.\n\n";
344         return;
345     }
346     if ($numterms < 1 || $numterms > 200)
347     {
348         print "\n${beep}Don't be silly - aborting.\n\n";
349         return;
350     }
351     @recs = split(/;/,$filled);
352         $recs[7] .= '';
353         &AddNTerms($recs[7], $useTERM, $numterms);
354     $filled = join(';',@recs);
355
356     eval { dbmtie($MEMDB,\%MEM) } || do
357     {
358         print "\n${beep}Unable to open members database: $!\n";
359         return;
360     };
361         local($tt);
362         foreach $tt (@TERMRANGE)
363         {
364                 local($termmem) = $MEM{$tt};
365                 @mems = split(/,/,$termmem);
366                 @find = grep($_ == $memnum, @mems);
367                 unshift(@mems,$memnum) if $#find < 0;
368                 $MEM{$tt} = join(',',sort {$a<=>$b} @mems);
369         }
370     $MEM{$memnum} = $filled;
371         dbmuntie(\%MEM);
372 #    &Backup("$MEMDB.dir");
373 #    &Backup("$MEMDB.pag");
374 # nborisov: replaced with $MEMDB
375         &Backup($MEMDB);
376     print "\nInfo for membership card:\n\nName: $recs[0]\nNum : $memnum\nTerm: $TERMRANGE\n";
377     &UpdateCashlog($MEMBERFEE * $numterms,"Old member #$memnum ($recs[0]) for $TERMRANGE");
378     &Gopher_Members;
379 }
380
381 sub memupdate
382 {
383     local($template) = shift;
384     @tempfields = split(/;/,$template);
385     local($pw1,$pw2);
386     if ($tempfields[5] ne "" && $ENV{'CALUM'} != 1)
387     {
388         print "Enter your CSC password: ";
389         $pw1 = &GetPass;
390         if (crypt($pw1,$tempfields[5]) ne $tempfields[5])
391         {
392             print "\n${beep}Incorrect password.\n\n";
393             return "";
394         }
395     }
396
397     local($t5,$t7);
398     $t5 = $tempfields[5];
399     $t7 = $tempfields[7];
400     &Editscreen(<<EOT);
401 Please fill in the following information as completely as you can.
402
403 Name            : $tempfields[0]
404 Student ID      : $tempfields[1]
405 Year and Program: $tempfields[2]
406 Phone number    : $tempfields[3]
407
408 If you _already have_ a userid on a UW computer, fill it in below.
409 Otherwise, if you have an account somewhere else, fill it in below.
410 Otherwise, leave this blank.
411
412 Userid          : $tempfields[4]
413
414 Currently a member for $t7
415 EOT
416     &VI;
417     @tempfields = split("\n",&Filterscreen);
418     grep(s/;/:/,@tempfields);
419     $tempfields[5] = $t5;
420     $tempfields[7] = $t7;
421     if ($tempfields[0] =~ /^\s*$/)
422     {
423         print "\n${beep}No name supplied - aborting\n";
424         return "";
425     }
426     $tempfields[3] =~ s/[^x\d\(\)-]//g;
427     chop($tempfields[6] = `date`);
428     if ($tempfields[5] eq "")
429     {
430         print "\nYou may now choose a CSC password.  If you do not wish one, just press Return.\nPlease choose one that is EASY TO REMEMBER (like your cat's name):\n";
431         while(1)
432         {
433             print "Enter password: ";
434             $pw1 = &GetPass;
435             last if $pw1 eq "";
436             print "Enter it again: ";
437             $pw2 = &GetPass;
438             last if ($pw1 eq $pw2);
439             print "\n${beep}No match.\n\n";
440         }
441         if ($pw1 ne "")
442         {
443             $salt = "";
444             $salt .= sprintf("%c", int(rand(26))+ord('A'));
445             $salt .= sprintf("%c", int(rand(26))+ord('A'));
446             $pw1 = crypt($pw1,$salt);
447         }
448         $tempfields[5] = $pw1;
449     }
450     $template = join(';',@tempfields);
451     return($template);
452 }
453
454 sub dotermmem
455 {
456     &memlist($TERM);
457 }
458
459 sub doallmem
460 {
461     &memlist("");
462 }
463
464 sub memlist
465 {
466     local($nummems);
467     local($scope) = shift;
468     open (SCRMEMBER, ">$editfile") || do
469     {
470         print "\n${beep}Unable to open output file: $!\n";
471         return;
472     };
473     eval { dbmtie($MEMDB,\%MEM) } || do
474     {
475         print "\n${beep}Unable to open member database: $!\n";
476         close(SCRMEMBER);
477         return;
478     };
479     if ($scope eq "")
480     {
481         @list = sort {$a<=>$b} grep(/^\d+$/,keys %MEM);
482     }
483     else
484     {
485         @list = sort {$a<=>$b} split(/,/,$MEM{$scope});
486     }
487     select(SCRMEMBER);
488     $-=0;
489     $= = $ROWS - 1;
490     ##$_ = `stty size`; ($=) = /^(\d+)/; $= -= 2;
491     $nummems = 0;
492     foreach $memnum (@list)
493     {
494         ($memname,$memsid,$memprog,$memphone,$memuid,$mempw,$memdate,$memterms)
495             = split(/;/,$MEM{$memnum});
496         write;
497         ++$nummems;
498     }
499     dbmuntie(\%MEM);
500     print "\nTotal: $nummems\n";
501     select(STDOUT);
502     close(SCRMEMBER);
503     &MORE;
504 }
505
506 1;
507