#!/usr/local/gnu/bin/perl -Tw
require 5.005;
use DB_File;
use CGI qw/:standard :html3 -no_debug/;
use Fcntl;
use strict;
use lib qw(/home1/users/center/sysmgr/sysmgr/modules);
use sysmgrconf;
my $manager = 'mailto:center5@cc.ncu.edu.tw';
my $config = new sysmgrconf;
my $worktimedb = $config->basedir . '/db/' . $config->worktimeDB;
my $unitdb = $config->basedir . '/db/' . $config->unitDB;
my (%unit, %worktime);
my ($q, @rows, $unit, $uname, $i, $num);
my ($stdid, $workfrom, $workto, $f, $t);
my ($yearfrom, $yearto, $monthfrom, $monthto, $y, $m, $k, $entry);
$q = new CGI;
print $q->header;
print $q->start_html('工讀時間表'), "\n";
tie %unit, 'DB_File', $unitdb, O_RDONLY, 0600, $DB_HASH;
tie %worktime, 'DB_File', $worktimedb, O_RDONLY, 0600, $DB_HASH;
$num = $unit{"order-0"};
@rows = ();
undef $workfrom;
undef $workto;
for ($i = 1; $i <= $num; $i++) {
$unit = $unit{"order-$i"};
$uname = $unit{"$unit-name"};
if (exists $worktime{$unit}) {
foreach $stdid (split(':', $worktime{$unit})) {
my $worktime = $worktime{"$unit-$stdid"};
while ($worktime ne "") {
if ($worktime =~ /^\s*(\d{6})\-(\d{6})\s*$/) {
($f, $t, $worktime) = ($1, $2, "");
} elsif ($worktime =~ /^\s*(\d{6})\-(\d{6})\s*(\d.*)$/) {
($f, $t, $worktime) = ($1, $2, $3);
} elsif ($worktime =~ /^\s*(\d{6})\s*$/) {
($f, $t, $worktime) = ($1, $1, "");
} elsif ($worktime =~ /^\s*(\d{6})\s*(\d.*)$/) {
($f, $t, $worktime) = ($1, $1, $2);
} else {
warn "warn: [$worktime]\n";
$worktime = "";
last;
}
$workfrom = $f if ((! defined $workfrom) or ($workfrom > $f));
$workto = $t if ((! defined $workto) or ($workto < $t));
}
}
}
}
exit 0 if (! defined $workfrom);
# print "Work from: $workfrom\n";
# print "Work to: $workto\n";
$workfrom =~ /^(\d{4})(\d{2})$/; ($yearfrom, $monthfrom) = ($1, $2);
$workto =~ /^(\d{4})(\d{2})$/; ($yearto, $monthto) = ($1, $2);
my $tbhead = th({colspan=>3}, '時間');
for ($y = $yearfrom; $y <= $yearto; $y++) {
for ($m = (($y == $yearfrom) ? int($monthfrom) : 1);
$m <= (($y == $yearto) ? $monthto : 12); $m++) {
$tbhead .= th({rowspan=>2}, ($y - 1911), '
', $m);
}
}
for ($i = 1; $i <= $num; $i++) {
$unit = $unit{"order-$i"};
$uname = $unit{"$unit-name"};
if (exists $worktime{$unit}) {
foreach $stdid (split(':', $worktime{$unit})) {
# printf "%s %s %s %s\n",
# $uname, $stdid, $worktime{$stdid},
# $worktime{"$unit-$stdid"};
$entry = td( [ $uname, $worktime{$stdid}, $stdid ] );
for ($y = $yearfrom; $y <= $yearto; $y++) {
for ($m = (($y == $yearfrom) ? $monthfrom : 1);
$m <= (($y == $yearto) ? $monthto : 12); $m++) {
$k = sprintf "%s-%s-%04d%02d", $unit, $stdid, $y, $m;
if (exists $worktime{$k}) {
$entry .= td('Y');
} else {
$entry .= td('.');
}
}
}
push @rows, $entry;
}
}
}
untie %worktime;
untie %unit;
print '