1 |
dpavlin |
1 |
package WOU_SIS_Util; |
2 |
|
|
|
3 |
|
|
# Banner SIS Utilities |
4 |
|
|
# |
5 |
|
|
# Subs in this package that use DBI expect to be passed a database handle |
6 |
|
|
# ($dbh) that has been granted the appropriate roles by WOU_Secure.pm. |
7 |
|
|
# |
8 |
|
|
# Jeremy Hickerson, 3/15/2002 |
9 |
|
|
|
10 |
|
|
use strict; |
11 |
|
|
|
12 |
|
|
BEGIN { |
13 |
|
|
use Exporter (); |
14 |
|
|
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); |
15 |
|
|
|
16 |
|
|
# set the version for version checking |
17 |
|
|
$VERSION = 1.00; |
18 |
|
|
@ISA = qw(Exporter); |
19 |
|
|
@EXPORT = qw(&xtvxxxx_desc &pass_cobol_params &db_login |
20 |
|
|
&already_sent_letter &term_acyr &ahist_level &term_last_year |
21 |
|
|
&date_last_year &state_name &like2re &ssn2pidm &vnum2pidm |
22 |
|
|
&next_fall); |
23 |
|
|
%EXPORT_TAGS = ( ); # eg: TAG => [ qw!name1 name2! ], |
24 |
|
|
@EXPORT_OK = qw( ); |
25 |
|
|
|
26 |
|
|
( grep /gen\$com/i, @INC ) || unshift @INC, "gen\$com"; |
27 |
|
|
} |
28 |
|
|
|
29 |
|
|
use vars @EXPORT_OK; |
30 |
|
|
use subs qw(xtvxxxx_desc pass_cobol_params db_login already_sent_letter |
31 |
|
|
term_acyr ahist_level term_last_year date_last_year state_name like2re |
32 |
|
|
ssn2pidm vnum2pidm next_fall); |
33 |
|
|
use DBI; |
34 |
|
|
use WOU_Secure; |
35 |
|
|
|
36 |
|
|
|
37 |
|
|
# ============================================================================ |
38 |
|
|
# Package-Level Stuff |
39 |
|
|
# ============================================================================ |
40 |
|
|
|
41 |
|
|
my (%glbh_sth_xtvxxxx_desc, @row); |
42 |
|
|
|
43 |
|
|
my %glb_prepared_sql; # Hash that holds $sth's for prepared sql; |
44 |
|
|
# helps performance. Entries are of the form: |
45 |
|
|
# ( "sth_qry_acyr" => $sth_qry_acyr, ... ) |
46 |
|
|
|
47 |
|
|
my ($sth_qry_acyr, $sth_qry_state_name, $sth_qry_ssn2pidm1, $sth_qry_ssn2pidm2, |
48 |
|
|
$sth_qry_vnum2pidm); |
49 |
|
|
|
50 |
|
|
|
51 |
|
|
# ============================================================================ |
52 |
|
|
# Routines |
53 |
|
|
# ============================================================================ |
54 |
|
|
|
55 |
|
|
# better (for performance) to make xtvxxxx_desc lookups available as separate |
56 |
|
|
# routines rather than joining them in to sgbstdn, etc. Calling program |
57 |
|
|
# can call them on (probably) smaller population. |
58 |
|
|
sub xtvxxxx_desc { |
59 |
|
|
my ($dbh, $tbl_name, $code) = @_; |
60 |
|
|
|
61 |
|
|
# make sure below only executes once per package instance per tbl_name |
62 |
|
|
if (! exists $glbh_sth_xtvxxxx_desc{$tbl_name} ) { |
63 |
|
|
$glbh_sth_xtvxxxx_desc{$tbl_name} = $dbh->prepare( |
64 |
|
|
"select $tbl_name" . "_desc " . |
65 |
|
|
"from $tbl_name where $tbl_name" . "_code = '$code'"); |
66 |
|
|
} |
67 |
|
|
|
68 |
|
|
($glbh_sth_xtvxxxx_desc{$tbl_name} )->execute; |
69 |
|
|
|
70 |
|
|
@row = ($glbh_sth_xtvxxxx_desc{$tbl_name} )->fetchrow_array; |
71 |
|
|
|
72 |
|
|
if (@row) { return $row[0] } |
73 |
|
|
|
74 |
|
|
return "Unknown"; # fall-through, code not in xtvxxxx |
75 |
|
|
} |
76 |
|
|
|
77 |
|
|
|
78 |
|
|
sub pass_cobol_params { |
79 |
|
|
my ($program, $uid, $passwd, $one_up_no, $rh_parms) = @_; |
80 |
|
|
|
81 |
|
|
my ($job, $parm_no, $parm_name); |
82 |
|
|
|
83 |
|
|
my $dbh = db_login($uid, $passwd, $program); |
84 |
|
|
|
85 |
|
|
$job = sis_object($program); |
86 |
|
|
|
87 |
|
|
my $sth_ins_gjbprun = $dbh->prepare( q{ |
88 |
|
|
insert into gjbprun(gjbprun_job, |
89 |
|
|
gjbprun_one_up_no, |
90 |
|
|
gjbprun_number, |
91 |
|
|
gjbprun_activity_date, |
92 |
|
|
gjbprun_value) |
93 |
|
|
values( upper(?), |
94 |
|
|
?, |
95 |
|
|
?, |
96 |
|
|
sysdate, |
97 |
|
|
? ) } ); |
98 |
|
|
|
99 |
|
|
my $sth_ins_gjbprun_dyn = $dbh->prepare( q{ |
100 |
|
|
insert into gjbprun(gjbprun_job, |
101 |
|
|
gjbprun_one_up_no, |
102 |
|
|
gjbprun_number, |
103 |
|
|
gjbprun_activity_date, |
104 |
|
|
gjbprun_label, |
105 |
|
|
gjbprun_value) |
106 |
|
|
values( upper(?), |
107 |
|
|
?, |
108 |
|
|
?, |
109 |
|
|
sysdate, |
110 |
|
|
?, |
111 |
|
|
? ) } ); |
112 |
|
|
|
113 |
|
|
# put program params in gjbprun table |
114 |
|
|
foreach $parm_no ( keys %{$rh_parms} ) { |
115 |
|
|
if ($parm_no ne "88") { |
116 |
|
|
$sth_ins_gjbprun->execute($job, $one_up_no, $parm_no, |
117 |
|
|
$rh_parms->{$parm_no} ); |
118 |
|
|
} |
119 |
|
|
else { # "dynamic" params |
120 |
|
|
foreach $parm_name (keys %{$rh_parms->{$parm_no} } ) { |
121 |
|
|
$sth_ins_gjbprun_dyn->execute( |
122 |
|
|
$job, $one_up_no, $parm_no, $parm_name, |
123 |
|
|
$rh_parms->{$parm_no}->{$parm_name} ); |
124 |
|
|
} |
125 |
|
|
} |
126 |
|
|
} |
127 |
|
|
|
128 |
|
|
$dbh->disconnect; |
129 |
|
|
} |
130 |
|
|
|
131 |
|
|
|
132 |
|
|
sub db_login { |
133 |
|
|
my ($uid, $passwd, $program, $rh_params) = @_; |
134 |
|
|
|
135 |
|
|
my $dbh = DBI->connect("dbi:Oracle:", $uid, $passwd, $rh_params) |
136 |
|
|
or die "$!: Can't connect to DB"; |
137 |
|
|
|
138 |
|
|
# convert VMS full path of this file to SIS Object |
139 |
|
|
my $sis_object = sis_object($program); |
140 |
|
|
|
141 |
|
|
# set security role for user in SIS Database |
142 |
|
|
if (! gwrsecp($dbh, $sis_object) ) { |
143 |
|
|
$dbh->disconnect; |
144 |
|
|
die "$!: User $uid not allowed to run $sis_object"; |
145 |
|
|
} |
146 |
|
|
return $dbh; |
147 |
|
|
} |
148 |
|
|
|
149 |
|
|
|
150 |
|
|
sub already_sent_letter { |
151 |
|
|
|
152 |
|
|
my ($dbh, $pidm, $term, $module, $sys_ind, $letr, $update_mail) = @_; |
153 |
|
|
|
154 |
|
|
my ($date_printed, $rowid); |
155 |
|
|
|
156 |
|
|
$update_mail = defined($update_mail) ? uc($update_mail) : "U"; |
157 |
|
|
# default is "Update" |
158 |
|
|
|
159 |
|
|
my $sql_qry_gurmail = |
160 |
|
|
"select gurmail_date_printed, \ |
161 |
|
|
gurmail.rowid \ |
162 |
|
|
from gurmail \ |
163 |
|
|
where gurmail_pidm = $pidm and \ |
164 |
|
|
gurmail_term_code = '$term' and \ |
165 |
|
|
gurmail_module_code = '$module' and \ |
166 |
|
|
gurmail_system_ind = '$sys_ind' and \ |
167 |
|
|
gurmail_letr_code = '$letr'\n"; # jhjh |
168 |
|
|
|
169 |
|
|
my $sth_qry_gurmail = $dbh->prepare($sql_qry_gurmail); |
170 |
|
|
|
171 |
|
|
$sth_qry_gurmail->execute; |
172 |
|
|
|
173 |
|
|
my @row = $sth_qry_gurmail->fetchrow_array; |
174 |
|
|
|
175 |
|
|
if (@row) { |
176 |
|
|
($date_printed, $rowid) = @row; |
177 |
|
|
if ($date_printed) { # already sent letter |
178 |
|
|
return 1; |
179 |
|
|
} |
180 |
|
|
else { |
181 |
|
|
if ($update_mail ne "A") { # if not "Audit" mode |
182 |
|
|
$dbh->do("update gurmail \ |
183 |
|
|
set gurmail_date_printed = sysdate \ |
184 |
|
|
where gurmail.rowid = '$rowid'"); |
185 |
|
|
} |
186 |
|
|
return 0; |
187 |
|
|
} |
188 |
|
|
} |
189 |
|
|
|
190 |
|
|
else { |
191 |
|
|
if ($update_mail ne "A") { # if not "Audit" mode |
192 |
|
|
# create gurmail record for new letter |
193 |
|
|
$dbh->do( "\ |
194 |
|
|
INSERT INTO GURMAIL ( GURMAIL_PIDM, \ |
195 |
|
|
gurmail_term_code, \ |
196 |
|
|
gurmail_module_code, \ |
197 |
|
|
GURMAIL_SYSTEM_IND, \ |
198 |
|
|
GURMAIL_LETR_CODE, \ |
199 |
|
|
GURMAIL_DATE_INIT, \ |
200 |
|
|
GURMAIL_USER, \ |
201 |
|
|
GURMAIL_PUB_GEN, \ |
202 |
|
|
GURMAIL_ORIG_IND, \ |
203 |
|
|
GURMAIL_ACTIVITY_DATE, \ |
204 |
|
|
gurmail_date_printed) \ |
205 |
|
|
\ |
206 |
|
|
values ( $pidm, \ |
207 |
|
|
'$term', \ |
208 |
|
|
'$module', \ |
209 |
|
|
'$sys_ind', \ |
210 |
|
|
'$letr', \ |
211 |
|
|
TO_DATE(TO_CHAR(SYSDATE,'DD-MON-YYYY HH24:MI:SS'), \ |
212 |
|
|
'DD-MON-YYYY HH24:MI:SS'), \ |
213 |
|
|
USER, \ |
214 |
|
|
'G', \ |
215 |
|
|
'S', \ |
216 |
|
|
SYSDATE, \ |
217 |
|
|
sysdate)" ); |
218 |
|
|
} |
219 |
|
|
|
220 |
|
|
return 0; |
221 |
|
|
} |
222 |
|
|
} |
223 |
|
|
|
224 |
|
|
|
225 |
|
|
sub term_acyr { |
226 |
|
|
my ($dbh, $term) = @_; |
227 |
|
|
|
228 |
|
|
my ($acyr, @row); |
229 |
|
|
|
230 |
|
|
# for performance we will only prepare repeated sql once |
231 |
|
|
if (exists $glb_prepared_sql{"sth_qry_acyr"} ) { |
232 |
|
|
$sth_qry_acyr = $glb_prepared_sql{"sth_qry_acyr"}; |
233 |
|
|
} |
234 |
|
|
else { |
235 |
|
|
$sth_qry_acyr = $dbh->prepare( q{ |
236 |
|
|
select stvacyr_desc from stvacyr where stvacyr_code = ?} ); |
237 |
|
|
|
238 |
|
|
$glb_prepared_sql{"sth_qry_acyr"} = $sth_qry_acyr; |
239 |
|
|
} |
240 |
|
|
|
241 |
|
|
if (defined($term) ) { |
242 |
|
|
$acyr = substr( substr($term, 0, 4), 2, 2); |
243 |
|
|
$acyr .= sprintf("%.2i", $acyr + 1); |
244 |
|
|
|
245 |
|
|
$sth_qry_acyr->execute($acyr); |
246 |
|
|
@row = $sth_qry_acyr->fetchrow_array; |
247 |
|
|
|
248 |
|
|
if (@row) { |
249 |
|
|
return $row[0]; |
250 |
|
|
} # otherwise fall-through |
251 |
|
|
} |
252 |
|
|
|
253 |
|
|
return "Unknown"; # fall-through |
254 |
|
|
} |
255 |
|
|
|
256 |
|
|
|
257 |
|
|
sub term_last_year{ |
258 |
|
|
my $term = shift; |
259 |
|
|
|
260 |
|
|
return (substr($term, 0, 4) - 1) . substr($term, 4, 2); |
261 |
|
|
|
262 |
|
|
} |
263 |
|
|
|
264 |
|
|
|
265 |
|
|
sub date_last_year{ |
266 |
|
|
my $date = shift; |
267 |
|
|
# date must be formatted mm/dd/yyyy, output will be in same format |
268 |
|
|
|
269 |
|
|
return substr($date, 0, 6) . (substr($date, 6, 4) - 1); |
270 |
|
|
|
271 |
|
|
} |
272 |
|
|
|
273 |
|
|
|
274 |
|
|
sub ahist_level { |
275 |
|
|
|
276 |
|
|
my $level = shift; |
277 |
|
|
|
278 |
|
|
$level =~ s/NG|PB/GR/ || $level =~ s/PN|NU|NA/UG/; |
279 |
|
|
|
280 |
|
|
return $level; |
281 |
|
|
} |
282 |
|
|
|
283 |
|
|
|
284 |
|
|
sub state_name{ |
285 |
|
|
my ($dbh, $stat_code) = @_; |
286 |
|
|
|
287 |
|
|
my ($state_name); |
288 |
|
|
|
289 |
|
|
# for performance we will only prepare repeated sql once |
290 |
|
|
if (exists $glb_prepared_sql{"sth_qry_state_name"} ) { |
291 |
|
|
$sth_qry_state_name = $glb_prepared_sql{"sth_qry_state_name"}; |
292 |
|
|
} |
293 |
|
|
else { |
294 |
|
|
$sth_qry_state_name = $dbh->prepare( q{ |
295 |
|
|
select stvstat_desc from stvstat where stvstat_code = ? } ); |
296 |
|
|
|
297 |
|
|
$glb_prepared_sql{"sth_qry_state_name"} = $sth_qry_state_name; |
298 |
|
|
} |
299 |
|
|
|
300 |
|
|
$sth_qry_state_name->execute($stat_code); |
301 |
|
|
|
302 |
|
|
($state_name) = $sth_qry_state_name->fetchrow_array; |
303 |
|
|
|
304 |
|
|
return $state_name ? $state_name : ""; |
305 |
|
|
} |
306 |
|
|
|
307 |
|
|
|
308 |
|
|
sub like2re { |
309 |
|
|
|
310 |
|
|
my ($str, $word, $negative); |
311 |
|
|
$negative = 0; |
312 |
|
|
|
313 |
|
|
# stop on LIKE for LIKE/NOT LIKE |
314 |
|
|
while ( ($word = shift) !~ /^like$/i ) { |
315 |
|
|
if ($word =~ /^not$/i) { |
316 |
|
|
$negative = 1; |
317 |
|
|
} |
318 |
|
|
else { $str .= $word . "," } # replace whitespace w/ comma's just like the |
319 |
|
|
# parser does |
320 |
|
|
} |
321 |
|
|
$str .= $word . ","; # add LIKE to $str |
322 |
|
|
|
323 |
|
|
$word = shift; # $word now holds the SQL LIKE expression |
324 |
|
|
|
325 |
|
|
|
326 |
|
|
# if LIKE expr contains SQL % wildcard, then turn into perl reg exp |
327 |
|
|
if ( $word =~ /'(.*%.*)'/i ) { |
328 |
|
|
|
329 |
|
|
$word = $1; |
330 |
|
|
$str =~ s/like,$/=~,/i; |
331 |
|
|
|
332 |
|
|
$negative && ( $str =~ s/=~/!~/ ); |
333 |
|
|
|
334 |
|
|
$word =~ s/^([^%])/\^$1/; |
335 |
|
|
$word =~ s/([^%])$/$1\$/; |
336 |
|
|
$word =~ s/%/\.\*/g; |
337 |
|
|
$word = "/" . $word . "/"; |
338 |
|
|
|
339 |
|
|
} |
340 |
|
|
|
341 |
|
|
# otherwise turn like into "=" ( we will turn "=" into "eq" in get_data(), |
342 |
|
|
# this sub is used by the obj_srvr yacc parser) |
343 |
|
|
else { |
344 |
|
|
$str =~ s/like,$/=,/i; |
345 |
|
|
} |
346 |
|
|
|
347 |
|
|
$str .= $word; |
348 |
|
|
|
349 |
|
|
return $str; |
350 |
|
|
|
351 |
|
|
} |
352 |
|
|
|
353 |
|
|
|
354 |
|
|
sub ssn2pidm { |
355 |
|
|
|
356 |
|
|
my ($dbh, $ssn) = @_; |
357 |
|
|
|
358 |
|
|
my $pidm; |
359 |
|
|
|
360 |
|
|
# for performance we will only prepare repeated sql once |
361 |
|
|
if (exists $glb_prepared_sql{"sth_qry_ssn2pidm1"} ) { |
362 |
|
|
$sth_qry_ssn2pidm1 = $glb_prepared_sql{"sth_qry_ssn2pidm1"}; |
363 |
|
|
$sth_qry_ssn2pidm2 = $glb_prepared_sql{"sth_qry_ssn2pidm2"}; |
364 |
|
|
} |
365 |
|
|
else { |
366 |
|
|
$sth_qry_ssn2pidm1 = $dbh->prepare( q{ |
367 |
|
|
select spbpers_pidm |
368 |
|
|
from spbpers |
369 |
|
|
where spbpers_ssn = ? } ); |
370 |
|
|
|
371 |
|
|
$glb_prepared_sql{"sth_qry_ssn2pidm1"} = $sth_qry_ssn2pidm1; |
372 |
|
|
|
373 |
|
|
|
374 |
|
|
$sth_qry_ssn2pidm2 = $dbh->prepare( q{ |
375 |
|
|
select spriden_pidm |
376 |
|
|
from spriden |
377 |
|
|
where spriden_id = ? and |
378 |
|
|
spriden_change_ind = 'I' } ); |
379 |
|
|
|
380 |
|
|
$glb_prepared_sql{"sth_qry_ssn2pidm2"} = $sth_qry_ssn2pidm2; |
381 |
|
|
} |
382 |
|
|
|
383 |
|
|
$sth_qry_ssn2pidm1->execute($ssn); |
384 |
|
|
|
385 |
|
|
($pidm) = $sth_qry_ssn2pidm1->fetchrow_array; |
386 |
|
|
|
387 |
|
|
if ( !defined($pidm) ) { |
388 |
|
|
|
389 |
|
|
$sth_qry_ssn2pidm2->execute($ssn); |
390 |
|
|
|
391 |
|
|
($pidm) = $sth_qry_ssn2pidm2->fetchrow_array; |
392 |
|
|
} |
393 |
|
|
|
394 |
|
|
return $pidm; |
395 |
|
|
} |
396 |
|
|
|
397 |
|
|
|
398 |
|
|
sub vnum2pidm { |
399 |
|
|
|
400 |
|
|
my ($dbh, $vnum) = @_; |
401 |
|
|
|
402 |
|
|
my $pidm; |
403 |
|
|
|
404 |
|
|
# for performance we will only prepare repeated sql once |
405 |
|
|
if (exists $glb_prepared_sql{"sth_qry_vnum2pidm"} ) { |
406 |
|
|
$sth_qry_vnum2pidm = $glb_prepared_sql{"sth_qry_vnum2pidm"}; |
407 |
|
|
} |
408 |
|
|
else { |
409 |
|
|
$sth_qry_vnum2pidm = $dbh->prepare( q{ |
410 |
|
|
select spriden_pidm |
411 |
|
|
from spriden |
412 |
|
|
where spriden_id = ? and |
413 |
|
|
spriden_change_ind is null } ); |
414 |
|
|
|
415 |
|
|
$glb_prepared_sql{"sth_qry_vnum2pidm"} = $sth_qry_vnum2pidm; |
416 |
|
|
} |
417 |
|
|
|
418 |
|
|
$sth_qry_vnum2pidm->execute($vnum); |
419 |
|
|
|
420 |
|
|
($pidm) = $sth_qry_vnum2pidm->fetchrow_array; |
421 |
|
|
|
422 |
|
|
return $pidm; |
423 |
|
|
} |
424 |
|
|
|
425 |
|
|
|
426 |
|
|
sub next_fall { |
427 |
|
|
|
428 |
|
|
my $term = shift; |
429 |
|
|
|
430 |
|
|
# return next fall from any term during the year |
431 |
|
|
return substr($term + 100, 0, 4) . "01"; |
432 |
|
|
} |
433 |
|
|
|
434 |
|
|
# ============================================================================ |
435 |
|
|
# Subroutines |
436 |
|
|
# ============================================================================ |
437 |
|
|
|
438 |
|
|
return 1; |
439 |
|
|
|
440 |
|
|
|