#! /usr/bin/perl # Copyright 2001-2020 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', 'Main' => 'Main', 'Attendance' => 'Attendance', 'Periods Per Day' => 'Periods Per Day', 'View/Download' => 'View/Download', 'View Log File' => 'View Log File', 'Last Name' => 'Last Name', 'First' => 'First', 'Middle' => 'Middle', 'Birthdate' => 'Birthdate', 'Status' => 'Status', 'Reserve' => 'Reserve', 'Mother' => 'Mother', 'School Days' => 'School Days', 'Error' => 'Error', 'Date' => 'Date', 'Paper Size' => 'Paper Size', 'Letter' => 'Letter', 'Legal' => 'Legal', 'A4' => 'A4', 'Continue' => 'Continue', 'Records per Page' => 'Records per Page', 'Not Defined' => 'Not Defined', 'Grade' => 'Grade', 'Student' => 'Student', 'Not Found' => 'Not Found', 'Band' => 'Band', 'Font Size' => 'Font Size', 'Group' => 'Group', 'HTML' => 'HTML', 'Homeroom' => 'Homeroom', 'PDF' => 'PDF', 'Separate with Spaces' => 'Separate with Spaces', 'Report Type' => 'Report Type', 'Year End' => 'Year End', 'Total' => 'Total', 'Percent' => 'Percent', 'Days' => 'Days', 'Enrolled' => 'Enrolled', 'Show Withdrawn Students' => 'Show Withdrawn Students', 'End Date' => 'End Date', 'Missing' => 'Missing', 'Teacher' => 'Teacher', 'Course' => 'Course', 'View' => 'View', 'Details' => 'Details', 'Period' => 'Period', ); 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]; if (length($month) == 1){ $month = "0".$month;} if (length($day) == 1){ $day = "0".$day;} my $currsdate = "$year-$month-$day"; my $currdate = "$month[$month] $day, $year"; 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.
\n}; next HOMEROOM; } } push @homerooms, $hr; } # end of homeroom loop @homerooms = sort {$a <=> $b} @homerooms; print qq{

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 ); 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_value = ?"); $sth->execute( $homeroom ); if ( DBI::errstr ) { print $DBI::errstr; die $DBI::errstr; } my ($lastname, $firstname) = $sth->fetchrow; 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; }