#! /usr/bin/perl # Copyright 2001-2022 Leslie Richardson # Open Admin for Schools is free software; you can redistribute it # and/or modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # Check for any missing homeroom attendance up to end date. my %lex = ('Attendance Report' => 'Attendance Report', 'Attendance' => 'Attendance', 'Continue' => 'Continue', 'Details' => 'Details', 'End Date' => 'End Date', 'Error' => 'Error', 'Homeroom' => 'Homeroom', 'Main' => 'Main', 'Missing' => 'Missing', 'Teacher' => 'Teacher', ); use DBI; use CGI; use Number::Format qw(:all); use Time::JulianDay; use Cwd; # Constants my $self = 'rptatttch2.pl'; # Get current dir so know what path for config files. my $configpath; my $teachermode; if ( getcwd() =~ /tcgi/ ){ # we are in tcgi $teachermode = 1; $configpath = '..'; # go back one to get to etc. } else { $configpath = '../..'; # go back two to get to etc. } # main config file eval require "$configpath/etc/admin.conf"; if ( $@ ) { print $lex{Error}. ": $@
\n"; die $lex{Error}. ": $@\n"; } eval require "$configpath/lib/libattend.pl"; if ( $@ ) { print $lex{Error}. ": $@
\n"; die $lex{Error}. ": $@\n"; } eval require "$configpath/lib/libDate.pl"; if ( $@ ) { print $lex{Error}. ": $@
\n"; die $lex{Error}. ": $@\n"; } my $dsn = "DBI:mysql:$dbase"; $dbh = DBI->connect($dsn,$user,$password); $dbh->{mysql_enable_utf8} = 1; my @tim = localtime(time); my $year = $tim[5] + 1900; my $month = $tim[4] + 1; my $day = $tim[3]; my $currjd = julian_day($year,$month,$day); if (length($month) == 1){ $month = "0".$month;} if (length($day) == 1){ $day = "0".$day;} my $currsdate = "$year-$month-$day"; # unused: my $currdate = "$month[$month] $day, $year"; my $schoolendjd = julian_day(split('-',$schoolend)); if ( $currjd > $schoolendjd ) { $currsdate = join('-', inverse_julian_day($schoolendjd)); } my $q = new CGI; my %arr = $q->Vars; print $q->header( -charset, $charset ); # Get current dir so know what CSS to display and shift to teacher settings. if ( getcwd() =~ /tcgi/ ) { # we are in tcgi $css = $tchcss; $homepage = $tchpage; $downloaddir = $tchdownloaddir; $webdownloaddir = $tchwebdownloaddir; } # HTML Header my $title = "$lex{Teacher} $lex{'Attendance Report'} 2 (Homeroom Attendance Check)"; print qq{$doctype\n$title \n}; if ( not $arr{page} ) { print qq{\n}; print qq{\n}; print qq{\n}; print qq{\n}; } print qq{$chartype\n\n}; print qq{[ $lex{Main} }; if (not $teachermode ) { print qq{| $lex{Attendance} ]\n}; } else { print qq{]\n}; } print qq{

$title

\n}; if ( not $arr{page} ) { showStartPage(); } elsif ( $arr{page} == 1 ) { delete $arr{page}; showReport(); } elsif ( $arr{page} == 2 ) { delete $arr{page}; viewDetails(); } #------------ sub showReport { #------------- # foreach my $key ( sort keys %arr ) { print qq{K:$key V:$arr{$key}
\n}; } my $enddate; if ($arr{enddate}){ $enddate = $arr{enddate}; } else { $enddate = $currsdate; } print qq{
$lex{'End Date'} $enddate
\n}; # Get Homerooms my $sth = $dbh->prepare("select distinct homeroom from student where homeroom != '' and homeroom is not NULL order by homeroom"); $sth->execute; if ($DBI::errstr) { print $DBI::errstr; die $DBI::errstr; } my @homerooms; # Homeroom teacher for a particular homeroom value my $sth1 = $dbh->prepare("select userid from staff_multi where field_name = 'homeroom' and field_value = ?"); # Get grade(s) for particular homeroom my $sth2 = $dbh->prepare("select distinct grade from student where homeroom = ?"); HOMEROOM: while ( my $hr = $sth->fetchrow ) { # Do we have a teacher for this homeroom? $sth1->execute( $hr ); if ($DBI::errstr) { print $DBI::errstr; die $DBI::errstr; } my $userid = $sth1->fetchrow; if ( not $userid ) { print qq{
$lex{Missing} $lex{Teacher} - $lex{Homeroom} $hr
\n}; next HOMEROOM; } # Get Grade(s) of homeroom and check that they use 'homeroom' attendance entry method $sth2->execute( $hr ); if ($DBI::errstr) { print $DBI::errstr; die $DBI::errstr; } while ( my $gr = $sth2->fetchrow ) { if ( $g_AttendanceEntryMethod{$gr} ne 'homeroom' ) { print qq{
$lex{Error} Homeroom $hr (grade $gr) not marked for homeroom attendance.}; print qq{
\n}; next HOMEROOM; } } push @homerooms, $hr; } # end of homeroom loop @homerooms = sort {$a <=> $b} @homerooms; # print "Homerooms: @homerooms
\n"; # print qq{

