#!/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 '
', $q->h3('各單位已繳工讀申請表及工讀時間'), '
', $q->hr; print $q->table({-border=>1,-cellspacing=>0,-align=>'center'}, Tr($tbhead), Tr(th(['單位', '姓名', '學號'])), Tr(\@rows) ); print $q->hr, '', $q->ul( li('以上資料如有錯誤,請逕向', a({href=>$manager}, "管理者"), '反應,以利更正') ), '', $q->end_html, "\n";