#!/usr/bin/perl
use strict;
use warnings;
use DBI;
use Time::Format qw(%time time_format %strftime %manip);
use Data::Dumper;
use S::Utils qw(setOracleEnv);
# -- call sub to set Oracle env so script can run as cronjob
&setOracleEnv;
# -- define outfile
my $filename = "except.csv";
# -- connection info for Voyager db
my ($voy_dsn,$voy_dbun,$voy_dbpass) = ( 'dbi:Oracle:host=;sid=;port=','','' );
# -- connect to Voyager db
my $dbh = DBI->connect( $voy_dsn,$voy_dbun,$voy_dbpass, { AutoCommit => 0, RaiseError => 0, PrintError => 1 } ) || die $DBI::errstr;
# -- query to get exception dates for the semester
my $sql = qq(select TO_CHAR (exception_date, 'YYYY-MM-DD'), exception_openhour, exception_closehour,
CASE when UPPER(Exception_open) = 'N' THEN 'Closed'
END AS Closed
FROM exception_calendar);
my $sth = $dbh->prepare( $sql );
$sth->execute or die $DBI::errstr;
# -- fetch all data and create var to refer to
my $arrayref_exc_dates = $sth->fetchall_arrayref();
# -- hash to store found exception dates and hours
my %except = ();
# -- loop thru the exception data from Voyager table
foreach my $row ( @$arrayref_exc_dates ) {
my ( $exception_date,$exception_openhour,$exception_closehour ) = @$row;
if ( not defined $exception_openhour ) { $exception_openhour = "closed" }
if ( not defined $exception_closehour ) { $exception_closehour = "closed" }
# Put data in hash
$except{$exception_date} = {
date => $exception_date,
open => $exception_openhour,
close => $exception_closehour,
};
}
# -- uncomment this for testing
print Data::Dumper->Dump([%except]);
$sth->finish;
$dbh->disconnect;
# -- store table in here
my $content;
# -- store exception hours in here
my %except_hrs = ();
# -- now we can figure out the hours to use and create the table rows
for my $key ( sort keys %except ) {
# -- date in exception hash so use exception data
# -- use sub to format time
if ( exists $except{$key} ) {
$except{$key}{open} = format_time( $except{$key}{open} );
$except{$key}{close} = format_time( $except{$key}{close} );
}
# -- let's write the table rows
if ( $except{$key}{open} eq 'closed') {
$content .= "$except{$key}{date},12: am,12: am \n";
} else {
$content .= "$except{$key}{date},$except{$key}{open},$except{$key}{close} \n";
} ## end if
} ## end final hours for
# -- uncomment for testing
print Data::Dumper->Dump([%except]);
# -- close the html table and print all html to file
open OUTFILE, "> $filename" or die $!;
print OUTFILE $content;
close OUTFILE;
# -- Subs start here
# --
sub format_time {
my $time = shift;
my $formatted_time;
# -- handle if 'closed' passed (don't do anything else)
if ( $time =~m/closed/ ) {
$formatted_time = $time;
} else {
# -- Voyager system indicates morning of "same" open day as 24 + hour, ex: 1:00AM = 2500
# -- must change to more standard time string
if ( $time > 2400 ) {
$formatted_time = $time - 2400;
} else {
$formatted_time = $time;
}
## end check time over 2400 if
# -- time function (from Time module) needs time string in this format: hh:mm:ss
# -- our time string is like 800 or 2300 so we must do some formating to it
# -- first, pad with zero if only 3 character
$formatted_time = sprintf( "%04s", $formatted_time );
# -- second, add two zeros to end of time string - seconds
$formatted_time = $formatted_time .'00';
# -- third, add ":" separators
$formatted_time =~ s/(\d\d)(\d\d)(\d\d)/$1:$2:$3/;
# -- now use time function for final formatting
$formatted_time = time_format('H:mm am', "$formatted_time");
return ("12:00 am") if $time == 2400;
# -- for some reason "0" showing in times less than 10 even though format for time format looks correct
# -- let's remove it now
$formatted_time =~ s/^0//;
} ## end check time if
# -- return formatted time string
return $formatted_time;
} ## end format time sub
####
#!/usr/bin/perl
#use strict;
use warnings;
use DBI;
use Time::Piece;
use Time::Seconds;
use Data::Dumper;
use S::Utils qw(setOracleEnv);
# -- call sub to set Oracle env so script can run as cronjob
&setOracleEnv;
my $filename = "all_dates.csv";
my %regular = (
Monday => ['08:00 am','1:00 am'],
Tuesday => ['08:00 am','1:00 am'],
Wednesday => ['08:00 am','1:00 am'],
Thursday => ['08:00 am','1:00 am'],
Friday => ['08:00 am','10:00 pm'],
Saturday => ['09:00 am','10:00 pm'],
Sunday => ['11:00 am','1:00 am'],
);
#-- uncomment this for testing
#print Data::Dumper->Dump([%regular]);
my %except;
open my $fh, '<', 'except.csv' or die "Cannot open: $!";
while (my $line = <$fh>) {
$line =~ s/\s*\z//;
my @array = split /,/, $line;
my $key = shift @array;
$except{$key} = \@array;
}
close $fh;
my $t = localtime;
my $end_date = '2016-12-31';
open OUT,'>','all_dates.csv' or die "$!";
my $id = 1;
while ($t->ymd le $end_date){
my $ymd = $t->ymd;
my $w = $t->fullday;
my $open = $except{$ymd}[0] || $regular{$w}[0];
my $close = $except{$ymd}[1] || $regular{$w}[1];
my $is_closed = ($open eq '12: am') ? 1 : 0;
print OUT "$id,$ymd,$w,$open,$close,$is_closed\n";
$t += ONE_DAY;
++$id;
}
close OUT;
####
#!/usr/bin/perl
use DBI;
use S::Utils qw(setOracleEnv);
use strict;
use warnings;
# Declare variables
my $DBNAME = "calendar";
my $DBTABLE = "libhourstest";
my $csvfile = "all_dates.csv";
# -- call sub to set Oracle env so script can run as cronjob
&setOracleEnv;
#connection info for db
my ($dsn,$dbun,$dbpass) = ( 'dbi:mysql:calendar:localhost:', '', '' );
# -- connect to db
my $dbh = DBI->connect( $dsn,$dbun,$dbpass, { AutoCommit => 0, RaiseError => 0, PrintError => 1 } ) || die $DBI::errstr;
### Get rid of the old records in the web content db table
$dbh->do (qq{ delete from libhourstest });
my $update_h = $dbh->prepare(qq{INSERT INTO $DBTABLE (libhours_id, ymd, dow, opening, closing, is_closed) VALUES (?, ?, ?, ?, ?, ?)});
open my $ih, $csvfile or die "Can't open file, $csvfile: $!";
while (<$ih>) {
chomp;
my @rows = split ','; # A comma is the delimiter
my $libhours_id = $rows[0];
my $ymd = $rows[1];
my $dow = $rows[2];
my $opening = $rows[3];
my $closing = $rows[4];
my $is_closed = $rows[5];
$update_h->execute($libhours_id, $ymd, $dow, $opening, $closing, $is_closed) or die $dbh->errstr;
}
my $res = $dbh->selectall_arrayref( q( SELECT libhours_id, ymd, dow, opening, closing, is_closed FROM libhourstest));
foreach( @$res ) {
print "\n$_->[0], $_->[1] $_->[2] $_->[3] $_->[4] $_->[5]\n\n";
}
END {
$dbh->disconnect if $dbh }