Checking for Missing Attendance Entries

\n}; my $first = 1; my $count = 1; # Loop Through All homerooms, checking attendance foreach my $homeroom ( sort {$a <=> $b} @homerooms ) { # Check that Teacher attendance was done up to this date. my $res = checkAttEntry( $enddate, $homeroom ); # print qq{
RES:$res End Date:$enddate HR:$homeroom
\n}; if ( $res ) { $count++; $first = 0; if ( $count % 5 == 1 ) { print qq{

\n} }; } } if ( $first ) { print qq{

No Missing Attendance Found

\n}; } print qq{\n}; exit; } # end of showReport #---------------- sub showStartPage { # get End Date for Checking. #---------------- print qq{
\n}; print qq{\n}; print qq{\n}; print qq{\n}; print qq{\n}; print qq{
$lex{'End Date'}\n}; print qq{\n}; print qq{
\n}; print qq{\n}; print qq{\n}; exit; } #-------------- sub viewDetails { #-------------- # foreach my $key ( sort keys %arr ) { print qq{K:$key V:$arr{$key}
\n}; } print qq{

View Single Teacher

\n}; # Check that Teacher attendance was done up to this date. my $res = checkAttEntry( $arr{enddate}, $arr{homeroom} ); print qq{\n}; exit; } #---------------- sub checkAttEntry { # check attendance entry for all year to date. #---------------- my ($enddate, $homeroom) = @_; # pass end date to stop at, and homeroom # Find partial day closures from dates_periods for entire year. my %pclosed; my $sth = $dbh->prepare("select * from dates_periods"); $sth->execute; if ( DBI::errstr ) { print $DBI::errstr; die $DBI::errstr; } while ( my $ref = $sth->fetchrow_hashref ) { my %r = %$ref; # date, grades, period my $cref = parseGradesPeriod( $r{date}, $dbh); %cl = %$cref; # periods closed for this date cl{grade}{period} = 1 foreach my $gr ( keys %cl ) { foreach my $per ( sort keys %{ $cl{$gr} } ) { # if we have a value. $pclosed{ $r{date} }{ $gr }{$per} = 1; } } } # we now have %pclosed{date}{grade}{period} = 1; # Test %pclosed; =head foreach my $date ( sort keys %pclosed ) { foreach my $grade ( sort keys %{ $pclosed{$date} } ) { foreach my $period ( sort keys %{ $pclosed{$date}{$grade} } ) { print qq{Date:$date Grade:$grade Period:$period
\n}; } } } =cut # Check if attendance done by teacher my @missing = checkHomeroomAttEntry( $enddate, $homeroom, \%pclosed, $dbh ); my $retval; if ( @missing ) { $retval = 1; # Get Teacher Name my $sth = $dbh->prepare("select s.lastname, s.firstname from staff s, staff_multi m where s.userid = m.userid and m.field_name = 'homeroom' and m.field_value = ?"); $sth->execute( $homeroom ); if ( DBI::errstr ) { print $DBI::errstr; die $DBI::errstr; } my ($lastname, $firstname) = $sth->fetchrow; # print qq{
HR:$homeroom Name:$firstname $lastname
\n}; print qq{\n}; print qq{\n}; print qq{\n}; foreach my $val ( @missing ) { my ($date,$period) = split(':', $val); print qq{\n}; } print qq{\n}; print qq{
}; print qq{$firstname $lastname ($homeroom)
DatePeriod
$date$period
\n}; print qq{
\n}; print qq{\n}; print qq{\n}; print qq{\n}; print qq{\n}; print qq{
\n}; print qq{
\n}; } return $retval; }